What a seal proves
When a pick locks, usually 15 minutes before its listed start, its frozen fields (its number, the game, the side, the line, the price and book, the confidence, Best Bet or not) become a small JSON record. Seconds later the Agatha address puts it on chain in one memo: its SHA-256 fingerprint and the record, encrypted with AES-256-GCM.
seal agatha:v1:p:<pick_no>:<YYYY-MM-DD>:<fingerprint>:<base64 nonce|ciphertext|tag>
key agatha:v1:k:<YYYY-MM-DD>:<day key>:<seal count>The next morning one key memo opens every seal of that date and states its seal count. It goes out once every pick of the date is graded and it is past 03:30 ET, or at 06:00 ET at the latest. One key per date, derived from a master seed with HKDF-SHA256, makes the release all or nothing: no opening the winners and holding back the losers.
So anyone can check, without asking agatha.gg, that every pick was fixed before its game (Solana's block time, not a clock Agatha keeps), unchanged since (its fingerprint) and counted, losses with wins (the numbers run up from #1 with no gap).
Each seal is one legacy transaction with one Memo v1 instruction and no account, so no rent. Why v1: on devnet Memo v2 logged the whole memo at about 350 compute units per memo byte, so the largest seal then (a 471-byte record) needed 269,889 units, over the 200,000-unit default; Memo v1 used 689 on receipt #1.
Check a pick yourself
Receipt #1, sealed Oct 1, 2026: Kristiana Sidorova to win, +125 at DraftKings, 67% confidence, a Best Bet. It lost and stays on the record.
- Open the transaction on the explorer: Success, fee payer AGATHA..YHaoFN, block time Oct 1, 2026 07:15:28 UTC, 14 min 32 s before the match's listed start.
- Copy its memo, and the day key from Oct 1's key memo; both are in /verify/1/seal.txt too.
9dbcd67f3a538f07fe95b28be3d719aa92bc46efdb3a29ff15f69391babea340 - Pass both to these eight lines of Python, which use the
cryptographypackage:
It prints the record. Change one character of the sealed bytes, or use another day's key, and it fails withimport base64, hashlib, json, sys from cryptography.hazmat.primitives.ciphers.aead import AESGCM memo, key = "".join(sys.argv[1].split()), bytes.fromhex(sys.argv[2]) _, _, _, pick, day, fp, b64 = memo.split(":") blob = base64.b64decode(b64) record = AESGCM(key).decrypt(blob[:12], blob[12:], None) assert hashlib.sha256(record).hexdigest() == fp print(pick, day, json.loads(record))InvalidTag.
seal-check.py does the same on Python's standard library. The receipt page runs the check in your browser; for one that needs nothing of ours, use the explorer and the eight lines.
The numbers
| Measure | Value |
|---|---|
| Landed from the send that made them | 2,219 of 2,219 |
| Block time before the listed start | 2,219 of 2,219 |
| Closest to its start | 11.3 min before |
| Locked to block time: median, 95th percentile, slowest | 14 s, 30 s, 221 s |
| Day keys out the next morning | 30 of 30 |
| Dates where seals, key count and ledger rows agreed | 29 of 30 |
| Cost a seal, at the base fee | about $0.0005 |
The one date that differed was Oct 29: 67 seals and a key count of 67, but 66 ledger rows when checked, because its golf pick, #2126, was still in play until its final round on Nov 1.
Every transaction had paid the base fee alone (5,000 lamports): no priority fee, no rent. At $95.61 a SOL (CoinGecko, Oct 31, 2026), a year of seals and keys at the pace of Oct 1-30, about 74 picks a day, is about 0.14 SOL, about $13.
What it does not prove
- That the picks are good. The chain fixes a pick in time; whether it wins is for the track record.
- That you could have bet that price. The sealed price is the named book's in Agatha's odds feeds when the pick locked; tennis and soccer keep the last scan's price, and golf's can be hours old.
- What was not picked. A card pulled before it locks is never sealed. Over Oct 1-30, 85 front-page cards left the board before locking: 68 of those calls still sealed later, as Predictions or back as Best Bets, and 17 never did.
- The real start. The chain knows the block time, not the opening whistle: pick #352, an esports match that began 17 minutes early, was sealed 1 min 45 s after play began and is void.
- No salt. The record has no random field and its fingerprint is public at once, so anyone who knows the format can test guesses against it. Picks are free on their cards before the game, so nothing leaks today; a paid tier that hid picks would need a salt.
- Early reveal. A key out at the 06:00 ET deadline opens every pick of its date, finished or not: 21 of the 30 keys of Oct 1-30 went out with a pick of their date not yet graded, a tennis match still running or a golf pick for days.
- Two seals under one number. The daily count is of distinct pick numbers, so two different seals under one number would not change it. A full audit, counting just the transactions the Agatha address paid for and signed, also checks that every seal memo for a number carries the same fingerprint, and that every seal of a date opens with its key.