Skip to content

Initializable - DeclarationError: Identifier already declared. #6078

@dumabg

Description

@dumabg

Using the wizard, create a contract ERC20 with UUPS.

The resulting code is:

// SPDX-License-Identifier: MIT
// Compatible with OpenZeppelin Contracts ^5.5.0
pragma solidity ^0.8.27;

import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";

contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
    /// @custom:oz-upgrades-unsafe-allow constructor
    constructor() {
        _disableInitializers();
    }

    function initialize(address initialOwner) public initializer {
        __ERC20_init("MyToken", "MTK");
        __Ownable_init(initialOwner);
    }

    function _authorizeUpgrade(address newImplementation)
        internal
        override
        onlyOwner
    {}
}

Using Remix IDE, compile the code.

The result is these errors:

TypeError: Derived contract must override function "_checkInitializing". Two or more base classes define function with same name and parameter types.
  --> src/test.sol:10:1:
   |
10 | contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
   | ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:178:5:
    |
178 |     function _checkInitializing() internal view virtual {
    |     ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts/proxy/utils/Initializable.sol:178:5:
    |
178 |     function _checkInitializing() internal view virtual {
    |     ^ (Relevant source part starts here and spans across multiple lines).

TypeError: Derived contract must override function "_disableInitializers". Two or more base classes define function with same name and parameter types.
  --> src/test.sol:10:1:
   |
10 | contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
   | ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:192:5:
    |
192 |     function _disableInitializers() internal virtual {
    |     ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts/proxy/utils/Initializable.sol:192:5:
    |
192 |     function _disableInitializers() internal virtual {
    |     ^ (Relevant source part starts here and spans across multiple lines).

TypeError: Derived contract must override function "_getInitializableStorage". Two or more base classes define function with same name and parameter types.
  --> src/test.sol:10:1:
   |
10 | contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
   | ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:232:5:
    |
232 |     function _getInitializableStorage() private pure returns (InitializableStorage storage $) {
    |     ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts/proxy/utils/Initializable.sol:232:5:
    |
232 |     function _getInitializableStorage() private pure returns (InitializableStorage storage $) {
    |     ^ (Relevant source part starts here and spans across multiple lines).

TypeError: Derived contract must override function "_getInitializedVersion". Two or more base classes define function with same name and parameter types.
  --> src/test.sol:10:1:
   |
10 | contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
   | ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:208:5:
    |
208 |     function _getInitializedVersion() internal view returns (uint64) {
    |     ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts/proxy/utils/Initializable.sol:208:5:
    |
208 |     function _getInitializedVersion() internal view returns (uint64) {
    |     ^ (Relevant source part starts here and spans across multiple lines).

TypeError: Derived contract must override function "_initializableStorageSlot". Two or more base classes define function with same name and parameter types.
  --> src/test.sol:10:1:
   |
10 | contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
   | ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:224:5:
    |
224 |     function _initializableStorageSlot() internal pure virtual returns (bytes32) {
    |     ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts/proxy/utils/Initializable.sol:224:5:
    |
224 |     function _initializableStorageSlot() internal pure virtual returns (bytes32) {
    |     ^ (Relevant source part starts here and spans across multiple lines).

TypeError: Derived contract must override function "_isInitializing". Two or more base classes define function with same name and parameter types.
  --> src/test.sol:10:1:
   |
10 | contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
   | ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:215:5:
    |
215 |     function _isInitializing() internal view returns (bool) {
    |     ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts/proxy/utils/Initializable.sol:215:5:
    |
215 |     function _isInitializing() internal view returns (bool) {
    |     ^ (Relevant source part starts here and spans across multiple lines).

TypeError: Derived contract must override modifier "initializer". Two or more base classes define modifier with same name.
  --> src/test.sol:10:1:
   |
10 | contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
   | ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:104:5:
    |
104 |     modifier initializer() {
    |     ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts/proxy/utils/Initializable.sol:104:5:
    |
104 |     modifier initializer() {
    |     ^ (Relevant source part starts here and spans across multiple lines).

TypeError: Derived contract must override modifier "onlyInitializing". Two or more base classes define modifier with same name.
  --> src/test.sol:10:1:
   |
10 | contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
   | ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:170:5:
    |
170 |     modifier onlyInitializing() {
    |     ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts/proxy/utils/Initializable.sol:170:5:
    |
170 |     modifier onlyInitializing() {
    |     ^ (Relevant source part starts here and spans across multiple lines).

TypeError: Derived contract must override modifier "reinitializer". Two or more base classes define modifier with same name.
  --> src/test.sol:10:1:
   |
10 | contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
   | ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:152:5:
    |
152 |     modifier reinitializer(uint64 version) {
    |     ^ (Relevant source part starts here and spans across multiple lines).
Note: Definition in "Initializable": 
   --> @openzeppelin/contracts/proxy/utils/Initializable.sol:152:5:
    |
152 |     modifier reinitializer(uint64 version) {
    |     ^ (Relevant source part starts here and spans across multiple lines).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions