本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
本条目涵盖即将发布的 CPMM 程序更新。在部署前已针对本地发布分支进行验证。在依赖新指令或改变的
CreateAmmConfig 行为之前,请确认已部署的程序。0.32.1 升至 =1.0.2,构建工具链从 Agave 2.3.0 升至 3.1.10。随之而来的是四项行为变化,其中三项仅影响管理工具,一项——mint 白名单移除——会改变哪些 Token-2022 mint 可用于新池。
交易者、LP 或池创建者调用的所有内容都保持其账户列表、参数和数学逻辑不变。
集成者速览
- 没有面向用户的指令改变。
Initialize、InitializeWithPermission、Deposit、Withdraw、SwapBaseInput、SwapBaseOutput和全部四个Collect*Fee路径在字节层面完全相同。没有账户布局改变。 - 新增一条指令:
CollectExcessLamports。 仅限管理员,无参数,源账户通过remaining_accounts传递。它从 CPMM 控制的金库、LP mint 和 PDA 返回超过租金豁免最低值的 lamports,不涉及其他内容。详见products/cpmm/instructions。 - 新增一个错误代码:
6015LamportsCalculateError。 代码6000–6014保持不变。 CreateAmmConfig不再将签名者复制到费用所有者字段。 新配置获得硬编码的protocol_fee_owner和fund_fee_owner密钥。现有AmmConfig账户保持不变——继续从账户读取protocol_owner/fund_owner,而不是假设任一值。- 硬编码的四地址 Token-2022
MINT_WHITELIST已移除。SupportMintAssociatedPDA 注册表现在是 CPMM 绕过扩展允许列表的唯一方式。现有池不受影响;检查仅在池创建时运行。 ClosePermissionPda接受专用权限 PDA 创建者权限, 不仅仅是共享管理员。- 需要刷新 IDL。 新增一条指令,一个新的错误变体。
- TypeScript 客户端包已重命名。
@coral-xyz/anchor冻结在0.32.1;Anchor 1.x 客户端发布为@anchor-lang/core。
CollectExcessLamports
SIMD-0437 的第一步于 2026 年 9 月 3 日在主网上线,将租金豁免最低值降低 9%,还有四个步骤待来。在某个步骤之前创建的每个 CPMM 池金库、LP mint、PoolState、AmmConfig、ObservationState、Permission 和 SupportMintAssociated 账户现在都资金过剩,程序拥有的账户中的 lamports 只能由该程序移动。
该指令接受四个固定账户——签名者/目标钱包、vault_and_lp_mint_auth_seed 权限 PDA 和两个 token 程序——然后在 remaining_accounts 中接受任意数量的源账户。它根据每个源账户的所有者进行分发:对于 token 账户或 mint,向 token 程序的 WithdrawExcessLamports(判别式 38)进行 CPI;对于 CPMM 拥有的 PDA,直接扣款;对其他任何内容则静默跳过。
Wrapped SOL 是值得理解的情况。原生 token 账户的 lamport 余额就是其 token 余额,所以两个 token 程序都拒绝对其进行 WithdrawExcessLamports。CPMM 改为 CPI SyncNative(将捐赠的超额折叠到 wrapped amount 中),测量金额增长了多少,对该增量执行 UnwrapLamports(判别式 45),然后要求 wrapped 余额等于其同步前的值——如果不相等则返回 LamportsCalculateError。SOL 端池金库通过扫描保持其完整流动性,没有 LP 看到跨扫描的价格变化。
签名者可以是共享程序管理员或专用 collect-lamports 钱包;地址在 reference/program-addresses。
CreateAmmConfig 写入固定费用所有者
在此版本之前,create_amm_config 从调用签名者设置两个费用所有者字段:
CreateAmmConfig 受限于 crate::admin::ID,实际效果是新创建的费用层从一开始就由专用运营钱包扫描,而不是由管理员多签,管理员无法从其刚创建的配置中收集费用,除非首先通过 UpdateAmmConfig 参数 3 或 4 轮换该字段。
两个常量遵循与程序其余地址相同的 devnet/mainnet cfg 模式,在 devnet 上两者都解析为同一密钥。详见 reference/program-addresses。
Token-2022 mint 白名单已移除
is_supported_mint 曾在迭代 mint 的扩展之前在硬编码的四地址 MINT_WHITELIST 上短路。该数组——以及每次调用时从其构建的 HashSet——已删除。保留的是:
- 旧版 SPL Token mint 无条件通过。
- 在
[b"support_mint", mint]处有初始化SupportMintAssociatedPDA 的 mint 无条件通过。 - 否则 mint 上的每个扩展必须是
TransferFeeConfig、MetadataPointer、TokenMetadata、InterestBearingConfig、ScaledUiAmount之一。
CreateSupportMintAssociated / CloseSupportMintAssociated 对及其自己的专用权限(与共享管理员并行),并从 Initialize 和 InitializeWithPermission 中进行查询。移除静态数组意味着 mint 上线现在纯粹是链上操作,而不是程序升级——这正是目的。
现有池不受影响,因为 mint 检查仅在池创建时运行。改变的是为四个曾经白名单中的 mint 之一创建新 CPMM 池现在需要该 mint 拥有注册表 PDA——重要的那些在主网上已经拥有。完整图景,包括注册表做什么和不做什么,在 reference/token-2022-support。
ClosePermissionPda 签名者扩展
CreatePermissionPda 已接受共享管理员或专用权限 PDA 创建者权限,而 ClosePermissionPda 被固定为管理员,带有 address = 约束。关闭路径现在接受相同的对:
InvalidOwner(6001)——旧的 address = 约束已经携带该自定义错误——所以只有接受的签名者集合扩展了。
工具链和依赖变化
Anchor 1.0 在每个 CPI 调用点改变两件事,如果你从自己的程序集成 CPMM 这很重要:
CpiContext::new 接受程序的 Pubkey 而不是其 AccountInfo,Context 有一个生命周期参数而不是四个。在客户端,RequestBuilder::instructions() 返回 Vec<Instruction> 而不是 Result<...>,CommitmentConfig 来自 anchor_client 而不是 solana_sdk,spl-associated-token-account 8.0 将其地址助手移到 ::address 下,其程序 ID 移到 ::program::ID。详见 sdk-api/rust-cpi。
两个构建系统细节,都没有链上效果:程序 crate 声明一个 localnet 特性,从 CPSWAP_LOCALNET_ADMIN 环境变量将本地钱包编译为 admin(所以管理员门控测试可以实际签名——yarn test:local-admin 连接它),programs/cp-swap/Cargo.toml 中的重复 [profile.release] 块已删除。Cargo 忽略工作区根外的 [profile],所以根块已是生效的那个——包括程序级块的 panic = "abort" 从未被应用的事实。
未改变的内容
- 每个账户布局。
PoolState、AmmConfig、ObservationState、Permission、SupportMintAssociated——相同大小、相同偏移。 - 错误代码
6000–6014。 - 扩展允许列表本身。 仍然是相同的五个扩展。
- 费率、费用累积和曲线。
CollectExcessLamports移动从未是任何池储备一部分的 lamports。 spl_memo。Withdraw的 memo 程序约束从spl_memo::id()移到anchor_spl::memo::ID——在重命名的anchor-spl导出下相同的地址。- 程序 ID。 未改变。
更新的页面
products/cpmm/instructions— 添加CollectExcessLamports及其账户列表和按所有者分发表;CreateAmmConfig获得其creator_fee_rate参数和关于固定费用所有者的注释;为CollectExcessLamports、CreateSupportMintAssociated、CloseSupportMintAssociated添加指令摘要行;ClosePermissionPda签名者已更正;Initialize前置条件为仅注册表绕过重写;添加状态变化矩阵行。products/cpmm/accounts— Token-2022 部分围绕注册表 PDA 重写,白名单移除被调出;ClosePermissionPda签名者已更正。products/cpmm/overview— 白名单句子重写。products/cpmm/code-demos— Rust CPI 骨架为 Anchor 1.0 更新。reference/token-2022-support— 绕过路径部分围绕注册表 PDA 重写,移除的MINT_WHITELIST移到”移除的绕过”部分。reference/error-codes—6015已记录。reference/program-addresses— 新增”CPMM support-mint 注册表权限”、“CPMM 费用所有者钱包”和”超额 lamports 收集钱包”部分;ClosePermissionPda注释已更正。sdk-api/rust-cpi、solana-fundamentals/toolchain、integration-guides/cpi-integration— Anchor 1.0 固定和 CPI 迁移注释。solana-fundamentals/rent-and-reclaimable-rent— 新增”Raydium 程序在其自身端扫描的内容”部分。

