§ RULES · RTP 95% · ON-CHAIN
Rules
How to play, what it pays, and why you can trust it. A round is just one thing: aim and fire. Which fish you hit, whether it dies and how much you win are all computed by the on-chain contract under the rules below, and anyone can recompute them.
Gameplay
How a round works
Take a seat
In 100-player rooms the cannons sit along the top and bottom edges of the field, 50 per side; 4-player private rooms use the four corners. Empty seats are yours to take. If you stop firing for more than 5 seconds (the host can adjust this) and the room is full, someone else can take your seat.
Fire
Pick a bet tier and aim in a direction. Bottom cannons can only fire upward, top cannons only downward. The sustained rate is 1 shot/s; after a short pause you can fire 2 in a row. A shot that comes too fast is deferred by the contract (by up to 2 seconds), never rejected.
Bullet
1,600 px per second, bouncing off walls up to 3 times, flying at most the field's diagonal (3,442 ms). It hits the first fish it touches; you can't shoot through one fish to reach the one behind it.
Settlement
A shot settles only at the moment the bullet reaches the fish (usually 0.4–1 s later), and only then is the random number drawn to decide whether it dies. On a kill, payout = bet × multiplier, credited to your room balance.
Edge cases
| What happened | Outcome | Bet |
|---|---|---|
| The bullet's target was killed by someone else before the bullet arrived | The bullet keeps flying; the chain searches again for the next fish it touches (re-search) | Settles normally |
| After re-search, nothing in the whole range can be hit | Bet refunded | Refunded in full |
| The bullet can't touch any fish from the moment it leaves the barrel | Transaction succeeds but nothing is queued | Not charged |
| The house bankroll can't lock this shot's max payout | Fire fails (E_HOUSE_LOW) | Not charged, gas only |
Money
Keep in wallet
APT, reserved for deposits and gas; add the bet on top when betting from your wallet.
Deposit per shot
APT, an on-chain storage deposit, refunded in full to whoever paid it after settlement.
Gas per shot
APT, independent of the bet. Measured on an older version; to be re-measured after mainnet deployment.
Winnings go to your room balance: keep betting from it, or withdraw at any time (one transaction, ~0.0001 APT of gas). Only your own signature can withdraw.
Playing with a program
Yes, with the same expectation. Your main account authorizes a "bot key" with an expiry, a limit on betting from your balance, and a floor; the bot can fire and hold seats for you, but can't withdraw or change its authorization. That's how the beta achieves "authorize once, then fire without pop-ups". You can also hand the AI Skill to your AI assistant and let it play for you.
Fairness & odds
Why the expectation is fixed
Each fish has a hit probability p and an integer multiplier m, hard-coded in the contract: m = 950,000 ÷ threshold (integer division), p = threshold ÷ 10⁶. So p × m is 0.95 for every fish:
Shooting big fish is no better a deal; it only makes the swings bigger. The 3× and 15× fish fall short of 0.95 by less than five parts per million because of threshold rounding, in the house's favor.
Where the money goes
The tech fee is taken only on bets that actually settle; nobody takes anything from a refunded shot.
Odds & cost per shot
| Fish | Radius | Hit probability | Multiplier | Kill payout | p × m |
|---|
Why the client can't pick a fish
If players could skip the fish in the way and shoot only Golden Turtles, the expectation would stay the same, but the variance of each shot would grow about 95×, and the house's payout swings would grow by two orders of magnitude. In a negative-expectation game, big swings are a strategic advantage in themselves.
So the protocol has no "pick a fish" parameter at all: a fire transaction carries only a direction, and what it hits is decided by on-chain geometry: the first fish touched along the trajectory. A fish in front blocks the ones behind it.
Randomness
- Uses Aptos on-chain randomness, drawn at the moment of settlement, not at fire time
- Settlement goes through a private randomness entry point: a bad draw can't be undone by reverting the transaction and retrying
- Nobody knows the outcome at fire time, including the operator
Ordering
Bullets queue by the moment they reach their fish (a global timing wheel) and are settled by later transactions piggybacking the work, not by the order transactions arrive. When two players race for the same fish, on-chain time decides who gets it; nobody's expectation changes.
Payouts are always covered
As each shot leaves the barrel, the contract locks 100× the bet (the largest possible payout) from the house bankroll. When the house doesn't have enough available to lock, new shots simply fail and cost only gas; bullets already in flight settle and pay out as usual.
Connecting…
What isn't guaranteed
- Winning isn't guaranteed: negative expectation; over the long run you lose about 5% of what you bet
- Short-term swings are large: firing 1 shot per second for 1 hour, the expectation is −180 bets, about 23.9% of players come out ahead, and the 95th percentile is +270 bets (simulated)
- Private rooms don't hide data: private only limits who can take a seat; every shot in the room is still public
- The contract is not yet audited, and code upgrade rights currently sit with a multisig (Security & governance)