116 lines
4.2 KiB
C#
116 lines
4.2 KiB
C#
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;
|
|
}
|
|
}";
|
|
}
|
|
} |