本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
版本说明。 所有示例针对
@raydium-io/raydium-sdk-v2@0.2.42-alpha,在 Solana mainnet-beta 上验证,时间为 2026-04。SDK 根据农场的程序所有者在内部分发 v3 / v5 / v6;下面的示例假定为 v6 农场。参见 reference/program-addresses 了解三个程序 ID。设置
此处的示例镜像自raydium-sdk-V2-demo/src/farm。初始化步骤遵循示例仓库的 config.ts.template:
按 ID 获取农场
getFarmById 从链外拉取 FarmState,根据程序版本进行解码,并将固定点发放速率标准化为普通的每秒 Decimal。
质押 LP 代币
来源:src/farm/stake.ts
仅领取(收获)
来源:src/farm/harvest.ts
harvestAllRewards 接受一个列表——对于显示投资组合视图的 UI,将调用进行批处理。每个农场在一笔交易内的单独指令中被领取(受 1232 字节大小限制;超过约 6 个农场时,拆分为多个交易)。
对于 v6 上的单个农场,你也可以使用显式的 Harvest 路径:
amount: 0 习用法是必需的;SDK 会正确地分发它。
解除质押
来源:src/farm/unstake.ts
创建 v6 农场
来源:src/farm/createAmmFarm.ts 和 editAmmFarm.ts
perSecond是每秒的整数发放速率。SDK 在发送前将其打包为 Q64.64。对于分数速率,按比例调整并调整持续时间。- 完整的预算(
perSecond × duration)必须存在于你的奖励 ATA 中——create原子地将其移入奖励金库。 - 你最多可以在一个
create调用中设置 5 个奖励。账户列表按每个额外流程增加(reward_mint, reward_vault, sender_ata, token_program);注意 1232 字节交易大小限制。对于 4 个或更多奖励,先用 1–2 个创建,然后在后续交易中使用AddReward。
追加现有奖励流
setRewards 扩展 end_time 并转移增量预算。该指令无法缩短流、无法在活跃流上降低 per_second、无法改变奖励 mint。要交换 mint,请等待 end_time 并在已释放的槽位(如果有)使用 AddReward,或创建新农场。
重启已完成的流
reward_state == 2(已结束)时有效。调用者必须是该槽位的 reward_sender(v6)或农场所有者(v5)。
Rust CPI
与 AMM v4 不同,v6 农场程序附带一个 Anchor 箱(raydium_farm_v6),与前端和 SDK 源代码一起发布。一个最小的 Deposit 示例:
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 奖励 mint 的 v6 农场上,转账费在发放时适用(金库 → 用户)。在 APR 报价中考虑这一点。
- v5 上的小
per_second。 v5 的u64速率意味着任何per_second < 1代币单位/秒(在 ≥9 小数位的 mint 上这通常是所需速率)无法表示——流速率舍入为 0,农场不发放任何东西。使用 v6。
下一步
products/farm-staking/instructions— 底层指令参考。products/clmm/fees— 与 CLMM 的原生奖励流进行比较。user-flows/migrate-amm-v4-to-cpmm— 通常与建立新的 CPMM 农场相配套。
- Raydium SDK v2
- Farm v6 IDL 捆绑在
raydium-io/raydium-sdk-V2的src/raydium/farm/下。

