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 fokus pada apa kegunaan setiap akun dan invarian yang dipertahankannya, bukan alamat yang dikodekan.

Enam akun dari pool CPMM

Setiap pool CPMM sepenuhnya dijelaskan oleh enam program-derived addresses (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 penanda tangan arbitrer sebagai pool_state selain PDA di atas. Jika akun yang dilewatkan tidak cocok dengan PDA kanonik, program memerlukan itu menjadi penanda tangan — yaitu, pembuat melewatkan keypair segar yang mereka tandatangani. Ini adalah pertahanan front-run: pihak ketiga apa pun yang berlomba merebut PDA kanonik dapat dihindari oleh pembuat sah menggunakan keypair acak sebagai gantinya. PDA hilir (lpMint, vault0, vault1, observation) masih diturunkan dari poolState.key(), sehingga mereka tetap unik untuk alamat mana pun yang digunakan. Ketika Anda mengindeks pool, selalu temukan ID pool dari state on-chain (mis., akun PoolState di bawah program CPMM), bukan dengan menurunkan PDA kanonik — yang terakhir akan melewatkan pool keypair acak.

Tata letak akun

Definisi Rust lengkap ada di sumber raydium-cp-swap. Bidang di bawah adalah yang akan Anda baca dari integrasi.

PoolState

Apa yang sebenarnya harus dibaca:
  • lp_supply — cerminan internal pool dari pasokan total LP mint. Gunakan untuk matematis 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 yang belum disapu. Ini tidak mempengaruhi pricing swap; mereka duduk di vault hingga 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 langsung CPI-ing, 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 jadi pool dapat disemai.
  • creator_fee_on / enable_creator_fee — bersama-sama mengontrol apakah biaya creator opsional aktif untuk pool ini dan sisi swap mana ia dikumpulkan. enable_creator_fee == false mengosongkan jalur biaya creator 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 di 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 creator yang terakrual, disapu oleh CollectCreatorFee.

AmmConfig

Tiga hal yang perlu diperhatikan:
  1. trade_fee_rate dan creator_fee_rate adalah fraksi dari volume, keduanya dinyatakan dalam unit 1/1_000_000. 2500 berarti 0,25% dari volume trade. protocol_fee_rate dan fund_fee_rate adalah fraksi dari trade fee (bukan dari volume), dalam denominator 1/1_000_000 yang sama. Biaya creator bukan fraksi dari trade fee — ini adalah tingkat independen sendiri. Aritmetika lengkap ada di products/cpmm/fees.
  2. index adalah u16, jadi seed hash menggunakan 2 byte big-endian. Kesalahan urutan byte adalah bug integrasi umum.
  3. AmmConfig tidak dapat diubah di tingkat pool. Pool menunjuk satu AmmConfig saat pembuatan dan tidak pernah berpindah. Perubahan biaya menyebar karena pool membaca konfigurasi setiap swap — tetapi pool tidak dapat dipindahkan di antara fee tier.
Catatan tentang biaya creator: tingkat sendiri (creator_fee_rate) ada di AmmConfig dan dibagikan di seluruh fee tier. Apakah pool tertentu benar-benar mengenakan biayanya (enable_creator_fee) dan sisi swap mana yang dikenakannya (creator_fee_on) ada di PoolState. Biaya creator independen dari trade fee — ini adalah tingkat sendiri, terakrual ke penghitung sendiri (creator_fees_token_{0,1}), dan tidak pernah mengurangi bagian LP / protocol / fund dari trade fee. Penyapuan melalui CollectCreatorFee. Lihat products/cpmm/fees untuk mekanika lengkap.

Permission

Akun kontrol akses kecil yang digunakan oleh InitializeWithPermission. Program CPMM mendukung jalur pembuatan pool berupa izin sehingga program lain (mis. LaunchLab saat meluluskan token ke CPMM) dapat membuktikan mereka berhak membuat pool terhadap AmmConfig yang diberikan.
PDA Permission dibuat oleh admin CPMM melalui CreatePermissionPda dan dibatalkan melalui ClosePermissionPda. Pengguna akhir tidak berinteraksi dengan akun ini secara langsung — ini adalah pipa untuk alur lintas program.

Vault dan Token-2022

vault0 dan vault1 dimiliki oleh CPMM authority PDA, dan pemilik token-program mereka (token_program) adalah baik SPL Token atau Token-2022, ditentukan saat pembuatan pool oleh program mint. Pool menangani dua kasus secara transparan — Anda melewatkan token-program ID yang benar untuk setiap sisi di akun instruksi Swap / Deposit / Withdraw. CPMM menerapkan daftar whitelist 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 di setiap transfer. Pool berada di sisi penerima untuk deposit SwapBaseInput dan sisi pengirim untuk penarikan. Program menghitung jumlah bersih yang masuk ke vault dan mengatur kurva sesuai. Lihat algorithms/token-2022-transfer-fees.
  • MetadataPointer dan TokenMetadata. Metadata on-mint standar. Tidak ada pengaruh pada swap math.
  • InterestBearingConfig. Jumlah UI mint terakrual 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 whitelist mint hard-coded kecil di program (beberapa pubkey spesifik) yang melewati pemeriksaan ekstensi; ini digunakan untuk mengonboardkan mint spesifik kasus per kasus. Daftar ekstensi terverifikasi dan whitelist mint ada di sumber CP-Swap di 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 waktu yang cukup telah berlalu sejak yang terakhir. TWAP dihitung dengan membaca dua observasi dan membagi Δcumulative / Δtime.
Ring buffer diukur untuk 100 observasi. Setiap observasi 40 byte, jadi array saja 4.000 byte; PDA ObservationState lengkap sekitar 4.100 byte setelah bidang sekitarnya dan discriminator. Dua aturan konsumen:
  • Jangan gunakan observasi tunggal sebagai harga. Itu adalah kumulatif, bukan harga spot. Gunakan dua di antaranya untuk menghitung TWAP.
  • Pilih observasi setidaknya satu blok terpisah. Swap dalam blok yang sama mungkin tidak menghasilkan observasi baru; membaca back-to-back dapat mengembalikan record yang sama.
Lebih banyak math di products/clmm/accounts.

Daur hidup akun

Pool CPMM dan PDA mereka tidak pernah ditutup. Bahkan dengan likuiditas nol poolState tetap ada. Ini disengaja: menabur ulang pool yang sama nanti mempertahankan buffer observasi historikal dan derivasi PDA-nya tetap stabil.

Apa yang harus dibaca di mana

Sumber: