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 →
Kurulum
raydium-sdk-V2-demo/src/clmm içindeki bir dosyaya karşılık gelir; ilgili GitHub bağlantısı her bölümün yanında yer alır. Başlangıç yapılandırması, demo deposundaki config.ts.template dosyasını takip eder (kaynak). Karmaşık bir entegrasyonda disableFeatureCheck: true ayarını kullanmanızı öneririz:
CLMM havuzu oluşturma
Kaynak:src/clmm/createPool.ts
- Türetme işleminden önce
mint1/mint2değerlerini bayt sırasına göre sıralar. sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64)değerini hesaplar.observationvetick_array_bitmap_extensionhesaplarını oluşturur.ammConfigile tanımlanan havuz oluşturma ücretini öder.
Seçilen aralıkta pozisyon açma
Kaynak:src/clmm/createPosition.ts
OpenPosition* eksik bir tick dizisini kendisi oluşturur ve masrafını ödeyen cüzdan öder.
Mevcut bir pozisyonda likiditeyi artırma
Kaynak:src/clmm/increaseLiquidity.ts
Likiditeyi azaltma (ve aynı anda ücretleri toplama)
Kaynak:src/clmm/decreaseLiquidity.ts ve src/clmm/closePosition.ts
decreaseLiquidity çağrısını liquidity = new BN(0) ile yapın. Talimatın yan etkisi, token_fees_owed_{0,1} ve reward_amount_owed alanlarını kapatıp bu tutarları dışarı aktarmaktır. İkisini de toplamanın tek yolu budur.
Likiditeyi ve ücretleri sıfırladıktan sonra pozisyonu tamamen kapatmak için son decreaseLiquidity çağrısında ownerInfo: { closePosition: true } değerini geçirin. SDK, ClosePosition talimatını ekler ve NFT’yi yakar.
Doğrudan bir Anchor istemcisi kullanıyorsanız bildirilen hesapları olduğu gibi bırakın ve havuzu ekleyin:
poolId değerini geçebilirsiniz. CLMM bu değeri yalnızca positionNftAccount donmuşsa okur. Böylece tek bir istemci yolu hem eski hem yeni pozisyonlarla uyumlu kalır.
Ödül(ler)i toplama
Kaynak:src/clmm/harvestAllRewards.ts
harvestAllRewards, geçirilen her havuzdaki her pozisyonu gezer. İşlem ücretlerini ve ödülleri kapatan sıfır likiditeli DecreaseLiquidity çağrılarını (ve varsa UpdateRewardInfos talimatlarını) gruplandırır. Gerektiğinde bunları birden fazla işleme böler.
Swap
Kaynak:src/clmm/swap.ts
Bu örnek, PoolUtils.computeAmountOutFormat yerine swapInternal ile simülasyon yapan src/clmm/swap.ts dosyasını yansıtır.
amountCalculated) ile swap’ın dokunacağı tam hesap listesini (accounts) döndürür.
Simülasyonun döndürdüğü remainingAccounts değerlerini her zaman iletin: eksik olursa swap, yol boyunca NotEnoughTickArrayAccount hatasıyla geri döner; fazla veya eski hesaplar ise yalnızca gereksiz hesaplama maliyeti yaratır.
PoolUtils.computeAmountOutFormat hâlâ mevcuttur, ancak bir ComputeClmmPoolInfo nesnesi
(getPoolInfoFromRpc fonksiyonunun döndürdüğü computePoolInfo, API pool nesnesi değil) ve iki
ek zorunlu argüman — tickarrayBitmapExtension ve blockTimestamp — gerektirir. Ayrıca
raydium.clmm.fetchTickArrays adında bir metot yoktur (fetchTickArrays bağımsız bir
fonksiyondur; modül düzeyindeki yardımcılar PoolUtils.fetchMultiplePoolTickArrays ile
getPoolInfoFromRpc tarafından döndürülen tickData ve tickArrays değerleridir).Özelleştirilebilir bir CLMM havuzu oluşturma
createCustomizablePool, havuz oluşturma anında dinamik ücret ve tek taraflı ücret anahtarlarını sunan giriş noktasıdır. createPool ile aynı yapıyı kullanır, ancak buna iki ek parametre eklenir:
createPool çalışmaya devam eder. Bu iki ayardan birine ihtiyacınız olduğunda createCustomizablePool kullanın. Zincir üstü hesap listesi için products/clmm/instructions sayfasına bakın.
Limit emirleri
Limit emri, kullanıcının girdisini tek bir tick’te bekletir ve bir swap o tick’i geçtiğinde FIFO sırasıyla gerçekleştirilir. Çıktılar, uzlaşma (settle) anında sahibinin ATA hesabına gönderilir; emrin doldurulması için sahibinin çevrimiçi olması gerekmez.Limit emri açma
Havuz başına bir limit emri yapılandırma hesabı yoktur vegetClmmLimitOrderConfigs() yardımcı fonksiyonu da yoktur — emirler tick’e göre anahtarlanır.
LimitOrderState PDA’sını (owner, nonce PDA, order nonce) üçlüsünden türetir, cüzdan başına LimitOrderNonce değerini artı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 miktar çıkarabilir; dolmuş kısım uzlaşmaya kadar kilitli kalır. Emir tamamen dolmuşsa her iki talimat da InvalidOrderPhase hatasıyla geri döner.
Dolmuş bir emri uzlaştırma
settleLimitOrder, emrin unfilled_ratio_x64 değerini kohort takipçisiyle karşılaştırır, dolan çıktıyı hesaplar ve bunu sahibinin ATA hesabına aktarır. Sahibi bu işlemi kendisi çağırabilir; zincir dışı bir operasyonel bekçi olan limit_order_admin da sahibi adına çağırabilir — çıktı yine sahibine gider.
Tamamen uzlaştırılmış emirleri kapatıp kira bedelini geri almak için tekil emirlerde closeLimitOrder, toplu olarak closeAllLimitOrder kullanın. Birçok emri birden uzlaştırmak için settleAllLimitOrder, bir v0 işlemine sığabildiği kadar SettleLimitOrder çağrısı ekler.
Bir cüzdanın bekleyen emirlerini listeleme (zincir dışı)
totalAmount / filledAmount / pendingSettle alanları aşamaları ayırt eder). Kapanmış emirlerin geçmişi için /limit-order/history/order/list-by-user?wallet=… (cüzdan başına, nextPageId ile sayfalanmış) kullanın; belirli bir emrin tüm 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ı:
Yaygın hatalar
- Tick uç noktalarının aralığa uymaması →
TickAndSpacingNotMatch. Her zamanTickUtil.getPriceAndTickile hizalayın (TickUtil, tekil olarak yazılır). SwapV2içinde yeterli tick dizisi verilmemesi →NotEnoughTickArrayAccount. ListeyiswapInternal(...).accountsçıktısından alın.- Bitmap uzantısı olmadan tam aralıklı pozisyon → Uzantı PDA’sı yazılabilir olmalıdır. SDK bunu otomatik olarak yönetir.
sqrt_price_x64değerinipriceile karıştırmak → Burada 2 katı farkı oluşturan bir karışıklık özellikle sorunludur. Emin değilseniz, fiyatı SDK’ya okunabilir bir fiyattan hesaplatın.- Ödülleri çok sık toplamak → Her toplama işlemi sıfır likiditeli bir
DecreaseLiquidityişlemidir ve bir işlem maliyeti doğurur. Birden fazla pozisyon içinharvestAllRewardsile toplu işlem yapın veexecuteçağrısının{ sequentially: true }parametresine ihtiyaç duyduğunu unutmayın. - NFT hesaplarını kendiniz kapatmak →
ClosePosition, NFT’yi yakar ve ilişkili ATA’sını kapatır. Token-2022 NFT mint’ini de kapatır. Klasik SPL Token mint’i ise, bu program mint’leri kapatamadığı için arzı sıfır olarak kalır. Desteklenen hesapları ayrıca kapatmayın; aksi halde işlem geri alınır. - Limit emrini aralığa uymayan bir tick’te açmak →
TickAndSpacingNotMatch. Her zaman dışa aktarılangetOrderTickyardımcı fonksiyonu ile tick değerini hizalayın. - Tamamen gerçekleşmiş bir emirde
decreaseLimitOrderçağırmak →InvalidOrderPhase. Bunun yerine öncesettleLimitOrder, ardındancloseLimitOrderkullanın. - Bir
enableDynamicFeebayrağı beklemek → Böyle bir bayrak yoktur.dynamicFeeConfigparametresini atlamak, hata vermeden sessizce sabit ücretli bir havuz oluşturur. Dinamik ücret istiyorsanız, yapılandırma hesabınınPublicKeydeğerini/tr/main/clmm-dynamic-configsayfasından seçerek geçirin.
Sırada ne var
sdk-api/typescript-sdk— SDK’nın tam yüzeyi.sdk-api/rest-api— fiyat teklifi ve havuz meta veri uç noktaları.user-flows/create-clmm-pool— koda dayanmayan adım adım anlatım.integration-guides/aggregator— CLMM’yi bir işlem yolunun parçası olarak yönlendirme.

