Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Инструкции farm привязаны к версии. Инструкция
Deposit для v6 не работает на v5 farm, и наоборот. SDK выбирает версию по владельцу программы farm; при вызове через CPI с цепи вы должны заранее указать правильный program ID.Таблица инструкций
На v3 и v5 рекомендуемый способ получить награды без изменения стейка — вызвать
Deposit с параметром amount = 0. Программа обработает это как чистое урегулирование. В v6 добавлена явная инструкция Harvest для ясности.
SDK скрывает все эти детали за raydium.farm.deposit({ ... }) и т. д. В разделах ниже описаны списки счетов для интеграторов, которым нужно строить инструкции вручную (агрегаторы, мониторинг, расширения SDK).
CreateFarm (v6)
Создать новый v6 farm.
Параметры
reward_info_count = 1)
Предусловия
open_time > now,end_time > open_time.- ATA создателя содержит как минимум
emission_per_second_x64 × (end_time − open_time) / 2^64токенов награды. staking_mintне имеет freeze authority, или она отключена.
FarmStateинициализирован,total_staked = 0.- Хранилище награды пополнено полным бюджетом потока.
- ATA награды создателя опустошен на эту сумму.
Deposit (v6)
Заблокировать amount токенов staking mint.
Параметры
Если
user_ledger не существует, SDK добавляет CreateAccount-подобную инструкцию; программа v6 также может лениво создать его с учётом счёта system program. Паттерн оставшихся счетов: для каждого активного потока награды добавьте (reward_vault, user_reward_ata), чтобы урегулирование могло выплатить вознаграждение.
Эффект
- Обновить
reward_per_share_x64[i]для каждого активного потока награды, используя формулу ленивого обновления. - Вычислить
pending_i = user_ledger.deposited × reward_per_share_x64[i] / 2^64 − user_ledger.reward_debts[i]. - Передать
pending_iизreward_vault_{i}вuser_reward_ata_{i}. - Передать
amountтокенов staking mint изuser_staking_ataвstaking_vault. - Обновить
user_ledger.deposited += amountи пересчитатьreward_debts[i]. - Обновить
farm_state.total_staked += amount.
amount > 0для истинного стейка (v6 запрещаетamount = 0— используйтеHarvestдля получения только награды).user_staking_ataсодержит как минимумamount.- Каждое хранилище активной награды содержит как минимум причитающееся этому пользователю.
Withdraw (v6)
Разблокировать amount.
Параметры
Deposit.
Эффект — то же урегулирование, что и Deposit, затем передать токены staking mint обратно пользователю: staking_vault → user_staking_ata. Оба значения total_staked и user_ledger.deposited уменьшаются.
Предусловия
amount ≤ user_ledger.deposited.- Farm не на паузе.
Harvest (v6)
Получить накопленные награды без изменения стейка.
Параметры — отсутствуют.
Счета — аналогичны Deposit, без движения со стороны staking.
Эффект — обновить reward_per_share_x64[i], выплатить pending_i, пересчитать reward_debts[i]. Без изменений total_staked и deposited.
AddReward (v5/v6)
Добавить новый поток награды к существующему farm со свободным слотом.
Параметры
- Существует свободный слот (
reward_info_count < 5на v6,< 2на v5). open_time ≥ now(может быть в будущем), илиopen_time < nowдопускается только если версия программы это разрешает — v6 да, v5 нет.
- Новый поток инициализирован на индексе
reward_info_count,reward_info_count++. - Хранилище награды пополнено полным бюджетом потока из ATA вызывающего.
RewardAlreadyExists если mint совпадает с существующим слотом.
SetRewards (v5/v6)
Расширить или пополнить существующий поток награды. Невозможно изменить mint; невозможно сократить end_time; невозможно снизить emission_per_second_x64 при запущенном потоке.
Параметры
- Поток всё ещё работает (
reward_state == 1). new_end_time ≥ current end_time.- Требуемый дополнительный бюджет
(new_emission × new_duration − already_emissioned)присутствует в ATA отправителя и передаётся в хранилище награды этой инструкцией.
SetRewards с меньшим набором параметров (нет изменений за секунду для запущенных потоков).
RestartRewards (v5/v6)
Перезапустить поток после того, как его end_time прошёл. По сути то же самое, что AddReward для mint, который уже имеет слот.
Параметры — идентичная форма AddReward для этого индекса.
Предусловия
reward_state == 2(завершён).- Вызывающий —
reward_senderслота (v6) илиownerfarm (v5).
WithdrawReward (v5/v6)
Администратору вывести невостребованный остаток хранилища награды после завершения потока и того, как все стейкеры получили возможность собрать награды.
Параметры
- Поток завершён (
reward_state == 2). reward_total_emissioned == reward_claimed + vault_balance(ничего не задолжено).
reward_sender_ata. Программа не предотвращает вывод, пока стейкеры всё ещё имеют накопленные претензии; администратор должен сначала собрать награды от имени отставших стейкеров (или позволить им собрать). Если вывести рано, пользователи потеряют доступ к невостребованным наградам. Не вызывайте это рано.
Особенности v5
Deposit/Withdrawимеют ту же форму, что v6, но используют до 2 слотов награды, иreward_per_share— этоu128(fixed-point с другим radix).CreateAssociatedLedger— обязательный отдельный вызов перед первымDeposit; v6 объединил его.AddRewardдоступна,Harvestнет (используйтеDeposit 0).
Особенности v3
- Один поток награды. Нет
AddReward, нет второго слота. Deposit 0— единственный способ получить награды.CreateUserLedgerдолжен быть вызван перед первымDeposit.
Матрица изменения состояния
Что дальше
products/farm-staking/code-demos— примеры на TypeScript.products/farm-staking/accounts— макетыFarmState/UserLedger/UserStake.reference/error-codes— перечень ошибок farm.
- Raydium SDK v2
Farmmodule - Raydium farm program source (v3 / v5 / v6)

