以下のリポジトリ(私が作ったやつ)を使って、複数のウォレットアドレスにSPLトークンをバッチ処理的に送信しようとしました。
https://github.com/penpendayo/transfer-spl-token-typescript
そうしたら途中で「TokenAccountNotFoundError」というエラーが起きました💧
この原因についてメモ。
原因
以下の記事様にすべて書かれていたので、自分が書くことはほとんどないのですが
Solana web3.jsでNFTミント後にNFT送信するとTokenAccountNotFoundErrorエラー – myMemoBlog by 256hax
要するに、送信先トークンアカウント作成のトランザクションがSolana上で処理される前に、トークンを送ろうとするとこのエラーが起こるらしいです。
なので、これらの処理の間に一定のsleep処理を入れてやるとうまくいくようです。
具体的にどれくらいsleepすればいいのか分からなかったので、とりあえず2秒だけsleepしてみることにしました。
コードだと以下のような感じ。
// 送信先ウォレットのトークンアカウントを取得し、存在しない場合は作成する const toTokenAccount = await getOrCreateAssociatedTokenAccount( connection, fromWallet, mint, toWalletPublicAddress ); await sleep(2000); // 指定したトークンを、送信元→送信先に、指定した数量だけ送る const signature = await transfer( connection, fromWallet, fromTokenAccount.address, toTokenAccount.address, fromWallet.publicKey, amount, [] );
2秒にしたのは、Solanaは50,000TPSくらいまで処理できるらしいので、2022年8月現在だと3,000TPSくらいしかトランザクションが流れていないので2秒もあれば処理できてるでしょ・・みたいな理由です。
これで今のところ、同じようなエラーが発生してません。
おわり
コメント