Skip to main content
Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Banner versi. Semua demo menargetkan @raydium-io/raydium-sdk-v2@0.2.42-alpha terhadap Solana mainnet-beta, diverifikasi 2026-04. ID program berasal dari reference/program-addresses melalui SDK.

Setup

Setiap demo di halaman ini mencerminkan file dalam raydium-sdk-V2-demo/src/clmm; tautan GitHub berada di samping 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 secara otomatis menghitung tick array mana yang disentuh rentang dan membundel instruksi InitTickArray jika ada yang belum diinisialisasi.

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 saja, panggil decreaseLiquidity dengan liquidity = new BN(0). Efek samping instruksi adalah menyelesaikan tokens_fees_owed_{0,1} dan mentransfernya keluar. Untuk menutup posisi sepenuhnya setelah menolkan likuiditas dan biaya, teruskan 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 beku. 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 penutupan beku sebelum mengaktifkan pembuatan posisi penerbit terbatas.
Untuk klien Anchor langsung, pertahankan akun yang dideklarasikan tidak berubah dan tambahkan pool:
Anda dapat melewatkan poolId pada setiap penutupan. CLMM membacanya hanya ketika positionNftAccount beku, 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 dilewatkan, membuat batch instruksi CollectReward (dan UpdateRewardInfos apa pun), dan membaginya ke beberapa transaksi jika diperlukan.

Swap

Sumber: src/clmm/swap.ts
computeAmountOutFormat berjalan melalui peta tick secara offline menggunakan logika yang sama dengan program on-chain dan mengembalikan:
  • jumlah yang diharapkan keluar,
  • jumlah minimum keluar setelah slippage,
  • daftar akun tick-array yang akan disentuh swap sebenarnya (remainingAccounts).
Selalu teruskan remainingAccounts yang dikembalikan oleh simulasi: jika Anda melewatkan terlalu sedikit, swap akan kembali di tengah-jalan dengan TickArrayNotFound; jika Anda melewatkan yang sudah usang, komputasi terbuang.

Buat pool CLMM yang dapat disesuaikan

createCustomizablePool adalah titik masuk baru yang mengekspos toggle biaya dinamis dan biaya satu sisi pada waktu pembuatan pool. Ini mengambil bentuk yang sama dengan createPool ditambah tiga penambahan:
createPool terus bekerja untuk jalur biaya default, tanpa limit order, tanpa biaya dinamis. Gunakan createCustomizablePool kapan pun Anda memerlukan salah satu dari tiga tombol baru. 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 tersebut. Output didorong ke ATA pemilik pada waktu penyelesaian; pemilik tidak perlu online untuk diisi.

Buka limit order

SDK menurunkan PDA LimitOrderState dari (pool, owner, tick, nonce), meningkatkan LimitOrderNonce per-(pool, owner), dan menyisipkan pesanan ke dalam kohort FIFO pada tick tersebut.

Tingkatkan / kurangi pesanan terbuka

decreaseLimitOrder hanya dapat menghapus dari bagian yang belum diisi dari pesanan; bagian yang diisi dikunci sampai penyelesaian. Kedua instruksi kembali dengan InvalidOrderPhase jika pesanan sudah sepenuhnya diisi.

Selesaikan pesanan yang diisi

settleLimitOrder membaca unfilled_ratio_x64 pesanan 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 pesanan 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 transaksi v0.

Daftar pesanan yang diparkir dompet (off-chain)

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

Kerangka CPI Rust

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

Jebakan umum

  • Titik akhir tick off-spacingInvalidTickIndex. Selalu snap melalui TickUtils.getPriceAndTick.
  • Tidak cukup tick array yang disediakan dalam SwapV2TickArrayNotFound. Gunakan computeAmountOutFormat untuk mendapatkan daftar lengkap.
  • Posisi jangkauan penuh tanpa ekstensi bitmap → PDA ekstensi harus dapat ditulis; 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 memerlukan satu transaksi. Batch melalui harvestAllRewards di banyak posisi.
  • Menutup akun NFT sendiriClosePosition membakar NFT dan menutup ATA-nya. Ini juga menutup mint NFT Token-2022; mint SPL Token klasik tetap pada pasokan nol karena program itu tidak dapat menutup mint. Jangan tutup akun yang didukung secara terpisah atau instruksi akan kembali.
  • Membuka limit order pada tick yang tidak berspasiInvalidTickIndex. Selalu kuantisasi melalui TickUtils.getPriceAndTick.
  • Memanggil decreaseLimitOrder pada pesanan yang sepenuhnya diisiInvalidOrderPhase. Gunakan settleLimitOrder kemudian closeLimitOrder sebagai gantinya.
  • Lupa dynamicFeeConfigId sambil melewatkan enableDynamicFee: true → pengembalian CreateCustomizablePool adalah InvalidDynamicFeeConfigParams. Baik matikan biaya dinamis, atau pilih konfigurasi dari /main/clmm-dynamic-config.

Ke mana selanjutnya

Sumber: