跳轉到主要內容

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.

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

一段話總結

AMM Routing 程式將多跳交換(multi-hop swap)打包成單一鏈上交易,跨池串聯流動性。你只需提供一條路由(池列表與中間 mint 的清單)和一條含滑點參數的指令,路由器便會依序執行所有 N 跳,將上一個池的輸出作為下一個池的輸入。價格計算不需要獨立的鏈上路由邏輯——每一跳的手續費與曲線計算由各自的池程式透過 CPI 處理——路由器負責的是帳戶傳遞與代幣移動的協調。

為何需要獨立的路由程式?

Raydium 客戶端與聚合器本可在不使用路由器的情況下,直接在客戶端串接多跳交換:為每個池各建一條 swap 指令,並在單一交易中提交。既然如此,為何還需要專用的路由程式?

使用路由器的理由

  1. 從其他程式發起 CPI。 若你自己的程式需要在較大型的交易中呼叫一條路由(例如:將手續費換成目標代幣的流動性管理器),CPI 進路由器比在合約中管理 N 個子 CPI 及其所有帳戶更簡潔。
  2. 原子化帳戶狀態。 所有跳數的帳戶清單在同一指令上下文中完成驗證。若中間某個池的狀態異常或限價斷言失敗,整條路由將原子性地失敗,不會產生部分結算。
  3. 單一指令組合。 SDK 與前端可以將多跳路由表示為一個邏輯操作,而非 N 條碰巧連續的獨立指令。

客戶端串接仍是預設做法

對大多數應用而言,為每個池分別建立 Swap 指令並依序提交,既更簡單、更易組合,也同樣有效。Raydium SDK 的 Trade.makeSwapTransaction 及類似流程,針對大多數路由正是這樣處理的。 路由器是一種替代方案,而非取代品。以下情況適合使用它:
  • 你正在實作一個需要將路由作為更大原子操作一部分的程式。
  • 你正在建構一個希望以單一「提交此路由」操作為核心的聚合器。

運作原理

一條路由指令包含:
  • 交換參數:精確輸入(amount_inminimum_amount_out)或精確輸出(maximum_amount_inamount_out)。
  • 路由規格:依序排列的每一跳所對應的 program_id 與子程式帳戶清單。路由器讀取每個跳數群組的第一個帳戶來決定要呼叫哪個程式。
  • 限價(適用於 CLMM):由 VecDeque<u128> 組成的 sqrt_price_x64 上下限。僅用於進入 CLMM 池的跳數;對較舊的指令變體而言,空的 deque 會回傳錯誤。
路由器接著執行:
  1. 執行第一跳:amount_in(或計算精確輸出所需的輸入量)轉入第一個池的輸入金庫,呼叫該池的 swap,並收集輸出。
  2. 串接後續各跳: 對每一跳 N,以第 N−1 跳的輸出作為第 N 跳的輸入。
  3. 執行滑點檢查: 在每個 CLMM 跳數中,將 sqrt_price 與對應的 limit_price 比對;在最後一跳,將總輸出與全域 minimum_amount_out 比對。
中間代幣的流動方式有兩種:透過使用者控制的 ATA(每跳一個,速度較慢但透明),或透過共用的 PDA 衍生帳戶(所有跳數共用一個位址,速度較快,但較不透明)。

定價與手續費的委派

路由器本身不計算價格。每一跳委派給子程式的曲線:
  • AMM v4:使用搭配 OpenBook 混合定價的恆定乘積公式。
  • CPMM:使用搭配設定手續費等級的恆定乘積公式。
  • CLMM:使用基於 tick 定價的集中流動性數學。
  • Stable:針對同類型代幣使用穩定交換曲線。
手續費由各池根據自身設定收取,路由器本身不收取任何費用。

何時應避免使用路由器

  • 跳數少(1–2 跳)。 帳戶傳遞的額外開銷微乎其微,直接使用兩條獨立的 swap 指令即可。
  • 非 Raydium 池。 路由器僅支援四種 Raydium 池類型。若路由跨越外部程式,請在客戶端串接指令。
  • 條件式路由。 若你需要在路由中途根據價格或池狀態進行分支判斷,鏈上路由的靈活性不如客戶端組合。

思維模型

可以把路由器理解為一個交易打包工具。它接收你的路由規格,將其打包成一條指令、一筆交易、一個運算預算。每一跳在內部 CPI 進其池程式,並在那裡處理曲線計算。路由器的職責是正確傳遞帳戶、在各跳之間移動代幣,以及執行滑點檢查。

後續步驟