> ## 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 = 基數在 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 是接收方。在按比例數學之前會發生類似 `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-Hant/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 曲軸時傳遞市場帳戶。Raydium 路由器在透過 AMM v4 路由時總是使用 V2 形式。

參數與 V1 形式相同（`SwapBaseInV2` 的 `amount_in / minimum_amount_out`；`SwapBaseOutV2` 的 `max_amount_in / amount_out`）。

## `MonitorStep`（遺留 / 惰性）

<Note>
  **不再曲軸。** AMM v4 不再與 OpenBook 共享流動性，所以 `MonitorStep` 無所事事 — 池沒有發佈的訂單要結算、取消或重新發佈。指令在鏈上程式中保留以供向後相容，但 Raydium 守護程式不再呼叫它。手動呼叫它實際上是空操作（除了重新整理歸零的狀態），不應由整合者需要。
</Note>

原本此指令曲軸池的 OpenBook 互動。

**參數**

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

**帳戶** — 交換的所有上述內容，加上管理 OpenBook 帳戶。

**原始效果**（現在實踐中不再相關）：

* 結算任何已填訂單（其收益透過 OpenBook CPI 從 `market_coin_vault`/`market_pc_vault` 移至池的保管庫）。
* 取消其價格或大小不再匹配 `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`  | —            | + 進、− 出                                 | + pnl 分享 | 也許重新發佈網格       |
| `SwapBaseOut` | —            | + 進、− 出                                 | + pnl 分享 | 也許重新發佈網格       |
| `MonitorStep` | —            | 結算填充                                    | —        | 取消 / 發佈        |
| `WithdrawPnl` | —            | − （pnl 掃）                               | 0        | —              |
| `SetParams`   | —            | —                                       | —        | —              |

## 接下來的去處

* [`products/amm-v4/code-demos`](/zh-Hant/products/amm-v4/code-demos) — 交換和 LP 流的 TypeScript 範例。
* [`products/amm-v4/fees`](/zh-Hant/products/amm-v4/fees) — `WithdrawPnl` 細節和費用分割。
* [`reference/error-codes`](/zh-Hant/reference/error-codes) — 前向引用表（AMM v4 錯誤列在該頁）。

來源：

* [Raydium AMM 程式 — `raydium-io/raydium-amm`](https://github.com/raydium-io/raydium-amm)
* Raydium SDK v2 `Liquidity` 模組
* OpenBook 程式 — 市場端帳戶驗證
