wonk.fun docs
Open app

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

Network nameArc
Chain ID5042
RPC URLhttps://rpc.mainnet.arc.io
Currency symbolUSDC
Block explorerhttps://arc.etherscan.io

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.

  1. 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.

  2. 02

    Trade

    Buys and sells move price through the main band. Every trade reports its own progress toward graduation as progressBps.

  3. 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.

ParameterValue
Curve typeSingle Uniswap v4 pool with a concentrated main band, priced by WonkHook. Tick spacing 60, dynamic fee flag 0x800000.
Total supply per launch1,000,000,000 tokens, 18 decimals, minted once and never again
Supply split80% main band (tradeable), 20% tail band (locked at launch)
Launch feeNone. Gas only.
Anti-bot / wallet cap at launchNone. 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 taxOptional, chosen at launch, ceiling 10% (1000 bps, from maxTaxBps())
The pre-buy is worth understanding before you trade a brand new coin: a creator can take a large share of the main band in the same transaction that creates it. Read the launch transaction, not just the chart.

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.

PriceThe current price in the coin's own pool.
Market capPrice multiplied by circulating supply.
FDVPrice multiplied by the full token supply. Supply is fixed at launch and never grows, so the two readings coincide.
Price impactThe price movement caused by the size of your trade.
SlippageThe maximum execution movement your transaction accepts, enforced as amountOutMinimum by the router.
LiquidityAssets available in the pool around the current price.
Fees are charged on the unspecified leg of a swap, not always in the base asset. A buy that specifies exactly what it spends pays its fee in the launched token. V4Quoter runs the real hook, so a quote already accounts for this.
Spending an ERC-20 takes two permissions, not one. The Universal Router pulls an ERC-20 through Permit2, so the token must allow Permit2 (a transaction) and Permit2 must allow the router (a signature, replayed inside the swap). Selling a coin therefore asks for both the first time. A buy paid in native USDC needs neither.

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.

Graduation threshold is per base asset, read from 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.

ParameterValue
Post-graduation poolThe same pool. Same pool id, same PoolManager, same hook.
Post-graduation pool fee tierDynamic fee flag 0x800000. The pool charges 0 and the hook takes the real fee, which is 1% (100 bps).
Liquidity lockPermanent. 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 delayNone. 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.

SplitShare
Swap fee1% of the trade (100 bps, from WonkHook.swapFeeBps())
Creator royalty99% of that swap fee
Protocol share1% of that swap fee (100 bps, from WonkHook.feePolicy()), paid to the Treasury
Creator taxSeparate 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 minOut bounds, which is why a claim can revert with SlippageExceeded.

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.

NetworkArc
Chain ID5042
Native assetUSDC, 18 decimals at the EVM level
Public RPChttps://rpc.mainnet.arc.io
Explorerhttps://arc.etherscan.io
Multicall30xcA11bde05977b3631167028862bE2a173976CA11
Curve fee1% (100 bps), taken by the hook. The pool's own fee is 0.
Launch feeNone. Gas only.
Default supply1,000,000,000 tokens, 18 decimals
Arc's native coin is USDC, and it has 18 decimals where the EVM can see it — 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

ContractAddress
WonkLauncherFactory0x34f3DA4D04394173DED7b0f430af114a0fF27952
WonkHook0x21bdc377265e2A26ba336F24381E67e768253044
WonkConfigRegistry0xA94601CB7AFC7Ae6a31ab1bB1ccBD1ffc6f4Be9A
WonkLauncherLocker0x0a787cF22782418381D4A5eEf0C492Acb5cC4839
Treasury0x57658a42a8881F2C5286c501457C8e23EFC4649B

Uniswap v4 on Arc

ContractAddress
PoolManager0x8366a39CC670B4001A1121B8F6A443A643e40951
StateView0xF3334192D15450CdD385c8B70e03f9A6bD9E673b
V4Quoter0x8Dc178eFB8111BB0973Dd9d722ebeFF267c98F94
UniversalRouter0x4fcA4a51Ab4F23A7447b3284fBd7D73289A89Fb1
PositionManager0x6049c9a0e26405C0985f9E3685C87d0aE917f82B
Permit20x000000000022D473030F116dDEE9F6B43aC78BA3
The hook address is part of every pool key, so it decides every pool id. A launch made against a different Wonk deployment is invisible to this one, and that is by design rather than a bug. Pin the addresses above; do not resolve them at runtime from another source.

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.

BaseAddress and decimals
USDC0x0000000000000000000000000000000000000000 (native), 18 decimals
WONK0x548Df4bF91624D8cEC46d606211EB13f7492e27E, 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.

BaseOpens atGraduates at
USDC3,033.75 USDC8,090 USDC
WONK758,437.5 WONK2,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.

EventSignature 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
Every topic0 above was computed from the ABIs this deployment actually uses. The contracts were renamed from an earlier generation, but the event signatures were not, so a topic0 from those docs still matches here — the contract addresses are what changed.

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.

ReadCall
Launch recordWonkHook.launches(poolId)
Pool orientationWonkHook.baseIsCurrency0(poolId)
Fee policy, liveWonkHook.feePolicy(), returns (swapFee, protocolShare, treasury)
Unclaimed feesWonkHook.pendingFees(poolId, token)
Graduation target for a baseWonkConfigRegistry.baseCurve(base), returns (startAmount, fillAmount)
Exact raise to graduateWonkConfigRegistry.baseFillAmountActual(base)
Enabled basesWonkConfigRegistry.getEnabledBases()
Creator tax ceilingWonkConfigRegistry.maxTaxBps()
Total supply constantWonkLauncherFactory.TOTAL_SUPPLY(), 1e27
Remaining raisePositionManager.getPositionLiquidity(mainBandTokenId). Answers 0 once graduated, because the band is withdrawn whole.
Spot priceStateView.getSlot0(poolId)
Quote a tradeV4Quoter. It runs the real hook, so a quote includes the fee and the tax.
Read the pool through 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.

GraphQLhttps://api.wonk.fun/graphql
WebSocketwss://api.wonk.fun/v1/tokens/{token}/market-stream
DeadlineThe 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
    } }`,
  }),
});
CORS is allowlisted per origin. If you are calling from a browser on your own domain, ask the team to add it, otherwise a preflight is refused and the browser discards every reply.

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.

FieldValue
TokenWONK — 0x548Df4bF91624D8cEC46d606211EB13f7492e27E
BaseUSDC (native)
Pool id0x86bbf4b57ee899dfa5eb9f948b28f287d0d7987b96a3738abde25e1f53f78e52
StatusGraduated. 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:

TokenWONKCAT — 0xc7e3cc5ba37901396feda469c700ca9070aa418f
BaseWONK — 0x548Df4bF91624D8cEC46d606211EB13f7492e27E
Pool id0x1a60e8ee926421357f8547f0ccdc991fe00b47e892aa644e0f2040d6cf612307

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:

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.