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
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
- Mengurutkan
mint1/mint2berdasarkan urutan byte sebelum derivasi. - Menghitung
sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64). - Membuat akun
observationdantick_array_bitmap_extension. - Membayar biaya pembuatan pool yang ditentukan oleh
ammConfig.
Buka posisi dalam rentang pilihan
Sumber:src/clmm/createPosition.ts
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
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.
Untuk klien Anchor langsung, pertahankan akun yang dideklarasikan tidak berubah dan tambahkan pool:
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
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:
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
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)
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
SwapV2:
Jebakan umum
- Endpoint tick off-spacing →
TickAndSpacingNotMatch. Selalu snap melaluiTickUtil.getPriceAndTick(singularTickUtil). - Tidak cukup tick array yang disediakan dalam
SwapV2→NotEnoughTickArrayAccount. Ambil daftar dariswapInternal(...).accounts. - Posisi full-range tanpa ekstensi bitmap → PDA ekstensi harus writable; SDK menangani ini secara otomatis.
- Mengacaukan
sqrt_price_x64denganprice→ 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
DecreaseLiquidityzero-liquidity dan biaya satu transaksi. Batch melaluiharvestAllRewardsdi banyak posisi, dan ingatexecutememerlukan{ sequentially: true }. - Menutup akun NFT sendiri →
ClosePositionmembakar 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 pembantugetOrderTickyang diekspor. - Memanggil
decreaseLimitOrderpada order yang sepenuhnya diisi →InvalidOrderPhase. GunakansettleLimitOrderkemudiancloseLimitOrdersebagai gantinya. - Mengharapkan flag
enableDynamicFee→ tidak ada. MenghilangkandynamicFeeConfighanya membuat pool biaya statis, diam-diam dan tanpa kesalahan. Jika Anda menginginkan biaya dinamis, teruskanPublicKeyakun konfigurasi, dipilih dari/main/clmm-dynamic-config.
Ke mana selanjutnya
sdk-api/typescript-sdk— permukaan SDK lengkap.sdk-api/rest-api— endpoint quote dan metadata pool.user-flows/create-clmm-pool— panduan non-kode.integration-guides/aggregator— routing CLMM sebagai bagian dari jalur.

