Solana SPL TokenをTransferすると0x4エラー

現象

SolanaやAnchorを使って、SPL Tokenをmintしたあとに、transferしたら発生したエラー。

Transaction simulation failed: Error processing Instruction 0: custom program error: 0x4 

原因

Authorityが誤っているため。権限がないのにトークンを送信しようとしている。

自分のケースは、意図的にAuthorityを変更してテストしていたため発生。
たとえば、以下のようなコードがあったとする(以下は正常に動作)。

    const tx = await program.rpc.proxyTransfer(new anchor.BN(400), {
      accounts: {
        authority: autority.publicKey,
        to: to.publicKey,
        from: from.publicKey,
        tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,
      },
    });

これを以下のように、authorityを適当な値に変更して送信すると、権限ないため0x4エラーになる。

    const tx = await program.rpc.proxyTransfer(new anchor.BN(400), {
      accounts: {
        authority: to.publicKey,
        to: to,
        from: from,
        tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,
      },
    });

対応

正しいauthorityをセットする。

うろ覚えだが、Signerが誤っているケースも0x4エラーだった気がする。たとえば、以下のようなコードがあった場合に、「payer」が誤っているようなケース。

  let signature = await web3.sendAndConfirmTransaction(
    connection, // Connection
    transaction, // Transaction
    [payer] // Signer[]
  );

参考

--------------------------------------------------------
$ spl-token mint $TOKEN1 10 $TOKENACCT1 --mint-authority ~/my_solana_wallet2.json
Minting 10 tokens
  Token: Aqf1rBKNQYgX1mjE64STwV3miEwXEe2ioZzD7n4vkpXk
  Recipient: 9EYnoqiBQmJPR55db44cF4wkN1PD5D6vjxEz61r2Ujak
RPC response error -32002: Transaction simulation failed: Error processing Instruction 0: custom program error: 0x4 [5 log messages]
--------------------------------------------------------

The answer? It doesn’t work! This is because the “mint authority” field of the token account is set to a different account, and only that account is allowed to mint new tokens.

うまくいきません!これは、トークンアカウントの「ミント権限」フィールドが別のアカウントに設定されており、そのアカウントのみが新しいトークンのミントを許可されているためです。