The rules
How it works
On this page
The game in three steps
1 · Call it
Pick your stock from all 1,031 tokenized on Solana, and the one it beats.
Stake shares of yours and set the round.
2 · They answer
Whoever takes it stakes the same dollar value of the other stock.
No odds, no house, no order book.
3 · The bell decides
Signed prices at the start and at the bell.
The bigger percentage move takes both stakes, paid in shares.
Why it runs on Solana
- What a fight costs to run
- The shares are already here
- 1,031 tokenized stocks and ETFs already trade as Solana tokens, so a stake is a token you hold, and the winner is paid in it. On devnet, test tokens stand in for them.
- Prices checked on chain
- Pyth prices are verified on Solana and checked by the program; oracle quotes are verified by Solana's Ed25519 program in the same transaction. A wrong price is refused, not argued about.
- Stakes held by the program
- Escrow sits in accounts owned by each fight's address, with no admin withdrawal, and anyone can finish a fight. Program Hxr3...zc3D
What am I actually staking?
Shares of the tokenized stock you back. On mainnet that means an issuer's tokenized stock, such as an xStock; on devnet, test tokens that stand in for it, which the faucet hands out. The winner receives both stakes as shares, not as cash.
Which stocks?
Every tokenized stock and ETF on Solana: 1,031 today, from Apple to Hong Kong listings. Lookalike tokens that borrow a real one's name are left out; only the issuer's own mints can be staked.
How is the winner decided?
By percentage move. Each stock's end price is divided by its start price, and the larger ratio wins, with no rounding anywhere in the decision. A $900 stock that rises $18 (+2%) loses to a $100 stock that rises $3 (+3%).
For developers
The program compares the two ratios by cross-multiplying the integer prices: challenger end × answerer start against answerer end × challenger start. There is no division, so nothing in the decision is rounded or truncated.
Which prices?
For every boundary, exactly one per stock, from one of two sources. VOO is priced by Pyth: the first Pyth update published at or after the boundary, and only one update in existence qualifies. Every other stock is priced by the Stonk Wars oracle from the market's one-minute bars, signed by the oracle key and checked on chain. That is a fact about the past, so there is one answer and nothing to shop for.
For developers
Each Pyth update carries the publish time of the one before it, so the program demands previous < boundary <= this one, and only one update satisfies that. It is the same rule as Pyth's own parsePriceFeedUpdatesUnique.
An oracle price is the close of the stock's first one-minute bar at or after the boundary. The signed quote is verified by Solana's Ed25519 program in the same transaction, and it stays public in that transaction, so anyone can hold it against the market's record.
Can I fight at three in the morning?
Yes. 45 tokenized stocks fight 24/7/365 on real markets, with a public receipt anyone can check. Every other stock fights the moment its market opens. We never invent a price. A US stock's own market runs from 4 AM to 8 PM New York time and the oracle reads it the whole way, pre-market and after-hours included. Outside that, at night, on weekends and on holidays, those 45 are priced by the markets that trade them around the clock: perpetual futures and tokenized stocks on up to nine public venues, and the price is the median of their one-minute closes over three minutes. A round priced that way runs at least 12 hours, because a round is only as hard to tip as its move is big: on the weekend we measured, one venue pushing its own price could have changed over a third of some stock's 15-minute rounds, but at most 2.6% of any stock's 12-hour rounds and 5.2% of its 24-hour ones. Pick a shorter round and it waits for the open. The stock priced by Pyth (VOO) fights while Pyth's equity feeds print, from 8 PM Sunday to 8 PM Friday New York time, except on market holidays and after 1 PM on a half day. A fight that would start or end while Pyth is dark is refused, because nothing could ever price it.
For developers
The rule is composite-v2. A venue counts only if it traded in the 15 minutes before the window and its premium to the others can be measured over the 75 minutes before; its closes are divided by that premium. Each minute takes the median of the counted closes, drops any more than 50 bps from it, and the price is the median of the three minutes, stamped at the end of the window. At least 3 venues must count, 2 of them with real volume.
With fewer, the side is not priced by a guess: it takes the exchange's first bar after the boundary. Every price's proof, with each venue's request, closes and a sha256, is on the fight's receipt and at /api/quote/proof for any side of a fight.
A perpetual future is not a share. Why is that fair?
Because a fight compares two moves, not two price tags, and the alternative was worse. We priced weekends from each token's own Solana pool first, and measured it: those pools traded a median of three minutes an hour, and a fifteen-minute reading of them moved five times as much as the market actually had. Some of the markets that trade these stocks around the clock carry real volume and some print trades on very little, so the price never rests on the thin ones: it needs three that traded in the last 15 minutes, two of them with real volume. A stock gets the 24/7 badge only after a weekend of their one-minute trades was measured: at least three venues with real volume, each with a trade within 15 minutes in 90% of the weekend's minutes, and each checked against the stock's own price, which is how we caught that one venue's CL is crude oil while ours is Colgate-Palmolive. That is 45 stocks. A weekend price is what those markets traded, not the next open, and the receipt says so.
Why not Pyth for everything?
This deployment's Pyth plan covers only three equity feeds, and Pyth's equity feeds are dark from 8 PM Friday to 8 PM Sunday New York time. So TSLA and QQQ, which markets trade all weekend, are priced by the Stonk Wars oracle for new fights, and VOO, which no weekend market trades well enough, stays on Pyth. Rather than lock out the rest of the market, the program takes a second source for the others and says so on every fight. One admin call switches a stock's source for new fights; fights already running keep the source they started with.
Why not the token's price all the time?
Because while the stock's own market is open it is the better number by a distance: far deeper, far harder to move, and the thing the token is a claim on. The markets that trade it around the clock are the answer to a shut exchange, not a replacement for an open one.
When does a round start?
At each stock's first price at least two seconds after the fight is taken, which is a price that did not exist when the taker signed. The two seconds cover the gap between the cluster's clock and wall time.
Who settles it?
Anyone. Our settler posts the prices as soon as they exist, usually within a couple of minutes of the bell. When it is late, the fight is marked Late on every board and any wallet can do the same from the fight page, and the result is identical whoever does it. Pyth prices need no key at all; the oracle's quotes are handed to anyone who asks, already signed.
What if the market is closed?
For the 45 that fight around the clock, nothing changes: the fight runs and settles on schedule, priced by the median of the markets that trade the stock around the clock, on a round of 12 hours or more. For the rest, and for listings outside the US, a price comes from the first trade after their market opens again. Two stocks whose prices would land hours apart cannot be taken until they line up, so a challenge made then is queued: it says when it can be taken, and a take from then starts it at the first prices after. A fight that still cannot start fairly (its market reopens more than five days later, or inside the last minute of a fixed-end round) is void, and both stakes go home.
What if nobody takes my fight?
Call it off any time before someone accepts and your stake comes straight back. Once the challenge expires, anyone can send it home for you.
What if it ties, or breaks?
An exact tie refunds each side its own stake. A fight whose price never arrives (a halted feed, a delisting) can be refunded by anyone a week after it should have moved.
Can anyone take the stakes?
Not through this program. Stakes sit in token accounts owned by the fight's own address, and the program has exactly three ways to move them: back to the challenger before the fight starts, to the winner, or home to both. There is no admin withdrawal. The admin can register stocks, pause new fights and name the oracle for new fights, and cannot touch a stake. The program can take a platform fee from the loser's stake when a fight settles: it is set to zero today, it can never exceed 5%, and a raise only reaches fights made a week after it is announced. A fight whose prices never come is refunded in full. The one thing no program can undo is the token itself: each issuer of a tokenized stock can freeze its own tokens and pause transfers, and most can move them out of any account, including one holding a stake. That power is the issuer's, and nothing built on top can remove it. Pre-IPO tokens are never staked for a different reason: there is no test version of a private company, so a fight would have to escrow the real token, and those mints rule that out.
Is this real money?
The live demo runs on Solana devnet with test shares and real market prices. The real tokens are another matter: their issuers do not offer them to US persons, and their terms restrict them to holders who are not. Know the rules where you live.
Or read the terms and the privacy policy.