Skip to main content
本頁內容由 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
SDK 處理任何待結算獎勵的預先結算,因此如果此錢包已在此農場中有質押,指令將在同一交易中向使用者的 ATA 支付累積獎勵。

僅領取(收穫)

來源:src/farm/harvest.ts farmInfoList 是按農場 ID 鍵入的 Record,不是陣列,建構器返回多個交易 — 因此 execute 必須給定 sequentially: true:
建構器在 1232 位元組限制允許的範圍內盡可能多地打包每個交易中的農場,並將其餘部分分割為後續交易,這就是為什麼它返回 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,或建立新農場。
restartRewards 和 addNewRewardsToken 各返回一個建構器,因此單個交易可以同時執行兩者。src/farm/editAmmFarm.ts 展示了該模式:editFarmBuilder.builder.addInstruction(addNewRewardBuildData.builder.AllTxData),然後一個 versionBuild({ txVersion })。

重新啟動已完成的流

來源: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

沒有 raydium_farm_v6 Anchor crate。 crates.io 上不存在該名稱的 crate,農場 v6 程式不發佈鏈上 IDL(既沒有舊版 anchor:idl 帳戶,也沒有程式元資料程式中的條目),且不存在公開源倉庫。此頁面的早期版本顯示了 raydium_farm_v6::cpi::deposit 示例;它沒有針對任何內容進行編譯,已被移除。
農場 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。

後續步驟

來源: