Ana içeriğe atla
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 CLMM’nin arkasındaki türetmeleri bir araya getirir. Zincir üzerindeki uygulama için, bkz. products/clmm/math (bu sayfaya atıfta bulunur) ve products/clmm/ticks-and-positions (tick ızgarasını motive eder).

Neden sqrt-fiyat, sadece fiyat değil

Uniswap-v3-benzeri CLMM’ler fiyatı karekök olarak gösterir ve sabit nokta Q64.64 içinde depolar:
Üç sebep:
  1. Doğrusal likidite matematiği. Bir fiyat aralığındaki token0 veya token1 miktarı, price değil sqrt_price doğrusal bir fonksiyonudur. sqrt_price depolamak, swap adımının karekök hesaplamadan bu doğrusal formülleri değerlendirmesine izin verir.
  2. Taşma kontrolü. sqrt_price · L tüm makul parametreler için u256 içine sığar; price · L çok daha erken taşabilir.
  3. Tick matematiği tekdüze. Tick’ler 1.0001^i olarak tanımlandığından, sqrt(price) = 1.00005^i de tam bir 1.00005 kuvvetleridir. Her tick-geçişi sqrt_price_x64 uzayında küçük bir çarpmaya çevirisi.
Fiyat ve sqrt-fiyat bire-birdir; dönüşüm price = (sqrt_price_x64 / 2^64)^2.

Tick ızgarası

Fiyatlar bir ızgaraya ayrıştırılır:
tick_i bir i32. Canlı aralık [MIN_TICK, MAX_TICK] = [−443636, 443636] olup kabaca [2^−128, 2^128] fiyat aralığı verir. Her havuzun tick_spacing’i, ücret katmanı tarafından ayarlanır: sıkı çiftler için daha küçük aralıklar (örn. stablecoin %0.01 katmanı aralık 1 kullanır), değişken çiftler için daha büyük aralıklar (%0.25 katmanı 60 kullanır, %1 katmanı 120). Pozisyonlar tick_lower ve tick_upper değerlerinin tick_spacing ile hizalı olması gerekir. Havuzun aktif tick’leri (likiditenin başladığı veya bittiği yerler) swap adımının önem verdiği tek tick’lerdir.

Likidite-miktar

Likidite L ve fiyat aralığı [sqrt_lo, sqrt_hi] (tüm sqrt_price değerleri) içeren bir pozisyon için: Türetim: CPMM değişmezini yerel olarak diferansiyel alınız. Herhangi bir tek tick aralığı içinde, pozisyon sanal rezervleri (x_v, y_v) ile CPMM olarak davranır ve havuzun geçerli (sqrt_p, L) ile L = sqrt(x_v · y_v) tutarlı olacak şekilde seçilir. sqrt_p’den aralık sınırına integre etmek yukarıdaki miktarları verir. Ters formüller (verilen amount0 veya amount1 için pozisyon mint ederken kullanılır):

Tek-tick swap adımı

Tek bir tick aralığı içinde havuz CPMM gibi davranır. Mevcut sqrt_p ve hedef sqrt_target verildiğinde:

Tam-giriş adımı

Δin_remaining verildiğinde:
0→1 swap sqrt_p’yi düşürür (fiyat token0 satarken düşer). 1→0 swap bunu yükseltir. Formüller sqrt_p ve sqrt_target yer değişmişken simetriktir.

Tam-çıkış adımı

Aynı yapı, bunun yerine Δin için çözer.

Çok-tick swap döngüsü

Bir swap giriş tükenene veya fiyat sınırına çarpılana kadar tick’ler üzerinde yinelenir:
Her single_step havuzun mevcut L’sini kullanır. L sadece başlatılmış bir tick geçildiğinde değişir. Tick’ler arasındaki likidite sabittir, bu da adım matematik kapalı-formunu mümkün kılar. Bir tick’teki liquidity_net o tick’te başlayan pozisyon likiditeleri eksi orada biten likiditelerin imzalı toplamıdır. Yukarı doğru geçiş liquidity_net ekler; aşağı doğru geçiş çıkarır. Havuzda bir tick’te limit emirleri açık olduğunda, geçiş-tick adımı aynı zamanda swap girişinin bir kısmını faydalı olarak bu emirleri doldurmak için tüketir (kohortlar arasında FIFO). Eşleştirme algoritması ve tabanfiyat adımının üstüne uygulanabilen dinamik-ücret artışı products/clmm/math içinde belgelenmiştir; yukarıdaki kapalı-formül tek-adım formüllerini değiştirmezler.

Ücret-büyüme biriktiriciler

CLMM, aktif likidite başına ücretleri, her tarafı, global ve tick başına izler:
Her single_step üzerinde:
(Diğer tarafın fee_growth_global bu adımda hareket etmez, çünkü o tarafta hiçbir token giriş olarak ödenmedi.) Bir tick geçildiğinde, program fee_growth_outside’ı çevirir:
“Dışarı” tick_current’e göreldir. tick_current tick’in üzerinde olduğunda, dışarı “aşağı” anlamına gelir. tick_current aşağında olduğunda, dışarı “yukarı” anlamına gelir. Çevirme yorumu değiştirir.

Bir pozisyon için fee_growth_inside

Pozisyon [tick_lower, tick_upper] ve mevcut tick_current verildiğinde:
Bir pozisyonun token tarafı s için toplanmayan ücretleri:
Bu güncelleme pozisyon ile her etkileşimde çalışır (IncreaseLiquidity, DecreaseLiquidity, CollectFees).

İşlenmiş örnek — bir tick’i geçme

Havuz (basitleştirilmiş):
  • sqrt_p_x64 = 2^64 · 1.0 = 2^64 (fiyat = 1.0)
  • L = 1_000_000
  • tick_current = 0
  • Altta sonraki başlatılmış tick: tick = −60, sqrt_price = 1.0001^(−30) ≈ 0.99700, liquidity_net = −400_000 (bu tick bir pozisyonu sonlandırır, bu nedenle aşağı doğru geçiş 400k çıkarır)
  • Ücret oranı: %0.25
Swap: Δin = 10_000 token0, yön = 0→1. Adım 1 — sqrt_target = 0.99700 · 2^64 kadar:
3.009 < 10.000, bu nedenle bu adımı tamamen doldururuz:
Adım 2 — yeni L = 600_000 ile: Sonraki başlatılmış tick (diyelim tick = −120) sqrt = 0.99402’de. amount_in_to_target’ı yeniden hesaplayınız:
Hâlâ Δin_remaining’ten az. Tekrar geçiniz. Δin_remaining sıfıra ulaşıncaya kadar devam ediniz. Δout’un tam dizisi nihai swap çıkışına birikir.

Başlatma ve taşma korumaları

  • MIN_SQRT_PRICE_X64 ve MAX_SQRT_PRICE_X64 tick = ±443636 ile karşılık gelir. sqrt_p’yi bu aralığın dışına itecek herhangi bir swap geri döner.
  • Kullanıcının sqrt_price_limit parametresi aynı aralıkta bulunmalıdır; program kontrol eder.
  • L · Δsqrt ürünleri u256 içinde hesaplanır, ardından taşmayı önlemek için u128 ye geri kaydırılır.

Uniswap v3’e karşı farklılıklar

  • Oracle. Raydium’un ObservationState bir (block_timestamp, tick_cumulative, seconds_per_liquidity_cumulative) halka tamponu depolar; Uniswap’ınkinden biraz farklı tel biçimi ama aynı TWAP matematik.
  • Token-2022. Raydium CLMM Token-2022 mintlerini destekler; transfer-ücret varyantı ek ön/son-swap miktar ayarlamaları gerektirir. Bkz algorithms/token-2022-transfer-fees.
  • Tick bitmap. Raydium başlatılmış-tick bitmap’i hızlı find_next_initialized_tick için havuz başına [u64; 16] içine paketler; Uniswap kelime başına zincir üzerinde bir eşlem kullanır. Tradeoff kira vs arama maliyetidir.
  • Ödül yuvaları. Raydium havuz başına 3 ayrı ödül akışını ayrı reward_growth_global_x64 sayaçları ile destekler; ücret-büyüme biriktiricisi ile aynı yapı.

İşaretçiler

Kaynaklar:
  • Uniswap v3 teknik raporu (sqrt-fiyat matematik kanonik türetimi).
  • Raydium CLMM program kaynağı.