Skip to main content
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
文档更新日志条目。所有更新的索引见 reference/changelog。协议的历史时间线见 introduction/history-and-milestones
本版本记录了两项 CLMM 程序变更。两者都是附加的、向后兼容的:现有池、头寸和开放订单不受影响,经典的 CreatePool / CreateCustomizablePool 路径保持不变。

集成者速览

  • 池 ID 现在可以是非规范的,受权限门控保护。 历史上,每个 (amm_config, token_mint_0, token_mint_1) 对应恰好一个 CLMM 池地址——PDA 种子将其固定。新指令 CreatePermissionedPool 将客户端提供的非零 seed_index: u16 折叠到池 PDA 种子中,因此白名单操作者可以为同一交易对和费率层级建立多个池,每个池位于自己的地址。由于任意池地址是特权能力,支付者必须持有由管理员授予的 Permission PDA。两条管理指令 CreatePermissionPdaClosePermissionPda 管理这些授权。
  • OpenLimitOrder 现在验证输出端。 该指令接收三个额外账户——output_token_accountoutput_vaultoutput_vault_mint——如果所有者的输入或输出代币账户被冻结,则以 NotApproved 拒绝订单。这保证了最终成交可以被交付,这对允许列表/默认冻结的 Token-2022 铸币(权限代币)很重要。针对旧单边账户列表构建的客户端必须添加三个输出账户。

程序中的变更

新指令:CreatePermissionedPool

形状和参数与 CreateCustomizablePool 相同(它接收相同的 CreateCustomizableParams,因此单边费用和动态费用选择都可用),加上:
  • 一个 seed_index: u16 参数,必须非零。它被追加(小端序)到池 PDA 种子: ["pool", amm_config, token_mint_0, token_mint_1, seed_index.to_le_bytes()]
  • 一个 permission 账户:PDA ["permission", payer]。如果不存在或不由程序拥有,Anchor 会拒绝调用——其存在本身就是授权。
  • 一个 pool_creator 账户,记录为 pool_state.owner,可能与支付者 payer 不同。
seed_index = 0 仍保留给遗留池:对于这些池,种子分量折叠为空,再现经典的四种子地址,因此没有现有池地址改变。 Instructions → CreatePermissionedPool

新账户:Permission

一个能力账户,其存在就是授权。它仅存储创建它的 authority(加上填充)。PDA 种子:["permission", authority]。它仅赋予调用 CreatePermissionedPool 的权利——它不能移动资金、更改费用或改变任何池。见 Accounts → Permission

新管理指令:CreatePermissionPda / ClosePermissionPda

  • CreatePermissionPda 为给定的 permission_authority 初始化一个 Permission PDA。
  • ClosePermissionPda 关闭它并将租金退款给调用者,撤销授权。已在该授权下创建的池不受影响。
两者都接受程序 admin 公钥专用的 permission_pda_admin 密钥(主网和开发网上的不同常数)。见 Admin keys and multisig → CLMM

PoolStateseed_index 字段

两个字节从现有填充区域中划出(padding: [u8; 6]seed_index: [u8; 2] + padding: [u8; 4]),直接在 fee_on 之后。总账户大小不变,不需要索引器迁移。 对于通过 CreatePool / CreateCustomizablePool 创建的池,seed_index[0, 0];对于权限化池,它携带创建者选择的索引,需要离线重新推导池地址。

OpenLimitOrder:输出端账户和冻结账户保护

OpenLimitOrder 账户列表增加了 output_token_accountoutput_vaultoutput_vault_mint。它们仅用于验证——打开时不扣除输出。处理程序现在要求既不输入也不输出代币账户被冻结,否则返回 NotApproved(相同代码已在池禁用交换或限价单时返回)。这关闭了一个漏洞,即订单可能针对永远无法接收成交的代币账户打开(例如,默认冻结 Token-2022 铸币的尚未解冻账户)。 Instructions → OpenLimitOrder

错误代码

无新错误代码。现有的 6000 NotApproved 现在另外涵盖冻结的输入/输出代币账户和 OpenLimitOrder 上的交换/限价单禁用情况,以及权限指令上的”签名者既不是 admin 也不是 permission_pda_admin”情况。错误代码表和编号与 2026-05-18 版本 相比没有其他变化。见 Error codes → CLMM

迁移说明

  • 读取池地址:不要假设每个 (config, mint0, mint1) 对应一个池。一个交易对现在可能有一个规范池加上一个或多个权限化池在 seed_index 推导的地址。从 API/索引器枚举池而不是推导单个 PDA,并在需要重新推导权限化池时存储 seed_index
  • 放置限价单:将三个输出端账户添加到你的 OpenLimitOrder 交易,并在为冻结账户返回 NotApproved 时显示清晰的消息。
  • 无账户大小或布局破坏PoolState 大小相同;已停用的填充字节现在保存 seed_index

更新的页面

  • products/clmm/overview — 关于权限化多池和限价单保护的”新增功能”说明。
  • products/clmm/instructions — 新的 CreatePermissionedPool 部分,指令表中的 CreatePermissionPda / ClosePermissionPda 和管理门控说明,以及更新的 OpenLimitOrder 账户列表/前置条件/错误。
  • products/clmm/accounts — 清单中的 Permission 及其自己的部分,PoolState.seed_index 字段,PDA 推导助手(derivePermissionedPoolderivePermission),以及生命周期快速参考。
  • security/admin-and-multisig — CLMM 角色表中新的 permission_pda_admin 行和权限范围说明。
  • reference/error-codes — 扩展的 NotApproved 描述。
验证对象
  • raydium-clmm 源代码(create_permissioned_pool.rsadmin/create_permission_pda.rsadmin/close_permission_pda.rsstates/permission.rsstates/pool.rslimit_order/open_limit_order.rslib.rs)。