How Hookium works
Every coin on Hookium launches with hooks: rules that run inside every trade of that coin. They can take a cut, burn coins, refuse a trade, lock a wallet or pay holders. The creator picks them at launch, they are written into the coin's own contracts, and from then on nobody can change them. This page explains the parts, in order, for traders and for developers.
Why hooks
A coin that charges a fee usually does it in the worst place: inside its own transfer function.
The usual way to give an EVM coin a tax is to override transfer and skim a percentage off. It works, but the token is guessing. A transfer doesn't say why it happens, so the token decides a transfer is a "sell" because the receiver is a pool address it was told about. A trade through a pool it doesn't know looks like a gift, a gift to the pool looks like a sell, and every router needs a special "supporting fee on transfer" path. The owner can usually raise the tax later, which is how a honeypot works. And remembering anything about a holder means bolting more storage onto every transfer.
Hookium moves the rules to where the facts are. Every coin has its own market contract, and that market is the coin's pool: the bonding curve before graduation and the AMM pool after it. The market knows the direction, the amounts in and out, the price and the reserves, because it is doing the trade. A second contract, the rules contract, sees every transfer of the coin, including wallet to wallet, and can refuse one. Both read their settings from the coin's launch record, which can't be edited.
| A tax token | A Hookium coin | |
|---|---|---|
| Buy or sell? | Guessed from a list of pool addresses | Known: the market is doing the trade |
| Where the fee comes from | Skimmed from the transfer, every transfer alike | Taken from the trade's input or output; a gift between wallets pays nothing |
| Rates | Usually editable by the owner | Fixed at launch, for good, including the platform's |
| Burning | Extra code in transfer | A share of the coins in every trade, burned by the market |
| After listing | Breaks or gets delisted on some venues | Graduates into a pool inside the same market, so every hook keeps running |
| Refuse a transfer | Yes | Yes: max wallet, early lock, dev lock, organic, custom hooks |
| Pay holders | Usually a separate dividend tracker | Built in: the pot streams to holders by size, per second |
The contracts
Six contracts. One market and one token per coin; the rest are shared.
| Contract | What it does |
|---|---|
HookiumFactory | Checks a launch's hooks against the limits, creates the coin and its market, and does the creator's first buy in the same transaction so nobody gets in first. Holds the platform settings. |
HookiumMarket | One per coin. Runs the bonding curve, then the pool. Takes the fees, the burn and the exit tax on every trade, and graduates the coin when the curve sells out. |
HookiumToken | The coin: a standard ERC-20 with permit and burn. Its supply of 1,000,000,000 is minted once, to its market. Every transfer calls the rules contract. |
HookiumRules | Applies each coin's checks on every transfer: dev lock, launch block, organic, early lock, max wallet, a custom hook. Also keeps the holder-rewards ledger. |
HookiumPot | Collects each coin's pot share, and when anyone runs it, buys back and burns and/or streams to holders. Holds a creator's vesting first buy. |
HookiumReferrals | Remembers who referred each trader and pays them a share of the platform's fee, never anyone else's. |
None of these sit behind a proxy. Each market is a minimal clone of one fixed implementation. What's deployed is what runs.
The hooks
The kit a creator mixes from at launch. The factory refuses anything outside these limits.
0, 0.5, 1 or 2% of every trade, to the creator. Claimed from the coin page.
0, 0.5, 1 or 2% of every trade into the coin's pot, split between buyback-and-burn and holders (any split, 0 to 100%). Section 5.
Up to 2% of the coins in every trade, burned for good. On a buy it comes out of what you receive, on a sell out of what you send.
Up to 20% extra on sells at launch, falling in a straight line to zero over 1 minute to 30 days. It goes into the pot, so the coin needs a pot.
No wallet may hold more than 0.5% to 10% of the supply, until graduation or for good. The market and the pot are exempt.
Coins bought in the first 10 minutes or less can't be sold or moved until up to 7 days after launch. Only the amount bought early is locked.
Nobody but the creator buys in the launch block, and at most 1 to 50 buys a second for up to an hour. Buys under 0.01% of supply don't use up a slot, so dust can't lock others out.
The creator's first buy is held by the pot and released to them in a straight line over up to 90 days.
The launch wallet can't sell or move its coins until graduation, and nobody else buys in the launch block. It must be launched from a wallet, not a contract.
An approved contract that sees every transfer and can refuse it: cooldowns, allow-lists, game rules. It can never move anyone's coins. Section 8.
Cuts (creator, pot, burn, exit tax) run in the market, so they only ever touch a trade. A transfer between two wallets pays nothing. Checks (the rest) run in the rules contract on every transfer. A check can only refuse; it can't take anything. If one refuses, the whole transaction reverts and nothing moves.
A trade, in order
Everything below happens in one transaction. If any step fails, none of it happened.
- 1The fee comes off your HYPE: platform, creator and pot rates added together, plus the anti-snipe extra just after launch.
- 2The rest goes into the curve (or the pool), which prices it and gives out coins.
- 3The burn share of those coins is burned.
- 4The coins move to you. That transfer runs the checks: launch block, organic, early lock (which records what you bought), max wallet, any custom hook.
- 5If this buy sold the last of the curve's 793.1M coins, the coin graduates right here (section 6).
- 1Your coins move to the market. That transfer runs the checks: dev lock and early lock.
- 2The burn share of your coins is burned. The rest goes into the curve (or the pool) and comes out as HYPE.
- 3The fee comes off that HYPE, plus the exit tax if the coin has one and it hasn't run out yet. The exit tax goes into the pot.
- 4The rest is sent to you, as HYPE or as WHYPE.
Anti-snipe. For the first 30s after a launch, the platform fee has an extra 10% on top that falls to zero in a straight line. It all goes to the platform, it isn't shared with referrers, and the creator's own first buy in the launch transaction doesn't pay it.
Slippage. Every buy and sell takes a minimum amount out. If the price moved past it before your trade landed, the trade reverts and you keep your funds.
The pot
Nobody owns a pot. It fills on every trade and anyone can empty it into the coin's chosen purpose.
A coin with a pot sends its pot rate from every trade, and any exit tax, into it. Once every 5m anyone can press Run pot on the coin's page. The runner keeps 0.5% of what's collected; the rest does what the coin launched with:
- Buyback and burn: buys the coin on its own market (paying no fee) and burns every coin it buys.
- Holders: streams out over 1h, second by second, to every wallet in proportion to what it holds at that moment. Rewards add up on the coin's page and you claim them whenever you like.
A run must come from a wallet, not a contract, and not in a block that already traded the coin, so nobody can wrap it between a buy and a sell. A single run buys back at most 1% of the market's HYPE reserve; anything over that waits for the next run. And because the holder share streams by the second, buying just before a run and selling just after earns almost nothing.
Curve and graduation
Every coin starts on a bonding curve and ends in a pool that nobody can pull.
Each coin has 1,000,000,000 coins. 793.1M are sold on a constant-product curve with virtual reserves, so the price rises as people buy. The sale that takes the curve past 793.1M also graduates the coin, in the same transaction: the HYPE raised and the remaining 206.9M coins become the reserves of a constant-product pool.
That pool is the same market contract. There are no LP tokens and no function that withdraws the reserves, so nobody can remove the liquidity: not the creator, not Hookium. Because the market is still the pool, every hook keeps running after graduation, and a dev lock lifts at that moment.
- Dev's coinsUnlocked
- Every hookStill running
The pool is part of the coin's own contracts, so pots, burns and caps keep working after graduation.
Fees and referrals
All rates are written into a coin when it launches, the platform's included.
| Fee | Rate | Goes to |
|---|---|---|
| Platform | 0.5% of every trade (rate for coins launched now) | Hookium, minus the referrer's share |
| Anti-snipe | +10% at launch, gone after 30s | Hookium |
| Creator | 0, 0.5, 1 or 2% | The creator, claimed from the coin page |
| Pot | 0, 0.5, 1 or 2% | The coin's pot |
| Exit tax | up to 20% on sells, shrinking to 0 | The coin's pot |
| Burn | up to 2% of the coins | Nobody: burned |
| Pot runner | 0.5% of a run | Whoever runs it |
Referrals. Share a link ending in ?ref=your-address. The first wallet that refers a trader stays their referrer, and earns 25% of the platform's fee on every trade that trader makes, on every coin. It only ever comes out of Hookium's share: creators, pots and holders get exactly the same. Contracts that trade for many people (routers, aggregators) are never tied to a referrer. Earnings are claimed from your profile.
Blocking a scam's creator fees. The platform owner can block a coin's creator fees (for example a coin pretending to be someone it isn't) and move what's waiting to the fee wallet. That touches nothing else: not the coin's trading, its holders, its pot or its pool.
Write a hook
A custom hook is a contract the rules contract calls on every transfer of the coins that chose it.
interface IHookiumHook {
/// Called inside the coin's transfer, while its market is locked.
/// isBuy: the coins come out of the coin's market
/// isSell: the coins go into the coin's market
function onTransfer(address token, address from, address to,
uint256 amount, bool isBuy, bool isSell) external;
}- To refuse a transfer, revert. A hook can't change an amount or move anyone's coins; it only answers yes or no.
- Only the rules contract may call it: check
msg.sender, or anyone could write to your hook's storage. - Anyone can buy coins for another wallet, so don't let a transfer to someone change their limits. To treat something as a wallet's own buy, check
to == tx.origin. - A coin can only launch with a hook the platform has approved, after a read of its code. Once a coin launched with it, it stays.
- To get yours approved, send it in through the Workshop: upload the source, accept the terms and pay 0.2 HYPE to the fee wallet. A reviewer reads it; approved hooks appear in the Workshop and the launch builder.
contract CooldownHook is IHookiumHook {
address public immutable rules;
uint32 public immutable cooldown;
mapping(address => mapping(address => uint64)) public lastBuy; // token => holder => time
function onTransfer(address token, address from, address to, uint256, bool isBuy, bool isSell) external {
if (msg.sender != rules) revert OnlyRules();
if (isBuy && to == tx.origin) lastBuy[token][to] = uint64(block.timestamp);
else if (isSell) {
uint64 until = lastBuy[token][from] + cooldown;
if (block.timestamp < until) revert CoolingDown(until);
}
}
}| Approved hook | Address |
|---|---|
| Cooldown: No selling within 60 seconds of your last buy. | 0xfc0b93f843673f294cea7b5e35ff4541d0aea0b7 |
Who can change what
What the platform owner can do, and what nobody can do, read from the contracts.
- Set the platform fee for coins launched from then on (at most 2%)
- Set the anti-snipe extra (at most 25%, over at most 10 minutes)
- Set the pot interval (30 seconds to a day) and the holder stream
- Open or close new launches, and set a launch fee (at most 10 HYPE)
- Approve custom hooks and pairs, change the fee wallet
- Set the referrers' share (at most half the platform fee)
- Block one coin's creator fees
- Change a launched coin's hooks or any of its rates
- Mint more of a coin
- Move anyone's coins or HYPE
- Withdraw a coin's pool or curve reserves
- Spend a pot on anything but what the coin launched with
- Upgrade the contracts: there are no proxies
| Contract | Address (Elysium testnet) |
|---|---|
| Factory | 0x0b3fba6dbf59248c702930b988c4cfb611a15aed |
| Rules | 0x935f609a1860dc9812e670382f4eb43809507247 |
| Pot | 0xc8368fd0dd883a73b7582b441bf5cbf75bdd8980 |
| Referrals | 0x663fcaef40dc6b2ac19c31b1dce88d639efef579 |
| Market implementation | 0x50174ff33f007d5335c047eeff1027f2bf06f35a |
| Owner | 0xc10a826df3cbc47c48ed47a56ec668c13634cbd5 |
The contracts have been through an internal review and static analysis (Slither), with every finding fixed or explained, and a test suite with invariant fuzzing. They have not had an external audit yet. Treat them as new code on a new chain, and only trade what you can afford to lose.
Read-only API
Public JSON for bots, dashboards and aggregators. No key, no sign-up.
| Base URL | https://hookium.fun/api/public/v1 |
| Methods | GET only. Anything else gets 405. |
| Rate limit | 120 requests a minute per IP. Over that: 429. |
| CORS | Open to every origin. |
| Paging | limit (1 to 100, default 50) and cursor: pass back meta.nextCursor until it's null. |
| Numbers | Amounts are in whole units (1.5 = 1.5 HYPE), not wei. Times are ISO 8601. |
Endpoints
Quick start
curl "https://hookium.fun/api/public/v1/coins?sort=volume&limit=5"let cursor = null;
const coins = [];
do {
const url = new URL("https://hookium.fun/api/public/v1/coins");
url.searchParams.set("limit", "100");
if (cursor) url.searchParams.set("cursor", cursor);
const res = await fetch(url);
if (!res.ok) throw new Error((await res.json()).error.message);
const { data, meta } = await res.json();
coins.push(...data);
cursor = meta.nextCursor;
} while (cursor);A coin
{
"data": {
"token": "0x9ca3…33bc",
"market": "0x218f…7e55",
"name": "Barb the Fish",
"symbol": "BARB",
"creator": "0xf39f…2266",
"creatorName": "barb",
"createdAt": "2026-11-09T00:04:12.000Z",
"image": "/api/img/…",
"pair": { "symbol": "HYPE", "address": "0x…", "decimals": 18, "usd": 41.2 },
"stage": "curve",
"progress": 0.21,
"price": { "quote": 0.0000000331, "usd": 0.00000136 },
"marketCap": { "quote": 33.1, "usd": 1363.7 },
"volume24h": { "quote": 22.9, "usd": 944.3 },
"change24h": 41.6,
"trades": 37,
"holders": 8,
"burned": 137100,
"hooks": { "on": ["pot", "burn", "creator", "maxwallet", "earlylock", "organic"],
"creatorFeeBps": 50, "potFeeBps": 100, "buybackBps": 5000, "burnBps": 50, "maxWalletBps": 200, … }
},
"meta": { "network": "testnet", "chainId": 99801, "generatedAt": "2026-11-09T12:00:00.000Z" }
}Errors
{ "error": { "code": "not_found", "message": "No coin with that address" } }Codes: bad_request (400, a bad parameter), not_found (404), method_not_allowed (405), rate_limited (429), upstream (502, the chain's RPC didn't answer; try again). Hidden coins are left out of every list and return 404.
For anything the API doesn't cover, read the chain: every trade is a Trade event on the coin's market, and every launch a CoinCreated event on the factory.