Skip to content
Temporal Docs← Back to the app

04 · Earn (making)

Earn (making)

The EARN card#

An EARN account posts a curve of option prices that traders trade against; the maker earns the spread, and the funding on the options it has written. The card has a deposit, two caps, a mode (TLP, AUTO or CUSTOM) and a START / STOP QUOTING switch. An account with no deposit cannot quote: zero equity is zero cap is zero capacity.

The two caps are the maker's own limits, in coin. The rally cap limits how much it will be net short of calls (what it stands to lose if the price rallies); the crash cap limits how much it will be net short of puts (what it stands to lose on a crash). They need not match — a maker that fears a crash more than a rally sets them apart. Together they cannot be larger than the deposit backs at 10 times; a pair your deposit cannot back is refused when you set it.

A cap switches a side off#

For each wing the contract counts the maker's net coin: options it has sold minus options it has bought, across every strike and decay. While that is under the cap, the maker quotes that side and its room is what the cap leaves. At the cap, that side is simply absent from the front, and it comes back as the exposure comes down. A fill never goes past a maker's room, so a large open can be filled in part, or refused when the makers' room at that strike runs out. The same rule holds for AUTO and CUSTOM makers.

The cap is a size limit, not a loss limit. A maker's losses are bounded by its margin, and margin is the other gate: an open that would leave a maker below its requirement is refused (section 3). The card's "used X % of your rally cap" is a read-out of how close a side is to switching off.

TLP#

TLP is the first choice: one deposit and one switch to make a market on every listed asset at once. The deposit is split in dollars across the assets by recent demand (half equal, half each asset's share of the last seven days' taker premium, never less than 20 % each; equal until there is any), and on each one you stand as an AUTO maker with caps set from that asset's share. A curve quotes only one asset, so underneath there is one EARN account per asset, managed as one: DEPOSIT and WITHDRAW move across them, START and STOP QUOTING act on all, and the rows under the card show each asset. Nothing is shared between accounts: each holds only its own share of your money. If you want a different split, use AUTO on each asset instead.

AUTO or CUSTOM#

AUTO quotes the oracle's bid and ask surfaces exactly (section 5), at every strike and decay the quoting range covers, with no spread of its own. You type only a deposit and the two caps. Its revenue is the listed half-spread on what it fills, plus the funding it receives. A deposit sets the two caps for you, per asset, at the smaller of two limits: the written notional of both sides keeps 2× the 10 % maker maintenance margin, and a fully filled side survives the asset's own 3-day 99 % move (2.33 × its listed 30-day at-the-money volatility × √(3/365)) losing at most a quarter of the deposit — three days because an AUTO maker cannot react at once. At calm volatility the margin rule sets the cap; above about 47 % volatility the 3-day move does, so a wilder asset quotes less per dollar. Each side gets the same cap, rounded down to the asset's smallest size (0.001 BTC, 0.01 HYPE); below that size the card says the least deposit that quotes.

CUSTOM brings its own pricing model. You post your own curve — any subset of strikes and decays, per wing — by hand or from your own agent over the API; the card prints the exact recipe an agent needs. The venue does not price it for you and does not judge the model: what you post is what you quote. A curve you have not touched starts from the oracle, so it begins inside the corridor. The only filter is the corridor: a quote may be tighter than the listed market or up to one half-spread wider, but never across it. A quote outside stands and is drawn, never sets the front and never fills, and the card tells you how many of your points are outside.

Do this from your agent

Make a market from your agent: fund, start quoting, post a curve

A maker's money is on the ledger and signed by your wallet, like every act. Its curve and switches are session calls: you sign in once with a message (no money, no gas) and the venue hands back a token for the maker routes. The steps, in order:

  1. Fund. Move USDC to the venue, open an EARN account and put margin behind it: fund.mjs, then node setup.mjs earn 450 (Wallet & accounts). An account with no deposit cannot quote.
  2. Start quoting. preset: "track" is AUTO (the venue quotes the oracle's own bid and ask for you); "own" is CUSTOM. Add "tlp": true for TLP. The reply carries the venue's own key for the account (accountId).
  3. Set your spread (hBps, the half-spread on the extrinsic in basis points) and, if you like, your default decay rate (rho).
  4. CUSTOM only: post your own prices with /account/curve/raw.
lp.mjs
// lp.mjs <earn-account-ledger-id> <BTC|HYPE> <track|own> [rho spreadBps]: start a maker quoting. Fund first: `setup.mjs earn <dollars>` opens the account and puts margin behind it.
//   track = AUTO: the venue quotes the oracle's own bid and ask for you.   own = CUSTOM: you post your own prices (see curve.mjs).
import { post } from "./temporal.mjs";
import { signIn } from "./session.mjs";

const [ledgerAccountId, asset, preset, rho, hBps] = process.argv.slice(2);
const auth = await signIn();

// Start quoting. The first call names the ledger account and returns the venue's own key for it (`accountId`), used as `id` from then on.
const started = await post("/account/quoting", { asset, preset, ledgerAccountId, on: true }, auth);
console.log(started);
const id = started.accountId;

// Your spread (half-spread on the extrinsic, in bps) and your default decay rate.
if (hBps) console.log(await post("/account/curve", { id, asset, patch: { hBps: Number(hBps), ...(rho ? { rho: Number(rho) } : {}) } }, auth));

// To stop quoting: await post("/account/quoting", { id, asset, on: false }, auth);
Start an AUTO maker on BTC with a 50 bps half-spread
WALLET_KEY=0x… node lp.mjs 7 BTC track 4 50
# 7 = your EARN account's ledger id (from /chain/state). To stop quoting: POST /account/quoting {"id","asset","on":false}

A CUSTOM maker prices with its own model. A value is a fraction of spot; post any strikes and any decays, either wing, one or more slices (each slice is one decay rate rho, which is 12 ÷ months). Where you post nothing, you quote nothing. Between your own posted strikes and decays the venue interpolates straight lines, like the oracle. The only refusal is a malformed body, and your last accepted curve keeps quoting. A value outside the oracle's corridor stands and is drawn but never sets the front.

curve.mjs
// curve.mjs <id> <spot>: a CUSTOM maker posts its OWN prices. `id` is the venue's key from lp.mjs (`accountId`).
// Price with YOUR model: a value is a fraction of spot (an at-the-money call worth 3 % of a $80,000 spot is 0.03). Any strikes, any decays, either wing.
import { post } from "./temporal.mjs";
import { signIn } from "./session.mjs";

const [id, spot] = process.argv.slice(2);
const strikes = [0.9, 0.95, 1, 1.05, 1.1].map((m) => Math.round(Number(spot) * m));
const callValue = (K) => Math.max(0, Number(spot) - K) / Number(spot) + 0.03 * Math.exp(-Math.abs(K / Number(spot) - 1) * 8); // a toy model: replace with yours
const putValue = (K) => Math.max(0, K - Number(spot)) / Number(spot) + 0.03 * Math.exp(-Math.abs(K / Number(spot) - 1) * 8);

const body = {
  id,
  slices: [
    {
      rho: 4, // the decay rate of this slice (12 / months): 4 = a 3-month mean life
      calls: strikes.map((strike) => ({ strike, value: +callValue(strike).toFixed(6) })),
      puts: strikes.map((strike) => ({ strike, value: +putValue(strike).toFixed(6) })),
    },
  ],
};
console.log(await post("/account/curve/raw", body, await signIn())); // a malformed body is refused by name and applies nothing; your last accepted curve keeps quoting
Your own state and the shape of the call
curl -s "https://protect.temporal.exchange/api/venue/chain/state?wallet=0xYOUR_WALLET"      # your EARN account: depositUSD, equity, requirement, caps
POST https://protect.temporal.exchange/api/venue/account/curve/raw   Authorization: Bearer <token>
{"id":"<accountId>","slices":[{"rho":4,"calls":[{"strike":84000,"value":0.034}],"puts":[{"strike":76000,"value":0.031}]}]}
Paste this to your agent

I want to make a market on the Temporal testnet venue. Read https://protect.temporal.exchange/docs/earn and https://protect.temporal.exchange/docs/wallet-and-accounts. Open an EARN account with $450 behind it, start it quoting BTC as AUTO with a 50 bps half-spread, and show me /chain/state for the account after each step. Never ask me for my key: it is in WALLET_KEY. Tell me the cap the venue set from my deposit, and what happens to my quotes when a side hits the cap.

You see your own curve and the aggregate board only: the roster read has no maker names, and nobody sees yours.

Check the result yourself: the maker-fill check.

Makers are margined like everyone else#

A maker holds no perp; its book is options only. Its sold rows are margined by the same closed form as a trader's (section 3) at the maker's own mark, and its equity is the cash deposited into the account through the MARGIN field plus the account's own profit and loss. Deposit more and the room grows; withdraw and it shrinks, down to what the account must keep behind what it has written. A buy-side fill is paid from the maker's deposit, so a maker's room on its bid is also bounded by what it can pay.

If an EARN account's equity falls to its maintenance requirement it is liquidated like any other account: its positions are closed at the front and it pays the liquidation fee into the insurance fund (section 6).

Lines and closing#

An EARN account does not open positions of its own choosing. It accrues one line per trade against traders, and the card gives CLOSE on each line and CLOSE ACCOUNT for all of them. A maker's own close passes its obligation to the makers standing at the front, and the trader keeps its side. The account survives a close — its curve, caps and quoting state stay — so a maker that flattens can quote again at once.

Fees and names#

A maker pays no trading fee. On funding, the maker receives the payment less the venue's 10 % share, and the card's return estimate is shown after that cut. The taker fee and the rest of the schedule are in section 6. What a maker sees is its own curve and the aggregate book — no other maker's name, no per-maker flow, no record of who traded when.

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.