Skip to main content
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 akun AmmConfig 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:
Selalu urutkan mint sebelum menurunkan PDA pool. Seed melakukan hash dua mint dalam urutan byte, bukan urutan pengguna. Dua pool dengan (A, B) dan (B, A) akan bertabrakan di chain — pengurutan adalah cara program membuat pemetaan kanonik.
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 sumber raydium-cp-swap. Bidang di bawah adalah yang akan Anda baca dari integrasi.

PoolState

Apa yang benar-benar harus dibaca:
  • 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 dengan lp_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 sampai CollectProtocolFee / CollectFundFee dipanggil. protocol_fees_token{0,1} juga menerima bagian protokol dari biaya pembuat ketika biaya pembuat dikumpulkan, jadi ia tumbuh di luar swap — lihat products/cpmm/fees.
  • status — bitmask yang mengontrol apakah Swap, Deposit, Withdraw diizinkan. Diperbarui oleh admin melalui UpdatePoolStatus. 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 sebelum open_time sehingga 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 == false menghilangkan jalur biaya pembuat sepenuhnya. Ketika diaktifkan, creator_fee_on memilih: 0 = ambil biaya dari token mana pun yang merupakan input swap (BothToken); 1 = ambil biaya dari token_0 saja (lewati pada swap token_1 → token_0); 2 = ambil biaya dari token_1 saja. Diatur saat pembuatan pool melalui InitializeWithPermission; tidak dapat berubah kemudian.
  • creator_fees_token_{0,1} — biaya pembuat yang terakrual, disapu oleh CollectCreatorFee atau CollectCreatorFeePermissionless. Kedua jalur menghilangkan penghitung penuh, tetapi sejak upgrade creator-fee-share 2026-09-13 hanya sebagian dari saldo yang meninggalkan pool: bagian protokol ditambahkan ke protocol_fees_token_{0,1} dan sisanya ditransfer ke pembuat. Jalur tanpa izin memperbaiki penerima ke ATA kanonik pool_creator. PoolState itu sendiri tidak berubah — tidak ada penghitung terpisah untuk jumlah yang dibagikan.

AmmConfig

Tiga hal yang harus diperhatikan:
  1. trade_fee_rate dan creator_fee_rate adalah fraksi dari volume, keduanya dinyatakan dalam satuan 1/1_000_000. 2500 berarti 0.25% dari volume perdagangan. protocol_fee_rate dan fund_fee_rate adalah fraksi dari biaya perdagangan (bukan dari volume), dalam penyebut 1/1_000_000 yang sama. Biaya pembuat bukan fraksi dari biaya perdagangan — ini adalah tingkat independen sendiri. Aritmatika lengkap ada di products/cpmm/fees.
  2. index adalah u16, jadi seed hash menggunakan 2 byte big-endian. Off-by-one pada urutan byte adalah bug integrasi umum.
  3. AmmConfig tidak dapat diubah di tingkat pool. Pool menunjuk ke satu AmmConfig saat pembuatan dan tidak pernah beralih. Perubahan biaya menyebar karena pool membaca konfigurasi setiap swap — tetapi pool tidak dapat dipindahkan antar tingkat biaya.
Catatan tentang biaya pembuat: tingkat itu sendiri (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.
PDA Permission dibuat melalui 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.
Cara kerjanya:
  • Ini opsional, tetapi akun tidak pernah opsional dalam instruksi. CollectCreatorFee dan CollectCreatorFeePermissionless keduanya mendeklarasikan creator_fee_share dengan batasan seed di atas dan mengambilnya pada setiap panggilan. Program kemudian memeriksa apakah akun kosong atau dimiliki asing; jika demikian, ia kembali ke AmmConfig.creator_fee_share_rate. Jadi klien harus selalu menurunkan dan melewatkan alamat, terlepas dari apakah akun ada atau tidak.
  • share_rate dibatasi pada FEE_RATE_DENOMINATOR_VALUE (1_000_000) saat pembuatan, dan lagi ketika split berjalan. 1_000_000 merutekan seluruh biaya pembuat ke protokol; 0 tidak 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 AmmConfig itu. Pembuat dengan pool pada dua tingkat biaya memerlukan dua akun untuk dicakup di keduanya.
Aritmatika split yang didorong ada di 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 deposit SwapBaseInput dan sisi pengirim untuk penarikan. Program menghitung jumlah bersih yang mendarat di vault dan menetapkan kurva sesuai. Lihat algorithms/token-2022-transfer-fees.
  • MetadataPointer dan TokenMetadata. 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 dengan InterestBearingConfig — kurva menggunakan jumlah mentah.
Ekstensi lain apa pun — 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.
Daftar ekstensi yang diverifikasi berada di sumber CP-Swap di bawah 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 entri ObservationState, 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.
Ring buffer berukuran untuk 100 observasi. Setiap observasi adalah 40 byte (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.
Lebih banyak matematika di 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

Sumber: