Players
Bots can’t steal your win.
Your answer never leaves your device, and a copied proof won't pay anyone else.
Open the demo chest →Live on Stellar testnet
Solve it, prove it in zero knowledge, claim the prize. Every proof is sealed to the solver’s address, so a copied proof is worth nothing.
01 How it works
The answer never leaves your device. The proof carries your address. The contract only pays the address inside the proof.
Crack the riddle in your browser. Only a hash of the answer exists.
hash → 0x2df9…ab19
A ZK proof binds the answer to your Stellar address as a public input.
recipient → your address
Soroban checks the proof against the recipient sealed inside it, then pays out.
+10 XLM
Every claim spends a nullifier. Replaying the same proof reverts.
replay → reverted
02 Attack demo
Front-running bots resend winning transactions with a higher fee. The proof is bound to your address: if a bot copies it and changes the recipient, the contract rejects it. And each proof works only once.
Run the demoillustrative replay
$ watch mempool --chest 000600.00 you submit π sealed to GA7Q…X4ZK00.41 bot copy π, resend from GBOT…7Q100.80 chain verify(π, recipient=GBOT…7Q1)REJECTED proof bound to GA7Q…X4ZK, not GBOT…7Q101.20 chain verify(π, recipient=GA7Q…X4ZK)VERIFIED prize released 10 XLM$ ▌
Who it is for
Players
Your answer never leaves your device, and a copied proof won't pay anyone else.
Open the demo chest →Creators
Escrow XLM, set an expiry, share a link. Funds return if nobody solves it.
Create a chest →Builders
Address-bound proofs on Soroban. Open circuits, open contracts, MIT.
Read the docs →03 Stellar × ZK
Prover address as public input.
Each proof works once.
Final once the claim lands in a Stellar ledger.
Paid through the Stellar asset contract. No trustline needed.
Counted from on-chain events; the testnet RPC keeps about 7 days.
04 Security
Your address is a public input of the proof. A copied proof fails for any other address.
Every claim spends a nullifier on-chain and only pays the address the proof was made for. Replaying the same proof reverts.
Today every chest lives inside one shared contract. A factory that deploys one contract per chest, so a bug in one chest cannot reach another chest's funds, is in progress and not live in this demo.
Kuyfi is an open-source, black-box security scanner for deployed Soroban contracts. It reads a contract straight from on-chain bytecode, no source code required, and tests it like an attacker would.
View Kuyfi on GitHub →Black-box scan, not a full audit. Full audit planned via SCF Audit Bank before mainnet.
SDK · @findloot/sdk
Hash the answer, escrow XLM and claim with an address-bound proof, from TypeScript on Stellar testnet.
$ npm i @findloot/sdkimport { createChestClient, fingerprintAnswer } from "@findloot/sdk";const { fingerprintHex } = await fingerprintAnswer("alexandria", 7n);const client = createChestClient({ publicKey });const tx = await client.create_chest({ creator, fingerprint, … });const id = (await tx.signAndSend({ signTransaction })).result.unwrap();Bring a wallet and a sharp mind. We bring the bots that will fail.