ERC20 代币合约详解 💰
1. 合约概览
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor() ERC20("MyToken", "MTK") {
_mint(msg.sender, 1000000 * 10 ** decimals());
}
}
1.1 基本信息
- 合约名称:MyToken
- 代币符号:MTK
- 初始供应量:1,000,000 代币
- 小数位数:18(ERC20 标准)
2. 核心功能
2.1 继承自 OpenZeppelin 的 ERC20
我们的合约继承了 OpenZeppelin 的 ERC20 合约,这提供了:
- 代币转账功能 (
transfer
,transferFrom
) - 授权机制 (
approve
,allowance
) - 余额查询 (
balanceOf
) - 总供应量查询 (
totalSupply
)
2.2 标准 ERC20 函数
余额相关
balanceOf(address)
: 查询地址余额totalSupply()
: 查询总供应量
转账相关
transfer(address to, uint256 amount)
: 直接转账transferFrom(address from, address to, uint256 amount)
: 授权转账
授权相关
approve(address spender, uint256 amount)
: 授权额度allowance(address owner, address spender)
: 查询授权额度
3. 特殊功能
3.1 代币铸造
- 在构造函数中一次性铸造了所有代币
- 铸造数量:1,000,000 * 10^18
- 接收者:合约部署者
3.2 小数位处理
1000000 * 10 ** decimals()
decimals()
返回 18- 实际铸造数量是 1,000,000 * 10^18
- 这样可以支持小数位的转账
4. 安全特性
4.1 OpenZeppelin 保障
- 使用经过审计的 OpenZeppelin 库
- 内置溢出检查
- 标准的事件触发
- 安全的转账逻辑
4.2 权限控制
- 初始代币都由部署者持有
- 转账需要有足够余额
- 授权转账需要事先批准
5. 使用示例
5.1 基本转账
// 转账 100 个代币
await token.transfer(receiverAddress, ethers.parseEther("100"));
5.2 授权和授权转账
// 授权 100 个代币
await token.approve(spenderAddress, ethers.parseEther("100"));
// 授权转账
await token.transferFrom(ownerAddress, receiverAddress, ethers.parseEther("100"));
5.3 查询操作
// 查询余额
const balance = await token.balanceOf(address);
// 查询总供应量
const supply = await token.totalSupply();
// 查询授权额度
const allowance = await token.allowance(ownerAddress, spenderAddress);