本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
三个程序,三个数据结构。 农场 v3、v5 和 v6 是独立的程序,各有自己的状态布局。本页并行文档化它们各自的结构。实际上大多数新集成都针对 v6;对于大多数集成方来说,v3 和 v5 是只读的(质押早已发生,这些池已处于风险管理阶段)。
账户清单(每个农场,所有版本)
SDK 通过
raydium.farm.getFarmById 返回完整集合。对于任意第三方农场,API 端点 GET https://api-v3.raydium.io/main/farms/info?ids=<FARM_ID> 也会返回它们。
FarmState 布局 — v6
v6 是当前版本,其账户结构最具通用性。
staking_mint、staking_vault— 被质押的资产及其位置。total_staked— 当前总量。计算 APR 必需:reward_per_second × 86400 / total_staked。reward_infos[i].emission_per_second_x64— Q64.64 格式的速率。除以2^64得真实的每秒代币数。reward_infos[i].open_time/end_time— 用于 UI 显示”还剩 X 天”。reward_infos[i].reward_per_share_x64—UserLedger用来计算债务的计数器。
FarmState 布局 — v5
- 按区块而非按秒。 v5 的更新循环按区块而非挂钟时间运行。SDK 会将其规范化为”每秒”用于 UI,但链上单位是区块。
- 整数发放速率。
reward_per_second是u64。这使可表达的最小速率限制在每秒 1 单位,对于 9 位小数 mint 的低发放流来说过粗糙。v6 用 Q64.64 速率解决了这个问题。 - 没有
reward_sender。在 v5 上,owner 是隐含的发送方;只有owner能够充值。
FarmState 布局 — v3
UserLedger(v6)/ UserStake(v5/v3)
每个用户的状态,每个 (farm, user) 对应一个账户。Seeded PDA:
Deposit、Withdraw 或 Harvest 之后,债务被重置为当前的 deposited × reward_per_share_x64[i] / 2^64。
权限 PDA
金库
质押和奖励金库是标准的 SPL Token 账户,其owner 是农场权限 PDA。地址存储在 FarmState 上 — 不要重新派生;从状态中读取。质押 mint 上的冻结权限对于 v5/v6 必须被禁用(程序会检查)。
Token-2022 说明:
- v3:仅 SPL Token。
- v5:仅 SPL Token。
- v6:在质押和奖励 mint 上都支持 Token-2022,由
staking_token_program/reward_token_program字段限制。Token-2022 奖励 mint 上的转账费在发放时收取(金库 → 用户)。
观察和 APR
农场不在链上存储 APR。计算方法:api-v3.raydium.io/pools/info/ids)来获取 staking_mint_usd_price,并从任何价格预言机获取 reward_usd_price。
后续阅读
products/farm-staking/instructions— 各版本指令参考。products/farm-staking/code-demos— 通过 SDK 进行质押、收获和创建农场。reference/program-addresses— 所有三个程序 ID。
- Raydium SDK v2
Farm模块 - 农场 v6 程序源代码目前未作为独立仓库发布;IDL 打包在
raydium-io/raydium-sdk-V2中的src/raydium/farm/下。

