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

# CLMM 指令

> 完整 CLMM 指令參考：池生命週期、倉位管理、交換及獎勵流。

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

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

<Info>
  本頁與 [`products/clmm/accounts`](/zh-Hant/products/clmm/accounts)（帳戶說明）及 [`products/clmm/math`](/zh-Hant/products/clmm/math)（數學原理）配套閱讀，是參數與帳戶順序的權威來源；具體位元組佈局請參閱 IDL。
</Info>

## 指令一覽

| 類別  | 指令                                                               | 說明                                                                                                                                                           |
| --- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 管理員 | `CreateAmmConfig`                                                | 建立新的手續費等級。                                                                                                                                                   |
| 管理員 | `UpdateAmmConfig`                                                | 修改現有等級的費率。                                                                                                                                                   |
| 管理員 | `UpdatePoolStatus`                                               | 暫停／恢復池的操作。                                                                                                                                                   |
| 管理員 | `CreateSupportMintAssociated`                                    | 將 Token-2022 mint 擴充設定加入允許清單，以供 CLMM 池使用。                                                                                                                    |
| 管理員 | `CreateOperationAccount`                                         | 初始化程式層級的操作帳戶（一次性）。                                                                                                                                           |
| 管理員 | `UpdateOperationAccount`                                         | 修改操作帳戶的白名單。                                                                                                                                                  |
| 管理員 | `CreateDynamicFeeConfig`                                         | 以 u16 索引建立可重複使用的動態費用參數集。                                                                                                                                     |
| 管理員 | `UpdateDynamicFeeConfig`                                         | 修改現有的 `DynamicFeeConfig`。已快照該設定的池不受影響。                                                                                                                       |
| 池   | `CreatePool`                                                     | 初始化綁定至 `AmmConfig` 的 CLMM 池。標準 FromInput 費用路徑，與 `CreateCustomizablePool` 並存。                                                                                 |
| 池   | `CreateCustomizablePool`                                         | 建議新池使用。結構與 `CreatePool` 相同，額外支援 `collect_fee_on` 及選擇性的 `enable_dynamic_fee` 旗標。                                                                              |
| 倉位  | `OpenPosition` / `OpenPositionV2` / `OpenPositionWithToken22Nft` | 鑄造倉位 NFT。`OpenPositionV2` 取代 V1（帳戶佈局更新，加入 bitmap-extension slot）；`OpenPositionWithToken22Nft` 以 Token-2022 代替 SPL Token 發行倉位 NFT。新程式碼應使用 V2 或 Token-2022 變體。 |
| 倉位  | `IncreaseLiquidity` / `IncreaseLiquidityV2`                      | 向現有倉位增加流動性。                                                                                                                                                  |
| 倉位  | `DecreaseLiquidity` / `DecreaseLiquidityV2`                      | 移除流動性；同時收取應付手續費。                                                                                                                                             |
| 倉位  | `ClosePosition`                                                  | 銷毀 NFT 並關閉 `PersonalPositionState`。                                                                                                                          |
| 倉位  | `CloseProtocolPosition`                                          | 僅限管理員，用於清理舊版 `ProtocolPositionState` PDA。目前程式不再建立或讀取 `ProtocolPositionState`，此指令僅用於回收舊版程式所建立帳戶的租金。                                                           |
| 交換  | `Swap` / `SwapV2`                                                | 固定流動性交換。兩種變體均支援動態費用、單側費用路由及限價單撮合；差異在於 `SwapV2` 接受 Token-2022 mint（V1 要求兩個保險庫均為傳統 SPL Token）。                                                                 |
| 交換  | `SwapRouterBaseIn`                                               | 多跳路由，由路由器使用。                                                                                                                                                 |
| 限價單 | `OpenLimitOrder`                                                 | 在指定 tick 掛出賣單。未成交代幣存於該 tick，撮合引擎在價格穿越時成交。                                                                                                                    |
| 限價單 | `IncreaseLimitOrder`                                             | 增加現有掛單的數量。                                                                                                                                                   |
| 限價單 | `DecreaseLimitOrder`                                             | 減少或取消掛單；退回未成交餘額及已結算的輸出代幣。                                                                                                                                    |
| 限價單 | `SettleLimitOrder`                                               | 將已成交的輸出代幣推送給訂單擁有者。可由擁有者或操作 keeper 呼叫。                                                                                                                        |
| 限價單 | `CloseLimitOrder`                                                | 關閉已完全成交的訂單帳戶。租金始終退回訂單的 `owner`。可由擁有者或 keeper 呼叫。                                                                                                             |
| 手續費 | `CollectProtocolFee`                                             | 管理員收取協議手續費。                                                                                                                                                  |
| 手續費 | `CollectFundFee`                                                 | 管理員收取基金手續費。                                                                                                                                                  |
| 獎勵  | `InitializeReward`                                               | 為池附加新的獎勵流。                                                                                                                                                   |
| 獎勵  | `SetRewardParams`                                                | 修改現有獎勵的發放速率／結束時間。                                                                                                                                            |
| 獎勵  | `UpdateRewardInfos`                                              | 將獎勵增長結算至當前時間（由任何交換／倉位變更操作呼叫）。                                                                                                                                |
| 獎勵  | `TransferRewardOwner`                                            | 轉移可設定或補充獎勵流的權限。                                                                                                                                              |
| 獎勵  | `CollectRemainingRewards`                                        | 獎勵流 `end_time` 後，將未分配的代幣回收至資助方。                                                                                                                              |
| 工具  | `InitTickArray`                                                  | 初始化 tick-array 帳戶（通常與 `OpenPosition` 打包執行）。                                                                                                                  |

大多數僅限管理員的指令（`CreateAmmConfig`、`UpdateAmmConfig`、`UpdatePoolStatus`、`CreateSupportMintAssociated`、`CreateOperationAccount`、`UpdateOperationAccount`、`CloseProtocolPosition`）由程式硬編碼的 `admin` 公鑰控管。獎勵流管理指令（`TransferRewardOwner`、`CollectRemainingRewards`）則由獎勵資助方控管，而非程式管理員。

V2 後綴表示「支援保險庫／NFT 的 Token-2022，需要 bitmap-extension slot」。SDK 預設對新池使用 V2。

## `CreatePool`

**參數**

```
sqrt_price_x64: u128           // 初始價格
open_time:      u64            // 此時間前拒絕交換
```

**帳戶（簡略）**

| #  | 名稱                            | W | S | 說明                     |
| -- | ----------------------------- | - | - | ---------------------- |
| 1  | `pool_creator`                | W | S |                        |
| 2  | `amm_config`                  |   |   | 選定的手續費等級。              |
| 3  | `pool_state`                  | W |   | 在此 `init`。             |
| 4  | `token_mint_0`                |   |   | 已排序。                   |
| 5  | `token_mint_1`                |   |   |                        |
| 6  | `token_vault_0`               | W |   | 在此 `init`，由池權限 PDA 擁有。 |
| 7  | `token_vault_1`               | W |   |                        |
| 8  | `observation_state`           | W |   | 在此 `init`。             |
| 9  | `tick_array_bitmap_extension` | W |   | 在此 `init`（V2）。         |
| 10 | `token_program`               |   |   |                        |
| 11 | `token_program_2022`          |   |   |                        |
| 12 | `system_program`, `rent`      |   |   |                        |

**前置條件**

* `token_mint_0 < token_mint_1`（依位元組順序排列）。
* `amm_config.disable_create_pool == false`。
* Mint 未被 Token-2022 擴充允許清單拒絕。

**後置條件**

* `pool_state.sqrt_price_x64 = sqrt_price_x64`，`tick_current = floor(log_{1.0001}(price))`。
* `pool_state.liquidity = 0`（尚無倉位）。
* `pool_state.fee_on = FromInput`（舊版預設值）。
* `pool_state.dynamic_fee_info` 歸零（動態費用停用）。

## `CreateCustomizablePool`

建議新池使用。效果與 `CreatePool` 相同，額外支援每池費用收取模式及選擇性動態費用啟用。

**參數**

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

**帳戶（簡略）** — 與 `CreatePool` 相同，當 `enable_dynamic_fee = true` 時額外需要：

| # | 名稱                   | W | S | 說明              |
| - | -------------------- | - | - | --------------- |
| N | `dynamic_fee_config` |   |   | 要快照的共用設定，必須已存在。 |

**前置條件** — 與 `CreatePool` 相同。若 `enable_dynamic_fee = false`，則忽略 `dynamic_fee_config`。

**後置條件**

* `pool_state.fee_on` 設為所選的 `CollectFeeOn` 變體。
* 若啟用動態費用：`pool_state.dynamic_fee_info` 從提供的 `DynamicFeeConfig` 初始化（複製五個校準參數；狀態欄位歸零）。
* 否則：`pool_state.dynamic_fee_info` 歸零（= 此池永久停用動態費用）。

`fee_on` 及動態費用啟用位元**僅在池建立時設定**，無法事後升級——透過舊版 `CreatePool` 建立的池無法追加動態費用或單側費用。新部署應預設使用此指令。

## `OpenPositionV2` / `OpenPositionWithToken22Nft`

在現有池中建立新倉位。

**參數**

```
tick_lower_index: i32
tick_upper_index: i32
tick_array_lower_start_index: i32
tick_array_upper_start_index: i32
liquidity:  u128              // 期望的 L（或 0 以使用下方金額）
amount_0_max: u64
amount_1_max: u64
with_metadata: bool           // 寫入 NFT 元資料（Metaplex）
base_flag: Option<bool>       // true = 依 amount0 計算；false = 依 amount1 計算
```

**帳戶（簡略）**

| #  | 名稱                                        | W | S          |                                 |
| -- | ----------------------------------------- | - | ---------- | ------------------------------- |
| 1  | `payer`                                   | W | S          |                                 |
| 2  | `position_nft_owner`                      |   |            |                                 |
| 3  | `position_nft_mint`                       | W | S（keypair） |                                 |
| 4  | `position_nft_account`                    | W |            | 擁有者持有 NFT 的 ATA。                |
| 5  | `metadata_account`                        | W |            | Metaplex（選用，若 `with_metadata`）。 |
| 6  | `pool_state`                              | W |            |                                 |
| 7  | `protocol_position`                       |   |            |                                 |
| 8  | `tick_array_lower`                        | W |            | 若未初始化則建立。                       |
| 9  | `tick_array_upper`                        | W |            | 同上。                             |
| 10 | `personal_position`                       | W |            | 在此建立。                           |
| 11 | `token_account_0`, `token_account_1`      | W |            | 使用者來源 ATA。                      |
| 12 | `token_vault_0`, `token_vault_1`          | W |            |                                 |
| 13 | `rent`, `system_program`, `token_program` |   |            |                                 |
| 14 | `associated_token_program`                |   |            |                                 |
| 15 | `metadata_program`                        |   |            | 選用。                             |
| 16 | `token_program_2022`                      |   |            | V2。                             |
| 17 | `vault_0_mint`, `vault_1_mint`            |   |            | V2。                             |
| 18 | `tick_array_bitmap_extension`             | W |            | V2（若有觸及）。                       |

**數學** — 請參閱 [`products/clmm/math`](/zh-Hant/products/clmm/math)。依據 `base_flag`，程式將 `liquidity` 或 `(amount_0_max, amount_1_max)` 解析為實際的 `L` 及實際消耗的代幣數量。

**前置條件**

* `tick_lower < tick_upper`，兩者均為 `pool.tick_spacing` 的倍數，且在 `[MIN_TICK, MAX_TICK]` 範圍內。
* 所需 tick array 已傳入並初始化（或在此交易中透過 `InitTickArray` CPI 建立）。
* 使用者來源 ATA 中至少持有 `amount_0_max` 及 `amount_1_max`。

**後置條件**

* `personal_position` 已存在，`liquidity` 已設定，`fee_growth_inside_last` 已快照。
* `tick_lower` 和 `tick_upper` 的 tick-array 條目已更新（`liquidity_gross += L`、`liquidity_net ± L`、費用增長快照維護）。
* 若倉位在範圍內（`tick_lower ≤ tick_current < tick_upper`），則 `pool_state.liquidity += L`。

**常見錯誤** — `InvalidTickIndex`、`NotApproved`、`ZeroAmountSpecified`、`TransactionTooLarge`（tick array 過多時）。

## `IncreaseLiquidityV2`

向已開啟的倉位增加流動性。

**參數**

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

**帳戶** — 與 `OpenPosition` 類似，但不需要 NFT mint（倉位已存在；NFT 以擁有者持有 1 個代幣的 ATA 形式傳入）。

**效果**

* 將 `amount_0_actual` / `amount_1_actual` 從使用者轉入保險庫。
* 遞增 `personal_position.liquidity` 及 `pool_state.liquidity`（若在範圍內），並相應調整端點 tick 的 `liquidity_gross` / `liquidity_net`。
* **收取自上次觸碰以來應付的手續費和獎勵**，並記入 `tokens_fees_owed_{0,1}` / `reward_amount_owed`。這些金額僅在 `DecreaseLiquidity` 或 `CollectReward` 時支付，增加流動性時不會直接付出。

## `DecreaseLiquidityV2`

從倉位移除流動性。

**參數**

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

**帳戶** — 結構與 `IncreaseLiquidity` 相同。

**效果**

* 依當前 `sqrt_price_x64` 計算移除 `L` 所對應的 `(amount_0, amount_1)`。
* 結算自上次觸碰以來累積的手續費／獎勵，方式與 `IncreaseLiquidity` 相同。
* 將 `amount_0 + fees_owed_0` 及 `amount_1 + fees_owed_1` 從保險庫轉給使用者。
* 遞減流動性計數器；若新的 `personal_position.liquidity == 0`，該倉位可執行 `ClosePosition`。

**滑點** — `amount_0_min` 和 `amount_1_min` 是使用者在扣除輸出端 Token-2022 轉帳費用後可接受的最低金額。

## `ClosePosition`

銷毀倉位 NFT 並關閉 `PersonalPositionState`。

**前置條件**

* `personal_position.liquidity == 0`。
* `tokens_fees_owed_{0,1} == 0`。
* 所有獎勵計數器 `reward_amount_owed == 0`。

（即：請先收取所有應得款項並將流動性減至零。）

**效果**

* 銷毀 NFT。
* 關閉 NFT mint 帳戶及 `personal_position` 帳戶，並將租金退還給 `payer`。

## `SwapV2`

沿流動性曲線行走；依 `is_base_input` 決定精確輸入或精確輸出模式。

**參數**

```
amount: u64                  // is_base_input=true 時為輸入，否則為輸出
other_amount_threshold: u64  // 最低輸出或最高輸入
sqrt_price_limit_x64: u128   // 硬性邊界；0 表示無限制
is_base_input: bool
```

**帳戶（簡略）**

| #   | 名稱                                      | W | S | 說明                      |
| --- | --------------------------------------- | - | - | ----------------------- |
| 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（部分 Token-2022 路徑必須）。 |
| 12  | `input_vault_mint`, `output_vault_mint` |   |   | V2。                     |
| 13  | `tick_array_bitmap_extension`（選用）       | W |   | 若交換走入擴充區域。              |
| 14+ | `tick_array`（剩餘）                        | W |   | 足以涵蓋預期行走範圍的陣列數量。        |

呼叫方傳入一組按優先順序排列、涵蓋預期交換範圍的 tick array 清單；程式按需取用。SDK 透過 `PoolUtils.computeAmountOutFormat` 或 API 報價端點計算此清單。

**前置條件**

* `pool_state.status` 允許交換。
* `now >= open_time`。
* `sqrt_price_limit_x64` 位於當前 `sqrt_price_x64` 在該方向的正確一側。

**常見錯誤** — `ExceededSlippage`、`SqrtPriceLimitOverflow`、`TickArrayNotFound`、`LiquidityInsufficient`。

**呼叫方應了解的 `SwapV2` 內部行為**（2025 年後版本）：

1. **動態費用附加** — 若 `pool.dynamic_fee_info` 非零，程式依自上次交換以來穿越的 tick 距離更新波動性累加器（套用 [`products/clmm/fees`](/zh-Hant/products/clmm/fees) 中的過濾／衰減規則），並在 `AmmConfig.trade_fee_rate` 之上加入 `dynamic_fee_component`。總費率上限為 10%（`MAX_FEE_RATE_NUMERATOR / 1_000_000`）。
2. **限價單撮合** — 當價格行走穿越持有開放限價單的 tick 時，程式先按 `order_phase` FIFO 順序成交該 tick 的限價單流動性，再繼續沿 LP 流動性曲線行走。已成交金額更新 `tick.unfilled_ratio_x64` 及 `tick.part_filled_orders_remaining`，供後續結算使用；訂單本身保持未動，直至擁有者呼叫 `SettleLimitOrder`。
3. **單側費用路由** — 當 `pool.fee_on = Token0Only` 或 `Token1Only` 時，交換步驟仍計算相同的輸入輸出交易；費用隨後路由至設定的一側。若設定的費用側為輸出端，費用從交換輸出中扣除（使用者收到 `out − fee`）；若為輸入端，行為與 `FromInput` 相同。請參閱 `PoolState` 上的 `is_fee_on_input(zero_for_one)` 及 `is_fee_on_token0(zero_for_one)`。

`Swap`（V1）實作與 `SwapV2` 相同的動態費用、單側費用路由及限價單撮合；唯一缺少的功能是 Token-2022 支援——兩個保險庫均須為傳統 SPL Token。任何含有 Token-2022 mint 的池必須透過 `SwapV2` 交換。聚合器與 SDK 已對所有 CLMM 路段優先選用 V2，呼叫方無需依 mint 類型分支處理。

## `OpenLimitOrder`

在指定 tick 掛出賣單。訂單位於每個 tick 的 FIFO 批次中，在價格穿越時成交。

**參數**

```
nonce_index:    u8       // 使用者選定的 nonce 帳戶索引（每個錢包 0..255）
zero_for_one:   bool     // true：賣出 token0 換 token1；false：賣出 token1 換 token0
tick_index:     i32      // 必須是 pool.tick_spacing 的倍數
amount:         u64      // 輸入代幣數量
```

**帳戶（簡略）**

| #  | 名稱                       | W | S | 說明                                                  |
| -- | ------------------------ | - | - | --------------------------------------------------- |
| 1  | `payer`                  | W | S | 訂單擁有者；支付租金。                                         |
| 2  | `pool_state`             | W |   |                                                     |
| 3  | `tick_array`             | W |   | 包含 `tick_index` 的 tick array。                       |
| 4  | `limit_order_nonce`      | W |   | PDA。`init_if_needed`——在使用者首次於此 `nonce_index` 下單時建立。 |
| 5  | `limit_order`            | W |   | PDA。在此 `init`。                                      |
| 6  | `input_token_account`    | W |   | 使用者的輸入 ATA。                                         |
| 7  | `input_vault`            | W |   | 池的輸入保險庫。                                            |
| 8  | `input_vault_mint`       |   |   | Token-2022 費用處理。                                    |
| 9  | `input_token_program`    |   |   | SPL 或 Token-2022。                                   |
| 10 | `system_program`, `rent` |   |   |                                                     |

**前置條件**

* `tick_index % pool.tick_spacing == 0`，且在 `[MIN_TICK, MAX_TICK]` 範圍內。
* `tick_index` 位於所選方向**相對於 `pool.tick_current` 的正確一側**（賣出 token0 → tick 必須在當前之上，反之亦然）。在已穿越的 tick 掛單會立即被撮合，因此會被拒絕。
* `pool_state.status` 允許限價單操作（第 5 位元）。

**後置條件**

* `limit_order` 已存在，快照開單時的 `tick.order_phase` 及 `tick.unfilled_ratio_x64`。
* `tick.orders_amount += amount`（在當前批次中）。
* `limit_order_nonce.order_nonce += 1`。
* 發出 `OpenLimitOrderEvent`。

**常見錯誤** — `InvalidLimitOrderAmount`（金額為零或低於池的最低限額）、`InvalidTickIndex`（超出 `[MIN_TICK, MAX_TICK]` 範圍，或位於 `tick_current` 所選方向的錯誤一側）、`TickAndSpacingNotMatch`（`tick_index % pool.tick_spacing != 0`）、`OrderPhaseSaturated`。

## `IncreaseLimitOrder`

增加現有掛單的數量。僅限訂單的 `owner` 呼叫。

**參數**

```
amount: u64    // 額外輸入代幣數量
```

**帳戶** — 與 `OpenLimitOrder` 類似，但不需要 nonce 帳戶；直接傳入 `limit_order` PDA。

**前置條件**

* `limit_order.owner == signer`。
* 訂單仍在同一批次中（`tick.order_phase == limit_order.order_phase`）。若批次已開始成交，訂單為部分結算狀態——呼叫方應先呼叫 `DecreaseLimitOrder` 或 `SettleLimitOrder` 以向前推進。

**效果**

* 從擁有者 ATA 轉入 `amount` 至 `input_vault`。
* `limit_order.total_amount += amount`；`tick.orders_amount += amount`。

## `DecreaseLimitOrder`

減少或完全取消掛單。退回未成交餘額至擁有者，以及過去部分成交已結算的輸出代幣。

**參數**

```
amount:     u64    // 要提取的輸入代幣數量（最多 = 未成交餘額）
amount_min: u64    // 輸入端提取的滑點下限
```

**帳戶** — 同時需要輸入與輸出代幣兩側：

| #  | 名稱                                      | 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`   |   |   |

**效果**

* 依批次的 `unfilled_ratio_x64` 重新計算自開單以來的已成交金額。
* 將已成交的輸出代幣傳送至 `output_token_account`。
* 將 `amount` 的未成交輸入退回至 `input_token_account`。
* 相應更新 `limit_order`。若新的未成交餘額為零，程式關閉該帳戶並將租金退還給 `owner`。

## `SettleLimitOrder`

將已成交的輸出代幣推送給擁有者，而不改變訂單的未成交餘額。適用於 `auto_withdraw` keeper 對長期部分成交訂單進行分批支付的場景。

**呼叫方** — 訂單的 `owner`，或程式的 `limit_order_admin`（一個執行自動 keeper 循環的鏈下操作熱錢包）。keeper 沒有其他權限——它只能將已成交的輸出代幣推送至訂單 `owner` 的 ATA，無法移動使用者其他資金。

**帳戶**

| # | 名稱                     | W | S |                             |
| - | ---------------------- | - | - | --------------------------- |
| 1 | `signer`               |   | S | 擁有者 *或* `limit_order_admin` |
| 2 | `pool_state`           |   |   |                             |
| 3 | `tick_array`           |   |   |                             |
| 4 | `limit_order`          | W |   |                             |
| 5 | `output_token_account` | W |   | 擁有者的輸出 ATA。                 |
| 6 | `output_vault`         | W |   | 池的輸出保險庫。                    |
| 7 | `output_vault_mint`    |   |   |                             |
| 8 | `output_token_program` |   |   |                             |

**效果**

* 使用 `(limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64)` 計算累積應付輸出金額。
* 將差額轉至 `output_token_account`。
* 更新 `limit_order.settled_output`。
* **不**關閉訂單；針對剩餘輸入的訂單仍保持開啟狀態。

## `CloseLimitOrder`

關閉已完全成交的訂單帳戶。無論由誰簽署，租金始終退還給 `limit_order.owner`。

**呼叫方** — `owner` 或 `limit_order_admin`。

**前置條件**

* 訂單未成交餘額為零（`amount == total_amount` 已成交並結算，或擁有者先前已將訂單減至零但忘記關閉）。

**效果**

* 關閉 `limit_order`；租金傳送至 `limit_order.owner`。

## `CreateDynamicFeeConfig`（管理員）

以 u16 索引建立可重複使用的參數集。

**參數**

```
index:                       u16
filter_period:               u16   // 秒；例如 30
decay_period:                u16   // 秒；例如 600。必須 > filter_period
reduction_factor:            u16   // 1..10_000；例如 5_000 = 每個衰減窗口保留 50%
dynamic_fee_control:         u32   // 1..100_000；波動性至費用曲線的增益
max_volatility_accumulator:  u32   // 上限
```

**帳戶**

| # | 名稱                   | W | S | 說明             |
| - | -------------------- | - | - | -------------- |
| 1 | `owner`              | W | S | 硬編碼的管理員公鑰。     |
| 2 | `dynamic_fee_config` | W |   | PDA，在此 `init`。 |
| 3 | `system_program`     |   |   |                |

**常見錯誤** — 若 `decay_period <= filter_period` 或任何值為 0 的欄位超出範圍，則回傳 `InvalidDynamicFeeConfigParams`。

## `UpdateDynamicFeeConfig`（管理員）

修改現有的 `DynamicFeeConfig`。已在建立時快照該設定的池**不會**被追溯更新；只有後續建立並參照此設定的新池才會採用新值。

**參數** — 與 `CreateDynamicFeeConfig` 相同的五個校準欄位（`filter_period`、`decay_period`、`reduction_factor`、`dynamic_fee_control`、`max_volatility_accumulator`）；`index` 在建立時固定，此處不再傳入。

## `CollectProtocolFee` / `CollectFundFee`

結構與 CPMM 的 `CollectProtocolFee` / `CollectFundFee` 完全相同。簽署者必須符合 `AmmConfig.owner` / `AmmConfig.fund_owner`。將池保險庫中累積的協議費／基金費轉至接收方，並將對應的 `PoolState.protocol_fees_*` / `fund_fees_*` 欄位歸零。

## `InitializeReward`

為池附加新的獎勵流。每個池最多可同時啟用 3 個獎勵流。

**參數**

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

**帳戶**

| # | 名稱                       | W | S |                        |
| - | ------------------------ | - | - | ---------------------- |
| 1 | `reward_funder`          | W | S |                        |
| 2 | `funder_token_account`   | W |   |                        |
| 3 | `amm_config`             |   |   |                        |
| 4 | `pool_state`             | W |   |                        |
| 5 | `operation_state`        |   |   | 控管獎勵建立的 CLMM 操作狀態 PDA。 |
| 6 | `reward_token_mint`      |   |   |                        |
| 7 | `reward_token_vault`     | W |   | 在此 `init`。             |
| 8 | `reward_token_program`   |   |   |                        |
| 9 | `system_program`, `rent` |   |   |                        |

**前置條件**

* 池目前啟用的獎勵流少於 3 個。
* 資助方在此指令執行時向保險庫存入 `total_emission = emissions_per_second × (end_time − open_time)` 數量的獎勵代幣。
* 獎勵 mint 已依 `operation_state` 加入白名單。

## `SetRewardParams`

延長、補充或修改現有獎勵流的發放速率。通常由池建立者或 Raydium 多簽呼叫。鏈上有相應限制：一般可以延長 `end_time` 或提高發放量，但不能追溯縮減。請查閱 `operation_state` 的擁有者清單。

## `UpdateRewardInfos`

純帳務操作——透過 `emissions_per_second × Δt / liquidity` 將 `reward_growth_global_x64` 結算至當前時間。每個涉及流動性的指令內部均會呼叫此操作。也作為獨立指令對外開放，以便 UI 或 crank 等外部角色主動觸發。

## `CollectReward`

倉位擁有者領取應得的獎勵代幣。

**帳戶**

| # | 名稱                        | W | S |                    |
| - | ------------------------- | - | - | ------------------ |
| 1 | `nft_owner`               |   | S |                    |
| 2 | `nft_account`             |   |   | 擁有者持有倉位 NFT 的 ATA。 |
| 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`      |   |   |                    |

**效果**

* 結算獎勵增長（方式與手續費相同）。
* 將應付金額轉至接收方 ATA，並將 `reward_amount_owed[i]` 歸零。

## 狀態變更矩陣

| 指令                       | `pool.liquidity` | `pool.fee_growth_global` | `pool.reward_growth_global` | `personal_position.liquidity` | Tick array                          |
| ------------------------ | ---------------- | ------------------------ | --------------------------- | ----------------------------- | ----------------------------------- |
| `CreatePool`             | 0                | 0                        | —                           | —                             | —                                   |
| `OpenPosition`           | + 若在範圍內          | —                        | —                           | 新建                            | 新增 liquidity\_gross/net             |
| `IncreaseLiquidity`      | + 若在範圍內          | 結算應付                     | 結算應付                        | +                             | 調整                                  |
| `DecreaseLiquidity`      | − 若在範圍內          | 結算應付                     | 結算應付                        | −                             | 調整                                  |
| `ClosePosition`          | —                | —                        | —                           | 銷毀                            | —                                   |
| `SwapV2`                 | ± 穿越時            | +                        | —                           | —                             | 穿越並翻轉 outside；撮合限價單批次               |
| `OpenLimitOrder`         | —                | —                        | —                           | —                             | 目標 tick 的 `orders_amount += amount` |
| `IncreaseLimitOrder`     | —                | —                        | —                           | —                             | `orders_amount += amount`           |
| `DecreaseLimitOrder`     | —                | —                        | —                           | —                             | `orders_amount -=`，可能關閉批次           |
| `SettleLimitOrder`       | —                | —                        | —                           | —                             | —（tick 唯讀）                          |
| `CloseLimitOrder`        | —                | —                        | —                           | —                             | —                                   |
| `CreateCustomizablePool` | 0                | 0                        | —                           | —                             | —                                   |
| `UpdateRewardInfos`      | —                | —                        | +                           | —                             | —                                   |
| `CollectReward`          | —                | —                        | 結算應付                        | —                             | —                                   |

## 下一步

* [`products/clmm/code-demos`](/zh-Hant/products/clmm/code-demos) — 可執行的 TypeScript 範例。
* [`products/clmm/fees`](/zh-Hant/products/clmm/fees) — 手續費與獎勵累積詳情。
* [`reference/error-codes`](/zh-Hant/reference/error-codes) — 完整的 CLMM Anchor 錯誤代碼表。

資料來源：

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