Don't Trust Us. Check the Chain.
Every Sportsblock market, resolution, and settlement is recorded on the Hive blockchain. Every MEDALS movement is a public Hive Engine transaction. Here is exactly how to verify our games yourself — no permission needed.
Every game platform says "trust us". We'd rather you didn't.
Every market we open, every result we settle, every pot we pay out — it's recorded on the Hive blockchain, in public, under the id sb-games. Every MEDALS movement is a Hive Engine transaction anyone can look up. You don't need an account. You don't need our permission. You need a block explorer.
This page shows you exactly where to look and what you'll find.
The Claim
Sportsblock runs prediction markets, contests, and survival games on MEDALS. The game state lives in our database — but the moments that matter are broadcast to the Hive blockchain as they happen:
- Market created? On-chain.
- Market locked, resolved, voided, settled? On-chain.
- Contest settled? Round resolved? Gameweek decided? On-chain.
- MEDALS staked, paid out, or burned? Every transfer is a public Hive Engine transaction.
If we mis-settle a market, the chain shows it. If we quietly change a result, the chain shows the original. That's the point.
Where to Look
Three places. All public.
1. Audit ops on @sportsblock
Open @sportsblock on HiveHub and look for custom_json operations with id sb-games. Each one is a game lifecycle event, signed with @sportsblock's posting authority:
| Field | Value |
|---|---|
id | sb-games |
required_auths | [] |
required_posting_auths | ["sportsblock"] |
json | the envelope (see below) |
2. MEDALS escrow transfers
Real money flows through dedicated escrow accounts, visible as Hive Engine token transfers:
sp-predictions— predictions, contests, Matchday Matrix, Higher-or-Lower. Stakes and entry fees flow in; payouts and refunds flow out.sp-exchange— Football Exchange only. Deposits in, withdrawals out.@sportsblock— sponsor-funded prizes. Where the pot isn't built from entry fees — Fantasy Test Cricket, IPL Boundary BlackJack, fixed-prize contests — the prizes are paid straight from @sportsblock. The payouttxIds in those ops point at transfers from this account, not from escrow.
3. Burns to @null
Platform fees don't go to a treasury — they're burned. Look for MEDALS transfers to @null, an account nobody controls. Burned means gone. Forever.
The Envelope
Every sb-games op carries the same JSON envelope:
{ "v": 1, "action": "<action name>", "ts": "<ISO8601>", "data": { ... } }
v— envelope version. Currently1. It only bumps if a field is renamed, removed, or changes meaning. New fields can be added without a bump.action— which lifecycle event this is. Full list below.ts— when the state transition was committed on our side. Broadcasts are queued and retried, sotscan be earlier than the block timestamp.tsis the truth about when it happened; the block is the truth about when it was published.data— the per-action payload: IDs, outcomes, amounts (fixed 3-decimal MEDALS strings), counts, and Hive Engine transaction ids. Compact by design — no full data dumps, no personal data beyond Hive usernames.
One op per event. Each market or competition emits each action at most once.
Action Reference (v1)
Fifteen actions. This list is generated from the same type definitions our code compiles against.
Prediction markets
| Action | What it records | Key data fields |
|---|---|---|
prediction_market_create | A market opened | marketId, question, outcomes[], creator (null if admin-created), adminCreated, stakingClosesAt |
prediction_market_lock | Staking closed | marketId, stakingClosesAt |
prediction_market_resolve | Outcome approved by a second admin | marketId, finalOutcome, proposedBy, approvedBy |
prediction_market_void | Market voided, all stakes refunded | marketId, reason, totalRefunded, positionCount |
prediction_market_settle | Every payout broadcast complete | marketId, finalOutcome, totalPool, winningPool, losingPool, burnAmount, burnTxId, creatorFee, creatorFeeOutcome, creatorFeeTxId, winnerCount, totalPaid |
Contests
| Action | What it records | Key data fields |
|---|---|---|
contest_settle | A contest settled and prizes distributed | contestId, slug, contestType, prizeModel, entryFeesCollected, platformFee, creatorFee, prizePoolNet, winners[] (username, placement, amount, txId) |
Higher-or-Lower
| Action | What it records | Key data fields |
|---|---|---|
hol_round_resolve | A round's goals total resolved | competitionId, roundNumber, roundType, baselineTotal, actualTotal, eliminatedCount, aliveAfter, winnersAfter |
hol_settle | Competition paid out in full | competitionId, contestSlug, pool, winnerCount, totalPaid, winners[] (username, rank, amount, txId) |
Matchday Matrix
| Action | What it records | Key data fields |
|---|---|---|
mm_round_resolve | A round scored | competitionId, roundNumber, picksScored, pointsAwarded, multipliersLanded |
mm_settle | Competition settled, top-3 split declared | competitionId, slug, totalPool, unawardedPool, payouts[] (username, placement, amount) |
mm_cancel | Competition cancelled, entries refunded | competitionId, slug, refundCount, totalRefunded |
Fantasy Test Cricket
| Action | What it records | Key data fields |
|---|---|---|
ftc_settle | Final standings and pending payouts written | competitionId, slug, prizePool, pendingTotal, placings[] (username, rank, amount) |
ftc_payout_complete | Every prize broadcast on-chain | competitionId, slug, payoutCount, totalPaid, payouts[] (username, rank, amount, txId) |
IPL Boundary BlackJack & Last Man Standing
| Action | What it records | Key data fields |
|---|---|---|
iplbb_match_resolve | Match boundaries approved by a second admin | competitionId, matchId, fours, sixes, actualBoundaries, picksScored, bustCount, proposedBy, approvedBy |
lms_gameweek_resolve | A gameweek's survivors decided | competitionId, gameweek, survivorsCount, eliminatedCount, totalEntries |
Winner lists are capped at 10 entries per op to stay under Hive's size limit — the counts and totals always cover the full field.
A Real Example: The First Op
The first sb-games op ever broadcast landed in block 109,332,660 on 25 August 2026 — transaction 6440400d773d5a94af204a135ab00bf66a595acc. It records user blanchy opening a market on Spurs vs Charlton in the EFL Cup:
{
"v": 1,
"action": "prediction_market_create",
"ts": "2026-08-25T12:35:48.315Z",
"data": {
"creator": "blanchy",
"marketId": "pm-2026-08-25-51e2",
"outcomes": ["YES", "NO"],
"question": "Will Spurs Beat Charlton in the second round of the EFL Cup on wednesday ?",
"adminCreated": false,
"stakingClosesAt": "2026-08-26T11:00:00.000Z"
}
}
That marketId is the same id shown on the market's page at sportsblock.app/predictions/pm-2026-08-25-51e2. The question, the outcomes, the staking deadline — all locked on-chain the moment the market opened. If we ever changed any of it afterwards, you'd catch us.
Following the Money
The strongest check is cross-referencing a settlement op against the actual transfers.
Prediction market fees come out of the losing pool only — 4% total: 2% to the market creator, 2% burned to @null. Winners are principal-protected: they always get their full stake back, plus a pro-rata share of the post-fee losing pool.
A prediction_market_settle op hands you everything you need to verify that:
totalPool=winningPool+losingPool. Add them up.burnAmount≈ 2% oflosingPool. Then look upburnTxId— it's a Hive Engine MEDALS transfer fromsp-predictionsto@nullfor exactly that amount.creatorFee≈ 2% oflosingPool.creatorFeeOutcometells you where it went:paid(user-created market — checkcreatorFeeTxIdfor the transfer to the creator),burned(admin market — no creator to pay), orskipped(zero fee, nothing to move).totalPaid=winningPool+losingPool−burnAmount−creatorFee. Winners get their stakes back plus the rest of the losing pool. Count the outgoingsp-predictionstransfers after the settle — there arewinnerCountof them and they sum tototalPaid.
Any transaction id in any op can be pasted into he.dtools.dev or any Hive Engine explorer. The amounts either match or they don't. No trust required.
What's NOT On-Chain (Yet)
Honesty cuts both ways. Here's what you won't find:
- Football Exchange trades. Player trading is far too high-frequency for one op per trade — Hive caps an account at 5 custom_json ops per block. Deposits and withdrawals ARE on-chain via
sp-exchange; a daily aggregate solvency snapshot op is planned. - Entries, picks, and stakes as audit ops. Your individual actions aren't echoed as
sb-gamesops — they don't need to be. Paid entries and stakes are already verifiable as your own Hive Engine transfers into escrow. - Custodial account internals. Google/Twitter sign-ups get real Hive accounts with server-held keys. Their on-chain actions are public like everyone else's; the key management is not.
- Off-chain data sources. Match results come from sports data feeds. The chain proves what we said the result was and what we paid on it — the result itself you can check against any scoreboard.
One delivery caveat: ops go through a write-ahead queue with automatic retries. Most land within seconds; a busy moment can delay one a few minutes. Eventual delivery is guaranteed — a brief lag between an event and its op is normal, not a red flag. And ts always records the true event time regardless of when the op reached a block.
What's Next
Audit ops are step one. Next is an app-specific HAF index — a queryable database built straight from the chain, so anyone can reconstruct and verify the full game history without scraping a block explorer.
Until then: the ops are live, the escrows are public, and the burns are permanent.
Don't trust us. Check the chain.
Ready to Get Started?
Join Sportsblock and start earning crypto from your sports knowledge today.