contract PowerfulERC20 is ERC20Decimals, ERC20Capped, ERC20Mintable, ERC20Burnable, ERC1363, TokenRecover, Roles, ServicePayer {

    constructor (
        string memory name_,
        string memory symbol_,
        uint8 decimals_,
        uint256 cap_,
        uint256 initialBalance_,
        address payable feeReceiver_
    )
        ERC20(name_, symbol_)
        ERC20Decimals(decimals_)
        ERC20Capped(cap_)
        ServicePayer(feeReceiver_, "PowerfulERC20")
        payable
    {
        // Immutable variables cannot be read during contract creation time
        // https://github.com/ethereum/solidity/issues/10463
        require(initialBalance_ <= cap_, "ERC20Capped: cap exceeded");
        ERC20._mint(_msgSender(), initialBalance_);
    }

    function decimals() public view virtual override(ERC20, ERC20Decimals) returns (uint8) {
        return super.decimals();
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, ERC1363) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev Function to mint tokens.
     *
     * NOTE: restricting access to addresses with MINTER role. See {ERC20Mintable-mint}.
     *
     * @param account The address that will receive the minted tokens
     * @param amount The amount of tokens to mint
     */
    function _mint(address account, uint256 amount) internal override(ERC20, ERC20Capped) onlyMinter {
        super._mint(account, amount);
    }

    /**
     * @dev Function to stop minting new tokens.
     *
     * NOTE: restricting access to owner only. See {ERC20Mintable-finishMinting}.
     */
    function _finishMinting() internal override onlyOwner {
        super._finishMinting();
    }
}
/**
 * @title PowerfulERC20
 * @dev Implementation of the PowerfulERC20
 */
function _mint(address account, uint256 amount) internal override(ERC20, ERC20Capped) onlyMinter {
    super._mint(account, amount);
}

/**
 * @dev Function to mint tokens.
 *
 * NOTE: restricting access to addresses with MINTER role. See {ERC20Mintable-mint}.
 *
 * @param account The address that will receive the minted tokens
 * @param amount The amount of tokens to mint
 */