Release Candidate for Contracts 4.1

It’s time for a new release candidate! Pay special attention to the new features in the proxy category and check them out to provide feedback before the release a week from now.


This release candidate comes with a deep refactoring of the proxy contract. This includes the new UUPSUpgradeable contract which implementations can inherit from to enable, in conjonction with the ERC1967Proxy, the UUPS upgrade mechanism.

A new version of the openzeppelin upgrades plugin will be launched together with contracts 4.1 with support of this new flavor of Proxies.


A new extension is available for the ERC20 family of contracts. The extension implements a flash-minting mechanism following the ERC3156 interface.


Add an abstract contract with multicall(bytes[] calldata data) function to bundle multiple calls together. This pattern, already used by ENS resolvers and the upcoming UniswapV3 allows anyone, including EOA, to submit batchs of transactions to contracts that inherit from it. Note that for security reason, payable functions are not supported.


This release includes two additions to the cryptography tooling:

  • The ECDSA library now supports ERC2098 short-signatures.

  • Addition of SignatureChecker, a new signature verification library that supports both EOA and ERC1271 compliant contracts as signers.

Other Changes

  • IERC20Metadata: add a new extended to the IERC20 interface that includes the optional name(), symbol() and decimals() functions.
  • ERC777: make reception acquirement optional in _mint.
  • ERC20Permit: add a _useNonce to enable further usage of ERC712 signatures.
  • StorageSlot: add a library for reading and writing primitive types to specific storage slots.
  • AccessControl: add a onlyRole modifier to restrict specific function to callers bearing a specific role.

This very last feature comes some minor breaking changes to the TimelockController. See the release changelog for more information.