Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Catatan versi. Semua demo menargetkan
@raydium-io/raydium-sdk-v2@0.2.42-alpha di Solana mainnet-beta, diverifikasi pada April 2026. Program ID berasal dari reference/program-addresses melalui SDK.Persiapan
raydium-sdk-V2-demo/src/clmm; tautan GitHub tersedia di setiap bagian. Konfigurasi awal mengikuti config.ts.template dari repo demo (sumber) — disableFeatureCheck: true adalah pengaturan yang direkomendasikan untuk integrasi apa pun yang tidak trivial:
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 tertentu
Sumber:src/clmm/createPosition.ts
InitTickArray jika ada yang belum diinisialisasi.
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 tokens_fees_owed_{0,1} dan mentransfernya keluar.
Untuk menutup posisi sepenuhnya setelah likuiditas dan biaya dinolkan, gunakan closePosition: true pada pemanggilan decreaseLiquidity terakhir. SDK akan menambahkan ClosePosition dan membakar NFT.
Mengumpulkan reward
Sumber:src/clmm/harvestAllRewards.ts
harvestAllRewards menelusuri setiap posisi di setiap pool yang diberikan, mengelompokkan instruksi CollectReward (dan UpdateRewardInfos jika diperlukan), lalu membaginya ke beberapa transaksi bila ukuran melebihi batas.
Swap
Sumber:src/clmm/swap.ts
computeAmountOutFormat menelusuri peta tick secara off-chain menggunakan logika yang sama dengan program on-chain, dan mengembalikan:
- jumlah output yang diharapkan,
- jumlah output minimum setelah slippage,
- daftar akun tick array yang akan digunakan oleh swap (
remainingAccounts).
remainingAccounts yang dikembalikan oleh simulasi: jika terlalu sedikit, swap akan gagal di tengah jalan dengan error TickArrayNotFound; jika data sudah usang, compute unit akan terbuang sia-sia.
Membuat pool CLMM yang dapat dikustomisasi
createCustomizablePool adalah entry point baru yang mengekspos toggle dynamic-fee dan single-sided-fee saat pembuatan pool. Strukturnya sama dengan createPool, ditambah tiga parameter baru:
createPool tetap berfungsi untuk jalur biaya default tanpa limit order dan dynamic fee. Gunakan createCustomizablePool bila Anda membutuhkan salah satu dari tiga pengaturan baru tersebut. Lihat products/clmm/instructions untuk daftar akun on-chain.
Limit order
Limit order menempatkan input pengguna pada satu tick tertentu dan dieksekusi secara FIFO ketika sebuah swap melewati tick tersebut. Output dikirim ke ATA pemilik saat penyelesaian; pemilik tidak perlu online untuk dieksekusi.Membuka limit order
LimitOrderState dari (pool, owner, tick, nonce), menaikkan LimitOrderNonce per-(pool, owner), dan memasukkan order ke dalam antrean FIFO pada tick tersebut.
Menambah / mengurangi order yang masih aktif
decreaseLimitOrder hanya dapat mengurangi bagian yang belum terisi dari order; bagian yang sudah terisi dikunci hingga penyelesaian. Kedua instruksi akan gagal dengan error InvalidOrderPhase jika order sudah sepenuhnya terisi.
Menyelesaikan order yang sudah terisi
settleLimitOrder membaca unfilled_ratio_x64 order terhadap pelacak cohort, menghitung output yang terisi, lalu mentransfernya ke ATA pemilik. Pemilik dapat memanggilnya sendiri; limit_order_admin (keeper operasional off-chain) juga dapat memanggilnya atas nama pemilik — output tetap dikirim ke pemilik.
Untuk menutup order yang sudah sepenuhnya diselesaikan guna memulihkan rent, gunakan closeLimitOrder (tunggal) atau closeAllLimitOrder (batch). Untuk menyelesaikan banyak order sekaligus, settleAllLimitOrder mengemas sebanyak mungkin panggilan SettleLimitOrder yang muat dalam satu transaksi v0.
Melihat daftar order aktif suatu wallet (off-chain)
totalAmount / filledAmount / pendingSettle membedakan fase-fasenya). Untuk riwayat order yang sudah ditutup, gunakan /limit-order/history/order/list-by-user?wallet=… (per-wallet, dipaginasi dengan nextPageId); untuk log lengkap event suatu order tertentu, gunakan /limit-order/history/event/list-by-pda?pda=….
Kerangka CPI Rust
SwapV2:
Kesalahan umum yang perlu dihindari
- Tick endpoint tidak sesuai spacing →
InvalidTickIndex. Selalu sesuaikan melaluiTickUtils.getPriceAndTick. - Tick array yang disuplai ke
SwapV2tidak mencukupi →TickArrayNotFound. GunakancomputeAmountOutFormatuntuk mendapatkan daftar lengkapnya. - Posisi full-range tanpa bitmap extension → PDA extension harus writable; SDK menangani ini secara otomatis.
- Mengacaukan
sqrt_price_x64denganprice→ selisih faktor-2 di sini sangat menyakitkan. Jika ragu, biarkan SDK menghitungnya dari harga yang dapat dibaca manusia. - Mengumpulkan reward terlalu sering → setiap pengumpulan menghabiskan satu transaksi. Kelompokkan dengan
harvestAllRewardsuntuk banyak posisi sekaligus. - Membakar NFT saat rent masih terutang ke mint →
ClosePositionjuga menutup NFT mint dan ATA; jangan tutup keduanya secara terpisah atau program akan gagal. - Membuka limit order pada tick yang tidak sesuai spacing →
InvalidTickIndex. Selalu kuantisasi melaluiTickUtils.getPriceAndTick. - Memanggil
decreaseLimitOrderpada order yang sudah sepenuhnya terisi →InvalidOrderPhase. GunakansettleLimitOrderlalucloseLimitOrdersebagai gantinya. - Lupa mengisi
dynamicFeeConfigIdsaatenableDynamicFee: true→CreateCustomizablePoolakan gagal dengan errorInvalidDynamicFeeConfigParams. Nonaktifkan dynamic fee, atau pilih konfigurasi dari/main/clmm-dynamic-config.
Langkah selanjutnya
sdk-api/typescript-sdk— antarmuka lengkap SDK.sdk-api/rest-api— endpoint quote dan metadata pool.user-flows/create-clmm-pool— panduan non-kode pembuatan pool.integration-guides/aggregator— menggunakan CLMM sebagai bagian dari routing.

