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

# ファーム・ステーキング アカウント

> FarmState、UserStake / Ledger、リワード・ボルト、および権限 PDA — farm v3、v5、v6 のレイアウトおよび PDA シード。

<Info>
  **このページは AI による自動翻訳です。すべての内容は英語版を正とします。**

  [英語版を表示 →](/products/farm-staking/accounts)
</Info>

<Info>
  **3つのプログラム、3つのスキーマ。** Farm v3、v5、v6 は異なるプログラムであり、異なるステート・レイアウトを持っています。このページでは各バージョンを並べて説明します。実際のところ、ほとんどの新しい統合は v6 をターゲットとしています。v3 と v5 はほとんどの統合企業にとってリードオンリーです（ステーキングはすでに遠い過去に行われており、これらのプールは段階的に廃止されています）。
</Info>

## アカウント一覧（ファームごと、任意のバージョン）

| アカウント                                | 所有者                  | 目的                                                           |
| ------------------------------------ | -------------------- | ------------------------------------------------------------ |
| `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 は現在のバージョンです。そのアカウント構造が最も汎用的です。

```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
}
```

統合企業向けのフィールド：

* **`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

```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],
}
```

v6 との相違点：

* **秒単位ではなくスロット単位。** v5 の更新ループはウォール・クロックではなくスロットで実行します。SDK はこれを UI 向けの「秒単位」に正規化しますが、オンチェーンではスロットが単位です。
* **整数エミッション率。** `reward_per_second` は `u64` です。これにより、秒単位の最小表現レートが 1 ユニットに制限されます。9 進数ミントでは低排出ストリームには粗すぎます。v6 は Q64.64 レートでこれを修正しました。
* **`reward_sender` なし。** v5 では所有者が暗黙のセンダーです。`owner` だけがトップアップできます。

## `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],
}
```

単一リワード。スロットベース。最も古いプログラム世代で、v5 以前の RAY-USDC および SOL-USDC ファームのために保持されています。

## `UserLedger`（v6）/ `UserStake`（v5/v3）

ユーザーごとのステート。`(farm, user)` ペアごとに 1 つのアカウント。シード PDA：

```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,
);
```

（シード文字列は SDK が実際に使用する値です。プログラム・バージョンは歴史的にそれらを変更してきました。セキュリティが重要な場合は v6 ソースに対して検証してください。）

```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
}
```

ストリームごとの債務は、概要で説明したアカウンティング・オフセットです：

```
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

```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,
);
```

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` を取得します。

## 次のステップ

* [`products/farm-staking/instructions`](/ja/products/farm-staking/instructions) — バージョンごとの命令リファレンス。
* [`products/farm-staking/code-demos`](/ja/products/farm-staking/code-demos) — SDK 経由のステーキング、ハーベスト、ファーム作成。
* [`reference/program-addresses`](/ja/reference/program-addresses) — 3 つのプログラム ID すべて。

出典：

* [Raydium SDK v2 `Farm` module](https://github.com/raydium-io/raydium-sdk-V2)
* Farm v6 プログラム・ソースは現在スタンドアロン・リポジトリとして公開されていません。IDL は [`raydium-io/raydium-sdk-V2`](https://github.com/raydium-io/raydium-sdk-V2) の `src/raydium/farm/` に以下としてバンドルされています。
