Zum Hauptinhalt springen

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.

Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Drei Programme, drei Schemas. Farm v3, v5 und v6 sind separate Programme mit separaten State-Layouts. Diese Seite dokumentiert jede Version nebeneinander. In der Praxis zielen die meisten neuen Integrationen auf v6 ab; v3 und v5 sind für die meisten Integratoren schreibgeschützt (Staking fand dort vor langer Zeit statt und die Pools laufen aus).

Kontobestand (pro Farm, beliebige Version)

KontoEigentümerZweck
FarmStateFarm-Programm (v3/v5/v6)Wurzel-State: Staking-Mint, insgesamt gestaked, Reward-Streams.
farm_authorityFarm-ProgrammPDA, die den Staking-Vault und die Reward-Vaults besitzt.
staking_vaultSPL TokenHält gestaked LP (oder was immer der Staking-Mint ist).
reward_vault_{i}SPL TokenHält das unverteilte Budget für Reward-Stream i. Einer pro Stream.
UserStake (v3/v5) / UserLedger (v6)Farm-ProgrammPro-(farm, user) Ledger: gestaked Betrag + Schnappschuss der Reward-pro-Share pro Stream.
Das SDK gibt den vollständigen Satz auf raydium.farm.getFarmById zurück. Für beliebige Third-Party-Farms liefert auch der API-Endpunkt GET https://api-v3.raydium.io/main/farms/info?ids=<FARM_ID> diese zurück.

FarmState-Layout — v6

v6 ist die aktuelle Version. Ihre Kontostruktur ist die allgemeinste.
// 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
}
Für Integratoren relevante Felder:
  • staking_mint, staking_vault — was gestaked wird und wo es sitzt.
  • total_staked — aktuell gesamt. Erforderlich zur Berechnung der APR: reward_per_second × 86400 / total_staked.
  • reward_infos[i].emission_per_second_x64 — die Q64.64-Rate. Durch 2^64 teilen für die echte Token-Anzahl pro Sekunde.
  • reward_infos[i].open_time / end_time — für UI-Anzeigen „X Tage verbleibend”.
  • reward_infos[i].reward_per_share_x64 — der Zähler, dem das UserLedger entgegenrechnet.

FarmState-Layout — 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],
}
Unterschiede zu v6:
  • Pro Slot, nicht pro Sekunde. v5’s Update-Schleife läuft auf Slots statt auf der Wanduhr. Das SDK normalisiert dies in der UI in „pro Sekunde”, aber on-chain ist die Einheit Slots.
  • Integer-Emissionsrate. reward_per_second ist u64. Dies begrenzt die minimal ausdrückbare Rate auf 1 Einheit pro Sekunde, was zu grob für Low-Emission-Streams auf 9-Dezimal-Mints ist. v6 behob dies mit der Q64.64-Rate.
  • Kein reward_sender. In v5 ist der Eigentümer der implizite Absender; nur owner kann aufstocken.

FarmState-Layout — 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],
}
Single-Reward. Slot-basiert. Die älteste Programmgeneration, am Leben erhalten für die RAY-USDC und SOL-USDC Farms, die v5 vorausgehen.

UserLedger (v6) / UserStake (v5/v3)

Pro-Benutzer-State, ein Konto pro (farm, user) Paar. Seeded 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,
);
(Seed-Strings sind die Werte, die tatsächlich vom SDK verwendet werden; Programmversionen haben sie historisch unterschiedlich gestaltet. Überprüfen Sie gegen die v6-Quelle für alles Sicherheitskritisches.)
// 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
}
Die Pro-Stream-Schuld ist der Accounting-Offset, der in der Übersicht beschrieben wird:
pending_for_stream_i = deposited × reward_per_share_x64[i] / 2^64  − reward_debts[i]
Nach jedem Deposit, Withdraw oder Harvest wird die Schuld auf den aktuellen deposited × reward_per_share_x64[i] / 2^64 zurückgesetzt.

Authority-PDAs

// 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,
);
Alle drei Versionen leiten die Farm-Authority pro Farm mit einem einzelnen Seed ab. Diese PDA ist die Authority auf dem Staking-Vault und auf jedem Reward-Vault. Sie signiert jeden Transfer, den die Farm vornimmt.

Vaults

Staking- und Reward-Vaults sind Standard-SPL-Token-Konten, deren owner die Farm-Authority-PDA ist. Adressen werden auf FarmState gespeichert — nicht neu ableiten; aus dem State lesen. Freeze-Authorities müssen auf dem Staking-Mint für v5/v6 deaktiviert werden (das Programm überprüft dies). Token-2022-Hinweise:
  • v3: Nur SPL Token.
  • v5: Nur SPL Token.
  • v6: Unterstützt Token-2022 auf Staking- und Reward-Mints, gated auf staking_token_program / reward_token_program Felder. Transfergebühren auf Token-2022 Reward-Mints werden beim Emit berechnet (Vault → Benutzer).

Beobachtung und APR

Farms speichern keine APR on-chain. Zur Berechnung:
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
Consumer ziehen typischerweise staking_mint_usd_price aus dem Pool, zu dem die LP gehört (über api-v3.raydium.io/pools/info/ids) und reward_usd_price aus einem beliebigen Price-Oracle.

Nächste Schritte

Quellen: