Verify a memo
Check that a Scheduler memo is the one the registry recorded.
#You need
- The rotation to check, or the newest one
- A terminal with curl, xxd and Foundry's cast, or Node.js with viem
- No wallet and no ETH: every step only reads
What a memo holds and how its bytes are fixed: Memos and verification.
#Steps
- 01Open the latest memoThe Scheduler page shows the newest memo under The latest memo, once its hash matches the registry. Its Memo hash row links to the memo’s JSON, and its copy button copies the full hash. The page counts rotations from 1 and the registry from 0: Rotation 1 is
rotation(0). - 02Read the registry
Open the weight registry, 0x9960eb·227d09, on Blockscout. In its Contract tab, under Read/Write contract,
latest()gives the newest rotation androtation(n)any other;rotationCount()gives how many exist. NotememoHashandmemoURI. Before the first rotation,latest()reverts withNoRotation.Read a rotationcast call 0x9960eb28D2fb78A901E310dd2aB99Ba4ea227d09 "rotationCount()(uint256)" --rpc-url https://rpc.mainnet.chain.robinhood.com cast call 0x9960eb28D2fb78A901E310dd2aB99Ba4ea227d09 "latest()((uint16[5],bytes32,string,uint64,uint64))" --rpc-url https://rpc.mainnet.chain.robinhood.com cast call 0x9960eb28D2fb78A901E310dd2aB99Ba4ea227d09 "rotation(uint256)((uint16[5],bytes32,string,uint64,uint64))" <n> --rpc-url https://rpc.mainnet.chain.robinhood.com - 03Download the exact bytesSave the file at
memoURIexactly as served, with the first command below. Any change, even a space or the final newline, changes the hash. - 04Hash the bytes
Hash the file’s bytes with keccak-256.
Hash a memocurl -s <memoURI> -o memo.json cast keccak "0x$(xxd -p memo.json | tr -d '\n')" - 05CompareThe result equals
memoHashand the hash on the Scheduler page. A memo whose hash differs is not the memo the registry recorded.
The testnet dry run shows the whole check: rotation 0 on the testnet registry, a memo of test readings, and the same hash on both sides.
Testnet rotation 0
cast call 0xd0f9B82095186Ec1E8568ECB8B7C85C8D77534A2 "rotation(uint256)((uint16[5],bytes32,string,uint64,uint64))" 0 --rpc-url https://rpc.testnet.chain.robinhood.com
# ([1548, 2903, 2065, 1548, 1936], 0xfaf30ce57c54e5dfe4fd3f58df73cfe200ab87d1adb40ddf114c5e0095b2e268, "https://docs.kyzen.network/memos/testnet/0.json", 1793629800 [1.793e9], 1791024111 [1.791e9])
curl -s https://docs.kyzen.network/memos/testnet/0.json -o memo.json
cast keccak "0x$(xxd -p memo.json | tr -d '\n')"
# 0xfaf30ce57c54e5dfe4fd3f58df73cfe200ab87d1adb40ddf114c5e0095b2e268