> ## 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.

# Akun Farm / Staking

> FarmState, UserStake / Ledger, reward vault, dan PDA authority — layout dan seed PDA untuk farm v3, v5, dan v6.

<Info>
  **Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.**

  [Lihat versi bahasa Inggris →](/products/farm-staking/accounts)
</Info>

<Info>
  **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).
</Info>

## Inventaris akun (per farm, semua versi)

| Akun                                    | Pemilik                 | Tujuan                                                                           |
| --------------------------------------- | ----------------------- | -------------------------------------------------------------------------------- |
| `FarmState`                             | Program farm (v3/v5/v6) | State utama: staking mint, total staked, reward stream.                          |
| `farm_authority`                        | Program farm            | PDA yang memiliki staking vault dan reward vault.                                |
| `staking_vault`                         | SPL Token               | Menyimpan staked LP (atau apapun staking mint-nya).                              |
| `reward_vault_{i}`                      | SPL Token               | Menyimpan anggaran undistributed untuk reward stream `i`. Satu per stream.       |
| `UserStake` (v3/v5) / `UserLedger` (v6) | Program farm            | Ledger 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.

```rust theme={null}
// 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

```rust theme={null}
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

```rust theme={null}
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:

```ts theme={null}
// 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.)

```rust theme={null}
// 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

```ts theme={null}
// 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

* [`products/farm-staking/instructions`](/id/products/farm-staking/instructions) — referensi instruksi per-versi.
* [`products/farm-staking/code-demos`](/id/products/farm-staking/code-demos) — staking, harvesting, dan membuat farm via SDK.
* [`reference/program-addresses`](/id/reference/program-addresses) — ketiga ID program.

Sumber:

* [Modul `Farm` Raydium SDK v2](https://github.com/raydium-io/raydium-sdk-V2)
* Source program farm v6 saat ini tidak dipublikasikan sebagai repo standalone; IDL dibundel dalam SDK di [`raydium-io/raydium-sdk-V2`](https://github.com/raydium-io/raydium-sdk-V2) di bawah `src/raydium/farm/`.
