Skip to main content

ERC20 代币合约

ERC20 是以太坊上一种广泛采用的代币标准,它定义了一组标准的接口,用于发行和管理代币。以下是一个简单的 ERC20 代币合约示例,使用 Solidity 编写:

// SPDX-License-Identifier: MIT
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);

event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract ERC20Token is IERC20 {
string public constant name = "MyToken";
string public constant symbol = "MTK";
uint8 public constant decimals = 18;

mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;

uint256 private _totalSupply;

constructor(uint256 initialSupply) {
_mint(msg.sender, initialSupply);
}

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 returns (bool) {
require(_balances[msg.sender] >= amount, "ERC20: transfer amount exceeds balance");
_balances[msg.sender] -= amount;
_balances[recipient] += amount;
emit 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 returns (bool) {
_allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}

function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
require(_balances[sender] >= amount, "ERC20: transfer amount exceeds balance");
require(_allowances[sender][msg.sender] >= amount, "ERC20: transfer amount exceeds allowance");
_balances[sender] -= amount;
_balances[recipient] += amount;
_allowances[sender][msg.sender] -= amount;
emit Transfer(sender, recipient, amount);
return true;
}

function _mint(address account, uint256 amount) internal {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
}

这个合约实现了 ERC20 标准的主要功能:

  • totalSupply 返回代币的总供应量。
  • balanceOf 返回特定账户的代币余额。
  • transfer 允许账户将代币转移给另一个账户。
  • approve 允许某个账户(spender)代表另一个账户(owner)转移最多特定数量的代币。
  • allowance 返回一个账户(owner)授权给另一个账户(spender)转移代币的数量。
  • transferFrom 允许预先授权的账户(spender)代表另一个账户(owner)转移代币。

此外,合约中还有两个事件TransferApproval,它们在转移代币和授权操作时被触发,以便区块链上的监听者能够得到通知。

请注意,这个合约只是一个示例,并没有包含安全检查(如SafeMath库以防止溢出),在生产环境中部署合约前,应进行全面的测试和代码审计。