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