Verifying a Roll
Hash the file, read the registry, and compare the two.
What goes on chain
Every Roll file is hashed with SHA-256 over its exact bytes. Under the Roll's number, the operator writes three things to the RollRegistry contract: the hash, the closing price as navPerShare (USDG per vRENT with 12 decimals) and the URI where the file is published. The contract adds the block timestamp. rolls(n) returns the four values in that order.
In the browser
Open /roll#verify. The page hashes the Roll file in your browser, reads rolls(n) from Robinhood Chain through the public RPC, and compares the two. No wallet is needed. You can also drop in a Roll file you downloaded earlier, and the page hashes that file instead.
From a terminal
To do the same by hand, set REGISTRY to the RollRegistry address from Chain and addresses. cast is part of the Foundry toolkit.
sha256sum rentday-roll-001.csv
cast call $REGISTRY "rolls(uint16)(bytes32,uint256,string,uint64)" 1 --rpc-url https://rpc.mainnet.chain.robinhood.com
On macOS, use shasum -a 256 in place of sha256sum. In Windows PowerShell, use Get-FileHash -Algorithm SHA256, which prints the hash in capitals. cast prints four values:
- The document hash, with a
0xprefix. The 64 hex characters after the prefix must equal the output ofsha256sum, ignoring case. navPerShare, the closing price as an integer with 12 decimals, so 1017995000000 means 1.017995 USDG. It is read from the vault at publication, and the chain resolves the price to six decimals, so its last six digits are zeros. Compare its first six decimals withprice_closein the file.- The URI where the operator published the file.
- The publication time as a Unix timestamp.
The contracts package has a script that runs the same comparison and prints MATCH or MISMATCH. Given a URL or a local path it hashes that; given only the Roll number, it downloads the URI stored on chain.
cd contracts
npm run verify-roll -- 1 https://rentday.xyz/data/rolls/001.csv
Hash the file exactly as you downloaded it. Opening a Roll in a spreadsheet and saving it again can change line endings or quoting, and any changed byte produces a different hash.
Numbering and corrections
The registry is append-only. Roll numbers start at 1 and run in strict sequence: publish accepts n only if it equals latest() + 1, so a number cannot be skipped or reused. The contract has no function to update or delete a Roll. If a published Roll turns out to be wrong, the correction comes in a later Roll, and the original stays on chain beside it.
What a match proves
A match proves that the file you hold is byte for byte the file the operator committed, at the time the registry records. Nobody has edited it since, the operator included.
What a match does not prove
A matching hash proves the file is unchanged. It does not prove that the rents, statuses or costs in it are true.
- That the figures are true. The operator could commit a file with false figures, and it would still match. No independent attestor has been named yet.
- That the arithmetic is right. Check the identities on Reading a Roll.
- That the file is complete. If the operator left an apartment out before committing, the shorter file still matches its hash. Count the rows in the apartments section and compare the count with the previous Roll: every apartment appears every month, so the count changes only when the portfolio changes.
Sample Rolls
The six sample Rolls, S1 to S6, are generated from illustrative data by the same close engine. They were never committed to the registry, so there is nothing on chain to compare them with. Hashing one still works, and gives the same result on every machine because the format is byte-stable.