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

# ファーム・ステーキング命令

> CreateFarm、Deposit、Withdraw、Harvest、AddReward / SetRewards / RestartRewards、WithdrawReward — ファーム v3、v5、v6 全体における命令セット。

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

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

<Info>
  ファーム命令はバージョンに固有です。v6 の `Deposit` は v5 ファームでは呼び出せません。逆も同じです。SDK はファームのプログラム所有者を読むことでディスパッチします。オンチェーン CPI の場合は、事前に正しいプログラム ID を選択する必要があります。
</Info>

## 命令一覧

| 用途                       | v3                    | v5                       | v6               |
| ------------------------ | --------------------- | ------------------------ | ---------------- |
| ファームを作成                  | `CreateFarm`          | `CreateFarm`             | `CreateFarm`     |
| ユーザー台帳を追加（暗黙的な場合あり）      | `CreateUserLedger`    | `CreateAssociatedLedger` | `Deposit` 内で暗黙   |
| ステーキング                   | `Deposit`             | `Deposit`                | `Deposit`        |
| ステーキング解除                 | `Withdraw`            | `Withdraw`               | `Withdraw`       |
| 報酬のみをクレーム                | N/A (`Deposit 0` を使用) | N/A (`Deposit 0` を使用)    | `Harvest`        |
| 作成後に報酬ストリームを追加           | N/A                   | `AddReward`              | `AddReward`      |
| 既存報酬ストリームを編集             | N/A                   | `SetRewards`             | `SetRewards`     |
| end\_time 後に報酬を再開        | N/A                   | `RestartRewards`         | `RestartRewards` |
| クレームされていない報酬予算を引き出し（管理者） | N/A                   | `WithdrawReward`         | `WithdrawReward` |

v3 と v5 では、ステークを変更せずに報酬をクレームする標準的な方法は、`amount = 0` で `Deposit` を呼び出すことです。プログラムはこれを純粋なセットルメントとして扱います。v6 では明示的な `Harvest` が導入され、わかりやすくなりました。

SDK はこれらすべてを `raydium.farm.deposit({ ... })` などの背後に抽象化しています。以下のセクションでは、手動で命令を構築する必要があるインテグレータ（アグリゲータ、監視ツール、SDK 拡張）向けの基礎となるアカウントリストを文書化しています。

## `CreateFarm` (v6)

新しい v6 ファームをスピンアップします。

**引数**

```
reward_info_count: u8               // 作成時の報酬ストリーム数 (1..=5)
reward_infos: [
  {
    open_time:            u64,
    end_time:             u64,
    emission_per_second_x64: u128,   // Q64.64
    mint:                 Pubkey,    // 報酬ミント
    token_program:        Pubkey,    // SPL または Token-2022
  }
]
```

**アカウント**（簡略版、`reward_info_count = 1` の場合）

| #  | 名前                         | W | S | 備考                             |
| -- | -------------------------- | - | - | ------------------------------ |
| 1  | `creator`                  | W | S | レント支払、ファーム所有。                  |
| 2  | `farm_state`               | W |   | 新しい `FarmState` アカウント。         |
| 3  | `farm_authority`           |   |   | PDA `[farm_id]`。               |
| 4  | `staking_mint`             |   |   |                                |
| 5  | `staking_vault`            | W |   | オーソリティの ATA または PDA ボールトとして作成。 |
| 6  | `staking_token_program`    |   |   |                                |
| 7  | `reward_mint`              |   |   |                                |
| 8  | `reward_vault`             | W |   | 初期予算を受け取ります。                   |
| 9  | `reward_token_program`     |   |   |                                |
| 10 | `reward_sender_ata`        | W |   | クリエイターの報酬ミント ATA。この命令で排出。      |
| 11 | `system_program`           |   |   |                                |
| 12 | `token_program`            |   |   |                                |
| 13 | `associated_token_program` |   |   |                                |
| 14 | `rent`                     |   |   |                                |

**前提条件**

* `open_time > now`、`end_time > open_time`。
* `creator` ATA は少なくとも `emission_per_second_x64 × (end_time − open_time) / 2^64` の報酬ミントを保有。
* `staking_mint` はフリーズ権限がない、またはフリーズ権限が無効。

**事後条件**

* `FarmState` が初期化され、`total_staked = 0`。
* 報酬ボールト(ボールト)は完全なストリーム予算で充当。
* クリエイターの報酬 ATA がその金額分排出。

## `Deposit` (v6)

ステーキングミントの `amount` をステーキングします。

**引数**

```
amount: u64
```

**アカウント**

| #        | 名前                         | W | S |
| -------- | -------------------------- | - | - |
| 1        | `user`                     | W | S |
| 2        | `user_ledger`              | W |   |
| 3        | `farm_state`               | W |   |
| 4        | `farm_authority`           |   |   |
| 5        | `staking_vault`            | W |   |
| 6        | `user_staking_ata`         | W |   |
| 7..(7+n) | `reward_vault_{i}`         | W |   |
| ...      | `user_reward_ata_{i}`      | W |   |
| last−2   | `system_program`           |   |   |
| last−1   | `token_program`            |   |   |
| last     | `associated_token_program` |   |   |

`user_ledger` が存在しない場合、SDK は `CreateAccount` スタイルの命令を前置します。v6 プログラムはシステムプログラムアカウントを指定されれば遅延作成も可能です。残りのアカウントパターン：各アクティブ報酬に対して `(reward_vault, user_reward_ata)` を追加して、セットルメントがペイアウトできるようにします。

**効果**

1. 各アクティブ報酬ストリームの `reward_per_share_x64[i]` を遅延更新フォーミュラを使って更新。
2. `pending_i = user_ledger.deposited × reward_per_share_x64[i] / 2^64 − user_ledger.reward_debts[i]` を計算。
3. `reward_vault_{i}` から `user_reward_ata_{i}` に `pending_i` を転送。
4. `user_staking_ata` から `staking_vault` にステーキングミント `amount` を転送。
5. `user_ledger.deposited += amount` を更新し、`reward_debts[i]` を再スナップショット。
6. `farm_state.total_staked += amount` を更新。

**前提条件**

* 真のステーキングについて `amount > 0`（v6 は `amount = 0` を禁止 — クレーム限定は `Harvest` を使用）。
* `user_staking_ata` は少なくとも `amount` を保有。
* 各アクティブ報酬ボールトはこのユーザーに支払うべき保留分を少なくとも保有。

## `Withdraw` (v6)

`amount` をアンステーキングします。

**引数**

```
amount: u64
```

**アカウント** — `Deposit` と同一。

**効果** — `Deposit` と同じセットルメント後、ステーキングミントをユーザーに戻す：`staking_vault → user_staking_ata`。`total_staked` と `user_ledger.deposited` の両方が減少。

**前提条件**

* `amount ≤ user_ledger.deposited`。
* ファームは一時停止されていない。

## `Harvest` (v6)

ステークを変更せずに保留報酬をクレームします。

**引数** — なし。

**アカウント** — `Deposit` と同一、ステーキング側の移動なし。

**効果** — `reward_per_share_x64[i]` を更新、`pending_i` をペイアウト、`reward_debts[i]` を再スナップショット。`total_staked` または `deposited` に変更なし。

## `AddReward` (v5/v6)

未使用スロットを持つ既存ファームに新しい報酬ストリームを追加します。

**引数**

```
reward_info: {
  open_time:            u64,
  end_time:             u64,
  emission_per_second_x64: u128,
  mint:                 Pubkey,
  token_program:        Pubkey,
}
```

**前提条件**

* 空きスロットが存在（v6 の場合 `reward_info_count < 5`、v5 の場合 `< 2`）。
* `open_time ≥ now`（将来の場合あり）または `open_time < now` はプログラムバージョンが許可する場合のみ — v6 は許可、v5 は許可しません。

**事後条件**

* 新しいストリームがインデックス `reward_info_count` で初期化され、`reward_info_count++`。
* 報酬ボールトは呼び出し元の ATA からの完全なストリーム予算でクレジット。

**一般的なエラー** — ミントが既存スロットと衝突する場合 `RewardAlreadyExists`。

## `SetRewards` (v5/v6)

既存報酬ストリームを拡張またはトップアップします。ミントを変更することはできません。`end_time` を短縮することはできません。`emission_per_second_x64` を実行中に削減することはできません。

**引数**

```
reward_index:         u8
new_open_time:        u64,
new_end_time:         u64,
new_emission_per_second_x64: u128,
```

**前提条件**

* ストリームがまだ実行中（`reward_state == 1`）。
* `new_end_time ≥ current end_time`。
* 追加で必要な予算 `(new_emission × new_duration − already_emissioned)` が送信元の ATA に存在し、命令により報酬ボールトに転送。

v5 では、同等の呼び出しは `SetRewards` で、より小さい引数セット（ライブストリーム上での秒単位の変更なし）。

## `RestartRewards` (v5/v6)

`end_time` が経過した後、ストリームを再開します。概念的には、既にスロットを持つミントの `AddReward` と同じです。

**引数** — そのインデックスで `AddReward` と同一の形状。

**前提条件**

* `reward_state == 2`（終了）。
* 呼び出し元はスロットの `reward_sender`（v6）またはファーム `owner`（v5）。

## `WithdrawReward` (v5/v6)

ストリーム終了後およびすべてのステーカーがハーベストするチャンスを持った後の、クレームされていない報酬ボールト残高のAdmin スイープ。

**引数**

```
reward_index: u8
```

**前提条件**

* ストリーム終了（`reward_state == 2`）。
* `reward_total_emissioned == reward_claimed + vault_balance`（現在何も支払うべきものなし）。

**効果** — 残りを `reward_sender_ata` に移動。プログラムはステーカーがまだ保留クレームを持っているときの引き出しを防ぎません。管理者は最初に遅延ステーカーの代わりにハーベストするか、彼らにハーベストさせることが想定されます。早期に掃除すると、ユーザーはクレームされていない報酬へのアクセスを失います。**これを早期に呼び出さないでください。**

## v5 の変更点

* `Deposit` / `Withdraw` は v6 と同じ形状ですが、最大 2 つの報酬スロットを使用し、`reward_per_share` は `u128`（異なる基数の固定小数点）。
* `CreateAssociatedLedger` は最初の `Deposit` 前に必須の個別呼び出し。v6 はこれをマージ。
* `AddReward` は利用可能、`Harvest` は不可（`Deposit 0` を使用）。

## v3 の変更点

* 単一報酬ストリーム。`AddReward` なし、2 番目のスロットなし。
* `Deposit 0` がクレームの唯一の方法。
* `CreateUserLedger` は最初の `Deposit` の前に呼び出される必要があります。

## 状態変更マトリックス

| 命令               | `total_staked` | `user.deposited` | `reward_per_share` | 報酬ボールト      |
| ---------------- | -------------- | ---------------- | ------------------ | ----------- |
| `CreateFarm`     | 0              | —                | 0                  | クリエイターにより充当 |
| `Deposit(n)`     | +n             | +n               | 更新済み               | −保留（ペイアウト）  |
| `Withdraw(n)`    | −n             | −n               | 更新済み               | −保留         |
| `Harvest`        | —              | —                | 更新済み               | −保留         |
| `AddReward`      | —              | —                | —                  | +新規予算       |
| `SetRewards`     | —              | —                | —                  | +差分予算       |
| `RestartRewards` | —              | —                | —                  | +予算         |
| `WithdrawReward` | —              | —                | —                  | −残額         |

## 次のステップ

* [`products/farm-staking/code-demos`](/ja/products/farm-staking/code-demos) — TypeScript の例。
* [`products/farm-staking/accounts`](/ja/products/farm-staking/accounts) — `FarmState` / `UserLedger` / `UserStake` レイアウト。
* [`reference/error-codes`](/ja/reference/error-codes) — ファームエラー列挙。

ソース：

* [Raydium SDK v2 `Farm` モジュール](https://github.com/raydium-io/raydium-sdk-V2)
* Raydium ファームプログラムソース（v3 / v5 / v6）
