@solana/spl-token
包包含getAssociatedTokenAddress
函数,可用于获取关联令牌帐户的地址(公钥)。下面是一个例子:
const programATAPublicKey = await getAssociatedTokenAddress(
mintPublicKey,
programPDAPublicKey,
true,
program.programId
);
我试图使用@project-serum/anchor
包中的findProgramAddress
函数实现相同的结果。我的问题是我不知道getAssociatedTokenAddress
里面使用了哪些种子。例如,我期望下面的代码返回关联的令牌帐户公钥:
const [programATAPublicKey] =
await anchor.web3.PublicKey.findProgramAddress(
[mintPublicKey.toBuffer(), programPDAPublicKey.toBuffer()],
program.programId
);
然而,结果是不同的。哪个种子组合将产生与getAssociatedTokenAddress
返回的结果相同的结果?
最好是使用源代码!下面是生成相关令牌帐户地址的确切代码:
export async function getAssociatedTokenAddress(
mint: PublicKey,
owner: PublicKey,
allowOwnerOffCurve = false,
programId = TOKEN_PROGRAM_ID,
associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID
): Promise<PublicKey> {
if (!allowOwnerOffCurve && !PublicKey.isOnCurve(owner.toBuffer())) throw new TokenOwnerOffCurveError();
const [address] = await PublicKey.findProgramAddress(
[owner.toBuffer(), programId.toBuffer(), mint.toBuffer()],
associatedTokenProgramId
);
return address;
}
其中ASSOCIATED_TOKEN_PROGRAM_ID
为"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
。
摘自https://github.com/solana-labs/solana-program-library/blob/ad97543192e05e6ecba88fff3b1da08ca523a5b6/token/js/src/state/mint.ts#L156
关联令牌帐户使用以下结构:
[
walletAddress.toBuffer(),
TOKEN_PROGRAM_ID.toBuffer(),
tokenMintAddress.toBuffer(),
],
SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID
TOKEN_PROGRAM_ID = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
的地方和SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
.