Repository: pcaversaccio/snekmate (language: python)

Issue:
🔁 Upgrade to Vyper Version `0.3.9`
There will be a new Vyper version `0.3.8` released in around 4 weeks. We will need to upgrade all 🐍 snekmate contracts since the new version will entail various bug fixes and security patches (see, e.g., [here](https://github.com/vyperlang/vyper/security/advisories/GHSA-w9g2-3w7p-72g9)).


Discussion / hints:
https://github.com/vyperlang/vyper/releases/tag/v0.3.8
Revert this change: https://github.com/pcaversaccio/snekmate/commit/fc7cbdfd1697aafe68e2fd7bebcb3f62b3db5939.
https://github.com/vyperlang/vyper/releases/tag/v0.3.9

Fix patch:
diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml
index 13e36c5d..c1d6f199 100644
--- a/.github/workflows/checks.yml
+++ b/.github/workflows/checks.yml
@@ -14,7 +14,7 @@ jobs:
         os:
           - ubuntu-latest
         node_version:
-          - 16
+          - 18
 
     steps:
       - name: Checkout
diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml
index 633c1690..56a19c6d 100644
--- a/.github/workflows/publish-npm.yml
+++ b/.github/workflows/publish-npm.yml
@@ -12,7 +12,7 @@ jobs:
         os:
           - ubuntu-latest
         node_version:
-          - 16
+          - 18
 
     steps:
       - name: Checkout
diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml
index 1dde516b..74502680 100644
--- a/.github/workflows/publish-pypi.yml
+++ b/.github/workflows/publish-pypi.yml
@@ -12,7 +12,7 @@ jobs:
         os:
           - ubuntu-latest
         python-version:
-          - "3.10"
+          - 3.11
 
     steps:
       - name: Checkout
diff --git a/.solhint.json b/.solhint.json
index 0072d9a5..dba5d5bd 100644
--- a/.solhint.json
+++ b/.solhint.json
@@ -9,6 +9,7 @@
       }
     ],
     "no-empty-blocks": "off",
-    "func-name-mixedcase": "off"
+    "func-name-mixedcase": "off",
+    "private-vars-leading-underscore": "off"
   }
 }
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index cfe2c8ed..be58bd96 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -48,7 +48,7 @@ You will need the following dependencies:
 
 ## ⚙️ Installation
 
-It is recommended to install [Yarn](https://classic.yarnpkg.com) through the `npm` package manager, which comes bundled with [Node.js](https://nodejs.org) when you install it on your system. It is recommended to use a Node.js version `>= 16.0.0`.
+It is recommended to install [Yarn](https://classic.yarnpkg.com) through the `npm` package manager, which comes bundled with [Node.js](https://nodejs.org) when you install it on your system. It is recommended to use a Node.js version `>= 18.0.0`.
 
 Once you have `npm` installed, you can run the following both to install and upgrade Yarn:
 
diff --git a/foundry.toml b/foundry.toml
index 0bd855dc..95882fb4 100644
--- a/foundry.toml
+++ b/foundry.toml
@@ -13,6 +13,7 @@ invariant = { runs = 256 }                                  # the number of runs
 ffi = true                                                  # whether to enable foreign function interface (ffi) cheatcodes or not
 verbosity = 3                                               # the verbosity of tests
 fs_permissions = [{ access = "read-write", path = "./"}]    # set read-write access to project root
+evm_version = 'shanghai'                                    # set the EVM target version
 
 ## default overrides for the CI runs
 [profile.ci]
diff --git a/lib/create-util b/lib/create-util
index 2b1b4a58..2a2df83b 160000
--- a/lib/create-util
+++ b/lib/create-util
@@ -1,1 +1,1 @@
-Subproject commit 2b1b4a58082e5d6f0d15684b24a68b6d47e6c9e4
+Subproject commit 2a2df83b871050d088647d6a8f31fa53e07a02e7
diff --git a/lib/forge-std b/lib/forge-std
index 9b49a72c..e8a047e3 160000
--- a/lib/forge-std
+++ b/lib/forge-std
@@ -1,1 +1,1 @@
-Subproject commit 9b49a72cfdb36bcf195eb863f868f01a6d6d3186
+Subproject commit e8a047e3f40f13fa37af6fe14e6e06283d9a060e
diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts
index 1642b663..4c713f8c 160000
--- a/lib/openzeppelin-contracts
+++ b/lib/openzeppelin-contracts
@@ -1,1 +1,1 @@
-Subproject commit 1642b6639b93e3b97be163d49827e1f56b81ca11
+Subproject commit 4c713f8cea2cbd002509c8ea0d8e0a996627f069
diff --git a/lib/solady b/lib/solady
index 2b337440..0eb471e8 160000
--- a/lib/solady
+++ b/lib/solady
@@ -1,1 +1,1 @@
-Subproject commit 2b33744067c2afa74a6ee364004e99035cae692e
+Subproject commit 0eb471e8870d146a1c962569d3accc4d3bca8557
diff --git a/lib/utils/VyperDeployer.sol b/lib/utils/VyperDeployer.sol
index 7ab7fcd8..8ce51370 100644
--- a/lib/utils/VyperDeployer.sol
+++ b/lib/utils/VyperDeployer.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Create} from "create-util/Create.sol";
 
@@ -31,7 +31,7 @@ interface _CheatCodes {
  */
 contract VyperDeployer is Create {
     address private constant HEVM_ADDRESS =
-        address(bytes20(uint160(uint256(keccak256("hevm cheat code")))));
+        address(uint160(uint256(keccak256("hevm cheat code"))));
     address private self = address(this);
 
     /**
diff --git a/src/auth/AccessControl.vy b/src/auth/AccessControl.vy
index d65d6d2d..2cb157f9 100644
--- a/src/auth/AccessControl.vy
+++ b/src/auth/AccessControl.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title Multi-Role-Based Access Control Functions
 @license GNU Affero General Public License v3.0
diff --git a/src/auth/Ownable.vy b/src/auth/Ownable.vy
index d44f5b2c..75d91d80 100644
--- a/src/auth/Ownable.vy
+++ b/src/auth/Ownable.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title Owner-Based Access Control Functions
 @license GNU Affero General Public License v3.0
diff --git a/src/auth/Ownable2Step.vy b/src/auth/Ownable2Step.vy
index bf5a4224..78dae831 100644
--- a/src/auth/Ownable2Step.vy
+++ b/src/auth/Ownable2Step.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title 2-Step Ownership Transfer Functions
 @license GNU Affero General Public License v3.0
diff --git a/src/auth/interfaces/IAccessControl.vy b/src/auth/interfaces/IAccessControl.vy
index 637440b3..f2495e0c 100644
--- a/src/auth/interfaces/IAccessControl.vy
+++ b/src/auth/interfaces/IAccessControl.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title AccessControl Interface Definition
 @license GNU Affero General Public License v3.0
diff --git a/src/extensions/ERC4626.vy b/src/extensions/ERC4626.vy
index 877e6374..55ca7a73 100644
--- a/src/extensions/ERC4626.vy
+++ b/src/extensions/ERC4626.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title Modern and Gas-Efficient ERC-4626 Tokenised Vault Implementation
 @license GNU Affero General Public License v3.0
diff --git a/src/tokens/ERC1155.vy b/src/tokens/ERC1155.vy
index 9e9984cc..59560a10 100644
--- a/src/tokens/ERC1155.vy
+++ b/src/tokens/ERC1155.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title Modern and Gas-Efficient ERC-1155 Implementation
 @license GNU Affero General Public License v3.0
@@ -67,7 +67,7 @@ _SUPPORTED_INTERFACES: constant(bytes4[3]) = [
 
 
 # @dev Stores the upper bound for batch calls.
-_BATCH_SIZE: constant(uint16) = max_value(uint8)
+_BATCH_SIZE: constant(uint16) = 255
 
 
 # @dev Stores the base URI for computing `uri`.
diff --git a/src/tokens/ERC20.vy b/src/tokens/ERC20.vy
index 35a5aefa..1341df45 100644
--- a/src/tokens/ERC20.vy
+++ b/src/tokens/ERC20.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title Modern and Gas-Efficient ERC-20 + EIP-2612 Implementation
 @license GNU Affero General Public License v3.0
diff --git a/src/tokens/ERC721.vy b/src/tokens/ERC721.vy
index 2f4b54e3..22dc46ab 100644
--- a/src/tokens/ERC721.vy
+++ b/src/tokens/ERC721.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title Modern and Gas-Efficient ERC-721 + EIP-4494 Implementation
 @license GNU Affero General Public License v3.0
diff --git a/src/tokens/interfaces/IERC1155.vy b/src/tokens/interfaces/IERC1155.vy
index a211bfb3..e168d02d 100644
--- a/src/tokens/interfaces/IERC1155.vy
+++ b/src/tokens/interfaces/IERC1155.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title EIP-1155 Interface Definition
 @license GNU Affero General Public License v3.0
diff --git a/src/tokens/interfaces/IERC1155MetadataURI.vy b/src/tokens/interfaces/IERC1155MetadataURI.vy
index 42f75b3d..1b2fc242 100644
--- a/src/tokens/interfaces/IERC1155MetadataURI.vy
+++ b/src/tokens/interfaces/IERC1155MetadataURI.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title EIP-1155 Optional Metadata Interface Definition
 @license GNU Affero General Public License v3.0
diff --git a/src/tokens/interfaces/IERC1155Receiver.vy b/src/tokens/interfaces/IERC1155Receiver.vy
index 1188d98f..7cb0d80c 100644
--- a/src/tokens/interfaces/IERC1155Receiver.vy
+++ b/src/tokens/interfaces/IERC1155Receiver.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title EIP-1155 Token Receiver Interface Definition
 @license GNU Affero General Public License v3.0
diff --git a/src/tokens/interfaces/IERC20Permit.vy b/src/tokens/interfaces/IERC20Permit.vy
index 62576f25..730c2e0e 100644
--- a/src/tokens/interfaces/IERC20Permit.vy
+++ b/src/tokens/interfaces/IERC20Permit.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title EIP-2612 Interface Definition
 @license GNU Affero General Public License v3.0
diff --git a/src/tokens/interfaces/IERC4906.vy b/src/tokens/interfaces/IERC4906.vy
index a9d04e2f..0831999f 100644
--- a/src/tokens/interfaces/IERC4906.vy
+++ b/src/tokens/interfaces/IERC4906.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title EIP-4906 Interface Definition
 @license GNU Affero General Public License v3.0
diff --git a/src/tokens/interfaces/IERC721Enumerable.vy b/src/tokens/interfaces/IERC721Enumerable.vy
index 3fd972b7..0f2e6600 100644
--- a/src/tokens/interfaces/IERC721Enumerable.vy
+++ b/src/tokens/interfaces/IERC721Enumerable.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title EIP-721 Optional Enumeration Interface Definition
 @license GNU Affero General Public License v3.0
diff --git a/src/tokens/interfaces/IERC721Metadata.vy b/src/tokens/interfaces/IERC721Metadata.vy
index 3b9daffb..4b33d76d 100644
--- a/src/tokens/interfaces/IERC721Metadata.vy
+++ b/src/tokens/interfaces/IERC721Metadata.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title EIP-721 Optional Metadata Interface Definition
 @license GNU Affero General Public License v3.0
diff --git a/src/tokens/interfaces/IERC721Permit.vy b/src/tokens/interfaces/IERC721Permit.vy
index 3e93d469..2c33fb1e 100644
--- a/src/tokens/interfaces/IERC721Permit.vy
+++ b/src/tokens/interfaces/IERC721Permit.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title EIP-4494 Interface Definition
 @license GNU Affero General Public License v3.0
diff --git a/src/tokens/interfaces/IERC721Receiver.vy b/src/tokens/interfaces/IERC721Receiver.vy
index 766021e2..cc0d856b 100644
--- a/src/tokens/interfaces/IERC721Receiver.vy
+++ b/src/tokens/interfaces/IERC721Receiver.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title EIP-721 Token Receiver Interface Definition
 @license GNU Affero General Public License v3.0
diff --git a/src/utils/Base64.vy b/src/utils/Base64.vy
index bbb5106f..50c6b2a4 100644
--- a/src/utils/Base64.vy
+++ b/src/utils/Base64.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title Base64 Encoding and Decoding Functions
 @license GNU Affero General Public License v3.0
@@ -63,7 +63,7 @@ def encode(data: Bytes[_DATA_INPUT_BOUND], base64_url: bool) -> DynArray[String[
     """
     data_length: uint256 = len(data)
     if (data_length == empty(uint256)):
-        return empty(DynArray[String[4], 1])
+        return empty(DynArray[String[4], _DATA_OUTPUT_BOUND])
 
     # If the length of the unencoded input is not
     # a multiple of three, the encoded output must
diff --git a/src/utils/BatchDistributor.vy b/src/utils/BatchDistributor.vy
index 19fd94da..994ecf19 100644
--- a/src/utils/BatchDistributor.vy
+++ b/src/utils/BatchDistributor.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title Batch Sending Both Native and ERC-20 Tokens
 @license GNU Affero General Public License v3.0
diff --git a/src/utils/Create2Address.vy b/src/utils/Create2Address.vy
index 171f219e..278bbc3d 100644
--- a/src/utils/Create2Address.vy
+++ b/src/utils/Create2Address.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title `CREATE2` EVM Opcode Utility Functions for Address Calculations
 @license GNU Affero General Public License v3.0
@@ -87,4 +87,4 @@ def _convert_keccak256_2_address(digest: bytes32) -> address:
     @param digest The 32-byte keccak256 digest.
     @return address The converted 20-byte address.
     """
-    return convert(convert(digest, uint256) & max_value(uint160), address)
+    return convert(convert(digest, uint256) & convert(max_value(uint160), uint256), address)
diff --git a/src/utils/CreateAddress.vy b/src/utils/CreateAddress.vy
index f7983a89..79ae6e2b 100644
--- a/src/utils/CreateAddress.vy
+++ b/src/utils/CreateAddress.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title `CREATE` EVM Opcode Utility Functions for Address Calculations
 @license GNU Affero General Public License v3.0
@@ -128,4 +128,4 @@ def _convert_keccak256_2_address(digest: bytes32) -> address:
     @param digest The 32-byte keccak256 digest.
     @return address The converted 20-byte address.
     """
-    return convert(convert(digest, uint256) & max_value(uint160), address)
+    return convert(convert(digest, uint256) & convert(max_value(uint160), uint256), address)
diff --git a/src/utils/ECDSA.vy b/src/utils/ECDSA.vy
index 42d3e320..a5519913 100644
--- a/src/utils/ECDSA.vy
+++ b/src/utils/ECDSA.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title Elliptic Curve Digital Signature Algorithm (ECDSA) Functions
 @license GNU Affero General Public License v3.0
diff --git a/src/utils/EIP712DomainSeparator.vy b/src/utils/EIP712DomainSeparator.vy
index b633e68d..c15ec63b 100644
--- a/src/utils/EIP712DomainSeparator.vy
+++ b/src/utils/EIP712DomainSeparator.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title EIP-712 Domain Separator
 @license GNU Affero General Public License v3.0
diff --git a/src/utils/Math.vy b/src/utils/Math.vy
index 467cb1d3..cecafe16 100644
--- a/src/utils/Math.vy
+++ b/src/utils/Math.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title Standard Mathematical Utility Functions
 @license GNU Affero General Public License v3.0
diff --git a/src/utils/MerkleProofVerification.vy b/src/utils/MerkleProofVerification.vy
index 2a1f687f..d44d428d 100644
--- a/src/utils/MerkleProofVerification.vy
+++ b/src/utils/MerkleProofVerification.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title Merkle Tree Proof Verification Functions
 @license GNU Affero General Public License v3.0
diff --git a/src/utils/Multicall.vy b/src/utils/Multicall.vy
index 30422970..bd0ff417 100644
--- a/src/utils/Multicall.vy
+++ b/src/utils/Multicall.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title Multicall Functions
 @license GNU Affero General Public License v3.0
@@ -80,12 +80,12 @@ def multicall(data: DynArray[Batch, max_value(uint8)]) -> DynArray[Result, max_v
     success: bool = empty(bool)
     for batch in data:
         if (batch.allow_failure == False):
-            return_data = raw_call(batch.target, batch.call_data, max_outsize=max_value(uint8))
+            return_data = raw_call(batch.target, batch.call_data, max_outsize=255)
             success = True
             results.append(Result({success: success, return_data: return_data}))
         else:
             success, return_data = \
-                raw_call(batch.target, batch.call_data, max_outsize=max_value(uint8), revert_on_failure=False)
+                raw_call(batch.target, batch.call_data, max_outsize=255, revert_on_failure=False)
             results.append(Result({success: success, return_data: return_data}))
     return results
 
@@ -113,12 +113,12 @@ def multicall_value(data: DynArray[BatchValue, max_value(uint8)]) -> DynArray[Re
         msg_value: uint256 = batch.value
         value_accumulator = unsafe_add(value_accumulator, msg_value)
         if (batch.allow_failure == False):
-            return_data = raw_call(batch.target, batch.call_data, max_outsize=max_value(uint8), value=msg_value)
+            return_data = raw_call(batch.target, batch.call_data, max_outsize=255, value=msg_value)
             success = True
             results.append(Result({success: success, return_data: return_data}))
         else:
             success, return_data = \
-                raw_call(batch.target, batch.call_data, max_outsize=max_value(uint8), value=msg_value, revert_on_failure=False)
+                raw_call(batch.target, batch.call_data, max_outsize=255, value=msg_value, revert_on_failure=False)
             results.append(Result({success: success, return_data: return_data}))
     assert msg.value == value_accumulator, "Multicall: value mismatch"
     return results
@@ -149,12 +149,12 @@ def multicall_self(data: DynArray[BatchSelf, max_value(uint8)]) -> DynArray[Resu
     success: bool = empty(bool)
     for batch in data:
         if (batch.allow_failure == False):
-            return_data = raw_call(self, batch.call_data, max_outsize=max_value(uint8), is_delegate_call=True)
+            return_data = raw_call(self, batch.call_data, max_outsize=255, is_delegate_call=True)
             success = True
             results.append(Result({success: success, return_data: return_data}))
         else:
             success, return_data = \
-                raw_call(self, batch.call_data, max_outsize=max_value(uint8), is_delegate_call=True, revert_on_failure=False)
+                raw_call(self, batch.call_data, max_outsize=255, is_delegate_call=True, revert_on_failure=False)
             results.append(Result({success: success, return_data: return_data}))
     return results
 
@@ -189,12 +189,12 @@ def multicall_value_self(data: DynArray[BatchValueSelf, max_value(uint8)]) -> Dy
         msg_value: uint256 = batch.value
         value_accumulator = unsafe_add(value_accumulator, msg_value)
         if (batch.allow_failure == False):
-            return_data = raw_call(self, batch.call_data, max_outsize=max_value(uint8), value=msg_value, is_delegate_call=True)
+            return_data = raw_call(self, batch.call_data, max_outsize=255, value=msg_value, is_delegate_call=True)
             success = True
             results.append(Result({success: success, return_data: return_data}))
         else:
             success, return_data = \
-                raw_call(self, batch.call_data, max_outsize=max_value(uint8), value=msg_value, is_delegate_call=True, revert_on_failure=False)
+                raw_call(self, batch.call_data, max_outsize=255, value=msg_value, is_delegate_call=True, revert_on_failure=False)
             results.append(Result({success: success, return_data: return_data}))
     assert msg.value == value_accumulator, "Multicall: value mismatch"
     return results
@@ -217,11 +217,11 @@ def multistaticcall(data: DynArray[Batch, max_value(uint8)]) -> DynArray[Result,
     success: bool = empty(bool)
     for batch in data:
         if (batch.allow_failure == False):
-            return_data = raw_call(batch.target, batch.call_data, max_outsize=max_value(uint8), is_static_call=True)
+            return_data = raw_call(batch.target, batch.call_data, max_outsize=255, is_static_call=True)
             success = True
             results.append(Result({success: success, return_data: return_data}))
         else:
             success, return_data = \
-                raw_call(batch.target, batch.call_data, max_outsize=max_value(uint8), is_static_call=True, revert_on_failure=False)
+                raw_call(batch.target, batch.call_data, max_outsize=255, is_static_call=True, revert_on_failure=False)
             results.append(Result({success: success, return_data: return_data}))
     return results
diff --git a/src/utils/SignatureChecker.vy b/src/utils/SignatureChecker.vy
index 984bf7b5..7ea3a05e 100644
--- a/src/utils/SignatureChecker.vy
+++ b/src/utils/SignatureChecker.vy
@@ -1,4 +1,4 @@
-# @version ^0.3.7
+# @version ^0.3.9
 """
 @title ECDSA and EIP-1271 Signature Verification Functions
 @license GNU Affero General Public License v3.0


Test patch:
diff --git a/.github/workflows/publish-test-pypi.yml b/.github/workflows/publish-test-pypi.yml
index f6e6fb0b..1a4288ed 100644
--- a/.github/workflows/publish-test-pypi.yml
+++ b/.github/workflows/publish-test-pypi.yml
@@ -10,7 +10,7 @@ jobs:
         os:
           - ubuntu-latest
         python-version:
-          - "3.10"
+          - 3.11
 
     steps:
       - name: Checkout
@@ -42,4 +42,4 @@ jobs:
         with:
           user: __token__
           password: ${{ secrets.TEST_PYPI_API_TOKEN }}
-          repository_url: https://test.pypi.org/legacy/
+          repository-url: https://test.pypi.org/legacy/
diff --git a/.github/workflows/test-contracts.yml b/.github/workflows/test-contracts.yml
index ab21b614..683995bc 100644
--- a/.github/workflows/test-contracts.yml
+++ b/.github/workflows/test-contracts.yml
@@ -14,11 +14,11 @@ jobs:
         os:
           - ubuntu-latest
         architecture:
-          - "x64"
+          - x64
         python-version:
-          - "3.10"
+          - 3.11
         node_version:
-          - 16
+          - 18
 
     steps:
       - name: Checkout
@@ -33,7 +33,7 @@ jobs:
           architecture: ${{ matrix.architecture }}
 
       - name: Install Vyper
-        run: pip install vyper==0.3.7
+        run: pip install vyper
 
       - name: Get Yarn cache directory path
         id: yarn-cache-dir-path
diff --git a/lib/prb-test b/lib/prb-test
index ade93911..a245c71e 160000
--- a/lib/prb-test
+++ b/lib/prb-test
@@ -1,1 +1,1 @@
-Subproject commit ade93911bb5f624fd5623ecd37f26a6cb175ff78
+Subproject commit a245c71edc07643aedfe27df4cc7b21048aa8824
diff --git a/test/auth/AccessControl.t.sol b/test/auth/AccessControl.t.sol
index 816e418c..faf2e8a6 100644
--- a/test/auth/AccessControl.t.sol
+++ b/test/auth/AccessControl.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/auth/Ownable.t.sol b/test/auth/Ownable.t.sol
index 9548a3cd..fb8f7162 100644
--- a/test/auth/Ownable.t.sol
+++ b/test/auth/Ownable.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/auth/Ownable2Step.t.sol b/test/auth/Ownable2Step.t.sol
index 13aedd8e..b420a165 100644
--- a/test/auth/Ownable2Step.t.sol
+++ b/test/auth/Ownable2Step.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/auth/interfaces/IAccessControlExtended.sol b/test/auth/interfaces/IAccessControlExtended.sol
index a7dd9737..f81b6613 100644
--- a/test/auth/interfaces/IAccessControlExtended.sol
+++ b/test/auth/interfaces/IAccessControlExtended.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {IERC165} from "openzeppelin/utils/introspection/IERC165.sol";
 import {IAccessControl} from "openzeppelin/access/IAccessControl.sol";
diff --git a/test/auth/interfaces/IOwnable.sol b/test/auth/interfaces/IOwnable.sol
index 9adf7b86..d51ef56f 100644
--- a/test/auth/interfaces/IOwnable.sol
+++ b/test/auth/interfaces/IOwnable.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 interface IOwnable {
     function owner() external view returns (address);
diff --git a/test/auth/interfaces/IOwnable2Step.sol b/test/auth/interfaces/IOwnable2Step.sol
index 25231598..044c39a2 100644
--- a/test/auth/interfaces/IOwnable2Step.sol
+++ b/test/auth/interfaces/IOwnable2Step.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 interface IOwnable2Step {
     function owner() external view returns (address);
diff --git a/test/extensions/ERC4626.t.sol b/test/extensions/ERC4626.t.sol
index 2bb7cff8..01770ac3 100644
--- a/test/extensions/ERC4626.t.sol
+++ b/test/extensions/ERC4626.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {ERC4626Test} from "erc4626-tests/ERC4626.test.sol";
diff --git a/test/extensions/interfaces/IERC4626Extended.sol b/test/extensions/interfaces/IERC4626Extended.sol
index 2411aebf..3a380a1b 100644
--- a/test/extensions/interfaces/IERC4626Extended.sol
+++ b/test/extensions/interfaces/IERC4626Extended.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {IERC20Metadata} from "openzeppelin/token/ERC20/extensions/IERC20Metadata.sol";
 import {IERC20Permit} from "openzeppelin/token/ERC20/extensions/IERC20Permit.sol";
diff --git a/test/extensions/mocks/ERC20ExcessDecimalsMock.sol b/test/extensions/mocks/ERC20ExcessDecimalsMock.sol
index 63dbc9ef..daeddaed 100644
--- a/test/extensions/mocks/ERC20ExcessDecimalsMock.sol
+++ b/test/extensions/mocks/ERC20ExcessDecimalsMock.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 /**
  * @title ERC20ExcessDecimalsMock
diff --git a/test/tokens/ERC1155.t.sol b/test/tokens/ERC1155.t.sol
index baa77e69..bc4c7df8 100644
--- a/test/tokens/ERC1155.t.sol
+++ b/test/tokens/ERC1155.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/tokens/ERC20.t.sol b/test/tokens/ERC20.t.sol
index a1f697e4..1cc80d1b 100644
--- a/test/tokens/ERC20.t.sol
+++ b/test/tokens/ERC20.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/tokens/ERC721.t.sol b/test/tokens/ERC721.t.sol
index d81dac35..f1398bba 100644
--- a/test/tokens/ERC721.t.sol
+++ b/test/tokens/ERC721.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {stdError} from "forge-std/StdError.sol";
diff --git a/test/tokens/interfaces/IERC1155Extended.sol b/test/tokens/interfaces/IERC1155Extended.sol
index 215bf350..6d424fc8 100644
--- a/test/tokens/interfaces/IERC1155Extended.sol
+++ b/test/tokens/interfaces/IERC1155Extended.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {IERC1155MetadataURI} from "openzeppelin/token/ERC1155/extensions/IERC1155MetadataURI.sol";
 
diff --git a/test/tokens/interfaces/IERC20Extended.sol b/test/tokens/interfaces/IERC20Extended.sol
index 01239db8..bbe862e7 100644
--- a/test/tokens/interfaces/IERC20Extended.sol
+++ b/test/tokens/interfaces/IERC20Extended.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {IERC20Metadata} from "openzeppelin/token/ERC20/extensions/IERC20Metadata.sol";
 import {IERC20Permit} from "openzeppelin/token/ERC20/extensions/IERC20Permit.sol";
diff --git a/test/tokens/interfaces/IERC4494.sol b/test/tokens/interfaces/IERC4494.sol
index e80d8ab0..52466374 100644
--- a/test/tokens/interfaces/IERC4494.sol
+++ b/test/tokens/interfaces/IERC4494.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {IERC165} from "openzeppelin/utils/introspection/IERC165.sol";
 
diff --git a/test/tokens/interfaces/IERC721Extended.sol b/test/tokens/interfaces/IERC721Extended.sol
index 917c12db..b80ea116 100644
--- a/test/tokens/interfaces/IERC721Extended.sol
+++ b/test/tokens/interfaces/IERC721Extended.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {IERC721Metadata} from "openzeppelin/token/ERC721/extensions/IERC721Metadata.sol";
 import {IERC721Enumerable} from "openzeppelin/token/ERC721/extensions/IERC721Enumerable.sol";
diff --git a/test/tokens/mocks/ERC1155ReceiverMock.sol b/test/tokens/mocks/ERC1155ReceiverMock.sol
index 099c5d86..232bc437 100644
--- a/test/tokens/mocks/ERC1155ReceiverMock.sol
+++ b/test/tokens/mocks/ERC1155ReceiverMock.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {ERC165} from "openzeppelin/utils/introspection/ERC165.sol";
 import {IERC1155Receiver} from "openzeppelin/token/ERC1155/IERC1155Receiver.sol";
diff --git a/test/tokens/mocks/ERC721ReceiverMock.sol b/test/tokens/mocks/ERC721ReceiverMock.sol
index 94cb1733..ba1eddab 100644
--- a/test/tokens/mocks/ERC721ReceiverMock.sol
+++ b/test/tokens/mocks/ERC721ReceiverMock.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {IERC721Receiver} from "openzeppelin/token/ERC721/IERC721Receiver.sol";
 
diff --git a/test/utils/Base64.t.sol b/test/utils/Base64.t.sol
index 2e5ee489..3daa615f 100644
--- a/test/utils/Base64.t.sol
+++ b/test/utils/Base64.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {PRBTest} from "prb/test/PRBTest.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/utils/BatchDistributor.t.sol b/test/utils/BatchDistributor.t.sol
index fb541341..f80b220a 100644
--- a/test/utils/BatchDistributor.t.sol
+++ b/test/utils/BatchDistributor.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/utils/Create2Address.t.sol b/test/utils/Create2Address.t.sol
index 20fc76b6..ee78c575 100644
--- a/test/utils/Create2Address.t.sol
+++ b/test/utils/Create2Address.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/utils/CreateAddress.t.sol b/test/utils/CreateAddress.t.sol
index 1fcf56eb..8fdd99c1 100644
--- a/test/utils/CreateAddress.t.sol
+++ b/test/utils/CreateAddress.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/utils/ECDSA.t.sol b/test/utils/ECDSA.t.sol
index d9e04e1e..54703e08 100644
--- a/test/utils/ECDSA.t.sol
+++ b/test/utils/ECDSA.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/utils/EIP712DomainSeparator.t.sol b/test/utils/EIP712DomainSeparator.t.sol
index a5a29689..a152fcd7 100644
--- a/test/utils/EIP712DomainSeparator.t.sol
+++ b/test/utils/EIP712DomainSeparator.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/utils/Math.t.sol b/test/utils/Math.t.sol
index 753ed6b5..2fbc9acb 100644
--- a/test/utils/Math.t.sol
+++ b/test/utils/Math.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/utils/MerkleProofVerification.t.sol b/test/utils/MerkleProofVerification.t.sol
index d45fc059..12cf7ea9 100644
--- a/test/utils/MerkleProofVerification.t.sol
+++ b/test/utils/MerkleProofVerification.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/utils/Multicall.t.sol b/test/utils/Multicall.t.sol
index 19059a38..a5e5b8de 100644
--- a/test/utils/Multicall.t.sol
+++ b/test/utils/Multicall.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/utils/SignatureChecker.t.sol b/test/utils/SignatureChecker.t.sol
index cf4167f9..4de0f058 100644
--- a/test/utils/SignatureChecker.t.sol
+++ b/test/utils/SignatureChecker.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/utils/interfaces/IBase64.sol b/test/utils/interfaces/IBase64.sol
index 9b6aa24f..7af0159d 100644
--- a/test/utils/interfaces/IBase64.sol
+++ b/test/utils/interfaces/IBase64.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 interface IBase64 {
     function encode(
diff --git a/test/utils/interfaces/IBatchDistributor.sol b/test/utils/interfaces/IBatchDistributor.sol
index 584820a6..843cb410 100644
--- a/test/utils/interfaces/IBatchDistributor.sol
+++ b/test/utils/interfaces/IBatchDistributor.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {IERC20} from "openzeppelin/token/ERC20/IERC20.sol";
 
diff --git a/test/utils/interfaces/ICreate2Address.sol b/test/utils/interfaces/ICreate2Address.sol
index b16ed32c..45e4cc35 100644
--- a/test/utils/interfaces/ICreate2Address.sol
+++ b/test/utils/interfaces/ICreate2Address.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 interface ICreate2Address {
     function compute_address_self(
diff --git a/test/utils/interfaces/ICreateAddress.sol b/test/utils/interfaces/ICreateAddress.sol
index d5ccee52..6100cf46 100644
--- a/test/utils/interfaces/ICreateAddress.sol
+++ b/test/utils/interfaces/ICreateAddress.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 interface ICreateAddress {
     function compute_address_rlp_self(
diff --git a/test/utils/interfaces/IECDSA.sol b/test/utils/interfaces/IECDSA.sol
index 87e4b18a..0f0cd856 100644
--- a/test/utils/interfaces/IECDSA.sol
+++ b/test/utils/interfaces/IECDSA.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 interface IECDSA {
     function recover_sig(
diff --git a/test/utils/interfaces/IEIP712DomainSeparator.sol b/test/utils/interfaces/IEIP712DomainSeparator.sol
index e4ce3f98..61f21361 100644
--- a/test/utils/interfaces/IEIP712DomainSeparator.sol
+++ b/test/utils/interfaces/IEIP712DomainSeparator.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 interface IEIP712DomainSeparator {
     function domain_separator_v4() external view returns (bytes32);
diff --git a/test/utils/interfaces/IMath.sol b/test/utils/interfaces/IMath.sol
index cfeef419..d795ebe6 100644
--- a/test/utils/interfaces/IMath.sol
+++ b/test/utils/interfaces/IMath.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 interface IMath {
     function uint256_average(
diff --git a/test/utils/interfaces/IMerkleProofVerification.sol b/test/utils/interfaces/IMerkleProofVerification.sol
index ac2e9049..48760fe0 100644
--- a/test/utils/interfaces/IMerkleProofVerification.sol
+++ b/test/utils/interfaces/IMerkleProofVerification.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 interface IMerkleProofVerification {
     function verify(
diff --git a/test/utils/interfaces/IMulticall.sol b/test/utils/interfaces/IMulticall.sol
index 7c2e421a..34f92a97 100644
--- a/test/utils/interfaces/IMulticall.sol
+++ b/test/utils/interfaces/IMulticall.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 interface IMulticall {
     struct Batch {
diff --git a/test/utils/interfaces/ISignatureChecker.sol b/test/utils/interfaces/ISignatureChecker.sol
index 273b1b21..c1e35324 100644
--- a/test/utils/interfaces/ISignatureChecker.sol
+++ b/test/utils/interfaces/ISignatureChecker.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 interface ISignatureChecker {
     function is_valid_signature_now(
diff --git a/test/utils/mocks/Create2Impl.sol b/test/utils/mocks/Create2Impl.sol
index 3e43c980..dcc2a9f0 100644
--- a/test/utils/mocks/Create2Impl.sol
+++ b/test/utils/mocks/Create2Impl.sol
@@ -1,8 +1,7 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Create2} from "openzeppelin/utils/Create2.sol";
-import {ERC1820Implementer} from "openzeppelin/utils/introspection/ERC1820Implementer.sol";
 
 /**
  * @title Create2Impl
@@ -23,16 +22,6 @@ contract Create2Impl {
         Create2.deploy(value, salt, code);
     }
 
-    /**
-     * @dev Deploys an `ERC1820Implementer` contract using `CREATE2`. The address
-     * where the contract will be deployed can be known in advance via `computeAddress`.
-     * @param value The 32-byte ether value used to create the contract address.
-     * @param salt The 32-byte random value used to create the contract address.
-     */
-    function deployERC1820Implementer(uint256 value, bytes32 salt) public {
-        Create2.deploy(value, salt, type(ERC1820Implementer).creationCode);
-    }
-
     /**
      * @dev Returns the address where a contract will be stored if deployed via
      * this contract using the `CREATE2` opcode. Any change in the `codeHash` or
diff --git a/test/utils/mocks/ERC1271MaliciousMock.sol b/test/utils/mocks/ERC1271MaliciousMock.sol
index cf3cb366..9dcca025 100644
--- a/test/utils/mocks/ERC1271MaliciousMock.sol
+++ b/test/utils/mocks/ERC1271MaliciousMock.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {IERC1271} from "openzeppelin/interfaces/IERC1271.sol";
 
diff --git a/test/utils/mocks/ERC1271WalletMock.sol b/test/utils/mocks/ERC1271WalletMock.sol
index e8574a9c..9937cfb5 100644
--- a/test/utils/mocks/ERC1271WalletMock.sol
+++ b/test/utils/mocks/ERC1271WalletMock.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {Ownable} from "openzeppelin/access/Ownable.sol";
 import {IERC1271} from "openzeppelin/interfaces/IERC1271.sol";
@@ -13,9 +13,7 @@ import {ECDSA} from "openzeppelin/utils/cryptography/ECDSA.sol";
  * @dev Allows to mock a correct ERC-1271 implementation.
  */
 contract ERC1271WalletMock is Ownable, IERC1271 {
-    constructor(address originalOwner_) {
-        _transferOwnership(originalOwner_);
-    }
+    constructor(address originalOwner_) Ownable(originalOwner_) {}
 
     /**
      * @dev Returns the 4-byte magic value `0x1626ba7e` if the verification passes.
diff --git a/test/utils/mocks/ERC20Mock.sol b/test/utils/mocks/ERC20Mock.sol
index cfb1aa6d..156592af 100644
--- a/test/utils/mocks/ERC20Mock.sol
+++ b/test/utils/mocks/ERC20Mock.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 import {ERC20} from "openzeppelin/token/ERC20/ERC20.sol";
 
diff --git a/test/utils/mocks/EtherReceiver.sol b/test/utils/mocks/EtherReceiver.sol
index 485e38c5..c3f724c8 100644
--- a/test/utils/mocks/EtherReceiver.sol
+++ b/test/utils/mocks/EtherReceiver.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 /**
  * @title EtherReceiver
diff --git a/test/utils/mocks/MockCallee.sol b/test/utils/mocks/MockCallee.sol
index ed3792c3..c7daffd6 100644
--- a/test/utils/mocks/MockCallee.sol
+++ b/test/utils/mocks/MockCallee.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
+pragma solidity ^0.8.20;
 
 /**
  * @dev Error that occurs when a method reverts.