The first community-mined token launchpad on Arc Network. Mine tokens by writing something funny. 100% onchain. No VCs. No team allocation. Pure community.
ACTFUN is a Pump.fun-style token launchpad built natively on Arc Network — but with a twist that changes everything.
Instead of buying into a bonding curve, your community earns the token supply by writing funny posts. Every mine is a real on-chain transaction. The mining fee goes directly into a liquidity pool. When 95% of the supply is mined within a 1-hour window, the token automatically graduates and opens for live trading via a built-in constant-product AMM (x*y=k). No external DEX. No migration. No rug.
ACTFUN is what Pump.fun would be if the community actually earned the supply — and got to watch it happen live.
| Pump.fun | ACTFUN | |
|---|---|---|
| Token distribution | Bonding curve buy | Community mines 95% of supply |
| Liquidity source | Creator provides | Mining fees auto-seed the pool |
| DEX | External (Raydium) | Built-in AMM — no external DEX |
| Launch requirement | Instant | 1-hour community-mined window |
| Team allocation | Often yes | Zero — 5% is LP reserve only |
| Creator tool | None | Go Live: WebRTC stream + chat |
| Participation | Passive buying | Active — write something funny |
| Backend | Centralized servers | 100% onchain — pure RPC |
| Failure mode | Creator rugs | Refund mechanism if not graduated |
┌─────────────────────────────────────────────────────────┐
│ │
│ 1. CREATE Anyone deploys a token via LaunchpadFactory │
│ Free on testnet. Set: name, symbol, image, │
│ supply, mine amount, cooldown, daily cap, │
│ fee per mine. │
│ │
│ 2. MINE Community mines 95% of supply by writing │
│ funny posts on-chain. │
│ Each mine = small ARC fee → accumulates. │
│ Rules enforced on-chain: cooldown, │
│ daily cap, supply cap. │
│ Window: must complete within 1 hour. │
│ │
│ 3. GRADUATE At 95% mined → contract auto-graduates: │
│ • Mints 5% LP reserve tokens to itself │
│ • Opens built-in x*y=k AMM seeded with: │
│ 5% tokens + all accumulated ARC fees │
│ │
│ 4. TRADE Buy/sell via built-in DEX on the same page │
│ No migration. No external DEX. Instant. │
│ │
│ FAIL SAFE Didn't graduate in 1 hour? │
│ → Refund window opens for all miners │
│ │
└─────────────────────────────────────────────────────────┘
Total Supply
├── 95% Mineable by community (via funny posts)
└── 5% LP reserve (auto-minted to contract on graduation)
Mining Fee → set by creator (e.g. 0.0001 ARC per mine)
→ 100% flows into contract treasury
→ Becomes initial ARC reserve in the AMM on graduation
On Graduation:
Initial token reserve = 5% of total supply
Initial ARC reserve = all accumulated mining fees
AMM formula: tokensOut = arcIn × tokenReserve / (arcReserve + arcIn)
No pre-mine. No team wallet. No VC allocation. The creator gets community glory and a Go Live button.
- New / Trending / Graduated tabs — live mining progress bars, miner counts
- Search — find tokens by name or symbol
- ⛏️ "You mined" badge — your grid highlights every token you've contributed to
- Auto-hides expired tokens — tokens that didn't graduate within 1 hour disappear automatically
- Deploy a full ERC-20 + AMM contract pair in one transaction
- Set name, symbol, image (emoji, URL, or uploaded photo), max supply, mine amount, cooldown, daily cap, fee per mine
- Platform enforces 1-hour graduation window (hardcoded, creator cannot change)
- Post-launch share screen — immediately after deployment confirms, the creator sees:
- Token image, name, symbol
- "Share on X" — one-click tweet with pre-filled text and the OG share link (X renders the token's image card inline in the tweet)
- "Copy link" — copies the share URL to clipboard
- "Share Card" — opens the visual card page
- "Go to token page" — navigate directly to mining/swap page
- Arcscan link — verify the contract on-chain
- No auto-redirect, creator stays on the screen until they're done sharing
- Write something funny — your post is recorded permanently on-chain
- Mining progress bar — live % toward graduation
- Graduation countdown — urgent red timer in the final 10 minutes
- Cooldown display — live countdown to next mine
- Funny post activity feed — see everyone's mining posts in real time
- Leaderboard — top miners ranked by total tokens mined
- Graduation alerts — browser notifications at 75% mined and on graduation
- Buy tokens — direct ARC → token swap via built-in AMM
- Sell tokens — two-step approve + sell flow (ERC-20 approve handled automatically)
- Live price chart — full trade history rendered as a price chart, built from on-chain Swap events
- Price stats — current price, all-time high, all-time low, total trades
- Share on X — one-click tweet with card link that renders a rich image preview on X
Every token gets a shareable card page and X-optimized image preview.
Share URL: actfun.xyz/api/share/:launcherAddress
When posted on X:
- X's bot gets proper
twitter:card: summary_large_imagemeta tags - A 1200×630 PNG card image is generated on-demand server-side showing:
- Token image / emoji
- 🎓 WON (green), 💀 LOST (red), or ⛏️ MINING (blue) status badge
- Mining progress bar with % and miner count
- Top 3 community mining posts as a chat thread ("memes")
- ACTFUN branding
When a real user clicks the link:
- Redirected to
/card/:address— a full visual card page with the same info plus share/copy buttons and a "Trade this token" CTA
The card page is accessible directly at actfun.xyz/card/:address.
- Go Live button — creator broadcasts directly from the token page (no streaming account needed)
- WebRTC peer-to-peer — video streams from creator to all viewers in real time
- Live chat — full chat alongside the stream, works for creator and viewers
- Viewer count — live count of how many people are watching
- Auto-detects live status — viewers see a pulsing 🔴 LIVE badge when creator is streaming
- Tracks every token you've mined in browser localStorage
- Background poller checks progress every 45 seconds
- 🔥 75% milestone — amber toast notification: "Almost there, mine now!"
- 🎓 Graduation — green toast: "It's trading live!"
- Each notification fires exactly once, auto-dismisses after 9 seconds, click to navigate
- Launcher address (Arcscan link)
- Token contract address
- Cooldown, daily max, fee per mine, graduation window
- Creator address
contracts/src/
├── LaunchToken.sol ERC-20 per launched token
│ Standard OpenZeppelin ERC-20
│
├── TokenLauncher.sol Per-token miner + AMM in one contract
│ • mine(post, feePerMine) — write post, pay fee, receive tokens
│ • Cooldown enforced per wallet
│ • Daily cap enforced per wallet per day
│ • Supply cap: reverts if mineableSupply exceeded
│ • _graduate() — auto-called at 95% mined
│ • buyTokens(arcIn) — post-graduation AMM buy
│ • sellTokens(amount) — post-graduation AMM sell
│ • claimRefund() — if expired without graduating
│ • getMiningProgress() → (mined, total)
│ • getLeaderboard() → ranked miner addresses
│
└── LaunchpadFactory.sol Registry + factory
• createToken(...) → deploys (LaunchToken, TokenLauncher) pair
• getTokenCount() → total tokens launched
• getToken(index) → TokenRecord
• getAllTokens() → full registry
• creationFee, feeRecipient (owner-controlled)
Deployed on Arc Testnet (Chain ID 5042002)
| Contract | Address |
|---|---|
| LaunchpadFactory v3 | 0x6b383a533DA4AAaec71d85D8e8E5bf5A2E254f2C |
Each deployed token pair (LaunchToken + TokenLauncher) is created by the factory and registered on-chain. The factory is the source of truth for all valid ACTFUN tokens.
actfun/
├── contracts/ Solidity contracts (Hardhat)
│ ├── src/
│ │ ├── LaunchpadFactory.sol
│ │ ├── TokenLauncher.sol
│ │ └── LaunchToken.sol
│ ├── scripts/
│ │ ├── deploy-launchpad.js Deploy factory
│ │ └── query-tokens.js Query deployed tokens
│ └── hardhat.config.js viaIR: true (required)
│
├── artifacts/actfun/ React + Vite frontend dApp
│ ├── public/
│ │ └── minepad-logo.png
│ └── src/
│ ├── pages/
│ │ ├── HomePage.tsx Token grid
│ │ ├── CreateTokenPage.tsx Launch form
│ │ └── TokenDetailPage.tsx Mine / swap / stream
│ ├── components/
│ │ ├── MiningPanel.tsx Mine action UI
│ │ ├── SwapPanel.tsx Buy/sell UI
│ │ ├── PriceChart.tsx Live chart
│ │ ├── LiveStream.tsx WebRTC stream + chat
│ │ ├── TokenCard.tsx Homepage grid card
│ │ └── GraduationAlerts.tsx Toast notifications
│ ├── pages/
│ │ ├── ...
│ │ └── CardPage.tsx Shareable token card page
│ ├── context/
│ │ └── MiningTrackerContext.tsx Mine tracking + alerts
│ ├── hooks/
│ │ ├── useFactory.ts Token list + create
│ │ ├── useTokenLauncher.ts Mine / swap / events
│ │ ├── usePriceHistory.ts Chart data
│ │ └── useCountdown.ts Countdowns
│ └── lib/
│ ├── wagmi.ts Arc testnet config
│ └── contracts.ts ABIs + addresses
│
├── artifacts/api-server/ Express 5 API (WebSocket signaling)
│ └── src/
│ ├── lib/
│ │ ├── liveRooms.ts In-memory WebRTC room state
│ │ └── wsServer.ts WS upgrade handler
│ └── routes/
│ ├── live.ts /api/live/:addr WebSocket endpoint
│ └── share.ts /api/share/:addr OG page + /api/og-image/:addr PNG card
│
├── artifacts/actfun-mobile/ React Native / Expo mobile app
├── artifacts/minepad-video/ Animated promo video artifact
├── lib/ Shared TypeScript libraries
└── pnpm-workspace.yaml Monorepo config
Requirements: Node.js 24, pnpm 10, MetaMask
git clone https://github.com/actfun/actfun.git
cd actfun
pnpm install
# Frontend dApp (http://localhost:PORT)
pnpm --filter @workspace/actfun run dev
# API server — needed for livestream feature
pnpm --filter @workspace/api-server run dev
# Typecheck everything
pnpm run typecheckAdd Arc Testnet to MetaMask:
| Field | Value |
|---|---|
| Network Name | Arc Testnet |
| RPC URL | https://rpc.testnet.arc.network |
| Chain ID | 5042002 |
| Symbol | ARC |
| Explorer | https://testnet.arcscan.app |
Get testnet ARC from the Arc faucet.
cd contracts
npm install
echo "PRIVATE_KEY=0xyourkey" > .env
CI=true npm run deploy-launchpad
# → Outputs new LaunchpadFactory address
# → Update artifacts/actfun/src/lib/contracts.ts with the new addressHardhat requires
viaIR: trueinhardhat.config.jsto avoid stack-too-deep errors on LaunchpadFactory.
| Layer | Technology |
|---|---|
| Blockchain | Arc Testnet · EVM · Chain ID 5042002 |
| Contracts | Solidity 0.8.24 · OpenZeppelin 5.x · Hardhat |
| Frontend | React 18 · Vite · Tailwind CSS · TypeScript |
| Routing | wouter |
| Web3 | wagmi v2 · viem |
| Wallet | Dynamic Labs (injected connector) |
| Real-time | WebSocket (ws) · WebRTC mesh for livestreams |
| API | Express 5 |
| Monorepo | pnpm workspaces · Node.js 24 |
Arc is an EVM-compatible L1 built for speed. Sub-second finality is what makes ACTFUN feel alive:
- Mining cooldowns feel instant — transaction confirms before you finish reading the success message
- 1-hour graduation window — tight enough to create real urgency, fast enough to not frustrate
- Live leaderboard — updates in near real time as mines confirm
- AMM swaps — settle before you blink
- Negligible gas — anyone can mine without worrying about fees eating their rewards
ACTFUN is the first launchpad native to Arc testnet, purpose-built to show what happens when you combine EVM speed with zero-backend architecture and community-driven tokenomics.
Why no backend for core flows? Everything that matters — supply, fees, graduation, refunds — lives in Solidity. The API server only handles WebSocket signaling for the optional creator livestream. If the server goes down, the launchpad still works 100%.
Why a 1-hour graduation window? It creates urgency. A token either catches fire in its first hour or it doesn't. This prevents zombie tokens from sitting unfinished for days and gives the homepage a constantly fresh grid.
Why built-in AMM instead of external DEX? On-chain AMM means graduation is fully automatic and atomic. No migration transaction. No external dependency. No way for a creator to pull liquidity before it seeds. The mining fees that went in come out as the initial liquidity — aligned incentives by design.
Why funny posts? Mining requires a string argument. Making it a funny post turns a mechanical fee payment into a social action. The activity feed becomes readable entertainment. The token with the best posts wins cultural mindshare.
All economic invariants are enforced in Solidity — not in React:
| Invariant | Enforcement |
|---|---|
| Supply cap | Contract reverts if mineableSupply exceeded |
| Cooldown | Per-wallet, stored on-chain, enforced in mine() |
| Daily cap | Per-wallet per day, on-chain counter |
| AMM reserve integrity | Miners cannot reclaim fees that seeded liquidity |
| Graduation | Irreversible once triggered, fully automatic |
| Refund eligibility | Only after graduation window expires without graduating |
| Factory trust | Only launchers deployed by LaunchpadFactory should be treated as valid |
- Arc mainnet deployment
- IPFS image pinning for token metadata
- Creator revenue share (% of post-graduation AMM fees)
- Governance: community votes on launchpad parameters
- Mobile app (Expo / React Native)
- Multi-chain graduation (graduate to Uniswap on other chains)
This repo is fully open source under MIT. PRs welcome.
- Fork the repo
- Branch off
main - Open a PR with a clear description of what you changed and why
Contract changes: Do not modify deployed contract logic. Create a new factory version and update the address in artifacts/actfun/src/lib/contracts.ts.
| 🌐 Live app | https://actfun.xyz |
| 📖 Docs | https://actfun.mintlify.app |
| 🐦 X / Twitter | https://x.com/Actfunpad |
| 🔍 Arc Explorer | https://testnet.arcscan.app |
| 📜 Factory contract | 0x6b383a...254f2C |
ACTFUN is deployed on Arc testnet. Not financial advice. Mine responsibly.