Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
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. |
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
| # | 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_mintberdasarkan urutan byte). - Tidak ada mint yang menggunakan ekstensi di luar daftar izin CPMM (
TransferFeeConfig,MetadataPointer,TokenMetadata,InterestBearingConfig,ScaledUiAmount) — lihatproducts/cpmm/accounts. Daftar izin kecil per-mint di dalam program memotong pemeriksaan untuk onboarding kasus demi kasus. creatormemiliki setidaknyainit_amount_0daninit_amount_1di ATA masing-masing.amm_config.disable_create_pool == false.
pool_stateada denganlp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP.- Pemula LP sebesar
LOCKED_LP(100lamport token LP) terkunci secara permanen di pool —pool_state.lp_supplymencatatliquidity − 100sementara100unit LP tetap di luar peredaran, mencegah pool sepenuhnya dikuras dan pembagian dengan nol. observation_statediinisialisasi;observation_index = 0danpool_id = pool_state.key().create_pool_feelamport 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 = falsedancreator_fee_on = BothToken.Initializetidak mendukung pengaktifan biaya pembuat — jalur itu adalahInitializeWithPermission.open_timeditingkatkan keblock_timestamp + 1jika pemanggil melewatkan nilai<= block_timestamp. Swap ditolak sebelumopen_time; deposit dan penarikan bekerja segera.
reference/error-codes)
InvalidInput— mint tidak diurutkan, atau mint identik.NotSupportMint— ekstensi Token-2022 diblokir.ExceededSlippage— jarang; jikainit_amount_0/1menghasilkan LP nol karena ketidakcocokan desimal.
Deposit
Tambahkan likuiditas dalam kedua token sebanding dengan pool.
Argumen
| # | 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 |
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).
ExceededSlippage, ZeroTradingTokens, InvalidStatus jika deposit dijeda.
Withdraw
Bakar token LP dan terima kedua token dasar secara pro-rata.
Argumen
| # | 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 |
Deposit; lp_mint dapat ditulis karena token LP dibakar.)
Matematika
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
| # | 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 |
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_statusmemungkinkan swap.- Tidak ada mint dijeda atau dibekukan untuk otoritas ini.
amount_in > 0.
ExceededSlippage—amount_out < minimum_amount_out.ZeroTradingTokens— perdagangan dibulatkan menjadi nol.NotApproved— pool dijeda untuk swap melaluiUpdatePoolStatus.InvalidInput— mint tidak cocok dengan salah satu mint vault pool.
SwapBaseOutput
Swap output-tepat.
Argumen
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 |
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. |
| # | Nama | W | S | |
|---|---|---|---|---|
| 1 | authority | S | Harus cocok dengan kunci admin pada program CPMM. | |
| 2 | pool_state | W |
security/admin-and-multisig.
CreateAmmConfig
Buat tingkat biaya baru.
Argumen
| # | Nama | W | S | |
|---|---|---|---|---|
| 1 | owner | W | S | Admin. |
| 2 | amm_config | W | Di-init di sini. | |
| 3 | system_program |
- Tidak ada
AmmConfigyang ada denganindexyang 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_rateparam = 1→protocol_fee_rateparam = 2→fund_fee_rateparam = 3→new_protocol_owner(lewatkan bytePubkeysebagai reinterpret)param = 4→new_fund_ownerparam = 5→create_pool_feeparam = 6→disable_create_pool
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— sampel TypeScript yang dapat dijalankan untuk di atas.reference/error-codes— tabel error Anchor lengkap.products/cpmm/fees— model akumulasi biaya yangCollectProtocolFee/CollectFundFee/CollectCreatorFeekosongkan.

