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) sürümüne karşı ç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 iskeletinin hedefi raydium-clmm üzerinde chore/upgrade-anchor dalı, Anchor 1.0.2, CPMM sayfasıyla aynı pin olup, ikisi bir crate içinde yaşayabilir. master hâlâ 0.32.1 pinlemektedir. 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) dosyasını takip eder — disableFeatureCheck: true herhangi bir önemsiz entegrasyon için önerilen ayardır:

CLMM havuzu oluşturma

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çma

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, ödeyicinin masrafına.

Mevcut bir pozisyonda likidite artırma

Kaynak: src/clmm/increaseLiquidity.ts

Likiditeyi azaltma (ve aynı anda ücretleri toplama)

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, her ikisini de toplama tek yoludur. Likiditeyi sıfırladıktan ve ücretleri topladı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 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 dondurulmuş kapatma yolunu açıkça 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(leri) toplama

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 bunları işlemler arasında böler.

Swap

Kaynak: src/clmm/swap.ts
Simülasyon, tick haritasını zincir dışında, zincir üstü programla aynı mantıkla yürür ve çıkış 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 hâlâ var, ancak bir ComputeClmmPoolInfo (getPoolInfoFromRpc öğesinden computePoolInfo, API havuzu nesnesi değil) 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şturma

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, hata olmadan sessizce. Ayrıca SDK enum üyeleri TokenOnlyA / TokenOnlyB olup, zincir üstü Rust enum’u Token0Only / Token1Only yazarken; 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çma

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

Açık bir emri artırma / azaltma

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

Doldurulmuş bir emri kapatma

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 tutucu) da sahibinin adına çağırabilir — çıktı yine de sahibine gider. Tamamen kapatılmış emirleri kira kurtarmak için kapatmak için closeLimitOrder (tek) veya closeAllLimitOrder (toplu) kullanın. Aynı anda birçoğunu kapatmak için settleAllLimitOrder, bir v0 tx’e sığan kadar SettleLimitOrder çağrısını paketler.

Bir cüzdanın park edilmiş emirlerini listele (ç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 iskeletı

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 yasla.
  • 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 bir faktör-2 karışıklığı özellikle acı vericidir. Şüphe duyduğunuzda, SDK’nın bunu insan tarafından okunabilir bir fiyattan hesaplamasına izin verin.
  • Ödülleri çok hevesle toplama → 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 kapatma → 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 emri açma boşluk dışı tick’te → TickAndSpacingNotMatch. Her zaman dışa aktarılan getOrderTick yardımcısı aracılığıyla nicelleyin.
  • Tamamen doldurulmuş bir emride decreaseLimitOrder çağırma → InvalidOrderPhase. Bunun yerine settleLimitOrder sonra closeLimitOrder kullanın.
  • enableDynamicFee bayrağı bekleme → 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: