- Deadlines are enforced in Solidity; the frontend cannot bypass them.
- Predictions are committed once and cannot be edited.
- Result submission requires
ORACLE_ROLEand is immutable. - Reveals bind chain, contract, wallet, match, score, and salt through
abi.encode. - Duplicate commits, duplicate reveals, duplicate scoring, copied reveals, malformed scores, and canceled matches revert with custom errors.
- Pause controls cover commit, result, and reveal writes.
- The contract has no payable functions, external calls, token transfers, upgrade proxy, user enumeration, or on-chain sorting.
- The oracle is trusted to report the correct real-world result.
- The default admin controls role grants and revocations.
- Block producers can vary timestamps slightly; exact boundary policy is documented and tested.
- Users must preserve their salts. Local storage is not safe against a compromised browser, device loss, or manual clearing.
- Event indexing starts from the configured deployment block and assumes the selected chain and address are correct.
- Team names are display metadata, not authenticated tournament identifiers.
- The project is a non-financial classroom MVP, not audited production software.
No private key or salt belongs in .env, Git, analytics, or logs. The browser recovery record contains the prediction and salt, so users should treat exported JSON as private until reveal. Root/frontend environment variables contain only public RPC and deployment configuration.
- Role administration and deploy-time grants
- Timestamp comparisons at −1, exact, and +1 boundaries
- Commitment encoding types and order
- Score range and integer conversions
- Stable indexed events
- Cancellation and result immutability
- Reveal deadline and duplicate-score prevention
- Privacy expectations of public getters