How COOK works
Every feature, how the money moves, what is on chain and what is a promise, and every API route. Plain words, real numbers.
Overview
COOK launches memecoins on Meteora's Dynamic Bonding Curve, protects the first minute of every launch, and gives every coin a fee recipe that pays for buybacks, burns, developers, holders and people.
Every coin here is a real Meteora coin: a Dynamic Bonding Curve (DBC) pool, quoted in SOL, that graduates to a Meteora DAMM v2 pool. There is no COOK token. What COOK adds is everything around the launch: who creates the coin, what happens in its first minute, and where its trading fees go.
- One master wallet launches every coin. It pays the rent and takes no bag. It is the treasury, and it collects the pool's trading fees.
- The first minute is protected. Buys in the pool's first slot pay a higher fee, enforced on chain. After the first 60 seconds, big early buyers owe a surcharge that is recovered from their later payouts and used to buy back and burn the coin. See Launch protection.
- Every coin has a fee recipe. The recipe is frozen at birth. At least a third of the fees buys the coin back and burns it, a third is the developer's rewards (vested by milestones), and a third is the house pool for referrals, callers and creators. See Fees.
- Copies wait an hour. A ticker or name that launched in the last 60 minutes cannot launch again. After that it is allowed, and labelled as a reuse. See Anti-vamp.
- Every lamport is journaled. Fee claims, buybacks, burns, payouts and referral rewards are written to a public ledger, each with its transaction signature. Waiting money is never called burned. See Transparency.
- One wallet, in your browser. The COOK wallet is made on this device, locked with your passcode, and signs your trades. We never see its key.
- Traders are on the record. Callouts carry the caller's live position and say whether they were paid. Profiles show PnL read from the chain.
How a coin is born
- 1You fill in the create form
Name, ticker, picture and the recipe. The anti-vamp check runs as you type. The coin is paired with SOL; there is nothing else to pick.
- 2The server checks it
The 60-minute cooldown, the launch limits, the recipe rules (see Fees) and any paid part, which must have been paid for on chain.
- 3The treasury creates the pool
It signs one Meteora DBC pool creation with a fresh mint. The pool uses COOK's one shared fee config, so every coin has the same curve, the same fee and the same launch schedule.
- 4Trading opens
The first slot charges the base fee plus 10%. From the second slot on, the base fee applies. The site watches the first 60 seconds.
- 5The crank keeps the recipe
Every few minutes the crank claims the pool's fees, splits each claim by the coin's recipe into buckets, and spends each bucket on its job. Every move goes into the ledger.
What a recipe can do
| slice | what the fees do | cost at launch |
|---|---|---|
| Buyback & burn | buy the coin back on its own market and burn what was bought (at least a third of every coin's fees) | free |
| Developer rewards (wallet) | pay the developer's wallet, vested by milestones | free |
| Stocks to holders | buy a basket of tokenized stocks and drop it on holders, pro rata | paid |
| SOL to holders | pay SOL to every eligible holder by their share | free |
| Thinking | buy AI time for the coin's brain, which drafts posts, campaigns and small apps | paid |
| Social route | pay any X, Instagram or TikTok account; the owner claims it | paid, per account |
| House | the incentives pool: referrals, callers, creators. Exactly a third, not set by the launcher | n/a |
New here? Go to Quick start. Want the money rules? Read Fees and Launch protection. Building on it? The API reference lists every public route.
Quick start
Create a coin in about a minute. Without paid parts you pay nothing: the treasury pays the pool's rent.
- 1Make your COOK wallet (once)
Press Sign in, then Create COOK wallet: pick a passcode, back the key up, done. You are signed in at once. Your wallet is also where developer rewards are paid. See The COOK wallet.
- 2Open Create
The + in the left rail or the top bar. On a phone it is the + in the bottom tab bar.
- 3Name it
A coin name (up to 32 characters) and a ticker (2 to 10 plain letters or digits). The live check under the field tells you straight away if the ticker or name launched in the last hour, and if a lookalike exists.
- 4Add a picture
PNG, JPG, WebP or GIF. It is cropped square. A copy of a recent coin's picture, even resized or recompressed, is flagged during the cooldown.
- 5Write the recipe
The form starts at the default: a third buyback and burn, a third developer rewards to your wallet, a third house. Move the developer's third into other slices if you want. The buyback can only go up. See Fees.
- 6Check protection
Anti-bundle exclusion is on, with a hold time. Leave it on unless you have a reason: it keeps bundlers and first-slot snipers out of holder payouts.
- 7Pay for paid parts, if any
The cost summary shows the total. If it is above zero you sign one SOL transfer to the treasury from your signed-in wallet. See Paid features & pricing.
- 8Create coin
The coin is reserved at once and goes live when its pool creation lands, usually within seconds. You land on its page. Share it from there.
After the launch
- The coin page shows the recipe as a pill split into slice colours, each bucket's earned, spent and waiting, and the burn counter (tokens actually burned, with transaction links).
- For the first 60 seconds the page shows the launch window. After it closes, the page shows what was assessed and what has been recovered.
- The developer sees a milestone card: what is unlocked (25% at day 7, 50% at day 14, 100% at day 30), what is withheld, and why.
- Accounts you routed fees to can claim them at Rewards once they prove the account is theirs.
Prefer code? The same launch is two calls: POST /api/quote then POST /api/launch.
Venue (Meteora DBC)
Every coin is a Meteora Dynamic Bonding Curve pool, quoted in SOL. COOK has no token of its own.
COOK uses Meteora's Dynamic Bonding Curve program and nothing else. One shared DBC config, created once by the team, defines the curve, the fee schedule and what happens at graduation. Every pool created by the treasury points at that config. There is no pair to pick: the quote is SOL (wrapped).
What every coin looks like
| value today | |
|---|---|
| supply | 1,000,000,000, 6 decimals, a standard SPL token (not Token-2022) |
| metadata | immutable; the link is public at /m/<key> |
| quote | SOL only. No COOK token, no stablecoin pairs, no stock pairs |
| opening market cap | 30 SOL by default (DBC_INITIAL_MCAP_SOL) |
| sold on the curve | about 78.5% of the supply (the launch allocation, 785,014,831 coins by default) |
| graduation | at a market cap of 400 SOL by default (DBC_MIGRATION_MCAP_SOL), when about 86 SOL is in the pool, into a Meteora DAMM v2 pool with a 1% pool fee |
| trading fee | 3% by default (COOK_FEE_BPS = 300). Not final; the team may change it for new coins |
| first slot | base fee plus 10% (COOK_BLOCK0_BPS = 1000), enforced by the pool's fee scheduler |
| Meteora's cut | 20% of every trading fee goes to Meteora's protocol. The treasury receives the rest (2.4% of volume at a 3% fee) |
| creator fee share | 0. The pool pays the treasury, and the recipe pays people (so rewards can vest and be withheld) |
Curve, graduation, trading
The coin first trades on the bonding curve. When it reaches the graduation market cap, the pool migrates to a DAMM v2 pool. The treasury's share of the liquidity there is locked (100% by default, DBC_PARTNER_LOCK_PCT), so COOK can keep earning pool fees after graduation. Those fees are meant to be booked like curve fees and follow the same recipe, but claiming them is not built yet, so today a graduated coin's recipe is fed only by what was claimed on the curve and by Meteora's partner surplus at migration. On the site, curve trades are built by our server and checked in your browser before your wallet is asked; after graduation the site asks Jupiter. See Trading on the site.
Fees and costs
- Cost to launch: paid by the treasury: the pool's rent, two vaults, the mint and its metadata, and network fees. We measured about 0.02 SOL, and the treasury keeps 0.025 SOL in reserve per launch.
- Cost to the launcher: nothing, unless the recipe has paid parts.
- Cost to a trader: the pool's trading fee, which Meteora's program takes inside each swap. Nothing is charged on top by the site.
Fees
A trade pays the pool's fee. Meteora keeps a fifth. The treasury splits the rest by the coin's recipe, in thirds.
What a trade pays
Every swap on a COOK pool pays the pool's trading fee, taken inside Meteora's program. By default that is 3% (COOK_FEE_BPS = 300). It is not final and can change for new coins. In the first slot of a pool it is 3% plus 10% (see Launch protection).
Meteora's protocol keeps 20% of every trading fee, so at a 3% fee the treasury receives 2.4% of volume. The treasury is the pool's fee claimer. The pool pays no share to a creator wallet: developer rewards go through COOK so they can vest and be withheld.
How the treasury splits it
When the crank claims a coin's fees, it books the claim in two parts. Each part has its own bucket.
- guard part
- the money earned above the base fee during the launch window (the first-slot extra) plus every surcharge recovered from early buyers. It goes to the coin's guard bucket: 100% buys that coin back and burns it, kept apart from everything else.
- normal part
- everything else. It follows the coin's recipe.
The recipe rules
| slice | share of the normal part | what it is |
|---|---|---|
| buyback & burn | at least 33.33% | the coin's ecosystem buyback. The launcher can raise it, never lower it |
| house | exactly 33.34% | the incentives pool for referrals, callers and creators. The launcher cannot change it |
| the developer's third | the other 33.33%, the launcher's to shape | default: a wallet slice paying the launcher, vested by milestones. It can be split into stocks, SOL to holders, a brain, social routes, other wallets, or more buyback |
How buybacks run
- Buybacks run in controlled batches, not as one big buy. Each pass has a minimum and a maximum spend, a price-impact cap, and retries smaller when the market is thin.
- Today the crank buys through Jupiter, which routes Meteora pools before and after graduation. A direct buy on the curve is planned.
- Everything the treasury bought is burned in the same pass. Nothing is kept.
- No buyback runs during a coin's launch window.
- Every step is journaled with its signature, pending first, then confirmed or failed. See Buyback & burn.
Launch protection
The first slot pays more, on chain. Big early buyers owe a surcharge, assessed after the first minute and recovered from their payouts. All of it buys the coin back and burns it.
A launch is easiest to farm in its first seconds. COOK has two layers against that. One is enforced by the pool itself. The other is kept by COOK, and it can only take money the buyer was already going to receive from that coin.
| layer | what it does | who enforces it |
|---|---|---|
| 1. First slot | buys in the pool's first slot pay the base fee plus 10% | on chain: Meteora's fee scheduler, set in the pool's config |
| 2. Per-wallet surcharge | a wallet that buys a lot in the first 60 seconds owes a surcharge by bracket | assessed by COOK from the chain, recovered from that wallet's later payouts from this coin |
| 3. Guard bucket | the extra money buys the coin back and burns it | COOK's crank, journaled in the public ledger |
Layer 1: the first slot (on chain)
The pool's fee scheduler charges the base fee plus 10% in the slot the pool is created in. From the next slot on, only the base fee applies. Anyone who buys in that first slot, a sniper or a bundle, pays it on every token. Nobody has to trust us for this: it is in the pool's config. By default the extra is 1,000 bps (COOK_BLOCK0_BPS).
Layer 2: the 60-second window (assessed)
Meteora's curve cannot charge a different fee to each wallet. So COOK works it out afterwards. The launch window is the first 60 seconds after the pool is created (COOK_WINDOW_SEC). When it has closed, the crank reads every buy in the window from the chain and adds up each wallet's buys.
Each wallet's total is compared to the launch allocation: the supply the curve sells. The share it bought sets which brackets apply:
| share of the launch allocation bought | surcharge rate |
|---|---|
| under 0.5% | 0% |
| 0.5% to 1% | 2% |
| 1% to 2% | 4% |
| 2% to 3% | 6% |
| 3% to 5% | 10% |
| over 5% | 15% |
These rates are today's defaults. The rate is a share of the SOL spent on the part of the buy that falls in that bracket.
The marginal method (like tax brackets)
A wallet is never charged its top rate on everything. Its buys are taken in order. Each buy moves the wallet's running total up. The part of the buy that lands in each bracket pays that bracket's rate on the SOL spent for that part.
| buy | total after | split by bracket | surcharge |
|---|---|---|---|
| 1: 0.4% for 1.00 SOL | 0.4% | 0.4% in the 0% bracket | 0 SOL |
| 2: 1.1% for 2.75 SOL | 1.5% | 0.1% at 0% (0.25 SOL), 0.5% at 2% (1.25 SOL), 0.5% at 4% (1.25 SOL) | 0 + 0.025 + 0.050 = 0.075 SOL |
The wallet owes 0.075 SOL. If its top bracket (4%) hit everything it bought, it would owe 0.150 SOL. On a real curve the price rises as people buy, so the SOL in each part differs; the method is the same. Each buy is rounded down to the lamport.
Layer 3: recovery, never invention
An assessment is a number COOK says a wallet owes. COOK does not reach into wallets. It withholds from money the wallet would have received from that coin anyway, until the assessment is covered:
- SOL to holders and stock drops from this coin;
- holder, trader, referral and caller rewards paid for this coin;
- developer rewards, when the wallet is the coin's developer.
A wallet is never charged more than it was assessed, and nothing is taken any other way. Whatever is withheld goes to the coin's guard bucket. If a wallet never receives a payout from the coin, nothing is taken. The coin page says assessed (what the arithmetic says) and recovered (what has actually been withheld), for example "assessed 0.42 SOL, recovered 0.10". It never says "collected" for an assessment.
Payouts of a new coin wait a short time (30 minutes by default, COOK_GUARD_GRACE_MIN) so the assessment is done before the first money moves.
Where the money goes
The guard bucket is segregated: it has its own ledger entries and its own totals. 100% of it buys that same coin back and burns it, once it holds about 0.01 SOL. It never pays developers, referrals or the house.
What this does not do
- It does not stop anyone buying. It prices early size.
- A wallet that holds nothing it will ever be paid for can keep its surcharge unpaid. The surcharge is recovered only from payouts, so a wallet that receives none owes nothing in practice. The page shows the open amount.
- Wallet clustering (shared funders, mirrored buys) is shown beside an assessment as a risk signal. It is a heuristic, not proof. A group of wallets is assessed wallet by wallet.
- Reading the window needs a full RPC. When the opening cannot be read completely, the assessment is marked partial and says why.
- COOK can switch to a simpler mode (
COOK_GUARD_MODE=decay) where the pool's fee itself falls from 15% above base to the base fee over the window, and every early buyer pays by time. The default is the bracket mode described here.
Anti-vamp
A ticker or name that launched in the last 60 minutes cannot launch again. One X account belongs to one coin.
Vamping is copying a coin that is working (its ticker, its name, its picture) so the copy farms its story. COOK uses a cooldown: the same ticker or name as a coin that launched less than 60 minutes ago is refused (ANTIVAMP_COOLDOWN_MIN). After the hour it is allowed, and the new coin is labelled "ticker reused" with a link to the first coin. Every launch is checked before the master wallet signs anything, and each refusal names the rule and the coin it collides with.
1. One ticker, for an hour
Tickers are folded before they are compared: case, a leading $, spaces and accents are ignored, letters from other alphabets that look Latin (Cyrillic, Greek, small capitals) become the Latin letter, and leetspeak becomes letters (0=o, 1=i, 3=e, 4=a, 5=s, 7=t, 8=b, @=a, $=s, !=i, |=i). While a coin with that folded ticker is inside its cooldown, the ticker is taken. The check runs under a lock on the folded ticker, so two launches of the same ticker at the same instant cannot both get through.
$PEPEpepeone tickerpepepepeone tickerP3P3pepeleetspeakone tickerPеpepepeCyrillic еone tickerP E P Epepespacesone ticker2. Lookalike tickers (warning)
Once the longer of two tickers has 5 or more characters, a ticker one edit away (one character added, removed or swapped for another) is flagged. During the cooldown it is a warning shown beside the form, not a refusal. After the cooldown it is not flagged. Short tickers are left alone: $CAT does not flag $CAR.
3. Name similarity
Names are folded the same way, then filler words are dropped: the, a, an, of, coin, token, official, real, og, new, v2, v3, 2, 3, reborn, returns, classic, original, finance, fi, on, sol, solana. Two names are the same if what is left matches, or if their words score 0.92 or higher on a word-overlap / Jaro-Winkler similarity in any order. "Official Pepe Coin", "pepe 2" and "The Real PEPE" are all "pepe".
4. Picture hash (warning)
Every picture gets a 64-bit perceptual difference hash (dHash) when it is uploaded. A new picture within 6 bits of any existing coin's is flagged as a copy, even resized, recompressed, cropped a little or lightly recoloured. Like a lookalike ticker, it is a warning during the cooldown.
5. One X account per coin
A coin can link one X account as its community. The first coin to link an account owns it: no second coin can launch with the same account, cooldown or not. This one is permanent, because it stops impersonation.
6. Outside-liquidity check
When the operator switches it on (ANTIVAMP_EXTERNAL=1, off by default), a ticker that already trades elsewhere on Solana with at least $20,000 of liquidity (ANTIVAMP_MIN_LIQUIDITY_USD, looked up through Jupiter's token search) is refused too. If the lookup fails, the pad's own checks still hold and the launch is not blocked by the outage.
7. Reserved tickers
Nobody can launch the platform's own names or the majors a vamp would use to look official: SOL, WSOL, USDC, USDT, USD, BTC, WBTC, ETH, WETH, BNB, XRP, ADA, DOGE, TRX, TON and a few site names (and anything that folds to them).
8. Plain tickers
A ticker is 2 to 10 plain letters or digits (A to Z, 0 to 9); a disguised one is reported as the collision it is. The checks run before anything is signed.
Refusal codes
| code | meaning |
|---|---|
INVALID | the ticker, name or X link is malformed |
RESERVED | a reserved ticker |
TICKER_TAKEN | the folded ticker launched here less than 60 minutes ago (the answer says when it frees up) |
TICKER_LOOKALIKE | warning only: one character away from a recent ticker (5+ characters) |
NAME_TOO_SIMILAR | the folded name matches a coin that launched less than 60 minutes ago |
IMAGE_COPY | warning only: the picture is within 6 bits of a recent coin's |
X_HANDLE_TAKEN | the X account already belongs to another coin |
EXTERNAL_COLLISION | the ticker trades elsewhere with real liquidity |
The create form runs the same check as you type through GET /api/check. A reused ticker comes back with reused (the earlier coins), and cooldown-time lookalikes and copies come back in warnings.
Anti-bundle & the first slot
The first slot costs extra, on chain, and wallets that bundle the opening do not share in holder rewards.
The first slot
The first slot is the slot a pool is created in. Snipers want it. COOK does not try to hide the pool: it makes the slot expensive. The pool's fee scheduler charges the base fee plus 10% there, on chain (see Launch protection). The creation itself buys nothing for anyone.
- A fresh mint. The mint keypair is made at launch. The metadata link is public at
/m/<key>because it is written into the create. - Listed after it lands. The coin shows on the site only once its create transaction is confirmed.
- Measured. Every coin's Bundles tab shows its creation slot and how many buys landed in it.
Bundle detection
After launch, the opening of the coin's pool (the first 12 slots, BUNDLE_WINDOW_SLOTS) is read and its buyers grouped into clusters that look like one actor. Wallets are joined when they:
- were funded by the same wallet within two hops (busy funders with 1,000+ signatures are ignored);
- bought together in one transaction;
- bought in the same slot with mirrored sizes;
- bought in the same slot and were all freshly made.
Buyers in the creation slot are snipers. The coin gets a bundle score from 0 to 100: the share of the opening that clusters and snipers bought. A cluster holding at least 0.5% of the supply (BUNDLE_FLAG_MIN_PCT) is flagged. Each cluster is listed with its reason and its share of supply. Detection is always on; the score is always shown. The reader has an RPC budget (BUNDLE_MAX_RPC, 120 calls): on a very busy coin whose first trades are out of reach the report says partial and why, instead of guessing.
{
"mint": "7Gx...pump",
"score": 12,
"createSlot": 318204411,
"block0Buys": 0,
"clusters": [
{ "id": "c1", "wallets": ["9aT...", "Hq2...", "4Lm..."], "reason": "same funder within 2 hops", "supplyPct": 3.1 }
],
"flagged": ["9aT...", "Hq2...", "4Lm..."]
}Exclusion from payouts
While a coin's anti-bundle exclusion is on (the default), flagged wallets (bundlers and first-slot snipers) are left out of its stock drops and SOL payouts, and their share goes to everyone else. A launcher can switch the exclusion off at launch; nobody can switch the detection off.
Hold minutes
A wallet is paid only after it has held through the coin's hold time: it must show up in two holder snapshots that many minutes apart. Buying just before a drop and selling right after earns nothing. The launcher sets the hold time on the create page (default 30 minutes, anything from 0 to 1,440); it is frozen with the recipe.
Honest limits
- After the first slot, anyone watching for new pools can buy, like on any Meteora coin. The first-slot fee prices the sniper; it does not make a coin sniper-proof.
- Clustering is a heuristic. A careful actor who funds each wallet separately can look like many people, and friends who all withdrew from the same exchange can look like one. Being flagged only affects holder payouts and risk signals here; it never blocks anyone from trading.
- Bundle flags also feed the developer's milestones: a developer wallet inside a bundle cluster has its rewards withheld.
The fee recipe
Slices of what the treasury receives from a coin, adding up to exactly 100%, frozen on the coin at birth.
A recipe is a list of slices. Each slice has a kind (what the money is for) and a share of the coin's normal part (the fees the treasury receives, minus the guard part), in basis points: 1 bp = 0.01%, so 10,000 bps = 100%. The slices of a recipe add up to exactly 10,000, no more, no less.
Slice kinds
| kind | spent on | settings | at launch |
|---|---|---|---|
buyback | buying the coin back and burning it | none | free |
stocks | a basket of tokenized stocks dropped on holders | 1 to 5 stocks, weights adding up to 100% | paid, per coin |
airdrop | SOL paid to eligible holders by share | none | free |
brain | AI allowance for the coin's brain | persona (up to 280 characters), what it may make | paid, per coin |
social | an X, Instagram or TikTok account's claim wallet | platform + handle, up to 4 per coin | paid, per account |
wallet | a Solana wallet. With no address it pays the launcher: the developer's rewards. On COOK coins it vests by milestones | the address, up to 4 per coin | free |
house | the incentives pool: referrals, callers, creators | forced to exactly 33.34%; whatever a launcher sends is ignored | n/a |
A launcher can use any mix (up to 24 slices as typed; duplicates merge) inside COOK's rules: buyback at least 33.33%, house exactly 33.34%, and the other 33.33% is the launcher's to shape. A launch that sends no recipe gets the default: buyback 33.33%, a wallet slice paying the launcher 33.33%, house 33.34%. If the launcher has no wallet, the developer's third buys back too. Every recipe also carries anti-bundle exclusion (on) and a hold time in minutes (default 30, 0 to 1440): see Anti-bundle.
Frozen at birth
When the coin is created its recipe is written on it and never changes again, for anyone, the house included. Social and wallet slices store the exact address they pay, so a later change of rules can never send a coin's fees somewhere new. Each recipe also carries a version number (v: 1): if the meaning of a field ever changes, old coins keep the rules they launched with.
Buckets: earned, spent, owed
Every slice of every coin has a bucket. The crank books each fee receipt, splits it by the coin's recipe, and adds each part to its bucket.
- earned
- everything this slice has been given from the coin's fee receipts
- spent
- what its job has spent so far: buys, rent, network fees and payouts that confirmed
- owed
- earned minus spent minus moves still pending, never below zero: what is waiting to be spent
{
"kind": "airdrop",
"key": null,
"earnedLamports": "412500000",
"spentLamports": "380000000",
"owedLamports": "32500000",
"lastAt": 1793022000000
}- A bucket only pays for its own job. The stocks bucket never pays for an airdrop; the buyback bucket never pays for a brain.
- A launch never spends bucket money. The launch gate counts the treasury's float as its balance minus everything owed to every bucket.
- The guard bucket is separate. The launch-window money (see Launch protection) has its own bucket and its own ledger entries. 100% of it buys the same coin back and burns it.
- Dust waits. Each job has a minimum, so tiny amounts are not swapped or sent at a loss; they stay owed until the next receipt tops them up.
- Rounding goes down. When a receipt is split by bps, each part is rounded down to the lamport; the leftover lamport or two stays with the treasury.
Buyback & burn
The coin's own fees buy it back on its own market, and everything bought is burned. At least a third of every coin's fees does this.
- 1The bucket fills
Each booked fee receipt adds the buyback slice's share to the coin's buyback bucket.
- 2The treasury buys
On each crank pass, a coin whose bucket owes at least
BUYBACK_MIN_SOL(default 0.01 SOL) is bought back. One buyback spends at mostBUYBACK_MAX_SOL(default 2 SOL); the rest waits for the next pass. Today the buy goes through Jupiter, which routes the coin on its curve and, after graduation, in its DAMM v2 pool. A buyback never runs inside a coin's launch window. - 3The order is checked before signing
Before the treasury signs, the order must spend exactly the planned amount, the treasury must be the only missing signer, and a simulation must show the coin's balance going up by at least 95% of the quote. An order with more than
BUYBACK_MAX_IMPACT_PCT(default 8%) price impact is shrunk once to fit, else it waits. - 4Everything bought is burned
In the same pass, every token of the coin the treasury holds is burned with
BurnChecked, and the emptied token account is closed so its rent comes back. The treasury never holds a coin of this pad past one pass.
Where to see it
- The coin page's Buybacks panel: earned, spent and tokens burned.
- The ledger: a
buybackrow and aburnrow per move, each pending until its transaction confirms, then confirmed or failed, with the signature. - The tape under the top bar ("$TICK burned 1.2M") and the burn boards (first minute, first hour, first day) on the leaderboard.
- Two buckets can feed it: the recipe's buyback slice and the coin's guard bucket. The coin page shows them apart.
Stocks to holders
Fees buy a basket of tokenized stocks and drop it on the coin's holders, pro rata.
The catalog
The stocks slice buys tokenized stocks on Solana: Token-2022 tokens that track a listed share, xStocks (for example TSLAx, NVDAx, AAPLx, SPYx). The catalog is 49 pinned xStocks with real mints and live Jupiter prices; 23 route straight from SOL and 26 go SOL to USDC to the stock (two hops). A stock Jupiter cannot route at that moment cannot be picked. The catalog, with prices and routability, is GET /api/stocks.
AAPLxApple
ABBVxAbbVie
ADBExAdobe
AMDxAMD
AMZNxAmazon
AVGOxBroadcom
BACxBank of America
BRK.BxBerkshire Hathaway
COINxCoinbase
CRCLxCircle
CRMxSalesforce
CSCOxCisco
CVXxChevron
GLDxGold
GMExGamestop
GOOGLxAlphabet
GSxGoldman Sachs
HOODxRobinhood
IBMxInternational Business Machines
INTCxIntel
IWMxRussell 2000
JNJxJohnson & Johnson
JPMxJPMorgan Chase
KOxCoca-Cola
LLYxEli Lilly
MAxMastercard
MCDxMcDonald's
METAxMeta
MSFTxMicrosoft
MSTRxMicroStrategy
MUxMicron Technology
NFLXxNetflix
NVDAxNVIDIA
ORCLxOracle
PEPxPepsiCo
PFExPfizer
PLTRxPalantir
QQQxNasdaq
SLVxiShares Silver Trust
SPCXxSpaceX
SPYxSP500
TSLAxTesla
TSMxTSMC
UBERxUber
UNHxUnitedHealth
VTIxVanguard
VxVisa
WMTxWalmart
XOMxExxon Mobil
The basket
Pick 1 to 5 stocks and give each a weight; the weights add up to 100% of the stocks slice. A basket of TSLAx 50%, NVDAx 30%, SPYx 20% inside a 30% stocks slice means 15% of every fee buys TSLAx. The basket is frozen with the recipe.
How a drop works
- 1The bucket fills
Each fee receipt adds the stocks share to the coin's stocks bucket (in SOL).
- 2A drop is due
Once the bucket owes at least 0.05 SOL (
DROP_MIN_SPEND_SOL) and the coin's last drop is older than the drop window (60 minutes by default), the drop starts. One drop of each kind per coin per window. - 3The basket is bought
The treasury buys each stock through Jupiter, split by the basket weights. One pass spends at most 2 SOL per coin on buys (
DROP_MAX_BUY_SOL), 15% of what is owed is held back for rent and fees (DROP_RENT_RESERVE), and a buy that would move the price more than 3% is refused (DROP_MAX_IMPACT_PCT). - 4Holders are counted
A holder snapshot (refreshed about every 10 minutes) decides who is eligible and each wallet's share of the supply that counts.
- 5The stocks are sent
Each eligible wallet gets its share of every stock bought, up to 60 wallets per coin per pass. Each transfer is journaled with its signature.
Who is eligible
Your share is your balance divided by the balance of every eligible wallet. These wallets are left out, and the coin's Holders tab says which reason applies:
| reason | meaning |
|---|---|
pool | the Meteora pool after graduation |
curve | the bonding curve itself |
treasury | the master wallet (it holds coins only between a buyback and its burn) |
burn | burn and dead addresses |
bundler | a wallet in a bundle cluster (when the coin's anti-bundle exclusion is on) |
sniper | a wallet that bought in the pool's first slot (when exclusion is on) |
new | has not held through the coin's hold time yet (two snapshots that far apart) |
dust | holds under 0.001% of the supply (DROP_MIN_HOLD_PPM) |
The tray for small shares
Sending a stock to a wallet that has never held it means opening a token account for that wallet first. For a tiny share the account can cost more than the stock inside it. So small shares go into a tray: they are kept for that wallet across drops and sent once they are worth the account. A stock is sent once your share of it is worth at least $0.25 (DROP_MIN_USD), or at least $2 (DROP_FIRST_MIN_USD) if you have no token account for that stock yet. Your tray balance shows on Rewards.
Token account rent
A new Token-2022 account needs a rent deposit of about 0.0021 SOL. The stocks bucket pays it, it is counted in the drop's budget before anything is sent, and it shows as part of the drop's cost in the ledger. The deposit belongs to the account: if you later empty and close it, the rent comes back to you.
Cadence
Drops run on the crank, at most once per coin per drop window (DROP_EVERY_MIN, default 60), and only when the bucket covers the basket buys, the account rent and the fees with room to spare. A quiet coin drops less often; a busy one drops every window.
Checked before the treasury signs
- Every transaction is built, simulated and judged first. A buy must spend exactly the planned amount, return the exact output mint, stay inside the impact cap and give at least 95% of the quote. A stock send must move exactly the planned amount out of the treasury's account and exactly each amount into each recipient's, to catalog Token-2022 mints only.
- Journal before broadcast. Each move is written as pending first; if that write fails nothing is sent. Unresolved moves are settled by signature and blockhash expiry on the next pass, and a failed send returns the amounts to the wallets' trays.
- A full holder list needs a full RPC. Without one the site only sees the top 20 holders, marks the snapshot incomplete and never pays from it.
- Drops are armed by the operator. Real drops run only when the operator has switched on live drops (
DROPS_LIVE) on top of live mode; until then the passes only report what they would do. Nothing in this section has been paid on mainnet yet. - If a second hop fails (a stock routed through USDC) the USDC stays in the treasury and is visible as a
hopmove in the ledger.
SOL to holders
Fees paid out in SOL to every eligible holder, by share.
The airdrop slice is the simplest reward: its bucket is paid out in SOL to the coin's eligible holders, each by their share of the supply that counts. The eligibility rules and the safety checks are the same as for stocks: pools, the curve, the treasury and burn addresses never count, and bundlers, first-slot snipers and wallets that have not held through the hold time are left out while the coin's anti-bundle exclusion is on. There is no token account to open for SOL, so no rent.
- 1The bucket fills
Each fee receipt adds the airdrop share, in SOL.
- 2A payout is due
When the bucket owes at least 0.05 SOL and the coin's last SOL payout is older than the drop window (60 minutes by default).
- 3Snapshot
Holders are counted and shares computed. A share smaller than the payout minimum (about $0.25 of SOL, or 0.002 SOL when no price is known) waits in your tray for the next payout.
- 4SOL is sent
Up to 60 wallets per pass, 12 transfers to a transaction, each checked by simulation before the treasury signs and journaled with its signature. You do not claim anything: it lands in your wallet.
Thinking coins
A coin with a brain: an AI that talks for the coin and makes things for it, paid for by the coin's own fees.
Give a coin a brain slice and it gets its own brain. The brain answers people on the coin's Brain tab, and between conversations it works for the coin: it drafts posts, plans campaigns, writes reports about the coin's own numbers, and builds small web apps. Every thinking coin is listed at Brains.
Persona
The launcher can write the brain's voice: up to 280 characters, filtered like every other text on the pad. Left empty, the persona is made from the coin's name, ticker and description. It is frozen with the recipe.
Energy
The brain slice of every fee is turned into energy: the brain's daily AI allowance, in dollars. The SOL stays with the treasury, which pays the AI bills; the coin page shows the energy bar (allowance and what is used today). A brain with no energy left goes to sleep and wakes up when new fees refill it.
| energy rule | default |
|---|---|
| free allowance per coin per day (paid by the house) | $0.02 (BRAIN_BASE_USD) |
| most one coin converts from its brain bucket per day | $0.50 (BRAIN_COIN_DAILY_MAX_USD) |
| every brain and chat together, per UTC day | $1.00 (BRAIN_DAILY_BUDGET_USD) |
| paid fuel kept ready | $0.10 (BRAIN_TANK_USD) |
| one job per coin per | 45 minutes (BRAIN_EVERY_MIN) |
| post drafts per coin per day / apps per coin per day | 4 / 1 |
| questions to a brain: per person | 6 per 10 minutes, 40 per day |
| questions to a brain: per coin / whole site | 30 per minute and 500 per day / 120 per minute |
| status | meaning |
|---|---|
thinking | a job is running right now |
idle | awake, waiting for its next job or question |
sleeping | out of energy for today |
off | the brain is switched off (no brain slice, or the operator paused brains) |
What it makes
- posts
- drafts for X, each with a one-tap intent link. A person reads it and decides to post it.
- campaigns
- a short plan for the coin: the angle, a few posts, a page.
- apps
- tiny single-page web apps for the coin, served from
/a/<id>. Today these are three hand-written templates themed by the coin's voice and numbers (a clicker, a "where does a fee go?" recipe explorer, a holder-type quiz); a model writing a whole app is not switched on. - replies
- answers to questions people ask on the coin's Brain tab, streamed as they are written.
- reports
- plain notes about the coin's own numbers: fees, buckets, drops, holders.
- payout thoughts
- a line written by code from the confirmed ledger rows each time a drop or payout lands. These are never AI text.
Drafts, not posts
A brain never posts, never signs, never trades and never holds a key. It has no account on any platform and no wallet. Everything it makes is a draft that a person can use or ignore.
Sandboxed apps
Brain-made apps run in a locked sandbox: served from /a/<id> with a Content-Security-Policy sandbox, framed only by this site, with no access to your wallet, your cookies or the rest of the page, and no network calls of their own.
Template fallback
When a brain has no AI budget left, no AI key is set on the server (OPENROUTER_API_KEY), or the AI provider does not answer, it still fills its feed from templates built on the coin's real numbers. Every line a brain writes passes a fixed gate: no promised returns or price targets, no asking for money, wallets or signatures, no invented numbers or partnerships, no other coin's ticker, no links but the ones it is given. Template work is always labelled template in the feed: nothing pretends to be thought that was not. Replies are checked whole before they are streamed to you.
Wallet routes
A slice of the fees to any Solana wallet, pushed by the crank.
A wallet slice names a Solana address and a share. It is free. The crank pays the bucket out to that address in SOL once it owes more than the payout minimum; nobody has to claim anything. Use it for a team wallet, a charity, a partner, or yourself.
- The address is checked at launch (a real 32-byte public key) and frozen with the recipe.
- A payout starts once the bucket owes at least 0.01 SOL (
ROUTE_MIN_SOL) and is capped at 5 SOL a payout (ROUTE_MAX_SOL); the rest follows on the next pass. Up to 24 route payouts run per crank pass. - A recipe holds at most 4 wallet routes.
- Each payout is a ledger row with its signature; the coin's Recipe tab shows earned, sent and owed for each wallet.
Developer rewards
A coin's developer share is not paid the day it is earned. It builds up and is released by milestones.
By default a third of a coin's fees is the developer's rewards: a wallet slice that pays the launcher's wallet. On COOK coins every wallet slice vests. The money accrues as the coin earns, and it is released in steps. See your coin's card on the developers page.
The unlock schedule
| step | what unlocks | what the coin needs |
|---|---|---|
| day 7 | 25% of what has accrued | at least 40% of the people who held on day 1 still hold, and at least half of the trading looks real |
| day 14 | 50% | day 7 reached, and at least half of the trading still looks real |
| day 30 | 100% | at least 30% of the day-1 holders are still there, liquidity is at least 5% of the market cap (before graduation: the curve is 5% full), and at least half of the trading looks real |
These numbers are today's defaults and the team may tune them. A step, once reached, is never taken back. Trading volume never unlocks anything on its own: it can only block a step.
How each measure works
- holder retention
- the people who held on day 1 are frozen as a group. A person counts as still holding if they keep at least half of what they held on day 1. Program accounts, bundle-flagged wallets and the developer are not counted. A group under 5 wallets cannot pass.
- organic volume
- trading volume minus the volume of wallets flagged as bundlers or wash traders. It is an estimate, because the site only knows the trades it indexed. When it cannot tell, it does not pass.
- liquidity quality
- before graduation, how full the curve is. After graduation, the pool's SOL liquidity as a share of the market cap.
When rewards are held back
Any one of these withholds the developer's rewards. Nothing is released while one applies:
- the developer's wallet is part of the bundle that bought the launch;
- the developer sold or moved out more than half of its coins inside one day;
- wash trading: a big part of the trading comes from wallets that buy and sell the same coins back and forth.
Held-back money is not paid and not lost. It stays in the coin's vesting. If a coin stays withheld for 30 days in a row, the unreleased rewards move to the coin's buyback and are burned with it. Every reason is shown on the coin.
Referrals
Share your link. Earn when the people you bring stay.
Every wallet gets a referral code. A link with ?ref=CODE on any page remembers the code in a cookie for 30 days. The first code wins. When someone you brought signs in, trades, and comes back to trade again at least 7 days later, you earn 20% of the house share of the fees on their trades made through the site.
- Nothing is paid for people who do not come back, and nothing is paid for volume alone.
- A code is refused if it is unknown, your own, from a wallet that has already traded here, or part of a loop.
- The amount is an estimate from trade size and the fee, not a number read from the pool.
- Referrals are paid from the house third of a coin's fees, in batches once at least 0.01 SOL is owed.
- Each payout is written to the public ledger first (kind
referral).
Your link, your referred wallets and your earnings are at /referrals. The route is GET /api/incentives/ref.
Callers
Every callout says if it was paid for. Every caller has a public record.
A callout is a post about a coin that carries the caller's live position. Posting one now needs a paid-promotion disclosure: yes or no, and if yes, who paid (2 to 60 characters). The composer cannot post until it is answered, and the server refuses a callout without it. Every card shows "Paid promotion" with the payer, or "Not paid".
Outcomes
For each callout the site tracks the market cap (in SOL) at the call, the highest since (peak), now, and the deepest drop from the running peak. A caller's profile shows:
- hit rate: the share of callouts whose peak reached 2x the entry;
- median peak multiple and average max drawdown;
- the callouts themselves, with every paid-promotion disclosure;
- how many people they brought through referrals.
Callers earn through referrals of traders who stay, not through volume. The route is [GET /api/incentives/caller/[wallet]](#api-incentives-caller). Posting rules (you must hold the coin, one callout per coin per 10 minutes) are in Social trading.
Creators
Make tutorials, memes or coverage. Get paid for the pieces a reviewer approves.
- 1Apply
At /creators: your handle, your platforms, 1 to 5 sample links and a note. You need to be signed in.
- 2Get approved
A reviewer approves or declines the application.
- 3Submit
Approved creators submit links to what they made (https only, up to 5 a day), optionally naming one of our coins.
- 4Get paid
A reviewer approves a submission and sets the payout in SOL, up to a per-submission cap (2 SOL by default). Payouts come from the house pool.
- There is no fixed price list and no promised budget. The plan has planning figures, but the site never shows a budget as committed money.
- Every payout is a ledger row (kind
ugc) and appears in the public ledger. A payout is claimed before it is paid, so a double click cannot pay twice. - As with referrals, payouts are simulated until a sender is wired, and the row says so. A launch-window surcharge you owe is recovered first.
- Reviewers use
/creators/reviewwith an operator key. It is not a public route.
Paid features & pricing
Launching is free. Three parts of a recipe cost a one-time fee, paid to the treasury before the coin is created.
| paid feature | unit | price |
|---|---|---|
| Social route | per routed account | ... |
| Thinking (brain) | per coin | ... |
| Stocks to holders | per coin | ... |
| Launching (rent + network fees) | always | free |
| Buyback & burn | always | free |
| SOL to holders | always | free |
| Wallet routes | always | free |
| Anti-vamp + anti-bundle | always | free |
| Launch protection (first-slot fee) | always | free |
| paid feature | what you pay | default |
|---|---|---|
| social route | per X, Instagram or TikTok account in the recipe (up to 4) | 0.1 SOL each (PRICE_SOCIAL_ROUTE_SOL) |
| thinking coin | once per coin with a brain slice | 0 SOL (PRICE_BRAIN_SOL) |
| stocks basket | once per coin with a stocks slice | 0 SOL (PRICE_STOCKS_SOL) |
The numbers above are the defaults; the table at the top is what this site charges right now, read live. Everything else is free: the launch itself (the treasury pays the pool's rent and the network fees), buyback & burn, developer rewards and other wallet routes, SOL to holders, anti-vamp, anti-bundle and the launch protection. Prices are set by the operator (capped at 100 SOL) and can change for new coins; a coin that already launched never pays again. A paid launch also needs a signed-in wallet, so the payment comes from you.
How payment works
- 1Quote
The create page sends your recipe to
POST /api/quoteas you edit it. The answer has each paid line, the total andpayTo(the treasury's address). It also validates the recipe and says what is wrong, if anything. - 2Pay
If the total is above zero, you sign one plain SOL transfer of at least the total from your signed-in wallet to
payTo. - 3Launch
The launch is sent with that transfer's signature (
paymentSig). The server checks on chain that it landed, is recent, went from your signed-in wallet to the treasury, covers the total, and was never used before.
Holder rewards & claiming
Drops land in your wallet on their own. Only social routes are claimed. Developer rewards vest.
| reward | how you get it | where to see it |
|---|---|---|
| Stocks to holders | pushed to your wallet in drops; small shares wait in your tray | Rewards, the coin's Drops and Holders tabs |
| SOL to holders | pushed to your wallet | Rewards, the coin's Drops and Holders tabs |
| Wallet route | pushed to the named wallet. On COOK coins it vests by milestones (see Developer rewards) | the coin's Recipe tab |
| Social route | claimed by the account's owner after a bio-code check | Rewards, Social claims |
Why didn't I get a drop?
- You have not held long enough. New holders are paid after they appear in two snapshots the coin's hold time apart (
new). - Your share was dust. Shares too small to be worth a transfer wait for a bigger drop (
dust); stock shares wait in your tray. - Your wallet was flagged. Bundle clusters and first-slot buyers are left out while the coin's exclusion is on (
bundler,sniper). - You owe a launch-window surcharge. If you bought a lot in the first minute, payouts you would get from this coin are withheld until the assessment is covered. See Launch protection.
- The bucket has not reached its minimum. A quiet coin fills its buckets slowly; drops run when the bucket covers its costs.
- You hold it in a pool or an exchange. Only the wallet that holds the tokens is counted; tokens in a liquidity pool or on an exchange belong to the pool or the exchange.
Every coin's Holders tab lists each wallet, its share, what it has been paid and, if it is left out, why.
Claiming social fees
If a coin routes fees to your X, Instagram or TikTok account: sign in, open Rewards, look up your handle, get a code, put it in your bio, press Check, then Claim. The full walk-through is in Social routes.
Transparency
Fees collected, buyback spend and tokens actually burned, each with the transaction that proves it. Waiting money is never called burned.
The ledger
GET /api/ledger is the public ledger: launches, fee claims, buybacks, burns, drops, social payouts and claims, referral and creator payouts, and developer vesting. Every row has a deterministic id built from what it is (for example launch:<mint> or distribute:<mint>:<sig>), so a step that runs twice can never be counted twice, and a coin's totals are re-added from its rows.
{
"id": "buyback:7GxV...k9Qp:5Rk...",
"kind": "buyback",
"at": 1793022610000,
"sig": "5Rk...",
"mint": "7GxV...k9Qp",
"lamports": "120000000",
"data": { "status": "confirmed", "outRaw": "1834220019" }
}{
"id": "referral:9aT...:1793022610000",
"kind": "referral",
"at": 1793022610000,
"mint": null,
"lamports": "3200000",
"data": { "status": "simulated" }
}Journaled before it is sent
Every spender writes its ledger row as pending, with the signature and the blockhash, before the transaction is broadcast. After it lands the row becomes confirmed, or failed if it did not. A move whose fate is unknown is resolved first on the next pass, and nothing is spent again for the same step until the chain says the first try expired or failed.
The tape
The strip under the top bar is the tape (GET /api/tape): launches, buybacks, burns, drops, social payouts, claims, brain posts and graduations as they happen, built from the same ledger.
The transparency page
/transparency and GET /api/transparency show, live and for all coins together: where every claimed lamport sits by bucket (earned, spent, in flight, waiting), the guard totals (assessed, recovered, still open), developer vesting (accrued, released, withheld, sent to buybacks), verified burns, and the latest treasury moves from the ledger. The leaderboard has burn boards that rank coins by tokens burned in their first minute, first hour and first day (GET /api/leaderboard). Only confirmed burns count, timed from the ledger against the coin's creation. A coin's own buyback counts. Tokens sent to the incinerator from outside do not.
On every coin page
- Fees: collected, split into the guard part and the normal part.
- Buyback: money waiting, spent, and tokens actually burned, with a Solscan link on every transaction.
- Launch window: what was assessed, what has been recovered, and the flagged wallets.
- Recipe: the slices and each bucket's earned, spent and waiting.
- Developer vesting: accrued, released, withheld, and the reasons.
- Drops: every stock drop and SOL payout with recipients and signatures.
- Holders: who is eligible, each share, what each wallet has been paid.
- Bundles: the bundle score, clusters, the creation slot and its buys.
Trading on the site
Buy and sell from the coin page with your COOK wallet. We never hold your funds.
The coin page has a Buy / Sell panel: pick a side, type an amount (quick chips 0.1 / 0.5 / 1 / 5 of the pair for buys, 25 / 50 / 100% for sells), and press the button. The trade goes to the coin's real market: while the coin is on its Meteora bonding curve, our server builds an unsigned transaction for your wallet and your browser checks it before the wallet is asked; after graduation the site asks Jupiter for the swap into the coin's DAMM v2 pool.
What happens when you press the button
- 1Build
POST /api/venues/tradeanswers with an unsigned transaction and its quote (inRaw,expectedOutRaw,minOutRaw). A graduated coin answers 409phase: ammand the site asks Jupiter instead. - 2Check
Your browser verifies the transaction before anything is signed: you are the fee payer, only Meteora's DBC, Token, associated-token and compute-budget programs are used, and the only SOL leaving your wallet goes into your own wrapped-SOL account.
- 3Confirm
Your COOK wallet shows a confirm sheet (amount, slippage, priority fee, what you receive, the SOL transfers and fee decoded from the transaction itself). With quick trade on, trades under your cap skip the sheet.
- 4Send
The signed transaction is forwarded by the wallet relay and its status is polled until it lands. A landed trade is reported to the site, which verifies it on chain and updates positions and PnL.
- You buy with SOL. Every coin is paired with SOL. The quick chips are sized in SOL.
- Slippage defaults to 10% and the priority fee to 0.0005 SOL; both are on screen and editable. A trade that would move the price past your slippage fails instead of filling badly. The priority fee goes to the network, not to us.
- Fees are the pool's: 3% by default, taken inside the swap (13% in a pool's first slot). Meteora keeps 20% of it, and the treasury splits the rest by the coin's recipe. See Fees. The priority fee is separate.
- Arriving from a callout?
/coin/<mint>?buy=<sol>opens the coin with the buy box filled in; your wallet still signs. - You can always trade the same coin on Meteora itself, or on any app that routes Meteora pools, like Jupiter.
The COOK wallet
The only wallet here: made in your browser, locked with your passcode, and never sent to us.
There is no extension wallet to connect. The first time you press Sign in, the site offers Create COOK wallet (or Import a key). It makes a Solana key on your device, locks it with a passcode you choose, and signs you in at once. The site never receives the key; it only ever sees your public address and transactions that are already signed.
Create, sign in, unlock
- 1Create
Choose a passcode (at least 8 characters, with a strength meter). The key is made in your browser and encrypted straight away. Creating the wallet signs you in: the site asks the wallet for a free sign-in message signature (no transaction, no sheet) and the top bar shows your balance.
- 2Back it up
The next screen reveals the secret key once, with a copy button. It hides itself after 2 minutes, and the clipboard is wiped 60 seconds after you copy it. A back-up dot stays on the top-bar chip until you have exported the key once.
- 3Lock and unlock
The wallet locks after 15 minutes idle by default (any value from off to 240 minutes in Settings), when you close the tab, or when you sign out. Unlocking with the passcode signs you in again. Locking alone keeps your session; signing out also locks the wallet.
- 4Import
Instead of creating, you can import a key: base58, a JSON byte array (Solana CLI file), hex or raw seed bytes. Pasting a 12 to 24 word seed phrase is not supported yet.
Deposit, trade, withdraw
- Deposit: open the wallet panel (the balance chip in the top bar, or /wallet). The Deposit tab shows your address and a QR code. Send SOL to it from anywhere; tokens you hold are listed too, with launched-here coins first.
- Trade: every trade shows a confirm sheet: amount, slippage, priority fee, what you receive, programs used. Turn on quick trade and set a per-trade SOL cap (default 0.1 SOL) to skip the sheet for buys under the cap. Sells and anything above the cap still ask.
- Withdraw: the Withdraw tab sends SOL or any token you hold (Token-2022 aware) to an address. It validates the address, warns about sending to yourself, to an unused address or to a program-owned one, shows the rent of a token account it has to open for the recipient, and Max leaves the network fee behind.
- Activity: your last 20 transactions with their status.
- Paid launches are paid from this wallet too: the sheet shows the SOL transfer to the treasury. Developer rewards are paid to the wallet the recipe names, when they vest.
How the key is kept
- The key is encrypted with AES-256-GCM under a key derived from your passcode with PBKDF2-SHA256, 600,000 rounds and a random salt. The record is versioned, and the address is bound into the encryption tag, so changing any field makes it fail to open.
- It is stored in your browser (IndexedDB, mirrored in local storage). While unlocked, the key sits in page memory only, and is overwritten with zeros when the wallet locks.
- A wrong passcode is slowed down: three free tries, then 5 seconds doubling up to 5 minutes. That slows guessing on your device; it cannot stop someone who copies the stored record and guesses offline, so use a long passcode.
- Exporting the key, changing the passcode and forgetting the wallet (you must type FORGET) all need the passcode or an explicit confirmation.
- One wallet per browser. There is no wallet switcher.
- The site loads no third-party scripts into the page that can sign, which is the main defence against a script stealing a signature while the wallet is unlocked.
What we can and cannot recover
| situation | can we help? |
|---|---|
| you forgot the passcode, and you have the exported key | yes, you do: import the key again and set a new passcode |
| you forgot the passcode, and never exported the key | no. Nobody can open the record, including us |
| you cleared site data or switched browser, with no export | no. The key existed only in that browser |
| you sent funds to a wrong address | no. Solana transfers cannot be reversed |
| your signed-in session is stuck | yes: sign out and sign in again; it never touches the key |
Social trading
Callouts that carry the caller's live position, profiles with PnL read from the chain, follows with copy alerts, boards and squads.
The social layer is built on one rule: positions and PnL are rebuilt from the chain, never typed in. For every coin launched here, the site reads a wallet's trades (curve or DAMM v2 pool, wrapped SOL and token-account rent included) and works out what it holds, what it paid, and what it made. There is no custody and no auto-trading: following and copying only ever produce a notice and a link; your own wallet signs.
Profiles
Every wallet has a profile at /profile/<wallet>: a banner, an @name (3 to 20 of a-z 0-9 _, unique, a few words reserved), a bio (160 characters, filtered), an avatar (a coin you hold, or a picture), a verified X, Instagram or TikTok if you bound one in Rewards, your PnL over 1 day, 1 week, 1 month or all time with a chart, your open positions, your callouts, the coins you launched and what you earned from holder rewards. Edit yours at /profile (POST /api/me/profile).
| position column | meaning |
|---|---|
| held / value | tokens held now and their worth in SOL at the latest price |
| cost / realised | what you paid in (average cost) and what your sells took out |
| PnL | value + realised - cost; rewards from the coin are shown beside it, not mixed in |
| avg entry MC | your average entry market cap in USD |
Callouts
A callout is a post about a coin (up to 500 characters, an optional picture). It is stamped with the caller's position at that moment (entry market cap and value), tracks its outcome (peak, now, deepest drop) and keeps tracking the position live, so a callout's PnL is on show for everyone and cannot be edited after the fact; the author can only add follow-up updates under it.
- Who may call a coin: you must hold it on chain (side
long), or have sold it in the last 24 hours (sideexit). Otherwise the post is refused. - Disclosure: every callout says whether it was paid promotion and who paid. See Callers.
- One callout per coin per 10 minutes per wallet.
- Feeds: Hot (ranked by likes, reposts, replies and views with age), Following, per coin, per trader, per squad. Like, repost into your followers' feed, reply, and view are counted.
- Where: the home page's Callouts column,
/feed, and each coin's Callouts tab.
Coin threads
Every coin has a Thread tab for plain comments (400 characters). Each comment carries its author's position badge at the time, like "holds 1.2%" or "sold", so you can see who is talking their book.
Follows, copy alerts and Replay
- 1Follow
Press Follow on a profile or a board row. Following fills your Following feed.
- 2Turn on alerts
Choose alerts on a follow and the site tells you in the bell (top bar) whenever that trader buys or sells one of our coins. No cron is needed: alerts refresh for up to four followed traders when you open the bell.
- 3Replay
An alert has a Replay button. It opens
/coin/<mint>?buy=<sol>with the buy amount filled in. You review and sign it with your COOK wallet. Nothing is traded for you.
Boards and squads
- Traders
- wallets ranked by PnL over 1d / 1w / 1m / all, with win rate and trade count. On the home page's leaderboard column and on /feed.
- Earners
- wallets ranked by what they earned: holder rewards (stocks and SOL) plus social claims received.
- Squads
- groups of traders with a 2 to 5 character tag, ranked by summed member PnL. One squad per wallet; the creator is captain, who can pin up to 5 coins. Browse at /squads; join, leave or create from a squad's page.
API reference
Every public route. JSON over HTTPS, no key needed to read.
Conventions
- Base URL is this site's origin. Examples use
$SITE. - Money is lamports as a decimal string (
"1500000000"= 1.5 SOL), never a float. Token amounts are raw units as decimal strings (COOK coins have 6 decimals). Only market readings (price, market cap, volume) are numbers. - Shares are basis points of a coin's normal part (10,000 = 100%). Times are milliseconds since the epoch.
- Errors are
{ "error": "a sentence", "code"?: "invalid" | "auth" | "taken" | "limit" | "gate" }with the HTTP status: 400 invalid, 401 sign in first, 403 cross-site, 404 not found, 409 taken, 429 rate limited, 503 closed or unavailable. - Honest data: without a database (preview) every read answers real, empty data: zero counts and empty lists, never made-up numbers.
- Reads are cached at the edge for a few seconds; per-person answers (
/api/me*, the social flow) are never cached.
Signing in
Routes marked signed in need the session cookie from Sign In With Solana: get a nonce, sign its message with your wallet (signMessage, free, no transaction), and post the signature back. In a browser the site does this for you when you press Sign in. A browser POST from another site is refused; calls with no Origin header (curl, servers) pass, and the cookie still decides who you are.
import bs58 from "bs58";
import nacl from "tweetnacl";
const site = "https://your-site";
const { message } = await fetch(`${site}/api/auth/nonce?address=${wallet}`).then((r) => r.json());
const signature = bs58.encode(nacl.sign.detached(new TextEncoder().encode(message), secretKey));
const res = await fetch(`${site}/api/auth/verify`, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ address: wallet, message, signature }),
});
const cookie = res.headers.get("set-cookie"); // send it back on signed-in routesCoins & market
Coins on the board, newest first by default. Each coin carries its frozen recipe, its buckets and its pair.
| parameter | in | type | meaning |
|---|---|---|---|
sort | query | "new" | "mcap" | "trending" | "graduating" | "vault" | "paid" | order (default new); paid = most paid out |
q | query | string | search ticker, name or mint |
module | query | SliceKind | only coins whose recipe has this slice (buyback, stocks, airdrop, brain, social, wallet) |
founder | query | string | only coins launched by this wallet |
limit | query | number | page size (default 24) |
cursor | query | string | the next of the previous page |
curl "https://getcook.vercel.app/api/coins?sort=trending&module=stocks&limit=10"One coin with its newest ledger rows and its timeline (launch, live, graduated, milestones, burns). For fees, burns and the launch window, see [GET /api/coin/[mint]/burns](#api-burns).
| parameter | in | type | meaning |
|---|---|---|---|
mintrequired | path | string | the coin's mint address |
curl "https://getcook.vercel.app/api/coin/7GxV...k9Qp"OHLC candles for the coin's chart (seconds epoch, prices in USD).
| parameter | in | type | meaning |
|---|---|---|---|
mintrequired | path | string | the coin's mint |
curl "https://getcook.vercel.app/api/coin/7GxV...k9Qp/chart"Recent trades of the coin.
| parameter | in | type | meaning |
|---|---|---|---|
mintrequired | path | string | the coin's mint |
curl "https://getcook.vercel.app/api/coin/7GxV...k9Qp/trades"The pad's totals, whether launches are open (and why not), the launch limits, and every module's running total.
curl "https://getcook.vercel.app/api/stats"What each paid feature costs right now, and where to pay.
curl "https://getcook.vercel.app/api/prices"The live tape: launches, buybacks, burns, drops, social payouts, claims, brain posts and graduations, newest first.
| parameter | in | type | meaning |
|---|---|---|---|
limit | query | number | how many items |
curl "https://getcook.vercel.app/api/tape?limit=20"Ranked coins: by fees earned, by tokens burned, or by tokens burned in a coin's first minute, hour or day. Only confirmed burns count; a coin's own buyback counts, a transfer to the incinerator from outside does not.
| parameter | in | type | meaning |
|---|---|---|---|
board | query | "coins" | "burns" | "burns_1m" | "burns_1h" | "burns_1d" | which board (default coins) |
curl "https://getcook.vercel.app/api/leaderboard?board=burns_1h"The public ledger, newest first. Every row has a deterministic id and the signature that proves it.
| parameter | in | type | meaning |
|---|---|---|---|
mint | query | string | only this coin's rows |
kind | query | LedgerKind | only one kind (launch, distribute, buyback, burn, guard_recover, vest_accrue, referral, ugc ...) |
limit | query | number | page size (default 30) |
cursor | query | string | the next of the previous page |
curl "https://getcook.vercel.app/api/ledger?kind=buyback&limit=50"Launching
The live anti-vamp check the create form runs as you type: the 60-minute cooldown on a ticker or name, cooldown-time warnings (lookalikes), reuse labels and the X account. The launch itself runs the full check, picture included.
| parameter | in | type | meaning |
|---|---|---|---|
ticker | query | string | the ticker, with or without $ |
name | query | string | the coin name |
x | query | string | an X handle or x.com link |
curl "https://getcook.vercel.app/api/check?ticker=P3P3&name=Official%20Pepe"- Rate limited per caller (90 a minute).
Store a coin picture before launching. The bytes are checked (PNG, JPEG, WebP or GIF), the picture is cropped square, and the answer is the URL to pass as image.
| parameter | in | type | meaning |
|---|---|---|---|
imagerequired | body | string | a data URL: data:image/png;base64,... |
curl -X POST "https://getcook.vercel.app/api/upload" \
-H "content-type: application/json" \
-d "{\"image\":\"data:image/png;base64,$(base64 -w0 coin.png)\"}"- Rate limited per caller (10 a minute).
Validate a recipe and price it. Answers 400 with the reason when the recipe is not valid (slices not adding up to 10,000, a bad handle, a basket that is not routable ...).
| parameter | in | type | meaning |
|---|---|---|---|
reciperequired | body | RecipeInput | the recipe you want |
curl -X POST "https://getcook.vercel.app/api/quote" -H "content-type: application/json" -d '{
"recipe": {
"slices": [
{ "kind": "buyback", "bps": 5000 },
{ "kind": "airdrop", "bps": 3000 },
{ "kind": "social", "bps": 2000, "platform": "x", "handle": "someone" }
],
"antiBundle": true,
"holdMinutes": 30
}
}'Reserve and create a coin. The coin comes back pending; its birth runs after the answer. Poll the coin (GET /api/coin/[mint]) until status is live. A recipe with a paid total needs a signed-in wallet and paymentSig.
| parameter | in | type | meaning |
|---|---|---|---|
namerequired | body | string | up to 32 characters |
tickerrequired | body | string | 2 to 10 letters or digits, with or without $ |
description | body | string | up to 500 characters |
imagerequired | body | string | a data URL or the URL from /api/upload |
links | body | { x?, telegram?, website? } | the coin's links |
recipe | body | RecipeInput | the fee recipe (omitted: the operator's default) |
pair | body | string | sol or omitted. COOK coins are quoted in SOL only; any other pair is refused |
paymentSig | body | string | the SOL transfer that pays the quote; required when the quote total is above 0 |
curl -X POST "https://getcook.vercel.app/api/launch" -H "content-type: application/json" -d '{
"name": "Moon Cat",
"ticker": "MCAT",
"image": "https://.../uploads/abc.jpg",
"pair": "sol",
"recipe": { "slices": [{ "kind": "buyback", "bps": 10000 }], "antiBundle": true, "holdMinutes": 30 }
}'- 400 invalid input (including a recipe that breaks the COOK rules: buyback under 33.33%, house not 33.34%), 409 taken (anti-vamp cooldown, with every reason and when it frees up), 429 a limit, 503 launches are closed (the reason says why: preview mode, paused, the venue not reachable, treasury float too low, daily cap).
routes(the old launcher split) is not accepted: routes live in the recipe.- Rate limited per caller (6 a minute), plus the daily launch limits in Limits & safety.
Venue & curve trades
The launch venue (Meteora Dynamic Bonding Curve) and its pair list. COOK quotes in SOL only, so the list has one pair.
| parameter | in | type | meaning |
|---|---|---|---|
q | query | string | filter by symbol, name or mint |
category | query | string | solana, xstock, currency, tessera, prestock, backpack, custom, leverage, collectible, basket |
limit | query | number | default 100, at most 600 |
curl "https://getcook.vercel.app/api/venues"- Omit
pair(or passsol) toPOST /api/launch.
Build an unsigned buy or sell on a coin's Meteora bonding curve for your wallet to sign. The fee payer is you; nothing is signed or sent here. A graduated coin answers 409 phase: "amm": ask Jupiter instead.
| parameter | in | type | meaning |
|---|---|---|---|
mintrequired | body | string | the coin |
siderequired | body | "buy" | "sell" | direction |
userrequired | body | string | the wallet that will sign |
amountRawrequired | body | string | buy: lamports of SOL. sell: raw units of the coin (6 decimals) |
slippageBps | body | number | 0 to 5000 (default 300) |
curl -X POST "https://getcook.vercel.app/api/venues/trade" -H "content-type: application/json" -d '{
"mint": "7GxV...", "side": "buy", "user": "YOUR_WALLET", "amountRaw": "100000000", "slippageBps": 500
}'Fees, burns & launch protection
Live totals for all coins: where every claimed lamport sits by bucket, the launch-window assessments and recoveries, developer vesting, verified burns and the latest treasury moves. Waiting money is never reported as burned.
curl "https://getcook.vercel.app/api/transparency"- Cached for a few seconds. Without a database it answers real zeros.
One coin's money trail: fees claimed (guard part and normal part), the guard bucket and the recipe's buyback (earned, spent, in flight, waiting), tokens actually burned, the launch-window assessment (assessed vs recovered, flagged wallets), developer vesting, and every move with its signature and state.
| parameter | in | type | meaning |
|---|---|---|---|
mintrequired | path | string | the coin's mint |
curl "https://getcook.vercel.app/api/coin/7GxV...k9Qp/burns"- 404 for a mint that was not launched here.
- "assessed" is arithmetic. Only "recovered" is money that was withheld.
Developers, referrals, callers & creators
The unlock schedule, what this coin has reached, the measures behind it and the reasons in words. The developers page draws its card from this.
| parameter | in | type | meaning |
|---|---|---|---|
mintrequired | path | string | the coin's mint |
curl "https://getcook.vercel.app/api/incentives/milestones/7GxV...k9Qp"- 404 for an unknown coin. When milestones cannot be read,
unlockedBpsis 0.
A caller's public record: hit rate (callouts whose peak reached 2x the entry), median peak multiple, average max drawdown, each callout with its outcome, every paid-promotion disclosure, and how many people they brought.
| parameter | in | type | meaning |
|---|---|---|---|
walletrequired | path | string | the caller's wallet |
curl "https://getcook.vercel.app/api/incentives/caller/9aT..."- Cached for 15 seconds. The peak is read when the profile or the cron refreshes, so it is a floor.
Your referral code and what it earned: people attributed, active (traded once), retained (traded again 7+ days later), and the lamports earned, waiting, payable and journaled. The share is an estimate: trade size x fee x the house third x 20%.
curl "https://getcook.vercel.app/api/incentives/ref" -b cookies.txtAttribute the signed-in wallet to a referral code. First touch wins. The code comes from the body, else from the cook_ref cookie set by a ?ref=CODE link. Refused in plain words: unknown code, your own code, a wallet that has already traded, a loop.
| parameter | in | type | meaning |
|---|---|---|---|
code | body | string | the referral code; optional when the cookie is set |
curl -X POST "https://getcook.vercel.app/api/incentives/ref/attribute" -b cookies.txt -H "content-type: application/json" -d '{"code":"brave-otter-42"}'- 20 a minute per caller.
Your creator application, your submissions and what you have been paid. POST the same path to apply.
| parameter | in | type | meaning |
|---|---|---|---|
handle | body | string | POST: your handle |
platforms | body | string[] | POST: where you publish |
samples | body | string[] | POST: 1 to 5 links to your work |
note | body | string | POST: optional note |
curl "https://getcook.vercel.app/api/incentives/creators" -b cookies.txt
curl -X POST "https://getcook.vercel.app/api/incentives/creators" -b cookies.txt -H "content-type: application/json" -d '{"handle":"@mycoinvids","platforms":["x"],"samples":["https://x.com/..."]}'- POST: 6 applications an hour per caller. No budget figure is ever returned.
Submit a piece of content (approved creators only). A reviewer approves it and sets the payout in SOL. Every payout is written to the public ledger as a ugc row.
| parameter | in | type | meaning |
|---|---|---|---|
urlrequired | body | string | an https link to the content |
mint | body | string | optional: one of our coins it is about |
note | body | string | optional note |
curl -X POST "https://getcook.vercel.app/api/incentives/creators/submit" -b cookies.txt -H "content-type: application/json" -d '{"url":"https://x.com/.../status/1"}'- 10 an hour per caller, and 5 a day per creator.
Holder rewards
The tokenized-stock catalog a stocks slice can buy from, xStocks first, with live prices and whether Jupiter can route each one now.
| parameter | in | type | meaning |
|---|---|---|---|
q | query | string | filter by symbol or name |
curl "https://getcook.vercel.app/api/stocks?q=tsla"The coin's holder snapshot: each wallet's share of the supply that counts, what it has been paid, and why it is left out if it is.
| parameter | in | type | meaning |
|---|---|---|---|
mintrequired | path | string | the coin's mint |
curl "https://getcook.vercel.app/api/coin/7GxV...k9Qp/holders"Every stock drop and SOL payout of one coin.
| parameter | in | type | meaning |
|---|---|---|---|
mintrequired | path | string | the coin's mint |
curl "https://getcook.vercel.app/api/coin/7GxV...k9Qp/drops"The coin's bundle report: score, clusters, the creation slot and the buys that landed in it, and every wallet left out of payouts because of it.
| parameter | in | type | meaning |
|---|---|---|---|
mintrequired | path | string | the coin's mint |
curl "https://getcook.vercel.app/api/coin/7GxV...k9Qp/bundles"Recent drops across every coin, each with its coin.
| parameter | in | type | meaning |
|---|---|---|---|
limit | query | number | how many |
curl "https://getcook.vercel.app/api/drops?limit=20"The holders paid the most, across every coin.
curl "https://getcook.vercel.app/api/drops/top"Thinking coins
A coin's brain and its newest thoughts. brain is null for a coin without a brain slice.
| parameter | in | type | meaning |
|---|---|---|---|
mintrequired | path | string | the coin's mint |
curl "https://getcook.vercel.app/api/coin/7GxV...k9Qp/brain"Ask a coin's brain a question. The answer streams back as server-sent events. Questions and answers are filtered and rate limited.
| parameter | in | type | meaning |
|---|---|---|---|
mintrequired | path | string | the coin's mint |
qrequired | body | string | the question |
curl -N -X POST "https://getcook.vercel.app/api/coin/7GxV...k9Qp/brain/ask" \
-H "content-type: application/json" -d '{"q":"what do your fees buy?"}'The global brain feed, newest first, or one coin's thoughts.
| parameter | in | type | meaning |
|---|---|---|---|
mint | query | string | only this coin's thoughts |
cursor | query | string | the next of the previous page |
curl "https://getcook.vercel.app/api/thoughts"A brain-made app, as a sandboxed HTML page (CSP sandbox, framed only by this site, no network calls of its own).
| parameter | in | type | meaning |
|---|---|---|---|
idrequired | path | string | the app's id (a thought's url) |
curl "https://getcook.vercel.app/a/abc123"Social routes
An account's claim wallet and totals. Answers for any valid handle, even one no coin routes to yet (with zeroes).
| parameter | in | type | meaning |
|---|---|---|---|
platformrequired | path | "x" | "instagram" | "tiktok" | the platform |
handlerequired | path | string | the handle, with or without @ |
curl "https://getcook.vercel.app/api/social/x/someone"Get a single-use code to put in the account's bio.
| parameter | in | type | meaning |
|---|---|---|---|
platformrequired | body | "x" | "instagram" | "tiktok" | the platform |
handlerequired | body | string | the handle |
curl -X POST "https://getcook.vercel.app/api/social/verify/start" -b cookies.txt \
-H "content-type: application/json" -d '{"platform":"x","handle":"someone"}'Read the account's public bio; if the code is there, bind the account to the signed-in wallet.
| parameter | in | type | meaning |
|---|---|---|---|
platformrequired | body | "x" | "instagram" | "tiktok" | the platform |
handlerequired | body | string | the handle |
curl -X POST "https://getcook.vercel.app/api/social/verify/check" -b cookies.txt \
-H "content-type: application/json" -d '{"platform":"x","handle":"someone"}'Send what the account's claim wallet holds (minus its rent floor) to the bound wallet.
| parameter | in | type | meaning |
|---|---|---|---|
platformrequired | body | "x" | "instagram" | "tiktok" | the platform |
handlerequired | body | string | the handle |
curl -X POST "https://getcook.vercel.app/api/social/claim" -b cookies.txt \
-H "content-type: application/json" -d '{"platform":"x","handle":"someone"}'The accounts that have earned the most, claimed or not.
curl "https://getcook.vercel.app/api/social/top"The accounts the signed-in wallet has bound.
curl "https://getcook.vercel.app/api/me/social" -b cookies.txtCOOK wallet relay
The COOK wallet signs in your browser; these routes only read public chain data for it and forward what it signed. They never see a key.
A wallet's SOL, its USD value and every token it holds (both token programs); tokens that are coins launched here carry their ticker, picture and SOL price. Cached a few seconds. Public chain data.
| parameter | in | type | meaning |
|---|---|---|---|
addressrequired | query | string | the wallet |
curl "https://getcook.vercel.app/api/wallet/balance?address=YOUR_WALLET"Broadcast a transaction your wallet already signed. The relay holds no key and signs nothing: it accepts only a fully signed v0 transaction of at most 1,232 bytes whose every signature verifies. Same-origin browser calls only.
| parameter | in | type | meaning |
|---|---|---|---|
txrequired | body | string | the signed transaction, base64 |
curl -X POST "https://getcook.vercel.app/api/wallet/send" -H "content-type: application/json" -d '{"tx":"BASE64_SIGNED_TRANSACTION"}'- 30 a minute per caller. 422 the network rejected it, 503 Solana is not answering (nothing was sent). A request from another site is refused (403).
Where up to 10 transactions are: processed, confirmed, finalized, failed or unknown.
| parameter | in | type | meaning |
|---|---|---|---|
sigsrequired | query | string | 1 to 10 signatures, comma separated |
curl "https://getcook.vercel.app/api/wallet/status?sigs=SIG1,SIG2"A recent blockhash, for transactions your browser builds itself (withdraw, deposit).
curl "https://getcook.vercel.app/api/wallet/blockhash"What a withdraw needs to know about its recipient: does the account exist, is it program-owned, and for a token, its program, decimals, the recipient's token account and the rent to open it.
| parameter | in | type | meaning |
|---|---|---|---|
torequired | query | string | the recipient |
mint | query | string | the token to send, if not SOL |
curl "https://getcook.vercel.app/api/wallet/check?to=RECIPIENT&mint=TOKEN_MINT"The last 20 transactions that touched a wallet.
| parameter | in | type | meaning |
|---|---|---|---|
addressrequired | query | string | the wallet |
curl "https://getcook.vercel.app/api/wallet/activity?address=YOUR_WALLET"Social trading
Your profile and trader card. POST the same path to change it: name (3 to 20 of a-z 0-9 _, unique), bio (160 characters), avatarMint (a coin you hold) or avatar / banner (pictures from /api/upload).
| parameter | in | type | meaning |
|---|---|---|---|
name | body | string | POST: your @name |
bio | body | string | POST: up to 160 characters |
avatarMint | body | string | POST: use a coin you hold as your avatar |
avatar | body | string | POST: a picture url |
banner | body | string | POST: a picture url |
curl -X POST "https://getcook.vercel.app/api/me/profile" -b cookies.txt -H "content-type: application/json" -d '{"name":"moonwalker","bio":"holding"}'- POST is same-origin and rate limited (20 a minute).
A board of traders, earners or squads, best first.
| parameter | in | type | meaning |
|---|---|---|---|
board | query | "traders" | "earners" | "squads" | default traders. On earners, pnlLamports carries what the wallet earned (holder rewards + social claims) |
window | query | "1d" | "1w" | "1m" | "all" | default 1w |
limit | query | number | 1 to 100 (default 50) |
curl "https://getcook.vercel.app/api/traders?board=traders&window=1w"One trader: their card, positions rebuilt from the chain (indexed on demand, at most every 2 minutes), their callouts and a PnL series.
| parameter | in | type | meaning |
|---|---|---|---|
walletrequired | path | string | the wallet |
window | query | "1d" | "1w" | "1m" | "all" | default all |
curl "https://getcook.vercel.app/api/traders/YOUR_WALLET"Tell the site about a trade you just broadcast. The signature is verified on chain (it must have landed, succeeded, and be a trade of one of our coins by your wallet) before it counts, so a made-up signature does nothing. The site does this for you after each trade.
| parameter | in | type | meaning |
|---|---|---|---|
sigrequired | body | string | the transaction signature |
curl -X POST "https://getcook.vercel.app/api/traders/trade" -b cookies.txt -H "content-type: application/json" -d '{"sig":"TX_SIGNATURE"}'- 30 a minute. 422 when the signature does not check out.
Callouts, newest or hottest first. POST the same path (signed in) to post one: you must hold the coin on chain, or have sold it within 24 hours, and may post one per coin per 10 minutes.
| parameter | in | type | meaning |
|---|---|---|---|
scope | query | "hot" | "following" | "coin" | "trader" | "squad" | default hot; following needs a session |
mint | query | string | with scope=coin |
wallet | query | string | with scope=trader |
squad | query | string | with scope=squad |
cursor | query | string | the next of the previous page |
limit | query | number | default 20 |
mint | body | string | POST: the coin you call |
text | body | string | POST: up to 500 characters |
image | body | string | POST: an optional picture url |
paidrequired | body | boolean | POST: is this paid promotion? Required |
paidBy | body | string | POST: who paid, 2 to 60 characters. Required when paid is true |
curl "https://getcook.vercel.app/api/callouts?scope=coin&mint=7GxV..."
curl -X POST "https://getcook.vercel.app/api/callouts" -b cookies.txt -H "content-type: application/json" -d '{"mint":"7GxV...","text":"holding for the next drop","paid":false}'- POST: 20 a minute, same-origin. 422 when you do not hold the coin or have posted on it in the last 10 minutes. 400 when
paidis missing, orpaidByis missing for a paid callout.
One callout, with its live PnL.
| parameter | in | type | meaning |
|---|---|---|---|
idrequired | path | string | the callout id |
curl "https://getcook.vercel.app/api/callouts/CALLOUT_ID"update adds the author's follow-up ({ text }); like and repost toggle ({ on?: boolean }, default on); view counts one view (anyone, once per viewer per hour).
| parameter | in | type | meaning |
|---|---|---|---|
idrequired | path | string | the callout id |
actionrequired | path | "update" | "like" | "repost" | "view" | what to do |
text | body | string | update: up to 500 characters |
on | body | boolean | like / repost: false undoes it |
curl -X POST "https://getcook.vercel.app/api/callouts/CALLOUT_ID/like" -b cookies.txt -H "content-type: application/json" -d '{"on":true}'A coin's thread (newest first) or a callout's replies (oldest first). Every comment carries its author's position badge. POST the same path (signed in) to comment, up to 400 characters.
| parameter | in | type | meaning |
|---|---|---|---|
mint | query | string | a coin's thread |
calloutId | query | string | a callout's replies (give one of mint / calloutId) |
cursor | query | string | the next of the previous page |
text | body | string | POST: the comment, with mint or calloutId |
curl "https://getcook.vercel.app/api/thread?mint=7GxV..."
curl -X POST "https://getcook.vercel.app/api/thread" -b cookies.txt -H "content-type: application/json" -d '{"mint":"7GxV...","text":"gm"}'- POST: 12 a minute.
Like or unlike a comment or reply.
| parameter | in | type | meaning |
|---|---|---|---|
idrequired | body | string | the comment id |
on | body | boolean | false undoes it |
curl -X POST "https://getcook.vercel.app/api/thread/like" -b cookies.txt -H "content-type: application/json" -d '{"id":"REPLY_ID"}'Follow or unfollow a trader. alerts: true also tells you (copy alerts) when they buy or sell one of our coins.
| parameter | in | type | meaning |
|---|---|---|---|
walletrequired | body | string | the trader |
on | body | boolean | false unfollows (default true) |
alerts | body | boolean | copy alerts on or off |
curl -X POST "https://getcook.vercel.app/api/follow" -b cookies.txt -H "content-type: application/json" -d '{"wallet":"TRADER","on":true,"alerts":true}'Your copy alerts. Opening it also refreshes (at most 4, each at most every 2 minutes) the traders you follow with alerts on. POST { ids: string[] | "all" } marks alerts seen. To replay one, open /coin/<mint>?buy=<sol>: your own wallet signs.
| parameter | in | type | meaning |
|---|---|---|---|
ids | body | string[] | "all" | POST: which alerts to mark seen |
curl "https://getcook.vercel.app/api/alerts" -b cookies.txtSquads, best first. POST { name, tag } (signed in) creates one and makes you captain; one squad per wallet.
| parameter | in | type | meaning |
|---|---|---|---|
window | query | "1d" | "1w" | "1m" | "all" | default 1w |
name | body | string | POST: 2 to 24 characters |
tag | body | string | POST: 2 to 5 letters or numbers |
curl "https://getcook.vercel.app/api/squads?window=1m"- POST: 6 per 10 minutes.
One squad with its members (best PnL first) and its callouts.
| parameter | in | type | meaning |
|---|---|---|---|
idrequired | path | string | the squad id |
window | query | "1d" | "1w" | "1m" | "all" | default all |
curl "https://getcook.vercel.app/api/squads/SQUAD_ID"join (one squad per wallet), leave (the captain's seat passes on; an empty squad is removed), pin (captain only: pin or unpin a coin, up to 5).
| parameter | in | type | meaning |
|---|---|---|---|
idrequired | path | string | the squad id |
actionrequired | path | "join" | "leave" | "pin" | what to do |
mint | body | string | pin: the coin |
on | body | boolean | pin: false unpins |
curl -X POST "https://getcook.vercel.app/api/squads/SQUAD_ID/join" -b cookies.txtSession
Step 1 of Sign In With Solana: a message naming this site, your wallet, a nonce and an expiry (10 minutes).
| parameter | in | type | meaning |
|---|---|---|---|
addressrequired | query | string | your wallet address |
curl "https://getcook.vercel.app/api/auth/nonce?address=YOUR_WALLET"Step 2: send the message back with your wallet's signature of it (base58). Sets a 7-day httpOnly session cookie. Signing is free and sends no transaction.
| parameter | in | type | meaning |
|---|---|---|---|
addressrequired | body | string | your wallet |
messagerequired | body | string | the message from step 1, unchanged |
signaturerequired | body | string | the ed25519 signature, base58 |
curl -X POST "https://getcook.vercel.app/api/auth/verify" -c cookies.txt \
-H "content-type: application/json" \
-d '{"address":"YOUR_WALLET","message":"...","signature":"..."}'Who you are signed in as, and the coins you launched. me is null when signed out.
curl "https://getcook.vercel.app/api/me" -b cookies.txtClear the session cookie.
curl -X POST "https://getcook.vercel.app/api/auth/logout" -b cookies.txtStatus
Is the site up and its database reachable? 503 only when a configured database does not answer.
curl "https://getcook.vercel.app/api/health"The operator's go-live checklist, safe to read: mode, whether the rail is armed, the treasury address and balance, how many launches it can pay for, the launch gate, how long ago the crank last ran, and every check with its reason. Never a secret value. With the operator's x-admin-key it adds counts and recent errors.
curl "https://getcook.vercel.app/api/preflight"Not public: operator and dev routes
These exist but are not part of the public API, and need an operator secret or a development server: /api/cron/crank (claims and books fees, runs buybacks and burns, assesses launch windows, releases vested rewards), /api/cron/flywheel and /api/cron/brain (the scheduled jobs; CRON_SECRET or x-admin-key), POST /api/social/admin (x-admin-key: review queue for bio checks the platform blocked), POST /api/dev/seed and POST /api/traders/dev-seed (demo data; answer 404 in production), and /api/media/* (local development only, where pictures are served from disk; in production pictures live in object storage). GET /m/<key> serves a coin's metadata JSON, the link written into its pool creation. Also not public: GET /api/cron/incentives (the upkeep pass for caller outcomes, referral retention and referral payouts; CRON_SECRET or x-admin-key) and POST /api/incentives/admin (x-admin-key: the creator review queue).
Limits & safety
The rules launches run under, and how the money is kept apart.
What a coin can be
| field | rule |
|---|---|
| name | 1 to 32 characters (32 bytes); links, @mentions and $tickers are stripped |
| ticker | 2 to 10 plain letters or digits. A ticker or name that launched in the last 60 minutes is refused (see Anti-vamp) |
| description | up to 500 characters |
| picture | PNG, JPEG, WebP or GIF, checked by its bytes, cropped square |
| links | an X profile, a Telegram group, a website (https) |
| recipe | slices adding up to exactly 10,000 bps with buyback at least 3,333 and house exactly 3,334; a basket of 1 to 5 stocks adding up to 10,000; up to 4 social routes and 4 wallet routes; a persona up to 280 characters; a hold time of 0 to 1,440 minutes (default 30) |
| quote | SOL only |
Keys and money
- One key signs launches and spends: the treasury's. It lives only in the server's environment, never in the database, the code or a page. It arms only in live mode; in preview nothing is ever signed.
- Your key is yours. The COOK wallet's key is made in your browser and never reaches the server. The wallet relay forwards only transactions that are already fully signed and valid.
- Nothing here takes a private key from you. The site never asks for a seed phrase or a key.
- Claim wallets are derived, not stored. A social account's key is re-derived only inside the claim step, and only pays the account's verified, bound wallet.
- Brains hold nothing. No keys, no wallets, no accounts. Their apps are sandboxed.
- Every swap is checked before it is signed: exact amount in, the treasury as the only missing signer, a simulation that shows the expected tokens arriving and nothing else leaving.
- Buckets are walled off. A bucket only pays its own job; the guard bucket only buys back and burns its own coin; launches only spend the float (balance minus everything owed).
- The operator can pause launches and spending jobs with a switch, without touching anyone's money.
Request limits
Routes that do real work are rate limited per caller (the signed-in wallet, or a hash of the IP): for example 6 launches, 10 uploads and 90 anti-vamp checks a minute, 20 sign-ins a minute, 30 wallet broadcasts a minute, 20 callouts, 12 comments, 40 follows and 60 likes a minute (a callout is also limited to one per coin per 10 minutes). Creator applications, submissions and referral attributions have their own limits. Going over answers 429 with a sentence saying so.
Terms
The short version. Use COOK only if you accept it.
- Not financial advice. Nothing here, including a callout, a leaderboard rank, a brain's draft or a number on a coin page, is advice or a recommendation to buy or sell anything.
- Not affiliated with Meteora. COOK uses Meteora's public programs. Meteora does not run, endorse or support this site. Other names (Solana, Jupiter, xStocks and so on) belong to their owners.
- You are responsible for your own trades and your own laws. Check what you may do where you live. We cannot give legal advice.
- No promises about price. A recipe makes a coin's fees useful. It does not make the coin go up. Developer rewards, referral rewards and creator payouts are not guaranteed: they depend on milestones, rules and, today, a payout sender that may still be switched off.
- The software can be wrong. Surcharges, milestones and outcomes are computed from chain data we can fail to read. When we cannot read, we release nothing and mark it partial.
- We may change settings for new coins. Fees, windows, schedules and prices can change. A coin keeps the recipe it was born with.
- Do not abuse it. Wash trading, wallet-farming referrals, copying content for creator payouts or posting paid promotion without saying so can get rewards withheld.
Privacy
What the site keeps, and what it never sees.
What we store
- Wallet addresses you sign in with or trade from. Addresses are public on chain anyway.
- Your public activity: callouts, comments, follows, squads, profile text, the coins you launched, and trades we verified.
- Referral codes, who arrived through whose code, and what was earned.
- Creator applications and submissions: the handle, links and notes you send.
- A referral cookie called
cook_ref. It holds a referral code for 30 days. A copy may also sit in your browser's local storage. - A session cookie after you sign in, so the site knows which wallet you are.
- Rate-limit data: a hash of your IP address, for a short time.
What we never see
- Private keys, passcodes and seed phrases. Your COOK wallet key is made in your browser and stays there, encrypted. We cannot recover it.
- Your browsing on other sites. The site loads no third-party scripts into pages that can sign.
What is public
Callouts, positions, PnL, referral counts, caller outcomes, ledger rows and payouts are public and tied to a wallet address. If you do not want an address linked to your activity, use a wallet you do not mind being linked. To remove something, tell us on X. Chain data cannot be erased.
Risks
Read this before you put money into anything here.
- Memecoins can go to zero. Most do. A buyback and burn makes a coin's fees useful; it does not make the coin go up. Do not spend what you cannot lose.
- The recipe is kept by our crank. The pool pays the treasury; the recipe, the surcharge assessment and the vesting are our promise, proven in the ledger. If the site stops, fees keep arriving at the treasury but buckets stop being spent until it is back.
- Early buyers can owe a surcharge. Buying a lot in the first 60 seconds can cost an extra 2% to 15% on the part above each bracket, recovered from your later payouts. See Launch protection.
- Meteora's contracts. Coins live in Meteora's Dynamic Bonding Curve and, after graduation, a DAMM v2 pool. A bug, a pause or a change there reaches every coin here. COOK is not affiliated with Meteora.
- One master wallet. The treasury holds fees between crank passes. Its key is guarded, but a single key is a single point of failure.
- Your COOK wallet is yours to lose. Its key lives only in your browser, encrypted by your passcode. If you clear site data without exporting the key, or forget the passcode, nobody can recover it, including us.
- Untested money paths. Referral and creator payouts, developer releases, social claims and drops are simulated or tested against fake networks until the operator switches each on, and some have not moved real money on mainnet yet. The ledger says which.
- Milestones and outcomes are estimates. They read the trades the site indexed. A determined actor can slip past wash detection, and a peak is a floor.
- Tokenized stocks are not shares. They track a price, can be paused by their issuer, and are not offered in every country.
- Price impact. Buybacks and basket buys move prices. They are capped per pass and checked against the quote, and on a thin market they wait.
- Rewards depend on volume. No trades, no fees, no drops.
- Brains can be wrong. What a brain writes is a draft, not advice or a promise.
- Social routes are not endorsements. Anyone can route fees to any account; the account's owner may never claim them.
- Paid promotion. Callers must disclose it, and we show what they say. We cannot check that they told the truth.
- Social trading is public. Your profile, positions, PnL and callouts are read from the chain and shown to everyone.
- Not financial advice. Not affiliated with Meteora.
FAQ
No. Coins are quoted in SOL and there is no platform coin. Be careful with any token that claims to be one.
Glossary
- assessed
- a surcharge COOK has worked out that a wallet owes for buying a lot in the launch window. Not yet money.
- basis point (bp)
- 0.01%. 10,000 bps = 100%. Recipe shares are bps of the coin's normal part.
- bonding curve
- the starting market of a Meteora Dynamic Bonding Curve coin: the price rises as people buy, until the coin graduates.
- bucket
- one slice's running account on one coin: earned, spent, waiting.
- bundle
- several wallets acting as one buyer, usually to grab the opening of a coin.
- burn
- removing tokens from the supply on chain (
BurnChecked). Only a confirmed burn is called burned. - callout
- a post about a coin that carries the caller's live position (long or exit), its outcome, and whether it was paid promotion.
- claim wallet
- the wallet derived for one social account; it holds that account's SOL until the owner claims.
- cooldown
- the 60 minutes after a coin launches in which its ticker and name cannot launch again.
- crank
- the server job that runs every few minutes: claims fees, books them, spends buckets, finishes launches, journals everything.
- DAMM v2
- Meteora's constant-product pool a coin moves to when it graduates.
- DBC
- Meteora's Dynamic Bonding Curve program. COOK's only venue.
- developer rewards
- the
walletslice that pays the launcher, released by milestones at days 7, 14 and 30. - drop
- one payout of a stocks or airdrop bucket to the coin's eligible holders.
- first slot
- the slot a pool is created in. Buys in it pay the base fee plus 10%, on chain.
- float
- the treasury's balance minus everything it owes to buckets: the only money launches may spend.
- graduation
- a coin finishing its bonding curve and moving to a DAMM v2 pool.
- guard bucket
- a coin's launch-window money: the first-slot extra plus recovered surcharges. 100% buys the coin back and burns it.
- hold time
- how long a wallet must hold (two snapshots apart) before drops pay it.
- house
- the exactly-33.34% slice that funds referrals, callers and creators.
- lamport
- the smallest unit of SOL: 1 SOL = 1,000,000,000 lamports.
- launch allocation
- the supply the curve sells. The surcharge brackets are measured against it.
- launch window
- the first 60 seconds after a pool is created.
- COOK wallet
- the browser wallet this site creates for you: passcode-encrypted, never leaves your browser, signs your trades.
- ledger
- the public journal of every money move, each with its transaction.
- master wallet / treasury
- the one wallet that creates every coin and claims every pool's fees.
- milestones
- the checks (retention, organic volume, liquidity) that unlock developer rewards.
- mint
- a coin's address on Solana.
- normal part
- the share of a fee claim that follows the coin's recipe (everything but the guard part).
- recipe
- a coin's slices: where its fees go, frozen at birth.
- recovered
- the part of an assessed surcharge that has actually been withheld from a wallet's payouts.
- rent
- the SOL deposit every Solana account needs; returned when the account is closed.
- SIWS
- Sign In With Solana: proving you own a wallet by signing a message. Free, no transaction.
- slice
- one line of a recipe: a kind and a share.
- snapshot
- a reading of a coin's holders at one moment, used to decide drops.
- squad
- a small group of traders (2 to 5 character tag) ranked together by summed PnL.
- tape
- the live strip of money moves under the top bar.
- tray
- where small stock shares wait for a wallet until they are worth a token account.
- vamp
- a copy of a working coin (ticker, name or picture) made to farm its story.
- vesting
- developer rewards that accrue as a coin earns and are released in steps.
- xStocks
- tokenized stocks on Solana that track listed shares, e.g. TSLAx.
Social routes (paid)
Send a slice of a coin's fees to any X, Instagram or TikTok account. The owner claims it when they want it.
A social route pays an account, not a wallet. The account's owner does not need to know about it in advance: their SOL waits in a claim wallet made for that exact account until they prove the account is theirs and claim. Fees routed to a creator are a tip, a bounty or a thank-you; they are not an endorsement by that creator.
Pricing
Each routed account costs a one-time fee at launch (the
social_routeprice, 0.1 SOL unless the operator changed it), paid to the treasury before the coin is created. A recipe holds at most 4 social routes. The live price is in Paid features & pricing and on the create page.Claim wallets are derived
Every account has exactly one claim wallet, computed from the platform and the handle, never stored:
The address is written into the coin's recipe at birth, so a route always pays the same wallet. The key behind it is only re-derived inside the claim step, on the server, to pay the account's verified owner.
a-z 0-9 _a-z 0-9 . _, not starting or ending with a dot, no..a-z 0-9 . _, not ending with a dotProfile links are accepted too:
x.com/Foo,instagram.com/foo/,tiktok.com/@fooall become the handle.Verify with a bio code
Sign in with the Solana wallet that should receive the SOL. Signing in is a free message signature, not a transaction.
Open Rewards, go to Social claims, pick the platform and type your handle. You see what the account has earned, what is claimable and which coins route to it.
Press Get code. You get a short single-use code like
launch-7KQ2-9Athat expires after 30 minutes and allows 40 checks.Paste the code anywhere in the account's public bio (X: Edit profile, Bio; Instagram: Edit profile, Bio; TikTok: Edit profile, Bio) and save.
Press Check. We read the account's public profile; if the code is there, the account is bound to your wallet. X is read reliably. Instagram and TikTok often refuse server reads: the check then keeps your code for the operator to review (up to 7 days) instead of telling you the code is missing.
Remove the code from your bio whenever you like. The binding stays.
Claiming
Once the account is bound, press Claim. The claim wallet sends what it holds, minus its rent-exempt floor and a small reserve, to your bound wallet, and the claim is journaled; the treasury pays the network fee. The smallest claim is 0.001 SOL. Claim as often as you like; new fees keep arriving as the coins trade. Only the bound wallet can claim, and claims open only when the operator has switched them on (
SOCIAL_CLAIMS).