Breaking changes
Strings: TheescapeJSONfunction now escapes all control characters in the range U+0000 to U+001F per RFC-4627. Previously only backspace, tab, newline, form feed, carriage return, double quote, and backslash were escaped. Input strings containing any other control character (e.g. null0x00) or raw bytes in U+0001–U+001F will now produce different, longer output (e.g.\u0000for null). (#6344)ERC1155: Performing batch transfers with exactly one id/value in the batch no-longer callsIERC1155Receiver.onERC1155Received.IERC1155Receiver.onERC1155BatchReceivedis called instead (with arrays of length one). (#6170)ERC1967ProxyandTransparentUpgradeableProxy: Mandate initialization during construction. Deployment now reverts withERC1967ProxyUninitializedif an initialize call is not provided. Developers that rely on the previous behavior and want to disable this check can do so by overriding the internal_unsafeAllowUninitializedfunction to return true. (#5906)ERC721andERC1155: Prevent setting an operator foraddress(0). In the case ofERC721this type of operator allowance could lead to obfuscated mint permission. (#6171)RLP: Theencode(bytes32)function now encodesbytes32as a fixed size item and not as a scalar inencode(uint256). Users must replace calls toencode(bytes32)withencode(uint256(bytes32))to preserve the same behavior. (#6167)ERC4337Utils: TheparseValidationDatanow returns aValidationRangeas the last return tuple value indicating whether thevalidationDatais compared against a timestamp or block number. Developers must update their code to handle this new return value (e.g.(aggregator, validAfter, validUntil) -> (aggregator, validAfter, validUntil, range)). (#6215)SignerWebAuthn: The_rawSignatureValidationfunction now returnsfalsewhen the signature is not a valid WebAuthn authentication assertion. P256 fallback is removed. Developers can add it back by overriding the function. (#6337)Memory: ThesetFreeMemoryPointerfunction is renamed tounsafeSetFreeMemoryPointer. Developers should useunsafeSetFreeMemoryPointerinstead ofsetFreeMemoryPointerafter v5.6.0. (#6348)Memory: Remove theasBytes32andasPointerfunction to reduce the risk of mistakes when manipulating memory pointers. (#6340)
Changes by category
Account
Account: Update default version of the ERC-4337 entrypoint to v0.9. (#6135)AccountERC7579: Do not revert and perform the uninstall if theonUninstallhook of a module reverts. (#6142)ERC4337Utils: Added thepaymasterSignaturefunction to extract the signature inpaymasterAndDataafter Entrypoint v0.9. Similarly, a variant ofpaymasterDatathat receives a flag to exclude the signature from the returned data. (#6215)ERC4337Utils: Added variants ofpackValidationData(address,uint48,uint48)andpackValidationData(bool,uint48,uint48)that receive aValidationRangeargument, could be timestamp or block number. Similarly, theparseValidationDatanow returns aValidationRangetoo. (#6215)
Tokens
ERC1155: Introduce the_checkAuthorizedinternal virtual function to encapsulateisApprovedForAllandmsg.sender == fromchecks. (#6133)ERC1155: CallIERC1155Receiver.onERC1155BatchReceivedwhen performing a batch transfers with exactly one id/value in the batch. (#6170)ERC4626: Allow overriding underlying assets transfer mechanisms through new internal virtual functions (_transferInand_transferOut). (#5970)ERC721URIStorage: Add_suffixURI, an internal getter for retrieving the custom tokenURI without the base prefix. (#6175)- Add ERC-165 detection for the
IERC6909ContentURI,IERC6909TokenSupplyandIERC6909Metadatainterfaces in theERC6909ContentURI,ERC6909TokenSupplyandERC6909Metadatacontracts respectively. (#6246) and (#6247)
Cross-chain
BridgeFungible,BridgeERC20andBridgeERC7802: Added bridge contracts to handle crosschain movements of ERC-20 (and ERC-7802) tokens. (#5914) (#6328)CrosschainLinked: Added a new helper contract to facilitate communication between a contract on one chain and counterparts on remote chains through ERC-7786 gateways. (#5914)ERC20Crosschain: Added an ERC-20 extension to embed an ERC-7786 based crosschain bridge directly in the token contract. (#5914)InteroperableAddress: Reject inputs with both chain reference and addresses empty. (#6340)
Cryptography
MessageHashUtils: Add helper functions to build EIP-712 domain typehash and separator with fields selectively enabled/disabled. (#5908)SignatureChecker: AddisValidERC1271SignatureNowCalldata, a variant ofisValidERC1271SignatureNowthat takes the signature from calldata. (#6123)TrieProof: Add library for verifying Ethereum Merkle-Patricia trie inclusion proofs. (#5826)WebAuthn: Verification now returnsfalseinstead of reverting when client data contains an out-of-boundschallengeIndex. (#6329)
Structures
Accumulator: Check that slices being added (shiftorpush) are in the reserved space. (#6302)DoubleEndedQueue: AddtryPushBack,tryPopBack,tryPushFront,tryPopFront,tryFront,tryBack, andtryAtfunction variants that do not revert. (#6020)EnumerableMap: Add support forBytes4ToAddressMaptypes. (#6091)EnumerableSet: Add support forBytes4Settype. (#6091)
Utils
Arrays: Addreplacefunctions enabling in-place array modification ofaddress[],bytes32[]anduint256[]arrays, with new content from another array. (#5995)Arrays: Addsliceandsplicefunctions for value types (uint256[],bytes32[],address[]). (#5965)Bytes: Addreplacefunctions that replaces a portion of a bytes buffer with content from another buffer. (#5995)Bytes: Add thetoNibblesfunction that expands the nibbles (4 bits chunk) of abytesbuffer. Used for manipulating Patricia Merkle Trees keys and paths. (#5826)Memory: Add aisReserved(Slice)function that checks if the memory occupied by the slice is reserved (i.e. before the free memory pointer). (#6302)RLP: Encodebytes32as a fixed size item and not as a scalar inencode(bytes32). Scalar RLP encoding remains available by casting to auint256and using theencode(uint256)function. (#6167)RLP: Fix RLP encoding validity check when decoding long lists or strings (#6051)RLP: Perform a memory copy when decodingbytesobjects containing a single byte instead of returning a reference to the input. (#6303)