Armageddon Pre-launch · nothing deployed yet Back to the board

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.

  1. Post. You approve the stake and call post(). The contract reads both prices at that instant and freezes your entry tick.
  2. Wait. Nothing can happen before the horizon. Settling earlier reverts with TooEarly.
  3. 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.
  4. 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.
  5. 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).

MarketLegsPoolFeeObservations
ETHWETH/USDG0x52e65B17fB6E5BA00Ed806f37Afcd2DaA50271Ca0.01 %10,439
SPYWETH/USDG − WETH/SPY0xDDCBBa3666f578E3F09516f21Ff85BFee859AB5e0.05 %5,313
NVDAWETH/USDG − WETH/NVDA0x62AB521f71431f78ac374CdbadC6cda3c8916b6C0.05 %6,731
AAPLWETH/USDG − WETH/AAPL0x8bb3514e2204E1cDF3Ac149EFEe7Ff04D91B719f0.05 %9,075
TSLAWETH/USDG − WETH/TSLA0xA953CA88ff430e9487c60cA34d757414f4efdA070.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

ParameterValue
Horizons1h, 4h, 24h, 72h
Minimum stake100,000 tokens (0.01 % of the supply)
Maximum thesis280 bytes, stored on chain
TWAP window15 minutes
Settle window6 hours after the horizon
Season7 days

6. Win, lose, and where a lost stake goes

OutcomeStakeSeason score
Right100 % returned+ the call's points
Wrong or flat40 % burned, 55 % to the season pot, 5 % to whoever settled it− the same points
Wrong, settled by yourself40 % burned, 60 % to the pot− the same points
Never settled90 % returned, 10 % burnedunchanged

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.

PieceSeason scorePot shares
Pawnbelow 100none
Knight100none
Bishop250none
Rook5001
Queen1,0002
King2,0004

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.

AttackWhat stops itTest
Settle at the moment that suits youExit is the window ending at the horizonAttack_ChoosingTheSettleMomentChangesNothing, Fork_Attack_SettleMomentIsIrrelevant
Open and settle in the same blockShortest horizon is 1h, settle needs block.timestamp ≥ endsAtAttack_OpenAndSettleInTheSameBlockReverts
Push the spot right before postingEntry is the worse of TWAP and spotAttack_PushingTheSpotNeverImprovesTheEntry, Fork_Attack_SameBlockSpotPushIsPaidByThePusher
Post after a jump the TWAP has not caughtSame rule: the jump is already in the entryAttack_LaggingTwapIsNotAFreeWin
Dust spamMinimum stake and a 280 byte capAttack_DustSpamIsRefused
Farm rank with two opposite callsSymmetric points and a 40 % burn on the losing legAttack_OppositeCallsSameWalletNetZeroScoreAndLoseTokens, Attack_TwoWalletRankFarmIsNetNegativeEvenWithTheWholePot
Sit on a losing callAnyone can settle for 5 %; a void still burns 10 %Attack_LetALosingCallRot
Price history goneSettle reverts, void still paysSettle_RevertsWithoutHistory_VoidStillPays
Accounting driftBoard balance equals open stakes plus unclaimed pots, alwaysinvariant_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

Supply1,000,000,000, fixed, minted once in the constructor
Ownernone
Mintnone, after the constructor nothing can create a token
Taxnone, no fee on transfer, no roles, no pause, no proxy
Decimals18
Usethe 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.

Pairnative ETH / token, fee 1 %, tick spacing 200, hook address(0)
Float100 % of the supply, single sided
ETH committed at launchzero
Range[−887200, 193400], pool opened one spacing above at tick 193600
First payable pricetick 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.