Funding and fees
In one paragraph: A perpetual has no expiry, so something must pull its price back toward the index. In the general V2 design that something is funding: once an hour, longs pay shorts (or shorts pay longs) an amount proportional to how far the book traded above or below the index during that hour. Trion quotes the rate as an 8-hour number for comparability with other venues but settles it hourly and caps it. In the CMPT-USD open beta funding is off and the mark price equals the index. Separately, trading fees are a small percentage of each fill; in the perp beta they are 0%.
Funding applies to perpetuals only. The CMPT-USD perpetual is in open beta with funding off and 0% fees; the hourly-rate mechanism below is the general design and is not active in the beta. Capped options pay no funding: on the V3 book a buyer or writer pays the premium and, when their order takes a resting one, a 1% taker fee; in the V2 pool, the buyer pays the premium and a swap fee. See status.
How the hourly rate is built
- Every 5 seconds, sample the premium
p = (B + A)/(2I) − 1from the qualified book. - Average the valid samples over the completed UTC hour → P.
- Add an interest term and dead-band:
F8 = P + clamp(0.0001 − P, −0.0005, +0.0005). The 0.0001 is a fixed 0.01% per 8 hours interest component that applies to every market. - Convert to hourly and cap:
Fh = clamp(F8 / 8, −0.0036, +0.0036)(±0.36% per hour). - Payment per account:
position × I at the hour boundary × Fh. Positive Fh: longs pay shorts. Negative: shorts pay longs.
The protocol keeps none of it. Funding is a transfer between traders.
"8h rate" versus what you pay
The interface may show F8 (the 8-hour figure). What actually hits your account each hour is Fh, one-eighth of that, clamped. Example (hypothetical): the book averaged 0.4% above index for an hour. F8 = 0.004 + clamp(−0.0039, −0.0005, +0.0005) = 0.0035. Fh = 0.0035/8 ≈ 0.000437 (0.0437%/h). With a 1,000 CT long at I = $2.60 (notional $2,600) you pay about $1.14 that hour.
When funding is zero
- Fewer than 90% of the hour's samples were valid (648 of 720 slots), or the boundary index was invalid → Fh = 0, epoch marked degraded/skipped.
- The market was halted → zero, no catch-up later.
- Thin book (INDEX_ONLY) → those slots are invalid; no premium is invented.
Because coverage failure sets the whole rate to zero, the interest component is not charged during a broken hour either.
When funding is applied
Your position quantity at the top of the hour is what gets charged. Before any position change after a boundary, the completed epoch is finalized and your account settles the difference; flat exits and top-ups do not wait. A position opened after the boundary is not charged for that hour. An epoch still missing at the next boundary is recorded as skipped, never back-filled.
Trading fees
| Item | Value | Notes |
|---|---|---|
| CMPT-USD perp taker fee (beta) | 0 bps | No taker fee in the open beta |
| CMPT-USD perp maker rebate (beta) | 0 bps | No maker rebate in the open beta |
| Perp taker fee (general design, not active) | 5 bps of notional | Candidate value from the deployment script's market table; charged to the order that takes liquidity |
| Perp maker rebate (general design, not active) | 3 bps of notional | Candidate value; paid from the taker's fee and credited to the maker's account at settlement; no unbacked credit, no reward token |
| Liquidation penalty (general design) | ≤ 50 bps of executed notional, ≤ your remaining equity | Replaces the taker fee on liquidation fills routed through CloseoutRouterV2.liquidate. In the CMPT-USD beta liquidation is run by Trion's keeper, which closes the position in full; see Margin and liquidation |
| Options V3 maker fee | 0 bps of premium | The resting order pays nothing. Governance may set either V3 fee up to the contract cap of 500 bps; every order signs maxFeeBps and a fill above it is skipped. See Options |
| Options V3 taker fee | 100 bps (1%) of premium, rounded up per fill | Charged to the order that takes liquidity, deducted from cash at the fill; accrues to the exchange and is withdrawable by governance |
| V2 option issuance markup | model price × 1.02 | Part of the premium, which goes entirely to the writer sleeve; there is no separate issuance fee. V2 series expire 2026-10-30 |
| V2 option secondary swap fee | 30 bps base, 250 bps ceiling | Added to the traded bin's reserves for its LPs; the protocol keeps none. See Option pool liquidity |
In the general design the net of taker fee minus maker rebate stays in the market's PerpetualV2 contract as feeCash. The contract has no function to withdraw it, so there is no protocol revenue distribution, fee-sharing programme or farm built on it. With 0% fees in the beta, nothing accrues there for CMPT-USD.
Every signed order carries maxFeeBps. If the market's configured taker fee is above your signed limit, the fill is rejected rather than charged. Fees cannot push an account into debt on a reducing trade.
Caveats
- The 5/3 bps schedule comes from the deployment script's market table and the spec's candidate table. It is the general design, not the beta schedule: the CMPT-USD beta runs at 0%.
- Funding is off in the CMPT-USD beta. The points below describe the hourly-funding mechanism where it is active.
- Funding can flip sign every hour and can be the dominant cost of holding a position in a persistently one-sided market.
- Rates are a mechanism, not a yield. "Earning funding" by being on the paid side is exposure to the market moving against you.
- Funding is produced by the oracle publisher, where one is running. The V2 oracle (
overdrive/exchange/oracle) samples the index and the matcher's authenticated depth every 5 seconds, replays the hour into premium samples, and has 2 of 3 independent signer services reproduce and sign aFundingPayloadfor the next unfinalized epoch only, which the publisher submits toFundingEpochsV2.finalizeEpoch. Epochs count from a governed per-market origin time, not from Unix hours; a signer refuses any other epoch, an incomplete window, or a window it cannot reproduce from its own observations. That service is code plus tests: it is gated on explicit approval, licensed sources and three independent signer hosts, and is not operated against any production chain. See Data & methodology. - The matcher does not report it. The matcher API shows funding fields as
"0"withfundingStatus: "UNAVAILABLE"because it does not readFundingEpochsV2; that zero means "not reported", not "no funding is owed". For CMPT-USD in the beta the two coincide, because funding is off. Where funding is active, your on-chainpendingFundingin/v1/accountis the real number.
Source trail: docs/spec/V2_ARCHITECTURE.md §2.5, §6.1; overdrive/perps/src/v2/FundingEpochsV2.sol (REQUIRED_COVERAGE_SECONDS, EPOCH_WINDOW_SECONDS, MAX_HOURLY_RATE_WAD, finalizeEpoch, skipEpoch, epochStartTimes); overdrive/perps/src/v2/PerpetualV2.sol (taker fee / maker rebate computation, MaxFeeExceeded); overdrive/perps/script/DeployV2.s.sol (takerFeeBps, makerRebateBps); overdrive/exchange/oracle/src/publisher.ts (funding attempt), signer.ts (epoch check), publication-evidence.ts (calculateHistoricalPayload), funding-sampler.ts; overdrive/exchange/matcher/src/server.ts (fundingStatus).
Repository-owned documentation · October 2026 · Educational material, not investment advice and not an audit.
Documentation
Options live · Perps in open beta