The ConfidencePoolFactory.createPool function allows a sponsor to deploy a new ConfidencePool. It accepts an accounts array for the initial scope but does not validate that this array is non-empty. The ConfidencePool.initialize function, which is called internally, does revert if the accounts array is empty.
Because the check occurs in the clone's initializer rather than the factory, a sponsor can call createPool with an empty accounts array. This transaction will successfully deploy a clone to a deterministic address, consume gas, and then revert during the initialization step. This leaves a deployed but uninitialized and unusable contract on-chain, and prevents a new, valid pool from being created for the same agreement with the same index, as the deterministic address is now occupied.
Likelihood: Low
Reason 1
This occurs when a pool sponsor makes a mistake and calls createPool with an empty accounts parameter.
Impact: Mid
Impact 1
A non-functional, uninitialized ConfidencePool clone is deployed, polluting the blockchain.
Impact 2
The sponsor loses the gas fees for the failed transaction.
Impact 3
It prevents a functional pool from being created at that deterministic address, effectively "burning" the pool index for that agreement and forcing the sponsor to use a different configuration if they wish to try again.
Add a check in ConfidencePoolFactory.createPool to ensure the accounts array is not empty before attempting to create the clone. This provides a faster, cheaper failure and prevents the creation of a useless contract.
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.