★ Public initialize() without initializer modifier
Aerodrome Finance's assessment for RD-F-022 — scored green on the v1.7.0 rubric. The evidence below is the curator's reasoning for this score.
Evidence summary #
Pool.sol initialize() uses require(factory == address(0)) guard instead of OZ initializer modifier, and CLPool.sol uses require(factory == address(0) && _factory != address(0)). Both are deployed atomically by factory: Clones.cloneDeterministic() + IPool.initialize() in single transaction — no front-run window. Factory-lock pattern is the Uniswap v2/v3/Solidly standard design; architecturally equivalent to initializer modifier for this deployment pattern. No exploit vector exists for a freshly deployed clone. Spearbit and ABDK reviewed these patterns.
Sources #
- GitHub
- CLPool.sol initialize patternCLPool.sol — initialize() with factory == address(0) guardretrieved 2026-05-04
- PoolFactory.sol — atomic deploymentPoolFactory.sol — atomic clone + initialize in single transactionretrieved 2026-05-04
Methodology #
Determine whether any implementation contract exposes `initialize(…)` without the OpenZeppelin `initializer` modifier or equivalent initialization lock.
See the full factor methodology and distribution across all protocols →