Chuyển đến nội dung chính

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.

Trang này được dịch tự động bằng AI. Phiên bản tiếng Anh là bản chính thức.Xem bản tiếng Anh →

Đường cong bảng tra cứu

Stable AMM thay thế công thức x·y=k bằng một bảng tra cứu thưa gồm các bộ (x, y, price). Khi định giá một swap, chương trình thực hiện:
  1. Tính tỷ lệ hiện tại của pool từ các reserve.
  2. Tìm kiếm nhị phân bảng để tìm hai mục nằm trong tỷ lệ đó.
  3. Nội suy tuyến tính giữa chúng để lấy giá trung gian.
  4. Áp dụng phí và trả lại báo giá.
Cách tiếp cận này trao đổi tính xác định của công thức để có tính linh hoạt của admin trong định hình giá, và nó hiệu quả đủ để phù hợp với ngân sách tính toán của Solana.

Bố cục bảng và tìm kiếm nhị phân

ModelDataInfo chứa tối đa 50.000 mục DataElement, được lập chỉ mục bởi admin. Chỉ những mục đầu tiên trong valid_data_count hoạt động. Mỗi mục:
DataElement {
  x: u64,      // X coordinate (coin-side amount, scaled)
  y: u64,      // Y coordinate (pc-side amount, scaled)
  price: u64,  // price = x/y, scaled by multiplier
}
Để tìm giá ở reserve hiện tại của pool (x_real, y_real):
  1. Tính tỷ lệ: target_ratio = (x_real * multiplier) / y_real.
  2. Tìm kiếm nhị phân các mục nơi (element.x * multiplier) / element.y nằm trong tỷ lệ target_ratio.
  3. Khi tìm thấy dấu ngoặc [min_idx, max_idx], thực hiện nội suy.
Mã tìm kiếm nhị phân của chương trình kéo dài ~150 dòng trong state.rs::ModelDataInfo::get_mininum_range_by_xy_real. Bất biến chính: các mục phải được sắp xếp (x tăng, y giảm, price tăng) để tìm kiếm hoạt động.

Nội suy tuyến tính

Sau khi hai điểm bảng nằm trong tỷ lệ, nội suy tính toán giá trung gian và cặp reserve:
target = (x_real * multiplier) / y_real

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

// Interpolate price
p = p1 + (p2 - p1) * (target - ratio1) / (ratio2 - ratio1)

// Interpolate reserve
x = x1 + (x2 - x1) * (target - ratio1) / (ratio2 - ratio1)
y = y1 + (y2 - y1) * (target - ratio1) / (ratio2 - ratio1)
Kết quả là một đường cong tuyến tính từng phần kết nối các điểm bảng một cách mượt mà.

Tỷ lệ: multiplier

Reserve của pool và giá được lưu trữ ở các tỷ lệ khác nhau. Trường multiplier trên ModelDataInfo giải thích điều này. Một mẫu phổ biến:
  • Coin có 6 chữ số thập phân, PC có 18 chữ số thập phân.
  • Multiplier = 10^6 (hoặc tương tự).
  • Các mục bảng được lưu trữ ở tỷ lệ giảm để phù hợp với giới hạn u64.
Chương trình thay đổi tỷ lệ khi đọc/ghi thông qua:
real_value = table_value * ratio / multiplier
table_value = real_value * multiplier / ratio

Định giá swap: SwapBaseInSwapBaseOut

SwapBaseIn (input chính xác)

Cho số lượng đầu vào amount_in:
  1. Lấy tỷ lệ hiện tại từ (coin_vault, pc_vault).
  2. Tìm các mục bảng nằm trong tỷ lệ và nội suy để lấy tỷ lệ không gian bảng.
  3. Chuyển đổi đầu vào sang không gian bảng: dx_table = amount_in * multiplier / ratio.
  4. Truy vấn bảng ở tọa độ X mới để tìm Y mới.
  5. dy_table = y_old - y_new.
  6. Chuyển đổi ngược lại: dy_real = dy_table * ratio / multiplier.
  7. Áp dụng phí giao dịch: dy_output = dy_real - (dy_real * trade_fee_numerator / trade_fee_denominator).
  8. Trả lại dy_output.

SwapBaseOut (output chính xác)

Đối xứng: cho amount_out mong muốn, giải để tìm amount_in cần thiết. Cả hai đường dẫn đều giải quyết các đơn hàng OpenBook đã điền trước (thông qua logic tương tự MonitorStep nội bộ), vì vậy reserve hiệu quả phản ánh bất kỳ điền nào từ khối trước.

Áp dụng phí

Giống với AMM v4: xem products/amm-v4/math để xem phiên bản đầy đủ.
gross_fee = amount_in * (swap_fee_numerator / swap_fee_denominator)    // e.g., 0.25%
lp_portion = gross_fee - (gross_fee * pnl_numerator / pnl_denominator) // e.g., 0.22%
pnl_portion = gross_fee * (pnl_numerator / pnl_denominator)            // e.g., 0.03%
pnl_portion đi đến need_take_pnl_* và được quét bởi admin thông qua WithdrawPnl. lp_portion ở lại trong vault, làm tăng k và có lợi cho những người giữ token LP.

MonitorStep và OpenBook

Giống như AMM v4, MonitorStep là một lệnh crank thực hiện:
  1. Giải quyết các điền đơn hàng OpenBook đang chờ (di chuyển token từ vault sang pool).
  2. Cập nhật AmmInfo.target_orders với lưới mới của các khe lệnh giới hạn.
  3. Đăng lưới mới lên OpenBook.
Lưới được tính toán từ bảng: chương trình sử dụng bảng tra cứu để tìm các điểm giá và dịch chúng thành các đơn hàng OpenBook. Chi phí tính toán của MonitorStep: ~150k–180k CU (tương tự AMM v4).

Tóm tắt: tại sao cách này hoạt động

Thiết kế bảng tra cứu + nội suy hiệu quả và linh hoạt:
  • Hiệu quả: Tìm kiếm nhị phân là O(log 50.000) ≈ 16 lần lặp, mỗi lần ~ 300–500 CU. Nội suy là một vài phép nhân/chia. Tổng chi phí định giá là ~5k–15k CU, rẻ hơn nhiều so với tính lại công thức trên mỗi swap.
  • Linh hoạt: Admin có thể mã hóa bất kỳ đường cong tuyến tính từng phần nào. Các cặp stablecoin nhận mật độ cao xung quanh 1:1; các cặp thế chấp nhận đường cong tùy chỉnh.
  • Khả năng tương tác OpenBook: Logic MonitorStep / TargetOrders giống nhau từ AMM v4 áp dụng. Khám phá giá thông qua bảng đưa vào tạo lưới đơn hàng.
Để tìm hiểu sâu về logic nội suy, xem raydium-stable/program/src/state.rs, các phương thức get_data_by_x, get_data_by_y, get_dy_by_dx_base_in, v.v.

Bước tiếp theo

  • Tài khoản — tham khảo trường ModelDataInfoDataElement.
  • LệnhInitModelData, UpdateModelData để điền vào bảng.
  • Phí — áp dụng phí và WithdrawPnl.
  • products/amm-v4/math — để xem logic định giá đơn hàng bao gồm phí OpenBook.
Nguồn:
  • raydium-stable/program/src/state.rs (cài đặt nội suy và tìm kiếm nhị phân)
  • raydium-stable/program/src/math.rs (tiện ích tính toán)