Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Halaman ini adalah referensi instruksi yang berwenang. Untuk kode yang benar-benar menyusun instruksi ini, lihat
products/cpmm/code-demos. Untuk arti kode kesalahan, lihat reference/error-codes.Upgrade program 2026-09 membangun kembali CPMM di Anchor 1.0.2 / Solana 3.1.10, menambahkan instruksi admin CollectExcessLamports, menghapus daftar putih mint Token-2022 yang dikodekan keras, dan mengubah apa yang ditulis CreateAmmConfig ke dalam protocol_owner / fund_owner. Tidak ada instruksi yang menghadap pengguna yang mengubah akun, argumen, atau matematikanya. Lihat entri changelog 2026-09-09.Ringkasan instruksi
Bitmask status:
status setiap pool adalah u8 di mana 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
* pool_state menandatangani hanya pada jalur keypair acak; jalur PDA kanonik berjalan tanpa pool_state menandatangani.
Kondisi pra
- Mint diurutkan (
token_0_mint < token_1_mintberdasarkan urutan byte). - Tidak ada mint yang menggunakan ekstensi di luar daftar putih CPMM (
TransferFeeConfig,MetadataPointer,TokenMetadata,InterestBearingConfig,ScaledUiAmount) — lihatproducts/cpmm/accounts. Mint dengan PDASupportMintAssociated(seed[b"support_mint", mint]) melewati pemeriksaan; registri itu adalah satu-satunya bypass sejak upgrade 2026-09 menghapus daftar putih empat-mint yang dikodekan keras. 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
LOCKED_LP(100lamport token LP) secara permanen terkunci di pool —pool_state.lp_supplymencatatliquidity − 100sementara100unit LP tetap di luar sirkulasi, mencegah pool sepenuhnya dikuras dan membagi dengan nol. observation_statediinisialisasi;observation_index = 0danpool_id = pool_state.key().- Lamport
create_pool_feeditransfer dari pembuat ke penerima dan disinkronkan sebagai SOL asli (ini adalah ATA wSOL). - Bitmask status pool adalah
0(deposit / withdraw / swap semuanya diaktifkan). enable_creator_fee = falsedancreator_fee_on = BothToken.Initializetidak mendukung pengaktifan biaya kreator — 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 yang diblokir.ExceededSlippage— jarang; jikainit_amount_0/1menghasilkan LP nol karena ketidakcocokan desimal.
Deposit
Tambahkan likuiditas di kedua token sebanding dengan pool.
Argumen
Matematika
k — kedua vault dan lp_supply diskalakan dengan faktor yang sama.
Kondisi pasca
lp_supply += lp_token_amount.vault_0 += needed_token_0(bersih dari biaya transfer Token-2022 apa pun pada input).vault_1 += needed_token_1(bersih 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
(Identik dengan
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 bersih dari biaya transfer Token-2022 apa pun).
SwapBaseInput
Swap input-pasti.
Argumen
Urutan input → output adalah berdasarkan arah pengguna, bukan
token_0 / token_1 kanonik pool. Program mengetahui vault mana yang mana dengan mencocokkan mint.
Matematika — lihat products/cpmm/math.
Kondisi pra
open_time <= now.pool_statusmemungkinkan swap.- Tidak ada mint yang 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 dari vault pool.
SwapBaseOutput
Swap output-pasti.
Argumen
SwapBaseInput.
Matematika — kurva terbalik dengan ceiling, lihat products/cpmm/math.
Kesalahan umum — ExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.
CollectProtocolFee
Kumpulkan biaya protokol yang terkumpul dari vault ke tujuan protokol.
Argumen — tidak ada.
Akun
Efek
NotApproved jika penandatangan bukan protocol_owner.
CollectFundFee
Bentuk yang sama dengan CollectProtocolFee tetapi ditandatangani oleh fund_owner dan menolak penghitung fund_fees_*.
CollectCreatorFee
Ditandatangani oleh pool_state.pool_creator. Ini mentransfer saldo creator_fees_token_0 dan creator_fees_token_1 penuh ke akun token kreator, kemudian menolak kedua penghitung. Ini mengembalikan NoFeeCollect ketika kedua penghitung adalah nol.
CollectCreatorFeePermissionless
Siapa pun dapat memicu pengumpulan biaya kreator. Instruksi selalu mengirim saldo yang terkumpul penuh ke akun token terkait kanonik yang dimiliki oleh pool_state.pool_creator; pemanggil tidak dapat memilih kreator atau tujuan lain. Jika salah satu ATA hilang, pembayar mendanai pembuatannya.
CollectCreatorFee asli tetap dapat dipanggil, jadi klien yang ada tetap kompatibel.
Argumen — tidak ada.
Akun
Efek
- Mentransfer semua
creator_fees_token_0dancreator_fees_token_1dari vault pool ke ATA kreator. - Menolak kedua penghitung biaya kreator dan memperbarui
pool_state.recent_epoch. - Mengembalikan
NoFeeCollectketika kedua penghitung adalah nol.
UpdatePoolStatus
Jeda atau lanjutkan operasi individual pada pool. Bidang status adalah bitmask:
Argumen
Kunci admin adalah otoritas upgrade pada program CPMM — dalam praktik, multisig Raydium. Lihat
security/admin-and-multisig.
CreateAmmConfig
Buat tingkat biaya baru.
Argumen
Kondisi pra
- Tidak ada
AmmConfigyang ada denganindexyang sama. protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE.
Berubah di 2026-09: pemilik biaya config baru tidak lagi berasal dari penandatangan.
create_amm_config sekarang menulis protocol_fee_owner::ID yang dikodekan keras program ke dalam protocol_owner dan fund_fee_owner::ID ke dalam fund_owner, bukan menyalin kunci penandatangan admin ke keduanya. Alamat ada di reference/program-addresses.Konsekuensi: AmmConfig yang baru dibuat segera disapu oleh dompet biaya khusus daripada oleh kunci admin, dan admin tidak lagi dapat mengumpulkan dari config yang baru saja dibuat tanpa terlebih dahulu memutar bidang. Akun AmmConfig yang ada tidak ditulis ulang — apa pun yang disimpan di dalamnya masih mengatur, jadi selalu baca protocol_owner / fund_owner dari akun daripada mengasumsikan nilai apa pun. Parameter UpdateAmmConfig 3 dan 4 masih memutar mereka.UpdateAmmConfig
Ubah tarif biaya atau kepemilikan pada AmmConfig yang ada. Mengambil param: u8 (diskriminator untuk bidang mana yang akan diperbarui) dan value: u64. Semantik 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.
CollectExcessLamports
Penyapuan admin lamport yang duduk di atas minimum bebas sewa pada akun yang dikendalikan CPMM. Ditambahkan dalam upgrade 2026-09 sehingga protokol dapat mengklaim over-funding yang ditinggalkan SIMD-0437 rent reduction pada akun yang dibuat sebelum setiap langkah.
Hanya kelebihan yang bergerak. Saldo token, data akun, pemilik, status pool, dan kurva tidak berubah, dan instruksi adalah no-op terhadap akun yang sudah pada minimumnya — jadi aman untuk dijalankan kembali setelah setiap peluncuran langkah.
Argumen — tidak ada.
Akun
Bagaimana setiap akun sumber ditangani
Program mengirim pada
owner akun sumber:
Karena mengambil daftar
remaining_accounts yang tidak terbatas, ukuran transaksi adalah batas nyata — batasan yang sama dengan penyapuan sisi dompet yang dijelaskan di solana-fundamentals/rent-and-reclaimable-rent.
Kesalahan umum — InvalidOwner (6001, penandatangan salah), LamportsCalculateError (6015, putaran wSOL tidak bersih ke nol), dan InsufficientFunds dari jalur yang dimiliki program ketika akun menyimpan kurang dari minimum sewa sendirinya.
Tidak ada pembuat SDK. @raydium-io/raydium-sdk-v2 tidak mengirimkan pembuat untuk instruksi ini, dan begitu juga repo raydium-sdk-V2-demo — ini adalah jalur admin. Enkode dengan tangan, cara penyapuan sisi dompet di solana-fundamentals/rent-and-reclaimable-rent lakukan untuk instruksi program token.
Matriks perubahan status
Ke mana selanjutnya
products/cpmm/code-demos— sampel TypeScript yang dapat dijalankan untuk di atas.reference/error-codes— tabel kesalahan Anchor lengkap.products/cpmm/fees— model akrual biaya yang dikuras instruksiCollect*Fee.

