Ana içeriğe atla

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

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 →

Neden tick’ler vardır?

CLMM’nin likiditesi fiyat aralıklarına yoğunlaştırılır. Aralıkları zincir üzerinde yönetilebilir hâle getirmek için fiyatlar tamsayı tick’lere nicemlenir; her tick, bir öncekinin sabit bir katıdır: price(i)=1.0001i\text{price}(i) = 1.0001^{\,i} Bir tick, %0,01’lik bir fiyat hareketine veya ~1 baz puana karşılık gelir. Eşleme şu şekildedir:
Tick indeksi iFiyat çarpanı
01.0000
1001.0100 (≈ +%1,00)
-1000.9900 (≈ −%0,99)
100002.7181 (≈ e)
MAX_TICK = 4436361.84e19
MIN_TICK = -4436365.42e-20
MIN_TICK ve MAX_TICK, sqrt_price_x64’ün her iki uçta da bir u128’e sığması için seçilir. Her pool, tick_lower >= MIN_TICK ve tick_upper <= MAX_TICK olmasını zorunlu kılar. Uygulamada, web arayüzü aralığı, kullanıcıların likiditeyi erişilemeyen tick’lere kilitlemesini önlemek için çok daha dar bir aralığa sınırlar.

Tick aralığı (Tick spacing)

Bir pool’un AmmConfig’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. Uç noktası 31 olan bir pozisyon açma denemesi, InvalidTickIndex ile geri döner. Yaygın yayımlanan aralıklar:
Ücret katmanıtrade_fee_rateTick aralığıTick pozisyonu başına en kalın fiyat adımı
0.01%10010.01%
0.05%500100.10%
0.25%2500600.60%
1.00%100001201.21%
Aralık ne kadar kaba ise, 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. Değişken çiftler tipik olarak 120 aralıklı katmanlarda yaşar; stabil çiftler 1 aralıklı katmanlarda yaşar.

Tick dizileri

Pool, tick başına durumu ayrı hesaplarda depolamaz. Bunun yerine, TICK_ARRAY_SIZE bitişik tick’leri (mevcut Raydium CLMM’de 60) tek bir TickArrayState’e paketler. Dizinin ilk tick’i start_tick_index’idir ve tam olarak TICK_ARRAY_SIZE * tick_spacing tamsayı-tick birimlerini kapsar. tick_spacing = 60 ve TICK_ARRAY_SIZE = 60 için:
  • Her tick dizisi 60 × 60 = 3600 tamsayı tick’i kapsar.
  • start_tick_index, 3600’ün katıdır: …, -7200, -3600, 0, 3600, 7200, ….
tick_spacing = 60 olan bir pozisyon uç noktası t = 2040, start_tick_index = 0 olan tick dizisinde yaşar. Bir pozisyon uç noktası t = 4200, start_tick_index = 3600 olan dizide yaşar.

Bir dizi ne zaman oluşturulur?

Bir tick dizisi tembel yüklenir: buna referans veren ilk pozisyon, dizi içindeki herhangi bir tick’i başlatır ve kiraya ödeme yapar. Swap’ler tick dizilerini başlatmaz — bitmap kullanarak başlatılmamış dizileri atlar. SDK’nın pozisyon açma akışı, seçilen aralığı inceler, dokunduğu tick dizilerinin listesini hesaplar ve herhangi biri eksikse aynı işlemde OpenPosition ile birlikte init_tick_array talimatları ekler.

Tick dizileri kapatılmaz

Bir tick dizisi başlatıldıktan sonra, pool’un ömrü boyunca kalıcı olur. Program, initialized_tick_count sıfıra dönse bile, bir tick dizisini kapatmak için bir yol sunmaz. Tick dizileri için kira geri alımı yoktur; bir diziye dokunmayan ilk pozisyon tarafından ödenen kira o hesapta kalıcı olarak kilitlenir. Bu bilinçli bir tradeoff’dur: mevcut bir tick dizisini yeniden kullanmak, sonraki her pozisyon için ücretsizdir, bu nedenle yoğun ticari bir pool, değişkenliğe bakılmaksızın (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 bitlik-tick dizisi bitmap’i depolar. Bu aralığın dışında (tam aralıklı 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 geçiş yaptığı tarafta başlatılmış bir tick’li bir sonraki diziyi verir. O dizinin 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ç noktalardan biri olarak referans veren tüm pozisyonlar üzerinden L’nin toplamı. liquidity_gross sıfıra ulaştığında, tick başlatılmamış hâle gelir ve bitmap’ten kaldırılabilir.
  • liquidity_net — fiyat bu tick’i yukarı doğru geçerken pool seviyesi liquidity’ye işaretli değişim (tick alanında soldan sağa). Bu tick, L boyutundaki bir pozisyonun alt sınırı ise, +L’ye katkıda bulunur; o pozisyonun üst sınırı ise −L’ye katkıda bulunur.
Örnek: aynı pool’da iki pozisyon.
  • Pozisyon A: tick_lower = -120, tick_upper = 0, likidite L_A = 100.
  • Pozisyon B: tick_lower = -60, tick_upper = 60, likidite L_B = 50.
Tick bazında durum:
TickKime tarafından dokunulduliquidity_grossliquidity_net
-120A alt100+100
-60B alt50+50
0A üst100−100
60B üst50−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)
Bir swap sırasında her tick geçişinde, program liquidity_net (muhtemelen negatif) ekler PoolState.liquidity’ye. Bu, tam Uniswap-v3 mekanizmasıdır.

Pozisyonlar olarak NFT’ler

Bir Raydium CLMM pozisyonu bir NFT’dir. Bir pozisyon açmak, çağıranın cüzdanında arz 1 ile yepyeni bir mint’i basarak ve mint’in yetkilisi CLMM programı olarak ayarlanır. Program, pozisyon sahipliğini CPI zamanında o mint’in ATA’sında bir bakiyeyi tutan kişiye bağlar. Sonuçlar:
  • Pozisyonlar aktarılabilir. Bir cüzdan, NFT’yi aktararak bir pozisyonu satabilir veya airdrop edebilir. Yeni sahip, CollectRewards, IncreaseLiquidity vb. çağırabilir.
  • Pozisyonlar CLMM dışında adreslenebilir. Pazaryerleri ve cüzdanlar, pozisyonları diğer NFT’ler gibi görüntüler. SDK, mint metaverilerine makul name/symbol ayarlar.
  • Bir pozisyonun PDA’sı NFT mint’inden türetilir. Şu anda kimi tuttuğunu bilmeden PersonalPositionState’i bulabilirsiniz.

Token-2022 pozisyonları

Daha yeni CLMM pool’ları, klasik SPL Token yerine Token-2022 altında pozisyon basabilir. Program, NFT mint’ine sahip olan token programı ötesinde özdeş semantiğe sahip iki paralel açma talimatı sunar — OpenPosition ve OpenPositionWithToken22Nft. Cüzdan ve pazaryeri uyumluluğu farklılık gösterir; Raydium’ın arayüzü her ikisini de takip eder.

İzin verilen aralık kuralları

OpenPosition zamanında program şunları zorunlu kılar:
  1. tick_lower < tick_upper.
  2. tick_lower % tick_spacing == 0 ve tick_upper % tick_spacing == 0.
  3. MIN_TICK <= tick_lower ve tick_upper <= MAX_TICK.
  4. Çağıran, tick_lower ve tick_upper’ı içeren tick dizilerini sağlamıştır — zaten başlatılmış veya aynı işlemde bir init_tick_array yoluyla.
  5. Bitmap uzantısı hesabı, eğer bu pozisyon uzantı aralığına uzanırsa.
Herhangi bir kontrol başarısız olursa talimat, hangi kısıtlamaya bağlı olarak InvalidTickIndex, NotApproved veya InsufficientLiquidity ile geri döner. Bkz. reference/error-codes.

”Aralık içinde” vs “aralık dışında”

Bir pozisyon aralık içindedir tick_lower <= tick_current < tick_upper olduğunda. Yalnızca aralık içi pozisyonlar PoolState.liquidity’ye katkıda bulunur ve bu nedenle yalnızca onlar swap ücretlerini kazanır. Aralık dışı bir pozisyon:
  • Bir token’ın %100’ünü tutar (aralığı geçmiş olanı). Spesifik olarak, tick_current < tick_lower ise, pozisyon yalnızca token1 tutar (zaten fiyat uzaklaşarak “satılmış”); tick_current >= tick_upper ise, yalnızca token0 tutar.
  • Swap ücretlerini kazanmaz.
  • Pool’un ödül akışları aralık dışı likiditeyi yayıyorsa ödülleri birikintiye devam eder — ancak Raydium’ın varsayılan davranışı “yalnızca aralık içine yay”dır, Uniswap v3 konvansiyonuyla eşleşir. Bkz. products/clmm/fees.
CLMM pozisyonlarını yöneten LP’ler, fiyat değiştikçe pozisyonları aralık içinde tutmaya çoğu zaman odaklanırlar.

Yaygın entegrasyon tuzakları

  • Aralık dışı uç noktalar. Hedef fiyattan bir tick hesaplayan kod, bunu OpenPosition’a geçmeden önce tick_spacing’in katına yapıştırmalı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 openPositionFromBase, listeyi sizin için döndürür.
  • Swap’ten sonra eski tick. tick_current, bir swap’te birçok tick’i geçebilir. UX’iniz bir RPC çağrısından “geçerli tick” gösterir ve ardından daha sonra bir pozisyon açarsa, canlı fiyata karşı göreceli konum düzinelerce tick kadar olabilir. İmzalamadan önce yeniden getirin.
  • Ekstra metaveri ile pozisyon NFT’leri. Raydium pozisyonlarını tanıyan bir cüzdan oluşturursanız, sabit kodlanmış bir metaveri alanı yerine mint otoritesi (= CLMM programının PDA’sı) tarafından tanıyın.

Sonra nereye gitmeli

  • Math — swap adım adım ve tick sınırlarının katıldığı ücret büyümesi türetilmesi.
  • AccountsTickArrayState ve PositionState düzenleri.
  • Ücretler ve ödüller — aralık içi olmak ücret birikimini nasıl sınırlandırır.
  • algorithms/clmm-math — yoğunlaştırılmış likidite formüllerinin paylaşılan türetilmesi.
Kaynaklar: