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.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.