> ## 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 argumen, 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>

## Ringkasan instruksi

| Nama diskriminator         | Siapa menandatangani                 | Apa yang dilakukan                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| -------------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Initialize`               | pembuat pool                         | Buat pool CPMM baru dari dua mint dan sebuah `AmmConfig`. Tanpa izin; siapa saja dapat memanggilnya. Mengaturkan `enable_creator_fee = false` pada pool baru. Akun `pool_state` dapat berupa PDA kanonik atau keypair acak baru (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 gerbang (misalnya kelulusan LaunchLab). Memungkinkan pemanggil mengatur `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 dilewatkan secara terpisah, bukan pembayar. Fleksibilitas PDA-kanonik-atau-keypair-acak yang sama untuk `pool_state` seperti `Initialize`. |
| `Deposit`                  | LP                                   | Tambahkan likuiditas dalam kedua token; terima token LP.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| `Withdraw`                 | LP                                   | Bakar token LP; terima kedua token dasar secara pro-rata.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `SwapBaseInput`            | swapper                              | Swap input-tepat (`amount_in` masuk, ≥ `minimum_amount_out` keluar).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `SwapBaseOutput`           | swapper                              | Swap output-tepat (≤ `maximum_amount_in` masuk, `amount_out` keluar).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `CollectProtocolFee`       | `protocol_owner` (dari `AmmConfig`)  | Bersihkan biaya protokol yang terakumulasi dari vault.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `CollectFundFee`           | `fund_owner` (dari `AmmConfig`)      | Bersihkan biaya dana yang terakumulasi dari vault.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `CollectCreatorFee`        | `pool_creator`                       | Bersihkan biaya pembuat yang terakumulasi (jika biaya pembuat diaktifkan).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| `UpdatePoolStatus`         | `admin`                              | Jeda / lanjutkan operasi spesifik pada pool melalui bitmask.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `UpdateAmmConfig`          | `admin`                              | Ubah tarif biaya atau pemilik protokol/dana pada `AmmConfig`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `CreateAmmConfig`          | `admin`                              | Buat tingkat biaya baru (akun `AmmConfig` baru).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `CreatePermissionPda`      | `admin`                              | Cetak PDA `Permission` yang memungkinkan otoritas spesifik untuk memanggil `InitializeWithPermission`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `ClosePermissionPda`       | `admin`                              | Cabut PDA `Permission` yang sebelumnya dikeluarkan.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |

Bitmask status: setiap `status` pool adalah `u8` dimana 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 rent; dicatat sebagai `pool_state.pool_creator`.                                                                                                                                                                                                                                                                                                                                                                                          |
| 2  | `amm_config`               |   |     | Tingkat biaya yang dipilih.                                                                                                                                                                                                                                                                                                                                                                                                                        |
| 3  | `authority`                |   |     | PDA otoritas global CPMM.                                                                                                                                                                                                                                                                                                                                                                                                                          |
| 4  | `pool_state`               | W | S\* | Di-`init` di sini. **Baik** PDA kanonik `["pool", amm_config, token_0_mint, token_1_mint]` **atau** keypair acak baru — 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`) diturunkan dari `pool_state.key()` juga. |
| 5  | `token_0_mint`             |   |     | Diurutkan: `token_0_mint < token_1_mint`.                                                                                                                                                                                                                                                                                                                                                                                                          |
| 6  | `token_1_mint`             |   |     |                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| 7  | `lp_mint`                  | W |     | Di-`init` 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 |     | Tujuan untuk LP (dibuat jika hilang).                                                                                                                                                                                                                                                                                                                                                                                                              |
| 11 | `token_0_vault`            | W |     | Di-`init` 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 |     | Di-`init` 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` hanya menandatangani pada jalur keypair acak; jalur PDA kanonik berjalan tanpa `pool_state` menandatangani.

**Kondisi awal**

* Mint diurutkan (`token_0_mint < token_1_mint` berdasarkan urutan byte).
* Tidak ada mint yang menggunakan ekstensi di luar daftar izin CPMM (`TransferFeeConfig`, `MetadataPointer`, `TokenMetadata`, `InterestBearingConfig`, `ScaledUiAmount`) — lihat [`products/cpmm/accounts`](/id/products/cpmm/accounts#vaults-and-token-2022). Daftar izin kecil per-mint di dalam program memotong pemeriksaan untuk onboarding kasus demi kasus.
* `creator` memiliki setidaknya `init_amount_0` dan `init_amount_1` di ATA masing-masing.
* `amm_config.disable_create_pool == false`.

**Kondisi akhir**

* `pool_state` ada dengan `lp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP`.
* Pemula LP sebesar `LOCKED_LP` (`100` lamport token LP) terkunci secara permanen di pool — `pool_state.lp_supply` mencatat `liquidity − 100` sementara `100` unit LP tetap di luar peredaran, mencegah pool sepenuhnya dikuras dan pembagian dengan nol.
* `observation_state` diinisialisasi; `observation_index = 0` dan `pool_id = pool_state.key()`.
* `create_pool_fee` lamport ditransfer dari pembuat ke penerima dan disinkronkan sebagai SOL asli (ini adalah ATA wSOL).
* Bitmask status pool adalah `0` (deposit / withdraw / swap semua diaktifkan).
* `enable_creator_fee = false` dan `creator_fee_on = BothToken`. `Initialize` **tidak** mendukung pengaktifan biaya pembuat — 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 diblokir.
* `ExceededSlippage` — jarang; jika `init_amount_0/1` menghasilkan LP nol karena ketidakcocokan desimal.

## `Deposit`

Tambahkan likuiditas dalam kedua token sebanding dengan pool.

**Argumen**

```
lp_token_amount:   u64   // berapa banyak token LP untuk dicetak 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**

```
needed_token_0 = ceil(lp_token_amount * vault_0 / lp_supply)
needed_token_1 = ceil(lp_token_amount * vault_1 / lp_supply)
require(needed_token_0 <= maximum_token_0, "ExceededSlippage")
require(needed_token_1 <= maximum_token_1, "ExceededSlippage")
```

Tidak ada perubahan proporsionalitas `k` — vault dan `lp_supply` skala dengan faktor yang sama.

**Kondisi akhir**

* `lp_supply += lp_token_amount`.
* `vault_0 += needed_token_0` (net dari biaya transfer Token-2022 apa pun pada input).
* `vault_1 += needed_token_1` (net 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 |   |

(Identik dengan `Deposit`; `lp_mint` dapat ditulis karena token LP dibakar.)

**Matematika**

```
out_token_0 = floor(lp_token_amount * vault_0 / lp_supply)
out_token_1 = floor(lp_token_amount * vault_1 / lp_supply)
require(out_token_0 >= minimum_token_0, "ExceededSlippage")
require(out_token_1 >= minimum_token_1, "ExceededSlippage")
```

**Kondisi akhir**

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

## `SwapBaseInput`

Swap input-tepat.

**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 menurut arah pengguna, bukan `token_0 / token_1` kanonik pool. Program menentukan vault mana yang mana dengan mencocokkan mint.

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

**Kondisi awal**

* `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-tepat.

**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`

Bersihkan biaya protokol yang terakumulasi dari vault ke tujuan protokol.

**Argumen** — tidak ada.

**Akun**

| #  | Nama                        | W | S |                                                 |
| -- | --------------------------- | - | - | ----------------------------------------------- |
| 1  | `owner`                     |   | S | Harus cocok dengan `amm_config.protocol_owner`. |
| 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 terakumulasi sudah dikecualikan).

**Error umum** — `NotApproved` jika penandatangan bukan `protocol_owner`.

## `CollectFundFee`

Bentuk yang sama dengan `CollectProtocolFee` tetapi ditandatangani oleh `fund_owner` dan menolak penghitung `fund_fees_*`.

## `CollectCreatorFee`

Bentuk yang sama lagi, ditandatangani oleh `pool_state.pool_creator`. Hanya memancarkan transfer jika pool diinisialisasi dengan tarif biaya pembuat bukan nol.

## `UpdatePoolStatus`

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

| Bit | Bendera             | Efek saat 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 |                                                   |
| - | ------------ | - | - | ------------------------------------------------- |
| 1 | `authority`  |   | S | Harus cocok dengan kunci admin pada program CPMM. |
| 2 | `pool_state` | W |   |                                                   |

Kunci admin adalah otoritas upgrade pada program CPMM — dalam praktik, multisig Raydium. Lihat [`security/admin-and-multisig`](/id/security/admin-and-multisig).

## `CreateAmmConfig`

Buat tingkat biaya baru.

**Argumen**

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

**Akun**

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

**Kondisi awal**

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

## `UpdateAmmConfig`

Ubah tarif biaya atau kepemilikan pada `AmmConfig` yang ada. Mengambil `param: u8` (diskriminator untuk bidang mana yang diperbarui) dan `value: u64`. Semantika nilai per param ada di sumber; umumnya:

* `param = 0` → `trade_fee_rate`
* `param = 1` → `protocol_fee_rate`
* `param = 2` → `fund_fee_rate`
* `param = 3` → `new_protocol_owner` (lewatkan byte `Pubkey` sebagai reinterpret)
* `param = 4` → `new_fund_owner`
* `param = 5` → `create_pool_fee`
* `param = 6` → `disable_create_pool`

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

## Matriks perubahan status

| Instruksi                  | `lp_supply` | Saldo vault              | Bidang biaya terakumulasi                                                   | `observation`             |
| -------------------------- | ----------- | ------------------------ | --------------------------------------------------------------------------- | ------------------------- |
| `Initialize`               | + init LP   | + `init_amount_{0,1}`    | 0                                                                           | init                      |
| `InitializeWithPermission` | + init LP   | + `init_amount_{0,1}`    | 0                                                                           | init                      |
| `Deposit`                  | +           | + both                   | —                                                                           | —                         |
| `Withdraw`                 | −           | − both                   | —                                                                           | —                         |
| `SwapBaseInput`            | —           | + in, − out              | + `trade_fee` dibagi menjadi protokol/dana; + `creator_fee` jika diaktifkan | + (jika interval berlalu) |
| `SwapBaseOutput`           | —           | + in, − out              | + `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`        | —           | − (oleh bucket pembuat)  | `creator_*` → 0                                                             | —                         |
| `UpdatePoolStatus`         | —           | —                        | —                                                                           | —                         |

## 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 akumulasi biaya yang `CollectProtocolFee` / `CollectFundFee` / `CollectCreatorFee` kosongkan.

Sumber:

* [`raydium-io/raydium-cp-swap` — instructions](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)
