// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; /// @title MoonRushTokenLocker — Time-locked ERC-20 / LP token vault contract MoonRushTokenLocker { using SafeERC20 for IERC20; enum LockKind { Token, Liquidity } address public immutable creator; address public immutable beneficiary; IERC20 public immutable token; uint256 public immutable unlockTime; uint256 public immutable amount; LockKind public immutable lockKind; bool public released; event Released(address indexed beneficiary, uint256 amount); constructor( address creator_, address beneficiary_, address token_, uint256 unlockTime_, uint256 amount_, LockKind lockKind_ ) { require(creator_ != address(0), "creator=0"); require(beneficiary_ != address(0), "beneficiary=0"); require(token_ != address(0), "token=0"); require(unlockTime_ > block.timestamp, "unlock in past"); require(amount_ > 0, "amount=0"); creator = creator_; beneficiary = beneficiary_; token = IERC20(token_); unlockTime = unlockTime_; amount = amount_; lockKind = lockKind_; } function release() external { require(block.timestamp >= unlockTime, "still locked"); require(!released, "already released"); released = true; token.safeTransfer(beneficiary, amount); emit Released(beneficiary, amount); } }