本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
自 2026-07 升级以来,AMM v4 的 OpenBook / Serum 依赖已被移除 — 任何指令都不再读写 OpenBook 状态。下面的市场账户仅作为旧版 v1 指令布局上的位置占位符(被接受但忽略)以及
AmmInfo 上的参考字段保留。请使用 V2 交换入口点,它们完全省略了这些账户。本页仍将账户分为”池所有”和”OpenBook(旧版)“两部分,以便阅读较早的交易。清单
AMM v4 池在创建时在AmmInfo 上记录一个绑定的市场。完整情况如下:
注意:“serum” 前缀在 AMM v4 的 IDL 和字段名中保留以保持向后兼容性。OpenBook 移除后,这些账户不再起作用。
AmmInfo
池的根状态账户。体积较大(约 752 字节),因为它内联携带池和 OpenBook 引用。
结构体布局未变(字节兼容),因此现有的反序列化器继续工作,但在 OpenBook 移除后,上面标记为
已弃用的字段不再被写入 — swap_* 交易量计数器在其最后值处冻结。对于交易量分析,请使用交易日志而不是这些字段。只有 need_take_pnl_* 和 pool_open_time 被主动维护。coin_vault、pc_vault— 池的 SPL Token 金库。按 Serum/OpenBook 约定,coin是token_0(基础),pc是token_1(报价)。coin_decimals、pc_decimals— 与铸币相匹配。open_orders、target_orders、market— 旧版参考字段。仍在AmmInfo上,仍在 v1 指令布局上按位置传递,但程序不再读取或验证它们。V2 交换入口点省略了它们。fees.swap_fee_numerator / swap_fee_denominator— 合并的交易费。默认25 / 10_000 = 0.25%。status— 单一的枚举u64状态,用于控制操作,不是位掩码。可由管理员通过SetParams以param = 0(Status)设置。见下面的 状态。lp_amount— 池内部的 LP 总量。它不等于lp_mint.supply:它恰好高出整整一个 LP 代币(10^coin_decimals个基础单位),因为该数量在初始化时被计入但从未铸造。程序中所有按比例的计算都除以lp_amount,所以你也应该用它。amm_owner— 在创建时从程序硬编码的管理员密钥写入,而不是来自创建者。state_data.need_take_pnl_*— 累积总费用与已清扫费用之间的差值。TakePnl将其清零。
OpenBook 接线
已移除。 OpenBook / Serum 依赖已从程序中删除(2026-07 升级)。本部分描述的账户不再被验证或使用。它们作为参考字段保留在
AmmInfo 上,作为位置占位符保留在旧版 v1 指令布局上。使用V2 交换入口点(SwapBaseInV2 / SwapBaseOutV2),它们完全跳过这些账户。SwapBaseIn / SwapBaseOut、Deposit 或 Withdraw 指令时,账户数量必须仍然匹配旧布局(市场账户占据其历史位置),但它们的内容不再被检查 — 不会针对它们发出 CPI。新代码应使用 V2 交换变体,它们根本不接受这些账户。
amm_open_orders 是一个 OpenBook 所有的账户,持有池在此市场上的限价订单状态:活跃订单、已结算余额、推荐人等。amm_target_orders 是 AMM 侧:它持有 AMM 的预期网格(每个订单槽的价格/大小),以便程序可以廉价地与当前发布的内容进行比较,并放置/取消差值。
权限 PDA
整个 AMM v4 程序恰好有一个amm_authority PDA。其种子很简单(["amm authority"]),其 bump 存储在每个 AmmInfo 上。此权限为所有 AMM v4 池的所有代币操作签名。
254,并镜像在每个 AmmInfo 的 nonce 上;WithdrawExcessLamports 用硬编码的该 nonce 重新派生它。
金库
池的 SPL Token 金库是标准代币账户,其owner 是 amm_authority。不是 ATA —— 它们的地址是在 Initialize2 时由 [AMM_V4_PROGRAM_ID, market, "coin_vault_associated_seed"] 和 [AMM_V4_PROGRAM_ID, market, "pc_vault_associated_seed"] 派生的 PDA。铸币不是种子,amm_id 也不是。地址存储在 AmmInfo 上;派生只是一次性的好奇心。
不支持 Token-2022。程序为所有金库操作硬编码 SPL Token 的程序 ID。尝试将 AMM v4 池绑定到 Token-2022 铸币会在 Initialize2 时以 InvalidSplTokenProgram 失败。
LP 铸币
一个经典的 SPL Token 铸币,其权限是amm_authority。总供应量跟踪 LP 对池的所有权;燃烧 LP 按比例从两个金库返回代币。
状态中确实有一个镜像:AmmInfo.lp_amount。它不等于铸币的供应量 —— 它恰好高出整整一个 LP 代币(10^coin_decimals 个基础单位),因为该数量在初始化时被计入但从未铸造。程序中每一处按比例的计算都除以 lp_amount,所以请使用该字段,而不是铸币的链上供应量。
状态
AmmInfo.status 是单一的枚举 u64 状态,不是位掩码。请按相等来判断 —— 用 status & 1 判断的客户端会把每一个活跃池都归错类,因为正常交易状态是 6,而它的第 0 位是置位的。
当
open_time 在未来时,Initialize2 写入 7,否则写入 6;处于 7 的池会在 state_data.pool_open_time 当时或之后的第一次交换时把自己翻转为 6。超出 0..=7 的值会让 AmmStatus::from_u64 panic。
Raydium 多签通过 SetParams(使用 param = 0,即 Status)设置该状态;只接受 1–7 的值。(AdminCancelOrders 已被移除。)
观察 / 预言机
AMM v4 没有专用的观察账户,并且自从移除 OpenBook 之后,也不再有可以从中派生观察数据的订单簿状态。如果你需要具有程序支持的 Raydium TWAP,请使用 CPMM 或 CLMM —— 两者都维护ObservationState 环形缓冲。否则,请在链下索引交换日志。
从头开始派生池的账户
AMM v4 的池账户是以绑定市场为键的普通 PDA —— 不是有种子的密钥对,也不是每个交易对一个的 PDA。它们每一个都在AMM_V4_PROGRAM_ID 下使用同样的三种子形式 [AMM_V4_PROGRAM_ID, market, <label>]:
raydium-sdk-v2 的 Liquidity.getAssociatedPoolKeys。
实际上,集成商从 GET https://api-v3.raydium.io/pools/info/ids?ids=<POOL_ID> 或 SDK 读取池的完整账户集。手动派生很少需要。
生命周期快速参考
池及其账户无限期地持续。即使流动性完全提取,
AmmInfo 仍然存在。
在哪里读什么
- 数学和费用算术:
products/amm-v4/math。 - 费用分割以及它与 CPMM/CLMM 的比较:
products/amm-v4/fees。 - 指令账户列表:
products/amm-v4/instructions。 - OpenBook 账户派生:OpenBook 程序源码(
github.com/openbook-dex/program)—— 一个 Rust 单体仓库,而不是文字文档。
- Raydium AMM 程序 —
raydium-io/raydium-amm reference/program-addresses用于规范程序 ID- OpenBook / Serum 协议用于对方账户

