How a market is decided

Fairness & settlement

No bookmaker and no admin picks the winner. The contract takes the first feed price after each deadline and can prove it; anyone can trigger it.
01OpenRounds, rivalries and targets follow a fixed public schedule. The first bet on a slot opens it on-chain (and earns its 1% creator fee); the same slot always maps to the same market.
02BetStakes go into the side's pool until the lock time. No bets after it, so nobody can bet once the opening price is known.
03LockAfter the lock time, anyone can submit a feed round. The contract checks it is the first round published at or after the deadline: its own timestamp is later, and the round before it is earlier.
04SettleAfter the end time, the same proof picks the closing price. Lock and settle can happen in one call, so a market resolves even if nobody touched it in between.
05ClaimWinners settle and collect in a single transaction, or claim later. Ties, one-sided pools, and markets the oracle never priced are void and refund every stake in full.

The payout math

Pari-mutuel: there is no bookmaker taking the other side. The winning side splits both pools in proportion to stake, after fees. Fees are 2% of the pot to the protocol, plus 1% to the player who opened the duel, and never more than the losing pool, so backing the winner never returns less than your stake.

Example · NVDA vs AMD, player-made

Pool on NVDA600 tUSDC
Pool on AMD400 tUSDC
Pot1,000 tUSDC
Fees (2% + 1%)−30 tUSDC
NVDA wins: paid to NVDA backers970 tUSDC
Your 60 on NVDA returns60 × 970 / 600 = 97.0 (1.62x)
If AMD had won, 40 on AMD returns40 × 970 / 400 = 97.0 (2.43x)

Who holds what

Admin (deployer wallet)

CanList assets and their feeds, set fees (capped at 10% combined) and limits, pause new markets and bets, name operators.

CannotMove stakes, pick a winner, or block claims and refunds. Each market copies its feeds when it opens, so swapping a feed later can’t reach it.

Keeper (operator, optional)

CanSettle due markets so players find them final, and push a price into a relay feed when a deadline needs one. It can also pre-open the schedule without a seed and with no creator fee.

CannotSettle with a price other than the first round after the deadline. Anyone can settle; if the keeper is down, players settle their own markets when they claim.

Price feeds

CanRelay feeds with the same AggregatorV3 interface as Chainlink, fed from Yahoo Finance and Coinbase only when a deadline needs a price. Live prices on screen come from the same sources off-chain, at no gas cost.

CannotRewrite history: every round is stored, so a settlement can always be re-checked.

Contracts

Robinhood Chain Testnet · chain id 46630
TesseraMarkets, pools, settlement, claims0xb87245c9951fab7d1469edbab2795b46f9adf5de ↗
Test USDC (tUSDC)6-decimal test dollar, free to mint0xa86489cd99b2cf839c15bbbc4ec3257754d7b0f5 ↗
FeedBatcherPushes all relay prices in one transaction0xd74728f62ca0973ea1a02f438e2d9ec16002cf17 ↗

On-chain proof

Deployed, and you can check it

Every contract and the transaction that created it, on both networks. Deployer, admin and treasury: 0x6C079ff20B77fBbc89Fb5C90c5f43Cf24166d7D4.

TESTNETPLAY FREE