Перейти к основному содержанию
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Версия документации. Все примеры ориентированы на @raydium-io/raydium-sdk-v2@0.2.42-alpha в сети Solana mainnet-beta, проверено в 04.2026. 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
SDK автоматически обрабатывает выплату накопленных вознаграждений, поэтому если у этого кошелька уже есть стейк в этой ферме, инструкция выплатит накопленные награды в ATA пользователя в той же транзакции.

Только сбор наград (harvest)

Источник: src/farm/harvest.ts
harvestAllRewards принимает список — для пользовательских интерфейсов с портфолио группируйте вызовы. Каждая ферма собирается отдельной инструкцией в одну транзакцию (с учётом ограничения в 1232 байта; для более 6 ферм разделите на несколько транзакций). Для одной фермы на v6 можно также использовать явный путь Harvest:
На v3 и v5 идиома amount: 0 обязательна; SDK правильно её обрабатывает.

Анстейкинг

Источник: src/farm/unstake.ts

Создание фермы v6

Источник: src/farm/createAmmFarm.ts и editAmmFarm.ts
Ключевые моменты:
  • perSecond — целочисленная ставка эмиссии в секунду. SDK упаковывает её в Q64.64 перед отправкой. Для дробной ставки масштабируйте и корректируйте продолжительность.
  • Полный бюджет (perSecond × duration) должен быть в вашем ATA вознаграждения — create перемещает его в хранилище вознаграждений атомарно.
  • Вы можете инициировать до 5 потоков вознаграждений в одном вызове create. Список аккаунтов растёт на (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 сначала выплачивает накопленные награды. Но если ваш интерфейс показывает “собрать” отдельно от “вывести”, пользователь может подумать, что после Withdraw есть ещё что-то для сбора. Нет; всё накопленное к этому моменту было выплачено.
  • total_staked = 0 во время эмиссии. Эмиссия, накопленная когда ничего не было застейкано, теряется (формула обновления reward_per_share делит на 0 и программа пропускает обновление). Для программ с запланированным open_time проведите “начальный стейк” в момент open_time, чтобы избежать этого.
  • Комиссии передачи Token-2022. На фермах v6 с mint вознаграждений Token-2022 комиссия передачи применяется при эмиссии (хранилище → пользователь). Учитывайте это в расчётах APR.
  • Малый per_second на v5. u64 ставка v5 означает, что любой per_second < 1 единица токена в секунду (на mint с ≥9 дец., это часто желаемая ставка) не может быть выражена — ставка потока округляется до 0 и ферма ничего не выплачивает. Используйте v6.

Дальнейшие шаги

Источники: