本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
已在 2026-10-22 被取代。
CreatePermissionedPool 被重命名为 CreateCustomizablePoolV2 并改为无权限,带有 CreatePermissionPda / ClosePermissionPda 的 Permission 账户已被移除。本条目描述的是 2026-07-30 时的程序状态。参见 2026-10-22 条目。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 仍保留给遗留池:对于这些池,种子分量折叠为空,再现经典的四种子地址,因此没有现有池地址改变。
参见 指令 → CreatePermissionedPool。
新账户:Permission
一个能力账户,其存在就是授权。它仅存储创建它的 authority(加上填充)。PDA 种子:["permission", authority]。它赋予调用 CreatePermissionedPool 的权利,仅此而已——它不能移动资金、更改费用或改变任何池。参见 账户 → Permission。
新管理指令:CreatePermissionPda / ClosePermissionPda
CreatePermissionPda为给定的permission_authority初始化一个PermissionPDA。ClosePermissionPda关闭它并将租金退款给调用者,撤销授权。已在该授权下创建的池不受影响。
admin 公钥或专用的 permission_pda_admin 密钥(主网和开发网上的不同常数)。参见 管理员密钥和多签 → 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 铸币的尚未解冻账户)。
参见 指令 → OpenLimitOrder。
错误代码
无新错误代码。现有的6000 NotApproved 现在另外涵盖 OpenLimitOrder 上的冻结输入/输出代币账户和交换/限价单禁用情况,以及权限指令上的”签名者既不是 admin 也不是 permission_pda_admin”情况。错误代码表和编号在其他方面与 2026-05-18 版本 保持不变。参见 错误代码 → 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)。

