介绍

Solana Labs 发布了原生 SPL 代币程序的扩展 Token-2022。Token 2022 是一项新标准,它扩展了 SPL 代币程序并通过代币扩展添加了其他功能。Token-2022 程序旨在成为一种更灵活、更可扩展的代币标准,允许开发人员实现更复杂的代币经济学和控制。
Mint 扩展目前包括:
特征 | 描述 |
---|---|
转让费 | 与转移代币相关的费用(或税金)。 |
闭幕式 | 允许终止空的铸币账户。 |
有利息的代币 | 随着时间的推移会累积利息的代币。 |
不可转让的代币 | 代币一旦发行就无法转让(又名灵魂绑定代币)。 |
常驻代表 | 该机构对该铸币厂的任何账户拥有无限的委托权限,这意味着它可以销毁或转移任意数量的代币。 |
转运钩 | 与令牌指令交互所需的程序(例如,特许权使用费执行) |
元数据指针 | 指向包含铸币厂信息的元数据帐户的指针。 |
元数据 | 存储有关铸币厂的信息,例如名称、符号和徽标(或其他自定义字段)。 |
(尚未上线)机密传输 | 允许传输加密金额的代币。 |
帐户扩展目前包括:
特征 | 描述 |
---|---|
转账时需要备注 | 所有转入的资金都必须附有票据(类似于银行账户)。 |
不可变所有权 | 一旦设置锁定帐户所有权则无法更改。 |
默认帐户状态 | 适用于该帐户的预设条件。 |
CPI 卫士 | 禁止跨程序调用中的某些操作 |
需要注意的是,关联 Token 程序保持不变,这意味着它可以与原始 Token 程序和 Token-2022 程序一起使用。但是,使用现有的方法、程序和说明将需要您将Token-2022程序 ID 作为programId参数传递。例如,让我们看看getAssociatedTokenAddressSync
来自@solana/spl-token
库的内容:
/**
* Get the address of the associated token account for a given mint and owner
*
* @param mint Token mint account
* @param owner Owner of the new account
* @param allowOwnerOffCurve Allow the owner account to be a PDA (Program Derived Address)
* @param programId SPL Token program account
* @param associatedTokenProgramId SPL Associated Token program account
*
* @return Address of the associated token account
*/
export function getAssociatedTokenAddressSync(
mint: PublicKey,
owner: PublicKey,
allowOwnerOffCurve = false,
programId = TOKEN_PROGRAM_ID,
associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID
): PublicKey {
if (!allowOwnerOffCurve && !PublicKey.isOnCurve(owner.toBuffer())) throw new TokenOwnerOffCurveError();
const [address] = PublicKey.findProgramAddressSync(
[owner.toBuffer(), programId.toBuffer(), mint.toBuffer()],
associatedTokenProgramId
);
return address;
}
您现在可以访问 RPC 端点的日志,从而帮助您更有效地解决问题。如果您在 RPC 调用中遇到问题,只需检查 QuickNode 仪表板中的日志即可快速识别和解决问题。
如上所示,该getAssociatedTokenAddressSync
函数接受一个programId
默认为原始 Token 程序 ID 的参数(对于许多 SPL 令牌方法来说,这很常见)。要使用 Token-2022 程序,您必须传入 Token-2022 程序 ID 作为programId
参数。下面的示例显示了原始 Token 程序和 Token-2022 程序的 ata 地址的派生:
import { TOKEN_2022_PROGRAM_ID, getAssociatedTokenAddressSync } from "@solana/spl-token";
// ...
const mint: PublicKey = new PublicKey(SOME_TOKEN_MINT); // a mint of a token created with the original standard
const mint2022: PublicKey = new PublicKey(SOME_TOKEN_MINT_2022); // a mint of a token created with the Token-2022 standard
const ataOld = getAssociatedTokenAddressSync(mint, owner, false);
const ata2022 = getAssociatedTokenAddressSync(mint2022, owner, false, TOKEN_2022_PROGRAM_ID); // 👈 pass in the Token-2022 program ID
请注意,对于mint2022
,我们必须传递TOKEN_2022_PROGRAM_ID
(TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb)作为programId
参数。