> ## 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 报价代币

> LaunchLab 在配置、池创建、交换、费用领取和 CPMM 迁移中接受 Token-2022 报价代币。交换滑点边界现在对报价端转账费用进行定价，PoolState.token_program_flag 第1位变得有意义，MigrateToCpswap 重命名其两个代币程序账户。

<Info>
  **本页内容由 AI 自动翻译，所有内容以英文版本为准。**

  [查看英文版 →](/reference/changelog/2026-08-24-launchlab-token2022-quote-mint)
</Info>

<Info>
  本条目涵盖即将推出的 LaunchLab 程序更新。在部署前已针对本地发布分支进行验证。在生产环境中启用新路径前，请确认已部署的程序和已发布的 IDL。
</Info>

此版本允许使用 Token-2022 代币对启动进行报价。在此之前，报价端被硬连接到旧版 SPL Token 程序，因此只有基础代币可以是 Token-2022。现在，触及报价代币的每个地方——`GlobalConfig` 创建、池初始化、四个交换指令、所有费用领取和 CPMM 迁移——都接受任一代币程序，交换指令会考虑报价代币的转账费用。

## 集成商速览

* **报价代币可以是 Token-2022。** `CreateConfig` 接受 Token-2022 `quote_token_mint`，`InitializeV2` / `InitializeWithToken2022` 在报价程序槽中接受任一代币程序。账户顺序不变——你在该槽中传入的值会改变。
* **已弃用的 `Initialize` 仍仅限旧版。** 其报价程序账户仍然被类型化为 SPL Token，因此报价代币为 Token-2022 的配置只能通过 `InitializeV2` 或 `InitializeWithToken2022` 启动。
* **滑点边界移至支付方实际支付和接收的金额。** `minimum_amount_out` 和 `maximum_amount_in` 现在与报价代币转账费用净额进行比较，而不是与金库移动的金额进行比较。在费用承担的报价代币上，现有报价逻辑会低估成本并高估收益。
* **`PoolState.token_program_flag` 第1位变得有意义。** 当报价代币仅为旧版时，它始终为 `0`。将整个字节与 `0` 进行比较的客户端现在会在报价代币为 Token-2022 时将旧版基础代币读取为 Token-2022。这是此版本中最可能的无声破坏。
* **`MigrateToCpswap` 重命名其两个代币程序账户。** `base_token_program` / `quote_token_program` 变为 `token_program` / `token_program_2022`。两者始终都是必需的，程序根据代币选择正确的。
* **代币/程序对现在已验证。** 两个交换代币都获得了 `mint::token_program` 约束，`ClaimPlatformFee` 的报价代币也是如此，因此不匹配的对会还原而不是被忽略。
* **新错误 `6023` `CalculateOverflow`。** 代码 `6000`–`6022` 保持不变。`6023` 由上一版本空出，现在被重新使用。
* **费用金库跟随报价代币。** 创建者和平台费用金库，以及分享费用接收者的代币账户，位于拥有报价代币的任何程序上。

## 哪些账户改变了类型

这些都不改变其账户列表中的位置。只有允许的值改变。

| 指令                                                                   | 账户                    | 之前           | 之后      |
| -------------------------------------------------------------------- | --------------------- | ------------ | ------- |
| `CreateConfig`                                                       | `quote_token_mint`    | SPL Token 代币 | 任一程序的代币 |
| `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 路径）故意不在此表中。其报价程序账户保持类型化为 SPL Token。

其中几个也收紧了代币约束，因此不匹配的代币/程序对现在会还原，而之前是被接受或未检查的：

* 四个交换指令将 `base_token_mint` 和 `quote_token_mint` 都约束到在匹配槽中传入的程序。之前都没有该约束，因此错误的基础程序被无声接受。
* `ClaimPlatformFee` 在 `quote_mint` 上添加相同约束。
* `ClaimPlatformFeeFromVault` 将其约束从代币账户形式更正为代币账户上的代币形式。

## 报价端转账费用会计

这是改变数字而不是账户列表的部分。在没有 `TransferFeeConfig` 的报价代币上，下面的每个公式都会折叠为之前的行为，因此旧版池和无费用 Token-2022 池在位级别上保持不变。

| 指令             | 参数现在的含义                                                                                                                    |
| -------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `BuyExactIn`   | `amount_in` 是总借方。曲线以 `amount_in − transfer_fee(amount_in)` 定价，这是进入金库的金额。在完全成交时，支付方被收取恰好 `amount_in`；在部分成交时，收费是消耗的金库金额向上调整。 |
| `BuyExactOut`  | `maximum_amount_in` 与金库金额**加上**反向转账费用——真实借方——进行比较，而不仅仅是金库金额。                                                               |
| `SellExactIn`  | `minimum_amount_out` 与卖方在代币扣除其费用后剩余的金额进行比较，而不是与从金库释放的总金额进行比较。                                                              |
| `SellExactOut` | `amount_out` 是卖方最终获得的金额。曲线针对 `amount_out` 加上反向转账费用，因此请求的金额恰好到达。                                                            |

两个值得明确说明的后果：

* 从等效无费用池计算的边界不再可接受。使用无费用成本作为 `maximum_amount_in` 的 `BuyExactOut` 现在以 `ExceededSlippage` 还原，`SellExactIn` 使用无费用收益作为 `minimum_amount_out` 也是如此。这是预期行为——旧的比较让支付方在已同意的边界之上被扣除转账费用。
* 池只记录到达金库的内容。在 5% 报价代币上进行 `amount_in` 的 `BuyExactIn` 后，`real_quote` 前进 `amount_in × 0.95`，而不是 `amount_in`。

`get_transfer_inverse_fee` 也删除了其对 100% 费用代币的特殊情况：现在当无法计算反向费用时返回新的 `CalculateOverflow` 错误，而不是回退到 `maximum_fee`。因此 `10000` 基点的报价代币会导致精确输出路径失败，而不是在费用上限处无声交易。

## `token_program_flag` 第1位

`PoolState.token_program_flag` 是一个位字段，一直都是：

```text theme={null}
bit0  基础代币  0 = SPL Token，1 = Token-2022
bit1  报价代币 0 = SPL Token，1 = Token-2022
```

该字段、位位置和写入两个位的代码都早于此版本。改变的是第1位现在实际上可以是 `1`，因为报价代币现在可以是 Token-2022 代币。四个值是：

| 值   | 基础代币       | 报价代币       |
| --- | ---------- | ---------- |
| `0` | SPL Token  | SPL Token  |
| `1` | Token-2022 | SPL Token  |
| `2` | SPL Token  | Token-2022 |
| `3` | Token-2022 | Token-2022 |

使用 `(token_program_flag >> bit) & 1` 读取每个代币的程序。任何将字节视为基础代币布尔值的客户端——`flag === 0 ? Token : Token-2022`——会将值 `2` 解析为 Token-2022 基础代币，并将针对错误的程序构建基础端代币账户和转账。没有账户大小或字段偏移改变，因此索引器不需要存储迁移，只需要解码修复。

## CPMM 迁移账户重命名

`MigrateToCpswap` 之前为每个代币取一个代币程序，调用者决定哪个是哪个。现在它无条件地取两个程序并从代币本身派生映射：

| 位置      | 之前                                         | 之后                                       |
| ------- | ------------------------------------------ | ---------------------------------------- |
| 第一个代币程序 | `base_token_program` — 拥有基础代币的任何程序         | `token_program` — 始终是旧版 SPL Token 程序     |
| 第二个代币程序 | `quote_token_program` — 始终是旧版 SPL Token 程序 | `token_program_2022` — 始终是 Token-2022 程序 |

两个位置保持不变，因此这是值改变，而不是布局改变——但值几乎是反向的，构建者继续传入其旧对将在任一代币是 Token-2022 代币时在需要旧版程序的地方传入 Token-2022。

旧版程序仍然无条件地始终需要，无论任一代币如何，因为 CPMM LP 代币和锁定流动性费用密钥 NFT 始终位于其上。来自 [2026-08-17 版本](/zh/reference/changelog/2026-08-17-launchlab-cpmm-only-platform-config) 的 `remaining_accounts` 布局保持不变。

## 报价代币仅由管理员自由裁量接纳

与 CPMM 和 CLMM 不同，LaunchLab 对报价代币运行**无**扩展允许列表。`CreateConfig` 按原样接受代币账户，因此唯一的门是管理员将哪些代币绑定到 `GlobalConfig`。程序的 `NoSupportExtension` 检查仅适用于 LaunchLab 自己创建的 Token-2022 基础代币，其中仅允许 `MetadataPointer` 和 `TransferFeeConfig`。

将 Token-2022 报价代币绑定视为高信任操作，理由与 [`reference/token-2022-support`](/zh/reference/token-2022-support) 中的 CPMM/CLMM 静态白名单相同。`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` 并将其留空；此版本重新使用该数字。不要使用来自任一早期版本的 IDL 解码 `6023`。

在传入 Token-2022 报价程序、解码 `token_program_flag` 第1位或构建重命名的 `MigrateToCpswap` 账户列表前刷新 LaunchLab IDL。

## SDK 影响

SDK 的启动板模块的报价端在程序所在的相同位置被硬编码为 `TOKEN_PROGRAM_ID`。伴随此版本的分支改为解析报价代币的所有者，将其线程化通过代币账户创建、分享费用接收者的 ATA 和指令的报价程序槽，并向四个 `Curve` 方法添加可选的 `transferFeeConfigB`，以便报价反映上述公式。`Curve` 结果获得 `transferFeeB` 字段；`amountB` 保持其含义——支付方花费或卖方接收的内容——因此无费用报价代币产生与之前相同的数字。

这些 SDK 更改未发布。本文档集中代码演示页面上的规范引脚保持不变；在依赖新参数前检查已发布的版本。

## 参考实现

新演示通过 Yellowstone gRPC 订阅 LaunchLab 程序，并为每个 `GlobalConfig` 和 `PoolState` 更新记录每个代币是 Token 还是 Token-2022 代币：

[`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` 分类，解码两个位而无需任何代币获取——这是上述第1位破坏的修复。配置无法以这种方式分类，因为 `GlobalConfig` 仅存储其报价代币的地址而没有程序标志，因此演示读取代币账户的所有者一次并按代币缓存。并排看到两条路径是检查你自己的解码器的最快方式。

参见 [`products/launchlab/code-demos`](/zh/products/launchlab/code-demos#watch-configs-and-pools-over-grpc) 了解演练。

## 更新的页面

* `products/launchlab/accounts` — 报价代币程序、`token_program_flag` 位布局和金库所有权。
* `products/launchlab/instructions` — 报价程序账户、交换滑点语义和重命名的迁移账户。
* `products/launchlab/global-config` — `quote_mint` 可能是 Token-2022 代币，什么会和不会限制它。
* `products/launchlab/code-demos` — gRPC 配置/池观察者。
* `reference/token-2022-support` — LaunchLab 行和报价代币部分。
* `reference/error-codes` — `6023` `CalculateOverflow`。
