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 →
Bu sayfa her hesabın düzeni ve rolünü açıklar. Seed’ler kanonik olup
reference/program-addresses içinde listelenmiştir. CLMM havuzu, CPMM havuzundan daha fazla hesap gerektiren bir yapıdır çünkü likidite tick aralığı boyunca seyrek şekilde depolanır; bu sayfanın büyük bölümü bu seyrekliği anlamakla ilgilidir.Hesap envanteri
Canlı bir CLMM havuzu aşağıdaki hesap aileleri tarafından tanımlanır. Tümü CLMM programına aittir; iki mint ve bunların vault’ları hariç.PoolState
Havuzun canlı durumu, her swap ve her pozisyon değişikliğinde okunur.
sqrt_price_x64vetick_currenthavuzun fiyat durumudur. Her swap’ta birlikte güncellenir.tick_current,log_{1.0001}(price)tabanıdır.liquidityaktif likidite — aralığıtick_currentiçeren tüm pozisyonlarınLdeğerlerinin toplamıdır. Bir swap bir tick’i geçtiğinde ve bir pozisyon açıldığında/kapatıldığında/yeniden boyutlandırıldığında değişir.fee_growth_global_{0,1}_x64tüm havuz geçmişi boyunca likidite birimi başına kazanılan kümülatif ücretlerdir. Pozisyonlar kendilerine ne borçlu olduğunu hesaplamak için bunu okur.tick_spacingbaşlatmadaAmmConfig’e kilitlenir ve asla değişmez. Hangi tick indekslerine pozisyon uç noktası olarak izin verildiğini belirler.tick_array_bitmapspot fiyatın etrafındaki yaygın olarak kullanılan aralığı kaplayan satır içi bir bitmap’tir (±1.024 tick dizisi). Pozisyonlar çok uzağa ulaşan havuzlar için taşma izlemesi ayrıTickArrayBitmapExtensioniçinde yaşar.fee_onhavuz oluşturmada sabitlenir.0(FromInput) klasik Uniswap-V3 davranışını yeniden üretir.1ve2swap ücretini kitabın tek bir tarafına yönlendirir — ödünleşmeler içinproducts/clmm/feesbölümüne bakın.seed_indexCreatePool/CreateCustomizablePoolaracılığıyla oluşturulan her havuz için[0, 0]değerindedir. Sıfır olmayan bir değer, havuzunCreatePermissionedPoolaracılığıyla oluşturulduğu ve dizinin havuzun PDA seed’lerinin bir parçası olduğu anlamına gelir; aynı(config, mint0, mint1)için birkaç havuzun bir arada bulunmasını sağlar. Böyle bir havuzun adresini yeniden türetmek içinseed_indexdeğerini bilmeniz gerekir.dynamic_fee_infodinamik ücret surşarjı için volatilite durumunu taşır. Etkinleştirildiğinde, her swapAmmConfig.trade_fee_rateüzerine birdynamic_fee_componentyeniden hesaplar. DüzenDynamicFeeInfoaltında belgelenmiştir; dinamik ücret olmayan havuzlar tüm yapıyı sıfır bırakır.
AmmConfig
GET https://api-v3.raydium.io/main/clmm-config ile doğrulayın):
protocol_fee_rate ve fund_fee_rate işlem ücretinin kesintileridir; CPMM ile aynı kural. products/clmm/fees bölümüne bakın.
TickArrayState
CLMM tek bir tick başına bir kayıt depolamaz. Bu milyarlarca hesap olurdu. Bunun yerine TICK_ARRAY_SIZE bitişik başlatılmış-veya-değil tick’leri (program sürümüne bağlı olarak tipik olarak 60 veya 88) ilk kullanımda tembel olarak oluşturulan bir TickArrayState içine gruplandırır.
order_phasekohort kimliğidir. Bir kohort “tümü doldurulmamış” durumundan “kısmen doldurulmuş” durumuna geçtiğinde artar.orders_amountmevcut (en yeni) kohortu giriş-token toplamıdır.part_filled_orders_remainingşu anda devam eden swap’lar tarafından doldurulmakta olan önceki kohortu izler.unfilled_ratio_x64kohort üzerinde taşınan bir Q64.64 çarpanıdır: bir swap kohortu X% doldurduğunda, oran(1 − X)ile çarpılır. Her açık emir açılış zamanında kendi(order_phase, unfilled_ratio_x64)anlık görüntüsünü depolar, bu nedenle kapatma matematiği anlık görüntüleri karşılaştırmaya indirgenir.
- Bir pozisyon uç noktası tick’i t
t % tick_spacing == 0koşulunu sağlamalıdır. Program aralık dışı pozisyonları reddeder. - Tick’in dizisi
floor(t / (TICK_ARRAY_SIZE * tick_spacing)) * (TICK_ARRAY_SIZE * tick_spacing)konumunda bulunur. - Bir tick dizisi tembel olarak başlatılır: başlatılmamış bir diziyi ilk kez dokunacak pozisyon veya swap onu oluşturur ve kirayı öder.
- Bir tick dizisi program tarafından asla kapatılmaz. Bir kez tahsis edildikten sonra, içindeki her tick
liquidity_gross == 0durumuna döndükten sonra bile havuzun ömrü boyunca devam eder. Mevcut bir tick dizisini yeniden kullanmak hiçbir ek kira maliyeti olmadan yapılır. Tick dizileri içinClosePositiontarafından yönlendirilen temizleme yolu yoktur.
TickArrayBitmapExtension
PoolState.tick_array_bitmap (satır içi) “spot’a yakın” aralığını kapsar — ±1.024 tick dizisi. Bu aralığın dışında (aşırı tick değerleri için), program bir uzantı hesabı tutar:
(MIN_TICK, MAX_TICK)) bunu gerektirir; SDK bunu sizin için çözer.
Pozisyonlar
Bir CLMM pozisyonu üç hesap artı bir mint’in bir paketidir:Position NFT mint
Arz 1 olan bir SPL Token mint’i. Mint’in adresi deterministik bir PDA’dır; sahibinin cüzdanındaki position NFT’si sadece o tek token’ı tutan bir ATA’dır. NFT’yi aktarmak, bir pozisyonun el değiştirmesidir — program yetkilendirmeyi bir Pubkey’e depolanan değere değil, NFT’nin ATA bakiyesinin mevcut sahibine anahtarlar.PersonalPositionState
Açık pozisyon başına bir tane. NFT mint’ine göre anahtarlanır.
ProtocolPositionState (kullanımdan kaldırıldı)
Eski CLMM sürümleri
(pool, tick_lower, tick_upper) başına toplam muhasebe bilgisini bir ProtocolPositionState PDA’sında depoladı. Yeni sürümler artık bu hesabı oluşturmaz veya okumaz. Slot, ABI uyumluluğu için OpenPosition / IncreaseLiquidity / DecreaseLiquidity hesap listelerinde bir UncheckedAccount olarak görünmeye devam eder, ancak program buna yazmaz. Zincir üzerinde mevcut hesaplar kalıntıdır; yönetici kirayı geri almak için CloseProtocolPosition çağırabilir.Toplam aralık muhasebesi artık doğrudan iki uç noktası tick’ten (liquidity_gross, liquidity_net ve tick başına fee_growth_outside_* / reward_growths_outside_x64) TickArrayState içinde türetilir. Ücret-büyüme-içi formülü fee_growth_inside = global − outside_lower − outside_upper toplam pozisyon hesabı olmadan çalışmaya devam eder.Gözlem
(tick_cumulative[t1] − tick_cumulative[t0]) / (t1 − t0) aralığından geometrik-ortalama fiyatı hesaplar ve ardından price = 1.0001 ** tick hesaplar. algorithms/clmm-math bölümüne bakın.
DynamicFeeConfig ve DynamicFeeInfo
Dinamik ücret parametreleri iki yerde yaşar. Yeniden kullanılabilir şablon — DynamicFeeConfig — yönetici tarafından yönetilir ve katılan havuzlar arasında paylaşılır. Havuz başına çalışma zamanı durumu — DynamicFeeInfo — PoolState içine gömülü ve her swap tarafından güncellenir.
DynamicFeeConfig
["dynamic_fee_config", index.to_be_bytes()]. create_dynamic_fee_config (yönetici kapılı) aracılığıyla oluşturulur ve update_dynamic_fee_config aracılığıyla değiştirilir. enable_dynamic_fee = true ile oluşturulan bir havuz, yapılandırmanın beş kalibrasyon parametresini (filter_period, decay_period, reduction_factor, dynamic_fee_control, max_volatility_accumulator) oluşturma zamanında kendi DynamicFeeInfo içine anlık görüntü alır; DynamicFeeConfig için daha sonraki düzenlemeler mevcut havuzları geriye dönük olarak etkilemez.
DynamicFeeInfo (PoolState içine gömülü)
DynamicFeeConfig adresinden kopyalanan kalibrasyon değerleridir. Ücret matematiği ve bozunma kuralları products/clmm/math ve products/clmm/fees altında belgelenmiştir.
Formül tarafından kullanılan sabitler:
LimitOrderState
Açık limit emir başına bir hesap.
- Aç — kullanıcı
open_limit_orderçağırır, giriş token’ınıntotal_amountdeğerini depozit eder, emir birTickStatekohortuna bağlanır. - (isteğe bağlı) Artır / Azalt —
increase_limit_ordertotal_amountdeğerine ekler;decrease_limit_orderdoldurulmamış token’ları (ve o noktaya kadar kapatılan herhangi bir çıktıyı) döndürür. - Kapat — kohort tamamen veya kısmen doldurulduğunda, sahibi veya operasyonel bekçi çıktı token’larını sahibinin ATA’sına göndermek için
settle_limit_orderçağırır. - Kapat —
unfilled_amount == 0olduğunda, hesap kapatılabilir. Kira her zamanowneradresine döner.
[owner.as_ref(), limit_order_nonce.key().as_ref(), limit_order_nonce.order_nonce.to_be_bytes().as_ref()]. Emir PDA’sı bu nedenle (owner, nonce_index, order_nonce) başına benzersizdir.
LimitOrderNonce
Her (wallet, nonce_index) başına sayaç, tek bir kullanıcının PDA’larda çarpışmadan birden fazla paralel limit emir hattı çalıştırmasını sağlar.
[user_wallet.as_ref(), &[nonce_index]]. Çoğu istemci nonce_index = 0 kullanır ve order_nonce değerinin kardinaliteyi taşımasına izin verir.
Permission
Varlığı izin olan bir yetenek hesabı: belirli bir yetki için bir Permission PDA türetilirse, bu yetki CreatePermissionedPool çağırabilir. Oluşturulduğu yetkilendirmenin ötesinde hiçbir şey depolamaz.
["permission", authority.as_ref()]. Yönetici tarafından CreatePermissionPda aracılığıyla oluşturulur ve ClosePermissionPda aracılığıyla yıkılır (kira arayana döner). Her iki yönetici talimatı da program admin veya özel permission_pda_admin anahtarını kabul eder. PDA’yı kapatmak izni iptal eder — yetki artık ek havuzlar oluşturamaz, ancak zaten oluşturduğu havuzlar etkilenmez.
Anahtar hesapları türetme
reference/program-addresses ile karşılaştırılmalıdır.
Yaşam döngüsü hızlı referansı
TickArrayState hesapları program tarafından asla kapatılmaz — havuzun ömrü boyunca devam eder. Bir tick dizisi başlatıldıktan sonra, içindeki her tick liquidity_gross == 0 durumuna döndükten sonra bile zincir üzerinde kalır. Mevcut bir tick dizisini yeniden kullanmak ücretsizdir; yalnızca hiçbir zaman başlatılmamış bir diziyi ilk kez dokunacak pozisyon kirayı öder.
Nerede ne okuyacağınız
- Tick matematiği ve aralık mekaniği:
products/clmm/ticks-and-positions. - Swap yürüyüşü ve ücret-büyüme matematiği:
products/clmm/math. - Talimat hesap listeleri:
products/clmm/instructions. - Ücretler ve ödül tahakkuku:
products/clmm/fees. - Kanonik program kimlikleri ve seed’ler:
reference/program-addresses.

