GlobalConfig is the protocol-level configuration account. There can be many of them — keyed by (curve_type, index) — and every launch picks exactly one at Initialize time. The values on the chosen GlobalConfig then become hard limits for that launch’s parameters. For platform-level customization (per-platform fee rate, allowed curve shapes, NFT splits at graduation), see products/launchlab/platform-config.What it is
AGlobalConfig is a singleton-per-(curve_type, index) PDA that fixes the protocol-side rules every launch must obey:
- The kind of bonding curve allowed (
curve_type). - The trade fee rate the curve charges on every buy and sell.
- The migration fee charged at graduation.
- Floors on supply, lock rate, sell rate, and migrate rate.
- The quote mint (typically wrapped SOL or USDC) — the asset users buy with.
- Four protocol-side wallets: the protocol-fee owner, the migrate-fee owner, and the two migration-control wallets retained for CPMM and legacy AMM v4 graduation.
GlobalConfig accounts can be created and updated by either the LaunchLab program admin or the delegated create-config authority; any other signer gets InvalidOwner (6001). See reference/program-addresses for the canonical authorities.
Layout
create_config instruction is the source of truth.)
Field semantics
curve_type and index
Together these key a GlobalConfig uniquely. There is one GlobalConfig per (curve_type, index) pair:
curve_type = 0— Constant-product virtual-reserve curve. Default and most-used.curve_type = 1— Fixed-price curve.curve_type = 2— Linear-price curve.
index is a u16 that lets the admin publish multiple configurations per curve type (e.g., one with a tighter fee, one with a higher minimum quote raise). At Initialize the launch supplies a (curve_type, index) pair and the program loads the matching GlobalConfig.
Fees
trade_fee_rate— denominated in1/1_000_000of trade volume. Applied to every buy and sell on the curve. Theprotocol_fee_ownerclaims its share viaCollectFee.migrate_fee— a flat fee in lamports (or quote units, depending on configuration) charged once at graduation. Claimed bymigrate_fee_ownerviaCollectMigrateFee.max_share_fee_rate— initialized to10_000(100 bps). Caps theshare_fee_rateargument thatBuyExactIn,BuyExactOut,SellExactIn, andSellExactOutaccept — the referral fee paid straight to the share receiver during the trade. It does not boundPlatformConfig.fee_rate; that rate has its own caps, described inplatform-config.CreateConfigenforcestrade_fee_rate + max_share_fee_rate < RATE_DENOMINATOR_VALUEat init. On the update path onlyparam = 6(max_share_fee_rate) re-checks the sum;param = 0(trade_fee_rate) asserts onlytrade_fee_rate < RATE_DENOMINATOR_VALUE, so raising the trade fee alone can push the pair over the combined bound. Set them in the order that keeps the invariant.
Supply and rate floors
These floors bound what curve-shape parameters a launch can pick atInitialize. If the creator’s CurveParams violate any of them, Initialize reverts with InvalidInput.
min_base_supply— the minimumsupply(no decimals) the curve can declare. Defaults to10_000_000.max_lock_rate— denominated in1/1_000_000; default300_000(30%). Bounds vesting viatotal_locked_amount <= supply * max_lock_rate / 1_000_000.min_base_sell_rate— denominated in1/1_000_000; default200_000(20%). Boundsbase_supply_graduation / supplyfrom below.min_base_migrate_rate— denominated in1/1_000_000; default200_000(20%). Bounds the number of tokens left over to seed the post-graduation pool.min_quote_fund_raising— minimumquote_reserve_targeta launch may declare (with decimals). Defaults to30_000_000_000units of the quote mint.
Quote mint and protocol wallets
quote_mint— the asset users buy with. Most launches use wrapped SOL (So111…112) or USDC (EPjF…Dt1v). OneGlobalConfigis bound to one quote mint; launches that need a different quote target a different(curve_type, index). The mint may be owned by either the SPL Token program or Token-2022 — see below.protocol_fee_owner— pubkey that signsCollectFeeand claims the accrued protocol fees on every launch bound to this config. Stored on-chain; admin can rotate it viaUpdateConfig.migrate_fee_owner— pubkey that signsCollectMigrateFee.
Token-2022 quote mints
CreateConfig accepts a Token-2022 quote_mint, and pools bound to such a config carry it end to end: the quote vault, both fee vaults, and the share-fee receiver’s token account are all created on Token-2022, and the swap instructions account for a TransferFeeConfig on the quote side. PoolState.token_program_flag bit1 records the choice per launch.
Two constraints are worth knowing before you rely on one:
- The deprecated
Initializecannot launch against it. OnlyInitializeV2andInitializeWithToken2022accept a Token-2022 quote program. Seeinstructions. - No extension allow-list is applied. Unlike CPMM and CLMM, LaunchLab does not screen a quote mint’s extensions —
CreateConfigtakes the mint as given, so the only gate is admin discretion over which mints get bound to a config. The program’sNoSupportExtensioncheck covers only Token-2022 base mints that LaunchLab creates itself. Treat binding one as a high-trust action; seereference/token-2022-support.
Migration wallets
The two stored graduation wallets require different signers:migrate_to_amm_wallet— signsMigrateToAmmfor an existing legacy launch whose storedmigrate_type = 0.migrate_to_cpswap_wallet— signsMigrateToCpswap. Every newly initialized launch uses this path.
Platform-side allowlists
GlobalConfig no longer has requires_platform_auth. Its former byte is padding, so the account size does not change. Access is now controlled by PlatformConfig.restrict_global_config and PlatformAllowConfig accounts created by that platform’s admin. See platform-config.
Defaults at initialization
WhenCreateConfig is called, the program seeds many fields with hardcoded defaults:
curve_type, index, migrate_fee, trade_fee_rate, quote_mint, and the four wallet pubkeys explicitly at create time; subsequent values can be tuned via UpdateConfig.
How a launch picks a GlobalConfig
At Initialize, the creator passes:
(curve_type, index)to select whichGlobalConfigPDA to load.CurveParamsdescribing the curve shape (supply,total_base_sell,total_quote_fund_raising,migrate_type).VestingParamsdescribing locked supply.MintParamsfor the base mint.
curve_typematchesglobal_config.curve_type.supply >= global_config.min_base_supply.total_locked_amount <= supply * max_lock_rate / 1_000_000.total_base_sell >= supply * min_base_sell_rate / 1_000_000.(supply − total_base_sell − total_locked_amount) >= supply * min_base_migrate_rate / 1_000_000— i.e., enough tokens left over to seed the post-graduation pool.total_quote_fund_raising >= min_quote_fund_raising.migrate_type == 1(CPSWAP).- If the selected platform has
restrict_global_config == 1, the matchingPlatformAllowConfigis included.
Initialize, the launch’s PoolState stores the global_config pubkey directly, so the binding is permanent.
Update path
UpdateConfig takes a (param: u8, value: u64) pair and accepts either the LaunchLab program admin or the delegated create-config authority as signer — any other signer gets InvalidOwner (6001). Each param value selects which field to mutate:
The former
UpdateConfig selector 12 for platform authorization is removed. Platform admins now manage their own allowlists.
Reading a GlobalConfig from a client
minFundRaisingB, the supply floor as minSupplyA, and the sell/migrate rate floors as minSellRateA / minMigrateRateA.
For a UI listing all available configs, query the LaunchLab API endpoint that mirrors them (raydium.api.fetchLaunchConfigs()); the on-chain account count is small (single digits in practice).
Pointers
products/launchlab/platform-config— per-platform overlay that constrains curve shape further.products/launchlab/accounts— full account graph for a launch.products/launchlab/instructions—Initializeand update instructions.reference/program-addresses— admin pubkey, program ID, shared authorities.
raydium-launch/programs/launchpad/src/states/config.rs—GlobalConfigstruct andinitialize.raydium-launch/programs/launchpad/src/lib.rs—create_config,update_config.

