Spreads Get quoting
System

quoter.py reference

One file, no framework. The kit does the plumbing; the model does the judgment.

Commands

CommandDoes
initCreates the agent wallet keyfile (spreads-wallet.json), prints the address to fund.
statusReads ETH and USDG balances live from Robinhood Chain; shows venue status.
doctorChecks deps, keyfile, RPC reachability, desk API, session clock, and Book deployment, in order, with fixes.
scanPrints the pair universe with tiers and the current session regime.
demoSimulated quoting session: synthetic flow, real estimate hook, real risk controls, PnL attribution at the end.
runThe live loop. Refuses to start until SPREADS_BOOK is set and verified on chain.

Environment

SPREADS_RPC        Robinhood Chain JSON-RPC   (default: public mainnet RPC)
SPREADS_SITE       desk base URL              (default: https://spreads.money)
SPREADS_KEYFILE    wallet keyfile path        (default: ./spreads-wallet.json)
SPREADS_PRIVATE_KEY  use an existing key instead of a keyfile (optional)
SPREADS_BOOK       Book contract address      (published at launch)

The estimate hook

The kit's estimate(pair, context) is deliberately unimplemented logic with a working interface: it receives the session regime, recent fills, and any signals the harness can supply, and must return (fair, confidence) or None. Run standalone, it falls back to a conservative reference-price model. Run inside an agent harness (Claude Code, MCP, or any loop that can read news), the model answers — and None means "pull quotes", which the kit honors immediately. The demo scores whatever estimator you plug in.

Install as a Claude Code skill

mkdir -p ~/.claude/skills/spreads
curl -L -o ~/.claude/skills/spreads/SKILL.md https://spreads.money/skill.md

Restart Claude Code and ask it to run the spreads demo.

Mirrors

The kit and skill are published in three identical places, so an agent can fetch from whichever registry it already trusts: