Every swap.
An auction.
Sign your trade. Solvers fight over who gets to fill it. Whatever extra they squeeze out vs. the AMM is yours, not the bot's. We don't skim.
- v4 hookopt in per pool. no router migration, no aggregator lock-in.
- gaszero on submit. you sign, you don't pay. fee comes out of surplus.
- if nothing fillsyour tokens never moved. order expires, wallet unchanged.
Three solvers walk into a bar.
You pocket the tip.
The diagram on the left isn't a mockup — that's the auction shape. Solver A is fastest, B stalls mid-race, C is just bad today. Whichever one quotes the best price wins the order. The bit they beat the AMM by? That's the surplus. It goes to you.
It's just signing a piece of paper. No new router.
You sign
An EIP-712 message. Says "I'll trade X for at least Y, valid until Z." That's it. No transaction sent. Permit2 means we don't even pull tokens until a fill lands.
Bots fight
Our solver bots — and anyone else who wants to write one — read your order off an open orderbook. They compete on who can deliver more Y. Whoever quotes best, wins.
You get paid
Settlement transfers Y to your wallet. If a solver quoted 1.03Y for your 1.00Y minimum, you get 1.03Y. We don't take that 0.03. No team treasury skim, no "fee on top."
Where we sit.
Yes, this is the table where we look best. We're aware. The honest read: UniswapX and CoW are real products that ship today; we're a v4-native variant that doesn't ask you to migrate routers. Pick whichever fits — we just wanted the v4 version to exist.
| AMM | UniswapX | CoW | Fill | |
|---|---|---|---|---|
| solver competition | — | ✓ | ✓ | ✓ |
| surplus to user | — | partial | 100% | 100% |
| v4 pool native | ✓ | — | — | ✓ |
| aggregator-compatible | ✓ | — | — | ✓ |
| no new router | — | — | — | ✓ |
| amm fallback safe | n/a | — | — | ✓ |
The token does
two things. That's it.
Solvers post a bond
If you want to settle batches at any kind of scale, you put $FILL up as collateral. Misbehave — settle a bad batch, fail to deliver — and your bond gets slashed. The slashed $FILL goes straight to stakers. Solvers eat the loss, stakers eat the cake.
- min bond
- 1,000 $FILL
- unbond delay
- 14 days
- slashed →
- to stakers
Stakers get the fees
The protocol charges a small fee on each fill, paid in whatever the user sold. We don't keep it. Anyone can push the accrued fees to the staking contract with a permissionless call — they get distributed pro-rata, in the original token, same block.
- stake lock
- 7 days
- protocol fee
- ≤ 2% (gov-tunable, starts at 0)
- reward tokens
- up to 16, paid in the real asset
No buy-back-and-burn theatre. No "treasury allocation." No emission schedules that pretend to be yield. The fee literally moves from one contract to the other in a single pushFeesToStaking() call. If that call doesn't fit the kind of yield you like, we're not the protocol for you, that's fine.
We audited ourselves before paying anyone.
Found two CRITICAL issues on day one — both in the settlement contract's interaction model, both have fixes in flight. We wrote up the full audit in AUDIT.md. Mainnet is gated on an external auditor signing off after our fixes land. No shortcuts.
| contract | role | address (sepolia) |
|---|---|---|
| FillSettlement | batch settlement · pulls via Permit2 · pays users | 0x0481…Fc03 ↗ |
| FillHook | v4 hook · routes opted-in pools through Fill | 0x2c1f…8088 ↗ |
| $FILL token | solver bond + staker reward | 0x00f2…D94c ↗ |
sepolia only. mainnet ships when an external auditor signs the report. that's the gate. we're not racing.
Stuff people ask.
How is this different from just swapping on Uniswap?
Do I have to trust the solver not to rug me?
What if no solver shows up?
What's the fee right now?
How is this a v4 thing?
Is the code open and verified?
Who's behind this?
First 500 wallets in. Then we slow down on purpose.
If we onboard everyone at once we'll discover bugs the loud way. We'd rather do it the quiet way — small group, real fills, fix things before scaling.