ETH$3,420
Launchpad/launch

How a launch works

One transaction deploys the token, opens its pool, mints the entire supply as a single-sided position, and locks the LP forever.

Launching is permissionless: anyone can call launch() on the launcher with a flat 0.001 ETH fee. One transaction deploys the token, creates and initialises its pool, mints the entire supply as a single position, locks that position forever, and optionally executes your first buy. When the transaction confirms the token is already tradeable and already indexed. There is no second step, no graduation, and no migration.

#What the transaction does

Deploys a fixed-supply HoodToken
Via CREATE2, so the address is deterministic and mineable for vanity. The token has no mint function, no pause, and no owner — see The token contract.
Creates and initialises the WETH pool at the 1% tier
On the venue you picked, at exactly the tick you specified. The launcher then reads slot0 back and reverts with PoolPriceMismatch if the price is not bit-equal — which is how it refuses to launch into a pool somebody pre-created at a different price.
Mints the entire supply as ONE single-sided position
Range [startTick → max usable tick]. Because the pool was initialised at exactly the position’s boundary, the mint provably consumes zero WETH. If any WETH were consumed, or liquidity came out zero, the launch reverts with NotSingleSided.
Locks the LP NFT in the venue's FeeLocker, permanently
Together with abi.encode(creator, creatorBps) — the fee split in force at that moment, stamped in and immutable for this token forever. There is no path that transfers, decreases, or burns a locked position; see Liquidity & LP fees.
Optionally executes your dev buy, atomically
Any ETH above the launch fee is swapped through the venue’s router in the same transaction, so the creator gets the first fill — nobody can slot a buy in between the pool opening and yours.

It then pays the launch fee to the treasury, records the launch in an on-chain registry (launches[token], allTokens), and emits a TokenLaunched event carrying every parameter an indexer needs.

#Why single-sided liquidity behaves like a bonding curve

A concentrated-liquidity position that holds only the token, priced from its lower boundary upward, is mathematically a bonding curve. There is no WETH in the pool, so the only thing a buyer can do is consume token liquidity and push the price up the range; the only thing a seller can do is push it back down. Price discovery starts at your chosen tick and walks monotonically with net flow — the same shape a curve contract would give you.

The difference is what it is. It is a real Uniswap V3 pool from block one, so:

  • every aggregator, router and chart on the chain can see it immediately;
  • there is no reserve pot sitting in a launchpad contract waiting to be migrated — the liquidity is in the pool the whole time;
  • there is no graduation event to time, front-run, or fail. Nothing about the token changes at any market cap.
Where the ETH goes
Nobody “deposits” ETH into a launch. Buyers’ ETH goes into the pool as the counter-asset to the tokens they take out, and it stays there as real liquidity. Because the position is locked forever, that ETH can never be pulled — the only thing anyone can ever extract from the position is accrued swap fees.

#Choosing a venue

The launcher holds an append-only venue registry. The owner can add a venue; no one can re-point or remove one, so a launched token’s infrastructure can never be swapped out from under it. Venue ids share the platform-wide dexId space, so one number means the same venue everywhere.

venueIdVenueRouter flavourNotes
1Uniswap V3SwapRouter02The default. Deepest routing and aggregator coverage.
5SushiSwap V3Original SwapRouterUniswap V3 fork with its own factory, position manager and FeeLocker.

Each venue gets its own FeeLocker and fee receiver, because a locker binds its position manager immutably. Everything downstream — the ownership registry, both fee-policy managers, the fee split — is shared, so the choice of venue changes where your pool lives and nothing else about how your token works.

#Launch parameters

solidityHoodLauncher.LaunchParams
struct LaunchParams {
    uint8   venueId;               // 1 = Uniswap V3, 5 = SushiSwap V3
    string  name;
    string  symbol;
    string  image;                 // artwork URI
    string  description;
    string  socials;               // single JSON string
    string  metadataURI;           // ERC-7572 contractURI
    bytes32 userSalt;              // vanity-mineable; final salt binds msg.sender
    int24   tickIfToken0IsNewToken;// starting price tick, multiple of 200
    uint256 supply;                // 0 => 1,000,000,000e18
    bool    sniperGuard;           // opt in to launch protections
    uint256 devBuyMinOut;          // slippage floor for the atomic dev buy
    bytes   tokenFeeConfig;        // abi.encode(uint16 policyId, bytes data); empty = in-kind split
    bytes   creatorFeeConfig;      // same encoding; empty = fees paid to the creator
}

#Starting price and the FDV band

tickIfToken0IsNewToken is the starting price expressed as a Uniswap tick, normalised as though your token were token0 — so you do not need to know the eventual CREATE2 address ordering to compute it. It must be a multiple of the 1% tier’s tick spacing (200), which makes each step about 2%.

The launcher derives the implied starting FDV on-chain as 1.0001^tick × supply and rejects anything outside an owner-tunable band with MarketCapOutOfRange. This is a reject-only sanity rail — it never moves value — and exists so a mis-signed tick cannot open a pool at an absurd price.

Tick spacing
200 (the 1% tier) — InvalidTick otherwise
FDV band
1.11 – 5 556 ETH of implied fully-diluted value
Supply band
1 – 1 000 000 000 000 000 whole tokens; default 1 000 000 000
Decimals
18, always
note
The FDV band is denominated in ETH because this chain has no USD oracle. It is re-tuned by the protocol if ETH moves a long way; read minFdvWei() / maxFdvWei() rather than assuming.

#Vanity addresses

The token is deployed with CREATE2 from keccak256(abi.encode(msg.sender, userSalt)), so you can mine userSalt for an address you like. computeTokenAddress(deployer, params) is the on-chain predictor and mirrors launch() exactly.

A mined salt is narrower than it looks
The predicted address commits to the deployer, the name, symbol, supply, all metadata strings, the launcher’s current sniper-guard configuration, and the venue’s infrastructure addresses. Change any one of them — including switching venue — and the salt no longer produces that address. Mine last, launch immediately.

#The dev buy

Send launchFee + X and X is spent buying your own token in the same transaction, delivered straight to you. devBuyMinOut is your slippage floor. Because it happens inside launch(), it is the first trade against the pool by construction — and with the sniper guard on, it is the only buy the launch block allows.

#Fee policies

tokenFeeConfig and creatorFeeConfig are where you decide what happens to your LP fees — burn, vest, stake, or buy-and-burn. Both bind immutably to the token at launch. Leave either empty for the default (in-kind split / paid to the creator). Full reference: Fee policies.

#After the launch

There is nothing you are required to do. Fees accrue whether or not anyone cranks them, collection is permissionless, and the token needs no maintenance. What you can do, as the token’s registered owner:

  • edit the on-chain metadata — image, description, socials, contract URI — from the Edit form on My Tokens;
  • rotate where your creator fee share is paid;
  • trigger a buy-and-burn, or rotate the vesting recipient, if you chose those policies;
  • transfer ownership to another wallet, or renounce it and freeze everything as it stands.

What you cannot do — because no one can — is mint more supply, unlock the liquidity, change the fee split, or alter the sniper-guard constants. Those were decided when the transaction confirmed.

chain 4663·on-chain values read 2026-07-29·Blockscout