本项目包含两个ERC20代币合约,分别用于不同的用途。
用途: 用作Mock USDT,提供标准的ERC20功能
特点:
主要功能:
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)
- 查询授权额度用途: 带有转账开关、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)
- 检查角色部署MockUSDT:
npx hardhat ignition deploy ignition/modules/MockUSDTModule.ts --parameters ignition/parameters/custom.json
部署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
// 部署合约
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));
// 部署合约
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();
部署后,合约地址将显示在控制台输出中,也可以从Ignition部署记录中获取。