/** * @dev A token holder contract that will allow a beneficiary to extract the * tokens after a given release time. * * Useful for simple vesting schedules like "advisors get all of their tokens * after 1 year". * * For a more complete vesting schedule, see {TokenVesting}. */ contract TokenTimelock { using SafeERC20 for IERC20;
// ERC20 basic token contract being held IERC20 private _token;
// beneficiary of tokens after they are released address private _beneficiary;
// timestamp when token release is enabled uint256 private _releaseTime;
constructor (IERC20 token, address beneficiary, uint256 releaseTime) public { // solhint-disable-next-line not-rely-on-time require(releaseTime > block.timestamp, "TokenTimelock: release time is before current time"); _token = token; _beneficiary = beneficiary; _releaseTime = releaseTime; }
/** * @return the token being held. */ functiontoken() publicviewreturns (IERC20) { return _token; }
/** * @return the beneficiary of the tokens. */ functionbeneficiary() publicviewreturns (address) { return _beneficiary; }
/** * @return the time when the tokens are released. */ functionreleaseTime() publicviewreturns (uint256) { return _releaseTime; }
/** * @notice Transfers tokens held by timelock to beneficiary. */ functionrelease() public{ // solhint-disable-next-line not-rely-on-time require(block.timestamp >= _releaseTime, "TokenTimelock: current time is before release time");
uint256 amount = _token.balanceOf(address(this)); require(amount > 0, "TokenTimelock: no tokens to release");