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.
  • Three protocol-side wallets: the protocol-fee owner, the migrate-fee owner, and the two migration-control wallets that authorize graduation to AMM v4 / CPMM.
  • An optional flag (requires_platform_auth) that gates which platforms may use this config.
GlobalConfig accounts are created and updated by the LaunchLab program admin (the hardcoded admin pubkey shared across Anchor-based Raydium programs — see reference/program-addresses).

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 graduation paths require different signers:
  • migrate_to_amm_wallet — must sign MigrateToAmm. Used for launches whose migrate_type = 0 (graduate to AMM v4 + OpenBook).
  • migrate_to_cpswap_wallet — must sign MigrateToCpswap. Used for migrate_type = 1 (graduate to CPMM). Token-2022 launches always take 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.

requires_platform_auth

A u8 flag (0 = anyone may use this config; non-zero = only platforms with a valid PlatformGlobalAccess PDA may launch against it). When set, every Initialize against this GlobalConfig must include a matching PlatformGlobalAccess account proving the platform has been pre-authorized via CreatePlatformGlobalAccess (an admin-only instruction). See platform-config for the platform-side mechanics.

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.
  • If requires_platform_auth != 0, a valid PlatformGlobalAccess PDA 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. requires_platform_auth is toggled via set_requires_platform_auth(bool).

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.