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):
status— three values, monotone (Funding → Migrate → Migrated). Reads always safe; writes gated.real_base,real_quote— current curve state. Combined withvirtual_base/virtual_quotethey are sufficient to compute spot price without touching the vaults. Seebonding-curve.total_base_sellvsreal_base— “progress toward graduation” ratio for UIs.migrate_type— new initialization requires1(CPSWAP). A stored0remains meaningful only for an existing launch created before CPMM-only enforcement.amm_creator_fee_on— pickscreator_fee_on = OnlyQuoteToken(0) orBothToken(1) on the post-graduation CPMM pool. It does not choose the migration target. Seecreator-fees.token_program_flag— a bitfield, not a boolean. Bit0 is the base mint and bit1 is the quote mint, each0for SPL Token and1for 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 against0to classify the base mint resolves2to the wrong program. Bit1 was constant0until Token-2022 quote mints were supported.quote_protocol_fee/platform_fee/migrate_fee— three independent fee counters. Each has its own claim instruction; seeinstructions.vesting_schedule— present on everyPoolStatebut inactive whentotal_locked_amount == 0. Seevestingfor the full lifecycle.
The authority PDA
LaunchLab uses a single authority PDA across all launches, derived with no per-launch seed:- The authority on every launch’s
base_vaultandquote_vault. - The
mint_authorityon each launch’sbase_mint(pre-graduation). - The signer on the CPMM graduation CPI, and on legacy AMM v4 graduation for existing state.
- The signer on
ClaimVestedTokentransfers out of the base vault. - The
transfer_fee_config_authorityon a Token-2022 base mint’sTransferFeeConfig, for the whole pre-graduation phase — and itswithdraw_withheld_authoritytoo, but only when the platform leftPlatformConfig.transfer_fee_extension_authunset.
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:
ClaimCreatorFee and ClaimPlatformFeeFromVault.
Base mint
Created inline byInitialize with:
mint_authority = authority(revoked at graduation).freeze_authority = None.supply = supply, entirely minted intobase_vault.decimalschosen by the creator atInitialize(commonly 6).
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
Bothbase_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:
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 viaClaimCreatorFee. - 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’splatform_fee_walletsweeps it viaClaimPlatformFeeFromVault. There is also a per-launch sweep variant (ClaimPlatformFee) that pulls from the launch’squote_vaultdirectly without going through the aggregated vault.
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].
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
products/launchlab/bonding-curve— the math behindreal_base↔real_quote.products/launchlab/instructions— per-instruction account lists.products/launchlab/global-config— protocol-level binding.products/launchlab/platform-config— platform overlay.products/launchlab/vesting— locked supply mechanics.products/cpmm/accounts— what the post-graduationcpmm_pool_statelooks like.
raydium-launch/programs/launchpad/src/states/pool.rs—PoolState,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
launchpadmodule.

