Docs · Revenue tokens
How pools pay a revenue token
ComingEvery stream a reel swap pays, the account it lands in and who can collect it: the income a revenue token can receive, and the parts it never could.
Why a pool can pay a token at all
On Uniswap v4, hookr's hook sits inside every swap, so it can route a pool's take to a token. On reel the pool program itself runs the Hook Blocks, so the routing is part of the swap. Each charge is computed, split, and parked in a fixed place in the same instruction: fee growth for LPs, or one of ten buckets in the Pool account. Nothing about the destination can change after PoolInit.
A revenue token never needs to be inside the swap. It only needs to hold the right that a fixed destination pays.
The streams
| Stream | Lands in | Collected by | Who can hold it |
|---|---|---|---|
| Base LP fee, LP-routed block fees, surcharges | fee_growth_quote | FeesCollect on each position | Position owners; the launch owner for launch positions |
| Recapture LPs' part, King of the Pool releases | The LP stream, released into fee growth over release_secs | FeesCollect | Same as above |
| Blocks routed to 1 (owner) | OWNER bucket (2) | BucketCollect | Launch owner, or the beneficiary while launch-locked |
| Creator royalty | ROYALTY bucket (3) → ledger | BucketCollect, then Claim | royalty_to |
| Blocks routed to 4 (payee) | PAYEE bucket (9) | BucketCollect | Pool.payee |
| Swap Reward Mint remainder | REWARD_CREATOR bucket (7) | BucketCollect | Pool.payee |
| Sandwich and other charges routed to 2 | HOLDER_POT bucket (5) | BucketCollect, then HolderPay (reel-vaults) | The token's holders, by tokens × time |
Buckets hold quote atoms. LP income settles per position on both sides: a Position tracks quote and base growth, and FeesCollect pays what it is owed of each.
Collecting is permissionless where it can be
BucketCollect takes any signer. It checks that the destination's owner is the bucket's fixed recipient, so a keeper can push a creator's or a payee's income without being able to divert it. FeesCollect is signed by the position owner, or by the launch-lock beneficiary for a locked launch. A tokenizer that holds a position signs through its authority PDA when anyone runs its Sync.
What never reaches a revenue token
- The protocol share of block fees, the minimum fee, burn quote and recapture's protocol part. These go to the PROTOCOL bucket, less the integrator's and referrer's parts (PROGRAM.md §6).
- Auto Burn's burned tokens: they are destroyed, not paid.
- The King of the Pool pot: it pays round winners and releases to LPs.
- Market block usage fees: they split between the block's builder, its backers, reel and a reserve.