Proofs
Each epoch publishes a Merkle root over (holder, weight, amount) for every holder, plus the full list.
Encoding
leaf = sha256(0x00 ‖ epoch:u64be ‖ len:u16be ‖ holder:utf8 ‖ weight:u256be ‖ amount:u256be)
node = sha256(0x01 ‖ min(a,b) ‖ max(a,b))
Leaves are sorted by holder address. An odd node moves up unchanged. An empty epoch has the root sha256(0x02).
Endpoints
GET /v1/epochs/{id}returns the window, pot, root and reconciliation.GET /v1/epochs/{id}/manifestreturns every leaf, one JSON object per line.GET /v1/epochs/{id}/accountsreturns every account’s weight.GET /v1/epochs/{id}/proof/{holder}returns one holder’s proof.
Reconciliation
Before an epoch settles, 50 accounts are weighed again through a second RPC provider: the 25 largest and 25 picked by the epoch number. Any difference stops the epoch.
The verifier
sdk/verify in the repository rebuilds an epoch from any Solana RPC you choose and compares it with the published root. It needs nothing from us except the published data.