Fees
Protocol and referral fees are charged on-chain by the treasury. The rate is whatever treasury storage holds at fill. It is not a field in any EIP-712 digest. Production changes go through the treasury timelock.
Fees are power-of-two right shifts: fee = (power == 0) ? 0 : amount >> power. power == 0 means no fee.
CLOB, RFQ inventory, FixedPackage, and Dutch share the same premium and underlying protocol powers. Exercise is a separate power. When the quote maker funds a protocol leg, that leg’s protocol power is takerPower + 1 (half the fee). 0 stays off. Referral powers are never halved. Maker-post is a separate spam fee and is not discounted.
Defaults
| Fee | Power | Fraction | Approx. bps | Charged on | Who pays |
|---|---|---|---|---|---|
| Premium protocol (taker) | 7 | 1/128 | 78.125 | Option premium, and package premium | Buyer / package premium payer |
| Premium protocol (maker-fill) | 8 | 1/256 | 39.0625 | Same basis | Maker, when that side funds the leg |
| Underlying protocol (taker) | 12 | 1/4096 | 2.441 | Trade notional | Seller |
| Underlying protocol (maker-fill) | 13 | 1/8192 | 1.221 | Same basis | Maker, when that side funds the leg |
| Exercise | 13 | 1/8192 | 1.221 | Strike paid | Exerciser |
| Premium referral | 9 | 1/512 | 19.531 | Same basis as premium protocol | Buyer, when referrer != 0 |
| Underlying referral | 13 | 1/8192 | 1.221 | Same basis as underlying protocol | Seller, when referrer != 0 |
| Premium maker-post | 13 | 1/8192 | 1.221 | Resting buy premium | Maker, at orderBuy |
| Underlying maker-post | 17 | 1/131072 | 0.076 | Resting sell notional | Maker, at orderSell |
Treasury owner can change powers, or set a kind to 0 to turn it off. Non-zero premium powers (protocol, referral, and maker-post) must be ≥ 3. Other non-zero powers must be ≥ 4.
Maker-post defaults above are the catalog for supported chains other than Ethereum. The Ethereum catalog deploys both maker-post powers at 0 (gas prices resting spam). PREMIUM_ON_MAKER_POST and UNDERLYING_ON_MAKER_POST override the catalog at deploy. A later timelock can change them.
Referral is extra on top of protocol fees, not a cut of them.
CLOB
On a premium book, with no referrer:
| Role | Immediate cross | Rest, then fill | Rest, then cancel |
|---|---|---|---|
| Buyer | 78.125 bps of premium, taken from the posted premium | 1.221 bps of premium at post, plus 39.0625 bps of filled premium at claim | 1.221 bps of premium at post (kept) |
| Seller | 2.441 bps of notional, taken from the posted notional | 0.076 bps of notional at post, plus 1.221 bps of filled notional at claim | 0.076 bps of notional at post (kept) |
The order pull is the premium or notional, plus maker-post on the size that queues, plus referral. A full cross pays no maker-post. The fill fee is not escrowed up front: at the fill, posted amount N splits into the protocol fee and N - fee for the other side. Cancel returns the unmatched deposit and does not rebate maker-post or referral already forwarded.
Zero-premium books have no claim-maker path: the seller pays the taker underlying rate at post.
RFQ, FixedPackage, and Dutch
Inventory executeIntent is zero-premium fillMatched. There is no per-leg option premium, so the premium protocol power is unused. The underlying protocol fee applies on the sell leg: 2.441 bps when the taker sells, 1.221 bps when the quote maker sells (sellFrom == maker).
Package and Dutch cash premium is separate:
| Leg | Taker funds it | Quote maker funds it |
|---|---|---|
Package premium (makerPaysTaker) | 78.125 bps | 39.0625 bps |
| Underlying on package / Dutch legs | 2.441 bps of notional | 1.221 bps |
Package premium has no referral. Leg underlying referral still applies when referrer != 0.
Same-currency cap
If the book’s premium token is the option underlying for that trade (call → token1, put → token0), protocol fees cannot exceed 6.25% of that trade’s premium (premium >> 4). Underlying protocol becomes min(notional fee, 6.25% of premium). Different-token books have no cap. Referral and exercise ignore it.
What you pull
T = taker protocol, M = maker-fill (half of T), P = maker-post, R = referral.
| Action | Pull | With referrer |
|---|---|---|
| CLOB buy | premium + P of queued premium | + R of premium |
| CLOB sell | notional + P of queued notional | + R of notional |
| Inventory RFQ sell leg | notional + T or M | + R of notional |
| Package premium | package premium + T or M | same — no R |
| Exercise | strike + 1.221 bps of strike | same — no R |
CLOB fill fees come out of the posted amount later. They are not a second pull. Sell dust (remainder too small to earn later premium) returns unfilled underlying only. Referral on that dust stays.
Referral
address(0) or referral power 0 means no referral pull.
| Path | How referrer is set |
|---|---|
CLOB orderBuy / orderSell | Caller argument. Permit2 witnesses bind it. |
RFQ executeIntent | Inside maker-signed takerAddressHash (hash(taker, salt, directionsHash, referrer)). Fill must pass the same address. |
| FixedPackage | Same: trailing referrer must match takerAddressHash. It is not its own struct field. |
| Dutch | DutchFillRequest.referrer, taker-signed. Open Dutch makerAddressHash does not include it. |
| API quote | Optional referrer on POST /api/quote (default address(0)), hashed into taker_address_hash. The filler feed omits the raw address. |
| Framed embed | ?referralAddress=0x… is the quote referrer |
Embed hosts: Embed the quote box.
Not charged
- No referral on exercise or package premium
- No referral unless a non-zero
referreris supplied - No maker-post on a fully crossed order
- No maker-post when the deployed powers are
0 - No maker-fill escrow. Cancel does not rebate maker-post
- Borrow / liquidation fees are separate: Borrow fees (coming soon)