> ## 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-08-24 — LaunchLab: Token-2022 quote mints

> LaunchLab теперь поддерживает Token-2022 quote mints во всех операциях: создание конфига, инициализация пула, свопы, сбор комиссий и миграция CPMM. Границы slippage при свопе теперь учитывают комиссию за трансфер на стороне quote, бит1 флага PoolState.token_program_flag становится значимым, а MigrateToCpswap переименовывает два аккаунта token-program.

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

  [Открыть английскую версию →](/reference/changelog/2026-08-24-launchlab-token2022-quote-mint)
</Info>

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

Этот релиз позволяет использовать Token-2022 mint в качестве quote. До сих пор сторона quote была привязана к программе SPL Token, поэтому только base mint мог быть Token-2022. Теперь везде, где используется quote mint — создание `GlobalConfig`, инициализация пула, четыре инструкции swap, все сборы комиссий и миграция CPMM — поддерживается любая программа токенов, и инструкции swap учитывают комиссию за трансфер quote mint.

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

* **Quote mints могут быть Token-2022.** `CreateConfig` принимает Token-2022 `quote_token_mint`, а `InitializeV2` / `InitializeWithToken2022` принимают любую программу токенов в слоте quote-program. Порядок аккаунтов не меняется — меняется только значение, которое вы передаёте в этот слот.
* **Устаревший `Initialize` остаётся только для legacy.** Его аккаунт quote-program по-прежнему типизирован под SPL Token, поэтому конфиг с Token-2022 quote mint можно запустить только через `InitializeV2` или `InitializeWithToken2022`.
* **Границы slippage теперь соответствуют тому, что платит и получает плательщик.** `minimum_amount_out` и `maximum_amount_in` теперь сравниваются с суммой за вычетом комиссии за трансфер quote mint, а не с суммой, которую переместил vault. Существующая логика расчёта цены недооценивает стоимость и переоценивает доход при использовании quote mint с комиссией.
* **Бит1 `PoolState.token_program_flag` становится значимым.** Раньше он всегда был `0`, пока quote mints были только legacy. Клиенты, которые сравнивают весь байт с `0`, будут читать legacy base mint как Token-2022 всякий раз, когда quote mint является Token-2022. Это наиболее вероятный скрытый сбой в этом релизе.
* **`MigrateToCpswap` переименовывает два аккаунта token-program.** `base_token_program` / `quote_token_program` становятся `token_program` / `token_program_2022`. Оба всегда требуются, и программа выбирает правильный для каждого mint.
* **Пары mint/program теперь валидируются.** Оба swap mint получили ограничение `mint::token_program`, как и quote mint в `ClaimPlatformFee`, поэтому несовпадающая пара теперь вызывает ошибку вместо игнорирования.
* **Новая ошибка `6023` `CalculateOverflow`.** Коды `6000`–`6022` не изменились. `6023` был освобождён в предыдущем релизе и теперь переиспользуется.
* **Fee vaults следуют за quote mint.** Vault комиссий создателя и платформы, а также аккаунт токенов получателя share-fee, находятся в программе, которой принадлежит quote mint.

## Какие аккаунты изменили тип

Ни один из них не меняет позицию в списке аккаунтов. Меняется только допустимое значение.

| Инструкция                                                           | Аккаунт               | До             | После                |
| -------------------------------------------------------------------- | --------------------- | -------------- | -------------------- |
| `CreateConfig`                                                       | `quote_token_mint`    | SPL Token mint | mint любой программы |
| `InitializeV2`                                                       | `quote_token_program` | SPL Token      | любая программа      |
| `InitializeWithToken2022`                                            | `quote_token_program` | SPL Token      | любая программа      |
| `BuyExactIn` / `BuyExactOut` / `SellExactIn` / `SellExactOut`        | `quote_token_program` | SPL Token      | любая программа      |
| `CollectFee` / `CollectMigrateFee`                                   | `token_program`       | SPL Token      | любая программа      |
| `ClaimCreatorFee` / `ClaimPlatformFee` / `ClaimPlatformFeeFromVault` | `token_program`       | SPL Token      | любая программа      |

`Initialize` (устаревший путь V1) намеренно не включён в эту таблицу. Его аккаунт quote-program остаётся типизирован под SPL Token.

Несколько из них также усилили ограничения на mint, поэтому несовпадающая пара mint/program теперь вызывает ошибку вместо того, чтобы быть принятой или проигнорированной:

* Четыре инструкции swap ограничивают как `base_token_mint`, так и `quote_token_mint` программой, переданной в соответствующий слот. Раньше ни один из них не имел этого ограничения, поэтому неправильная base программа была молча принята.
* `ClaimPlatformFee` добавляет то же ограничение на `quote_mint`.
* `ClaimPlatformFeeFromVault` исправляет своё ограничение с формы token-account на форму mint для того, что является аккаунтом mint.

## Учёт комиссии за трансфер на стороне quote

Это часть, которая меняет числа, а не списки аккаунтов. На quote mint без `TransferFeeConfig` каждая формула ниже сворачивается к предыдущему поведению, поэтому legacy пулы и пулы Token-2022 без комиссии остаются бит-в-бит неизменными.

| Инструкция     | Что означает аргумент теперь                                                                                                                                                                                                                                                 |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `BuyExactIn`   | `amount_in` — это валовой дебет. Кривая оценивается на `amount_in − transfer_fee(amount_in)`, что попадает в vault. При полном заполнении плательщику начисляется ровно `amount_in`; при частичном заполнении сумма — это потреблённая сумма vault, пересчитанная в валовую. |
| `BuyExactOut`  | `maximum_amount_in` сравнивается с суммой vault **плюс** обратная комиссия за трансфер — реальный дебет — вместо только суммы vault.                                                                                                                                         |
| `SellExactIn`  | `minimum_amount_out` сравнивается с тем, что остаётся у продавца после удержания комиссии mint, а не с валовой суммой, выпущенной из vault.                                                                                                                                  |
| `SellExactOut` | `amount_out` — это то, что получает продавец. Кривая нацелена на `amount_out` плюс обратная комиссия за трансфер, поэтому запрошенная сумма прибывает ровно.                                                                                                                 |

Два следствия, которые стоит сформулировать ясно:

* Граница, вычисленная из эквивалентного пула без комиссии, больше не приемлема. `BuyExactOut` с cost пула без комиссии как `maximum_amount_in` теперь вызывает ошибку `ExceededSlippage`, как и `SellExactIn` с proceeds пула без комиссии как `minimum_amount_out`. Это предусмотренное поведение — старое сравнение позволяло плательщику быть дебетованным на комиссию за трансфер поверх границы, которую они уже согласовали.
* Пул учитывает только то, что попало в vault. После `BuyExactIn` на `amount_in` на 5% quote mint, `real_quote` увеличивается на `amount_in × 0.95`, а не на `amount_in`.

`get_transfer_inverse_fee` также отказался от специального случая для mint со 100% комиссией: вместо возврата к `maximum_fee` он теперь возвращает новую ошибку `CalculateOverflow`, когда обратная комиссия не может быть вычислена. Quote mint с `10000` basis points поэтому не пройдёт exact-out пути вместо молчаливого транзакта на лимите комиссии.

## Бит1 `token_program_flag`

`PoolState.token_program_flag` — это битовое поле, и всегда было:

```text theme={null}
bit0  base mint  0 = SPL Token, 1 = Token-2022
bit1  quote mint 0 = SPL Token, 1 = Token-2022
```

Поле, позиции битов и код, который записывает оба бита, все предшествуют этому релизу. Что меняется, так это то, что бит1 теперь может быть `1`, потому что quote mint теперь может быть Token-2022 mint. Четыре значения:

| Значение | Base mint  | Quote mint |
| -------- | ---------- | ---------- |
| `0`      | SPL Token  | SPL Token  |
| `1`      | Token-2022 | SPL Token  |
| `2`      | SPL Token  | Token-2022 |
| `3`      | Token-2022 | Token-2022 |

Читайте программу каждого mint с помощью `(token_program_flag >> bit) & 1`. Любой клиент, который рассматривает байт как булево значение для base mint — `flag === 0 ? Token : Token-2022` — разрешит значение `2` как Token-2022 base mint и построит base-side token account и трансфер против неправильной программы. Нет изменений размера аккаунта или смещения поля, поэтому индексаторам не нужна миграция хранилища, только исправление декодирования.

## Переименование аккаунта миграции CPMM

`MigrateToCpswap` раньше принимал одну программу токенов на mint, и вызывающий решал, какая какая. Теперь он принимает обе программы безусловно и выводит отображение из самих mint:

| Позиция                  | До                                                              | После                                              |
| ------------------------ | --------------------------------------------------------------- | -------------------------------------------------- |
| первая программа токенов | `base_token_program` — программа, которой принадлежит base mint | `token_program` — всегда программа SPL Token       |
| вторая программа токенов | `quote_token_program` — всегда программа SPL Token              | `token_program_2022` — всегда программа Token-2022 |

Две позиции не изменились, поэтому это изменение значения, а не изменение макета — но значения почти инвертированы, и разработчик, который продолжает передавать свою старую пару, будет передавать Token-2022 там, где требуется legacy программа, как только один из mint будет Token-2022 mint.

Legacy программа по-прежнему требуется безусловно независимо от любого mint, потому что LP mint CPMM и заблокированный NFT Fee Key всегда находятся на ней. Макет `remaining_accounts` из [релиза 2026-08-17](/ru/reference/changelog/2026-08-17-launchlab-cpmm-only-platform-config) не изменился.

## Quote mints допускаются только по усмотрению администратора

В отличие от CPMM и CLMM, LaunchLab **не** запускает список разрешений расширений для quote mint. `CreateConfig` принимает аккаунт mint как есть, поэтому единственный контроль — какие mint администратор привязывает к `GlobalConfig`. Проверка `NoSupportExtension` программы применяется исключительно к Token-2022 base mint, которые создаёт сама LaunchLab, где разрешены только `MetadataPointer` и `TransferFeeConfig`.

Рассматривайте привязку Token-2022 quote mint как действие высокого доверия с тем же обоснованием, что и статические списки разрешений CPMM/CLMM в [`reference/token-2022-support`](/ru/reference/token-2022-support). Quote mint с `TransferHook` или `PermanentDelegate` будет допущен во время создания конфига и затем будет запущен на, или сможет очистить, каждый пул, котируемый в нём.

## Временные ворота `amm_creator_fee_on`

`InitializeV2` отказывается от временных ворот, которые отклоняли любой `amm_creator_fee_on`, отличный от `BothToken`, до времени обновления. Эквивалентные ворота по-прежнему присутствуют в `InitializeWithToken2022`. На практике оба пути принимают любое значение на mainnet-beta сегодня, потому что это время (`1755522000`, 2025-08-18 13:00 UTC) давно прошло — это очистка, а не изменение поведения для текущих вызывающих.

## Влияние на ошибки и IDL

Коды `6000`–`6022` не изменились, включая `6022` `InvalidPlatformAllowConfig`.

| Код  | Имя                 | Значение                                                                     |
| ---- | ------------------- | ---------------------------------------------------------------------------- |
| 6023 | `CalculateOverflow` | Расчёт комиссии за трансфер или обратной комиссии не может быть представлен. |

Предыдущий релиз отказался от старого `6023` и оставил его вакантным; этот релиз переиспользует номер. Не декодируйте `6023` с IDL из любой более ранней версии.

Обновите IDL LaunchLab перед передачей Token-2022 quote программы, декодированием бита1 `token_program_flag` или построением переименованного списка аккаунтов `MigrateToCpswap`.

## Влияние на SDK

Сторона quote модуля launchpad SDK была жёстко закодирована на `TOKEN_PROGRAM_ID` в тех же местах, что и программа. Ветка, которая сопровождает этот релиз, вместо этого разрешает владельца quote mint, передаёт его через создание token-account, ATA получателя share-fee и слот quote-program инструкции, и добавляет опциональный `transferFeeConfigB` к четырём методам `Curve`, чтобы цены отражали формулы выше. Результаты `Curve` получают поле `transferFeeB`; `amountB` сохраняет своё значение — что платит плательщик или получает продавец — поэтому quote mint без комиссии производит идентичные числа, как раньше.

Эти изменения SDK не выпущены. Канонический pin на страницах code-demo в этом наборе документации не изменился; проверьте опубликованную версию перед использованием новых параметров.

## Эталонная реализация

Новая демонстрация подписывается на программу LaunchLab через Yellowstone gRPC и логирует для каждого обновления `GlobalConfig` и `PoolState`, является ли каждый mint Token или Token-2022 mint:

[`raydium-sdk-V2-demo/src/grpc/launchpadPoolInfo.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/grpc/launchpadPoolInfo.ts)

Это компактный эталон для двух вещей, которые этот релиз делает необходимыми. Пулы классифицируются прямо из `token_program_flag`, декодируя оба бита без выборки mint вообще — это исправление для сбоя bit1, описанного выше. Конфиги не могут быть классифицированы таким образом, потому что `GlobalConfig` хранит только адрес своего quote mint и никакой флаг программы, поэтому демонстрация читает владельца аккаунта mint один раз и кэширует его на mint. Видение обоих путей рядом — это самый быстрый способ проверить ваш собственный декодер.

Смотрите [`products/launchlab/code-demos`](/ru/products/launchlab/code-demos#watch-configs-and-pools-over-grpc) для пошагового руководства.

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

* `products/launchlab/accounts` — программа token quote-mint, макет бита `token_program_flag` и владение vault.
* `products/launchlab/instructions` — аккаунты quote-program, семантика slippage swap и переименованные аккаунты миграции.
* `products/launchlab/global-config` — `quote_mint` может быть Token-2022 mint, и что его контролирует, а что нет.
* `products/launchlab/code-demos` — наблюдатель gRPC config/pool.
* `reference/token-2022-support` — строка LaunchLab и раздел quote-mint.
* `reference/error-codes` — `6023` `CalculateOverflow`.
