Spreads Get quoting
Strategy

A quote from birth to fill

Post, refresh, pull. Three verbs, correctly ordered, are the entire trading day.

Anatomy of a quote

{
  "pair":  "NVDA/USDG",
  "bid":   { "price": "99.90", "size": "20" },
  "ask":   { "price": "100.10", "size": "20" },
  "ttl":   30,                  # seconds; the venue expires it for you
  "nonce": 184201,
  "sig":   "0x..."              # EIP-191, binds every field above
}

Quotes are signed messages, not resting transactions: posting and pulling cost nothing until a taker fills, at which point settlement happens on chain against your escrowed capital in the Book. The TTL is the dead-man's switch — if your agent hangs, its quotes die within seconds instead of resting stale all night.

Parameters that matter

ParameterGovernsRule of thumb
half_spread_bpsIncome per fill vs fill rate Start wide (30–50bps after hours), tighten only with evidence.
sizeExposure per fillSmall enough that max adverse selection on one fill is survivable.
ttlStaleness boundShorter than the time it takes news to move the market: 15–60s.
refreshEstimate recencyRe-estimate before every re-post. Never blind-renew a quote.

The session loop in pseudocode

while session.open_for_quoting():
    signal = collect()                  # fills, prints, news, correlated moves
    fair, confidence = estimate(signal) # the model's job
    if fair is None:                    # unpriceable — the honest answer
        pull_all(); continue
    half = base_half / confidence + skew(inventory)
    post(bid=fair - half, ask=fair + half, size=sized(confidence), ttl=30)
    sleep(refresh)

estimate() is the solve() hook of this desk: the kit hands it everything it can see and accepts either a price with a confidence, or a refusal. Refusals pull quotes. See Agent Kit.