I've been wondering what are the implications of having an upgradable contract inherit from a non upgradable.
For example, which of the following version is correct
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
contract ContractA is Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable {
}
or
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
contract ContractA is Initializable, Ownable, ReentrancyGuard {
}
and finally what if mix them i.e. have upgradable and non upgradable in the inheritance hierarchy
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
contract ContractA is Initializable, Ownable, ReentrancyGuardUpgradeable, ERC20 {
}