> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 2026-09-09 — AMM v4: зависимости Solana 3.0 и восстановление избыточных lamports

> AMM v4 перестроен для solana-program 3.0, spl-token 9.0 и нового крейта solana-system-interface, добавлена инструкция WithdrawExcessLamports (тег 18) только для администратора, которая возвращает rent, освобождённый SIMD-0437. CreateConfigAccount больше не читает trailing rent sysvar, совместимо. Ничего не сломалось и макет аккаунтов не изменился.

<Info>
  **Эта страница переведена с помощью ИИ. За эталон принимается английская версия.**

  [Открыть английскую версию →](/reference/changelog/2026-09-09-amm-v4-solana-3-and-excess-lamports)
</Info>

<Info>
  Эта запись охватывает предстоящее обновление программы AMM v4. Она была проверена на локальной ветке релиза перед развёртыванием. Перед использованием новой инструкции подтвердите развёрнутую программу.
</Info>

Две независимые вещи приходят вместе в одной перестройке.

Первая — это техническое обслуживание: 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](/ru/solana-fundamentals/rent-and-reclaimable-rent) снижает минимум, освобождаемый от 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`](/ru/products/amm-v4/instructions#withdrawexcesslamports).
* **Добавлен один код ошибки: `60` `LamportsCalculateError`.** `AmmError` не нумеруется по Anchor — начинается с `0` — поэтому это `custom program error: 0x3c`. Коды `0`–`59` не изменены.
* **`CreateConfigAccount` (тег 14) перестал читать rent sysvar** и теперь документирован как инструкция с 4 аккаунтами. **Ничего в этом релизе не ломается**, это включено: аккаунт был последним в списке, и обработчик читает позиционно без проверки длины, поэтому инструментарий администратора, который всё ещё передаёт его, продолжает работать.
* **Требуется обновление IDL**, если вы генерируете из него клиентов. Одна новая инструкция, один новый вариант ошибки, один изменённый список аккаунтов.

## `WithdrawExcessLamports`

Инструкция принимает кошелёк для сбора lamports в качестве единственного подписанта и получателя, PDA-авторитет AMM v4, программу SPL Token, а затем любое количество исходных аккаунтов. Она распределяет по владельцу каждого исходного аккаунта:

| Владелец исходного аккаунта         | Обработка                                                                                                                                                                  |
| ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SPL Token, 165 байт, не-native      | CPI программе token с `WithdrawExcessLamports` (дискриминант `38`), подписано PDA-авторитетом                                                                              |
| SPL Token, 165 байт, native (wSOL)  | `SyncNative`, измерить, насколько выросла обёрнутая `amount`, `UnwrapLamports` (дискриминант `45`) ровно на эту дельту, затем убедиться, что обёрнутый баланс не изменился |
| SPL Token, другие размеры (LP-минт) | CPI `WithdrawExcessLamports`                                                                                                                                               |
| Сама программа AMM v4               | Дебет аккаунта прямо до `rent.minimum_balance(data_len)`                                                                                                                   |
| Что-либо ещё                        | Пропущено молча                                                                                                                                                            |

Ветка wSOL — интересная. Баланс lamports обёрнутого-SOL аккаунта *является* его балансом токена, поэтому программа token отклоняет `WithdrawExcessLamports` на нём полностью. Круговой путь через `SyncNative` и `UnwrapLamports` размером с дельту извлекает только пожертвованный избыток и оставляет обёрнутый баланс ровно там, где он был — что проверяется после, с `LamportsCalculateError`, если арифметика не согласна. **Хранилище пула на стороне SOL поэтому сохраняет полную ликвидность при очистке**, и ни один LP не видит изменения цены при очистке.

Подписанта — это выделенный ключ на кластер, жёстко закодированный в том же модуле `config_feature`, что и существующие адреса владельца AMM и комиссии за создание пула. В отличие от CPMM и LaunchLab, AMM v4 принимает **только** этот кошелёк — нет резервного администратора. Адреса находятся в [`reference/program-addresses`](/ru/reference/program-addresses#excess-lamports-collection-wallets).

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

Solana 3.0 — это то, что делает `Rent::get()` естественным способом чтения параметров rent, поэтому релиз заменил все четыре вызова `Rent::from_account_info(...)` в программе. В трёх из них — помощники, которые создают аккаунты токенов пула, LP-минт и PDA-аккаунты во время `Initialize2` — аккаунт sysvar всё ещё передаётся и всё ещё пересылается в CPI программы token, поэтому ничего об этом списке аккаунтов не меняется. В `CreateConfigAccount` sysvar не имел другой цели и был последним аккаунтом в списке, поэтому он вышел из документированного списка:

|   | До (5 аккаунтов) | После (4 аккаунта) |
| - | ---------------- | ------------------ |
| 1 | `admin` (W, S)   | `admin` (W, S)     |
| 2 | `amm_config` (W) | `amm_config` (W)   |
| 3 | `pnl_owner`      | `pnl_owner`        |
| 4 | `system_program` | `system_program`   |
| 5 | `rent`           | —                  |

**Отправка старого списка из пяти аккаунтов всё ещё работает.** Удалённый аккаунт был последним, и `process_create_config` читает свои четыре аккаунта позиционно через `next_account_info` без проверки общего количества, поэтому trailing rent-аккаунт никогда не просматривается. Инструментарий администратора должен быть обновлён для ясности, не срочности. Ни один конструктор, обращённый к пользователю, вообще не строит эту инструкцию.

`Initialize2` — это случай, когда не следует переполнять: он также перестал вызывать `Rent::from_account_info`, но его rent-аккаунт **остаётся** в позиции 3 и всё ещё действительно используется — программа пересылает его в CPI `spl_token::initialize_account` и `initialize_mint`, которые создают хранилища пула и LP-минт. Удаление его из этого списка аккаунтов сломает создание пула.

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

| Крейт                          | До       | После                       |
| ------------------------------ | -------- | --------------------------- |
| `solana-program`               | `=2.1.0` | `=3.0.0`                    |
| `solana-system-interface`      | —        | `=3.0.0`, функция `bincode` |
| `spl-token`                    | `=7.0.0` | `9.0.0`                     |
| `spl-associated-token-account` | `6.0.0`  | `8.0.0`                     |

Части системной программы, которые использует программа — `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](/ru/reference/changelog/2026-07-22-amm-v4-openbook-removal). Ничего на них не ссылалось.

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

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