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?
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";
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"