Skip to main content
本页内容由 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),它们完全跳过这些账户。
当你调用旧版 v1 SwapBaseIn / SwapBaseOut、Deposit 或 Withdraw 指令时,账户数量必须仍然匹配旧布局(市场账户占据其历史位置),但它们的内容不再被检查 — 不会针对它们发出 CPI。新代码应使用 V2 交换变体,它们根本不接受这些账户。
AMM 的 amm_open_orders 是一个 OpenBook 所有的账户,持有池在此市场上的限价订单状态:活跃订单、已结算余额、推荐人等。amm_target_orders 是 AMM 侧:它持有 AMM 的预期网格(每个订单槽的价格/大小),以便程序可以廉价地与当前发布的内容进行比较,并放置/取消差值。

权限 PDA

整个 AMM v4 程序恰好有一个 amm_authority PDA。其种子很简单(["amm authority"]),其 bump 存储在每个 AmmInfo 上。此权限为所有 AMM v4 池的所有代币操作签名。
不存在第二个池范围的权限:这一个 PDA 涵盖程序签署的所有内容。它在主网上的 bump 是 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>]:
绑定的市场是唯一可变的种子,这就是为什么一个市场恰好映射到一个 AMM v4 池。SDK 和 API 为你预计算这些;参见 raydium-sdk-v2 的 Liquidity.getAssociatedPoolKeys。 实际上,集成商从 GET https://api-v3.raydium.io/pools/info/ids?ids=<POOL_ID> 或 SDK 读取池的完整账户集。手动派生很少需要。

生命周期快速参考

池及其账户无限期地持续。即使流动性完全提取,AmmInfo 仍然存在。

在哪里读什么

来源: