★ Public initialize() without initializer modifier
JustLend DAO's assessment for RD-F-022 — scored yellow on the v1.7.0 rubric. The evidence below is the curator's reasoning for this score.
Evidence summary #
CToken.sol initialize() protected by manual guard: require(accrualBlockNumber == 0 && borrowIndex == 0). GovernorBravoDelegate.sol initialize() protected by require(address(timelock) == address(0)) and require(msg.sender == admin). No OpenZeppelin initializer modifier (structurally unavailable on TVM). Manual guards are TVM-equivalent protection but not formally verified as equivalent. CErc20Delegator initializes via constructor delegatecall — no separate public initialize(). Assessment: yellow — manual guards exist and appear functionally effective for TVM, but not certified equivalent to OZ initializer pattern.
Sources #
- GitHubJustLend GovernorBravoDelegate.sol — initialize() manual guardGovernorBravoDelegate.sol initialize() — require(address(timelock) == address(0)) AND require(msg.sender == admin)retrieved 2026-05-17
- JustLend CToken.sol — initialize() manual guardCToken.sol initialize() — require(accrualBlockNumber == 0 && borrowIndex == 0) manual re-init guardretrieved 2026-05-17
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 →