开发每笔交易自动燃烧的ERC20合约遇constructor告警如何修改
问题修复与功能实现指南
1. 告警原因与修复方案
你收到的告警是Solidity 0.8+版本的语法规则变更导致:从Solidity 0.7.0版本开始,构造函数的可见性修饰符就已被废弃,0.8版本会直接忽略构造函数后的public修饰符,才会触发该提示。
只需删除constructor后的public关键字即可消除告警,修改后的基础代码如下:
pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract VIRUSONE is ERC20 { constructor(uint256 initialSupply) ERC20 ("VIRUSONE", "VONE") { _mint(msg.sender, initialSupply * 10 ** decimals()); } }
注意:示例代码中新增了
* 10 ** decimals()逻辑,是为了匹配ERC20默认18位的代币精度,避免实际发行量和你预期的数量差10的18次方倍。
2. 每笔交易自动燃烧逻辑实现
你当前的代码仅实现了基础ERC20发行功能,还没有添加自动燃烧逻辑,需要重写ERC20的_transfer方法实现该需求,以下是燃烧比例为*0.5%*的示例代码:
pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract VIRUSONE is ERC20 { // 燃烧比例配置:千分之五 uint256 public constant BURN_RATE = 5; uint256 public constant RATE_DENOMINATOR = 1000; constructor(uint256 initialSupply) ERC20 ("VIRUSONE", "VONE") { _mint(msg.sender, initialSupply * 10 ** decimals()); } function _transfer( address from, address to, uint256 amount ) internal virtual override { // 计算燃烧数量 uint256 burnAmount = amount * BURN_RATE / RATE_DENOMINATOR; // 计算收款人实际到账数量 uint256 receiveAmount = amount - burnAmount; // 执行燃烧:将对应数量转到零地址 super._transfer(from, address(0), burnAmount); // 执行实际转账 super._transfer(from, to, receiveAmount); } }
3. 部署前注意事项
- 可以自行调整
BURN_RATE和RATE_DENOMINATOR的数值,适配你需要的燃烧比例 - 测试网部署后先发起几笔小额转账,验证燃烧数量、到账数量是否符合预期
- 不要直接导入github链接的OpenZeppelin合约,建议通过npm安装依赖后使用
@openzeppelin/contracts/开头的路径导入,避免编译失败
内容的提问来源于stack exchange,提问作者Yuvraj Singh
相关产品推荐
相关产品推荐

