Skip to main content
Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Apa yang dilakukan ini. Membuat pool CLMM baru pada tingkat biaya pilihan Anda, kemudian membuka posisi terkonsentrasi awal. Dua transaksi di empat file — config.ts, createPool.ts, createPosition.ts, dan utils.ts — dijalankan dengan npx tsx. Kode diambil dari demo resmi di raydium-sdk-V2-demo/src/clmm dan disesuaikan untuk berjalan mandiri.

Persiapan

Pastikan Anda telah membaca prasyarat Quick start dan memiliki RPC_URL, KEYPAIR, dan dependensi yang terinstal. Selain dependensi di quickstart, Anda memerlukan:
  • decimal.js — matematika harga dan tick di createPool.ts dan createPosition.ts.
  • bs58 — mendekode keypair yang dikodekan base58 di config.ts jika Anda menggunakan KEYPAIR_BS58 alih-alih file keyfile JSON.
  • tsx — menjalankan file .ts di bawah secara langsung melalui npx tsx; tidak seperti skrip swap dan CPMM, ini bukan file .mjs biasa yang dijalankan dengan node.
Pembuatan pool CLMM memiliki biaya satu kali ditambah sewa per-tick-array untuk posisi awal. Anda juga memerlukan kedua mint seed di dompet Anda — membuka posisi ketika harga berada di dalam rentang yang dipilih memerlukan likuiditas di kedua sisi. Menjalankan ini di devnet. Mengubah cluster menjadi "devnet" di config.ts saja tidak cukup. createPool.ts melewatkan programId: CLMM_PROGRAM_ID yang eksplisit, konstanta mainnet tetap yang tidak mengikuti cluster — tukarnya dengan baris DEVNET_PROGRAM_ID.CLMM_PROGRAM_ID yang dikomentari tepat di atasnya. createPosition.ts juga hardcode poolId mainnet (pool RAY-USDC); gantilah dengan ID pool devnet yang Anda buat di Langkah 2.

Langkah 1 — config.ts

Simpan sebagai config.ts. Ini memiliki bentuk yang sama dengan src/config.ts.template repo demo — disableFeatureCheck dipaksa menjadi true (direkomendasikan untuk integrasi non-trivial apa pun sehingga SDK tidak memblokir pada panggilan feature-detect startup-nya):
config.ts

Langkah 2 — createPool.ts

Simpan bersama config.ts. Sumber: src/clmm/createPool.ts.
createPool.ts

Langkah 3 — createPosition.ts

Sumber: src/clmm/createPosition.ts.
createPosition.ts

Langkah 4 — utils.ts

Sumber: src/clmm/utils.ts.
utils.ts

Jalankan

Apa yang baru saja terjadi

Transaksi 1 — raydium.clmm.createPool menginisialisasi:
  • state pool di PDA kanonik untuk (mint1, mint2, ammConfig),
  • token_0_vault dan token_1_vault (diurutkan berdasarkan urutan byte mint),
  • ring buffer observation,
  • bitmap tick-array inline,
dan menetapkan sqrt_price_x64 awal dari initialPrice Anda. Transaksi 2 — raydium.clmm.openPositionFromBase membuka posisi terkonsentrasi:
  • mencetak NFT posisi ke dompet Anda (NFT adalah posisi; mentransfernya mentransfer posisi),
  • mengalokasikan tick array di batas bawah dan atas (sewa satu kali jika posisi pertama di rentang tersebut; tick array tidak pernah ditutup oleh program, jadi posisi berikutnya di array yang sama tidak membayar sewa tambahan),
  • menyetor inputAmount dari mint1 dan jumlah pasangan yang cocok dari mint2 (dihitung oleh PoolUtils.getLiquidityAmountOutFromAmountIn),
  • mengkredit posisi dengan likuiditas sebanding dengan lebar rentang.
Semakin sempit rentangnya, semakin tinggi efisiensi modal per dolar TVL — dan semakin menyakitkan kerugian impermanent ketika harga bergerak di luar rentang. Rentang yang digunakan di atas ([0.000001, 100000]) secara efektif full-range; perketat untuk memusatkan biaya di dekat spot saat ini.

Memilih tingkat biaya

clmmConfigs[0] adalah tingkat biaya terendah. Set lengkap dipublikasikan di GET https://api-v3.raydium.io/main/clmm-config: Lihat user-flows/choosing-a-pool-type untuk matriks keputusan lengkap.

Kesalahan umum

  • Pool already exists for this config — Pool CLMM sudah ada untuk triple (mint1, mint2, ammConfig) ini. Cari ID pool yang ada dan lewati Langkah 2.
  • Insufficient funds for amount B — Dompet Anda memiliki jumlah mintA yang diminta tetapi tidak memiliki mintB yang cocok. Membuka posisi ketika harga berada di dalam rentang memerlukan likuiditas di kedua sisi.
  • Tick out of rangelowerPrice atau upperPrice Anda berada di luar rentang harga yang dapat direpresentasikan. Gunakan rentang yang lebih masuk akal relatif terhadap harga saat ini.
  • Harga basi — Kutipan dari API dapat berusia 5–60 detik. Jika executePosition gagal pada slippage, batalkan komentar blok getRpcClmmPoolInfo di createPosition.ts untuk mengambil harga langsung tepat sebelum menandatangani.

Peringatan

  • NFT posisi adalah satu-satunya pegangan Anda. Kehilangan NFT atau mentransfernya, kehilangan akses ke posisi. Perlakukan seperti kunci.
  • Posisi out-of-range tidak menghasilkan biaya. Jika harga bergerak di luar [lowerPrice, upperPrice], posisi Anda diparkir sepenuhnya dalam satu aset dan tidak menghasilkan apa pun sampai Anda menyeimbangkan kembali.
  • Sewa tick array adalah satu arah. Posisi pertama yang menyentuh tick array yang tidak pernah diinisialisasi membayar sewanya; program tidak mengekspos jalur untuk menutup tick array, jadi sewa itu permanen. Posisi berikutnya di array yang sama gratis.

Selanjutnya

Sumber: