The factory rejects a zero poolImplementation but accepts any nonzero address, including one with no runtime code. createPool clones that target, the clone's initialize delegatecall returns success with empty data, and the factory records the clone in _poolsByAgreement and emits PoolCreated. The recorded address is not a working pool: calls through it currently succeed as empty no-ops, leaving an unusable entry in the per-Agreement discovery list.
The zero-address checks prevent an explicitly null implementation configuration but do not verify that the selected address has runtime code. createPool assumes the clone is a working ConfidencePool once the no-return-value initialize call completes.
Both factory initialize and setPoolImplementation accept any nonzero address. A no-code target, such as an EOA or undeployed address, can still be cloned through Clones.cloneDeterministic. The proxy's delegatecall to that target reports success with empty returndata, which satisfies the ABI call because initialize has no return value. The factory therefore appends the clone and emits PoolCreated. The factory cannot repoint that clone's immutable implementation target, and the current factory API provides no way to remove the recorded address.
Likelihood:
Occurs when the factory owner sets poolImplementation to a nonzero address that lacks runtime code (a mistyped or EOA address, or an implementation not yet deployed). Every pool created until the value is corrected is a phantom.
Requires a factory-owner configuration error; no unprivileged actor can trigger it.
Likelihood is Low.
Impact:
The per-Agreement discovery list and PoolCreated events contain unusable addresses that currently answer calls as empty no-ops. The clone's target cannot be changed, and the current factory API cannot remove the entry; a factory upgrade would be required to add a cleanup path.
No user tokens move, existing pools are unaffected, and a valid replacement can be created at the next per-Agreement index after correcting the implementation. Because pool lists permit multiple entries and are curated off-chain, the immediate impact is limited to configuration and discovery pollution.
Impact is Low.
poc/NoCodeImplementationPoc.t.sol passes with:
Require runtime code in both implementation-configuration paths (initialize and setPoolImplementation):
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.