Allow the re-initialization of contracts (#3232)

* allow re-initialization of contracts

* fix lint

* use a private function to avoid code duplication

* use oz-retyped-from syntax

* add documentation

* rephrase

* documentation

* Update contracts/proxy/utils/Initializable.sol

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>

* reinitialize test

* lint

* typos and style

* add note about relation between initializer and reinitializer

* lint

* set _initializing in the modifier

* remove unnecessary variable set

* rename _preventInitialize -> _disableInitializers

* rename preventInitialize -> disableInitializers

* test nested reinitializers in reverse order

* docs typos and style

* edit docs for consistency between initializer and reinitializer

Co-authored-by: Francisco Giordano <frangio.1@gmail.com>
This commit is contained in:
Hadrien Croubois
2022-03-22 19:06:29 +01:00
committed by GitHub
parent b13bdb0249
commit 0eba5112c8
3 changed files with 176 additions and 30 deletions

View File

@ -59,3 +59,32 @@ contract ConstructorInitializableMock is Initializable {
onlyInitializingRan = true;
}
}
contract ReinitializerMock is Initializable {
uint256 public counter;
function initialize() public initializer {
doStuff();
}
function reinitialize(uint8 i) public reinitializer(i) {
doStuff();
}
function nestedReinitialize(uint8 i, uint8 j) public reinitializer(i) {
reinitialize(j);
}
function chainReinitialize(uint8 i, uint8 j) public {
reinitialize(i);
reinitialize(j);
}
function disableInitializers() public {
_disableInitializers();
}
function doStuff() public onlyInitializing {
counter++;
}
}