Skip to main content
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →

不變量

池維持 coin_reserve × pc_reserve = k,其中(在 2026-07 OpenBook 移除後):
有兩點需要注意:
  1. 儲備金現在僅限於金庫。歷史上的開放訂單項(池作為 OpenBook 限價訂單託管的代幣)已被移除 — 在移除前很久就實際上為零。你可以直接從鏈上金庫餘額計算 k
  2. PnL 應計(need_take_pnl_*)被減去,以便在管理員掃除費用時保持曲線。這與 CPMM 的 protocol_fees_* 排除原則相同。
程式透過 calc_total_without_take_pnl_no_orderbook 計算此值(舊的訂單簿感知變體已消失)。 每個 Swap* 操作在將 LP 的費用份額加回儲備金後都強制執行 k' ≥ k

費用慣例

AMM v4 使用比率費用(分子/分母對),而不是 CPMM / CLMM 的 1/1_000_000 慣例。鏈上 Fees 結構(見程式源碼中的 Fees::initialize)預設為:
解釋(已發佈的主網預設值):
  • 總交換費用: swap_fee = amount_in × 25 / 10_000 = 0.25% 的總輸入。
  • 協議份額: pnl_numerator / pnl_denominator = 12 / 100 = 12% 的交換費用,相當於 0.25% × 12% = 0.03% 的交易量。此份額應計到 PnL 計數器中,由 WithdrawPnl 掃除。
  • LP 份額: 交換費用的剩餘 88%,相當於 0.25% × 88% = 0.22% 的交易量。保留在池中並增加 k
  • 無基金份額。 AMM v4 沒有 CPMM/CLMM 的基金費用分割。
注意 pnl_numerator / pnl_denominator 是費用的分數而非交易量 — 這是對這些欄位名稱的常見誤讀。 trade_fee_numerator / trade_fee_denominator(也是 25 / 10_000)歷史上由 OpenBook 整合在計算 AMM 限價訂單網格的費用包含價格時使用。隨著 OpenBook 代碼的移除,此欄位已成為遺留物;活躍的交換費用是 swap_fee_* 偏離這些預設值很少見,但在少數舊池上確實存在;在報價前始終從 AmmInfo.fees 讀取費用。

直接交換數學(AMM 路徑)

最簡單的情況:使用者針對池的金庫進行交換,不與 OpenBook 互動。池的內部儲備金(包括帳上配置)是分母。 SwapBaseIn(精確輸入):
此處使用的儲備金是金庫餘額(減去應計 PnL)。歷史上公式還添加了 AMM 鎖定在 OpenBook 訂單中的代幣;該項已被移除 — 有效儲備金現在等於原始金庫餘額減去待處理 PnL。曾經用於刷新 OpenBook 端的 MonitorStep / 隱式結算路徑已被移除。 SwapBaseOut(精確輸出):

訂單簿互動(歷史)

已移除。 本節描述的網格構建反映了 AMM v4 最初如何將曲線鏡像到 OpenBook 市場。OpenBook 整合 — 包括 MonitorStep 曲柄和 build_orders 網格邏輯 — 已從程式中移除(2026-07 升級)。下面的數學純粹作為歷史背景保留,說明鏈上 target_orders / amm_open_orders 帳戶曾經的大小。
除了使用者交換外,AMM v4 歷史上在 OpenBook 市場上放置了一個網格的限價訂單。網格是從 AmmInfo 參數計算的:
  • depth — 每側的價格水準數。
  • amount_wave — 每個水準的基本大小單位。
  • min_sizecoin_lot_sizepc_lot_size — OpenBook 市場約束。
  • state_data.swap_acc_coin_feeswap_acc_pc_fee — 自上次 TakePnl 以來的累積費用計數器。
程式透過以恆定比率步驟從當前曲線價格走出來推導每個水準的價格:
確切的價格和大小由 build_orders 中計算的 target_orders 決定,並在每個 MonitorStepamm_open_orders 進行比較。任何偏差都會導致取消 + 新發佈。OpenBook 上新填充的訂單在下一個刷新 OpenBook 端的操作時結算到池金庫中。 整合者很少需要計算網格 — Raydium 守護者維護它 — 但知道以下內容很有用:
  • 具有大量帳上流動性的池將該流動性貢獻給 k,而不是閒置。
  • 陳舊的 OpenBook 市場(事件隊列滿、曲柄被阻止)阻止網格更新;AMM 隨後可以報價與可見訂單簿不同的價格,直到下一次曲柄。

結算步驟(PnL)

0.03% 協議份額應計到 state_data.need_take_pnl_coinstate_data.need_take_pnl_pcTakePnl 將這些金額移出金庫到管理員指定的目的地,然後將計數器歸零。 關鍵性質:不變量中的儲備金始終計算減去應計 PnL,所以 TakePnl 不會移動曲線。這與 CPMM 慣例相符。

實際例子

池狀態:
  • coin_reserve = 1_000_000_000_000(1,000,000 幣側;6 位小數)
  • pc_reserve = 2_000_000_000_000(2,000,000 pc 側;6 位小數)
  • 費用:預設 swap = 25/10_000pnl = 3/10_000
使用者:SwapBaseIn 精確輸入 1_000_000_000 幣(1,000 幣)。
LP 份額(2_200_000)沒有單獨列出 — 它只是提高 k' 的剩餘部分。

精度規則

  • 儲備金乘法使用 u128;最終除法向零舍入。
  • swap_fee 向上舍入(以便池不會低收費)。
  • SwapBaseOutamount_in 向上舍入(以便使用者不會少付)。
  • 具有極端儲備金比率的池在非常小的輸入上可能會遇到 ZeroTradingTokens;與 CPMM 相同的慣例。

與 CPMM 的限制

  • AMM v4 的儲備金現在僅限於金庫,所以你可以直接從金庫餘額報價(減去 need_take_pnl_*) — 之前添加 open_orders.free / open_orders.locked 金額的要求不再適用。SDK / API 報價仍然是最簡單的選項。
  • AMM v4 不公開結構化的鏈上 TWAP。想要 AMM v4 支持的價格的外部消費者必須自己從交易日誌計算。
  • 不支援 Token-2022。

後續步驟

來源: