|
|
@ -3,6 +3,10 @@ pragma solidity ^0.4.8; |
|
|
|
import "./StandardToken.sol"; |
|
|
|
import "./StandardToken.sol"; |
|
|
|
import "./LimitedTransferToken.sol"; |
|
|
|
import "./LimitedTransferToken.sol"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* @title Vested token |
|
|
|
|
|
|
|
* @dev Tokens that can be vested for a group of addresses. |
|
|
|
|
|
|
|
*/ |
|
|
|
contract VestedToken is StandardToken, LimitedTransferToken { |
|
|
|
contract VestedToken is StandardToken, LimitedTransferToken { |
|
|
|
struct TokenGrant { |
|
|
|
struct TokenGrant { |
|
|
|
address granter; // 20 bytes |
|
|
|
address granter; // 20 bytes |
|
|
@ -18,6 +22,14 @@ contract VestedToken is StandardToken, LimitedTransferToken { |
|
|
|
|
|
|
|
|
|
|
|
event NewTokenGrant(address indexed from, address indexed to, uint256 value, uint256 grantId); |
|
|
|
event NewTokenGrant(address indexed from, address indexed to, uint256 value, uint256 grantId); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* @dev Grant tokens to a specified address |
|
|
|
|
|
|
|
* @param _to address The address which the tokens will be granted to. |
|
|
|
|
|
|
|
* @param _value uint256 The amount of tokens to be granted. |
|
|
|
|
|
|
|
* @param _start uint64 Time of the beginning of the grant. |
|
|
|
|
|
|
|
* @param _cliff uint64 Time of the cliff period. |
|
|
|
|
|
|
|
* @param _vesting uint64 The vesting period. |
|
|
|
|
|
|
|
*/ |
|
|
|
function grantVestedTokens( |
|
|
|
function grantVestedTokens( |
|
|
|
address _to, |
|
|
|
address _to, |
|
|
|
uint256 _value, |
|
|
|
uint256 _value, |
|
|
@ -50,6 +62,11 @@ contract VestedToken is StandardToken, LimitedTransferToken { |
|
|
|
NewTokenGrant(msg.sender, _to, _value, count - 1); |
|
|
|
NewTokenGrant(msg.sender, _to, _value, count - 1); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* @dev Revoke the grant of tokens of a specifed address. |
|
|
|
|
|
|
|
* @param _holder The address which will have its tokens revoked. |
|
|
|
|
|
|
|
* @param _grantId The id of the token grant. |
|
|
|
|
|
|
|
*/ |
|
|
|
function revokeTokenGrant(address _holder, uint _grantId) public { |
|
|
|
function revokeTokenGrant(address _holder, uint _grantId) public { |
|
|
|
TokenGrant grant = grants[_holder][_grantId]; |
|
|
|
TokenGrant grant = grants[_holder][_grantId]; |
|
|
|
|
|
|
|
|
|
|
@ -77,6 +94,12 @@ contract VestedToken is StandardToken, LimitedTransferToken { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* @dev Calculate the total amount of transferable tokens of a holder at a given time |
|
|
|
|
|
|
|
* @param holder address The address of the holder |
|
|
|
|
|
|
|
* @param time uint64 The specific time. |
|
|
|
|
|
|
|
* @return An uint representing a holder's total amount of transferable tokens. |
|
|
|
|
|
|
|
*/ |
|
|
|
function transferableTokens(address holder, uint64 time) constant public returns (uint256) { |
|
|
|
function transferableTokens(address holder, uint64 time) constant public returns (uint256) { |
|
|
|
uint256 grantIndex = tokenGrantsCount(holder); |
|
|
|
uint256 grantIndex = tokenGrantsCount(holder); |
|
|
|
|
|
|
|
|
|
|
@ -96,25 +119,39 @@ contract VestedToken is StandardToken, LimitedTransferToken { |
|
|
|
return SafeMath.min256(vestedTransferable, super.transferableTokens(holder, time)); |
|
|
|
return SafeMath.min256(vestedTransferable, super.transferableTokens(holder, time)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* @dev Check the amount of grants that an address has. |
|
|
|
|
|
|
|
* @param _holder The holder of the grants. |
|
|
|
|
|
|
|
* @return A uint representing the total amount of grants. |
|
|
|
|
|
|
|
*/ |
|
|
|
function tokenGrantsCount(address _holder) constant returns (uint index) { |
|
|
|
function tokenGrantsCount(address _holder) constant returns (uint index) { |
|
|
|
return grants[_holder].length; |
|
|
|
return grants[_holder].length; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// transferableTokens |
|
|
|
/** |
|
|
|
// | _/-------- vestedTokens rect |
|
|
|
* @dev Calculate amount of vested tokens at a specifc time. |
|
|
|
// | _/ |
|
|
|
* @param tokens uint256 The amount of tokens grantted. |
|
|
|
// | _/ |
|
|
|
* @param time uint64 The time to be checked |
|
|
|
// | _/ |
|
|
|
* @param start uint64 A time representing the begining of the grant |
|
|
|
// | _/ |
|
|
|
* @param cliff uint64 The cliff period. |
|
|
|
// | / |
|
|
|
* @param vesting uint64 The vesting period. |
|
|
|
// | .| |
|
|
|
* @return An uint representing the amount of vested tokensof a specif grant. |
|
|
|
// | . | |
|
|
|
* transferableTokens |
|
|
|
// | . | |
|
|
|
* | _/-------- vestedTokens rect |
|
|
|
// | . | |
|
|
|
* | _/ |
|
|
|
// | . | |
|
|
|
* | _/ |
|
|
|
// | . | |
|
|
|
* | _/ |
|
|
|
// +===+===========+---------+----------> time |
|
|
|
* | _/ |
|
|
|
// Start Clift Vesting |
|
|
|
* | / |
|
|
|
|
|
|
|
* | .| |
|
|
|
|
|
|
|
* | . | |
|
|
|
|
|
|
|
* | . | |
|
|
|
|
|
|
|
* | . | |
|
|
|
|
|
|
|
* | . | |
|
|
|
|
|
|
|
* | . | |
|
|
|
|
|
|
|
* +===+===========+---------+----------> time |
|
|
|
|
|
|
|
* Start Clift Vesting |
|
|
|
|
|
|
|
*/ |
|
|
|
function calculateVestedTokens( |
|
|
|
function calculateVestedTokens( |
|
|
|
uint256 tokens, |
|
|
|
uint256 tokens, |
|
|
|
uint256 time, |
|
|
|
uint256 time, |
|
|
@ -142,6 +179,13 @@ contract VestedToken is StandardToken, LimitedTransferToken { |
|
|
|
return vestedTokens; |
|
|
|
return vestedTokens; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* @dev Get all information about a specifc grant. |
|
|
|
|
|
|
|
* @param _holder The address which will have its tokens revoked. |
|
|
|
|
|
|
|
* @param _grantId The id of the token grant. |
|
|
|
|
|
|
|
* @return Returns all the values that represent a TokenGrant(address, value, start, cliff, |
|
|
|
|
|
|
|
* revokability, burnsOnRevoke, and vesting) plus the vested value at the current time. |
|
|
|
|
|
|
|
*/ |
|
|
|
function tokenGrant(address _holder, uint _grantId) constant returns (address granter, uint256 value, uint256 vested, uint64 start, uint64 cliff, uint64 vesting, bool revokable, bool burnsOnRevoke) { |
|
|
|
function tokenGrant(address _holder, uint _grantId) constant returns (address granter, uint256 value, uint256 vested, uint64 start, uint64 cliff, uint64 vesting, bool revokable, bool burnsOnRevoke) { |
|
|
|
TokenGrant grant = grants[_holder][_grantId]; |
|
|
|
TokenGrant grant = grants[_holder][_grantId]; |
|
|
|
|
|
|
|
|
|
|
@ -156,6 +200,12 @@ contract VestedToken is StandardToken, LimitedTransferToken { |
|
|
|
vested = vestedTokens(grant, uint64(now)); |
|
|
|
vested = vestedTokens(grant, uint64(now)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* @dev Get the amount of vested tokens at a specific time. |
|
|
|
|
|
|
|
* @param grant TokenGrant The grant to be checked. |
|
|
|
|
|
|
|
* @param time The time to be checked |
|
|
|
|
|
|
|
* @return An uint representing the amount of vested tokens of a specific grant at a specific time. |
|
|
|
|
|
|
|
*/ |
|
|
|
function vestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) { |
|
|
|
function vestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) { |
|
|
|
return calculateVestedTokens( |
|
|
|
return calculateVestedTokens( |
|
|
|
grant.value, |
|
|
|
grant.value, |
|
|
@ -166,10 +216,22 @@ contract VestedToken is StandardToken, LimitedTransferToken { |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* @dev Calculate the amount of non vested tokens at a specific time. |
|
|
|
|
|
|
|
* @param grant TokenGrant The grant to be checked. |
|
|
|
|
|
|
|
* @param time uint64 The time to be checked |
|
|
|
|
|
|
|
* @return An uint representing the amount of non vested tokens of a specifc grant on the |
|
|
|
|
|
|
|
* passed time frame. |
|
|
|
|
|
|
|
*/ |
|
|
|
function nonVestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) { |
|
|
|
function nonVestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) { |
|
|
|
return grant.value.sub(vestedTokens(grant, time)); |
|
|
|
return grant.value.sub(vestedTokens(grant, time)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* @dev Calculate the date when the holder can trasfer all its tokens |
|
|
|
|
|
|
|
* @param holder address The address of the holder |
|
|
|
|
|
|
|
* @return An uint representing the date of the last transferable tokens. |
|
|
|
|
|
|
|
*/ |
|
|
|
function lastTokenIsTransferableDate(address holder) constant public returns (uint64 date) { |
|
|
|
function lastTokenIsTransferableDate(address holder) constant public returns (uint64 date) { |
|
|
|
date = uint64(now); |
|
|
|
date = uint64(now); |
|
|
|
uint256 grantIndex = grants[holder].length; |
|
|
|
uint256 grantIndex = grants[holder].length; |
|
|
|