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 →
Tick’lerin neden var olduğu
CLMM’nin likiditesi fiyat aralıklarına yoğunlaştırılmıştır. Aralıkları zincir üzerinde yönetilebilir hale getirmek için fiyatlar tam sayı tick’lere nicelleştirilir; her tick bir öncekinin sabit bir katıdır: Bir tick, %0,01’lik bir fiyat hareketine veya yaklaşık 1 baz puana karşılık gelir. Eşleme şu şekildedir:MIN_TICK ve MAX_TICK, sqrt_price_x64’ün her iki uçta da u128’e sığması için seçilmiştir. Her pool, tick_lower >= MIN_TICK ve tick_upper <= MAX_TICK olmasını zorunlu kılar. Uygulamada web arayüzü, likiditeyi ulaşılamaz tick’lere kilitlemekten kaçınmak için aralığı çok daha dar bir şeye sınırlandırır.
Tick aralığı
Bir pool’unAmmConfig’i bir tick aralığı belirler — bir pozisyonun uç noktalar olarak kullanmasına izin verilen tek tick’ler. tick_spacing = 60 ise, yalnızca …, −120, −60, 0, 60, 120, … tick’leri geçerlidir. 31 uç noktasıyla bir pozisyon açmaya çalışmak InvalidTickIndex ile geri döner.
Yaygın yayınlanan aralıklar:
Aralık ne kadar kaba olursa, başlatılacak tick dizileri o kadar az, geniş bir pozisyon açmak o kadar ucuz ve fiyat sınırı o kadar bulanık olur. Volatil çiftler tipik olarak 120-aralık katmanlarında yaşar; stablecoin’ler 1-aralık katmanlarında yaşar.
Tick dizileri
Pool, tick başına durumu ayrı hesaplarda depolamaz. Bunun yerine,TICK_ARRAY_SIZE bitişik tick (mevcut Raydium CLMM’de 60) tek bir TickArrayState’e paketlenir. Dizinin ilk tick’i start_tick_index’idir ve tam olarak TICK_ARRAY_SIZE * tick_spacing tam sayı-tick birimini kapsar.
tick_spacing = 60 ve TICK_ARRAY_SIZE = 60 için:
- Her tick dizisi
60 × 60 = 3600tam sayı tick’i kapsar. start_tick_index3600’ün katıdır:…, -7200, -3600, 0, 3600, 7200, ….
tick_spacing = 60 konumunda t = 2040 uç noktasına sahip bir pozisyon, start_tick_index = 0 olan tick dizisinde yaşar. t = 4200 uç noktasına sahip bir pozisyon, start_tick_index = 3600 olan dizide yaşar.
Bir dizi ne zaman oluşturulur
Bir tick dizisi tembel yüklenir: içindeki herhangi bir tick’e başvuran ilk pozisyon diziyi başlatır ve kirayı öder. Swap’lar tick dizilerini başlatmaz — bitmap kullanarak başlatılmamış dizileri atlarlar. SDK’nın açık pozisyon akışı seçilen aralığı inceler, dokunduğu tick dizilerinin listesini hesaplar ve eksik olanlar varsaOpenPosition ile aynı işlemde init_tick_array talimatları ekler.
Tick dizileri kapatılmaz
Bir tick dizisi başlatıldıktan sonra, pool’un ömrü boyunca devam eder. Program,initialized_tick_count sıfıra döndükten sonra bile bir tick dizisini kapatmak için bir yol sunmaz. Tick dizileri için kira geri kazanımı yoktur; bir diziye dokunacak ilk pozisyon tarafından ödenen kira o hesaba kalıcı olarak kilitlenir. Bu kasıtlı bir ödünleşimdir: mevcut bir tick dizisini yeniden kullanmak sonraki her pozisyon için ücretsizdir, bu nedenle yoğun işlem gören bir pool, değişim ne olursa olsun (pool, start_tick_index) yuvası başına kira maliyetini yalnızca bir kez öder.
Bitmap
“Geçerli tick’in solundaki/sağındaki sonraki başlatılmış tick’i bul” hızlı olmalıdır — bir swap birçok tick’i geçebilir. Pool,PoolState’de tick 0 etrafında ±1.024 dizi aralığı için satır içi 1-bit-per-tick-array bitmap’i depolar. Bu aralığın dışında (tam aralık pozisyonları, egzotik kurulumlar), TickArrayBitmapExtension taşmayı sağlar.
Bir swap bitmap’i yürür: lowest_set_bit_above(tick_current_array_index) swap’ın doğru yönde geçtiği tarafta başlatılmış bir tick’e sahip sonraki diziyi verir. Bu dizi içinde, benzer bir bit taraması sonraki başlatılmış tick’i bulur.
liquidity_gross ve liquidity_net
Her başlatılmış tick iki likidite değeri depolar:
liquidity_gross— bu tick’i uç nokta olarak referans alan tüm pozisyonlar üzerindeL’nin toplamı.liquidity_grosssıfıra ulaştığında, tick başlatılmamış hale gelir ve bitmap’ten kaldırılabilir.liquidity_net— fiyat bu tick’i yukarı doğru hareket ederken (tick alanında soldan sağa) geçtiğinde pool seviyesiliquidity’ye işaretli değişim. Bu tick bir pozisyonun alt sınırı iseLboyutunda+Lkatkıda bulunur; bu pozisyonun üst sınırı ise−Lkatkıda bulunur.
- Pozisyon A:
tick_lower = -120,tick_upper = 0, likiditeL_A = 100. - Pozisyon B:
tick_lower = -60,tick_upper = 60, likiditeL_B = 50.
Farklı
tick_current değerleri için pool seviyesi liquidity:
tick_current = -180:liquidity = 0(herhangi bir pozisyondan önce)tick_current = -90:liquidity = 100(yalnızca A içinde)tick_current = -30:liquidity = 150(A ve B içinde)tick_current = 30:liquidity = 50(yalnızca B içinde)tick_current = 90:liquidity = 0(her ikisinin de ötesinde)
liquidity_net (muhtemelen negatif) değerini PoolState.liquidity’ye ekler. Bu tam Uniswap-v3 mekanizmasıdır.
Pozisyonlar NFT olarak
Raydium CLMM pozisyonu bir NFT’dir. Bir pozisyon açmak, çağıran kişinin cüzdanına arz 1 ile yepyeni bir mint basılmasını sağlar ve mint’in yetkisi CLMM programıdır. Program pozisyon sahipliğini CPI zamanında o mint’in bir ATA’sında bakiye tutan kişiye bağlar. Sonuçlar:- Pozisyonlar normalde aktarılabilir. Bir cüzdan, NFT’yi aktararak bir pozisyonu satabilir veya hava yoluyla gönderebilir. Yeni sahibi daha sonra
CollectRewards,IncreaseLiquidityvb. çağırabilir. İstisna, aşağıdaki kısıtlı-yayıncı yolu altında donmuş bir pozisyondur. - Pozisyonlar CLMM dışında adreslenebilir. Pazaryerleri ve cüzdanlar pozisyonları diğer NFT’ler gibi görüntüler. SDK, mint meta verilerine makul bir
name/symbolayarlar. - Bir pozisyonun PDA’sı NFT mint’inden türetilir. Şu anda kimin tuttuğunu bilmeden
PersonalPositionState’i bulabilirsiniz.
Kısıtlı-yayıncı pozisyonları
2026-08 yükseltmesinden sonra oluşturulan her pozisyon NFT mint’i, CLMMpool_state’ini dondurma yetkisi olarak kaydeder. Bu, her yeni pozisyonun donmuş olduğu anlamına gelmez. Sıradan pool’lar ve eşleşmeyen her pozisyon için NFT token hesabı donmuş ve aktarılabilir kalır. Pool PDA, CLMM programı dışında imza atamaz ve CLMM genel amaçlı bir dondurma talimatı sunmaz.
Dondurma her iki koşulu da gerektirir:
- Pozisyon
OpenPositionV2veyaOpenPositionWithToken22Nftaracılığıyla açılır. - En az bir pool vault mint, programın hardcoded kısıtlı-yayıncı listesinden bir dondurma yetkisine sahiptir.
OpenPosition V1 bu filtreyi uygulamaz. Mevcut liste için reference/program-addresses bölümüne bakın.
Donmuş bir pozisyon:
- NFT’sini başka bir token hesabına aktaramaz.
- NFT token hesabının sahibini değiştiremez.
- Kaydedilen sahibi imzaladığında likiditeyi artırabilir veya azaltabilir ve ücretleri veya ödülleri toplayabilir.
- Yine de kapatılabilir.
ClosePosition, pool PDA’yı kullanarak NFT hesabını çözer, NFT’yi yakar ve pozisyon hesaplarını aynı talimatla kapatır.
Token-2022 pozisyonları
CLMM,OpenPositionV2 aracılığıyla klasik SPL Token altında veya OpenPositionWithToken22Nft aracılığıyla Token-2022 altında bir pozisyon NFT’si basabilir. Her iki V2 yolu pool vault mint’lerini inceler ve aynı kısıtlı-yayıncı dondurma kuralını uygular. OpenPosition V1, eski klasik-token yoludur ve Token-2022 vault mint’lerine sahip bir pool’u hizmet veremez. Cüzdan ve pazaryeri uyumluluğu farklılık gösterir; Raydium’un arayüzü her iki NFT programını izler.
İzin verilen aralık kuralları
OpenPosition zamanında program şunları zorunlu kılar:
tick_lower < tick_upper.tick_lower % tick_spacing == 0vetick_upper % tick_spacing == 0.MIN_TICK <= tick_lowervetick_upper <= MAX_TICK.- Çağıran,
tick_lowervetick_upperiçeren tick dizilerini sağlamıştır — ya zaten başlatılmış ya da aynı işlemdeinit_tick_arrayaracılığıyla. - Bitmap uzantı hesabı, bu pozisyon uzantı aralığına uzanırsa.
InvalidTickIndex, NotApproved veya InsufficientLiquidity ile geri döner. reference/error-codes bölümüne bakın.
”Aralık içinde” vs “aralık dışında”
Bir pozisyon aralık içinde olduğundatick_lower <= tick_current < tick_upper. Yalnızca aralık içi pozisyonlar PoolState.liquidity’ye katkıda bulunur ve bu nedenle yalnızca onlar swap ücretleri kazanır.
Aralık dışı bir pozisyon:
- Aralığının geçtiği bir token’ın %100’ünü tutar. Spesifik olarak,
tick_current < tick_lowerise, pozisyon yalnızca token1’i tutar (fiyat uzaklaşarak tarafından zaten “satılmıştır”);tick_current >= tick_upperise, yalnızca token0’ı tutar. - Swap ücretleri kazanmaz.
- Pool’un ödül akışları aralık dışı likiditeye yayılırsa ödülleri tahakkuk ettirmeye devam eder — ancak Raydium’un varsayılan davranışı “yalnızca aralık içine yayıl”dır, Uniswap v3 kuralıyla eşleşir.
products/clmm/feesbölümüne bakın.
Yaygın entegrasyon tuzakları
- Aralık dışı uç noktalar. Hedef fiyattan bir tick hesaplayan kod,
OpenPosition’a geçirmeden öncetick_spacing’in katına yapışmalıdır. SDK yardımcıları (TickUtils.getTickWithPriceAndTickspacing) bunu yapar; ev yapımı matematik genellikle yapmaz. - Eksik tick dizileri. Geniş bir pozisyon açmak birkaç tick dizisini başlatmayı gerektirebilir; bunları yazılabilir hesaplar olarak geçmeyi unutmak geri döner. SDK’nın
openPositionFromBaselisteyi sizin için döndürür. - Swap’tan sonra eski tick.
tick_currentbir swap’ta birçok tick’i geçebilir. UX’iniz bir RPC çağrısından “geçerli tick” gösterirse ve daha sonra başka bir çağrıda bir pozisyon açarsa, canlı fiyata göre göreceli pozisyon düzinelerce tick kadar kapalı olabilir. İmzalamadan hemen önce yeniden getirin. - Ekstra meta veriye sahip pozisyon NFT’leri. Raydium pozisyonlarını tanıyan bir cüzdan oluşturursanız, pozisyon PDA / program verilerini ve hardcoded meta veri alanını kullanmayın. Yeni pozisyon mint’leri oluşturma sırasında pool PDA’yı mint ve dondurma yetkisi olarak kullanır; tek NFT basıldıktan sonra mint yetkisi kaldırılır.
- Her pozisyonun aktarılabilir olduğunu varsayma. Transfer, pazaryeri, emanet veya Burn & Earn eylemlerini göstermeden önce NFT token hesabının
isFrozendurumunu okuyun.
Sonraki adım
- Matematik — tick sınırlarının katıldığı swap adım adım ve ücret büyümesi türetmesi.
- Hesaplar —
TickArrayStatevePositionStatedüzenleri. - Ücretler ve ödüller — aralık içi olmanın ücret tahakkukunu nasıl kapıladığı.
algorithms/clmm-math— yoğunlaştırılmış likidite formüllerinin paylaşılan türetmesi.
raydium-io/raydium-clmm—tick_array,tick,positionmodülleri- “Uniswap v3 Core” teknik raporu, §6 (tick’ler), §7 (ücret büyümesi)

