Direction doesn't matter.
Performance does.
Choose a market between two assets. NVDA vs AMD. AAPL vs META. SPY vs BTC. Each market has a fixed open and close time.
Buy shares of the asset you believe will perform better over the window. Prices are quoted in cents and always sum to $1 across both sides — they are the market's implied probability.
Shares trade against a fixed-product pool the whole time the market is open. If the odds move your way, sell early and lock in the gain. You never have to wait for settlement.
At close, both assets' returns since open are computed from verified onchain oracle prices. The better-performing asset's shares redeem for $1 each. The other side redeems for $0. A dead heat pays 50¢ each.
perfA = endPriceA / startPriceA − 1 perfB = endPriceB / startPriceB − 1 perfA > perfB → A wins (A = $1, B = $0) perfB > perfA → B wins (B = $1, A = $0) perfA = perfB → tie (both = $0.50)
Start and end prices are read from Chainlink feeds at the market's open and close timestamps. Robinhood Stock Token feeds are multiplier-adjusted, so splits and corporate actions don't decide a fight.
If a valid, fresh price can't be obtained inside the resolution window, the market is cancelled and every share refunds 50¢ — a complete set (1 A + 1 B) always returns exactly $1. Nobody can pick a winner by hand.
No order book.
No oracle committee.
PRICE FEEDS
Every asset is wired to a Chainlink Data Feed on Robinhood Chain. Stock Token feeds report the multiplier-adjusted per-token price, so splits and dividends cancel out of the end ÷ start ratio. Feeds run 24/5 with a 0.5% deviation trigger and a 24h heartbeat. A feed is registered once and can never be swapped.
SNAPSHOTS
Open and close prices aren't "whatever the feed says when someone clicks". The market binary-searches Chainlink round history for the last round at or before its exact open and close timestamps. Anyone can call open() or resolve() at any point in the window and get the same answer. A round older than 25h, or none at all, means no guess — the market cancels and refunds.
AMM
Shares price off a constant-product pool, reserveA × reserveB = k, the same curve behind Uniswap v2 and Gnosis conditional-token markets. Buying A mints complete sets into the pool and pulls A out until k holds. Selling solves the quadratic in reverse. Price of A = reserveB ÷ (reserveA + reserveB), so the two sides always sum to $1. Math rounds in the pool's favour; every trade carries a slippage guard.
ERC-1155
1 USDG locks into the market and mints one complete set: 1 share of A + 1 share of B, as ERC-1155 tokens. A set can be merged back into exactly 1 USDG at any time, in any market state. Total sets outstanding always equals the supply of either side, and the contract can never hold less collateral than sets plus fees.
LIQUIDITY
Anyone can LP. Adding liquidity mints sets into the pool and hands back the over-weighted side so the price doesn't move, then issues LP tokens for the position. Remove any time for a pro-rata slice of both reserves. After settlement, redeem what comes out. A 1% protocol fee is charged on every buy and sell.
PERMISSIONLESS.
Each market is its own contract, deployed once with no upgrade path and no admin trading, pricing or resolution functions. open(), resolve() and cancel() can be called by anyone; a keeper bot calls them so nobody has to. The single admin hook cancels a market before it opens and refunds every set in full. No key can pick a winner, move collateral or pause a live market.
reserveA × reserveB = k priceA = reserveB / (reserveA + reserveB) priceB = reserveA / (reserveA + reserveB) priceA + priceB = 1 buy A with c USDG: fee = 1% of c; net = c − fee mint net sets → reserveA += net, reserveB += net send out sharesA such that (reserveA − sharesA) × reserveB ≥ k
Buying one side makes it scarcer in the pool and pushes its price up. Selling pushes it down. The pool never needs a counterparty and can never go short: it only ever pays out shares it holds.