Fees
One number, split two ways, and yours is the larger part.
The split
Every trade pays the fee you chose at launch — 1% by default, anywhere from 0.01% to 10%. The fee vault collects it and splits it:
| share of the fee | of trade volume, at a 1% fee | |
|---|---|---|
| You, the creator | 80% | 0.80% |
| Protocol → King of the Hill buyback | 20% | 0.20% |
There is no third line. The protocol keeps nothing for operations: with buybackBps at 10,000, its
whole share is sent to the buyback sink on every collect, and the sink buys the top coin of each round
and burns it.
Every fee is paid in the pair asset — never in your coin. The pool's own Uniswap fee is zero; the
launch's fee is charged by the protocol's pool hook (RainbowHook) on the pair-asset side of every
trade: out of what a buyer pays in, and out of what a seller receives. So your earnings are always in
WETH, USDC, UNI or whatever you paired with, and nothing the protocol does with fees ever sells your
coin on its chart. It also means nobody else can earn your pool's fee: liquidity someone else adds to
the pool earns nothing.
Every trade pays it, including your own dev buy at launch — which is the pool's first trade, and 80% of whose fee comes straight back to you.
Coins launched before the hook (the first two launchpads) work as they always did: the pool fee is earned by the locked position on each trade's input — the pair asset on a buy, the coin on a sell — and collected by the first fee vault. The coin page says which a coin is ("Fee paid in").
Your 80% cannot be taken away
The creator share is snapshotted onto your launch at the moment it happens. Changing the default afterwards applies to future launches only; it cannot reach back and cut what an existing coin earns. This is deliberate and it is tested: a creator commits to a launch on the strength of a number, and a protocol that can revise that number later has not really given them anything.
The protocol's own 20% is not snapshotted, because it is the protocol's own money. You can read any
launch's own figure with feeVault.launchOf(token).creatorFeeBps rather than taking this page's word
for it.
What you can do with your share
A setting on the fee vault rather than on the pool — so you can change it later, without relaunching. The one exception is holder rewards, which is final.
Where it goes
setFeeRecipient(token, address) sends your share somewhere other than the wallet you launched from
— a multisig, a treasury, a splitter. Only you can call it, and it moves only your share.
A payout already deferred stays claimable by whoever it was owed to.
Or: buy back and burn
setFeeRoute(token, BuybackBurn) stops paying you and destroys your share instead: it buys your
coin in its own pool and burns what it buys — so the buyback walks the price up through the same
range your launch seeded. (On a coin from before the hook, the part of your share that arrived in
your coin is burned directly.) The buyback itself pays no fee: it is your own fees at work.
It runs inside the same transaction as the fee collection, and the coins bought are sent straight to the burn address without ever touching the vault's balance.
One collect's buy may move the pool's price by at most a quarter of the pool fee. Collects are
permissionless, so a sandwich — trade, collect, trade back — costs nothing to arrange; it only pays
when the collect moves the price by more than the round trip costs in fees, and the cap keeps every
one underwater. What the cap holds back is not wasted: it waits in pendingBuyback(token) and joins
the next collect's buy.
Or: reward your holders
setFeeRoute(token, HolderRewards) gives your share to the coin's holders, paid in the pair
asset — a coin paired with WETH pays its holders WETH, one paired with USDC pays USDC.
Your share already is the pair asset, so it goes to the holders as it is — nothing is sold. (On a
coin from before the hook, the part of your share that arrived in your coin is sold for the pair asset
in the coin's own pool, inside the collect, under the same quarter-of-the-fee price cap as a buyback;
what the cap holds back waits in pendingRewards(token) for a later collect.)
It goes into a rewards pot for your coin, rewardsPot(token), on chain and visible to anyone —
the coin page shows it, with every payout made from it. Each collect that adds to it emits
HolderRewardsAdded.
This route is final. A launch can move onto it from either other route, and never off it — not
back to paying you, not to a burn (FeeRouteLocked). Holders are told your share is theirs; a
creator who could switch it back could make that promise and break it the same day.
It can only be chosen once the fee vault has a distributor: the one address allowed to pay out of
pots, set by the owner with setHolderRewardsDistributor. Until then the route is refused
(HolderRewardsOff) and the launch form does not offer it. The distributor can be replaced but
never removed, so a pot can never be stranded without anyone able to pay it.
How holders are paid
A contract cannot cheaply list every holder of a token, so the payout is computed off chain, by the
project's distributor (distributor/ in the repository), and settled on chain by
payHolderRewards(token, recipients, amounts):
- Every few hours it reads every holder of the coin from the chain, from the coin's own
Transferhistory. - Each holder counts for what they held through the whole interval since the previous payout — the smaller of their two balances. Buying just before a snapshot and selling just after earns nothing.
- What reached the pot since the previous payout is split pro rata to that, and paid to everyone owed more than dust; smaller amounts carry over until they are worth a transaction.
Left out: the pool, the launchpad, the fee vault, the protocol's treasury and buyback sink, the distributor, and contracts rather than wallets. Coins deposited in another market or contract earn nothing while they are there.
What the contract guarantees: nothing leaves a pot except to the addresses a payout names, never more
than the pot holds (PotTooSmall), only when the distributor sends it (NotDistributor), and every
recipient and amount is published in HolderRewardsPaid. What it cannot guarantee is the split
itself — holders trust the distributor's arithmetic, and the events are there so anyone can check it.
If the distributor's key is ever in doubt, the owner names a new one; the pots do not move.
Collecting
collect(token) is permissionless — anyone can trigger it, including a bot, including you. It
does not matter who calls it, because the proceeds can only ever reach the recorded recipient or the
rewards pot, the buyback sink and the treasury, or the burn. There is no path by which a caller pays
themselves. The project runs a keeper that sweeps launches with enough waiting to be worth the gas;
if it stops, fees keep accruing in the position and the next collect, from anyone, sweeps all of it.
If a payout cannot be pushed — a blacklist, a paused token, a contract that will not accept it — it
becomes a claimable balance (owed, then claim) rather than reverting. One party being unable
to receive must not strand everybody else's fees. Holder-rewards payouts use the same path.
