Fees and gas
Orblivion takes one fee, on chain, in the same transaction as your trade: 0.25% on majors, 0.50% on other tokens, and 0.10% more with Dossier Shield. There are no accounts, subscriptions or withdrawal fees. You pay the network's gas yourself.
Orblivion's fee#
| Wallet's 30-day volume | Fee | With Dossier Shield |
|---|---|---|
| Major: both ends of the trade are majors (ETH, WETH, USDG, cbBTC or ORBIO, or a Robinhood stock token confirmed on chain) | ||
| under $50,000 | 0.25% (25 bps) | 0.35% (35 bps) |
| from $50,000 | 0.15% (15 bps) | 0.25% (25 bps) |
| from $500,000 | 0.10% (10 bps) | 0.20% (20 bps) |
| Other: any other trade (Orbio agent tokens, Pons and other launchpad tokens, curve tokens, long-tail tokens) | ||
| any | 0.50% (50 bps) | 0.60% (60 bps) |
- A major trade pays 0.25% (25 bps). The trading wallet's volume lowers it: 0.15% from $50,000 and 0.10% from $500,000 of trailing 30-day volume.
- Any other trade pays exactly 0.50% (50 bps), whatever the volume. Other trades have no volume tiers.
- Dossier Shield adds 0.10% (10 bps) to either: 0.35% on a major trade (or its tier plus 0.10%), and 0.60% on any other.
The server sets the fee for every request. A request can't set it or send it elsewhere: one that names a fee_bps is refused (FEE_FIXED). It can only cap it, with max_fee_bps (below).
Which trades are major#
A trade is major only when both of its ends, the token it sells and the token it buys, are majors:
- ETH, WETH, USDG, cbBTC or ORBIO, recognised by address;
- or a Robinhood stock token, such as
NVDAorSPY, confirmed on chain: its proxy's beacon is the Robinhood stock tokens' beacon. Robinhood's published lists don't decide it; the chain does, for every party alike.
Every other trade is other: Orbio agent tokens, Pons and other launchpad tokens, tokens on a bonding curve and long-tail tokens. A curve token is always other.
- Only the trade's two ends count, never the hops between them. ETH to USDG is major whichever pools it passes through; ETH to an agent token is other.
- A token that copies a major's symbol at another address is other.
- The class is computed, never trusted. The server, both SDKs, the co-signer, the web app and hosted agents each read it themselves from the trade's two tokens. A plan whose
fee_classdiffers from the client's own reading is refused (FEE_CLASS).
Which token pays the fee#
Orblivion takes its fee in ETH or USDG wherever it can. Each end of the trade is ranked, and the fee comes from the end that ranks higher:
| Rank | Token |
|---|---|
| 1st | ETH or WETH |
| 2nd | USDG |
| 3rd | cbBTC and ORBIO |
| 4th | a Robinhood stock token, confirmed on chain |
| last | anything else |
When both ends rank the same, the fee comes from the output.
| Trade | The fee is paid in |
|---|---|
| ETH to any token | ETH, from what you sell |
| USDG to an agent token or a stock token | USDG, from what you sell |
| USDG to ETH, or any token to ETH | ETH, from what you receive |
| A stock token to USDG | USDG, from what you receive |
| An agent token to ORBIO | ORBIO, from what you receive (see how it is taken) |
| cbBTC to ORBIO | ORBIO, from what you receive (the same rank: the output) |
- From the input: the router receives the whole amount you sell, pays the fee from it first as a fixed amount, exactly
floor(amount_in × bps / 10,000), and swaps the rest. An ETH fee is paid in native ETH. - From the output: the router takes the fee's bps of what the swap returned, then sends you the rest.
- Either way your minimum output is what reaches your wallet, after the fee.
- Like the class, the side is computed, never trusted: the server, both SDKs, the co-signer, the web app and hosted agents each apply the rule themselves, and refuse a plan that takes the fee in another token or from the other side (
FEE_TOKEN,FEE_SIDE), or out of its place (FEE_ORDER).
Volume tiers#
A major trade's tier comes from the trading wallet's trailing 30-day USD volume of trades Orblivion relayed (POST /api/v1/live/submit or fast mode) and saw mined: plans, session trades and hosted agents' trades, valued at trade time. Only Orblivion's books hold that number, so the tier is the server's.
Each trade counts what its major end moved, valued at an independent price, never at a token's own pool:
- the amount you sell when it is a major (ETH, WETH, USDG, cbBTC, ORBIO or a stock token), else the guaranteed minimum you receive when that is one;
- valued at $1 for USDG, Chainlink for ETH, WETH, cbBTC and the stock tokens, and for ORBIO the 30-minute average price of its Uniswap v3 ORBIO/WETH pool;
- a trade between two tokens that aren't majors counts nothing toward the tier.
A session trade the executor sends itself, not through Orblivion's relay, doesn't count: Orblivion never learns that it mined. The SDKs send session trades through the relay. A trade that doesn't count only leaves the wallet at a higher tier, never above the posted rate.
A client can't check the tier, so it accepts a major trade's fee only at one of the pinned tiers, and never above the posted rate (25 bps, or 35 with Shield):
| A major trade may pay | |
|---|---|
| Without Shield | 10, 15 or 25 bps |
| With Shield | 20, 25 or 35 bps |
The server can only discount. To refuse the posted rate, set a lower cap with max_fee_bps.
The fee in a plan#
Every plan says what it pays, at its top level and in fee. Every kind of plan follows the same rule: a router trade's fee command (TRANSFER from the input, PAY_PORTION from the output), a curve trade's fee transfer (batch and two-step), and each leg of a batch.
| Field | Meaning |
|---|---|
fee_bps | the fee this trade pays, Shield included |
fee_class | major or other, as the server reads it; the SDKs check it against their own reading |
fee_tier | the rate before Shield: a major trade's volume tier (25, 15 or 10), or 50 for any other trade |
shield | whether Dossier Shield is on |
fee_side | input or output: the end of the trade the fee comes from (which token pays) |
fee_token | the token it is paid in, by address; ETH is 0x0000000000000000000000000000000000000000 |
fee | the payment itself: bps, the token, the side and the recipient, with command on a router plan (TRANSFER or PAY_PORTION), and amount when the fee is a fixed amount (a router plan's input-side TRANSFER, curve and batch plans) |
"fee_bps": 25, "fee_class": "major", "fee_tier": 25, "shield": false,
"fee_side": "input", "fee_token": "0x0000000000000000000000000000000000000000",
"fee": {"bps": 25, "side": "input", "recipient": "0x...", "token": "0x0000000000000000000000000000000000000000", "command": "TRANSFER", "amount": "2750000000000"}A trade of an agent token or any other long-tail token by address is other: "fee_bps": 50, "fee_class": "other", "fee_tier": 50, or "fee_bps": 60 with Shield.
Capping the fee#
A request may name max_fee_bps: the most it will pay, in bps. A plan whose fee would be above it is refused (422 FEE_BPS). For example, "max_fee_bps": 25 takes a major trade without Shield at any tier, and refuses an other trade (50).
The SDKs take it as maxFeeBps (TypeScript) or max_fee_bps (Python), and check every plan against it before anything is signed.
In a session#
A session binds its fees when the owner signs it. Every new grant is binding version 4, which binds fees for the session's Shield mode:
fees | |
|---|---|
| Without Shield | {"major_max_bps": 25, "major_min_bps": 10, "other_bps": 50} |
| With Shield | {"major_max_bps": 35, "major_min_bps": 20, "other_bps": 60} |
Any other value is refused. The co-signer reads each leaf's class itself, from the leaf's two tokens and its own on-chain stock check, and ignores the server's. It co-signs a leaf only if its fee is allowed:
- a major leaf: one of the pinned tiers between
major_min_bpsandmajor_max_bps; - an other leaf: exactly
other_bps.
A curve token is always other, so a curve session's fee root caps its fee transfers at other_bps.
Sessions granted before schedule 2 (binding versions 1 to 3) keep schedule 1's one fee on every leaf until they expire: 10 bps for versions 1 and 2, and for version 3 its fee_bps, 10 or 15 with Shield. See Sessions.
How it is taken#
- Router trades. One command inside the Universal Router call pays the fee recipient, in the token the rule gives. From the input it is a
TRANSFERof a fixed amount, exactlyfloor(amount_in × bps / 10,000), right after the router receives what you sell and before any swap. From the output it is aPAY_PORTIONof the bps, after the last swap. Your minimum output applies after the fee.- The input's fee is a fixed amount because anyone can leave a few wei in the router, and a share of the router's balance would then be more than bps of what you sell. Your swap spends everything the router holds, so such dust goes to you.
- On the output the fee is a share of everything the router holds after the swap, and every check of it counts from what the router paid out (you and the fee recipient).
- Curve buys. The curve has no fee parameter, so the fee is a transfer of
floor(amount_in × bps / 10,000)of the input (ETH or ORBIO: they outrank the token), before the curve call: a separate transaction from a plain wallet (sent together with the trade; see Two-step curve trades), or the first call of the wallet's own atomic batch. A plan whose fee rounds to zero isn't built (FEE_TOO_SMALL). - Curve sales. In the wallet's own atomic batch (or a session), the fee is the pair (ORBIO or ETH), a transfer after the sale of exactly
floor(min_out × bps / 10,000), wheremin_outis the curve call's guaranteed minimum; the plan'samount_out_minis that minimum less the fee. From a plain wallet the sale is two transactions, and the fee is still the token sold, in the first one (fee_side: "input"): a fee sent after the sale could be skipped, and one sent before it would need pair tokens the wallet may not hold. - Session trades. The same, under the co-signed leaf. The co-signer refuses any leaf whose fee its binding doesn't allow for the leaf's class, that pays it to anyone but the fee recipient, or that takes it in another token or from the other side.
The simulation reads the payment from the swap's own trace (simulation.fee_transfer, with exact: true when it is precisely the bps). A fee in native ETH has no Transfer log on chain: after mining, the SDKs report its amount from the signed calldata, which they check equals what was mined. From the input that is the fixed TRANSFER, so its amount is exact; from the output it is an estimate.
Who checks the fee#
| Who | Checks |
|---|---|
| The server | reads each trade's class from its two ends and the wallet's tier from its own books, and sets the fee per request. A request that names a fee is refused (FEE_FIXED), and so is a plan above the request's max_fee_bps (FEE_BPS). |
| The relay | accepts a plan's fee only as built: class, tier, Shield, side and token included. Calldata whose fee differs from the plan's is refused (NOT_AS_BUILT). |
| The SDKs | read the class themselves and refuse a plan whose fee_class differs (FEE_CLASS). They hold the declared fee and the calldata's fee to the schedule for that class and Shield: a major trade one of the pinned tiers, never above 25 (35 with Shield); any other trade exactly 50 (60 with Shield); and at most maxFeeBps when you set it (FEE_BPS). They apply the fee currency rule themselves and refuse a fee in another token, from the other side or out of its place (FEE_TOKEN, FEE_SIDE, FEE_ORDER). They refuse a second fee, or a fee to another address than the config's (FEE_COUNT, FEE_RECIPIENT), and a fee in the wrong form for its side: from the input anything but a TRANSFER of exactly the bps of what you sell, from the output anything but a PAY_PORTION (FEE_BPS). |
| The co-signer | reads each session leaf's class itself and co-signs it only when its binding allows the leaf's fee |
| Hosted agents | read each order's class themselves, and hold an order whose plan's class isn't their own reading (FEE_CLASS) or whose fee their terms don't allow (FEE_MISMATCH). See Hosted agents. |
To be sure the fee goes where you expect, pin the recipient in the client: expect: { feeRecipient } in TypeScript, expect={"fee_recipient": ...} in Python. A server whose config names another is then refused.
The schedule in the config#
GET /api/v1/config publishes the schedule under fee, and the SDKs refuse any difference from what they pin (CONFIG_MISMATCH):
"fee": {"schedule": 2,
"major_symbols": ["ETH", "WETH", "USDG", "cbBTC", "ORBIO"],
"major_tiers": [{"min_30d_volume_usd": 0, "bps": 25},
{"min_30d_volume_usd": 50000, "bps": 15},
{"min_30d_volume_usd": 500000, "bps": 10}],
"other_bps": 50, "shield_add_bps": 10, "max_bps": 100,
"recipient": "0x...", "...": "..."}major_symbols: the core majors, recognised by their pinned addresses (tokens). Robinhood stock tokens confirmed on chain are majors too.major_tiers: each tier's minimum trailing 30-day volume in USD, and its rate.other_bpsandshield_add_bps: the rate for any other trade, and what Shield adds to either class.max_bps: no fee is ever above it.recipient: the address every fee goes to.
Schedule 2 replaces schedule 1's default_bps, bps and shield_bps, which are gone.
Gas#
Robinhood Chain's gas is cheap: the base fee sits near its floor, and a swap costs about one cent.
| Transaction | Gas (approximately) |
|---|---|
| A router swap, with the fee | 200k to 240k |
| An ERC-20 approval to Permit2 | 36k to 64k, once per budget |
| A Permit2 signature inside the swap | about 33k more on the swap |
| A curve buy or sale | 100k to 115k, plus the fee transfer |
A session trade (redeemDelegations) | about 557k |
- Orblivion's plans offer no priority tip (there is no public mempool to compete in) and cap
maxFeePerGasat twice the base fee; the gas limit is the simulated gas plus 30%. - The SDKs refuse a transaction whose gas limit times its fee cap is over 0.0002 ETH.
- At $10 a trade, gas is about a tenth of a percent; above $100 it no longer matters.
- In a session, the executor pays the gas. For a hosted agent, fund its executor with about ten trades' worth.
What a trade costs in total#
A trade's cost is the pool's own fee and price impact, plus Orblivion's fee, plus gas. Measured on deep pools in October 2026, ETH and the stock tokens against USDG cost about 1 to 2 bps a side at $100 to $10,000 before Orblivion's fee, which is 0.25% on these major pairs (0.15% or 0.10% at higher volume). Thin tokens cost far more: an Orbio agent token still on its bonding curve pays the curve's 1% fee each way plus steep price impact, about 5% a side at $1,000, and Orblivion's 0.50% on top. Dossier Shield adds 0.10% to either. Every quote shows the route's cost (vs_mid_bps, gas_usd), its price impact and Orblivion's fee (fee_bps) before you trade.