@openzeppelin/contracts
Advanced tools
Changelog
4.6.0 (2022-04-26)
crosschain
: Add a new set of contracts for cross-chain applications. CrossChainEnabled
is a base contract with instantiations for several chains and bridges, and AccessControlCrossChain
is an extension of access control that allows cross-chain operation. (#3183)AccessControl
: add a virtual _checkRole(bytes32)
function that can be overridden to alter the onlyRole
modifier behavior. (#3137)EnumerableMap
: add new AddressToUintMap
map type. (#3150)EnumerableMap
: add new Bytes32ToBytes32Map
map type. (#3192)ERC20FlashMint
: support infinite allowance when paying back a flash loan. (#3226)ERC20Wrapper
: the decimals()
function now tries to fetch the value from the underlying token instance. If that calls revert, then the default value is used. (#3259)draft-ERC20Permit
: replace immutable
with constant
for _PERMIT_TYPEHASH
since the keccak256
of string literals is treated specially and the hash is evaluated at compile time. (#3196)ERC1155
: Add a _afterTokenTransfer
hook for improved extensibility. (#3166)ERC1155URIStorage
: add a new extension that implements a _setURI
behavior similar to ERC721's _setTokenURI
. (#3210)DoubleEndedQueue
: a new data structure that supports efficient push and pop to both front and back, useful for FIFO and LIFO queues. (#3153)Governor
: improved security of onlyGovernance
modifier when using an external executor contract (e.g. a timelock) that can operate without necessarily going through the governance protocol. (#3147)Governor
: Add a way to parameterize votes. This can be used to implement voting systems such as fractionalized voting, ERC721 based voting, or any number of other systems. The params
argument added to _countVote
method, and included in the newly added _getVotes
method, can be used by counting and voting modules respectively for such purposes. (#3043)Governor
: rewording of revert reason for consistency. (#3275)Governor
: fix an inconsistency in data locations that could lead to invalid bytecode being produced. (#3295)Governor
: Implement IERC721Receiver
and IERC1155Receiver
to improve token custody by governors. (#3230)TimelockController
: Implement IERC721Receiver
and IERC1155Receiver
to improve token custody by timelocks. (#3230)TimelockController
: Add a separate canceller role for the ability to cancel. (#3165)Initializable
: add a reinitializer modifier that enables the initialization of new modules, added to already initialized contracts through upgradeability. (#3232)Initializable
: add an Initialized event that tracks initialized version numbers. (#3294)ERC2981
: make royaltyInfo
public to allow super call in overrides. (#3305)TimelockController
: (Action needed) The upgrade from <4.6 to >=4.6 introduces a new CANCELLER_ROLE
that requires set up to be assignable. After the upgrade, only addresses with this role will have the ability to cancel. Proposers will no longer be able to cancel. Assigning cancellers can be done by an admin (including the timelock itself) once the role admin is set up. To do this, we recommend upgrading to the TimelockControllerWith46MigrationUpgradeable
contract and then calling the migrateTo46
function.Governor
: Adds internal virtual _getVotes
method that must be implemented; this is a breaking change for existing concrete extensions to Governor
. To fix this on an existing voting module extension, rename getVotes
to _getVotes
and add a bytes memory
argument. (#3043)Governor
: Adds params
parameter to internal virtual _countVote
method; this is a breaking change for existing concrete extensions to Governor
. To fix this on an existing counting module extension, add a bytes memory
argument to _countVote
. (#3043)Governor
: Does not emit VoteCast
event when params data is non-empty; instead emits VoteCastWithParams
event. To fix this on an integration that consumes the VoteCast
event, also fetch/monitor VoteCastWithParams
events. (#3043)Votes
: The internal virtual function _getVotingUnits
was made view
(which was accidentally missing). Any overrides should now be updated so they are view
as well.Changelog
4.5.0 (2022-02-09)
ERC2981
: add implementation of the royalty standard, and the respective extensions for ERC721
and ERC1155
. (#3012)GovernorTimelockControl
: improve the state()
function to have it reflect cases where a proposal has been canceled directly on the timelock. (#2977)Governor
: add a relay function to help recover assets sent to a governor that is not its own executor (e.g. when using a timelock). (#2926)GovernorPreventLateQuorum
: add new module to ensure a minimum voting duration is available after the quorum is reached. (#2973)ERC721
: improved revert reason when transferring from wrong owner. (#2975)Votes
: Added a base contract for vote tracking with delegation. (#2944)ERC721Votes
: Added an extension of ERC721 enabled with vote tracking and delegation. (#2944)ERC2771Context
: use immutable storage to store the forwarder address, no longer an issue since Solidity >=0.8.8 allows reading immutable variables in the constructor. (#2917)Base64
: add a library to parse bytes into base64 strings using encode(bytes memory)
function, and provide examples to show how to use to build URL-safe tokenURIs
. (#2884)ERC20
: reduce allowance before triggering transfer. (#3056)ERC20
: do not update allowance on transferFrom
when allowance is type(uint256).max
. (#3085)ERC20
: add a _spendAllowance
internal function. (#3170)ERC20Burnable
: do not update allowance on burnFrom
when allowance is type(uint256).max
. (#3170)ERC777
: do not update allowance on transferFrom
when allowance is type(uint256).max
. (#3085)ERC777
: add a _spendAllowance
internal function. (#3170)SignedMath
: a new signed version of the Math library with max
, min
, and average
. (#2686)SignedMath
: add an abs(int256)
method that returns the unsigned absolute value of a signed value. (#2984)ERC1967Upgrade
: Refactor the secure upgrade to use ERC1822
instead of the previous rollback mechanism. This reduces code complexity and attack surface with similar security guarantees. (#3021)UUPSUpgradeable
: Add ERC1822
compliance to support the updated secure upgrade mechanism. (#3021)ERC1967Upgrade
: The function _upgradeToAndCallSecure
was renamed to _upgradeToAndCallUUPS
, along with the change in security mechanism described above.Address
: The Solidity pragma is increased from ^0.8.0
to ^0.8.1
. This is required by the account.code.length
syntax that replaces inline assembly. This may require users to bump their compiler version from 0.8.0
to 0.8.1
or later. Note that other parts of the code already include stricter requirements.Changelog
4.4.1 (2021-12-14)
Initializable
: change the existing initializer
modifier and add a new onlyInitializing
modifier to prevent reentrancy risk. (#3006)It is no longer possible to call an initializer
-protected function from within another initializer
function outside the context of a constructor. Projects using OpenZeppelin upgradeable proxies should continue to work as is, since in the common case the initializer is invoked in the constructor directly. If this is not the case for you, the suggested change is to use the new onlyInitializing
modifier in the following way:
contract A {
- function initialize() public initializer { ... }
+ function initialize() internal onlyInitializing { ... }
}
contract B is A {
function initialize() public initializer {
A.initialize();
}
}
Changelog
4.4.0 (2021-11-25)
Ownable
: add an internal _transferOwnership(address)
. (#2568)AccessControl
: add internal _grantRole(bytes32,address)
and _revokeRole(bytes32,address)
. (#2568)AccessControl
: mark _setupRole(bytes32,address)
as deprecated in favor of _grantRole(bytes32,address)
. (#2568)AccessControlEnumerable
: hook into _grantRole(bytes32,address)
and _revokeRole(bytes32,address)
. (#2946)EIP712
: cache address(this)
to immutable storage to avoid potential issues if a vanilla contract is used in a delegatecall context. (#2852)_setApprovalForAll
to ERC721
and ERC1155
. (#2834)Governor
: shift vote start and end by one block to better match Compound's GovernorBravo and prevent voting at the Governor level if the voting snapshot is not ready. (#2892)GovernorCompatibilityBravo
: consider quorum an inclusive rather than exclusive minimum to match Compound's GovernorBravo. (#2974)GovernorSettings
: a new governor module that manages voting settings updatable through governance actions. (#2904)PaymentSplitter
: now supports ERC20 assets in addition to Ether. (#2858)ECDSA
: add a variant of toEthSignedMessageHash
for arbitrary length message hashing. (#2865)MerkleProof
: add a processProof
function that returns the rebuilt root hash given a leaf and a proof. (#2841)VestingWallet
: new contract that handles the vesting of Ether and ERC20 tokens following a customizable vesting schedule. (#2748)Governor
: enable receiving Ether when a Timelock contract is not used. (#2849)GovernorTimelockCompound
: fix ability to use Ether stored in the Timelock contract. (#2849)Changelog
4.3.3 (2021-11-08)
ERC1155Supply
: Handle totalSupply
changes by hooking into _beforeTokenTransfer
to ensure consistency of balances and supply during IERC1155Receiver.onERC1155Received
calls.