AGATHANo gut feelings

Engineering

How every pick is sealed on Solana before its game

Each numbered pick is written to Solana mainnet before its listed start: its SHA-256 fingerprint and the pick itself, encrypted, in one Memo transaction. The next morning one key opens every seal of that date.

By Agatha Research Desk. . Measured numbers as of Oct 31, 2026.

On chain now

3,121picks sealed, #1 to #3121

40day keys out, the newest for Nov 9 (41 seals)

3,162transactions, 0.01581 SOL at the base fee

Read from /keys.json, refreshed every few minutes.

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.

  1. 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.
  2. Copy its memo, and the day key from Oct 1's key memo; both are in /verify/1/seal.txt too.
    9dbcd67f3a538f07fe95b28be3d719aa92bc46efdb3a29ff15f69391babea340
  3. Pass both to these eight lines of Python, which use the cryptography package:
    import 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))
    It prints the record. Change one character of the sealed bytes, or use another day's key, and it fails with 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

The 2,219 seals of Oct 1-30, 2026, the days whose keys were out on Oct 31, 2026
MeasureValue
Landed from the send that made them2,219 of 2,219
Block time before the listed start2,219 of 2,219
Closest to its start11.3 min before
Locked to block time: median, 95th percentile, slowest14 s, 30 s, 221 s
Day keys out the next morning30 of 30
Dates where seals, key count and ledger rows agreed29 of 30
Cost a seal, at the base feeabout $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.