# nasdegen.fun > Launch a coin paired with a stock. On Base or Robinhood Chain. Token launchpad on Base (8453) and Robinhood Chain (4663). One transaction deploys a token, opens a Uniswap v4 > pool quoted in ETH, USDG, a tokenized stock or any ERC-20 the creator picks, and locks 100% of its supply as liquidity, forever. > No launch fee (gas only). Every pool charges a 1-3% trading fee: 70% to the creator's beneficiaries, or to the coin's holders > pro-rata in the quote asset (a "reward coin"), or burned; 30% to the protocol's FeeRouter (immutable; buys back and burns > $NASDEGEN). Based on OpenLaunch (MIT). ## Source verification - Base (8453): (not deployed yet) - Robinhood Chain (4663): (not deployed yet) ## What a launch does 1. deploys a fixed-supply ERC-20 (1,000,000,000; no mint/pause/blacklist/tax/owner) 2. initializes a Uniswap v4 pool quote/token (quote = ETH, USDG on Robinhood Chain, or a registry stock token; tick spacing 200, no hook) at the chosen start tick 3. mints one single-sided position holding 100% of supply to an ownerless locker (no withdraw path exists) 4. registers fee routing: lpFee 10000 (1%) | 20000 (2%) | 30000 (3%) pips (min 10000; no 0% pools). The locker list is [treasury: 3000] + the creator's recipients scaled into 7000: {payout,bps}[] summing to 10000 as submitted, at most 6 rows, each >= 2 bps; [] = the creator's 70% is burned. factory.previewRecipients(recipients) shows the list. Fixed forever. Holders mode (launchWithHolderRewards): the list is [treasury: 3000, rewardPool: 7000] where rewardPool is a per-launch RewardPool. Anyone may call locker.collect(tokenId): accrued fees are paid straight to every recipient (treasury + beneficiaries, or burned, or the reward pool). factory.treasury() / factory.PROTOCOL_BPS() / factory.MIN_LP_FEE() are immutable views. ## Contracts Base (8453): LaunchFactory (not deployed yet) · LaunchLocker (not deployed yet) Robinhood Chain (4663): LaunchFactory (not deployed yet) · LaunchLocker (not deployed yet) Uniswap v4: Base PoolManager 0x498581fF718922c3f8e6A244956aF099B2652b2b, Universal Router 0x6fF5693b99212Da76ad316178A184AB56D299b43; Robinhood PoolManager 0x8366a39CC670B4001A1121B8F6A443A643e40951, Universal Router 0x8876789976decbfcbbbe364623c63652db8c0904 FeeRouter (treasury): Base (not deployed yet) · Robinhood Chain (not deployed yet) XVaultFactory (fees to an X account): Base (not deployed yet) · Robinhood Chain (not deployed yet) USDG (Robinhood, 6 dec): 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 Tokenized stocks: GET https://nasdegen.fun/api/quotes?chain=base|robinhood&q=AAPL (issuer registries: Coinbase B20 on Base, Robinhood Stock Tokens on 4663) ## Launch (contract call) factory.launch((name, symbol, metadataURI, quote, supply=0, startTick, lpFee, salt, recipients)) startTick 184200 ≈ 10 ETH FDV for 1B supply (raw price = 1.0001^tick token-wei per quote unit; for USDG use ~391400 ≈ $10k FDV). ERC20 quote: token must sort above the quote address → call factory.findSalt(launcher, baseSalt, name, symbol, 0, metadataURI, quote, 64) first. factory.launchWithHolderRewards(params) → (token, tokenId, pool): the "holders" fee mode (a reward coin). Same params; recipients MUST be [] (else RecipientsNotAllowed). The factory deploys a RewardPool per launch (event RewardPoolCreated(token, pool, quote); view rewardPoolOf(token)) and registers it for the creator's 7000 bps. Buy-side fees (in the quote asset) are paid out to holders pro-rata by the protocol keeper a few times a day: pool.distribute(holders, amounts) is capped per holder at pot × balance / circulating on-chain (pool.capOf(holder)), so the keeper cannot misdirect funds. Sell-side fees (in the launch token) are burned by anyone via pool.burnTokenLeg(). Views: pot(), totalDistributed(), rounds(), circulating(). Payout history: GET https://nasdegen.fun/api/launch/rewards?chain=base|robinhood&token=0x…[&wallet=0x…] → {total, burned, rounds, holders_paid, last_at, mine}. Pair with any coin: quote may be ANY ERC-20 on the chain (decimals <= 18). Check it first: GET https://nasdegen.fun/api/quotes/inspect?chain=base|robinhood&address=0x… → {ok, symbol, name, decimals, usd, liquidityUsd, warnings[], blockers[]} (on-chain symbol/name/decimals/totalSupply; DexScreener deepest market: liquidity >= $10,000 or blocked, under 7 days = warning; GoPlus on Base: honeypot / buy or sell tax / transfer_pausable = blocked, mintable / owner_change_balance = warning; Robinhood Chain has no scan = warning). The site never labels a coin from its own name; list rows carry quote_key "custom" and its DexScreener USD price. Optional metadata: POST https://nasdegen.fun/api/launch/meta {chain, launcher, salt, name, symbol, description?, image_url?, website?, x_handle?, x_recipients?} → {uri, token}; pass uri as metadataURI. Fees to an X account: a recipient payout may be an X handle's vault, xVaultFactory.vaultOf("handle") (handle lowercase, no @, [a-z0-9_]{1,15}; BadHandle otherwise). The vault is a deterministic CREATE2 address (salt = keccak256(handle)); the locker pays it like any wallet before it exists and nobody can move the funds but the handle's owner. Claim: the owner signs in with X on the site (/x/), the site's attester signs EIP-712 Claim(bytes32 handleHash,address to,uint256 deadline) (domain {name "XVaultFactory", version "1", chainId, verifyingContract}), and xVaultFactory.claim(handle, to, deadline, sig, currencies) deploys the vault if needed and sweeps "currencies" (address(0) = native) to "to". Anyone may submit; funds only go to "to"; the site only vouches for identity and never holds funds. Events VaultDeployed(handleHash, vault, handle), Claimed(handleHash, vault, to, currencies, amounts). Send x_recipients: [{handle, vault, bps}] with the metadata so rows read "@handle". Recommended: buy a little right after launch (a Universal Router swap on the new pool; the site's form suggests ≈ $25). A token with no holder and no price move reads as dead on screeners and sits under "quiet launches" on the home page until an outside wallet trades it. ## API - GET https://nasdegen.fun/api/launch/list?chain=base|robinhood&sort=live|new|mcap|volume|gainers|holders&window=1h|24h|all&limit=50 sort=live (the home page default; "trending" is an alias): tokens an outside wallet traded in the last 24h first, ranked by outside wallets this hour, then today, then the last outside trade; then each launcher's newest launch under 1h old; then quiet launches, one row per launcher; both by age. "Outside" = not the launcher and not a swap in the sniper window (launch block + 3; a sell there can only be a sniper's). Rows carry traders_1h_ex / traders_24h_ex (those counts), last_outside_trade_at, live_tier (live|new|quiet, live sort only) and launcher_collapsed. - GET https://nasdegen.fun/api/launch/feed - GET https://nasdegen.fun/api/launch/meta/ - GET https://nasdegen.fun/api/quotes/inspect?chain=base|robinhood&address=0x… (can this ERC-20 be a quote? see above) - GET https://nasdegen.fun/api/launch/rewards?chain=base|robinhood&token=0x…[&wallet=0x…] (reward-coin payouts; rows have reward_pool when set) - POST https://nasdegen.fun/api/launch/sync?chain=base|robinhood&tx=0x… (index a tx you just sent; the index is also polled about every 60s) - GET https://nasdegen.fun/api/health - GET https://nasdegen.fun/api/x/me (the visitor's X session, or 401; sign-in: GET /api/x/login → x.com → /api/x/callback; POST /api/x/logout) - POST https://nasdegen.fun/api/x/attest {chain, to} (signed-in handle only → {handle, to, deadline, sig, currencies, vault} for xVaultFactory.claim) Pages: / (list, ?chain=), /launch (?chain=), /t// (trade + fees), /x/ (an X account's fee vaults + claim), /rules, /agents.