Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
ID program dan seed PDA untuk CPMM tercantum secara kanonik di
reference/program-addresses. Halaman ini berfokus pada apa fungsi setiap akun dan invariant yang dipertahankannya, bukan alamat yang dikodekan keras.Enam akun dari pool CPMM
Setiap pool CPMM sepenuhnya dijelaskan oleh enam alamat yang diturunkan dari program (PDA) di bawah program CPMM, ditambah satu akunAmmConfig bersama yang dirujuknya. Setelah Anda memiliki dua mint, Anda dapat menurunkan semuanya secara deterministik tanpa menyentuh jaringan.
Dan konfigurasi bersama:
Dan satu akun opsional per pembuat:
Menurunkan pool dari tidak ada selain dua mint
ID pool tidak selalu PDA kanonik.
Initialize menerima keypair penandatangan arbitrer sebagai pool_state selain PDA di atas. Jika akun yang dilewatkan tidak cocok dengan PDA kanonik, program memerlukan itu menjadi penandatangan — yaitu, pembuat melewatkan keypair segar yang mereka tandatangani. Ini adalah pertahanan front-run: pihak ketiga mana pun yang berlomba untuk merebut PDA kanonik dapat dihindari oleh pembuat yang sah menggunakan keypair acak sebagai gantinya. PDA hilir (lpMint, vault0, vault1, observation) masih diturunkan dari poolState.key(), jadi mereka tetap unik untuk alamat mana pun yang digunakan. Ketika Anda mengindeks pool, selalu temukan ID pool dari state on-chain (misalnya, akun PoolState di bawah program CPMM), bukan dengan menurunkan PDA kanonik — yang terakhir akan melewatkan pool dengan keypair acak.Tata letak akun
Definisi Rust lengkap berada di sumberraydium-cp-swap. Bidang di bawah adalah yang akan Anda baca dari integrasi.
PoolState
lp_supply— total LP internal pool. Ini tidak sama dengan pasokan LP mint: ini tepat 100 unit dasar lebih tinggi, karena 100 unit terkunci dihitung di sini tetapi tidak pernah dimint. Semua matematika LP-share (deposit, withdraw) membagi denganlp_supply, jadi gunakan bidang ini dan jangan ganti dengan pasokan on-chain mint.protocol_fees_token{0,1},fund_fees_token{0,1}— biaya yang terakrual belum disapu. Ini tidak mempengaruhi harga swap; mereka duduk di vault sampaiCollectProtocolFee/CollectFundFeedipanggil.protocol_fees_token{0,1}juga menerima bagian protokol dari biaya pembuat ketika biaya pembuat dikumpulkan, jadi ia tumbuh di luar swap — lihatproducts/cpmm/fees.status— bitmask yang mengontrol apakahSwap,Deposit,Withdrawdiizinkan. Diperbarui oleh admin melaluiUpdatePoolStatus. SDK memeriksa ini sebelum membangun transaksi; jika Anda melakukan CPI secara langsung, periksa sendiri.token0_program/token1_program— program token untuk CPI ke dalam untuk setiap vault. Satu dapat berupa SPL Token klasik dan yang lain Token-2022; mereka independen.open_time— timestamp Unix. Swap sebelum waktu ini gagal. Deposit diizinkan sebelumopen_timesehingga pool dapat disemai.creator_fee_on/enable_creator_fee— bersama-sama mengontrol apakah biaya pembuat opsional aktif untuk pool ini dan sisi swap mana biaya dikumpulkan.enable_creator_fee == falsemenghilangkan jalur biaya pembuat sepenuhnya. Ketika diaktifkan,creator_fee_onmemilih:0= ambil biaya dari token mana pun yang merupakan input swap (BothToken);1= ambil biaya daritoken_0saja (lewati pada swaptoken_1 → token_0);2= ambil biaya daritoken_1saja. Diatur saat pembuatan pool melaluiInitializeWithPermission; tidak dapat berubah kemudian.creator_fees_token_{0,1}— biaya pembuat yang terakrual, disapu olehCollectCreatorFeeatauCollectCreatorFeePermissionless. Kedua jalur menghilangkan penghitung penuh, tetapi sejak upgrade creator-fee-share 2026-09-13 hanya sebagian dari saldo yang meninggalkan pool: bagian protokol ditambahkan keprotocol_fees_token_{0,1}dan sisanya ditransfer ke pembuat. Jalur tanpa izin memperbaiki penerima ke ATA kanonikpool_creator.PoolStateitu sendiri tidak berubah — tidak ada penghitung terpisah untuk jumlah yang dibagikan.
AmmConfig
trade_fee_ratedancreator_fee_rateadalah fraksi dari volume, keduanya dinyatakan dalam satuan1/1_000_000.2500berarti 0.25% dari volume perdagangan.protocol_fee_ratedanfund_fee_rateadalah fraksi dari biaya perdagangan (bukan dari volume), dalam penyebut1/1_000_000yang sama. Biaya pembuat bukan fraksi dari biaya perdagangan — ini adalah tingkat independen sendiri. Aritmatika lengkap ada diproducts/cpmm/fees.indexadalahu16, jadi seed hash menggunakan 2 byte big-endian. Off-by-one pada urutan byte adalah bug integrasi umum.AmmConfigtidak dapat diubah di tingkat pool. Pool menunjuk ke satuAmmConfigsaat pembuatan dan tidak pernah beralih. Perubahan biaya menyebar karena pool membaca konfigurasi setiap swap — tetapi pool tidak dapat dipindahkan antar tingkat biaya.
creator_fee_rate) berada di AmmConfig dan dibagikan di seluruh tingkat biaya. Apakah pool tertentu benar-benar mengenakan biaya (enable_creator_fee) dan sisi swap mana biaya itu mendarat (creator_fee_on) berada di PoolState. Biaya pembuat independen dari biaya perdagangan — ini adalah tingkat sendiri, terakrual ke penghitung sendiri (creator_fees_token_{0,1}), dan tidak pernah mengurangi bagian LP / protokol / dana dari biaya perdagangan. Penyapuan melalui CollectCreatorFee atau CollectCreatorFeePermissionless yang dibatasi tujuan, dan kedua jalur memberikan bagian dari saldo terakrual ke protokol di jalan keluar — pada creator_fee_share_rate, atau pada tingkat pada PDA CreatorFeeShare ketika satu ada untuk pasangan (creator, amm_config) itu. Lihat products/cpmm/fees untuk mekanika lengkap.
Permission
Akun kontrol akses kecil yang digunakan oleh InitializeWithPermission. Program CPMM mendukung jalur pembuatan pool berizin sehingga program lain (misalnya LaunchLab saat meluluskan token ke CPMM) dapat membuktikan mereka berhak membuat pool terhadap AmmConfig yang diberikan.
CreatePermissionPda oleh admin CPMM atau otoritas pembuat PDA izin khusus. Sejak upgrade 2026-09, ClosePermissionPda menerima dua penandatangan yang sama; sebelumnya hanya admin. Pengguna akhir tidak berinteraksi dengan akun ini secara langsung — ini adalah pipa untuk alur lintas program. Lihat security/admin-and-multisig untuk batas peran dan reference/program-addresses untuk alamat kanonik.
CreatorFeeShare
Akun opsional yang menimpa bagian protokol dari biaya pembuat untuk satu pasangan (pool creator, AmmConfig). Ditambahkan oleh upgrade creator-fee-share 2026-09-13.
- Ini opsional, tetapi akun tidak pernah opsional dalam instruksi.
CollectCreatorFeedanCollectCreatorFeePermissionlesskeduanya mendeklarasikancreator_fee_sharedengan batasan seed di atas dan mengambilnya pada setiap panggilan. Program kemudian memeriksa apakah akun kosong atau dimiliki asing; jika demikian, ia kembali keAmmConfig.creator_fee_share_rate. Jadi klien harus selalu menurunkan dan melewatkan alamat, terlepas dari apakah akun ada atau tidak. share_ratedibatasi padaFEE_RATE_DENOMINATOR_VALUE(1_000_000) saat pembuatan, dan lagi ketika split berjalan.1_000_000merutekan seluruh biaya pembuat ke protokol;0tidak merutekan apa pun.- Dibuat dan ditutup oleh admin atau otoritas khusus melalui
CreateCreatorFeeShare/CloseCreatorFeeShare. Menutupnya mengembalikan sewa ke penandatangan dan jatuh pasangan kembali ke default konfigurasi; pembuat pool bukan penandatangan di jalur mana pun. - Dikunci pada pembuat, bukan pool. Satu akun mengatur setiap pool yang dimiliki pembuat itu pada
AmmConfigitu. Pembuat dengan pool pada dua tingkat biaya memerlukan dua akun untuk dicakup di keduanya.
products/cpmm/fees.
Vault dan Token-2022
vault0 dan vault1 dimiliki oleh PDA otoritas CPMM, dan pemilik program token mereka (token_program) adalah SPL Token atau Token-2022, ditentukan saat pembuatan pool oleh program mint. Pool menangani kedua kasus secara transparan — Anda melewatkan ID program token yang tepat untuk setiap sisi dalam akun instruksi Swap / Deposit / Withdraw.
CPMM memberlakukan daftar izin ekstensi yang ketat saat pembuatan pool (is_supported_mint di utils/token.rs). Mint Token-2022 dapat digunakan dalam pool CPMM hanya jika setiap ekstensi yang dibawanya ada di daftar ini:
TransferFeeConfig. Diterapkan oleh mint pada setiap transfer. Pool berada di sisi penerima untuk depositSwapBaseInputdan sisi pengirim untuk penarikan. Program menghitung jumlah bersih yang mendarat di vault dan menetapkan kurva sesuai. Lihatalgorithms/token-2022-transfer-fees.MetadataPointerdanTokenMetadata. Metadata on-mint standar. Tidak ada efek pada matematika swap.InterestBearingConfig. Jumlah UI mint mengakrual bunga. Vault menyimpan jumlah mentah; kurva beroperasi hanya pada jumlah mentah. UI yang menampilkan APR harus memanggil pembantu Token-2022 untuk merender jumlah UI.ScaledUiAmount. Ekstensi penskalaan tampilan UI. Perlakuan yang sama denganInterestBearingConfig— kurva menggunakan jumlah mentah.
PermanentDelegate, TransferHook, DefaultAccountState, NonTransferable, ConfidentialTransfer, Group/GroupMember, MintCloseAuthority, dll. — menyebabkan Initialize menolak dengan NotSupportMint. Satu pengecualian adalah registri per-mint: jika PDA SupportMintAssociated ada di seed [b"support_mint", mint], mint diterima terlepas dari set ekstensinya. PDA itu dibuat dan dihapus oleh admin (atau otoritas dukungan mint khusus) melalui CreateSupportMintAssociated / CloseSupportMintAssociated, jadi onboarding mint tertentu tidak lagi memerlukan upgrade program.
Berubah di 2026-09. CPMM sebelumnya juga membawa
MINT_WHITELIST empat alamat yang dikodekan keras yang memotong pemeriksaan ekstensi. Array itu dihapus; registri PDA sekarang satu-satunya bypass. Mint apa pun yang mengandalkan daftar yang dikodekan keras memerlukan PDA SupportMintAssociated sebelum pool baru dapat dibuat untuk itu — pool yang ada tidak terpengaruh, karena pemeriksaan berjalan hanya saat pembuatan pool.programs/cp-swap/src/utils/token.rs dan dapat berubah dengan upgrade program di masa depan. Lihat reference/token-2022-support untuk matriks lintas program.
Observasi
Akun observasi adalah ring buffer dari entriObservationState, masing-masing menyimpan block_timestamp dan harga kumulatif. Pada setiap swap, program menambahkan observasi baru jika cukup waktu telah berlalu sejak yang terakhir. TWAP dihitung dengan membaca dua observasi dan membagi Δcumulative / Δtime.
8 + 16 + 16), jadi array saja adalah 4.000 byte; ObservationState::LEN adalah tepat 4.075 byte (8 + 1 + 2 + 32 + 4.000 + 8 × 4).
Dua aturan konsumen:
- Jangan gunakan observasi tunggal sebagai harga. Ini adalah kumulatif, bukan harga spot. Gunakan dua dari mereka untuk menghitung TWAP.
- Pilih observasi setidaknya satu blok terpisah. Swap dalam blok yang sama mungkin tidak menghasilkan observasi baru; membaca kembali-ke-belakang dapat mengembalikan catatan yang sama.
products/clmm/accounts.
Siklus hidup akun
Pool CPMM dan PDA mereka tidak pernah ditutup.
Permission, SupportMintAssociated dan CreatorFeeShare adalah pengecualian — mereka adalah catatan admin-managed mandiri, bukan state pool, dan masing-masing memiliki instruksi close eksplisit. Bahkan pada likuiditas nol poolState tetap ada. Ini disengaja: re-seeding pool yang sama kemudian melestarikan buffer observasi historisnya dan derivasi PDA-nya tetap stabil.
Apa yang harus dibaca di mana
- Daftar akun instruksi (yang dari di atas dapat ditulis/penandatangan untuk setiap instruksi):
products/cpmm/instructions. - Semantik akrual biaya:
products/cpmm/fees. - Matematika swap / aturan pembaruan observasi:
products/cpmm/math. - Seed kanonik / ID program:
reference/program-addresses.

