SolanaのWeb3.jsを実行すると「custom program error: 0xc」エラー

環境

  • macOS BigSur 11.7
  • Solana CLI 1.10.39

現象

Solana Web3.jsを実行すると以下のエラーが発生。
(connection.getSignatureStatus や connection.requestAirdrop などすべて実行不可)

Running] ts-node "/Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/scripts/solana/spl-token-v0.2.0/get_account_mint_info.ts"
/Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/scripts/solana/spl-token-v0.2.0/node_modules/@solana/web3.js/src/connection.ts:4934
      throw new SendTransactionError(
            ^
SendTransactionError: failed to send transaction: Transaction simulation failed: Error processing Instruction 1: custom program error: 0xc
    at Connection.sendEncodedTransaction (/Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/scripts/solana/spl-token-v0.2.0/node_modules/@solana/web3.js/src/connection.ts:4934:13)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Connection.sendRawTransaction (/Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/scripts/solana/spl-token-v0.2.0/node_modules/@solana/web3.js/src/connection.ts:4893:20)
    at async Connection.sendTransaction (/Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/scripts/solana/spl-token-v0.2.0/node_modules/@solana/web3.js/src/connection.ts:4881:12)
    at async sendAndConfirmTransaction (/Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/scripts/solana/spl-token-v0.2.0/node_modules/@solana/web3.js/src/utils/send-and-confirm-transaction.ts:31:21) {
  logs: [
    'Program 11111111111111111111111111111111 invoke [1]',
    'Program 11111111111111111111111111111111 success',
    'Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]',
    'Program log: Error: Invalid instruction',
    'Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 796 of 1400000 compute units',
    'Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA failed: custom program error: 0xc'
  ]
}
[Done] exited with code=1 in 1.379 seconds

原因

エラー内容の「0xc」はInstructionエラーを指しているのだが(引数の指定が誤りなど)、今回はおそらくそれとは異なる部分に起因していた。

  1. macOSのバージョンとSolana CLIのバージョン互換があっていなかった
  2. macOSとSolana CLIを最新バージョンにしたあとに再実行するも、同様のエラーが発生。これはおそらくキャッシュが溜まっていて、うまく動作していなかった(本来はうまく動作する)

対応

以下3点を実行

  1. macOSのバージョンとSolana CLIを最新バージョンにする
  2. node_modules, packages-lock.jsonを削除して、npm i でインストールする
  3. 再度SolanaのWeb3.jsを実行する

補足

以上でうまく動作するはずだが、自分の場合はこれでもうまくいかなかったため、以下を追加で実行。

ソースコードを変更

以前まで動いていたソース(spl-token 0.2.x):

    const mint = await createMint(
        connection, // connection
        fromWallet, // payer
        fromWallet.publicKey, // mintAuthority
        null, // freezeAuthority
        9 // decimals
    );

APIドキュメントやソースコードをもとに、引数をすべて指定する。

修正後のソース(spl-token 0.3.x):

    const mint = await createMint(
        connection, // connection
        fromWallet, // payer
        fromWallet.publicKey, // mintAuthority
        null, // freezeAuthority
        9, // decimals
        undefined, // keypair(it will be mint address)
        {}, // confirmOptions
        TOKEN_PROGRAM_ID // programId
    );

この対応をしたら正常に動作した。おそらくキャッシュが効いてしまった(?)ような挙動だった。