跳轉到主要內容

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 自動翻譯,所有內容以英文版本為準。查看英文版 →
AMM v4 因為每次操作都會涉及 OpenBook 狀態,所以帳戶數量比 CPMM 或 CLMM 多得多。本頁將帳戶分為「資金池擁有」和「OpenBook 擁有」兩個部分,讓整合者快速判斷各帳戶歸屬。

清單

AMM v4 資金池在建立時會綁定到一個 OpenBook 市場。完整的即時情況如下:
類別帳戶擁有者角色
資金池AmmInfoAMM v4 程式資金池狀態:已累積費用、狀態、對資金庫和 OpenBook 市場的引用。
資金池amm_authorityAMM v4 程式由程式擁有的 PDA,簽署資金庫移動。在所有 AMM v4 資金池間共享。
資金池amm_open_ordersOpenBook資金池在此市場上的 OpenBook OpenOrders 帳戶。
資金池amm_target_ordersAMM v4 程式資金池側的目標掛單網格,用於回發到 OpenBook。
資金池pool_coin_token_accountSPL Token資金池的幣側資金庫(amm_authority 的 ATA)。
資金池pool_pc_token_accountSPL Token資金池的 pc 側資金庫。
資金池lp_mintSPL Token可互換的 LP 代幣。
資金池pool_withdraw_queueAMM v4 程式延遲提款的舊版佇列;保持零長度。
資金池pool_temp_lpAMM v4 程式Initialize 期間使用的輔助 LP 帳戶。
市場 (OpenBook)serum_marketOpenBook市場本身(基礎/報價代幣、資金庫簽署者等)。
市場serum_bidsserum_asksOpenBook買單和賣單佇列。
市場serum_event_queueOpenBook待處理事件(成交、取消)。
市場serum_coin_vaultserum_pc_vaultSPL TokenOpenBook 的市場級資金庫。
市場serum_vault_signerOpenBook市場級 PDA,簽署 serum_*_vault 移動。
注:「serum」前綴在 AMM v4 的 IDL 和欄位名稱中保留以維持向後相容性。它現在指的是 OpenBook 市場。

AmmInfo

資金池的根狀態帳戶。因為同時攜帶資金池和 OpenBook 引用,所以體積較大(約 752 字元)。
// programs/amm/src/state.rs (簡化版;欄位順序/名稱遵循 IDL)
pub struct AmmInfo {
    pub status: u64,           // 位元遮罩:啟用 swap/deposit/withdraw/crank
    pub nonce:  u64,           // 用於衍生 amm_authority 的 bump
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals:   u64,
    pub state:         u64,    // 內部狀態機
    pub reset_flag:    u64,
    pub min_size:      u64,
    pub vol_max_cut_ratio: u64,
    pub amount_wave: u64,
    pub coin_lot_size: u64,    // 鏡像 OpenBook 市場
    pub pc_lot_size:   u64,
    pub min_price_multiplier: u64,
    pub max_price_multiplier: u64,
    pub sys_decimal_value: u64,

    pub fees: Fees,            // 交易/協議/基金費率
    pub state_data: StateData,

    // 資金池擁有的帳戶:
    pub coin_vault: Pubkey,
    pub pc_vault:   Pubkey,
    pub coin_vault_mint: Pubkey,
    pub pc_vault_mint:   Pubkey,
    pub lp_mint:  Pubkey,
    pub open_orders: Pubkey,   // 資金池在 OpenBook 上的 OpenOrders
    pub market: Pubkey,        // OpenBook 市場
    pub market_program: Pubkey, // OpenBook 程式 ID
    pub target_orders: Pubkey,
    pub withdraw_queue: Pubkey,
    pub lp_vault:       Pubkey, // = pool_temp_lp
    pub owner: Pubkey,          // 管理員(多簽)
    pub lp_reserve: u64,
    pub padding: [u64; 3],
}

pub struct Fees {
    pub min_separate_numerator:   u64,     // 5
    pub min_separate_denominator: u64,     // 10_000
    pub trade_fee_numerator:      u64,     // 25  → 由 OpenBook 整合使用
    pub trade_fee_denominator:    u64,     // 10_000
    pub pnl_numerator:            u64,     // 12  → 協議分配的 swap 費用份額
    pub pnl_denominator:          u64,     // 100 → 所以 12/100 = 12% 費用,= 0.03% 交易量
    pub swap_fee_numerator:       u64,     // 25  → 0.25% 總 swap 費用
    pub swap_fee_denominator:     u64,     // 10_000
}

pub struct StateData {
    pub need_take_pnl_coin: u64,
    pub need_take_pnl_pc:   u64,
    pub total_pnl_pc:   u64,
    pub total_pnl_coin: u64,
    pub pool_open_time: u64,
    pub punish_pc_amount: u64,
    pub punish_coin_amount: u64,
    pub orderbook_to_init_time: u64,
    pub swap_coin_in_amount: u128,
    pub swap_pc_out_amount:  u128,
    pub swap_acc_pc_fee:    u64,
    pub swap_pc_in_amount:  u128,
    pub swap_coin_out_amount: u128,
    pub swap_acc_coin_fee:  u64,
}
整合者相關的欄位:
  • coin_vaultpc_vault — 資金池的 SPL Token 資金庫。根據 Serum/OpenBook 慣例,cointoken_0(基礎),pctoken_1(報價)。
  • coin_decimalspc_decimals — 與代幣相符。
  • open_orderstarget_ordersmarket — 必須傳遞給每個 swap/deposit/withdraw 指令。
  • fees.swap_fee_numerator / swap_fee_denominator — 總交易費用。預設 25 / 10_000 = 0.25%
  • status — 位元遮罩用於控制操作。透過 AdminSetStatus 由管理員設定。
  • state_data.need_take_pnl_* — 累積總費用與已清掃費用間的差值。TakePnl 將其清零。

OpenBook 連線

不再活躍。 AMM v4 資金池不再與 OpenBook 共享流動性 — 掛單網格已停用。本部分描述的 OpenBook 帳戶仍保留在每個資金池的 AmmInfo 上,並且由 V1 swap 進入點(以及 InitializeDepositWithdraw)進行驗證以維持向後相容性,但它們引用的鏈上狀態實際上是空的。使用 V2 swap 進入點SwapBaseInV2 / SwapBaseOutV2),這些完全不需要這些帳戶,代表今天的規範執行路徑。
當你呼叫 AMM v4 資金池上的任何 V1 讀取或寫入指令時,必須傳遞 OpenBook 帳戶。程式會重新衍生並驗證它們,所以傳遞不匹配的集合會導致回復。(V2 swap 變體完全不需要這些帳戶。)
const market = ...;  // OpenBook 市場 PublicKey

// OpenBook 在其市場帳戶上公開的欄位:
const marketDecoded = OpenBookMarket.decode(marketAccountData);
const {
  bids:           serumBids,
  asks:           serumAsks,
  eventQueue:     serumEventQueue,
  requestQueue:   serumRequestQueue,
  baseVault:      serumCoinVault,
  quoteVault:     serumPcVault,
  vaultSignerNonce,
} = marketDecoded;

const serumVaultSigner = PublicKey.createProgramAddressSync(
  [market.toBuffer(), u64ToBytes(vaultSignerNonce)],
  OPENBOOK_PROGRAM_ID,
);
AMM 的 amm_open_orders 是由 OpenBook 擁有的帳戶,保存資金池在此市場上的掛單狀態:活躍訂單、已結算餘額、推薦人等。amm_target_orders 是 AMM 側:它保存 AMM 的意圖網格(每個訂單槽的價格/大小),所以程式可以廉價地與當前發布的進行比較,並放置/取消差異。

權限 PDA

整個 AMM v4 程式恰好有一個 amm_authority PDA。其種子很簡單(["amm authority"]),其 bump 儲存在每個 AmmInfo 上。此權限為所有 AMM v4 資金池的所有代幣移動簽署。
const AMM_V4_PROGRAM_ID = new PublicKey(
  "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8",
);
const [ammAuthority] = PublicKey.findProgramAddressSync(
  [Buffer.from("amm authority")],
  AMM_V4_PROGRAM_ID,
);
有一個單獨的資金池範疇權限為每個資金池衍生以簽署 OpenBook 操作(在此程式的設計中 amm_authority 實際上涵蓋兩者;不同版本使用不同的衍生方式,所以在代碼中檢查特定資金池的 AmmInfo.nonce)。

資金庫

資金池的 SPL Token 資金庫是標準代幣帳戶,其 owneramm_authority。不是 ATA — 它們的位址是在 Initialize 時衍生的特定 PDA,使用 ["amm_associated_seed", coin_mint_or_pc_mint, market, amm_id] 種子。位址儲存在 AmmInfo 上;衍生是一次性的細節。 Token-2022 不支援。程式對所有資金庫移動都硬編碼 SPL Token 的程式 ID。嘗試將 AMM v4 資金池綁定到 Token-2022 代幣會在 Initialize 時失敗。

LP 代幣

經典的 SPL Token 代幣,其權限是 amm_authority。總供應量追蹤 LP 對資金池的所有權;燒毀 LP 按比例從兩個資金庫返回代幣。因為 AMM v4 早於 CPMM,所以資金池狀態中沒有 lp_supply 鏡像 — 直接讀取鏈上代幣的供應量。

狀態位元遮罩

AmmInfo.status 控制操作。位元(位置可能因程式版本而異 — 透過原始碼確認):
旗標效果
0SWAP_DISABLEDSwap* 拒絕。
1DEPOSIT_DISABLEDDeposit 拒絕。
2WITHDRAW_DISABLEDWithdraw 拒絕。
3CLMM_LIKE_MIGRATE由運營使用的遷移控制旗標。
Raydium 多簽透過 AdminCancelOrdersAdminSetParams 等設定這些。

觀察 / 預言機

AMM v4 沒有專用觀察帳戶。 需要鏈上 TWAP 的其他協議通常間接消費 OpenBook 的簿跨越或讀取鏈外資料。如果你需要具有程式支援的 Raydium TWAP,請使用 CPMM 或 CLMM。

從頭衍生資金池的帳戶

因為 AMM v4 不是為確定性每對 PDA 設計的(它早於該 Solana 慣例),規範的 amm_id 是使用以下方式衍生的帶種子的密鑰對
ammId = createWithSeed(
  owner: ammAuthority,
  seed:  marketPubkey.toBase58().slice(0, 32),
  programId: AMM_V4_PROGRAM_ID,
)
相同的帶種子密鑰模式適用於 amm_open_ordersamm_target_ordersamm_withdraw_queuepool_temp_lppool_coin_token_accountpool_pc_token_accountlp_mint。SDK 和 API 為你預先計算這些;見 raydium-sdk-v2Liquidity.getAssociatedPoolKeys 實際上,整合者從 GET https://api-v3.raydium.io/pools/info/ids?ids=<POOL_ID> 或 SDK 讀取資金池的完整帳戶集合。手動衍生很少需要。

生命週期快速參考

事件建立的帳戶刪除的帳戶
Initialize2amm_infoamm_open_ordersamm_target_orders、資金庫、lp_mintpool_withdraw_queuepool_temp_lp
Deposit—(可能建立使用者 LP ATA)
Withdraw
SwapBaseIn / SwapBaseOut—(可能建立使用者 ATA)
TakePnl
MonitorStep(crank)
資金池及其帳戶無限期保留。即使流動性完全提出,AmmInfo 也保留。

讀取資源

來源: