lunch
…launched
…graduated
…volume
…to creators
eth$18.42
hood$—
𝕏
© 2026 Ticker Mog LLC
TermsPrivacyDocsX
Board
Profile
Documentation

How lunch works, in detail.

Everything about fair-launching a coin on Robinhood Chain — the curve, graduation, fees, and the contracts that make the liquidity un-ruggable.

OverviewLaunch a coinThe bonding curveGraduationFees & rewardsV4 tax launchStock & USDG pairsLock & vestContractsFor developersFAQ

Overview

lunch is a fair-launch coin platform on Robinhood Chain. Anyone can mint a coin in one transaction — no presale, no team allocation, no insider pricing.

Every coin's entire supply is placed as a single full-range Uniswap V3 position at launch, with the LP locked forever from block one. As people buy, the price climbs a smooth curve. Once about 4 ETH of buys sit in the pool, the coin graduates. Creators earn a share of every trade's fee — for as long as they're the coin's creator.

Launch a coin

Hit Launch a coin, fill in a few fields, and confirm one transaction. That's it — your coin is live and tradable.

Name & ticker. The display name and symbol, e.g. Hood Doge / HDOGE.
Total supply. Fixed at 1,000,000,000 for every coin — the launcher enforces it on-chain, so no one can launch with a different supply.
Dev buy (optional). Snipe some of your own supply in the same tx as the launch by attaching ETH — you get whatever it buys at the launch price.

Minting the coin and seeding its initial liquidity band both happen in that single transaction. There is no launch fee — you only pay gas.

The bonding curve

At launch, the entire supply is placed as one single-sided full-range Uniswap V3 position. The pool starts with only your token and no ETH, so every buy walks the price up a smooth curve — and because it's one continuous range, the book keeps deepening as the coin grows instead of thinning out.

This is real on-chain liquidity from block one: anyone can buy or sell at any time through the trade router. The token itself is a plain, immutable ERC-20 — no transfer restrictions, no max-wallet, no admin, no mint. Fairness comes from the curve, not from gating your token.

Graduation

When roughly 4 ETH of net buys sit in the pool, the coin graduates — a milestone marking real, sustained liquidity. Nothing has to move: the LP NFT lives in the FeeLocker from the moment of launch, so liquidity is locked from block one, not at graduation.

The coin trades like any normal V3 pair the entire time, with deep two-sided liquidity that grows as it does. The locked LP means nobody can pull liquidity — the rug is physically impossible.

The board's GRADbadge comes from our indexer and, once earned, stays on — a permanent record of the milestone. If you'd rather check the live number yourself, a standalone, ownerless graduation oracle contract reads it straight from the pool on demand: no admin, no upgrade path, nothing to trust but the math. Since it reads the CURRENT pool state rather than a saved flag, it can read below 4 ETH again after very heavy selling — see For developers for how to call it.

Fees & rewards

Every trade pays a 1% fee, split three ways:

0.5% → you (creator)0.3% → platform0.2% → back into the pool

Your 0.5% accrues in both tokens — WETH from buys, and the coin itself from sells — so a claim pays out both sides. It accrues continuously and is claimable any time from the Claim fees button or your coin's page, paid straight to your wallet. From either place you can also route it across multiple wallets, or reset it back to yourself.

V4 tax launch

Alongside the fair launch, you can launch a V4 tax coin — the same locked-liquidity, immutable-token guarantees, but on Uniswap V4 with a buy/sell tax you set and optional holder rewards.

Buy / sell tax. You pick a tax up to 5% per side (10% round-trip max), taken on every swap. You keep 80% of what's collected; the platform takes 20%. You can change your own rate any time, up to the cap.
Holder rewards (optional). Route part of your 80% to holders as ETH dividends — paid pro-rata, automatically, as people trade.
LP fee auto-compounds. The pool's 0.30% Uniswap fee is folded back into the locked liquidity — it grows the LP, and nobody withdraws it.
Same safety. The coin is still a plain, immutable ERC-20 — no mint, pause or blacklist. The tax lives in a shared hook, not the token, so wallet-to-wallet transfers are never taxed — only swaps. The LP is locked forever.
80% → you (creator)20% → platformtax ≤ 5% / sideLP fee 0.30% → relocked

Claim your accrued tax any time from your coin's page. The buy/sell tax is shown on the board and on each coin's page, so traders always see it up front.

Stock & USDG pairs

By default a coin is paired with ETH. But you can instead pair it with a Robinhood stock (AAPL, TSLA, NVDA, GME…), with USDG, or keep ETH — right from the launch screen, for either a V3 fair launch or a V4 tax launch. The coin trades against that asset instead of ETH.

Pick your pair. The “Pair against” selector lists ETH (default), USDG, and every Robinhood stock. Each shows a live liquidity badge so you know how deep the market behind it is before you launch.
Same guarantees. A pair coin is the identical immutable ERC-20 as any other lunch coin — fixed 1B supply, no mint/pause/blacklist, and locked liquidity forever.
Trades route natively. Buys and sells route through the standard Uniswap router as a multi-hop V3 path (ETH → … → your pair asset → coin). You always spend/receive ETH — the stock/USDG hop happens under the hood.
Dev buy in ETH. You can snipe your own coin at launch with ETH, even for a stock pair — it's zapped ETH → pair asset → coin, atomically in the same launch tx on V4 (or a follow-up tx on V3).
Liquidity honesty. If a stock has thin or no on-chain liquidity, the launch screen says so up front — the coin still launches, but it won't be tradeable until its pair asset has liquidity.

Pair coins are auto-verified on the explorer and appear on the board with a ⇄ pair badge showing which asset they trade against.

Holder rewards for pair coins (V4 only)

A V4 stock/USDG-pair coin can also pay holder rewards — like the ETH-native V4 dividends above, but denominated in the pair asset(s) instead of ETH. Two modes, on top of the usual buy/sell tax:

Single asset. Holders earn the pool's own quote token (the stock or USDG you paired with) — paid pro-rata by balance as people trade, pulled any time from the coin page.
Reward basket. Holders earn a weighted mix of up to 10 different assets — any combination of real stocks and/or USDG — instead of a single quote. You set each asset and its weight (must total 100%) at launch; the weights and assets are locked in forever once launched.
Same accrual, different payout. Both modes accrue in the pool's quote token behind the scenes — the only difference is what a holder actually receives when they claim.

Set this up on the launch screen's Holder rewardsselector once you've picked a stock/USDG pair under V4 — it only appears for pair coins, since plain ETH V4 coins use ETH dividends instead.

Lock & vest

A standalone, trustless utility for locking or vesting any ERC-20 — not just lunch coins. Useful for a creator who wants to publicly lock a chunk of their own supply, or vest team/investor allocations, without trusting a third-party locker.

Lock. Deposit any amount of any token until a chosen unlock date, then withdraw it all at once. You can add more to an existing lock, or push its unlock date later — never earlier.
Vest. Release tokens to a beneficiary linearly from a start date to an end date, with an optional cliff before anything unlocks. Non-revocable once created — only the beneficiary can ever claim it, and only what has vested so far.
No cliff, if you want. The cliff defaults to a suggested date in the picker, but it's optional — set it equal to (or before) the start date for immediate linear vesting from day one.
Transferable. A lock or vesting schedule's owner/beneficiary can reassign it to a different wallet at any time — the schedule and its progress so far carry over unchanged.
Flat fee. A flat 0.01 ETH fee per lock or vest created — same fee regardless of token or amount.

Fully on-chain and non-custodial — the contract holds the tokens, nobody (including us) can access a lock or vest early. See the Token locker address under Contracts, and its ABI, for the exact lock / createVest / claimVest / transferVest signatures.

Contracts

Deployed on Robinhood Chain (chain id 4663). Verify anything on the explorer.

RPC rpc.mainnet.chain.robinhood.comExplorer robinhoodchain.blockscout.com
Launchers
Launcher (V3, ETH)
0xf5Ac14e7691EF44b15b59FcC6a756e41A3E5EFd6
view
V4 launcher (ETH, tax)
0xC783221AB1db0244203458417981B4631E80B988
view
Stock/USDG-pair launcher (V3)
0x568E12B312751992DCfE387CFc8EC7D63E941103
view
Stock/USDG-pair launcher (V4, tax + rewards)
0x6Fda94ACEEDC5a97171469a8873d00fB9983Bb8c
view
Lockers
Fee locker (V3, ETH — frozen, existing coins)
0xA07398bC425F6185e6abae5d093FF308Ae9766A3
view
Fee locker (V3, ETH — current)
0x3201B49b295eE95E70bdBe0b07dF28A7FF1cA9C5
view
V4 LP locker (ETH, tax)
0xbAA7D95C45249E895D2C534218CfFe74B0839872
view
Pair fee locker (V3, stock/USDG)
0x46F1DdD98a51016804b5a42db71d6985E76c8326
view
V4 pair LP locker (stock/USDG)
0xeF785Ad4eea3cffA6C66F77eb454a61D544Be4b6
view
Hooks
V4 tax hook (ETH)
0xF7521Cf0bB7C11e2D2794189412614Cf2e29a0cC
view
V4 pair tax hook (stock/USDG)
0x4Eb1976978756Bd56802d8162f2271844924e0cc
view
Routers & quoters
Trade router (V3, ETH)
0xDB06331f0dc0F57e30a65CA29D4fcb6845aaE695
view
Quoter (V3, ETH)
0xB53b33f8e313f225898E4f2928e7D77f9646abd9
view
Swap router (pair trades)
0xCaf681a66D020601342297493863E78C959E5cb2
view
Referral
Referral splitter (V3/V4 ETH)
0x1a7F27eD92fE0d0A8147125efC7F2B88f08b58f1
view
V4 pair referral sink (stock/USDG)
0x7F2Eeb7470c1D9e37572a2e11C63B08aFbEe1F47
view
Lock & vest
Token locker
0x5a55C36e9e726b5C257b99E2D41f4753eec01dCe
view
Infra & tokens
Uniswap V3 factory
0x1f7d7550B1b028f7571E69A784071F0205FD2EfA
view
Position manager
0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3
view
WETH
0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73
view
USDG
0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168
view
Graduation oracle
0xf20833E04FCCb2F9Deea85298597e536AE300227
view

For developers

lunch is fully on-chain and standard Uniswap V3 — trading terminals, indexers, and bots can integrate permissionlessly.

Find new coins — watch these events on the launcher:

V3TokenLaunched(address indexed token, uint256 indexed tokenId,
                address indexed creator, address pool, uint24 fee)

V3TokenMeta(address indexed token, address indexed creator,
            string image, string banner, string description,
            string website, string twitter, string telegram)

Trades are the standard Uniswap V3 Swap event on each pool. Creator handoffs (community takeovers) emit TokenCreatorSet(token, from, to) on the fee locker.

V4 tax-launch coins emit TaxLaunch(...) + V4TokenMeta(...) on the V4 launcher; trades are the V4 PoolManager Swapevent keyed by the coin's poolId. Read a coin's live tax from the hook — hook.config(poolId) → (creator, buyBps, sellBps).

TaxLaunch(address indexed token, address indexed creator,
          uint256 supply, int24 launchTick, uint256 devBuyEth)
V4TokenMeta(...)   // same shape as the V3 event above

Claiming V4 tax — unlike V3 (where collectAll pays out directly), V4 tax uses a two-step accrue → claim ledger. Tax skims into accruedEth[poolId] on every swap; a separate, permissionless distribute(poolId) call splits it 80/20 (creator/platform) into a pull ledger, owed[recipient]; each recipient then calls claim() to withdraw their own balance. Anyone can call distribute — a keeper, a bot, the creator, us — it always pays the correct pre-configured creator/platform addresses no matter who triggers it.

hook.accruedEth(bytes32 poolId) view -> uint256      // skimmed, not yet distributed
hook.distribute(bytes32 poolId) nonpayable            // permissionless — splits accrued into owed[]
hook.owed(address recipient) view -> uint256          // your claimable balance, across ALL your pools
hook.claim() nonpayable -> uint256                    // pays msg.sender their full owed[] balance

// creator can retune their own rate any time (same 5%/side cap as launch):
hook.setRates(bytes32 poolId, uint16 buyBps, uint16 sellBps) nonpayable

Note: owed[recipient] is a single global balance per address, not per-pool — if a creator has launched multiple V4 coins, one claim() call withdraws everything owed across all of them at once.

Trade — through the router, or the V3 pool directly (1% fee tier, coin/WETH):

// buy — send ETH
LunchTradeRouter.buy(address token, uint256 minTokensOut) payable
// sell — approve the router first
LunchTradeRouter.sell(address token, uint256 tokenAmount, uint256 minEthOut)

// quotes for slippage / minOut (view — eth_call)
LunchQuoter.quoteBuy(address token, uint256 ethIn)     -> tokensOut
LunchQuoter.quoteSell(address token, uint256 tokenAmount) -> ethOut

Price & market data— read it live per coin from the launches table (price, market cap, 24h/7d/30d volume, liquidity, holders, bonding progress, graduated, socials), or on-chain: price from the pool's slot0.sqrtPriceX96(market cap = price × 1e9, supply is a fixed 1,000,000,000). Find a coin's pool from the launch event or factory.getPool(coin, WETH, 10000).

Metadata — logo, banner and socials are on-chain in the V3TokenMeta event at launch, or via token.tokenURI().

Safety— every coin is a plain, immutable ERC-20: no owner, mint, pause, blacklist, max-wallet or transfer tax, and the LP is locked from block zero. Heads-up for honeypot scanners: OpenZeppelin's infinite-approval gas optimization (the if (allowance != max)branch) is sometimes misread as a "trade restriction" — it's a false positive, sells work on-chain.

Graduation, checked on-chain— the graduation oracle above is a standalone view-only contract (no owner, no upgrade path, holds nothing) that reads a coin's live net-raised ETH straight from its pool — independent of the indexer, callable by anyone at zero gas cost via eth_call. It reads the current state, not a saved flag, so a coin can read below 4 ETH again after heavy selling (the board's badge, once earned, stays on — this doesn't).

// V3 coins — pass the locker your coin's launches.fee_locker points to
GraduationOracle.wethPrincipal(address locker, address token) view -> uint256  // wei
GraduationOracle.isGraduated(address locker, address token)  view -> bool

// V4 (tax-launch) coins — pass the LP locker + the coin's Uniswap V4 PoolKey
GraduationOracle.ethPrincipalV4(address locker, PoolKey key) view -> uint256   // wei
GraduationOracle.isGraduatedV4(address locker, PoolKey key)  view -> bool

V4 tax-launch coins — pool, price & trading. A V4 coin trades on a Uniswap V4 native-ETH pool behind the shared tax hook. Derive its poolId from the PoolKey, read price from the PoolManager, and swap through the UniversalRouter + Permit2:

// PoolKey — currency0 is native ETH (address(0)), currency1 is the coin
key = { currency0: 0x0, currency1: coin, fee: 3000, tickSpacing: 200, hooks: <V4 tax hook> }
poolId = keccak256(abi.encode(key))                          // bytes32

// live price + tax (view / eth_call)
StateLibrary.getSlot0(PoolManager, poolId) -> (sqrtPriceX96, tick, ...)
price_eth = 1 / (sqrtPriceX96 / 2**96)**2                    // ETH per coin  (mcap = price × 1e9)
hook.config(poolId) -> (creator, buyBps, sellBps, configured) // the buy/sell tax, in bps

// trade via UniversalRouter.execute(commands, inputs, deadline)
commands = 0x10           // V4_SWAP
actions  = 0x060c0f       // SWAP_EXACT_IN_SINGLE, SETTLE_ALL, TAKE_ALL
//   buy : native ETH in -> coin out   (send msg.value = ethIn)
//   sell: coin in -> ETH out          (approve coin to Permit2, then Permit2 -> UniversalRouter, first)

The tax is taken by the hook inside the swap (creator keeps 80%, platform 20%); there's no separate transfer tax — plain wallet-to-wallet sends are untaxed.

Stock / USDG-pair coins.A coin can be paired with a Robinhood stock or USDG instead of ETH. These launch from the separate stock/USDG-pair launcher and live in a single-sided full-range Uniswap V3 coin/<pairToken> pool (1% tier) — not a coin/WETH pool — locked in the pair fee locker.

V3PairLaunched(address indexed token, uint256 indexed tokenId,
                address indexed creator, address pool, uint24 fee,
                address pairToken, int24 launchTick)
V3TokenMeta(...)   // same shape as the ETH launcher
launchPair(name, symbol, totalSupply, fee, address pairToken,
           uint256 devBuyAmount, uint256 minCoinOut) payable
// + launchPairWithMeta / …Ref / …WithMetaRef

// atomic ETH-funded dev buy (value = launchFee + devETH):
launchPairEthWithMetaRef(name, symbol, totalSupply, fee, pairToken,
           bytes ethQuotePath, uint256 minCoinOut, Meta, address referrer) payable

Trade — route a multi-hop V3 path through the pair token (SwapRouter02), not the ETH-only trade router:

// buy  (ETH auto-wrapped):  WETH -> USDG -> [stock ->] coin
// sell (reverse):           coin -> [stock ->] USDG -> WETH  (+ unwrapWETH9)
SwapRouter02.exactInput({ path, recipient, amountIn, amountOutMinimum })
QuoterV2.quoteExactInput(path, amountIn) -> amountOut   // slippage / minOut

V4 stock/USDG-pair coins. Sibling of the ETH-native V4 launcher paired with a stock/USDG instead of native ETH — same tax mechanics (buy/sell bps, 80/20 creator/platform split, locked auto-compounding LP) plus optional holder rewards paid in the quote asset or a multi-asset basket. currency0/currency1 are {coin, quote} sorted by address (the quote is not always currency1 the way native ETH is always currency0) — invert price accordingly.

PairLaunch(address indexed token, address indexed creator,
           address indexed quote, uint256 supply,
           int24 launchTick, uint256 devBuyEth)
V4TokenMeta(...)   // same shape as the ETH launcher — plain launches only
// plain tax, optional atomic ETH-zap dev buy (ethQuotePath empty = no dev buy)
launchPair({ name, symbol, totalSupply, pairToken, buyBps, sellBps,
             recipients, splitBps, ethQuotePath, minQuoteOut, referrer }) payable
// + launchPairWithMeta(params, Meta)

// holders earn the pool's own quote token
launchPairRewards({ ...above, rewardsBps }) payable

// holders earn a weighted BASKET of up to 10 assets (bps must sum to 10000);
// a leg's asset === pairToken needs path="0x" (direct); every other leg needs
// a real quote→…→asset V3 path
launchPairRewardsBasket({ ...above, rewardsBps,
  basket: [{ asset, bps, path }, ...] }) payable

Rewards / claim — every rewards or basket coin's token exposes tracker(), its one-shot-linked dividend tracker:

token.tracker() view -> address                       // 0x0 for a plain (non-rewards) coin
tracker.claimableOf(address) view -> uint256           // pending, in the accrual denomination
tracker.claim() nonpayable -> uint256                  // self-claim only — pulls YOUR balance

// basket trackers only:
tracker.legCount() view -> uint256
tracker.basketLeg(uint256 i) view -> (address asset, uint16 bps, bytes path)
tracker.claimWithMinOuts(uint256[] minOuts) -> uint256  // per-leg slippage floor, same order as the legs

A basket claim converts your accrued quote into each leg's asset at claim time and pays every asset directly — you end up holding several distinct token balances, never netted into one.

Claiming V4-pair tax — same accrue → distribute → claim pattern as ETH-native V4 above, but quote-denominated instead of ETH, and the pull ledger is keyed by both recipient and quote token. config(poolId) also returns a different, larger shape than the ETH-native hook:

hook.accruedQuote(bytes32 poolId) view -> uint256          // skimmed, not yet distributed, in the quote token
hook.distribute(bytes32 poolId) nonpayable                  // permissionless — splits accrued into owed[][]
hook.owed(address recipient, address quote) view -> uint256  // your claimable balance, in that quote
hook.claim(address quote) nonpayable -> (uint256 amountPaid, address tokenPaid)
// claim() tries to convert your owed quote -> WETH via a configured SwapRouter02 path first (tokenPaid
// = WETH); on no route or a reverting swap it falls back to paying the raw quote token instead.

// config(poolId) — 10 fields, NOT the 4-field shape shown for the ETH-native hook above:
hook.config(bytes32 poolId) view -> (
  address creator, uint16 buyBps, uint16 sellBps, bool configured, bool autoEnabled,
  bool quoteIsC0, address quote, address rewardsTracker, uint16 rewardsBps, uint80 autoThreshold
)

FAQ