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 →
Bu sayfa her hesabın düzenini ve rolünü açıklar. Seed’ler kanonik olup reference/program-addresses sayfasında listelenmiştir. CLMM pool’u, CPMM pool’undan daha fazla hesap içerir; bunun nedeni likiditenin tick aralığı boyunca seyrek biçimde depolanmasıdır. Bu seyrekliği anlamak, sayfanın büyük bölümünü oluşturur.

Hesap envanteri

Canlı bir CLMM pool’u aşağıdaki hesap aileleriyle tanımlanır. İki mint ve bunların vault’ları dışındaki tüm hesaplar CLMM programına aittir.

PoolState

Pool’un canlı durumu; her swap’ta ve her pozisyon değişikliğinde okunur.
Gerçekte dokunacağınız alanlar:
  • sqrt_price_x64 ve tick_current, pool’un fiyat durumunu temsil eder. Her swap’ta birlikte güncellenir. tick_current, log_{1.0001}(price) ifadesinin tabanıdır.
  • liquidity, aktif likiditeyi temsil eder; yani aralığı tick_current’ı içeren tüm pozisyonların L değ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}_x64, tüm pool geçmişi boyunca likidite birimi başına kazanılan kümülatif ücretlerdir. Pozisyonlar, kendilerine ne kadar ücret düştüğünü hesaplamak için bunu okur.
  • tick_spacing, başlatma sırasında AmmConfig’e kilitlenir ve asla değişmez. Hangi tick indekslerinin pozisyon bitiş noktası olarak kullanılabileceğini belirler.
  • tick_array_bitmap, spot fiyat etrafındaki yaygın kullanım aralığını kapsayan satır içi bir bitmap’tir. Pozisyonları çok uzağa ulaşan pool’larda taşma takibi, ayrı bir TickArrayBitmapExtension hesabında tutulur.
  • fee_on, pool oluşturulurken sabitlenir. 0 (FromInput), klasik Uniswap-V3 davranışını yeniden üretir. 1 ve 2, swap ücretini kitabın tek bir tarafına yönlendirir; ödünleşimler için bkz. products/clmm/fees.
  • dynamic_fee_info, dinamik ücret farkı için volatilite durumunu taşır. Etkinleştirildiğinde, her swap AmmConfig.trade_fee_rate’in üzerine bir dynamic_fee_component yeniden hesaplar. Düzeni aşağıdaki DynamicFeeInfo başlığında belgelenmiştir; dinamik ücretsiz pool’lar bu struct’ın tamamını sıfır olarak bırakır.

AmmConfig

Yayımlanmış tipik CLMM ücret kademesi seti (doğrulamak için GET https://api-v3.raydium.io/main/clmm-config): protocol_fee_rate ve fund_fee_rate, işlem ücretinin kesirlerini temsil eder; CPMM ile aynı konvansiyondur. Bkz. products/clmm/fees.

TickArrayState

CLMM, tick başına tek bir kayıt depolamaz; bu milyarlarca hesap anlamına gelirdi. Bunun yerine TICK_ARRAY_SIZE adet bitişik başlatılmış-ya-da-başlatılmamış tick’i (program sürümüne bağlı olarak tipik olarak 60 veya 88) tembel bir şekilde ilk kullanımda oluşturulan bir TickArrayState içinde gruplar.
Dört limit emir alanı, hiçbir zaman limit emir için kullanılmamış her tick’te sıfırdır. Bir tick’te emirler açıldığında program bunları bir dizi kohort olarak izler:
  • order_phase, kohort kimliğidir. Bir kohort “tamamen doldurulmamış” durumundan “kısmen doldurulmuş” durumuna her geçtiğinde bir artar.
  • orders_amount, mevcut (en yeni) kohortun giriş tokeni toplamıdır.
  • part_filled_orders_remaining, devam eden swap’lar tarafından doldurulmakta olan bir önceki kohoru izler.
  • unfilled_ratio_x64, kohort üzerinde taşınan bir Q64.64 çarpanıdır: bir swap kohortun %X’ini doldurduğunda oran (1 − X) ile çarpılır. Her açık emir, açılış anındaki kendi (order_phase, unfilled_ratio_x64) anlık görüntüsünü depolar; bu sayede kapatma hesabı anlık görüntülerin karşılaştırılmasına indirgenir.
Kurallar:
  • Bir pozisyon bitiş noktası tick’i t, t % tick_spacing == 0 koşulunu sağlamalıdır. Program, spacing dışındaki pozisyonları reddeder.
  • Tick’in array’i, floor(t / (TICK_ARRAY_SIZE * tick_spacing)) * (TICK_ARRAY_SIZE * tick_spacing) konumunda yer alır.
  • Tick array tembel olarak başlatılır: başlatılmamış bir array’e ilk dokunan pozisyon veya swap onu oluşturur ve rent’i öder.
  • Tick array program tarafından hiçbir zaman kapatılmaz. Bir kez tahsis edildikten sonra, içindeki her tick liquidity_gross == 0’a dönsе bile pool’un ömrü boyunca varlığını sürdürür. Sonraki pozisyonlar ve swap’lar mevcut hesabı ek rent ödemeksizin yeniden kullanır. Tick array’ler için ClosePosition kaynaklı bir temizleme yolu yoktur.

TickArrayBitmapExtension

PoolState.tick_array_bitmap (satır içi) “spot fiyata yakın” aralığı kapsar — ±1.024 tick array. Bu aralığın dışında (aşırı tick değerleri için) program bir uzantı hesabı tutar:
Pozisyon aralığınız “normalse” uzantı hesabını hiç düşünmenize gerek yoktur. Tam aralıklı pozisyonlar (örn. (MIN_TICK, MAX_TICK)) için gereklidir; SDK bunu sizin adınıza çözer.

Pozisyonlar

Bir CLMM pozisyonu, bir mint ile birlikte üç hesaptan oluşan bir pakettir:

Pozisyon NFT mint’i

Arzı 1 olan bir SPL Token mint’i. Mint’in adresi deterministik bir PDA’dır; sahibinin cüzdanındaki pozisyon NFT’si yalnızca o tek tokeni tutan bir ATA’dır. NFT’yi transfer etmek, pozisyonu el değiştirmenin yoludur — program yetkilendirmeyi durumda depolanan bir Pubkey’e değil, NFT’nin ATA bakiyesinin mevcut sahibine bağlar.

PersonalPositionState

Her açık pozisyon için bir tane. NFT mint’iyle anahtarlanır.

ProtocolPositionState (kullanımdan kaldırıldı)

Eski CLMM sürümleri, (pool, tick_lower, tick_upper) başına toplu muhasebe bilgilerini bir ProtocolPositionState PDA’sında saklıyordu. Yeni sürümler artık bu hesabı oluşturmuyor veya okumуyor. Yuva, ABI uyumluluğu için OpenPosition / IncreaseLiquidity / DecreaseLiquidity hesap listelerinde UncheckedAccount olarak görünmeye devam etmektedir; ancak program artık ona yazmamaktadır. Zincir üzerindeki mevcut hesaplar artık kullanılmayan kalıntılardır; yönetici, bunların rent’ini geri almak için CloseProtocolPosition’ı çağırabilir.Toplu aralık muhasebesi artık TickArrayState içindeki iki bitiş noktası tick’inden (liquidity_gross, liquidity_net ve tick başına fee_growth_outside_* / reward_growths_outside_x64) doğrudan türetilmektedir. fee_growth_inside = global − outside_lower − outside_upper formülü, toplu pozisyon hesabı olmadan çalışmaya devam etmektedir.

Gözlem

CLMM’nin gözlem arabelleği kümülatif bir fiyat değil, kümülatif bir tick depolar. Dış tüketiciler geometrik ortalama fiyatı bir aralık üzerinden (tick_cumulative[t1] − tick_cumulative[t0]) / (t1 − t0) ile hesaplar ve ardından price = 1.0001 ** tick uygular. Bkz. algorithms/clmm-math.

DynamicFeeConfig ve DynamicFeeInfo

Dinamik ücret parametreleri iki yerde bulunur. Yeniden kullanılabilir şablon olan DynamicFeeConfig, yönetici tarafından yönetilir ve dahil olan pool’larda paylaşılır. Pool başına çalışma zamanı durumu olan DynamicFeeInfo ise PoolState içine gömülüdür ve her swap tarafından güncellenir.

DynamicFeeConfig

PDA seed’i: ["dynamic_fee_config", index.to_be_bytes()]. create_dynamic_fee_config (yönetici kısıtlı) aracılığıyla oluşturulur ve update_dynamic_fee_config ile değiştirilir. enable_dynamic_fee = true ile oluşturulan bir pool, oluşturulma anında yapılandırmanın beş kalibrasyon parametresini (filter_period, decay_period, reduction_factor, dynamic_fee_control, max_volatility_accumulator) kendi DynamicFeeInfo’suna anlık görüntü olarak kaydeder; DynamicFeeConfig’te yapılan sonraki düzenlemeler mevcut pool’ları geriye dönük olarak etkilemez.

DynamicFeeInfo (PoolState içine gömülü)

Alt dört alan durum bilgisidir; üstteki beş alan DynamicFeeConfig’ten 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

Her açık limit emir için bir hesap.
Yaşam döngüsü:
  1. Açma — kullanıcı open_limit_order’ı çağırır, total_amount kadar giriş tokenini yatırır ve emir bir TickState kohortuna bağlanır.
  2. (isteğe bağlı) Artırma / Azaltmaincrease_limit_order, total_amount’a ekler; decrease_limit_order, doldurulmamış tokenleri (ve o noktaya kadar kapatılmış çıktıyı) iade eder.
  3. Kapatma — kohort tamamen veya kısmen dolduğunda, sahip ya da operasyonel bekçi, çıktı tokenlerini sahibin ATA’sına göndermek için settle_limit_order’ı çağırır.
  4. Kapamaunfilled_amount == 0 olduğunda hesap kapatılabilir. Rent her zaman owner’a geri döner.
PDA seed’i: [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

Tek bir kullanıcının PDA çakışması olmadan birden fazla paralel limit emir hattı yürütmesine olanak tanıyan (cüzdan, nonce_index) başına sayaç.
PDA seed’i: [user_wallet.as_ref(), &[nonce_index]]. Çoğu istemci nonce_index = 0 kullanır ve kardinaliteyi order_nonce’a bırakır.

Temel hesapların türetilmesi

Tam seed dizelerini her zaman zincir üzerindeki IDL ve reference/program-addresses sayfasıyla çapraz doğrulamanız önerilir.

Yaşam döngüsü hızlı başvurusu

TickArrayState hesapları program tarafından hiçbir zaman kapatılmaz — pool’un ömrü boyunca varlığını sürdürürler. Bir tick array başlatıldıktan sonra, içindeki her tick liquidity_gross == 0’a dönsе bile zincir üzerinde kalmaya devam eder. Mevcut bir tick array’i yeniden kullanmak ücretsizdir; yalnızca daha önce hiç başlatılmamış bir array’e ilk dokunan pozisyon rent’i öder.

Neyi nerede okuyacaksınız

Kaynaklar: