> ## 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-Hant/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-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` 的目標代幣。
* `need_take_pnl_*` 按協議費用份額遞增。
* 注意：`state_data.swap_*_in_amount` / `swap_*_out_amount` 分析計數器**不再更新** — 其值被凍結。使用交易日誌進行交易量分析。

**常見錯誤** — `ExceededSlippage`、`InvalidInput`、`InvalidStatus`、`NotAllowed`（coin/pc 鑄幣相同）。

## `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-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 程式 — 市場側帳戶驗證
