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.
三個程序,三種協議。 農場 v3、v5 和 v6 是獨立的程序,擁有獨立的狀態佈局。本頁將各版本並排說明。實務上,大多數新的整合都以 v6 為目標;v3 和 v5 對大多數整合者來說是唯讀的(質押早已發生,這些池正處於退場階段)。
帳户清單(每個農場,任何版本)
| 帳户 | 所有者 | 用途 |
|---|
FarmState | 農場程序 (v3/v5/v6) | 根狀態:質押鑄幣、總質押、獎勵流。 |
farm_authority | 農場程序 | 擁有質押金庫和獎勵金庫的 PDA。 |
staking_vault | SPL Token | 持有質押的 LP(或質押鑄幣)。 |
reward_vault_{i} | SPL Token | 持有獎勵流 i 未分配的預算。每個流一個。 |
UserStake (v3/v5) / UserLedger (v6) | 農場程序 | 每個 (farm, user) 的帳簿:質押金額 + 每個流的獎勵占比快照。 |
SDK 在 raydium.farm.getFarmById 上返回完整集合。對於任意第三方農場,API 端點 GET https://api-v3.raydium.io/main/farms/info?ids=<FARM_ID> 也會返回這些帳户。
FarmState 佈局 — v6
v6 是當前版本,其帳户結構最通用。
// programs/farm_v6/src/state/farm.rs (abridged)
pub struct FarmState {
pub state: u64, // bitfield: 0 = live, 1 = paused, ...
pub nonce: u64, // bump for farm_authority
pub creator: Pubkey, // original creator (can add rewards / transfer admin)
pub staking_mint: Pubkey,
pub staking_vault: Pubkey,
pub staking_token_program: Pubkey, // SPL Token or Token-2022
pub lp_mint_decimals: u8,
pub reward_period_len: u64, // minimum duration between SetRewards edits
pub reward_period_min: u64,
pub total_staked: u64,
pub reward_info_count: u8,
pub _reserved: [u8; ...],
pub reward_infos: [RewardInfo; 5], // up to 5 reward streams
}
pub struct RewardInfo {
pub reward_state: u8, // 0 = unused, 1 = running, 2 = ended
pub open_time: u64, // start_time
pub end_time: u64,
pub last_update_time: u64,
pub emission_per_second_x64: u128, // Q64.64 fixed-point rate
pub reward_total_emissioned: u64, // sum of emissions so far
pub reward_claimed: u64, // sum paid out to stakers
pub reward_vault: Pubkey,
pub reward_mint: Pubkey,
pub reward_sender: Pubkey, // who deposited the budget; can top up
pub reward_token_program: Pubkey, // SPL or Token-2022
pub reward_per_share_x64: u128, // Q64.64 counter
}
整合者相關欄位:
staking_mint、staking_vault — 什麼被質押以及它位於何處。
total_staked — 當前總額。計算 APR 所需:reward_per_second × 86400 / total_staked。
reward_infos[i].emission_per_second_x64 — Q64.64 速率。除以 2^64 得到真正的每秒代幣數。
reward_infos[i].open_time / end_time — 用於 UI 的「剩餘 X 天」顯示。
reward_infos[i].reward_per_share_x64 — UserLedger 扣款的計數器。
FarmState 佈局 — v5
pub struct FarmStateV5 {
pub state: u64,
pub nonce: u64,
pub lp_vault: Pubkey, // aka staking_vault
pub reward_vaults: [Pubkey; 2],
pub owner: Pubkey,
pub reward_mints: [Pubkey; 2],
pub reward_total_emissioned: [u64; 2],
pub reward_claimed: [u64; 2],
pub reward_per_second: [u64; 2], // integer, not fixed-point
pub reward_open_time: [u64; 2],
pub reward_end_time: [u64; 2],
pub reward_per_share: [u128; 2], // Q56.8 or similar; check program source
pub total_staked: u64,
pub last_slot: u64, // v5 updates per-slot on mainnet
pub _reserved: [u8; 256],
}
與 v6 的差異:
- 每個插槽,而非每秒。 v5 的更新循環按插槽而非牆上時鐘運行。SDK 為 UI 將其規範化為「每秒」,但鏈上單位是插槽。
- 整數發放速率。
reward_per_second 是 u64。這將最小可表達速率限制為每秒 1 個單位,對於 9 位小數鑄幣的低發放流來說太粗糙。v6 使用 Q64.64 速率解決了這個問題。
- 沒有
reward_sender。在 v5 上,所有者是隱含的發送方;只有 owner 可以充值。
FarmState 佈局 — v3
pub struct FarmStateV3 {
pub state: u64,
pub nonce: u64,
pub lp_vault: Pubkey,
pub reward_vault: Pubkey, // single reward
pub owner: Pubkey,
pub reward_mint: Pubkey,
pub reward_total_emissioned: u64,
pub reward_claimed: u64,
pub reward_per_slot: u64,
pub reward_per_share: u128,
pub total_staked: u64,
pub last_slot: u64,
pub _reserved: [u8; 256],
}
單獎勵。基於插槽。最古老的程序版本,為先於 v5 的 RAY-USDC 和 SOL-USDC 農場而保留。
UserLedger (v6) / UserStake (v5/v3)
每個用戶狀態,每個 (farm, user) 對一個帳户。衍生 PDA:
// v6
const [ledgerPda] = PublicKey.findProgramAddressSync(
[farmId.toBuffer(), user.toBuffer(), Buffer.from("user_stake_info_v2")],
FARM_V6_PROGRAM_ID,
);
// v5
const [stakePda] = PublicKey.findProgramAddressSync(
[farmId.toBuffer(), user.toBuffer(), Buffer.from("user_stake_info")],
FARM_V5_PROGRAM_ID,
);
// v3
const [stakePda] = PublicKey.findProgramAddressSync(
[farmId.toBuffer(), user.toBuffer(), Buffer.from("staker_info")],
FARM_V3_PROGRAM_ID,
);
(種子字符串是 SDK 實際使用的值;程序版本在歷史上有所不同。如有任何安全相關的事項,請對照 v6 源代碼驗證。)
// v6
pub struct UserLedger {
pub version: u64,
pub farm_id: Pubkey,
pub owner: Pubkey,
pub deposited: u64, // current stake
pub reward_debts: [u128; 5], // snapshot of reward_per_share_x64 × deposited
}
每個流的扣款是概覽中描述的帳務抵消:
pending_for_stream_i = deposited × reward_per_share_x64[i] / 2^64 − reward_debts[i]
在每個 Deposit、Withdraw 或 Harvest 後,扣款會重置為當前的 deposited × reward_per_share_x64[i] / 2^64。
授權 PDA
// v6
const [farmAuthorityV6] = PublicKey.findProgramAddressSync(
[farmId.toBuffer()],
FARM_V6_PROGRAM_ID,
);
// v5
const [farmAuthorityV5] = PublicKey.findProgramAddressSync(
[farmId.toBuffer()],
FARM_V5_PROGRAM_ID,
);
// v3
const [farmAuthorityV3] = PublicKey.findProgramAddressSync(
[farmId.toBuffer()],
FARM_V3_PROGRAM_ID,
);
所有三個版本都用單一種子為每個農場衍生農場授權。此 PDA 是質押金庫和每個獎勵金庫的授權。它簽署農場進行的每項轉帳。
質押和獎勵金庫是標準 SPL Token 帳户,其 owner 是農場授權 PDA。地址存儲在 FarmState 上 — 不要重新衍生;從狀態讀取。質押鑄幣上的凍結授權必須在 v5/v6 上禁用(程序會檢查)。
Token-2022 注意事項:
- v3:僅 SPL Token。
- v5:僅 SPL Token。
- v6:在質押和獎勵鑄幣上都支持 Token-2022,由
staking_token_program / reward_token_program 欄位控制。Token-2022 獎勵鑄幣上的轉帳費在發放時收取(金庫 → 用戶)。
觀察和 APR
農場不在鏈上存儲 APR。計算方法:
annualized_rewards_value_usd = reward_per_second × 86400 × 365 × reward_usd_price
tvl_usd = total_staked / 10^decimals × staking_mint_usd_price
apr = annualized_rewards_value_usd / tvl_usd
消費者通常從 LP 所屬的池中拉取 staking_mint_usd_price(通過 api-v3.raydium.io/pools/info/ids)以及從任何價格預言機拉取 reward_usd_price。
下一步
來源: