Skip to content
Temporal Docs← Back to the app

06 · Fees & liquidation

Fees & liquidation

What the venue charges, who pays it, what happens when an account runs out of margin, and what stands behind the other side when it does.

The day-one fee schedule#

ChargeWho paysHow muchWhere it goes
Taker feeThe taker, on every option open and close3 bps of the option's notional (size × the asset's mark), never more than 12.5 % of the premium, and never less than $0.25 a requestThe venue
Maker feeNobody0—
Funding cutComes out of the receiving side of each funding payment10 % of the paymentThe venue
Host add-onThe taker, on opens only, when a front end names a hostUp to 5 bps of notionalThe host's wallet
Liquidation feeThe liquidated account1.5 % (150 bps) of the notional closed, never more than the equity left. PROTECT accounts forfeit all remaining equityThe insurance fund; anything above the fund's target goes to the venue

The taker fee and the host add-on share one cap: together they never exceed 12.5 % of the premium (the venue's fee first, the host the remainder). The ticket shows what you pay as one FEE row before you press anything. The venue's own front end names no host, so it adds nothing. The venue pays the gas for every act. The $0.25 floor is the least taker fee one request pays on each side (an open, a close), however many makers or legs fill it: it sits over the bps fee and over the premium cap, so a very small option still pays it.

Two things pass through at cost. A PROTECT perp trades on HyperCore, so HyperCore's own trading fee on that perp is charged to you as it comes. And HyperCore takes $1 on a transfer to an address that is new to it, which is deducted from a withdrawal to such an address.

If an account cannot cover a fee or a funding payment, the part it cannot pay is forgiven. It is not recorded as a debt against the account and is never taken from your wallet later.

These are the settings today, set by the venue's admin and readable on the chain. The contract source no longer fixes a policy ceiling on any of them (ruling 740): each is bounded only by 100 % of what it is a fraction of, and every change goes through a timelock (one hour on testnet) behind a 2-of-3 multisig, so a change is public before it takes effect.

Do this from your agent

Read the fee you will pay, and the venue's settings

Every quote carries its fee, so an agent can show it before anything is signed. The venue's own settings (the fee words, the funding cut, the host cap, the insurance fund) are public on the chain health read.

The fee on one request
curl -s "https://protect.temporal.exchange/api/venue/chain/quote?asset=BTC&side=buy&wing=call&k=1.05&qty=0.01&months=3"
# -> "premiumUSD": 42.619015, "feeUSD": 0.25   (the floor applies: 3 bps of this notional is under $0.25)
The settings, live
curl -s https://protect.temporal.exchange/api/venue/chain/health
# -> "fees": { "valueCapture": { "cfg": { "fundCutBps": 1000, "hostMaxBps": 5, "feeFloorUSD": 0.25, ... } } },
#    "liquidationFeeBps": { "trade": 150, "protect": 10000, "farm": 10000, "earn": 150 },
#    "insurance": { "depositUSD": ..., "socialisedUSD": 0, "noRecourse": true }
Paste this to your agent

Using https://protect.temporal.exchange/api/venue/chain/health and /chain/quote, tell me what the Temporal testnet venue charges: the taker fee in bps, the fee cap as a share of premium, the least fee per request, the funding cut, the liquidation fee for each account kind, and the insurance fund balance. Then price a 0.01 BTC call and show me its fee in dollars and how it was set.

Check the result yourself: the fee check.

How a liquidation runs#

One test per account, across every asset it holds. The account is liquidated when its equity falls to its maintenance requirement (section 3).

  1. Test. The venue's keeper pushes a fresh mark and tests the account when it is close to its limit, when the price has moved through a good part of its cushion, and on a regular heartbeat. It does not liquidate anyone while an asset's prices are frozen (section 10).
  2. Flag. An account at or under its requirement is flagged. A flagged account cannot open, take new risk or withdraw.
  3. Close. The keeper closes its positions: the perp on HyperCore, the option legs at the front, like any other close. If no maker stands at a leg, the leg goes back to the maker who wrote it, at the oracle's price and never below intrinsic. The keeper keeps going until the account is flat.
  4. Fee. When the flag lifts, the liquidation fee is charged on what was closed. An OPTIONS or EARN account keeps whatever equity is left after it. A PROTECT account forfeits what is left, because its perp and options were one structure.
  5. Hole. If the account owed more than it had, that is covered as in the next section.

The insurance fund and no recourse#

The insurance fund is an account on the ledger. Liquidation fees build it, up to a target; on testnet it is small. It exists for one case: a closing account that cannot pay what it owes. That happens when a sold option's buyer is owed more than the writer has, or when a perp loses more than its margin and deposit.

The other side is paid in full, at once. The fund pays what it can. Anything it cannot cover is counted openly on a public counter as a socialised loss. It is ruled to be shared among the makers who were paid; today it is counted, and the share-out itself is not built yet. The account's own debt is wiped: nothing stays recorded against it, so a later deposit is yours, in full, to trade with or withdraw. This is no recourse: a loss is never collected from money you add afterwards, the same approach exchanges such as Hyperliquid and dYdX take when an account goes below zero.

Withdrawals and the daily limit#

WITHDRAW releases an account's equity above what it must keep behind its positions, and is refused below that, with both numbers named. Money goes to your own HyperCore wallet; you sign the request. CLOSE ACCOUNT pays what is left straight there.

A limit never refuses you; it queues the request. Each wallet can take out $25,000 in any rolling 24 hours, and the whole venue is held to a rolling 24-hour total of $250,000, or half of the payout wallet's balance if that is smaller. Up to $10,000 pays out at once; a larger request waits 30 minutes first. When a limit is full, the request waits for the first moment there is room and says when. You can cancel a request that is still waiting. A single request larger than a limit could ever hold is refused: withdraw in parts. Withdrawals also wait while an asset's prices are frozen, and the venue can pause them in an emergency. The EARN and PORTFOLIO cards show "Withdrawal limit today: $X left" only when the limit is what is holding you, or is running low.

Do this from your agent

Withdraw to your HyperCore wallet

Money leaves an account one way: withdraw(account, usd) (a signed act) moves it from the account to your free cash, then a signed message sends the free cash to your HyperCore wallet. The ledger refuses a withdrawal below what the account must keep behind its positions, and names both numbers. A limit never refuses: it queues, and says when. Read the limits first.

Your withdrawals and the limits
curl -s "https://protect.temporal.exchange/api/venue/chain/withdrawals?wallet=0xYOUR_WALLET"
Response (shortened)
{"ok":true,"withdrawals":[],"capUSD":20000,"feeUSD":0,
 "limits":{"limits":{"accountDailyUSD":25000,"venueDailyUSD":20000,"instantUSD":10000,"delayMs":1800000},
           "venue":{"usedUSD":670.98,"leftUSD":19329.02},"account":{"usedUSD":0,"leftUSD":25000},"paused":false}}

The defaults are $25,000 per wallet and $250,000 for the whole venue in a rolling 24 hours, paid at once up to $10,000; the testnet venue may run lower limits, which this read shows.

withdraw.mjs
// withdraw.mjs <account> <dollars>: take money out of an account and send it to your own HyperCore wallet. Two signatures, in order.
import { randomBytes } from "node:crypto";
import { wallet, get, post, call, act, until, usd } from "./temporal.mjs";

const [account, dollars] = process.argv.slice(2);
const amount = Number(dollars);
const read = () => get(`/chain/state?wallet=${wallet.address}`);
const cash0 = (await read()).cashUSD;

// 1. Account -> your free cash on the ledger (a signed act; the ledger keeps back what the account's positions need and refuses by name below that).
console.log(await act(call("withdraw", account, usd(amount))));
await until(read, (st) => st.cashUSD >= cash0 + amount - 0.01);

// 2. Free cash -> your HyperCore wallet. You sign a plain message; the nonce is `<milliseconds>-<random>`, valid for 10 minutes, used once.
const nonce = `${Date.now()}-${randomBytes(6).toString("hex")}`;
const signature = await wallet.signMessage(`withdraw:${amount.toFixed(2)}:${nonce}`);
console.log(await post("/chain/withdraw", { wallet: wallet.address, usd: amount, nonce, signature }));
// { ok: true, payoutUSD, feeUSD } paid now, or { ok: true, queued: true, executeAt, message } when a limit queues it (cancel with /chain/withdraw/cancel).
Cancel a request that is still queued (signed message withdraw-cancel:<id>:<nonce>)
POST https://protect.temporal.exchange/api/venue/chain/withdraw/cancel   {"wallet":"0x…","id":"<withdrawal id>","nonce":"<ms>-<random>","signature":"0x…"}
Paste this to your agent

Take $40 out of my Temporal testnet OPTIONS account 5 and send it to my HyperCore wallet. First read /chain/withdrawals and /chain/state and tell me my free cash, the account's deposit and the limits. Then use withdraw.mjs from https://protect.temporal.exchange/docs/fees and show me what you will sign before you sign it. After it is paid, show my HyperCore balance.

Check the result yourself: the withdrawal check.

Kept in lockstep with the code: a check fails if this page drifts.

Everything above is the short form. The canon — every ruling, every rejected alternative with the reason it was rejected, and the measurements behind each number — is the design spec, and the corroboration procedure is the audit protocol. Both live in the repository this venue is built from.