Skip to main content
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

A GlobalConfig 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 by the LaunchLab program admin or the delegated create-config authority. Only the admin updates existing configs. See reference/program-addresses for the canonical authorities.

Layout

PDA derivation:
(Verify the exact seed order from the on-chain account before signing — the program’s 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 in 1/1_000_000 of trade volume. Applied to every buy and sell on the curve. The protocol_fee_owner claims its share via CollectFee.
  • migrate_fee — a flat fee in lamports (or quote units, depending on configuration) charged once at graduation. Claimed by migrate_fee_owner via CollectMigrateFee.
  • max_share_fee_rate — initialized to 10_000 (100 bps). Caps the platform’s share fee rate from the binding PlatformConfig (see platform-config). The program enforces trade_fee_rate + max_share_fee_rate < RATE_DENOMINATOR_VALUE.

Supply and rate floors

These floors bound what curve-shape parameters a launch can pick at Initialize. If the creator’s CurveParams violate any of them, Initialize reverts with InvalidInput.
  • min_base_supply — the minimum supply (no decimals) the curve can declare. Defaults to 10_000_000.
  • max_lock_rate — denominated in 1/1_000_000; default 300_000 (30%). Bounds vesting via total_locked_amount <= supply * max_lock_rate / 1_000_000.
  • min_base_sell_rate — denominated in 1/1_000_000; default 200_000 (20%). Bounds base_supply_graduation / supply from below.
  • min_base_migrate_rate — denominated in 1/1_000_000; default 200_000 (20%). Bounds the number of tokens left over to seed the post-graduation pool.
  • min_quote_fund_raising — minimum quote_reserve_target a launch may declare (with decimals). Defaults to 30_000_000_000 units 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). One GlobalConfig is bound to one quote mint; launches that need a different quote target a different (curve_type, index).
  • protocol_fee_owner — pubkey that signs CollectFee and claims the accrued protocol fees on every launch bound to this config. Stored on-chain; admin can rotate it via UpdateConfig.
  • migrate_fee_owner — pubkey that signs CollectMigrateFee.

Migration wallets

The two stored graduation wallets require different signers:
  • migrate_to_amm_wallet — signs MigrateToAmm for an existing legacy launch whose stored migrate_type = 0.
  • migrate_to_cpswap_wallet — signs MigrateToCpswap. Every newly initialized launch uses this path.
These are typically held by the Raydium-operated graduation crank, so graduation lands shortly after the curve hits the threshold rather than waiting for the creator to call it.

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

When CreateConfig is called, the program seeds many fields with hardcoded defaults:
The admin sets 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 which GlobalConfig PDA to load.
  • CurveParams describing the curve shape (supply, total_base_sell, total_quote_fund_raising, migrate_type).
  • VestingParams describing locked supply.
  • MintParams for the base mint.
The program enforces:
  • curve_type matches global_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 matching PlatformAllowConfig is included.
After Initialize, the launch’s PoolState stores the global_config pubkey directly, so the binding is permanent.

Update path

UpdateConfig is admin-only and takes a (param: u8, value: u64) pair. Each param value selects which field to mutate: Wallet rotations (protocol_fee_owner, migrate_fee_owner, migrate_to_amm_wallet, migrate_to_cpswap_wallet) take a separate Pubkey argument shape; check the update_config source for the exact dispatch table before composing an admin transaction. The former UpdateConfig selector 12 for platform authorization is removed. Platform admins now manage their own allowlists.

Reading a GlobalConfig from a client

For a UI listing all available configs, walk the SDK’s getAllGlobalConfigs helper or query the LaunchLab API endpoint that mirrors them; the on-chain account count is small (single digits in practice).

Pointers

Sources:
  • raydium-launch/programs/launchpad/src/states/config.rsGlobalConfig struct and initialize.
  • raydium-launch/programs/launchpad/src/lib.rscreate_config, update_config.