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

# Instruksi Farm / Staking

> CreateFarm, Deposit, Withdraw, Harvest, AddReward / SetRewards / RestartRewards, WithdrawReward — permukaan instruksi lengkap di 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/instructions)
</Info>

<Info>
  Instruksi farm bergantung pada versi. `Deposit` pada v6 tidak dapat dipanggil pada farm v5 dan sebaliknya. SDK mengirimkan dengan membaca pemilik program farm; untuk CPI on-chain Anda harus memilih program ID yang tepat di awal.
</Info>

## Inventaris instruksi

| Tujuan                                           | v3                        | v5                        | v6                       |
| ------------------------------------------------ | ------------------------- | ------------------------- | ------------------------ |
| Membuat farm                                     | `CreateFarm`              | `CreateFarm`              | `CreateFarm`             |
| Menambahkan ledger pengguna (mungkin implisit)   | `CreateUserLedger`        | `CreateAssociatedLedger`  | Implisit dalam `Deposit` |
| Staking                                          | `Deposit`                 | `Deposit`                 | `Deposit`                |
| Unstaking                                        | `Withdraw`                | `Withdraw`                | `Withdraw`               |
| Klaim hadiah saja                                | N/A (gunakan `Deposit 0`) | N/A (gunakan `Deposit 0`) | `Harvest`                |
| Tambahkan aliran hadiah setelah pembuatan        | N/A                       | `AddReward`               | `AddReward`              |
| Ubah aliran hadiah yang ada                      | N/A                       | `SetRewards`              | `SetRewards`             |
| Mulai ulang hadiah setelah end\_time             | N/A                       | `RestartRewards`          | `RestartRewards`         |
| Tarik anggaran hadiah yang belum diklaim (admin) | N/A                       | `WithdrawReward`          | `WithdrawReward`         |

Pada v3 dan v5, cara kanonikus untuk mengklaim hadiah tanpa mengubah staking adalah memanggil `Deposit` dengan `amount = 0`. Program memperlakukan ini sebagai penyelesaian murni. v6 memperkenalkan `Harvest` eksplisit untuk kejelasan.

SDK mengabstraksi semua ini di balik `raydium.farm.deposit({ ... })` dll. Bagian di bawah mendokumentasikan daftar akun yang mendasar untuk integrator yang perlu membangun instruksi secara manual (agregator, alat pemantauan, ekstensi SDK).

## `CreateFarm` (v6)

Jalankan farm v6 baru.

**Argumen**

```
reward_info_count: u8               // jumlah aliran hadiah saat pembuatan (1..=5)
reward_infos: [
  {
    open_time:            u64,
    end_time:             u64,
    emission_per_second_x64: u128,   // Q64.64
    mint:                 Pubkey,    // reward mint
    token_program:        Pubkey,    // SPL atau Token-2022
  }
]
```

**Akun** (ringkas, untuk `reward_info_count = 1`)

| #  | Nama                       | W | S | Catatan                                                     |
| -- | -------------------------- | - | - | ----------------------------------------------------------- |
| 1  | `creator`                  | W | S | Membayar rent, memiliki farm.                               |
| 2  | `farm_state`               | W |   | Akun `FarmState` baru.                                      |
| 3  | `farm_authority`           |   |   | PDA `[farm_id]`.                                            |
| 4  | `staking_mint`             |   |   |                                                             |
| 5  | `staking_vault`            | W |   | Dibuat sebagai ATA authority atau vault PDA.                |
| 6  | `staking_token_program`    |   |   |                                                             |
| 7  | `reward_mint`              |   |   |                                                             |
| 8  | `reward_vault`             | W |   | Akan menerima anggaran awal.                                |
| 9  | `reward_token_program`     |   |   |                                                             |
| 10 | `reward_sender_ata`        | W |   | ATA creator pada reward mint; dikurangi oleh instruksi ini. |
| 11 | `system_program`           |   |   |                                                             |
| 12 | `token_program`            |   |   |                                                             |
| 13 | `associated_token_program` |   |   |                                                             |
| 14 | `rent`                     |   |   |                                                             |

**Prekondisi**

* `open_time > now`, `end_time > open_time`.
* `creator` ATA memegang setidaknya `emission_per_second_x64 × (end_time − open_time) / 2^64` dari reward mint.
* `staking_mint` tidak memiliki freeze authority, atau freeze authority dinonaktifkan.

**Postkondisi**

* `FarmState` diinisialisasi, `total_staked = 0`.
* Vault hadiah didanai dengan anggaran aliran penuh.
* ATA hadiah creator dikurangi dengan jumlah tersebut.

## `Deposit` (v6)

Staking `amount` dari staking mint.

**Argumen**

```
amount: u64
```

**Akun**

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

Jika `user_ledger` tidak ada, SDK menambahkan instruksi gaya `CreateAccount`; program v6 juga dapat membuat lazilynya diberikan akun system program. Pola remaining accounts: untuk setiap hadiah aktif, tambahkan `(reward_vault, user_reward_ata)` sehingga penyelesaian dapat membayar.

**Efek**

1. Segarkan `reward_per_share_x64[i]` untuk setiap aliran hadiah aktif menggunakan formula pembaruan lazy.
2. Hitung `pending_i = user_ledger.deposited × reward_per_share_x64[i] / 2^64 − user_ledger.reward_debts[i]`.
3. Pindahkan `pending_i` dari `reward_vault_{i}` ke `user_reward_ata_{i}`.
4. Pindahkan `amount` staking mint dari `user_staking_ata` ke `staking_vault`.
5. Perbarui `user_ledger.deposited += amount` dan re-snapshot `reward_debts[i]`.
6. Perbarui `farm_state.total_staked += amount`.

**Prekondisi**

* `amount > 0` untuk staking asli (v6 melarang `amount = 0` — gunakan `Harvest` untuk klaim-saja).
* `user_staking_ata` memegang setidaknya `amount`.
* Setiap vault hadiah aktif memegang setidaknya pending yang diwajibkan kepada pengguna ini.

## `Withdraw` (v6)

Unstaking `amount`.

**Argumen**

```
amount: u64
```

**Akun** — identik dengan `Deposit`.

**Efek** — penyelesaian sama seperti `Deposit`, kemudian pindahkan staking mint kembali ke pengguna: `staking_vault → user_staking_ata`. `total_staked` dan `user_ledger.deposited` keduanya berkurang.

**Prekondisi**

* `amount ≤ user_ledger.deposited`.
* Farm tidak dijeda.

## `Harvest` (v6)

Klaim hadiah pending tanpa mengubah staking.

**Argumen** — tidak ada.

**Akun** — sama seperti `Deposit`, tidak ada pergerakan sisi staking.

**Efek** — segarkan `reward_per_share_x64[i]`, bayar `pending_i`, re-snapshot `reward_debts[i]`. Tidak ada perubahan pada `total_staked` atau `deposited`.

## `AddReward` (v5/v6)

Tambahkan aliran hadiah baru ke farm yang ada yang memiliki slot kosong.

**Argumen**

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

**Prekondisi**

* Slot kosong ada (`reward_info_count < 5` pada v6, `< 2` pada v5).
* `open_time ≥ now` (mungkin di masa depan) atau `open_time < now` hanya diizinkan jika versi program memungkinkannya — v6 memungkinkan, v5 tidak.

**Postkondisi**

* Aliran baru diinisialisasi pada indeks `reward_info_count`, `reward_info_count++`.
* Vault hadiah dikreditkan dengan anggaran aliran penuh dari ATA pemanggil.

**Kesalahan umum** — `RewardAlreadyExists` jika mint bertabrakan dengan slot yang ada.

## `SetRewards` (v5/v6)

Perpanjang atau isi ulang aliran hadiah yang ada. Tidak dapat mengubah mint; tidak dapat mempersingkat `end_time`; tidak dapat menurunkan `emission_per_second_x64` setelah berjalan.

**Argumen**

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

**Prekondisi**

* Aliran masih berjalan (`reward_state == 1`).
* `new_end_time ≥ current end_time`.
* Anggaran tambahan yang diperlukan `(new_emission × new_duration − already_emissioned)` ada dalam ATA pengirim dan ditransfer ke vault hadiah oleh instruksi.

Pada v5, panggilan yang setara adalah `SetRewards` dengan set argumen yang lebih kecil (tidak ada perubahan per-detik pada aliran aktif).

## `RestartRewards` (v5/v6)

Mulai ulang aliran setelah `end_time` terlampaui. Secara konseptual sama dengan `AddReward` untuk mint yang sudah memiliki slot.

**Argumen** — bentuk identik dengan `AddReward` pada indeks itu.

**Prekondisi**

* `reward_state == 2` (berakhir).
* Pemanggil adalah `reward_sender` slot (v6) atau farm `owner` (v5).

## `WithdrawReward` (v5/v6)

Admin sweep saldo vault hadiah yang belum diklaim setelah aliran berakhir dan semua staker memiliki kesempatan untuk harvest.

**Argumen**

```
reward_index: u8
```

**Prekondisi**

* Aliran berakhir (`reward_state == 2`).
* `reward_total_emissioned == reward_claimed + vault_balance` (tidak ada yang saat ini diwajibkan).

**Efek** — memindahkan sisa ke `reward_sender_ata`. Program tidak mencegah penarikan saat staker masih memiliki klaim pending; admin diharapkan melakukan harvest atas nama staker yang tertinggal terlebih dahulu (atau membiarkan mereka harvest). Jika Anda melakukan sweep terlalu awal, pengguna kehilangan akses ke hadiah yang belum diklaim mereka. **Jangan panggil ini terlalu awal.**

## Variasi v5

* `Deposit` / `Withdraw` memiliki bentuk yang sama dengan v6 tetapi menggunakan hingga 2 slot hadiah dan `reward_per_share` adalah `u128` (titik-tetap dengan radix berbeda).
* `CreateAssociatedLedger` adalah panggilan terpisah yang diperlukan sebelum `Deposit` pertama; v6 menggabungkannya.
* `AddReward` tersedia, `Harvest` tidak (gunakan `Deposit 0`).

## Variasi v3

* Aliran hadiah tunggal. Tidak ada `AddReward`, tidak ada slot kedua.
* `Deposit 0` adalah satu-satunya cara untuk klaim.
* `CreateUserLedger` harus dipanggil sebelum `Deposit` pertama.

## Matriks perubahan state

| Instruksi        | `total_staked` | `user.deposited` | `reward_per_share` | Vault hadiah          |
| ---------------- | -------------- | ---------------- | ------------------ | --------------------- |
| `CreateFarm`     | 0              | —                | 0                  | didanai oleh creator  |
| `Deposit(n)`     | +n             | +n               | disegarkan         | −pending (dibayarkan) |
| `Withdraw(n)`    | −n             | −n               | disegarkan         | −pending              |
| `Harvest`        | —              | —                | disegarkan         | −pending              |
| `AddReward`      | —              | —                | —                  | +anggaran baru        |
| `SetRewards`     | —              | —                | —                  | +anggaran delta       |
| `RestartRewards` | —              | —                | —                  | +anggaran             |
| `WithdrawReward` | —              | —                | —                  | −sisa                 |

## Langkah selanjutnya

* [`/id/products/farm-staking/code-demos`](/id/products/farm-staking/code-demos) — contoh TypeScript.
* [`/id/products/farm-staking/accounts`](/id/products/farm-staking/accounts) — tata letak `FarmState` / `UserLedger` / `UserStake`.
* [`/id/reference/error-codes`](/id/reference/error-codes) — enumerasi error farm.

Sumber:

* [Modul `Farm` Raydium SDK v2](https://github.com/raydium-io/raydium-sdk-V2)
* Sumber program farm Raydium (v3 / v5 / v6)
