Langsung ke konten utama

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.

Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Tiga program, tiga skema. Farm v3, v5, dan v6 adalah program terpisah dengan layout state terpisah. Halaman ini mendokumentasikan ketiganya secara berdampingan. Dalam praktik, sebagian besar integrasi baru menargetkan v6; v3 dan v5 adalah read-only untuk sebagian besar integrator (staking sudah terjadi di sana lama sekali dan pool sedang dalam fase wind-down).

Inventaris akun (per farm, semua versi)

AkunPemilikTujuan
FarmStateProgram farm (v3/v5/v6)State utama: staking mint, total staked, reward stream.
farm_authorityProgram farmPDA yang memiliki staking vault dan reward vault.
staking_vaultSPL TokenMenyimpan staked LP (atau apapun staking mint-nya).
reward_vault_{i}SPL TokenMenyimpan anggaran undistributed untuk reward stream i. Satu per stream.
UserStake (v3/v5) / UserLedger (v6)Program farmLedger per-(farm, user): jumlah staked + snapshot reward-per-share per stream.
SDK mengembalikan set lengkap pada raydium.farm.getFarmById. Untuk farm pihak ketiga arbitrer, endpoint API GET https://api-v3.raydium.io/main/farms/info?ids=<FARM_ID> juga mengembalikannya.

Layout FarmState — v6

v6 adalah versi terkini. Struktur akunnya paling umum.
// 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
}
Field yang relevan untuk integrator:
  • staking_mint, staking_vault — apa yang distaked dan di mana tempat penyimpanannya.
  • total_staked — total saat ini. Diperlukan untuk menghitung APR: reward_per_second × 86400 / total_staked.
  • reward_infos[i].emission_per_second_x64 — rate Q64.64. Bagikan dengan 2^64 untuk mendapatkan jumlah token per-detik yang sebenarnya.
  • reward_infos[i].open_time / end_time — untuk tampilan UI “X hari tersisa”.
  • reward_infos[i].reward_per_share_x64 — counter yang menjadi offset utang UserLedger.

Layout 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],
}
Perbedaan dari v6:
  • Per-slot, bukan per-detik. Loop update v5 berjalan pada slot daripada jam dinding. SDK menormalisasi ini menjadi “per-detik” untuk UI tetapi on-chain unitnya adalah slot.
  • Integer emission rate. reward_per_second adalah u64. Ini membatasi rate minimum yang dapat diekspresikan menjadi 1 unit per detik, yang terlalu kasar untuk stream emisi rendah pada mint 9-desimal. v6 memperbaikinya dengan rate Q64.64.
  • Tidak ada reward_sender. Pada v5 owner adalah pengirim implisit; hanya owner yang dapat top up.

Layout 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],
}
Single-reward. Berbasis slot. Generasi program tertua, dipertahankan untuk farm RAY-USDC dan SOL-USDC yang mendahului v5.

UserLedger (v6) / UserStake (v5/v3)

State per-user, satu akun per pasangan (farm, user). PDA seed:
// 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,
);
(String seed adalah nilai yang benar-benar digunakan oleh SDK; versi program secara historis telah memvariasikannya. Verifikasi terhadap source v6 untuk apa pun yang bersifat kritis keamanan.)
// 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
}
Utang per-stream adalah offset akuntansi yang dijelaskan dalam ringkasan:
pending_for_stream_i = deposited × reward_per_share_x64[i] / 2^64  − reward_debts[i]
Setelah setiap Deposit, Withdraw, atau Harvest, utang diatur ulang ke deposited × reward_per_share_x64[i] / 2^64 yang sekarang.

Authority 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,
);
Ketiga versi menurunkan farm authority per-farm dengan seed tunggal. PDA ini adalah authority pada staking vault dan pada setiap reward vault. Ini menandatangani setiap transfer yang farm lakukan.

Vault

Staking dan reward vault adalah akun SPL Token standar yang owner-nya adalah farm authority PDA. Alamat disimpan pada FarmState — jangan re-derive; baca dari state. Freeze authority harus dinonaktifkan pada staking mint untuk v5/v6 (program memeriksa). Catatan Token-2022:
  • v3: SPL Token saja.
  • v5: SPL Token saja.
  • v6: Mendukung Token-2022 pada staking dan reward mint, gated pada field staking_token_program / reward_token_program. Transfer fee pada Token-2022 reward mint dikenakan saat emit (vault → user).

Observasi dan APR

Farm tidak menyimpan APR on-chain. Untuk menghitung:
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
Konsumen biasanya menarik staking_mint_usd_price dari pool yang LP milik (via api-v3.raydium.io/pools/info/ids) dan reward_usd_price dari oracle harga apa pun.

Langkah selanjutnya

Sumber: