namespace TRC20TokenManager.Contracts { public static class TimedTRC20Contract { public const string Bytecode = @" pragma solidity ^0.8.0; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); } contract TimedTRC20 is IERC20 { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; uint256 public immutable expiryTimestamp; address private _owner; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); constructor( string memory name_, string memory symbol_, uint8 decimals_, uint256 totalSupply_, uint256 expiryDays ) { _name = name_; _symbol = symbol_; _decimals = decimals_; _totalSupply = totalSupply_ * 10**decimals_; _owner = msg.sender; _balances[msg.sender] = _totalSupply; expiryTimestamp = block.timestamp + (expiryDays * 1 days); } modifier notExpired() { require(block.timestamp < expiryTimestamp, ""Token has expired""); _; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public override notExpired returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override notExpired returns (bool) { _approve(msg.sender, spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override notExpired returns (bool) { uint256 currentAllowance = _allowances[sender][msg.sender]; require(currentAllowance >= amount, ""ERC20: transfer amount exceeds allowance""); _transfer(sender, recipient, amount); _approve(sender, msg.sender, currentAllowance - amount); return true; } function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), ""ERC20: transfer from the zero address""); require(recipient != address(0), ""ERC20: transfer to the zero address""); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, ""ERC20: transfer amount exceeds balance""); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), ""ERC20: approve from the zero address""); require(spender != address(0), ""ERC20: approve to the zero address""); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function isExpired() public view returns (bool) { return block.timestamp >= expiryTimestamp; } function timeRemaining() public view returns (uint256) { if (block.timestamp >= expiryTimestamp) return 0; return expiryTimestamp - block.timestamp; } }"; } }