Skip to main content
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
Raydium 不接受任意的 Token-2022 mint。CPMM 和 CLMM 都运行严格的允许列表模式:默认只有一小部分扩展通过;其他所有扩展在池创建时被拒绝。少数受信任的 mint 通过硬编码地址被允许;CLMM 还支持管理员管理的按 mint 注册表和运行时 Superstate 代币检测。本页是关于执行内容和位置的单页参考,包含程序源代码的文件和行号引用。

程序级支持

允许列表检查位于: CPMM 或 CLMM 上没有交换时 mint 检查 — 限制仅在池创建时触发。一旦池存在,交换只是信任 mint 没有改变,这对 Token-2022 mint 状态的不可变部分是正确的。

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。
  • OpenPosition V1 不检查金库 mint,无法服务于已发布列表针对的 Token-2022 受限资产。
  • 现有位置保持不变。
冻结的位置仍可由其所有者管理,但无法转移。当客户端将池作为第一个剩余账户传递时,ClosePosition 原子地解冻并销毁。见 products/clmm/ticks-and-positions

LaunchLab 报价 mint

LaunchLab 的两个 mint 受到非常不同的限制,不对称性很容易被忽视。
  • 基础 mint — LaunchLab 创建它。Token-2022 基础 mint 仅通过 initialize_with_token_2022 可达,程序将仅附加 MetadataPointer 和(可选)TransferFeeConfig。任何其他内容返回 NoSupportExtension。预先存在的 Token-2022 mint 根本无法作为基础提供。当附加 TransferFeeConfig 时,mint 的 transfer_fee_config_authority 是启动权限 PDA 直到毕业,而其 withdraw_withheld_authority 是平台配置的 transfer_fee_extension_auth(从 mint 创建开始)— launchpad 程序本身没有提取扣留指令。见 products/launchlab/platform-config
  • 报价 mint — LaunchLab 不创建它也不筛选它。CreateConfig 按原样接受 mint 账户,所以报价端没有 is_supported_mint 等效物。唯一的限制是管理员选择绑定到 GlobalConfig 的 mint。
这使得绑定 Token-2022 报价 mint 成为高信任操作,理由与下面的 CPMM 和 CLMM 静态白名单相同:TransferHook 报价 mint 会在每次买入、卖出和费用索取时在每个以其报价的池中运行其钩子,PermanentDelegate 报价 mint 会让委托人扫除这些池的报价金库。两者都不被程序阻止。 LaunchLab 一旦报价 mint 被绑定就正确处理的内容:
  • 报价金库、两个费用金库和分享费接收者的代币账户都在报价 mint 自己的程序上创建。
  • 报价端的 TransferFeeConfig 被计入所有四个交易指令,滑点界限针对支付者的净额而不是金库的总移动进行检查。见 products/launchlab/instructions
  • PoolState.token_program_flag 记录两个 mint 的程序 — bit0 用于基础 mint,bit1 用于报价 mint。按位解码;字节不是布尔值。见 products/launchlab/accounts
已弃用的 Initialize 指令仍然采用仅限遗留的报价程序,因此具有 Token-2022 报价 mint 的配置仅通过 InitializeV2InitializeWithToken2022 可达。

CPMM 和 CLMM 扩展允许列表

在静态白名单短路之后(下面介绍),程序迭代 mint 的扩展,如果它携带任何不在这五个中的扩展,则拒绝 mint: 不在此列表中的任何内容 — TransferHookNonTransferableConfidentialTransferMintPermanentDelegateMintCloseAuthorityDefaultAccountStateGroupPointerGroupMemberPointerMemberPointerPausable 等 — 导致 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 由 CreateSupportMintAssociatedadmin/create_support_mint_associated.rs)创建。指令受限于两个签名者:
  • crate::admin::ID — 标准 Raydium 管理员权限。
  • crate::create_support_mint_associated_owner::ID — 为此目的的专用权限:RayVyjyJQz9vAi126A4sGexKnSU1XeZaHTRcM1mZMPY(主网),rayf3nEbb3bnfN6RDGFpqPbjc5uUa3tRUzu6UVYrRx5(devnet)。
效果:CLMM 团队可以选择特定的 Token-2022 mint 进行池创建,无需程序升级。CPMM 没有等效物 — 其允许列表严格来自源代码。

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 获取主网-beta 和 devnet 值。
  • DefaultAccountState 扩展设置为 Frozen
  • 其永久委托也是 superstate_allowlist::ID
这是启发式,不是注册表 — Superstate 发行的任何具有相同权限形状的未来 mint 将自动被允许。

绕过不豁免的内容

绕过跳过扩展允许列表,但程序仍然强制:
  • mint 由 TokenToken-2022 拥有。自定义代币程序被上游拒绝。
  • 池金库使用 Token-2022 池的正确 ATA 扩展创建(ImmutableOwner 等)。
  • 所有转账通过 transfer_checked — 费用承载 mint 在金库中着陆正确的金额。
白名单或 PDA 注册的 mint 如果稍后添加 TransferHook 不会获得交换时检查;钩子将简单地在每次转账时运行,可能会破坏交换。因此白名单是高信任操作。

“被阻止”语义

is_supported_mint 返回 false 时,池创建恢复为 ErrorCode::NotSupportMint(CPMM)/ ErrorCode::NotSupportMint(CLMM)。见 reference/error-codes 获取数字代码。 现有池无法追溯地失败此检查 — 限制仅在创建时运行。Mint 扩展对于 Raydium 拒绝的类别是不可变的(转账钩子、不可转账、机密转账无法在创建后添加),所以静态检查是充分的。

为什么每个被排除的扩展被排除

  • TransferHook — 在每次转账时调用自定义程序,具有任意 CU 消耗、任意失败条件和重新进入调用程序的能力。不存在安全沙箱。一些 DEX 维护钩子允许列表;Raydium 不。
  • NonTransferableTransfer 总是失败。池无法获得托管。
  • ConfidentialTransfer — 转账金额被加密;曲线无法为交换定价。
  • PermanentDelegate — 委托人的持有者可以扫除任何代币账户,包括池金库。仅通过受信任发行者的静态白名单允许(例如,受监管的稳定币)。
  • MintCloseAuthority — mint 可以关闭;现有池变得不可用。默认不允许。
  • DefaultAccountState (Frozen) — 池 ATA 会着陆在 Frozen 状态并需要按账户解冻。仅通过 Superstate 检测允许,假设发行者在注册时解冻机构账户。
  • Group/Member 指针 — 不是主动有害,但未审查。默认不允许以保持表面狭窄。

转账费会计

对于携带 TransferFeeConfig 的 mint,每次交换、存款和提款移动的金额少于名义金额。SDK 显示计算的两个部分:
正确的 UI 显示:
  • 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 权限可以安排在下一个纪元激活的费率变化。在转换窗口期间,两个配置(oldernewer)同时存在于 mint 上,TransferChecked 按当前纪元选择。CPMM SwapV2 和 CLMM SwapV2 都在 accounts 中传递完整的 mint 账户,所以程序读取正确的配置而无需额外查找。 如果你通过 Trade API 或 SDK 提前超过一个纪元报价,执行费可能与报价费不同 — 由较旧配置的 maximum_fee_basis_points 限制。

计息和 ScaledUiAmount

池持有本金;“UI 金额”是本金乘以时间相关或管理员设置的缩放因子。交换数学在本金上运行:
SDK 自动转换。直接 RPC 读者应将 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 语义。
  • 报价时不考虑转账费削减。 0.25% CPMM 池两侧的 1% 转账费 mint 的有效费约为 2.25%,而不是 0.25%。使用 SDK 报价或 Trade API 报价 — 永远不要仅从池的费用等级手动计算费用。
  • 在 Token-2022 池上调用遗留 Swap 指令。 Swap 早于 Token-2022。每当任一 mint 是 Token-2022 时使用 SwapV2
  • 自动列出新的 Token-2022 mint。 钱包和聚合器应在向用户显示 mint 之前检查 TransferHookNonTransferable;两者都对 Raydium 不利。

未来工作

会改变此矩阵的 Solana 生态系统和协议路线图项目:
  • Solana 级别的允许列表转账钩子程序(生态系统约定演变)。
  • 机密转账兼容 AMM(研究阶段)。
  • 更广泛的 CPMM 按 mint 注册表(与 CLMM 奇偶)。
  • 依赖升级使 CLMM 的 ScaledUiConfig 解码无需 Superstate 启发式。
任何登陆时此页面将被更新。

指针

源:
  • raydium-cp-swap/programs/cp-swap/src/utils/token.rsMINT_WHITELISTis_supported_mint
  • raydium-clmm/programs/amm/src/util/token.rsMINT_WHITELISTsuperstate_allowlistis_superstate_tokenis_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 基础 mint 创建。
  • raydium-launchpad/programs/launchpad/src/instructions/admin/create_config.rs — LaunchLab 报价 mint 绑定(无扩展检查)。