setPoolImplementation() validates against address(0) (Factory:138) but does not check that the new implementation has contract code. OpenZeppelin's Clones.cloneDeterministic does not validate the implementation internally — it deploys minimal proxies that delegatecall to the given address. If the address is an EOA, the clone is deployed but all delegatecalls silently succeed with empty return data.
Likelihood: Low. The factory owner is DAO-controlled (trusted role). Requires an accidental fat-finger or a compromised owner to set an EOA.
Impact: High when triggered. Every new pool created afterward is non-functional — stake(), withdraw(), flagOutcome(), claim*() all delegatecall to an EOA and silently no-op. Existing pools are unaffected (they use the pre-change implementation).
Add an extcodesize check:
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.