Everyone says they called it. Almost nobody can show they said it first.

That is the problem CallBook is built around. It is a track record for people who make predictions: a friend, a pundit, a forecasting site, a model, or you. Each prediction is locked on Sui before the event, the result is entered afterwards, and whoever has been right earns more weight in the next forecast.

Live app: https://callbook-jade.vercel.app Code: https://github.com/Savage27z/callbook Built for the Tatum x Walrus "Total Recall" hackathon (Markets and Sports Prediction track).

What it does
You pick a question, such as "Democrats win control of the US Senate", and set a probability. Press Lock in prediction and three things happen:

A commitment to your prediction is written into a Sui mainnet transaction before the question closes.
The prediction is appended to a ledger stored in Walrus Memory, also on mainnet.
The community forecast updates, weighted by each forecaster's track record rather than a plain average.
When the result is entered, every forecaster who predicted that question is scored. Nobody can quietly edit what they said, because the commitment was already on chain before the answer was known.

You do not need a wallet. A guest session is enough to predict, which matters because most people who would use a thing like this have never opened a wallet.

How it uses Tatum
Sealing a prediction on Sui is only useful if a stranger can check it, so the read side matters as much as the write side. CallBook reads every seal back through Tatum's Sui gateway: it fetches the transaction, confirms it succeeded, and confirms the commitment is present in it. The timestamp is Sui's own, not ours.

Two things we learned doing this:

Tatum's gRPC endpoint speaks native gRPC, which the Sui SDK's web transport cannot use. Tatum's GraphQL gateway worked cleanly, so that is what the app calls (sui-mainnet.gateway.tatum.io/graphql).
A transaction is only as verifiable as the bytes you put in it. We write the commitment as the hex text of a SHA-256 hash, not raw bytes, because Move's 0x1::string::utf8 aborts on bytes that are not valid UTF-8. Raw hash bytes failed at simulation, so no gas was lost, but it is a good example of a mistake that only shows up on real mainnet.
Every sealed prediction links to its transaction on Suiscan, and POST /api/verify re-checks a prediction through Tatum on demand.

How it uses Walrus Memory
The track record does not live in our database. It lives in Walrus Memory as an append-only ledger of events: predictions, results, and corrections. The app can rebuild its entire state from that ledger, and we tested exactly that.

Design choices that came out of using it for real:

Append-only, so mistakes are new events. At one point a stray click resolved a question too early on the live ledger. We could not delete it, so we added a void event that cancels a resolution, then rebuilt from Walrus to confirm the state was right. The ledger kept the whole story.
Order is ours to enforce. Recall returns by relevance, not by time, so rebuilds came back mismatched at first. Every event now carries a monotonic sequence number and the app sorts on it.
Private by default. Public state never exposes a player's wallet address or guest id; an audit caught an early version that did, and there is now a test pinning it.
The same Walrus namespace is also read by a second, read-only client: an MCP server that lets an AI assistant ask the ledger who has been right, from the same memory the web app uses.

At the time of writing the ledger holds 23 memories on Walrus mainnet.

How it learns
Each forecaster starts at a credibility weight of 1.00, which means no better than a coin flip. The floor is 0.10 and the ceiling is 3.00.

Weights come from Brier scores, with shrinkage toward the middle so that one lucky call cannot make anyone look like an oracle. A forecaster's weight is clamped between the floor and the ceiling and moves with how much better they have done than chance. The community forecast then re-weights toward whoever has earned it, and the app shows the difference between the weighted forecast and the simple average.

[FILL IN AFTER RESULTS ARE ENTERED] Once the Senate and House results are entered at /operator, replace this block with the real before-and-after: the forecasters' weights before and after the result (for example Decision Desk HQ and Poliwave), how the community forecast moved, and a screenshot of the leaderboard. This is the part of the project the Walrus prize is about, so use real numbers and say plainly if the result was close.

What we would do next
A public page per forecaster, so a record can be linked to and shared.
Pay-per-view access to a forecaster's full record (the Agent Payments prize track).
More question sources, so the ledger fills with real predictions faster.
Try it
Open https://callbook-jade.vercel.app, press Sign in, then Continue as guest, and lock in a prediction on any open question. It will be sealed on Sui within a few seconds, with a link to prove it.