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ü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 anlamaya ayrılmıştır.

Hesap envanteri

Canlı bir CLMM havuzu aşağıdaki hesap aileleri tarafından tanımlanır. CLMM programına ait olanlar hariç tümü, iki mint ve bunların vault’ları program tarafından sahiplenilir.

PoolState

Havuzun canlı durumu, her swap ve her pozisyon değişikliğinde okunur.
Gerçekten dokunacağınız alanlar:
  • sqrt_price_x64 ve tick_current havuzun fiyat durumudur. Her swap’ta birlikte güncellenir. tick_current, log_{1.0001}(price) tabanının tabanıdır.
  • liquidity aktif likidite — aralığı tick_current içeren tüm pozisyonların L değerlerinin toplamıdır. Bir swap her tick’i geçtiğinde ve her pozisyon açıldığında/kapatıldığında/yeniden boyutlandırıldığında değişir.
  • fee_growth_global_{0,1}_x64 tü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_spacing başlatmada AmmConfig’e kilitlenir ve asla değişmez. Hangi tick indekslerine pozisyon uç noktaları olarak izin verildiğini belirler.
  • tick_array_bitmap spot fiyat etrafındaki yaygın olarak kullanılan tick aralığını kapsayan bir satır içi bitmap’tir. Pozisyonları uzağa ulaşan havuzlar için taşma izlemesi ayrı TickArrayBitmapExtension içinde yaşar.
  • fee_on havuz oluşturmada 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şmeler için products/clmm/fees bölümüne bakınız.
  • seed_index CreatePool / CreateCustomizablePool aracılığıyla oluşturulan her havuz için [0, 0] değerindedir (çift başına bir kanonik havuz). Sıfır olmayan bir değer, havuzun CreateCustomizablePoolV2 (2026-10-22 öncesinde CreatePermissionedPool adında) aracılığıyla oluşturulduğu ve dizinin havuzun PDA seed’lerinin bir parçası olduğu anlamına gelir; bu da aynı (config, mint0, mint1) için birkaç havuzun bir arada bulunmasını sağlar. Böyle bir havuzun adresini yeniden türetmek için seed_index değerini bilmeniz gerekir.
  • dynamic_fee_info dinamik ücret artışı için oynaklık durumunu taşır. Etkinleştirildiğinde, her swap AmmConfig.trade_fee_rate üzerine bir dynamic_fee_component yeniden hesaplar. Düzen DynamicFeeInfo altında belgelenmiştir; dinamik ücret olmayan havuzlar tüm yapıyı sıfır bırakır.

AmmConfig

2026-09 güncellemesinden bu yana, CreateAmmConfig programın sabit kodlanmış protocol_fee_owner::ID değerini owner içine ve fund_fee_owner::ID değerini fund_owner içine yazar. Bundan önce, yönetici imzalayanın anahtarını her ikisine de kopyalardı. Mevcut konfigürasyonlar oluşturuldukları veya döndürüldükleri şeyi tutar, bu nedenle her iki alanı da hesaptan okuyun. UpdateAmmConfig parametreleri 3 / 4 yine de bunları döndürür. Adresler reference/program-addresses içindedir. Tipik bir yayınlanmış CLMM ücret katmanları seti (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ız.

TickArrayState

CLMM, tek bir tick için ayrı bir kayıt tutmaz. Bu milyarlarca hesap olurdu. Bunun yerine TICK_ARRAY_SIZE bitişik başlatılmış-veya-başlatılmamış 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çinde gruplandırır.
Dört limit-order alanı, hiçbir zaman limit order için kullanılmamış herhangi bir tick’te sıfırdır. Bir tick’te emirler açıldığında, program bunları bir kohort dizisi olarak izler:
  • order_phase kohort kimliğidir. Bir kohort “tamamen doldurulmamış” durumundan “kısmen doldurulmuş” durumuna geçtiğinde her seferinde artar.
  • orders_amount, mevcut (en yeni) kohortu giriş-token toplamıdır.
  • part_filled_orders_remaining, devam eden swaplar tarafından doldurulmakta olan önceki kohortu izler.
  • unfilled_ratio_x64, kohort ü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.
Kurallar:
  • Bir pozisyon uç noktası tick’i t, t % tick_spacing == 0 koş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: bir pozisyon veya swap’ın başlatılmamış bir diziyi ilk kez dokunması onu oluşturur ve kirayı öder.
  • Bir tick dizisi program tarafından asla kapatılmaz. Tahsis edildikten sonra, içindeki her tick liquidity_gross == 0 durumuna döndükten sonra bile havuzun ömrü boyunca devam eder. Sonraki pozisyonlar ve swaplar mevcut hesabı ek kira ödemeden yeniden kullanır. Tick dizileri için ClosePosition tarafından yönlendirilen temizleme yolu yoktur.

TickArrayBitmapExtension

PoolState.tick_array_bitmap (satır içi) “spot’a yakın” aralığını kapsar — ±512 tick dizileri (TICK_ARRAY_BITMAP_SIZE = 512; [u64; 16] alanı 1.024 bit olup negatif ve pozitif başlangıç indeksleri arasında eşit olarak bölünür, bu nedenle dizi indeksleri −512 … +511). Bu aralığın dışında (aşırı tick değerleri için), program bir uzantı hesabı tutar:
Pozisyonunuzun aralığı “normal” ise, uzantı hesabı hakkında hiç düşünmezsiniz. Tam aralık pozisyonları (örn. (MIN_TICK, MAX_TICK)) bunu gerektirir; SDK bunu sizin için çözer.

Pozisyonlar

Bir CLMM pozisyonu, üç hesap artı bir mint’in bir paketidir:

Pozisyon NFT mint’i

Arz 1 olan bir SPL Token veya Token-2022 mint’i. Sahibinin cüzdanındaki pozisyon NFT’si, o tek token’ı tutan bir ATA’dır. Program yetkilendirmeyi durumda depolanan bir Pubkey’e değil, NFT’nin ATA bakiyesinin mevcut sahibine anahtarlar. Yeni pozisyon NFT mint’leri, tek token’ı basmadan ve mint yetkilendirmesini kaldırmadan önce pool_state’i dondurma yetkilisi olarak ayarlar. Bir dondurma yetkilisi ayarlamak, NFT hesabını kendiliğinden dondurmaz. Hesap, her iki koşul da geçerli olmadığı sürece donmuş ve aktarılabilir kalır: çağıran OpenPositionV2 veya OpenPositionWithToken22Nft kullanır ve en az bir temel kasa mint’inin dondurma yetkilisi CLMM’nin kısıtlı-yayıncı listesinde görünür. Yalnızca o zaman CLMM, basımdan sonra NFT hesabını dondurur. Bu, PersonalPositionState veya PoolState baytlarında hiçbir değişiklik yapmaz.

PersonalPositionState

Açık her pozisyon için bir tane. NFT mint’i kapalı anahtarlanmış.

ProtocolPositionState (kullanımdan kaldırılmış)

Eski CLMM sürümleri, (pool, tick_lower, tick_upper) başına toplam muhasebe bilgilerini 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, bunlar için kirayı geri almak üzere CloseProtocolPosition’ı çağırabilir.Toplam aralık muhasebesi artık doğrudan iki uç noktası tick’inden (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

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

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

PDA seed: ["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’suna kaydeder; DynamicFeeConfig’e yapılan sonraki düzenlemeler mevcut havuzları geriye dönük olarak etkilemez.

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

Alt dört alan durumdur; üst beş alan DynamicFeeConfig’ten kopyalanan kalibrasyon parametreleridir. Ü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 her limit emir için bir hesap.
Yaşam döngüsü:
  1. Aç — kullanıcı open_limit_order’ı çağırır, giriş token’ının total_amount’ını yatırır, emir bir TickState kohortuna bağlanır.
  2. (isteğe bağlı) Artır / Azalt — increase_limit_order total_amount’a ekler; decrease_limit_order doldurulmamış token’ları (ve o noktaya kadar herhangi bir kapatılmış çıktıyı) döndürür.
  3. Kapat — kohort tamamen veya kısmen doldurulduğunda, sahip veya operasyonel bekçi çıktı token’larını sahibinin ATA’sına göndermek için settle_limit_order’ı çağırır.
  4. Kapat — unfilled_amount == 0 olduğunda, hesap kapatılabilir. Kira her zaman owner’a döner.
PDA seed: [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

Belirli bir (wallet, nonce_index) çifti için sayaç; tek bir kullanıcının limit order’ların birden fazla paralel pipeline’ını PDA çarpışması olmadan çalıştırmasını sağlar.
PDA seed: [user_wallet.as_ref(), &[nonce_index]]. Çoğu istemci nonce_index = 0 kullanır ve order_nonce’nin kardinaliteyi taşımasına izin verir.

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

Permission hesabı 2026-10-22 yükseltmesinde kaldırılmıştır. Daha önce CreatePermissionedPool’u kontrol ederdi; bu işlem artık izinsiz CreateCustomizablePoolV2 olmuştur. Program artık bu hesapları okumaz veya kapatmaz ve CreatePermissionPda / ClosePermissionPda talimatları ortadan kalkmıştır. Yükseltmeden önce oluşturulan PDA’lar (["permission", authority], 280 bayt) zincir üzerinde atıl veri olarak kalır; CLMM’ye ait hesapları taradığınızda bunları yoksayın.

Anahtar hesapları türetme

Tam seed dizgeleri her zaman zincir üzerindeki IDL ve 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 kalırlar. Bir tick dizisi başlatıldıktan sonra, içindeki her tick liquidity_gross == 0 konumuna döndüğünde bile zincir üzerinde kalır. Mevcut bir tick dizisini yeniden kullanmak ücretsizdir; yalnızca hiç başlatılmamış bir diziye dokunacak ilk pozisyon kirasını öder.

Nerede ne okuyacağınız

Kaynaklar: