跳轉到主要內容
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →

查詢表曲線

穩定 AMM 用稀疏查詢表取代公式 x·y=k,表中包含 (x, y, price) 元組。進行交換報價時,程式會:
  1. 從儲備計算池的目前比率。
  2. 二分搜尋表格找出括住該比率的兩個項目。
  3. 線性插值計算中間價格。
  4. 應用費用並返回報價。
這種方法用管理員靈活性來調整價格曲線,取代公式的確定性,且效率足以符合 Solana 的計算預算。

表格佈局與二分搜尋

ModelDataInfo 最多可容納 50,000 個 DataElement 項目,由管理員索引。只有前 valid_data_count 個是有效的。每個項目:
DataElement {
  x: u64,      // X 座標(幣側金額,已縮放)
  y: u64,      // Y 座標(PC 側金額,已縮放)
  price: u64,  // price = x/y,由乘數縮放
}
要在目前池儲備 (x_real, y_real) 找到價格:
  1. 計算比率:target_ratio = (x_real * multiplier) / y_real
  2. 二分搜尋項目,使 (element.x * multiplier) / element.y 括住 target_ratio
  3. 找到括號 [min_idx, max_idx] 後,進行插值。
程式的二分搜尋程式碼在 state.rs::ModelDataInfo::get_mininum_range_by_xy_real 中約 150 行。關鍵不變式:項目必須排序(x 遞增、y 遞減、price 遞增),搜尋才能運作。

線性插值

一旦兩個表格點括住比率,插值計算中間價格和儲備對:
target = (x_real * multiplier) / y_real

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

// 插值價格
p = p1 + (p2 - p1) * (target - ratio1) / (ratio2 - ratio1)

// 插值儲備
x = x1 + (x2 - x1) * (target - ratio1) / (ratio2 - ratio1)
y = y1 + (y2 - y1) * (target - ratio1) / (ratio2 - ratio1)
結果是分段線性曲線,平滑連接表格點。

縮放:乘數

池儲備和價格以不同的尺度儲存。ModelDataInfo 上的 multiplier 欄位用於調整。常見模式:
  • 幣有 6 位小數,PC 有 18 位小數。
  • 乘數 = 10^6(或類似值)。
  • 表項以縮減的尺度儲存,以符合 u64 界限。
程式透過以下方式在讀寫時重新縮放:
real_value = table_value * ratio / multiplier
table_value = real_value * multiplier / ratio

交換報價:SwapBaseInSwapBaseOut

SwapBaseIn(精確輸入)

給定輸入金額 amount_in
  1. (coin_vault, pc_vault) 取得目前比率。
  2. 找出括住的表項並插值以取得表空間比率。
  3. 將輸入轉換為表空間:dx_table = amount_in * multiplier / ratio
  4. 在新 X 座標查詢表以找到新 Y。
  5. dy_table = y_old - y_new
  6. 轉換回:dy_real = dy_table * ratio / multiplier
  7. 應用交易費:dy_output = dy_real - (dy_real * trade_fee_numerator / trade_fee_denominator)
  8. 返回 dy_output

SwapBaseOut(精確輸出)

對稱:給定所需的 amount_out,求解所需的 amount_in 兩條路徑都直接從池金庫讀取有效儲備。多年來池未持有任何 OpenBook 未平倉訂單,因此沒有需要先結算的內容——金庫餘額就是全部。(2026-06-22 升級移除了遺留的市場程式碼。)

費用應用

與 AMM v4 相同:完整推導見 products/amm-v4/math
gross_fee = amount_in * (swap_fee_numerator / swap_fee_denominator)    // 例如 0.25%
lp_portion = gross_fee - (gross_fee * pnl_numerator / pnl_denominator) // 例如 0.22%
pnl_portion = gross_fee * (pnl_numerator / pnl_denominator)            // 例如 0.03%
pnl_portion 進入 need_take_pnl_* 並由管理員透過 WithdrawPnl 清掃。lp_portion 留在金庫中,增加 k 並使 LP 代幣持有者受益。

池資產帳戶

公式歷來加上池在其 OpenBook OpenOrders 帳戶中持有的未平倉訂單資金。自池停止發佈訂單以來,該項實際上一直為零,2026-06-22 升級完全從公式中移除了它,只留下金庫計算:
舊:總資產 = 金庫餘額 + 未平倉訂單資金 (native_coin_total / native_pc_total) − 待處理 PnL (need_take_pnl)
新:總資產 = 金庫餘額 − 待處理 PnL (need_take_pnl)
這是曲線數學視為有效儲備的值(累積但未清掃的 need_take_pnl 部分實際上位於金庫中,但被排除在定價之外)。之前讀取 OpenOrders 餘額的報價程式碼和索引器必須移除該項。

MonitorStep(已移除)

MonitorStep曲柄指令,用於結算待處理的 OpenBook 成交、重新計算 AmmInfo.target_orders 並重新發佈從查詢表衍生的限價訂單網格。池多年前停止向 OpenBook 發佈訂單,因此曲柄沒有任何工作要做;它在 2026-06-22 升級中被移除。整合者無需為穩定池進行曲柄操作。

總結:為什麼這有效

查詢表 + 插值設計既高效又靈活
  • 效率: 二分搜尋為 O(log 50,000) ≈ 16 次迭代,每次約 300–500 CU。插值是幾個乘法/除法。總報價成本約 5k–15k CU,遠便宜於每次交換重新計算公式。
  • 靈活性: 管理員可以編碼任何分段線性曲線。穩定幣對在 1:1 附近獲得高密度;抵押對獲得自訂曲線。
  • 自包含流動性: 所有資金都在池金庫中,定價直接讀取它們——無需曲柄、無外部訂單簿、每筆交易帳戶更少。
如需深入了解插值邏輯,見 raydium-stable/program/src/state.rs,方法 get_data_by_xget_data_by_yget_dy_by_dx_base_in 等。

後續步驟

  • 帳戶ModelDataInfoDataElement 欄位參考。
  • 指令 — 可呼叫集合(交換、存入、提取、WithdrawPnl)和已移除的指令。
  • 費用 — 費用應用和 WithdrawPnl
  • products/amm-v4/math — OpenBook 費用包含訂單定價邏輯。
來源:
  • raydium-stable/program/src/state.rs(插值和二分搜尋實現)
  • raydium-stable/program/src/math.rs(計算器工具)