Check it yourself

Nothing here has to be taken on trust. The register is read from the contract, the contract’s source is verified, and every real reading names an M-Lab test you can look up in M-Lab’s own archive.

Checking test ndt-virtual-xmx98_1791393589_00000000000F19AB

Run this in BigQuery after joining M-Lab’s free data group (see below). The archive row should show the same network number and a download speed close to the signed one. If the row is missing or the network differs, the funder can challenge the day before it settles.

SELECT id, date,
  a.MeanThroughputMbps AS download_mbps,
  a.MinRTT AS min_rtt_ms,
  client.Network.ASNumber AS asn,
  server.Site AS mlab_site
FROM `measurement-lab.ndt.ndt7`
WHERE date = "2026-10-07"
  AND id IN ("ndt-virtual-xmx98_1791393589_00000000000F19AB", "ndt-virtual-xmx98_1791393589_00000000000F0C1D")

Contracts on Base Sepolia

Roll Call v30xD4EDf73a6604840986C32339A96c8E59cB915984Terms, readings, day marks, payouts. Source verified on Sourcify (exact match).
Test dollar (tUSD)0xA6F6e6Bb1Bc46a54635a417Fc8d601B39BaB37626 decimals, minted by the attester key for the demo. No value.
Attester0x629239c5b7B7e6E78944DFd8f4D519161BbA79d9Checks networks, records readings, settles days, relays closures; pays every visitor’s gas.
Funder0xb582FBB0b36365dED379f6B9Bc9AC6f2de4A304BOpens demo terms, challenges suspicious days, ends terms after repeated absences.
Arbiter0xf7ADb15eb48085a35Efb1eb04c946bE4D20e5AcDDecides challenges.
Provider0x0E82E9f33e83a3be2895b9Fe68b75A735790fD4bReceives payouts and posts bonds for demo terms.
Roll Call v2 (retired)0x27500043Bf3A8ae3405264412C2D4D43E8744150Replaced the same afternoon after a second review: parts of the day now divide school hours, offline reports reach the contract until the day settles, weak partial days are strikes, and closures cover a run of days.
Roll Call v1 (retired)0x6b5fa7F9bD52D8162bF61D329ca167C5CF069dd5The first deployment, replaced the same morning after an audit found that a funder could end a term before earned days settled, closures could erase passes, retrying could earn a full day, and one key could hold two roles.

Read a term from the chain

With Foundry’s cast, no account needed. The register returns one entry per school day: readings, parts of the day passed, which parts (a bit mask), mark (0 open, 1 present, 2 partial, 3 absent, 4 silent, 5 closed, 6 voided), closed, challenged, voided.

RPC=https://sepolia.base.org
RC=0xD4EDf73a6604840986C32339A96c8E59cB915984

cast call $RC "termCount()(uint256)" --rpc-url $RPC
cast call $RC "register(uint256)((uint8,uint8,uint32,uint8,bool,bool,bool)[])" 1 --rpc-url $RPC
cast call $RC "state(uint256)((uint128,uint128,uint128,uint128,uint128,uint16,uint16,uint8,bool,bool))" 1 --rpc-url $RPC

Run the contract’s tests

45 tests, including a fuzz test over 500 random terms that checks no money is created or lost.

git clone https://github.com/RohanGlitched/rollcall
cd rollcall/contracts
forge test -vv

Check a reading against M-Lab’s archive

M-Lab publishes every test it serves in BigQuery, including the client’s network number and the throughput its own server measured. Roll Call writes each real reading’s full test id on chain, so a funder (or anyone) can join the two.

Access is free: join M-Lab’s discuss group with a Google account, then query from any Google Cloud project. Tests appear in the archive within about a day, which is why a real term’s challenge window should be longer than that.

Open any real reading on a term page and its test id links here with the query filled in.

-- every Roll Call reading's id, from the chain,
-- joined to M-Lab's own record of the same test
SELECT id, date,
  a.MeanThroughputMbps AS download_mbps,
  a.MinRTT AS min_rtt_ms,
  client.Network.ASNumber AS asn
FROM `measurement-lab.ndt.ndt7`
WHERE date BETWEEN "2026-10-23" AND CURRENT_DATE()
  AND id IN UNNEST(@rollcall_test_ids)

Our readings, checked against M-Lab’s archive

M-Lab loads each day into BigQuery about two days later, so the first real readings (October 23) can be checked from about October 25. The script that does it is in the repository (web/scripts/archive-check.mjs); its results will appear here, reading by reading.

What it costs to run

Gas measured from this deployment’s own transactions on Base Sepolia, priced at Base mainnet’s gas price and the ETH price right now (0.0060 gwei, ETH $2,292). This is execution gas; Base also charges a small fee for posting the data to Ethereum, which grows with the size of the transaction.

ActionGasCost
Open a term (funder locks the money)example265,179$0.00365
Accept a term (provider posts the bond)example75,419$0.00104
Record one readingexample97,494$0.00134
Settle one school day89,000$0.00122
One school for a year (200 school days, 4 readings a day, batched daily)72,439,398$1.00