Skip to main content

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​

FeePowerFractionApprox. bpsCharged onWho pays
Premium protocol (taker)71/12878.125Option premium, and package premiumBuyer / package premium payer
Premium protocol (maker-fill)81/25639.0625Same basisMaker, when that side funds the leg
Underlying protocol (taker)121/40962.441Trade notionalSeller
Underlying protocol (maker-fill)131/81921.221Same basisMaker, when that side funds the leg
Exercise131/81921.221Strike paidExerciser
Premium referral91/51219.531Same basis as premium protocolBuyer, when referrer != 0
Underlying referral131/81921.221Same basis as underlying protocolSeller, when referrer != 0
Premium maker-post131/81921.221Resting buy premiumMaker, at orderBuy
Underlying maker-post171/1310720.076Resting sell notionalMaker, 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:

RoleImmediate crossRest, then fillRest, then cancel
Buyer78.125 bps of premium, taken from the posted premium1.221 bps of premium at post, plus 39.0625 bps of filled premium at claim1.221 bps of premium at post (kept)
Seller2.441 bps of notional, taken from the posted notional0.076 bps of notional at post, plus 1.221 bps of filled notional at claim0.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:

LegTaker funds itQuote maker funds it
Package premium (makerPaysTaker)78.125 bps39.0625 bps
Underlying on package / Dutch legs2.441 bps of notional1.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.

ActionPullWith referrer
CLOB buypremium + P of queued premium+ R of premium
CLOB sellnotional + P of queued notional+ R of notional
Inventory RFQ sell legnotional + T or M+ R of notional
Package premiumpackage premium + T or Msame — no R
Exercisestrike + 1.221 bps of strikesame — 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.

PathHow referrer is set
CLOB orderBuy / orderSellCaller argument. Permit2 witnesses bind it.
RFQ executeIntentInside maker-signed takerAddressHash (hash(taker, salt, directionsHash, referrer)). Fill must pass the same address.
FixedPackageSame: trailing referrer must match takerAddressHash. It is not its own struct field.
DutchDutchFillRequest.referrer, taker-signed. Open Dutch makerAddressHash does not include it.
API quoteOptional 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 referrer is 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)