Skip to main content
This page documents the per-launch account graph: the PoolState (the root state account for one launch), its two vaults, the authority PDA, and the post-graduation references it gains when the launch settles.For the protocol-level config that bounds every launch, see products/launchlab/global-config. For the per-platform overlay, see products/launchlab/platform-config. For vesting accounts (VestingSchedule on PoolState, VestingRecord per beneficiary), see products/launchlab/vesting.

Account inventory

The SDK’s raydium.launchpad.getLaunchById returns PoolState plus a flag indicating whether the launch has graduated; if it has, the post-migration pool ID is included.

PoolState

The per-launch root state. Field names below match the on-chain Rust struct (states/pool.rs); some values are simplified for readability — consult the source for the exact memory layout.
PoolStatus values (from the Anchor IDL):
Integrator-facing fields:
  • status — three values, monotone (Funding → Migrate → Migrated). Reads always safe; writes gated.
  • real_base, real_quote — current curve state. Combined with virtual_base / virtual_quote they are sufficient to compute spot price without touching the vaults. See bonding-curve.
  • total_base_sell vs real_base — “progress toward graduation” ratio for UIs.
  • migrate_type — new initialization requires 1 (CPSWAP). A stored 0 remains meaningful only for an existing launch created before CPMM-only enforcement.
  • amm_creator_fee_on — picks creator_fee_on = OnlyQuoteToken (0) or BothToken (1) on the post-graduation CPMM pool. It does not choose the migration target. See creator-fees.
  • token_program_flag — a bitfield, not a boolean. Bit0 is the base mint and bit1 is the quote mint, each 0 for SPL Token and 1 for Token-2022, so the byte takes four values: 0 (both legacy), 1 (Token-2022 base), 2 (Token-2022 quote), 3 (both Token-2022). Read one mint with (token_program_flag >> bit) & 1. Comparing the whole byte against 0 to classify the base mint resolves 2 to the wrong program. Bit1 was constant 0 until Token-2022 quote mints were supported.
  • quote_protocol_fee / platform_fee / migrate_fee — three independent fee counters. Each has its own claim instruction; see instructions.
  • vesting_schedule — present on every PoolState but inactive when total_locked_amount == 0. See vesting for the full lifecycle.

The authority PDA

LaunchLab uses a single authority PDA across all launches, derived with no per-launch seed:
That single PDA is:
  • The authority on every launch’s base_vault and quote_vault.
  • The mint_authority on each launch’s base_mint (pre-graduation).
  • The signer on the CPMM graduation CPI, and on legacy AMM v4 graduation for existing state.
  • The signer on ClaimVestedToken transfers out of the base vault.
  • The transfer_fee_config_authority on a Token-2022 base mint’s TransferFeeConfig, for the whole pre-graduation phase — and its withdraw_withheld_authority too, but only when the platform left PlatformConfig.transfer_fee_extension_auth unset.
The mint_authority is revoked immediately after MigrateToCpswap or a legacy MigrateToAmm call, so the supply is permanently fixed. Two additional PDAs gate the fee vaults:
These sign the transfer out of the corresponding fee vaults during ClaimCreatorFee and ClaimPlatformFeeFromVault.

Base mint

Created inline by Initialize with:
  • mint_authority = authority (revoked at graduation).
  • freeze_authority = None.
  • supply = supply, entirely minted into base_vault.
  • decimals chosen by the creator at Initialize (commonly 6).
Because the full supply is pre-minted, base_mint.supply is constant for the life of the launch. Curve buys move tokens from base_vault to the buyer, but do not call mint_to. Initialize / InitializeV2 create SPL Token base mints. The dedicated InitializeWithToken2022 instruction lets the base mint be a Token-2022 mint (with optional TransferFeeConfig). All three initialization paths require CPMM graduation. When InitializeWithToken2022 attaches a TransferFeeConfig, the mint is created with transfer_fee_config_authority = authority and withdraw_withheld_authority = PlatformConfig.transfer_fee_extension_auth, falling back to authority when the platform has not set that field. Both authorities are reassigned to the platform key at graduation, the withdraw side only if the PDA still holds it. See platform-config. The quote mint is independent of the base mint and may itself be a Token-2022 mint — InitializeV2 and InitializeWithToken2022 accept either program in their quote-program slot. The deprecated Initialize does not: its quote-program account is still typed to SPL Token, so a config whose quote mint is Token-2022 can only be launched through the other two. The quote mint is never created by LaunchLab; it is whatever GlobalConfig.quote_mint names. See global-config and reference/token-2022-support.

Vaults

Both base_vault and quote_vault are token accounts owned by the LaunchLab authority PDA, each created on the program that owns its own mint — so a launch can have a legacy base vault and a Token-2022 quote vault, or any other combination. token_program_flag records which is which. Addresses are stored on PoolState and can also be derived:
(Verify the exact seed prefixes from the source’s Initialize accounts struct before relying on a derivation in production.)

Fee vaults

Two PDAs aggregate fees across launches:
  • Creator fee vault — PDA at seeds [creator, quote_mint]. Every launch that earns the same creator fees on the same quote mint pours into the same vault. The creator sweeps it via ClaimCreatorFee.
  • Platform fee vault — PDA at seeds [platform_config, quote_mint]. Every launch routed through the same platform that uses the same quote mint pours into the same vault. The platform’s platform_fee_wallet sweeps it via ClaimPlatformFeeFromVault. There is also a per-launch sweep variant (ClaimPlatformFee) that pulls from the launch’s quote_vault directly without going through the aggregated vault.
Both are created lazily on the first swap that accrues a fee, on whichever program owns the quote mint. A creator or platform that runs launches against both a legacy and a Token-2022 quote mint ends up with one vault per mint, as it already did for two different legacy mints. The aggregated-vault pattern is what lets a high-volume creator or platform amortize the rent cost of fee accumulation across many launches.

Quote vault ↔ real_quote

quote_vault.balance and PoolState.real_quote should stay in sync. They can drift by at most the sum of the three pending fee counters (quote_protocol_fee, platform_fee, migrate_fee), which sit in the vault but belong to the fee counters and not the curve reserve. The curve math always uses real_quote, never the raw vault balance. Pre-graduation invariant:

PlatformCurveRule

One account per (PlatformConfig, GlobalConfig) pair, holding the launch shapes that platform permits on that config. PDA seeds are [b"platform_curve_rule", platform_config, global_config].
The account is created holding no group and resized on every group change, so its length is 150 + Σ(14 + 18 × constraints) and decoders must not assume a fixed size. Groups are ORed: a launch is allowed as soon as one group’s constraints all hold. Zero groups means no restriction. Read it only when the owning PlatformConfig.restrict_curve_param is 1 — at 0 the program ignores the account, and a stale rule may well be sitting there. Field ids, operators, and the playbooks are in products/launchlab/curve-rules.

Lifecycle account transitions

Where to go next

Sources:
  • raydium-launch/programs/launchpad/src/states/pool.rsPoolState, PoolStatus, VestingSchedule, AmmCreatorFeeOn.
  • raydium-launch/programs/launchpad/src/lib.rs — PDA seed constants (AUTH_SEED, CREATOR_FEE_VAULT_AUTH_SEED, PLATFORM_FEE_VAULT_AUTH_SEED).
  • Raydium SDK v2 launchpad module.