' getAssociatedTokenAddress '函数使用哪些种子来确定关联的令牌帐户公钥?



@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".

相关内容

  • 没有找到相关文章

最新更新