docs · read before you play

How DIPSIEGE works

A free browser survival game set on a trading floor during a crash. Every run is simulated by one deterministic program, re-checked on the server and replayable by anyone. Creator fees from the token buy a real tokenized stock each day, split by shards from verified runs. This page explains all of it, including what can go wrong.

01What it is

DIPSIEGE is a horde-survival game in the style of Vampire Survivors. You only move; your weapons fire on their own. Bears, panic sellers and falling red candles come at you; two bosses arrive at 05:00 and 08:00. Survive ten minutes and you hear the closing bell.

  • Playing is free. No entry fee, no in-game purchases, no second token, no NFTs.
  • Every run is replayable. A run is a seed plus the list of your inputs. The server replays it with the same code and publishes a replay link.
  • Verified runs give shards. Shards decide how each day's stock is split.
  • The stock comes from creator fees. The token launches on Pons with a 2% creator tax. Those fees (in ETH) go to the SiegeVault contract, which buys one tokenized stock per day on Robinhood Chain. Players claim their part themselves.

A day without fees is a day without stock. Amounts can be small or zero. Nothing on this site is an "expected" amount.

02How to play

  1. Open Play and pick a character and a mode. Works on desktop and phones, portrait or landscape.
  2. Optional: connect and sign in. Signing is a free message, not a transaction. It ties the run to your wallet; without it the run still plays and gets a replay, but its shards count for nobody.
  3. Get a ticket. The server issues the run's seed and today's market parameters. They are fixed for the whole run.
  4. Survive. Move to dodge and to pull the horde into your weapons. Pick up green XP gems; each level-up offers three cards.
  5. Finish. Your input log is sent to the server, which re-simulates the run. You get a result card with the replay link and your shards.

Controls

W A S D / arrow keys
Move (diagonals by holding two keys).
Touch
Virtual joystick: put your left thumb anywhere on the screen and drag. 16 directions.
1 2 3 / click / tap
Pick one of the three upgrade cards.
Weapons
Fire on their own. There is no attack button.

The world does not stop while an upgrade offer is open, so pick quickly. An offer that stays unanswered for 10 seconds picks the first card for you (this keeps co-op moving).

03Characters and upgrades

Four original characters. Each starts with a signature weapon and a perk. Everything else comes from level-up cards: more weapons, passive boosts, or a Coffee Break heal. A weapon at level 8 evolves.

CharacterSignature weaponPerk
BullHorn Charge: dashes through the horde.Faster on foot.
Dip BuyerRebound: green candles that fly out and come back.Catches falling red candles and throws them back.
Diamond HandsDiamond shields orbit you.Extra armor and HP.
Short SellerPiercing shots fired behind you.More damage to weakened enemies.

Shared weapons and passives

Shared weapons: Bid Wall, Ticker Tape, Limit Order. Passives boost damage, speed, pickup radius, area, HP, regeneration, cooldown, XP, armor and projectile count.

04Modes

ModeSeedWho
Daily CrashSame for everyone that UTC day: keccak256(hash of the first Robinhood Chain block after 00:00 UTC ‖ "daily"), published at /api/daily.Solo. Everyone faces the identical crash, so it is the fairest board.
SoloFresh per run: keccak256(latest block hash ‖ runId).One player, a new crash every time.
Co-opFresh per room.2–4 players in a room (5-letter code). Lockstep: every client and the server run the same sim with the same inputs. A downed player can be revived by standing next to them. Each member gets the team result, on their own wallet.

All modes count for shards the same way. The leaderboard shows each mode separately.

05The ten minutes

00:00 Opening bell bear cubs and panic sellers 02:00 Red candles telegraphed candles fall from the top: move out of the shadow 03:00 Liquidators slow tanks join the horde 05:00 MARGIN CALL boss: pulls you toward it and summons margin calls 08:00 CIRCUIT BREAKER boss: freezes lanes for seconds ("trading halt") and fires bursts 10:00 Closing bell you survived

Real market data, fixed at ticket time

Each two-minute wave is labelled with a real Robinhood Chain stock token that fell most today (for example "NVDA −3.10%"), and horde density follows real sell volume (density 1.000–1.500). These numbers are read when your ticket is issued and written into the run's parameters, so the run stays deterministic and the replay is identical. The data comes from the server's /api/market (cached up to 5 minutes; marked stale when it falls back to fixed values).

06Shards

Every verified run gets shards from 0 to 21:

shards = min(10, floor(survivedTicks / 1800)) // 1 per full minute survived, max 10 + 3 × bossesDown // Margin Call, Circuit Breaker + (outcome == "bell" ? 5 : 0) // survived to the closing bell
RunMinutesBossesBellShards
Wiped at 03:4130–3
Wiped at 07:12, Margin Call down71–10
Closing bell, both bosses down102✓21
  • Per wallet and UTC day, the 3 best verified runs count (each run once). Your day total is their sum, so 63 is the most one wallet can bring to a day.
  • Unverified runs are kept and flagged but give 0 shards.
  • Co-op: every member gets the team's shards on their own wallet.
  • The UTC day of the run is the day it was started (ticket time).

Before launch the site runs in preview: runs are verified and replayable, and shards are shown as "preview — counts from launch". No wallet is eligible before launch.

07Holding requirement and sign-in

Shards count for the stock split only when all of these are true:

  1. The run is verified.
  2. The wallet was signed in when the ticket was issued (free signature, no transaction).
  3. The wallet held at least 100,000 of the token at ticket time.
  4. The wallet still held at least that much at settle time (00:05 UTC the next day).

The server checks balanceOf(wallet) on Robinhood Chain both times. You can play without holding anything; those runs are still verified and replayable, they just do not take part in the split. Check any wallet on /wallet.

08How verification works

The game rules live in one deterministic module (/sim/sim.js): integer math only, a fixed 30 ticks per second, its own seeded random number generator, no clock and no Math.random. Given the same seed, parameters and inputs, it produces the same state on every machine, bit for bit.

  1. Ticket. POST /api/run/start answers with { runId, simVersion, mode, seed, params, issuedAt, wallet, eligible, sig }. The seed comes from a Robinhood Chain block hash, so nobody (us included) can pick a favourable crash after the fact.
  2. Play. Your browser runs the sim and records your inputs: one entry per tick, only when they change (direction 0–16, upgrade pick). A ten-minute run fits in about 20 KB.
  3. Finish. POST /api/run/finish sends the input log and your final state hash.
  4. Re-simulation. The server replays the log through the same sim in a worker thread and compares the state hash (FNV-1a 64 over the full game state) and the result. It also checks wall-clock sanity: the finish must arrive at least 90% of the survived time after the start.
  5. Publish. The run is stored with its seed, parameters, log, result and hash. A match is ✓ verified; anything else is kept, flagged, and gets 0 shards.

Co-op uses lockstep over a WebSocket: the server stamps each input with the tick it applies to (4-tick delay), broadcasts it, and runs the same sim itself. The server's copy is the authority for the replay and shards.

09Re-check a replay yourself

Every leaderboard row links to /replay/?id=<runId>. That page downloads the run's JSON from /api/run/<runId>, runs the sim in your browser from tick 0 with the published seed, parameters and inputs, draws it with the game renderer, and shows whether your re-simulated hash matches the server's.

You do not have to trust our page either. The sim is plain JavaScript served at /sim/. With Node 22:

// save /sim/*.js locally, then: node check.mjs <runId> import { createSim, runLog } from './sim/sim.js' import { decodeLog, createReader } from './sim/inputlog.js' const run = await (await fetch(`https://dipsiege.fun/api/run/${process.argv[2]}`)).json() const sim = createSim({ seed: run.seed, params: run.params, mode: run.mode, players: run.characters.map((character) => ({ character })) }) const res = runLog(sim, createReader(decodeLog(run.log))) console.log(res.hash === run.hash ? 'match' : 'MISMATCH', res)

To check the seed of a Daily Crash, look up the block in /api/daily on the explorer and hash it with the string "daily". A change to the rules bumps simVersion; old runs keep the version they were played with.

10Vault and stock of the day

Pons trades2%creator tax in ETH
harvest()85 / 15pool / infra
buyStock()1 stocklargest 24 h drop
claim()youpro-rata to shards
  • Fees in. The token is launched on Pons V2 with creatorFeeRecipient = SiegeVault and a 2% creator tax. Fees reach the vault as ETH.
  • Harvest. Anyone can call harvest(). It sweeps pending fees and splits new ETH: 85% to the stock pool, 15% to infra (server, RPC, keeper gas). It never reverts just because nothing is new.
  • Stock of the day. At 00:05 UTC the keeper closes the previous day. If that day has shards, it buys the allowed stock with the largest 24 h drop ("buy the dip") through Uniswap on Robinhood Chain: ETH → WETH → SwapRouter02.exactInputSingle, with a mandatory minimum out (≤ 3% slippage from the pool price).
  • Limits. One day may use at most 50% of the free pool and at most 2 ETH. The owner can change these only within hard caps (50%, 5 ETH).
  • Settle. The keeper posts the day's Merkle root, amount and payee count with settleDay. From then on that stock is reserved: it leaves the vault only through claim, and unclaimed stock stays reserved for its owner.
  • No shards that day? Root 0x0, amount 0, payees 0: nothing is bought and the ETH stays in the pool for later days.

Allowed stocks at deploy: NVDA, TSLA, SPY and AAPL, each through its WETH pool on Robinhood Chain. The allowlist and keeper can only change through a public 48-hour timelock. Every step is on the ledger.

11Payout math

The same derivation runs in the contract (splitDay), on the server and in /shared/payout.js, byte for byte:

eligible wallet = ≥ 1 verified run that UTC day, signed in, holding ≥ min_hold at ticket AND settle time shards_w = sum of the wallet's 3 best verified runs that day amount_w = amount × shards_w / Σshards // integer division remainder → the wallet with the most shards (ties → lowest address) leaf_w = keccak256(bytes.concat(keccak256(abi.encode(uint32 day, address wallet, uint256 amount_w)))) tree = OpenZeppelin StandardMerkleTree layout (sorted leaves, sorted-pair hashing) payees = count(amount_w > 0) Σshards == 0 or amount == 0 → root 0x0, amount 0, payees 0

Worked example

The vault bought exactly 1 NVDA (1018 units) for a day. Three eligible wallets have 21, 14 and 7 shards (Σ = 42):

WalletShardsamount × shards / 42Final
A21500000000000000000500000000000000001
B14333333333333333333333333333333333333
C7166666666666666666166666666666666666

The divisions leave 1 unit; it goes to A (most shards). The three amounts add up to exactly 1018.

Check a proof in your browser

Paste a wallet. This fetches its claimable days from the API and re-computes each leaf and Merkle proof locally with the formula above.

12Claiming

  1. Open /wallet and connect the wallet that played. Your settled days with stock are listed with their amount and a proof check.
  2. Press Claim for one day (claim(day, amount, proof)) or Claim all for every listed day in one transaction (claimMany, all-or-nothing).
  3. Your wallet asks you to confirm on Robinhood Chain (chain id 4663; the site adds it if needed). You pay a little ETH for gas. The stock token is sent to your wallet.

Each day can be claimed once per wallet. There is no deadline: unclaimed stock stays reserved. Nobody else can claim for you, and the site never asks for your seed phrase.

Amounts on this site are raw token units (balanceOf) divided by 1018. Some Robinhood stock tokens apply a display multiplier in wallets and apps, so the number your wallet shows can differ from ours while the tokens are the same.

13Addresses

Everything below is read from /token.json and /contracts.json, the only sources this site uses. Robinhood Chain mainnet, chain id 4663.

Loading…

The only official contract address of the token is the one on this site, pinned on our X and Telegram. Before launch it shows as 0x000…000.

14Risks

  • Unaudited contracts. SiegeVault is tested on a fork of Robinhood Chain, not audited. Bugs can lose funds.
  • Rewards can be zero. The vault is funded only by Pons creator fees that actually arrive. No trading, no fees, no stock. We never show an expected amount.
  • Keeper and server. Buying and settling are done by a keeper key run by us. If it stops, days are not settled until it runs again. It cannot take reserved stock, and it can only buy allowlisted stocks within the daily limits.
  • Owner powers. The owner can, after a public 48-hour timelock, change the keeper, infra address and stock allowlist, and withdraw ETH from the free pool (never stock reserved for claims). Each queued change is visible on-chain before it can execute.
  • Tokenized stocks. Robinhood Chain stock tokens may be restricted where you live, may carry their own transfer rules, and are not the same as owning shares at a broker. Their value moves with the market. Check before claiming.
  • Swap risk. Stock buys go through on-chain pools with a minimum out; thin liquidity means fewer units bought.
  • The token. Holding the token only makes your shards count. It is not a share of anything and nothing here says what it is worth.
  • Game rules can change. A rule change bumps simVersion; runs keep the version they were played with.

15Disclaimers

Not financial advice. Unaudited contracts. Rewards come only from Pons creator fees and can be zero. Tokenized stocks on Robinhood Chain may be restricted where you live — check before claiming.

DIPSIEGE is a free skill game. It is not affiliated with Robinhood Markets, Inc., Pons, NVIDIA, Tesla, Apple, State Street or any other company named on this site; stock names are only the labels of tokenized stocks on Robinhood Chain.

16FAQ

Do I need a wallet to play?

No. Without a wallet the run is still verified and gets a replay link; it just does not count for the stock split.

Why did my run come back unverified?

The server's re-simulation did not reach the same hash, the log was malformed, the ticket expired (15 minutes without finishing) or the run finished faster than real time allows. Unverified runs get 0 shards.

When does a day close?

At 00:00 UTC. The keeper buys and settles at about 00:05 UTC; claims open right after.

Which stock do I get?

The allowed stock that dropped most in the last 24 hours when the keeper closes the day. Every claim for that day is in that one stock.

Can I play several runs a day?

Yes, as many as you like. Your 3 best verified runs that day count.

Is there a deadline to claim?

No. Unclaimed stock stays reserved for you in the vault.