diff --git a/.changeset/lazy-rice-joke.md b/.changeset/lazy-rice-joke.md new file mode 100644 index 00000000000..6e1243002ee --- /dev/null +++ b/.changeset/lazy-rice-joke.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`Initializable`: Use intermediate variables to improve readability. diff --git a/contracts/proxy/utils/Initializable.sol b/contracts/proxy/utils/Initializable.sol index cc6d9c9624c..7545bcca64a 100644 --- a/contracts/proxy/utils/Initializable.sol +++ b/contracts/proxy/utils/Initializable.sol @@ -104,9 +104,19 @@ abstract contract Initializable { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); + // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; - if (!(isTopLevelCall && initialized < 1) && !(address(this).code.length == 0 && initialized == 1)) { + + // Allowed calls: + // - initialSetup: the contract is not in the initializing state and no previous version was + // initialized + // - construction: the contract is initialized at version 1 (no reininitialization) and the + // current contract is just being deployed + bool initialSetup = initialized == 0 && isTopLevelCall; + bool construction = initialized == 1 && address(this).code.length == 0; + + if (!initialSetup && !construction) { revert AlreadyInitialized(); } $._initialized = 1;