Skip to content
perigee

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:

  1. Recomputes the report from public data using the pinned configHash.
  2. Posts a dispute bond and identifies the disputed leaf, with its Merkle proof and the recomputed values.
  3. 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

OutcomeEffect
Dispute succeedsReport 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 failsChallenger's bond is forfeited to the reporter. The report proceeds to finality at the end of the window.
No disputeReport 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.