We're excited to announce the beta release of OpenZeppelin Contracts v3.0 ✨
This is the main item in Contract's roadmap, featuring the migration to Solidity v0.6.
To install the beta release, run:
npm install --save-dev @openzeppelin/contracts@beta
What's Included in the Beta
The final v3.0 release is not yet finished, but we're putting together this beta version early to ease the transition to this new Solidity version for the community.
Here's what you will find in the beta:
- All contracts were migrated to ^0.6.0.
- Roles contracts (such as
MinterRole
andPauserRole
) were removed: we're redesigning our Access Control solution and will have a better version of these in the v3.0 release. - Crowdsales were removed: we'll continue to provide support for security issues on the v2.5 release, but will not bring them over to v3.0.
- We've added hooks, a new feature of the library that will make extending it easier than ever. Read more below!
We expect for the final v3.0 release to come out in early March. If you want to contribute, head to our list of pending changes: most of them can be tackled quickly by beginner and intermediate users!
Compiling v0.6 Contracts
You can use the OpenZeppelin CLI to compile any Solidity v0.6 contract: just update the pragma
statement on your source code and you'll be good to go!
pragma solidity ^0.6.0;
Note that you will need to use the recent v2.7 release of the CLI to have Solidity v0.6 support. For detailed information about using the CLI compiler, head to its documenation.
Migrating From OpenZeppelin Contracts v2.5
Other than the contract removals mentioned above, the library API is pretty much the same as in the v2.5 release, so the migration should be straightforward. For instructions on how to update your Solidity v0.5 contracts to v0.6, refer to the official documentation.
The exception to this is contracts that use the Gas Station Network (GSN): if you're inheriting from GSNRecipient
or one of the other GSN contracts, you'll need to add the following snippet to your contracts:
function _msgSender() internal view override(Context, GSNRecipient) returns (address payable) {
return GSNRecipient._msgSender();
}
function _msgData() internal view override(Context, GSNRecipient) returns (bytes memory) {
return GSNRecipient._msgData();
}
Using Hooks
To improve library flexibility, we're introducing hooks: functions that are called at specific moments during a contract's operation that you can use to hook into the internals and extend as you wish.
For example, the _beforeTokenTransfer
hook in ERC20, ERC721 and ERC777 makes it very easy to add additional checks or actions to execute whenever tokens are transferred, minted or burned, regardless of what prompted it.
// Tokens can only be transferred, minted or burned if the contract is not paused
contract ERC20Pausable is ERC20, Pausable {
function _beforeTokenTransfer(address from, address to, uint256 amount)
internal virtual override
{
super._beforeTokenTransfer(from, to, amount);
require(!paused(), "ERC20Pausable: token transfer while paused");
}
}
As an additional benefit, using hooks will allow you to side-step some of the edge-cases product of the new override
keyword.
Next Steps
The final v3.0 release is still a couple weeks away, but you can help us get there faster! Head to the list of v3.0 pending changes to learn about areas where you can contribute, or take a look at Contract's roadmap for more information on the general direction we're taking.
While you wait for v3.0 to come out, check out the recent v2.5 release, the final OpenZeppelin Contracts release with support for Solidity v0.5, and our newly improved documentation site, with tons of guides, API References and other learning resources!