Fee routing
Turn a share of trading fees, or any USDC budget, into deeper liquidity for your token — automatically, on-chain, without running anything yourself.
The idea
A fee router is a contract you own that holds USDC and deploys it into your pool's liquidity when a condition you set is met.
It does not care where the USDC comes from. A launchpad forwarding your fee share, a treasury wiring a monthly budget, or you sending some by hand all look the same to it. That is deliberate — capturing fees through a custom Uniswap hook would only have worked for pools deployed with that hook, which is almost none of them.
USDC arrives (launchpad fees, treasury budget, plain transfer)
│
▼
FeeRouter ──── trigger met? ────► inject()
│ │
│ ▼
│ vault deposits it as liquidity
│ │
│ ▼
└─ unspent budget stays shares ──► burn address
withdrawable by you (liquidity is now permanent)Two triggers
| Mode | Fires when | Typical use |
|---|---|---|
| Cadence | A fixed interval has passed. Minimum one hour. | Steady, predictable deepening — a drip your holders can verify. |
| Milestone | Fully diluted market cap crosses each threshold you set, in order, once each. | Committing publicly to add liquidity as the token grows. |
Each injection deploys a percentage of the router's current balance, so the budget tapers rather than emptying in one go. You can set a minimum size so gas never exceeds the amount being deployed.
Permanent or redeemable
Every injection mints vault shares. Where those shares go is your choice, fixed when you create the router:
- Burn address — the liquidity can never be withdrawn, by you or anyone else. This is the guarantee most holders actually want, and it is verifiable on-chain.
- Your wallet — the injected liquidity stays yours and remains redeemable.
Nobody has to run a keeper
inject() is callable by anyone. The trigger conditions decide whether it is valid, not the caller, and the destination is fixed at creation — so a stranger calling it cannot redirect anything. In practice this means the automation keeps working whether or not you are paying attention.
Milestone mode does depend on the vault's price average being current, which means someone has to call poke() regularly — about every ninety seconds keeps the average within a window the vault will act on. Deposits and withdrawals do it on the way through, and Slice runs a keeper that covers every vault regardless. Who runs it. Cadence mode needs none of this.
Setting one up
1. Create the router
Pick your pool's vault and choose whether injections are permanent. This deploys a router that only you can configure.
2. Configure the trigger
Choose cadence or milestones, the share of budget per injection, and a minimum size. You can change this later.
3. Fund it
Send USDC to the router address, or call fund() to emit an event indexers can attribute. Then it runs.
sweep(). If you want to promise holders otherwise, fund the router from a contract that enforces the lock — and point injections at the burn address so whatever has already been deployed is permanent regardless.