Documentation
Armageddon is a call board: traders post market calls with a stake, and the chain settles them against Uniswap TWAPs. This page is the whole rulebook, including what the board cannot protect you from.
1. What this is
One contract holds every call, every score and every season pot. It has no owner, no admin key, no pause switch and no upgrade path: markets are fixed in its constructor and every parameter is a compile-time constant. Nobody, including whoever deployed it, can change a rule, freeze a stake or redirect a payout.
Everything a call needs comes from two places: block.timestamp for the clock, and Uniswap v3 pools on Robinhood Chain for the price. There is no oracle committee, no signer, no off-chain keeper with special rights. Settling is permissionless: anyone can settle anyone's call.
2. A call, end to end
A call is a public prediction with money on it. It carries a market, a direction, a horizon, a stake and a thesis of at most 280 characters. The thesis is emitted as an event and written to storage, so the board can be rebuilt from chain state alone.
- Post. You approve the stake and call
post(). The contract reads both prices at that instant and freezes your entry tick. - Wait. Nothing can happen before the horizon. Settling earlier reverts with
TooEarly. - Settle. From the horizon and for the next six hours, anyone can call
settle(). The contract reads the exit price and compares it to your entry. - Outcome. Right: your stake comes back and your season score rises. Wrong: the stake is split three ways and your score falls by the same amount a win would have added.
- Void. If nobody settled within the six hours, anyone can call
voidCall(): 90 % goes back to you, 10 % is burned, and no score moves.
3. The five markets, and where each price comes from
Every price is a 15 minute TWAP read with observe() on a Uniswap v3 pool of Robinhood Chain, from the canonical factory 0x1f7d7550B1b028f7571E69A784071F0205FD2EfA. The contract refuses, in its constructor, any pool that this factory does not recognise.
Ticks are logarithms, so a USD cross is a sum of ticks. Tokenised stocks trade against WETH, so their dollar price is built in two legs:
tick(SPY in USD) = tick(WETH/USDG pool) − tick(WETH/SPY pool)
Only tick differences decide a call, so the constant decimal offset between the two pools never matters. There is no USDC on Robinhood Chain: the dollar leg is USDG (6 decimals).
| Market | Legs | Pool | Fee | Observations |
|---|---|---|---|---|
| ETH | WETH/USDG | 0x52e65B17fB6E5BA00Ed806f37Afcd2DaA50271Ca | 0.01 % | 10,439 |
| SPY | WETH/USDG − WETH/SPY | 0xDDCBBa3666f578E3F09516f21Ff85BFee859AB5e | 0.05 % | 5,313 |
| NVDA | WETH/USDG − WETH/NVDA | 0x62AB521f71431f78ac374CdbadC6cda3c8916b6C | 0.05 % | 6,731 |
| AAPL | WETH/USDG − WETH/AAPL | 0x8bb3514e2204E1cDF3Ac149EFEe7Ff04D91B719f | 0.05 % | 9,075 |
| TSLA | WETH/USDG − WETH/TSLA | 0xA953CA88ff430e9487c60cA34d757414f4efdA07 | 0.30 % | 300, raised to 1,000 at deploy |
Observation counts were measured on chain on 2026-09-19 and cover between 19 and 57 hours of history, far more than the 6h15 a late settle can need. The deploy script calls increaseObservationCardinalityNext on any pool below 1,000 slots, which today is only the TSLA pool.
The prices shown on the home page are read live from these same pools through a same-origin proxy, before anything is deployed. They are the only live numbers on the site.
4. Entry and exit
Entry: the worse of two prices
When you post, the contract reads the 15 minute TWAP and the spot price, and keeps the one that is worse for your side: the higher of the two for a long, the lower for a short.
This kills two attacks at once. Pushing the spot with a swap in the same block can only make your own entry worse, so the manipulation pays for itself in the wrong direction. And when the price has already jumped, the lagging TWAP no longer hands you a free win: the jump is already in your entry.
Exit: the window that ends at the horizon
The exit is the TWAP of the 15 minutes that end exactly at your horizon, read as observe([ago + 900, ago]) where ago is how late the settle is. Settling one second or five hours after the horizon returns the same number, to the tick, and anything traded after the horizon cannot move it. Choosing the moment of settlement is worth nothing.
A call wins only if the price moved in its direction by at least one tick (0.01 %). A perfectly flat market is a loss for both sides: that is the house edge, and it is what makes two opposite calls strictly negative.
5. Horizons, stake, thesis
| Parameter | Value |
|---|---|
| Horizons | 1h, 4h, 24h, 72h |
| Minimum stake | 100,000 tokens (0.01 % of the supply) |
| Maximum thesis | 280 bytes, stored on chain |
| TWAP window | 15 minutes |
| Settle window | 6 hours after the horizon |
| Season | 7 days |
6. Win, lose, and where a lost stake goes
| Outcome | Stake | Season score |
|---|---|---|
| Right | 100 % returned | + the call's points |
| Wrong or flat | 40 % burned, 55 % to the season pot, 5 % to whoever settled it | − the same points |
| Wrong, settled by yourself | 40 % burned, 60 % to the pot | − the same points |
| Never settled | 90 % returned, 10 % burned | unchanged |
Burned tokens are sent to 0x…dEaD and leave the float for good: the token has no burn function by design, and nothing can bring them back. The 5 % bounty is why a losing call does not rot: settling a stranger's loss pays.
Winning returns the stake and nothing more. The only token upside on this board is the season pot.
7. Points and the rank ladder
points = 10 × ⌊√(stake / 100,000)⌋ × (horizon index + 1)
The square root is deliberate: a hundred times the stake buys ten times the points, so a whale cannot simply purchase a crown. The horizon multiplier is 1 for 1h, 2 for 4h, 3 for 24h and 4 for 72h.
Points are symmetric. A win adds them, a loss subtracts exactly the same number, and the score is signed, with no floor. A long and a short of the same size on the same market therefore net zero points, while one of the two always burns 40 % of its stake.
| Piece | Season score | Pot shares |
|---|---|---|
| below 100 | none | |
| 100 | none | |
| 250 | none | |
| 500 | 1 | |
| 1,000 | 2 | |
| 2,000 | 4 |
8. Seasons and the pot
Seasons last 7 days and run from the moment the board is deployed. A call belongs to the season of its horizon, not of its posting: a call opened late on day seven and ending on day eight counts, and pays, in the next season.
Six hours after a season ends, every call that could count for it is past its settle window, so the pot and the standings are frozen. Rooks, Queens and Kings then call claim() and receive pot × shares / total shares. Anyone can also top a running season up with fundPot().
If nobody reached Rook, there is nothing to share: rollover() moves that pot into the current season instead of leaving it stranded.
9. Voiding a call
Six hours after the horizon, settlement closes and the call can only be voided: 90 % returns to the trader, 10 % is burned, no score moves. This exists for one reason — a stake must never be stuck. If the price history a settle needs has rolled out of a pool's observation buffer, settle() reverts and the void path still frees the money.
The 10 % is not decoration: without it, a losing trader could hope for silence and get a full refund. With the 5 % settler bounty on one side and this burn on the other, silence is never the cheap outcome.
10. Guarantees, and what each test proves
Every attack below has a test that actually performs it, with strict inequalities rather than an empty round trip. The suite is 60 tests: unit, invariant, and fork tests against the real pools, the real v4 PoolManager and the real Universal Router of Robinhood Chain. A mutation run flips 20 pieces of the oracle and settlement logic one at a time; all 20 mutants are caught.
| Attack | What stops it | Test |
|---|---|---|
| Settle at the moment that suits you | Exit is the window ending at the horizon | Attack_ChoosingTheSettleMomentChangesNothing, Fork_Attack_SettleMomentIsIrrelevant |
| Open and settle in the same block | Shortest horizon is 1h, settle needs block.timestamp ≥ endsAt | Attack_OpenAndSettleInTheSameBlockReverts |
| Push the spot right before posting | Entry is the worse of TWAP and spot | Attack_PushingTheSpotNeverImprovesTheEntry, Fork_Attack_SameBlockSpotPushIsPaidByThePusher |
| Post after a jump the TWAP has not caught | Same rule: the jump is already in the entry | Attack_LaggingTwapIsNotAFreeWin |
| Dust spam | Minimum stake and a 280 byte cap | Attack_DustSpamIsRefused |
| Farm rank with two opposite calls | Symmetric points and a 40 % burn on the losing leg | Attack_OppositeCallsSameWalletNetZeroScoreAndLoseTokens, Attack_TwoWalletRankFarmIsNetNegativeEvenWithTheWholePot |
| Sit on a losing call | Anyone can settle for 5 %; a void still burns 10 % | Attack_LetALosingCallRot |
| Price history gone | Settle reverts, void still pays | Settle_RevertsWithoutHistory_VoidStillPays |
| Accounting drift | Board balance equals open stakes plus unclaimed pots, always | invariant_BalanceIsExactlyOpenStakePlusPots, invariant_NothingIsCreatedOrLost |
The second rank-farm test is the strict one: two wallets post opposite calls round after round until the lucky one reaches Rook and claims 100 % of the season pot, and the pair still ends poorer by exactly the burn.
11. Honest limits
- The pools are not deep. A 15 minute TWAP on a thin v3 pool can be moved by someone willing to hold a manipulated price against arbitrage for that long. It is expensive, and the prize is bounded: winning returns your stake and points, never tokens taken from someone else. But it is not impossible, and it is the main risk of the design.
- One live RPC. Robinhood Chain effectively has a single public endpoint today, behind a rate limiter. If it is down, the site cannot read prices and nobody can post or settle until it returns. Stakes are never at risk from this, but a settle window can be missed, which is exactly what the void path is for.
- No external audit. The contracts have been tested hard and mutation checked, by the same people who wrote them. That is not an audit. Treat every stake as money you can lose.
- Flat markets lose. A move of less than one tick in your favour is a loss, not a refund. On a quiet hour, both sides of the same market can lose.
- The pot is a competition. Many wallets making random calls will, by luck alone, put one of them near the top. That costs them the burn on every losing leg, so it is negative on average, but a determined farmer can still take a share of a pot funded by others.
- Nothing is deployed yet. There is no token, no board and no pool on chain at the time of writing. Any contract claiming to be Armageddon today is not.
12. The token
| Supply | 1,000,000,000, fixed, minted once in the constructor |
| Owner | none |
| Mint | none, after the constructor nothing can create a token |
| Tax | none, no fee on transfer, no roles, no pause, no proxy |
| Decimals | 18 |
| Use | the stake of a call, the season pot, and what gets burned |
The ticker shown on this site is ARMA. Name and symbol are constructor arguments, chosen at deploy time and frozen in the bytecode from that block on.
13. The launch pool
The market opens as a single Uniswap v4 position, in native ETH, with no hook and therefore no tax on any trade.
| Pair | native ETH / token, fee 1 %, tick spacing 200, hook address(0) |
| Float | 100 % of the supply, single sided |
| ETH committed at launch | zero |
| Range | [−887200, 193400], pool opened one spacing above at tick 193600 |
| First payable price | tick 193400, about 3.99 ETH of fully diluted value |
Because the position starts entirely above the range, the whole supply enters as tokens and turns into ETH only as buyers walk the price down. The opening valuation is the valuation of the entire supply: there is no hidden reserve.
14. Contract addresses
These slots stay empty until the contracts exist on chain. When they are filled, each one links to the Robinhood Chain explorer, where the verified source can be read.
Chain: Robinhood Chain, id 4663 (0x1237), native currency ETH, explorer robinhoodchain.blockscout.com.
15. FAQ
- Do I need tokens to read the board?
- No. Reading is free and needs no wallet. You need tokens only to post a call, and a little ETH for gas.
- Who settles my call?
- Anyone. If it lost, the settler earns 5 % of the stake, which is what makes losing calls get settled. If it won, you will usually settle it yourself: the result is the same whoever presses the button.
- Can I cancel a call?
- No. Once posted, a call runs to its horizon. That is what makes the board worth reading.
- What if I forget to settle?
- For six hours anyone can settle it. After that it can only be voided: you get 90 % back and no points either way.
- Does a winner take money from a loser?
- Not directly. A winner gets their own stake back plus points. Lost stakes are burned or go to the season pot, which the top of the ladder shares at the end of the season.
- Why is a flat market a loss?
- Because a call is a claim about direction. Without that edge, posting both sides of every market would be free, and the ladder would mean nothing.
- Why USDG and not USDC?
- There is no USDC on Robinhood Chain. USDG is the stablecoin with a real pool against WETH, so it is the dollar leg of every market.
- Can the team change the rules, or take the stakes?
- No. The board has no owner and no admin function. Every parameter is a constant in the deployed bytecode, and tokens leave the contract only through settle, void and claim.
- Is my thesis really on chain?
- Yes, in the event and in storage. It cannot be edited or deleted, by you or by anyone.
- When does it open?
- When the contracts are deployed and the pool is opened. Until then the board is empty on purpose, and this site shows only live pool prices.