Docs · 02
Reporting & disputes
Reporter stake, Merkle root format, the 24h window, bonds and slashing.
Scores reach the chain through an optimistic process: a staked reporter commits a daily report, and the report becomes final only if no one successfully disputes it within 24 hours.
Reporter stake
- A reporter must stake $PRGE to be eligible to post reports. The minimum stake is a governed parameter.
- One report is accepted per reporting day. Assignment of the day's reporter rotates across the reporter set.
- Stake can be withdrawn only after an unbonding period longer than the dispute window, so a reporter cannot exit before its last report is final.
Report format
Each report is a single transaction:
struct Report {
uint32 day; // UTC day index since Unix epoch
bytes32 root; // Merkle root of all score leaves
uint32 leafCount;
bytes32 configHash; // indexer version + parameters + venue list
string dataURI; // content-addressed full dataset
}Leaf encoding
leaf = keccak256(bytes.concat(keccak256(abi.encode(
day, venue, token, sizeBucket, marketState,
scoreBps, sampleSize, notionalUsdg
))))The tree uses sorted-pair hashing, compatible with OpenZeppelin MerkleProof. Leaves are double-hashed to prevent second-preimage attacks on intermediate nodes.
Dispute window
- The window is 24 hours from the block in which the report is posted (governed).
- During the window, scores from the pending report are not visible to
bestVenue; the previous final report is used. - After the window closes without a successful dispute, the report is final.
Disputes
A challenger:
- Recomputes the report from public data using the pinned
configHash. - Posts a dispute bond and identifies the disputed leaf, with its Merkle proof and the recomputed values.
- The dispute is resolved by recomputation with the pinned indexer version. Until $PRGE governance is live, resolution is executed by a published multisig; the signer set is disclosed before mainnet deployment.
Outcomes
| Outcome | Effect |
|---|---|
| Dispute succeeds | Report is discarded. Reporter stake is slashed by the governed fraction; part of the slashed amount goes to the challenger. The challenger's bond is returned. The previous final report stays in effect until a corrected report is final. |
| Dispute fails | Challenger's bond is forfeited to the reporter. The report proceeds to finality at the end of the window. |
| No dispute | Report is final after 24 hours. |
Missed reports
If no report is posted for a day, no new scores become final. Existing scores age normally and fall under the 48-hour staleness rule. Repeated missed assignments remove a reporter from rotation.