ZFROG arcade · FHE on-chain

Sink a fleet you cannot see.

A battleship where both fleets stay encrypted on-chain. The contract finds your hits by computing on ciphertext, with Zama's fully homomorphic encryption. Real FHE, running live, from your browser.

Powered by Zama FHEVM Zama relayer SDK Fully homomorphic encryption Sepolia testnet
ZFROG, the hooded frog
Test network, no token
Lobby

Shuffle, then play

Runs on Sepolia, the Ethereum test network: you need a little Sepolia ETH for gas, about 0.01 per game. No token, no prize. The practice mode needs no wallet.

Your fleet

Five frog ships, 14 cells. Only you will ever see this layout until the game ends.

Play

Open games

Connect your wallet to see open games.
Under the hood

Real FHE. Not a trailer.

Most memecoins ship a ticker. This one ships a game where the blockchain computes on data it cannot read. Your fleet is encrypted in your browser with the Zama SDK, stored on-chain as ciphertext, and every shot is answered by FHE operations inside the smart contract. The frog is named after FROG Mark 1, Zama's FPGA supercomputer built for exactly this.

01 · Encrypt

In your browser

The Zama relayer SDK turns your 36-bit fleet map into an encrypted input with a proof. The plain layout never leaves your device.

02 · Store

On-chain ciphertext

The contract keeps both boards as encrypted 64-bit values on Sepolia. Anyone can look. Nobody can read.

03 · Compute

FHE in the contract

Each shot runs shift, and, equal and select on ciphertext to find hit, hit counter and win flag. No decryption needed.

04 · Open one bit

Threshold decryption

Only the hit bit and the win flag are made publicly decryptable, then checked on-chain with the KMS proof. At game over, both fleets can be unhooded for anyone to audit.

// browser: the Zama relayer SDK
const input = instance.createEncryptedInput(CONTRACT, user);
input.add64(fleetMask);   // your board, encrypted here
const { handles, inputProof } = await input.encrypt();
await game.createGame(handles[0], inputProof);
// contract: one shot, answered on ciphertext (simplified)
euint64 bitValue = FHE.and(FHE.shr(board, cell), 1);
ebool hit = FHE.eq(bitValue, 1);
newHits = FHE.add(hits, FHE.select(hit, 1, 0));
ebool won = FHE.eq(newHits, 14);
FHE.makePubliclyDecryptable(hit); // only this bit opens

What you see

Your own fleet, your shots, a hit or a miss on each answer. After the game, both fleets.

What the chain sees

Encrypted handles only, like 0x9f3a…c07e. Not the ship positions, not the remaining cells, not who is winning until a bit opens.