跳轉到主要內容

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.

本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
Raydium 的產品程式是獨立程式碼庫,但設計時遵循一套共同的約定。本頁是這些約定的權威參考。各產品章節說明這些約定在其帳戶中如何實例化;本頁則說明約定本身。

這裡「共享」的含義

程式碼庫中存在三種共享方式:
  • 約定共享。 每個程式都使用相同的 PDA 衍生模式、相同的費用分割形狀和相同的觀測帳戶理念——但每個都在自己的程式中用自己的種子實現。
  • 帳戶共享。 少數帳戶在許多池中字面上是同一筆記錄(CPMM 中的全域權限 PDA、AmmConfig 帳戶)。
  • 鏈下共享。 一個 REST API 和一個 TypeScript SDK 支撑所有四個程式。整合者與一個 HTTP 主機和一個 NPM 套件互動,無論最終呼叫哪個程式。
下面的五個基礎元素涵蓋了所有跨程式邊界的內容。

1. 權限 PDA

每個 Raydium 程式都有一個 PDA,擁有其代幣金庫。使用者永遠不直接持有金庫權限——權限 PDA 是唯一能移動資金的簽署者,且只在有效程式指令指示時才簽署。 模式在各產品中相同;種子不同:
程式權限 PDA 種子備註
AMM v4[poolId]每個池的權限。與 v4 的每池設計形狀相同。
CPMM[b"vault_and_lp_mint_auth_seed"]所有 CPMM 池共享的單一 PDA。 無池特定種子。
CLMM[b"pool_vault_and_lp_mint_auth_seed"]在所有 CLMM 池間共享的單一 PDA。
Farm v3 / v5 / v6[farmId]每個農場。PDA 擁有該農場的質押 + 獎勵金庫。
LaunchLab[b"vault_auth", launchId]每次啟動。擁有畢業前的基礎 + 報價金庫。
這會帶來幾個結果:
  • 對於 CPMM 和 CLMM,權限 PDA 是全域帳戶——該類型的每個池都使用它。如果你是 CPI 進入 CPMM,你需要它一次,不是每個池。
  • 對於每池/每農場權限,你從池/農場 ID 衍生 PDA。SDK 在 getPoolKeys / getFarmKeys 中執行此操作;如果你直接整合,使用 findProgramAddressSync 衍生。
  • 金庫所有權無法改變。 一旦以權限 PDA 作為所有者建立代幣帳戶,只有那個 PDA(由程式調用)能轉出。沒有管理員覆蓋。
有關每個程式的確切種子和 ATA 配置,見 products/cpmm/accountsproducts/clmm/accountsproducts/amm-v4/accountsproducts/farm-staking/accountsproducts/launchlab/accounts

2. 管理和設定帳戶

CPMM 和 CLMM 共享一個設定帳戶模式,稱為 AmmConfig:一個小全域帳戶,由 u16 索引,持有應用於整個費用等級的費率和管理目的地。池在建立時綁定到設定,永遠不重新綁定。
// CPMM AmmConfig (簡化——CLMM 版本在結構上相似)
pub struct AmmConfig {
    pub bump: u8,
    pub disable_create_pool: bool,        // 在此等級阻止建立新池
    pub index: u16,                       // 等級索引
    pub trade_fee_rate: u64,              // 交易費用的分數
    pub protocol_fee_rate: u64,           // 交易費用中協議的分數
    pub fund_fee_rate: u64,               // 交易費用中基金的分數
    pub create_pool_fee: u64,             // 每池建立的一次性費用
    pub protocol_owner: Pubkey,           // CollectProtocolFee 的簽署者
    pub fund_owner: Pubkey,               // CollectFundFee 的簽署者
    pub padding: [u64; 16],
}
道路規則:
  • 費用等級是全域的。 當池說「這是 0.25% 的池」時,意思是它綁定到其 trade_fee_rate 在建立時為 0.25% 的 AmmConfig。沒有每池費率覆蓋。
  • 設定可以改變但池不跟隨。 如果設定權限編輯 AmmConfig,綁定到該設定的每個現有池立即採納新費率。這是一個特性,不是錯誤;這就是協議級經濟變化如何在沒有每池遷移的情況下傳播。
  • disable_create_pool 是棄用槓桿。 當費用等級日落時,協議多簽設置此標誌——現有池繼續運作但沒有新池可以選擇該等級。
  • protocol_owner / fund_owner 是費用收集呼叫的簽署者。將它們設置為多簽是什麼閘門費用提取。它們不是費用本身的目的地址;那是同一帳戶上的 protocol_fee_destination / fund_fee_destination
AMM v4 沒有 AmmConfig——其費用參數是每池,在建立時硬編碼。Farm 和 LaunchLab 有自己的等效物(FarmConfigLaunchConfig),在各自章節中涵蓋。 關於誰可以改變什麼的完整表格在 security/admin-and-multisig。目前面向使用者的費用分割在 ray/protocol-fees

3. 協議 / 基金 / 創作者費用分割

每個 CPMM 和 CLMM 交換費都在輸出時分配給多達四個目的地:
                         total swap fee

              ┌───────────────┼───────────────┬──────────────┐
              ▼               ▼               ▼              ▼
        LP pool side     Protocol         Fund         Creator
        (raises k)       treasury         multisig     (LaunchLab pools)
機制上:
  1. 交易費累積到池中。 費用從交換的輸入端移除,扣費後金額是恆定乘積數學看到的內容。這就是「LP 獲得費用」的含義——k 上升,所以每個 LP 代幣的隱含價值也上升。
  2. 協議/基金/創作者份額從該 LP 端累積扣除到每池計數器帳戶。 它們在池狀態上(protocol_fees_token{0,1}fund_fees_token{0,1} 等),直到有人呼叫 CollectProtocolFee / CollectFundFee / CollectCreatorFee。它們不會在那之前離開池的金庫;從交換的角度它們仍然「在池中」。
  3. 收集會移動它們。 各自的簽署者(AmmConfig 上的 protocol_owner / fund_owner 鑰匙,或 LaunchLab 池的啟動建立者)呼叫收集指令,程式從池金庫轉出到目的地 ATA。
幾個承載觀測:
  • 分割百分比來自交易費,不是交易。 0.25% 交易費加 12% 協議份額意思是協議獲得 0.25% × 12% = 0.03% 的交易——不是交易的 12%。
  • 創作者費只存在於 LaunchLab 畢業池。 標準 CPMM/CLMM 池有三向分割(LP / 協議 / 基金)。LaunchLab 添加第四個槽位路由給誰啟動了代幣,在 Initialize 設定且不可改。
  • AMM v4 只分裂兩種方式,每池硬編碼:LP 和協議。沒有基金槽位,沒有創作者槽位。
  • 基金 vs 協議——都是協議庫房目的地,但有不同的簽署者和不同的預期用途。protocol 歷史上資助營運;fund 是長期庫房。兩者之間的分割本身是可調的。
具體費率在 reference/fee-comparisonray/protocol-fees

4. 觀測帳戶(TWAP 環形緩衝區)

CPMM 和 CLMM 都為每個池維護一個觀測帳戶——一個 (timestamp, cumulative_price) 樣本的固定大小環形緩衝區,其他合約可以用來衍生操縱抵抗的 TWAP。
// CPMM ObservationState (簡化)
pub struct ObservationState {
    pub initialized: bool,
    pub observation_index: u16,            // 下一個要覆蓋的槽位
    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,  // 自初始化以來 (price × dt) 的總和
    pub cumulative_token_1_price_x32: u128,
}
它如何運作:
  • 每次交換呼叫 update_observation 程式讀取目前價格,乘以自上一觀測以來經過的秒數,並將其加入累積計數器。新條目覆蓋最舊槽位(環形緩衝區方式)。
  • 時間窗口上的 TWAP = (cumul[end] − cumul[start]) / (timestamp[end] − timestamp[start])。消費者選擇兩個觀測括住所需窗口並除。
  • Raydium 本身不使用 TWAP 進行定價。 AMM 數學直接讀取現貨儲備。觀測是外部性——Raydium 支付寫入成本,所以其他合約可以讀取。
  • AMM v4 沒有觀測帳戶。 它比 ObservationState 設計更舊;想要 v4 TWAP 的整合者必須從日誌歷史在鏈下計算。
配置詳情和索引數學在 products/cpmm/accountsproducts/clmm/accounts

5. REST API + SDK + IDL

鏈下表面是每個產品使用的單一三人組:
  • REST APIhttps://api-v3.raydium.io。所有鏈上狀態的讀取為主的索引視圖加上報價引擎。一個主機,一個模式。
  • TypeScript SDK — NPM 上的 @raydium-io/raydium-sdk-v2。為每個程式構建和簽署交易。與 API 交談以獲取報價/元資料,與 Solana RPC 交談以進行簽前狀態刷新。
  • IDL 登錄冊 — Anchor IDL 為每個發佈的程式存放在 raydium-idl 倉庫中(每個程式一個 JSON:CPMM、CLMM、LaunchLab)。TypeScript SDK 在內部消費這些 IDL;下游 Rust / Python 客戶端從相同檔案重新生成。
它們之間的邊界是清晰的:
部分讀取自寫入到陳舊容許
REST API索引器(解析鏈日誌)—(對整合者為唯讀)幾秒
SDKAPI + RPC構建交易;不廣播無——必須在簽前重新取得狀態
IDL程式源按程式升級版本化
一個常見錯誤是直接將 REST API 輸出饋入交易。不要——在簽署的槽位中從 Solana RPC 重新取得相關池/頭寸狀態。SDK 為第一方流自動執行此操作;如果你繞過 SDK,你必須自己執行。 完整參考在 sdk-api/,IDL 表面特別在 sdk-api/anchor-idl

6. 索引器和價格饋送

REST API 由 Raydium 自己的索引器饋送,該索引器訂閱來自 Solana RPC 車隊的程式日誌,並將非正規化記錄寫入 SQL 存儲。對整合者的兩個後果:
  • 索引器是唯一「知道」跨程式狀態的東西。 將 CPMM 池映射到其 CLMM 對應物、計算跨程式版本的 24h 交易量、拾取與 LP mint 相關的農場——所有這些都是索引器工作。程式本身不執行。
  • 索引器停機是 API 停機。 如果 API 返回陳舊或空資料,索引器是嫌疑人。鏈上狀態不受影響;有自己 RPC 和 SDK 的整合者可以繼續交易。
價格饋送是一個單獨的考慮。API 在大多數池回應上發佈 priceUsd 欄位;這是從索引器池儲備視圖和引用價格快照的鏈下計算(USDC 池作為常見樞紐)。它對 UI 足夠好;它對使用鏈上預言機不安全。用觀測 TWAP。

什麼不共享

明確列出很值得,因為新讀者經常假設比實際存在的更多共享:
  • 程式不彼此呼叫。 CPMM 交換永遠不 CPI 進入 CLMM 或 AMM v4。組合多個 AMM 的唯一程式是 AMM 路由程式——那個本身很薄,只是順序發出 CPI 進入每個 AMM。
  • 跨程式沒有共享升級權限。 每個鏈上程式有自己的程式升級鑰匙(3/4 多簽加 24h 時間鎖)。它們不鏈接。
  • 農場和 AMM 間沒有共享狀態。 農場不知道它質押的哪個 LP 來自 CPMM 池、CLMM 頭寸 NFT mint 或不相關的 SPL 代幣。農場程式將質押 mint 視為不透明。
  • 沒有預言機依賴。 定價在鏈上儲備。沒有 Pyth/Switchboard 備用;AMM 在清除前不檢查預言機。

指針

來源: