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 による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
3つのプログラム、3つのスキーマ。 Farm v3、v5、v6 は異なるプログラムであり、異なるステート・レイアウトを持っています。このページでは各バージョンを並べて説明します。実際のところ、ほとんどの新しい統合は v6 をターゲットとしています。v3 と v5 はほとんどの統合企業にとってリードオンリーです(ステーキングはすでに遠い過去に行われており、これらのプールは段階的に廃止されています)。
アカウント一覧(ファームごと、任意のバージョン)
| アカウント | 所有者 | 目的 |
|---|
FarmState | ファーム・プログラム(v3/v5/v6) | ルート・ステート:ステーキング・ミント、総ステーク量、リワード・ストリーム。 |
farm_authority | ファーム・プログラム | ステーキング・ボルトとリワード・ボルトを所有する PDA。 |
staking_vault | SPL Token | ステーク済み LP(またはステーキング・ミント)を保有。 |
reward_vault_{i} | SPL Token | リワード・ストリーム i の未配布予算を保有。ストリームごとに 1 つ。 |
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) ペアごとに 1 つのアカウント。シード 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,
);
3 つのバージョンすべてが、単一シードを使用してファームごとにファーム権限を導出します。この PDA はステーキング・ボルトおよび各リワード・ボルトの権限です。ファームが行うすべての転送に署名します。
ボルト
ステーキング・ボルトとリワード・ボルトは標準的な SPL Token アカウントであり、その owner はファーム権限 PDA です。アドレスは FarmState に保存されます。再導出しないでください。ステートから読み取ってください。ステーキング・ミントのフリーズ権限は v5/v6 で無効化されている必要があります(プログラムがチェックします)。
Token-2022 に関する注釈:
- v3:SPL Token のみ。
- v5:SPL Token のみ。
- v6:
staking_token_program / reward_token_program フィールドでゲートされた、ステーキングおよびリワード・ミントの両方で Token-2022 をサポートします。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 を取得します。
次のステップ
出典: