Gamestakers
A staking and tournament platform where escrow holds every stake until a result is settled.

The constraint
Players stake real money on a match they play themselves. Funds cannot move on anyone's say-so, a dropped connection cannot become a double payout, and a losing player will contest a result the moment it goes against them.
What most people would have built
A balance column on the user record, a payout endpoint, and a support inbox for when it goes wrong. That works until two requests arrive at once, or a gateway retries a webhook, or someone disputes a match that already paid out.
The arena
Challenge a specific player or take an open challenge. The stake is held the moment both sides accept, not when the match ends, so neither player can walk away with the money still in play.

Tournaments
Brackets that fill, lock and settle on their own. Capacity checks before entry, a lifecycle the engine drives rather than an admin, winner voting with an override for the disputes that voting cannot settle, and a chat beside every match.

The wallet
Multi currency balances with card and crypto funding. Every credit and debit is an entry, never an edit, so the balance is derived rather than stored and a race condition cannot quietly rewrite it.

Funding and payouts
Deposits clear through several gateways and a crypto path. Each transaction carries an idempotency key, so a retried webhook resolves to the same result instead of paying twice.

Identity
KYC steps in above a threshold rather than at signup, so a casual player is not asked for documents to place a small stake, and a large withdrawal cannot leave without them.

What broke, and what we would change
Every payment path was called more than once in the wild. Gateways retry, users double click, mobile connections drop mid request and the client resends. None of that was theoretical. And the dispute flow was built after the payment flow. Next time it goes in at the same time, because the states a dispute needs have to exist in the ledger from the first entry, not be reconstructed later.