Duplicate identifier 'Initializable' with typechain

My code incorporates 2 UUPS upgradeable contracts that inherit
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
and one non-upgradeable contract that inherits
import "@openzeppelin/contracts/proxy/utils/Initializable.sol";.

The code compiles, but when I run the tests, I get a Duplicate Identifier 'Initializable' error in typechain/index.ts.

I have also included "skipLibCheck": true in tsconfig.

How can I have both upgradeable and non-upgradeable inherit Initializable and not get the Duplicate identifier error?

:1234: Code to reproduce

Contract A:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol";

Contract B:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
import "@openzeppelin/contracts/interfaces/IERC1271.sol";

Contract C:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

The error I am getting when I run yarn test :

typechain/index.ts:11:15 - error TS2300: Duplicate identifier 'Initializable'.
11 export type { Initializable } from "./Initializable";
                 ~~~~~~~~~~~~~
typechain/index.ts:39:15 - error TS2300: Duplicate identifier 'Initializable'.
39 export type { Initializable } from "./Initializable";
                 ~~~~~~~~~~~~~
typechain/index.ts:140:10 - error TS2300: Duplicate identifier 'Initializable__factory'.
140 export { Initializable__factory } from "./factories/Initializable__factory";
             ~~~~~~~~~~~~~~~~~~~~~~
typechain/index.ts:168:10 - error TS2300: Duplicate identifier 'Initializable__factory'.
168 export { Initializable__factory } from "./factories/Initializable__factory";

:computer: Environment

"@openzeppelin/contracts": "^4.8.1",
"@typechain/ethers-v5": "^5.0.0",
"@typechain/hardhat": "^1.0.1",
"@types/node": "^18.11.18",
"hardhat": "^2.0.10",
"ts-node": "^10.9.1",
"typechain": "4.0.3",
"typescript": "^4.9.4",
"@openzeppelin/contracts-upgradeable": "^4.8.1",
"@openzeppelin/hardhat-upgrades": "^1.22.1"

This looks like it's caused by typechain not allowing multiple contracts with the same name. See this issue in the typechain project.

1 Like

Thanks so much for the assessment Eric :pray:.