Live demo: https://calledit-app.vercel.app
Call it before it happens. CalledIt lets a fan lock a match prediction on-chain before kick-off — as a SHA-256 commitment, so the pick itself stays secret — and when the stat lands, mints a receipt that proves when they called it. The receipt is a clean, shareable image with the on-chain timestamp: social flex with cryptographic teeth.
Wrong call? No receipt. The commitment is already public, so no screenshot-cropping, no deleted tweets, no "I totally called it" — the chain remembers what you actually said.
Built for the Superteam Earn × TxODDS World Cup hackathon (Consumer & Fan Experiences).
- Pick a prediction (e.g. "Lamine Yamal scores in the first half").
- Lock it — the app computes
SHA-256("calledit:v1|<id>|<text>|<salt>")and writescalledit:commit:v1:<hash>to Solana devnet via the Memo program, before kick-off. Only the fingerprint goes on-chain; the pick stays private until reveal. - The match runs — a deterministic, recorded TxLINE-shaped fixture replays (clearly labeled in-UI; see Data below), driving the same code paths a live feed would.
- Reveal + verify — when the stat lands, the server re-derives the hash from the revealed pick + salt and checks it against the on-chain commitment. Any mismatch is rejected: predictions cannot be altered after commit.
- Receipt — a correct call writes an on-chain receipt record referencing the commit tx, and renders the shareable receipt image (commit timestamp, landed minute, both tx links). A wrong call gets nothing — that's the anti-cheat point of commit-reveal.
No wallet, no seed phrase, no gas prompt. A demo keypair held by the app signs and pays on devnet. Consumer-simple on purpose: the only crypto the user ever sees is the receipt.
No live TxODDS credentials were used in this build. The match is a deterministic recorded
TxLINE-shaped event stream (src/lib/fixture.ts), labeled as such in the UI. The feed
seam where a live TxLINE websocket plugs in is src/lib/feed.ts (MatchFeed interface) —
settlement, commit deadlines, and receipts run unchanged on live data.
| Leg | Status |
|---|---|
| Prediction commitment (Memo program, SHA-256 hash + block timestamp) | Live on devnet |
| Hash verification at reveal (server re-derives + compares vs on-chain memo) | Live on devnet |
| Receipt record (Memo program, references commit tx + settled minute) | Live on devnet |
| Receipt as compressed NFT (Bubblegum) | Not in this build — the receipt record above is the on-chain anchor; cNFT mint is the drop-in upgrade |
pnpm install
solana-keygen new -o keypair.json # demo signer
solana airdrop 1 <pubkey> -u devnet # or fund however you like
cp .env.example .env.local # paste the keypair JSON array in
pnpm devNext.js (App Router) · Tailwind · @solana/web3.js · Memo program · next/og for the
receipt image · Vercel.
- Creator receipts: pundits/streamers mint branded receipt collections; their hit-rate is public and verifiable — reputation as an asset.
- Premium: bragging-rights ladders, season-long "called it" streaks, rare receipt art for low-probability calls.
- B2B: any prediction product can embed commit-reveal receipts as a trust layer ("verified pre-match pick" badge).