@solana/spl-token v0.2.0 と @project-serum/anchor v0.25.0 の組み合わせて、 Anchor - escrow のサンプルを試していた時の現象。
Agenda
やりたいこと
escrow のサンプルでは、トークアカウントを作成して、エスクロー型にするため、OwnerをPDAアカウントに変更する流れになっている(PDAに権限を渡して、送受金できるようにする仕組みになっている)。
サンプルでは、トークンアカウントのOwnerがPDAになっているかテストするケースが入っていて、そのテストをクリアできるようにしたい。
現象
anchor testを実行すると以下のエラーが発生。
ターミナル
1) escrow
Initialize escrow:
TypeError: mintA.getAccountInfo is not a function
at /Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/anchor/escrow/latest/tests/escrow.ts:171:27
at Generator.next (<anonymous>)
at fulfilled (tests/escrow.ts:28:58)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
escrow.ts(抜粋)
mintA = await Token.createMint(
provider.connection, // connection: Connection
payer, // payer: Signer
mintAuthority.publicKey, // mintAuthority: PublicKey
null, // freezeAuthority: PublicKey | null
0, // decimals: number
TOKEN_PROGRAM_ID // programId = TOKEN_PROGRAM_ID
);
let _initializerTokenAccountA = await mintA.getAccountInfo(
initializerTokenAccountA
);
原因
@solana/spl-token v0.2.0 からは、 mint.getAccountInfo が使えなくなっているっぽい。
また、書き方も v0.1.x から大幅に変わっている。
対応
@solana/spl-token - getAccount を利用する。
import { TOKEN_PROGRAM_ID, createMint, getOrCreateAssociatedTokenAccount, mintTo, getAccount } from "@solana/spl-token";
mintA = await createMint(
connection, // connection
payer, // payer
mintAuthority.publicKey, // mintAuthority
null, // freezeAuthority
9 // decimals
);
const _initializerTokenAccountA = await getAccount(connection, initializerTokenAccountAPubkey);
備考
@solana/web3.js - Connection もあるが、これを使ってOwnerを取得しようとすると「TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA」になってしまい、トークンアドレス自体のOwnerを取得してきてしまう。