You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:57:41