Skip to main content
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
Farm 指令因版本而異。v6 上的 Deposit 無法在 v5 farm 上呼叫,反之亦然。SDK 會透過讀取 farm 的程式擁有者來進行分派;如需鏈上 CPI,你必須事先選擇正確的程式 ID。

指令清單

在 v3 和 v5 上,不改變質押而領取獎勵的標準方式是呼叫 Deposit 並設定 amount = 0。程式將其視為純粹的結算。v6 引入了明確的 Harvest 以提高清晰度。 SDK 將這些全部抽象化為 raydium.farm.deposit({ ... }) 等呼叫。以下各節記錄了基礎帳戶清單,供需要手動構建指令的整合者使用(聚合器、監測工具、SDK 擴展)。

CreateFarm (v6)

啟動新的 v6 farm。 引數
帳戶(簡化版,reward_info_count = 1 前置條件
  • open_time > nowend_time > open_time
  • creator ATA 至少持有 emission_per_second_x64 × (end_time − open_time) / 2^64 的獎勵 mint。
  • staking_mint 沒有凍結授權,或凍結授權已禁用。
後置條件
  • FarmState 初始化完成,total_staked = 0
  • 獎勵保險庫資金充足,包含完整流預算。
  • 建立者的獎勵 ATA 消耗相應金額。

Deposit (v6)

質押質押 mint 的 amount 引數
帳戶 如果 user_ledger 不存在,SDK 會前置一個 CreateAccount 風格的指令;v6 程式也可以透過系統程式帳戶惰性建立它。剩餘帳戶模式:針對每個有效的獎勵,附加 (reward_vault, user_reward_ata),以便結算可以支付。 效果
  1. 使用惰性更新公式為每個有效獎勵流重新整理 reward_per_share_x64[i]
  2. 計算 pending_i = user_ledger.deposited × reward_per_share_x64[i] / 2^64 − user_ledger.reward_debts[i]
  3. reward_vault_{i} 轉移 pending_iuser_reward_ata_{i}
  4. user_staking_ata 轉移 amount 質押 mint 至 staking_vault
  5. 更新 user_ledger.deposited += amount 並重新快照 reward_debts[i]
  6. 更新 farm_state.total_staked += amount
前置條件
  • amount > 0 才能進行真實質押(v6 禁止 amount = 0 — 僅領取時使用 Harvest)。
  • user_staking_ata 至少持有 amount
  • 每個有效獎勵保險庫至少持有欠此使用者的待領金額。

Withdraw (v6)

取消質押 amount 引數
帳戶 — 與 Deposit 相同。 效果 — 執行與 Deposit 相同的結算,然後將質押 mint 移回使用者:staking_vault → user_staking_atatotal_stakeduser_ledger.deposited 都會減少。 前置條件
  • amount ≤ user_ledger.deposited
  • Farm 未暫停。

Harvest (v6)

領取待領獎勵而不改變質押。 引數 — 無。 帳戶 — 與 Deposit 相同,質押端無動作。 效果 — 重新整理 reward_per_share_x64[i],支付 pending_i,重新快照 reward_debts[i]total_stakeddeposited 無變化。

AddReward (v5/v6)

為有可用插槽的現有 farm 新增新獎勵流。 引數
前置條件
  • 存在可用插槽(v6 上 reward_info_count < 5,v5 上 < 2)。
  • open_time ≥ now(可能在未來),或 open_time < now 僅在程式版本允許時才可——v6 允許,v5 不允許。
後置條件
  • 新流在索引 reward_info_count 處初始化,reward_info_count++
  • 獎勵保險庫由呼叫者的 ATA 記入完整流預算。
常見錯誤 — 如果 mint 與現有插槽衝突,則為 RewardAlreadyExists

SetRewards (v5/v6)

延長或補充現有獎勵流。無法變更 mint;無法縮短 end_time;執行後無法降低 emission_per_second_x64 引數
前置條件
  • 流仍在執行中(reward_state == 1)。
  • new_end_time ≥ 當前 end_time
  • 所需的額外預算 (new_emission × new_duration − already_emissioned) 存在於寄件者的 ATA 中,並由指令轉移至獎勵保險庫。
在 v5 上,等效呼叫為 SetRewards,引數集較小(執行中的流無每秒變更)。

RestartRewards (v5/v6)

在流的 end_time 已過後重啟流。概念上與已有插槽的 mint 的 AddReward 相同。 引數 — 與該索引的 AddReward 相同的形狀。 前置條件
  • reward_state == 2(已結束)。
  • 呼叫者是插槽的 reward_sender(v6)或 farm owner(v5)。

WithdrawReward (v5/v6)

在流已結束且所有質押者都有機會領取的情況下,對未領取獎勵保險庫餘額進行管理掃除。 引數
前置條件
  • 流已結束(reward_state == 2)。
  • reward_total_emissioned == reward_claimed + vault_balance(無待結算)。
效果 — 將餘額轉移至 reward_sender_ata。程式不會阻止在質押者仍有待領索賠的情況下進行提取;預期管理員首先代表落後的質押者進行領取(或讓他們自行領取)。如果你提前掃除,使用者將失去對未領獎勵的存取權。不要提前呼叫此指令。

v5 變異

  • Deposit / Withdraw 的形狀與 v6 相同,但使用最多 2 個獎勵插槽,reward_per_shareu128(具有不同基數的定點)。
  • CreateAssociatedLedger 是第一次 Deposit 前的必需單獨呼叫;v6 將其合併。
  • AddReward 可用,Harvest 不可用(使用 Deposit 0)。

v3 變異

  • 單一獎勵流。無 AddReward,無第二個插槽。
  • Deposit 0 是唯一的領取方式。
  • CreateUserLedger 必須在第一次 Deposit 前呼叫。

狀態變化矩陣

接下來前往

資源: