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 →

Bất biến

Một market maker với sản phẩm không đổi (CPMM) giữ hai dự trữ xy và thực thi:
x · y ≥ k       (sau mỗi giao dịch)
trong đó k là tích của các dự trữ trước giao dịch. Đối với một market không có phí, x · y = k chính xác. Với phí, k tăng lên một cách nghiêm ngặt (phần chia cho LP của phí được giữ lại trong dự trữ). Bất biến được thiết kế cố ý theo hình học: nó đảm bảo rằng bất kể một dự trữ nhỏ cỡ nào, dự trữ kia sẽ tăng lên không giới hạn để khớp — tức là pool không bao giờ có thể được rút hết về phía một bên.

Định giá

Giá tức thời

Giá biên tế của y tính theo x tại bất kỳ thời điểm nào là tiếp tuyến của đường cong:
p = y / x
(dẫn xuất: phân biệt ngầm của x · y = k cho dy/dx = −y/x; bỏ qua dấu, |dy/dx| = y/x). Đây là giá mà pool trích dẫn cho một giao dịch cực nhỏ. Đối với bất kỳ giao dịch hữu hạn nào, giá thực hiện là xấu hơn do slippage dọc theo đường cong.

Swap đầu vào chính xác (cho Δx, nhận Δy)

Với phí, hãy để f là tỷ lệ phí (ví dụ: f = 0.0025 cho 25 bps). Áp dụng phí vào đầu vào, sau đó sử dụng bất biến để giải quyết đầu ra:
Δx_after_fee = Δx · (1 − f)
Δy           = y · Δx_after_fee / (x + Δx_after_fee)
Dự trữ sau giao dịch:
x' = x + Δx
y' = y − Δy
Toàn bộ Δx nhập vào dự trữ. Phần phí LP ở trong x'; phần phí giao thức được loại trừ khỏi đường cong thông qua một bước tính toán riêng (xem Các biến thể kế toán phí dưới đây).

Swap đầu ra chính xác (nhận Δy, thanh toán tối thiểu Δx)

Δx_after_fee = x · Δy / (y − Δy)
Δx           = Δx_after_fee / (1 − f)
Δx được làm tròn lên để đảm bảo pool không tính phí quá ít.

Slippage và tác động giá

Tác động giá đo lường giá tức thời của pool thay đổi bao nhiêu do giao dịch:
p_before = y / x
p_after  = y' / x' = (y − Δy) / (x + Δx)
impact   = (p_before − p_after) / p_before
Đối với Δx / x nhỏ, một khai triển bậc nhất cho:
impact ≈ 2 · Δx / x      (bỏ qua phí)
Trực giác: một giao dịch 1% gây ra ~2% tác động giá. Hệ số 2 này là lý do tại sao các pool CPMM được trích dẫn cho các giao dịch trung bình trông “mỏng” so với các market orderbook — bạn không chỉ mua so với giá bid tốt nhất hiện tại, bạn đang đi lên giá biên tế của chính mình. Giá hiệu quả được trả bởi người swap:
effective = Δx / Δy
Khoảng cách giữa p_beforeeffectiveslippage. Giao diện slippage trên chuỗi thường được biểu thị dưới dạng (effective − p_before) / p_before; computeAmountOut của SDK trả về cả amountOutpriceImpact vì lý do này.

Kiểm tra bất biến trong mã

Sau một swap, các giao thức xác minh lại:
k' = x' · y'  ≥  k  =  x · y
Bất kỳ vi phạm nào là một lỗi chương trình hoặc tràn số học. Các lệnh swap của Raydium thực hiện kiểm tra này rõ ràng như một điều kiện sau:
let k_before = coin_reserve_before as u128 * pc_reserve_before as u128;
let k_after  = coin_reserve_after  as u128 * pc_reserve_after  as u128;
require!(k_after >= k_before, ErrorCode::InvariantViolation);

Các biến thể kế toán phí

Kiểm tra bất biến giả định phí LP ở lại trong dự trữ. Các sản phẩm Raydium khác nhau xử lý các thành phần giao thức / quỹ / nhà tạo khác nhau:

Quy ước CPMM

Phí là tỷ lệ kiểu basis-point u64 trên mẫu số 1_000_000. Phí giao dịch được chia thành trade_fee_rate (tổng cộng) và sau đó được chia nhỏ thông qua protocol_fee_rate, fund_fee_rate, creator_fee_rate. Trên mỗi swap:
trade_fee     = ceil(Δx · trade_fee_rate / 1_000_000)
protocol_fee  = trade_fee · protocol_fee_rate / 1_000_000
fund_fee      = trade_fee · fund_fee_rate     / 1_000_000
creator_fee   = trade_fee · creator_fee_rate  / 1_000_000
lp_fee        = trade_fee − protocol_fee − fund_fee − creator_fee
Ba phần không phải LP tích luỹ vào các bộ đếm riêng (protocol_fees_*, fund_fees_*, creator_fees_*) được loại trừ khỏi dự trữ được sử dụng trong bất biến. Đây là cách phí có thể được lấy ra mà không cần di chuyển đường cong. Xem products/cpmm/fees.

Quy ước AMM v4

Phí là tỷ lệ numerator / denominator trên mẫu số 10_000. Sự chia tách là cố định tại tạo pool và được lưu trữ trên AmmInfo.fees:
swap_fee  = ceil(Δx · swap_fee_numerator / swap_fee_denominator)    // ví dụ: 0,25%
pnl_share = swap_fee · pnl_numerator / swap_fee_numerator            // ví dụ: 0,03 / 0,25 = 12%
lp_share  = swap_fee − pnl_share                                     // 0,22% của khối lượng
pnl_share tích luỹ vào state_data.need_take_pnl_* và được loại trừ khỏi dự trữ; lp_share ở lại trong vault. Xem products/amm-v4/fees. Cả hai quy ước đều bảo toàn bất biến theo cách tương tự — sự khác biệt là trực quan (mẫu số + số lượng danh mục con).

Quy tắc làm tròn

  • Tính phí làm tròn lên. Đảm bảo pool không bao giờ tính phí quá ít.
  • Số lượng đầu ra làm tròn xuống. Đảm bảo bất biến giữ một cách nghiêm ngặt (k' > k thậm chí trước khi phí được thêm vào).
  • Số lượng đầu vào đầu ra chính xác làm tròn lên. Đảm bảo người dùng không thanh toán quá ít.
Tất cả số học sử dụng u128 cho các sản phẩm x · Δx trung gian để tránh tràn trên các dự trữ lớn. Kết quả cuối cùng được chuyển lại thành u64 với kiểm tra độ bão hòa.

Trường hợp đặc biệt

Pool trống

Trước Deposit đầu tiên, x = y = 0. Các lệnh swap từ chối trước deposit.

Đầu ra bằng không

Nếu Δx nhỏ đến mức Δy được làm tròn xuống bằng 0, lệnh sẽ hoàn nguyên với ZeroTradingTokens. Điều này ngăn chặn trích xuất giá trị mà không thanh toán; cũng có nghĩa là các giao dịch bụi trên các pool cực kỳ mất cân bằng bị lỗi.

Bụi LP

Deposit đầu tiên có xử lý đặc biệt: nó tính toán cung cấp LP ban đầu dưới dạng sqrt(x · y) và đốt một lượng “init burn” nhỏ (thường là 100 đơn vị LP) để ngăn chặn “cuộc tấn công lạm phát của người ký gửi đầu tiên” (nơi kẻ tấn công quyên góp cho vault và làm tăng giá trị token LP). Các khoản tiền gửi tiếp theo sử dụng toán học theo tỷ lệ.

Mối quan hệ với arbitrage

Giá của pool CPMM chỉ thay đổi qua:
  1. Giao dịch thông qua pool chính nó (người dùng đi dọc theo đường cong).
  2. Quyên góp (gửi token đến vault mà không cần swap).
Bởi vì giao dịch di chuyển giá một cách xác định với đường cong, bất kỳ pool nào có giá khác với giá thị trường rộng hơn đều tạo ra cơ hội arbitrage. Những người arbitrage đưa giá pool trở lại gần giá thị trường theo kỳ vọng. Đây là lý do tại sao các pool CPMM được cho là “trích dẫn một giá mà không cần oracle”: thị trường tìm thấy giá thông qua arbitrage thay vì pool đọc nó bên ngoài. Mặt khác: pool chính nó là đối tác của người arbitrage, vì vậy bất kỳ lợi nhuận arbitrage nào là tổn thất impermanent của LP (trừ đi phí được nắm bắt bởi LP).

Ví dụ được giải quyết

Ví dụ 1 — giao dịch nhỏ, slippage không đáng kể

Pool: x = 1_000_000, y = 2_000_000, k = 2·10^12. Phí f = 0.0025. Giao dịch Δx = 1_000:
Δx_after_fee = 1000 · 0.9975  = 997.5
Δy           = 2_000_000 · 997.5 / (1_000_000 + 997.5)
             = 1_995_000_000 / 1_000_997.5
             ≈ 1_993.01
Giá hiệu quả: 1000 / 1993.01 ≈ 0.5018. Giá tức thời trước: 0.5. Tác động: ~0,36%.

Ví dụ 2 — giao dịch trung bình, slippage rõ ràng

Pool tương tự, Δx = 100_000 (10% của x):
Δx_after_fee = 100_000 · 0.9975 = 99_750
Δy           = 2_000_000 · 99_750 / (1_000_000 + 99_750)
             = 199_500_000_000 / 1_099_750
             ≈ 181_405
Hiệu quả: 100_000 / 181_405 ≈ 0.5513. Tác động: ~10,3% — khoảng một nửa quy tắc 2 · 10% = 20% (quy tắc này là trần trường hợp xấu nhất cho đường cong sản phẩm không đổi không có phí; phí giao dịch cộng với phép đảo ngược trong công thức hạ nó xuống).

Con trỏ

Nguồn:
  • Sách trắng Uniswap v2 — phát biểu chính tắc của x · y = k.
  • Mã nguồn chương trình Raydium CPMM.
  • Mã nguồn chương trình Raydium AMM v4.