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