README_ERC20.md 4.3 KB

ERC20 Token 合约

本项目包含两个ERC20代币合约,分别用于不同的用途。

合约概述

1. MockUSDT.sol - 标准ERC20合约

用途: 用作Mock USDT,提供标准的ERC20功能

特点:

  • 标准的ERC20代币功能
  • 6位小数精度(与真实USDT一致)
  • 任何人都可以铸造代币(用于测试)
  • 支持销毁功能
  • 部署时自动给初始所有者铸造100万代币

主要功能:

  • transfer(address to, uint256 amount) - 转账
  • transferFrom(address from, address to, uint256 amount) - 授权转账
  • mint(address to, uint256 amount) - 铸造代币
  • burn(uint256 amount) - 销毁代币
  • approve(address spender, uint256 amount) - 授权
  • allowance(address owner, address spender) - 查询授权额度

2. ControlledERC20.sol - 可控ERC20合约

用途: 带有转账开关、mint功能和权限管理的ERC20代币

特点:

  • 转账开关控制
  • 基于角色的权限管理
  • 白名单功能
  • 暂停/恢复功能
  • 批量操作支持

权限角色:

  • DEFAULT_ADMIN_ROLE - 管理员角色,可以管理其他角色
  • MINTER_ROLE - 铸造者角色,可以铸造代币
  • PAUSER_ROLE - 暂停者角色,可以暂停/恢复合约
  • TRANSFER_CONTROLLER_ROLE - 转账控制者角色,可以控制转账开关和白名单

主要功能:

转账控制

  • setTransferEnabled(bool enabled) - 启用/禁用转账
  • updateWhitelist(address account, bool whitelisted) - 更新白名单
  • updateWhitelistBatch(address[] accounts, bool[] whitelisted) - 批量更新白名单
  • isWhitelisted(address account) - 检查地址是否在白名单中

铸造功能

  • mint(address to, uint256 amount) - 铸造代币
  • mintBatch(address[] recipients, uint256[] amounts) - 批量铸造代币

暂停功能

  • pause() - 暂停合约
  • unpause() - 恢复合约

角色管理

  • grantRole(bytes32 role, address account) - 授予角色
  • revokeRole(bytes32 role, address account) - 撤销角色
  • hasRole(bytes32 role, address account) - 检查角色

部署和使用

使用Ignition部署

  1. 部署MockUSDT:

    npx hardhat ignition deploy ignition/modules/MockUSDTModule.ts --parameters ignition/parameters/custom.json
    
  2. 部署ControlledERC20:

    npx hardhat ignition deploy ignition/modules/ControlledERC20Module.ts --parameters ignition/parameters/custom.json
    

参数配置

ignition/parameters/custom.json 中配置部署参数:

{
  "initialOwner": "0x..."
}

测试

运行所有测试:

npm test

运行特定合约的测试:

npx hardhat test test/MockUSDT.ts
npx hardhat test test/ControlledERC20.ts

使用示例

MockUSDT使用示例

// 部署合约
const MockUSDT = await ethers.getContractFactory("MockUSDT");
const mockUSDT = await MockUSDT.deploy("Mock USDT", "mUSDT", owner.address);

// 铸造代币
await mockUSDT.mint(user1.address, ethers.parseUnits("1000", 6));

// 转账
await mockUSDT.transfer(user2.address, ethers.parseUnits("100", 6));

ControlledERC20使用示例

// 部署合约
const ControlledERC20 = await ethers.getContractFactory("ControlledERC20");
const controlledERC20 = await ControlledERC20.deploy("Controlled Token", "CTRL", owner.address);

// 授予铸造者角色
await controlledERC20.grantRole(MINTER_ROLE, minter.address);

// 铸造代币
await controlledERC20.mint(user1.address, ethers.parseEther("1000"));

// 禁用转账
await controlledERC20.setTransferEnabled(false);

// 添加白名单
await controlledERC20.updateWhitelist(user1.address, true);

// 暂停合约
await controlledERC20.pause();

安全特性

MockUSDT

  • 标准ERC20实现,经过广泛测试
  • 任何人都可以铸造,仅用于测试环境

ControlledERC20

  • 基于OpenZeppelin的AccessControl实现权限管理
  • 转账开关和白名单机制提供额外的安全控制
  • 暂停功能用于紧急情况
  • 角色分离,最小权限原则

注意事项

  1. MockUSDT 仅用于测试环境,生产环境请使用真实的USDT合约
  2. ControlledERC20 的转账开关功能会影响所有非白名单地址的转账
  3. 在生产环境中,请谨慎管理角色权限
  4. 建议在部署前进行充分的测试

合约地址

部署后,合约地址将显示在控制台输出中,也可以从Ignition部署记录中获取。