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 →
Các chương trình sản phẩm của Raydium là những codebase độc lập, nhưng chúng được thiết kế dựa trên một tập hợp quy ước chung. Trang này là tài liệu tham khảo chính thức cho những quy ước đó. Các chương dành riêng cho sản phẩm mô tả cách những quy ước được thể hiện trong các tài khoản của chúng; trang này mô tả những quy ước đó.

”Dùng chung” có nghĩa là gì ở đây

Ba loại dùng chung chạy xuyên suốt codebase:
  • Dùng chung quy ước. Mọi chương trình đều sử dụng cùng một mô hình suy dẫn PDA, cùng một hình dạng phân chia phí, và cùng một ý tưởng tài khoản quan sát — nhưng mỗi cái lại tự thực hiện chúng trong chương trình của riêng mình với seed của riêng mình.
  • Dùng chung tài khoản. Một số ít tài khoản là chính xác cùng một bản ghi trong nhiều pool (PDA quyền hạn toàn cục trong CPMM, các tài khoản AmmConfig).
  • Dùng chung ngoài chuỗi. Một REST API và một TypeScript SDK phục vụ tất cả bốn chương trình. Các nhà tích hợp tương tác với một máy chủ HTTP và một gói NPM bất kể chương trình nào cuối cùng họ gọi.
Năm nguyên tắc dưới đây bao hàm mọi thứ vượt qua ranh giới chương trình.

1. PDA quyền hạn

Mỗi chương trình Raydium đều có chính xác một PDA sở hữu các kho tiền của nó. Người dùng không bao giờ giữ quyền hạn kho trực tiếp — PDA quyền hạn là người ký duy nhất có thể di chuyển tiền ra, và nó chỉ ký khi một lệnh chương trình hợp lệ yêu cầu. Mô hình này giống nhau trên các sản phẩm; seed khác nhau:
Chương trìnhSeed PDA quyền hạnGhi chú
AMM v4[poolId]Quyền hạn mỗi pool. Cùng hình dạng với thiết kế mỗi pool của v4.
CPMM[b"vault_and_lp_mint_auth_seed"]PDA duy nhất được dùng chung bởi tất cả các pool CPMM. Không có seed dành riêng cho pool.
CLMM[b"pool_vault_and_lp_mint_auth_seed"]PDA duy nhất được dùng chung trên tất cả các pool CLMM.
Farm v3 / v5 / v6[farmId]Mỗi farm. PDA sở hữu các kho staking + reward cho farm đó.
LaunchLab[b"vault_auth", launchId]Mỗi lần phát hành. Sở hữu các kho base + quote trước khi hoàn thành.
Một số điều sau từ đây:
  • Đối với CPMM và CLMM, PDA quyền hạn là một tài khoản toàn cục — mỗi pool loại đó sử dụng nó. Nếu bạn đang CPI vào CPMM, bạn cần nó một lần, không phải mỗi pool.
  • Đối với các quyền hạn mỗi pool / mỗi farm, bạn suy dẫn PDA từ ID pool/farm. SDK làm việc này trong getPoolKeys / getFarmKeys; nếu bạn đang tích hợp trực tiếp, bạn suy dẫn với findProgramAddressSync.
  • Quyền sở hữu kho không thể bị thay đổi. Một khi một tài khoản tiền được tạo với PDA quyền hạn làm chủ sở hữu, chỉ PDA đó — được gọi bởi chương trình — mới có thể chuyển ra. Không có ghi đè quản trị viên.
Đối với các seed chính xác và bố cục ATA theo chương trình, xem products/cpmm/accounts, products/clmm/accounts, products/amm-v4/accounts, products/farm-staking/accounts, products/launchlab/accounts.

2. Tài khoản quản trị viên và cấu hình

CPMM và CLMM dùng chung một mô hình tài khoản cấu hình gọi là AmmConfig: một tài khoản toàn cục nhỏ, được lập chỉ mục bằng u16, giữ các tỷ lệ phí và điểm đến quản trị viên áp dụng cho toàn bộ một tầng phí. Các pool ràng buộc với một cấu hình khi tạo và không bao giờ tái ràng buộc.
// CPMM AmmConfig (rút gọn — phiên bản CLMM có cấu trúc tương tự)
pub struct AmmConfig {
    pub bump: u8,
    pub disable_create_pool: bool,        // cổng tạo pool mới trong tầng này
    pub index: u16,                       // chỉ số tầng
    pub trade_fee_rate: u64,              // phần giao dịch đi vào phí
    pub protocol_fee_rate: u64,           // phần phí giao dịch cho giao thức
    pub fund_fee_rate: u64,               // phần phí giao dịch cho quỹ
    pub create_pool_fee: u64,             // phí tạo pool một lần mỗi pool
    pub protocol_owner: Pubkey,           // người ký cho CollectProtocolFee
    pub fund_owner: Pubkey,               // người ký cho CollectFundFee
    pub padding: [u64; 16],
}
Quy tắc hoạt động:
  • Các tầng phí là toàn cục. Khi một pool nói “đây là pool 0.25%”, nó có nghĩa là nó ràng buộc với AmmConfig mà trade_fee_rate của nó là 0.25% tại thời điểm tạo. Không có ghi đè tỷ lệ mỗi pool.
  • Một cấu hình có thể bị thay đổi nhưng các pool không theo. Nếu quyền cấu hình chỉnh sửa AmmConfig, mọi pool hiện có ràng buộc với cấu hình đó sẽ nhận ngay tỷ lệ mới. Đây là một tính năng, không phải một lỗi; đây là cách những thay đổi kinh tế cấp giao thức lan truyền mà không cần di chuyển mỗi pool.
  • disable_create_pool là đòn bẩy loại bỏ. Khi một tầng phí bị tắt, multisig giao thức đặt cờ này — các pool hiện có tiếp tục hoạt động nhưng không có pool mới nào có thể chọn tầng.
  • protocol_owner / fund_owner là những người ký cho các lệnh thu phí. Đặt chúng thành multisig là cách gating việc rút tiền phí. Chúng KHÔNG phải các địa chỉ đích cho chính các phí; đó là protocol_fee_destination / fund_fee_destination trên cùng một tài khoản.
AMM v4 không có AmmConfig — các tham số phí của nó được mỗi pool cứng hóa tại thời điểm tạo. Farm và LaunchLab có những tương đương của riêng chúng (FarmConfig, LaunchConfig) được bao gồm trong các chương riêng lẻ của chúng. Bảng hoàn chỉnh về ai có thể thay đổi cái gì trong security/admin-and-multisig. Phân chia phí hướng đến người dùng hiện tại trong ray/protocol-fees.

3. Phân chia phí giao thức / quỹ / nhà sáng tạo

Mỗi phí swap CPMM và CLMM được chia thành tối đa bốn điểm đến trên đường đi ra:
                         tổng phí swap

              ┌───────────────┼───────────────┬──────────────┐
              ▼               ▼               ▼              ▼
        Phía LP pool     Kho giao thức     Multisig quỹ     Nhà sáng tạo
        (tăng k)                          (các pool LaunchLab)
Về mặt cơ học:
  1. Phí giao dịch tích lũy vào pool. Phí được loại bỏ khỏi phía đầu vào của swap và số tiền sau khi trừ phí là cái mà toán học sản phẩm không đổi nhìn thấy. Đây là ý nghĩa của “LP kiếm phí” — k tăng và cũng vậy với giá trị tiền LP ngụ ý mỗi người.
  2. Các phần giao thức/quỹ/nhà sáng tạo được khấu trừ khỏi tích lũy đó vào các tài khoản bộ đếm mỗi pool. Chúng nằm trên trạng thái pool (protocol_fees_token{0,1}, fund_fees_token{0,1}, v.v.) cho đến khi ai đó gọi CollectProtocolFee / CollectFundFee / CollectCreatorFee. Chúng không rời khỏi các kho của pool cho đến lúc đó; từ quan điểm của swap, chúng vẫn “trong pool”.
  3. Thu thập di chuyển chúng ra. Người ký tương ứng (các khóa protocol_owner / fund_owner trên AmmConfig, hoặc nhà sáng tạo phát hành cho các pool LaunchLab) gọi lệnh thu thập và chương trình chuyển từ kho pool đến một ATA đích.
Một số quan sát mang tính quyết định:
  • Các tỷ lệ chia là tính từ phí giao dịch, không phải từ giao dịch. Phí giao dịch 0.25% với chia sẻ giao thức 12% có nghĩa là giao thức nhận được 0.25% × 12% = 0.03% của giao dịch — không phải 12% của giao dịch.
  • Phí nhà sáng tạo chỉ tồn tại trên các pool LaunchLab đã hoàn thành. Các pool CPMM/CLMM tiêu chuẩn có phân chia 3 chiều (LP / giao thức / quỹ). LaunchLab thêm một khe thứ tư được định tuyến cho ai phát hành tiền, được cấu hình tại Initialize và bất biến.
  • AMM v4 chia chỉ hai cách, cứng hóa mỗi pool: LP và giao thức. Không có khe quỹ, không có khe nhà sáng tạo.
  • Quỹ vs giao thức — cả hai đều là điểm đến kho giao thức, nhưng chúng có những người ký khác nhau và những mục đích sử dụng dự định khác nhau. Lịch sử giao thức quỹ hoạt động; quỹ là kho lâu dài hơn. Phân chia giữa hai cái là chính nó có thể điều chỉnh được.
Các tỷ lệ cụ thể trong reference/fee-comparisonray/protocol-fees.

4. Tài khoản quan sát (TWAP ring buffer)

Cả CPMM và CLMM đều duy trì một tài khoản quan sát mỗi pool — một vòng đệm kích thước cố định của các mẫu (timestamp, cumulative_price) mà các hợp đồng khác có thể sử dụng để suy dẫn TWAP kháng thao tác.
// CPMM ObservationState (rút gọn)
pub struct ObservationState {
    pub initialized: bool,
    pub observation_index: u16,            // khe tiếp theo để ghi đè
    pub pool_id: Pubkey,
    pub observations: [Observation; OBSERVATION_NUM],
    pub padding: [u64; 4],
}

pub struct Observation {
    pub block_timestamp: u64,
    pub cumulative_token_0_price_x32: u128,  // tổng của (price × dt) kể từ init
    pub cumulative_token_1_price_x32: u128,
}
Nó hoạt động như thế nào:
  • Mỗi swap gọi update_observation. Chương trình đọc giá hiện tại, nhân với các giây trôi qua kể từ quan sát trước đó, và cộng vào bộ đếm tích lũy. Mục nhập mới ghi đè khe cũ nhất (kiểu vòng đệm).
  • TWAP trên một cửa sổ = (cumul[end] − cumul[start]) / (timestamp[end] − timestamp[start]). Người tiêu dùng chọn hai quan sát ngoặc cửa sổ mong muốn và chia.
  • Raydium tự thân không sử dụng TWAP để định giá. Toán học AMM đọc trực tiếp các dự trữ điểm. Quan sát là một tính bên ngoài — Raydium trả chi phí viết chúng để các hợp đồng khác có thể đọc.
  • AMM v4 không có tài khoản quan sát. Nó cũ hơn thiết kế ObservationState; các nhà tích hợp muốn TWAP v4 phải tính toán một cái ngoài chuỗi từ lịch sử nhật ký.
Chi tiết bố cục và toán học lập chỉ mục trong products/cpmm/accountsproducts/clmm/accounts.

5. REST API + SDK + IDL

Bề mặt ngoài chuỗi là một bộ ba duy nhất được sử dụng bởi mọi sản phẩm:
  • REST APIhttps://api-v3.raydium.io. Một góc nhìn được lập chỉ mục đọc chủ yếu của tất cả trạng thái trên chuỗi cộng với một công cụ trích dẫn. Một máy chủ, một lược đồ.
  • TypeScript SDK@raydium-io/raydium-sdk-v2 trên NPM. Xây dựng và ký giao dịch cho mọi chương trình. Nói chuyện với API để lấy trích dẫn/siêu dữ liệu, nói chuyện với RPC Solana để làm mới trạng thái trước ký.
  • Sổ đăng ký IDL — Các IDL Anchor cho mọi chương trình được xuất bản nằm trong kho raydium-idl (một JSON cho mỗi chương trình: CPMM, CLMM, LaunchLab). TypeScript SDK tiêu thụ các IDL này nội bộ; các máy khách Rust / Python hạ lưu tái tạo từ cùng các tập tin.
Ranh giới giữa chúng là rõ ràng:
PhầnĐọc từGhi vàoDung sai lỗi thời
REST APIIndexer (phân tích nhật ký chuỗi)— (chỉ đọc cho nhà tích hợp)Vài giây
SDKAPI + RPCXây dựng giao dịch; không phát sóngKhông — phải tìm nạp lại trạng thái trước ký
IDLNguồn chương trìnhPhiên bản mỗi nâng cấp chương trình
Một lỗi phổ biến là cấp đầu ra REST API trực tiếp vào một giao dịch. Đừng làm — tìm nạp lại trạng thái pool/vị trí có liên quan từ RPC Solana ở khe bạn đang ký. SDK làm việc này tự động cho các luồng bên thứ nhất; nếu bạn bỏ qua SDK, bạn phải tự làm. Tham chiếu hoàn chỉnh trong sdk-api/, với bề mặt IDL cụ thể trong sdk-api/anchor-idl.

6. Indexer và nguồn cấp giá

REST API được cấp bởi indexer của Raydium, cái đăng ký nhật ký chương trình từ một đội những RPC Solana và ghi các bản ghi phi chuẩn hóa vào một cửa hàng SQL. Hai hậu quả cho nhà tích hợp:
  • Indexer là thứ duy nhất “biết về” trạng thái qua chương trình. Ánh xạ một pool CPMM đến đối tác CLMM của nó, tính toán một con số khối lượng 24h trên các phiên bản chương trình, nhặt một farm liên kết với một LP mint — tất cả đó là công việc indexer. Các chương trình tự thân không làm nó.
  • Downtime Indexer là downtime API. Nếu API trả về dữ liệu lỗi thời hoặc trống, indexer là nghi phạm. Trạng thái trên chuỗi không bị ảnh hưởng; nhà tích hợp với RPC của riêng họ và SDK có thể tiếp tục giao dịch.
Nguồn cấp giá là một vấn đề riêng biệt. API xuất bản một trường priceUsd trên hầu hết các phản hồi pool; đây được tính toán ngoài chuỗi từ một ảnh chụp góc nhìn indexer về dự trữ pool và một giá tham chiếu được trích dẫn (các pool USDC làm trục chung). Nó đủ tốt cho UI; nó không an toàn khi sử dụng làm oracle trên chuỗi. Sử dụng TWAP quan sát cho điều đó.

Cái không được dùng chung

Xứng đáng liệt kê rõ ràng, vì những độc giả mới thường giả định rằng chia sẻ nhiều hơn mức tồn tại:
  • Các chương trình không gọi nhau. Một swap CPMM không bao giờ CPI vào CLMM hoặc AMM v4. Chương trình duy nhất tạo thành nhiều AMM là chương trình AMM Routing — và cái đó lại mỏng, chỉ phát hành CPI vào mỗi AMM lần lượt.
  • Không có quyền nâng cấp chung trên các chương trình. Mỗi chương trình trên chuỗi có khóa nâng cấp chương trình riêng (một multisig 3/4 cộng với khóa thời gian chờ 24h). Chúng không được liên kết.
  • Không có trạng thái chung giữa farm và AMM. Một farm không biết LP nào mà nó stake đến từ một pool CPMM, một CLMM-position-NFT-mint, hay một tiền SPL không liên quan. Chương trình farm xem mint staking là mờ.
  • Không có phụ thuộc oracle. Định giá là dự trữ trên chuỗi. Không có dự phòng Pyth/Switchboard; AMM không kiểm tra oracle trước khi giải quyết.

Con trỏ

Nguồn:
  • Raydium SDK v2 — nguồn sự thật cho các seed PDA, bố cục tài khoản, và định nghĩa IDL.
  • Sổ đăng ký Raydium IDL — Anchor IDLs.
  • Các trang tài khoản mỗi sản phẩm được trích dẫn nội tuyến ở trên.