Skip to main content
Bu sayfa yapay zekâ tarafından otomatik olarak çevrilmiştir. İngilizce sürüm esas alınır.İngilizce sürümü görüntüle →
Sürüm notu. Tüm TypeScript örnekleri @raydium-io/raydium-sdk-v2@0.2.64-alpha hedeflemektedir; son olarak 0.2.42-alpha (2026-04) karşısında çalıştırılmış ve çağrı imzaları 2026-09-09 tarihinde 0.2.64-alpha kaynağına karşı Solana mainnet-beta üzerinde yeniden kontrol edilmiştir. Sonundaki Rust CPI iskeleti master üzerinde raydium-clmm hedeflemektedir ve Anchor =0.32.1 sabitlemektedir — CPMM sayfasının kullandığı 1.0.2 değildir; ikisi bir crate içinde yaşayamaz. Program ID’leri reference/program-addresses üzerinden SDK aracılığıyla gelir.

Kurulum

Bu sayfadaki her örnek raydium-sdk-V2-demo/src/clmm içindeki bir dosyayı yansıtır; GitHub bağlantısı her bölümün yanında yer alır. Bootstrap, demo repo’nun config.ts.template (kaynak) izler — disableFeatureCheck: true herhangi bir önemsiz entegrasyon için önerilen ayardır:

CLMM havuzu oluşturun

Kaynak: src/clmm/createPool.ts
SDK:
  • Türetme öncesinde mint1/mint2 öğelerini bayt sırasına göre sıralar.
  • sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64) hesaplar.
  • observation ve tick_array_bitmap_extension hesaplarını oluşturur.
  • ammConfig tarafından tanımlanan havuz oluşturma ücretini öder.

Seçilen aralıkta pozisyon açın

Kaynak: src/clmm/createPosition.ts
SDK, aralığın dokunduğu tick dizilerini hesaplar ve bunları hesap olarak iletir. Herhangi bir init talimatını paketlemeye gerek yoktur — init-tick-array talimatı yoktur; OpenPosition* eksik bir tick dizisini kendisi ayırır, ödeyenin masrafına.

Mevcut bir pozisyonda likiditeyi artırın

Kaynak: src/clmm/increaseLiquidity.ts

Likiditeyi azaltın (ve aynı anda ücretleri toplayın)

Kaynak: src/clmm/decreaseLiquidity.ts ve src/clmm/closePosition.ts
Yalnızca ücretleri ve ödülleri toplamak için, decreaseLiquidity öğesini liquidity = new BN(0) ile çağırın. Talimatın yan etkisi token_fees_owed_{0,1} ve reward_amount_owed öğelerini kapatmak ve bunları aktarmaktır — bu, ikisini de toplamak için tek yoldur. Likiditeyi ve ücretleri sıfırladıktan sonra pozisyonu tamamen kapatmak için, son decreaseLiquidity çağrısında ownerInfo: { closePosition: true } geçirin. SDK ClosePosition ekler ve NFT’yi yakar.
Kısıtlı yayıncı pozisyonları uyumlu bir kapatma oluşturucusu gerektirir. Bu pozisyonların dondurulmuş bir NFT token hesabı vardır. ClosePosition, CLMM’nin hesabı yakmadan önce çözmesi için pozisyonun havuz ID’sini ilk kalan hesap olarak eklemelidir. Program kaynağı dalı bir SDK değişikliği içermez. Kısıtlı yayıncı pozisyon oluşturmayı etkinleştirmeden önce SDK sürümünüzün açıkça dondurulmuş kapatma yolunu desteklediğini doğrulayın.
Doğrudan bir Anchor istemcisi için, bildirilen hesapları değişmeden tutun ve havuzu ekleyin:
Her kapatmada poolId geçirebilirsiniz. CLMM bunu yalnızca positionNftAccount dondurulduğunda okur, bu da bir istemci yolunu eski ve yeni pozisyonlarla uyumlu tutar.

Ödülü (ödülleri) toplayın

Kaynak: src/clmm/harvestAllRewards.ts
harvestAllRewards, iletilen her havuzdaki her pozisyonu yürür, ücretleri ve ödülleri kapatmak için sıfır likidite DecreaseLiquidity çağrılarını (artı herhangi bir UpdateRewardInfos) toplu hale getirir ve gerekirse işlemler arasında böler.

Swap

Kaynak: src/clmm/swap.ts
Simülasyon, tick haritasını zincir dışında, zincir üstü program ile aynı mantıkla yürür ve çıktı miktarını (amountCalculated) artı swap’ın dokunacağı tam hesap listesini (accounts) döndürür. Her zaman simülasyonun döndürdüğü remainingAccounts öğesini geçirin: çok az ve swap NotEnoughTickArrayAccount ile yürüyüş ortasında geri döner; eski olanlar sadece işlem harcamasını boşa harcar.
PoolUtils.computeAmountOutFormat hala var, ancak bir ComputeClmmPoolInfo (API havuzu nesnesi değil, getPoolInfoFromRpc öğesinden computePoolInfo) artı iki daha gerekli argüman — tickarrayBitmapExtension ve blockTimestamp — gerektirir ve raydium.clmm.fetchTickArrays yöntemi yoktur (fetchTickArrays serbest bir işlevdir; modül düzeyindeki yardımcılar PoolUtils.fetchMultiplePoolTickArrays ve getPoolInfoFromRpc tarafından döndürülen tickData / tickArrays öğeleridir).

Özelleştirilebilir CLMM havuzu oluşturun

createCustomizablePool, havuz oluşturma zamanında dinamik ücret ve tek taraflı ücret geçişlerini ortaya çıkaran giriş noktasıdır. createPool şeklini artı iki ek alır:
enableDynamicFee bayrağı yok ve dynamicFeeConfigId parametresi yok ve startTime yok. dynamicFeeConfig sağlamak dinamik ücretleri etkinleştirir — bunu atlayın ve statik ücretli bir havuz alırsınız, hatasız. Ayrıca SDK enum üyeleri TokenOnlyA / TokenOnlyB iken, zincir üstü Rust enum’u Token0Only / Token1Only olarak yazar; sayısal değerler eşleşir (FromInput = 0).
createPool varsayılan ücret, dinamik ücret yok yolu için çalışmaya devam eder. Her iki düğmeye de ihtiyacınız olduğunda createCustomizablePool kullanın. Zincir üstü hesap listesi için products/clmm/instructions bölümüne bakın.

Limit emirleri

Bir limit emri, kullanıcı girdisini tek bir tick’te park eder ve bir swap bu tick’i geçtiğinde FIFO olarak doldurulur. Çıktılar, sahibinin ATA’sına kapatma zamanında itilir; sahibinin doldurulması için çevrimiçi olması gerekmez.

Limit emri açın

SDK, LimitOrderState PDA’sını (owner, nonce PDA, order nonce) öğesinden türetir, cüzdan başına LimitOrderNonce öğesini çıkarır ve emri o tick’teki FIFO kohortuna ekler.

Açık bir emri artırın / azaltın

decreaseLimitOrder yalnızca emrin doldurulmamış kısmından kaldırabilir; doldurulmuş kısım kapatılana kadar kilitlenir. Her iki talimat da emir zaten tamamen doldurulduysa InvalidOrderPhase ile geri döner.

Doldurulmuş bir emri kapatın

settleLimitOrder, emrin unfilled_ratio_x64 öğesini kohort izleyicisine karşı okur, doldurulmuş çıktıyı hesaplar ve sahibinin ATA’sına aktarır. Sahibi bunu kendileri çağırabilir; limit_order_admin (çevrimdışı operasyonel bekçi) de sahibinin adına çağırabilir — çıktı yine de sahibine gider. Tamamen kapatılan emirleri kira kurtarmak için kapatmak için closeLimitOrder (tek) veya closeAllLimitOrder (toplu) kullanın. Aynı anda birçoğunu kapatmak için, settleAllLimitOrder kadar çok SettleLimitOrder çağrısını bir v0 tx’e sığdırır.

Bir cüzdanın park edilmiş emirlerini listeleyin (çevrimdışı)

Etkin emirler uç noktası, doldurulmamış ve kısmen doldurulmuş emirleri bir yüklemede döndürür (totalAmount / filledAmount / pendingSettle aşamaları ayırt eder). Kapalı emir geçmişi için /limit-order/history/order/list-by-user?wallet=… kullanın (cüzdan başına, nextPageId ile sayfalandırılmış); belirli bir emrin tam olay günlüğü için /limit-order/history/event/list-by-pda?pda=… kullanın.

Rust CPI iskeleti

SwapV2 için kalan hesap sırası:
Swap hiçbir zaman uzantıya ihtiyaç duymazsa, bunu atlayın; aksi takdirde ilk kalan hesaptır.

Yaygın tuzaklar

  • Aralık dışı tick uç noktaları → TickAndSpacingNotMatch. Her zaman TickUtil.getPriceAndTick (tekil TickUtil) aracılığıyla yapıştırın.
  • SwapV2 içinde sağlanan yeterli tick dizisi yok → NotEnoughTickArrayAccount. Listeyi swapInternal(...).accounts öğesinden alın.
  • Bitmap uzantısı olmayan tam aralık pozisyonu → uzantı PDA yazılabilir olmalı; SDK bunu otomatik olarak işler.
  • sqrt_price_x64 öğesini price ile karıştırmak → burada 2 faktörlü bir karışıklık özellikle acı vericidir. Şüphe duyduğunuzda, SDK’nın bunu insan tarafından okunabilir bir fiyattan hesaplamasına izin verin.
  • Ödülleri çok hevesli toplamak → her toplama sıfır likidite DecreaseLiquidity ve bir işlem maliyeti. harvestAllRewards aracılığıyla birçok pozisyon arasında toplu hale getirin ve execute öğesinin { sequentially: true } gerektirdiğini unutmayın.
  • NFT hesaplarını kendiniz kapatmak → ClosePosition NFT’yi yakar ve ATA’sını kapatır. Ayrıca Token-2022 NFT mint’ini kapatır; klasik SPL Token mint’i sıfır arzda kalır çünkü bu program mint’leri kapatamaz. Desteklenen hesapları ayrı olarak kapatmayın veya talimat geri döner.
  • Limit emrini boşluksuz olmayan tick’te açmak → TickAndSpacingNotMatch. Her zaman dışa aktarılan getOrderTick yardımcısı aracılığıyla nicelleyin.
  • Tamamen doldurulmuş bir emride decreaseLimitOrder çağırmak → InvalidOrderPhase. Bunun yerine settleLimitOrder sonra closeLimitOrder kullanın.
  • enableDynamicFee bayrağı beklentisi → yok. dynamicFeeConfig öğesini atlayarak, sessizce ve hatasız statik ücretli bir havuz oluşturursunuz. Dinamik ücretler istiyorsanız, /main/clmm-dynamic-config öğesinden seçilen yapılandırma hesabının PublicKey öğesini geçirin.

Sonraki adımlar

Kaynaklar: