MetaplexでNFTを作成すると「insufficient funds for rent」エラー

ローカル環境(solana-test-validator)でAnchor x Metaplexを使ったNFT発行を試していたときに発生。
ただし、今回は不必要な設定をしてしまっただけのため、一般的には遭遇しない想定。

現象

NFTを作成すると以下のエラーが発生。

ターミナル:

SendTransactionError: failed to send transaction: Transaction simulation failed: Transaction results in an account (1) without insufficient funds for rent

createNft.ts:

const metaplex = Metaplex.make(connection)
    .use(keypairIdentity(provider.wallet.payer))
    .use(bundlrStorage({
        address: 'https://devnet.bundlr.network',
        providerUrl: 'http://localhost:8899',
        timeout: 60000,
    }));

const { uri } = await metaplex
    .nfts()
    .uploadMetadata({
        name: "My NFT Metadata",
        description: "My description",
        image: "https://placekitten.com/100/100",
    });

原因

Bundlr Networkの設定で、localhostを参照しているため、おかしくなっている。

const metaplex = Metaplex.make(connection)
    .use(keypairIdentity(provider.wallet.payer))
    .use(bundlrStorage({
        address: 'https://devnet.bundlr.network',
        providerUrl: 'http://localhost:8899', // ← これがおかしい
        timeout: 60000,
    }));

なお、一般的に遭遇する場合は、NFT発行のFee PayerのSOL不足が原因と思われる。

対応

正しいURLに変更する。

createNft.ts:

const metaplex = Metaplex.make(connection)
    .use(keypairIdentity(provider.wallet.payer))
    .use(bundlrStorage({
        address: 'https://devnet.bundlr.network',
        providerUrl: 'https://api.devnet.solana.com', // ← 正しいURLに設定
        timeout: 60000,
    }));

Bundlr Networkは、Localnetの指定はたしかできなかったはず。
そのため、DevnetやMainnet-betaを指定する必要がある。