From 74636b73335403956020bc866094f1a8a3d277d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Triay?= Date: Thu, 12 Oct 2017 00:34:03 -0300 Subject: [PATCH 1/4] [TokenVesting] Use SafeMath --- contracts/token/TokenVesting.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/token/TokenVesting.sol b/contracts/token/TokenVesting.sol index 2d8eabb6a..a85f02dfe 100644 --- a/contracts/token/TokenVesting.sol +++ b/contracts/token/TokenVesting.sol @@ -47,7 +47,7 @@ contract TokenVesting is Ownable { beneficiary = _beneficiary; revocable = _revocable; duration = _duration; - cliff = _start + _cliff; + cliff = _start.add(_cliff); start = _start; } From fff8e040b7099d54123949596bba316d1ec398a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Triay?= Date: Fri, 13 Oct 2017 15:32:44 -0300 Subject: [PATCH 2/4] [TokenVesting] vestedAmount returns the historical vested amount --- contracts/token/TokenVesting.sol | 37 ++++++++++++++++++-------------- test/TokenVesting.js | 3 +-- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/contracts/token/TokenVesting.sol b/contracts/token/TokenVesting.sol index a85f02dfe..c201a4770 100644 --- a/contracts/token/TokenVesting.sol +++ b/contracts/token/TokenVesting.sol @@ -57,14 +57,15 @@ contract TokenVesting is Ownable { */ function release(ERC20Basic token) public { uint256 vested = vestedAmount(token); + uint256 unreleased = releasableAmount(token); - require(vested > 0); + require(unreleased > 0); - token.safeTransfer(beneficiary, vested); + token.safeTransfer(beneficiary, unreleased); - released[token] = released[token].add(vested); + released[token] = released[token].add(unreleased); - Released(vested); + Released(unreleased); } /** @@ -78,12 +79,12 @@ contract TokenVesting is Ownable { uint256 balance = token.balanceOf(this); - uint256 vested = vestedAmount(token); - uint256 vesting = balance - vested; + uint256 unreleased = releasableAmount(token); + uint256 refund = balance.sub(unreleased); revoked[token] = true; - token.safeTransfer(owner, vesting); + token.safeTransfer(owner, refund); Revoked(); } @@ -92,20 +93,24 @@ contract TokenVesting is Ownable { * @dev Calculates the amount that has already vested but hasn't been released yet. * @param token ERC20 token which is being vested */ + function releasableAmount(ERC20Basic token) public constant returns (uint256) { + return vestedAmount(token).sub(released[token]); + } + + /** + * @dev Calculates the amount that has already vested. + * @param token ERC20 token which is being vested + */ function vestedAmount(ERC20Basic token) public constant returns (uint256) { + uint256 currentBalance = token.balanceOf(this); + uint256 totalBalance = currentBalance.add(released[token]); + if (now < cliff) { return 0; } else if (now >= start + duration || revoked[token]) { - return token.balanceOf(this); + return totalBalance; } else { - uint256 currentBalance = token.balanceOf(this); - uint256 totalBalance = currentBalance.add(released[token]); - - uint256 vested = totalBalance.mul(now - start).div(duration); - uint256 unreleased = vested.sub(released[token]); - - // currentBalance can be 0 in case of vesting being revoked earlier. - return Math.min256(currentBalance, unreleased); + return totalBalance.mul(now - start).div(duration); } } } diff --git a/test/TokenVesting.js b/test/TokenVesting.js index c391c6577..6a4d86206 100644 --- a/test/TokenVesting.js +++ b/test/TokenVesting.js @@ -83,12 +83,11 @@ contract('TokenVesting', function ([_, owner, beneficiary]) { await increaseTimeTo(this.start + this.cliff + duration.weeks(12)); const vested = await this.vesting.vestedAmount(this.token.address); - const balance = await this.token.balanceOf(this.vesting.address); await this.vesting.revoke(this.token.address, { from: owner }); const ownerBalance = await this.token.balanceOf(owner); - ownerBalance.should.bignumber.equal(balance.sub(vested)); + ownerBalance.should.bignumber.equal(amount.sub(vested)); }); it('should keep the vested tokens when revoked by owner', async function () { From aa431dfb20893f79c23af720a58b3b9c995dc359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Triay?= Date: Fri, 13 Oct 2017 16:13:54 -0300 Subject: [PATCH 3/4] [TokenVesting] Increase released amount before transfer --- contracts/token/TokenVesting.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/token/TokenVesting.sol b/contracts/token/TokenVesting.sol index c201a4770..2861672d8 100644 --- a/contracts/token/TokenVesting.sol +++ b/contracts/token/TokenVesting.sol @@ -61,10 +61,10 @@ contract TokenVesting is Ownable { require(unreleased > 0); - token.safeTransfer(beneficiary, unreleased); - released[token] = released[token].add(unreleased); + token.safeTransfer(beneficiary, unreleased); + Released(unreleased); } From eb9f88bafcf00555d1ba045360e3256cdb8f58ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Triay?= Date: Fri, 13 Oct 2017 16:20:24 -0300 Subject: [PATCH 4/4] [TokenVesting] Remove unused variable --- contracts/token/TokenVesting.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/token/TokenVesting.sol b/contracts/token/TokenVesting.sol index 2861672d8..a4ca4b088 100644 --- a/contracts/token/TokenVesting.sol +++ b/contracts/token/TokenVesting.sol @@ -56,7 +56,6 @@ contract TokenVesting is Ownable { * @param token ERC20 token which is being vested */ function release(ERC20Basic token) public { - uint256 vested = vestedAmount(token); uint256 unreleased = releasableAmount(token); require(unreleased > 0);