createPool() checks expiry < block.timestamp + _MIN_EXPIRY_LEAD (30 days minimum) but does NOT check expiry > type(uint32).max. The pool's initialize() does perform this check (Pool:197: if (expiry_ > type(uint32).max) revert ExpiryTooFar()), but it runs after cloneDeterministic() has already deployed the clone at Factory:87.
Likelihood: Very low. type(uint32).max ≈ 4.3 billion (year 2106). Current timestamps are ~1.75 billion. Only a manual input error or fuzz test would trigger this.
Impact: Low. If triggered, the clone is deployed (~50k gas) but initialize() reverts, leaving an orphaned clone at a deterministic CREATE2 address. The salt is consumed — the same agreement-index pair can never create a pool again.
Add the upper bound check in createPool() before cloneDeterministic():
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.