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

# Instruksi CLMM

> Referensi lengkap instruksi CLMM: siklus hidup pool, manajemen posisi, swap, dan aliran reward.

<Info>
  **Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.**

  [Lihat versi bahasa Inggris →](/products/clmm/instructions)
</Info>

<Info>
  Halaman ini merupakan pasangan dari [`products/clmm/accounts`](/id/products/clmm/accounts) (penjelasan akun) dan [`products/clmm/math`](/id/products/clmm/math) (penjelasan matematika). Halaman ini menjadi acuan untuk argumen dan urutan akun; tata letak byte terperinci tersedia di IDL.
</Info>

## Daftar instruksi

| Grup        | Instruksi                                                        | Catatan                                                                                                                                                                                                                                                           |
| ----------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin       | `CreateAmmConfig`                                                | Membuat fee tier baru.                                                                                                                                                                                                                                            |
| Admin       | `UpdateAmmConfig`                                                | Mengubah tarif pada fee tier yang sudah ada.                                                                                                                                                                                                                      |
| Admin       | `UpdatePoolStatus`                                               | Menjeda/melanjutkan operasi pada pool.                                                                                                                                                                                                                            |
| Admin       | `CreateSupportMintAssociated`                                    | Memasukkan konfigurasi ekstensi mint Token-2022 ke daftar izin untuk digunakan di pool CLMM.                                                                                                                                                                      |
| Admin       | `CreateOperationAccount`                                         | Menginisialisasi operation account tingkat program (satu kali).                                                                                                                                                                                                   |
| Admin       | `UpdateOperationAccount`                                         | Mengubah whitelist operation account.                                                                                                                                                                                                                             |
| Admin       | `CreateDynamicFeeConfig`                                         | Membuat kumpulan parameter dynamic fee yang dapat digunakan ulang di bawah indeks u16.                                                                                                                                                                            |
| Admin       | `UpdateDynamicFeeConfig`                                         | Mengubah `DynamicFeeConfig` yang sudah ada. Pool yang telah mengambil snapshot config ini tidak terpengaruh.                                                                                                                                                      |
| Pool        | `CreatePool`                                                     | Menginisialisasi pool CLMM yang terikat ke `AmmConfig`. Jalur fee standar FromInput. Dapat digunakan bersamaan dengan `CreateCustomizablePool`.                                                                                                                   |
| Pool        | `CreateCustomizablePool`                                         | Direkomendasikan untuk pool baru. Sama seperti `CreatePool` ditambah `collect_fee_on` dan flag opsional `enable_dynamic_fee`.                                                                                                                                     |
| Position    | `OpenPosition` / `OpenPositionV2` / `OpenPositionWithToken22Nft` | Mencetak NFT posisi. `OpenPositionV2` menggantikan V1 (tata letak akun terbaru dengan slot bitmap-extension); `OpenPositionWithToken22Nft` menerbitkan NFT posisi sebagai Token-2022, bukan SPL Token. Kode baru sebaiknya menggunakan V2 atau varian Token-2022. |
| Position    | `IncreaseLiquidity` / `IncreaseLiquidityV2`                      | Menambah likuiditas ke posisi yang sudah ada.                                                                                                                                                                                                                     |
| Position    | `DecreaseLiquidity` / `DecreaseLiquidityV2`                      | Mengurangi likuiditas; mengumpulkan fee yang terutang.                                                                                                                                                                                                            |
| Position    | `ClosePosition`                                                  | Membakar NFT dan menutup `PersonalPositionState`.                                                                                                                                                                                                                 |
| Position    | `CloseProtocolPosition`                                          | Sweep khusus admin untuk PDA `ProtocolPositionState` lama. Program saat ini tidak lagi membuat atau membaca `ProtocolPositionState` — instruksi ini hanya ada untuk mengambil kembali rent pada akun yang dibuat oleh versi program lama.                         |
| Swap        | `Swap` / `SwapV2`                                                | Swap dengan likuiditas konstan. Kedua varian mendukung dynamic fee, routing fee satu sisi, dan pencocokan limit order; perbedaannya hanya `SwapV2` menerima mint Token-2022 (varian V1 mengharuskan kedua vault berupa SPL Token klasik).                         |
| Swap        | `SwapRouterBaseIn`                                               | Multi-hop, digunakan oleh router.                                                                                                                                                                                                                                 |
| Limit order | `OpenLimitOrder`                                                 | Menempatkan sell order pada tick tertentu. Token yang belum terisi tersimpan di tick; mesin pencocokan mengisinya saat harga melewatinya.                                                                                                                         |
| Limit order | `IncreaseLimitOrder`                                             | Menambah jumlah order yang sudah terbuka.                                                                                                                                                                                                                         |
| Limit order | `DecreaseLimitOrder`                                             | Mengurangi atau membatalkan order yang terbuka; membayarkan sisa yang belum terisi beserta output yang sudah diselesaikan.                                                                                                                                        |
| Limit order | `SettleLimitOrder`                                               | Mendorong token output yang sudah terisi ke pemilik order. Dapat dipanggil oleh pemilik atau keeper operasional.                                                                                                                                                  |
| Limit order | `CloseLimitOrder`                                                | Menutup akun order yang sudah sepenuhnya terisi. Rent selalu dikembalikan ke `owner` order. Dapat dipanggil oleh pemilik atau keeper.                                                                                                                             |
| Fees        | `CollectProtocolFee`                                             | Sweep admin untuk protocol fee.                                                                                                                                                                                                                                   |
| Fees        | `CollectFundFee`                                                 | Sweep admin untuk fund fee.                                                                                                                                                                                                                                       |
| Rewards     | `InitializeReward`                                               | Menambahkan aliran reward baru ke pool.                                                                                                                                                                                                                           |
| Rewards     | `SetRewardParams`                                                | Mengubah laju emisi/waktu akhir reward yang sudah ada.                                                                                                                                                                                                            |
| Rewards     | `UpdateRewardInfos`                                              | Menyelesaikan pertumbuhan reward hingga saat ini (dipanggil oleh setiap swap atau perubahan posisi).                                                                                                                                                              |
| Rewards     | `TransferRewardOwner`                                            | Memindahkan otoritas yang dapat mengatur atau mengisi ulang aliran reward.                                                                                                                                                                                        |
| Rewards     | `CollectRemainingRewards`                                        | Setelah `end_time` aliran reward, menyapu token yang belum dialokasikan kembali ke funder.                                                                                                                                                                        |
| Utility     | `InitTickArray`                                                  | Menginisialisasi akun tick-array (sering digabungkan dengan `OpenPosition`).                                                                                                                                                                                      |

Sebagian besar instruksi khusus admin (`CreateAmmConfig`, `UpdateAmmConfig`, `UpdatePoolStatus`, `CreateSupportMintAssociated`, `CreateOperationAccount`, `UpdateOperationAccount`, `CloseProtocolPosition`) dibatasi oleh pubkey `admin` yang dikodekan langsung ke program. Instruksi admin aliran reward (`TransferRewardOwner`, `CollectRemainingRewards`) dibatasi oleh funder reward, bukan admin program.

Sufiks V2 berarti "mendukung Token-2022 pada vault/NFT, memerlukan slot bitmap-extension". SDK memilih V2 secara default untuk pool baru.

## `CreatePool`

**Argumen**

```
sqrt_price_x64: u128           // harga awal
open_time:      u64            // swap ditolak sebelum waktu ini
```

**Akun (ringkasan)**

| #  | Nama                          | W | S | Catatan                                          |
| -- | ----------------------------- | - | - | ------------------------------------------------ |
| 1  | `pool_creator`                | W | S |                                                  |
| 2  | `amm_config`                  |   |   | Fee tier yang dipilih.                           |
| 3  | `pool_state`                  | W |   | `init` di sini.                                  |
| 4  | `token_mint_0`                |   |   | Diurutkan.                                       |
| 5  | `token_mint_1`                |   |   |                                                  |
| 6  | `token_vault_0`               | W |   | `init` di sini, dimiliki oleh PDA otoritas pool. |
| 7  | `token_vault_1`               | W |   |                                                  |
| 8  | `observation_state`           | W |   | `init` di sini.                                  |
| 9  | `tick_array_bitmap_extension` | W |   | `init` di sini (V2).                             |
| 10 | `token_program`               |   |   |                                                  |
| 11 | `token_program_2022`          |   |   |                                                  |
| 12 | `system_program`, `rent`      |   |   |                                                  |

**Prasyarat**

* `token_mint_0 < token_mint_1` berdasarkan urutan byte.
* `amm_config.disable_create_pool == false`.
* Mint tidak ditolak oleh daftar izin ekstensi Token-2022.

**Hasil setelah eksekusi**

* `pool_state.sqrt_price_x64 = sqrt_price_x64`, `tick_current = floor(log_{1.0001}(price))`.
* `pool_state.liquidity = 0` (belum ada posisi).
* `pool_state.fee_on = FromInput` (default lama).
* `pool_state.dynamic_fee_info` dinolkan (dynamic fee dinonaktifkan).

## `CreateCustomizablePool`

Direkomendasikan untuk pool baru. Efeknya sama dengan `CreatePool` ditambah mode pengumpulan fee per-pool dan opsi dynamic fee opsional.

**Argumen**

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

**Akun (ringkasan)** — sama seperti `CreatePool` ditambah, jika `enable_dynamic_fee = true`:

| # | Nama                 | W | S | Catatan                                                        |
| - | -------------------- | - | - | -------------------------------------------------------------- |
| N | `dynamic_fee_config` |   |   | Config bersama yang akan diambil snapshotnya. Harus sudah ada. |

**Prasyarat** — sama seperti `CreatePool`. Jika `enable_dynamic_fee = false`, `dynamic_fee_config` diabaikan.

**Hasil setelah eksekusi**

* `pool_state.fee_on` diatur ke varian `CollectFeeOn` yang dipilih.
* Jika dynamic fee diaktifkan: `pool_state.dynamic_fee_info` diinisialisasi dari `DynamicFeeConfig` yang diberikan (lima parameter kalibrasi disalin; kolom state dinolkan).
* Jika tidak: `pool_state.dynamic_fee_info` dinolkan (= dynamic fee tidak aktif selamanya untuk pool ini).

`fee_on` dan bit aktifasi dynamic fee hanya dapat diatur **saat pembuatan pool**. Tidak ada upgrade di tempat — pool yang dibuat melalui `CreatePool` lama tidak dapat memperoleh dynamic fee atau fee satu sisi secara retroaktif. Penerapan baru sebaiknya menggunakan instruksi ini sebagai default.

## `OpenPositionV2` / `OpenPositionWithToken22Nft`

Membuat posisi baru di dalam pool yang sudah ada.

**Argumen**

```
tick_lower_index: i32
tick_upper_index: i32
tick_array_lower_start_index: i32
tick_array_upper_start_index: i32
liquidity:  u128              // L yang diinginkan (atau 0 untuk menggunakan jumlah di bawah)
amount_0_max: u64
amount_1_max: u64
with_metadata: bool           // tulis metadata NFT (Metaplex)
base_flag: Option<bool>       // true = sesuaikan dengan amount0; false = sesuaikan dengan amount1
```

**Akun (ringkasan)**

| #  | Nama                                      | W | S           |                                            |
| -- | ----------------------------------------- | - | ----------- | ------------------------------------------ |
| 1  | `payer`                                   | W | S           |                                            |
| 2  | `position_nft_owner`                      |   |             |                                            |
| 3  | `position_nft_mint`                       | W | S (keypair) |                                            |
| 4  | `position_nft_account`                    | W |             | ATA pemilik untuk NFT.                     |
| 5  | `metadata_account`                        | W |             | Metaplex (opsional, jika `with_metadata`). |
| 6  | `pool_state`                              | W |             |                                            |
| 7  | `protocol_position`                       |   |             |                                            |
| 8  | `tick_array_lower`                        | W |             | Dibuat jika belum diinisialisasi.          |
| 9  | `tick_array_upper`                        | W |             | Sama.                                      |
| 10 | `personal_position`                       | W |             | Dibuat di sini.                            |
| 11 | `token_account_0`, `token_account_1`      | W |             | ATA sumber pengguna.                       |
| 12 | `token_vault_0`, `token_vault_1`          | W |             |                                            |
| 13 | `rent`, `system_program`, `token_program` |   |             |                                            |
| 14 | `associated_token_program`                |   |             |                                            |
| 15 | `metadata_program`                        |   |             | Opsional.                                  |
| 16 | `token_program_2022`                      |   |             | V2.                                        |
| 17 | `vault_0_mint`, `vault_1_mint`            |   |             | V2.                                        |
| 18 | `tick_array_bitmap_extension`             | W |             | V2 (jika disentuh).                        |

**Matematika** — lihat [`products/clmm/math`](/id/products/clmm/math). Berdasarkan `base_flag`, program menyelesaikan nilai `liquidity` atau `(amount_0_max, amount_1_max)` menjadi `L` aktual dan jumlah token yang dikonsumsi.

**Prasyarat**

* `tick_lower < tick_upper`, keduanya merupakan kelipatan dari `pool.tick_spacing`, berada dalam rentang `[MIN_TICK, MAX_TICK]`.
* Tick array yang diperlukan sudah diinisialisasi (atau dibuat di sini melalui CPI `InitTickArray` dalam transaksi).
* Pengguna memiliki setidaknya `amount_0_max` dan `amount_1_max` di ATA sumber.

**Hasil setelah eksekusi**

* `personal_position` ada, `liquidity` diatur, `fee_growth_inside_last` diambil snapshotnya.
* Entri tick-array pada `tick_lower` dan `tick_upper` diperbarui (`liquidity_gross += L`, `liquidity_net ± L`, snapshot pertumbuhan fee dipertahankan).
* `pool_state.liquidity += L` jika posisi berada dalam rentang (`tick_lower ≤ tick_current < tick_upper`).

**Error umum** — `InvalidTickIndex`, `NotApproved`, `ZeroAmountSpecified`, `TransactionTooLarge` (jika terlalu banyak tick array).

## `IncreaseLiquidityV2`

Menambah likuiditas ke posisi yang sudah terbuka.

**Argumen**

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

**Akun** — seperti `OpenPosition` tanpa mint NFT (posisi sudah ada; NFT diteruskan sebagai ATA pemilik yang menyimpan 1 token).

**Efek**

* Mentransfer `amount_0_actual` / `amount_1_actual` dari pengguna ke vault.
* Menaikkan `personal_position.liquidity` dan `pool_state.liquidity` (jika dalam rentang), serta `liquidity_gross` / `liquidity_net` pada tick ujung posisi.
* **Mengumpulkan fee dan reward yang terutang sejak sentuhan terakhir** dan mengkreditkannya ke `tokens_fees_owed_{0,1}` / `reward_amount_owed`. Jumlah tersebut baru dibayarkan saat `DecreaseLiquidity` atau `CollectReward`, bukan saat penambahan.

## `DecreaseLiquidityV2`

Mengurangi likuiditas dari posisi.

**Argumen**

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

**Akun** — bentuknya sama dengan `IncreaseLiquidity`.

**Efek**

* Menghitung `(amount_0, amount_1)` untuk `L` yang dihapus berdasarkan `sqrt_price_x64` saat ini.
* Menyelesaikan fee/reward yang terkumpul sejak sentuhan terakhir, sama seperti `IncreaseLiquidity`.
* Mentransfer `amount_0 + fees_owed_0` dan `amount_1 + fees_owed_1` dari vault ke pengguna.
* Mengurangi penghitung likuiditas; jika `personal_position.liquidity == 0` yang baru, posisi tersebut memenuhi syarat untuk `ClosePosition`.

**Slippage** — `amount_0_min` dan `amount_1_min` adalah jumlah minimum yang diterima pengguna setelah dikurangi transfer fee Token-2022 pada sisi output.

## `ClosePosition`

Membakar NFT posisi dan menutup `PersonalPositionState`.

**Prasyarat**

* `personal_position.liquidity == 0`.
* `tokens_fees_owed_{0,1} == 0`.
* Semua penghitung reward `reward_amount_owed == 0`.

(Artinya, kumpulkan semua dan kurangi ke nol terlebih dahulu.)

**Efek**

* Membakar NFT.
* Menutup akun mint NFT dan akun `personal_position`, mengembalikan rent ke `payer`.

## `SwapV2`

Berjalan di sepanjang kurva likuiditas; input eksak *atau* output eksak bergantung pada `is_base_input`.

**Argumen**

```
amount: u64                  // input jika is_base_input=true, output jika sebaliknya
other_amount_threshold: u64  // minimum output atau maksimum input
sqrt_price_limit_x64: u128   // batas keras; 0 ⇒ tidak dibatasi
is_base_input: bool
```

**Akun (ringkasan)**

| #   | Nama                                     | W | S | Catatan                                                        |
| --- | ---------------------------------------- | - | - | -------------------------------------------------------------- |
| 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 (diperlukan untuk sebagian jalur Token-2022).               |
| 12  | `input_vault_mint`, `output_vault_mint`  |   |   | V2.                                                            |
| 13  | `tick_array_bitmap_extension` (opsional) | W |   | Jika swap berjalan ke dalam extension.                         |
| 14+ | `tick_array` (sisa)                      | W |   | Cukup array untuk mencakup rentang perjalanan yang diharapkan. |

Pemanggil meneruskan daftar tick array yang mencakup perjalanan swap yang diharapkan; program menggunakan sebanyak yang diperlukan. SDK menghitung daftar ini melalui `PoolUtils.computeAmountOutFormat` atau endpoint quote API.

**Prasyarat**

* `pool_state.status` mengizinkan swap.
* `now >= open_time`.
* `sqrt_price_limit_x64` berada di sisi yang benar dari `sqrt_price_x64` untuk arah yang dipilih.

**Error umum** — `ExceededSlippage`, `SqrtPriceLimitOverflow`, `TickArrayNotFound`, `LiquidityInsufficient`.

**Yang dilakukan `SwapV2` secara internal yang perlu diketahui pemanggil** (rilis pasca-2025):

1. **Surcharge dynamic fee** — jika `pool.dynamic_fee_info` bukan nol, program memperbarui akumulator volatilitas menggunakan jarak tick yang dilalui sejak swap terakhir (dengan aturan filter/peluruhan dari [`products/clmm/fees`](/id/products/clmm/fees)) dan menambahkan `dynamic_fee_component` di atas `AmmConfig.trade_fee_rate`. Total fee dibatasi pada 10% (`MAX_FEE_RATE_NUMERATOR / 1_000_000`).
2. **Pencocokan limit order** — saat perjalanan harga melintasi tick yang memiliki limit order terbuka, program pertama-tama mengisi likuiditas limit order yang tersedia pada tick tersebut (FIFO berdasarkan `order_phase`), lalu melanjutkan sepanjang kurva likuiditas LP. Jumlah yang terisi memperbarui `tick.unfilled_ratio_x64` dan `tick.part_filled_orders_remaining` untuk penyelesaian selanjutnya; order itu sendiri tetap tidak terselesaikan hingga pemiliknya memanggil `SettleLimitOrder`.
3. **Routing fee satu sisi** — saat `pool.fee_on = Token0Only` atau `Token1Only`, langkah swap tetap menghitung pertukaran input-output yang sama; fee kemudian diarahkan ke sisi yang dikonfigurasi. Untuk arah di mana sisi fee yang dikonfigurasi adalah output, fee dikurangi dari output swap (pengguna menerima `out − fee`); untuk arah di mana sisi fee adalah input, perilakunya sama dengan `FromInput`. Lihat `is_fee_on_input(zero_for_one)` dan `is_fee_on_token0(zero_for_one)` pada `PoolState`.

`Swap` (V1) mengimplementasikan dynamic fee, routing fee satu sisi, dan pencocokan limit order yang sama dengan `SwapV2`; satu-satunya fitur yang tidak dimilikinya adalah dukungan Token-2022 — kedua vault harus berupa SPL Token klasik. Pool dengan mint Token-2022 harus di-swap melalui `SwapV2`. Agregator dan SDK sudah lebih memilih V2 untuk setiap leg CLMM sehingga pemanggil tidak perlu memilah berdasarkan jenis mint.

## `OpenLimitOrder`

Menempatkan sell order pada tick tertentu. Order tersebut berada dalam antrian FIFO per-tick dan terisi saat harga melewatinya.

**Argumen**

```
nonce_index:    u8       // indeks akun nonce yang dipilih pengguna (0..255 per wallet)
zero_for_one:   bool     // true: jual token0 untuk token1; false: jual token1 untuk token0
tick_index:     i32      // harus merupakan kelipatan dari pool.tick_spacing
amount:         u64      // jumlah token input
```

**Akun (ringkasan)**

| #  | Nama                     | W | S | Catatan                                                                                |
| -- | ------------------------ | - | - | -------------------------------------------------------------------------------------- |
| 1  | `payer`                  | W | S | Pemilik order; membayar rent.                                                          |
| 2  | `pool_state`             | W |   |                                                                                        |
| 3  | `tick_array`             | W |   | Tick array yang mengandung `tick_index`.                                               |
| 4  | `limit_order_nonce`      | W |   | PDA. `init_if_needed` — dibuat saat order pertama pengguna di bawah `nonce_index` ini. |
| 5  | `limit_order`            | W |   | PDA. `init` di sini.                                                                   |
| 6  | `input_token_account`    | W |   | ATA input pengguna.                                                                    |
| 7  | `input_vault`            | W |   | Vault input pool.                                                                      |
| 8  | `input_vault_mint`       |   |   | Penanganan fee Token-2022.                                                             |
| 9  | `input_token_program`    |   |   | SPL atau Token-2022.                                                                   |
| 10 | `system_program`, `rent` |   |   |                                                                                        |

**Prasyarat**

* `tick_index % pool.tick_spacing == 0` dan berada dalam rentang `[MIN_TICK, MAX_TICK]`.
* `tick_index` berada di **sisi kanan `pool.tick_current`** untuk arah yang dipilih (menjual token0 → tick harus di atas tick saat ini, dan sebaliknya). Menjual pada tick yang sudah dilewati akan langsung dicocokkan dan ditolak.
* `pool_state.status` mengizinkan operasi limit order (bit 5).

**Hasil setelah eksekusi**

* `limit_order` ada, mengambil snapshot `tick.order_phase` dan `tick.unfilled_ratio_x64` saat dibuka.
* `tick.orders_amount += amount` (dalam kohort saat ini).
* `limit_order_nonce.order_nonce += 1`.
* Event `OpenLimitOrderEvent` dipancarkan.

**Error umum** — `InvalidLimitOrderAmount` (nol atau di bawah minimum pool), `InvalidTickIndex` (di luar `[MIN_TICK, MAX_TICK]`, atau di sisi yang salah dari `tick_current` untuk arah yang dipilih), `TickAndSpacingNotMatch` (`tick_index % pool.tick_spacing != 0`), `OrderPhaseSaturated`.

## `IncreaseLimitOrder`

Menambah jumlah order yang sudah terbuka. Hanya dapat dipanggil oleh `owner` order.

**Argumen**

```
amount: u64    // jumlah token input tambahan
```

**Akun** — seperti `OpenLimitOrder` tanpa akun nonce; PDA `limit_order` diteruskan langsung.

**Prasyarat**

* `limit_order.owner == signer`.
* Order masih berada dalam kohort yang sama (`tick.order_phase == limit_order.order_phase`). Jika kohort sudah mulai terisi, order tersebut sebagian diselesaikan — pemanggil sebaiknya memanggil `DecreaseLimitOrder` atau `SettleLimitOrder` terlebih dahulu untuk maju ke depan.

**Efek**

* Mentransfer `amount` dari ATA pemilik ke `input_vault`.
* `limit_order.total_amount += amount`; `tick.orders_amount += amount`.

## `DecreaseLimitOrder`

Mengurangi atau sepenuhnya membatalkan order yang terbuka. Membayarkan sisa yang belum terisi ke pemilik, beserta output yang sudah diselesaikan dari pengisian parsial sebelumnya.

**Argumen**

```
amount:     u64    // jumlah token input yang ditarik (maks = sisa yang belum terisi)
amount_min: u64    // batas slippage minimum pada penarikan sisi input
```

**Akun** — mencakup kedua sisi token input dan output:

| #  | Nama                                    | 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`   |   |   |

**Efek**

* Menghitung ulang jumlah yang terisi dari `unfilled_ratio_x64` kohort sejak dibuka.
* Mengirim output yang terisi ke `output_token_account`.
* Mengirim `amount` dari input yang belum terisi kembali ke `input_token_account`.
* Memperbarui `limit_order` sesuai. Jika sisa yang belum terisi yang baru adalah nol, program menutup akun dan mengembalikan rent ke `owner`.

## `SettleLimitOrder`

Mendorong token output yang sudah terisi ke pemilik tanpa mengubah sisa input order yang belum terisi. Berguna ketika keeper `auto_withdraw` ingin membayar pengisian parsial yang berjalan lama secara bertahap.

**Pemanggil** — baik `owner` order, maupun `limit_order_admin` program (hot wallet operasional off-chain yang menjalankan loop keeper otomatis). Keeper tidak memiliki otoritas lain — ia tidak dapat memindahkan dana pengguna selain mendorong output yang terisi ke ATA `owner` order.

**Akun**

| # | Nama                   | W | S |                                    |
| - | ---------------------- | - | - | ---------------------------------- |
| 1 | `signer`               |   | S | pemilik *atau* `limit_order_admin` |
| 2 | `pool_state`           |   |   |                                    |
| 3 | `tick_array`           |   |   |                                    |
| 4 | `limit_order`          | W |   |                                    |
| 5 | `output_token_account` | W |   | ATA output pemilik.                |
| 6 | `output_vault`         | W |   | Vault output pool.                 |
| 7 | `output_vault_mint`    |   |   |                                    |
| 8 | `output_token_program` |   |   |                                    |

**Efek**

* Menghitung output kumulatif yang terutang menggunakan `(limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64)`.
* Mentransfer selisihnya ke `output_token_account`.
* Memperbarui `limit_order.settled_output`.
* **Tidak** menutup order; order masih terbuka terhadap input yang tersisa.

## `CloseLimitOrder`

Menutup akun order yang sudah sepenuhnya dikonsumsi. Rent selalu dikembalikan ke `limit_order.owner` terlepas dari siapa yang menandatangani.

**Pemanggil** — baik `owner` maupun `limit_order_admin`.

**Prasyarat**

* Order memiliki sisa yang belum terisi sebesar nol (baik `amount == total_amount` sudah terisi dan diselesaikan, atau pemilik sebelumnya mengurangi order ke nol dan lupa menutupnya).

**Efek**

* Menutup `limit_order`; rent dikirimkan ke `limit_order.owner`.

## `CreateDynamicFeeConfig` (admin)

Membuat kumpulan parameter yang dapat digunakan ulang di bawah indeks u16.

**Argumen**

```
index:                       u16
filter_period:               u16   // detik; mis. 30
decay_period:                u16   // detik; mis. 600. Harus > filter_period
reduction_factor:            u16   // 1..10_000; mis. 5_000 = retensi 50% per jendela peluruhan
dynamic_fee_control:         u32   // 1..100_000; gain pada kurva volatilitas-ke-fee
max_volatility_accumulator:  u32   // batas atas
```

**Akun**

| # | Nama                 | W | S | Catatan                               |
| - | -------------------- | - | - | ------------------------------------- |
| 1 | `owner`              | W | S | Pubkey admin yang dikodekan langsung. |
| 2 | `dynamic_fee_config` | W |   | PDA, `init` di sini.                  |
| 3 | `system_program`     |   |   |                                       |

**Error umum** — `InvalidDynamicFeeConfigParams` jika `decay_period <= filter_period` atau kolom bernilai 0 di luar batas.

## `UpdateDynamicFeeConfig` (admin)

Mengubah `DynamicFeeConfig` yang sudah ada. Pool yang telah mengambil snapshot config ini saat dibuat **tidak** diperbarui secara retroaktif; hanya pool yang baru dibuat dan merujuk config ini yang akan mengambil nilai baru.

**Argumen** — lima kolom kalibrasi yang sama dengan `CreateDynamicFeeConfig` (`filter_period`, `decay_period`, `reduction_factor`, `dynamic_fee_control`, `max_volatility_accumulator`); `index` ditetapkan saat pembuatan dan tidak diteruskan ulang di sini.

## `CollectProtocolFee` / `CollectFundFee`

Bentuknya identik dengan `CollectProtocolFee` / `CollectFundFee` pada CPMM. Penandatangan harus cocok dengan `AmmConfig.owner` / `AmmConfig.fund_owner`. Menyapu protocol/fund fee yang terkumpul dari vault pool ke penerima, menolkan kolom `PoolState.protocol_fees_*` / `fund_fees_*` yang sesuai.

## `InitializeReward`

Menambahkan aliran reward baru ke pool. Maksimal 3 aliran dapat aktif sekaligus.

**Argumen**

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

**Akun**

| # | Nama                     | W | S |                                                           |
| - | ------------------------ | - | - | --------------------------------------------------------- |
| 1 | `reward_funder`          | W | S |                                                           |
| 2 | `funder_token_account`   | W |   |                                                           |
| 3 | `amm_config`             |   |   |                                                           |
| 4 | `pool_state`             | W |   |                                                           |
| 5 | `operation_state`        |   |   | PDA operation-state CLMM yang membatasi pembuatan reward. |
| 6 | `reward_token_mint`      |   |   |                                                           |
| 7 | `reward_token_vault`     | W |   | `init` di sini.                                           |
| 8 | `reward_token_program`   |   |   |                                                           |
| 9 | `system_program`, `rent` |   |   |                                                           |

**Prasyarat**

* Kurang dari 3 aliran yang saat ini aktif pada pool.
* Funder menyetor `total_emission = emissions_per_second × (end_time − open_time)` token reward ke vault sebagai bagian dari instruksi ini.
* Mint reward diizinkan oleh `operation_state`.

## `SetRewardParams`

Memperpanjang, mengisi ulang, atau mengubah laju emisi pada aliran reward yang sudah ada. Biasanya dipanggil oleh pembuat pool atau Raydium multisig. Batasan tersimpan di on-chain: Anda umumnya dapat memperpanjang `end_time` atau meningkatkan emisi, tetapi tidak dapat menguranginya secara retroaktif. Periksa daftar pemilik `operation_state`.

## `UpdateRewardInfos`

Hanya pembukuan — menyelesaikan `reward_growth_global_x64` hingga waktu saat ini dengan mengalikan `emissions_per_second × Δt / liquidity`. Dipanggil secara internal oleh setiap instruksi yang menyentuh likuiditas. Diekspos sebagai instruksi mandiri karena aktor eksternal (UI, crank) terkadang ingin memicunya.

## `CollectReward`

Pemilik posisi mengklaim token reward yang terutang.

**Akun**

| # | Nama                      | W | S |                                        |
| - | ------------------------- | - | - | -------------------------------------- |
| 1 | `nft_owner`               |   | S |                                        |
| 2 | `nft_account`             |   |   | ATA pemilik yang menyimpan NFT posisi. |
| 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`      |   |   |                                        |

**Efek**

* Menyelesaikan pertumbuhan reward (pola yang sama dengan fee).
* Mentransfer jumlah yang terutang ke ATA penerima, menolkan `reward_amount_owed[i]`.

## Matriks perubahan state

| Instruksi                | `pool.liquidity`     | `pool.fee_growth_global` | `pool.reward_growth_global` | `personal_position.liquidity` | Tick array                                          |
| ------------------------ | -------------------- | ------------------------ | --------------------------- | ----------------------------- | --------------------------------------------------- |
| `CreatePool`             | 0                    | 0                        | —                           | —                             | —                                                   |
| `OpenPosition`           | + jika dalam rentang | —                        | —                           | baru                          | tambah liquidity\_gross/net                         |
| `IncreaseLiquidity`      | + jika dalam rentang | selesaikan yang terutang | selesaikan yang terutang    | +                             | sesuaikan                                           |
| `DecreaseLiquidity`      | − jika dalam rentang | selesaikan yang terutang | selesaikan yang terutang    | −                             | sesuaikan                                           |
| `ClosePosition`          | —                    | —                        | —                           | dihapus                       | —                                                   |
| `SwapV2`                 | ± saat melintasi     | +                        | —                           | —                             | lintas & balik outside; cocokkan kohort limit order |
| `OpenLimitOrder`         | —                    | —                        | —                           | —                             | `orders_amount += amount` pada tick target          |
| `IncreaseLimitOrder`     | —                    | —                        | —                           | —                             | `orders_amount += amount`                           |
| `DecreaseLimitOrder`     | —                    | —                        | —                           | —                             | `orders_amount -=`, mungkin menutup kohort          |
| `SettleLimitOrder`       | —                    | —                        | —                           | —                             | — (hanya baca pada tick)                            |
| `CloseLimitOrder`        | —                    | —                        | —                           | —                             | —                                                   |
| `CreateCustomizablePool` | 0                    | 0                        | —                           | —                             | —                                                   |
| `UpdateRewardInfos`      | —                    | —                        | +                           | —                             | —                                                   |
| `CollectReward`          | —                    | —                        | selesaikan yang terutang    | —                             | —                                                   |

## Langkah selanjutnya

* [`products/clmm/code-demos`](/id/products/clmm/code-demos) — contoh TypeScript yang dapat dijalankan.
* [`products/clmm/fees`](/id/products/clmm/fees) — detail tentang akrual fee dan reward.
* [`reference/error-codes`](/id/reference/error-codes) — tabel error Anchor CLMM lengkap.

Sumber:

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