TokenTimelock.sol 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // SPDX-License-Identifier: MIT
  2. pragma solidity >=0.6.0 <0.8.0;
  3. import "./SafeERC20.sol";
  4. /**
  5. * @dev A token holder contract that will allow a beneficiary to extract the
  6. * tokens after a given release time.
  7. *
  8. * Useful for simple vesting schedules like "advisors get all of their tokens
  9. * after 1 year".
  10. */
  11. contract TokenTimelock {
  12. using SafeERC20 for IERC20;
  13. // ERC20 basic token contract being held
  14. IERC20 private _token;
  15. // beneficiary of tokens after they are released
  16. address private _beneficiary;
  17. // timestamp when token release is enabled
  18. uint256 private _releaseTime;
  19. constructor (IERC20 token_, address beneficiary_, uint256 releaseTime_) public {
  20. // solhint-disable-next-line not-rely-on-time
  21. require(releaseTime_ > block.timestamp, "TokenTimelock: release time is before current time");
  22. _token = token_;
  23. _beneficiary = beneficiary_;
  24. _releaseTime = releaseTime_;
  25. }
  26. /**
  27. * @return the token being held.
  28. */
  29. function token() public view virtual returns (IERC20) {
  30. return _token;
  31. }
  32. /**
  33. * @return the beneficiary of the tokens.
  34. */
  35. function beneficiary() public view virtual returns (address) {
  36. return _beneficiary;
  37. }
  38. /**
  39. * @return the time when the tokens are released.
  40. */
  41. function releaseTime() public view virtual returns (uint256) {
  42. return _releaseTime;
  43. }
  44. /**
  45. * @notice Transfers tokens held by timelock to beneficiary.
  46. */
  47. function release() public virtual {
  48. // solhint-disable-next-line not-rely-on-time
  49. require(block.timestamp >= releaseTime(), "TokenTimelock: current time is before release time");
  50. uint256 amount = token().balanceOf(address(this));
  51. require(amount > 0, "TokenTimelock: no tokens to release");
  52. token().safeTransfer(beneficiary(), amount);
  53. }
  54. }