Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Pengaturan
raydium-sdk-V2-demo/src/clmm. Tautan GitHub berada di samping setiap bagian. Inisialisasi mengikuti config.ts.template di repositori demo (sumber). Untuk integrasi yang tidak sederhana, disableFeatureCheck: true direkomendasikan:
Membuat 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.
Membuka posisi pada rentang harga pilihan
Sumber:src/clmm/createPosition.ts
OpenPosition* sendiri mengalokasikan tick array yang belum ada, dengan biaya ditanggung oleh payer.
Menambah likuiditas pada posisi yang sudah ada
Sumber:src/clmm/increaseLiquidity.ts
Mengurangi likuiditas (sekaligus mengumpulkan biaya)
Sumber:src/clmm/decreaseLiquidity.ts dan src/clmm/closePosition.ts
decreaseLiquidity dengan liquidity = new BN(0). Efek samping instruksi ini adalah menyelesaikan token_fees_owed_{0,1} dan reward_amount_owed, lalu mentransfernya keluar. Ini satu-satunya cara untuk mengumpulkan keduanya.
Untuk menutup posisi sepenuhnya setelah likuiditas dan biaya dinolkan, berikan ownerInfo: { closePosition: true } pada pemanggilan decreaseLiquidity terakhir. SDK akan menambahkan ClosePosition dan membakar NFT-nya.
Untuk klien Anchor langsung, biarkan akun yang dideklarasikan tetap dan tambahkan pool:
poolId pada setiap close. CLMM hanya membacanya ketika positionNftAccount dibekukan, sehingga satu jalur klien tetap kompatibel dengan posisi lama maupun baru.
Mengumpulkan reward
Sumber:src/clmm/harvestAllRewards.ts
harvestAllRewards memproses setiap posisi di setiap pool yang diberikan. Ia mengelompokkan pemanggilan DecreaseLiquidity bernilai likuiditas nol yang menyelesaikan biaya dan reward (ditambah UpdateRewardInfos jika ada), lalu membaginya ke beberapa transaksi bila diperlukan.
Swap
Sumber:src/clmm/swap.ts
Contoh ini mengikuti src/clmm/swap.ts, yang melakukan simulasi dengan swapInternal, bukan PoolUtils.computeAmountOutFormat.
amountCalculated) beserta daftar akun persis yang akan disentuh oleh swap (accounts).
Selalu sertakan remainingAccounts yang dikembalikan simulasi: jika kurang, swap akan gagal di tengah penelusuran dengan NotEnoughTickArrayAccount; jika berlebih atau sudah usang, hanya membuang compute.
PoolUtils.computeAmountOutFormat masih tersedia, tetapi memerlukan ComputeClmmPoolInfo (yaitu
computePoolInfo dari getPoolInfoFromRpc, bukan objek pool dari API) serta dua argumen wajib
lainnya — tickarrayBitmapExtension dan blockTimestamp. Selain itu, tidak ada metode
raydium.clmm.fetchTickArrays (fetchTickArrays adalah fungsi mandiri; helper tingkat modul
yang tersedia adalah PoolUtils.fetchMultiplePoolTickArrays serta tickData / tickArrays yang
dikembalikan oleh getPoolInfoFromRpc).Membuat pool CLMM yang dapat dikustomisasi
createCustomizablePool adalah titik masuk yang menyediakan sakelar dynamic-fee dan single-sided-fee saat pool dibuat. Fungsi ini memakai bentuk parameter createPool ditambah dua parameter tambahan:
createPool tetap berfungsi untuk jalur fee default tanpa dynamic fee. Gunakan createCustomizablePool jika Anda membutuhkan salah satu dari kedua opsi tersebut. Lihat products/clmm/instructions untuk daftar akun on-chain.
Limit order
Limit order menyimpan input pengguna pada satu tick dan diisi secara FIFO ketika swap melintasi tick tersebut. Output dikirim ke ATA pemilik saat settlement; pemilik tidak perlu online agar order-nya terisi.Membuka limit order
Tidak ada akun konfigurasi limit order per pool maupun helpergetClmmLimitOrderConfigs() — order diidentifikasi berdasarkan tick.
LimitOrderState dari (owner, nonce PDA, order nonce), menaikkan LimitOrderNonce per dompet, dan memasukkan order ke dalam antrean FIFO pada tick tersebut.
Menambah / mengurangi order yang terbuka
decreaseLimitOrder hanya dapat menarik dari bagian order yang belum terisi; bagian yang sudah terisi terkunci hingga settlement. Kedua instruksi akan gagal dengan InvalidOrderPhase jika order sudah terisi penuh.
Settle order yang sudah terisi
settleLimitOrder membaca unfilled_ratio_x64 order terhadap cohort tracker, menghitung output yang sudah terisi, lalu mentransfernya ke ATA pemilik. Pemilik dapat memanggil fungsi ini sendiri; limit_order_admin (keeper operasional off-chain) juga dapat memanggilnya atas nama pemilik — output tetap dikirim ke pemilik.
Untuk menutup order yang sudah settle sepenuhnya guna mengambil kembali rent, gunakan closeLimitOrder (satu order) atau closeAllLimitOrder (batch). Untuk men-settle banyak order sekaligus, settleAllLimitOrder mengemas sebanyak mungkin pemanggilan SettleLimitOrder ke dalam satu tx v0.
Daftar order yang tersimpan di dompet (off-chain)
totalAmount / filledAmount / pendingSettle membedakan fasenya). Untuk riwayat order yang sudah ditutup gunakan /limit-order/history/order/list-by-user?wallet=… (per dompet, dipaginasi dengan nextPageId); untuk log event lengkap dari order tertentu gunakan /limit-order/history/event/list-by-pda?pda=….
Kerangka CPI Rust
SwapV2:
Kesalahan umum
- Titik ujung tick yang tidak sesuai spacing →
TickAndSpacingNotMatch. Selalu sesuaikan denganTickUtil.getPriceAndTick(TickUtildalam bentuk tunggal). - Jumlah tick array di
SwapV2tidak cukup →NotEnoughTickArrayAccount. Ambil daftarnya dariswapInternal(...).accounts. - Posisi full-range tanpa bitmap extension → PDA extension harus bisa ditulis (writable). SDK menanganinya secara otomatis.
- Menyamakan
sqrt_price_x64denganprice→ kesalahan faktor 2 di sini sangat merepotkan. Jika ragu, biarkan SDK menghitungnya dari harga yang mudah dibaca. - Mengklaim reward terlalu sering → setiap klaim adalah
DecreaseLiquiditydengan likuiditas nol dan memerlukan satu transaksi. Gabungkan denganharvestAllRewardsuntuk banyak posisi sekaligus, dan ingat bahwaexecute-nya membutuhkan{ sequentially: true }. - Menutup akun NFT secara manual →
ClosePositionmembakar NFT dan menutup ATA-nya. Instruksi ini juga menutup mint NFT Token-2022. Mint SPL Token klasik tetap ada dengan supply nol, karena program tersebut tidak dapat menutup mint. Jangan menutup akun yang didukung secara terpisah, karena instruksi akan gagal. - Membuka limit order pada tick yang tidak sesuai spacing →
TickAndSpacingNotMatch. Selalu kuantisasi dengan helpergetOrderTickyang diekspor. - Memanggil
decreaseLimitOrderpada order yang sudah terisi penuh →InvalidOrderPhase. GunakansettleLimitOrderlalucloseLimitOrdersebagai gantinya. - Mengharapkan flag
enableDynamicFee→ flag tersebut tidak ada. JikadynamicFeeConfigdihilangkan, pool yang dibuat hanya akan memakai biaya statis, tanpa peringatan atau error. Jika Anda ingin menggunakan biaya dinamis, berikanPublicKeydari akun konfigurasi yang dipilih dari/main/clmm-dynamic-config.
Langkah selanjutnya
sdk-api/typescript-sdk— referensi lengkap SDK.sdk-api/rest-api— endpoint quote dan metadata pool.user-flows/create-clmm-pool— panduan membuat pool tanpa kode.integration-guides/aggregator— merutekan CLMM sebagai bagian dari sebuah jalur swap.

