Releases: OpenZeppelin/openzeppelin-contracts
OpenZeppelin 2.0
OpenZeppelin 2.0 is finally here!!!
The major feature in this release is that we are now commiting to a stable API. In the process of stabilizing we've also reviewed a lot of the existing API in order to ensure a more straightforward experience for users.
Featuring...
Stable API
So far OpenZeppelin's API has sometimes changed from release to release, in backwards-incompatible ways. This has enabled us to iterate on features and design ideas, but we're at a point now where we want to commit to having a stable API and delivering reliable updates.
You can expect the external and internal API of contracts to remain stable. We're only making an exception to this for the contracts in the drafts/
subdirectory; this is where ERCs in Draft status, as well as more experimental contracts will go, and might have breaking changes in minor versions. We'll be documenting exactly what stability guarantees we provide in the coming weeks.
Granular permissions
Features which require permissions have used the almighty Ownable
so far. We are now moving towards a more granular system of roles, like the MinterRole
. Just like Ownable
, the creator of a contract is assigned all roles at first, but they can selectively give them out to other accounts.
Improved test suite
Although this is not visible to users, we have been improving the test suite, increasing coverage to 100%, and cleaning up all of our tests, which had diverged in style. This is part of a bigger effort towards making contributing easier and involving our amazing contributors more in the entire process of building OpenZeppelin.
A new audit
The awesome LevelK team audited our 2.0.0 Release Candidate and they found some severe issues and suggested many improvements. We fixed almost all the issues and notes they reported, leaving only a few minor details for 2.1.0. Check out the LevelK Audit - OpenZeppelin 2.0 project for all the details.
We want to thank @cwhinfrey, @pcowgill and @shanefontaine for their very detailed reviews, high quality standards, and human support during the closing phase of this release. This audit gave us a great confidence boost on the code that we are now publishing.
Tons of community love
Now hold your breath, because this release was only possible because of the contributions of many, many people from everywhere in the world, and we want to thank all of them:
@3sGgpQ8H, @Aniket-Engg, @barakman, @BrendanChou, @cardmaniac992, @dougiebuckets, @dwardu, @facuspagnuolo, @fulldecent, @glesaint, @Glisch, @jacobherrington, @jbogacz, @jdetychey, @JeanoLee, @k06a, @lamengao, @ldub, @leonardoalt, @Miraj98, @mswezey23, @pw94, @shishir99111, @sohkai, @sweatyc, @tinchoabbate, @tinchou, @urvalla, @viquezclaudio, @vyomshm, @yaronvel, @ZumZoom.
Also we would like to thank all the people who are constantly helping others in our Slack channel, the ones who have given us feedback about the release, and the ones helping us triage and discuss our GitHub issues. If you are reading this wanting to jump in and make your first free software contributions, but you are unsure of where and how, talk to us! We can help you getting started, and we could use the extra hands.
With <3 from the maintainers team of this release.
-- @shrugs, @nventuro, @frangio and @ElOpio
Changelog
The changelog is pretty big. We are introducing new concepts and new designs, together with many renames and restructures. If you have problems, comments or suggestions, please join our Slack channel.
Ownable
contracts have moved to role based access. (#1291, #1302, #1303)- ERC contracts have all been renamed to follow the same convention. The interfaces are called
IERC##
, and their implementations areERC##
. Check out, for example,IERC20
andERC20
. (#1252, #1288) - All state variables are now
private
, which means that derived contracts cannot access them directly, but have to use getters. This is to increase encapsulation, to be able to reason better about the code. (#1197, #1265, #1267, #1269, #1270, #1268, #1281) - Events have been changed to be consistently in the past tense except for those which are defined by an ERC. (#1181)
- Separated
ERC721
into the different optional interfaces, and introducedERC721Full
which implements all. (#1304) - Added
ERC165Query
to query support for ERC165 interfaces. (#1086) - Added an experimental contract for migration between ERC20 tokens. (#1054)
- Added
SafeMath.mod
. (#915) - Added
Math.average
. (#1170) - Added
ERC721Pausable
. (#1154) - Changed
SafeMath
to userequire
instead ofassert
. (#1187, #1120, interesting discussion!) - Removed restriction on who can release funds in
PullPayments
,PaymentSplitter
,PostDeliveryCrowdsale
,RefundableCrowdsale
. (#1275) - Optimized
ReentrancyMutex
gas usage. (#1155) - Made
ERC721.exists
internal. (#1193) - Changed preconditions on
PaymentSplitter
constructor arguments. (#1131) - Fixed
ERC721.getApproved
to be in compliance with spec. (#1256) - Simplified interface of
IndividuallyCappedCrowdsale
. (#1296) - Renamed
ERC20.decreaseApproval
todecreaseAllowance
, and changed its semantics slightly to be more secure. (#1293) - Renamed
MerkleProof.verifyProof
toMerkleProof.verify
. (#1294) - Renamed
ECRecovery
toECDSA
, andAddressUtils
toAddress
. (#1253) - Moved
ECDSA
andMerkleProof
to acryptography/
subdirectory. (#1253) - Moved
ReentrancyGuard
, andAddress
to autils/
subdirectory. (#1253) - Renamed
proposals/
subdirectory todrafts/
. (#1271) - Moved
TokenVesting
,SignatureBouncer
todrafts/
. (#1271) - Removed
ERC20Basic
, now there's onlyERC20
. (#1125) - Removed
Math.min64
andMath.max64
, left only theuint256
variants. (#1156) - Removed
Mint
andBurn
events fromERC20Mintable
andERC20Burnable
. (#1305) - Removed underscores from event arguments. (#1258)
- Removed a few contracts that we thought were not generally secure enough:
LimitBalance
,HasNoEther
,HasNoTokens
,HasNoContracts
,NoOwner
,Destructible
,TokenDestructible
,CanReclaimToken
. (#1253, #1254, #1306) - Removed extensions of
Owable
:Claimable
,DelayedClaimable
,Heritable
. (#1274) - Renamed
AutoIncrementing
toCounter
and moved it todrafts\
. ((1307, #1332) - Added events to roles on construction and when renouncing. (#1329)
- Separated
ERC721Mintable
into two contracts, one with metadata (token URI) and one without. (#1365) - Added an ERC20 internal _transfer function. (#1370)
- Added an
Arrays
library. (#1375) - Improved the
OwnershipTransfer
event and removedOwnershipRenounced
. (#1397) - Removed the
BreakInvariantBounty
contract because of a front-running issue. (#1424) - Improved encapsulation on
ERC165
making the_supportedInterfaces
map private. (#1379) - Renamed
RefundsEscrow
event toRefundsClosed
. (#1418) - Moved
Escrow
andRefundsEscrow
tocontracts/payment/escrow/
. (#1430) - Made private the
TokenVesting
functions_releasableAmount
and_vestedAmount
. (#1427) - Made internal the constructors of contracts that should only be used inherited from others. (#1433, #1439)
- Renamed
ERC165
functionsupportsInterfaces
to_supportsAllInterfaces
. (#1435) - Added the
address
toPaused
andUnpaused
events. (#1410) - Renamed
SplitPayment
toPaymentSplitter
, and added the eventsPayeeAdded
,PaymentReleased
andPaymentReceived
. (#1417) - Renamed the
TokenVesting
events toTokensReleased
andTokenVestingRevoked
. (#1431) - Improved the
SafeERC20
allowance handling. (#1407) - Made
getCurrentRate
fromIncreasingPriceCrowdsale
return 0 when the crowdsale is not open. (#1442) - Made
tokenURI
fromERC721Metadata
external, to match the specification. (#1444) - Fixed a reentrancy issue on
FinalizableCrowdsale
. (#1447) - Fixed how allowance crowdsale checks remaining tokens. (#1449)
- Added the nonReentrant safeguard for buyTokens in the Crowdsale contract. (#1438)
OpenZeppelin 2.0 RC 4
Make sure to read the release notes for the first, second and third release candidates!
This fourth (and hopefully last) release candidate is the product of an audit performed by LevelK. This audit increased our confidence on the code that we are about to release as version 2.0.0, and allowed us to add many improvements and a few bug fixes that will make this the best OpenZeppelin release so far.
In particular, we decided to remove the BreakInvariantBounty
contract because of a front-running issue (#1333) that will require a heavy redesign, we added the nonReentrant
safeguard for buyTokens
in the Crowdsale
contract (#1438), we improved the SafeERC20 allowance handling(#1407), on TimedCrowdsales
the closing time now must be strictly after the opening time (#1440), we fixed how AllowanceCrowdsale
checks remaining tokens (#1449), we fixed a reentrancy issue on FinalizableCrowdsale
(#1447), and improved the ERC721
implementation (#1450).
There were many more low issues and notes fixed. Check out the LevelK Audit - OpenZeppelin 2.0 project for all the details. There are a few minor issues still open that we are going to leave for the 2.1.0 release.
We want to thank LevelK and all our community contributors that have joined us on this long release candidate journey. The full list of people who have helped us will be in the final release notes, which is next!
OpenZeppelin 2.0 RC 3
Make sure to read the release notes for the first and second release candidates!
This third release candidate adds events to roles on construction and when renouncing (#1329), improves tests to achieve 100% coverage (#1249, #1349, #1351, #1350, #1360, #1248, #1318), separates ERC721Mintable
into two contracts, one with metadata (token URI) and one without (#1365), prevents BreakInvariantBounty
from being reclaimed (#1374), adds an ERC20
internal _transfer
function (#1370) and removes an unnecessary ERC20
_burn
override (#1373) and inheritance in RefundEscrow
(#1381).
OpenZeppelin 2.0 RC 2
Make sure to read the release notes for the first release candidate!
This second release candidate only moves two more things to the unstable drafts
directory: Counter
(#1332) and BreakInvariantBounty
(#1334), and fixes an error in a few import paths (#1319, #1321).
OpenZeppelin 2.0 RC 1
We are very excited to announce the first release candidate of OpenZeppelin 2.0! 🎉
The major feature in this release is that we are now commiting to a stable API. In the process of stabilizing we've also reviewed a lot of the existing API in order to ensure a more straightforward experience for users.
To install the release candidate run npm install openzeppelin-solidity@next
. We want to hear what you think!
Featuring...
Stable API
So far OpenZeppelin's API has sometimes changed from release to release, in backwards-incompatible ways. This has enabled us to iterate on features and design ideas, but we're at a point now where we want to commit to having a stable API and delivering reliable updates.
You can expect the external and internal API of contracts to remain stable. We're only making an exception to this for the contracts in the drafts/
subdirectory; this is where ERCs in Draft status, as well as more experimental contracts will go, and might have breaking changes in minor versions. We'll be documenting exactly what stability guarantees we provide in the coming weeks.
Granular permissions
Features which require permissions have used the almighty Ownable
so far. We are now moving towards a more granular system of roles, like the MinterRole
. Just like Ownable
, the creator of a contract is assigned all roles at first, but they can selectively give them out to other accounts.
Improved test suite
Although this is not visible to users, we have been improving the test suite, increasing coverage, and cleaning up all of our tests, which had diverged in style. This is part of a bigger effort towards making contributing easier and involving our amazing contributors more in the entire process of building OpenZeppelin.
Changelog
Ownable
contracts have moved to role based access. (#1291, #1302, #1303)- ERC contracts have all been renamed to follow the same convention. The interfaces are called
IERC##
, and their implementations areERC##
. Check out, for example,IERC20
andERC20
. (#1252, #1288) - All state variables are now
private
, which means that derived contracts cannot access them directly, but have to use getters. This is to increase encapsulation, to be able to reason better about the code. (#1197, #1265, #1267, #1269, #1270, #1268, #1281) - Events have been changed to be consistently in the past tense except for those which are defined by an ERC. (#1181)
- Separated
ERC721
into the different optional interfaces, and introducedERC721Full
which implements all. (#1304) - Added
ERC165Query
to query support for ERC165 interfaces. (#1086) - Added an experimental contract for migration between ERC20 tokens. (#1054)
- Added
SafeMath.mod
. (#915) - Added
Math.average
. (#1170) - Added
ERC721Pausable
. (#1154) - Changed
SafeMath
to userequire
instead ofassert
. (#1187, #1120, interesting discussion!) - Removed restriction on who can release funds in
PullPayments
,SplitPayment
,PostDeliveryCrowdsale
,RefundableCrowdsale
. (#1275) - Optimized
ReentrancyMutex
gas usage. (#1155) - Made
ERC721.exists
internal. (#1193) - Changed preconditions on
SplitPayment
constructor arguments. (#1131) - Fixed
ERC721.getApproved
to be in compliance with spec. (#1256) - Simplified interface of
IndividuallyCappedCrowdsale
. (#1296) - Renamed
ERC20.decreaseApproval
todecreaseAllowance
, and changed its semantics slightly to be more secure. (#1293) - Renamed
MerkleProof.verifyProof
toMerkleProof.verify
. (#1294) - Renamed
ECRecovery
toECDSA
, andAddressUtils
toAddress
. (#1253) - Moved
ECDSA
andMerkleProof
to acryptography/
subdirectory. (#1253) - Moved
ReentrancyGuard
,AutoIncrementing
, andAddress
to autils/
subdirectory. (#1253) - Renamed
proposals/
subdirectory todrafts/
. (#1271) - Moved
TokenVesting
,SignatureBouncer
todrafts/
. (#1271) - Removed
ERC20Basic
, now there's onlyERC20
. (#1125) - Removed
Math.min64
andMath.max64
, left only theuint256
variants. (#1156) - Removed
Mint
andBurn
events fromERC20Mintable
andERC20Burnable
. (#1305) - Removed underscores from event arguments. (#1258)
- Removed a few contracts that we thought were not generally secure enough:
LimitBalance
,HasNoEther
,HasNoTokens
,HasNoContracts
,NoOwner
,Destructible
,TokenDestructible
,CanReclaimToken
. (#1253, #1254, #1306) - Removed extensions of
Owable
:Claimable
,DelayedClaimable
,Heritable
. (#1274)
v1.12.0
And thus concludes another release cycle of OpenZeppelin! 😄
Among other things, we have been busy enhancing the quality and consistency of the test suite. We think this will improve the experience for future contributors. Check it out! 📑 🙌
This is the last release before our planned 2.0 release, which will mark a commitment to a stable API. Keep an eye out for it! 👁️
Changelog
Additions
- We now have a code of conduct! (#1061)
- A small library with a
Counter
datatype. (#1023) - A description in the README of the different categories of contracts we have and their organization. (#1089)
Improvements
- Moved ERC165 interface IDs to interface contracts. (#1070)
- Moved
RBAC
contract to theaccess
directory. (#1114) - Fixed an inheritance order that was causing some contracts to fail linearization. (#1128)
- Lots of test improvements, including the removal of Babel. (#1009, #1050, #1074, #1094, #1116, #1112, #1117)
- Fix
assertRevert
test helper. (#1123) - Some gas optimizations. (#1043, #1063, #1030, #1017, #1057)
- Removed unnecessary
payable
constructor fromDestructible
. (#1107) - Documentation tidbits. (#1035, #1082, #1084, #1083, #1060, #1101)
- Made code style more consistent with prefix underscore in all arguments. (#1133)
- Fixes for Solidity 0.5.0. (#1080, #1134)
- Silenced a compilation warning in
HasNoTokens
. (#1122)
v1.12.0 RC 2
Includes #1128, which fixes the inheritance order of two crowdsale contracts that was preventing some feature combinations.
Find the log of changes staged for this release at v1.11.0...v1.12.0-rc.2!
v1.12.0 RC 1
Find the log of changes staged for this release at v1.11.0...v1.12.0-rc.1!
v1.11.0
We hit our 1000th issue during this release cycle! Congrats to everyone and thank you for the hard work. 😄
Changelog
Added
- 🗃️
Escrow
, a new class of contracts that we used to enhance the security ofPullPayments
. (#1014) - ✍️
isValidSignatureAndData
, a new method ofSignatureBouncer
to validate signed function calls. (#973) - 📝 Initial implementation of ERC1046. (#933)
Changed
- 🌋 Updated the ERC721 contracts to the final version of the protocol. (#972, #993, #1047)
- 🦈 Updated minor things for the newer versions of Solidity. (#951, #1002, #1008, #1033)
- 🛡️ Fixed unchecked token transfer in
Crowdsale
. (#1006) - 💺 Moved
Whitelist
toaccess
directory. (#994)
Removed
⚠️ We removed the implementation of ERC827 due to concerns about its security (#1044). The code was moved to windingtree/erc827.
v1.11.0 RC 1
Thanks to all the amazing contributors who participated in this release cycle! 🎉 🐶
We love seeing the community involved, so we're trying something new this time.
Instead of our monthly release, this is a release candidate. We want to encourage the community to review the code introduced, and to report and help us fix significant bugs in the release branch, should any show up. The review period will last for a week, after which we'll release v1.11.0.
You'll find the release candidate in the next
tag of the npm package.
$ npm install openzeppelin-solidity@next
We know some of you have been waiting for the implementation of the now final ERC721. You will find it here, but for any serious use please wait for the review period to be over. 🙂
Find the log of changes staged for this release at v1.10.0...v1.11.0-rc.1.