Solana 代币用的是 Token-2022,扩展列表里哪几项能动你的币
永久代理可以转走或销毁这个币的余额;暂停、冻结和钩子可能挡住转账。拿 PYUSD 的公开扩展页做例子,先认权限种类,再读当前值和权限地址。

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 那一行,里面就是一个具体地址。

其中 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 Hook | programId,需展开读取 | authority | programId 为空时没挂钩子;权限仍在则可更换 |
| Transfer Fee Config | 两组费率、上限、生效 epoch | 费率修改与手续费提取权限 | 按当前生效配置计费,修改权限保留则仍可调整 |
| Mint Close Authority | closeAuthority,需展开读取 | 当前关闭权限 | 供应量归零时可关闭 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 初始化前设置。但已设置的扩展,权限人仍可能改里面的值,比如更换钩子程序、调整转账费率,所以要把权限地址也记下来。