本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
本条目涵盖即将推出的 AMM v4 程序更新。在部署前已针对本地发布分支进行了验证。在依赖新指令之前,请确认已部署的程序。
solana-program =2.1.0,这个固定版本造成了阻碍。系统程序的辅助函数在 Solana 3.0 中被移到了自己的 solana-system-interface crate,spl-token 达到了 9.0,spl-associated-token-account 达到了 8.0。本次发布采用了这三个版本。
第二个是协议应得的资金。SIMD-0437 正在分五步将租金豁免最低额度削减 90%,第一步于 2026 年 9 月 3 日在主网上线。AMM v4 在此之前创建的每个账户——数百个池金库、LP 铸币、AmmInfo 和 TargetOrders 账户——现在都资金过剩,而程序拥有的账户中的 lamports 只能由该程序移动。因此需要一条新指令。
集成商速览
- 交易者或 LP 调用的任何内容都未改变。
Initialize2、Deposit、Withdraw、SwapBaseIn、SwapBaseOut、SwapBaseInV2、SwapBaseOutV2、WithdrawPnl和SetParams保持其账户列表、参数布局和数学运算。没有账户布局改变。没有现有错误代码移动。 - 添加了一条指令:
WithdrawExcessLamports,标签18。 仅限管理员,无参数,可变账户列表。它从 AMM v4 控制的账户返回超过租金豁免最低额度的 lamports,不涉及其他任何内容。参见products/amm-v4/instructions。 - 追加了一个错误代码:
60LamportsCalculateError。AmmError不是 Anchor 编号的——它从0开始——所以这是custom program error: 0x3c。代码0–59保持不变。 CreateConfigAccount(标签 14)停止读取租金 sysvar,现在被记录为 4 账户指令。本次发布中没有任何内容是破坏性的,这包括:该账户是列表中的最后一个,处理程序按位置读取,没有长度检查,所以仍然传递它的管理工具继续工作。- 需要刷新 IDL,如果你从中生成客户端。一条新指令、一个新错误变体、一个改变的账户列表。
WithdrawExcessLamports
该指令将收集 lamports 的钱包作为唯一的签名者和目标,AMM v4 权限 PDA、SPL Token 程序,然后是任意数量的源账户。它根据每个源账户的所有者进行分派:
wSOL 分支是有趣的那个。包装的 SOL 账户的 lamport 余额就是其代币余额,所以 token 程序完全拒绝对其进行
WithdrawExcessLamports。通过 SyncNative 和增量大小的 UnwrapLamports 的往返提取仅捐赠的超额,并使包装的余额完全保持原样——之后会进行断言,如果算术不一致则返回 LamportsCalculateError。因此 SOL 端池金库在扫描中保持其完整流动性,没有 LP 看到价格变化。
签名者是每个集群的专用密钥,在与现有 AMM 所有者和创建池费用地址相同的 config_feature 模块下硬编码。与 CPMM 和 LaunchLab 不同,AMM v4 仅接受该钱包——没有管理员回退。地址在 reference/program-addresses。
CreateConfigAccount 停止读取租金 sysvar
Solana 3.0 使 Rent::get() 成为读取租金参数的自然方式,所以发布替换了程序中所有四个 Rent::from_account_info(...) 调用。在其中三个——在 Initialize2 期间创建池的代币账户、LP 铸币和 PDA 账户的辅助函数中——sysvar 账户仍然被传递并仍然被转发到 token 程序 CPI 中,所以该账户列表中没有任何内容改变。在 CreateConfigAccount 中,sysvar 没有其他目的,是列表中的最后一个账户,所以它从记录的列表中移除了:
发送旧的五账户列表仍然有效。 移除的账户是最后一个,
process_create_config 通过 next_account_info 按位置读取其四个账户,没有任何内容检查总数,所以尾部租金账户永远不会被查看。管理工具应该为了清晰起见进行更新,不是紧急的。没有用户面向的构建器构造这条指令。
Initialize2 是不要过度读取的情况:它也停止调用 Rent::from_account_info,但其租金账户保持在位置 3 并仍然被真正使用——程序将其转发到创建池的金库和 LP 铸币的 spl_token::initialize_account 和 initialize_mint CPI 中。从该账户列表中删除它会破坏池创建。
依赖项更改
程序使用的系统程序部分——
system_instruction::create_account、transfer、allocate、assign 和程序 ID 本身——现在来自 solana-system-interface 而不是 solana_program::system_program 和 solana_program::system_instruction。程序 ID 在字节上是相同的,所以这是一个编译时移动,没有链上后果,包括对比较它的 InvalidSysProgramAddress 检查。
还删除了两个死模块:srm_token 和 msrm_token,从 OpenBook 移除遗留下来的 Serum/MSRM 铸币声明。没有任何内容引用它们。
未改变的内容
- 每个账户布局。
AmmInfo、StateData、TargetOrders、AmmConfig——相同的大小、相同的字段偏移。没有索引器或解码器更改。 - 错误代码
0–59。LamportsCalculateError在60处追加,所以没有任何内容移动。 - AMM 权限 PDA。 仍然是整个程序的一个 PDA,种子
["amm authority"],nonce254。 - 费用、PnL 会计和曲线。 未触及。
WithdrawExcessLamports移动的 lamports 从未是任何池储备的一部分。 - Token-2022。 仍然不支持。新指令仅与旧版 SPL Token 程序通信。
- 程序 ID。 未改变——参见
reference/program-addresses。
更新的页面
products/amm-v4/instructions— 添加了WithdrawExcessLamports及其账户列表和按所有者分派表;新的CreateConfigAccount/UpdateConfigAccount部分涵盖租金 sysvar 移除;清单表和状态变化矩阵行已添加。products/amm-v4/overview— 发布横幅。reference/error-codes— 新的”AMM v4:AmmError不是 Anchor 编号”部分,记录代码60和基于0的编号。reference/program-addresses— 新的”超额 lamports 收集钱包”部分。solana-fundamentals/rent-and-reclaimable-rent— 新的”Raydium 程序在其自己一侧扫描的内容”部分;包装的 SOL 注释已更正为说两个 token 程序都公开UnwrapLamports。solana-fundamentals/toolchain— Agave 3.1.10、release.anza.xyz、Rust 1.91.0。

