Solana MetaplexでNFTミントすると「program that does not exist」エラー

MetaplexでNFT作成をしていたときに発生したエラー。

現象

Metaplex Web3.js でNFT作成すると以下のエラーが発生。

ターミナル:

Failed to Send Transaction >> Source: RPC >> Problem: The transaction could not be sent successfully to the network. >> Solution: Check the error below for more information. Caused By: Error: failed to send transaction: Transaction simulation failed: Attempt to load a program that does not exist [ Logs: ]

MetaplexError: Failed to Send Transaction
>> Source: RPC
>> Problem: The transaction could not be sent successfully to the network.
>> Solution: Check the error below for more information.
Caused By: Error: failed to send transaction: Transaction simulation failed: Attempt to load a program that does not exist

createNft.ts:

  const connection = new Connection('http://127.0.0.1:8899');
  const wallet = Keypair.generate();

  const metaplex = Metaplex.make(connection)
    .use(keypairIdentity(wallet))
    .use(bundlrStorage({
      address: 'https://devnet.bundlr.network',
      providerUrl: 'https://api.devnet.solana.com',
      timeout: 60000,
    }));
    // [Mock]
    // .use(mockStorage()); // Use this instead of bundlrStorage if you need mock(dummy url).

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

  // Ref: The Nft Mode: https://github.com/metaplex-foundation/js#the-nft-model
  const { nft } = await metaplex
    .nfts()
    .create({
      uri: uri,
      name: "My NFT",
      sellerFeeBasisPoints: 500, // Represents 5.00%.
      maxSupply: toBigNumber(1),
    })
    .run();

原因

Solana側のConnectino設定(RPC=ノードサーバーのURL)がLocalnetを参照しているため、Metaplexが動作できない(LocalnetにMetaplexのProgramが見つからないと言っている)。

対応

案1

Devnetで動かす。Devnetであれば、MetaplexがすでにProgramをアップしてくれているため、それを利用する。

createNft.ts:

  // const connection = new Connection('http://127.0.0.1:8899');
  const connection = new Connection(clusterApiUrl("devnet"));
  const wallet = Keypair.generate();

案2

LocalnetにMetaplexのProgramをアップする。
Anchorを使っている場合は、ProgramをCloneして利用することができる。

詳細は Metaplex create() fails on localhost with: Attempt to load a program that does not exist を参照。

上記を参考に、Localnet上でMetaplexを使ったNFTをミントできるものを以下に設置した。

256hax Mint NFT using Metaplex and Anchor in Localnet

備考

SolanaのDevnetだと、リクエスト制限が厳しいため、Custom RPCを利用するのがおすすめ。QuickNodeがドキュメント豊富で、最初の取っ掛かりはやりやすい。

RPCs Available