VetoDotFun
The singleton that combines the token factory, every bonding curve, the fee ledger, and the Uniswap v3 migrator.Launching
HoodToken and opens its curve. msg.value must cover the flat creation fee (read it from feeConfig(); currently 0.001 ETH); any ETH beyond it executes an optional dev buy at the public starting price, with minTokensOut protecting against front-running. The current global fee config is snapshotted into the token’s CurveState; its fees never change afterwards. Emits TokenCreated (which carries the snapshot).
Trading
graduated = true. Emits Trade on every fill and Graduated on the final one.
Views & quotes
CurveState fields: virtualEth, virtualToken, realTokensLeft, realEth, creator, graduated, migrated, plus the launch-time fee snapshot protocolFeeBps, creatorFeeBps, creatorLpShareBps (uint16s, fixed for the token’s lifetime).
Migration
0xdEaD; leftover WETH accrues to protocol fees. Emits Migrated.
Fees
feeConfig is owner-tunable within hard caps (MAX_TOTAL_FEE_BPS = 500, MAX_CREATION_FEE = 0.1 ether), and createToken snapshots it into the token’s CurveState. A token’s fees are read from its snapshot on every trade and harvest; config changes apply to future launches only.
Claim gating: payouts always go to the recorded recipient, but only the recipient itself or the claimAuthority (the platform’s backend claimer, rotatable by the owner) may trigger creator claims; only the treasury may trigger protocol claims.
Owner surface (complete list)
Events
Custom errors
CurveClosed, CurveStillOpen, AlreadyMigrated, Expired, SlippageExceeded, UnknownToken, ZeroAmount, ZeroAddress, FeeTooHigh, NotFeeRecipient, NotTreasury, InsufficientCreationFee, LockerNotSet, LockerAlreadySet, EthTransferFailed, OnlyWeth, NotPool
HoodToken
The per-launch ERC-20, deployed bycreateToken:
- OpenZeppelin
ERC20+ERC20Permit(EIP-2612), 18 decimals - Fixed supply of 1,000,000,000 × 1e18, minted once to the launchpad
metadataURI(): immutable token metadata pointer (e.g.ipfs://…)- No owner, mint, burn-by-admin, pause, blacklist, or fee-on-transfer
FeeLocker
The immutable, ownerless vault for graduated liquidity:creatorLpShareBpsOf(token) (30/70 under the current config). One call always pays both parties; Uniswap collects the whole position at once.
Curve constants
Math.ceilDiv on reserve division) so the invariant k never decreases.
Deployed addresses
Live on Robinhood Chain mainnet (4663) since block 9,824,773, source-verified on Blockscout:
See Developer Overview for the canonical Uniswap and WETH addresses the protocol builds on.

