> ## 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.

# 穩定 AMM 數學

> 使用二分搜尋和線性插值從查詢表報價。費用應用與 AMM v4 相同。OpenBook 分離後的純 AMM 池帳戶。

<Info>
  **本頁內容由 AI 自動翻譯，所有內容以英文版本為準。**

  [查看英文版 →](/products/stable/math)
</Info>

## 查詢表曲線

穩定 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
```

## 交換報價：`SwapBaseIn` 和 `SwapBaseOut`

### 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 升級](/zh-Hant/reference/changelog)移除了遺留的市場程式碼。）

## 費用應用

與 AMM v4 相同：完整推導見 [`products/amm-v4/math`](/zh-Hant/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_x`、`get_data_by_y`、`get_dy_by_dx_base_in` 等。

## 後續步驟

* [帳戶](/zh-Hant/products/stable/accounts) — `ModelDataInfo` 和 `DataElement` 欄位參考。
* [指令](/zh-Hant/products/stable/instructions) — 可呼叫集合（交換、存入、提取、`WithdrawPnl`）和已移除的指令。
* [費用](/zh-Hant/products/stable/fees) — 費用應用和 `WithdrawPnl`。
* [`products/amm-v4/math`](/zh-Hant/products/amm-v4/math) — OpenBook 費用包含訂單定價邏輯。

來源：

* `raydium-stable/program/src/state.rs`（插值和二分搜尋實現）
* `raydium-stable/program/src/math.rs`（計算器工具）
