Funding and fees
In one paragraph: A perpetual has no expiry, so something must pull its price back toward the index. 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. Separately, trading fees are a small percentage of each fill.
Funding applies to perpetuals only, and no perpetual is listed on Robinhood Chain today. 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 | Candidate value | Notes |
|---|---|---|
| Taker fee | 5 bps of notional | Charged to the order that takes liquidity |
| Maker rebate | 3 bps of notional | Paid from the taker's fee and credited to the maker's account at settlement; no unbacked credit, no reward token |
| Liquidation penalty | ≤ 50 bps of executed notional, ≤ your remaining equity | Replaces the taker fee on liquidation fills |
| 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 |
The net of taker fee minus maker rebate stays in the market's PerpetualV2 contract as feeCash. The current contract has no function to withdraw it, so there is no protocol revenue distribution, fee-sharing programme or farm built on it.
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 not an approved live schedule, because no perpetual is listed.
- 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". 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 · September 2026 · Educational material, not investment advice and not an audit.
Documentation
V2 · Live on Robinhood Chain