diff --git a/contracts/token/VestedToken.sol b/contracts/token/VestedToken.sol index e9985591d..a697bd652 100644 --- a/contracts/token/VestedToken.sol +++ b/contracts/token/VestedToken.sol @@ -15,17 +15,17 @@ contract VestedToken is StandardToken { mapping (address => TokenGrant[]) public grants; - modifier canTransfer(uint _value) { - if (_value > transferableTokens(msg.sender, uint64(now))) throw; + modifier canTransfer(address _sender, uint _value) { + if (_value > transferableTokens(_sender, uint64(now))) throw; _; } - function transfer(address _to, uint _value) canTransfer(_value) returns (bool success) { + function transfer(address _to, uint _value) canTransfer(msg.sender, _value) returns (bool success) { return super.transfer(_to, _value); } - function approve(address _spender, uint _value) canTransfer(_value) returns (bool success) { - return super.approve(_spender, _value); + function transferFrom(address _from, address _to, uint _value) canTransfer(_from, _value) returns (bool success) { + return super.transferFrom(_from, _to, _value); } function grantVestedTokens( diff --git a/test/VestedToken.js b/test/VestedToken.js index bc6333503..4fefa1ad8 100644 --- a/test/VestedToken.js +++ b/test/VestedToken.js @@ -52,6 +52,16 @@ contract('VestedToken', function(accounts) { assert.fail('should have thrown before'); }) + it('throws when trying to transfer from non vested tokens', async () => { + try { + await token.approve(accounts[7], 1, { from: receiver }) + await token.transferFrom(receiver, accounts[7], tokenAmount, { from: accounts[7] }) + } catch(error) { + return assertJump(error); + } + assert.fail('should have thrown before'); + }) + it('can be revoked by granter', async () => { await token.revokeTokenGrant(receiver, 0, { from: granter }); assert.equal(await token.balanceOf(receiver), 0); @@ -78,5 +88,12 @@ contract('VestedToken', function(accounts) { await token.transfer(accounts[7], tokenAmount, { from: receiver }) assert.equal(await token.balanceOf(accounts[7]), tokenAmount); }) + + it('can approve and transferFrom all tokens after vesting ends', async () => { + await timer(vesting + 1); + await token.approve(accounts[7], tokenAmount, { from: receiver }) + await token.transferFrom(receiver, accounts[7], tokenAmount, { from: accounts[7] }) + assert.equal(await token.balanceOf(accounts[7]), tokenAmount); + }) }) });