From 72029b68476545ecd4c2592b927d39cc5c4da0bd Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Tue, 14 Mar 2017 20:22:18 +0100 Subject: [PATCH] Decouple transferable logic from VestedToken --- contracts/token/TransferableToken.sol | 22 ++++++++++++++++++++++ contracts/token/VestedToken.sol | 20 +++----------------- 2 files changed, 25 insertions(+), 17 deletions(-) create mode 100644 contracts/token/TransferableToken.sol diff --git a/contracts/token/TransferableToken.sol b/contracts/token/TransferableToken.sol new file mode 100644 index 000000000..520ae3f26 --- /dev/null +++ b/contracts/token/TransferableToken.sol @@ -0,0 +1,22 @@ +pragma solidity ^0.4.8; + +import "./ERC20.sol"; + +contract TransferableToken is ERC20 { + modifier canTransfer(address _sender, uint _value) { + if (_value > transferableTokens(_sender, uint64(now))) throw; + _; + } + + function transfer(address _to, uint _value) canTransfer(msg.sender, _value) returns (bool success) { + return super.transfer(_to, _value); + } + + function transferFrom(address _from, address _to, uint _value) canTransfer(_from, _value) returns (bool success) { + return super.transferFrom(_from, _to, _value); + } + + function transferableTokens(address holder, uint64 time) constant public returns (uint256) { + return balanceOf(holder); + } +} diff --git a/contracts/token/VestedToken.sol b/contracts/token/VestedToken.sol index 68be5b831..9eb822672 100644 --- a/contracts/token/VestedToken.sol +++ b/contracts/token/VestedToken.sol @@ -2,9 +2,9 @@ pragma solidity ^0.4.8; import "./StandardToken.sol"; +import "./TransferableToken.sol"; - -contract VestedToken is StandardToken { +contract VestedToken is StandardToken, TransferableToken { struct TokenGrant { address granter; uint256 value; @@ -15,19 +15,6 @@ contract VestedToken is StandardToken { mapping (address => TokenGrant[]) public grants; - modifier canTransfer(address _sender, uint _value) { - if (_value > transferableTokens(_sender, uint64(now))) throw; - _; - } - - function transfer(address _to, uint _value) canTransfer(msg.sender, _value) returns (bool success) { - return super.transfer(_to, _value); - } - - function transferFrom(address _from, address _to, uint _value) canTransfer(_from, _value) returns (bool success) { - return super.transferFrom(_from, _to, _value); - } - function grantVestedTokens( address _to, uint256 _value, @@ -133,11 +120,10 @@ contract VestedToken is StandardToken { function transferableTokens(address holder, uint64 time) constant public returns (uint256 nonVested) { uint256 grantIndex = grants[holder].length; - for (uint256 i = 0; i < grantIndex; i++) { nonVested = safeAdd(nonVested, nonVestedTokens(grants[holder][i], time)); } - return safeSub(balances[holder], nonVested); + return min256(safeSub(balances[holder], nonVested), super.transferableTokens(holder, time)); } }