> ## 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`](/ja/products/clmm/accounts)（アカウントの内容）および [`products/clmm/math`](/ja/products/clmm/math)（計算式の内容）と対応しています。引数とアカウントの順序についての正式なリファレンスです。具体的なバイトレイアウトはIDLを参照してください。
</Info>

## インストラクション一覧

| グループ    | インストラクション                                                        | 備考                                                                                                                                                                                   |
| ------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 管理者     | `CreateAmmConfig`                                                | 新しい手数料ティアを定義します。                                                                                                                                                                     |
| 管理者     | `UpdateAmmConfig`                                                | 既存ティアのレートを変更します。                                                                                                                                                                     |
| 管理者     | `UpdatePoolStatus`                                               | プールの操作を一時停止・再開します。                                                                                                                                                                   |
| 管理者     | `CreateSupportMintAssociated`                                    | CLMMプールで使用するToken-2022ミント拡張設定をホワイトリストに追加します。                                                                                                                                         |
| 管理者     | `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を置き換えます（ビットマップ拡張スロットを含む新しいアカウントレイアウト）。`OpenPositionWithToken22Nft` はポジションNFTをSPLトークンではなくToken-2022として発行します。新しいコードはV2またはToken-2022バリアントを使用してください。 |
| ポジション   | `IncreaseLiquidity` / `IncreaseLiquidityV2`                      | 既存ポジションに流動性を追加します。                                                                                                                                                                   |
| ポジション   | `DecreaseLiquidity` / `DecreaseLiquidityV2`                      | 流動性を削除し、未払い手数料を回収します。                                                                                                                                                                |
| ポジション   | `ClosePosition`                                                  | NFTをバーンし、`PersonalPositionState` を閉じます。                                                                                                                                              |
| ポジション   | `CloseProtocolPosition`                                          | レガシーな `ProtocolPositionState` PDAの管理者専用スイープ。現在のプログラムは `ProtocolPositionState` を作成・読み取りしません。このインストラクションは旧バージョンのプログラムで作成されたアカウントのレントを回収するためだけに存在します。                                   |
| スワップ    | `Swap` / `SwapV2`                                                | 一定流動性スワップ。両バリアントともダイナミックフィー・片側手数料ルーティング・指値注文マッチングに対応しています。唯一の違いは `SwapV2` がToken-2022ミントを受け付ける点です（V1バリアントは両方のボルトが従来のSPLトークンである必要があります）。                                              |
| スワップ    | `SwapRouterBaseIn`                                               | マルチホップ。ルーターが使用します。                                                                                                                                                                   |
| 指値注文    | `OpenLimitOrder`                                                 | 特定のティックに売り注文を配置します。未約定トークンはそのティックに留まり、価格がクロスするとマッチングエンジンが約定させます。                                                                                                                     |
| 指値注文    | `IncreaseLimitOrder`                                             | 既存のオープン注文に追加します。                                                                                                                                                                     |
| 指値注文    | `DecreaseLimitOrder`                                             | オープン注文を減額またはキャンセルします。未約定残高と既に決済済みの出力を払い出します。                                                                                                                                         |
| 指値注文    | `SettleLimitOrder`                                               | 約定済み出力トークンを注文オーナーにプッシュします。オーナーまたはオペレーショナルキーパーが呼び出せます。                                                                                                                                |
| 指値注文    | `CloseLimitOrder`                                                | 完全に消費された注文アカウントを閉じます。レントは常に注文の `owner` に返却されます。オーナーまたはキーパーが呼び出せます。                                                                                                                   |
| 手数料     | `CollectProtocolFee`                                             | プロトコル手数料の管理者スイープ。                                                                                                                                                                    |
| 手数料     | `CollectFundFee`                                                 | ファンド手数料の管理者スイープ。                                                                                                                                                                     |
| リワード    | `InitializeReward`                                               | プールに新しいリワードストリームを追加します。                                                                                                                                                              |
| リワード    | `SetRewardParams`                                                | 既存リワードのエミッションレート・終了時刻を変更します。                                                                                                                                                         |
| リワード    | `UpdateRewardInfos`                                              | リワード成長を現在時刻まで決済します（スワップ・ポジション変更のたびに呼び出されます）。                                                                                                                                         |
| リワード    | `TransferRewardOwner`                                            | リワードストリームの設定・補充権限を移転します。                                                                                                                                                             |
| リワード    | `CollectRemainingRewards`                                        | リワードストリームの `end_time` 経過後、未割り当てトークンをファンダーに回収します。                                                                                                                                     |
| ユーティリティ | `InitTickArray`                                                  | ティックアレイアカウントを初期化します（`OpenPosition` と一緒にバンドルされることが多いです）。                                                                                                                              |

管理者専用インストラクション（`CreateAmmConfig`、`UpdateAmmConfig`、`UpdatePoolStatus`、`CreateSupportMintAssociated`、`CreateOperationAccount`、`UpdateOperationAccount`、`CloseProtocolPosition`）は、プログラムにハードコードされた `admin` 公開鍵でゲートされています。リワードストリームの管理者インストラクション（`TransferRewardOwner`、`CollectRemainingRewards`）は、プログラム管理者ではなくリワードファンダーによってゲートされています。

「V2」サフィックスは「ボルト・NFTでToken-2022をサポート、ビットマップ拡張スロットが必要」を意味します。SDKは新しいプールに対してデフォルトでV2を選択します。

## `CreatePool`

**引数**

```
sqrt_price_x64: u128           // initial price
open_time:      u64            // swaps rejected before this time
```

**アカウント（省略版）**

| #  | 名前                            | 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`。
* ミントが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` から初期化されます（5つのキャリブレーションパラメータがコピーされ、状態フィールドはゼロになります）。
* それ以外の場合：`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              // desired L (or 0 to use amounts below)
amount_0_max: u64
amount_1_max: u64
with_metadata: bool           // write NFT metadata (Metaplex)
base_flag: Option<bool>       // true = fit to amount0; false = fit to 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`](/ja/products/clmm/math) を参照してください。`base_flag` に基づき、プログラムは `liquidity` または `(amount_0_max, amount_1_max)` から実際の `L` と消費トークン量を解決します。

**前提条件**

* `tick_lower < tick_upper`、両方とも `pool.tick_spacing` の倍数で、`[MIN_TICK, MAX_TICK]` の範囲内。
* 必要なティックアレイが渡され、初期化済みであること（またはトランザクション内の `InitTickArray` CPIでここで作成）。
* ユーザーのソースATAに少なくとも `amount_0_max` と `amount_1_max` があること。

**事後条件**

* `personal_position` が存在し、`liquidity` が設定され、`fee_growth_inside_last` がスナップショットされています。
* `tick_lower` と `tick_upper` のティックアレイエントリが更新されます（`liquidity_gross += L`、`liquidity_net ± L`、手数料成長スナップショットが維持されます）。
* ポジションがレンジ内（`tick_lower ≤ tick_current < tick_upper`）の場合、`pool_state.liquidity += L`。

**よくあるエラー** — `InvalidTickIndex`、`NotApproved`、`ZeroAmountSpecified`、`TransactionTooLarge`（ティックアレイが多すぎる場合）。

## `IncreaseLiquidityV2`

既存ポジションに流動性を追加します。

**引数**

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

**アカウント** — `OpenPosition` と同様ですが、NFTミントは不要です（ポジションは既に存在し、NFTはオーナーのATAに1トークンとして渡します）。

**効果**

* ユーザーからボルトへ `amount_0_actual` / `amount_1_actual` を転送します。
* `personal_position.liquidity` と `pool_state.liquidity`（レンジ内の場合）、およびエンドポイントティックの `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ミントアカウントと `personal_position` アカウントを閉じ、`payer` にレントを返金します。

## `SwapV2`

`is_base_input` に応じて、完全入力または完全出力で流動性カーブを走査します。

**引数**

```
amount: u64                  // input if is_base_input=true, output otherwise
other_amount_threshold: u64  // min out or max in
sqrt_price_limit_x64: u128   // hard bound; 0 ⇒ unbounded
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 |   | 予想されるウォーク範囲をカバーするのに十分な数のアレイ。 |

呼び出し元は予想されるスワップウォークをカバーするティックアレイのランク付きリストを渡します。プログラムは必要な分だけ使用します。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` が非ゼロの場合、プログラムは最後のスワップからのティック移動距離を使用してボラティリティアキュムレーターを更新し（[`products/clmm/fees`](/ja/products/clmm/fees) のフィルター・減衰ルールを使用）、`AmmConfig.trade_fee_rate` に `dynamic_fee_component` を上乗せします。合計手数料は10%上限です（`MAX_FEE_RATE_NUMERATOR / 1_000_000`）。
2. **指値注文マッチング** — 価格ウォークがオープン指値注文を保持するティックを横断すると、プログラムはまずそのティックで利用可能な指値注文流動性を約定させ（`order_phase` によるFIFO）、その後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-2022ミントを持つプールは `SwapV2` でスワップする必要があります。アグリゲーターとSDKはすべてのCLMMレグでV2を優先するため、呼び出し元はミントタイプで分岐する必要はありません。

## `OpenLimitOrder`

特定のティックに売り注文を配置します。注文はティックごとのFIFOコホートに入り、価格が通過するにつれて約定します。

**引数**

```
nonce_index:    u8       // user's chosen nonce-account index (0..255 per wallet)
zero_for_one:   bool     // true: sell token0 for token1; false: sell token1 for token0
tick_index:     i32      // must be a multiple of pool.tick_spacing
amount:         u64      // input-token amount
```

**アカウント（省略版）**

| #  | 名前                       | W | S | 備考                                                      |
| -- | ------------------------ | - | - | ------------------------------------------------------- |
| 1  | `payer`                  | W | S | 注文オーナー。レントを支払います。                                       |
| 2  | `pool_state`             | W |   |                                                         |
| 3  | `tick_array`             | W |   | `tick_index` を含むティックアレイ。                                |
| 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を売る場合→ティックは現在より上、その逆も同様）。既にクロス済みのティックでの売りは即時約定となるため、拒否されます。
* `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    // additional input-token amount
```

**アカウント** — `OpenLimitOrder` と同様ですが、nonceアカウントは不要です。`limit_order` PDAが直接渡されます。

**前提条件**

* `limit_order.owner == signer`。
* 注文が同じコホートに属していること（`tick.order_phase == limit_order.order_phase`）。コホートが既に約定を開始している場合、注文は部分的に決済されています。呼び出し元はまず `DecreaseLimitOrder` または `SettleLimitOrder` を呼び出してロールフォワードしてください。

**効果**

* オーナーATAから `input_vault` へ `amount` を転送します。
* `limit_order.total_amount += amount`；`tick.orders_amount += amount`。

## `DecreaseLimitOrder`

オープン注文を減額または完全キャンセルします。未約定残高を、過去の部分約定で既に決済された出力とともにオーナーに返します。

**引数**

```
amount:     u64    // input-token amount to withdraw (max = unfilled remainder)
amount_min: u64    // slippage floor on the input-side withdrawal
```

**アカウント** — 入力と出力の両トークンサイド：

| #  | 名前                                      | 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` キーパーが長期的な部分約定に対して定期的に支払いを行いたい場合に便利です。

**呼び出し元** — 注文の `owner`、またはプログラムの `limit_order_admin`（自動キーパーループを実行するオフチェーンの運用ホットウォレット）。キーパーには他の権限はありません。約定済み出力を注文の `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   // seconds; e.g. 30
decay_period:                u16   // seconds; e.g. 600. Must be > filter_period
reduction_factor:            u16   // 1..10_000; e.g. 5_000 = 50% retention per decay window
dynamic_fee_control:         u32   // 1..100_000; gain on the volatility-to-fee curve
max_volatility_accumulator:  u32   // ceiling
```

**アカウント**

| # | 名前                   | W | S | 備考               |
| - | -------------------- | - | - | ---------------- |
| 1 | `owner`              | W | S | ハードコードされた管理者公開鍵。 |
| 2 | `dynamic_fee_config` | W |   | PDA、ここで `init`。  |
| 3 | `system_program`     |   |   |                  |

**よくあるエラー** — `decay_period <= filter_period` またはゼロ値フィールドが範囲外の場合、`InvalidDynamicFeeConfigParams`。

## `UpdateDynamicFeeConfig`（管理者）

既存の `DynamicFeeConfig` を変更します。作成時にこの設定をスナップショットしたプールは**遡及的に更新されません**。この設定を参照して新しく作成されたプールのみが新しい値を適用します。

**引数** — `CreateDynamicFeeConfig` と同じ5つのキャリブレーションフィールド（`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)` 分のリワードトークンをボルトに預け入れます。
* `operation_state` によるリワードミントのホワイトリスト登録。

## `SetRewardParams`

既存のリワードストリームの延長・補充・エミッションレートの変更を行います。通常、プール作成者またはRaydiumマルチシグが呼び出します。制約はオンチェーンに存在します。通常、`end_time` の延長やエミッションの増加は可能ですが、遡及的な縮小はできません。`operation_state` のオーナーリストを確認してください。

## `UpdateRewardInfos`

純粋なブックキーピングです。`emissions_per_second × Δt / liquidity` を計算して `reward_growth_global_x64` を現在時刻まで決済します。流動性に触れるすべてのインストラクションから内部的に呼び出されます。外部アクター（UI、クランク）がトリガーしたい場合に備えて、スタンドアロンインストラクションとして公開されています。

## `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` | ティックアレイ                           |
| ------------------------ | ---------------- | ------------------------ | --------------------------- | ----------------------------- | --------------------------------- |
| `CreatePool`             | 0                | 0                        | —                           | —                             | —                                 |
| `OpenPosition`           | レンジ内なら+          | —                        | —                           | 新規                            | liquidity\_gross/netを追加           |
| `IncreaseLiquidity`      | レンジ内なら+          | 未払いを決済                   | 未払いを決済                      | +                             | 調整                                |
| `DecreaseLiquidity`      | レンジ内なら−          | 未払いを決済                   | 未払いを決済                      | −                             | 調整                                |
| `ClosePosition`          | —                | —                        | —                           | 破棄                            | —                                 |
| `SwapV2`                 | クロス時に±           | +                        | —                           | —                             | クロス＆外側フリップ、指値注文コホートのマッチング         |
| `OpenLimitOrder`         | —                | —                        | —                           | —                             | 対象ティックで `orders_amount += amount` |
| `IncreaseLimitOrder`     | —                | —                        | —                           | —                             | `orders_amount += amount`         |
| `DecreaseLimitOrder`     | —                | —                        | —                           | —                             | `orders_amount -=`、コホートを閉じる場合あり   |
| `SettleLimitOrder`       | —                | —                        | —                           | —                             | —（ティックは読み取り専用）                    |
| `CloseLimitOrder`        | —                | —                        | —                           | —                             | —                                 |
| `CreateCustomizablePool` | 0                | 0                        | —                           | —                             | —                                 |
| `UpdateRewardInfos`      | —                | —                        | +                           | —                             | —                                 |
| `CollectReward`          | —                | —                        | 未払いを決済                      | —                             | —                                 |

## 次のステップ

* [`products/clmm/code-demos`](/ja/products/clmm/code-demos) — 実行可能なTypeScriptサンプル。
* [`products/clmm/fees`](/ja/products/clmm/fees) — 手数料とリワードの発生に関する詳細。
* [`reference/error-codes`](/ja/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`
