Description:
ERC20 token contract with Mintable, Burnable, Factory capabilities. Standard implementation for fungible tokens on Ethereum.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
{{
"language": "Solidity",
"sources": {
"contracts/erc20.sol": {
"content": "// SPDX-License-Identifier: MIT\r
pragma solidity ^0.8.20;\r
\r
contract MyToken {\r
string public name;\r
string public symbol;\r
uint8 public constant decimals = 18;\r
uint256 public totalSupply;\r
address public owner; // 简单的所有者模式(非 OpenZeppelin Ownable)\r
\r
mapping(address => uint256) private _balances;\r
mapping(address => mapping(address => uint256)) private _allowances;\r
\r
// 事件\r
event Transfer(address indexed from, address indexed to, uint256 value);\r
event Approval(address indexed owner, address indexed spender, uint256 value);\r
event Mint(address indexed to, uint256 amount);\r
event Burn(address indexed from, uint256 amount);\r
\r
// 修饰器:仅所有者可调用\r
modifier onlyOwner() {\r
require(msg.sender == owner, "MyToken: caller is not the owner");\r
_;\r
}\r
\r
constructor(\r
string memory _name,\r
string memory _symbol,\r
uint256 _initialSupply\r
) {\r
owner = msg.sender;\r
name = _name;\r
symbol = _symbol;\r
_mint(msg.sender, _initialSupply * 10 ** decimals);\r
}\r
\r
// --- 铸造/销毁逻辑(仅所有者)---\r
/**\r
* @dev 铸造新代币(仅所有者可调用)\r
* @param to 接收地址\r
* @param amount 铸造数量(带小数位,如 1.0 = 1e18)\r
*/\r
function mint(address to, uint256 amount) public onlyOwner {\r
_mint(to, amount);\r
}\r
\r
/**\r
* @dev 销毁代币(任何用户可销毁自身代币)\r
* @param amount 销毁数量\r
*/\r
function burn(uint256 amount) public {\r
_burn(msg.sender, amount);\r
}\r
\r
// --- 内部函数 ---\r
function _mint(address account, uint256 amount) internal {\r
require(account != address(0), "ERC20: mint to zero address");\r
\r
totalSupply += amount;\r
_balances[account] += amount;\r
emit Transfer(address(0), account, amount);\r
emit Mint(account, amount);\r
}\r
\r
function _burn(address account, uint256 amount) internal {\r
require(account != address(0), "ERC20: burn from zero address");\r
require(_balances[account] >= amount, "ERC20: burn amount exceeds balance");\r
\r
_balances[account] -= amount;\r
totalSupply -= amount;\r
emit Transfer(account, address(0), amount);\r
emit Burn(account, amount);\r
}\r
\r
// --- 核心 ERC20 功能(保持不变)---\r
function transfer(address to, uint256 amount) public returns (bool) {\r
require(to != address(0), "ERC20: transfer to zero address");\r
require(_balances[msg.sender] >= amount, "ERC20: transfer amount exceeds balance");\r
\r
_balances[msg.sender] -= amount;\r
_balances[to] += amount;\r
emit Transfer(msg.sender, to, amount);\r
return true;\r
}\r
\r
function approve(address spender, uint256 amount) public returns (bool) {\r
_allowances[msg.sender][spender] = amount;\r
emit Approval(msg.sender, spender, amount);\r
return true;\r
}\r
\r
function transferFrom(address from, address to, uint256 amount) public returns (bool) {\r
require(to != address(0), "ERC20: transfer to zero address");\r
require(_balances[from] >= amount, "ERC20: transfer amount exceeds balance");\r
require(_allowances[from][msg.sender] >= amount, "ERC20: insufficient allowance");\r
\r
_balances[from] -= amount;\r
_balances[to] += amount;\r
_allowances[from][msg.sender] -= amount;\r
emit Transfer(from, to, amount);\r
return true;\r
}\r
\r
function balanceOf(address account) public view returns (uint256) {\r
return _balances[account];\r
}\r
\r
function allowance(address _owner, address _spender) public view returns (uint256) {\r
return _allowances[_owner][_spender];\r
}\r
}"
}
},
"settings": {
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": [],
"evmVersion": "shanghai"
}
}}
Submitted on: 2025-11-05 14:31:16
Comments
Log in to comment.
No comments yet.