> ## 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>
  AMM v4 指令统一需要**流动性池侧**（AMM v4 程序账户）和**市场侧**（绑定市场的 OpenBook 账户）。省略或不匹配任一组都会导致交易回滚。下面的账户列表使用 Raydium SDK 的字段名以保证清晰；底层 IDL 有时使用 `serum_*` 前缀。
</Info>

## 指令清单

| 分类       | 指令                    | 说明                                    |
| -------- | --------------------- | ------------------------------------- |
| 流动性池生命周期 | `Initialize2`         | 当前的流动性池创建指令（仍可用；UI 新建流动性池时默认使用 CPMM）。 |
| 流动性      | `Deposit`             | 添加流动性，获得 LP 代币。                       |
| 流动性      | `Withdraw`            | 销毁 LP 代币，按比例获得两种资产。                   |
| 交换       | `SwapBaseIn`          | 精确输入交换（完整路径：金库 + OpenBook）。           |
| 交换       | `SwapBaseOut`         | 精确输出交换（完整路径）。                         |
| 交换       | `SwapBaseInV2`        | 精确输入交换，绕过 OpenBook — 仅金库，账户较少。        |
| 交换       | `SwapBaseOutV2`       | 精确输出交换，绕过 OpenBook。                   |
| 维护       | `SetParams`           | 管理员：修改流动性池参数。                         |
| 维护       | `WithdrawPnl`         | 将累计协议 PnL 提取到 PnL 所有者账户。              |
| 维护       | `CreateConfigAccount` | 管理员：初始化程序级 `AmmConfig` PDA。           |
| 维护       | `UpdateConfigAccount` | 管理员：修改程序级配置参数。                        |

SDK 仅为用户级指令提供构建器。维护指令通常由 Raydium 守护进程调用。

## `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 订单还**未**发布；第一次 `MonitorStep` 发布初始网格。

**常见错误** — `InvalidInput`（不匹配的精度、未排序）、`NotApproved`、OpenBook 侧 `InvalidMarketState`。

## `Deposit`

添加流动性。

**参数**

```
max_coin_amount: u64
max_pc_amount:   u64
base_side:       u64    // 0 = base on coin, 1 = base on 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 是接收方。在按比例计算前内部发生类似 `MonitorStep` 的 OpenBook 结算步骤，以便赎回使用新鲜的储备。

## `SwapBaseIn`

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

<Note>
  **新代码应使用 V2 变体。** 由于 AMM v4 不再与 OpenBook 共享流动性，V1 入口点（`SwapBaseIn`、`SwapBaseOut`）— 仍需要完整的 OpenBook 账户集用于验证 — 在功能上是冗余的。新集成应使用 [`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` 的目标代币。
* `state_data.swap_*_in_amount` 和 `swap_*_out_amount` 递增（用于分析）。
* `need_take_pnl_*` 按协议费用份额递增。

**常见错误** — `ExceededSlippage`、`InvalidInput`、`InvalidStatus`、`InvalidMarket`。

## `SwapBaseOut`

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

**参数**

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

## `SwapBaseInV2` / `SwapBaseOutV2`

变体交换入口点，**完全跳过 OpenBook 账户**。数学逻辑与 V1 路径相同，但账户列表仅缩减到 AMM 侧：

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

流动性池的有效储备仍包括 OpenBook 上发布的代币，所以报价数学保持不变。使用 V2 可节省计算资源，避免在同一交易中无需 OpenBook crank 时传递市场账户。Raydium 路由器在通过 AMM v4 路由时始终使用 V2 形式。

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

## `MonitorStep`（历史遗留 / 惰性）

<Note>
  **不再被 crank。** AMM v4 不再与 OpenBook 共享流动性，所以 `MonitorStep` 无事可做 — 流动性池没有订单发布来结算、取消或替换。该指令在链上程序中保留用于向后兼容，但 Raydium 守护进程不再调用它。手动调用它实际上是无操作（除刷新零化状态外），集成者不应需要它。
</Note>

最初该指令 crank 了流动性池的 OpenBook 交互。

**参数**

```
plan_order_limit:   u16
place_order_limit:  u16
cancel_order_limit: u16
```

**账户** — 上面交换的所有内容，加上管理 OpenBook 账户。

**原始效果**（在实践中不再相关）：

* 结算任何已成交订单（其收益从 `market_coin_vault`/`market_pc_vault` 通过 OpenBook CPI 移入流动性池金库）。
* 取消价格或大小不再与 `target_orders` 匹配的陈旧订单。
* 发布新订单以弥补 `target_orders` 和 `amm_open_orders` 之间的缝隙。

无权限限制。任何账户都可调用；历史上 Raydium 守护进程定期这样做。

## `WithdrawPnl` / `TakePnl`

累计协议费用的管理员扫账。

**参数**

* `WithdrawPnl` 不接受参数；它读取 `need_take_pnl_*` 并移动那些确切金额。

**账户**（简略版）

| #  | 名称                        | W | S |                      |
| -- | ------------------------- | - | - | -------------------- |
| 1  | `token_program`           |   |   |                      |
| 2  | `amm`                     | W |   |                      |
| 3  | `amm_authority`           |   |   |                      |
| 4  | `amm_config`              |   |   |                      |
| 5  | `amm_open_orders`         | W |   |                      |
| 6  | `pool_coin_token_account` | W |   |                      |
| 7  | `pool_pc_token_account`   | W |   |                      |
| 8  | `pnl_coin_token_account`  | W |   | 接收者，存储在 `AmmConfig`。 |
| 9  | `pnl_pc_token_account`    | W |   |                      |
| 10 | `pnl_owner`               |   | S | 管理员多签。               |
| 11 | `market_program`          |   |   |                      |
| 12 | `market`                  | W |   |                      |
| 13 | `market_event_queue`      | W |   |                      |
| 14 | `market_coin_vault`       | W |   |                      |
| 15 | `market_pc_vault`         | W |   |                      |
| 16 | `market_vault_signer`     |   |   |                      |

**效果**

* 从 `pool_coin_token_account` 转账 `need_take_pnl_coin` 到 `pnl_coin_token_account`。
* pc 同理。
* 将 `need_take_pnl_coin` 和 `need_take_pnl_pc` 清零。

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

## `SetParams`

管理员参数修改：状态位掩码、订单网格深度、数量波、费用（罕见）等。由 Raydium 多签调用。参数为 `param: u8` 标记 + 负载，类似 CPMM 的 `UpdateAmmConfig`。

## 状态变化矩阵

| 指令            | `lp_mint` 供应 | 金库                                      | PnL 计数器  | OpenBook      |
| ------------- | ------------ | --------------------------------------- | -------- | ------------- |
| `Initialize2` | 初始供应铸给创建者    | `+ init_coin_amount`、`+ init_pc_amount` | 0        | 创建 OpenOrders |
| `Deposit`     | +            | + 两种                                    | —        | 结算成交          |
| `Withdraw`    | −            | − 两种                                    | —        | 结算成交          |
| `SwapBaseIn`  | —            | + in、− out                              | + pnl 份额 | 可能重新发布网格      |
| `SwapBaseOut` | —            | + in、− out                              | + pnl 份额 | 可能重新发布网格      |
| `MonitorStep` | —            | 结算成交                                    | —        | 取消 / 发布       |
| `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 程序 — 市场侧账户验证
