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, symbolInvalidTokenParams. Fixed in the token's constructor forever.logo, description, socialssocials is a struct of five strings: twitter, telegram, discord, website, farcaster.creatorFeeRecipienttransferCreatorFeeRecipient.creatorTaxBpsmaxCreatorTaxBps = 200; the contract's hard ceiling is 10%). Validated against the live maxCreatorTaxBps at launch and immutable afterwards.expectedEconomicspreviewLaunchEconomics(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.saltAgiV2LaunchDeployer.predictLaunchAddresses tells you the addresses beforehand.launchConfigIdpairTokensnipeTaxExemptionsMAX_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
| Field | Meaning | Validation in _validateLaunchConfig |
|---|---|---|
supply | Total token supply, minted to the curve | ≥ 1e18, and ≤ int128 max so V4 can settle the seed |
curveFeeBps | Base trade fee on the curve | ≤ 1,000 bps (10%) |
phantomQuote | Virtual quote reserve that sets the opening price | Non-zero, and large enough that a probe buy of one millionth of it still returns tokens |
graduationThreshold | Real quote reserve at which the curve closes | Non-zero; together with the supply it must imply a seed Uniswap V4 would actually mint |
poolFee | The V4 pool's own LP fee | Must be zero (CoreLpFeeMustBeZero). The hook charges the fee instead. |
tickSpacing | Tick spacing of the graduated pool | > 0 and ≤ 32,767 |
enabled | Whether 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, socialsfeeWalletAgiLaunchLocker.setFeeRedirect.launchConfigId, dexIdsaltmsg.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
| Field | Meaning |
|---|---|
pairToken | Quote asset of the pool. Fixed per configuration, not chosen per launch. |
supply | Total supply, all of it minted into the position (≥ 1e18). |
initialTick | Opening price. Must be non-zero and within ±887,272. |
maxWalletBps, maxTxBps | Launch restrictions on the token. maxTxBps is not free: the factory requires it to equal maxWalletBps × 110 / 100, capped at 10,000. |
restrictionBlocks | How many blocks those restrictions last. After that the token is a plain ERC-20. |
graduationThreshold | Purely informational in V1: graduationStatus() compares the paired principal inside the locked position against it. Nothing happens when it is crossed. |
reservedFee, routerRequiresDeadline, enabled | Router compatibility and availability flags. |
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.