In multi-deployment setups, the normal behavior is that a proof should be valid only for one intended deployment context.
The issue is that public inputs include only treasureHash and recipient. Without block.chainid and address(this) in the verified statement, the same proof can verify on another deployment that uses compatible circuit/verifier artifacts.
Likelihood:
Replay is straightforward once an additional deployment with compatible verifier/circuit artifacts exists.
The proof payload and public inputs are reusable without additional secrets.
Impact:
One successful finder can claim corresponding rewards on multiple deployments.
Any multi-chain rollout inherits duplicated payout risk from one proof.
A minimal cross-chain replay flow:
Written explanation: verification binds only (treasureHash, recipient), not deployment identity. So the same statement can be replayed on another compatible deployment. This is not exploitable on a single isolated deployment.
Use function claim(bytes calldata proof, bytes32 treasureHash, address payable recipient) and circuit main(...).
Update Noir main public inputs accordingly and regenerate verifier artifacts.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.