Anchorでテストコードを作るときに、Fee Payerをセットする場合はKeypairとなる「provider.wallet.payer」を利用することが多い。
Agenda
経緯
サンプルプログラムどおりに実装する分には問題ないが、TypeScriptでprovider設定してから「provider.wallet.payer」を使うと、VSCodeで「そのプロパティは存在しないよ」という警告が表示される。
AnchorのDiscordやGitHub Issueを見ても、解決策が乗っておらず、やむを得ず強引に無視する実装にしたため、そのときのメモ。
あくまでテストコードなので本対応でも特に問題はない想定。
現象
VSCodeで以下の警告が表示される。
Property 'payer' does not exist on type 'Wallet'.ts(2339)
テストコード(該当箇所のみ):
const anchorProvider = anchor.AnchorProvider.env();
const rpc = anchorProvider.connection.rpcEndpoint; // e.g. http://localhost:8899
const connection = new Connection(rpc, 'confirmed');
if (!process.env.SECRET_KEY) throw Error('Not found SECRET_KEY');
const secretKey = new Uint8Array(JSON.parse(process.env.SECRET_KEY));
const keypair = Keypair.fromSecretKey(secretKey);
const wallet = new anchor.Wallet(keypair);
const provider = new anchor.AnchorProvider(
connection, wallet, { commitment: 'confirmed' },
);
anchor.setProvider(provider);
const program = anchor.workspace.Hok;
〜〜〜省略〜〜〜
const signature = await sendAndConfirmTransaction(
provider.connection,
transaction,
[provider.wallet.payer], // ← 「Property 'payer' does not exist on type 'Wallet'.ts(2339)」エラー
);
原因
provider.wallet.payer の型が認識されていないため。
対応
「//@ts-ignore」で無視することもできるが、宣言時にproviderにanyを追記することもで逃げることができるため、今回はanyを記述。
「provider: any」と記述する。
const provider: any = new anchor.AnchorProvider(
connection, wallet, { commitment: 'confirmed' },
);
anchor.setProvider(provider);
補足
型チェックが厳密な必要なコードではanyの利用のご法度だが(TypeScriptを使う意味がなくなってしまうため)、今回のエラー箇所はあくまでテスト専用に利用する部分のため、暫定的に利用。
なお、GitHubでみんなの実装を見てみると、「//@ts-ignore」で無視させてるケースが多かった。