Need help updating contract to openzepellin 4.0-upgradeable-contracts
Environment
HARDHAT, OPENZEPELLIN 4, SOLIDITY 0.8.0
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();
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());
}