> ## 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 账户

> PoolState（每次启动的根账户）、基础和报价金库、权限 PDA，以及每次启动账户的小型图表。协议级 GlobalConfig 和平台级 PlatformConfig 位于各自的页面。

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

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

本页文档记录了**每次启动**的账户图：`PoolState`（一次启动的根状态账户）、其两个金库、权限 PDA，以及启动结算时获得的毕业后引用。

关于约束每次启动的协议级配置，请参阅 [`products/launchlab/global-config`](/zh/products/launchlab/global-config)。关于每平台的覆盖层，请参阅 [`products/launchlab/platform-config`](/zh/products/launchlab/platform-config)。关于归属账户（`PoolState` 上的 `VestingSchedule`、每个受益人的 `VestingRecord`），请参阅 [`products/launchlab/vesting`](/zh/products/launchlab/vesting)。

## 账户清单

| 账户 | 所有者 | 用途 |
| - | - | - |
| [`GlobalConfig`](/zh/products/launchlab/global-config) | LaunchLab 程序 | 协议级规则：费用、供应下限、迁移钱包。每个 `(curve_type, index)` 一个。 |
| [`PlatformConfig`](/zh/products/launchlab/platform-config) | LaunchLab 程序 | 每平台覆盖层：品牌、平台费用、毕业时的 NFT 分割、启动参数开关和规则管理器。固定 944 字节。 |
| `PoolState` | LaunchLab 程序 | 每次启动的根状态：铸币、金库、曲线参数、销售计数器、费用计数器、归属计划、毕业状态。 |
| `authority` | LaunchLab 程序 | 单个 PDA，种子为 `[b"vault_auth_seed"]`，拥有所有启动的金库并签署毕业后 CPI。 |
| `base_vault` | SPL Token / Token-2022 | 每次启动的金库，持有未售出的基础代币。 |
| `quote_vault` | SPL Token / Token-2022 | 每次启动的金库，持有累积的报价代币。遵循拥有报价铸币的程序。 |
| [`VestingRecord`](/zh/products/launchlab/vesting) | LaunchLab 程序 | 每个受益人的悬崖 + 线性解锁记录。可选。 |
| `creator_fee_vault` | SPL Token / Token-2022 | 每个创建者 + 每个报价铸币的金库，持有应计创建者费用，由 `ClaimCreatorFee` 清空。遵循报价铸币的程序。 |
| `platform_fee_vault` | SPL Token / Token-2022 | 每个平台 + 每个报价铸币的金库，持有应计平台费用，由 `ClaimPlatformFeeFromVault` 清空。遵循报价铸币的程序。 |
| [`PlatformAllowConfig`](/zh/products/launchlab/platform-config) | LaunchLab 程序 | 可选的平台管理权限，用于一个 `(PlatformConfig, GlobalConfig)` 对。仅在平台启用限制时检查。 |
| [`PlatformCurveRule`](/zh/products/launchlab/curve-rules) | LaunchLab 程序 | 可选的平台管理启动参数规则，用于一个 `(PlatformConfig, GlobalConfig)` 对。仅在平台设置 `restrict_curve_param` 时检查。可变大小，空时 150 字节。 |
| （毕业后）`cpmm_pool_state` | CPMM 程序 | 由 `MigrateToCpswap` 为每次新启动创建的池。旧状态仍可引用 AMM v4 毕业。 |
| （毕业后）Fee Key NFT | LP-Lock 程序 | 在 2026-08-17 升级之前，平台和创建者规模可能产生单独的 Fee Key。之后执行的迁移将两个规模合并为一个平台 Fee Key。 |

SDK 用 `raydium.launchpad.getRpcPoolInfo({ poolId })` 读取它，该方法返回解码后的 `PoolState`，并把绑定的 `GlobalConfig` 作为 `configInfo` 附加上（批量形式为 `getRpcPoolsInfo({ poolIdList })`）。不存在 `getLaunchById`。池 id 本身是 `(programId, mintA, mintB)` 的 PDA —— `getPdaLaunchpadPoolId`。

## `PoolState`

每次启动的根状态。下面的字段名称与链上 Rust 结构体（`states/pool.rs`）匹配；某些值为了可读性已简化——请查阅源代码了解确切的内存布局。

```rust theme={null}
// states/pool.rs (abridged)
pub struct PoolState {
    pub epoch:                     u64,        // recent_epoch tracker
    pub auth_bump:                 u8,
    pub status:                    u8,         // PoolStatus enum
    pub base_decimals:             u8,
    pub quote_decimals:            u8,
    pub migrate_type:              u8,         // 0 = AMM v4, 1 = CPMM
    pub supply:                    u64,        // total base tokens (no decimals)
    pub total_base_sell:           u64,        // base supply allocated to the curve
    pub virtual_base:              u64,        // virtual-reserve seed
    pub virtual_quote:             u64,        // virtual-reserve seed
    pub real_base:                 u64,        // base sold so far
    pub real_quote:                u64,        // quote raised so far (excl. fees)
    pub total_quote_fund_raising:  u64,        // graduation threshold in quote

    pub quote_protocol_fee:        u64,        // accrued, pending CollectFee
    pub platform_fee:              u64,        // accrued, pending ClaimPlatformFee
    pub migrate_fee:               u64,        // accrued, pending CollectMigrateFee
    pub vesting_schedule:          VestingSchedule,

    pub global_config:             Pubkey,
    pub platform_config:           Pubkey,
    pub base_mint:                 Pubkey,
    pub quote_mint:                Pubkey,
    pub base_vault:                Pubkey,
    pub quote_vault:               Pubkey,
    pub creator:                   Pubkey,     // NOTE: last of the seven pubkeys, not third

    pub token_program_flag:        u8,         // bit0 = base mint, bit1 = quote mint; 0 = SPL Token, 1 = Token-2022
    pub amm_creator_fee_on:        u8,         // 0 = QuoteToken, 1 = BothToken (CPMM-only)
    pub platform_vesting_share:    u64,        // the platform's slice of total_locked_amount
    pub padding:                   [u8; 54],
}

#[derive(Default, Debug, Clone)]
pub struct VestingSchedule {
    pub total_locked_amount:    u64,
    pub cliff_period:           u64,
    pub unlock_period:          u64,
    pub start_time:             u64,           // set at graduation
    pub allocated_share_amount: u64,           // running sum across VestingRecords
}
```

`PoolStatus` 值（IDL 中的变体名为 `Fund` / `Migrate` / `Trade`）：

```
0 = Fund            — accepting buys / sells; below total_quote_fund_raising
1 = Migrate         — threshold reached; awaiting MigrateToAmm / MigrateToCpswap
2 = Trade           — migration done; post-graduation AMM trading, vesting clock running
```

面向集成者的字段：

* **`status`** — 三个值，单调递增（`Fund` → `Migrate` → `Trade`）。读取始终安全；写入受限。`ClaimVestedToken` 要求处于 `Trade`。
* **`real_base`**、**`real_quote`** — 当前曲线状态。结合 `virtual_base` / `virtual_quote`，足以计算现货价格而无需接触金库。参阅 [`bonding-curve`](/zh/products/launchlab/bonding-curve)。
* **`total_base_sell`** vs `real_base` — UI 的"毕业进度"比率。
* **`migrate_type`** — 新初始化需要 `1`（`CPSWAP`）。存储的 `0` 仅对 CPMM 强制执行前创建的现有启动有意义。
* **`amm_creator_fee_on`** — 在毕业后 CPMM 池上选择 `creator_fee_on = OnlyQuoteToken`（`0`）或 `BothToken`（`1`）。它不选择迁移目标。参阅 [`creator-fees`](/zh/products/launchlab/creator-fees)。
* **`token_program_flag`** — 位字段，不是布尔值。Bit0 是基础铸币，Bit1 是报价铸币，每个 `0` 表示 SPL Token，`1` 表示 Token-2022，所以字节取四个值：`0`（两个都是旧版）、`1`（Token-2022 基础）、`2`（Token-2022 报价）、`3`（两个都是 Token-2022）。用 `(token_program_flag >> bit) & 1` 读取一个铸币。将整个字节与 `0` 比较以分类基础铸币会将 `2` 解析为错误的程序。Bit1 在支持 Token-2022 报价铸币之前一直是常数 `0`。
* **`quote_protocol_fee` / `platform_fee` / `migrate_fee`** — 三个独立的费用计数器。每个都有自己的声明指令；参阅 [`instructions`](/zh/products/launchlab/instructions)。
* **`vesting_schedule`** — 存在于每个 `PoolState` 上，但当 `total_locked_amount == 0` 时不活跃。参阅 [`vesting`](/zh/products/launchlab/vesting) 了解完整生命周期。

## 权限 PDA

LaunchLab 在所有启动中使用**单个**权限 PDA，派生时不使用每次启动的种子：

```ts theme={null}
const LAUNCHLAB_PROGRAM_ID = new PublicKey("<LAUNCHLAB_ID>"); // see reference/program-addresses

const [authority, bump] = PublicKey.findProgramAddressSync(
  [Buffer.from("vault_auth_seed")],
  LAUNCHLAB_PROGRAM_ID,
);
```

该单个 PDA 是：

* 每次启动的 `base_vault` 和 `quote_vault` 上的权限。
* 在 `base_mint` 上无权限——铸币权限在 `InitializeV2` 返回前被撤销（见下文）。
* CPMM 毕业 CPI 上的签署者，以及现有状态的旧版 AMM v4 毕业。
* `ClaimVestedToken` 从基础金库转出的签署者。
* Token-2022 基础铸币的 `TransferFeeConfig` 上的 `transfer_fee_config_authority`，用于整个毕业前阶段——以及其 `withdraw_withheld_authority`，但仅当平台未设置 `PlatformConfig.transfer_fee_extension_auth` 时。

`mint_authority` 在**初始化**指令中被撤销，而不是在毕业时：`InitializeV2` 和 `InitializeWithToken2022` 将完整供应铸造到 `base_vault` 中，然后在同一指令中将 `MintTokens` 设置为 `None`。因此，供应从启动存在的那一刻起就是固定的，迁移没有铸币权限步骤。副作用：没有人可以为基础铸币签署，所以其租金无法通过 [`CollectExcessLamports`](/zh/products/launchlab/instructions#collectexcesslamports) 回收。

两个额外的 PDA 控制费用金库：

```ts theme={null}
const [creatorFeeVaultAuthority] = PublicKey.findProgramAddressSync(
  [Buffer.from("creator_fee_vault_auth_seed")],
  LAUNCHLAB_PROGRAM_ID,
);

const [platformFeeVaultAuthority] = PublicKey.findProgramAddressSync(
  [Buffer.from("platform_fee_vault_auth_seed")],
  LAUNCHLAB_PROGRAM_ID,
);
```

这些在 `ClaimCreatorFee` 和 `ClaimPlatformFeeFromVault` 期间签署相应费用金库的转出。

## 基础铸币

由 `Initialize` 内联创建，具有：

* `mint_authority = authority`（在毕业时撤销）。
* `freeze_authority = None`。
* `supply = supply`，完全铸造到 `base_vault`。
* `decimals` 由创建者在 `Initialize` 时选择（通常为 6）。

因为完整供应是预铸造的，`base_mint.supply` 在启动的整个生命周期中是常数。曲线购买将代币从 `base_vault` 移动到买方，但不调用 `mint_to`。

`Initialize` / `InitializeV2` 创建 SPL Token 基础铸币。专用的 `InitializeWithToken2022` 指令允许基础铸币是 Token-2022 铸币（带可选的 `TransferFeeConfig`）。所有三个初始化路径都需要 CPMM 毕业。

当 `InitializeWithToken2022` 附加 `TransferFeeConfig` 时，铸币使用 `transfer_fee_config_authority = authority` 和 `withdraw_withheld_authority = PlatformConfig.transfer_fee_extension_auth` 创建，当平台未设置该字段时回退到 `authority`。两个权限在毕业时重新分配给平台密钥，提取端仅在 PDA 仍持有它时。参阅 [`platform-config`](/zh/products/launchlab/platform-config#token-2022-transfer-fee-authorities)。

报价铸币独立于基础铸币，本身可能是 Token-2022 铸币——`InitializeV2` 和 `InitializeWithToken2022` 在其报价程序槽中接受任一程序。已弃用的 `Initialize` 不接受：其报价程序账户仍然类型为 SPL Token，所以报价铸币为 Token-2022 的配置只能通过其他两个启动。报价铸币从不由 LaunchLab 创建；它是 `GlobalConfig.quote_mint` 命名的任何东西。参阅 [`global-config`](/zh/products/launchlab/global-config#token-2022-quote-mints) 和 [`reference/token-2022-support`](/zh/reference/token-2022-support#launchlab-quote-mints)。

## 金库

`base_vault` 和 `quote_vault` 都是由 LaunchLab `authority` PDA 拥有的代币账户，每个都在拥有其自己铸币的程序上创建——所以一次启动可以有旧版基础金库和 Token-2022 报价金库，或任何其他组合。`token_program_flag` 记录哪个是哪个。地址存储在 `PoolState` 上，也可以派生：

```ts theme={null}
const [baseVault] = PublicKey.findProgramAddressSync(
  [Buffer.from("pool_vault"), poolState.toBuffer(), baseMint.toBuffer()],
  LAUNCHLAB_PROGRAM_ID,
);
const [quoteVault] = PublicKey.findProgramAddressSync(
  [Buffer.from("pool_vault"), poolState.toBuffer(), quoteMint.toBuffer()],
  LAUNCHLAB_PROGRAM_ID,
);
```

（在生产中依赖派生之前，请从源代码的 `Initialize` 账户结构验证确切的种子前缀。）

## 费用金库

两个 PDA 跨启动聚合费用：

* **创建者费用金库** — PDA，种子为 `[creator, quote_mint]`。每次启动在同一报价铸币上赚取相同创建者费用都流入同一金库。创建者通过 `ClaimCreatorFee` 清空它。
* **平台费用金库** — PDA，种子为 `[platform_config, quote_mint]`。通过同一平台路由的每次启动使用同一报价铸币都流入同一金库。平台的 `platform_fee_wallet` 通过 `ClaimPlatformFeeFromVault` 清空它。还有一个每次启动的清空变体（`ClaimPlatformFee`），直接从启动的 `quote_vault` 拉取，不经过聚合金库。

两者都在第一次产生费用的交换时在拥有报价铸币的程序上懒惰创建。针对旧版和 Token-2022 报价铸币运行启动的创建者或平台最终会为每个铸币获得一个金库，就像它已经为两个不同的旧版铸币所做的那样。

聚合金库模式是让高容量创建者或平台在许多启动中摊销费用累积的租金成本的原因。

## 报价金库 ↔ `real_quote`

`quote_vault.balance` 和 `PoolState.real_quote` 应该保持同步。它们最多可以偏离三个待处理费用计数器的总和（`quote_protocol_fee`、`platform_fee`、`migrate_fee`），这些计数器位于金库中但属于费用计数器而不是曲线储备。曲线数学始终使用 `real_quote`，从不使用原始金库余额。

毕业前不变量：

```
quote_vault.balance ==
   real_quote
 + quote_protocol_fee
 + platform_fee
 + migrate_fee
```

## `PlatformCurveRule`

每个 `(PlatformConfig, GlobalConfig)` 对一个账户，持有该平台在该配置上允许的启动形状。PDA 种子为 `[b"platform_curve_rule", platform_config, global_config]`。

```rust theme={null}
#[account]
pub struct PlatformCurveRule {
    pub bump:            u8,
    pub version:         u8,
    pub platform_config: Pubkey,
    pub global_config:   Pubkey,
    pub epoch:           u64,
    pub padding:         [u64; 8],
    pub groups:          Vec<CurveRuleGroup>,   // up to 10
}

pub struct CurveRuleGroup {
    pub group_id:    u16,                       // stable id, used to update or remove the group
    pub epoch:       u64,
    pub constraints: Vec<ParamConstraint>,      // up to 25, ANDed
}

pub struct ParamConstraint {
    pub field: u8,                              // which launch parameter
    pub op:    u8,                              // 0 Eq, 1 Gte, 2 Lte, 3 Neq
    pub value: u128,
}
```

账户创建时不包含任何组，在每次组更改时调整大小，所以其长度为 `150 + Σ(14 + 18 × constraints)`，解码器不得假设固定大小。组是 OR 的：一旦一个组的约束全部成立，启动就被允许。零组意味着无限制。

仅当拥有的 `PlatformConfig.restrict_curve_param` 为 `1` 时读取它——在 `0` 时程序忽略该账户，旧规则可能就在那里。字段 ID、运算符和手册在 [`products/launchlab/curve-rules`](/zh/products/launchlab/curve-rules)。

## 生命周期账户转换

| 事件 | 状态 | `real_base` | `real_quote` | 毕业后池 |
| - | - | - | - | - |
| `Initialize` | Funding | 0 | 0 | — |
| `BuyExactIn` / `BuyExactOut` | Funding | `+base_out` | `+quote_in_after_fee` | — |
| `SellExactIn` / `SellExactOut` | Funding | `−base_in` | `−quote_out_before_fee` | — |
| `MigrateToCpswap`（或旧版 `MigrateToAmm`） | Funding → Migrate → Migrated | （冻结） | （冻结） | 已创建；CPMM LP 分割为平台拥有的锁定 LP 和销毁 LP |
| `ClaimCreatorFee` / `ClaimPlatformFee*` | 任何 | — | — | 清空费用金库 |
| `CreateVestingAccount` | Funding | — | — | 碰撞 `vesting_schedule.allocated_share_amount` |
| `ClaimVestedToken` | 仅 Migrated | — | — | 清空 `base_vault` |
| `CollectExcessLamports` | 任何 | — | — | —（仅移动 lamports，从不移动代币余额） |

## 接下来去哪里

* [`products/launchlab/bonding-curve`](/zh/products/launchlab/bonding-curve) — `real_base` ↔ `real_quote` 背后的数学。
* [`products/launchlab/instructions`](/zh/products/launchlab/instructions) — 每条指令的账户列表。
* [`products/launchlab/global-config`](/zh/products/launchlab/global-config) — 协议级绑定。
* [`products/launchlab/platform-config`](/zh/products/launchlab/platform-config) — 平台覆盖层。
* [`products/launchlab/vesting`](/zh/products/launchlab/vesting) — 锁定供应机制。
* [`products/cpmm/accounts`](/zh/products/cpmm/accounts) — 毕业后 `cpmm_pool_state` 的样子。

来源：

* `raydium-launch/programs/launchpad/src/states/pool.rs` — `PoolState`、`PoolStatus`、`VestingSchedule`、`AmmCreatorFeeOn`。
* `raydium-launch/programs/launchpad/src/lib.rs` — PDA 种子常数（`AUTH_SEED`、`CREATOR_FEE_VAULT_AUTH_SEED`、`PLATFORM_FEE_VAULT_AUTH_SEED`）。
* [Raydium SDK v2 `launchpad` 模块](https://github.com/raydium-io/raydium-sdk-V2)。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.