> ## 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.

# LaunchLab 指令

> Initialize、Buy、Sell、Graduate、CollectFees、SetParams — 每个 LaunchLab 指令的参数形状、账户列表及前置和后置条件。

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

  [查看英文版 →](/products/launchlab/instructions)
</Info>

<Info>
  LaunchLab 公开了一套精简的指令集：六个用户可调用的指令，加上少数管理员原始指令。SDK 对所有这些进行了封装；本页面为聚合器、监控工具和需要使用 CPI 的程序记录了原始接口。
</Info>

## 指令清单

| 分组     | 指令                                                         | 可由以下调用                                                                                                            |
| ------ | ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| 全局配置   | `CreateConfig` / `UpdateConfig`                            | 管理员                                                                                                               |
| 启动生命周期 | `Initialize` / `InitializeV2`                              | 任何人（创建者）—— SPL Token 启动；V2 记录 `amm_creator_fee_on` 用于最终的 CPMM 毕业                                                  |
| 启动生命周期 | `InitializeWithToken2022`                                  | 任何人（创建者）—— Token-2022 启动，可选的 `TransferFeeConfig`                                                                  |
| 交易     | `BuyExactIn` / `BuyExactOut`                               | 任何人 —— 精准输入/精准输出买入键合曲线                                                                                            |
| 交易     | `SellExactIn` / `SellExactOut`                             | 任何人 —— 精准输入/精准输出卖出键合曲线                                                                                            |
| 毕业     | `MigrateToAmm`                                             | 迁移钱包（在 `GlobalConfig` 上设置）—— 毕业到 AMM v4。当 `amm_creator_fee_on = BothToken` 时使用，以便创建者费可以从任一侧收取。                    |
| 毕业     | `MigrateToCpswap`                                          | 迁移钱包 —— 毕业到 CPMM。当 `amm_creator_fee_on = QuoteToken` 时使用，Token-2022 启动需要此项。包装 CPMM 上的 `InitializeWithPermission`。 |
| 费用     | `CollectFee`                                               | 管理员 —— 从启动中收取协议费用                                                                                                 |
| 费用     | `CollectMigrateFee`                                        | 管理员 —— 收取累积的迁移费用                                                                                                  |
| 费用     | `ClaimCreatorFee`                                          | 创建者 —— 在曲线阶段声明累积的创建者费用                                                                                            |
| 归属     | `CreateVestingAccount`                                     | 创建者 —— 为受益人分配锁定的代币，毕业后解锁                                                                                          |
| 归属     | `CreatePlatformVestingAccount`                             | 平台管理员 —— 为平台侧受益人分配锁定的代币                                                                                           |
| 归属     | `ClaimVestedToken`                                         | 受益人 —— 在悬崖期后声明解锁的代币                                                                                               |
| 平台配置   | `CreatePlatformConfig` / `UpdatePlatformConfig`            | 平台管理员                                                                                                             |
| 平台配置   | `UpdatePlatformCurveParam` / `RemovePlatformCurveParam`    | 平台管理员 —— 管理每个平台允许的曲线形状列表                                                                                          |
| 平台费用   | `ClaimPlatformFee` / `ClaimPlatformFeeFromVault`           | 平台管理员                                                                                                             |
| 平台访问   | `CreatePlatformGlobalAccess` / `ClosePlatformGlobalAccess` | 管理员 —— 限制哪些平台可以使用给定的 `GlobalConfig`                                                                               |

"ExactIn/ExactOut" 的拆分镜像了 CPMM 的 `SwapBaseInput` / `SwapBaseOutput` —— 在链上它们是单独的指令判别器，舍入方式略有不同。

**毕业路径选择。** `migrate_type` 在 `Initialize{V2,WithToken2022}` 时记录在 `PoolState` 上，决定了两个毕业指令中的哪一个可以运行。Token-2022 启动总是迁移到 CPMM。SPL Token 启动根据 `amm_creator_fee_on` 设置迁移到 AMM v4 或 CPMM：

* `BothToken` → `MigrateToAmm` → AMM v4 池（创建者费可以从任一侧收取；AMM v4 没有原生创建者费字段，所以创建者费通过 LP 锁定 NFT 机制而被取走）。
* `QuoteToken` → `MigrateToCpswap` → 具有 `creator_fee_on = OnlyQuoteToken` 的 CPMM 池（创建者通过 LaunchLab Fee Key NFT 继续从 CPMM 池赚取费用 —— 见 [`products/launchlab/creator-fees`](/zh/products/launchlab/creator-fees)）。

<Tip>
  **关于 `AmmCreatorFeeOn` 枚举名的说明。** Rust 源代码称此枚举为 `AmmCreatorFeeOn`，变体为 `QuoteToken` 和 `BothToken`。该名称具有误导性：在当前的操作实践中，变体不仅控制创建者费从毕业后 CPMM 池的哪一侧收取 —— 它还选择毕业**目标程序**（AMM v4 与 CPMM），并与启动的 `PoolState` 上的 `migrate_type` 配对。将该字段视为"迁移目标 + 毕业后创建者费侧"合二为一。链上的枚举名尚未重构，但将其视为 `MigrationTarget` 更接近现实。
</Tip>

## `Initialize`

创建新启动。

**参数**

```
launch_params: {
    curve_type:                 u8,
    base_supply_max:            u64,
    base_supply_graduation:     u64,
    k:                          u128,              // 或 curve_type=1 的 initial_virtual_quote_reserve
    open_time:                  u64,
    quote_mint:                 Pubkey,
    base_token_metadata: {                         // 内联 name/symbol/uri；程序 CPI 到 Metaplex
        name:   String,
        symbol: String,
        uri:    String,
    },
    fees: {
        buy_numerator:   u64,
        buy_denominator: u64,
        sell_numerator:  u64,
        sell_denominator: u64,
        lp_share:        u64,
        creator_share:   u64,
        protocol_share:  u64,
        total_share:     u64,
    },
    post_graduation_lp_policy:  u8,                // 0 = Burn, 1 = Lock, 2 = ToCreator
}
```

**账户**（简化）

| #  | 名称                 | W | S | 说明                                        |
| -- | ------------------ | - | - | ----------------------------------------- |
| 1  | `creator`          | W | S | 支付租金 + base mint 创建。                      |
| 2  | `launch_config`    |   |   | 协议配置绑定。                                   |
| 3  | `launch_state`     | W |   | 新账户。                                      |
| 4  | `launch_authority` |   |   | PDA。                                      |
| 5  | `base_mint`        | W | S | 全新 Keypair（或 PDA）—— 此指令初始化它。              |
| 6  | `base_vault`       | W |   | `launch_authority` 在 `base_mint` 上的 ATA。  |
| 7  | `quote_mint`       |   |   |                                           |
| 8  | `quote_vault`      | W |   | `launch_authority` 在 `quote_mint` 上的 ATA。 |
| 9  | `metadata`         | W |   | Metaplex 元数据 PDA。                         |
| 10 | `metaplex_program` |   |   |                                           |
| 11 | `token_program`    |   |   | 仅 SPL Token。                              |
| 12 | `system_program`   |   |   |                                           |
| 13 | `rent`             |   |   |                                           |

**前置条件**

* `quote_mint ∈ launch_config.allowed_quote_mints`。
* `base_supply_graduation ≤ base_supply_max`。
* 费用参数通过 `launch_config.max_*_fee_rate` 检查。
* `open_time ≥ now − slop`（SDK 强制 `≥ now`；程序容许轻微回溯）。
* `curve_type` 被识别。

**后置条件**

* `base_mint` 具有 `supply = base_supply_max`，全部在 `base_vault` 中。
* `base_mint.mint_authority = launch_authority`，`freeze_authority = None`。
* `LaunchState` 初始化，`status = Active`，`base_sold = 0`，`quote_reserve_real = 0`。
* `quote_reserve_target` 从曲线参数 + `base_supply_graduation` + `buy_numerator` 计算（大约）。

**常见错误** —— `InvalidQuoteMint`、`FeeRateTooHigh`、`InvalidCurveParams`、`MathOverflow`。

## `Buy`（规范变体：`BuyExactIn`）

用户提供固定的 `quote_in`；曲线计算 `base_out`。

**参数**

```
quote_in:          u64
minimum_base_out:  u64
```

**账户**

| #  | 名称                         | W | S |
| -- | -------------------------- | - | - |
| 1  | `user`                     | W | S |
| 2  | `launch_state`             | W |   |
| 3  | `launch_authority`         |   |   |
| 4  | `base_vault`               | W |   |
| 5  | `quote_vault`              | W |   |
| 6  | `user_base_ata`            | W |   |
| 7  | `user_quote_ata`           | W |   |
| 8  | `base_mint`                |   |   |
| 9  | `quote_mint`               |   |   |
| 10 | `token_program`            |   |   |
| 11 | `associated_token_program` |   |   |
| 12 | `system_program`           |   |   |

**前置条件**

* `launch_state.status == Active`。
* `now ≥ open_time`。
* `user_quote_ata.balance ≥ quote_in`。
* `quote_in > 0`。

**效果**

1. 将 `quote_in` 拆分为 `quote_in_after_fee` 和费用部分。
2. Newton 求解给定后费报价的 `base_out` 的曲线。
3. `require(base_out ≥ minimum_base_out)` 否则回退 `ExceededSlippage`。
4. 移动 `quote_in` 用户 → 金库。移动 `base_out` 金库 → 用户。
5. 更新 `base_sold += base_out`，`quote_reserve_real += quote_in_after_fee × (lp_share / total_share)`。
6. 更新费用计数器（`protocol_fees_quote`、`creator_fees_quote`）。
7. `state_data.num_buys += 1`。
8. 如果更新后 `quote_reserve_real ≥ quote_reserve_target`，SDK 通常在同一交易中链接 `Graduate` 指令。程序不会在 `Buy` 内自动毕业 —— 需要后续的 `Graduate`。

## `BuyExactOut`

用户指定精准的 `base_out`；程序计算 `quote_in`。

**参数**

```
base_out:      u64
maximum_quote_in: u64
```

与 `BuyExactIn` 相同的账户。使用闭式二次积分（或 curve\_type 1 的 CPMM 反函数）而不是 Newton 迭代。

## `Sell` / `SellExactIn` / `SellExactOut`

`Buy` 的镜像。用户向曲线返回 `base_in` 并接收 `quote_out`。费用从 `quote_out` 中扣除，所以用户收到的少于原始积分收益。

**前置条件** ——

* `user_base_ata.balance ≥ base_in`。
* 销售不能将 `base_sold` 推到 0 以下（由于会计一致性与上述冗余）。
* 启动为 `Active`。

**效果** —— 与 `Buy` 对称。`base_sold` 减少，`quote_reserve_real` 减少。费用仍然累积。

## `MigrateToAmm` / `MigrateToCpswap`

曲线达到 `total_quote_fund_raising` 后，将启动毕业到可交易的 AMM 池。这两个指令对应两个毕业目标 —— AMM v4 和 CPMM —— 并且**对于任何给定的启动，只有其中一个有效**，由 `pool_state.migrate_type` 决定（在 `Initialize` 时设置）。

**谁签名**

* `MigrateToAmm` —— 绑定 `GlobalConfig` 上记录的 `migrate_to_amm_wallet`。
* `MigrateToCpswap` —— 绑定 `GlobalConfig` 上记录的 `migrate_to_cpswap_wallet`。

这些钱包通常由 Raydium 运营的毕业 crank 持有；实际上毕业在阈值被超越后几秒内登陆，无论谁触发了最终买入。

**参数**

`MigrateToAmm` 采用三个（主要是 OpenBook 市场参数，程序转发给 AMM v4）：

```
base_lot_size:               u64
quote_lot_size:              u64
market_vault_signer_nonce:   u8
```

`MigrateToCpswap` 不采用任何参数。

**效果（两者共同）**

1. 验证 `pool_state.status == Migrate`（即 `quote_reserve_target` 已被达到）。否则用 `PoolMigrated`（状态已是 `Migrated`）或 `PoolFunding`（仍在筹资中）回退。
2. 验证 `pool_state.migrate_type` 与指令匹配（AMM 为 `0`，CPMM 为 `1`）。否则用 `MigrateTypeNotMatch` 回退。
3. 计算毕业后的储备：
   * `base_amount_out = base_vault.amount − vesting_schedule.total_locked_amount`
   * `quote_amount_out = quote_vault.amount − quote_protocol_fee − migrate_fee − platform_fee`
4. CPI 到目标程序（`AMM v4 Initialize2` 或 `CPMM InitializeWithPermission`）以这些储备创建毕业后的池。
5. 根据绑定的 `PlatformConfig.{platform_scale, creator_scale, burn_scale}`（仅 CPMM）拆分生成的 LP —— 一片铸造到 `platform_nft_wallet`，一片到由 LP-Lock 程序包装的创建者 NFT，一片通过 Burn & Earn 烧掉。对于 AMM v4 毕业，LP 处理由 AMM v4 自己的初始化参数控制。
6. 撤销 `base_mint.mint_authority`（设置为 `None`）。
7. 翻转 `pool_state.status = Migrated`，设置 `vesting_schedule.start_time = block_time + cliff_period`。

**后置条件** —— `BuyExactIn`、`BuyExactOut`、`SellExactIn`、`SellExactOut` 从此时起将用 `PoolMigrated` 拒绝。生成的 AMM 池是规范的，交易如任何其他 AMM v4 / CPMM 池。

**常见错误** —— `PoolFunding`、`PoolMigrated`、`MigrateTypeNotMatch`、`InvalidCpSwapConfig`、`MathOverflow`。

## `CollectFee`

管理员收取单个启动上累积的协议交易费用。

**参数** —— 无。

**账户**

| # | 名称                        | W | S | 说明                                          |
| - | ------------------------- | - | - | ------------------------------------------- |
| 1 | `protocol_fee_owner`      |   | S | 必须等于 `global_config.protocol_fee_owner`。    |
| 2 | `authority`               |   |   | PDA `[b"vault_auth_seed"]`；签署金库转账。          |
| 3 | `pool_state`              | W |   | 突变为零 `quote_protocol_fee`。                  |
| 4 | `global_config`           |   |   | 签名者的真实来源。                                   |
| 5 | `quote_vault`             | W |   | 被 `quote_protocol_fee` 排空。                  |
| 6 | `recipient_token_account` | W |   | `protocol_fee_owner` 在 `quote_mint` 上的 ATA。 |
| 7 | `quote_mint`              |   |   |                                             |
| 8 | `token_program`           |   |   | SPL Token（报价 mint 始终是 SPL Token）。           |

**效果** —— 将 `pool_state.quote_protocol_fee` 从 `quote_vault` 转账到 `recipient_token_account`，然后将计数器置零。可在第一次买入后的任何时间调用。

## `CollectMigrateFee`

管理员收取毕业时累积的迁移费用。账户形状与 `CollectFee` 相同，但以 `migrate_fee_owner` 作为签名者（而不是 `protocol_fee_owner`），并以 `pool_state.migrate_fee` 作为排空的计数器。

## `ClaimCreatorFee`

按创建者对使用相同报价 mint 的创建者拥有的**每个启动**累积的创建者费进行扫款。排空按创建者的费用金库，而非按池的费用金库。

**参数** —— 无。

**账户**

| # | 名称                         | W | S | 说明                                                |
| - | -------------------------- | - | - | ------------------------------------------------- |
| 1 | `creator`                  | W | S | 池创建者。                                             |
| 2 | `fee_vault_authority`      |   |   | PDA `[b"creator_fee_vault_auth_seed"]`。           |
| 3 | `creator_fee_vault`        | W |   | PDA，种子为 `[creator, quote_mint]`；聚合创建者金库。          |
| 4 | `recipient_token_account`  | W |   | `init_if_needed`；`creator` 在 `quote_mint` 上的 ATA。 |
| 5 | `quote_mint`               |   |   |                                                   |
| 6 | `token_program`            |   |   |                                                   |
| 7 | `system_program`           |   |   | 用于需要时的 ATA 创建。                                    |
| 8 | `associated_token_program` |   |   |                                                   |

**效果** —— 将 `creator_fee_vault` 的整个余额转账到 `recipient_token_account`。如果金库为空，会回退并返回大于零检查的 require。

## `ClaimPlatformFee`

按平台的扫款，直接排空启动的报价金库。当平台想要为一个特定启动声明其份额而不通过聚合平台金库时使用。

**参数** —— 无。

**账户**

| #  | 名称                         | W | S | 说明                                            |
| -- | -------------------------- | - | - | --------------------------------------------- |
| 1  | `platform_fee_wallet`      | W | S | 必须等于 `platform_config.platform_fee_wallet`。   |
| 2  | `authority`                |   |   | PDA `[b"vault_auth_seed"]`。                   |
| 3  | `pool_state`               | W |   | 被 `pool_state.platform_fee` 排空。               |
| 4  | `platform_config`          |   |   | 签名者的真实来源。                                     |
| 5  | `quote_vault`              | W |   | 被排空。                                          |
| 6  | `recipient_token_account`  | W |   | `init_if_needed`；`platform_fee_wallet` 的 ATA。 |
| 7  | `quote_mint`               |   |   |                                               |
| 8  | `token_program`            |   |   |                                               |
| 9  | `system_program`           |   |   |                                               |
| 10 | `associated_token_program` |   |   |                                               |

**效果** —— 将 `pool_state.platform_fee` 从 `quote_vault` 转账到 `recipient_token_account`，将计数器置零。

## `ClaimPlatformFeeFromVault`

按平台的聚合扫款。排空平台的按报价 mint 的费用金库，累积来自通过平台路由的每个启动的费用。

**参数** —— 无。

**账户**

| # | 名称                         | W | S | 说明                                            |
| - | -------------------------- | - | - | --------------------------------------------- |
| 1 | `platform_fee_wallet`      | W | S | 必须等于 `platform_config.platform_fee_wallet`。   |
| 2 | `fee_vault_authority`      |   |   | PDA `[b"platform_fee_vault_auth_seed"]`。      |
| 3 | `platform_config`          |   |   |                                               |
| 4 | `platform_fee_vault`       | W |   | PDA，种子为 `[platform_config, quote_mint]`。      |
| 5 | `recipient_token_account`  | W |   | `init_if_needed`；`platform_fee_wallet` 的 ATA。 |
| 6 | `quote_mint`               |   |   |                                               |
| 7 | `token_program`            |   |   |                                               |
| 8 | `system_program`           |   |   |                                               |
| 9 | `associated_token_program` |   |   |                                               |

**效果** —— 将 `platform_fee_vault` 的全部余额转账到 `recipient_token_account`。如果金库为空，则回退。

## 归属和平台配置指令

这些在专门的页面上记录，因为每一个都有自己的状态模型：

* [`CreateVestingAccount`、`CreatePlatformVestingAccount`、`ClaimVestedToken`](/zh/products/launchlab/vesting)
* [`CreatePlatformConfig`、`UpdatePlatformConfig`、`UpdatePlatformCurveParam`、`RemovePlatformCurveParam`、`CreatePlatformGlobalAccess`、`ClosePlatformGlobalAccess`](/zh/products/launchlab/platform-config)
* [`CreateConfig`、`UpdateConfig`](/zh/products/launchlab/global-config)

## 状态变化矩阵

| 指令                                      | `status`   | `real_base` | `real_quote`     | 费用计数器                                         | 毕业后池                         |
| --------------------------------------- | ---------- | ----------- | ---------------- | --------------------------------------------- | ---------------------------- |
| `Initialize{V2,WithToken2022}`          | Funding    | 0           | 0                | 0                                             | —                            |
| `BuyExactIn(q_in)`                      | Funding    | +∆          | +∆q\_after\_fee  | `quote_protocol_fee += ∆`，`platform_fee += ∆` | —                            |
| `SellExactIn(b_in)`                     | Funding    | −∆          | −∆q\_before\_fee | (相同)                                          | —                            |
| 阈值达到                                    | → Migrate  | —           | —                | —                                             | —                            |
| `MigrateToAmm` / `MigrateToCpswap`      | → Migrated | (冻结)        | (冻结)             | `migrate_fee` 设置                              | 已创建，LP 按 `PlatformConfig` 拆分 |
| `CollectFee` / `CollectMigrateFee`      | 任何         | —           | —                | 计数器置零                                         | —                            |
| `ClaimCreatorFee` / `ClaimPlatformFee*` | 任何         | —           | —                | 排空金库                                          | —                            |
| `CreateVestingAccount`                  | Funding    | —           | —                | —                                             | 碰撞 `allocated_share_amount`  |
| `ClaimVestedToken`                      | Migrated   | —           | —                | —                                             | 排空 `base_vault`              |

## 后续步骤

* [`products/launchlab/code-demos`](/zh/products/launchlab/code-demos) —— 每个指令的 TypeScript 示例。
* [`products/launchlab/accounts`](/zh/products/launchlab/accounts) —— 完整的状态形状。
* [`reference/error-codes`](/zh/reference/error-codes) —— LaunchLab 错误枚举。

来源：

* [Raydium SDK v2 `LaunchLab` 模块](https://github.com/raydium-io/raydium-sdk-V2)
* Raydium LaunchLab 程序源代码
