OpenZeppelin have just released version 5 of their Solidity smart contract libraries and there are some breaking changes that are going to cause errors.
The two main ones are the Ownable.sol import which allows devs to create onlyOwner functions and the token hooks on ERC20, ERC721 & ERC1155 contracts.
Ownable Constructor
If you are getting an error along the lines of:
TypeError: No arguments passed to the base constructor. Specify the arguments or mark “Token” as abstract.
You can fix this simply by adding a constructor for the library and passing in msg.sender
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
import "@openzeppelin/contracts/access/Ownable.sol";
contract OwnableExample {
constructor() Ownable(msg.sender) {
}
}
Token Hooks
If you are getting an error along the lines of:
TypeError: Trying to override non-virtual function. Did you forget to add “virtual”?
It might be because you have an override function targeting a previous token library such as ERC20, ERC721 or ERC1155
You can fix this by using the _update function. So for an ERC20 token that previously added logic to the _transfer function we would do something like this:
// Previous Code
function _transfer(address sender, address recipient, uint256 amount) internal override {
super._transfer(sender, recipient, amount);
}
// OpenZeppelin v5 Fix
function _update(address sender, address recipient, uint256 amount) internal override {
super._update(sender, recipient, amount);
}
The OpenZeppelin v5 Upgrade
The upgrade includes:-
- Removal of token hooks from ERC20, ERC721, and ERC1155.
- Introduction of
_update
function in lieu of token hooks. - Acceptance of a custom owner argument during construction in Ownable.
- Support for voting with bytes-formatted signatures and for Account Abstraction in Governor via implementation of ERC-1271.
- Removal of several functions and contracts including Address.isContract, Counters, SafeMath, SignedSafeMath, GovernorCompatibilityBravo, GovernorVotesComp, TokenTimelock, ERC777, all cross-chain contracts, and all presets.
- Adoption of ERC-7201: Namespaced Storage Layout to counter storage layout collisions in upgradeable contracts.
- Updated library to Solidity 0.8.20, incorporating custom errors and explicit imports.
- Introduced AccessManager for more sophisticated access control setups.
- Gas cost reductions resulting in lower deployment and runtime costs.
- Replacement of revert strings with custom errors, reducing deployment cost by 12.84% on average.
- Removal of duplicated SLOADs and addition of immutable variables for enhanced gas savings.
- Reorganization of data structures and variables to minimize storage use, reducing the gas costs.
- More advanced testing including fuzzing and additional formal verification rules.