Everything about Wonk, in one place.
Reference for the Wonk launch protocol on Arc: launch mechanics, pricing, graduation, contracts, and integration endpoints.
Getting started
Wonk runs on Arc mainnet. Everything here moves real funds, and a submitted transaction cannot be recalled.
Add Arc to your wallet
The app offers to add the network for you on first connect, so these values are here for wallets that add a chain by hand and for backend services.
Fund a wallet
Bring USDC on Arc. It is the chain's native coin, so it pays gas and it is also what most coins are priced in. There is no faucet: this is mainnet.
A launch itself costs no protocol fee, only gas, so the practical minimum is gas plus whatever you want the launch to open with.
Try it end to end
Connect a wallet on wonk.fun and run through the full loop: create a coin, buy and sell on its curve, and watch it climb toward graduation.
Overview
Wonk is a fair-launch memecoin platform on Arc. Anyone can create a coin, and every coin trades on the same curve shape against one of the whitelisted base assets.
Wonk never holds your funds. Every launch and trade is a transaction your wallet asks you to approve.
Key facts
- Live on mainnet. Tokens and trading activity carry real value and real loss.
- Names and symbols can be copied. Always check the contract address.
- Prices come from each token's own Uniswap v4 pool, not a fixed rate.
- Launches can be volatile, illiquid, or lose all value.
- Deployed contracts are immutable. Nothing here can be paused or rolled back for you.
How launches work
Creating a launch deploys the coin and opens its market in a single transaction: WonkLauncherFactory.launch deploys the token, creates its config, opens the Uniswap v4 pool, locks the tail band, and optionally buys for the creator. The creator sets the name, symbol, image, description, and links at creation.
There is no separate curve contract and no later migration. The pool a coin graduates into is the pool it was born in.
- 01
Create
The whole supply is minted once and split between two ranges of one Uniswap v4 pool: the main band, which is what trades, and the tail band, which is locked immediately and forever.
- 02
Trade
Buys and sells move price through the main band. Every trade reports its own progress toward graduation as
progressBps. - 03
Graduate
Once the main band has taken in its fill amount, it is withdrawn and redeployed as a permanently locked position in the same pool.
| Parameter | Value |
|---|---|
| Curve type | Single Uniswap v4 pool with a concentrated main band, priced by WonkHook. Tick spacing 60, dynamic fee flag 0x800000. |
| Total supply per launch | 1,000,000,000 tokens, 18 decimals, minted once and never again |
| Supply split | 80% main band (tradeable), 20% tail band (locked at launch) |
| Launch fee | None. Gas only. |
| Anti-bot / wallet cap at launch | None. There is no per-wallet cap, cooldown, or allowlist in the contracts. The creator's own opening buy happens inside the launch transaction as preBuyBaseAmount, and is uncapped: a large enough pre-buy graduates the pool in the launch transaction itself. |
| Creator tax | Optional, chosen at launch, ceiling 10% (1000 bps, from maxTaxBps()) |
Trading and pricing
Every coin trades in its own Uniswap v4 pool against one base asset chosen at launch. The price you see is that pool's live price, and it moves with each trade. Slippage sets how much movement you accept.
A coin priced in one base is still buyable with another: the bases are paired with each other on Arc's Uniswap deployment, so the app routes a buy through the pool in between and the trade settles in one transaction.
| Price | The current price in the coin's own pool. |
| Market cap | Price multiplied by circulating supply. |
| FDV | Price multiplied by the full token supply. Supply is fixed at launch and never grows, so the two readings coincide. |
| Price impact | The price movement caused by the size of your trade. |
| Slippage | The maximum execution movement your transaction accepts, enforced as amountOutMinimum by the router. |
| Liquidity | Assets available in the pool around the current price. |
V4Quoter runs the real hook, so a quote already accounts for this.Graduation
A launch graduates once its main band has taken in its configured fill amount of the base asset. Progress toward that amount is what "Closing in" tracks on the Explore page, and what progressBps reports on every CurveBuy and CurveSell.
WonkConfigRegistry.baseCurve(base). On mainnet today: 8,090 USDC for a USDC-priced launch, 2,022,500 WONK for a WONK-priced one. See Base assets and curves.There is no migration step, and no second pool. A launch is a Uniswap v4 pool from the moment it is created, because WonkHook is part of its pool key. On the swap that crosses the fill target, the hook withdraws the main band whole inside afterSwap and redeploys the proceeds as a locked position held by WonkLauncherLocker. The pool id never changes, so an integration that indexed the pool before graduation keeps working after it.
| Parameter | Value |
|---|---|
| Post-graduation pool | The same pool. Same pool id, same PoolManager, same hook. |
| Post-graduation pool fee tier | Dynamic fee flag 0x800000. The pool charges 0 and the hook takes the real fee, which is 1% (100 bps). |
| Liquidity lock | Permanent. The tail band is locked at launch and the graduation position is locked on graduation, both held by WonkLauncherLocker, which exposes no withdrawal function. |
| Migration delay | None. It happens inside the swap that crosses the target. |
Graduation only confirms the threshold was reached. It is not a quality signal and does not guarantee future liquidity, price, or an exit.
Fees and royalties
Trading generates a swap fee. The creator keeps almost all of it, the protocol keeps a small share, and a creator may also have set a separate tax at launch.
| Split | Share |
|---|---|
| Swap fee | 1% of the trade (100 bps, from WonkHook.swapFeeBps()) |
| Creator royalty | 99% of that swap fee |
| Protocol share | 1% of that swap fee (100 bps, from WonkHook.feePolicy()), paid to the Treasury |
| Creator tax | Separate from the split above and goes to the creator in full. Set per launch, ceiling 10%. Most launches set 0. |
The split is settled at claim time rather than at swap time, so feePolicy() on the hook is the live value and the numbers above are what is deployed today.
How creators claim their royalty
From the coin's page on the app, which calls WonkHook.claimFees(poolId, minOut). Two things are worth knowing:
- The claim is not permissionless. Only the pool's creator or one of the hook's operators may call it.
- A pool accrues fees in both currencies, and token-denominated fees are sold into the base asset inside the claim. That sale is what
minOutbounds, which is why a claim can revert withSlippageExceeded.
A creator can hand the payout over without moving the coin: transferCreator for an immediate transfer, or proposeCreatorTransfer and executeCreatorTransfer for a two-step one.
What the protocol share funds
It is paid to the Treasury contract listed under Contracts, which is where every protocol-side fee accrues. There is no buyback or burn mechanism in the deployed contracts.
Community takeovers
When a coin's original creator steps away, the community can request a takeover. A takeover transfers the social presence and, where applicable, the creator royalty payout to an active community.
Onchain, this is the creator handover described under Fees and royalties: transferCreator, or the two-step proposeCreatorTransfer and executeCreatorTransfer on WonkHook. Only the current creator or a hook operator can move it.
To request one, reach the team on any of the channels under Support.
The coin, its pool, and its locked liquidity are unaffected. Only the creator payout wallet and creator-facing surfaces change. Never share a private key or seed phrase; Wonk will never ask you to send funds to process a request.
Risk disclosures
- This is mainnet. Funds are real, and a submitted transaction is irreversible.
- Prices can move quickly and liquidity can be thin.
- A creator's opening buy is uncapped and happens in the launch transaction. Read the launch before trading a new coin.
- Similar names and images can represent unrelated tokens. The contract address is the only identity that matters.
- Smart contracts, wallets, RPCs, and indexers can fail.
- Displayed values are estimates, not execution guarantees.
- Deployed contracts are immutable. There is no admin who can reverse a trade or recover a mistaken transfer.
Wonk is an interface, not investment advice or a representation of token quality.
Network
Wonk runs on Arc mainnet. Each coin lives in its own Uniswap v4 pool from launch through graduation.
| Network | Arc |
| Chain ID | 5042 |
| Native asset | USDC, 18 decimals at the EVM level |
| Public RPC | https://rpc.mainnet.arc.io |
| Explorer | https://arc.etherscan.io |
| Multicall3 | 0xcA11bde05977b3631167028862bE2a173976CA11 |
| Curve fee | 1% (100 bps), taken by the hook. The pool's own fee is 0. |
| Launch fee | None. Gas only. |
| Default supply | 1,000,000,000 tokens, 18 decimals |
eth_getBalance, msg.value and every native amount in these contracts. The ERC-20 predeploy for the same balance presents 6 decimals. The two are one balance behind two interfaces, and mixing them misprices a figure by 1e12.Contracts
Deployed addresses on Arc (5042). Every one carries code, and the Wonk contracts reference each other in both directions.
Wonk
| Contract | Address |
|---|---|
| WonkLauncherFactory | 0x34f3DA4D04394173DED7b0f430af114a0fF27952 |
| WonkHook | 0x21bdc377265e2A26ba336F24381E67e768253044 |
| WonkConfigRegistry | 0xA94601CB7AFC7Ae6a31ab1bB1ccBD1ffc6f4Be9A |
| WonkLauncherLocker | 0x0a787cF22782418381D4A5eEf0C492Acb5cC4839 |
| Treasury | 0x57658a42a8881F2C5286c501457C8e23EFC4649B |
Uniswap v4 on Arc
| Contract | Address |
|---|---|
| PoolManager | 0x8366a39CC670B4001A1121B8F6A443A643e40951 |
| StateView | 0xF3334192D15450CdD385c8B70e03f9A6bD9E673b |
| V4Quoter | 0x8Dc178eFB8111BB0973Dd9d722ebeFF267c98F94 |
| UniversalRouter | 0x4fcA4a51Ab4F23A7447b3284fBd7D73289A89Fb1 |
| PositionManager | 0x6049c9a0e26405C0985f9E3685C87d0aE917f82B |
| Permit2 | 0x000000000022D473030F116dDEE9F6B43aC78BA3 |
Base assets and curves
A launch is priced in exactly one base asset, chosen at creation from what the registry whitelists. Read the live list from WonkConfigRegistry.getEnabledBases() rather than hardcoding it: the owner can add or drop an entry at any time, and a launch against a base that is not enabled reverts with BaseNotAllowed.
Two are enabled on mainnet today.
| Base | Address and decimals |
|---|---|
| USDC | 0x0000000000000000000000000000000000000000 (native), 18 decimals |
| WONK | 0x548Df4bF91624D8cEC46d606211EB13f7492e27E, 18 decimals |
Each base carries its own curve on the registry, read as baseCurve(base) returning (startAmount, fillAmount). startAmount is the valuation a launch opens at and fillAmount is what the main band must take in to graduate, both denominated in that base.
| Base | Opens at | Graduates at |
|---|---|---|
| USDC | 3,033.75 USDC | 8,090 USDC |
| WONK | 758,437.5 WONK | 2,022,500 WONK |
baseFillAmountActual(base) is the figure the hook actually settles against, and it is slightly above fillAmount — 8,116.85 USDC against a nominal 8,090 — because the band is priced in ticks and the target lands inside one. Use it when you need the exact raise, and fillAmount when you need the number the protocol advertises.Onchain events
For a trust-minimized integration, index WonkLauncherFactory for new coins and WonkHook for curve activity and graduation. The pool id is stable from launch, so you can register a coin's pool once and index PoolManager swaps for it from then on.
| Event | Signature and topic0 |
|---|---|
| Coin created WonkLauncherFactory |
TokenCreated(address)0x2e2b3f61b70d2d131b2a807371103cc98d51adcaa5e9a8f9c32658ad8426e74e |
| Coin launched WonkLauncherFactory, carries the full launch config |
TokenLaunched(address,address,address,address,uint256,uint256,bytes32,uint256,uint256,string,string,uint256,uint128,uint16,uint8)0x4bc3e1c7563116fd43fe920faebc0e711cddc122034360e8c8e1b4c81c5267a5 |
| Pool registered WonkHook, maps poolId to coin, base and creator |
PoolRegistered(bytes32,address,address,address)0x01bf263a1db1652580721573296e1a1fa70b3d4c87f61d02a69c4e1109d2d573 |
| Buy on the curve WonkHook, last field is progressBps |
CurveBuy(address,address,uint256,uint256,uint256,uint256,bytes32,address,uint16)0xc1742a443d639e06cae611e6969aa3e066a8edf9ca632e4d45b9167f487d1785 |
| Sell on the curve WonkHook |
CurveSell(address,address,uint256,uint256,uint256,uint256,bytes32,address,uint16)0xcf93b133041e0c9edcb77b3088a72ce25e769d56f3df661c1b0db04a3fe7fa0d |
| Graduated WonkHook, emitted inside the crossing swap |
PoolGraduated(address,uint256,uint256,uint256)0x0a44ef75df69c534f43cd6c1aa3ef8983065fe5fe79ef9e79f6494e6f258c259 |
Uniswap v4 PoolManager Swap |
Swap(bytes32,address,int128,int128,uint160,uint128,int24,uint24)0x40e9cecb9f5f1f1c5b9c97dec2917b7ee92e57ba5563708daca94dd84ad7112f |
Reading token and curve state
A pool id is derived, not looked up. It is keccak256(abi.encode(PoolKey)), and the two currencies have to be sorted by address rather than written base first: native USDC sorts below every launched token, but a base that sorts above one gives a mirrored pool, and an unsorted key produces an id that matches no pool at all. launches() then returns zeroes and the coin reads as "not a launch" instead of failing loudly.
// Arc mainnet client import { createPublicClient, http, keccak256, encodeAbiParameters, zeroAddress } from "viem"; const arc = { id: 5042, name: "Arc", nativeCurrency: { name: "USD Coin", symbol: "USDC", decimals: 18 }, rpcUrls: { default: { http: ["https://rpc.mainnet.arc.io"] } }, contracts: { multicall3: { address: "0xcA11bde05977b3631167028862bE2a173976CA11" } }, }; const client = createPublicClient({ chain: arc, transport: http() }); const HOOK = "0x21bdc377265e2A26ba336F24381E67e768253044"; const REGISTRY = "0xA94601CB7AFC7Ae6a31ab1bB1ccBD1ffc6f4Be9A"; // Pool key is fixed by the factory: dynamic fee flag, tick spacing 60, WonkHook. const DYNAMIC_FEE_FLAG = 0x800000; const TICK_SPACING = 60; // Sorted by address, not base first. This is the one step that silently // returns a wrong-but-valid id if you skip it. function poolIdOf(token, base = zeroAddress) { const [currency0, currency1] = BigInt(base) < BigInt(token) ? [base, token] : [token, base]; return keccak256( encodeAbiParameters( [{ type: "address" }, { type: "address" }, { type: "uint24" }, { type: "int24" }, { type: "address" }], [currency0, currency1, DYNAMIC_FEE_FLAG, TICK_SPACING, HOOK] ) ); }
With the id in hand, everything else is a view call. The functions below are the ones the app itself reads.
| Read | Call |
|---|---|
| Launch record | WonkHook.launches(poolId) |
| Pool orientation | WonkHook.baseIsCurrency0(poolId) |
| Fee policy, live | WonkHook.feePolicy(), returns (swapFee, protocolShare, treasury) |
| Unclaimed fees | WonkHook.pendingFees(poolId, token) |
| Graduation target for a base | WonkConfigRegistry.baseCurve(base), returns (startAmount, fillAmount) |
| Exact raise to graduate | WonkConfigRegistry.baseFillAmountActual(base) |
| Enabled bases | WonkConfigRegistry.getEnabledBases() |
| Creator tax ceiling | WonkConfigRegistry.maxTaxBps() |
| Total supply constant | WonkLauncherFactory.TOTAL_SUPPLY(), 1e27 |
| Remaining raise | PositionManager.getPositionLiquidity(mainBandTokenId). Answers 0 once graduated, because the band is withdrawn whole. |
| Spot price | StateView.getSlot0(poolId) |
| Quote a trade | V4Quoter. It runs the real hook, so a quote includes the fee and the tax. |
StateView and PoolManager with a pool id. Uniswap v4 has no per-pool contract, so there is no slot0() to call on a pool address the way there was in V3.Indexer API
If you do not want to index the chain yourself, Wonk's own indexer answers GraphQL over HTTP, and a WebSocket per token for live market and discussion updates. It is the same API the app uses.
| GraphQL | https://api.wonk.fun/graphql |
| WebSocket | wss://api.wonk.fun/v1/tokens/{token}/market-stream |
| Deadline | The backend enforces its own 10s query deadline and answers DEADLINE_EXCEEDED. |
Every paged response carries a checkpoint { blockNumber timestamp }. Check it before trusting a figure: it tells you how far behind the chain the answer is, and it is the fastest way to tell an indexer that is merely lagging from one following the wrong chain.
// The newest launches, the same query the home page runs
const r = await fetch("https://api.wonk.fun/graphql", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
query: `query { discoverLaunches(order: NEW, first: 5) {
nodes { token { address symbol } market { poolId } bondingProgressBps }
endCursor hasNextPage
} }`,
}),
});
Reference token
A graduated coin is the most useful thing to validate an indexer against, because it exercises the whole path: launch, curve trades, the crossing swap, and post-graduation swaps in the same pool.
| Field | Value |
|---|---|
| Token | WONK — 0x548Df4bF91624D8cEC46d606211EB13f7492e27E |
| Base | USDC (native) |
| Pool id | 0x86bbf4b57ee899dfa5eb9f948b28f287d0d7987b96a3738abde25e1f53f78e52 |
| Status | Graduated. It is also whitelisted as a base asset, so coins are launched against it. |
A second graduated coin, priced in WONK rather than in the native coin, is the one to check a mirrored pool key against:
| Token | WONKCAT — 0xc7e3cc5ba37901396feda469c700ca9070aa418f |
| Base | WONK — 0x548Df4bF91624D8cEC46d606211EB13f7492e27E |
| Pool id | 0x1a60e8ee926421357f8547f0ccdc991fe00b47e892aa644e0f2040d6cf612307 |
Recompute both ids with poolIdOf from Reading token state and check them against the poolId the indexer reports. If they match, your key, your sort order and your hook address are all correct, which is where integrations usually go wrong.
Support
For integration questions, technical support, and partnership requests:
- X: @wonk_fun
- Telegram: t.me/wonkdotfun
Versioning means new addresses, not upgrades. Deployed contracts are immutable, so a new version ships as a new factory and a new hook, and because the hook is part of every pool key, every pool id changes with it. Coins from an older deployment stay tradeable at their own addresses but are invisible to the new one. Always pin the addresses under Contracts for the version you integrated against.
Terms and attribution
Onchain data is public and free to read. You are responsible for how you use it. Wonk is provided as is, without warranties, and the team is not liable for losses arising from integrations, interfaces, RPCs, or indexers.
- When you reference Wonk, write the name as "Wonk" or "wonk.fun" and link back to the app.
- Do not present third-party services as operated by Wonk.
- Do not imply a partnership, endorsement, or official status without a written agreement.
- Availability of interfaces and public infrastructure is not guaranteed.
The full terms and the privacy policy live on the app: wonk.fun/terms and wonk.fun/privacy.