Browse Source

Decouple transferable logic from VestedToken

Jorge Izquierdo 8 years ago
parent
commit
72029b6847
2 changed files with 25 additions and 17 deletions
  1. 22 0
      contracts/token/TransferableToken.sol
  2. 3 17
      contracts/token/VestedToken.sol

+ 22 - 0
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);
+  }
+}

+ 3 - 17
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));
   }
 }