> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
> Use this file to discover all available pages before exploring further.

# AMM v4 账户

> AMM v4 池的完整账户清单 — AmmInfo、TargetOrders、OpenOrders、金库、LP 铸币、权限 — 以及池绑定的 OpenBook 账户。

<Info>
  **本页内容由 AI 自动翻译，所有内容以英文版本为准。**

  [查看英文版 →](/products/amm-v4/accounts)
</Info>

<Info>
  自 2026-07 升级以来，AMM v4 的 OpenBook / Serum 依赖已被**移除** — 任何指令都不再读写 OpenBook 状态。下面的市场账户仅作为旧版 v1 指令布局上的位置占位符（被接受但忽略）以及 `AmmInfo` 上的参考字段保留。请使用 V2 交换入口点，它们完全省略了这些账户。本页仍将账户分为"池所有"和"OpenBook（旧版）"两部分，以便阅读较早的交易。
</Info>

## 清单

AMM v4 池在创建时在 `AmmInfo` 上记录一个绑定的市场。完整情况如下：

| 类别           | 账户                                  | 所有者       | 角色                                             |
| ------------ | ----------------------------------- | --------- | ---------------------------------------------- |
| 池            | `AmmInfo`                           | AMM v4 程序 | 池状态：累积费用、状态、对金库的引用（以及作为旧版字段，市场）。               |
| 池            | `amm_authority`                     | AMM v4 程序 | 程序所有的 PDA，签署金库操作。在所有 AMM v4 池中共享。              |
| 池            | `amm_open_orders`                   | OpenBook  | 旧版 `OpenOrders` 引用。程序不再读写；仍在 v1 布局上按位置传递。      |
| 池            | `amm_target_orders`                 | AMM v4 程序 | 旧版目标订单账户。仍由 `WithdrawPnl`（作为账户 #10）引用，但不再构建网格。 |
| 池            | `pool_coin_token_account`           | SPL Token | 池的币侧金库（`amm_authority` 的 ATA）。                 |
| 池            | `pool_pc_token_account`             | SPL Token | 池的 pc 侧金库。                                     |
| 池            | `lp_mint`                           | SPL Token | 可互换的 LP 铸币。                                    |
| 池            | `pool_withdraw_queue`               | AMM v4 程序 | 旧版延迟提取队列；保持零长度。                                |
| 池            | `pool_temp_lp`                      | AMM v4 程序 | 辅助 LP 账户。                                      |
| 旧版（OpenBook） | `serum_market`                      | OpenBook  | 绑定的市场。在 v1 布局上传递，但不再验证或使用。                     |
| 旧版           | `serum_bids`、`serum_asks`           | OpenBook  | 买价/卖价队列。被忽略。                                   |
| 旧版           | `serum_event_queue`                 | OpenBook  | 待处理事件。被忽略。                                     |
| 旧版           | `serum_coin_vault`、`serum_pc_vault` | SPL Token | 市场级金库。被忽略。                                     |
| 旧版           | `serum_vault_signer`                | OpenBook  | 市场级 PDA。被忽略。                                   |

注意："serum" 前缀在 AMM v4 的 IDL 和字段名中保留以保持向后兼容性。OpenBook 移除后，这些账户不再起作用。

## `AmmInfo`

池的根状态账户。体积较大（约 752 字节），因为它内联携带池和 OpenBook 引用。

```rust theme={null}
// programs/amm/src/state.rs (简化版；字段顺序/名称遵循 IDL)
pub struct AmmInfo {
    pub status: u64,           // 位掩码：启用交换/存入/提取/操作
    pub nonce:  u64,           // 用于派生 amm_authority 的 bump
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals:   u64,
    pub state:         u64,    // 内部状态机
    pub reset_flag:    u64,
    pub min_size:      u64,
    pub vol_max_cut_ratio: u64,
    pub amount_wave: u64,
    pub coin_lot_size: u64,    // 旧版（OpenBook 批量大小）；现在初始化为 0
    pub pc_lot_size:   u64,    // 旧版；现在初始化为 0
    pub min_price_multiplier: u64,
    pub max_price_multiplier: u64,
    pub sys_decimal_value: u64,

    pub fees: Fees,            // 交易/协议/基金费率
    pub state_data: StateData,

    // 池所有的账户：
    pub coin_vault: Pubkey,
    pub pc_vault:   Pubkey,
    pub coin_vault_mint: Pubkey,
    pub pc_vault_mint:   Pubkey,
    pub lp_mint:  Pubkey,
    pub open_orders: Pubkey,   // 池在 OpenBook 上的 OpenOrders
    pub market: Pubkey,        // OpenBook 市场
    pub market_program: Pubkey, // OpenBook 程序 ID
    pub target_orders: Pubkey,
    pub withdraw_queue: Pubkey,
    pub lp_vault:       Pubkey, // = pool_temp_lp
    pub owner: Pubkey,          // 管理员（多签）
    pub lp_reserve: u64,
    pub padding: [u64; 3],
}

pub struct Fees {
    pub min_separate_numerator:   u64,     // 5
    pub min_separate_denominator: u64,     // 10_000
    pub trade_fee_numerator:      u64,     // 25  → 由 OpenBook 集成使用
    pub trade_fee_denominator:    u64,     // 10_000
    pub pnl_numerator:            u64,     // 12  → 协议对交换费的份额
    pub pnl_denominator:          u64,     // 100 → 所以 12/100 = 12% 的费用，= 0.03% 的交易量
    pub swap_fee_numerator:       u64,     // 25  → 0.25% 总交换费
    pub swap_fee_denominator:     u64,     // 10_000
}

pub struct StateData {
    pub need_take_pnl_coin: u64,        // 仍在更新 — 累积协议费（币侧）
    pub need_take_pnl_pc:   u64,        // 仍在更新 — 累积协议费（pc 侧）
    pub total_pnl_pc:   u64,            // 已弃用 — 不再更新
    pub total_pnl_coin: u64,            // 已弃用 — 不再更新
    pub pool_open_time: u64,            // 仍在使用 — 池开放时间戳
    pub padding: [u64; 2],              // 保留
    pub orderbook_to_init_time: u64,    // 已弃用 — 不再更新
    pub swap_coin_in_amount: u128,      // 已弃用 — 交易量计数器已冻结
    pub swap_pc_out_amount:  u128,      // 已弃用
    pub swap_acc_pc_fee:    u64,        // 已弃用
    pub swap_pc_in_amount:  u128,       // 已弃用
    pub swap_coin_out_amount: u128,     // 已弃用
    pub swap_acc_coin_fee:  u64,        // 已弃用
}
```

<Note>
  结构体**布局未变**（字节兼容），因此现有的反序列化器继续工作，但在 OpenBook 移除后，上面标记为`已弃用`的字段**不再被写入** — `swap_*` 交易量计数器在其最后值处冻结。对于交易量分析，请使用交易日志而不是这些字段。只有 `need_take_pnl_*` 和 `pool_open_time` 被主动维护。
</Note>

集成商面向的字段：

* **`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`** — 位掩码，控制操作。通过 `AdminSetStatus` 由管理员设置。
* **`state_data.need_take_pnl_*`** — 累积总费用与已清扫费用之间的差值。`TakePnl` 将其清零。

## OpenBook 接线

<Note>
  **已移除。** OpenBook / Serum 依赖已从程序中删除（2026-07 升级）。本部分描述的账户不再被验证或使用。它们作为参考字段保留在 `AmmInfo` 上，作为位置占位符保留在旧版 v1 指令布局上。使用**V2 交换入口点**（[`SwapBaseInV2` / `SwapBaseOutV2`](/zh/products/amm-v4/instructions)），它们完全跳过这些账户。
</Note>

当你调用旧版 **v1** `SwapBaseIn` / `SwapBaseOut`、`Deposit` 或 `Withdraw` 指令时，账户**数量**必须仍然匹配旧布局（市场账户占据其历史位置），但它们的**内容不再被检查** — 不会针对它们发出 CPI。新代码应使用 V2 交换变体，它们根本不接受这些账户。

```ts theme={null}
const market = ...;  // OpenBook 市场 PublicKey

// OpenBook 在其市场账户上公开的字段：
const marketDecoded = OpenBookMarket.decode(marketAccountData);
const {
  bids:           serumBids,
  asks:           serumAsks,
  eventQueue:     serumEventQueue,
  requestQueue:   serumRequestQueue,
  baseVault:      serumCoinVault,
  quoteVault:     serumPcVault,
  vaultSignerNonce,
} = marketDecoded;

const serumVaultSigner = PublicKey.createProgramAddressSync(
  [market.toBuffer(), u64ToBytes(vaultSignerNonce)],
  OPENBOOK_PROGRAM_ID,
);
```

AMM 的 `amm_open_orders` 是一个 OpenBook 所有的账户，持有池在此市场上的限价订单状态：活跃订单、已结算余额、推荐人等。`amm_target_orders` 是 AMM 侧：它持有 AMM 的*预期*网格（每个订单槽的价格/大小），以便程序可以廉价地与当前发布的内容进行比较，并放置/取消差值。

## 权限 PDA

整个 AMM v4 程序恰好有一个 `amm_authority` PDA。其种子很简单（`["amm authority"]`），其 bump 存储在每个 `AmmInfo` 上。此权限为所有 AMM v4 池的所有代币操作签名。

```ts theme={null}
const AMM_V4_PROGRAM_ID = new PublicKey(
  "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8",
);
const [ammAuthority] = PublicKey.findProgramAddressSync(
  [Buffer.from("amm authority")],
  AMM_V4_PROGRAM_ID,
);
```

有一个单独的**池范围**权限，每个池派生一个以签署 OpenBook 操作（`amm_authority` 在此程序的设计中实际上涵盖两者；不同版本使用不同的派生，因此在代码中检查特定池的 `AmmInfo.nonce`）。

## 金库

池的 SPL Token 金库是标准代币账户，其`所有者`是 `amm_authority`。不是 ATA — 它们的地址是在 `Initialize` 时使用 `["amm_associated_seed", coin_mint_or_pc_mint, market, amm_id]` 种子派生的特定 PDA。地址存储在 `AmmInfo` 上；派生是一次性的好奇心。

**不支持** Token-2022。程序为所有金库操作硬编码 SPL Token 的程序 ID。尝试将 AMM v4 池绑定到 Token-2022 铸币在 `Initialize` 时失败。

## LP 铸币

一个经典的 SPL Token 铸币，其权限是 `amm_authority`。总供应量跟踪 LP 对池的所有权；燃烧 LP 按比例从两个金库返回代币。因为 AMM v4 早于 CPMM，池状态中没有 `lp_supply` 镜像 — 直接读取铸币的链上供应量。

## 状态位掩码

`AmmInfo.status` 控制操作。位（位置可能因程序版本而异 — 通过源代码确认）：

| 位 | 标志                  | 效果             |
| - | ------------------- | -------------- |
| 0 | `SWAP_DISABLED`     | `Swap*` 拒绝。    |
| 1 | `DEPOSIT_DISABLED`  | `Deposit` 拒绝。  |
| 2 | `WITHDRAW_DISABLED` | `Withdraw` 拒绝。 |
| 3 | `CLMM_LIKE_MIGRATE` | 由操作使用的迁移门标志。   |

Raydium 多签通过 `SetParams`（使用 `param = Status`）设置这些。（`AdminCancelOrders` 已被移除。）

## 观察 / 预言机

**AMM v4 没有专用的观察账户。** 需要链上 TWAP 的其他协议通常间接消费 OpenBook 的账本交叉或读取链下数据。如果你需要具有程序支持的 Raydium TWAP，请使用 CPMM 或 CLMM。

## 从头开始派生池的账户

因为 AMM v4 不是为确定性的每对 PDA 设计的（它早于该 Solana 约定），规范的 `amm_id` 是一个**有种子的密钥对**，派生方式如下：

```
ammId = createWithSeed(
  owner: ammAuthority,
  seed:  marketPubkey.toBase58().slice(0, 32),
  programId: AMM_V4_PROGRAM_ID,
)
```

相同的有种子密钥对模式适用于 `amm_open_orders`、`amm_target_orders`、`amm_withdraw_queue`、`pool_temp_lp`、`pool_coin_token_account`、`pool_pc_token_account` 和 `lp_mint`。SDK 和 API 为你预计算这些；参见 `raydium-sdk-v2` 的 `Liquidity.getAssociatedPoolKeys`。

实际上，集成商从 `GET https://api-v3.raydium.io/pools/info/ids?ids=<POOL_ID>` 或 SDK 读取池的完整账户集。手动派生很少需要。

## 生命周期快速参考

| 事件                                    | 创建的账户                                                                                              | 销毁的账户 |
| ------------------------------------- | -------------------------------------------------------------------------------------------------- | ----- |
| `Initialize2`                         | `amm_info`、`amm_open_orders`、`amm_target_orders`、金库、`lp_mint`、`pool_withdraw_queue`、`pool_temp_lp` | —     |
| `Deposit`                             | —（可能创建用户 LP ATA）                                                                                   | —     |
| `Withdraw`                            | —                                                                                                  | —     |
| `SwapBaseIn` / `SwapBaseOut`（v1 / V2） | —（可能创建用户 ATA）                                                                                      | —     |
| `WithdrawPnl`                         | —                                                                                                  | —     |

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

## 在哪里读什么

* **数学和费用算术**：[`products/amm-v4/math`](/zh/products/amm-v4/math)。
* **费用分割以及它与 CPMM/CLMM 的比较**：[`products/amm-v4/fees`](/zh/products/amm-v4/fees)。
* **指令账户列表**：[`products/amm-v4/instructions`](/zh/products/amm-v4/instructions)。
* **OpenBook 账户派生**：OpenBook 程序文档（[`github.com/openbook-dex/program`](https://github.com/openbook-dex/program)）。

来源：

* [Raydium AMM 程序 — `raydium-io/raydium-amm`](https://github.com/raydium-io/raydium-amm)
* [`reference/program-addresses`](/zh/reference/program-addresses) 用于规范程序 ID
* OpenBook / Serum 协议用于对方账户
