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 →

Arama tablosu eğrisi

Stable AMM, x·y=k formülünün yerine (x, y, price) tuple’larından oluşan bir seyrek arama tablosu kullanır. Bir swap’ı fiyatlandırırken program şu adımları izler:
  1. Havuzun mevcut oranını rezervlerden hesaplar.
  2. Tabloyu ikili arama ile bu oranı çevreleyen iki girişi bulur.
  3. Aralarında doğrusal enterpolasyon yaparak ara bir fiyat elde eder.
  4. Ücretleri uygular ve alıntıyı döndürür.
Bu yaklaşım, bir formülün belirleyiciliğini yönetici esnekliğiyle değiştirir 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 girişi tutar. Yalnızca ilk valid_data_count olanlar aktiftir. Her girişin yapısı:
DataElement {
  x: u64,      // X koordinatı (coin tarafı tutarı, ölçeklenmiş)
  y: u64,      // Y koordinatı (pc tarafı tutarı, ölçeklenmiş)
  price: u64,  // price = x/y, çarpan tarafından ölçeklenmiş
}
Mevcut havuz rezervlerinde (x_real, y_real) bir fiyat bulmak için:
  1. Oranı hesaplayın: target_ratio = (x_real * multiplier) / y_real.
  2. (element.x * multiplier) / element.y değerinin target_ratio’yu çevreleyen girişleri bulmak için ikili arama yapın.
  3. Bir köşeli parantez [min_idx, max_idx] bulunduğunda, enterpolasyon yapın.
Programın ikili arama kodu state.rs::ModelDataInfo::get_mininum_range_by_xy_real içinde yaklaşık 150 satır uzunluğundadır. Temel değişmez: aramanın çalışması için girişler sıralanmış olmalıdır (x artan, y azalan, price artan).

Doğrusal enterpolasyon

İki tablo noktası oranı çevreleyen bir kez, 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ı enterpolasyon yapın
p = p1 + (p2 - p1) * (target - ratio1) / (ratio2 - ratio1)

// Rezervi enterpolasyon yapın
x = x1 + (x2 - x1) * (target - ratio1) / (ratio2 - ratio1)
y = y1 + (y2 - y1) * (target - ratio1) / (ratio2 - ratio1)
Sonuç, tablo noktalarını sorunsuz bir şekilde bağlayan parçalı doğrusal bir eğridir.

Ölçekleme: çarpan

Havuz rezervleri ve fiyatları farklı ölçeklerde depolanır. ModelDataInfo üzerindeki multiplier alanı bunu hesaba katar. Yaygın bir örnek:
  • Coin 6 ondalık basamağa, PC 18 ondalık basamağa sahiptir.
  • Çarpan = 10^6 (veya benzer).
  • Tablo girişleri u64 sınırlarına sığması için azaltılmış bir ölçekte depolanır.
Program okuma/yazma sırasında şu şekilde yeniden ölçekler:
real_value = table_value * ratio / multiplier
table_value = real_value * multiplier / ratio

Swap fiyatlandırması: SwapBaseIn ve SwapBaseOut

SwapBaseIn (tam giriş)

Giriş tutarı amount_in verildiğinde:
  1. (coin_vault, pc_vault) adresinden mevcut oranı alın.
  2. Tablo girişlerini çevreleyin 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 Y’yi bulmak için tabloyu yeni X koordinatında sorgulayın.
  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 döndürün.

SwapBaseOut (tam çıkış)

Simetrik: istenen amount_out verildiğinde, gerekli amount_in için çözün. Her iki yol da etkili rezervleri doğrudan havuz kasalarından okur. Havuz yıllardır hiçbir OpenBook açık emri tutmamıştır, bu nedenle önce kapatılacak bir şey yoktur — kasa bakiyeleri tüm hikâyedir. (2026-06-22 yükseltmesi kalan pazar kodunu kaldırmıştır.)

Ücret uygulaması

AMM v4 ile aynıdır: 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)    // örn. %0,25
lp_portion = gross_fee - (gross_fee * pnl_numerator / pnl_denominator) // örn. %0,22
pnl_portion = gross_fee * (pnl_numerator / pnl_denominator)            // örn. %0,03
pnl_portion, need_take_pnl_* adresine gider ve yönetici tarafından WithdrawPnl aracılığıyla taranır. lp_portion kasada kalır, k’yı şişirir ve LP token sahiplerinden yararlanır.

Havuz varlığı muhasebesi

Formül tarihsel olarak havuzun OpenBook OpenOrders hesabında açık emirler olarak tuttuğu fonları eklemiştir. Bu terim, havuz emirleri göndermeyi bıraktığından beri pratikte sıfır olmuştur ve 2026-06-22 yükseltmesi bunu formülden tamamen kaldırmış, yalnızca kasa hesaplamasını bırakmıştır:
Eski: toplam varlıklar = kasa bakiyeleri + açık emir fonları (native_coin_total / native_pc_total) − beklemede olan PnL (need_take_pnl)
Yeni: toplam varlıklar = kasa bakiyeleri − beklemede olan PnL (need_take_pnl)
Bu, eğri matematiğinin etkili rezervler olarak ele aldığı değerdir (birikmiş ancak taranmamış need_take_pnl kısmı fiziksel olarak kasada oturur ancak fiyatlandırmadan hariç tutulur). Daha önce OpenOrders bakiyelerini okuyan alıntı kodu ve indeksleyiciler bu terimi bırakmalıdır.

MonitorStep (kaldırıldı)

MonitorStep, beklemede olan OpenBook doldurmaları kapatıp AmmInfo.target_orders’ı yeniden hesaplayan ve arama tablosundan türetilen limit emir ızgarasını yeniden gönderen crank talimatıydı. Havuz yıllardır OpenBook’a emir göndermeyi bırakmıştır, bu nedenle crank’ın yapacak bir şeyi kalmamıştır; 2026-06-22 yükseltmesinde kaldırılmıştır. Entegratörler Stable havuzları çalıştırmak zorunda değildir.

Özet: bu neden işe yarar

Arama tablosu + enterpolasyon tasarımı verimli ve esnek:
  • Verimlilik: İkili arama O(log 50.000) ≈ 16 yineleme, her biri ~ 300–500 CU. Enterpolasyon birkaç çarpma/bölmedir. Toplam alıntı maliyeti ~5k–15k CU, bir formülü her swap’ta yeniden hesaplamaktan çok daha ucuzdur.
  • Esneklik: Yönetici herhangi bir parçalı doğrusal eğri kodlayabilir. Stablecoin çiftleri 1:1 etrafında yüksek yoğunluk alır; teminatlı çiftler özel eğriler alır.
  • Kendi kendine yeterli likidite: Tüm fonlar havuz kasalarında yaşar ve fiyatlandırma bunları doğrudan okur — crank yok, harici emir defteri yok, işlem başına daha az hesap.
Enterpolasyon mantığının derinlemesine incelemesi için raydium-stable/program/src/state.rs bölümüne bakın, get_data_by_x, get_data_by_y, get_dy_by_dx_base_in vb. yöntemler.

Sonraki adımlar

  • HesaplarModelDataInfo ve DataElement alan referansı.
  • Talimatlar — çağrılabilir küme (swap, deposit, withdraw, WithdrawPnl) ve kaldırılan talimatlar.
  • Ücretler — ücret uygulaması ve WithdrawPnl.
  • products/amm-v4/math — OpenBook ücret dahil emir fiyatlandırması mantığı için.
Kaynaklar:
  • raydium-stable/program/src/state.rs (enterpolasyon ve ikili arama uygulamaları)
  • raydium-stable/program/src/math.rs (hesap makinesi yardımcıları)