Skip to content

Live on Stellar testnet

Puzzle chests that bots can’t rob.

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.

… XLM
paid to solvers · last 7 days
…
verified claims · last 7 days
…
chests created · last 7 days
BUILT ON
  • Stellar
  • Soroban
  • snarkjs
  • OpenZeppelin
  • Passkeys

01 How it works

Four steps. One rightful owner.

The answer never leaves your device. The proof carries your address. The contract only pays the address inside the proof.

01

Solve locally

Crack the riddle in your browser. Only a hash of the answer exists.

hash → 0x2df9…ab19

02

Seal it to you

A ZK proof binds the answer to your Stellar address as a public input.

recipient → your address

03

Claim the prize

Soroban checks the proof against the recipient sealed inside it, then pays out.

+10 XLM

04

Each proof works once

Every claim spends a nullifier. Replaying the same proof reverts.

replay → reverted

02 Attack demo

Copy the proof. Lose the race anyway.

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 demo

illustrative 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

Built for both sides of the riddle.

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 →

Creators

Lock a prize behind any riddle.

Escrow XLM, set an expiry, share a link. Funds return if nobody solves it.

Create a chest →

Builders

A pattern you can ship today.

Address-bound proofs on Soroban. Open circuits, open contracts, MIT.

Read the docs →

03 Stellar × ZK

Fast ledger. Sealed proofs.

Proof

Groth16

Prover address as public input.

Replay

Nullifiers

Each proof works once.

Settlement

One ledger

Final once the claim lands in a Stellar ledger.

Prize

Native XLM

Paid through the Stellar asset contract. No trustline needed.

… XLM
paid to solvers (testnet, last 7 days)
…
verified claims (last 7 days)
…
chests created (last 7 days)

Counted from on-chain events; the testnet RPC keeps about 7 days.

04 Security

What protects a chest.

Recipient

Proof sealed to you

Your address is a public input of the proof. A copied proof fails for any other address.

Replay

Each proof works once

Every claim spends a nullifier on-chain and only pays the address the proof was made for. Replaying the same proof reverts.

Funds

Next: one contract per chest

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, Before the Breach.

Before the breach.

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 →

Contracts scanned with Kuyfi

Kuyfi scan0 crit0 high0 medi0 low0 infoReport ↗

Black-box scan, not a full audit. Full audit planned via SCF Audit Bank before mainnet.

SDK · @findloot/sdk

Put a chest in
your own app.

Hash the answer, escrow XLM and claim with an address-bound proof, from TypeScript on Stellar testnet.

Read the SDK docs →npm i @findloot/sdk
quickstart.tsTypeScript
$ 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();

The next chest is waiting.

Bring a wallet and a sharp mind. We bring the bots that will fail.