> ## 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 資金池的完整帳戶清單 — AmmInfo、TargetOrders、OpenOrders、資金庫、LP 代幣、權限 — 以及資金池綁定的 OpenBook 帳戶。

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

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

<Info>
  AMM v4 因為每次操作都會涉及 OpenBook 狀態，所以帳戶數量比 CPMM 或 CLMM 多得多。本頁將帳戶分為「資金池擁有」和「OpenBook 擁有」兩個部分，讓整合者快速判斷各帳戶歸屬。
</Info>

## 清單

AMM v4 資金池在建立時會綁定到一個 OpenBook 市場。完整的即時情況如下：

| 類別            | 帳戶                                  | 擁有者       | 角色                                    |
| ------------- | ----------------------------------- | --------- | ------------------------------------- |
| 資金池           | `AmmInfo`                           | AMM v4 程式 | 資金池狀態：已累積費用、狀態、對資金庫和 OpenBook 市場的引用。  |
| 資金池           | `amm_authority`                     | AMM v4 程式 | 由程式擁有的 PDA，簽署資金庫移動。在所有 AMM v4 資金池間共享。 |
| 資金池           | `amm_open_orders`                   | OpenBook  | 資金池在此市場上的 OpenBook `OpenOrders` 帳戶。   |
| 資金池           | `amm_target_orders`                 | AMM v4 程式 | 資金池側的目標掛單網格，用於回發到 OpenBook。           |
| 資金池           | `pool_coin_token_account`           | SPL Token | 資金池的幣側資金庫（`amm_authority` 的 ATA）。     |
| 資金池           | `pool_pc_token_account`             | SPL Token | 資金池的 pc 側資金庫。                         |
| 資金池           | `lp_mint`                           | SPL Token | 可互換的 LP 代幣。                           |
| 資金池           | `pool_withdraw_queue`               | AMM v4 程式 | 延遲提款的舊版佇列；保持零長度。                      |
| 資金池           | `pool_temp_lp`                      | AMM v4 程式 | `Initialize` 期間使用的輔助 LP 帳戶。           |
| 市場 (OpenBook) | `serum_market`                      | OpenBook  | 市場本身（基礎/報價代幣、資金庫簽署者等）。                |
| 市場            | `serum_bids`、`serum_asks`           | OpenBook  | 買單和賣單佇列。                              |
| 市場            | `serum_event_queue`                 | OpenBook  | 待處理事件（成交、取消）。                         |
| 市場            | `serum_coin_vault`、`serum_pc_vault` | SPL Token | OpenBook 的市場級資金庫。                     |
| 市場            | `serum_vault_signer`                | OpenBook  | 市場級 PDA，簽署 `serum_*_vault` 移動。        |

注：「serum」前綴在 AMM v4 的 IDL 和欄位名稱中保留以維持向後相容性。它現在指的是 OpenBook 市場。

## `AmmInfo`

資金池的根狀態帳戶。因為同時攜帶資金池和 OpenBook 引用，所以體積較大（約 752 字元）。

```rust theme={null}
// programs/amm/src/state.rs (簡化版；欄位順序/名稱遵循 IDL)
pub struct AmmInfo {
    pub status: u64,           // 位元遮罩：啟用 swap/deposit/withdraw/crank
    pub nonce:  u64,           // 用於衍生 amm_authority 的 bump
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals:   u64,
    pub state:         u64,    // 內部狀態機
    pub reset_flag:    u64,
    pub min_size:      u64,
    pub vol_max_cut_ratio: u64,
    pub amount_wave: u64,
    pub coin_lot_size: u64,    // 鏡像 OpenBook 市場
    pub pc_lot_size:   u64,
    pub min_price_multiplier: u64,
    pub max_price_multiplier: u64,
    pub sys_decimal_value: u64,

    pub fees: Fees,            // 交易/協議/基金費率
    pub state_data: StateData,

    // 資金池擁有的帳戶：
    pub coin_vault: Pubkey,
    pub pc_vault:   Pubkey,
    pub coin_vault_mint: Pubkey,
    pub pc_vault_mint:   Pubkey,
    pub lp_mint:  Pubkey,
    pub open_orders: Pubkey,   // 資金池在 OpenBook 上的 OpenOrders
    pub market: Pubkey,        // OpenBook 市場
    pub market_program: Pubkey, // OpenBook 程式 ID
    pub target_orders: Pubkey,
    pub withdraw_queue: Pubkey,
    pub lp_vault:       Pubkey, // = pool_temp_lp
    pub owner: Pubkey,          // 管理員（多簽）
    pub lp_reserve: u64,
    pub padding: [u64; 3],
}

pub struct Fees {
    pub min_separate_numerator:   u64,     // 5
    pub min_separate_denominator: u64,     // 10_000
    pub trade_fee_numerator:      u64,     // 25  → 由 OpenBook 整合使用
    pub trade_fee_denominator:    u64,     // 10_000
    pub pnl_numerator:            u64,     // 12  → 協議分配的 swap 費用份額
    pub pnl_denominator:          u64,     // 100 → 所以 12/100 = 12% 費用，= 0.03% 交易量
    pub swap_fee_numerator:       u64,     // 25  → 0.25% 總 swap 費用
    pub swap_fee_denominator:     u64,     // 10_000
}

pub struct StateData {
    pub need_take_pnl_coin: u64,
    pub need_take_pnl_pc:   u64,
    pub total_pnl_pc:   u64,
    pub total_pnl_coin: u64,
    pub pool_open_time: u64,
    pub punish_pc_amount: u64,
    pub punish_coin_amount: u64,
    pub orderbook_to_init_time: u64,
    pub swap_coin_in_amount: u128,
    pub swap_pc_out_amount:  u128,
    pub swap_acc_pc_fee:    u64,
    pub swap_pc_in_amount:  u128,
    pub swap_coin_out_amount: u128,
    pub swap_acc_coin_fee:  u64,
}
```

整合者相關的欄位：

* **`coin_vault`**、**`pc_vault`** — 資金池的 SPL Token 資金庫。根據 Serum/OpenBook 慣例，`coin` 是 `token_0`（基礎），`pc` 是 `token_1`（報價）。
* **`coin_decimals`**、**`pc_decimals`** — 與代幣相符。
* **`open_orders`**、**`target_orders`**、**`market`** — 必須傳遞給每個 swap/deposit/withdraw 指令。
* **`fees.swap_fee_numerator / swap_fee_denominator`** — 總交易費用。預設 `25 / 10_000 = 0.25%`。
* **`status`** — 位元遮罩用於控制操作。透過 `AdminSetStatus` 由管理員設定。
* **`state_data.need_take_pnl_*`** — 累積總費用與已清掃費用間的差值。`TakePnl` 將其清零。

## OpenBook 連線

<Note>
  **不再活躍。** AMM v4 資金池不再與 OpenBook 共享流動性 — 掛單網格已停用。本部分描述的 OpenBook 帳戶仍保留在每個資金池的 `AmmInfo` 上，並且由 V1 swap 進入點（以及 `Initialize`、`Deposit`、`Withdraw`）進行驗證以維持向後相容性，但它們引用的鏈上狀態實際上是空的。使用 **V2 swap 進入點**（[`SwapBaseInV2` / `SwapBaseOutV2`](/zh-Hant/products/amm-v4/instructions)），這些完全不需要這些帳戶，代表今天的規範執行路徑。
</Note>

當你呼叫 AMM v4 資金池上的任何 **V1** 讀取或寫入指令時，必須傳遞 OpenBook 帳戶。程式會重新衍生並驗證它們，所以傳遞不匹配的集合會導致回復。（V2 swap 變體完全不需要這些帳戶。）

```ts theme={null}
const market = ...;  // OpenBook 市場 PublicKey

// OpenBook 在其市場帳戶上公開的欄位：
const marketDecoded = OpenBookMarket.decode(marketAccountData);
const {
  bids:           serumBids,
  asks:           serumAsks,
  eventQueue:     serumEventQueue,
  requestQueue:   serumRequestQueue,
  baseVault:      serumCoinVault,
  quoteVault:     serumPcVault,
  vaultSignerNonce,
} = marketDecoded;

const serumVaultSigner = PublicKey.createProgramAddressSync(
  [market.toBuffer(), u64ToBytes(vaultSignerNonce)],
  OPENBOOK_PROGRAM_ID,
);
```

AMM 的 `amm_open_orders` 是由 OpenBook 擁有的帳戶，保存資金池在此市場上的掛單狀態：活躍訂單、已結算餘額、推薦人等。`amm_target_orders` 是 AMM 側：它保存 AMM 的*意圖*網格（每個訂單槽的價格/大小），所以程式可以廉價地與當前發布的進行比較，並放置/取消差異。

## 權限 PDA

整個 AMM v4 程式恰好有一個 `amm_authority` PDA。其種子很簡單（`["amm authority"]`），其 bump 儲存在每個 `AmmInfo` 上。此權限為所有 AMM v4 資金池的所有代幣移動簽署。

```ts theme={null}
const AMM_V4_PROGRAM_ID = new PublicKey(
  "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8",
);
const [ammAuthority] = PublicKey.findProgramAddressSync(
  [Buffer.from("amm authority")],
  AMM_V4_PROGRAM_ID,
);
```

有一個單獨的**資金池範疇**權限為每個資金池衍生以簽署 OpenBook 操作（在此程式的設計中 `amm_authority` 實際上涵蓋兩者；不同版本使用不同的衍生方式，所以在代碼中檢查特定資金池的 `AmmInfo.nonce`）。

## 資金庫

資金池的 SPL Token 資金庫是標準代幣帳戶，其 `owner` 是 `amm_authority`。不是 ATA — 它們的位址是在 `Initialize` 時衍生的特定 PDA，使用 `["amm_associated_seed", coin_mint_or_pc_mint, market, amm_id]` 種子。位址儲存在 `AmmInfo` 上；衍生是一次性的細節。

Token-2022 **不支援**。程式對所有資金庫移動都硬編碼 SPL Token 的程式 ID。嘗試將 AMM v4 資金池綁定到 Token-2022 代幣會在 `Initialize` 時失敗。

## LP 代幣

經典的 SPL Token 代幣，其權限是 `amm_authority`。總供應量追蹤 LP 對資金池的所有權；燒毀 LP 按比例從兩個資金庫返回代幣。因為 AMM v4 早於 CPMM，所以資金池狀態中沒有 `lp_supply` 鏡像 — 直接讀取鏈上代幣的供應量。

## 狀態位元遮罩

`AmmInfo.status` 控制操作。位元（位置可能因程式版本而異 — 透過原始碼確認）：

| 位 | 旗標                  | 效果             |
| - | ------------------- | -------------- |
| 0 | `SWAP_DISABLED`     | `Swap*` 拒絕。    |
| 1 | `DEPOSIT_DISABLED`  | `Deposit` 拒絕。  |
| 2 | `WITHDRAW_DISABLED` | `Withdraw` 拒絕。 |
| 3 | `CLMM_LIKE_MIGRATE` | 由運營使用的遷移控制旗標。  |

Raydium 多簽透過 `AdminCancelOrders`、`AdminSetParams` 等設定這些。

## 觀察 / 預言機

**AMM v4 沒有專用觀察帳戶。** 需要鏈上 TWAP 的其他協議通常間接消費 OpenBook 的簿跨越或讀取鏈外資料。如果你需要具有程式支援的 Raydium TWAP，請使用 CPMM 或 CLMM。

## 從頭衍生資金池的帳戶

因為 AMM v4 不是為確定性每對 PDA 設計的（它早於該 Solana 慣例），規範的 `amm_id` 是使用以下方式衍生的**帶種子的密鑰對**：

```
ammId = createWithSeed(
  owner: ammAuthority,
  seed:  marketPubkey.toBase58().slice(0, 32),
  programId: AMM_V4_PROGRAM_ID,
)
```

相同的帶種子密鑰模式適用於 `amm_open_orders`、`amm_target_orders`、`amm_withdraw_queue`、`pool_temp_lp`、`pool_coin_token_account`、`pool_pc_token_account` 和 `lp_mint`。SDK 和 API 為你預先計算這些；見 `raydium-sdk-v2` 的 `Liquidity.getAssociatedPoolKeys`。

實際上，整合者從 `GET https://api-v3.raydium.io/pools/info/ids?ids=<POOL_ID>` 或 SDK 讀取資金池的完整帳戶集合。手動衍生很少需要。

## 生命週期快速參考

| 事件                           | 建立的帳戶                                                                                               | 刪除的帳戶 |
| ---------------------------- | --------------------------------------------------------------------------------------------------- | ----- |
| `Initialize2`                | `amm_info`、`amm_open_orders`、`amm_target_orders`、資金庫、`lp_mint`、`pool_withdraw_queue`、`pool_temp_lp` | —     |
| `Deposit`                    | —（可能建立使用者 LP ATA）                                                                                   | —     |
| `Withdraw`                   | —                                                                                                   | —     |
| `SwapBaseIn` / `SwapBaseOut` | —（可能建立使用者 ATA）                                                                                      | —     |
| `TakePnl`                    | —                                                                                                   | —     |
| `MonitorStep`（crank）         | —                                                                                                   | —     |

資金池及其帳戶無限期保留。即使流動性完全提出，`AmmInfo` 也保留。

## 讀取資源

* **數學和費用算術**：[`products/amm-v4/math`](/zh-Hant/products/amm-v4/math)。
* **費用分配及其與 CPMM/CLMM 的比較**：[`products/amm-v4/fees`](/zh-Hant/products/amm-v4/fees)。
* **指令帳戶列表**：[`products/amm-v4/instructions`](/zh-Hant/products/amm-v4/instructions)。
* **OpenBook 帳戶衍生**：OpenBook 程式文件（[`github.com/openbook-dex/program`](https://github.com/openbook-dex/program)）。

來源：

* [Raydium AMM 程式 — `raydium-io/raydium-amm`](https://github.com/raydium-io/raydium-amm)
* [`reference/program-addresses`](/zh-Hant/reference/program-addresses) 以取得規範程式 ID
* OpenBook / Serum 協議以取得對方帳戶
