跳到正文
fevou.独立加密知识站

Solana 代币用的是 Token-2022,扩展列表里哪几项能动你的币

永久代理可以转走或销毁这个币的余额;暂停、冻结和钩子可能挡住转账。拿 PYUSD 的公开扩展页做例子,先认权限种类,再读当前值和权限地址。

图中标题为“扩展写着 Enabled,先看里面填了什么”,副标题“Solana Token-2022 代币:每一项都读当前值,再记下谁能改它”,下方三格写着“认出是哪个程序”“逐项读当前值”“抄下权限地址”
查 Token-2022 代币分三步:先看 mint 归哪个程序管,再把每个扩展展开读出当前值,最后记下能改这个值的权限地址。

Solana 上的币分两种程序发:老的 Token Program,和带扩展的 Token Extensions Program,也就是大家嘴里的 Token-2022。区块浏览器在 mint 页上列出一串扩展名,后面全挂着绿色的 Enabled,看着挺吓人,其实这一排名字回答不了你最关心的那件事:这个币,有没有人能动我钱包里那份。

要回答它,得把每一项展开,看两样东西:它现在填的值,和能改这个值的地址。名字只说明这个开关装上了,开没开、开给谁,要看里面的字段。

先认程序:mint 账户归哪个程序管

判断一个 Solana 代币是不是 Token-2022,看它的 mint 账户(代币铸造账户,定义这个币的那个地址)归哪个程序所有:

  • 老程序 Token Program:TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
  • Token-2022:TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb

2026 年 11 月,Solana Explorer 的 PayPal USD(PYUSD)公开页列出 8 个扩展;它的 mint 地址是 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo。下面沿着这个页面读,字段会变,查看时以页面刚刷新的值为准。

所以 Token-2022 这个标签本身不是风险信号,大稳定币也在用。它只说明这个币可能装了老程序没有的开关,要多查一层。

还有一条官方说明值得记住。Solana 文档的扩展页写着:扩展一般在创建 mint 或持币账户时初始化,大多数扩展在账户初始化之后就加不上了;已有扩展的部分值和权限仍可调整。

Enabled 不等于正在起作用:PYUSD 的两个例子

在 Solana Explorer 的 PYUSD 扩展页,Overview 区的 Extensions 一行列着 mintCloseAuthority、permanentDelegate、transferHook、metadataPointer、confidentialTransferFeeConfig、confidentialTransferMint、transferFeeConfig、tokenMetadata。切到 Extensions 标签,每项后面都是 Enabled。展开 Permanent Delegate 那一行,里面就是一个具体地址。

Solana Explorer 的 PYUSD 扩展列表,Permanent Delegate 展开后显示代理地址,其他扩展仍为折叠状态
2026 年 11 月截图:展开 Permanent Delegate 后可见代理地址;旁边的 Enabled 只表示该扩展已配置。点击图片看大图。

其中 Transfer Hook 和 Transfer Fee Config 要这样读:

  • Transfer Hook:先读 programId。如果是 null,表示没有挂钩子程序;再看 authority 是否仍有地址,有地址就还要考虑以后更换钩子的可能。
  • Transfer Fee Config:同时读新旧两组费率、上限与生效 epoch(网络周期),再记下设置费率的权限(transferFeeConfigAuthority)和提取手续费的权限。费率为零也要看修改权限是否保留。

即使读到没收费、没挂钩子,也不能据此判断以后不会改变。Token-2022 扩展指南里,Transfer fee authority 指能改费率的一方;同一页还给了 set-transfer-hook 的示例,用来更换 mint 挂的钩子程序。钩子权限可以更换程序;转账费调整还要看对应的生效 epoch。

读数旁边留一个权限地址,之后才知道该跟踪谁的操作。

能直接动你余额的:永久代理(Permanent Delegate)

这是最该先看的一项。Solana 文档的定义:永久代理是 mint 层级的权限,可以对这个币的任何持币账户授权转账和销毁,token account owners cannot revoke the permanent delegate,持币人撤不掉。更换代理时,Token-2022 的 SetAuthority 实现校验的是当前永久代理权限,不能仅凭 Mint Authority 字段判断谁能更换它。

换成大白话:你钱包里那份币,代理地址不用你签名就能转走或烧掉。钱包里的「撤销授权」对它无效,因为它根本不是你给出去的授权。

扩展指南对它的用途说得也直白:这个功能有被滥用的空间;正当用途之一,是某些司法辖区要求稳定币发行方能从被制裁方的账户里没收资产。PYUSD 读到的永久代理,和它的冻结权限是同一个地址;这和指南说的稳定币用途对得上,但发行方在什么情况下动用它,要看发行方自己的条款,链上读不出来。

放到一个陌生的 meme 币上,判断就不一样了。没有监管身份要交代、也没有公开说明为什么需要这项权限,却开着永久代理,代理地址还是个看不出来历的普通钱包——这就是一把能直接从你账户里拿币的钥匙。查这个地址是谁、和部署者有什么关系,方法见代币创建者地址怎么查。

指南里还有一句冷门备注:永久代理对存在机密余额(confidential balance)里的币不起作用。这是给发行方的设计提醒,普通持币人不必为此去开机密转账。

让你转不出去的几项:暂停、默认冻结、转账钩子、不可转让

卖币本质上是一笔转账。下面这几项,每一项都能让这笔转账发不出去:

Pausable(可暂停)。文档原话:mint 被暂停时,程序拒绝转账、铸币和销毁;恢复后才正常。暂停权限人随时可以暂停或恢复。要看的是暂停权限在谁手里,以及当前的 paused 状态。

DefaultAccountState(默认账户状态)。可以规定所有新开的持币账户默认是冻结的,用户得找某个服务解冻才能用。指南也写了,冻结权限人以后可以把默认状态改回正常。第一次接收该币可能需要新建持币账户;如果它默认冻结,转入也会失败,必须先由冻结权限人解冻。修改默认状态只影响以后新建的账户,不会自动解冻已有账户。

TransferHook(转账钩子)。当 programId 配置了钩子程序时,Token-2022 会在转账时调用它执行自定义逻辑。Solana 文档列的用途里,就有「给可以收币的钱包设黑名单或白名单」和「对转账收自定义费用」。钩子那一步失败,整笔转账就不成立。所以 programId 不为空时,那个钩子程序是谁部署的、代码是否公开、谁能升级它,都得另外查下去,不能只看 mint 页。

NonTransferable(不可转让)。指南管它叫灵魂绑定代币,做出来就不能转给任何人,持有人只能自己销毁、关闭账户。开着这一项的币,本来就不是拿来交易的。

这些扩展也会限制转账,但各自的权限和生效条件不同。两条链的权限放在一起对照,见在区块浏览器上查代币管理权限;买得进卖不出的整套排查,见貔貅币怎么识别。

改到手数量、改显示数量的:转账费和 Scaled UI Amount

TransferFeeConfig 是协议层的转账费:每笔转账按基点扣一部分,扣下的留在收款账户上、收款人动不了,由提取权限人取走。例如费率为 50 个基点、上限不少于 5 个币时,转 1,000 个币扣费为 1,000 × 50 ÷ 10,000 = 5 个币。读的时候新旧两组费率和上限都要抄,具体怎么用自己那笔交易倒算被扣了多少,见带税代币怎么查。

ScaledUiAmount 只改显示:给代币设一个倍数,显示数量要用链上最小单位数量乘当前倍数,再按 mint 的 decimals 换算;界面还可能做小数舍入。这个过程不增发新币,也不改变账户中存储的原始数量。钱包里的数字突然变了,先查有没有这一项;和 rebase 的区别,见钱包里代币数量自己变了。

MintCloseAuthority 允许在供应量为 0 时关闭 mint 账户。指南提醒,mint 被关闭后用不同扩展重新初始化,旧的持币账户可能绕过新规则。对持币人来说,记下这项权限人是谁就够了。

把读数抄成一张表:扩展、当前值、谁能改

查完别只在脑子里过一遍。按下面的样子抄,下次再看同一个币,直接对比哪一格变了。下面列出 PYUSD 页面要读的字段;未展开的项先留空,不用 Enabled 猜值。地址核对要用完整字符串。

扩展要记的当前值要查的权限对持币人意味着什么
Permanent Delegate已设代理 2apBGM…YJjk当前永久代理权限代理能不经你签名转走或销毁余额
Transfer HookprogramId,需展开读取authorityprogramId 为空时没挂钩子;权限仍在则可更换
Transfer Fee Config两组费率、上限、生效 epoch费率修改与手续费提取权限按当前生效配置计费,修改权限保留则仍可调整
Mint Close AuthoritycloseAuthority,需展开读取当前关闭权限供应量归零时可关闭 mint
Freeze Authority(基础字段)已设2apBGM…YJjk能冻结单个持币账户

PYUSD 页面上的冻结地址与永久代理地址相同;费率、钩子和关闭权限要各自展开读取。即使多个字段指向同一地址,也不能直接当成由一个人控制,还要查它是不是多签或程序账户,以及发行方怎样披露权限用途。

浏览器不显示扩展、或者读不全时

不是每个浏览器都会把扩展解码出来。一个页面没显示扩展,不代表没有,先确认 mint 的所有者程序:是 TokenzQd 开头的那个,就换一个能显示扩展的浏览器再查,比如 Solana Explorer 的 Extensions 标签。

几种情况只能记「未确认」,别往好的方向猜:

  • Transfer Hook 的 programId 有值,但那个程序没有公开源码,或升级权限查不到头。
  • 权限地址是一个程序或多签账户,背后由谁控制还没追清楚。
  • 你查的地址不是 mint,而是某个持币账户或池子地址。先按同名代币怎么区分把 mint 地址钉死。

钱包里平白多出来的 Token-2022 代币,处理顺序也一样:不点它附带的链接,先按 mint 查扩展,再决定碰不碰,见钱包里突然多了不认识的代币。

钱包撤销授权能影响哪些扩展

钱包显示代币是 Token-2022,是不是说明它有问题?

不是。Token-2022 只是 Solana 上另一个发币程序,PYUSD 这样的稳定币也在用。它说明这个币可能开了老程序没有的扩展,要逐项展开看当前值和权限地址,再下判断。

在钱包里撤销授权,能撤掉永久代理吗?

撤不掉。Solana 文档写明,永久代理是 mint 层级的权限,持币人不能从自己的账户上撤销它。钱包里的撤销授权只管你自己给出去的授权,管不到它。

项目方能不能以后再给代币加上永久代理或转账钩子?

永久代理和转账钩子需要在 mint 初始化前设置。但已设置的扩展,权限人仍可能改里面的值,比如更换钩子程序、调整转账费率,所以要把权限地址也记下来。