Context
: making _msgData
return bytes calldata
instead of bytes memory
(#2492)ERC20
: Removed the _setDecimals
function and the storage slot associated to decimals. (#2502)Strings
: addition of a toHexString
function. (#2504)EnumerableMap
: change implementation to optimize for key → value
lookups instead of enumeration. (#2518)GSN
: Deprecate GSNv1 support in favor of upcomming support for GSNv2. (#2521)ERC165
: Remove uses of storage in the base ERC165 implementation. ERC165 based contracts now use storage-less virtual functions. Old behaviour remains available in the ERC165Storage
extension. (#2505)Initializable
: Make initializer check stricter during construction. (#2531)ERC721
: remove enumerability of tokens from the base implementation. This feature is now provided separately through the ERC721Enumerable
extension. (#2511)AccessControl
: removed enumerability by default for a more lightweight contract. It is now opt-in through AccessControlEnumerable
. (#2512)ERC2771Context
and a MinimalForwarder
for meta-transactions. (#2508)ERC20Capped
: optimize gas usage of by enforcing te check directly in _mint
. (#2524)UpgradeableProxy
to ERC1967Proxy
. (#2547)ERC777
: Optimize the gas costs of the constructor. (#2551)ERC721URIStorage
: Add a new extension that implements the _setTokenURI
behavior as it was available in 3.4.0. (#2555)AccessControl
: Added ERC165 interface detection. (#2562)Since this version has moved a few contracts to different directories, users upgrading from a previous version will need to adjust their import statements. To make this easier, the package includes a script that will migrate import statements automatically. After upgrading to the latest version of the package, run:
npx openzeppelin-contracts-migrate-imports
Make sure you're using git or another version control system to be able to recover from any potential error in our script.
BeaconProxy
: added new kind of proxy that allows simultaneous atomic upgrades. (#2411)EIP712
: added helpers to verify EIP712 typed data signatures on chain. (#2418)ERC20Permit
: added an implementation of the ERC20 permit extension for gasless token approvals. (#2237)ERC20PresetFixedSupply
and ERC777PresetFixedSupply
. (#2399)Address
: added functionDelegateCall
, similar to the existing functionCall
. (#2333)Clones
: added a library for deploying EIP 1167 minimal proxies. (#2449)Context
: moved from contracts/GSN
to contracts/utils
. (#2453)PaymentSplitter
: replace usage of .transfer()
with Address.sendValue
for improved compatibility with smart wallets. (#2455)UpgradeableProxy
: bubble revert reasons from initialization calls. (#2454)SafeMath
: fix a memory allocation issue by adding new SafeMath.tryOp(uint,uint)→(bool,uint)
functions. SafeMath.op(uint,uint,string)→uint
are now deprecated. (#2462)EnumerableMap
: fix a memory allocation issue by adding new EnumerableMap.tryGet(uint)→(bool,address)
functions. EnumerableMap.get(uint)→string
is now deprecated. (#2462)ERC165Checker
: added batch getSupportedInterfaces
. (#2469)RefundEscrow
: beneficiaryWithdraw
will forward all available gas to the beneficiary. (#2480)ERC777
: fix potential reentrancy issues for custom extensions to ERC777
. (#2483)If you're using our implementation of ERC777 from version 3.3.0 or earlier, and you define a custom _beforeTokenTransfer
function that writes to a storage variable, you may be vulnerable to a reentrancy attack. If you're affected and would like assistance please write to security@openzeppelin.com. Read more in the pull request.
solc-0.7
tag to compile without warnings.Address
: added functionStaticCall
, similar to the existing functionCall
. (#2333)TimelockController
: added a contract to augment access control schemes with a delay. (#2354)EnumerableSet
: added Bytes32Set
, for sets of bytes32
. (#2395)ERC777
: Remove a warning about function state visibility in Solidity 0.7. (#2327)Aside from upgrading them from Solidity 0.5 to 0.6, we've changed a few minor things from the proxy contracts as they were found in OpenZeppelin SDK.
UpgradeabilityProxy
was renamed to UpgradeableProxy
.AdminUpgradeabilityProxy
was renamed to TransparentUpgradeableProxy
.Proxy._willFallback
was renamed to Proxy._beforeFallback
.UpgradeabilityProxy._setImplementation
and AdminUpgradeabilityProxy._setAdmin
were made private.Address.isContract
: switched from extcodehash
to extcodesize
for less gas usage. (#2311)ERC20Snapshot
: switched to using _beforeTokenTransfer
hook instead of overriding ERC20 operations. (#2312)This small change in the way we implemented ERC20Snapshot
may affect users who are combining this contract with
other ERC20 flavors, since it no longer overrides _transfer
, _mint
, and _burn
. This can result in having to remove Solidity override(...)
specifiers in derived contracts for these functions, and to instead have to add it for _beforeTokenTransfer
. See Using Hooks in the documentation.
SafeCast
: added functions to downcast signed integers (e.g. toInt32
), improving usability of SignedSafeMath
. (#2243)functionCall
: new helpers that replicate Solidity's function call semantics, reducing the need to rely on call
. (#2264)ERC1155
: added support for a base implementation, non-standard extensions and a preset contract. (#2014, #2230)ReentrancyGuard
: reduced overhead of using the nonReentrant
modifier. (#2171)AccessControl
: added a RoleAdminChanged
event to _setAdminRole
. (#2214)public
functions in the token preset contracts virtual
. (#2257)SafeERC20
: deprecated safeApprove
. (#2268)ERC777
: fixed the _approve
internal function not validating some of their arguments for non-zero addresses. (#2213)AccessControl
: new contract for managing permissions in a system, replacement for Ownable
and Roles
. (#2112)SafeCast
: new functions to convert to and from signed and unsigned values: toUint256
and toInt256
. (#2123)EnumerableMap
: a new data structure for key-value pairs (like mapping
) that can be iterated over. (#2160)ERC721
: burn(owner, tokenId)
was removed, use burn(tokenId)
instead. (#2125)ERC721
: _checkOnERC721Received
was removed. (#2125)ERC721
: _transferFrom
and _safeTransferFrom
were renamed to _transfer
and _safeTransfer
. (#2162)Ownable
: removed _transferOwnership
. (#2162)PullPayment
, Escrow
: withdrawWithGas
was removed. The old withdraw
function now forwards all gas. (#2125)Roles
was removed, use AccessControl
as a replacement. (#2112)ECDSA
: when receiving an invalid signature, recover
now reverts instead of returning the zero address. (#2114)Create2
: added an amount
argument to deploy
for contracts with payable
constructors. (#2117)Pausable
: moved to the utils
directory. (#2122)Strings
: moved to the utils
directory. (#2122)Counters
: moved to the utils
directory. (#2122)SignedSafeMath
: moved to the math
directory. (#2122)ERC20Snapshot
: moved to the token/ERC20
directory. snapshot
was changed into an internal
function. (#2122)Ownable
: moved to the access
directory. (#2120)Ownable
: removed isOwner
. (#2120)Secondary
: removed from the library, use Ownable
instead. (#2120)Escrow
, ConditionalEscrow
, RefundEscrow
: these now use Ownable
instead of Secondary
, their external API changed accordingly. (#2120)ERC20
: removed _burnFrom
. (#2119)Address
: removed toPayable
, use payable(address)
instead. (#2133)ERC777
: _send
, _mint
and _burn
now use the caller as the operator. (#2134)ERC777
: removed _callsTokensToSend
and _callTokensReceived
. (#2134)EnumerableSet
: renamed get
to at
. (#2151)ERC165Checker
: functions no longer have a leading underscore. (#2150)ERC721Metadata
, ERC721Enumerable
: these contracts were removed, and their functionality merged into ERC721
. (#2160)ERC721
: added a constructor for name
and symbol
. (#2160)ERC20Detailed
: this contract was removed and its functionality merged into ERC20
. (#2161)ERC20
: added a constructor for name
and symbol
. decimals
now defaults to 18. (#2161)Strings
: renamed fromUint256
to toString
(#2188)ERC777
: fixed the _send
and _approve
internal functions not validating some of their arguments for non-zero addresses. (#2212)SafeCast.toUintXX
: new library for integer downcasting, which allows for safe operation on smaller types (e.g. uint32
) when combined with SafeMath
. (#1926)ERC721Metadata
: added baseURI
, which can be used for dramatic gas savings when all token URIs share a prefix (e.g. http://api.myapp.com/tokens/<id>
). (#1970)EnumerableSet
: new library for storing enumerable sets of values. Only AddressSet
is supported in this release. (#2061)Create2
: simple library to make usage of the CREATE2
opcode easier. (#1744)ERC777
: _burn
is now internal, providing more flexibility and making it easier to create tokens that deflate. (#1908)ReentrancyGuard
: greatly improved gas efficiency by using the net gas metering mechanism introduced in the Istanbul hardfork. (#1992, #1996)ERC777
: improve extensibility by making _send
and related functions internal
. (#2027)ERC721
: improved revert reason when transferring tokens to a non-recipient contract. (#2018)ERC165Checker
now requires a minimum Solidity compiler version of 0.5.10. (#1829)Address.toPayable
: added a helper to convert between address types without having to resort to low-level casting. (#1773)Address.sendValue
: added a replacement to Solidity's transfer
, removing the fixed gas stipend. (#1962)PullPayment.withdrawPaymentsWithGas(address payable payee)
Escrow.withdrawWithGas(address payable payee)
SafeMath
: added support for custom error messages to sub
, div
and mod
functions. (#1828)Address.isContract
: switched from extcodesize
to extcodehash
for less gas usage. (#1802)ERC20
and ERC777
updated to throw custom errors on subtraction overflows. (#1828)PullPayment.withdrawPayments(address payable payee)
Escrow.withdraw(address payable payee)
Address
now requires a minimum Solidity compiler version of 0.5.5. (#1802)SignatureBouncer
has been removed from drafts, both to avoid confusions with the GSN and GSNRecipientSignature
(previously called GSNBouncerSignature
) and because the API was not very clear. (#1879)The final 2.4.0 release includes a refactor of the GSN contracts that will be a breaking change for 2.4.0-beta users.
_preRelayedCall
and _postRelayedCall
were removed and must now be explicitly implemented always in custom recipients. If your custom recipient didn't include an implementation, you can provide an empty one.GSNRecipient
, GSNBouncerBase
, and GSNContext
were all merged into GSNRecipient
.GSNBouncerSignature
and GSNBouncerERC20Fee
were renamed to GSNRecipientSignature
and GSNRecipientERC20Fee
.GSNRecipient
when using GSNRecipientSignature
and GSNRecipientERC20Fee
.For example, a contract using GSNBouncerSignature
would have to be changed in the following way.
-contract MyDapp is GSNRecipient, GSNBouncerSignature {
+contract MyDapp is GSNRecipientSignature {
Refer to the table below to adjust your inheritance list.
2.4.0-beta | 2.4.0 |
---|---|
GSNRecipient, GSNBouncerSignature |
GSNRecipientSignature |
GSNRecipient, GSNBouncerERC20Fee |
GSNRecipientERC20Fee |
GSNBouncerBase |
GSNRecipient |
ERC1820
: added support for interacting with the ERC1820 registry contract (IERC1820Registry
), as well as base contracts that can be registered as implementers there. (#1677)ERC777
: support for the ERC777 token, which has multiple improvements over ERC20
(but is backwards compatible with it) such as built-in burning, a more straightforward permission system, and optional sender and receiver hooks on transfer (mandatory for contracts!). (#1684)PostDeliveryCrowdsale
: some validations where skipped when paired with other crowdsale flavors, such as AllowanceCrowdsale
, or MintableCrowdsale
and ERC20Capped
, which could cause buyers to not be able to claim their purchased tokens. (#1721)ERC20._transfer
: the from
argument was allowed to be the zero address, so it was possible to internally trigger a transfer of 0 tokens from the zero address. This address is not a valid destinatary of transfers, nor can it give or receive allowance, so this behavior was inconsistent. It now reverts. (#1752)ERC20Snapshot
: create snapshots on demand of the token balances and total supply, to later retrieve and e.g. calculate dividends at a past time. (#1617)SafeERC20
: ERC20
contracts with no return value (i.e. that revert on failure) are now supported. (#1655)ERC20
: added internal _approve(address owner, address spender, uint256 value)
, allowing derived contracts to set the allowance of arbitrary accounts. (#1609)ERC20Metadata
: added internal _setTokenURI(string memory tokenURI)
. (#1618)TimedCrowdsale
: added internal _extendTime(uint256 newClosingTime)
as well as TimedCrowdsaleExtended(uint256 prevClosingTime, uint256 newClosingTime)
event allowing to extend the crowdsale, as long as it hasn't already closed.ECDSA
: recover
no longer accepts malleable signatures (those using upper-range values for s
, or 0/1 for v
). (#1622)ERC721
's transfers are now more gas efficient due to removal of unnecessary SafeMath
calls. (#1610)SafeERC20
: safeApprove
wasn't properly checking for a zero allowance when attempting to set a non-zero allowance. (#1647)TokenMetadata
has been renamed to ERC20Metadata
. (#1618)Counter
has been renamed to Counters
and its API has been improved. See an example in ERC721
, lines 17 and 204. (#1610)SafeERC20.safeApprove
bugfix. (#1647)PublicRole.behavior.js
, which may be useful to users testing their own Roles
.WhitelistCrowdsale
: a crowdsale where only whitelisted accounts (WhitelistedRole
) can purchase tokens. Adding or removing accounts from the whitelist is done by whitelist admins (WhitelistAdminRole
). Similar to the pre-2.0 WhitelistedCrowdsale
. (#1525, #1589)RefundablePostDeliveryCrowdsale
: replacement for RefundableCrowdsale
(deprecated, see below) where tokens are only granted once the crowdsale ends (if it meets its goal). (#1543)PausableCrowdsale
: allows for pausers (PauserRole
) to pause token purchases. Other crowdsale operations (e.g. withdrawals and refunds, if applicable) are not affected. (#832)ERC20
: transferFrom
and _burnFrom
now emit Approval
events, to represent the token's state comprehensively through events. (#1524)ERC721
: added _burn(uint256 tokenId)
, replacing the similar deprecated function (see below). (#1550)ERC721
: added _tokensOfOwner(address owner)
, allowing to internally retrieve the array of an account's owned tokens. (#1522)public
, meaning it is not necessary to extend these contracts in order to deploy them. The exception is FinalizableCrowdsale
, since it is meaningless unless extended. (#1564)SignedSafeMath
: added overflow-safe operations for signed integers (int256
). (#1559, #1588)Array
was behind the rest of the libray so it was updated to v0.4.24
. (#1553)ERC20
: more gas efficient due to removed redundant require
s. (#1409)ERC721
: fixed a bug that prevented internal data structures from being properly cleaned, missing potential gas refunds. (#1539 and #1549)ERC721
: general gas savings on transferFrom
, _mint
and _burn
, due to redudant require
s and SSTORE
s. (#1549)