Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Начиная с обновления программы 2026-07, зависимость AMM v4 от OpenBook / Serum была удалена. Устаревшие инструкции v1 SwapBaseIn / SwapBaseOut, Deposit и Withdraw сохраняют свои старые макеты учётных записей для обратной совместимости: учётные записи маркета по-прежнему принимаются в своих старых позициях, но они больше не проверяются и не используются (CPI не выполняется). Новые интеграции должны использовать точки входа V2 swap, которые полностью опускают учётные записи маркета. Несколько инструкций были удалены и теперь возвращают ошибку — см. запись в журнале изменений. Списки учётных записей ниже используют имена полей из Raydium SDK; базовый IDL иногда использует префиксы serum_*.Обновление программы 2026-09 добавляет одну административную инструкцию WithdrawExcessLamports (тег 18) и удаляет rent sysvar из CreateConfigAccount. Всё, что вызывают трейдеры или LP, остаётся без изменений. См. запись в журнале изменений от 2026-09-09.

Инвентарь инструкций

SDK предоставляет построители только для инструкций, обращённых к пользователю. Инструкции обслуживания обычно вызываются хранителем Raydium. Удалены / больше не вызываются (их построители клиента были удалены): Initialize (тег 0, используйте Initialize2), MonitorStep (2), MigrateToOpenBook (5), WithdrawSrm (8), PreInitialize (10, используйте Initialize2), SimulateInfo (12), AdminCancelOrders (13). Транзакция с одним из этих тегов завершается ошибкой; программа никогда не выполняет инструкцию. Рассматривайте все семь как удалённые, а не как пути обработки ошибок.

Initialize2

Инициализировать новый пул AMM v4, привязанный к существующему маркету OpenBook. Аргументы
Учётные записи (записываемая W, подписант S)
Два принимаемых макета. Список из 19 учётных записей выше — рекомендуемый. Для обратной совместимости программа также читает устаревший макет из 21 учётной записи, который вставляет игнорируемую amm_open_orders на позицию 7 и игнорируемую market_program на позицию 16 — именно это по-прежнему выдаёт встроенный в репозиторий построитель инструкции initialize2. Любая другая длина разбирается позиционно по устаревшему макету и завершится ошибкой.
Постусловия
  • LP, отправленные создателю = sqrt(init_coin_amount × init_pc_amount) − 10^coin_mint.decimals. Десятичные разряды LP равны coin_mint.decimals, поэтому вычитаемая сумма — это ровно один целый LP-токен; он никогда не минтится и навсегда выведен из обращения. Если sqrt(...) меньше этой величины, инструкция откатывается с InitLpAmountTooLess.
  • AmmInfo.lp_amount хранит полный sqrt(...), а не отминтенную сумму — поэтому lp_mint.supply навсегда на один целый LP-токен ниже, чем amm.lp_amount. Вся пропорциональная математика использует amm.lp_amount.
  • Никакие ордера OpenBook не размещаются (сетка книги ордеров была удалена). AmmInfo.market записывает учётную запись, переданную в слоте 15, но AmmInfo.open_orders и AmmInfo.market_program оба записываются как Pubkey::default(), а coin_lot_size / pc_lot_size / min_size инициализируются в 0. В устаревшем макете из 21 учётной записи дополнительные amm_open_orders и market_program читаются и отбрасываются.
Частые ошибки — InvalidCoinMint (минты coin и pc совпадают), InvalidConfigAccount (неверный PDA amm_config), InvalidFee (неверный получатель сбора за создание пула), InvalidProgramAddress (неверная amm_authority или неверный nonce), RepeatCreateAmm (для этого маркета пул уже существует), InitLpAmountTooLess, InvalidSupply (одна из начальных сумм равна 0, либо у LP-минта уже есть supply), AlreadyInUse.

Deposit

Добавить ликвидность. Аргументы
Учётные записи (сокращённо)
Принимаются только 11, 14 или 15 учётных записей — ничего другого. Устаревший макет — это 14 учётных записей (или 15 с завершающей игнорируемой учётной записью): тот же список с игнорируемой amm_open_orders на позиции 4, игнорируемым market на позиции 9 и игнорируемым market_event_queue, добавленным на позицию 14. Любое другое количество откатывается с WrongAccountsNumber.
Математика — стандартная пропорциональная. Используя эффективные резервы пула (хранилища + в книге), SDK вычисляет пару coin/pc, которая даёт заданное количество LP, и проверяет её против max_*. Возвращает ошибку ExceededSlippage, если одна из сторон превышает лимит.

Withdraw

Сжечь LP, получить обе стороны. Аргументы
Учётные записи — рекомендуемый макет из 11 учётных записей
Withdraw — это не обратный Deposit. Принимаются количества 11 либо от 20 до 23. Устаревший макет из 20 учётных записей ставит LP-аккаунт пользователя перед двумя принимающими ATA и перемежает пять игнорируемых учётных записей маркета: token_program, amm(W), amm_authority, amm_open_orders(W), amm_target_orders(W), lp_mint(W), pool_coin_token_account(W), pool_pc_token_account(W), market_program, market(W), market_coin_vault(W), market_pc_vault(W), market_vault_signer, user_lp_token_account(W), user_coin_token_account(W), user_pc_token_account(W), user_owner(S), market_event_queue(W), market_bids(W), market_asks(W). Формы из 22 и 23 учётных записей вставляют две игнорируемые учётные записи-заполнители после позиции 8. Любое другое количество откатывается с WrongAccountsNumber.
Больше нет шага settle-from-OpenBook — математика пропорционального распределения использует балансы хранилищ напрямую.

SwapBaseIn

Своп с точным входом. Всегда путь через AMM (не маршрутизируется через сопоставление OpenBook).
Используйте варианты V2 для нового кода. Поскольку зависимость AMM v4 от OpenBook была удалена, точки входа V1 (SwapBaseIn, SwapBaseOut) по-прежнему ожидают полный список из 17 учётных записей (или 18 с опциональной учётной записью target-orders), но учётные записи OpenBook/маркета теперь принимаются позиционно и игнорируются — они не проверяются и CPI не выполняется. Передача неправильного количества учётных записей по-прежнему возвращает ошибку WrongAccountsNumber, но содержимое учётных записей маркета больше не проверяется. Новые интеграции должны использовать SwapBaseInV2 / SwapBaseOutV2, которые принимают гораздо меньший список учётных записей и представляют канонический путь выполнения сегодня. Формы V1 задокументированы здесь для полноты и для чтения существующих транзакций в цепи.
Аргументы
Учётные записи (сокращённо) Математика — см. products/amm-v4/math. Предусловия
  • AmmStatus::from_u64(amm.status).swap_permission() истинно — то есть status равен 1 (Initialized), 6 (SwapOnly) или 7 (WaitingTrade). status — это значение перечисления, а не битовая маска; см. products/amm-v4/accounts.
  • amm.state_data.pool_open_time <= now.
  • amount_in > 0.
  • user_source_token_account содержит как минимум amount_in.
Постусловия
  • Пользователь теряет amount_in исходного токена, получает amount_out ≥ minimum_amount_out целевого токена.
  • Комиссия свопа остаётся в хранилищах, увеличивая инвариант k. Счётчики need_take_pnl_* свопами не затрагиваются — протокольный PnL пересчитывается из дельты k при следующем Deposit, Withdraw или WithdrawPnl (Processor::calc_take_pnl).
  • Примечание: счётчики аналитики state_data.swap_*_in_amount / swap_*_out_amount больше не обновляются — их значения заморожены. Используйте логи сделок для аналитики объёма.
Частые ошибки — ExceededSlippage, InvalidInput, InvalidStatus, NotAllowed (монеты coin/pc идентичны).

SwapBaseOut

Своп с точным выходом, обратный SwapBaseIn. Те же учётные записи. Аргументы

SwapBaseInV2 / SwapBaseOutV2

Варианты точек входа своп (теги 16 / 17), которые полностью пропускают учётные записи OpenBook. Математика идентична пути V1, но список учётных записей сокращается до только AMM и пользователя — 8 учётных записей, и amm_open_orders не передаётся: Резервы пула теперь являются балансами хранилищ (минус ожидающий PnL), поэтому математика котировки прямолинейна и идентична пути v1. Используйте V2 для экономии вычислений и избежания передачи (теперь игнорируемых) учётных записей маркета. Маршрутизатор Raydium всегда использует форму V2 при маршрутизации через AMM v4. Аргументы те же, что и в формах V1 (amount_in / minimum_amount_out для SwapBaseInV2; max_amount_in / amount_out для SwapBaseOutV2).

MonitorStep и другие удалённые инструкции

Удалены — больше не вызываются. Начиная с обновления 2026-07, MonitorStep (тег 2) был удалён из программы и теперь возвращает ошибку (unimplemented!) при вызове. Его построитель клиента также был удалён. То же самое относится к MigrateToOpenBook (5), WithdrawSrm (8), SimulateInfo (12), AdminCancelOrders (13) и устаревшим точкам входа создания пула Initialize (0) / PreInitialize (10) — используйте вместо этого Initialize2.
Исторически MonitorStep управлял взаимодействием пула с OpenBook: он урегулировал заполненные заказы (перемещая выручку из хранилищ маркета в хранилища пула через CPI OpenBook), отменял устаревшие заказы и размещал новые заказы для закрытия разрыва между target_orders и amm_open_orders. С удалением зависимости OpenBook нечего управлять и инструкция удалена. Любой хранитель или интеграция, которые по-прежнему вызывают её, должны удалить вызов.

WithdrawPnl / TakePnl

Административное снятие накопленных протокольных сборов. Аргументы
  • WithdrawPnl не принимает аргументы; он читает need_take_pnl_* и перемещает эти точные суммы.
Критическое изменение (только администратор). Список учётных записей сократился с 17 (+1 опциональная) до 10 — amm_open_orders и все шесть учётных записей маркета были удалены — без совместимого разбора. Старый макет не совпадает (старый #5 был amm_open_orders, теперь pool_coin_token_account) и завершается ошибками, такими как InvalidCoinVault. Административный инструментарий должен быть обновлён.
Учётные записи (новый макет из 10 учётных записей) Эффект
  • Передаёт need_take_pnl_coin из pool_coin_token_account в pnl_coin_token_account.
  • То же самое для pc.
  • Обнуляет need_take_pnl_coin и need_take_pnl_pc.
  • Изменение логики: если баланса хранилища недостаточно для покрытия накопленного PnL, инструкция возвращает TakePnlError напрямую (она больше не манипулирует состоянием книги заказов).
Нет изменения резервов, так как накопленный PnL уже был исключён из инварианта.

SetParams

Изменения параметров администратором, вызываемые мультиподписью Raydium. Аргументы — это тег param: u8 + полезная нагрузка.
Критическое изменение (только администратор). Список учётных записей был сокращен до просто [amm (W), admin (S)] (полномочия, open-orders, target-orders, хранилища и все учётные записи маркета были удалены). Перечисление param было перенумеровано и сокращено: Status = 0, State = 1, Fees = 2 (было 9), SetOpenTime = 3 (было 11). Все параметры сетки книги заказов и AmmOwner, LastOrderDistance, UpdateOpenOrder были удалены, и структура SetParamsInstruction потеряла new_pubkey и last_order_distance. Административный инструментарий должен быть обновлён.

CreateConfigAccount / UpdateConfigAccount

Административное управление PDA уровня программы AmmConfig (seed ["amm_config_account_seed"]). Учётная запись содержит ровно три значимых поля — pnl_owner, cancel_owner и create_pool_fee — плюс две зарезервированные области заполнения; флага создания пула нет. UpdateConfigAccount устанавливает pnl_owner при param = 0, cancel_owner при param = 1 и create_pool_fee при param = 2.
Изменено в 2026-09, обратно совместимо. CreateConfigAccount больше не читает rent sysvar. Его список учётных записей теперь 4 учётные записи, вниз с 5:Программа читает параметры аренды из Rent::get() вместо десериализации переданной учётной записи sysvar — что сделало естественным обновление зависимости Solana 3.0.Удалённая учётная запись была последней в списке, и обработчик читает свои учётные записи позиционно через next_account_info без проверки длины. Существующий административный инструмент, который по-прежнему передаёт старый список из 5 учётных записей, поэтому продолжает работать: конечная учётная запись аренды просто никогда не читается. Обновите его, когда удобно, не срочно. UpdateConfigAccount не изменён.
Initialize2 сохраняет rent sysvar в позиции 3 и по-прежнему использует его: программа перестала вызывать Rent::from_account_info на нём, но он по-прежнему передаётся в CPI spl_token::initialize_account и initialize_mint, которые создают хранилища пула и LP mint. Не удаляйте его из списка учётных записей.

WithdrawExcessLamports

Административное снятие lamports, находящихся выше минимума, освобождаемого от аренды, на учётных записях, контролируемых программой. Добавлено в обновлении 2026-09 для восстановления избыточного финансирования, которое снижение аренды SIMD-0437 оставляет на учётных записях, созданных до каждого шага. Он перемещает только избыток. Балансы токенов, данные учётной записи, владельцы и состояние пула остаются нетронутыми, и инструкция является no-op на учётной записи, уже находящейся на минимуме — поэтому безопасно запускать её повторно и снова после каждого шага развёртывания. Аргументы — нет. Полезная нагрузка — это единственный байт тега 18. Учётные записи Как обрабатывается каждая исходная учётная запись Программа выполняет диспетчеризацию на основе owner исходной учётной записи: Частые ошибки — InvalidSignAccount (неправильный подписант), InvalidSplTokenProgram (неправильная программа в слоте 3), InvalidProgramAddress (неправильный amm_authority), LamportsCalculateError (пользовательский код 60; круговой путь wSOL не привёл к нулю), и InsufficientFunds из пути, контролируемого программой, когда учётная запись содержит меньше, чем её собственный минимум аренды. Нет построителя SDK. @raydium-io/raydium-sdk-v2 не поставляет построитель для этой инструкции, и ни репозиторий raydium-sdk-V2-demo — это административный путь. Кодируйте вручную, как это делает sweep на стороне кошелька в solana-fundamentals/rent-and-reclaimable-rent для инструкции программы токенов.

Матрица изменения состояния

Столбец OpenBook исчез — ни одна инструкция больше не трогает книгу заказов.

Куда дальше

Источники: