Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Начиная с обновления программы 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
Добавить ликвидность.
Аргументы
Математика — стандартная пропорциональная. Используя эффективные резервы пула (хранилища + в книге), SDK вычисляет пару coin/pc, которая даёт заданное количество LP, и проверяет её против
max_*. Возвращает ошибку ExceededSlippage, если одна из сторон превышает лимит.
Withdraw
Сжечь LP, получить обе стороны.
Аргументы
Больше нет шага 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 и другие удалённые инструкции
Исторически MonitorStep управлял взаимодействием пула с OpenBook: он урегулировал заполненные заказы (перемещая выручку из хранилищ маркета в хранилища пула через CPI OpenBook), отменял устаревшие заказы и размещал новые заказы для закрытия разрыва между target_orders и amm_open_orders. С удалением зависимости OpenBook нечего управлять и инструкция удалена. Любой хранитель или интеграция, которые по-прежнему вызывают её, должны удалить вызов.
WithdrawPnl / TakePnl
Административное снятие накопленных протокольных сборов.
Аргументы
WithdrawPnlне принимает аргументы; он читаетneed_take_pnl_*и перемещает эти точные суммы.
Эффект
- Передаёт
need_take_pnl_coinизpool_coin_token_accountвpnl_coin_token_account. - То же самое для pc.
- Обнуляет
need_take_pnl_coinиneed_take_pnl_pc. - Изменение логики: если баланса хранилища недостаточно для покрытия накопленного PnL, инструкция возвращает
TakePnlErrorнапрямую (она больше не манипулирует состоянием книги заказов).
SetParams
Изменения параметров администратором, вызываемые мультиподписью Raydium. Аргументы — это тег param: u8 + полезная нагрузка.
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 исчез — ни одна инструкция больше не трогает книгу заказов.Куда дальше
products/amm-v4/code-demos— примеры TypeScript для потоков своп и LP.products/amm-v4/fees— деталиWithdrawPnlи разделение сборов.reference/error-codes— таблица прямых ссылок (ошибки AMM v4 указаны на этой странице).
- Программа Raydium AMM —
raydium-io/raydium-amm - Модуль
LiquidityRaydium SDK v2 - Программа OpenBook — проверки учётных записей на стороне маркета

