1 · Overview
Every UTC day has a shape: mountain, W, stairs, cup, spike and 19 more. Coins launched on Sketch Pad are ordinary pump.fun coins, and the program samples each coin's price on chain all day. After midnight it scores how closely the day's chart drew the shape. A coin-day qualifies at 70% or more, with 50 traders through the Sketch router, enough volume and a real price range. Qualified coins share the day's payout from the pot; inside a coin, the traders share it by the volume they traded through Sketch.
Compromise, in plain words. pump.fun coins trade everywhere and have no transfer hook, so Sketch cannot see or tax trades on other venues. The chart and the score are on chain and count every trade. Only trades through the Sketch router count as traders and share the pot. Trade on Sketch to be in the drawing.
| Stage | When | Who | What happens |
|---|---|---|---|
| Launch | any time | the dev | pump create_v2 by CPI, creator = the coin's Fees account; launch fee into the pot. The coin plays from the next day. |
| Draw | 00:00–24:00 UTC | the market + the keeper | price sampled into 144 ten-minute sub-windows; router trades counted per wallet |
| Score | after the day, 1 h window | anyone | score computes the published formula for each coin-day |
| Finalize | after the score window | anyone | ≥ 1 qualified coin: 50% of the pot is reserved; none: the pot rolls |
| Claim | 7 d after finalize | anyone (pays the trader) | each counted trader's share; the keeper pushes unclaimed ones halfway |
| Expire | after the claim window | anyone | whatever was not paid returns to the pot |
2 · The day and its shape
day = floor(unix time / 86400). The shape of day d is u64_le(sha256("sketch" || u64_le(d))[0..8]) mod 24. It is known in advance by design: that is the game. The 24 templates are 48 points each (i8, −100..100), stored in the program; the catalogue draws them all.
3 · The sampler
sample is permissionless (the keeper sends it; the coin page has the same button). It reads q = log2(SOL reserves) − log2(token reserves) in Q16 from the pump curve, or from the coin's canonical PumpSwap pool after migration.
- One stored value per 10-minute sub-window. The first reading of a sub-window is stored; later readings replace it only if they are strictly closer to the previous sub-window's value. A
[pump, sample, dump]bundle stores a price nobody held, and the next honest reading undoes it: painting a point needs the price held, exposed to every seller. samplemust be alone in its transaction (other samples, ComputeBudget and System only).- Bucket = median of its 3 sub-windows (2 → mean, 1 → it); a bucket with no sample carries the previous one.
4 · The score (published formula)
Integer math in the program; the site runs the same function (the kit's mirror, bit for bit) on your trace and on every live chart.
- x = the 48 bucket values (Q16 log2 price), t = the day's template.
- Centre: x′i = 48·xi − Σx, t′i = 48·ti − Σt. A flat chart scores 0.
- Pearson r = Σ(x′t′) / √(Σx′² · Σt′²).
- z-normalise both series (Q12), DTW with a Sakoe-Chiba band of 3 buckets, cost |zx − zt|; D = the path cost at (47, 47).
- dtw = max(0, 1 − D / (48 × 0.6)) (0.6 z per point = no resemblance).
- score = ½ max(0, r) + ½ dtw.
Calibration on 48,000 random-walk days: a random chart reaches 70% on about 1.2% of coin-days; a chart drawn with 20% noise qualifies 97% of the time. A perfect drawing of any template, at any scale or offset, scores 100%.
5 · Qualifying
The first failing reason is recorded on chain:
| # | Reason | Rule |
|---|---|---|
| 1 | launched that day | coins play from the day after their launch |
| 2 | too few samples | ≥ 36 of 48 buckets sampled |
| 3 | price range too small | max / min of the 48 buckets ≥ 1 + 20% |
| 4 | shape not drawn | score ≥ 70% |
| 5 | too few traders | ≥ 50 wallets with ≥ 0.05 SOL counted through the router |
| 6 | volume too low | counted router volume ≥ 5 SOL |
6 · The pot
Each coin's pump.fun creator is its Fees account on Sketch. Anyone can collect: new creator fees split 50% to the pot, 30% to the dev, 20% to the treasury. Launch fees (max(0.02 SOL, 2.5% of the dev buy)) and donations go to the pot too. A day with qualified coins reserves 50% of the pot; a day without rolls it to tomorrow.
7 · The claim
For a counted wallet on a qualified coin-day:
claim = min( payout × wcoin / W × counted / Vcoin , payout × 5% , fees paid × 70% )
In plain words: the prize is a fee-back. A wallet gets at most 70% of the pump fees it paid on that coin-day, so for most traders the fee cap is what they receive.
wcoin = score × the coin's counted volume, W = the sum over qualified coins, counted = max(the wallet's buys, sells) that day (a round trip counts once). The fee cap means no wallet, not even the coin's dev with the creator-fee rebate, gets back what it paid in fees: washing never pays. Sums are floored; dust and capped remainders return to the pot at expire.
8 · Worked example
The pot holds 20 SOL. Today's shape is a W. Two coins qualify: A scores 82% with 30 SOL of counted volume, B scores 74% with 10 SOL. Payout = 50% of 20 = 10 SOL. wA = 0.82 × 30 = 24.6, wB = 7.4, W = 32. Coin A gets 10 × 24.6 / 32 = 7.69 SOL. A wallet that traded 1.5 SOL on A (and paid 0.019 SOL in pump fees) would get 7.69 × 1.5 / 30 = 0.38 SOL, capped at 5% of the payout (0.5 SOL) and at 70% of its fees: 0.013 SOL. The fee cap binds for small wallets; the rest returns to the pot.
The transactions: launch (dev) → trade through the router (traders) and sample (keeper) all day → score each coin-day → finalize → claim (anyone, paid to the trader) → expire → close_td / close_day / close_round return every rent to whoever paid it.
9 · Parameters (live from the config account)
| Parameter | Value | Meaning |
|---|
Params apply to coins launched and days opened after a change; a day's rules are frozen at its first activity.
10 · Program reference
Program id
| Account | Seeds | Holds |
|---|---|---|
| Config | ["config"] | admin, treasury, day length, params, the vault's books and lifetime stats |
| Vault | ["vault"] | pot + reserved payouts + the treasury share |
| Coin | ["coin", mint] | dev, name, fee split, sampler state, stats |
| Fees | ["fees", mint] | the coin's pump.fun creator (creator fees land here) |
| Round | ["round", day] | the day's shape, rules, results, payout |
| Day | ["day", mint, day] | 144 samples, router totals, score |
| TraderDay | ["td", mint, day, wallet] | a wallet's buys, sells, fees on one coin-day |
| Instruction | Who | What |
|---|---|---|
| launch | the dev | pump create_v2 + optional dev buy, alone in its tx |
| sample | anyone | price into today's Day under the sub-window rule |
| trade | a trader | the router: pump / PumpSwap buy or sell by CPI, books the TraderDay |
| collect / unwrap_fees | anyone | creator fees into the pot / dev / treasury split |
| claim_dev / pay_treasury | anyone | pays the dev / the treasury only |
| donate | anyone | SOL into the pot |
| score / finalize / expire | anyone | the day's close |
| claim | anyone | pays a counted trader of a qualified coin-day |
| close_td / close_day / close_round | anyone | rent back to whoever paid it |
| update_config / set_treasury / set_paused / propose_admin | admin | see Admin powers |
11 · Errors
| Code | Name | Message |
|---|
12 · Verify on chain
- Recompute today's shape: sha256 of "sketch" followed by the day number (u64 little endian), first 8 bytes as u64 LE, mod 24.
- Read any Day account (
["day", mint, day]): 144 samples + a bitmap. Rebuild the 48 buckets with the median rule and run the formula above: you get the same score the program stored. - Check the vault: lamports = rent floor + pot + reserved + treasury owed.
- Every claim transaction pays the TraderDay's own wallet, never a third party.
- The lifetime books hold: launch fees + pot from fees + donations = pot + reserved + paid out.
13 · Admin powers
THE ADMIN CAN
- change params inside hard bounds (for coins launched and days opened afterwards)
- pause launches (trading, sampling, scoring and claims keep working)
- change the treasury address
- hand the admin role over in two steps
- close the pad: pause launches; every pot, claim and rent stays claimable by the same instructions
THE ADMIN CANNOT
- move the pot, reserved claims or anyone's fees
- change a day's rules after its first activity
- score, qualify or pay a coin by hand
- stop anyone from sampling, scoring, finalizing or claiming
- change pump.fun's own admin powers over coins (pump can reassign creator fees)
14 · Risks
- Only router trades share the pot; the chart counts every trade on every venue.
- A held pump on a thin coin can paint a point. It is real trading, exposed to every seller: that is the game.
- A random chart reaches 70% on about 1.2% of coin-days; it still needs 50 router traders and volume.
- Liveness: if nobody samples, buckets carry forward (a flat chart does not qualify); if nobody scores inside the window, that coin-day misses the payout. Anyone can do both.
- The program is upgradeable. pump.fun keeps admin powers over its coins.
15 · FAQ
- How much can I win?
- At most 70% of the pump fees your wallet paid on that coin that day, and at most 5% of the day's payout. Sketch is a fee-back prize for trading a coin that drew the shape, not a jackpot: a trader who paid 0.02 SOL in fees gets back up to 0.014 SOL.
- Why do my trades on another app not count?
- pump.fun coins have no transfer hook: the program only sees trades that go through it. The chart still moves.
- Can I wash-trade my way into the pot?
- No. A round trip counts once, and no wallet gets back more than 70% of the pump fees it paid.
- I launched today. Why is my coin not in the drawing?
- Coins play from the day after their launch, so nobody can launch into a shape half drawn.
- Nobody qualified. Where is the money?
- In the pot, for tomorrow. It only pays out on a day with a qualified coin.
- Do I have to claim?
- You can claim from Mine any time in the claim window; the keeper pushes unclaimed claims to your wallet halfway through it.