From 790ee5daffad0518fec51092b89ca4ffcd3f237a Mon Sep 17 00:00:00 2001 From: Brendan Asselstine Date: Fri, 14 Aug 2020 16:15:38 -0700 Subject: [PATCH] Added initialize protection to MappedSinglyLinkedList --- contracts/test/MappedSinglyLinkedListExposed.sol | 2 +- contracts/utils/MappedSinglyLinkedList.sol | 2 +- test/MappedSinglyLinkedListExposed.test.js | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/contracts/test/MappedSinglyLinkedListExposed.sol b/contracts/test/MappedSinglyLinkedListExposed.sol index 8c8878b9..899619cb 100644 --- a/contracts/test/MappedSinglyLinkedListExposed.sol +++ b/contracts/test/MappedSinglyLinkedListExposed.sol @@ -7,7 +7,7 @@ contract MappedSinglyLinkedListExposed { MappedSinglyLinkedList.Mapping list; - constructor () public { + function initialize() external { list.initialize(); } diff --git a/contracts/utils/MappedSinglyLinkedList.sol b/contracts/utils/MappedSinglyLinkedList.sol index 59829b8c..d73498b1 100644 --- a/contracts/utils/MappedSinglyLinkedList.sol +++ b/contracts/utils/MappedSinglyLinkedList.sol @@ -19,8 +19,8 @@ library MappedSinglyLinkedList { /// @notice Initializes the list. /// @dev It is important that this is called so that the SENTINAL is correctly setup. function initialize(Mapping storage self) internal { + require(self.count == 0, "Already init"); self.addressMap[SENTINAL] = SENTINAL; - self.count = 0; } function addAddresses(Mapping storage self, address[] memory addresses) internal { diff --git a/test/MappedSinglyLinkedListExposed.test.js b/test/MappedSinglyLinkedListExposed.test.js index e440ba3d..f04b5068 100644 --- a/test/MappedSinglyLinkedListExposed.test.js +++ b/test/MappedSinglyLinkedListExposed.test.js @@ -22,6 +22,7 @@ describe('MappedSinglyLinkedListExposed', function() { [wallet, wallet2, wallet3, wallet4] = await buidler.ethers.getSigners() list = await deployContract(wallet, MappedSinglyLinkedListExposed, [], overrides) + await list.initialize() await list.addAddresses([wallet2._address]) }) @@ -29,6 +30,10 @@ describe('MappedSinglyLinkedListExposed', function() { it('should have initialized with a value', async () => { expect(await list.contains(wallet2._address)).to.be.true }) + + it('should not be initialized after it contains values', async () => { + await expect(list.initialize()).to.be.revertedWith('Already init') + }) }) describe('addressArray', () =>{