In _getAgreementState(), when safeHarborRegistry.getAttackRegistry() returns address(0), the function reverts with InvalidAgreement. But the agreement itself is valid — the failure is that the Safe Harbor Registry's attack registry pointer is misconfigured (returns zero). The same InvalidAgreement error is used when safeHarborRegistry.isAgreementValid(agreement) returns false, which IS a genuinely invalid agreement. Off-chain systems parsing revert reasons cannot distinguish "zero attack registry" from "invalid agreement" — two different root causes sharing one error selector.
Likelihood: Low — requires the DAO-controlled SafeHarborRegistry to have a zero attack registry pointer, which the DAO controls and won't intentionally set to zero.
Impact: Low — no funds lost; the transaction reverts cleanly. Off-chain debugging and error handling are degraded because two distinct failure modes share one selector.
File: L3-InvalidAgreement-AttackRegistry.poc.t.sol
Run: forge test --match-path 'L3-InvalidAgreement-AttackRegistry.poc.t.sol' -vv
Introduce a distinct AttackRegistryNotSet error and use it in _getAgreementState for the zero-address check, keeping InvalidAgreement for the isAgreementValid check in initialize:
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
View preliminary resultsAppeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.