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

> Setiap instruksi pada program CPMM, dengan argumennya, daftar akun, kondisi pra/pasca, dan error yang dapat dikembalikan.

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

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

<Info>
  Halaman ini adalah referensi instruksi yang berwenang. Untuk kode yang benar-benar menyusun instruksi ini, lihat [`products/cpmm/code-demos`](/id/products/cpmm/code-demos). Untuk arti kode error lihat [`reference/error-codes`](/id/reference/error-codes).

  Upgrade program 2026-09 membangun kembali CPMM di Anchor 1.0.2 / Solana 3.1.10, menambahkan instruksi admin `CollectExcessLamports`, menghapus daftar putih mint Token-2022 yang dikodekan keras, dan mengubah apa yang ditulis `CreateAmmConfig` ke dalam `protocol_owner` / `fund_owner`. Tidak ada instruksi yang menghadap pengguna yang mengubah akun, argumen atau matematikanya. Lihat [entri changelog 2026-09-09](/id/reference/changelog/2026-09-09-cpmm-anchor-1-and-excess-lamports).
</Info>

<Warning>
  **Kedua instruksi pengumpulan biaya kreator mengubah daftar akun mereka pada 2026-09-19.** `CollectCreatorFee` mendapatkan `creator_fee_share`; `CollectCreatorFeePermissionless` mendapatkan `amm_config` **dan** `creator_fee_share`. Keduanya **ditambahkan di akhir setelah `system_program`**, jadi setiap akun yang sudah diteruskan klien yang ada mempertahankan indeksnya — tetapi akun baru bersifat wajib, sehingga transaksi yang dibangun terhadap tata letak yang lebih lama kekurangan akun dan ditolak dengan `AccountNotEnoughKeys` (`3005`) dari Anchor. Dua instruksi admin — `CreateCreatorFeeShare` dan `CloseCreatorFeeShare` — ditambahkan, dan `UpdateAmmConfig` mengambil `param = 8` yang baru. Lihat [entri changelog 2026-09-19](/id/reference/changelog/2026-09-19-cpmm-creator-fee-protocol-share).
</Warning>

## Ringkasan instruksi

| Nama Discriminator | Siapa yang menandatangani | Apa yang dilakukannya |
| - | - | - |
| `Initialize` | pembuat pool | Buat pool CPMM baru dari dua mint dan `AmmConfig`. Tanpa izin; siapa pun dapat memanggilnya. Mengkodekan `enable_creator_fee = false` pada pool baru. Akun `pool_state` dapat berupa PDA kanonik atau keypair acak segar (lihat akun Initialize). |
| `InitializeWithPermission` | pembayar + pemegang PDA `Permission` | Varian berizin dari `Initialize`. Pemanggil (`payer`) harus memiliki PDA `Permission` yang berasal dari pubkey mereka sendiri. Digunakan oleh platform yang memerlukan pembuatan pool yang terbatas (misalnya kelulusan LaunchLab). Memungkinkan pemanggil untuk menetapkan `creator_fee_on` (`BothToken` / `OnlyToken0` / `OnlyToken1`) dan memaksa `enable_creator_fee = true` pada pool baru. Bidang `creator` pada `pool_state` diatur ke akun `creator` yang diteruskan secara terpisah, bukan pembayar. Fleksibilitas PDA-kanonik-atau-keypair-acak yang sama untuk `pool_state` seperti `Initialize`. |
| `Deposit` | LP | Tambahkan likuiditas di kedua token; terima token LP. |
| `Withdraw` | LP | Bakar token LP; terima kedua token dasar secara pro-rata. |
| `SwapBaseInput` | swapper | Swap input-pasti (`amount_in` masuk, ≥ `minimum_amount_out` keluar). |
| `SwapBaseOutput` | swapper | Swap output-pasti (≤ `maximum_amount_in` masuk, `amount_out` keluar). |
| `CollectProtocolFee` | `protocol_owner` (dari `AmmConfig`) | Kumpulkan biaya protokol yang terkumpul dari vault. |
| `CollectFundFee` | `fund_owner` (dari `AmmConfig`) | Kumpulkan biaya dana yang terkumpul dari vault. |
| `CollectCreatorFee` | `pool_creator` | Kumpulkan biaya kreator yang terkumpul (jika biaya kreator diaktifkan), dikurangi bagian protokol, yang dicatat ke dalam bucket protokol pool. |
| `CollectCreatorFeePermissionless` | pembayar apa pun | Kumpulkan biaya kreator yang terkumpul ke akun token kanonik `pool_creator`, dikurangi bagian protokol yang sama. Pembayar dapat membuat ATA penerima yang hilang tetapi tidak dapat mengalihkan transfer. |
| `UpdatePoolStatus` | `admin` | Jeda / lanjutkan operasi tertentu pada pool melalui bitmask. |
| `UpdateAmmConfig` | `admin` | Ubah tingkat biaya atau pemilik protokol/dana pada `AmmConfig`. |
| `CreateAmmConfig` | `admin` | Buat tingkat biaya baru (akun `AmmConfig` baru). |
| `CreatePermissionPda` | `admin` atau pembuat PDA izin yang didelegasikan | Mint PDA `Permission` yang memungkinkan otoritas tertentu memanggil `InitializeWithPermission`. |
| `ClosePermissionPda` | `admin` atau pembuat PDA izin khusus | Cabut PDA `Permission` yang sebelumnya dikeluarkan. Sejak upgrade 2026-09, otoritas pembuat khusus juga dapat menutup hibah yang dikeluarkannya; sebelumnya hanya admin. |
| `CreateSupportMintAssociated` | `admin` atau pemilik mint dukungan khusus | Daftarkan mint Token-2022 yang sebaliknya akan gagal daftar putih ekstensi, dengan membuat PDA `SupportMintAssociated`-nya. |
| `CloseSupportMintAssociated` | `admin` atau pemilik mint dukungan khusus | Hapus pendaftaran mint. |
| `CollectExcessLamports` | `admin` atau dompet kumpul-lamport khusus | Kumpulkan lamport di atas minimum bebas sewa dari vault, mint LP dan PDA yang dikendalikan CPMM. Ditambahkan 2026-09. |
| `CreateCreatorFeeShare` | `admin` atau pemilik pembagian biaya kreator khusus | Tetapkan bagian protokol khusus dari biaya kreator untuk satu pasangan `(creator, amm_config)`, menimpa `AmmConfig.creator_fee_share_rate`. Ditambahkan 2026-09-19. |
| `CloseCreatorFeeShare` | `admin` atau pemilik pembagian biaya kreator khusus | Hapus penimpaan itu; pasangan kembali ke default konfigurasi. Ditambahkan 2026-09-19. |

Bitmask status: `status` setiap pool adalah `u8` di mana bit 0 = deposit dinonaktifkan, bit 1 = withdraw dinonaktifkan, bit 2 = swap dinonaktifkan (`PoolStatusBitIndex { Deposit, Withdraw, Swap }` dalam program). Bit yang jelas berarti operasi diizinkan; bit yang diatur berarti dijeda. `UpdatePoolStatus` mengambil `u8` mentah dan menimpa nilai yang ada.

Bagian berikutnya membahas masing-masing secara detail. Urutan akun mengikuti IDL CPMM; SDK dan klien Rust di `raydium-cp-swap/programs/cp-swap/src/instructions` cocok dengan urutan ini.

## `Initialize`

Buat pool CPMM baru.

**Argumen**

```
init_amount_0: u64
init_amount_1: u64
open_time:     u64   // Unix timestamp; swap ditolak sebelum ini
```

**Akun** (W = dapat ditulis, S = penandatangan)

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `creator` | W | S | Membayar sewa; dicatat sebagai `pool_state.pool_creator`. |
| 2 | `amm_config` | | | Tingkat biaya yang dipilih. |
| 3 | `authority` | | | PDA otoritas global CPMM. |
| 4 | `pool_state` | W | S\* | `init`ed di sini. **Baik** PDA kanonik `["pool", amm_config, token_0_mint, token_1_mint]` **atau** keypair acak segar — ketika bukan PDA kanonik, program memerlukan `pool_state` untuk menandatangani (`require_eq!(pool_account_info.is_signer, true)`). Jalur keypair acak memungkinkan pembuat menghindari upaya front-running pada PDA kanonik. PDA hilir (`lp_mint`, `vaults`, `observation_state`) berasal dari `pool_state.key()` baik cara. |
| 5 | `token_0_mint` | | | Diurutkan: `token_0_mint < token_1_mint`. |
| 6 | `token_1_mint` | | | |
| 7 | `lp_mint` | W | | `init`ed di sini. Otoritas diatur ke `authority`. |
| 8 | `creator_token_0` | W | | ATA sumber untuk `init_amount_0`. |
| 9 | `creator_token_1` | W | | ATA sumber untuk `init_amount_1`. |
| 10 | `creator_lp_token` | W | | ATA kreator pada `lp_mint`. `init` (bukan `init_if_needed`) — itu tidak boleh sudah ada, yang tidak bisa, karena `lp_mint` dibuat dalam instruksi yang sama ini. |
| 11 | `token_0_vault` | W | | `init`ed di sini. Dimiliki oleh `authority`. |
| 12 | `token_1_vault` | W | | |
| 13 | `create_pool_fee` | W | | ATA tujuan untuk `create_pool_fee` yang dibayar oleh pembuat. |
| 14 | `observation_state` | W | | `init`ed di sini. |
| 15 | `token_program` | | | SPL Token (untuk mint LP). |
| 16 | `token_0_program` | | | SPL Token atau Token-2022. |
| 17 | `token_1_program` | | | SPL Token atau Token-2022. |
| 18 | `associated_token_program` | | | |
| 19 | `system_program` | | | |
| 20 | `rent` | | | |

`*` `pool_state` menandatangani hanya pada jalur keypair acak; jalur PDA kanonik berjalan tanpa `pool_state` menandatangani.

**Kondisi Pra**

* Mint diurutkan (`token_0_mint < token_1_mint` berdasarkan urutan byte).
* Tidak ada mint yang menggunakan ekstensi di luar daftar putih CPMM (`TransferFeeConfig`, `MetadataPointer`, `TokenMetadata`, `InterestBearingConfig`, `ScaledUiAmount`) — lihat [`products/cpmm/accounts`](/id/products/cpmm/accounts#vaults-and-token-2022). Mint yang PDA `SupportMintAssociated`-nya (seed `[b"support_mint", mint]`) ada melewati pemeriksaan ekstensi — **tetapi Anda harus menambahkan PDA itu ke `remaining_accounts`**. Program hanya memindai akun yang Anda teruskan dan tidak pernah memuat PDA itu sendiri, jadi mengandalkan registri tanpa menyediakan akun masih gagal dengan `NotSupportMint` (`6007`). Urutan tidak penting (pencocokan berdasarkan kunci); teruskan satu entri per mint yang memerlukan bypass. Registri itu adalah satu-satunya bypass sejak upgrade 2026-09 menghapus daftar putih empat-mint yang dikodekan keras.
* `creator` memiliki setidaknya `init_amount_0` dan `init_amount_1` di ATA masing-masing.
* `amm_config.disable_create_pool == false`.

**Kondisi Pasca**

* `pool_state.lp_supply = sqrt(init_amount_0 * init_amount_1)` — akar kuadrat **penuh**. Pembuat dimint `lp_supply − 100`; 100 unit dasar terkunci dihitung dalam `lp_supply` tetapi tidak pernah dimint.
* Jadi `lp_mint.supply == pool_state.lp_supply − 100` untuk seumur hidup pool. Semua matematika LP-share (deposit, withdraw) membagi dengan `lp_supply`, jadi gunakan bidang itu dan jangan ganti dengan pasokan mint on-chain. Kembali dengan `InitLpAmountTooLess` jika `sqrt(...) < 100`.
* `observation_state` diinisialisasi; `observation_index = 0` dan `pool_id = pool_state.key()`.
* Lamport `create_pool_fee` ditransfer dari pembuat ke penerima dan disinkronkan sebagai SOL asli (itu adalah ATA wSOL).
* Bitmask status pool adalah `0` (deposit / withdraw / swap semuanya diaktifkan).
* `enable_creator_fee = false` dan `creator_fee_on = BothToken`. `Initialize` **tidak** mendukung pengaktifan biaya kreator — jalur itu adalah `InitializeWithPermission`.
* `open_time` ditingkatkan ke `block_timestamp + 1` jika pemanggil melewatkan nilai `<= block_timestamp`. Swap ditolak sebelum `open_time`; deposit dan penarikan bekerja segera.

**Error Umum** (daftar lengkap di [`reference/error-codes`](/id/reference/error-codes))

* `InvalidInput` — mint tidak diurutkan, atau mint identik.
* `NotSupportMint` — ekstensi Token-2022 yang diblokir.
* `ExceededSlippage` — jarang; jika `init_amount_0/1` menghasilkan LP nol karena ketidakcocokan desimal.

## `Deposit`

Tambahkan likuiditas di kedua token sebanding dengan pool.

**Argumen**

```
lp_token_amount:   u64   // berapa banyak token LP untuk dimint ke LP
maximum_token_0:   u64
maximum_token_1:   u64
```

**Akun**

| # | Nama | W | S |
| - | - | - | - |
| 1 | `owner` | | S |
| 2 | `authority` | | |
| 3 | `pool_state` | W | |
| 4 | `owner_lp_token` | W | |
| 5 | `token_0_account` | W | |
| 6 | `token_1_account` | W | |
| 7 | `token_0_vault` | W | |
| 8 | `token_1_vault` | W | |
| 9 | `token_program` | | |
| 10 | `token_program_2022` | | |
| 11 | `vault_0_mint` | | |
| 12 | `vault_1_mint` | | |
| 13 | `lp_mint` | W | |

**Matematika**

```
total_0 = vault_0 − protocol_fees_0 − fund_fees_0 − creator_fees_0    // sama untuk sisi 1

needed_token_0 = ceil(lp_token_amount * total_0 / lp_supply)
transfer_0     = needed_token_0 + inverse_transfer_fee(needed_token_0) // Token-2022
require(transfer_0 <= maximum_token_0, "ExceededSlippage")             // sama untuk sisi 1
```

Dua detail yang patut diperhatikan: basis pro-rata adalah total vault **yang dikecualikan biaya** (`vault_amount_without_fee`, yaitu saldo mentah dikurangi penghitung protokol, dana dan kreator yang terkumpul), bukan saldo vault mentah; dan batas slippage diperiksa terhadap apa yang benar-benar ditransfer pembayar, *setelah* biaya transfer Token-2022 ditambahkan, bukan terhadap pergerakan vault kotor.

Tidak ada perubahan pada proporsionalitas `k` — kedua total dan `lp_supply` diskalakan dengan faktor yang sama.

**Kondisi Pasca**

* `lp_supply += lp_token_amount`.
* `vault_0 += needed_token_0` (bersih dari biaya transfer Token-2022 apa pun pada input).
* `vault_1 += needed_token_1` (bersih dari biaya transfer Token-2022 apa pun pada input).

**Error Umum** — `ExceededSlippage`, `ZeroTradingTokens`, `InvalidStatus` jika deposit dijeda.

## `Withdraw`

Bakar token LP dan terima kedua token dasar secara pro-rata.

**Argumen**

```
lp_token_amount:   u64
minimum_token_0:   u64
minimum_token_1:   u64
```

**Akun**

| # | Nama | W | S |
| - | - | - | - |
| 1 | `owner` | | S |
| 2 | `authority` | | |
| 3 | `pool_state` | W | |
| 4 | `owner_lp_token` | W | |
| 5 | `token_0_account` | W | |
| 6 | `token_1_account` | W | |
| 7 | `token_0_vault` | W | |
| 8 | `token_1_vault` | W | |
| 9 | `token_program` | | |
| 10 | `token_program_2022` | | |
| 11 | `vault_0_mint` | | |
| 12 | `vault_1_mint` | | |
| 13 | `lp_mint` | W | |
| 14 | `memo_program` | | |

14 akun pertama identik dengan `Deposit`, dan `lp_mint` dapat ditulis karena token LP dibakar. `Withdraw` juga mengambil akun ke-14, `memo_program` (dibatasi `address = memo::ID`) — `Deposit` tidak. `Withdraw` dengan 13 akun gagal deserialisasi Anchor, jadi LP tidak dapat keluar.

**Matematika**

```
total_0 = vault_0 − protocol_fees_0 − fund_fees_0 − creator_fees_0    // sama untuk sisi 1

out_token_0     = min(total_0, floor(lp_token_amount * total_0 / lp_supply))
receive_token_0 = out_token_0 − transfer_fee(out_token_0)             // Token-2022
require(receive_token_0 >= minimum_token_0, "ExceededSlippage")       // sama untuk sisi 1

// Seperti dengan Deposit: basis adalah total vault yang dikecualikan biaya, dan lantai
// diperiksa terhadap apa yang benar-benar diterima LP, setelah biaya transfer.
```

**Kondisi Pasca**

* `lp_supply -= lp_token_amount`.
* Vault mengirim `out_token_0` / `out_token_1` (kotor; pengguna menerima bersih dari biaya transfer Token-2022 apa pun).

## `SwapBaseInput`

Swap input-pasti.

**Argumen**

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

**Akun**

| # | Nama | W | S |
| - | - | - | - |
| 1 | `payer` | | S |
| 2 | `authority` | | |
| 3 | `amm_config` | | |
| 4 | `pool_state` | W | |
| 5 | `input_token_account` | W | |
| 6 | `output_token_account` | W | |
| 7 | `input_vault` | W | |
| 8 | `output_vault` | W | |
| 9 | `input_token_program` | | |
| 10 | `output_token_program` | | |
| 11 | `input_token_mint` | | |
| 12 | `output_token_mint` | | |
| 13 | `observation_state` | W | |

Urutan **input → output** adalah berdasarkan arah pengguna, bukan `token_0 / token_1` kanonik pool. Program mengetahui vault mana yang mana dengan mencocokkan mint.

**Matematika** — lihat [`products/cpmm/math`](/id/products/cpmm/math).

**Kondisi Pra**

* `open_time <= now`.
* `pool_status` memungkinkan swap.
* Tidak ada mint dijeda atau dibekukan untuk otoritas ini.
* `amount_in > 0`.

**Error Umum**

* `ExceededSlippage` — `amount_out < minimum_amount_out`.
* `ZeroTradingTokens` — perdagangan dibulatkan menjadi nol.
* `NotApproved` — pool dijeda untuk swap melalui `UpdatePoolStatus`.
* `InvalidInput` — mint tidak cocok dengan salah satu mint vault pool.

## `SwapBaseOutput`

Swap output-pasti.

**Argumen**

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

**Akun** — sama dengan `SwapBaseInput`.

**Matematika** — kurva terbalik dengan ceiling, lihat [`products/cpmm/math`](/id/products/cpmm/math).

**Error Umum** — `ExceededSlippage` (`gross_in > max_amount_in`), `ZeroTradingTokens`, `InvalidInput`, `NotApproved`.

## `CollectProtocolFee`

Kumpulkan biaya protokol yang terkumpul dari vault ke tujuan protokol.

**Argumen** — tidak ada.

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `owner` | | S | Harus sama dengan `amm_config.protocol_owner` **atau** kunci admin yang dikodekan keras program. |
| 2 | `authority` | | | |
| 3 | `pool_state` | W | | |
| 4 | `amm_config` | | | |
| 5 | `token_0_vault` | W | | |
| 6 | `token_1_vault` | W | | |
| 7 | `vault_0_mint` | | | |
| 8 | `vault_1_mint` | | | |
| 9 | `recipient_token_0_account` | W | | |
| 10 | `recipient_token_1_account` | W | | |
| 11 | `token_program` | | | |
| 12 | `token_program_2022` | | | |

**Efek**

```
transfer pool_state.protocol_fees_token0 from vault_0 to recipient_0
transfer pool_state.protocol_fees_token1 from vault_1 to recipient_1
pool_state.protocol_fees_token0 = 0
pool_state.protocol_fees_token1 = 0
```

Tidak ada perubahan pada saldo efektif kurva (biaya yang terkumpul sudah dikecualikan).

**Error Umum** — `InvalidOwner` (`6001`) jika penandatangan bukan `amm_config.protocol_owner` maupun admin program. (Tidak ada `NotApproved` pada jalur ini.)

## `CollectFundFee`

Bentuk yang sama dengan `CollectProtocolFee` tetapi ditandatangani oleh `amm_config.fund_owner` — atau, sekali lagi, admin program — dan menolkan penghitung `fund_fees_*`. `InvalidOwner` yang sama pada penandatangan yang salah.

## `CollectCreatorFee`

Ditandatangani oleh `pool_state.pool_creator`. Ini menyelesaikan biaya kreator yang terkumpul dan mentransfer bagian kreator ke akun token kreator.

**Argumen** — tidak ada.

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `creator` | W | S | Dibatasi `address = pool_state.pool_creator`. |
| 2 | `authority` | | | PDA otoritas vault global CPMM. |
| 3 | `pool_state` | W | | Menyimpan penghitung biaya kreator yang terkumpul. |
| 4 | `amm_config` | | | Dibatasi `address = pool_state.amm_config`. Membawa `creator_fee_share_rate` default. |
| 5 | `token_0_vault` | W | | Harus cocok dengan vault token 0 pool. |
| 6 | `token_1_vault` | W | | Harus cocok dengan vault token 1 pool. |
| 7 | `vault_0_mint` | | | Harus cocok dengan `token_0_vault.mint`. |
| 8 | `vault_1_mint` | | | Harus cocok dengan `token_1_vault.mint`. |
| 9 | `creator_token_0` | W | | Tujuan untuk bagian kreator dari token 0. |
| 10 | `creator_token_1` | W | | Tujuan untuk bagian kreator dari token 1. |
| 11 | `token_0_program` | | | SPL Token atau Token-2022, cocok dengan token 0. |
| 12 | `token_1_program` | | | SPL Token atau Token-2022, cocok dengan token 1. |
| 13 | `associated_token_program` | | | |
| 14 | `system_program` | | | |
| 15 | `creator_fee_share` | | | **Ditambahkan 2026-09-19**, ditambahkan di akhir setelah `system_program`. PDA di `["creator_fee_share", creator, amm_config]`. Harus diteruskan pada setiap panggilan, tetapi **tidak diperlukan untuk ada** — ketika kosong atau tidak dimiliki oleh CPMM, program kembali ke `amm_config.creator_fee_share_rate`. Batasan seed masih berlaku, jadi alamat harus PDA kanonik. |

**Efek**

```
share_rate = creator_fee_share.share_rate   (jika akun ada)
           | amm_config.creator_fee_share_rate   (sebaliknya)

shared_i  = floor(creator_fees_token_i * share_rate / 1_000_000)
creator_i = creator_fees_token_i - shared_i

transfer creator_i from vault_i to creator_token_i
pool_state.protocol_fees_token_i += shared_i     // tetap di vault
pool_state.creator_fees_token_i   = 0
pool_state.recent_epoch = current epoch
```

Bagian protokol tidak pernah meninggalkan vault di sini — itu dilabel ulang sebagai biaya protokol dan menunggu `CollectProtocolFee`. Kedua penghitung sudah dikecualikan dari pandangan kurva tentang vault, jadi harga pool tidak bergerak. Derivasi lengkap di [`products/cpmm/fees`](/id/products/cpmm/fees#protocol-share-of-the-creator-fee).

**Error Umum** — `NoFeeCollect` ketika kedua penghitung kreator nol (diperiksa sebelum pemisahan), `InvalidInput` (`6003`) jika `share_rate` yang diselesaikan melebihi `1_000_000`, `MathOverflow` (`6011`) jika membukukan bagian akan meluap `protocol_fees_token_*`, dan error `ConstraintSeeds` Anchor jika `creator_fee_share` bukan PDA kanonik.

## `CollectCreatorFeePermissionless`

Siapa pun dapat memicu pengumpulan biaya kreator. Instruksi selalu mengirim bagian kreator ke akun token terkait kanonik yang dimiliki oleh `pool_state.pool_creator`; pemanggil tidak dapat memilih kreator atau tujuan lain. Jika salah satu ATA hilang, pembayar mendanai pembuatannya.

`CollectCreatorFee` asli tetap dapat dipanggil, jadi kreator yang ingin menandatangani untuk pengumpulan mereka sendiri masih bisa.

**Argumen** — tidak ada.

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `payer` | W | S | Penandatangan apa pun; mendanai ATA kreator yang hilang. |
| 2 | `creator` | | | Harus sama dengan `pool_state.pool_creator`; tidak menandatangani. |
| 3 | `authority` | | | PDA otoritas vault global CPMM. |
| 4 | `pool_state` | W | | Menyimpan penghitung biaya kreator yang terkumpul. |
| 5 | `token_0_vault` | W | | Harus cocok dengan vault token 0 pool. |
| 6 | `token_1_vault` | W | | Harus cocok dengan vault token 1 pool. |
| 7 | `vault_0_mint` | | | Harus cocok dengan `token_0_vault.mint`. |
| 8 | `vault_1_mint` | | | Harus cocok dengan `token_1_vault.mint`. |
| 9 | `creator_token_0` | W | | ATA kanonik kreator untuk `vault_0_mint`; dibuat jika hilang. |
| 10 | `creator_token_1` | W | | ATA kanonik kreator untuk `vault_1_mint`; dibuat jika hilang. |
| 11 | `token_0_program` | | | SPL Token atau Token-2022, cocok dengan token 0. |
| 12 | `token_1_program` | | | SPL Token atau Token-2022, cocok dengan token 1. |
| 13 | `associated_token_program` | | | Membuat ATA penerima yang hilang. |
| 14 | `system_program` | | | Mendanai pembuatan akun dari `payer`. |
| 15 | `amm_config` | | | **Ditambahkan 2026-09-19**, ditambahkan di akhir setelah `system_program`. Dibatasi `address = pool_state.amm_config`. |
| 16 | `creator_fee_share` | | | **Ditambahkan 2026-09-19**, ditambahkan paling akhir. PDA yang sama dan aturan keberadaan opsional yang sama seperti pada `CollectCreatorFee`. |

<Warning>
  Dua akun baru **ditambahkan di akhir setelah `system_program`**, bukan disisipkan. Setiap akun dari `payer` hingga `system_program` mempertahankan posisi yang dimilikinya sebelum upgrade, jadi pemutusannya bersih: transaksi yang dibangun terhadap tata letak empat belas akun pra-upgrade tidak salah membaca vault sebagai konfigurasi — ia hanya meneruskan terlalu sedikit akun dan Anchor menolaknya dengan `AccountNotEnoughKeys` (`3005`) sebelum batasan apa pun berjalan. Akun-akun itu tetap wajib, jadi tambahkan keduanya di akhir dan segarkan IDL; tidak ada jalur kompatibilitas untuk tata letak lama.
</Warning>

**Efek** — identik dengan `CollectCreatorFee` di atas: bagian diselesaikan dari `creator_fee_share` atau `amm_config`, bagian protokol dicatat ke dalam `protocol_fees_token_{0,1}`, bagian kreator ditransfer ke ATA kreator, kedua penghitung kreator dinolkan, dan `recent_epoch` diperbarui. Mengembalikan `NoFeeCollect` ketika kedua penghitung nol.

## `UpdatePoolStatus`

Jeda atau lanjutkan operasi individual pada pool. Bidang `status` adalah bitmask:

| Bit | Flag | Efek ketika diatur |
| - | - | - |
| 0 | `DEPOSIT_DISABLED` | `Deposit` menolak dengan `NotApproved`. |
| 1 | `WITHDRAW_DISABLED` | `Withdraw` menolak. |
| 2 | `SWAP_DISABLED` | `SwapBaseInput` / `SwapBaseOutput` menolak. |

**Argumen**

```
status: u8      // bitmask baru
```

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `authority` | | S | Harus cocok dengan kunci admin pada program CPMM. |
| 2 | `pool_state` | W | | |

Kunci admin adalah pubkey yang **dikompilasi ke dalam program** (`crate::admin::ID`), bukan otoritas upgrade BPF — mengubahnya memerlukan upgrade program. Lihat [`reference/program-addresses`](/id/reference/program-addresses) untuk nilainya dan [`security/admin-and-multisig`](/id/security/admin-and-multisig) untuk siapa yang memegangnya.

## `CreateAmmConfig`

Buat tingkat biaya baru.

**Argumen**

```
index:             u16
trade_fee_rate:    u64
protocol_fee_rate: u64
fund_fee_rate:     u64
create_pool_fee:   u64
creator_fee_rate:  u64
```

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `owner` | W | S | Admin. |
| 2 | `amm_config` | W | | `init`ed di sini. |
| 3 | `system_program` | | | |

**Kondisi Pra**

* Tidak ada `AmmConfig` yang ada dengan `index` yang sama.
* `protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE`.

<Note>
  **Berubah pada 2026-09: pemilik biaya konfigurasi baru tidak lagi berasal dari penandatangan.** `create_amm_config` sekarang menulis `protocol_fee_owner::ID` yang dikodekan keras program ke dalam `protocol_owner` dan `fund_fee_owner::ID` ke dalam `fund_owner`, bukan menyalin kunci penandatangan admin ke keduanya. Alamat ada di [`reference/program-addresses`](/id/reference/program-addresses#cpmm-fee-owner-wallets).

  Konsekuensi: biaya pada `AmmConfig` yang baru dibuat mendarat di dompet biaya khusus daripada dompet admin. Admin tetap menjadi penandatangan yang diterima *untuk pengumpulan* — `CollectProtocolFee` / `CollectFundFee` menerima `amm_config.protocol_owner` / `fund_owner` **atau** `crate::admin::ID` — jadi tidak ada yang harus dirotasi untuk menyapu; apa yang berubah hanya di mana hasilnya pergi secara default. **Akun `AmmConfig` yang ada tidak ditulis ulang** — apa pun yang disimpan di atasnya masih mengatur, jadi selalu baca `protocol_owner` / `fund_owner` dari akun bukan mengasumsikan nilai apa pun. Parameter `UpdateAmmConfig` `3` dan `4` masih merotasinya.
</Note>

## `UpdateAmmConfig`

Ubah tingkat biaya atau kepemilikan pada `AmmConfig` yang ada. Mengambil `param: u8` (bidang mana yang diperbarui) dan `value: u64`. Tabel pengiriman lengkap:

* `param = 0` → `trade_fee_rate` (menegaskan `trade_fee_rate + creator_fee_rate < 1_000_000`)
* `param = 1` → `protocol_fee_rate` (menegaskan `≤ 1_000_000` dan `+ fund_fee_rate ≤ 1_000_000`)
* `param = 2` → `fund_fee_rate` (menegaskan `≤ 1_000_000` dan `+ protocol_fee_rate ≤ 1_000_000`)
* `param = 3` → `protocol_owner`. Kunci baru **bukan** dalam `value`: tambahkan sebagai `remaining_accounts[0]` (read-only tidak apa-apa). Itu tidak boleh menjadi pubkey default, dan menghilangkan akun panik pada `unwrap()`.
* `param = 4` → `fund_owner`. Mekanisme yang sama seperti `3`.
* `param = 5` → `create_pool_fee`
* `param = 6` → `disable_create_pool` (nilai non-nol apa pun menonaktifkan)
* `param = 7` → `creator_fee_rate` (menegaskan `creator_fee_rate + trade_fee_rate < 1_000_000`)
* `param = 8` → `creator_fee_share_rate` (menegaskan `≤ 1_000_000`). Ditambahkan 2026-09-19. Bagian default protokol **dari biaya kreator** pada tingkat ini; lihat [`products/cpmm/fees`](/id/products/cpmm/fees#protocol-share-of-the-creator-fee). Itu tidak terkait dengan `protocol_fee_rate`, yang membagi biaya perdagangan.

`param` apa pun yang lain mengembalikan `InvalidInput`.

Perubahan ditandatangani oleh admin dan mempengaruhi **setiap pool yang terikat pada `AmmConfig` ini** pada swap berikutnya. Tidak ada migrasi; pool hanya membaca nilai baru.

## `CreateCreatorFeeShare`

Tetapkan bagian protokol khusus dari biaya kreator untuk satu pasangan `(creator, amm_config)`, menimpa `AmmConfig.creator_fee_share_rate` untuk setiap pool yang dimiliki kreator itu pada tingkat biaya itu. Ditambahkan dalam upgrade pembagian biaya kreator 2026-09-19.

**Argumen**

```
share_rate: u64   // bagian protokol DARI biaya kreator, atas FEE_RATE_DENOMINATOR = 1_000_000
```

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `owner` | W | S | Harus menjadi admin program CPMM **atau** pemilik pembagian biaya kreator khusus — lihat [`reference/program-addresses`](/id/reference/program-addresses#cpmm-creator-fee-share-authority). Penandatangan lain gagal dengan `InvalidOwner` (`6001`). Membayar sewa. |
| 2 | `creator` | | | Pembuat pool yang tingkat berlaku. Tidak diperiksa — itu tidak harus menjadi pembuat pool yang ada, dan itu tidak menandatangani. |
| 3 | `amm_config` | | | Tingkat biaya yang berlaku. |
| 4 | `creator_fee_share` | W | | `init`ed di sini di `["creator_fee_share", creator, amm_config]`, `space = 145`. |
| 5 | `system_program` | | | |

**Kondisi Pra**

* `share_rate <= 1_000_000`, sebaliknya `InvalidInput` (`6003`).
* PDA tidak boleh sudah ada — `init` Anchor gagal pada panggilan kedua untuk pasangan yang sama. Untuk mengubah tingkat, tutup akun dan buat lagi.

**Kondisi Pasca**

* `creator_fee_share` menyimpan `bump`, `creator`, `amm_config` dan `share_rate`.
* Setiap `CollectCreatorFee` / `CollectCreatorFeePermissionless` berikutnya pada pool yang dibuat oleh `creator` di bawah `amm_config` menyelesaikan bagian dari akun ini bukan konfigurasi.

<Note>
  Pembuat pool bukan pihak dalam instruksi ini dan tidak menandatanganinya. Tingkat dibaca pada waktu pengumpulan, jadi penimpaan yang dibuat setelah biaya sudah terkumpul berlaku untuk saldo yang sudah terkumpul itu juga.
</Note>

## `CloseCreatorFeeShare`

Hapus penimpaan. Pasangan kembali ke `AmmConfig.creator_fee_share_rate`.

**Argumen** — tidak ada.

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `owner` | W | S | Dua penandatangan yang diterima sama seperti `CreateCreatorFeeShare`; menerima sewa. |
| 2 | `creator` | | | Pembuat pool yang tingkat berlaku. |
| 3 | `amm_config` | | | Tingkat biaya yang berlaku. |
| 4 | `creator_fee_share` | W | | Ditutup ke `owner`. Harus PDA kanonik untuk pasangan. |
| 5 | `system_program` | | | |

**Kondisi Pasca**

* Akun ditutup dan lamportnya pergi ke `owner`.
* Pengumpulan untuk pasangan itu menyelesaikan bagian dari `amm_config.creator_fee_share_rate` lagi — yang `0` kecuali admin telah menetapkan parameter `UpdateAmmConfig` `8`.

## `CollectExcessLamports`

Penyapuan admin lamport yang duduk di atas minimum bebas sewa pada akun yang dikendalikan CPMM. Ditambahkan dalam upgrade 2026-09 sehingga protokol dapat mengklaim kelebihan pendanaan yang ditinggalkan [pengurangan sewa SIMD-0437](/id/solana-fundamentals/rent-and-reclaimable-rent) pada akun yang dibuat sebelum setiap langkah.

Hanya kelebihan yang bergerak. Saldo token, data akun, pemilik, status pool dan kurva tidak tersentuh, dan instruksi adalah no-op terhadap akun yang sudah di minimum — jadi aman untuk dijalankan kembali setelah setiap peluncuran langkah.

**Argumen** — tidak ada.

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `collect_lamports_wallet` | W | S | Tujuan untuk setiap lamport yang disapu. Harus menjadi admin program CPMM atau dompet kumpul-lamport khusus — lihat [`reference/program-addresses`](/id/reference/program-addresses#excess-lamports-collection-wallets). Penandatangan lain gagal dengan `InvalidOwner`. |
| 2 | `authority` | | | PDA otoritas vault-dan-mint-LP CPMM di seed `[b"vault_and_lp_mint_auth_seed"]`. Itu menandatangani CPI program token. |
| 3 | `token_program` | | | SPL Token. |
| 4 | `token_program_2022` | | | Token-2022. Keduanya diperlukan tanpa syarat; program memilih per akun sumber. |
| 5.. | `remaining_accounts` | W | | `M` akun sumber untuk disapu, jumlah apa pun, urutan apa pun. |

<Note>
  **Perbaikan urutan, 2026-09-19.** Program sekarang membuat dua lintasan atas `remaining_accounts` — setiap CPI program token terlebih dahulu, kemudian debit langsung PDA yang dikendalikan CPMM. Menyelipnya membatalkan dengan `UnbalancedInstruction` runtime ("jumlah saldo akun sebelum dan sesudah instruksi tidak cocok") kapan pun PDA didebit sebelum CPI, karena perubahan lamport yang tertunda pemanggil hanya disiram ke akun yang CPI benar-benar bawa. Pemanggil tidak harus mengelompokkan atau mengurutkan daftar sendiri.
</Note>

**Bagaimana setiap akun sumber ditangani**

Program mengirim berdasarkan `owner` akun sumber:

| Pemilik akun sumber | Penanganan |
| - | - |
| SPL Token atau Token-2022, akun token non-native atau mint — vault pool dan mint LP | CPI `WithdrawExcessLamports` (diskriminan program token `38`), ditandatangani oleh `authority`. |
| SPL Token atau Token-2022, **native** (wSOL) akun token | `WithdrawExcessLamports` menolak akun native. Program CPI `SyncNative`, mengukur berapa banyak `amount` yang dibungkus tumbuh, `UnwrapLamports` (diskriminan `45`) untuk delta itu persis, kemudian memerlukan saldo yang dibungkus sama dengan nilai pra-sinknya — sebaliknya `LamportsCalculateError` (`6015`). Vault pool sisi SOL oleh karena itu menyimpan likuiditas penuhnya. |
| Program CPMM itu sendiri — `PoolState`, `AmmConfig`, `ObservationState`, `Permission`, `SupportMintAssociated` | Program mendebit akun langsung ke `rent.minimum_balance(data_len)`. |
| Apa pun yang lain | **Dilewati diam-diam.** Tidak ada error, tidak ada lamport yang bergerak. |

Karena mengambil daftar `remaining_accounts` yang tidak terbatas, ukuran transaksi adalah batas nyata — batasan yang sama seperti penyapuan sisi dompet yang dijelaskan di [`solana-fundamentals/rent-and-reclaimable-rent`](/id/solana-fundamentals/rent-and-reclaimable-rent#batching-how-many-fit-in-one-transaction).

**Error Umum** — `InvalidOwner` (`6001`, penandatangan salah), `LamportsCalculateError` (`6015`, putaran wSOL tidak nol bersih), dan `InsufficientFunds` dari jalur yang dimiliki program ketika akun menyimpan kurang dari minimum sewa sendirinya.

**Tidak ada pembangun SDK.** `@raydium-io/raydium-sdk-v2` tidak mengirim pembangun untuk instruksi ini, dan begitu juga repo `raydium-sdk-V2-demo` — itu adalah jalur admin. Enkode dengan tangan, cara penyapuan sisi dompet di [`solana-fundamentals/rent-and-reclaimable-rent`](/id/solana-fundamentals/rent-and-reclaimable-rent#building-the-instruction) lakukan untuk instruksi program token.

## Matriks perubahan status

| Instruksi | `lp_supply` | Saldo vault | Bidang biaya yang terkumpul | `observation` |
| - | - | - | - | - |
| `Initialize` | + init LP | + `init_amount_{0,1}` | 0 | init |
| `InitializeWithPermission` | + init LP | + `init_amount_{0,1}` | 0 | init |
| `Deposit` | + | + kedua | — | — |
| `Withdraw` | − | − kedua | — | — |
| `SwapBaseInput` | — | + masuk, − keluar | + `trade_fee` dibagi menjadi protokol/dana; + `creator_fee` jika diaktifkan | + (jika interval berlalu) |
| `SwapBaseOutput` | — | + masuk, − keluar | + `trade_fee` dibagi menjadi protokol/dana; + `creator_fee` jika diaktifkan | + (jika interval berlalu) |
| `CollectProtocolFee` | — | − (oleh bucket protokol) | `protocol_*` → 0 | — |
| `CollectFundFee` | — | − (oleh bucket dana) | `fund_*` → 0 | — |
| `CollectCreatorFee` | — | − (hanya oleh bagian kreator) | `creator_*` → 0; `protocol_*` += bagian yang dibagikan | — |
| `CollectCreatorFeePermissionless` | — | − (hanya oleh bagian kreator) | `creator_*` → 0; `protocol_*` += bagian yang dibagikan | — |
| `UpdatePoolStatus` | — | — | — | — |
| `CreateCreatorFeeShare` | — | — | — | — |
| `CloseCreatorFeeShare` | — | — | — | — |
| `CollectExcessLamports` | — | — (saldo token tidak berubah) | — | — |

## Ke mana selanjutnya

* [`products/cpmm/code-demos`](/id/products/cpmm/code-demos) — sampel TypeScript yang dapat dijalankan untuk di atas.
* [`reference/error-codes`](/id/reference/error-codes) — tabel error Anchor lengkap.
* [`products/cpmm/fees`](/id/products/cpmm/fees) — model akrual biaya yang dikeringkan instruksi `Collect*Fee`.

Sumber:

* [`raydium-io/raydium-cp-swap` — instruksi](https://github.com/raydium-io/raydium-cp-swap/tree/master/programs/cp-swap/src/instructions)
* [Raydium SDK v2 — `@raydium-io/raydium-sdk-v2`](https://github.com/raydium-io/raydium-sdk-V2)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.