Skip to main content
Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Banner versi. Semua demo menargetkan @raydium-io/raydium-sdk-v2@0.2.64-alpha terhadap Solana mainnet-beta, diverifikasi 2026-09-09 — setiap nama builder, nama parameter, dan tipe parameter di bawah telah diperiksa terhadap src/raydium/farm/ rilis tersebut dan terhadap raydium-sdk-V2-demo/src/farm. SDK mengirimkan v3 / v5 / v6 secara internal berdasarkan pemilik program farm; contoh di bawah mengasumsikan farm v6. Lihat reference/program-addresses untuk tiga ID program.Nama metode modul farm bukan apa yang Anda duga: tidak ada getFarmById dan tidak ada setRewards. Pengambilan data dilakukan melalui raydium.api.fetchFarmInfoById, dan builder pengeditan reward adalah addNewRewardToken / addNewRewardsToken dan restartReward / restartRewards.

Setup

Demo di sini mencerminkan file di raydium-sdk-V2-demo/src/farm. Bootstrap mengikuti config.ts.template repo demo:

Ambil farm berdasarkan id

Tidak ada raydium.farm.getFarmById. Setiap demo farm dimulai dari modul API, yang mengembalikan bentuk FormatFarmInfoOut yang dinormalisasi yang diambil oleh deposit / withdraw / harvestAllRewards:
fetchFarmInfoById mengambil string yang dipisahkan koma dari id dan mengembalikan array, jadi satu panggilan dapat menghidrasi seluruh portfolio. Jika Anda memerlukan kunci akun mentah daripada info tampilan, raydium.api.fetchFarmKeysById({ ids }) mengembalikan vault dan PDA otoritas; SDK memanggilnya secara internal untuk Anda di dalam setiap builder di bawah.

Stake token LP

Sumber: src/farm/stake.ts
SDK menangani pre-settle dari reward apa pun yang tertunda, jadi jika dompet ini sudah memiliki stake di farm ini, instruksi akan membayarkan reward yang terakumulasi ke ATA pengguna dalam transaksi yang sama.

Klaim saja (panen)

Sumber: src/farm/harvest.ts farmInfoList adalah Record yang dikunci berdasarkan id farm, bukan array, dan builder mengembalikan beberapa transaksi — jadi execute harus diberikan sequentially: true:
Builder mengemas sebanyak mungkin farm per transaksi sesuai batas 1232-byte dan membagi sisanya menjadi transaksi lanjutan, itulah mengapa ia mengembalikan txIds daripada txId tunggal. Untuk satu farm, panen dengan idiom amount: 0 — ini adalah apa yang dilakukan src/farm/harvest.ts, di setiap versi termasuk v6:

Unstake

Sumber: src/farm/unstake.ts

Buat farm v6

Sumber: src/farm/createAmmFarm.ts dan editAmmFarm.ts create mengambil objek info pool untuk pool yang mint LP-nya sedang di-stake (bukan mint kosong), dan setiap entri rewardInfos adalah FarmRewardInfo: { mint: PublicKey, perSecond: string, openTime: number, endTime: number, rewardType: "Standard SPL" | "Option tokens" }. Waktu adalah detik biasa, dan perSecond adalah string, bukan BN. programId default ke program v6, jadi Anda jarang meneruskannya.
Poin kunci:
  • perSecond adalah laju emisi per detik dalam unit mentah mint reward, diteruskan sebagai string desimal. SDK mengemas ke representasi fixed-point on-chain sebelum mengirim.
  • Anggaran penuh (perSecond × (endTime − openTime)) harus ada di ATA reward Anda — create memindahkannya ke vault reward secara atomik.
  • Mint reward Token-2022 tidak didukung oleh builder farm SDK di versi SDK ini; gunakan mint SPL biasa untuk reward.
  • Anda dapat menabur hingga 5 reward dalam satu panggilan create. Daftar akun tumbuh sebesar (reward_mint, reward_vault, sender_ata, token_program) per stream tambahan; tetap sadar akan batas ukuran transaksi 1232-byte. Untuk 4+ reward, buat dengan 1–2 dan gunakan addNewRewardsToken dalam transaksi lanjutan.

Tambahkan aliran reward baru

Tidak ada raydium.farm.setRewards. Dua builder yang mengubah reward farm adalah addNewRewardToken / addNewRewardsToken (menempati slot gratis dengan mint baru) dan restartReward / restartRewards (re-arm slot yang alirannya telah berakhir). Keduanya mengambil objek FarmRewardInfo dalam bentuk yang sama persis dengan yang digunakan create.
Anggaran delta (perSecond × duration) ditarik dari ATA pembayar sebagai bagian dari transaksi. Instruksi yang mendasar tidak dapat mempersingkat aliran, tidak dapat menurunkan per_second pada aliran aktif, dan tidak dapat mengubah mint reward slot — untuk menukar mint, tunggu end_time dan gunakan addNewRewardsToken pada slot yang dibebaskan, atau buat farm baru.
restartRewards dan addNewRewardsToken masing-masing mengembalikan builder, jadi satu transaksi dapat melakukan keduanya. src/farm/editAmmFarm.ts menunjukkan polanya: editFarmBuilder.builder.addInstruction(addNewRewardBuildData.builder.AllTxData), kemudian satu versionBuild({ txVersion }).

Restart aliran yang selesai

Sumber: src/farm/editAmmFarm.ts restartRewards mengambil newRewardInfos (jamak, array); restartReward adalah bentuk item tunggal dan mengambil newRewardInfo. Bidang mint adalah mint, bukan rewardMint, dan harus cocok dengan slot yang sudah ada di farm — builder mencari slot berdasarkan mint dan error jika tidak ada.
restartRewards adalah v6-only — builder membaca id program farm dan melempar untuk farm v3 / v5. Valid hanya ketika reward_state == 2 slot target (berakhir); pemanggil harus menjadi reward_sender slot. Perhatikan openTime >= endTime ditolak sisi klien sebelum RPC apa pun dibuat.

Rust CPI

Tidak ada crate Anchor raydium_farm_v6. Tidak ada crate dengan nama itu di crates.io, program Farm v6 tidak menerbitkan IDL on-chain (baik akun anchor:idl warisan maupun entri dalam Program Metadata program), dan tidak ada repositori sumber publik untuknya. Revisi sebelumnya dari halaman ini menunjukkan contoh raydium_farm_v6::cpi::deposit; itu tidak dikompilasi terhadap apa pun dan telah dihapus.
Farm v6 terakhir kali di-deploy pada 2024-05-13 dan bukan program Anchor dari sudut pandang integrator. Jika Anda perlu membuat komposisi dengannya dari program on-chain Anda sendiri, buat Instruction dengan tangan — turunkan daftar akun dan diskriminator instruksi secara independen (dari layout TypeScript SDK di bawah raydium-sdk-V2/src/raydium/farm/, atau dengan mendekode transaksi nyata), dan invoke_signed itu. Lihat sdk-api/rust-cpi untuk prosedur itu. Rute mana pun yang Anda ambil, ekor remaining_accounts harus cocok dengan slot reward aktif farm 1-untuk-1 (pasangan reward_vault_i, user_reward_ata_i dalam urutan indeks). Menghilangkan atau salah mengurutkan ini menghasilkan mis-akuntansi senyap — program akan mentransfer jumlah yang salah.

Jebakan

  • Lupa klaim sebelum withdraw. Tidak berbahaya — Withdraw menyelesaikan reward yang tertunda terlebih dahulu. Tetapi jika UI Anda menunjukkan “klaim” terpisah dari “withdraw”, pengguna mungkin berpikir masih ada sesuatu untuk diklaim setelah Withdraw. Tidak ada; semuanya yang terakumulasi hingga titik itu telah dibayarkan.
  • total_staked = 0 selama emisi. Emisi yang terakumulasi saat tidak ada yang di-stake hilang (formula pembaruan reward_per_share membagi dengan 0 dan program melewati pembaruan). Untuk program dengan open_time terjadwal, jalankan “seed stake” pada open_time untuk menghindari ini.
  • Biaya transfer Token-2022. Pada farm v6 dengan mint reward Token-2022, biaya transfer berlaku pada emit (vault → pengguna). Faktorkan ini ke dalam kutipan APR.
  • per_second kecil di v5. Laju u64 v5 berarti per_second < 1 unit token per detik (pada mint dengan ≥9 desimal ini sering kali laju yang diinginkan) tidak dapat diekspresikan — laju aliran dibulatkan ke 0 dan farm tidak memancarkan apa pun. Gunakan v6.

Ke mana selanjutnya

Sumber: