Active Rooms: 0 // Total Escrow Volume: 0 ETH // Last Winner: None
OPEN BETA Anyone can play — no invite, no wallet, no install. The HexOps contract is still being audited and the server-authoritative match loop is unfinished, so no ETH is staked or paid out — settlement is disabled entirely.

KILL TO EARN. DIE TO BURN.

Ten hostiles hold a container yard. You have three minutes to clear it. A full tactical FPS that runs in your browser tab — no download, no install, no launcher. Free to play, right now — no invite code, no wallet, no sign-up.

Staking stays off until the contract is audited.

0.001 ETH
Duel Stake · about $2.50
Zero-Sum
Economy
No Download
Direct Play
HEXOPS gameplay — first-person view down a container yard
  1. 1 Press play — no invite, no wallet
  2. 2 Clear the yard, build your career stats
  3. 3 Stake ETH once the audit clears
01

Connect

Sign a free message to prove the wallet is yours. No transaction, no gas. Your player record is created by the contract the first time you deposit — there is no account to fund and no storage rent to pay.

02

Pick a mode

Skirmish 1v1 at 0.0002 ETH, Duel 1v1, or Squad 5v5. Training is free and always open if you'd rather warm up against bots first.

03

Confirm the stake

You see the exact numbers before you commit — what you risk, what a win pays, and the rake. Cancel any time while queuing for a full refund.

04

Play, then withdraw

Winnings land in your in-game balance so you can queue again without gas. Withdraw to your wallet whenever you like.

SKIRMISH

1v1

The same duel at a fifth of the stake. Where placement is played — open to everyone.

  • Stake0.0002 ETH
  • Win pays0.00038 ETH
  • Time cap5 min
— in queue

DUEL

1v1

Free-for-all. First to 10 kills takes it.

  • Stake0.001 ETH
  • Win pays0.0019 ETH
  • Time cap5 min
— in queue

SQUAD

5v5

Team deathmatch. First team to 40 kills. Payout splits by personal score.

  • Stake0.0004 ETH
  • Pot0.004 ETH
  • Time cap8 min
— in queue

TRAINING

FREE

The full game against bots. No stake, no reward, no wallet needed.

  • StakeNone
  • RewardNone
  • AccessOpen

Rake is 5% of the pot. The economy is closed and zero-sum: ETH paid out never exceeds ETH staked minus rake, so trading kills between your own accounts only burns rake. Matchmaking is server-side and random — you cannot pick your opponent.

  1. Phase 0 — ShippedThe game itselfBrowser-native tactical FPS: custom Three.js renderer, procedural audio, 4 weapons, an AI squad that takes cover and flanks, Elo-backed career stats. Runs in a tab, nothing to install. Sound-reveal minimap — enemies stay hidden until a gunshot gives away the firing position.
  2. Phase 1 — Open betaFree for everyone (now)Wallet challenge–response auth, full settings: audio mix, sensitivity, FOV, render quality, accessibility. Gathering play data to tune match length and reward curves before any ETH is on the line.
  3. Phase 2 — MultiplayerServer-authoritative match loopThe gate on everything after it. Movement, hit registration and damage resolved server-side with lag compensation; the client sends input, never outcomes. Positions are withheld from clients that should not see them, so a memory reader has nothing to find.
  4. Phase 3 — AuditContract review & testnetThird-party review of the Solidity contract, published in full. Closes the known rage-quit refund hole, splits the settlement authority from the treasury, and moves fees behind a multisig. Testnet play with faucet ETH on Robinhood Chain — real economics, no real money.
  5. Phase 4 — StakingReal ETH on Robinhood Chain mainnetSKIRMISH 1v1 at 0.0002 ETH, DUEL 1v1 at 0.001 ETH and SQUAD 5v5 at 0.0004 ETH. Escrow, random server-side matchmaking, one settlement transaction per match. Ships only after Phase 3 passes.
  6. Phase 5 — DepthRooms, tournaments, clansCustom rooms with a stake you set, bracketed tournaments with a pooled prize, clans with shared standings, and a cosmetic-only marketplace. Cosmetic means cosmetic — no purchasable stat advantage, ever.

No dates. Phase 4 unlocks when the audit passes, not on a calendar — a shipping date is a bad reason to put a player's ETH behind unreviewed code.

Zero Installation

HEXOPS is one file: a custom Three.js renderer and hand-written shaders running directly in a browser tab. No launcher, no install, no account. A fully rendered 3D match loads in seconds — on the machine you already have.

Non-Custodial Escrow

Stakes are designed to sit in the HexOps contract on Robinhood Chain — the contract's own balance is the vault — not in a company ledger, and settlement is a single on-chain transaction per match. The contract is written but unaudited and undeployed — no funds are held anywhere today.

No Pay-To-Win

Nothing is purchasable that changes how you shoot — no gear tiers, no NFT boosts, no paid advantage. Winning takes the pot minus rake; inside a team it splits by personal score. Elo decides who you are matched against, never what you are paid.

Procedurally Synthesized

There are no audio files and no texture downloads. Every gunshot, footstep and impact is synthesized live through the Web Audio API, and the yard is generated at runtime — which is why the whole game ships as a single page instead of a multi-megabyte asset bundle.

1. Economic Loop & Reward Pool

HEXOPS is a closed, zero-sum economy. There is no token, no emission schedule and no faucet: the only ETH that can ever leave a match is ETH that players staked into it. Every payout is funded by an opposing player's loss, minus the protocol rake. This is a deliberate constraint — an economy that mints rewards from nothing is one that pays farmers faster than it pays players, and it always collapses.

Why no per-kill payouts. Paying ETH for each kill would print currency from thin air and make kill-trading between two of your own wallets profitable. In HEXOPS, kills only move the share of a pot that already exists. Two colluding accounts cannot gain — they can only burn rake.

SETTLEMENT MATH

TermDefinitionExample — 1v1 @ 0.001 ETH
PotSum of every player's entry stake0.002 ETH
RakeProtocol fee, 5% of pot (platform_fee_bps, hard-capped at 10%)0.0001 ETH
DistributablePot − rake0.0019 ETH
Winner takeFull distributable in 1v1+0.0009 ETH net
LoserForfeits stake−0.001 ETH

TEAM SPLIT (5v5)

The winning team divides the distributable pot in proportion to personal score, so carrying your team pays more than being carried:

score = kills × 1 + assists × 0.5 − deaths × 0.5, floored at 0.

INVARIANT

For any match: Σ payouts + rake = Σ stakes. The contract never transfers more than the escrow holds, and every state-changing call ends by asserting address(this).balance ≥ totalLiabilities + pendingTreasury — the vault can never hold less than it owes players.

Status. The economics above describe the design the HexOps contract implements for 1v1. Team settlement, matchmaking and on-chain ETH movement are not live — see sections 2 and 4. Nothing on this site currently pays or charges real ETH.

2. Smart Contract Architecture

HexOps is a single Solidity contract (^0.8.24) on Robinhood Chain, an Arbitrum-Orbit L2 whose gas and stakes are both ETH. One contract holds everything: its own ETH balance is the vault, and vaultBalance() just reads address(this).balance. There is no separate vault account to fund, no storage rent, and nothing to keep alive — EVM storage is paid for once at write time and then simply exists. Arithmetic is checked by the compiler; there is no unchecked block on any balance.

The contract is not upgradeable and sits behind no proxy. That is deliberate: an upgrade key is a key that can rewrite the rules holding your money, and the honest way to remove that risk is to not have the key at all. What remains is the authority — the backend's hot key that creates and settles matches — and it is rotated in two steps (transferAuthority nominates, acceptAuthority is signed by the nominee), so a fat-fingered address cannot strand the contract.

STORAGE

  • Config — one struct. Authority, pending authority, treasury, rake in basis points, entry-fee bounds, match timeout, the pause flag, lifetime volume and fees, and totalLiabilities.
  • totalLiabilities — the sum of every player balance plus every live escrow, and nothing else. It is the provable amount the contract owes players, maintained on every movement rather than computed by iteration.
  • players[address] — career kills, wins, lifetime earned/lost, Elo, the in-game ETH balance, the one-shot stake authorization, and any anticheat hold.
  • matches[matchId] — escrow record, roster with teams, status, per-participant score and payout. Match ids are strictly increasing, so a settled id can never be reused.
  • pendingTreasury — fees the contract tried to push to the treasury and could not. Pullable with claimTreasury(); see below.

FUNCTIONS UNAUDITED

  • deposit() / withdraw(amount) — moves ETH between your wallet and the contract. Both are signed by you; no authority can move a player's balance out. withdraw is never pausable. A pause that traps money is a rug lever, so the pause flag gates deposit, authorizeStake, createMatch and settleMatch — and stops there.
  • authorizeStake(maxStake, ttlSecs) / revokeStakeAuthorization() — player-signed consent to be staked, capped in size and short-lived (30 minutes maximum; the backend asks for ten). createMatch consumes it: one authorization, one match, then it is zeroed.
  • createMatch — authority only. Debits each roster wallet's available balance into escrow. This is bookkeeping inside one contract, not a transfer, so totalLiabilities does not move.
  • settleMatch — authority only. Credits every participant, losers included, updates stats and Elo, and takes the house's cut as the difference between the escrow and the sum of payouts — refused outright if it exceeds either fee ceiling. The fee is pushed to the treasury inside the same call; there is no sweep step and no fee sitting in the contract waiting for someone to remember it. If the treasury cannot receive ETH the amount goes to pendingTreasury rather than reverting, because a broken payout address must not brick settlement for the players in the match.
  • voidMatch / refundTimedOutMatch — full refunds, no fee. The second is permissionless: once the match timeout has elapsed, anyone may call it. A backend outage can never strand an escrow.
  • lockPayout / releasePayout — the anticheat hold. It is a reserve inside your own balance, and there is deliberately no function that can move a locked balance anywhere but back to its owner. A lock expires on its own: nobody has to send a transaction to free it, because available() simply ignores a lapsed one.
  • receive() reverts. ETH enters only through deposit(), so nothing can land in the contract without a player record to own it.

UNITS

The contract works in wei because msg.value does, but it requires every amount to be a whole number of gwei. That is what lets the backend's ledger keep doing its money arithmetic in integers — a wei is far too small to fit a JavaScript safe integer, a gwei is not — so the mirror and the chain can be compared for exact equality rather than approximately.

ELO ON CHAIN

Rating is computed in pure integer arithmetic against a precomputed expectancy table. Floating point in the EVM does not exist and fixed-point rounding differs between implementations; deterministic settlement requires integers.

Not deployed, not audited. The contract compiles and is covered by a Foundry test suite, but it has not shipped to Robinhood Chain mainnet and has not been through third-party review. A published audit is a prerequisite for enabling staking — including a known issue where a timed-out match currently refunds both sides, which a losing player could exploit by disconnecting. That is fixed before any real ETH moves.

3. Anti-Cheat & Match Integrity

A browser client is fully under the player's control. Any design that trusts what the client reports is not an anti-cheat design — it is an honour system with extra steps. HEXOPS is therefore built around a single rule: the client sends input, never outcomes.

WHAT RUNS TODAY SHIPPED

  • EIP-191 wallet challenge–response at connect: you sign a plain-text nonce, the server recovers the address. Proves key ownership; proves nothing about play.
  • Plausibility bounds on any submitted result — kill ceiling, minimum match duration, maximum kills per second, per-connection submission rate limits.
  • Every rejection is written to a review queue rather than auto-banning. False positives cost a player their account; a queue costs a moderator a minute.

These are sanity checks, not anti-cheat. The numbers still originate on the client, and the code says so in as many words. Presenting them as more than that would be dishonest.

WHAT STAKING REQUIRES BUILDING

  • Server-authoritative simulation. Movement, hit registration and damage resolved on the server. The client transmits key state and view angles only.
  • Lag compensation with server-side rewind, so authority does not cost responsiveness.
  • Server-side reveal. Positions of players you cannot legitimately perceive are never sent to your client, so a memory reader has nothing to read. The minimap already reflects this: enemies are invisible until a gunshot reveals the firing position.
  • Statistical review of accuracy, reaction-time and flick distributions across sessions.
The honest position. Staking is off precisely because this is unfinished. Shipping money on top of a client-trusting loop would be the single fastest way to lose it.

4. Matchmaking, Modes & Rating

Three staked modes, deliberately separated because they need different economics. Free-for-all is easy to collude in; team play is not. SKIRMISH and DUEL are the same format at different stakes, which is the only bracket that means anything while the population is too thin for Elo to say much.

ModeFormatStakeWin condition
SKIRMISH1v1 free-for-all0.0002 ETH (about $0.50)Bust the other player or lead at 5:00
DUEL1v1 free-for-all0.001 ETH (about $2.50)Bust the other player or lead at 5:00
SQUAD5v5 team deathmatch0.0004 ETH (about $1.00)Bust the other five or lead at 8:00
TRAININGSolo vs AINoneClear 10 hostiles, 5 min cap

The dollar figures are indicative only: the stakes were set against ETH at roughly $2,500, and they are denominated in ETH, not in dollars. If ETH moves far enough that a SKIRMISH stops being pocket change, the ladder gets retuned — the numbers above are the current ones, not a promise.

QUEUE DESIGN PLANNED

  • Matchmaking is server-side and random. You cannot select an opponent, which is what makes self-matching between your own wallets impossible rather than merely unprofitable.
  • Pairing opens at ±150 Elo and widens over time so a thin queue still fills.
  • Stakes are escrowed on queue and refunded in full on cancel, timeout, or a failed fill.
  • A 5-second frozen countdown opens every match so no one loads in mid-firefight.

RATING

Players start at Elo 1000. Rating transferred to the winner is K × (1 − expected) with K = 32, always at least 1 point, and the loser never falls below a floor of 100. The transfer is symmetric: the winner gains exactly what the loser loses, so the pool neither inflates nor drains.

ANTI-FARMING SUMMARY

VectorCountermeasure
Kill-trading between own walletsZero-sum pot; collusion only burns rake
Picking a weak opponentRandom server-side matchmaking
Alt accounts / smurfingStake required up front; Elo-banded queue
Idling for a payoutIdle kick, stake forfeit
Rage-quitting a losing matchDisconnect scored as a loss FIX PENDING
Fabricated resultsServer-authoritative scoring; client never reports kills
Rank Operator Wallet ELO Rating Total Wins
Not loaded yet

Loading treasury figures…

How do I get in?

Press play. The beta is open to everyone — no invite code, no payment, nothing to install, no transaction to sign, and no wallet needed until staking ships.

Wasn't this invite-only?

It was, while the escrow contract went into audit and the server-authoritative match loop was built. The gate has done its job, so the game is open — staked matches stay locked until Phase 3 clears.

Do I need crypto to play?

No. The beta is the complete game — same map, same weapons, same AI — and costs nothing. A wallet only matters later, for staked matches.

Is any ETH at stake right now?

None. Staking is disabled and no on-chain settlement is live. Nothing on this site can currently charge or pay you.

Can I lose my stake later?

Yes, once staking ships. A staked match puts real ETH at risk: losing forfeits your entry. Never stake more than you can afford to lose.

How do you stop farming?

The economy is zero-sum — payouts never exceed stakes minus rake, so trading kills between your own wallets only burns rake. Matchmaking is server-side and random, so you cannot choose your opponent.

MATCH STARTS IN
10
HOLD TAB
HOLD BREATH
TacticalSECTOR 7
3:00
0 / 10 ELIMINATED
0
YOUR STAKE
+0
Vitals100
Armor50
1M4 CARBINE
2KS-12 PUMP
3P-9 SIDEARM
4SR-7 LONGBOW
M4 CARBINE
FULL AUTO
30/ 210
PAUSED
CLICK ANYWHERE TO RESUME
-- FPS
CLOSED BETA

REQUEST ACCESS

HEXOPS is in closed testing while the escrow contract is audited and the server-authoritative match loop is hardened. Join the list and we send an invite code when the next wave opens.

ON THE LIST
This is your spot on the list and your seat in staked matches.
How we reach you with the code. No @ needed.
Already have a code?
INVITE CODE

ENTER CODE

Paste the code from your invite. It unlocks the game on this browser.

No code yet?
YOU'RE ON THE LIST

REQUEST RECEIVED

We'll send your invite code when the next wave opens.

YOUR POSITION
Follow @hexops_ for wave announcements.

SETTINGS

SAVED AUTOMATICALLY
HEXOPS // SECTOR 7
CONTAINER YARD 04
GRID 118-042
10 HOSTILES · 03:00 ON THE CLOCK
HEXOPS
CLASSIFIED // TASK FORCE HEXOPS
HEXOPSSECTOR 7 — HOSTILE
W A S D MOVE
MOUSE LOOK
LMB FIRE
RMB AIM DOWN SIGHTS
SHIFT SPRINT · HOLD BREATH
SPACE JUMP · DOUBLE · MANTLE
CTRL CROUCH
R RELOAD
2×SHIFT SLIDE
T RADIO (HOLD)
1–4 / WHEEL WEAPONS
V FIRE MODE
F FULLSCREEN
ESC PAUSE
ELIMINATE ALL 10 HOSTILES BEFORE THE CLOCK RUNS OUT
MISSION REPORT
MISSION FAILED
SECTOR 7 — WAREHOUSE DISTRICT
0/10
ELIMINATIONS
0
HEADSHOTS
0%
ACCURACY
0:00
TIME SURVIVED
+0 ETH
HEXOPSLOADING ORDNANCE…