Skip to content

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}/manifest returns every leaf, one JSON object per line.
  • GET /v1/epochs/{id}/accounts returns 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.