From be940462450edc069ae4cf13625663ba48676390 Mon Sep 17 00:00:00 2001 From: "rik61072@gmail.com" Date: Thu, 4 Aug 2022 22:33:52 +0530 Subject: [PATCH 1/4] added internal function as required by #3584 --- contracts/proxy/utils/Initializable.sol | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/contracts/proxy/utils/Initializable.sol b/contracts/proxy/utils/Initializable.sol index 67a81e0a5f3..81683f002e0 100644 --- a/contracts/proxy/utils/Initializable.sol +++ b/contracts/proxy/utils/Initializable.sol @@ -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; + } } From 20fe76cf29d1662c7f77b44241029cb0a143ac3a Mon Sep 17 00:00:00 2001 From: "rik61072@gmail.com" Date: Tue, 9 Aug 2022 17:48:56 +0530 Subject: [PATCH 2/4] updated changelog for #3598 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1afa0ddf822..ffa4c02be71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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)) From fc8ba0d1453ea200cd308f2b50bd8614676bc16d Mon Sep 17 00:00:00 2001 From: "rik61072@gmail.com" Date: Sat, 13 Aug 2022 12:38:15 +0530 Subject: [PATCH 3/4] tests for Initializable.sol --- contracts/mocks/InitializableMock.sol | 8 ++++++++ test/proxy/utils/Initializable.test.js | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/contracts/mocks/InitializableMock.sol b/contracts/mocks/InitializableMock.sol index b24db08911c..33fa814589c 100644 --- a/contracts/mocks/InitializableMock.sol +++ b/contracts/mocks/InitializableMock.sol @@ -13,6 +13,14 @@ contract InitializableMock is Initializable { bool public onlyInitializingRan; uint256 public x; + function getInitializedVersion() public view returns (uint8) { + return _getInitializedVersion(); + } + + function isInitializing() public view returns (bool) { + return _isInitializing(); + } + function initialize() public initializer { initializerRan = true; } diff --git a/test/proxy/utils/Initializable.test.js b/test/proxy/utils/Initializable.test.js index 664bd899d24..ff345161796 100644 --- a/test/proxy/utils/Initializable.test.js +++ b/test/proxy/utils/Initializable.test.js @@ -1,5 +1,6 @@ const { expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); +const { it } = require('node:test'); const InitializableMock = artifacts.require('InitializableMock'); const ConstructorInitializableMock = artifacts.require('ConstructorInitializableMock'); @@ -20,6 +21,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 () { @@ -31,6 +36,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'); }); @@ -101,6 +110,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.equal(0); + await this.contract.reinitialize(128); + expect(await this.contract.getInitializedVersion()).to.equal(128); + }); + describe('contract locking', function () { it('prevents initialization', async function () { await this.contract.disableInitializers(); From ce62614cfa267ee19b1e0be50c0b8601737a6762 Mon Sep 17 00:00:00 2001 From: "rik61072@gmail.com" Date: Sat, 13 Aug 2022 12:57:51 +0530 Subject: [PATCH 4/4] fixed previously written tests for Initializable.sol --- contracts/mocks/InitializableMock.sol | 8 ++++---- test/proxy/utils/Initializable.test.js | 7 +++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/contracts/mocks/InitializableMock.sol b/contracts/mocks/InitializableMock.sol index 33fa814589c..34040b6e52c 100644 --- a/contracts/mocks/InitializableMock.sol +++ b/contracts/mocks/InitializableMock.sol @@ -13,10 +13,6 @@ contract InitializableMock is Initializable { bool public onlyInitializingRan; uint256 public x; - function getInitializedVersion() public view returns (uint8) { - return _getInitializedVersion(); - } - function isInitializing() public view returns (bool) { return _isInitializing(); } @@ -83,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(); } diff --git a/test/proxy/utils/Initializable.test.js b/test/proxy/utils/Initializable.test.js index ff345161796..2c0c147f651 100644 --- a/test/proxy/utils/Initializable.test.js +++ b/test/proxy/utils/Initializable.test.js @@ -1,6 +1,5 @@ const { expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const { it } = require('node:test'); const InitializableMock = artifacts.require('InitializableMock'); const ConstructorInitializableMock = artifacts.require('ConstructorInitializableMock'); @@ -112,9 +111,9 @@ contract('Initializable', function (accounts) { it('_getInitializedVersion returns right version', async function () { await this.contract.initialize(); - expect(await this.contract.getInitializedVersion()).to.equal(0); - await this.contract.reinitialize(128); - expect(await this.contract.getInitializedVersion()).to.equal(128); + 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 () {