I have a similar issue when I migrated my code to another repository. Any luck in fixing this?
Did not test... but for me it looks like there is somewhere an import from the not-upgradeable version of Address.sol...
It should use:
@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol
Thanks for the reply but I don't have any upgradeable version in any imports and only use upgradeable version in the imports. The contracts and tests work in one repository and I have trouble when I moved them to another repository with other contracts
This is the import section of the contract
// SPDX-License-Identifier: MIT
pragma solidity 0.8.14;
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
I have found the bug and it is due to another contract in my repo using Initializable from @openzeppelin-contract.
I have a contract ContractA which uses UUPS and imports Initializable.sol in @openzepellin-upgradeable and another contract ContractB which imports Initializable.sol in @openzepellin
When I try to deploy in test I got the following weird error
Error: Contract `ContractName` is not upgrade safe
@openzeppelin/contracts/utils/Address.sol:191: Use of delegatecall is not allowed
I debugged the validation code and found this
Basically it was pulling the Initializable from @openzeppelin/contracts instead of @openzeppelin/contracts-upgradeable even though the contract is importing the correct Initializable
Temp workaround:
work around was to change existing contract to use Initializable from @openzeppelin/contracts
Actual Fix:
Either rename Initializable in @openzeppelin/contracts-upgradeable or to change the validation method to also include the entire path including library like @openzeppelin/contracts-upgradeable/Initializable when resolving the contract name
I didn't understand your post. Please share more of the Solidity code. It doesn't sound like there is a problem in the library, at least not the problem you describe. You should always use @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol if you're writing upgradeable contracts.
@frangio The problem is that there is a conflict when you have two contracts one using Upgradeable contract and another not using the upgradeable contract.
ContractA is using UUPS and @openzeppelin/upgradeable-contract
pragma solidity 0.8.14;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
ContractA is Initializable {
//code goes here
}
Note ContractA only imports and uses contracts in @openzeppelin/contracts-upgradeable but during deploy when the validation retrieves all inherited contracts it incorrectly retrieves the Initializable from @openzeppelin/contracts instead of @openzeppelin/contracts-upgradeable because there is another totally unrelated contract in a different folder importing Initializable from @openzeppelin/contracts
I have even provided the screen shot of the validation method during debugging the deployment of ContractA that only imports upgradeable library contracts from @openzeppelin/contracts-upgradeable
Contract B is an old contract that is already using the existing Initializable proxy in @openzeppelin/contracts
ContractB is not supposed to be upgradeable and just using the
pragma solidity 0.8.14;
import "@openzeppelin/contracts/proxy/utils/Initializable.sol";
ContractB is Initializable {
//code goes here
}
Now when ContractA is deployed instead of resolving the Initializable from @openzeppelin/contracts-upgradeable the Initializable from @openzeppelin/contracts is getting resolved incorrectly
I had to modify the older contract which is just a normal proxy to use the Initializable from @openzeppelin/contracts-upgradeable to fix the issue
It would be a really bad experience for developers and would result in lost developer productivity
I would advice you to reopen the bug instead of closing it without fixing the issue.
Please let me know if you are still not understanding the issue and I can explain in more detail
Are you using Hardhat or Truffle?
Hardhat and included that information in the bug ![]()
Can you share a repository where we can reproduce the problem? This should definitely not be happening on Hardhat.
I am positive this is not an issue with https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable which is why I closed the issue you opened.
Sure, Let me try to reproduce the issue in a different repo and send it to you by tomorrow
