├── Token.sol ├── TokenTimelock.sol └── timelock.sol /Token.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.5.1; 2 | 3 | contract Token { 4 | string public name = "DApp Token"; 5 | string public symbol = "DAPP"; 6 | uint256 public decimals = 18; 7 | uint256 public totalSupply; 8 | mapping(address => uint256) public balanceOf; 9 | mapping(address => mapping(address => uint256)) public allowance; 10 | 11 | event Transfer(address indexed from, address indexed to, uint256 value); 12 | event Approval(address indexed owner, address indexed spender, uint256 value); 13 | 14 | constructor() public { 15 | totalSupply = 1000000 * (10 ** decimals); 16 | balanceOf[msg.sender] = totalSupply; 17 | } 18 | 19 | function transfer(address _to, uint256 _value) public returns (bool success) { 20 | require(balanceOf[msg.sender] >= _value); 21 | _transfer(msg.sender, _to, _value); 22 | return true; 23 | } 24 | 25 | function _transfer(address _from, address _to, uint256 _value) internal { 26 | require(_to != address(0)); 27 | balanceOf[_from] = balanceOf[_from] - _value; 28 | balanceOf[_to] = balanceOf[_to] + _value; 29 | emit Transfer(_from, _to, _value); 30 | } 31 | 32 | function approve(address _spender, uint256 _value) public returns (bool success) { 33 | require(_spender != address(0)); 34 | allowance[msg.sender][_spender] = _value; 35 | emit Approval(msg.sender, _spender, _value); 36 | return true; 37 | } 38 | 39 | function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { 40 | require(_value <= balanceOf[_from]); 41 | require(_value <= allowance[_from][msg.sender]); 42 | allowance[_from][msg.sender] = allowance[_from][msg.sender] - _value; 43 | _transfer(_from, _to, _value); 44 | return true; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /TokenTimelock.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.5.1; 2 | 3 | import "./Token.sol"; 4 | 5 | contract TokenTimelock { 6 | 7 | Token public token; 8 | address public beneficiary; 9 | uint256 public releaseTime; 10 | 11 | constructor( 12 | Token _token, 13 | address _beneficiary, 14 | uint256 _releaseTime 15 | ) 16 | public 17 | { 18 | require(_releaseTime > block.timestamp); 19 | token = _token; 20 | beneficiary = _beneficiary; 21 | releaseTime = _releaseTime; 22 | } 23 | 24 | function release() public { 25 | require(block.timestamp >= releaseTime); 26 | 27 | uint256 amount = token.balanceOf(address(this)); 28 | require(amount > 0); 29 | 30 | token.transfer(beneficiary, amount); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /timelock.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.5.1; 2 | 3 | contract Timelock { 4 | address payable public beneficiary; 5 | 6 | uint256 public releaseTime; 7 | 8 | constructor( 9 | address payable _beneficiary, 10 | uint256 _releaseTime 11 | ) 12 | public 13 | payable 14 | { 15 | require(_releaseTime > block.timestamp); 16 | beneficiary = _beneficiary; 17 | releaseTime = _releaseTime; 18 | } 19 | 20 | function release() public { 21 | require(block.timestamp >= releaseTime); 22 | address(beneficiary).transfer(address(this).balance); 23 | } 24 | } 25 | --------------------------------------------------------------------------------