> ## 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-30 — CLMM: Anchor 1.0, excess-lamports recovery, and fixed fee owners

> CLMM переходит на Anchor 1.0.2 на Agave 3.1.10 и добавляет инструкцию администратора CollectExcessLamports для возврата ренты, освобождённой SIMD-0437, обрабатывая по одному пулу за раз с использованием PDA пула в качестве подписанта. CreateAmmConfig теперь записывает жёстко закодированных владельцев комиссии протокола и фонда вместо подписанта. Добавлена ошибка 6052. Ни один пользовательский инструмент или макет учётной записи не изменился.

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

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

<Info>
  Эта запись охватывает предстоящее обновление программы CLMM. Она была проверена на ветке `chore/upgrade-anchor` репозитория `raydium-clmm` (head `a72f9e1`) перед развёртыванием. Перед использованием нового инструмента или изменённого поведения `CreateAmmConfig` подтвердите развёрнутую программу.
</Info>

CLMM получает то же обновление фреймворка, которое CPMM и LaunchLab выпустили [2026-09-09](/ru/reference/changelog/2026-09-09-cpmm-anchor-1-and-excess-lamports). Anchor переходит с `0.32.1` на `=1.0.2`, а цепочка инструментов сборки переходит с Agave 2.3.0 на 3.1.10. Вместе с этим идут два изменения на стороне администратора: новый инструмент `CollectExcessLamports` и фиксированные владельцы комиссии в `CreateAmmConfig`.

Каждый инструмент, который вызывают трейдер, LP, пользователь лимитных ордеров или создатель пула, сохраняет свой список учётных записей, аргументы и математику.

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

* **Ни один пользовательский инструмент не изменился.** `CreatePool`, `CreateCustomizablePool`, `CreatePermissionedPool`, все пути `OpenPosition*` / `IncreaseLiquidity*` / `DecreaseLiquidity*`, `ClosePosition`, `Swap` / `SwapV2` / `SwapRouterBaseIn`, пять инструментов лимитных ордеров и инструменты вознаграждения идентичны на проводе. Ни один макет учётной записи не изменился.
* **Добавлен один инструмент: `CollectExcessLamports`.** Он только для администратора и не принимает аргументов. Он обрабатывает **один пул за вызов**: собственный `PoolState` пула всегда обрабатывается, и PDA пула подписывает свои хранилища, которые вы передаёте в `remaining_accounts`. Любая другая учётная запись, принадлежащая CLMM, в `remaining_accounts` также обрабатывается. См. [`products/clmm/instructions`](/ru/products/clmm/instructions#collectexcesslamports).
* **Добавлен один код ошибки: `6052` `LamportsCalculateError`.** Коды `6000`–`6051` не изменились.
* **`CreateAmmConfig` больше не копирует подписанта в `owner` / `fund_owner`.** Новые конфигурации получают жёстко закодированные ключи `protocol_fee_owner` и `fund_fee_owner`. На мейннете это те же два ключа, которые уже хранятся на всех 21 существующих конфигурациях. **Существующие учётные записи `AmmConfig` не затронуты**, поэтому продолжайте читать поля из учётной записи.
* **Обновите свой IDL.** Он добавляет один инструмент и один вариант ошибки, всего 39 инструментов и 53 ошибки.
* **Теперь вы можете поместить CPMM и CLMM в один крейт.** Оба репозитория закрепляют `anchor-lang` / `anchor-spl` `=1.0.2` на своих ветках `chore/upgrade-anchor`, поэтому одна программа может делать CPI в обе. См. [`sdk-api/rust-cpi`](/ru/sdk-api/rust-cpi#cargo-dependencies).
* **Пакет TypeScript-клиента переименован.** Набор тестов переходит с `@coral-xyz/anchor` `0.32.1` на `@anchor-lang/core` `1.0.2`.

## `CollectExcessLamports`

Шаг 1 [SIMD-0437](/ru/solana-fundamentals/rent-and-reclaimable-rent) активировался на мейннете 3 сентября 2026 года. Каждая учётная запись CLMM, созданная до шага, теперь переполнена, и только программа CLMM может перемещать лампорты из учётной записи, которой она владеет. Это охватывает хранилища пула, хранилища вознаграждения, `PoolState`, `AmmConfig`, `ObservationState`, `TickArrayBitmapExtension` и остальное.

Инструмент принимает четыре фиксированные учётные записи, затем любое количество исходных учётных записей в `remaining_accounts`:

| # | Учётная запись                   | Роль                                                                                                                                                                        |
| - | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1 | `collect_lamports_wallet` (W, S) | Подписант и получатель. Это должен быть общий администратор программы или выделенный кошелёк сбора лампортов CLMM, иначе вызов завершится с ошибкой `NotApproved` (`6000`). |
| 2 | `pool_state` (W)                 | Подписывает CPI программы токенов через семена своего PDA и всегда обрабатывается сам.                                                                                      |
| 3 | `token_program`                  | SPL Token.                                                                                                                                                                  |
| 4 | `token_program_2022`             | Token-2022. Оба требуются; программа выбирает один для каждой исходной учётной записи.                                                                                      |

**Пул является органом подписания, а не глобальным PDA программы.** CPMM подписывает с одним глобальным органом `vault_and_lp_mint_auth_seed`. Хранилища токенов CLMM принадлежат своему `PoolState`, поэтому один вызов может подписать только для пула, переданного в слот 2. Каждая исходная учётная запись программы токенов должна иметь этот пул в качестве своего органа: `token_vault_0`, `token_vault_1` или одно из хранилищ вознаграждения пула. Учётная запись токена из другого пула или учётная запись токена пользователя не пройдёт проверку владельца программы токенов и отменит весь инструмент. Программа не пропускает её. Минты NFT позиций также не подлежат обработке, потому что их орган выпуска отозван при открытии позиции. Обрабатывайте пул за пулом.

Инструмент делает два прохода, и этот порядок фиксирован:

1. **Сначала CPI программы токенов.** Для каждого источника, принадлежащего SPL Token или Token-2022, учётная запись, не являющаяся нативной, получает `WithdrawExcessLamports` (дискриминант `38`). Нативное хранилище wSOL получает раунд `SyncNative` → `UnwrapLamports` (дискриминант `45`), который заканчивается проверкой того, что обёрнутый баланс равен его значению до синхронизации. Если это не так, вызов завершится с ошибкой `LamportsCalculateError`. **Хранилище на стороне SOL сохраняет полную ликвидность**, и ни один котировка свопа не изменяется при обработке.
2. **Прямые дебеты во вторую очередь.** Проход 2 дебетует `pool_state` первым, затем каждый источник, принадлежащий программе CLMM, вплоть до `rent.minimum_balance(data_len)`.

Источники, принадлежащие любой другой программе, молча пропускаются. Этот порядок двух проходов — это тот, который CPMM принял [2026-09-19](/ru/reference/changelog/2026-09-19-cpmm-creator-fee-protocol-share). CLMM имеет его с первого выпуска. Если PDA дебетуется перед CPI, среда выполнения прерывается с `UnbalancedInstruction`, поэтому вызывающие могут передавать источники в любом порядке.

<Warning>
  **Проход, принадлежащий программе, не проверяет, какому пулу или пользователю принадлежит учётная запись.** Любая учётная запись, принадлежащая программе CLMM, имеет право, включая некоторые, чья рента была оплачена пользователем: `PersonalPositionState`, `LimitOrderState` и `TickArrayState`. Только избыток выше минимума, освобождённого от ренты, перемещается. Учётная запись сохраняет свои данные и остаётся освобождённой от ренты. Когда позиция или ордер позже закрывается, программа возвращает любой баланс, который учётная запись держит в этот момент. После обработки этот баланс является текущим минимумом ренты.
</Warning>

Адреса кошельков указаны в [`reference/program-addresses`](/ru/reference/program-addresses#excess-lamports-collection-wallets).

## `CreateAmmConfig` записывает фиксированных владельцев комиссии

До этого выпуска `create_amm_config` устанавливал оба поля владельца комиссии из подписанта вызова:

```rust theme={null}
amm_config.owner      = ctx.accounts.owner.key();
amm_config.fund_owner = ctx.accounts.owner.key();
```

Теперь он записывает собственные константы программы:

```rust theme={null}
amm_config.owner      = crate::protocol_fee_owner::ID;
amm_config.fund_owner = crate::fund_fee_owner::ID;
```

`CreateAmmConfig` по-прежнему ограничен `crate::admin::ID`. До этого выпуска каждый новый уровень комиссии начинался с администратора в обоих полях и должен был быть повёрнут с помощью параметра `UpdateAmmConfig` `3` / `4`. Теперь он начинается с операционных кошельков. На мейннете константы — это те же ключи, которые уже хранятся как `owner` / `fund_owner` на всех 21 существующих конфигурациях. Программа теперь записывает значение, которое операции раньше устанавливали вручную.

Подписанты сбора не изменяются. `CollectProtocolFee` принимает `amm_config.owner` **или** `crate::admin::ID`, и `CollectFundFee` принимает `amm_config.fund_owner` **или** `crate::admin::ID`, как до, так и после этого выпуска.

На девнете обе константы разрешаются в один и тот же ключ. См. [`reference/program-addresses`](/ru/reference/program-addresses#clmm-fee-owner-wallets).

<Warning>
  **Это не миграция.** Каждый существующий `AmmConfig` сохраняет `owner` и `fund_owner`, которые у него уже есть. Читайте поля вместо того, чтобы жёстко кодировать либо константы, либо ключ администратора.
</Warning>

## Изменения цепочки инструментов и зависимостей

| Элемент                                                                                  | До                                         | После                                                                                                  |
| ---------------------------------------------------------------------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------ |
| `anchor-lang` / `anchor-spl` (программа)                                                 | `=0.32.1`                                  | `=1.0.2`                                                                                               |
| `Anchor.toml` toolchain                                                                  | `[tool-chain]`, `solana-version = "2.3.0"` | `[toolchain]`, `solana_version = "3.1.10"`                                                             |
| Workspace `Cargo.toml`                                                                   | —                                          | `[workspace.metadata.cli] solana = "3.1.10"`                                                           |
| `anchor-client` / `anchor-lang` (клиентский крейт)                                       | `0.32.1`                                   | `1.0.2`                                                                                                |
| `solana-sdk` / `-client` / `-account-decoder` / `-transaction-status` (клиентский крейт) | `2.3.0`                                    | `3`                                                                                                    |
| `spl-token` / `spl-token-2022` (клиентский крейт)                                        | `7.0.0` / `7.0.0`                          | `9.0` / `11.0`                                                                                         |
| `spl-associated-token-account` / `spl-memo` / `spl-token-client` (клиентский крейт)      | `6.0.0` / `6.0.0` / `0.14.0`               | `8.0` / `7.0` / `0.19`                                                                                 |
| `mpl-token-metadata` (клиентский крейт)                                                  | `5.1.0`                                    | `=5.1.2-alpha.2`                                                                                       |
| Новые клиентские крейты                                                                  | —                                          | `solana-system-interface` `3.2`, `solana-commitment-config` `3`, `solana-compute-budget-interface` `3` |
| Docker-образ                                                                             | `solanafoundation/anchor:v0.32.1`          | `solanafoundation/anchor:v1.0.2`                                                                       |
| `@coral-xyz/anchor`                                                                      | `0.32.1`                                   | заменён на `@anchor-lang/core` `1.0.2`                                                                 |
| `typescript`                                                                             | `^4.3.5`                                   | `^5.6.3`                                                                                               |

Изменения Anchor 1.0 на сайтах вызовов CPI — это те же, которые интеграторы CPMM уже обработали. `CpiContext::new` принимает `Pubkey` программы вместо её `AccountInfo`, и `Context` имеет один параметр жизни вместо четырёх. В клиентском крейте `RequestBuilder::instructions()` теперь возвращает `Vec<Instruction>` без `Result`, и `system_program` переместился в `solana-system-interface`. См. [`sdk-api/rust-cpi`](/ru/sdk-api/rust-cpi#cargo-dependencies).

Детали системы сборки без эффекта в цепи:

* **Администратор локальной сети.** Функция `localnet` больше не компилирует фиксированный тестовый ключ, поддерживаемый зафиксированным приспособлением. Вместо этого она читает администратора из переменной окружения `CLMM_LOCALNET_ADMIN` во время сборки, которую `yarn test:local-admin` устанавливает из вашего локального кошелька. Исключение `.gitignore` приспособления удалено.
* **Профиль выпуска.** Дублирующийся блок `[profile.release]` в `programs/amm/Cargo.toml` был удалён. Cargo игнорирует `[profile]` вне корня рабочей области, поэтому блок корня уже был действующим, и `panic = "abort"` на уровне программы никогда не применялся.
* **Anchor.toml.** `seeds = false` становится `resolution = true` плюс `skip-lint = false`, и устаревший URL `[registry]` удаляется.
* **Линты.** `programs/amm/Cargo.toml` добавляет список разрешений `[lints.rust] unexpected_cfgs` для конфигов функций, которые выпускают макросы Anchor и Solana.
* **README.** На этой ветке README по-прежнему говорит вам запустить `rustup default 1.86.0` и `avm install 0.32.1` из `coral-xyz/anchor`. Вместо этого следуйте `Anchor.toml` и [`solana-fundamentals/toolchain`](/ru/solana-fundamentals/toolchain).

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

* **Каждый макет учётной записи.** `PoolState`, `AmmConfig`, `TickArrayState`, `TickArrayBitmapExtension`, `PersonalPositionState`, `ObservationState`, `LimitOrderState`, `DynamicFeeConfig`, `Permission` и `SupportMintAssociated` сохраняют одинаковые размеры и смещения.
* **Коды ошибок `6000`–`6051`.**
* **Математика свопа, ликвидности, комиссии, динамической комиссии и лимитных ордеров.** `CollectExcessLamports` перемещает лампорты, которые никогда не были частью резервов пула.
* **Замораживание NFT позиции** из [2026-08-17](/ru/reference/changelog/2026-08-17-clmm-restricted-position-nft-freeze), включая правило пула как органа замораживания и путь оттаивания `ClosePosition`.
* **`spl_memo`.** Ограничение программы memo в `DecreaseLiquidityV2` переместилось с `spl_memo::id()` на `anchor_spl::memo::ID`. Оба называют один и тот же адрес; `anchor-spl` просто переименовал экспорт.
* **ID программы.**

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

* `products/clmm/instructions`: баннер обновления; раздел `CollectExcessLamports` со списком учётных записей, таблицей двухпроходной отправки и областью действия для каждого пула; строки инвентаря, ограничения администратора и матрицы изменения состояния; примечание о владельце комиссии на `CollectProtocolFee` / `CollectFundFee`.
* `products/clmm/accounts`: комментарии владельца `AmmConfig` и примечание о том, что записывает `CreateAmmConfig`.
* `products/clmm/code-demos`: баннер версии и скелет Rust CPI перемещены на Anchor 1.0.
* `products/cpmm/code-demos`: примечание "не может делиться крейтом с CLMM" удалено.
* `reference/error-codes`: `6052` задокументирована.
* `reference/program-addresses`: новый раздел "CLMM fee-owner wallets"; CLMM добавлен в "Excess-lamports collection wallets".
* `sdk-api/rust-cpi`, `sdk-api/anchor-idl`, `solana-fundamentals/toolchain`: закрепления Anchor 1.0 для `raydium-clmm`, и предупреждение о разделении крейтов снято.
* `solana-fundamentals/rent-and-reclaimable-rent`: CLMM добавлен в "What the Raydium programs sweep on their own side".
* `security/admin-and-multisig`: роль сборщика избыточных лампортов CLMM.
* `protocol-overview/versions-and-migration`: пункт истории обновления CLMM.
