如何在OpenZeppelin中重写_setupDecimals()并修改ERC20默认小数位
修复OpenZeppelin ERC20修改小数位的代码错误
你的代码存在三个关键问题:
- 函数嵌套语法错误:Solidity不允许在构造函数内部定义新函数,你写的
_setupDecimals属于非法语法。 - 重复变量声明:OpenZeppelin的ERC20合约已经内置了
_decimals私有变量,重复声明会导致编译冲突。 - 未正确调用内置方法:你没有使用ERC20提供的
_setupDecimals函数修改小数位,自行赋值的操作不会生效,小数位仍会保持默认的18位。
正确代码(使用_setupDecimals)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract MyToken is ERC20 { constructor() ERC20("MyToken", "MTK") { // 调用ERC20内置的内部函数设置小数位为3 _setupDecimals(3); // 基于修改后的小数位计算铸币总量 _mint(msg.sender, 5000 * 10 ** decimals()); } }
另一种方案:直接重写decimals函数
如果不需要动态修改小数位,也可以直接重写ERC20的decimals函数,固定返回目标小数位:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract MyToken is ERC20 { constructor() ERC20("MyToken", "MTK") { _mint(msg.sender, 5000 * 10 ** decimals()); } // 重写ERC20的decimals函数,返回自定义小数位 function decimals() public view virtual override returns (uint8) { return 3; } }
两种方案都能实现修改默认18位小数的需求,区别在于_setupDecimals支持后续在合约内部动态修改小数位(如果有需要),而重写decimals函数则是固定值。
内容的提问来源于stack exchange,提问作者mev
相关产品推荐
相关产品推荐

