From 58106d3c562812851e39f2adf5d39a4566139c12 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Fri, 13 Jul 2018 00:17:42 +0200 Subject: [PATCH 1/5] Remove useless update in provider() --- contracts/TransmuteDPOS.sol | 1 - test/TestTransmuteDPOS.spec.js | 11 ----------- 2 files changed, 12 deletions(-) diff --git a/contracts/TransmuteDPOS.sol b/contracts/TransmuteDPOS.sol index afee2a8..6369986 100644 --- a/contracts/TransmuteDPOS.sol +++ b/contracts/TransmuteDPOS.sol @@ -62,7 +62,6 @@ contract TransmuteDPOS is TransmuteToken, RoundManager, ProviderPool { addProvider(msg.sender, p.totalAmountBonded); emit ProviderAdded(msg.sender, _pricePerStorageMineral, _pricePerComputeMineral, _blockRewardCut, _feeShare); } else { - updateProvider(msg.sender, p.totalAmountBonded); emit ProviderUpdated(msg.sender, _pricePerStorageMineral, _pricePerComputeMineral, _blockRewardCut, _feeShare); } p.status = ProviderStatus.Registered; diff --git a/test/TestTransmuteDPOS.spec.js b/test/TestTransmuteDPOS.spec.js index 87ca883..9fed1b8 100644 --- a/test/TestTransmuteDPOS.spec.js +++ b/test/TestTransmuteDPOS.spec.js @@ -140,17 +140,6 @@ contract('TransmuteDPOS', accounts => { await assertFail( approveBondProvider(20 ,10, 2, 25, 1, accounts[5]) ); }); - it('should update the value of totalBondedAmount in the providerPool if the provider is Registered and size < maxSize', async () => { - // Check that provider is Registered - assert.equal(true, await tdpos.containsProvider(accounts[3])); - // Check the size of the pool stays the same - let providerPool = await tdpos.providerPool.call(); - const previousSize = providerPool[3]; // [3] is current size of the pool - await tdpos.provider(19, 10, 2, 20, {from: accounts[3]}); - providerPool = await tdpos.providerPool.call(); - assert.deepEqual(previousSize, providerPool[3]); - }); - it('should work if provider is Registered and size == maxSize', async () => { await tdpos.provider(21 ,10, 2, 25, {from: accounts[4]}); }); From cef8e2e37e5f1a5852b16d7a289992bed0fd95da Mon Sep 17 00:00:00 2001 From: Guillaume Date: Fri, 13 Jul 2018 15:09:20 +0200 Subject: [PATCH 2/5] Change visibility to external --- contracts/TransmuteDPOS.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/TransmuteDPOS.sol b/contracts/TransmuteDPOS.sol index 6369986..4b269cd 100644 --- a/contracts/TransmuteDPOS.sol +++ b/contracts/TransmuteDPOS.sol @@ -71,7 +71,7 @@ contract TransmuteDPOS is TransmuteToken, RoundManager, ProviderPool { p.feeShare = _feeShare; } - function resignAsProvider() public { + function resignAsProvider() external { require(providers[msg.sender].status != ProviderStatus.Unregistered); removeProvider(msg.sender); delete providers[msg.sender]; @@ -88,5 +88,6 @@ contract TransmuteDPOS is TransmuteToken, RoundManager, ProviderPool { this.transferFrom(msg.sender, this, _amount); delegators[msg.sender] = Delegator(_provider, _amount); p.totalAmountBonded = p.totalAmountBonded.add(_amount); + updateProvider(_provider, p.totalAmountBonded); } } From fbfbc39292ce6aafa3bb9eed154db00ca84eca1a Mon Sep 17 00:00:00 2001 From: Guillaume Date: Fri, 13 Jul 2018 15:09:59 +0200 Subject: [PATCH 3/5] Update only if provider is registered --- contracts/TransmuteDPOS.sol | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/contracts/TransmuteDPOS.sol b/contracts/TransmuteDPOS.sol index 4b269cd..c1dbf5f 100644 --- a/contracts/TransmuteDPOS.sol +++ b/contracts/TransmuteDPOS.sol @@ -82,12 +82,15 @@ contract TransmuteDPOS is TransmuteToken, RoundManager, ProviderPool { Provider storage p = providers[_provider]; // A delegator is only allowed to bond to an Unregistered provider if the provider is himself // otherwise _provider has to be associated with a Registered provider - require(_provider == msg.sender || p.status != ProviderStatus.Unregistered); + require(_provider == msg.sender || p.status == ProviderStatus.Registered); // Check if delegator has not already bonded to some address require(delegators[msg.sender].delegateAddress == address(0)); this.transferFrom(msg.sender, this, _amount); delegators[msg.sender] = Delegator(_provider, _amount); p.totalAmountBonded = p.totalAmountBonded.add(_amount); - updateProvider(_provider, p.totalAmountBonded); + // Update the bonded amount of the provider in the pool + if (p.status == ProviderStatus.Registered) { + updateProvider(_provider, p.totalAmountBonded); + } } } From e3cd6ab4f6a30bdba0caaa84d256fda87cb53d8a Mon Sep 17 00:00:00 2001 From: Guillaume Date: Fri, 13 Jul 2018 19:16:01 +0200 Subject: [PATCH 4/5] Fix test --- test/TestTransmuteDPOS.spec.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/TestTransmuteDPOS.spec.js b/test/TestTransmuteDPOS.spec.js index 9fed1b8..17827dd 100644 --- a/test/TestTransmuteDPOS.spec.js +++ b/test/TestTransmuteDPOS.spec.js @@ -141,7 +141,11 @@ contract('TransmuteDPOS', accounts => { }); it('should work if provider is Registered and size == maxSize', async () => { + let provider = await tdpos.providers.call(accounts[4]); + assert.equal(20, provider[1]); // [1] is pricePerStorageMineral await tdpos.provider(21 ,10, 2, 25, {from: accounts[4]}); + provider = await tdpos.providers.call(accounts[4]); + assert.equal(21, provider[1]); }); }); From b10db1583fef228eb767a0081e628c7ff9692cb3 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Fri, 13 Jul 2018 19:45:56 +0200 Subject: [PATCH 5/5] Add test --- test/TestTransmuteDPOS.spec.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/test/TestTransmuteDPOS.spec.js b/test/TestTransmuteDPOS.spec.js index 17827dd..0b74e04 100644 --- a/test/TestTransmuteDPOS.spec.js +++ b/test/TestTransmuteDPOS.spec.js @@ -260,11 +260,26 @@ contract('TransmuteDPOS', accounts => { it("should transfer amount from the delegator's balance to the contract's balance", async () => { const contractBalance = (await tdpos.balanceOf(tdpos.address)).toNumber(); assert.equal(1000, await tdpos.balanceOf(accounts[9])); - await tdpos.approve(contractAddress, 300, {from: accounts[9]}); await tdpos.bond(accounts[1], 300, {from: accounts[9]}); assert.equal(700, await tdpos.balanceOf(accounts[9])); assert.equal(contractBalance + 300, await tdpos.balanceOf(tdpos.address)); }); + + it('should not affect the providerPool if provider is not registered', async() => { + assert.equal(false, await tdpos.containsProvider(accounts[2])); + await tdpos.approve(contractAddress, 300, {from: accounts[2]}); + await tdpos.bond(accounts[2], 300, {from: accounts[2]}); + assert.equal(false, await tdpos.containsProvider(accounts[2])); + }); + + it('should update the totalBondedAmount of the provider in the providerPool if he is already registered', async () => { + let provider = await tdpos.getProvider.call(accounts[0]); + let previousBondedAmount = provider[0].toNumber(); // [0] is bonded amount + await tdpos.approve(contractAddress, 300, {from: accounts[7]}); + await tdpos.bond(accounts[0], 300, {from: accounts[7]}); + provider = await tdpos.getProvider.call(accounts[0]); + assert.equal(300 + previousBondedAmount, provider[0]); + }); }); });