Thetaduel
Options trading as a 1v1 game
Created on 5th September 2026
•
Thetaduel
Options trading as a 1v1 game
The problem Thetaduel solves
The problem it solves
Anyone can read a betting slip. Almost nobody can read an options chain.
Sports betting took $167B in wagers in the US last year and 51% of active accounts belong to 21–34 year olds — people already comfortable taking a position, who never sat a course to do it. Options ask for strike, delta, implied volatility and moneyness before your first trade, so that audience never arrives. The liquidity isn't the bottleneck. The interface is.
THETADUEL puts two familiar game formats on top of Thetanuts Finance's live options book on Base, so a first-time user takes a real options position without being taught the vocabulary first.
Parlay. The game deals you a few cards. Each is up or down on a coin, and how far you think it moves. Every card is a real option bought off Thetanuts' order book. Under the hood a "tier" is a delta band queried against live resting orders, not a difficulty setting we invented — so the "70% chance" a beginner reads and the "delta 0.70" a trader reads are the same number, and there is no second vocabulary to unlearn later. A card only exists if a real order backs it; when the book has nothing in that band, the card renders as a dead slot rather than a number we made up.
Draw a box. Drag a price band and an expiry on a chart. That box is a four-strike zone option: it pays maximum if the price lands inside your band at expiry, decays through the wings either side, and is worth nothing outside them. If the box matches a zone a market maker has already listed, it fills straight off the OptionBook as a RANGER. If it doesn't — which is most boxes, since the book carries only about three zones per asset-expiry — it goes to the OptionFactory's sealed-bid RFQ as a CALL_CONDOR, where the player names their own max bid and market makers answer.
Why the reward is honest. Draw a tighter box, or pick a bigger move, and the contract is cheaper to buy — so the same payout divided by a smaller premium is a bigger multiple. We never wrote a payback rate. Every multiplier on screen is derived from a real premium off the book, and because every position is a bought option, max loss is the premium and it's printed above the upside on every card.
Two players stake to enter, lock blind, and the better position takes the pool. The duel scores in minutes on mark-to-market return on premium — so it isn't a size contest — while the option itself settles at its own expiry, on chain.
How we built it
Thetanuts SDK @thetanuts-finance/thetanuts-client 0.3.0 on Base — live order book, MM pricing, greeks, previewFillOrder / fillOrder, and the OptionFactory RFQ path (buildCondorRFQ, requestForQuotation, settleQuotationEarly).
Chainlink price feeds on Base for the chart history behind the box grid, so the chart reads the same oracle the option settles against.
React + TypeScript + Bun, wagmi / viem / RainbowKit for wallets.
DuelEscrow.sol — stake, winner-takes-pool, with an unconditional refund path so a duel that never resolves returns both stakes without anyone signing.
An EIP-712 attestor that re-derives the winner from committed picks and its own market snapshot — it never signs a winner a client claims.
Market data sits behind one MarketSource interface, so every live feature degrades to a frozen fixture and the seeded game runs fully offline.
We also ran three measurements against Base mainnet before building the RFQ path
Challenges we ran into
Challenges we ran into
The docs and the shipped SDK disagree in ten places. We built a probe harness and verified every claim against the live chain, committed at tnuts-test/FINDINGS.md. Example: the docs cap the MM fee adjustment at 3e-4; the shipped code uses 4e-4 and live data agrees. We treat our measurements as the source of truth, not the docs.
RANGER looked like the perfect instrument and isn't mintable. It has exactly the payoff our box needs and Thetanuts calls it unique to them — but client.ranger exposes only payout, close, split and transfer. There is no create method anywhere in the SDK. So the box fills a listed RANGER off the book, and mints a CALL_CONDOR through RFQ when nothing matches.
The book is not a ladder. Real strikes cluster ~$20 apart near spot and $100+ in the wings, and expiries are tomorrow, the day after, then weeklies. An evenly spaced grid would have promised instruments that don't exist, so the box snaps to strikes that actually carry orders and the grid is irregular by design.
Settlement is terminal, not path-dependent. We initially assumed a box meant "price stays in the band." It doesn't — the price has to land there at expiry. Every line of copy on that screen had to change.
There is no testnet for Thetanuts. It's Base mainnet only, so every rehearsal of a fill costs real money. We put a $2 cap in code above the network — checked per leg and against the slip sum — rather than in the UI.
Connecting deployed smart contracts to thethanuts frontend to make sure it works on mainnet and testnet
Tracks Applied (2)
BEST PRODUCT BUILT ON THE THETANUTS SDK
Thetanuts Finance
AI × OPTIONS
Thetanuts Finance
Technologies used