Skip to main content
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
Akun (W = dapat ditulis, S = penandatangan) * 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_mint berdasarkan urutan byte).
  • Tidak ada mint yang menggunakan ekstensi di luar daftar putih CPMM (TransferFeeConfig, MetadataPointer, TokenMetadata, InterestBearingConfig, ScaledUiAmount) — lihat products/cpmm/accounts. Mint dengan PDA SupportMintAssociated (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.
  • creator memiliki setidaknya init_amount_0 dan init_amount_1 di ATA masing-masing.
  • amm_config.disable_create_pool == false.
Kondisi pasca
  • pool_state ada dengan lp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP.
  • Pemula LP LOCKED_LP (100 lamport token LP) secara permanen terkunci di pool — pool_state.lp_supply mencatat liquidity − 100 sementara 100 unit LP tetap di luar sirkulasi, mencegah pool sepenuhnya dikuras dan membagi dengan nol.
  • observation_state diinisialisasi; observation_index = 0 dan pool_id = pool_state.key().
  • Lamport create_pool_fee ditransfer 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 = false dan creator_fee_on = BothToken. Initialize tidak mendukung pengaktifan biaya kreator — jalur itu adalah InitializeWithPermission.
  • open_time ditingkatkan ke block_timestamp + 1 jika pemanggil melewatkan nilai <= block_timestamp. Swap ditolak sebelum open_time; deposit dan penarikan bekerja segera.
Kesalahan umum (daftar lengkap di reference/error-codes)
  • InvalidInput — mint tidak diurutkan, atau mint identik.
  • NotSupportMint — ekstensi Token-2022 yang diblokir.
  • ExceededSlippage — jarang; jika init_amount_0/1 menghasilkan LP nol karena ketidakcocokan desimal.

Deposit

Tambahkan likuiditas di kedua token sebanding dengan pool. Argumen
Akun Matematika
Tidak ada perubahan pada proporsionalitas 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).
Kesalahan umumExceededSlippage, ZeroTradingTokens, InvalidStatus jika deposit dijeda.

Withdraw

Bakar token LP dan terima kedua token dasar secara pro-rata. Argumen
Akun (Identik dengan Deposit; lp_mint dapat ditulis karena token LP dibakar.) Matematika
Kondisi pasca
  • 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
Akun 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_status memungkinkan swap.
  • Tidak ada mint yang dijeda atau dibekukan untuk otoritas ini.
  • amount_in > 0.
Kesalahan umum
  • ExceededSlippageamount_out < minimum_amount_out.
  • ZeroTradingTokens — perdagangan dibulatkan menjadi nol.
  • NotApproved — pool dijeda untuk swap melalui UpdatePoolStatus.
  • InvalidInput — mint tidak cocok dengan salah satu dari vault pool.

SwapBaseOutput

Swap output-pasti. Argumen
Akun — sama dengan SwapBaseInput. Matematika — kurva terbalik dengan ceiling, lihat products/cpmm/math. Kesalahan umumExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.

CollectProtocolFee

Kumpulkan biaya protokol yang terkumpul dari vault ke tujuan protokol. Argumen — tidak ada. Akun Efek
Tidak ada perubahan pada saldo efektif kurva (biaya yang terkumpul sudah dikecualikan). Kesalahan umumNotApproved 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_0 dan creator_fees_token_1 dari vault pool ke ATA kreator.
  • Menolak kedua penghitung biaya kreator dan memperbarui pool_state.recent_epoch.
  • Mengembalikan NoFeeCollect ketika kedua penghitung adalah nol.

UpdatePoolStatus

Jeda atau lanjutkan operasi individual pada pool. Bidang status adalah bitmask: Argumen
Akun Kunci admin adalah otoritas upgrade pada program CPMM — dalam praktik, multisig Raydium. Lihat security/admin-and-multisig.

CreateAmmConfig

Buat tingkat biaya baru. Argumen
Akun Kondisi pra
  • Tidak ada AmmConfig yang ada dengan index yang 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 = 0trade_fee_rate
  • param = 1protocol_fee_rate
  • param = 2fund_fee_rate
  • param = 3new_protocol_owner (lewatkan byte Pubkey sebagai reinterpret)
  • param = 4new_fund_owner
  • param = 5create_pool_fee
  • param = 6disable_create_pool
Perubahan ditandatangani oleh admin dan mempengaruhi setiap pool yang terikat pada 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 umumInvalidOwner (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

Sumber: