Skip to main content
Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Program ID dan seed PDA untuk CPMM tercantum secara kanonik di reference/program-addresses. Halaman ini berfokus pada apa fungsi setiap akun dan invarian yang dipertahankannya, bukan alamat yang dikodekan keras.

Enam akun dari pool CPMM

Setiap pool CPMM sepenuhnya dijelaskan oleh enam alamat yang diturunkan 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:
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 on-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 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. Saat 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 — cerminan internal pool dari total pasokan LP mint. Gunakan untuk matematika LP-share; nilainya harus cocok dengan pasokan on-chain mint, tetapi membacanya dari PoolState menghindari pengambilan akun tambahan.
  • protocol_fees_token{0,1}, fund_fees_token{0,1} — biaya yang terakrual belum disapu. Ini tidak mempengaruhi penetapan harga swap; mereka duduk di vault sampai CollectProtocolFee / CollectFundFee dipanggil.
  • 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 itu dikumpulkan. enable_creator_fee == false menghilangkan jalur biaya pembuat sepenuhnya. Saat 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. Ditetapkan 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; jalur tanpa izin memperbaiki penerima ke ATA kanonik pool_creator.

AmmConfig

Tiga hal yang harus diperhatikan:
  1. trade_fee_rate dan creator_fee_rate adalah fraksi 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 volume), dalam penyebut 1/1_000_000 yang sama. Biaya pembuat bukan fraksi dari biaya perdagangan — itu 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 tier biaya.
Catatan tentang biaya pembuat: tingkat itu sendiri (creator_fee_rate) berada di AmmConfig dan dibagikan di seluruh tier 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 — itu adalah tingkat sendiri, terakrual ke penghitung sendiri (creator_fees_token_{0,1}), dan tidak pernah mengurangi saham LP / protokol / dana dari biaya perdagangan. Penyapuan melalui CollectCreatorFee atau CollectCreatorFeePermissionless yang dibatasi tujuan. 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 tertentu.
PDA Permission dibuat melalui CreatePermissionPda oleh admin CPMM atau otoritas pembuat PDA izin khusus. Hanya admin CPMM yang dapat mencabut melalui ClosePermissionPda. Pengguna akhir tidak berinteraksi dengan akun ini secara langsung — itu adalah pipa untuk alur lintas program. Lihat security/admin-and-multisig untuk batas peran dan reference/program-addresses untuk alamat kanonik.

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 ditolak dengan NotSupportMint. Pengecualiannya adalah daftar whitelist mint yang dikodekan keras kecil dalam program (segelintir pubkey spesifik) yang melewati pemeriksaan ekstensi; itu digunakan untuk memasukkan mint spesifik kasus demi kasus. Daftar ekstensi yang telah diverifikasi dan daftar whitelist mint berada di sumber CP-Swap di bawah programs/cp-swap/src/utils/token.rs dan dapat berubah dengan upgrade program di masa depan.

Observation

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, jadi array saja adalah 4.000 byte; PDA ObservationState penuh sekitar 4.100 byte setelah bidang sekitarnya dan diskriminator. Dua aturan konsumen:
  • Jangan gunakan observasi tunggal sebagai harga. Itu 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. 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: