MegaChad is a two-token economy on MegaETH: a meme-burn primitive ($MEGACHAD) bolted to a full on-chain DeFi and governance stack (MEGA Protocol). This page is the canonical reference for every contract, surface, and API the project exposes.
Tokens. $MEGACHAD is the deflationary base asset — you burn 225,000 of it to mint a Looksmaxxed NFT. $MEGAGOONER is the governance and reward token — emitted over 225 weeks to stakers, LPs, and the treasury via a quadratic emission curve.
Chain. Everything below runs on MegaETH mainnet (chain ID 4326), with sub-second blocks and ~0.001 gwei fees.
You need a wallet that supports custom EVM networks:
Auto-added when you press CONNECT WALLET. Manual values:
--legacy for tooling)225,000 $MEGACHAD is the cost of one Looksmaxxed image. Half is burned to the dead address; half goes to the Tren Fund treasury.
Contract: 0x374A17bd16B5cD76aaeFC9EAF76aE07e9aF3d888
How to buy: bridge ETH to MegaETH via Rabbithole (Ethereum, Base, Arbitrum, Optimism, Polygon, BNB, Avalanche, Scroll, zkSync, Linea), then swap on Kumbaya DEX or use the built-in swap on the main page.
Gasless option: sign an EIP-712 typed message; the relayer pays gas and submits your burn on-chain. Approve the relayer once, then no further transactions are required.
MEGA Protocol is the governance and DeFi layer wrapped around $MEGACHAD. Every contract is a UUPS upgradeable proxy controlled by the admin role (Tren Fund) until governance hands itself the keys. The flow:
Open the Protocol page to interact with all of this from one UI.
0x11d819Dbd6e9aF0b13A54e88EA411155764e3F46_mint)MINTER_ROLE (EmissionController only), BURNER_ROLE (Framemogger only), SNAPSHOT_ROLE (Jestermogger for vote checkpoints)DeFi genesis timestamp: 1778941561 (2026-05-16 14:26:01 UTC). Week numbers count forward from this anchor; week 0 is the first 7-day window.
Proxy: 0x9CBB09555395643abc016b586D7d890E6911a013
The EmissionController is the single source of $MEGAGOONER supply during the 225-week emission window. It mints to the staking contracts and the treasury on a per-week basis using a deterministic quadratic decay formula.
weeklyEmission(w) = 662,245 × ((225 − w) / 225)²
The integral of the curve plus the 2.5M genesis airdrop hits the 50M cap exactly, so no extra $MEGAGOONER can ever be minted.
Each week's emission is split three ways (basis points):
Governance can adjust each line ±5% within hard bounds (Treasury 10–20%, Staking 40–50%, LP 35–45%), once per 90-day cooldown. The sum must always equal 10,000 bps.
distributeEmissions() walks every unclaimed week from lastProcessedWeekup to getCurrentWeek() in a single transaction, mints the aggregate, and callsnotifyRewardAmount() on both staking pools. Weeks can never be skipped — if nobody triggers a distribution for a month, the next caller scoops the entire backlog in one shot.
A Vercel cron at /api/cron/distribute runs daily at 00:00 UTC. It callsMoggerStaking.distributeWeeklyRewards() (which routes through EmissionController and notifies both pools) but only when periodFinish < now, so it no-ops if the current 7-day drip window is still active. Users never need to touch this — the cron makes the protocol self-sustaining.
Proxy: 0xfd820E6189Eb3396dA71cB072643A0E1e1239853
Stake token: $MEGACHAD · Reward token: $MEGAGOONER
Synthetix-style continuous drip pool. Stake any amount of $MEGACHAD, hold at least 1 Looksmaxxed NFT to be eligible, and earn $MEGAGOONER every block. There is no lock periodand no minimum stake — unstake anytime.
On notifyRewardAmount(R) the contract setsrewardRate = (R + leftover) / 7 days and starts a fresh 7-day drip window. Per-second reward share for a staker is:
userShare = (effectiveStake / totalEffectiveStake) × rewardRate × Δt
Where effectiveStake = stakedAmount × nftMultiplier / 10000. The UI's APR widget extrapolates: APR = rewardRate × secondsPerYear / totalEffectiveStake.
Multipliers are snapshotted on every stake / unstake / claim to block flash-borrow gaming. If you grow your NFT bag mid-stake, call refreshEffectiveStake() (or just touch the position) to upgrade your tier on-chain.
If notifyRewardAmount fires while totalEffectiveStake == 0 (nobody is staked yet) the rewards are parked in bufferedRewards instead of getting silently burned via division. As soon as someone stakes, the next notify auto-folds the buffer into the drip rate. Admins can also flushBufferedRewards() to release it immediately.
Proxy: 0x2695965Dd283e2425fab5C4c1E0955656802569c
Implementation (V4): 0x8BD2ACF3F97d4398A16dC928cAb4C002824646F6
Stake token: MC/MG LP · Reward token: $MEGAGOONER
Mirror of MoggerStaking but for liquidity providers. Stake your MC/MG LP tokens, earn the 40% LP-share of weekly $MEGAGOONER emissions on a continuous drip.
V4 is the live version of this contract. Compared to V3 (deprecated):
MIN_LOCK_DURATION = 0. Unstake anytime.getTimeMultiplier() always returns 10000 (1.000×). Your effective stake is just LP × nftMultiplier.flushBufferedRewards() to release trapped buffer into a fresh 7-day drip. This was used at V4 upgrade to release 264,898 MEGAGOONER stuck in the buffer.Same tiers as MoggerStaking — 0× / 1.000× / 1.075× / 1.150× based on NFT count.
JESTERGOONER's lpToken can be set exactly once via setLpToken(), transitioning from the placeholder ERC20 to the real MC/MG pair. After that one-shot, the field is locked. Today's value points at 0x437a433534FF6e7712D7e0A03Fa6CE577EeA1fef(MegaChadLP_MC_MG).
Pair: 0x437a433534FF6e7712D7e0A03Fa6CE577EeA1fef
Type: Constant-product (x · y = k) — Uniswap V2-equivalent math
Fee: 0.3% on swaps (accrues to LPs)
Custom in-house AMM pair (MegaChadLP.sol). LP tokens use the standardsqrt(a · b) − 1000 formula for initial mint and proportional shares thereafter.
Call addLiquidity(amountA, amountB, to) with $MEGACHAD and $MEGAGOONER. If the pool is empty you set the initial price; otherwise you must match the current ratio (reserveA / reserveB). LP tokens mint to to.
removeLiquidity(liquidity, to) burns LP tokens and returnsamountA and amountB proportional to your share of totalSupply.
swap(amountAIn, amountBIn, to) takes one of the two inputs as zero. Output is computed with the standard (in × 997 × reserveOut) / (reserveIn × 1000 + in × 997)(Uniswap V2's 0.3% fee math). Pre-transfer input tokens before calling, just like Uni V2.
The Protocol page exposes Add Liquidity, Remove Liquidity, and Swap tabs that wire directly to this pair. Slippage is currently fixed at 1%; price impact and reserves are read live fromgetReserves().
Proxy: 0xce320179Fb66E088635f789881A939321682E0c5
Framemogger is the on-ramp to governance. Burn $MEGACHAD to the Tren Fund, watch $MEGAGOONER get deflated in lockstep, and compete for one of three weekly proposal slots.
sendMegachad(amount) with at least 1 $MEGACHADSo if you send 100,000 $MEGACHAD, you also burn 10,000 $MEGAGOONER. That deflationary pressure applies upward force on price as supply contracts.
Each 7-day window tracks per-user $MEGACHAD sent. At all times the top 3 burners can callJestermogger.propose(). canPropose(account) returns true if you're in this week's current top 3. Slots are recomputed in real time as new burns land.
getWeekTop3(week) — final standings for a closed weekgetWeekStats(week) — total burned, unique burners, time lefttotalSentAllTime() — protocol-wide accumulatortotalMegagoonerBurned() — running deflation counterProxy: 0x75C38E514Ba9FEeb6EEEeF4cdEb88074Ade0582b
Token-weighted on-chain governance. The current top-3 weekly burners can submit proposals; all $MEGAGOONER holders vote, weighted by their snapshot balance at proposal start.
propose(targets, values, calldatas, description). Restricted to current week's top 3 burners. State = Pending.For, Against, or Abstain. One vote per address per proposal.Defeated.execute() fires all targets in order. 7-day grace window before it expires.VOTING_DELAY: 1 dayVOTING_PERIOD: 3 daysTIMELOCK_PERIOD: 2 daysGRACE_PERIOD: 7 daysQUORUM_PERCENTAGE: 50Snapshot voting (via the ERC20Snapshot extension on $MEGAGOONER) means flash loans can't inflate vote weight — your balance is locked in at the proposal's start time.
Proxy: 0xbE985E5159cDFE8d33b4E61644495B38cCb46468
A 20-seat council composed of the top Looksmaxxed NFT holders, recomputed on-demand byupdateCouncil(maxTokenId). Council members can veto any queued or executable proposal.
startVetoVote(proposalId) on a Queued proposal.VetoCast → executeVeto() marks the proposal Vetoed. It can no longer be executed.This is an emergency brake — token-weighted governance handles the day-to-day, but if a hostile actor accumulates $MEGAGOONER and pushes a malicious proposal through, the long-term NFT holders can shut it down.
Proxy: 0x8C6c634D0B698de2E98713E5a02f7905b117beAE
Global pause switch. Five guardian addresses (multisig-style) can trigger a pause; admin can unpause. When paused, distributeEmissions(), staking, and proposal execution all revert with ProtocolPaused. Reads remain live, so the UI keeps rendering.
0x85bf…370C) until governance transfers itself the roleDeployed: 2026-05-16 · Deployer: 0x85bf9272DEA7dff1781F71473187b96c6f2f370C
0x374A17bd16B5cD76aaeFC9EAF76aE07e9aF3d8880x1f1eFd3476b95091B9332b2d36a24bDE12CC62960x11d819Dbd6e9aF0b13A54e88EA411155764e3F460x9CBB09555395643abc016b586D7d890E6911a0130xfd820E6189Eb3396dA71cB072643A0E1e12398530x2695965Dd283e2425fab5C4c1E0955656802569c0x437a433534FF6e7712D7e0A03Fa6CE577EeA1fef0xce320179Fb66E088635f789881A939321682E0c50x75C38E514Ba9FEeb6EEEeF4cdEb88074Ade0582b0xbE985E5159cDFE8d33b4E61644495B38cCb464680x8C6c634D0B698de2E98713E5a02f7905b117beAE0x42000000000000000000000000000000000000060xfafddbb3fc7688494971a79cc65dca3ef82079e70x000000000000000000000000000000000000dEaDstake(amount) — emits Staked eventearned(you) tick upward in real timeclaimRewards() any time to receive accrued $MEGAGOONERunstake(amount) to withdraw (no lock period)addLiquidity() — LP tokens land in your walletstake(amount)Framemogger.sendMegachad(amount) — you also need a $MEGAGOONER bag to cover the 10% deflationJestermogger.propose(...) to submit a proposalPending → Active transition (1-day delay)castVote(proposalId, support) — support: 0 = Against, 1 = For, 2 = Abstainqueue() a Succeeded proposalexecute() itThe MegaETH Portal is the command surface:
NLP examples:
"swap 0.1 ETH for megachad""looksmaxx from base""check wallet 0x…""compare 0xABC vs 0xDEF""show top burners""stake 50000 megachad""register me as an agent"Looksmaxx from 10 source chains without manual bridging:
The intent engine builds a 5-step plan: bridge → swap → burn → generate → mint. Use the NLP bar, the /api/cross-chain/intent endpoint, or the cross_chain_looksmaxx MCP tool.
Every wallet has a profile page:
Profiles are queryable as JSON via /api/identity/ADDRESS by any MegaETH protocol.
AI agents can register on-chain and earn commissions:
registerAgent() on the referral contract or POST to /api/agent/registergetAgentStats() or /api/agent/referralsMegaChad exposes a full Model Context Protocol server. Connect:
npx @anthropic-ai/claude-code mcp add megachad https://megachad.xyz/api/mcp
get_megachad_stats — supply, circulating, burn countget_price — $MEGACHAD price in ETHget_swap_quote — ETH → $MEGACHAD calldataget_wallet_info — balances, NFT count, burn eligibilityget_portfolio — full MegaETH token portfolioget_gallery — looksmaxxed burns with IPFS imagesget_chadboard — leaderboard with reputation and .mega namesget_identity — resolve wallet or .mega nameget_nft_metadata — ERC-721 metadataget_looksmaxx_requirements — burn requirements + x402 infoget_looksmaxx_plan — full burn transaction plancross_chain_looksmaxx — cross-chain plan from 10+ chainsgasless_burn_info — EIP-712 typed data for meta-tx burnsget_bridge_info — bridge options to MegaETHget_agent_info — ERC-8004 agent dataregister_referral_agent — 11,250 $MEGACHAD per referralget_referral_stats — referrals, earningsregister_early_access — beta registrationchat_with_megachad — natural language interfaceget_megaeth_protocols — MegaETH protocol directoryAll endpoints are public and CORS-enabled.
GET /api/stats — protocol statisticsGET /api/price — current price + burn costGET /api/wallet?address=0x... — balancesGET /api/gallery?limit=20 — recent burnsGET /api/chadboard — leaderboardPOST /api/generate — generate + mint with burn proofGET|POST /api/x402/looksmaxx — x402-aware looksmaxxGET /api/x402/quote?ethAmount=0.1 — swap quoteGET|POST /api/gasless/burn — EIP-712 gasless burnPOST /api/warren/deploy — Warren on-chain storageGET /api/metadata/{tokenId} — ERC-721 metadataGET /api/cron/distribute — daily Vercel cron, calls distributeWeeklyRewards() when period has elapsed. Protected by CRON_SECRET.POST /api/agent/chat — NLP transaction engineGET /api/agent/info — agent identity + ERC-8004GET|POST /api/agent/register — agent registrationGET /api/agent/referrals?address=0x... — referral statsGET /api/agent/looksmaxx?wallet=0x... — burn planPOST /api/chat/auth — Ably chat authGET|POST /api/chat/messages — chat storageGET|POST /api/chat/name — display namePOST /api/telegram — Telegram bot webhookPOST /api/telegram/alerts — burn/mint notificationsGET /api/frame — Farcaster frameGET /api/cross-chain/intent?sourceChain=base — build planPOST /api/cross-chain/intent — submit intentGET /api/cross-chain/status?id=cc_... — track intentGET /api/identity/ADDRESS — unified profileGET /api/portal/tokens?address=0x... — MegaETH balancesGET /api/portal/protocols — protocol directoryGET /api/bridge — bridge infoGET /api/events — on-chain event stream (SSE)GET /api/analytics — usage trackingPOST /api/early/register — beta accessBurn-gated real-time chat on the Chadboard. Any wallet with at least one burn (Mewer tier+) can post.
The MegaChad Telegram bot pushes real-time alerts on burns, mints, governance state changes, and emission distributions. Join t.me/megachads.
POST /api/telegram/alerts — trigger notificationGET /api/telegram/setup — bot config infoEach protocol contract uses OpenZeppelin AccessControl. Live mainnet role assignments:
0x85bf…370C) — can grant/revoke roles, will transfer to Jestermogger once governance is maturedistributeWeeklyRewards()canUnstake returns false, you have 0 staked — nothing to withdrawearned() shows 0 but you're staked: you likely have 0 NFTs → no NFT, no rewards. Buy one and call refreshEffectiveStake()swap() — this is Uni V2 style, not router-basedActive state (after 1-day delay, before 3-day window closes)Pending