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

# Routing 概覽

> AMM Routing 程式的功能、為何獨立存在，以及何時應使用它而非在客戶端手動串接指令。

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

  [查看英文版 →](/products/routing/overview)
</Info>

## 一段話總結

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_in`、`minimum_amount_out`）或精確輸出（`maximum_amount_in`、`amount_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 進其池程式，並在那裡處理曲線計算。路由器的職責是正確傳遞帳戶、在各跳之間移動代幣，以及執行滑點檢查。

## 後續步驟

* [`products/routing/accounts`](/zh-Hant/products/routing/accounts) — 路由權限 PDA 與共用帳戶模式。
* [`products/routing/instructions`](/zh-Hant/products/routing/instructions) — 完整指令 API（共 10 種變體）。
* [`products/routing/code-demos`](/zh-Hant/products/routing/code-demos) — 以 TypeScript 與原始 Rust 建構路由的範例。
* [`integration-guides/routing-and-mev`](/zh-Hant/integration-guides/routing-and-mev) — 多跳路由的整體策略。
