本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
文档更新日志条目。所有更新的索引见
reference/changelog。协议的历史时间线见 introduction/history-and-milestones。CreatePool / CreateCustomizablePool 路径保持不变。
集成者速览
- 池 ID 现在可以是非规范的,受权限门控保护。 历史上,每个
(amm_config, token_mint_0, token_mint_1)对应恰好一个 CLMM 池地址——PDA 种子将其固定。新指令CreatePermissionedPool将客户端提供的非零seed_index: u16折叠到池 PDA 种子中,因此白名单操作者可以为同一交易对和费率层级建立多个池,每个池位于自己的地址。由于任意池地址是特权能力,支付者必须持有由管理员授予的PermissionPDA。两条管理指令CreatePermissionPda和ClosePermissionPda管理这些授权。 OpenLimitOrder现在验证输出端。 该指令接收三个额外账户——output_token_account、output_vault、output_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初始化一个PermissionPDA。ClosePermissionPda关闭它并将租金退款给调用者,撤销授权。已在该授权下创建的池不受影响。
admin 公钥或专用的 permission_pda_admin 密钥(主网和开发网上的不同常数)。见 Admin keys and multisig → CLMM。
PoolState:seed_index 字段
两个字节从现有填充区域中划出(padding: [u8; 6] → seed_index: [u8; 2] + padding: [u8; 4]),直接在 fee_on 之后。总账户大小不变,不需要索引器迁移。 对于通过 CreatePool / CreateCustomizablePool 创建的池,seed_index 是 [0, 0];对于权限化池,它携带创建者选择的索引,需要离线重新推导池地址。
OpenLimitOrder:输出端账户和冻结账户保护
OpenLimitOrder 账户列表增加了 output_token_account、output_vault 和 output_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 推导助手(derivePermissionedPool、derivePermission),以及生命周期快速参考。security/admin-and-multisig— CLMM 角色表中新的permission_pda_admin行和权限范围说明。reference/error-codes— 扩展的NotApproved描述。
raydium-clmm源代码(create_permissioned_pool.rs、admin/create_permission_pda.rs、admin/close_permission_pda.rs、states/permission.rs、states/pool.rs、limit_order/open_limit_order.rs、lib.rs)。

