# 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**: ```bash npx hardhat ignition deploy ignition/modules/MockUSDTModule.ts --parameters ignition/parameters/custom.json ``` 2. **部署ControlledERC20**: ```bash npx hardhat ignition deploy ignition/modules/ControlledERC20Module.ts --parameters ignition/parameters/custom.json ``` ### 参数配置 在 `ignition/parameters/custom.json` 中配置部署参数: ```json { "initialOwner": "0x..." } ``` ## 测试 运行所有测试: ```bash npm test ``` 运行特定合约的测试: ```bash npx hardhat test test/MockUSDT.ts npx hardhat test test/ControlledERC20.ts ``` ## 使用示例 ### MockUSDT使用示例 ```javascript // 部署合约 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使用示例 ```javascript // 部署合约 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部署记录中获取。