Anchor batch 20260923
106 signal snapshots, hashed into one root and written to Arbitrum One. The list below is the batch's exact composition, in the order the tree was built — that order is part of the root.
- Merkle root
- 0xc45806ba81a809f122d8c0c79844feae16baaabf5047f674bc3e1059a4758ac4
- Network
- Arbitrum One
- Anchored
- Sep 23, 2026 04:30 UTC
- Written by
- 0x57c89Be59322a75E3B7C116d9A2e7B0332A257D1
- Last re-checked against the chain
- Sep 23, 2026 — the root on chain was read back and rebuilt from our rows that day
Read the root from a node rather than from us — roots(20260923):
curl -s https://arb1.arbitrum.io/rpc -X POST -H 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0xceacc40cf7b7c797d990dce7164fcccd87dad693","data":"0xc2b40ae4000000000000000000000000000000000000000000000000000000000135283b"},"latest"]}'
Every leaf in this batch
106 total · page 2 of 2Leaves are numbered from zero in tree order. Each one is computed here by hashing that signal's stored snapshot — not copied out of a column — so a row whose bytes changed after the anchor shows up as a mismatch. Open a signal to see those bytes and the branch that carries it to the root.
Rebuild the root yourself
Take the leaves above in this order and fold them pairwise. The specification is published word for word on the verification page; the short version is below, and the rule that catches most reimplementations is the odd node — it is carried up unchanged, never paired with itself.
import hashlib
level = [bytes.fromhex(h) for h in leaves] # in the order listed above
while len(level) > 1:
nxt = [hashlib.sha256(level[i] + level[i + 1]).digest()
for i in range(0, len(level) - 1, 2)]
if len(level) % 2:
nxt.append(level[-1]) # promoted, never duplicated
level = nxt
print('0x' + level[0].hex())