本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
Raydium 不接受任意的 Token-2022 mint。CPMM 和 CLMM 都运行严格的允许列表模式:默认只有一小部分扩展通过;其他所有扩展在池创建时被拒绝。少数受信任的 mint 通过硬编码地址被允许;CLMM 还支持管理员管理的按 mint 注册表和运行时 Superstate 代币检测。本页是关于执行内容和位置的单页参考,包含程序源代码的文件和行号引用。
程序级支持
允许列表检查位于:
- CPMM:
is_supported_mint在raydium-cp-swap/programs/cp-swap/src/utils/token.rs:178,从Initialize调用。 - CLMM:
is_supported_mint在raydium-clmm/programs/amm/src/util/token.rs:280,从CreatePool调用。 - LaunchLab:
initialize_with_token_2022在raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs(源代码不公开)。
CLMM 位置 NFT 冻结(受限发行者)
位置 NFT 账户默认保持解冻。CLMM 仅在位置使用 V2 开放路径且至少一个金库 mint 的当前freeze_authority 与硬编码的受限发行者列表匹配时才冻结一个。初始列表包含 Superstate 检测路径下使用的相同权限。将池 PDA 设置为位置 NFT mint 的冻结权限本身不是冻结。这是位置托管规则,而不是另一个池创建允许列表:
- 池可以已存在并保持可交换。
- 位置 NFT mint 使用 CLMM 池 PDA 作为其自己的冻结权限;底层发行者不控制位置 NFT。
OpenPositionV2覆盖经典 SPL 位置 NFT 超过 Token-2022 池资产。OpenPositionWithToken22Nft覆盖 Token-2022 位置 NFT。OpenPositionV1 不检查金库 mint,无法服务由已发货列表针对的 Token-2022 受限资产。- 现有位置保持不变。
ClosePosition 解冻并原子性地销毁。参见 products/clmm/ticks-and-positions。
CPMM 和 CLMM 扩展允许列表
在静态白名单短路之后(下面涵盖),程序迭代 mint 的扩展,如果它携带任何不在这五个扩展之外的扩展,则拒绝 mint:
不在此列表中的任何内容 —
TransferHook、NonTransferable、ConfidentialTransferMint、PermanentDelegate、MintCloseAuthority、DefaultAccountState、GroupPointer、GroupMemberPointer、MemberPointer、Pausable 等 — 导致 is_supported_mint 返回 false 并且池创建恢复。
相关行(CPMM,CLMM 中形状相同):
cp-swap/src/utils/token.rs:190–200
绕过路径
不符合允许列表的 Token-2022 mint 仍然可以通过三个显式绕过之一被允许。它们按顺序尝试,在扩展迭代运行之前。1. 静态 mint 白名单
一个常量MINT_WHITELIST base58 字符串数组在每个程序中硬编码。如果 mint 的地址匹配,函数立即返回 true,不执行扩展检查。
这些地址被烘焙到程序中;更新列表需要通过 3/4 升级多签进行程序升级。
2. 按 mint 注册表 — 仅 CLMM
CLMM 还查询种子为[b"support_mint", mint] 的 SupportMintAssociated PDA。如果该 PDA 对 mint 存在,无论其扩展集如何,它都被允许。
PDA 由 CreateSupportMintAssociated 创建(admin/create_support_mint_associated.rs)。指令被限制为两个签名者:
crate::admin::ID— 标准 Raydium 管理员权限。crate::create_support_mint_associated_owner::ID— 为此目的的专用权限:RayVyjyJQz9vAi126A4sGexKnSU1XeZaHTRcM1mZMPY(主网)、rayf3nEbb3bnfN6RDGFpqPbjc5uUa3tRUzu6UVYrRx5(devnet)。
3. Superstate 检测 — 仅 CLMM
CLMM 有第三条路径专门用于 Superstate 的代币化资产,它们使用ScaledUiConfig 扩展,CLMM 程序链接的 spl-token-2022 版本无法解包。CLMM 不是升级依赖,而是通过其权限形状检测 Superstate 代币:
raydium-clmm/programs/amm/src/util/token.rs:485
如果所有四个都成立,mint 通过此分支:
- 其拥有程序是 Token-2022 程序。
- 其冻结权限等于
superstate_allowlist::ID。参见reference/program-addresses了解主网和 devnet 值。 - 其
DefaultAccountState扩展设置为Frozen。 - 其永久委托也是
superstate_allowlist::ID。
绕过不豁免的内容
绕过跳过扩展允许列表,但程序仍然强制执行:- mint 由
Token或Token-2022拥有。自定义代币程序被上游拒绝。 - 池金库使用 Token-2022 池的正确 ATA 扩展创建(
ImmutableOwner等)。 - 所有转移都通过
transfer_checked— 费用承载 mint 在金库中落地正确的金额。
TransferHook 不会获得交换时间检查;钩子会在每次转移时简单地运行,可能会破坏交换。因此,白名单是高信任操作。
“被阻止”语义
当is_supported_mint 返回 false 时,池创建以 ErrorCode::NotSupportMint(CPMM)/ ErrorCode::NotSupportMint(CLMM)恢复。参见 reference/error-codes 了解数字代码。
现有池无法追溯地失败此检查 — 限制仅在创建时运行。Mint 扩展对于 Raydium 拒绝的类别是不可变的(转移钩子、不可转移、机密转移无法在创建后添加),所以静态检查是充分的。
为什么排除每个扩展
- TransferHook — 在每次转移时调用自定义程序,具有任意 CU 消耗、任意失败条件和重新进入调用程序的能力。不存在安全沙箱。一些 DEX 维护钩子允许列表;Raydium 不维护。
- NonTransferable —
Transfer总是失败。池无法获得托管。 - ConfidentialTransfer — 转移金额被加密;曲线无法为交换定价。
- PermanentDelegate — 委托的持有者可以扫除任何代币账户,包括池金库。仅通过受信任发行者的静态白名单允许(例如,受监管的稳定币)。
- MintCloseAuthority — mint 可以关闭;现有池变得不可用。默认不允许。
- DefaultAccountState (Frozen) — 池 ATA 会落地在
Frozen状态,需要按账户解冻。仅通过 Superstate 检测允许,假设发行者在注册时解冻机构账户。 - Group/Member 指针 — 不是主动有害的,但未审查。默认不允许以保持表面狭窄。
转移费会计
对于携带TransferFeeConfig 的 mint,每次交换、存款和提取移动的金额少于名义金额。SDK 显示计算的两个部分:
amountIn + token2022FeeIn作为”你发送”amountOut - token2022FeeOut作为”你接收”feeAmount作为池费用(LP + 协议),与 Token-2022 转移费分开
amountIn → amountOut 的幼稚 UI 低估了成本。
maximumFee 上限
Token-2022 转移费按转移上限。对于 1% mint 和 10,000 代币上限,100,000,000 代币转移仅支付 10,000 的费用。SDK 的 computeSwapAmount 应用上限;直接程序调用者必须复制它。
纪元转换
mint 权限可以安排在下一个纪元激活的费率变化。在转换窗口期间,两个配置(older、newer)同时存在于 mint 上,TransferChecked 按当前纪元选择。CPMM SwapV2 和 CLMM SwapV2 都在 accounts 中传递完整的 mint 账户,所以程序读取正确的配置而无需额外查找。
如果你通过 Trade API 或 SDK 提前超过一个纪元报价,执行费可能与报价费不同 — 由较旧配置的 maximum_fee_basis_points 限制。
计息和 ScaledUiAmount
池持有本金;“UI 金额”是本金乘以时间相关或管理员设置的缩放因子。交换数学在本金上运行:pool.token0Vault.amount 视为本金。
“Token-2022 池”定义
如果任一 mint 有programId == TokenzQdB...,池是 Token-2022 池。API 显示这个:
programId 分派,使用 hasTransferFee 显示 UI 警告。
SDK 助手
常见集成错误
- 仅预检查程序 ID。 mint 可以是 Token-2022 且不受支持。在允许池创建之前,根据允许列表(和静态白名单)遍历扩展列表。
- 当 mint 根本不被接受时信任 SDK 的报价。 报价 API 不拒绝报价 — 池创建是恢复的。在 UI 中公开池创建之前,离线确认
is_supported_mint语义。 - 报价时没有转移费削减。 两侧都有 1% 转移费的 mint 在 0.25% CPMM 池上的有效费用约为 2.25%,而不是 0.25%。使用 SDK 报价或 Trade API 报价 — 永远不要仅从池的费用等级手动计算费用。
- 在 Token-2022 池上调用旧版
Swap指令。Swap早于 Token-2022。每当任一 mint 是 Token-2022 时使用SwapV2。 - 自动列出新的 Token-2022 mint。 钱包和聚合器应在向用户显示 mint 之前检查
TransferHook和NonTransferable;两者都对 Raydium 不利。
未来工作
Solana 生态系统和协议路线图项目,将改变此矩阵:- Solana 级别允许列表转移钩子程序(生态系统约定演变)。
- 机密转移兼容 AMM(研究阶段)。
- 更广泛的 CPMM 按 mint 注册表(与 CLMM 奇偶)。
- 依赖升级,使 CLMM 的
ScaledUiConfig解码无需 Superstate 启发式。
指针
algorithms/token-2022-transfer-fees— 交换中的费用数学。products/cpmm/instructions—SwapV2、Initialize。products/clmm/instructions—SwapV2、CreatePool、CreateSupportMintAssociated。reference/error-codes— 每个程序的NotSupportMint数字代码。
raydium-cp-swap/programs/cp-swap/src/utils/token.rs—MINT_WHITELIST、is_supported_mint。raydium-clmm/programs/amm/src/util/token.rs—MINT_WHITELIST、superstate_allowlist、is_superstate_token、is_supported_mint。raydium-clmm/programs/amm/src/instructions/admin/create_support_mint_associated.rs— 按 mint 注册表指令。raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs— LaunchLab Token-2022 base-mint 创建。

