Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Эта запись охватывает предстоящее обновление программы AMM v4. Она была проверена на локальной ветке релиза перед развёртыванием. Перед использованием новой инструкции подтвердите развёрнутую программу.
Две независимые вещи приходят вместе в одной перестройке. Первая — это техническое обслуживание: AMM v4 был привязан к solana-program =2.1.0 с момента обновления 2.1, и эта привязка была блокирующей. Помощники системной программы переместились в собственный крейт solana-system-interface в Solana 3.0, spl-token достиг версии 9.0, а spl-associated-token-account — версии 8.0. Этот релиз берёт все три. Вторая — это деньги, которые причитаются протоколу. SIMD-0437 снижает минимум, освобождаемый от rent, на 90% в пять этапов, и этап 1 приземлился на mainnet 3 сентября 2026 года. Каждый аккаунт, созданный AMM v4 до этого момента — сотни пулов-хранилищ, LP-минтов, аккаунтов AmmInfo и TargetOrders — теперь переполнен, а lamports в аккаунте, принадлежащем программе, могут быть перемещены только этой программой. Отсюда новая инструкция.

TL;DR для интеграторов

  • Ничего из того, что вызывают трейдеры или LP, не изменилось. Initialize2, Deposit, Withdraw, SwapBaseIn, SwapBaseOut, SwapBaseInV2, SwapBaseOutV2, WithdrawPnl и SetParams сохраняют свои списки аккаунтов, макеты аргументов и математику. Ни один макет аккаунта не изменился. Ни один существующий код ошибки не переместился.
  • Добавлена одна инструкция: WithdrawExcessLamports, тег 18. Только для администратора, без аргументов, вариативный список аккаунтов. Она возвращает lamports выше минимума, освобождаемого от rent, из аккаунтов, контролируемых AMM v4, и ничего больше не трогает. См. products/amm-v4/instructions.
  • Добавлен один код ошибки: 60 LamportsCalculateError. AmmError не нумеруется по Anchor — начинается с 0 — поэтому это custom program error: 0x3c. Коды 059 не изменены.
  • CreateConfigAccount (тег 14) перестал читать rent sysvar и теперь документирован как инструкция с 4 аккаунтами. Ничего в этом релизе не ломается, это включено: аккаунт был последним в списке, и обработчик читает позиционно без проверки длины, поэтому инструментарий администратора, который всё ещё передаёт его, продолжает работать.
  • Требуется обновление IDL, если вы генерируете из него клиентов. Одна новая инструкция, один новый вариант ошибки, один изменённый список аккаунтов.

WithdrawExcessLamports

Инструкция принимает кошелёк для сбора lamports в качестве единственного подписанта и получателя, PDA-авторитет AMM v4, программу SPL Token, а затем любое количество исходных аккаунтов. Она распределяет по владельцу каждого исходного аккаунта: Ветка wSOL — интересная. Баланс lamports обёрнутого-SOL аккаунта является его балансом токена, поэтому программа token отклоняет WithdrawExcessLamports на нём полностью. Круговой путь через SyncNative и UnwrapLamports размером с дельту извлекает только пожертвованный избыток и оставляет обёрнутый баланс ровно там, где он был — что проверяется после, с LamportsCalculateError, если арифметика не согласна. Хранилище пула на стороне SOL поэтому сохраняет полную ликвидность при очистке, и ни один LP не видит изменения цены при очистке. Подписанта — это выделенный ключ на кластер, жёстко закодированный в том же модуле config_feature, что и существующие адреса владельца AMM и комиссии за создание пула. В отличие от CPMM и LaunchLab, AMM v4 принимает только этот кошелёк — нет резервного администратора. Адреса находятся в reference/program-addresses.

CreateConfigAccount перестал читать rent sysvar

Solana 3.0 — это то, что делает Rent::get() естественным способом чтения параметров rent, поэтому релиз заменил все четыре вызова Rent::from_account_info(...) в программе. В трёх из них — помощники, которые создают аккаунты токенов пула, LP-минт и PDA-аккаунты во время Initialize2 — аккаунт sysvar всё ещё передаётся и всё ещё пересылается в CPI программы token, поэтому ничего об этом списке аккаунтов не меняется. В CreateConfigAccount sysvar не имел другой цели и был последним аккаунтом в списке, поэтому он вышел из документированного списка: Отправка старого списка из пяти аккаунтов всё ещё работает. Удалённый аккаунт был последним, и process_create_config читает свои четыре аккаунта позиционно через next_account_info без проверки общего количества, поэтому trailing rent-аккаунт никогда не просматривается. Инструментарий администратора должен быть обновлён для ясности, не срочности. Ни один конструктор, обращённый к пользователю, вообще не строит эту инструкцию. Initialize2 — это случай, когда не следует переполнять: он также перестал вызывать Rent::from_account_info, но его rent-аккаунт остаётся в позиции 3 и всё ещё действительно используется — программа пересылает его в CPI spl_token::initialize_account и initialize_mint, которые создают хранилища пула и LP-минт. Удаление его из этого списка аккаунтов сломает создание пула.

Изменения зависимостей

Части системной программы, которые использует программа — system_instruction::create_account, transfer, allocate, assign и сам ID программы — теперь поступают из solana-system-interface вместо solana_program::system_program и solana_program::system_instruction. ID программы идентичен по байтам, поэтому это перемещение на этапе компиляции без последствий на цепи, включая проверки InvalidSysProgramAddress, которые сравнивают с ним. Два мёртвых модуля также были удалены: srm_token и msrm_token, объявления минтов Serum/MSRM, оставшиеся от удаления OpenBook. Ничего на них не ссылалось.

Что не изменилось

  • Каждый макет аккаунта. AmmInfo, StateData, TargetOrders, AmmConfig — те же размеры, те же смещения полей. Ни один индексатор или декодер не меняется.
  • Коды ошибок 059. LamportsCalculateError добавлен в 60, поэтому ничего не сдвигается.
  • PDA-авторитет AMM. По-прежнему один PDA для всей программы, seed ["amm authority"], nonce 254.
  • Комиссии, учёт PnL и кривая. Не тронуты. WithdrawExcessLamports перемещает lamports, которые никогда не были частью резервов какого-либо пула.
  • Token-2022. По-прежнему не поддерживается. Новая инструкция говорит только с программой legacy SPL Token.
  • ID программы. Не изменён — см. reference/program-addresses.

Обновлённые страницы

  • products/amm-v4/instructions — добавлен WithdrawExcessLamports со своим списком аккаунтов и таблицей распределения по владельцам; новый раздел CreateConfigAccount / UpdateConfigAccount, охватывающий удаление rent-sysvar; добавлены строки таблицы инвентаризации и матрицы изменения состояния.
  • products/amm-v4/overview — баннер релиза.
  • reference/error-codes — новый раздел “AMM v4: AmmError не нумеруется по Anchor”, документирующий код 60 и нумерацию, начинающуюся с 0.
  • reference/program-addresses — новый раздел “Кошельки для сбора избыточных lamports”.
  • solana-fundamentals/rent-and-reclaimable-rent — новый раздел “Что программы Raydium очищают на своей стороне”; примечание о обёрнутом-SOL исправлено, чтобы сказать, что обе программы token предоставляют UnwrapLamports.
  • solana-fundamentals/toolchain — Agave 3.1.10, release.anza.xyz, Rust 1.91.0.