Onchain Fishing
Mainnet beta · unaudited 中文 Beta

§ 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

01SEAT

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.

02FIRE

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.

03BULLET

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.

04RESOLVE

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 happenedOutcomeBet
The bullet's target was killed by someone else before the bullet arrivedThe 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 hitBet refundedRefunded in full
The bullet can't touch any fish from the moment it leaves the barrelTransaction succeeds but nothing is queuedNot charged
The house bankroll can't lock this shot's max payoutFire fails (E_HOUSE_LOW)Not charged, gas only

Money

Keep in wallet

≈ 0.03

APT, reserved for deposits and gas; add the bet on top when betting from your wallet.

Deposit per shot

0.0047

APT, an on-chain storage deposit, refunded in full to whoever paid it after settlement.

Gas per shot

~0.002

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

Players expect back 95%Tech team 1%House 4%

The tech fee is taken only on bets that actually settle; nobody takes anything from a refunded shot.

Odds & cost per shot

Bet
FishRadiusHit probabilityMultiplierKill payoutp × 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.

—APT
House available
—APT
Locked
—
In-flight shots

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)