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 →

Arama-tablosu eğrisi

Stabil AMM, x·y=k formülünün yerine (x, y, fiyat) çiftlerinden oluşan seyrek bir arama tablosu kullanır. Programda bir swap fiyatlandırılırken:
  1. Havuzun geçerli oranı rezervlerden hesaplanır.
  2. İkili arama yapılarak bu oranı kapsayan iki tablo girdisi bulunur.
  3. Doğrusal enterpolasyon uygulanarak ara bir fiyat elde edilir.
  4. Ücretler uygulanarak teklif döndürülür.
Bu yaklaşım, bir formülün kesinliğini fiyat şekillendirmede yönetici esnekliği ile takas eder ve Solana’nın işlem bütçesine sığacak kadar verimlidir.

Tablo düzeni ve ikili arama

ModelDataInfo yönetici tarafından indekslenen 50.000’e kadar DataElement girdisini tutabilir. Sadece valid_data_count’a kadar olan girişler aktiftir. Her giriş:
DataElement {
  x: u64,      // X koordinatı (coin tarafı miktarı, ölçekli)
  y: u64,      // Y koordinatı (pc tarafı miktarı, ölçekli)
  price: u64,  // price = x/y, çarpan ile ölçekli
}
Geçerli havuz rezervlerinde (x_real, y_real) fiyat bulmak için:
  1. Oranı hesaplayın: target_ratio = (x_real * multiplier) / y_real.
  2. (element.x * multiplier) / element.y ile target_ratio’yu kapsayan girdileri bulmak için ikili arama yapın.
  3. Bir [min_idx, max_idx] aralığı bulunduğunda, enterpolasyon uygulayın.
Programın ikili arama kodu state.rs::ModelDataInfo::get_mininum_range_by_xy_real’de ~150 satır uzunluğundadır. Ana değişmez: aramanın çalışması için girdiler sıralanmalıdır (x artan, y azalan, fiyat artan).

Doğrusal enterpolasyon

İki tablo noktası oranı kapatınca, enterpolasyon ara bir fiyat ve rezerv çiftini hesaplar:
target = (x_real * multiplier) / y_real

[x1, y1, p1] = table[min_idx]
[x2, y2, p2] = table[max_idx]

// Fiyat enterpolasyonu
p = p1 + (p2 - p1) * (target - ratio1) / (ratio2 - ratio1)

// Rezerv enterpolasyonu
x = x1 + (x2 - x1) * (target - ratio1) / (ratio2 - ratio1)
y = y1 + (y2 - y1) * (target - ratio1) / (ratio2 - ratio1)
Sonuç, tablo noktalarını düzgünce bağlayan parçalı doğrusal bir eğridir.

Ölçekleme: çarpan

Havuz rezervleri ve fiyatları farklı ölçeklerde saklanır. ModelDataInfo üzerindeki multiplier alanı bunu açıklar. Yaygın bir desen:
  • Coin 6 ondalık basamağa, PC 18 ondalık basamağa sahiptir.
  • Çarpan = 10^6 (veya benzer).
  • Tablo girdileri u64 sınırlarına sığmak için indirgenmiş bir ölçekte saklanır.
Program okuma/yazma sırasında şu şekilde yeniden ölçeklendirir:
real_value = table_value * ratio / multiplier
table_value = real_value * multiplier / ratio

Swap fiyatlandırması: SwapBaseIn ve SwapBaseOut

SwapBaseIn (kesin giriş)

Giriş miktarı amount_in verildiğinde:
  1. (coin_vault, pc_vault) adresinden geçerli oranı alın.
  2. Tablo girdilerini kapatın ve tablo-alanı oranını elde etmek için enterpolasyon yapın.
  3. Girişi tablo alanına dönüştürün: dx_table = amount_in * multiplier / ratio.
  4. Yeni X koordinatında tabloyu sorgulayarak yeni Y’yi bulun.
  5. dy_table = y_old - y_new.
  6. Geri dönüştürün: dy_real = dy_table * ratio / multiplier.
  7. İşlem ücretini uygulayın: dy_output = dy_real - (dy_real * trade_fee_numerator / trade_fee_denominator).
  8. dy_output’u döndürün.

SwapBaseOut (kesin çıkış)

Simetrik: istenen amount_out verildiğinde, gerekli amount_in’i çözün. Her iki yol da dolu OpenBook siparişlerini ilk olarak (dahili MonitorStep benzeri mantık aracılığıyla) kapatır, böylece geçerli rezervler önceki bloktan doldurmaları yansıtır.

Ücret uygulaması

AMM v4 ile özdeştir: tam türetme için products/amm-v4/math bölümüne bakın.
gross_fee = amount_in * (swap_fee_numerator / swap_fee_denominator)    // ör. 0.25%
lp_portion = gross_fee - (gross_fee * pnl_numerator / pnl_denominator) // ör. 0.22%
pnl_portion = gross_fee * (pnl_numerator / pnl_denominator)            // ör. 0.03%
pnl_portion, need_take_pnl_* adresine gider ve yönetici tarafından WithdrawPnl üzerinden çekilir. lp_portion kasada kalır, k’yı şişirir ve LP token sahibini faydalandırır.

MonitorStep ve OpenBook

AMM v4’te olduğu gibi, MonitorStep bir crank komutudur:
  1. Bekleyen OpenBook siparişi doldurmaları kapatır (vaultlardan havuza token taşır).
  2. AmmInfo.target_orders’i yeni bir limit-sipariş yuvası ızgarasıyla günceller.
  3. Yeni ızgarayı OpenBook’a gönderir.
İzgara tablodan hesaplanır: program arama tablosunu kullanarak fiyat noktalarını bulur ve bunları OpenBook siparişlerine çevirir. MonitorStep’in işlem maliyeti: ~150k–180k CU (AMM v4 ile benzer).

Özet: bu neden işe yarar

Arama tablosu + enterpolasyon tasarımı verimli ve esnekdir:
  • Verimlilik: İkili arama O(log 50.000) ≈ 16 yinelemedir, her biri ~300–500 CU. Enterpolasyon birkaç çarpma/bölme işlemidir. Toplam fiyatlandırma maliyeti ~5k–15k CU’dur, bir formülü her swap için yeniden hesaplamaktan çok daha ucuzdur.
  • Esneklik: Yönetici herhangi bir parçalı doğrusal eğriyi kodlayabilir. Stablecoin çiftleri 1:1 etrafında yüksek yoğunluk alır; teminatlı çiftler özel eğriler alır.
  • OpenBook uyumluluğu: AMM v4’teki aynı MonitorStep / TargetOrders mantığı geçerlidir. Tablo aracılığıyla fiyat keşfi, sipariş ızgarası oluşturulmasını besler.
Enterpolasyon mantığına ilişkin derinlemesine bilgi için raydium-stable/program/src/state.rs, yöntemler get_data_by_x, get_data_by_y, get_dy_by_dx_base_in, vb. bölümüne bakın.

Sonra nereye gidilir

  • HesaplarModelDataInfo ve DataElement alan referansı.
  • Komutlar — tabloyu doldurmak için InitModelData, UpdateModelData.
  • Ücretler — ücret uygulaması ve WithdrawPnl.
  • products/amm-v4/math — OpenBook ücret-kapsayıcı sipariş fiyatlandırma mantığı için.
Kaynaklar:
  • raydium-stable/program/src/state.rs (enterpolasyon ve ikili arama uygulamaları)
  • raydium-stable/program/src/math.rs (hesaplayıcı yardımcıları)