如何在 OpenZeppelin 中重写 _setupDecimals() 函数

mev*_*mev 0 ethereum solidity smartcontracts

如何覆盖 Opezeppelin 默认小数点 18。文档说 _setupDecimals() 应该从构造函数调用;我究竟做错了什么。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20 {

    uint8 _decimals;

    constructor() ERC20("MyToken", "MTK") {

         _decimals = 3;

         function _setupDecimals(uint8 decimals_) internal {
            _decimals = decimals_;
         }

        _mint(msg.sender, 5000 * 10 ** decimals());

    }
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*jda 5

_setupDecimals()在 OpenZeppelin 版本 3 中可用(文档GitHub)。

您的import语句导入最新版本的 OpenZeppelin 库,当前为 v4。这个实现了您可以覆盖的decimals()功能(docsGitHub )。

// 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());
    }

    function decimals() override public view returns (uint8) {
        return 8;
    }
}
Run Code Online (Sandbox Code Playgroud)