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

> Tài liệu tham chiếu đầy đủ về các lệnh CLMM: vòng đời pool, quản lý vị thế, swap và luồng phần thưởng.

<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/clmm/instructions)
</Info>

<Info>
  Trang này đi kèm với [`products/clmm/accounts`](/vi/products/clmm/accounts) (mô tả các tài khoản) và [`products/clmm/math`](/vi/products/clmm/math) (mô tả các phép toán). Đây là tài liệu tham chiếu chính xác về các đối số và thứ tự tài khoản; bố cục byte cụ thể lấy từ IDL.
</Info>

## Danh sách lệnh

| Nhóm          | Lệnh                                                             | Ghi chú                                                                                                                                                                                                                                           |
| ------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin         | `CreateAmmConfig`                                                | Tạo một bậc phí mới.                                                                                                                                                                                                                              |
| Admin         | `UpdateAmmConfig`                                                | Thay đổi tỷ lệ phí trên một bậc hiện có.                                                                                                                                                                                                          |
| Admin         | `UpdatePoolStatus`                                               | Tạm dừng/tiếp tục hoạt động của pool.                                                                                                                                                                                                             |
| Admin         | `CreateSupportMintAssociated`                                    | Đưa cấu hình extension của mint Token-2022 vào danh sách cho phép sử dụng trong các pool CLMM.                                                                                                                                                    |
| Admin         | `CreateOperationAccount`                                         | Khởi tạo tài khoản vận hành cấp chương trình (một lần duy nhất).                                                                                                                                                                                  |
| Admin         | `UpdateOperationAccount`                                         | Chỉnh sửa danh sách trắng của tài khoản vận hành.                                                                                                                                                                                                 |
| Admin         | `CreateDynamicFeeConfig`                                         | Tạo một bộ tham số phí động có thể tái sử dụng theo chỉ số u16.                                                                                                                                                                                   |
| Admin         | `UpdateDynamicFeeConfig`                                         | Chỉnh sửa một `DynamicFeeConfig` hiện có. Các pool đã snapshot cấu hình này không bị ảnh hưởng.                                                                                                                                                   |
| Pool          | `CreatePool`                                                     | Khởi tạo một pool CLMM gắn với một `AmmConfig`. Đường dẫn phí chuẩn FromInput. Tồn tại song song với `CreateCustomizablePool`.                                                                                                                    |
| Pool          | `CreateCustomizablePool`                                         | Khuyến nghị dùng cho pool mới. Tương tự `CreatePool` nhưng có thêm `collect_fee_on` và cờ `enable_dynamic_fee` tùy chọn.                                                                                                                          |
| Vị thế        | `OpenPosition` / `OpenPositionV2` / `OpenPositionWithToken22Nft` | Mint một NFT vị thế. `OpenPositionV2` thay thế V1 (bố cục tài khoản mới hơn với slot bitmap-extension); `OpenPositionWithToken22Nft` phát hành NFT vị thế theo chuẩn Token-2022 thay vì SPL Token. Code mới nên dùng V2 hoặc biến thể Token-2022. |
| Vị thế        | `IncreaseLiquidity` / `IncreaseLiquidityV2`                      | Thêm thanh khoản vào vị thế hiện có.                                                                                                                                                                                                              |
| Vị thế        | `DecreaseLiquidity` / `DecreaseLiquidityV2`                      | Rút thanh khoản; thu phí còn nợ.                                                                                                                                                                                                                  |
| Vị thế        | `ClosePosition`                                                  | Đốt NFT và đóng `PersonalPositionState`.                                                                                                                                                                                                          |
| Vị thế        | `CloseProtocolPosition`                                          | Chỉ dành cho admin — thu hồi các PDA `ProtocolPositionState` cũ. Chương trình hiện tại không còn tạo hoặc đọc `ProtocolPositionState` — lệnh này chỉ tồn tại để thu hồi rent từ các tài khoản được tạo bởi phiên bản chương trình cũ hơn.         |
| Swap          | `Swap` / `SwapV2`                                                | Swap thanh khoản không đổi. Cả hai biến thể đều áp dụng phí động, định tuyến phí một chiều và khớp lệnh giới hạn; điểm khác biệt duy nhất là `SwapV2` chấp nhận mint Token-2022 (biến thể V1 yêu cầu cả hai vault đều là SPL Token cổ điển).      |
| Swap          | `SwapRouterBaseIn`                                               | Nhiều hop, được router sử dụng.                                                                                                                                                                                                                   |
| Lệnh giới hạn | `OpenLimitOrder`                                                 | Đặt lệnh bán tại một tick. Token chưa khớp nằm trên tick; engine khớp lệnh sẽ điền chúng khi giá vượt qua.                                                                                                                                        |
| Lệnh giới hạn | `IncreaseLimitOrder`                                             | Thêm vào một lệnh đang mở.                                                                                                                                                                                                                        |
| Lệnh giới hạn | `DecreaseLimitOrder`                                             | Giảm hoặc hủy một lệnh đang mở; trả lại phần chưa khớp cùng bất kỳ đầu ra nào đã được thanh toán.                                                                                                                                                 |
| Lệnh giới hạn | `SettleLimitOrder`                                               | Đẩy token đầu ra đã khớp về cho chủ sở hữu lệnh. Có thể gọi bởi chủ sở hữu hoặc keeper vận hành.                                                                                                                                                  |
| Lệnh giới hạn | `CloseLimitOrder`                                                | Đóng tài khoản lệnh đã được thực hiện hoàn toàn. Rent luôn trả về `owner` của lệnh. Có thể gọi bởi owner hoặc keeper.                                                                                                                             |
| Phí           | `CollectProtocolFee`                                             | Admin thu phí giao thức.                                                                                                                                                                                                                          |
| Phí           | `CollectFundFee`                                                 | Admin thu phí quỹ.                                                                                                                                                                                                                                |
| Phần thưởng   | `InitializeReward`                                               | Gắn một luồng phần thưởng mới vào pool.                                                                                                                                                                                                           |
| Phần thưởng   | `SetRewardParams`                                                | Thay đổi tỷ lệ phát thải/thời gian kết thúc của phần thưởng hiện có.                                                                                                                                                                              |
| Phần thưởng   | `UpdateRewardInfos`                                              | Thanh toán tăng trưởng phần thưởng đến thời điểm hiện tại (được gọi bởi bất kỳ swap/thay đổi vị thế nào).                                                                                                                                         |
| Phần thưởng   | `TransferRewardOwner`                                            | Chuyển quyền có thể thiết lập hoặc nạp thêm một luồng phần thưởng.                                                                                                                                                                                |
| Phần thưởng   | `CollectRemainingRewards`                                        | Sau `end_time` của luồng phần thưởng, thu hồi các token chưa được phân bổ về cho người cấp vốn.                                                                                                                                                   |
| Tiện ích      | `InitTickArray`                                                  | Khởi tạo một tài khoản tick-array (thường được đóng gói cùng `OpenPosition`).                                                                                                                                                                     |

Hầu hết các lệnh chỉ dành cho admin (`CreateAmmConfig`, `UpdateAmmConfig`, `UpdatePoolStatus`, `CreateSupportMintAssociated`, `CreateOperationAccount`, `UpdateOperationAccount`, `CloseProtocolPosition`) được kiểm soát bởi khóa công khai `admin` được mã hóa cứng trong chương trình. Các lệnh admin của luồng phần thưởng (`TransferRewardOwner`, `CollectRemainingRewards`) được kiểm soát bởi người cấp vốn phần thưởng, không phải admin chương trình.

Hậu tố V2 có nghĩa là "hỗ trợ Token-2022 trên vault/NFT, yêu cầu slot bitmap-extension". SDK mặc định chọn V2 cho các pool mới.

## `CreatePool`

**Đối số**

```
sqrt_price_x64: u128           // giá khởi tạo
open_time:      u64            // các swap bị từ chối trước thời điểm này
```

**Tài khoản (rút gọn)**

| #  | Tên                           | W | S | Ghi chú                                              |
| -- | ----------------------------- | - | - | ---------------------------------------------------- |
| 1  | `pool_creator`                | W | S |                                                      |
| 2  | `amm_config`                  |   |   | Bậc phí đã chọn.                                     |
| 3  | `pool_state`                  | W |   | `init` tại đây.                                      |
| 4  | `token_mint_0`                |   |   | Đã sắp xếp.                                          |
| 5  | `token_mint_1`                |   |   |                                                      |
| 6  | `token_vault_0`               | W |   | `init` tại đây, thuộc sở hữu của PDA pool authority. |
| 7  | `token_vault_1`               | W |   |                                                      |
| 8  | `observation_state`           | W |   | `init` tại đây.                                      |
| 9  | `tick_array_bitmap_extension` | W |   | `init` tại đây (V2).                                 |
| 10 | `token_program`               |   |   |                                                      |
| 11 | `token_program_2022`          |   |   |                                                      |
| 12 | `system_program`, `rent`      |   |   |                                                      |

**Điều kiện tiên quyết**

* `token_mint_0 < token_mint_1` theo thứ tự byte.
* `amm_config.disable_create_pool == false`.
* Các mint không bị từ chối bởi danh sách cho phép extension Token-2022.

**Trạng thái sau khi thực thi**

* `pool_state.sqrt_price_x64 = sqrt_price_x64`, `tick_current = floor(log_{1.0001}(price))`.
* `pool_state.liquidity = 0` (chưa có vị thế nào).
* `pool_state.fee_on = FromInput` (mặc định legacy).
* `pool_state.dynamic_fee_info` bằng không (phí động bị vô hiệu hóa).

## `CreateCustomizablePool`

Khuyến nghị cho các pool mới. Có tác dụng tương tự `CreatePool` cộng thêm chế độ thu phí theo từng pool và tùy chọn bật phí động.

**Đối số**

```rust theme={null}
pub struct CreateCustomizableParams {
    pub sqrt_price_x64:    u128,
    pub collect_fee_on:    CollectFeeOn,   // FromInput | Token0Only | Token1Only
    pub enable_dynamic_fee: bool,
}
```

**Tài khoản (rút gọn)** — tương tự `CreatePool`, cộng thêm khi `enable_dynamic_fee = true`:

| # | Tên                  | W | S | Ghi chú                                            |
| - | -------------------- | - | - | -------------------------------------------------- |
| N | `dynamic_fee_config` |   |   | Config dùng chung để snapshot. Phải tồn tại trước. |

**Điều kiện tiên quyết** — tương tự `CreatePool`. Nếu `enable_dynamic_fee = false`, `dynamic_fee_config` bị bỏ qua.

**Trạng thái sau khi thực thi**

* `pool_state.fee_on` được đặt theo biến thể `CollectFeeOn` đã chọn.
* Nếu phí động được bật: `pool_state.dynamic_fee_info` được khởi tạo từ `DynamicFeeConfig` được cung cấp (năm tham số hiệu chỉnh được sao chép; các trường trạng thái được đặt về không).
* Ngược lại: `pool_state.dynamic_fee_info` bằng không (= phí động không hoạt động vĩnh viễn đối với pool này).

`fee_on` và bit bật phí động chỉ được đặt **khi tạo pool**. Không có cơ chế nâng cấp tại chỗ — các pool được tạo qua `CreatePool` cũ không thể có phí động hay phí một chiều sau này. Các triển khai mới nên mặc định dùng lệnh này.

## `OpenPositionV2` / `OpenPositionWithToken22Nft`

Tạo một vị thế mới trong một pool đã tồn tại.

**Đối số**

```
tick_lower_index: i32
tick_upper_index: i32
tick_array_lower_start_index: i32
tick_array_upper_start_index: i32
liquidity:  u128              // L mong muốn (hoặc 0 để dùng các số lượng bên dưới)
amount_0_max: u64
amount_1_max: u64
with_metadata: bool           // ghi metadata NFT (Metaplex)
base_flag: Option<bool>       // true = khớp với amount0; false = khớp với amount1
```

**Tài khoản (rút gọn)**

| #  | Tên                                       | W | S           |                                           |
| -- | ----------------------------------------- | - | ----------- | ----------------------------------------- |
| 1  | `payer`                                   | W | S           |                                           |
| 2  | `position_nft_owner`                      |   |             |                                           |
| 3  | `position_nft_mint`                       | W | S (keypair) |                                           |
| 4  | `position_nft_account`                    | W |             | ATA của owner dành cho NFT.               |
| 5  | `metadata_account`                        | W |             | Metaplex (tùy chọn, nếu `with_metadata`). |
| 6  | `pool_state`                              | W |             |                                           |
| 7  | `protocol_position`                       |   |             |                                           |
| 8  | `tick_array_lower`                        | W |             | Được tạo nếu chưa khởi tạo.               |
| 9  | `tick_array_upper`                        | W |             | Tương tự.                                 |
| 10 | `personal_position`                       | W |             | Được tạo tại đây.                         |
| 11 | `token_account_0`, `token_account_1`      | W |             | ATA nguồn của người dùng.                 |
| 12 | `token_vault_0`, `token_vault_1`          | W |             |                                           |
| 13 | `rent`, `system_program`, `token_program` |   |             |                                           |
| 14 | `associated_token_program`                |   |             |                                           |
| 15 | `metadata_program`                        |   |             | Tùy chọn.                                 |
| 16 | `token_program_2022`                      |   |             | V2.                                       |
| 17 | `vault_0_mint`, `vault_1_mint`            |   |             | V2.                                       |
| 18 | `tick_array_bitmap_extension`             | W |             | V2 (nếu bị tác động).                     |

**Toán học** — xem [`products/clmm/math`](/vi/products/clmm/math). Dựa vào `base_flag`, chương trình giải ra `L` thực tế và số lượng token thực tế được sử dụng từ `liquidity` hoặc `(amount_0_max, amount_1_max)`.

**Điều kiện tiên quyết**

* `tick_lower < tick_upper`, cả hai đều là bội số của `pool.tick_spacing`, trong phạm vi `[MIN_TICK, MAX_TICK]`.
* Các tick array cần thiết được truyền vào và đã khởi tạo (hoặc được tạo tại đây qua CPI `InitTickArray` trong transaction).
* Người dùng có ít nhất `amount_0_max` và `amount_1_max` trong các ATA nguồn.

**Trạng thái sau khi thực thi**

* `personal_position` tồn tại, `liquidity` được đặt, `fee_growth_inside_last` được snapshot.
* Các mục tick-array tại `tick_lower` và `tick_upper` được cập nhật (`liquidity_gross += L`, `liquidity_net ± L`, duy trì snapshot tăng trưởng phí).
* `pool_state.liquidity += L` nếu vị thế trong phạm vi (`tick_lower ≤ tick_current < tick_upper`).

**Lỗi thường gặp** — `InvalidTickIndex`, `NotApproved`, `ZeroAmountSpecified`, `TransactionTooLarge` (nếu có quá nhiều tick array).

## `IncreaseLiquidityV2`

Thêm thanh khoản vào một vị thế đã mở.

**Đối số**

```
liquidity: u128
amount_0_max: u64
amount_1_max: u64
base_flag: Option<bool>
```

**Tài khoản** — tương tự `OpenPosition` nhưng không có NFT mint (vị thế đã tồn tại; NFT được truyền vào như ATA của owner đang giữ 1 token).

**Hiệu lực**

* Chuyển `amount_0_actual` / `amount_1_actual` từ người dùng → vault.
* Tăng `personal_position.liquidity` và `pool_state.liquidity` (nếu trong phạm vi), cùng với `liquidity_gross` / `liquidity_net` của tick endpoint tương ứng.
* **Thu phí và phần thưởng còn nợ kể từ lần chạm cuối** và ghi có vào `tokens_fees_owed_{0,1}` / `reward_amount_owed`. Các khoản này chỉ được thanh toán khi `DecreaseLiquidity` hoặc `CollectReward`, không phải khi tăng.

## `DecreaseLiquidityV2`

Rút thanh khoản khỏi một vị thế.

**Đối số**

```
liquidity: u128
amount_0_min: u64
amount_1_min: u64
```

**Tài khoản** — cùng cấu trúc với `IncreaseLiquidity`.

**Hiệu lực**

* Tính `(amount_0, amount_1)` cho `L` được rút dựa trên `sqrt_price_x64` hiện tại.
* Thanh toán phí/phần thưởng tích lũy kể từ lần chạm cuối, tương tự `IncreaseLiquidity`.
* Chuyển `amount_0 + fees_owed_0` và `amount_1 + fees_owed_1` từ vault về cho người dùng.
* Giảm các bộ đếm thanh khoản; nếu `personal_position.liquidity == 0` mới, vị thế đủ điều kiện để `ClosePosition`.

**Slippage** — `amount_0_min` và `amount_1_min` là mức tối thiểu người dùng chấp nhận sau khi trừ phí chuyển Token-2022 ở phía đầu ra.

## `ClosePosition`

Đốt NFT vị thế và đóng `PersonalPositionState`.

**Điều kiện tiên quyết**

* `personal_position.liquidity == 0`.
* `tokens_fees_owed_{0,1} == 0`.
* Tất cả bộ đếm phần thưởng `reward_amount_owed == 0`.

(Tức là phải thu toàn bộ và giảm về không trước.)

**Hiệu lực**

* Đốt NFT.
* Đóng tài khoản NFT mint và tài khoản `personal_position`, hoàn lại rent cho `payer`.

## `SwapV2`

Duyệt đường cong thanh khoản; chính xác đầu vào *hoặc* chính xác đầu ra tùy theo `is_base_input`.

**Đối số**

```
amount: u64                  // đầu vào nếu is_base_input=true, đầu ra nếu ngược lại
other_amount_threshold: u64  // tối thiểu nhận ra hoặc tối đa bỏ vào
sqrt_price_limit_x64: u128   // giới hạn cứng; 0 ⇒ không giới hạn
is_base_input: bool
```

**Tài khoản (rút gọn)**

| #   | Tên                                      | W | S | Ghi chú                                                     |
| --- | ---------------------------------------- | - | - | ----------------------------------------------------------- |
| 1   | `payer`                                  |   | S |                                                             |
| 2   | `amm_config`                             |   |   |                                                             |
| 3   | `pool_state`                             | W |   |                                                             |
| 4   | `input_token_account`                    | W |   |                                                             |
| 5   | `output_token_account`                   | W |   |                                                             |
| 6   | `input_vault`                            | W |   |                                                             |
| 7   | `output_vault`                           | W |   |                                                             |
| 8   | `observation_state`                      | W |   |                                                             |
| 9   | `token_program`                          |   |   |                                                             |
| 10  | `token_program_2022`                     |   |   | V2.                                                         |
| 11  | `memo_program`                           |   |   | V2 (bắt buộc cho một số đường dẫn Token-2022).              |
| 12  | `input_vault_mint`, `output_vault_mint`  |   |   | V2.                                                         |
| 13  | `tick_array_bitmap_extension` (tùy chọn) | W |   | Nếu swap đi vào phần extension.                             |
| 14+ | `tick_array` (còn lại)                   | W |   | Đủ số array để bao phủ phạm vi dự kiến của quá trình duyệt. |

Người gọi truyền một danh sách tick array được xếp hạng bao phủ hành trình swap dự kiến; chương trình sử dụng bao nhiêu tùy theo nhu cầu. SDK tính danh sách này qua `PoolUtils.computeAmountOutFormat` hoặc endpoint báo giá của API.

**Điều kiện tiên quyết**

* `pool_state.status` cho phép swap.
* `now >= open_time`.
* `sqrt_price_limit_x64` nằm đúng phía so với `sqrt_price_x64` theo chiều giao dịch.

**Lỗi thường gặp** — `ExceededSlippage`, `SqrtPriceLimitOverflow`, `TickArrayNotFound`, `LiquidityInsufficient`.

**Những gì `SwapV2` thực hiện bên trong mà người gọi nên biết** (phiên bản sau năm 2025):

1. **Phụ thu phí động** — nếu `pool.dynamic_fee_info` khác không, chương trình cập nhật bộ tích lũy biến động bằng khoảng cách tick đã duyệt kể từ swap cuối (theo các quy tắc lọc/suy giảm từ [`products/clmm/fees`](/vi/products/clmm/fees)) và cộng thêm `dynamic_fee_component` vào `AmmConfig.trade_fee_rate`. Tổng phí được giới hạn ở mức 10% (`MAX_FEE_RATE_NUMERATOR / 1_000_000`).
2. **Khớp lệnh giới hạn** — khi hành trình giá vượt qua một tick có lệnh giới hạn đang mở, chương trình trước tiên điền thanh khoản lệnh giới hạn khả dụng tại tick đó (FIFO theo `order_phase`), sau đó tiếp tục theo đường cong thanh khoản LP. Các lượng đã khớp cập nhật `tick.unfilled_ratio_x64` và `tick.part_filled_orders_remaining` để thanh toán sau; bản thân các lệnh vẫn chưa được chi tiêu cho đến khi chủ sở hữu gọi `SettleLimitOrder`.
3. **Định tuyến phí một chiều** — khi `pool.fee_on = Token0Only` hoặc `Token1Only`, bước swap vẫn tính toán cùng một giao dịch đầu vào-đầu ra; phí sau đó được định tuyến về phía đã cấu hình. Đối với các chiều mà phía phí cấu hình là đầu ra, phí được trừ từ đầu ra swap (người dùng nhận `out − fee`); đối với các chiều mà nó là đầu vào, hành vi khớp với `FromInput`. Xem `is_fee_on_input(zero_for_one)` và `is_fee_on_token0(zero_for_one)` trên `PoolState`.

`Swap` (V1) triển khai cùng phí động, định tuyến phí một chiều và khớp lệnh giới hạn như `SwapV2`; tính năng duy nhất nó thiếu là hỗ trợ Token-2022 — cả hai vault đều phải là SPL Token cổ điển. Các pool có bất kỳ mint Token-2022 nào phải được swap qua `SwapV2`. Aggregator và SDK đã ưu tiên V2 cho mọi leg CLMM nên người gọi không cần phân nhánh theo loại mint.

## `OpenLimitOrder`

Đặt lệnh bán tại một tick cụ thể. Lệnh nằm trong một nhóm FIFO theo từng tick và được điền khi giá vượt qua.

**Đối số**

```
nonce_index:    u8       // chỉ số tài khoản nonce do người dùng chọn (0..255 mỗi ví)
zero_for_one:   bool     // true: bán token0 lấy token1; false: bán token1 lấy token0
tick_index:     i32      // phải là bội số của pool.tick_spacing
amount:         u64      // lượng token đầu vào
```

**Tài khoản (rút gọn)**

| #  | Tên                      | W | S | Ghi chú                                                                                  |
| -- | ------------------------ | - | - | ---------------------------------------------------------------------------------------- |
| 1  | `payer`                  | W | S | Chủ sở hữu lệnh; trả rent.                                                               |
| 2  | `pool_state`             | W |   |                                                                                          |
| 3  | `tick_array`             | W |   | Tick array chứa `tick_index`.                                                            |
| 4  | `limit_order_nonce`      | W |   | PDA. `init_if_needed` — được tạo khi người dùng đặt lệnh đầu tiên với `nonce_index` này. |
| 5  | `limit_order`            | W |   | PDA. `init` tại đây.                                                                     |
| 6  | `input_token_account`    | W |   | ATA đầu vào của người dùng.                                                              |
| 7  | `input_vault`            | W |   | Vault đầu vào của pool.                                                                  |
| 8  | `input_vault_mint`       |   |   | Xử lý phí Token-2022.                                                                    |
| 9  | `input_token_program`    |   |   | SPL hoặc Token-2022.                                                                     |
| 10 | `system_program`, `rent` |   |   |                                                                                          |

**Điều kiện tiên quyết**

* `tick_index % pool.tick_spacing == 0` và trong phạm vi `[MIN_TICK, MAX_TICK]`.
* `tick_index` nằm **đúng phía so với `pool.tick_current`** cho chiều đã chọn (bán token0 → tick phải cao hơn hiện tại, và ngược lại). Bán tại một tick đã được vượt qua sẽ bị khớp ngay lập tức và bị từ chối.
* `pool_state.status` cho phép thao tác lệnh giới hạn (bit 5).

**Trạng thái sau khi thực thi**

* `limit_order` tồn tại, snapshot `tick.order_phase` và `tick.unfilled_ratio_x64` tại thời điểm mở.
* `tick.orders_amount += amount` (trong cohort hiện tại).
* `limit_order_nonce.order_nonce += 1`.
* Phát ra sự kiện `OpenLimitOrderEvent`.

**Lỗi thường gặp** — `InvalidLimitOrderAmount` (bằng không hoặc dưới mức tối thiểu của pool), `InvalidTickIndex` (ngoài `[MIN_TICK, MAX_TICK]`, hoặc sai phía so với `tick_current` cho chiều đã chọn), `TickAndSpacingNotMatch` (`tick_index % pool.tick_spacing != 0`), `OrderPhaseSaturated`.

## `IncreaseLimitOrder`

Thêm vào một lệnh đang mở. Chỉ có thể gọi bởi `owner` của lệnh.

**Đối số**

```
amount: u64    // lượng token đầu vào bổ sung
```

**Tài khoản** — tương tự `OpenLimitOrder` nhưng không có tài khoản nonce; PDA `limit_order` được truyền trực tiếp.

**Điều kiện tiên quyết**

* `limit_order.owner == signer`.
* Lệnh vẫn còn trong cùng cohort (`tick.order_phase == limit_order.order_phase`). Nếu cohort đã bắt đầu điền, lệnh đã được thanh toán một phần — người gọi nên gọi `DecreaseLimitOrder` hoặc `SettleLimitOrder` trước để cuộn tiến.

**Hiệu lực**

* Chuyển `amount` từ ATA của owner đến `input_vault`.
* `limit_order.total_amount += amount`; `tick.orders_amount += amount`.

## `DecreaseLimitOrder`

Giảm hoặc hủy hoàn toàn một lệnh đang mở. Trả phần chưa khớp về cho owner, cộng thêm bất kỳ đầu ra nào đã được thanh toán bởi các lần điền một phần trước đó.

**Đối số**

```
amount:     u64    // lượng token đầu vào cần rút (tối đa = phần chưa khớp còn lại)
amount_min: u64    // mức sàn slippage cho việc rút phía đầu vào
```

**Tài khoản** — cả hai phía token đầu vào và đầu ra:

| #  | Tên                                     | W | S |
| -- | --------------------------------------- | - | - |
| 1  | `owner`                                 |   | S |
| 2  | `pool_state`                            | W |   |
| 3  | `tick_array`                            | W |   |
| 4  | `limit_order`                           | W |   |
| 5  | `input_token_account`                   | W |   |
| 6  | `output_token_account`                  | W |   |
| 7  | `input_vault`                           | W |   |
| 8  | `output_vault`                          | W |   |
| 9  | `input_vault_mint`, `output_vault_mint` |   |   |
| 10 | `token_program`, `token_program_2022`   |   |   |

**Hiệu lực**

* Tính lại lượng đã khớp của lệnh từ `unfilled_ratio_x64` của cohort kể từ lúc mở.
* Gửi đầu ra đã khớp đến `output_token_account`.
* Gửi `amount` đầu vào chưa khớp về `input_token_account`.
* Cập nhật `limit_order` tương ứng. Nếu phần chưa khớp còn lại mới bằng không, chương trình đóng tài khoản và hoàn lại rent cho `owner`.

## `SettleLimitOrder`

Đẩy token đầu ra đã khớp về cho owner mà không thay đổi phần chưa khớp còn lại của lệnh. Hữu ích khi các keeper `auto_withdraw` muốn thanh toán dần các lần điền một phần kéo dài.

**Người gọi** — `owner` của lệnh hoặc `limit_order_admin` của chương trình (một ví nóng vận hành ngoài chuỗi chạy vòng lặp keeper tự động). Keeper không có quyền hạn khác — nó không thể di chuyển quỹ người dùng ngoài việc đẩy đầu ra đã khớp về ATA `owner` của lệnh.

**Tài khoản**

| # | Tên                    | W | S |                                  |
| - | ---------------------- | - | - | -------------------------------- |
| 1 | `signer`               |   | S | owner *hoặc* `limit_order_admin` |
| 2 | `pool_state`           |   |   |                                  |
| 3 | `tick_array`           |   |   |                                  |
| 4 | `limit_order`          | W |   |                                  |
| 5 | `output_token_account` | W |   | ATA đầu ra của owner.            |
| 6 | `output_vault`         | W |   | Vault đầu ra của pool.           |
| 7 | `output_vault_mint`    |   |   |                                  |
| 8 | `output_token_program` |   |   |                                  |

**Hiệu lực**

* Tính đầu ra tích lũy còn nợ bằng cách dùng `(limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64)`.
* Chuyển phần chênh lệch đến `output_token_account`.
* Cập nhật `limit_order.settled_output`.
* **Không** đóng lệnh; lệnh vẫn còn mở đối với bất kỳ đầu vào nào còn lại.

## `CloseLimitOrder`

Đóng tài khoản lệnh đã được thực hiện hoàn toàn. Rent luôn được trả về `limit_order.owner` bất kể ai ký.

**Người gọi** — `owner` hoặc `limit_order_admin`.

**Điều kiện tiên quyết**

* Lệnh có phần chưa khớp còn lại bằng không (hoặc `amount == total_amount` đã được khớp và thanh toán, hoặc owner đã giảm lệnh về không trước đó và quên đóng).

**Hiệu lực**

* Đóng `limit_order`; rent được gửi đến `limit_order.owner`.

## `CreateDynamicFeeConfig` (admin)

Tạo một bộ tham số có thể tái sử dụng theo chỉ số u16.

**Đối số**

```
index:                       u16
filter_period:               u16   // giây; ví dụ 30
decay_period:                u16   // giây; ví dụ 600. Phải > filter_period
reduction_factor:            u16   // 1..10_000; ví dụ 5_000 = giữ lại 50% mỗi cửa sổ suy giảm
dynamic_fee_control:         u32   // 1..100_000; hệ số khuếch đại trên đường cong biến động-thành-phí
max_volatility_accumulator:  u32   // giới hạn trên
```

**Tài khoản**

| # | Tên                  | W | S | Ghi chú                                |
| - | -------------------- | - | - | -------------------------------------- |
| 1 | `owner`              | W | S | Khóa công khai admin được mã hóa cứng. |
| 2 | `dynamic_fee_config` | W |   | PDA, `init` tại đây.                   |
| 3 | `system_program`     |   |   |                                        |

**Lỗi thường gặp** — `InvalidDynamicFeeConfigParams` nếu `decay_period <= filter_period` hoặc bất kỳ trường nào có giá trị 0 nằm ngoài giới hạn.

## `UpdateDynamicFeeConfig` (admin)

Chỉnh sửa một `DynamicFeeConfig` hiện có. Các pool đã snapshot cấu hình tại thời điểm tạo **không** bị cập nhật hồi tố; chỉ các pool mới tạo tham chiếu đến config này mới nhận các giá trị mới.

**Đối số** — năm trường hiệu chỉnh giống như `CreateDynamicFeeConfig` (`filter_period`, `decay_period`, `reduction_factor`, `dynamic_fee_control`, `max_volatility_accumulator`); `index` được cố định khi tạo và không cần truyền lại ở đây.

## `CollectProtocolFee` / `CollectFundFee`

Có cùng cấu trúc với `CollectProtocolFee` / `CollectFundFee` của CPMM. Người ký phải khớp với `AmmConfig.owner` / `AmmConfig.fund_owner`. Thu phí giao thức/quỹ đã tích lũy từ vault của pool về cho người nhận, đặt các trường `PoolState.protocol_fees_*` / `fund_fees_*` tương ứng về không.

## `InitializeReward`

Thêm một luồng phần thưởng mới vào pool. Tối đa 3 luồng có thể hoạt động cùng lúc.

**Đối số**

```
open_time:     u64
end_time:      u64
emissions_per_second_x64: u128   // Q64.64
```

**Tài khoản**

| # | Tên                      | W | S |                                                              |
| - | ------------------------ | - | - | ------------------------------------------------------------ |
| 1 | `reward_funder`          | W | S |                                                              |
| 2 | `funder_token_account`   | W |   |                                                              |
| 3 | `amm_config`             |   |   |                                                              |
| 4 | `pool_state`             | W |   |                                                              |
| 5 | `operation_state`        |   |   | PDA trạng thái vận hành CLMM kiểm soát việc tạo phần thưởng. |
| 6 | `reward_token_mint`      |   |   |                                                              |
| 7 | `reward_token_vault`     | W |   | `init` tại đây.                                              |
| 8 | `reward_token_program`   |   |   |                                                              |
| 9 | `system_program`, `rent` |   |   |                                                              |

**Điều kiện tiên quyết**

* Ít hơn 3 luồng hiện đang hoạt động trên pool.
* Người cấp vốn nạp `total_emission = emissions_per_second × (end_time − open_time)` token phần thưởng vào vault như một phần của lệnh này.
* Mint phần thưởng được đưa vào danh sách trắng theo `operation_state`.

## `SetRewardParams`

Gia hạn, nạp thêm hoặc thay đổi tỷ lệ phát thải của một luồng phần thưởng hiện có. Thường được gọi bởi người tạo pool hoặc multisig Raydium. Các ràng buộc nằm trên chuỗi: thông thường bạn có thể gia hạn `end_time` hoặc tăng phát thải, không thể giảm hồi tố. Kiểm tra danh sách owner của `operation_state`.

## `UpdateRewardInfos`

Thuần túy kế toán — thanh toán `reward_growth_global_x64` đến thời điểm hiện tại bằng cách nhân `emissions_per_second × Δt / liquidity`. Được gọi nội bộ bởi mọi lệnh chạm đến thanh khoản. Được cung cấp như một lệnh độc lập vì các tác nhân bên ngoài (UI, crank) đôi khi muốn kích hoạt nó.

## `CollectReward`

Chủ sở hữu vị thế nhận token phần thưởng còn nợ.

**Tài khoản**

| # | Tên                       | W | S |                                    |
| - | ------------------------- | - | - | ---------------------------------- |
| 1 | `nft_owner`               |   | S |                                    |
| 2 | `nft_account`             |   |   | ATA của owner đang giữ NFT vị thế. |
| 3 | `personal_position`       | W |   |                                    |
| 4 | `pool_state`              | W |   |                                    |
| 5 | `protocol_position`       |   |   |                                    |
| 6 | `reward_token_vault`      | W |   |                                    |
| 7 | `recipient_token_account` | W |   |                                    |
| 8 | `token_program`           |   |   |                                    |
| 9 | `token_program_2022`      |   |   |                                    |

**Hiệu lực**

* Thanh toán tăng trưởng phần thưởng (cùng mẫu với phí).
* Chuyển lượng còn nợ đến ATA người nhận, đặt `reward_amount_owed[i]` về không.

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

| Lệnh                     | `pool.liquidity`    | `pool.fee_growth_global` | `pool.reward_growth_global` | `personal_position.liquidity` | Tick array                                        |
| ------------------------ | ------------------- | ------------------------ | --------------------------- | ----------------------------- | ------------------------------------------------- |
| `CreatePool`             | 0                   | 0                        | —                           | —                             | —                                                 |
| `OpenPosition`           | + nếu trong phạm vi | —                        | —                           | mới                           | thêm liquidity\_gross/net                         |
| `IncreaseLiquidity`      | + nếu trong phạm vi | thanh toán nợ            | thanh toán nợ               | +                             | điều chỉnh                                        |
| `DecreaseLiquidity`      | − nếu trong phạm vi | thanh toán nợ            | thanh toán nợ               | −                             | điều chỉnh                                        |
| `ClosePosition`          | —                   | —                        | —                           | bị hủy                        | —                                                 |
| `SwapV2`                 | ± khi vượt tick     | +                        | —                           | —                             | vượt & lật outside; khớp các cohort lệnh giới hạn |
| `OpenLimitOrder`         | —                   | —                        | —                           | —                             | `orders_amount += amount` trên tick mục tiêu      |
| `IncreaseLimitOrder`     | —                   | —                        | —                           | —                             | `orders_amount += amount`                         |
| `DecreaseLimitOrder`     | —                   | —                        | —                           | —                             | `orders_amount -=`, có thể đóng cohort            |
| `SettleLimitOrder`       | —                   | —                        | —                           | —                             | — (chỉ đọc trên tick)                             |
| `CloseLimitOrder`        | —                   | —                        | —                           | —                             | —                                                 |
| `CreateCustomizablePool` | 0                   | 0                        | —                           | —                             | —                                                 |
| `UpdateRewardInfos`      | —                   | —                        | +                           | —                             | —                                                 |
| `CollectReward`          | —                   | —                        | thanh toán nợ               | —                             | —                                                 |

## Bước tiếp theo

* [`products/clmm/code-demos`](/vi/products/clmm/code-demos) — các mẫu TypeScript có thể chạy được.
* [`products/clmm/fees`](/vi/products/clmm/fees) — chi tiết về tích lũy phí và phần thưởng.
* [`reference/error-codes`](/vi/reference/error-codes) — bảng lỗi Anchor CLMM đầy đủ.

Nguồn tham khảo:

* [`raydium-io/raydium-clmm` — `programs/amm/src/instructions`](https://github.com/raydium-io/raydium-clmm)
* Raydium SDK v2 — `@raydium-io/raydium-sdk-v2`
