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

# Toán học định tuyến

> Router không thực hiện bất kỳ toán học định giá nào; mỗi bước ủy quyền cho curve của chương trình pool của nó. Slippage đa bước tăng dồn; các bước CLMM sử dụng limit_prices.

<Info>
  **Trang này được dịch tự động bằng AI. Phiên bản tiếng Anh là bản chính thức.**

  [Xem bản tiếng Anh →](/products/routing/math)
</Info>

## Router không thực hiện toán học

Chương trình định tuyến **không triển khai bất kỳ logic định giá nào**. Nó là một công cụ điều phối thuần túy: nó chấp nhận một tuyến đường, truyền tài khoản cho các chương trình con, và kết nối các luồng token.

Mỗi bước định giá dựa trên curve của chương trình pool của nó:

* **Bước AMM v4:** sử dụng công thức tích không đổi (`x · y = k`) với định giá hybrid OpenBook. Xem [`products/amm-v4/math`](/vi/products/amm-v4/math).
* **Bước CPMM:** sử dụng công thức tích không đổi với mức phí có thể cấu hình. Xem [`products/cpmm/math`](/vi/products/cpmm/math).
* **Bước CLMM:** sử dụng toán học tick thanh khoản tập trung. Xem [`algorithms/clmm-math`](/vi/algorithms/clmm-math).
* **Bước ổn định:** sử dụng curve stable-swap cho tài sản cùng loại. Xem [`products/stable/math`](/vi/products/stable/math).

Sự tham gia duy nhất của router là:

1. Gọi lệnh swap của mỗi pool thông qua CPI.
2. Thu thập số lượng đầu ra.
3. Truyền nó làm số lượng đầu vào cho bước tiếp theo.
4. Kiểm tra đầu ra cuối cùng so với giới hạn slippage của người gọi.

## Slippage tăng dồn

Trên một tuyến đường multi-hop, slippage ở mỗi bước tăng dồn. Một slippage nhỏ ở bước 1 trở thành slippage lớn hơn ở bước 2 vì thể tích vào bước 2 đã bị giảm.

**Ví dụ:**

```
Tuyến đường: USDC → SOL → STEP

Pool 1 (USDC / SOL):
  Đầu vào: 1000 USDC
  Slippage: 1% (giá spot sẽ cho 0.5 SOL, nhưng bạn nhận được 0.495 SOL)
  Đầu ra: 0.495 SOL

Pool 2 (SOL / STEP):
  Đầu vào: 0.495 SOL (đã bị giảm)
  Slippage: 1% (giá spot sẽ cho 495 STEP, nhưng bạn nhận được 490 STEP)
  Đầu ra: 490 STEP

Tổng slippage hiệu quả trên USDC → STEP: 1.99%, không phải 1% + 1% = 2%.
```

Khi bạn cung cấp `minimum_amount_out`, router sẽ kiểm tra đầu ra cuối cùng của bạn so với giới hạn toàn cục này. Mỗi bước cũng kiểm tra swap của nó so với cấu trúc phí cục bộ của nó, nhưng router không tái định giá giữa tuyến đường—bạn phải tính toán trước tuyến đường và bao gồm đủ dung sai slippage.

## Bước CLMM và limit\_prices

Đối với mỗi bước vào một pool CLMM, router kiểm tra xem `sqrt_price_x64` hiện tại của pool có nằm trong giới hạn được chỉ định hay không. Các giới hạn được truyền dưới dạng `VecDeque<u128>` gọi là `limit_prices`:

* Một `sqrt_price_x64` cho mỗi bước CLMM trong tuyến đường.
* `sqrt_price_x64` là biểu diễn giá dựa trên tick được sử dụng bởi CLMM. Xem [`algorithms/clmm-math`](/vi/algorithms/clmm-math) để xem định nghĩa.
* Router thực thi:

```
  sqrt_price_lower <= pool.sqrt_price_x64 <= sqrt_price_upper
```

cho mỗi bước CLMM, từ chối swap nếu giá nằm ngoài phạm vi.

### Các biến thể lệnh và limit\_prices

* **`SwapBaseInWithUserAccount`, `SwapBaseOutWithUserAccount` (Cũ, thẻ 0 và 1):** VecDeque `limit_prices` là **bắt buộc**. Một deque trống bị từ chối bằng một lỗi nếu bất kỳ bước nào là một pool CLMM. Bạn phải cung cấp một giá cho mỗi bước CLMM, theo thứ tự.

* **`SwapBaseIn`, `SwapBaseOut` (Hiện tại, thẻ 8 và 9):** VecDeque `limit_prices` là **tùy chọn**. Một deque trống bị bỏ qua im lặng; không có kiểm tra giá nào được thực hiện. Mã mới nên sử dụng các mã này.

### Xây dựng limit\_prices

Đối với một tuyến đường có M bước CLMM, deque phải chứa chính xác M mục. Sắp xếp chúng theo bước:

```
limit_prices = [
  sqrt_price_for_first_clmm_hop,
  sqrt_price_for_second_clmm_hop,
  ...
]
```

### Khi nào để kiểm tra limit\_prices

`sqrt_price_x64` là một ảnh chụp nhanh của giá hiện tại của pool. Nó thay đổi liên tục khi các swap được thực hiện. Bạn nên:

1. Tìm nạp trạng thái hiện tại của pool từ on-chain.
2. Tính toán các giới hạn có thể chấp nhận được (ví dụ: ±0,5% của giá hiện tại).
3. Mã hóa các giới hạn đó vào `limit_prices`.
4. Bao gồm các giới hạn trong lệnh router của bạn.

Nếu giá của pool thay đổi vượt quá các giới hạn của bạn trước khi giao dịch được hạ cánh, router sẽ từ chối nó.

## Xử lý phí

Mỗi pool tính phí theo cấu hình của nó:

* **AMM v4:** 0,25% (cố định) chia giữa LP, giao thức và quỹ.
* **CPMM:** có thể cấu hình cho mỗi `AmmConfig` (mặc định 0,25%, phân chia khác nhau theo tầng).
* **CLMM:** có thể cấu hình cho mỗi pool, lấy từ số lượng đầu vào.
* **Ổn định:** giống AMM v4, 0,25% phân chia.

Router **không tính phí của riêng nó**. Tất cả xử lý phí được ủy quyền cho mỗi pool con. Đầu ra từ bước N đã có phí của bước đó được khấu trừ.

Xem tài liệu phí của pool riêng lẻ:

* [`products/amm-v4/fees`](/vi/products/amm-v4/fees)
* [`products/cpmm/fees`](/vi/products/cpmm/fees)
* [`products/clmm/fees`](/vi/products/clmm/fees) (nếu có)
* [`products/stable/fees`](/vi/products/stable/fees) (nếu có)

## Ví dụ kế toán multi-hop

Giả sử bạn định tuyến USDC → SOL → STEP trên hai pool tích không đổi, mỗi cái có phí 0,25%:

```
Đầu vào: 1000 USDC
Pool 1 (USDC/SOL):
  Phí được lấy: ceil(1000 * 0.25%) = 2.5 USDC
  Đầu vào ròng cho curve: 997.5 USDC
  Đầu ra curve (trước slippage): 0.5 SOL
  Biên độ slippage: giả sử 1%, bạn nhận được ~0.495 SOL

Pool 2 (SOL/STEP):
  Đầu vào: 0.495 SOL
  Phí được lấy: ceil(0.495 * 0.25%) ≈ 0.001 SOL
  Đầu vào ròng cho curve: 0.494 SOL
  Đầu ra curve: ~494 STEP
  Biên độ slippage: 1%, bạn nhận được ~489 STEP

Đầu ra cuối cùng: ~489 STEP
```

Router xác minh:

```
489 >= minimum_amount_out  // được chỉ định bởi người gọi
```

Nếu sai, toàn bộ tuyến đường thất bại một cách nguyên tử.

## Cân nhắc độ chính xác

Giống như tất cả các chương trình Solana, router sử dụng số học số nguyên:

* Tất cả các số lượng là `u64` (lamports hoặc đơn vị nhỏ nhất token).
* Tính toán curve sử dụng các trung gian `u128` khi cần để tránh tràn.
* Các quy ước làm tròn phụ thuộc vào chương trình con. Router không làm tròn lại.

Nếu một bước tạo ra một lượng bằng 0 do tỷ lệ giá cực đoan (ví dụ: hoán đổi 1 lamport trên một pool 1B:1), router truyền số không đó đến bước tiếp theo, bước đó sau đó có thể từ chối nó là không đủ. Xem các mã lỗi của pool riêng lẻ.

## Bước tiếp theo

* [`products/amm-v4/math`](/vi/products/amm-v4/math) — toán học tích không đổi.
* [`products/cpmm/math`](/vi/products/cpmm/math) — CPMM tích không đổi với Token-2022.
* [`algorithms/clmm-math`](/vi/algorithms/clmm-math) — định giá thanh khoản tập trung.
* [`products/stable/math`](/vi/products/stable/math) — curve stable-swap.
* [`products/routing/code-demos`](/vi/products/routing/code-demos) — ví dụ về định giá trước khi định tuyến.
