MECHANICS / LAUNCH

Launch parameters

What a creator actually chooses, and what the protocol chooses for them. Everything in the second group is owner-configured and snapshotted at launch, so it cannot move under a token that already exists.

Model V2 — what the creator sets

name, symbol
Required; an empty string in either reverts with InvalidTokenParams. Fixed in the token's constructor forever.
logo, description, socials
Metadata stored on chain in the token. socials is a struct of five strings: twitter, telegram, discord, website, farcaster.
creatorFeeRecipient
Where creator fees go. The zero address means the launching account. Transferable later by that recipient with transferCreatorFeeRecipient.
creatorTaxBps
An optional tax on top of the 1% base fee. It is charged on every buy and sell and paid 100% to the creator fee recipient, never split with the protocol. On the AGI Launchpad it is 0 to 2% (maxCreatorTaxBps = 200; the contract's hard ceiling is 10%). Validated against the live maxCreatorTaxBps at launch and immutable afterwards.
expectedEconomics
Optional pin. Zero waives the check. Any other value must equal what previewLaunchEconomics(launchConfigId, pairToken) returns at execution time, or the launch reverts with LaunchEconomicsMismatch. It covers the phantom reserve, the threshold, the supply, the curve fee, the pool fee, the tick spacing and the four fee-policy terms — so a re-peg by the owner cannot land underneath an in-flight launch.
salt
CREATE2 salt for the curve and token, namespaced per launching account, so it only has to be unique among that account's own launches. Mining it is how a creator gets a vanity address. AgiV2LaunchDeployer.predictLaunchAddresses tells you the addresses beforehand.
launchConfigId
Which owner-defined configuration to launch against.
pairToken
The quote asset for both the curve and the graduated pool. The zero address means native ETH; anything else must be on the approved list.
snipeTaxExemptions
Optional list, at most 32 addresses (MAX_SNIPE_TAX_EXEMPTIONS), exempt from the snipe tax. The sanctioned path for a team bundling opening buys. It is public in the launch transaction. The launcher and their fee recipient are exempted automatically, with or without this list.

Model V2 — what the owner's LaunchConfig sets

FieldMeaningValidation in _validateLaunchConfig
supplyTotal token supply, minted to the curve≥ 1e18, and ≤ int128 max so V4 can settle the seed
curveFeeBpsBase trade fee on the curve≤ 1,000 bps (10%)
phantomQuoteVirtual quote reserve that sets the opening priceNon-zero, and large enough that a probe buy of one millionth of it still returns tokens
graduationThresholdReal quote reserve at which the curve closesNon-zero; together with the supply it must imply a seed Uniswap V4 would actually mint
poolFeeThe V4 pool's own LP feeMust be zero (CoreLpFeeMustBeZero). The hook charges the fee instead.
tickSpacingTick spacing of the graduated pool> 0 and ≤ 32,767
enabledWhether new launches may select it

For a launch against an approved ERC-20 quote asset, phantomQuote and graduationThreshold do not come from the config. They come from that asset's own PairTokenEconomics, expressed in its own decimals, because a wei-denominated reserve applied to a six-decimal stablecoin would misprice the curve by twelve orders of magnitude. Scaling both figures by the same rate leaves the curve's shape untouched, so a stablecoin launch trades like a native one of the same size.

Model V1 — what the creator sets

name, symbol, logo, description, socials
Same metadata surface, fixed in the token's constructor.
feeWallet
Receives the creator's share of LP fees, and the atomic opening buy. Empty means the launching account. The deployer can redirect it later with AgiLaunchLocker.setFeeRedirect.
launchConfigId, dexId
Which launch configuration (supply, opening tick, restrictions, quote asset) and which configured Uniswap V3 deployment to use.
salt
CREATE2 salt for the token address.
ETH sent
msg.value must be at least launchFee(). Everything above the fee becomes an opening buy executed in the same transaction through the config's router, delivered to the fee wallet. It is the only way a V1 creator ends up holding supply: there is no allocation. Nothing bounds it. The opening buy runs inside the launch transaction, and the token's anti-sniper limits (maxWalletBps, maxTxBps) explicitly skip it, so the creator can end up holding most of the supply in the launch block. The wizard does not refuse it either; it prints the resulting share before you sign, and flags it once it passes 5% of supply, which is the figure a buyer will look for.

Model V1 — what the owner's LaunchConfig sets

FieldMeaning
pairTokenQuote asset of the pool. Fixed per configuration, not chosen per launch.
supplyTotal supply, all of it minted into the position (≥ 1e18).
initialTickOpening price. Must be non-zero and within ±887,272.
maxWalletBps, maxTxBpsLaunch restrictions on the token. maxTxBps is not free: the factory requires it to equal maxWalletBps × 110 / 100, capped at 10,000.
restrictionBlocksHow many blocks those restrictions last. After that the token is a plain ERC-20.
graduationThresholdPurely informational in V1: graduationStatus() compares the paired principal inside the locked position against it. Nothing happens when it is crossed.
reservedFee, routerRequiresDeadline, enabledRouter compatibility and availability flags.
Where the launch fee goes

Both models charge 0.0005 ETH. It is paid straight to the protocol fee wallet inside the launch transaction; neither factory keeps it. V2 forwards it to AgiV2MemeHook.protocolFeeRecipient(), V1 to AgiLaunchLocker.protocolFeeRecipient() — in V1 the recipient lives on the locker, not on the factory. V2 rejects any msg.value that is not exactly the fee. V1 requires at least the fee and spends everything above it on an opening buy delivered to the creator's fee wallet. The owner can change the amount later with setLaunchFee. Neither factory launches if the recipient is the zero address, so the fee cannot be quietly burned.