Skip to content
Solana

Docs · Revenue tokens

How pools pay a revenue token

Coming

Every 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.

Not live yet: this runs in a reel-vaults module that is built and tested but not in the deployed build. The page describes it so integrators can see where it fits; details can change before it ships.

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

StreamLands inCollected byWho can hold it
Base LP fee, LP-routed block fees, surchargesfee_growth_quoteFeesCollect on each positionPosition owners; the launch owner for launch positions
Recapture LPs' part, King of the Pool releasesThe LP stream, released into fee growth over release_secsFeesCollectSame as above
Blocks routed to 1 (owner)OWNER bucket (2)BucketCollectLaunch owner, or the beneficiary while launch-locked
Creator royaltyROYALTY bucket (3) → ledgerBucketCollect, then Claimroyalty_to
Blocks routed to 4 (payee)PAYEE bucket (9)BucketCollectPool.payee
Swap Reward Mint remainderREWARD_CREATOR bucket (7)BucketCollectPool.payee
Sandwich and other charges routed to 2HOLDER_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.
A stream only pays while its pool trades. A revenue token's income is whatever its locked fee rights earn, nothing more.