|
@@ -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;
|