Chuyển đến nội dung chính

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.

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 →

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.
  • 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.
  • Bước CLMM: sử dụng toán học tick thanh khoản tập trung. Xem 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.
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 để 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_pricesbắ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_pricestù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ẻ:

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