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.
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. 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)
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).
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.
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.
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.
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
Sumber: