Skip to main content
Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Spesifikasi versi. Semua demo TypeScript menargetkan @raydium-io/raydium-sdk-v2@0.2.64-alpha; terakhir dijalankan terhadap 0.2.42-alpha (2026-04) dan tanda tangan panggilan mereka diperiksa ulang terhadap sumber 0.2.64-alpha pada 2026-09-09, terhadap Solana mainnet-beta. Kerangka CPI Rust di akhir menargetkan raydium-clmm di master, yang mengunci Anchor =0.32.1 — bukan 1.0.2 yang digunakan halaman CPMM; keduanya tidak dapat hidup dalam satu crate. ID program berasal dari reference/program-addresses melalui SDK.

Setup

Setiap demo di halaman ini mencerminkan file di raydium-sdk-V2-demo/src/clmm; tautan GitHub berada di sebelah setiap bagian. Bootstrap mengikuti config.ts.template repo demo (sumber) — disableFeatureCheck: true adalah pengaturan yang direkomendasikan untuk integrasi apa pun yang tidak trivial:

Buat pool CLMM

Sumber: src/clmm/createPool.ts
SDK:
  • Mengurutkan mint1/mint2 berdasarkan urutan byte sebelum derivasi.
  • Menghitung sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64).
  • Membuat akun observation dan tick_array_bitmap_extension.
  • Membayar biaya pembuatan pool yang ditentukan oleh ammConfig.

Buka posisi dalam rentang pilihan

Sumber: src/clmm/createPosition.ts
SDK menghitung tick array mana yang disentuh rentang dan meneruskannya sebagai akun. Tidak perlu menggabungkan instruksi init apa pun — tidak ada instruksi init-tick-array; OpenPosition* mengalokasikan tick array yang hilang sendiri, dengan biaya pembayar.

Tingkatkan likuiditas pada posisi yang ada

Sumber: src/clmm/increaseLiquidity.ts

Kurangi likuiditas (dan kumpulkan biaya pada saat yang sama)

Sumber: src/clmm/decreaseLiquidity.ts dan src/clmm/closePosition.ts
Untuk mengumpulkan biaya dan reward saja, panggil decreaseLiquidity dengan liquidity = new BN(0). Efek samping instruksi adalah menyelesaikan token_fees_owed_{0,1} dan reward_amount_owed serta mentransfernya — ini adalah satu-satunya cara untuk mengumpulkan keduanya. Untuk menutup posisi sepenuhnya setelah menolkan likuiditas dan biaya, teruskan ownerInfo: { closePosition: true } pada panggilan decreaseLiquidity terakhir. SDK menambahkan ClosePosition dan membakar NFT.
Posisi penerbit terbatas memerlukan pembangun penutup yang kompatibel. Posisi ini memiliki akun token NFT yang dibekukan. ClosePosition harus menambahkan ID pool posisi sebagai akun sisa pertama sehingga CLMM dapat mencairkan akun sebelum membakarnya. Cabang sumber program tidak menyertakan perubahan SDK. Konfirmasi bahwa rilis SDK Anda secara eksplisit mendukung jalur penutup beku sebelum mengaktifkan pembuatan posisi penerbit terbatas.
Untuk klien Anchor langsung, pertahankan akun yang dideklarasikan tidak berubah dan tambahkan pool:
Anda dapat meneruskan poolId pada setiap penutupan. CLMM membacanya hanya ketika positionNftAccount dibekukan, yang membuat satu jalur klien kompatibel dengan posisi lama dan baru.

Kumpulkan reward

Sumber: src/clmm/harvestAllRewards.ts
harvestAllRewards berjalan melalui setiap posisi di setiap pool yang diteruskan, mengelompokkan panggilan DecreaseLiquidity zero-liquidity yang menyelesaikan biaya dan reward (plus UpdateRewardInfos apa pun), dan membaginya di seluruh transaksi jika diperlukan.

Swap

Sumber: src/clmm/swap.ts
Simulasi berjalan melalui peta tick off-chain dengan logika yang sama seperti program on-chain dan mengembalikan jumlah keluar (amountCalculated) plus daftar akun yang tepat yang akan disentuh swap (accounts). Selalu teruskan remainingAccounts yang dikembalikan simulasi: terlalu sedikit dan swap akan kembali di tengah-jalan dengan NotEnoughTickArrayAccount; yang sudah usang hanya membuang compute.
PoolUtils.computeAmountOutFormat masih ada, tetapi memerlukan ComputeClmmPoolInfo ( computePoolInfo dari getPoolInfoFromRpc, bukan objek pool API) ditambah dua argumen wajib lagi — tickarrayBitmapExtension dan blockTimestamp — dan tidak ada metode raydium.clmm.fetchTickArrays (fetchTickArrays adalah fungsi bebas; pembantu tingkat modul adalah PoolUtils.fetchMultiplePoolTickArrays dan tickData / tickArrays yang dikembalikan oleh getPoolInfoFromRpc).

Buat pool CLMM yang dapat disesuaikan

createCustomizablePool adalah titik masuk yang mengekspos toggle biaya dinamis dan biaya satu sisi pada waktu pembuatan pool. Ini mengambil bentuk createPool ditambah dua penambahan:
Tidak ada flag enableDynamicFee dan tidak ada parameter dynamicFeeConfigId, dan tidak ada startTime. Menyediakan dynamicFeeConfig adalah apa yang mengaktifkan biaya dinamis — abaikan dan Anda mendapatkan pool biaya statis, tanpa kesalahan. Perhatikan juga bahwa anggota enum SDK adalah TokenOnlyA / TokenOnlyB, sedangkan enum Rust on-chain mengejanya Token0Only / Token1Only; nilai numeriknya cocok (FromInput = 0).
createPool terus bekerja untuk jalur biaya default, tanpa biaya dinamis. Gunakan createCustomizablePool kapan pun Anda memerlukan salah satu tombol. Lihat products/clmm/instructions untuk daftar akun on-chain.

Limit order

Limit order memarkir input pengguna pada satu tick dan diisi FIFO ketika swap melintasi tick itu. Output didorong ke ATA pemilik pada waktu penyelesaian; pemilik tidak perlu online untuk diisi.

Buka limit order

SDK menurunkan PDA LimitOrderState dari (owner, nonce PDA, order nonce), menaikkan LimitOrderNonce per-dompet, dan menyisipkan order ke dalam kohort FIFO pada tick itu.

Tingkatkan / kurangi order terbuka

decreaseLimitOrder hanya dapat menghapus dari bagian unfilled order; bagian yang diisi terkunci sampai penyelesaian. Kedua instruksi kembali dengan InvalidOrderPhase jika order sudah sepenuhnya diisi.

Selesaikan order yang diisi

settleLimitOrder membaca unfilled_ratio_x64 order terhadap pelacak kohort, menghitung output yang diisi, dan mentransfernya ke ATA pemilik. Pemilik dapat memanggil ini sendiri; limit_order_admin (pemelihara operasional off-chain) juga dapat memanggilnya atas nama pemilik — output masih pergi ke pemilik. Untuk menutup order yang sepenuhnya diselesaikan untuk memulihkan sewa, gunakan closeLimitOrder (tunggal) atau closeAllLimitOrder (batch). Untuk menyelesaikan banyak sekaligus, settleAllLimitOrder mengemas sebanyak mungkin panggilan SettleLimitOrder yang sesuai dalam tx v0.

Daftar order yang diparkir dompet (off-chain)

Endpoint order aktif mengembalikan order unfilled dan partially-filled dalam satu payload (totalAmount / filledAmount / pendingSettle membedakan fase). Untuk riwayat order tertutup gunakan /limit-order/history/order/list-by-user?wallet=… (per-dompet, dipaginasi oleh nextPageId); untuk log acara lengkap order tertentu gunakan /limit-order/history/event/list-by-pda?pda=….

Kerangka CPI Rust

Urutan akun sisa untuk SwapV2:
Jika swap tidak pernah memerlukan ekstensi, abaikan; jika tidak, itu adalah akun sisa pertama.

Jebakan umum

  • Endpoint tick off-spacing → TickAndSpacingNotMatch. Selalu snap melalui TickUtil.getPriceAndTick (singular TickUtil).
  • Tidak cukup tick array yang disediakan dalam SwapV2 → NotEnoughTickArrayAccount. Ambil daftar dari swapInternal(...).accounts.
  • Posisi full-range tanpa ekstensi bitmap → PDA ekstensi harus writable; SDK menangani ini secara otomatis.
  • Mengacaukan sqrt_price_x64 dengan price → kebingungan faktor-2 di sini sangat menyakitkan. Jika ragu, biarkan SDK menghitungnya dari harga yang dapat dibaca manusia.
  • Mengumpulkan reward terlalu cepat → setiap pengumpulan adalah DecreaseLiquidity zero-liquidity dan biaya satu transaksi. Batch melalui harvestAllRewards di banyak posisi, dan ingat execute memerlukan { sequentially: true }.
  • Menutup akun NFT sendiri → ClosePosition membakar NFT dan menutup ATA-nya. Ini juga menutup mint NFT Token-2022; mint SPL Token klasik tetap pada supply nol karena program itu tidak dapat menutup mint. Jangan tutup akun yang didukung secara terpisah atau instruksi akan kembali.
  • Membuka limit order pada tick non-spaced → TickAndSpacingNotMatch. Selalu kuantisasi melalui pembantu getOrderTick yang diekspor.
  • Memanggil decreaseLimitOrder pada order yang sepenuhnya diisi → InvalidOrderPhase. Gunakan settleLimitOrder kemudian closeLimitOrder sebagai gantinya.
  • Mengharapkan flag enableDynamicFee → tidak ada. Menghilangkan dynamicFeeConfig hanya membuat pool biaya statis, diam-diam dan tanpa kesalahan. Jika Anda menginginkan biaya dinamis, teruskan PublicKey akun konfigurasi, dipilih dari /main/clmm-dynamic-config.

Ke mana selanjutnya

Sumber: