How data is cross-checked
Every distribution is recomputed independently from contract state.
The indexer never uses the deprecated contract-events endpoint. For each distribution it takes three steps:
Find the block
The calculation height of distribution k is fixed: first burn height + (k + 1) × 1,050 − 1. The indexer binary-searches Stacks blocks for the first one whose state has last-reward-compute-height ≥ that height, reading historical state with Hiro's call-read ?tip=.
Read the event
It takes the calculate-rewards transaction in that block and reads the exact figures from its calculate-rewards and bond-distribution print events.
Recompute from state
It reads pox-5 state just before and just after that block:
- the reserve delta, which must equal the deposit exactly
- rewards-per-token × shares, for STX-only stakers and each bond
Results so far
| Distribution | Cycle | Gross pool | Paid to bonds | Reserve deposit | Differences vs event | Match |
|---|---|---|---|---|---|---|
| 282 | 141 | 162,018,760 sats | 0 sats | 24,302,814 sats | gross -1, reserve 0, stx -1, bonds 0 | yes |
| 283 | 141 | 188,232,684 sats | 0 sats | 28,234,902 sats | gross -1, reserve 0, stx -1, bonds 0 | yes |
| 284 | 142 | 217,098,316 sats | 0 sats | 32,564,747 sats | gross -1, reserve 0, stx -1, bonds 0 | yes |
| 285 | 142 | 233,931,905 sats | 0 sats | 35,089,785 sats | gross -1, reserve 0, stx -1, bonds 0 | yes |
| 286 | 143 | 230,327,835 sats | 13,810,222 sats | 32,477,641 sats | gross -2, reserve 0, stx -1, bonds -1 | yes |
The differences come from integer truncation in rewards-per-token: at most 1 sat per product.