本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
版本說明。 所有示例針對
@raydium-io/raydium-sdk-v2@0.2.64-alpha 在 Solana mainnet-beta 上運行,驗證時間 2026-09-09 — 下方每個建構器名稱、參數名稱和參數類型都已針對該版本的 src/raydium/farm/ 和 raydium-sdk-V2-demo/src/farm 進行驗證。SDK 根據農場的程式擁有者內部分派 v3 / v5 / v6;下方示例假設為 v6 農場。請參閱 reference/program-addresses 以了解三個程式 ID。農場模組的方法名稱不是你想像的那樣:沒有 getFarmById 也沒有 setRewards。取得資料透過 raydium.api.fetchFarmInfoById 進行,獎勵編輯建構器是 addNewRewardToken / addNewRewardsToken 和 restartReward / restartRewards。設定
此處的示例鏡像raydium-sdk-V2-demo/src/farm 中的檔案。啟動程序遵循示例倉庫的 config.ts.template:
按 ID 取得農場
沒有raydium.farm.getFarmById。每個農場示例都從 API 模組開始,該模組返回 deposit / withdraw / harvestAllRewards 都接受的標準化 FormatFarmInfoOut 形狀:
fetchFarmInfoById 接受逗號分隔的 ID 字串並返回陣列,因此一次呼叫可以補充整個投資組合。如果你需要原始帳戶金鑰而不是顯示資訊,raydium.api.fetchFarmKeysById({ ids }) 返回金庫和授權 PDA;SDK 在下方每個建構器內部為你內部呼叫它。
質押 LP 代幣
來源:src/farm/stake.ts
僅領取(收穫)
來源:src/farm/harvest.ts
farmInfoList 是按農場 ID 鍵入的 Record,不是陣列,建構器返回多個交易 — 因此 execute 必須給定 sequentially: true:
txIds 而不是單個 txId。
對於單個農場,使用 amount: 0 習慣用法進行收穫 — 這是 src/farm/harvest.ts 所做的,包括 v6 在內的每個版本:
取消質押
來源:src/farm/unstake.ts
建立 v6 農場
來源:src/farm/createAmmFarm.ts 和 editAmmFarm.ts
create 接受池資訊物件,用於其 LP 鑄幣被質押的池(不是裸鑄幣),rewardInfos 的每個條目都是 FarmRewardInfo:{ mint: PublicKey, perSecond: string, openTime: number, endTime: number, rewardType: "Standard SPL" | "Option tokens" }。時間是純秒數,perSecond 是字串,不是 BN。programId 預設為 v6 程式,因此你很少傳遞它。
perSecond是獎勵鑄幣原始單位每秒的發放速率,作為十進位字串傳遞。SDK 在發送前將其打包到鏈上固定點表示中。- 完整預算(
perSecond × (endTime − openTime))必須存在於你的獎勵 ATA 中 —create以原子方式將其移入獎勵金庫。 - 此 SDK 版本的農場建構器不支援 Token-2022 獎勵鑄幣;為獎勵使用普通 SPL 鑄幣。
- 你可以在一個
create呼叫中播種最多 5 個獎勵。帳戶列表按每個額外流增長(reward_mint, reward_vault, sender_ata, token_program);注意 1232 位元組交易大小限制。對於 4+ 獎勵,使用 1–2 建立,並在後續交易中使用addNewRewardsToken。
新增獎勵流
沒有raydium.farm.setRewards。改變農場獎勵的兩個建構器是 addNewRewardToken / addNewRewardsToken(用新鑄幣佔據空閒槽位)和 restartReward / restartRewards(重新啟動流已結束的槽位)。兩者都採用 FarmRewardInfo 物件,形狀完全相同於 create 使用的形狀。
perSecond × duration)作為交易的一部分從支付者的 ATA 中提取。基礎指令無法縮短流、無法降低實時流上的 per_second、無法改變槽位的獎勵鑄幣 — 要交換鑄幣,請等待 end_time 並在已釋放的槽位上使用 addNewRewardsToken,或建立新農場。
重新啟動已完成的流
來源:src/farm/editAmmFarm.ts
restartRewards 接受**newRewardInfos**(複數,陣列);restartReward 是單項形式,接受 newRewardInfo。鑄幣欄位是 mint,不是 rewardMint,它必須與農場上已存在的槽位相符 — 建構器按鑄幣查找槽位,如果不存在則出錯。
restartRewards 是 v6 專用 — 建構器讀取農場的程式 ID 並針對 v3 / v5 農場拋出錯誤。僅在目標槽位的 reward_state == 2(已結束)時有效;呼叫者必須是槽位的 reward_sender。注意 openTime >= endTime 在進行任何 RPC 之前被客戶端拒絕。
Rust CPI
農場 v6 最後部署於 2024-05-13,從整合者的角度來看不是 Anchor 程式。如果你需要從自己的鏈上程式與其組合,手動構造Instruction — 獨立派生帳戶列表和指令判別器(來自 raydium-sdk-V2/src/raydium/farm/ 下的 SDK TypeScript 佈局,或通過解碼真實交易),並 invoke_signed 它。請參閱 sdk-api/rust-cpi 以了解該程序。
無論你採取哪條路線,remaining_accounts 尾部必須與農場的活躍獎勵槽位 1 對 1 匹配(reward_vault_i、user_reward_ata_i 對按索引順序)。省略或誤排這些會導致無聲的誤計 — 程式將轉移錯誤的金額。
陷阱
- 忘記在提取前領取。 無害 —
Withdraw首先結算待結算獎勵。但如果你的 UI 將「領取」與「提取」分開顯示,使用者可能認為在Withdraw後仍有東西可領取。沒有;到那時為止累積的一切都已支付。 - 發放期間
total_staked = 0。 在沒有質押任何東西時累積的發放被沒收(reward_per_share更新公式除以 0,程式跳過更新)。對於具有計劃open_time的程式,在 open_time 運行「種子質押」以避免這種情況。 - Token-2022 轉移費用。 在具有 Token-2022 獎勵鑄幣的 v6 農場上,轉移費用適用於發放(金庫 → 使用者)。將其納入 APR 報價中。
- v5 上的小
per_second。 v5 的u64速率意味著任何per_second < 1代幣單位每秒(在具有 ≥9 位小數的鑄幣上,這通常是所需速率)無法表達 — 流速率四捨五入為 0,農場發放任何內容。使用 v6。
後續步驟
products/farm-staking/instructions— 基礎指令參考。products/clmm/fees— 與 CLMM 的原生獎勵流進行比較。user-flows/migrate-amm-v4-to-cpmm— 通常與啟動新 CPMM 農場配對。
- Raydium SDK v2
- 農場 v6 IDL 捆綁在
raydium-io/raydium-sdk-V2中的src/raydium/farm/下。

