> ## 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 指令及其参数、所需的流动性池和 OpenBook 账户，以及各指令的前置/后置条件。

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

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

<Info>
  自 2026-07 程序升级以来，AMM v4 的 OpenBook / Serum 依赖已被**移除**。旧版 v1 的 `SwapBaseIn` / `SwapBaseOut`、`Deposit` 和 `Withdraw` 指令**保持原有的账户布局**以保证向后兼容：市场账户仍在原有位置被接受，但它们**不再被验证或使用**（不发出 CPI）。新的集成应使用 V2 交换入口点，它们完全省略了市场账户。多条指令已被移除，现在会回滚——参见[更新日志条目](/zh/reference/changelog/2026-07-22-amm-v4-openbook-removal)。下面的账户列表使用 Raydium SDK 中的字段名；底层 IDL 有时使用 `serum_*` 前缀。
</Info>

## 指令清单

| 分组    | 指令                    | 标签 | 说明                                      |
| ----- | --------------------- | -- | --------------------------------------- |
| 池生命周期 | `Initialize2`         | 1  | 唯一的池创建指令（UI 默认为新池使用 CPMM）。              |
| 流动性   | `Deposit`             | 3  | 添加流动性，接收 LP。布局不变（市场账户被忽略）。              |
| 流动性   | `Withdraw`            | 4  | 销毁 LP，按比例接收两种代币。布局不变（市场账户被忽略）。          |
| 交换    | `SwapBaseIn`          | 9  | 精确输入交换。v1 布局不变；市场账户被接受但忽略。              |
| 交换    | `SwapBaseOut`         | 11 | 精确输出交换。同上。                              |
| 交换    | `SwapBaseInV2`        | 16 | **推荐使用。** 精确输入交换，不含市场账户。                |
| 交换    | `SwapBaseOutV2`       | 17 | **推荐使用。** 精确输出交换，不含市场账户。                |
| 维护    | `SetParams`           | 6  | 管理员：更改池参数。**布局 + `param` 值已更改**（破坏性变更）。 |
| 维护    | `WithdrawPnl`         | 7  | 清扫累积的协议 PnL。**账户布局已更改**（破坏性变更）。         |
| 维护    | `CreateConfigAccount` | 14 | 管理员：初始化程序级 `AmmConfig` PDA。             |
| 维护    | `UpdateConfigAccount` | 15 | 管理员：更改程序级配置参数。                          |

SDK 仅为面向用户的指令公开构建器。维护指令通常由 Raydium 守护程序调用。

**已移除/不再可调用**（现在会以 `unimplemented!` 回滚，其客户端构建器已删除）：`Initialize`（标签 0，使用 `Initialize2`）、`MonitorStep`（2）、`MigrateToOpenBook`（5）、`WithdrawSrm`（8）、`PreInitialize`（10，使用 `Initialize2`）、`SimulateInfo`（12）、`AdminCancelOrders`（13）。

## `Initialize2`

启动绑定到现有 OpenBook 市场的新 AMM v4 池。

**参数**

```
nonce:        u8
open_time:    u64
init_pc_amount:   u64
init_coin_amount: u64
```

**账户**（可写 `W`、签名者 `S`）

| #  | 名称                           | W | S | 说明                         |
| -- | ---------------------------- | - | - | -------------------------- |
| 1  | `token_program`              |   |   | SPL Token。                 |
| 2  | `system_program`             |   |   |                            |
| 3  | `rent`                       |   |   |                            |
| 4  | `amm`                        | W |   | `AmmInfo` 账户（种子密钥）。        |
| 5  | `amm_authority`              |   |   | 程序 PDA。                    |
| 6  | `amm_open_orders`            | W |   | OpenBook `OpenOrders`（种子）。 |
| 7  | `lp_mint`                    | W |   |                            |
| 8  | `coin_mint`                  |   |   |                            |
| 9  | `pc_mint`                    |   |   |                            |
| 10 | `pool_coin_token_account`    | W |   |                            |
| 11 | `pool_pc_token_account`      | W |   |                            |
| 12 | `pool_withdraw_queue`        | W |   |                            |
| 13 | `pool_target_orders_account` | W |   |                            |
| 14 | `pool_lp_token_account`      | W |   | 创建者的 LP ATA。               |
| 15 | `pool_temp_lp_token_account` | W |   | 临时账户。                      |
| 16 | `market_program`             |   |   | OpenBook 程序。               |
| 17 | `market`                     |   |   | OpenBook 市场。               |
| 18 | `user_wallet`                | W | S | 创建者。支付租金并资助初始存款。           |
| 19 | `user_token_coin`            | W |   |                            |
| 20 | `user_token_pc`              | W |   |                            |

**后置条件**

* `lp_supply = sqrt(init_coin_amount × init_pc_amount) − INIT_BURN`，其中 `INIT_BURN` ≈ 100 LP 单位被保留在流通之外。
* 不发布 OpenBook 订单（订单簿网格已被移除）。`market_program` / `market` 仍被传递但仅作为参考字段存储；`coin_lot_size` / `pc_lot_size` / `min_size` 初始化为 `0`。

**常见错误** — `InvalidInput`（小数不匹配、未排序）、`NotAllowed`。

## `Deposit`

添加流动性。

**参数**

```
max_coin_amount: u64
max_pc_amount:   u64
base_side:       u64    // 0 = 基于 coin，1 = 基于 pc
// （某些 SDK 变体还接受 other_amount_min）
```

**账户**（简化）

| #  | 名称                        | W | S |
| -- | ------------------------- | - | - |
| 1  | `token_program`           |   |   |
| 2  | `amm`                     | W |   |
| 3  | `amm_authority`           |   |   |
| 4  | `amm_open_orders`         |   |   |
| 5  | `amm_target_orders`       | W |   |
| 6  | `lp_mint`                 | W |   |
| 7  | `pool_coin_token_account` | W |   |
| 8  | `pool_pc_token_account`   | W |   |
| 9  | `market`                  |   |   |
| 10 | `user_coin_token_account` | W |   |
| 11 | `user_pc_token_account`   | W |   |
| 12 | `user_lp_token_account`   | W |   |
| 13 | `user_owner`              |   | S |

**数学** — 标准按比例分配。使用池的*有效*储备（金库 + 账面上），SDK 计算产生给定 LP 数量的 coin/pc 对，并根据 `max_*` 检查。如果任一方超过上限，则以 `ExceededSlippage` 回滚。

## `Withdraw`

销毁 LP，接收两种代币。

**参数**

```
amount: u64    // 要销毁的 LP
```

**账户** — 类似 `Deposit`，方向相反；`lp_mint` 可写用于销毁，用户 ATA 是接收方。账户布局不变（市场账户仍按位置传递，被忽略）。不再有从 OpenBook 结算的步骤——按比例分配的数学直接使用金库余额。

## `SwapBaseIn`

精确输入交换。始终是**AMM 路径**交换（不通过 OpenBook 匹配路由）。

<Note>
  **为新代码使用 V2 变体。** 由于 AMM v4 的 OpenBook 依赖已被移除，V1 入口点（`SwapBaseIn`、`SwapBaseOut`）仍然期望完整的 17 账户列表（或 18 个含可选的 target-orders 账户），但 OpenBook/市场账户现在**按位置被接受并忽略**——它们不被验证，不发出 CPI。传递错误的账户*数量*仍会以 `WrongAccountsNumber` 回滚，但市场账户*内容*不再被检查。新的集成应使用 [`SwapBaseInV2` / `SwapBaseOutV2`](#swapbaseinv2-swapbaseoutv2)，它们采用更小的账户列表，代表当今的规范执行路径。V1 形式在此记录以供完整性和阅读现有链上交易。
</Note>

**参数**

```
amount_in:            u64
minimum_amount_out:   u64
```

**账户**（简化）

| #  | 名称                          | W | S |
| -- | --------------------------- | - | - |
| 1  | `token_program`             |   |   |
| 2  | `amm`                       | W |   |
| 3  | `amm_authority`             |   |   |
| 4  | `amm_open_orders`           | W |   |
| 5  | `amm_target_orders`         | W |   |
| 6  | `pool_coin_token_account`   | W |   |
| 7  | `pool_pc_token_account`     | W |   |
| 8  | `market_program`            |   |   |
| 9  | `market`                    | W |   |
| 10 | `market_bids`               | W |   |
| 11 | `market_asks`               | W |   |
| 12 | `market_event_queue`        | W |   |
| 13 | `market_coin_vault`         | W |   |
| 14 | `market_pc_vault`           | W |   |
| 15 | `market_vault_signer`       |   |   |
| 16 | `user_source_token_account` | W |   |
| 17 | `user_dest_token_account`   | W |   |
| 18 | `user_owner`                |   | S |

**数学** — 参见 [`products/amm-v4/math`](/zh/products/amm-v4/math)。

**前置条件**

* `amm.status` 允许交换（状态位掩码的第 0 位未设置）。
* `amm.state_data.pool_open_time <= now`。
* `amount_in > 0`。
* `user_source_token_account` 至少持有 `amount_in`。

**后置条件**

* 用户失去 `amount_in` 的源代币，获得 `amount_out ≥ minimum_amount_out` 的目标代币。
* `need_take_pnl_*` 按协议费份额递增。
* 注意：`state_data.swap_*_in_amount` / `swap_*_out_amount` 分析计数器**不再更新**——其值被冻结。使用交易日志进行交易量分析。

**常见错误** — `ExceededSlippage`、`InvalidInput`、`InvalidStatus`、`NotAllowed`（coin/pc mint 相同）。

## `SwapBaseOut`

精确输出，`SwapBaseIn` 的反向。账户相同。

**参数**

```
max_amount_in: u64
amount_out:    u64
```

## `SwapBaseInV2` / `SwapBaseOutV2`

变体交换入口点（标签 **16** / **17**），**完全跳过 OpenBook 账户**。数学与 V1 路径相同，但账户列表缩小到仅 AMM 端和用户——**8 个账户，`amm_open_orders` 不被传递**：

| # | 名称                          | W | S |
| - | --------------------------- | - | - |
| 1 | `token_program`             |   |   |
| 2 | `amm`                       | W |   |
| 3 | `amm_authority`             |   |   |
| 4 | `pool_coin_token_account`   | W |   |
| 5 | `pool_pc_token_account`     | W |   |
| 6 | `user_source_token_account` | W |   |
| 7 | `user_dest_token_account`   | W |   |
| 8 | `user_owner`                |   | S |

池储备现在是金库余额（减去待处理 PnL），所以报价数学直接且与 v1 路径相同。使用 V2 以节省计算并避免传递（现在被忽略的）市场账户。Raydium 路由器在通过 AMM v4 路由时始终使用 V2 形式。

参数与 V1 形式相同（`SwapBaseInV2` 的 `amount_in / minimum_amount_out`；`SwapBaseOutV2` 的 `max_amount_in / amount_out`）。

## `MonitorStep` 和其他已移除的指令

<Warning>
  **已移除——不再可调用。** 自 2026-07 升级以来，`MonitorStep`（标签 2）已从程序中移除，现在如果被调用会**回滚**（`unimplemented!`）。其客户端构建器也被删除了。同样适用于 `MigrateToOpenBook`（5）、`WithdrawSrm`（8）、`SimulateInfo`（12）、`AdminCancelOrders`（13）以及旧版 `Initialize`（0）/ `PreInitialize`（10）池创建入口点——改用 `Initialize2`。
</Warning>

历史上，`MonitorStep` 驱动池的 OpenBook 交互：它结算已成交订单（通过 OpenBook CPI 将收益从市场金库移到池金库）、取消陈旧订单，并发布新订单以缩小 `target_orders` 和 `amm_open_orders` 之间的差距。随着 OpenBook 依赖的移除，没有什么需要驱动，指令已消失。任何仍调用它的守护程序或集成必须移除该调用。

## `WithdrawPnl` / `TakePnl`

管理员清扫累积的协议费。

**参数**

* `WithdrawPnl` 不接受参数；它读取 `need_take_pnl_*` 并移动这些精确数量。

<Warning>
  **破坏性变更（仅限管理员）。** 账户列表从 17 个（+1 个可选）减少到**10 个**——`amm_open_orders` 和所有六个市场账户被移除——**没有兼容性解析**。旧布局错位（旧 #5 是 `amm_open_orders`，现在是 `pool_coin_token_account`）并以 `InvalidCoinVault` 等错误失败。管理员工具必须更新。
</Warning>

**账户**（新 10 账户布局）

| #  | 名称                        | W | S |        |
| -- | ------------------------- | - | - | ------ |
| 1  | `token_program`           |   |   |        |
| 2  | `amm`                     | W |   |        |
| 3  | `amm_config`              |   |   |        |
| 4  | `amm_authority`           |   |   |        |
| 5  | `pool_coin_token_account` | W |   |        |
| 6  | `pool_pc_token_account`   | W |   |        |
| 7  | `pnl_coin_token_account`  | W |   | 接收方。   |
| 8  | `pnl_pc_token_account`    | W |   |        |
| 9  | `pnl_owner`               |   | S | 管理员多签。 |
| 10 | `amm_target_orders`       | W |   |        |

**效果**

* 从 `pool_coin_token_account` 转移 `need_take_pnl_coin` 到 `pnl_coin_token_account`。
* pc 相同。
* 将 `need_take_pnl_coin` 和 `need_take_pnl_pc` 置零。
* **逻辑变更**：如果金库余额不足以覆盖累积 PnL，指令直接返回 `TakePnlError`（它不再操纵订单簿状态）。

储备无变化，因为累积 PnL 已从不变量中排除。

## `SetParams`

管理员参数更改，由 Raydium 多签调用。参数是 `param: u8` 标签 + 有效负载。

<Warning>
  **破坏性变更（仅限管理员）。** 账户列表被减少到仅 `[amm (W), admin (S)]`（权限、open-orders、target-orders、金库和所有市场账户被移除）。`param` 枚举被**重新编号和修剪**：`Status` = 0、`State` = 1、`Fees` = **2**（曾为 9）、`SetOpenTime` = **3**（曾为 11）。所有订单簿网格参数和 `AmmOwner`、`LastOrderDistance`、`UpdateOpenOrder` 被移除，`SetParamsInstruction` 结构体删除了 `new_pubkey` 和 `last_order_distance`。管理员工具必须更新。
</Warning>

## 状态变更矩阵

OpenBook 列已消失——没有指令再接触订单簿。

| 指令                              | `lp_mint` 供应 | 金库                                      | PnL 计数器  |
| ------------------------------- | ------------ | --------------------------------------- | -------- |
| `Initialize2`                   | 初始供应铸造给创建者   | `+ init_coin_amount`、`+ init_pc_amount` | 0        |
| `Deposit`                       | +            | + 两种                                    | —        |
| `Withdraw`                      | −            | − 两种                                    | —        |
| `SwapBaseIn` / `SwapBaseInV2`   | —            | + 入、− 出                                 | + pnl 份额 |
| `SwapBaseOut` / `SwapBaseOutV2` | —            | + 入、− 出                                 | + pnl 份额 |
| `WithdrawPnl`                   | —            | − （pnl 清扫）                              | 0        |
| `SetParams`                     | —            | —                                       | —        |

## 后续步骤

* [`products/amm-v4/code-demos`](/zh/products/amm-v4/code-demos) — 交换和 LP 流的 TypeScript 示例。
* [`products/amm-v4/fees`](/zh/products/amm-v4/fees) — `WithdrawPnl` 详情和费用分割。
* [`reference/error-codes`](/zh/reference/error-codes) — 前向参考表（AMM v4 错误列在该页面上）。

来源：

* [Raydium AMM 程序 — `raydium-io/raydium-amm`](https://github.com/raydium-io/raydium-amm)
* Raydium SDK v2 `Liquidity` 模块
* OpenBook 程序 — 市场端的账户验证
