Is it safe to upgrade from OpenZeppelin Contracts Upgradeable 3.4.0 to 4.0.0

Hi,

If the contracts are using openzeppelin-contracts-upgradeable library, would it be safe to upgrade from 3.4.0 to 4.0.0? Is the new AccessControl contract upgrade safe?

Thanks, Dmitri

1 Like

Hi @tsudmi,

Unfortunately it isn't safe.

_From: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/master/README.md_:

:warning: There will be storage incompatibilities across major versions of this package, which makes it unsafe to upgrade a deployed contract from one major version to another, for example from 3.4.0 to 4.0.0.

Similarly, it is not safe to upgrade from @openzeppelin/contracts-ethereum-package (a similar previous package) to @openzeppelin/contracts-upgradeable .

It is strongly encouraged to use these contracts together with a tool that can automatically guarantee the safety of an upgradeable contract, such as the OpenZeppelin Upgrades Plugins.

Thanks @abcoathup for pointing that out.

What if to upgrade only the contracts that openzeppelin-upgrades library is not complaining about?
Could that work? Removal of SafeMath and gas optimizations in 4.0.0 are too attractive to not to try that :grin:

1 Like

Hi @tsudmi,

It depends what your contract has dependencies on.

Some of the gas optimizations are about not including state.
Please note that OpenZeppelin Contracts 4.0 is still in Beta.

Can you share what your imports are?

Hi @abcoathup ,

Sure, here is the list of used imports:

@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol
@openzeppelin/contracts-upgradeable/proxy/Initializable.sol
@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol
@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol
@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol
@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol
@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol

AccessControl was changed to be more lightweight in a way that makes the storage not compatible with previous versions.

1 Like

Hey @frangio , thank you for the reply.

Is AccessControlEnumerable following the old storage structure or it has also changed?
What about other contracts? Did any other from the list above has changed its storage layout?

Thanks, Dmitri

1 Like

It has changed in order to make the split of AccessControl and AccessControlEnumerable possible.

Unfortunately these gas optimizations are tightly related to changing the structure of storage so it's going to be next to impossible to upgrade from 3.x to 4.x.

1 Like