How to update deflationary tokens in Solidity 0.8 and OpenZeppelin Contracts 4 for best gas optimization

Need help updating contract to openzepellin 4.0-upgradeable-contracts

:computer: Environment

HARDHAT, OPENZEPELLIN 4, SOLIDITY 0.8.0

:memo:Details
HELP ME FIXING ERRORS && DEBUG:

DeclarationError: Undeclared identifier.
β†’ contracts/Zoe_cash.sol:62:9:
|
62 | __Context_init_unchained();
| ^^^^^^^^^^^^^^^^^^^^^^^^

DeclarationError: Undeclared identifier.
β†’ contracts/Zoe_cash.sol:63:9:
|
63 | __AccessControl_init_unchained();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

DeclarationError: Undeclared identifier.
β†’ contracts/Zoe_cash.sol:64:9:
|
64 | __AccessControlEnumerable_init_unchained();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

DeclarationError: Undeclared identifier.
β†’ contracts/Zoe_cash.sol:65:9:
|
65 | __ERC20_init_unchained(name, symbol);
| ^^^^^^^^^^^^^^^^^^^^^^

DeclarationError: Undeclared identifier.
β†’ contracts/Zoe_cash.sol:66:9:
|
66 | __ERC20Burnable_init_unchained();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

DeclarationError: Undeclared identifier.
β†’ contracts/Zoe_cash.sol:67:9:
|
67 | __Pausable_init_unchained();
| ^^^^^^^^^^^^^^^^^^^^^^^^^

DeclarationError: Undeclared identifier.
β†’ contracts/Zoe_cash.sol:68:9:
|
68 | __ERC20Pausable_init_unchained();

:1234: Code to reproduce
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

import "./ERC20Upgradeable.sol";
import "./extensions/ERC20BurnableUpgradeable.sol";
import "./extensions/ERC20PausableUpgradeable.sol";
import "./access/AccessControlEnumerableUpgradeable.sol";
import "./utils/ContextUpgradeable.sol";
import "./utils/Initializable.sol";

// contract details
contract ERC20PresetMinterPauserUpgradeable is Initializable, ContextUpgradeable, AccessControlEnumerableUpgradeable, ERC20BurnableUpgradeable, ERC20PausableUpgradeable {
    uint256 private _minimumSupply;

    function initialize(address holder, address minter, address pauser) public virtual  initializer {
        __ERC20_init("ZOE CASH", "ZOE", 18);
        __ERC20PresetMinterPauser_init(minter);
        __ERC20PresetMinterPauser_init(pauser);
        _minimumSupply = 2000 * (10 ** 18);
        _mint(holder, 10000 * (10 ** uint256(decimals())));
    }

bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

function transfer(address to, uint256 amount) public returns (bool) {
        return super.transfer(to, _partialBurn(amount));
    }

    function transferFrom(address from, address to, uint256 amount) public returns (bool) {
        return super.transferFrom(from, to, _partialBurn(amount));
    }

    function _partialBurn(uint256 amount) internal returns (uint256) {
        uint256 burnAmount = _calculateBurnAmount(amount);

        if (burnAmount > 0) {
            _burn(msg.sender, burnAmount);
        }

        return amount.sub(burnAmount);
    }

    function _calculateBurnAmount(uint256 amount) internal view returns (uint256) {
        uint256 burnAmount = 0;

        // burn amount calculations
        if (totalSupply() > _minimumSupply) {
            burnAmount = amount.mul(3).div(100);
            uint256 availableBurn = totalSupply().sub(_minimumSupply);
            if (burnAmount > availableBurn) {
                burnAmount = availableBurn;
            }
        }

        return burnAmount;
    }
}

function __ERC20PresetMinterPauser_init(string memory name, string memory symbol)  {
        __Context_init_unchained();
        __AccessControl_init_unchained();
        __AccessControlEnumerable_init_unchained();
        __ERC20_init_unchained(name, symbol);
        __ERC20Burnable_init_unchained();
        __Pausable_init_unchained();
        __ERC20Pausable_init_unchained();
        __ERC20PresetMinterPauser_init_unchained(name, symbol);
    }

    function __ERC20PresetMinterPauser_init_unchained(string memory name, string memory symbol)  initializer {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(PAUSER_ROLE, _msgSender());
    }
1 Like

Hi @Guard_Colombia,

There appear to be three duplicate posts around this topic. I am closing in favor of How to create deflationary ERC20 token?