> ## 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.

# Stable AMM 指令

> 目前可呼叫的指令集 — Deposit、Withdraw、SwapBaseIn、SwapBaseOut、WithdrawPnl — 以及在 2026-06-22 升級中移除的指令。

<Info>
  **本頁內容由 AI 自動翻譯，所有內容以英文版本為準。**

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

<Info>
  Stable AMM 是一個**獨立程式**，擁有自己的程式 ID。它**不是** AMM v4 程式的一種模式，也不是透過 AMM v4 進行交易 — 它是單獨部署、升級和呼叫的。它只在費用和帳戶配置慣例上類似於 AMM v4。
</Info>

<Warning>
  **2026-06-22 升級 — 移除已棄用的 OpenBook（市場）程式碼。** Stable AMM **很久以前就停止向 OpenBook 發佈訂單**；訂單簿做市路徑已經閒置多年。此升級刪除了剩餘的市場相關帳戶和程式碼 — 它**不會**改變實時交易行為。

  對整合者的兩個影響：

  1. **更小的帳戶配置。** `SwapBaseIn` / `SwapBaseOut`（**18 → 9**）、`Deposit`（**14 → 12**）和 `Withdraw`（**21/22 → 12**）移除了已棄用的 Serum/市場帳戶。舊配置仍可解析以保持向後相容性。`WithdrawPnl`（**16 → 10**）是**硬性破壞性變更，沒有相容性路徑**（僅限管理員）。
  2. **大多數指令已移除。** 只有 `SwapBaseIn`、`SwapBaseOut`、`Deposit`、`Withdraw` 和 `WithdrawPnl` 保持可呼叫。所有其他指令無法再被呼叫。

  變更日誌：[`reference/changelog`](/zh-Hant/reference/changelog)。
</Warning>

## 指令清單

### 可呼叫

| 指令            | 類別  | 備註                                        |
| ------------- | --- | ----------------------------------------- |
| `Deposit`     | 流動性 | 新增流動性，接收 LP。新的 12 帳戶配置；舊的 14 帳戶配置仍相容。     |
| `Withdraw`    | 流動性 | 銷毀 LP，接收雙邊。新的 12 帳戶配置；舊的 21/22 帳戶配置仍相容。   |
| `SwapBaseIn`  | 交換  | 精確輸入交換。新的 9 帳戶配置；舊的 18 帳戶配置仍相容。           |
| `SwapBaseOut` | 交換  | 精確輸出交換。新的 9 帳戶配置；舊的 18 帳戶配置仍相容。           |
| `WithdrawPnl` | 管理員 | 清掃累積的協議費用。新的 10 帳戶配置（**硬性破壞 — 無舊配置相容性**）。 |

### 已移除（無法再呼叫）

這些在 2026-06-22 升級中被移除，無法再被呼叫。請參閱[已移除的指令](#removed-instructions)。

| 指令                | 前類別   | 前用途                    |
| ----------------- | ----- | ---------------------- |
| `Initialize`      | 生命週期  | 建立資金池。                 |
| `PreInitialize`   | 生命週期  | 舊版預分配輔助工具。             |
| `InitModelData`   | 模型設定  | 建立並初始化查詢表。             |
| `UpdateModelData` | 模型設定  | 每次呼叫最多填充 5 個表格元素。      |
| `MonitorStep`     | Crank | 結算 OpenBook 成交，重新發佈訂單。 |
| `SetParams`       | 管理員   | 變更資金池參數。               |
| `WithdrawSrm`     | 舊版    | 清掃 SRM 費用折扣回扣。         |
| `SimulateInfo`    | 診斷    | 唯讀報價輔助工具。              |

## `Deposit`

新增流動性，接收 LP 代幣。

**引數**

```
max_coin_amount: u64
max_pc_amount: u64
base_side: u64          // 0 = base on coin, 1 = base on pc
```

**帳戶** — 新配置，12 個帳戶（可寫 `W`、簽署者 `S`）

| #  | 名稱                   | W | S | 備註              |
| -- | -------------------- | - | - | --------------- |
| 0  | `token_program`      |   |   | SPL Token。      |
| 1  | `amm`                | W |   | 資金池的 `AmmInfo`。 |
| 2  | `amm_authority`      |   |   | 程式範圍 PDA。       |
| 3  | `amm_target_orders`  | W |   |                 |
| 4  | `amm_lp_mint`        | W |   | LP 鑄幣。          |
| 5  | `amm_coin_vault`     | W |   | 資金池 coin 金庫。    |
| 6  | `amm_pc_vault`       | W |   | 資金池 pc 金庫。      |
| 7  | `model_data_account` |   |   | **唯讀查詢表。**      |
| 8  | `user_source_coin`   | W |   | 使用者的 coin 輸入。   |
| 9  | `user_source_pc`     | W |   | 使用者的 pc 輸入。     |
| 10 | `user_dest_lp`       | W |   | 使用者的 LP ATA。    |
| 11 | `user_source_owner`  |   | S | 交易簽署者。          |

**相容性**：`amm_open_orders`（舊 #3）和 `serum_market`（舊 #9）已移除。當傳遞 **14** 個帳戶時，指令使用舊的 14 帳戶配置進行解析；Serum 帳戶被忽略。

**數學** — 使用查詢表計算比率的標準按比例分配。SDK 計算所需 LP 數量的 coin/pc 對，並檢查最大上限。

## `Withdraw`

銷毀 LP，按比例接收雙邊。

**引數**

```
amount: u64            // 要銷毀的 LP 代幣
```

**帳戶** — 新配置，12 個帳戶（可寫 `W`、簽署者 `S`）

| #  | 名稱                   | W | S | 備註              |
| -- | -------------------- | - | - | --------------- |
| 0  | `token_program`      |   |   | SPL Token。      |
| 1  | `amm`                | W |   | 資金池的 `AmmInfo`。 |
| 2  | `amm_authority`      |   |   | 程式範圍 PDA。       |
| 3  | `amm_target_orders`  | W |   |                 |
| 4  | `amm_lp_mint`        | W |   | LP 鑄幣。          |
| 5  | `amm_coin_vault`     | W |   | 資金池 coin 金庫。    |
| 6  | `amm_pc_vault`       | W |   | 資金池 pc 金庫。      |
| 7  | `model_data_account` |   |   | **唯讀查詢表。**      |
| 8  | `user_source_lp`     | W |   | 使用者的 LP 來源。     |
| 9  | `user_dest_coin`     | W |   | 使用者的 coin 輸出。   |
| 10 | `user_dest_pc`       | W |   | 使用者的 pc 輸出。     |
| 11 | `user_lp_owner`      |   | S | 交易簽署者。          |

**相容性**：九個 Serum 帳戶（`amm_open_orders`、`serum_program`、`serum_market`、`serum_coin_vault`、`serum_pc_vault`、`serum_vault_signer`、`serum_event_q`、`serum_bids`、`serum_asks`）已移除。舊的 **21** 或 **22 帳戶**配置仍被接受。但請注意，**第 22 個可選 `referrer_pc_wallet` 帳戶的推薦費邏輯已被移除** — 它仍可傳遞但不再生效。

**前置條件**

* `user_source_lp` 持有至少 `amount`。

**後置條件**

* `amount` LP 代幣被銷毀。
* 使用者根據目前按比例分配接收 coin 和 pc 數量，已調整累積費用。

## `SwapBaseIn`

使用查詢表進行定價的精確輸入交換。

**引數**

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

**帳戶** — 新配置，9 個帳戶（可寫 `W`、簽署者 `S`）

| # | 名稱                       | W | S | 備註              |
| - | ------------------------ | - | - | --------------- |
| 0 | `spl_token program`      |   |   | SPL Token。      |
| 1 | `amm`                    | W |   | 資金池的 `AmmInfo`。 |
| 2 | `amm_authority`          |   |   | 程式範圍 PDA。       |
| 3 | `amm_coin_vault`         | W |   | 資金池 coin 金庫。    |
| 4 | `amm_pc_vault`           | W |   | 資金池 pc 金庫。      |
| 5 | `model_data_account`     |   |   | **唯讀查詢表。**      |
| 6 | `user_source_token`      | W |   | 使用者的輸入代幣帳戶。     |
| 7 | `user_destination_token` | W |   | 使用者的輸出代幣帳戶。     |
| 8 | `user_source_owner`      |   | S | 使用者（交易簽署者）。     |

**相容性**：九個 OpenBook 帳戶（`amm_open_orders`、`serum_program`、`serum_market`、`serum_bids`、`serum_asks`、`serum_event_queue`、`serum_coin_vault`、`serum_pc_vault`、`serum_vault_signer`）已移除。如果傳遞的帳戶數**不是 9**，指令使用舊的 **18 帳戶**配置進行解析；Serum 帳戶必須仍佔據其位置，但其內容不再被驗證或使用。

**前置條件**

* `amm.status` 允許交換。
* `user_source_token` 持有 ≥ `amount_in`。

**後置條件**

* 使用者失去 `amount_in`，獲得 `amount_out ≥ minimum_amount_out`。
* 資金池費用增加 `need_take_pnl_*` 計數器。

**數學** — 如 [`products/stable/math`](/zh-Hant/products/stable/math) 中所述的查詢表插值。

## `SwapBaseOut`

精確輸出交換（`SwapBaseIn` 的反向）。相同的 9 帳戶配置，不同的數學方向。

**引數**

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

## `WithdrawPnl`

僅限管理員。從 `need_take_pnl_*` 清掃累積的協議費用到指定的 PnL 帳戶。

<Warning>
  **硬性破壞性變更 — 沒有相容性路徑。** 此指令**沒有**舊配置的解析。發送舊配置會因帳戶錯位而失敗，出現驗證錯誤，例如 `InvalidTokenCoin`（舊 #3 是 `open_orders`）。呼叫 `WithdrawPnl` 的管理員工具**必須**更新到新的 10 帳戶配置。
</Warning>

**引數** — 無（狀態驅動）。

**帳戶** — 新配置，固定 10 個帳戶，僅限管理員（可寫 `W`、簽署者 `S`）

| # | 名稱                  | W | S | 備註                  |
| - | ------------------- | - | - | ------------------- |
| 0 | `spl_token program` |   |   | SPL Token。          |
| 1 | `amm`               | W |   | 資金池的 `AmmInfo`。     |
| 2 | `amm_authority`     |   |   | 程式範圍 PDA。           |
| 3 | `amm_coin_vault`    | W |   | 資金池 coin 金庫。        |
| 4 | `amm_pc_vault`      | W |   | 資金池 pc 金庫。          |
| 5 | `amm_target_orders` | W |   |                     |
| 6 | `model_data`        |   |   | 查詢表。                |
| 7 | `user_coin`         | W |   | 管理員的 coin 帳戶（接收費用）。 |
| 8 | `user_pc`           | W |   | 管理員的 pc 帳戶（接收費用）。   |
| 9 | `amm_admin`         |   | S | 資金池管理員（簽署者）。        |

**邏輯變更**：當資金池的可用資金不足以提取累積的 PnL 時，資金池**不再**進入 `CancelAllOrdersState` / `Disabled`；指令直接返回 `TakePnlError`。可選的 `referrer_pc_wallet` 也已被移除。

**前置條件**

* `amm_admin` 必須被授權。

**後置條件**

* `need_take_pnl_coin` 和 `need_take_pnl_pc` 被轉移到管理員的帳戶。
* 計數器被清零。

## 已移除的指令

以下指令在 2026-06-22 升級中被移除，**無法再被呼叫**。此處記錄它們只是為了讓整合者在歷史交易和 SDK 中識別它們。

* **`Initialize`** — 曾經啟動新的 Stable AMM 資金池。已移除。
* **`PreInitialize`** — 舊版預分配輔助工具。已移除。
* **`InitModelData`** — 曾經建立並初始化 `ModelDataInfo` 查詢表。已移除。
* **`UpdateModelData`** — 曾經每次呼叫最多填充 5 個查詢表元素。已移除。
* **`MonitorStep`** — 結算成交並重新發佈訂單網格的 OpenBook crank。在資金池停止向 OpenBook 發佈後已長期閒置；現已移除。
* **`SetParams`** — 管理員參數變更（狀態、費用、所有者、模型資料鍵等）。已移除。
* **`WithdrawSrm`** — 從早期 Serum 時代資金池清掃 SRM 費用折扣回扣。已移除。
* **`SimulateInfo`** — 唯讀報價輔助工具。已移除；使用 SDK 的離鏈穩定曲線輔助工具進行報價（請參閱[程式碼示例](/zh-Hant/products/stable/code-demos)）。

## 後續步驟

* [帳戶](/zh-Hant/products/stable/accounts) — 帳戶欄位配置和大小。
* [數學](/zh-Hant/products/stable/math) — 查詢表插值邏輯。
* [程式碼示例](/zh-Hant/products/stable/code-demos) — 查看如何從 SDK 呼叫這些。

來源：

* `raydium-stable/program/src/instruction.rs`（列舉和 pack/unpack）
* `raydium-stable/program/src/processor.rs`（執行邏輯）
