Skip to main content
Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
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.

Inventaris instruksi

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
Akun (ringkas, untuk reward_info_count = 1) 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
Akun 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
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
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 umumRewardAlreadyExists 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
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
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

Langkah selanjutnya

Sumber: