Browse Source

Add `equal` to Bytes.sol and update pragma to 0.8.24 in String dependencies (#5726)

Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com>
Ernesto García 2 months ago
parent
commit
32e7a6ffbc
39 changed files with 57 additions and 36 deletions
  1. 5 0
      .changeset/ten-steaks-try.md
  2. 4 0
      CHANGELOG.md
  3. 1 1
      contracts/governance/utils/Votes.sol
  4. 1 1
      contracts/governance/utils/VotesExtended.sol
  5. 1 1
      contracts/metatx/ERC2771Forwarder.sol
  6. 1 1
      contracts/mocks/EIP712Verifier.sol
  7. 1 1
      contracts/mocks/VotesExtendedMock.sol
  8. 1 1
      contracts/mocks/VotesMock.sol
  9. 1 1
      contracts/mocks/docs/MyNFT.sol
  10. 1 1
      contracts/mocks/docs/governance/MyToken.sol
  11. 1 1
      contracts/mocks/docs/governance/MyTokenTimestampBased.sol
  12. 1 1
      contracts/mocks/docs/governance/MyTokenWrapped.sol
  13. 1 1
      contracts/mocks/docs/token/ERC721/GameItem.sol
  14. 1 1
      contracts/mocks/docs/utilities/Base64NFT.sol
  15. 1 1
      contracts/mocks/token/ERC20VotesAdditionalCheckpointsMock.sol
  16. 1 1
      contracts/mocks/token/ERC20VotesLegacyMock.sol
  17. 1 1
      contracts/mocks/token/ERC20VotesTimestampMock.sol
  18. 1 1
      contracts/mocks/token/ERC721ConsecutiveEnumerableMock.sol
  19. 1 1
      contracts/mocks/token/ERC721ConsecutiveMock.sol
  20. 1 1
      contracts/mocks/token/ERC721URIStorageMock.sol
  21. 1 1
      contracts/mocks/utils/cryptography/ERC7739Mock.sol
  22. 1 1
      contracts/token/ERC1155/extensions/ERC1155URIStorage.sol
  23. 1 1
      contracts/token/ERC20/extensions/ERC20Permit.sol
  24. 1 1
      contracts/token/ERC20/extensions/ERC20Votes.sol
  25. 1 1
      contracts/token/ERC721/ERC721.sol
  26. 1 1
      contracts/token/ERC721/extensions/ERC721Burnable.sol
  27. 1 1
      contracts/token/ERC721/extensions/ERC721Consecutive.sol
  28. 1 1
      contracts/token/ERC721/extensions/ERC721Enumerable.sol
  29. 1 1
      contracts/token/ERC721/extensions/ERC721Pausable.sol
  30. 1 1
      contracts/token/ERC721/extensions/ERC721Royalty.sol
  31. 1 1
      contracts/token/ERC721/extensions/ERC721URIStorage.sol
  32. 1 1
      contracts/token/ERC721/extensions/ERC721Votes.sol
  33. 1 1
      contracts/token/ERC721/extensions/ERC721Wrapper.sol
  34. 7 0
      contracts/utils/Bytes.sol
  35. 3 2
      contracts/utils/Strings.sol
  36. 1 1
      contracts/utils/cryptography/EIP712.sol
  37. 1 1
      contracts/utils/cryptography/MessageHashUtils.sol
  38. 1 1
      contracts/utils/cryptography/signers/draft-ERC7739.sol
  39. 4 0
      test/utils/Bytes.t.sol

+ 5 - 0
.changeset/ten-steaks-try.md

@@ -0,0 +1,5 @@
+---
+'openzeppelin-solidity': minor
+---
+
+`Bytes`: Add an `equal` function to compare byte buffers.

+ 4 - 0
CHANGELOG.md

@@ -1,6 +1,10 @@
 # Changelog
 
 
+### Breaking changes
+
+- Update minimum pragma to 0.8.24 in `Votes`, `VotesExtended`, `ERC20Votes`, `Strings`, `ERC1155URIStorage`, `MessageHashUtils`, `ERC721URIStorage`, `ERC721Votes`, `ERC721Wrapper`, `ERC721Burnable`, `ERC721Consecutive`, `ERC721Enumerable`, `ERC721Pausable`, `ERC721Royalty`, `ERC721Wrapper`, `EIP712`, and `ERC7739`. ([#5726](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5726))
+
 ## 5.4.0 (2025-07-17)
 
 ### Breaking changes

+ 1 - 1
contracts/governance/utils/Votes.sol

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.2.0) (governance/utils/Votes.sol)
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {IERC5805} from "../../interfaces/IERC5805.sol";
 import {Context} from "../../utils/Context.sol";

+ 1 - 1
contracts/governance/utils/VotesExtended.sol

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.2.0) (governance/utils/VotesExtended.sol)
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {Checkpoints} from "../../utils/structs/Checkpoints.sol";
 import {Votes} from "./Votes.sol";

+ 1 - 1
contracts/metatx/ERC2771Forwarder.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.3.0) (metatx/ERC2771Forwarder.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC2771Context} from "./ERC2771Context.sol";
 import {ECDSA} from "../utils/cryptography/ECDSA.sol";

+ 1 - 1
contracts/mocks/EIP712Verifier.sol

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: MIT
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ECDSA} from "../utils/cryptography/ECDSA.sol";
 import {EIP712} from "../utils/cryptography/EIP712.sol";

+ 1 - 1
contracts/mocks/VotesExtendedMock.sol

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: MIT
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {VotesExtended} from "../governance/utils/VotesExtended.sol";
 

+ 1 - 1
contracts/mocks/VotesMock.sol

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: MIT
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {Votes} from "../governance/utils/Votes.sol";
 

+ 1 - 1
contracts/mocks/docs/MyNFT.sol

@@ -1,6 +1,6 @@
 // contracts/MyNFT.sol
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC721} from "../../token/ERC721/ERC721.sol";
 

+ 1 - 1
contracts/mocks/docs/governance/MyToken.sol

@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC20} from "../../../token/ERC20/ERC20.sol";
 import {ERC20Permit} from "../../../token/ERC20/extensions/ERC20Permit.sol";

+ 1 - 1
contracts/mocks/docs/governance/MyTokenTimestampBased.sol

@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC20} from "../../../token/ERC20/ERC20.sol";
 import {ERC20Permit} from "../../../token/ERC20/extensions/ERC20Permit.sol";

+ 1 - 1
contracts/mocks/docs/governance/MyTokenWrapped.sol

@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {IERC20, ERC20} from "../../../token/ERC20/ERC20.sol";
 import {ERC20Permit} from "../../../token/ERC20/extensions/ERC20Permit.sol";

+ 1 - 1
contracts/mocks/docs/token/ERC721/GameItem.sol

@@ -1,6 +1,6 @@
 // contracts/GameItem.sol
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC721URIStorage, ERC721} from "../../../../token/ERC721/extensions/ERC721URIStorage.sol";
 

+ 1 - 1
contracts/mocks/docs/utilities/Base64NFT.sol

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: MIT
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC721} from "../../../token/ERC721/ERC721.sol";
 import {Strings} from "../../../utils/Strings.sol";

+ 1 - 1
contracts/mocks/token/ERC20VotesAdditionalCheckpointsMock.sol

@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC20Votes} from "../../token/ERC20/extensions/ERC20Votes.sol";
 import {VotesExtended, Votes} from "../../governance/utils/VotesExtended.sol";

+ 1 - 1
contracts/mocks/token/ERC20VotesLegacyMock.sol

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: MIT
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC20Permit} from "../../token/ERC20/extensions/ERC20Permit.sol";
 import {Math} from "../../utils/math/Math.sol";

+ 1 - 1
contracts/mocks/token/ERC20VotesTimestampMock.sol

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: MIT
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC20Votes} from "../../token/ERC20/extensions/ERC20Votes.sol";
 import {ERC721Votes} from "../../token/ERC721/extensions/ERC721Votes.sol";

+ 1 - 1
contracts/mocks/token/ERC721ConsecutiveEnumerableMock.sol

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: MIT
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC721} from "../../token/ERC721/ERC721.sol";
 import {ERC721Consecutive} from "../../token/ERC721/extensions/ERC721Consecutive.sol";

+ 1 - 1
contracts/mocks/token/ERC721ConsecutiveMock.sol

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: MIT
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC721} from "../../token/ERC721/ERC721.sol";
 import {ERC721Consecutive} from "../../token/ERC721/extensions/ERC721Consecutive.sol";

+ 1 - 1
contracts/mocks/token/ERC721URIStorageMock.sol

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: MIT
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC721URIStorage} from "../../token/ERC721/extensions/ERC721URIStorage.sol";
 

+ 1 - 1
contracts/mocks/utils/cryptography/ERC7739Mock.sol

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: MIT
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ECDSA} from "../../../utils/cryptography/ECDSA.sol";
 import {ERC7739} from "../../../utils/cryptography/signers/draft-ERC7739.sol";

+ 1 - 1
contracts/token/ERC1155/extensions/ERC1155URIStorage.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/extensions/ERC1155URIStorage.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {Strings} from "../../../utils/Strings.sol";
 import {ERC1155} from "../ERC1155.sol";

+ 1 - 1
contracts/token/ERC20/extensions/ERC20Permit.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/ERC20Permit.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {IERC20Permit} from "./IERC20Permit.sol";
 import {ERC20} from "../ERC20.sol";

+ 1 - 1
contracts/token/ERC20/extensions/ERC20Votes.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/ERC20Votes.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC20} from "../ERC20.sol";
 import {Votes} from "../../../governance/utils/Votes.sol";

+ 1 - 1
contracts/token/ERC721/ERC721.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.4.0) (token/ERC721/ERC721.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {IERC721} from "./IERC721.sol";
 import {IERC721Metadata} from "./extensions/IERC721Metadata.sol";

+ 1 - 1
contracts/token/ERC721/extensions/ERC721Burnable.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/extensions/ERC721Burnable.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC721} from "../ERC721.sol";
 import {Context} from "../../../utils/Context.sol";

+ 1 - 1
contracts/token/ERC721/extensions/ERC721Consecutive.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.3.0) (token/ERC721/extensions/ERC721Consecutive.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC721} from "../ERC721.sol";
 import {IERC2309} from "../../../interfaces/IERC2309.sol";

+ 1 - 1
contracts/token/ERC721/extensions/ERC721Enumerable.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.4.0) (token/ERC721/extensions/ERC721Enumerable.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC721} from "../ERC721.sol";
 import {IERC721Enumerable} from "./IERC721Enumerable.sol";

+ 1 - 1
contracts/token/ERC721/extensions/ERC721Pausable.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/extensions/ERC721Pausable.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC721} from "../ERC721.sol";
 import {Pausable} from "../../../utils/Pausable.sol";

+ 1 - 1
contracts/token/ERC721/extensions/ERC721Royalty.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.4.0) (token/ERC721/extensions/ERC721Royalty.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC721} from "../ERC721.sol";
 import {IERC165} from "../../../utils/introspection/ERC165.sol";

+ 1 - 1
contracts/token/ERC721/extensions/ERC721URIStorage.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.4.0) (token/ERC721/extensions/ERC721URIStorage.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC721} from "../ERC721.sol";
 import {IERC721Metadata} from "./IERC721Metadata.sol";

+ 1 - 1
contracts/token/ERC721/extensions/ERC721Votes.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/extensions/ERC721Votes.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {ERC721} from "../ERC721.sol";
 import {Votes} from "../../../governance/utils/Votes.sol";

+ 1 - 1
contracts/token/ERC721/extensions/ERC721Wrapper.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/extensions/ERC721Wrapper.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {IERC721, ERC721} from "../ERC721.sol";
 import {IERC721Receiver} from "../IERC721Receiver.sol";

+ 7 - 0
contracts/utils/Bytes.sol

@@ -129,6 +129,13 @@ library Bytes {
     }
 
     /*
+     * @dev Returns true if the two byte buffers are equal.
+     */
+    function equal(bytes memory a, bytes memory b) internal pure returns (bool) {
+        return a.length == b.length && keccak256(a) == keccak256(b);
+    }
+
+    /**
      * @dev Reverses the byte order of a bytes32 value, converting between little-endian and big-endian.
      * Inspired in https://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel[Reverse Parallel]
      */

+ 3 - 2
contracts/utils/Strings.sol

@@ -1,11 +1,12 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.4.0) (utils/Strings.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {Math} from "./math/Math.sol";
 import {SafeCast} from "./math/SafeCast.sol";
 import {SignedMath} from "./math/SignedMath.sol";
+import {Bytes} from "./Bytes.sol";
 
 /**
  * @dev String operations.
@@ -149,7 +150,7 @@ library Strings {
      * @dev Returns true if the two strings are equal.
      */
     function equal(string memory a, string memory b) internal pure returns (bool) {
-        return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
+        return Bytes.equal(bytes(a), bytes(b));
     }
 
     /**

+ 1 - 1
contracts/utils/cryptography/EIP712.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.4.0) (utils/cryptography/EIP712.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {MessageHashUtils} from "./MessageHashUtils.sol";
 import {ShortStrings, ShortString} from "../ShortStrings.sol";

+ 1 - 1
contracts/utils/cryptography/MessageHashUtils.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {Strings} from "../Strings.sol";
 

+ 1 - 1
contracts/utils/cryptography/signers/draft-ERC7739.sol

@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: MIT
 // OpenZeppelin Contracts (last updated v5.4.0) (utils/cryptography/signers/draft-ERC7739.sol)
 
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.24;
 
 import {AbstractSigner} from "./AbstractSigner.sol";
 import {EIP712} from "../EIP712.sol";

+ 4 - 0
test/utils/Bytes.t.sol

@@ -9,6 +9,10 @@ import {Bytes} from "@openzeppelin/contracts/utils/Bytes.sol";
 contract BytesTest is Test {
     using Bytes for bytes;
 
+    function testSymbolicEqual(bytes memory a) public pure {
+        assertTrue(Bytes.equal(a, a));
+    }
+
     // INDEX OF
     function testIndexOf(bytes memory buffer, bytes1 s) public pure {
         uint256 result = Bytes.indexOf(buffer, s);