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

# Hướng dẫn lệnh AMM v4

> Mỗi lệnh AMM v4 với các tham số, tài khoản pool và OpenBook mà nó yêu cầu, cũng như các điều kiện trước/sau trên mỗi lệnh.

<Info>
  **Trang này được dịch tự động bằng AI. Phiên bản tiếng Anh là bản chính thức.**

  [Xem bản tiếng Anh →](/products/amm-v4/instructions)
</Info>

<Info>
  Kể từ nâng cấp chương trình 2026-07, phụ thuộc OpenBook / Serum của AMM v4 đã bị **loại bỏ**. Các lệnh v1 cũ `SwapBaseIn` / `SwapBaseOut`, `Deposit` và `Withdraw` **giữ nguyên bố cục tài khoản cũ** để tương thích ngược: các tài khoản thị trường vẫn được chấp nhận ở vị trí cũ, nhưng chúng **không còn được xác thực hoặc sử dụng** (không có CPI được phát hành). Các tích hợp mới nên sử dụng các điểm vào swap V2, loại bỏ hoàn toàn các tài khoản thị trường. Một số lệnh đã bị loại bỏ và hiện trả về lỗi — xem [mục nhập changelog](/vi/reference/changelog/2026-07-22-amm-v4-openbook-removal). Danh sách tài khoản dưới đây sử dụng tên trường từ Raydium SDK; IDL cơ bản đôi khi sử dụng tiền tố `serum_*`.
</Info>

## Danh sách lệnh

| Nhóm          | Lệnh                  | tag | Ghi chú                                                                                                |
| ------------- | --------------------- | --- | ------------------------------------------------------------------------------------------------------ |
| Vòng đời pool | `Initialize2`         | 1   | Lệnh tạo pool duy nhất (UI mặc định là CPMM cho các pool mới).                                         |
| Thanh khoản   | `Deposit`             | 3   | Thêm thanh khoản, nhận LP. Bố cục không thay đổi (tài khoản thị trường bị bỏ qua).                     |
| Thanh khoản   | `Withdraw`            | 4   | Đốt LP, nhận cả hai bên theo tỷ lệ. Bố cục không thay đổi (tài khoản thị trường bị bỏ qua).            |
| Swap          | `SwapBaseIn`          | 9   | Swap đầu vào chính xác. Bố cục v1 không thay đổi; tài khoản thị trường được chấp nhận nhưng bị bỏ qua. |
| Swap          | `SwapBaseOut`         | 11  | Swap đầu ra chính xác. Giống như trên.                                                                 |
| Swap          | `SwapBaseInV2`        | 16  | **Được khuyến nghị.** Swap đầu vào chính xác mà không có tài khoản thị trường.                         |
| Swap          | `SwapBaseOutV2`       | 17  | **Được khuyến nghị.** Swap đầu ra chính xác mà không có tài khoản thị trường.                          |
| Bảo trì       | `SetParams`           | 6   | Admin: thay đổi tham số pool. **Bố cục + giá trị `param` đã thay đổi** (phá vỡ).                       |
| Bảo trì       | `WithdrawPnl`         | 7   | Quét PnL giao thức đã tích lũy. **Bố cục tài khoản đã thay đổi** (phá vỡ).                             |
| Bảo trì       | `CreateConfigAccount` | 14  | Admin: khởi tạo PDA `AmmConfig` cấp chương trình.                                                      |
| Bảo trì       | `UpdateConfigAccount` | 15  | Admin: thay đổi tham số cấu hình cấp chương trình.                                                     |

SDK chỉ cung cấp các builder cho các lệnh hướng tới người dùng. Các lệnh bảo trì thường được gọi bởi người giữ Raydium.

**Đã loại bỏ / không còn có thể gọi được** (chúng hiện trả về lỗi `unimplemented!`, và các builder client của chúng đã bị xóa): `Initialize` (tag 0, sử dụng `Initialize2`), `MonitorStep` (2), `MigrateToOpenBook` (5), `WithdrawSrm` (8), `PreInitialize` (10, sử dụng `Initialize2`), `SimulateInfo` (12), `AdminCancelOrders` (13).

## `Initialize2`

Khởi động một pool AMM v4 mới được liên kết với một thị trường OpenBook hiện có.

**Tham số**

```
nonce:        u8
open_time:    u64
init_pc_amount:   u64
init_coin_amount: u64
```

**Tài khoản** (có thể ghi `W`, ký `S`)

| #  | Tên                          | W | S | Ghi chú                                               |
| -- | ---------------------------- | - | - | ----------------------------------------------------- |
| 1  | `token_program`              |   |   | SPL Token.                                            |
| 2  | `system_program`             |   |   |                                                       |
| 3  | `rent`                       |   |   |                                                       |
| 4  | `amm`                        | W |   | Tài khoản `AmmInfo` (khóa được gieo).                 |
| 5  | `amm_authority`              |   |   | PDA chương trình.                                     |
| 6  | `amm_open_orders`            | W |   | OpenBook `OpenOrders` (được gieo).                    |
| 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 |   | ATA LP của người tạo.                                 |
| 15 | `pool_temp_lp_token_account` | W |   | Tài khoản tạm.                                        |
| 16 | `market_program`             |   |   | Chương trình OpenBook.                                |
| 17 | `market`                     |   |   | Thị trường OpenBook.                                  |
| 18 | `user_wallet`                | W | S | Người tạo. Trả tiền thuê và tài trợ tiền gửi ban đầu. |
| 19 | `user_token_coin`            | W |   |                                                       |
| 20 | `user_token_pc`              | W |   |                                                       |

**Điều kiện sau**

* `lp_supply = sqrt(init_coin_amount × init_pc_amount) − INIT_BURN`, trong đó `INIT_BURN` ≈ 100 đơn vị LP được giữ ngoài lưu thông.
* Không có đơn hàng OpenBook nào được đăng (lưới sổ đặt hàng đã bị loại bỏ). `market_program` / `market` vẫn được truyền nhưng chỉ được lưu trữ dưới dạng các trường tham chiếu; `coin_lot_size` / `pc_lot_size` / `min_size` được khởi tạo thành `0`.

**Lỗi phổ biến** — `InvalidInput` (số thập phân không khớp, không được sắp xếp), `NotAllowed`.

## `Deposit`

Thêm thanh khoản.

**Tham số**

```
max_coin_amount: u64
max_pc_amount:   u64
base_side:       u64    // 0 = base on coin, 1 = base on pc
// (một số biến thể SDK cũng chấp nhận other_amount_min)
```

**Tài khoản** (tóm tắt)

| #  | Tên                       | 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 |

**Toán học** — theo tỷ lệ tiêu chuẩn. Sử dụng dự trữ *hiệu quả* của pool (vault + trên sổ), SDK tính toán cặp coin/pc mang lại số lượng LP nhất định và kiểm tra nó so với `max_*`. Trả về lỗi `ExceededSlippage` nếu một trong hai bên vượt quá giới hạn.

## `Withdraw`

Đốt LP, nhận cả hai bên.

**Tham số**

```
amount: u64    // LP để đốt
```

**Tài khoản** — giống như `Deposit` với hướng đảo ngược; `lp_mint` có thể ghi để đốt, các ATA của người dùng là người nhận. Bố cục tài khoản không thay đổi (tài khoản thị trường vẫn được truyền theo vị trí, bị bỏ qua). Không còn bước thanh toán từ OpenBook nữa — toán học theo tỷ lệ sử dụng trực tiếp số dư vault.

## `SwapBaseIn`

Swap đầu vào chính xác. Luôn là swap **đường dẫn AMM** (không định tuyến qua khớp OpenBook).

<Note>
  **Sử dụng các biến thể V2 cho mã mới.** Vì phụ thuộc OpenBook của AMM v4 đã bị loại bỏ, các điểm vào V1 (`SwapBaseIn`, `SwapBaseOut`) vẫn mong đợi danh sách tài khoản đầy đủ 17 tài khoản (hoặc 18 với tài khoản target-orders tùy chọn), nhưng các tài khoản OpenBook/thị trường hiện được **chấp nhận theo vị trí và bị bỏ qua** — chúng không được xác thực và không có CPI được phát hành. Truyền số lượng tài khoản sai vẫn trả về lỗi `WrongAccountsNumber`, nhưng nội dung tài khoản thị trường không còn được kiểm tra. Các tích hợp mới nên sử dụng [`SwapBaseInV2` / `SwapBaseOutV2`](#swapbaseinv2-swapbaseoutv2), chúng có danh sách tài khoản nhỏ hơn nhiều và đại diện cho đường dẫn thực thi chính tắc ngày hôm nay. Các hình thức V1 được ghi lại ở đây để hoàn chỉnh và để đọc các giao dịch trên chuỗi hiện có.
</Note>

**Tham số**

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

**Tài khoản** (tóm tắt)

| #  | Tên                         | 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 |

**Toán học** — xem [`products/amm-v4/math`](/vi/products/amm-v4/math).

**Điều kiện trước**

* `amm.status` cho phép swap (bit 0 của mặt nạ trạng thái không được đặt).
* `amm.state_data.pool_open_time <= now`.
* `amount_in > 0`.
* `user_source_token_account` giữ ít nhất `amount_in`.

**Điều kiện sau**

* Người dùng mất `amount_in` của token nguồn, nhận `amount_out ≥ minimum_amount_out` của token đích.
* `need_take_pnl_*` tăng thêm phần chia sẻ phí giao thức.
* Lưu ý: các bộ đếm phân tích `state_data.swap_*_in_amount` / `swap_*_out_amount` **không còn được cập nhật** — giá trị của chúng bị đóng băng. Sử dụng nhật ký giao dịch để phân tích khối lượng.

**Lỗi phổ biến** — `ExceededSlippage`, `InvalidInput`, `InvalidStatus`, `NotAllowed` (mint coin/pc giống nhau).

## `SwapBaseOut`

Đầu ra chính xác, nghịch đảo của `SwapBaseIn`. Cùng tài khoản.

**Tham số**

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

## `SwapBaseInV2` / `SwapBaseOutV2`

Các điểm vào swap biến thể (tag **16** / **17**) **bỏ qua hoàn toàn các tài khoản OpenBook**. Toán học giống với đường dẫn V1, nhưng danh sách tài khoản thu nhỏ chỉ còn phía AMM và người dùng — **8 tài khoản, và `amm_open_orders` không được truyền**:

| # | Tên                         | 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 |

Dự trữ pool hiện là số dư vault (trừ PnL đang chờ xử lý), vì vậy toán học báo giá rõ ràng và giống với đường dẫn v1. Sử dụng V2 để tiết kiệm tính toán và tránh truyền các tài khoản thị trường (hiện bị bỏ qua). Bộ định tuyến Raydium luôn sử dụng hình thức V2 khi định tuyến qua AMM v4.

Các tham số giống như các hình thức V1 (`amount_in / minimum_amount_out` cho `SwapBaseInV2`; `max_amount_in / amount_out` cho `SwapBaseOutV2`).

## `MonitorStep` và các lệnh bị loại bỏ khác

<Warning>
  **Đã loại bỏ — không còn có thể gọi được.** Kể từ nâng cấp 2026-07, `MonitorStep` (tag 2) đã bị loại bỏ khỏi chương trình và hiện **trả về lỗi** (`unimplemented!`) nếu được gọi. Trình tạo client của nó cũng đã bị xóa. Điều tương tự áp dụng cho `MigrateToOpenBook` (5), `WithdrawSrm` (8), `SimulateInfo` (12), `AdminCancelOrders` (13), và các điểm vào tạo pool cũ `Initialize` (0) / `PreInitialize` (10) — sử dụng `Initialize2` thay thế.
</Warning>

Về mặt lịch sử, `MonitorStep` quay vòng tương tác OpenBook của pool: nó thanh toán các đơn hàng đã điền (di chuyển tiền từ vault thị trường vào vault pool thông qua CPI OpenBook), hủy các đơn hàng cũ, và đăng các đơn hàng mới để đóng khoảng cách giữa `target_orders` và `amm_open_orders`. Với phụ thuộc OpenBook bị loại bỏ, không có gì để quay vòng và lệnh đã biến mất. Bất kỳ người giữ hoặc tích hợp nào vẫn gọi nó phải loại bỏ lệnh gọi.

## `WithdrawPnl` / `TakePnl`

Quét admin của phí giao thức đã tích lũy.

**Tham số**

* `WithdrawPnl` không có tham số; nó đọc `need_take_pnl_*` và di chuyển những số tiền chính xác đó.

<Warning>
  **Thay đổi phá vỡ (chỉ admin).** Danh sách tài khoản giảm từ 17 (+1 tùy chọn) xuống **10** — `amm_open_orders` và tất cả sáu tài khoản thị trường đã bị loại bỏ — **không có phân tích tương thích**. Bố cục cũ không khớp (cũ #5 là `amm_open_orders`, hiện là `pool_coin_token_account`) và thất bại với các lỗi như `InvalidCoinVault`. Công cụ admin phải được cập nhật.
</Warning>

**Tài khoản** (bố cục 10 tài khoản mới)

| #  | Tên                       | 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 |   | Người nhận.     |
| 8  | `pnl_pc_token_account`    | W |   |                 |
| 9  | `pnl_owner`               |   | S | Multisig admin. |
| 10 | `amm_target_orders`       | W |   |                 |

**Hiệu ứng**

* Chuyển `need_take_pnl_coin` từ `pool_coin_token_account` đến `pnl_coin_token_account`.
* Tương tự cho pc.
* Đặt `need_take_pnl_coin` và `need_take_pnl_pc` thành 0.
* **Thay đổi logic**: nếu số dư vault không đủ để bao gồm PnL đã tích lũy, lệnh trả về `TakePnlError` trực tiếp (nó không còn thao tác với trạng thái sổ đặt hàng).

Không thay đổi dự trữ vì PnL đã tích lũy đã bị loại trừ khỏi bất biến.

## `SetParams`

Thay đổi tham số admin, được gọi bởi multisig Raydium. Các tham số là tag `param: u8` + tải trọng.

<Warning>
  **Thay đổi phá vỡ (chỉ admin).** Danh sách tài khoản được giảm xuống chỉ còn `[amm (W), admin (S)]` (quyền hạn, open-orders, target-orders, vault, và tất cả các tài khoản thị trường đã bị loại bỏ). Enum `param` được **đánh số lại và cắt ngắn**: `Status` = 0, `State` = 1, `Fees` = **2** (trước đó là 9), `SetOpenTime` = **3** (trước đó là 11). Tất cả các tham số lưới sổ đặt hàng và `AmmOwner`, `LastOrderDistance`, `UpdateOpenOrder` đã bị loại bỏ, và struct `SetParamsInstruction` đã loại bỏ `new_pubkey` và `last_order_distance`. Công cụ admin phải được cập nhật.
</Warning>

## Ma trận thay đổi trạng thái

Cột OpenBook đã biến mất — không có lệnh nào chạm vào sổ đặt hàng nữa.

| Lệnh                            | Cung cấp `lp_mint`                      | Vault                                    | Bộ đếm PnL         |
| ------------------------------- | --------------------------------------- | ---------------------------------------- | ------------------ |
| `Initialize2`                   | cung cấp ban đầu được đúc cho người tạo | `+ init_coin_amount`, `+ init_pc_amount` | 0                  |
| `Deposit`                       | +                                       | + cả hai                                 | —                  |
| `Withdraw`                      | −                                       | − cả hai                                 | —                  |
| `SwapBaseIn` / `SwapBaseInV2`   | —                                       | + vào, − ra                              | + phần chia sẻ pnl |
| `SwapBaseOut` / `SwapBaseOutV2` | —                                       | + vào, − ra                              | + phần chia sẻ pnl |
| `WithdrawPnl`                   | —                                       | − (pnl quét)                             | 0                  |
| `SetParams`                     | —                                       | —                                        | —                  |

## Tiếp theo

* [`products/amm-v4/code-demos`](/vi/products/amm-v4/code-demos) — Ví dụ TypeScript cho các luồng swap và LP.
* [`products/amm-v4/fees`](/vi/products/amm-v4/fees) — Chi tiết `WithdrawPnl` và phân chia phí.
* [`reference/error-codes`](/vi/reference/error-codes) — Bảng tham chiếu phía trước (các lỗi AMM v4 được liệt kê trên trang đó).

Nguồn:

* [Chương trình Raydium AMM — `raydium-io/raydium-amm`](https://github.com/raydium-io/raydium-amm)
* Mô-đun `Liquidity` của Raydium SDK v2
* Chương trình OpenBook — xác thực tài khoản ở phía thị trường
