Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add internal functions _getInitializedVersion and _isInitializing #3598

Merged
merged 4 commits into from Aug 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -2,6 +2,7 @@

## Unreleased

* `Initializable`: add internal functions `_getInitializedVersion` and `_isInitializing` ([#3598](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3598))
* `ERC165Checker`: add `supportsERC165InterfaceUnchecked` for consulting individual interfaces without the full ERC165 protocol. ([#3339](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3339))
* `Address`: optimize `functionCall` by calling `functionCallWithValue` directly. ([#3468](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3468))
* `Address`: optimize `functionCall` functions by checking contract size only if there is no returned data. ([#3469](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3469))
Expand Down
8 changes: 8 additions & 0 deletions contracts/mocks/InitializableMock.sol
Expand Up @@ -13,6 +13,10 @@ contract InitializableMock is Initializable {
bool public onlyInitializingRan;
uint256 public x;

function isInitializing() public view returns (bool) {
return _isInitializing();
}

function initialize() public initializer {
initializerRan = true;
}
Expand Down Expand Up @@ -75,6 +79,10 @@ contract ChildConstructorInitializableMock is ConstructorInitializableMock {
contract ReinitializerMock is Initializable {
uint256 public counter;

function getInitializedVersion() public view returns (uint8) {
return _getInitializedVersion();
}

function initialize() public initializer {
doStuff();
}
Expand Down
14 changes: 14 additions & 0 deletions contracts/proxy/utils/Initializable.sol
Expand Up @@ -135,4 +135,18 @@ abstract contract Initializable {
emit Initialized(type(uint8).max);
}
}

/**
* @dev Internal function that returns the initialized version. Returns `_initialized`
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}

/**
* @dev Internal function that returns the initialized version. Returns `_initializing`
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}
15 changes: 15 additions & 0 deletions test/proxy/utils/Initializable.test.js
Expand Up @@ -20,6 +20,10 @@ contract('Initializable', function (accounts) {
it('initializer has not run', async function () {
expect(await this.contract.initializerRan()).to.equal(false);
});

it('_initializing returns false before initialization', async function () {
expect(await this.contract.isInitializing()).to.equal(false);
});
});

describe('after initialize', function () {
Expand All @@ -31,6 +35,10 @@ contract('Initializable', function (accounts) {
expect(await this.contract.initializerRan()).to.equal(true);
});

it('_initializing returns false after initialization', async function () {
expect(await this.contract.isInitializing()).to.equal(false);
});

it('initializer does not run again', async function () {
await expectRevert(this.contract.initialize(), 'Initializable: contract is already initialized');
});
Expand Down Expand Up @@ -101,6 +109,13 @@ contract('Initializable', function (accounts) {
expect(await this.contract.counter()).to.be.bignumber.equal('2');
});

it('_getInitializedVersion returns right version', async function () {
await this.contract.initialize();
expect(await this.contract.getInitializedVersion()).to.be.bignumber.equal('1');
await this.contract.reinitialize(12);
expect(await this.contract.getInitializedVersion()).to.be.bignumber.equal('12');
});

describe('contract locking', function () {
it('prevents initialization', async function () {
await this.contract.disableInitializers();
Expand Down