Fees
0.30% of value at the current rate, charged as 0.15% from each side in that side's own asset.
The split
Nothing is ever added on top of the listed price. The buyer is debited exactly the value they agreed to and is delivered 0.15% fewer tokens. The seller is credited 0.15% less quote. Both halves land in the protocol treasury inside the same transaction.
| Amount | |
|---|---|
| Buyer pays | value, exactly as listed |
| Buyer receives | tokens × 0.9985 |
| Seller receives | value × 0.9985 |
| Protocol collects | 0.15% in quote + 0.15% in token |
Worked example
Buying 1,000 tokens listed at 1 USDC:
| Amount | |
|---|---|
| You pay | 1,000.00 USDC |
| You receive | 998.50 tokens |
| Seller receives | 998.50 USDC |
| Protocol fee | 1.50 USDC + 1.50 tokens |
Why the listed price is never a valid bound
The on-chain price bound is measured per token received, and the buyer receives fewer tokens than they pay for. Always pass maxPricePerToken from quoteFill() or quoteBidFill(): a bound equal to the listed price reverts with PriceBoundExceeded every time.
Rounding
Every rounding decision favours the protocol by at most one base unit. Fee divisions round up, delivery amounts round down, and the invariants hold at settlement:
buyerPays = value, andvalue − sellerReceives = quoteFeeamount − buyerReceives = tokenFee, exactly- a fill so small the token fee would consume it is rejected with
ZeroTokensReceived
Splitting a purchase into many small fills is never cheaper than buying at once, and never reduces what the protocol collects.