Langsung ke konten utama
Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →

Kurva tabel pencarian

Stable AMM menggantikan formula x·y=k dengan tabel pencarian sparse dari tuple (x, y, price). Saat menentukan harga swap, program:
  1. Menghitung rasio pool saat ini dari cadangan.
  2. Mencari secara biner tabel untuk menemukan dua entri yang membatasi rasio tersebut.
  3. Menginterpolasi secara linier di antara keduanya untuk mendapatkan harga perantara.
  4. Menerapkan biaya dan mengembalikan kutipan.
Pendekatan ini menukar determinisme formula dengan fleksibilitas admin dalam pembentukan harga, dan cukup efisien untuk masuk dalam anggaran komputasi Solana.

Tata letak tabel dan pencarian biner

ModelDataInfo menyimpan hingga 50.000 entri DataElement, diindeks oleh admin. Hanya valid_data_count pertama yang aktif. Setiap entri:
DataElement {
  x: u64,      // Koordinat X (jumlah sisi koin, diskalakan)
  y: u64,      // Koordinat Y (jumlah sisi pc, diskalakan)
  price: u64,  // price = x/y, diskalakan oleh multiplier
}
Untuk menemukan harga pada cadangan pool saat ini (x_real, y_real):
  1. Hitung rasio: target_ratio = (x_real * multiplier) / y_real.
  2. Cari secara biner entri di mana (element.x * multiplier) / element.y membatasi target_ratio.
  3. Ketika bracket [min_idx, max_idx] ditemukan, interpolasi.
Kode pencarian biner program mencakup ~150 baris di state.rs::ModelDataInfo::get_mininum_range_by_xy_real. Invarian kunci: entri harus diurutkan (x naik, y turun, price naik) agar pencarian berfungsi.

Interpolasi linier

Setelah dua titik tabel membatasi rasio, interpolasi menghitung harga perantara dan pasangan cadangan:
target = (x_real * multiplier) / y_real

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

// Interpolasi harga
p = p1 + (p2 - p1) * (target - ratio1) / (ratio2 - ratio1)

// Interpolasi cadangan
x = x1 + (x2 - x1) * (target - ratio1) / (ratio2 - ratio1)
y = y1 + (y2 - y1) * (target - ratio1) / (ratio2 - ratio1)
Hasilnya adalah kurva piecewise-linear yang menghubungkan titik tabel dengan mulus.

Penskalaan: multiplier

Cadangan pool dan harga disimpan pada skala berbeda. Bidang multiplier pada ModelDataInfo memperhitungkan hal ini. Pola umum:
  • Coin memiliki 6 desimal, PC memiliki 18 desimal.
  • Multiplier = 10^6 (atau serupa).
  • Entri tabel disimpan pada skala berkurang agar sesuai dengan batas u64.
Program menskalakan ulang saat membaca/menulis melalui:
real_value = table_value * ratio / multiplier
table_value = real_value * multiplier / ratio

Penetapan harga swap: SwapBaseIn dan SwapBaseOut

SwapBaseIn (input tepat)

Diberikan jumlah input amount_in:
  1. Dapatkan rasio saat ini dari (coin_vault, pc_vault).
  2. Temukan entri tabel yang membatasi dan interpolasi untuk mendapatkan rasio ruang tabel.
  3. Konversi input ke ruang tabel: dx_table = amount_in * multiplier / ratio.
  4. Kueri tabel pada koordinat X baru untuk menemukan Y baru.
  5. dy_table = y_old - y_new.
  6. Konversi kembali: dy_real = dy_table * ratio / multiplier.
  7. Terapkan biaya perdagangan: dy_output = dy_real - (dy_real * trade_fee_numerator / trade_fee_denominator).
  8. Kembalikan dy_output.

SwapBaseOut (output tepat)

Simetris: diberikan amount_out yang diinginkan, selesaikan amount_in yang diperlukan. Kedua jalur membaca cadangan efektif langsung dari vault pool. Pool tidak menyimpan pesanan terbuka OpenBook selama bertahun-tahun, jadi tidak ada yang perlu diselesaikan terlebih dahulu — saldo vault adalah seluruh ceritanya. (Upgrade 2026-06-22 menghapus kode pasar sisa.)

Penerapan biaya

Identik dengan AMM v4: lihat products/amm-v4/math untuk penurunan lengkap.
gross_fee = amount_in * (swap_fee_numerator / swap_fee_denominator)    // mis., 0,25%
lp_portion = gross_fee - (gross_fee * pnl_numerator / pnl_denominator) // mis., 0,22%
pnl_portion = gross_fee * (pnl_numerator / pnl_denominator)            // mis., 0,03%
pnl_portion masuk ke need_take_pnl_* dan disapu oleh admin melalui WithdrawPnl. lp_portion tetap di vault, menginflasi k dan menguntungkan pemegang token LP.

Akuntansi aset pool

Formula secara historis menambahkan dana yang dipegang pool sebagai pesanan terbuka di akun OpenOrders OpenBook-nya. Istilah itu telah menjadi nol dalam praktik sejak pool berhenti memposting pesanan, dan upgrade 2026-06-22 menghapusnya sepenuhnya dari formula, meninggalkan perhitungan vault-only:
Lama: total aset = saldo vault + dana pesanan terbuka (native_coin_total / native_pc_total) − PnL tertunda (need_take_pnl)
Baru: total aset = saldo vault − PnL tertunda (need_take_pnl)
Ini adalah nilai yang diperlakukan matematika kurva sebagai cadangan efektif (bagian need_take_pnl yang terakumulasi tetapi belum disapu secara fisik berada di vault tetapi dikecualikan dari penetapan harga). Kode kutipan dan pengindeks yang sebelumnya membaca saldo OpenOrders harus menghapus istilah itu.

MonitorStep (dihapus)

MonitorStep adalah instruksi crank yang menyelesaikan pengisian OpenBook yang tertunda, menghitung ulang AmmInfo.target_orders, dan memposting ulang grid pesanan batas yang berasal dari tabel pencarian. Pool berhenti memposting pesanan ke OpenBook bertahun-tahun yang lalu, jadi crank tidak memiliki apa pun untuk dilakukan; itu dihapus dalam upgrade 2026-06-22. Integrator tidak perlu melakukan crank pada pool Stable.

Ringkasan: mengapa ini berfungsi

Desain tabel pencarian + interpolasi adalah efisien dan fleksibel:
  • Efisiensi: Pencarian biner adalah O(log 50.000) ≈ 16 iterasi, masing-masing ~ 300–500 CU. Interpolasi adalah beberapa perkalian/pembagian. Total biaya kutipan adalah ~5k–15k CU, jauh lebih murah daripada menghitung ulang formula pada setiap swap.
  • Fleksibilitas: Admin dapat mengkodekan kurva piecewise-linear apa pun. Pasangan stablecoin mendapat kepadatan tinggi sekitar 1:1; pasangan berjaminan mendapat kurva khusus.
  • Likuiditas mandiri: Semua dana hidup di vault pool dan penetapan harga membacanya langsung — tidak ada crank, tidak ada buku pesanan eksternal, lebih sedikit akun per transaksi.
Untuk pendalaman logika interpolasi, lihat raydium-stable/program/src/state.rs, metode get_data_by_x, get_data_by_y, get_dy_by_dx_base_in, dll.

Ke mana selanjutnya

  • Akun — referensi bidang ModelDataInfo dan DataElement.
  • Instruksi — set yang dapat dipanggil (swap, deposit, withdraw, WithdrawPnl) dan instruksi yang dihapus.
  • Biaya — penerapan biaya dan WithdrawPnl.
  • products/amm-v4/math — untuk logika penetapan harga pesanan inklusif biaya OpenBook.
Sumber:
  • raydium-stable/program/src/state.rs (implementasi interpolasi dan pencarian biner)
  • raydium-stable/program/src/math.rs (utilitas kalkulator)