Repository: pcaversaccio/snekmate (language: python)

Issue:
🔁 Upgrade to Solidity Version `0.8.21`
- Official Release: https://github.com/ethereum/solidity/releases/tag/v0.8.21
- We should use the feature that you can now access events from other contracts for our Foundry tests:
![image](https://github.com/pcaversaccio/snekmate/assets/25297591/0f41cf29-35af-461f-9ec8-3059c76b8a21)


Discussion / hints:
It looks like emitting events from other contracts is currently not possible due to an ICE: https://github.com/ethereum/solidity/issues/14430
> It looks like emitting events from other contracts is currently not possible due to an ICE: [ethereum/solidity#14430](https://github.com/ethereum/solidity/issues/14430)

Emitting events from other contracts itself works just fine; requesting `--userdoc` or `--devdoc` when you have such events is what causes the ICE. Hope that helps.
> Emitting events from other contracts itself works just fine; requesting `--userdoc` or `--devdoc` when you have such events is what causes the ICE. Hope that helps.

I'm having a hard time to make a contract compile however; let's take the following contract (`Test.sol`):

```solidity
// SPDX-License-Identifier: MIT
pragma solidity 0.8.21;

contract X {
    event E();
}

contract C {
    function g() public {
        emit X.E();
    }
}
```

Now invoking something like `solc --asm .\Test.sol` (not requesting `userdoc` nor `devdoc`), will still throw:

```console
Internal compiler error:
C:\Users\circleci\project\libsolidity\interface\Natspec.cpp(89): Throw in function class Json::Value __cdecl solidity::frontend::Natspec::userDocumentation(const class solidity::frontend::ContractDefinition &)
Dynamic exception type: struct boost::wrapexcept<struct solidity::langutil::InternalCompilerError>
std::exception::what: Solidity assertion failed
[struct solidity::util::tag_comment * __ptr64] = Solidity assertion failed
```

Can you elaborate on what am doing wrong? Version: `Version: 0.8.21+commit.d9974bed.Windows.msvc`
> > Emitting events from other contracts itself works just fine; requesting `--userdoc` or `--devdoc` when you have such events is what causes the ICE. Hope that helps.
> 
> I'm having a hard time to make a contract compile however; let's take the following contract (`Test.sol`):
> 
> ```solidity
> // SPDX-License-Identifier: MIT
> pragma solidity 0.8.21;
> 
> contract X {
>     event E();
> }
> 
> contract C {
>     function g() public {
>         emit X.E();
>     }
> }
> ```
> 
> Now invoking something like `solc --asm .\Test.sol` (not requesting `userdoc` nor `devdoc`), will still throw:
> 
> ```
> Internal compiler error:
> C:\Users\circleci\project\libsolidity\interface\Natspec.cpp(89): Throw in function class Json::Value __cdecl solidity::frontend::Natspec::userDocumentation(const class solidity::frontend::ContractDefinition &)
> Dynamic exception type: struct boost::wrapexcept<struct solidity::langutil::InternalCompilerError>
> std::exception::what: Solidity assertion failed
> [struct solidity::util::tag_comment * __ptr64] = Solidity assertion failed
> ```
> 
> Can you elaborate on what am doing wrong? Version: `Version: 0.8.21+commit.d9974bed.Windows.msvc`

In that case nothing - essentially, any steps that require userdoc or devdoc (asm, metadata, etc.) will indeed fail - I was just commenting in case you just read the issue and didn't try to compile anything. I guess you'll have to wait for the `0.8.22` release like most everyone else :)

Fix patch:
diff --git a/.gas-snapshot b/.gas-snapshot
index 418e89f3..7642a703 100644
--- a/.gas-snapshot
+++ b/.gas-snapshot
@@ -7,9 +7,9 @@ AccessControlTest:testFuzzGrantRoleSuccess(address) (runs: 256, μ: 43947, ~: 43
 AccessControlTest:testFuzzRenounceRoleMultipleTimesSuccess(address) (runs: 256, μ: 45050, ~: 45035)
 AccessControlTest:testFuzzRenounceRoleNonMsgSender(address) (runs: 256, μ: 9678, ~: 9678)
 AccessControlTest:testFuzzRenounceRoleSuccess(address) (runs: 256, μ: 41357, ~: 41342)
-AccessControlTest:testFuzzRevokeRoleMultipleTimesSuccess(address) (runs: 256, μ: 41171, ~: 41156)
+AccessControlTest:testFuzzRevokeRoleMultipleTimesSuccess(address) (runs: 256, μ: 41170, ~: 41156)
 AccessControlTest:testFuzzRevokeRoleNonAdmin(address,address) (runs: 256, μ: 16620, ~: 16620)
-AccessControlTest:testFuzzRevokeRoleSuccess(address) (runs: 256, μ: 39882, ~: 39867)
+AccessControlTest:testFuzzRevokeRoleSuccess(address) (runs: 256, μ: 39881, ~: 39867)
 AccessControlTest:testFuzzSetRoleAdminPreviousAdminCallsGrantRole(address,address) (runs: 256, μ: 76163, ~: 76163)
 AccessControlTest:testFuzzSetRoleAdminPreviousAdminCallsRevokeRole(address,address) (runs: 256, μ: 101836, ~: 101836)
 AccessControlTest:testFuzzSetRoleAdminSuccess(address,address) (runs: 256, μ: 90452, ~: 90452)
@@ -60,8 +60,8 @@ BatchDistributorTest:testDistributeTokenMultipleAddressesSuccess() (gas: 651164)
 BatchDistributorTest:testDistributeTokenOneAddressSuccess() (gas: 613490)
 BatchDistributorTest:testDistributeTokenRevertWithInsufficientAllowance() (gas: 609238)
 BatchDistributorTest:testDistributeTokenRevertWithInsufficientBalance() (gas: 610013)
-BatchDistributorTest:testFuzzDistributeEtherMultipleAddressesSuccess(((address,uint256)[]),uint256) (runs: 256, μ: 1791433, ~: 1662324)
-BatchDistributorTest:testFuzzDistributeTokenMultipleAddressesSuccess(((address,uint256)[]),address,uint256) (runs: 256, μ: 1356829, ~: 1320461)
+BatchDistributorTest:testFuzzDistributeEtherMultipleAddressesSuccess(((address,uint256)[]),uint256) (runs: 256, μ: 1766404, ~: 1660472)
+BatchDistributorTest:testFuzzDistributeTokenMultipleAddressesSuccess(((address,uint256)[]),address,uint256) (runs: 256, μ: 1357871, ~: 1320461)
 Create2AddressTest:testComputeAddress() (gas: 586317)
 Create2AddressTest:testComputeAddressSelf() (gas: 594617)
 Create2AddressTest:testFuzzComputeAddress(bytes32,address) (runs: 256, μ: 586845, ~: 586845)
@@ -87,32 +87,32 @@ CreateAddressTest:testComputeAddressSelfNonceUint56() (gas: 574095)
 CreateAddressTest:testComputeAddressSelfNonceUint64() (gas: 574190)
 CreateAddressTest:testComputeAddressSelfNonceUint8() (gas: 573840)
 CreateAddressTest:testComputeAddressSelfRevertTooHighNonce() (gas: 8799)
-CreateAddressTest:testFuzzComputeAddressNonce0x7f(uint64,address) (runs: 256, μ: 573290, ~: 573443)
-CreateAddressTest:testFuzzComputeAddressNonceUint16(uint64,address) (runs: 256, μ: 572761, ~: 572655)
-CreateAddressTest:testFuzzComputeAddressNonceUint24(uint64,address) (runs: 256, μ: 572899, ~: 573012)
-CreateAddressTest:testFuzzComputeAddressNonceUint32(uint64,address) (runs: 256, μ: 572905, ~: 573041)
+CreateAddressTest:testFuzzComputeAddressNonce0x7f(uint64,address) (runs: 256, μ: 573283, ~: 573443)
+CreateAddressTest:testFuzzComputeAddressNonceUint16(uint64,address) (runs: 256, μ: 572787, ~: 572908)
+CreateAddressTest:testFuzzComputeAddressNonceUint24(uint64,address) (runs: 256, μ: 572904, ~: 573012)
+CreateAddressTest:testFuzzComputeAddressNonceUint32(uint64,address) (runs: 256, μ: 572910, ~: 573041)
 CreateAddressTest:testFuzzComputeAddressNonceUint40(uint64,address) (runs: 256, μ: 573010, ~: 573111)
-CreateAddressTest:testFuzzComputeAddressNonceUint48(uint64,address) (runs: 256, μ: 573017, ~: 573117)
-CreateAddressTest:testFuzzComputeAddressNonceUint56(uint64,address) (runs: 256, μ: 573018, ~: 573124)
-CreateAddressTest:testFuzzComputeAddressNonceUint64(uint64,address) (runs: 256, μ: 573040, ~: 573228)
-CreateAddressTest:testFuzzComputeAddressNonceUint8(uint64,address) (runs: 256, μ: 572784, ~: 572886)
-CreateAddressTest:testFuzzComputeAddressRevertTooHighNonce(uint256,address) (runs: 256, μ: 13337, ~: 13303)
+CreateAddressTest:testFuzzComputeAddressNonceUint48(uint64,address) (runs: 256, μ: 573018, ~: 573117)
+CreateAddressTest:testFuzzComputeAddressNonceUint56(uint64,address) (runs: 256, μ: 573017, ~: 573124)
+CreateAddressTest:testFuzzComputeAddressNonceUint64(uint64,address) (runs: 256, μ: 573015, ~: 573228)
+CreateAddressTest:testFuzzComputeAddressNonceUint8(uint64,address) (runs: 256, μ: 572779, ~: 572886)
+CreateAddressTest:testFuzzComputeAddressRevertTooHighNonce(uint256,address) (runs: 256, μ: 13307, ~: 13303)
 CreateAddressTest:testFuzzComputeAddressSelfNonce0x7f(uint64) (runs: 256, μ: 579131, ~: 579237)
-CreateAddressTest:testFuzzComputeAddressSelfNonceUint16(uint64) (runs: 256, μ: 578424, ~: 578570)
-CreateAddressTest:testFuzzComputeAddressSelfNonceUint24(uint64) (runs: 256, μ: 578742, ~: 578837)
-CreateAddressTest:testFuzzComputeAddressSelfNonceUint32(uint64) (runs: 256, μ: 578735, ~: 578845)
-CreateAddressTest:testFuzzComputeAddressSelfNonceUint40(uint64) (runs: 256, μ: 578832, ~: 578916)
-CreateAddressTest:testFuzzComputeAddressSelfNonceUint48(uint64) (runs: 256, μ: 578791, ~: 578903)
-CreateAddressTest:testFuzzComputeAddressSelfNonceUint56(uint64) (runs: 256, μ: 578877, ~: 578973)
-CreateAddressTest:testFuzzComputeAddressSelfNonceUint64(uint64) (runs: 256, μ: 578923, ~: 579103)
-CreateAddressTest:testFuzzComputeAddressSelfNonceUint8(uint64) (runs: 256, μ: 578454, ~: 578540)
-CreateAddressTest:testFuzzComputeAddressSelfRevertTooHighNonce(uint256) (runs: 256, μ: 13181, ~: 13142)
+CreateAddressTest:testFuzzComputeAddressSelfNonceUint16(uint64) (runs: 256, μ: 578392, ~: 578317)
+CreateAddressTest:testFuzzComputeAddressSelfNonceUint24(uint64) (runs: 256, μ: 578741, ~: 578837)
+CreateAddressTest:testFuzzComputeAddressSelfNonceUint32(uint64) (runs: 256, μ: 578732, ~: 578845)
+CreateAddressTest:testFuzzComputeAddressSelfNonceUint40(uint64) (runs: 256, μ: 578829, ~: 578916)
+CreateAddressTest:testFuzzComputeAddressSelfNonceUint48(uint64) (runs: 256, μ: 578786, ~: 578903)
+CreateAddressTest:testFuzzComputeAddressSelfNonceUint56(uint64) (runs: 256, μ: 578882, ~: 578973)
+CreateAddressTest:testFuzzComputeAddressSelfNonceUint64(uint64) (runs: 256, μ: 578919, ~: 579103)
+CreateAddressTest:testFuzzComputeAddressSelfNonceUint8(uint64) (runs: 256, μ: 578459, ~: 578540)
+CreateAddressTest:testFuzzComputeAddressSelfRevertTooHighNonce(uint256) (runs: 256, μ: 13160, ~: 13142)
 ECDSATest:testEthSignedMessageHash() (gas: 5852)
 ECDSATest:testFuzzEthSignedMessageHash(string) (runs: 256, μ: 6442, ~: 6444)
 ECDSATest:testFuzzRecoverWithInvalidSignature(bytes,string) (runs: 256, μ: 15157, ~: 15158)
 ECDSATest:testFuzzRecoverWithTooLongSignature(bytes,string) (runs: 256, μ: 13118, ~: 13116)
-ECDSATest:testFuzzRecoverWithValidSignature(string,string) (runs: 256, μ: 21732, ~: 21743)
-ECDSATest:testFuzzRecoverWithWrongMessage(string,string,bytes32) (runs: 256, μ: 21725, ~: 21734)
+ECDSATest:testFuzzRecoverWithValidSignature(string,string) (runs: 256, μ: 21736, ~: 21743)
+ECDSATest:testFuzzRecoverWithWrongMessage(string,string,bytes32) (runs: 256, μ: 21720, ~: 21734)
 ECDSATest:testFuzzToDataWithIntendedValidatorHash(address,bytes) (runs: 256, μ: 7368, ~: 7354)
 ECDSATest:testFuzzToDataWithIntendedValidatorHashSelf(bytes) (runs: 256, μ: 9368, ~: 9352)
 ECDSATest:testFuzzToTypedDataHash(string,string) (runs: 256, μ: 7089, ~: 7092)
@@ -132,8 +132,8 @@ ECDSATest:testToTypedDataHash() (gas: 5966)
 EIP712DomainSeparatorTest:testCachedDomainSeparatorV4() (gas: 7635)
 EIP712DomainSeparatorTest:testDomainSeparatorV4() (gas: 11278)
 EIP712DomainSeparatorTest:testEIP712Domain() (gas: 13644)
-EIP712DomainSeparatorTest:testFuzzDomainSeparatorV4(uint8) (runs: 256, μ: 11428, ~: 11453)
-EIP712DomainSeparatorTest:testFuzzEIP712Domain(bytes1,uint8,bytes32,uint256[]) (runs: 256, μ: 19180, ~: 19140)
+EIP712DomainSeparatorTest:testFuzzDomainSeparatorV4(uint8) (runs: 256, μ: 11432, ~: 11453)
+EIP712DomainSeparatorTest:testFuzzEIP712Domain(bytes1,uint8,bytes32,uint256[]) (runs: 256, μ: 19164, ~: 19125)
 EIP712DomainSeparatorTest:testFuzzHashTypedDataV4(address,address,uint256,uint256,uint64) (runs: 256, μ: 7701, ~: 7701)
 EIP712DomainSeparatorTest:testHashTypedDataV4() (gas: 13020)
 ERC1155Invariants:invariantOwner() (runs: 256, calls: 3840, reverts: 3479)
@@ -163,37 +163,37 @@ ERC1155Test:testExistsAfterBatchMint() (gas: 144145)
 ERC1155Test:testExistsAfterSingleBurn() (gas: 130299)
 ERC1155Test:testExistsAfterSingleMint() (gas: 114273)
 ERC1155Test:testExistsBeforeMint() (gas: 7856)
-ERC1155Test:testFuzzBurnBatchSuccess(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 133149, ~: 133149)
+ERC1155Test:testFuzzBurnBatchSuccess(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 133151, ~: 133149)
 ERC1155Test:testFuzzBurnSuccess(address,address,uint256) (runs: 256, μ: 132445, ~: 132445)
 ERC1155Test:testFuzzRenounceOwnershipNonOwner(address) (runs: 256, μ: 14342, ~: 14342)
-ERC1155Test:testFuzzRenounceOwnershipSuccess(address) (runs: 256, μ: 49075, ~: 49059)
+ERC1155Test:testFuzzRenounceOwnershipSuccess(address) (runs: 256, μ: 49074, ~: 49059)
 ERC1155Test:testFuzzSafeBatchTransferFromByApprovedOperator(address,address,address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 226926, ~: 226898)
-ERC1155Test:testFuzzSafeBatchTransferFromEOAReceiver(address,address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 191529, ~: 191533)
-ERC1155Test:testFuzzSafeBatchTransferFromNoData(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 565204, ~: 565204)
-ERC1155Test:testFuzzSafeBatchTransferFromWithData(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 565793, ~: 565361)
-ERC1155Test:testFuzzSafeMintBatchEOAReceiver(address,address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 153006, ~: 152999)
+ERC1155Test:testFuzzSafeBatchTransferFromEOAReceiver(address,address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 191548, ~: 191533)
+ERC1155Test:testFuzzSafeBatchTransferFromNoData(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 565184, ~: 565204)
+ERC1155Test:testFuzzSafeBatchTransferFromWithData(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 565749, ~: 565361)
+ERC1155Test:testFuzzSafeMintBatchEOAReceiver(address,address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 152997, ~: 152999)
 ERC1155Test:testFuzzSafeMintBatchNoData(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 520561, ~: 520561)
 ERC1155Test:testFuzzSafeMintBatchNonMinter(address) (runs: 256, μ: 41288, ~: 41288)
 ERC1155Test:testFuzzSafeMintBatchWithData(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 520980, ~: 520764)
-ERC1155Test:testFuzzSafeMintEOAReceiver(address,address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 146303, ~: 146278)
+ERC1155Test:testFuzzSafeMintEOAReceiver(address,address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 146293, ~: 146278)
 ERC1155Test:testFuzzSafeMintNoData(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 514858, ~: 514858)
 ERC1155Test:testFuzzSafeMintNonMinter(address) (runs: 256, μ: 33742, ~: 33742)
-ERC1155Test:testFuzzSafeMintWithData(address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 516222, ~: 515761)
+ERC1155Test:testFuzzSafeMintWithData(address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 516219, ~: 515761)
 ERC1155Test:testFuzzSafeTransferFromByApprovedOperator(address,address,address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 197042, ~: 196994)
-ERC1155Test:testFuzzSafeTransferFromEOAReceiver(address,address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 161730, ~: 161716)
-ERC1155Test:testFuzzSafeTransferFromNoData(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 596669, ~: 596679)
-ERC1155Test:testFuzzSafeTransferFromWithData(address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 598805, ~: 597987)
+ERC1155Test:testFuzzSafeTransferFromEOAReceiver(address,address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 161749, ~: 161716)
+ERC1155Test:testFuzzSafeTransferFromNoData(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 596679, ~: 596679)
+ERC1155Test:testFuzzSafeTransferFromWithData(address,uint256,uint256,uint256,uint256,bytes) (runs: 256, μ: 598799, ~: 597987)
 ERC1155Test:testFuzzSetApprovalForAllRevoke(address,address) (runs: 256, μ: 31316, ~: 31288)
 ERC1155Test:testFuzzSetApprovalForAllSuccess(address,address) (runs: 256, μ: 44510, ~: 44510)
-ERC1155Test:testFuzzSetMinterNonOwner(address,string) (runs: 256, μ: 16211, ~: 16219)
-ERC1155Test:testFuzzSetMinterSuccess(string) (runs: 256, μ: 34021, ~: 34013)
+ERC1155Test:testFuzzSetMinterNonOwner(address,string) (runs: 256, μ: 16203, ~: 16219)
+ERC1155Test:testFuzzSetMinterSuccess(string) (runs: 256, μ: 34019, ~: 34011)
 ERC1155Test:testFuzzSetUriNonMinter(address) (runs: 256, μ: 14699, ~: 14699)
-ERC1155Test:testFuzzTotalSupplyAfterBatchBurn(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 126976, ~: 126976)
-ERC1155Test:testFuzzTotalSupplyAfterBatchMint(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 141326, ~: 141287)
-ERC1155Test:testFuzzTotalSupplyAfterSingleBurn(address,uint256,bytes) (runs: 256, μ: 130074, ~: 130039)
+ERC1155Test:testFuzzTotalSupplyAfterBatchBurn(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 126978, ~: 126976)
+ERC1155Test:testFuzzTotalSupplyAfterBatchMint(address,uint256,uint256,uint256,uint256) (runs: 256, μ: 141348, ~: 141287)
+ERC1155Test:testFuzzTotalSupplyAfterSingleBurn(address,uint256,bytes) (runs: 256, μ: 130075, ~: 130039)
 ERC1155Test:testFuzzTotalSupplyAfterSingleMint(uint256,uint256,bytes) (runs: 256, μ: 84453, ~: 54991)
 ERC1155Test:testFuzzTransferOwnershipNonOwner(address,address) (runs: 256, μ: 14438, ~: 14438)
-ERC1155Test:testFuzzTransferOwnershipSuccess(address,address) (runs: 256, μ: 74697, ~: 74671)
+ERC1155Test:testFuzzTransferOwnershipSuccess(address,address) (runs: 256, μ: 74699, ~: 74671)
 ERC1155Test:testHasOwner() (gas: 9822)
 ERC1155Test:testInitialSetup() (gas: 2939871)
 ERC1155Test:testRenounceOwnershipNonOwner() (gas: 11283)
@@ -266,8 +266,8 @@ ERC1155Test:testUriBaseAndTokenUriNotSet() (gas: 2897536)
 ERC1155Test:testUriBaseAndTokenUriSet() (gas: 65806)
 ERC1155Test:testUriNoBaseURI() (gas: 2947766)
 ERC1155Test:testUriNoTokenUri() (gas: 17650)
-ERC20Invariants:invariantOwner() (runs: 256, calls: 3840, reverts: 3136)
-ERC20Invariants:invariantTotalSupply() (runs: 256, calls: 3840, reverts: 3136)
+ERC20Invariants:invariantOwner() (runs: 256, calls: 3840, reverts: 3097)
+ERC20Invariants:invariantTotalSupply() (runs: 256, calls: 3840, reverts: 3097)
 ERC20Test:testApproveExceedingBalanceCase1() (gas: 40439)
 ERC20Test:testApproveExceedingBalanceCase2() (gas: 47026)
 ERC20Test:testApproveFromZeroAddress() (gas: 13455)
@@ -298,29 +298,29 @@ ERC20Test:testDecreaseAllowanceToZeroAddress() (gas: 19065)
 ERC20Test:testDomainSeparator() (gas: 11945)
 ERC20Test:testEIP712Domain() (gas: 14645)
 ERC20Test:testFuzzApproveSuccess(address,uint256) (runs: 256, μ: 39782, ~: 40638)
-ERC20Test:testFuzzBurnFromInsufficientAllowance(address,uint256,uint8) (runs: 256, μ: 179476, ~: 179674)
-ERC20Test:testFuzzBurnFromSuccess(address,uint256) (runs: 256, μ: 288490, ~: 289223)
+ERC20Test:testFuzzBurnFromInsufficientAllowance(address,uint256,uint8) (runs: 256, μ: 179366, ~: 179674)
+ERC20Test:testFuzzBurnFromSuccess(address,uint256) (runs: 256, μ: 288622, ~: 289561)
 ERC20Test:testFuzzBurnInvalidAmount(address,uint256) (runs: 256, μ: 16803, ~: 16803)
-ERC20Test:testFuzzBurnSuccessCase(uint256) (runs: 256, μ: 264141, ~: 263942)
-ERC20Test:testFuzzDecreaseAllowanceInvalidAmount(address,uint256,uint256) (runs: 256, μ: 41241, ~: 43029)
+ERC20Test:testFuzzBurnSuccessCase(uint256) (runs: 256, μ: 264146, ~: 263942)
+ERC20Test:testFuzzDecreaseAllowanceInvalidAmount(address,uint256,uint256) (runs: 256, μ: 41396, ~: 43029)
 ERC20Test:testFuzzDecreaseAllowanceSuccess(address,uint256,uint256) (runs: 256, μ: 47365, ~: 47882)
 ERC20Test:testFuzzDomainSeparator(uint8) (runs: 256, μ: 12005, ~: 12026)
-ERC20Test:testFuzzEIP712Domain(bytes1,uint8,bytes32,uint256[]) (runs: 256, μ: 20354, ~: 20317)
-ERC20Test:testFuzzIncreaseAllowanceSuccess(address,uint256) (runs: 256, μ: 44081, ~: 44822)
+ERC20Test:testFuzzEIP712Domain(bytes1,uint8,bytes32,uint256[]) (runs: 256, μ: 20340, ~: 20302)
+ERC20Test:testFuzzIncreaseAllowanceSuccess(address,uint256) (runs: 256, μ: 44245, ~: 44822)
 ERC20Test:testFuzzMintNonMinter(string,uint256) (runs: 256, μ: 13582, ~: 13601)
-ERC20Test:testFuzzMintSuccess(string,uint256) (runs: 256, μ: 55259, ~: 56156)
-ERC20Test:testFuzzPermitInvalid(string,string,uint16) (runs: 256, μ: 46330, ~: 46364)
-ERC20Test:testFuzzPermitSuccess(string,string,uint16) (runs: 256, μ: 71557, ~: 71594)
+ERC20Test:testFuzzMintSuccess(string,uint256) (runs: 256, μ: 55094, ~: 56158)
+ERC20Test:testFuzzPermitInvalid(string,string,uint16) (runs: 256, μ: 46334, ~: 46364)
+ERC20Test:testFuzzPermitSuccess(string,string,uint16) (runs: 256, μ: 71561, ~: 71594)
 ERC20Test:testFuzzRenounceOwnershipNonOwner(address) (runs: 256, μ: 14391, ~: 14391)
-ERC20Test:testFuzzRenounceOwnershipSuccess(address) (runs: 256, μ: 49239, ~: 49225)
-ERC20Test:testFuzzSetMinterNonOwner(address,string) (runs: 256, μ: 16227, ~: 16246)
-ERC20Test:testFuzzSetMinterSuccess(string) (runs: 256, μ: 34237, ~: 34231)
-ERC20Test:testFuzzTransferFromInsufficientAllowance(address,address,uint256,uint8) (runs: 256, μ: 177562, ~: 178093)
-ERC20Test:testFuzzTransferFromSuccess(address,address,uint256) (runs: 256, μ: 205467, ~: 206678)
+ERC20Test:testFuzzRenounceOwnershipSuccess(address) (runs: 256, μ: 49240, ~: 49225)
+ERC20Test:testFuzzSetMinterNonOwner(address,string) (runs: 256, μ: 16230, ~: 16246)
+ERC20Test:testFuzzSetMinterSuccess(string) (runs: 256, μ: 34238, ~: 34232)
+ERC20Test:testFuzzTransferFromInsufficientAllowance(address,address,uint256,uint8) (runs: 256, μ: 177613, ~: 178093)
+ERC20Test:testFuzzTransferFromSuccess(address,address,uint256) (runs: 256, μ: 205845, ~: 206679)
 ERC20Test:testFuzzTransferInvalidAmount(address,address,uint256) (runs: 256, μ: 17061, ~: 17061)
 ERC20Test:testFuzzTransferOwnershipNonOwner(address,address) (runs: 256, μ: 14512, ~: 14512)
-ERC20Test:testFuzzTransferOwnershipSuccess(address,address) (runs: 256, μ: 75285, ~: 75260)
-ERC20Test:testFuzzTransferSuccess(address,uint256) (runs: 256, μ: 177080, ~: 177765)
+ERC20Test:testFuzzTransferOwnershipSuccess(address,address) (runs: 256, μ: 75286, ~: 75259)
+ERC20Test:testFuzzTransferSuccess(address,uint256) (runs: 256, μ: 177080, ~: 177764)
 ERC20Test:testHasOwner() (gas: 9825)
 ERC20Test:testIncreaseAllowanceExceedingBalanceCase1() (gas: 40663)
 ERC20Test:testIncreaseAllowanceExceedingBalanceCase2() (gas: 47486)
@@ -366,18 +366,18 @@ ERC2981Test:testDeleteDefaultRoyaltyNonOwner() (gas: 10604)
 ERC2981Test:testFuzzDeleteDefaultRoyaltyNonOwner(address) (runs: 256, μ: 13338, ~: 13338)
 ERC2981Test:testFuzzRenounceOwnershipNonOwner(address) (runs: 256, μ: 14086, ~: 14086)
 ERC2981Test:testFuzzRenounceOwnershipSuccess(address) (runs: 256, μ: 24807, ~: 24807)
-ERC2981Test:testFuzzResetTokenRoyalty(address,address,uint256,uint256,uint96,uint256) (runs: 256, μ: 93459, ~: 95761)
+ERC2981Test:testFuzzResetTokenRoyalty(address,address,uint256,uint256,uint96,uint256) (runs: 256, μ: 93477, ~: 95764)
 ERC2981Test:testFuzzResetTokenRoyaltyNonOwner(address) (runs: 256, μ: 13347, ~: 13347)
-ERC2981Test:testFuzzRoyaltyInfoDefaultRoyalty(address,uint256,uint256,uint96,uint256) (runs: 256, μ: 78904, ~: 80271)
-ERC2981Test:testFuzzRoyaltyInfoDeleteDefaultRoyalty(address,uint256,uint256,uint96,uint256) (runs: 256, μ: 62619, ~: 63543)
-ERC2981Test:testFuzzRoyaltyInfoSetTokenRoyalty(address,address,uint256,uint256,uint96,uint256) (runs: 256, μ: 119126, ~: 122195)
-ERC2981Test:testFuzzRoyaltyInfoSetTokenRoyaltyUpdate(address,address,uint256,uint256,uint96,uint256) (runs: 256, μ: 162267, ~: 166813)
-ERC2981Test:testFuzzRoyaltyInfoUpdateDefaultRoyalty(address,address,uint256,uint256,uint96,uint256) (runs: 256, μ: 84150, ~: 85882)
+ERC2981Test:testFuzzRoyaltyInfoDefaultRoyalty(address,uint256,uint256,uint96,uint256) (runs: 256, μ: 78909, ~: 80271)
+ERC2981Test:testFuzzRoyaltyInfoDeleteDefaultRoyalty(address,uint256,uint256,uint96,uint256) (runs: 256, μ: 62632, ~: 63565)
+ERC2981Test:testFuzzRoyaltyInfoSetTokenRoyalty(address,address,uint256,uint256,uint96,uint256) (runs: 256, μ: 118978, ~: 122195)
+ERC2981Test:testFuzzRoyaltyInfoSetTokenRoyaltyUpdate(address,address,uint256,uint256,uint96,uint256) (runs: 256, μ: 162042, ~: 166813)
+ERC2981Test:testFuzzRoyaltyInfoUpdateDefaultRoyalty(address,address,uint256,uint256,uint96,uint256) (runs: 256, μ: 83998, ~: 85882)
 ERC2981Test:testFuzzSetDefaultRoyaltyNonOwner(address) (runs: 256, μ: 15534, ~: 15534)
-ERC2981Test:testFuzzSetDefaultRoyaltyTooHighFeeNumerator(uint96) (runs: 256, μ: 21861, ~: 21665)
+ERC2981Test:testFuzzSetDefaultRoyaltyTooHighFeeNumerator(uint96) (runs: 256, μ: 21882, ~: 21665)
 ERC2981Test:testFuzzSetTokenRoyaltyInvalidReceiver(address) (runs: 256, μ: 18725, ~: 18725)
 ERC2981Test:testFuzzSetTokenRoyaltyNonOwner(address) (runs: 256, μ: 15620, ~: 15620)
-ERC2981Test:testFuzzSetTokenRoyaltyTooHighFeeNumerator(uint96) (runs: 256, μ: 21925, ~: 21729)
+ERC2981Test:testFuzzSetTokenRoyaltyTooHighFeeNumerator(uint96) (runs: 256, μ: 21946, ~: 21729)
 ERC2981Test:testFuzzTransferOwnershipNonOwner(address,address) (runs: 256, μ: 14226, ~: 14226)
 ERC2981Test:testFuzzTransferOwnershipSuccess(address,address) (runs: 256, μ: 29773, ~: 29773)
 ERC2981Test:testHasOwner() (gas: 9708)
@@ -405,8 +405,8 @@ ERC2981Test:testSupportsInterfaceSuccessGasCost() (gas: 6361)
 ERC2981Test:testTransferOwnershipNonOwner() (gas: 12750)
 ERC2981Test:testTransferOwnershipSuccess() (gas: 22189)
 ERC2981Test:testTransferOwnershipToZeroAddress() (gas: 15680)
-ERC4626VaultInvariants:invariantTotalAssets() (runs: 256, calls: 3840, reverts: 2979)
-ERC4626VaultInvariants:invariantTotalSupply() (runs: 256, calls: 3840, reverts: 2979)
+ERC4626VaultInvariants:invariantTotalAssets() (runs: 256, calls: 3840, reverts: 2931)
+ERC4626VaultInvariants:invariantTotalSupply() (runs: 256, calls: 3840, reverts: 2931)
 ERC4626VaultTest:testCachedDomainSeparator() (gas: 7981)
 ERC4626VaultTest:testDepositInsufficientAllowance() (gas: 82945)
 ERC4626VaultTest:testDepositWithNoApproval() (gas: 25247)
@@ -417,11 +417,11 @@ ERC4626VaultTest:testEmptyVaultDeposit() (gas: 566240)
 ERC4626VaultTest:testEmptyVaultMint() (gas: 567665)
 ERC4626VaultTest:testEmptyVaultRedeem() (gas: 203519)
 ERC4626VaultTest:testEmptyVaultwithdraw() (gas: 215354)
-ERC4626VaultTest:testFail_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 560302, ~: 562324)
-ERC4626VaultTest:testFail_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 562033, ~: 563958)
-ERC4626VaultTest:testFuzzDomainSeparator(uint8) (runs: 256, μ: 11870, ~: 11892)
-ERC4626VaultTest:testFuzzEIP712Domain(bytes1,uint8,bytes32,uint256[]) (runs: 256, μ: 20036, ~: 19999)
-ERC4626VaultTest:testFuzzPermitInvalid(string,string,uint16) (runs: 256, μ: 45986, ~: 46023)
+ERC4626VaultTest:testFail_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 559929, ~: 562464)
+ERC4626VaultTest:testFail_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 561686, ~: 563958)
+ERC4626VaultTest:testFuzzDomainSeparator(uint8) (runs: 256, μ: 11869, ~: 11892)
+ERC4626VaultTest:testFuzzEIP712Domain(bytes1,uint8,bytes32,uint256[]) (runs: 256, μ: 20031, ~: 19993)
+ERC4626VaultTest:testFuzzPermitInvalid(string,string,uint16) (runs: 256, μ: 45985, ~: 46023)
 ERC4626VaultTest:testFuzzPermitSuccess(string,string,uint16) (runs: 256, μ: 71197, ~: 71238)
 ERC4626VaultTest:testInitialSetup() (gas: 5843513)
 ERC4626VaultTest:testMintWithNoApproval() (gas: 25329)
@@ -441,32 +441,32 @@ ERC4626VaultTest:testVaultInteractionsForSomeoneElse() (gas: 223280)
 ERC4626VaultTest:testWithdrawInsufficientAllowance() (gas: 123421)
 ERC4626VaultTest:testWithdrawInsufficientAssets() (gas: 118716)
 ERC4626VaultTest:testWithdrawWithNoAssets() (gas: 21937)
-ERC4626VaultTest:test_RT_deposit_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 476772, ~: 479337)
-ERC4626VaultTest:test_RT_deposit_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 478500, ~: 481146)
-ERC4626VaultTest:test_RT_mint_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 476621, ~: 479591)
-ERC4626VaultTest:test_RT_mint_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 478611, ~: 481243)
-ERC4626VaultTest:test_RT_redeem_deposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 476797, ~: 479832)
-ERC4626VaultTest:test_RT_redeem_mint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 477566, ~: 480041)
-ERC4626VaultTest:test_RT_withdraw_deposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 478745, ~: 481483)
-ERC4626VaultTest:test_RT_withdraw_mint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 479658, ~: 481502)
-ERC4626VaultTest:test_asset((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 426081, ~: 429661)
-ERC4626VaultTest:test_convertToAssets((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 432800, ~: 435450)
-ERC4626VaultTest:test_convertToShares((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 431820, ~: 435079)
-ERC4626VaultTest:test_deposit((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 473021, ~: 475325)
-ERC4626VaultTest:test_maxDeposit((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 426407, ~: 429986)
-ERC4626VaultTest:test_maxMint((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 426469, ~: 430048)
-ERC4626VaultTest:test_maxRedeem((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 426695, ~: 430273)
-ERC4626VaultTest:test_maxWithdraw((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 428167, ~: 431796)
-ERC4626VaultTest:test_mint((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 473326, ~: 475733)
-ERC4626VaultTest:test_previewDeposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 468877, ~: 471752)
-ERC4626VaultTest:test_previewMint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 469469, ~: 472437)
-ERC4626VaultTest:test_previewRedeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 471181, ~: 474164)
-ERC4626VaultTest:test_previewWithdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 472592, ~: 475424)
-ERC4626VaultTest:test_redeem((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 475788, ~: 478463)
-ERC4626VaultTest:test_totalAssets((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 426934, ~: 430512)
-ERC4626VaultTest:test_withdraw((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 477182, ~: 479732)
-ERC721Invariants:invariantOwner() (runs: 256, calls: 3840, reverts: 3449)
-ERC721Invariants:invariantTotalSupply() (runs: 256, calls: 3840, reverts: 3449)
+ERC4626VaultTest:test_RT_deposit_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 475214, ~: 479432)
+ERC4626VaultTest:test_RT_deposit_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 477004, ~: 480605)
+ERC4626VaultTest:test_RT_mint_redeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 475894, ~: 479672)
+ERC4626VaultTest:test_RT_mint_withdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 477322, ~: 481199)
+ERC4626VaultTest:test_RT_redeem_deposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 476153, ~: 479726)
+ERC4626VaultTest:test_RT_redeem_mint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 476420, ~: 479991)
+ERC4626VaultTest:test_RT_withdraw_deposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 477413, ~: 481449)
+ERC4626VaultTest:test_RT_withdraw_mint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 477790, ~: 481660)
+ERC4626VaultTest:test_asset((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 424709, ~: 429672)
+ERC4626VaultTest:test_convertToAssets((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 432365, ~: 435350)
+ERC4626VaultTest:test_convertToShares((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 431334, ~: 435284)
+ERC4626VaultTest:test_deposit((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 472678, ~: 475329)
+ERC4626VaultTest:test_maxDeposit((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 425035, ~: 429997)
+ERC4626VaultTest:test_maxMint((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 425098, ~: 430060)
+ERC4626VaultTest:test_maxRedeem((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 425324, ~: 430284)
+ERC4626VaultTest:test_maxWithdraw((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 426813, ~: 431735)
+ERC4626VaultTest:test_mint((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 473260, ~: 475735)
+ERC4626VaultTest:test_previewDeposit((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 467414, ~: 471659)
+ERC4626VaultTest:test_previewMint((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 468727, ~: 472078)
+ERC4626VaultTest:test_previewRedeem((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 470893, ~: 474169)
+ERC4626VaultTest:test_previewWithdraw((address[4],uint256[4],uint256[4],int256),uint256) (runs: 256, μ: 474077, ~: 475796)
+ERC4626VaultTest:test_redeem((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 476149, ~: 478475)
+ERC4626VaultTest:test_totalAssets((address[4],uint256[4],uint256[4],int256)) (runs: 256, μ: 425564, ~: 430524)
+ERC4626VaultTest:test_withdraw((address[4],uint256[4],uint256[4],int256),uint256,uint256) (runs: 256, μ: 478287, ~: 480042)
+ERC721Invariants:invariantOwner() (runs: 256, calls: 3840, reverts: 3501)
+ERC721Invariants:invariantTotalSupply() (runs: 256, calls: 3840, reverts: 3501)
 ERC721Test:testApproveClearingApprovalWithNoPriorApproval() (gas: 178025)
 ERC721Test:testApproveClearingApprovalWithPriorApproval() (gas: 186971)
 ERC721Test:testApproveFromApprovedAddress() (gas: 200126)
@@ -486,31 +486,31 @@ ERC721Test:testBurnSuccessViaApproveAndSetApprovalForAll() (gas: 373143)
 ERC721Test:testCachedDomainSeparator() (gas: 8166)
 ERC721Test:testDomainSeparator() (gas: 12015)
 ERC721Test:testEIP712Domain() (gas: 14900)
-ERC721Test:testFuzzApproveClearingApprovalWithNoPriorApproval(address,address) (runs: 256, μ: 197520, ~: 197530)
+ERC721Test:testFuzzApproveClearingApprovalWithNoPriorApproval(address,address) (runs: 256, μ: 197510, ~: 197530)
 ERC721Test:testFuzzApproveClearingApprovalWithPriorApproval(address,address) (runs: 256, μ: 185055, ~: 185055)
 ERC721Test:testFuzzApproveFromNonOwner(address) (runs: 256, μ: 173322, ~: 173322)
 ERC721Test:testFuzzApproveFromOperatorAddress(address,address,address) (runs: 256, μ: 223971, ~: 223971)
-ERC721Test:testFuzzApproveWithNoPriorApproval(address,address) (runs: 256, μ: 197520, ~: 197530)
-ERC721Test:testFuzzApproveWithPriorApproval(address,address) (runs: 256, μ: 204902, ~: 204912)
-ERC721Test:testFuzzBurnSuccess(address) (runs: 256, μ: 306762, ~: 306747)
-ERC721Test:testFuzzDomainSeparator(uint8) (runs: 256, μ: 12117, ~: 12140)
-ERC721Test:testFuzzEIP712Domain(bytes1,uint8,bytes32,uint256[]) (runs: 256, μ: 20598, ~: 20559)
-ERC721Test:testFuzzGetApprovedApprovedTokenId(address,address) (runs: 256, μ: 195084, ~: 195094)
-ERC721Test:testFuzzPermitInvalid(string,string,uint16) (runs: 256, μ: 203394, ~: 203429)
-ERC721Test:testFuzzPermitSuccess(string,string,uint16) (runs: 256, μ: 229348, ~: 229375)
+ERC721Test:testFuzzApproveWithNoPriorApproval(address,address) (runs: 256, μ: 197510, ~: 197530)
+ERC721Test:testFuzzApproveWithPriorApproval(address,address) (runs: 256, μ: 204892, ~: 204912)
+ERC721Test:testFuzzBurnSuccess(address) (runs: 256, μ: 306754, ~: 306747)
+ERC721Test:testFuzzDomainSeparator(uint8) (runs: 256, μ: 12119, ~: 12140)
+ERC721Test:testFuzzEIP712Domain(bytes1,uint8,bytes32,uint256[]) (runs: 256, μ: 20588, ~: 20553)
+ERC721Test:testFuzzGetApprovedApprovedTokenId(address,address) (runs: 256, μ: 195074, ~: 195094)
+ERC721Test:testFuzzPermitInvalid(string,string,uint16) (runs: 256, μ: 203396, ~: 203429)
+ERC721Test:testFuzzPermitSuccess(string,string,uint16) (runs: 256, μ: 229342, ~: 229375)
 ERC721Test:testFuzzRenounceOwnershipNonOwner(address) (runs: 256, μ: 14549, ~: 14549)
 ERC721Test:testFuzzRenounceOwnershipSuccess(address) (runs: 256, μ: 49371, ~: 49356)
 ERC721Test:testFuzzSafeMintNonMinter(address) (runs: 256, μ: 16303, ~: 16303)
-ERC721Test:testFuzzSafeMintSuccess(address[]) (runs: 256, μ: 21654086, ~: 21937284)
-ERC721Test:testFuzzSafeTransferFromWithData(address,address,address,bytes) (runs: 256, μ: 1418150, ~: 1414969)
+ERC721Test:testFuzzSafeMintSuccess(address[]) (runs: 256, μ: 21568763, ~: 21937284)
+ERC721Test:testFuzzSafeTransferFromWithData(address,address,address,bytes) (runs: 256, μ: 1418294, ~: 1419334)
 ERC721Test:testFuzzSetApprovalForAllSuccess(address,address) (runs: 256, μ: 190169, ~: 190169)
-ERC721Test:testFuzzSetMinterNonOwner(address,string) (runs: 256, μ: 16321, ~: 16338)
-ERC721Test:testFuzzSetMinterSuccess(string) (runs: 256, μ: 34384, ~: 34377)
-ERC721Test:testFuzzTokenByIndex(address,string[]) (runs: 256, μ: 24563809, ~: 25280842)
-ERC721Test:testFuzzTotalSupply(address,string[]) (runs: 256, μ: 24375785, ~: 25088903)
-ERC721Test:testFuzzTransferFrom(address,address,address) (runs: 256, μ: 561242, ~: 561226)
+ERC721Test:testFuzzSetMinterNonOwner(address,string) (runs: 256, μ: 16322, ~: 16338)
+ERC721Test:testFuzzSetMinterSuccess(string) (runs: 256, μ: 34379, ~: 34373)
+ERC721Test:testFuzzTokenByIndex(address,string[]) (runs: 256, μ: 24488440, ~: 25225430)
+ERC721Test:testFuzzTotalSupply(address,string[]) (runs: 256, μ: 24300942, ~: 25033491)
+ERC721Test:testFuzzTransferFrom(address,address,address) (runs: 256, μ: 561244, ~: 561226)
 ERC721Test:testFuzzTransferOwnershipNonOwner(address,address) (runs: 256, μ: 14626, ~: 14626)
-ERC721Test:testFuzzTransferOwnershipSuccess(address,address) (runs: 256, μ: 75543, ~: 75518)
+ERC721Test:testFuzzTransferOwnershipSuccess(address,address) (runs: 256, μ: 75544, ~: 75518)
 ERC721Test:testGetApprovedApprovedTokenId() (gas: 194996)
 ERC721Test:testGetApprovedInvalidTokenId() (gas: 11379)
 ERC721Test:testGetApprovedNotApprovedTokenId() (gas: 171352)
@@ -573,19 +573,19 @@ ERC721Test:testTransferOwnershipToZeroAddress() (gas: 16166)
 MathTest:testCbrtRoundDown() (gas: 44669)
 MathTest:testCbrtRoundUp() (gas: 45449)
 MathTest:testCeilDiv() (gas: 12699)
-MathTest:testFuzzCbrt(uint256,bool) (runs: 256, μ: 19538, ~: 19295)
+MathTest:testFuzzCbrt(uint256,bool) (runs: 256, μ: 19553, ~: 19438)
 MathTest:testFuzzCeilDiv(uint256,uint256) (runs: 256, μ: 9013, ~: 9030)
 MathTest:testFuzzInt256Average(int256,int256) (runs: 256, μ: 5578, ~: 5578)
 MathTest:testFuzzIsNegative(int256) (runs: 256, μ: 5698, ~: 5698)
-MathTest:testFuzzLog10(uint256,bool) (runs: 256, μ: 7188, ~: 7405)
+MathTest:testFuzzLog10(uint256,bool) (runs: 256, μ: 7187, ~: 7405)
 MathTest:testFuzzLog2(uint256,bool) (runs: 256, μ: 7018, ~: 7162)
-MathTest:testFuzzLog256(uint256,bool) (runs: 256, μ: 7101, ~: 7347)
-MathTest:testFuzzMulDiv(uint256,uint256,uint256) (runs: 256, μ: 13021, ~: 12773)
-MathTest:testFuzzMulDivDomain(uint256,uint256,uint256) (runs: 256, μ: 10634, ~: 10710)
+MathTest:testFuzzLog256(uint256,bool) (runs: 256, μ: 7107, ~: 7347)
+MathTest:testFuzzMulDiv(uint256,uint256,uint256) (runs: 256, μ: 13030, ~: 12773)
+MathTest:testFuzzMulDivDomain(uint256,uint256,uint256) (runs: 256, μ: 10633, ~: 10710)
 MathTest:testFuzzUint256Average(uint256,uint256) (runs: 256, μ: 5768, ~: 5768)
-MathTest:testFuzzWadCbrt(uint256) (runs: 256, μ: 19218, ~: 18880)
-MathTest:testFuzzWadExp(int256) (runs: 256, μ: 15389, ~: 15457)
-MathTest:testFuzzWadLn(int256) (runs: 256, μ: 16905, ~: 16699)
+MathTest:testFuzzWadCbrt(uint256) (runs: 256, μ: 19225, ~: 18943)
+MathTest:testFuzzWadExp(int256) (runs: 256, μ: 15388, ~: 15457)
+MathTest:testFuzzWadLn(int256) (runs: 256, μ: 16906, ~: 16707)
 MathTest:testInt256Average() (gas: 11958)
 MathTest:testIsNegative() (gas: 10644)
 MathTest:testLog10RoundDown() (gas: 19280)
@@ -606,9 +606,9 @@ MathTest:testWadExp() (gas: 26657)
 MathTest:testWadExpOverflow() (gas: 10670)
 MathTest:testWadLn() (gas: 25780)
 MathTest:testWadLnNegativeValues() (gas: 10559)
-MerkleProofVerificationTest:testFuzzMultiProofVerifySingleLeaf(bytes32[],uint256) (runs: 256, μ: 1649976911, ~: 1649973728)
-MerkleProofVerificationTest:testFuzzVerify(bytes32[],uint256) (runs: 256, μ: 135975593, ~: 135972380)
-MerkleProofVerificationTest:testFuzzVerifyMultiProofMultipleLeaves(bool,bool,bool) (runs: 256, μ: 412472432, ~: 412472367)
+MerkleProofVerificationTest:testFuzzMultiProofVerifySingleLeaf(bytes32[],uint256) (runs: 256, μ: 1649976271, ~: 1649972661)
+MerkleProofVerificationTest:testFuzzVerify(bytes32[],uint256) (runs: 256, μ: 135974847, ~: 135971313)
+MerkleProofVerificationTest:testFuzzVerifyMultiProofMultipleLeaves(bool,bool,bool) (runs: 256, μ: 412472433, ~: 412472367)
 MerkleProofVerificationTest:testInvalidMerkleMultiProof() (gas: 412478445)
 MerkleProofVerificationTest:testInvalidMerkleProof() (gas: 33970386)
 MerkleProofVerificationTest:testInvalidMerkleProofLength() (gas: 33972544)
@@ -635,10 +635,10 @@ Ownable2StepInvariants:invariantPendingOwner() (runs: 256, calls: 3840, reverts:
 Ownable2StepTest:testAcceptOwnershipNonPendingOwner() (gas: 46640)
 Ownable2StepTest:testAcceptOwnershipSuccess() (gas: 39408)
 Ownable2StepTest:testFuzzAcceptOwnershipNonPendingOwner(address) (runs: 256, μ: 45872, ~: 45872)
-Ownable2StepTest:testFuzzAcceptOwnershipSuccess(address,address) (runs: 256, μ: 65122, ~: 65097)
-Ownable2StepTest:testFuzzPendingOwnerResetAfterRenounceOwnership(address) (runs: 256, μ: 38769, ~: 38754)
+Ownable2StepTest:testFuzzAcceptOwnershipSuccess(address,address) (runs: 256, μ: 65124, ~: 65097)
+Ownable2StepTest:testFuzzPendingOwnerResetAfterRenounceOwnership(address) (runs: 256, μ: 38770, ~: 38754)
 Ownable2StepTest:testFuzzRenounceOwnershipNonOwner(address) (runs: 256, μ: 13996, ~: 13996)
-Ownable2StepTest:testFuzzRenounceOwnershipSuccess(address) (runs: 256, μ: 43699, ~: 43684)
+Ownable2StepTest:testFuzzRenounceOwnershipSuccess(address) (runs: 256, μ: 43700, ~: 43684)
 Ownable2StepTest:testFuzzTransferOwnershipNonOwner(address,address) (runs: 256, μ: 14135, ~: 14135)
 Ownable2StepTest:testFuzzTransferOwnershipSuccess(address,address) (runs: 256, μ: 50445, ~: 50445)
 Ownable2StepTest:testHasOwner() (gas: 9641)
@@ -661,7 +661,7 @@ OwnableTest:testTransferOwnershipNonOwner() (gas: 12545)
 OwnableTest:testTransferOwnershipSuccess() (gas: 22005)
 OwnableTest:testTransferOwnershipToZeroAddress() (gas: 15519)
 SignatureCheckerTest:testEIP1271NoIsValidSignatureFunction() (gas: 22866)
-SignatureCheckerTest:testEIP1271WithInvalidSignature(bytes,string) (runs: 256, μ: 23588, ~: 23581)
+SignatureCheckerTest:testEIP1271WithInvalidSignature(bytes,string) (runs: 256, μ: 23589, ~: 23581)
 SignatureCheckerTest:testEIP1271WithInvalidSignature1() (gas: 33916)
 SignatureCheckerTest:testEIP1271WithInvalidSignature2() (gas: 28987)
 SignatureCheckerTest:testEIP1271WithInvalidSigner() (gas: 33994)
@@ -672,8 +672,8 @@ SignatureCheckerTest:testEOAWithInvalidSignature2() (gas: 20268)
 SignatureCheckerTest:testEOAWithInvalidSigner() (gas: 20501)
 SignatureCheckerTest:testEOAWithTooHighSValue() (gas: 17257)
 SignatureCheckerTest:testEOAWithValidSignature() (gas: 19600)
-SignatureCheckerTest:testFuzzEIP1271WithInvalidSigner(string,string) (runs: 256, μ: 35942, ~: 35950)
+SignatureCheckerTest:testFuzzEIP1271WithInvalidSigner(string,string) (runs: 256, μ: 35943, ~: 35950)
 SignatureCheckerTest:testFuzzEIP1271WithValidSignature(string) (runs: 256, μ: 34486, ~: 34488)
 SignatureCheckerTest:testFuzzEOAWithInvalidSignature(bytes,string) (runs: 256, μ: 16905, ~: 16900)
-SignatureCheckerTest:testFuzzEOAWithInvalidSigner(string,string) (runs: 256, μ: 21567, ~: 21581)
-SignatureCheckerTest:testFuzzEOAWithValidSignature(string,string) (runs: 256, μ: 20682, ~: 20696)
\ No newline at end of file
+SignatureCheckerTest:testFuzzEOAWithInvalidSigner(string,string) (runs: 256, μ: 21576, ~: 21581)
+SignatureCheckerTest:testFuzzEOAWithValidSignature(string,string) (runs: 256, μ: 20691, ~: 20696)
\ No newline at end of file
diff --git a/lib/create-util b/lib/create-util
index 719000d0..d9eb4843 160000
--- a/lib/create-util
+++ b/lib/create-util
@@ -1,1 +1,1 @@
-Subproject commit 719000d081f7fb234340c33f6ffef1831e1aa63e
+Subproject commit d9eb4843208bd1bebf49c4abb12d4a6d4fe76849
diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts
index f347b410..19293f3e 160000
--- a/lib/openzeppelin-contracts
+++ b/lib/openzeppelin-contracts
@@ -1,1 +1,1 @@
-Subproject commit f347b410cf6aeeaaf5197e1fece139c793c03b2b
+Subproject commit 19293f3ecdb20a7f44d54279b5c1ddbb84de4a2e
diff --git a/lib/solady b/lib/solady
index dac54a8b..30558f54 160000
--- a/lib/solady
+++ b/lib/solady
@@ -1,1 +1,1 @@
-Subproject commit dac54a8b24a2e6f598813a613bb3a272ea6dd4f3
+Subproject commit 30558f5402f02351b96eeb6eaf32bcea29773841
diff --git a/lib/utils/VyperDeployer.sol b/lib/utils/VyperDeployer.sol
index 8ce51370..be138c33 100644
--- a/lib/utils/VyperDeployer.sol
+++ b/lib/utils/VyperDeployer.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.21;
 
 import {Create} from "create-util/Create.sol";
 


Test patch:
diff --git a/test/auth/AccessControl.t.sol b/test/auth/AccessControl.t.sol
index e92359d4..654e2917 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.20;
+pragma solidity ^0.8.21;
 
 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 fb8f7162..82b573c2 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.20;
+pragma solidity ^0.8.21;
 
 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 b420a165..368df9e7 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.20;
+pragma solidity ^0.8.21;
 
 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 f81b6613..8066a8c1 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.20;
+pragma solidity ^0.8.21;
 
 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 d51ef56f..e965e36e 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.20;
+pragma solidity ^0.8.21;
 
 interface IOwnable {
     function owner() external view returns (address);
diff --git a/test/auth/interfaces/IOwnable2Step.sol b/test/auth/interfaces/IOwnable2Step.sol
index 044c39a2..b7c68c48 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.20;
+pragma solidity ^0.8.21;
 
 interface IOwnable2Step {
     function owner() external view returns (address);
diff --git a/test/extensions/ERC2981.t.sol b/test/extensions/ERC2981.t.sol
index 7af2309c..47d7dd33 100644
--- a/test/extensions/ERC2981.t.sol
+++ b/test/extensions/ERC2981.t.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.21;
 
 import {Test} from "forge-std/Test.sol";
 import {VyperDeployer} from "utils/VyperDeployer.sol";
diff --git a/test/extensions/ERC4626.t.sol b/test/extensions/ERC4626.t.sol
index 3e527f3f..0e1f58b4 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.20;
+pragma solidity ^0.8.21;
 
 import {Test} from "forge-std/Test.sol";
 import {ERC4626Test} from "erc4626-tests/ERC4626.test.sol";
diff --git a/test/extensions/interfaces/IERC2981Extended.sol b/test/extensions/interfaces/IERC2981Extended.sol
index 0ae0fb31..dc080f97 100644
--- a/test/extensions/interfaces/IERC2981Extended.sol
+++ b/test/extensions/interfaces/IERC2981Extended.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: WTFPL
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.21;
 
 import {IERC2981} from "openzeppelin/interfaces/IERC2981.sol";
 
diff --git a/test/extensions/interfaces/IERC4626Extended.sol b/test/extensions/interfaces/IERC4626Extended.sol
index 9feaa859..e7470484 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.20;
+pragma solidity ^0.8.21;
 
 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 daeddaed..26351909 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.20;
+pragma solidity ^0.8.21;
 
 /**
  * @title ERC20ExcessDecimalsMock
diff --git a/test/tokens/ERC1155.t.sol b/test/tokens/ERC1155.t.sol
index 7bd85ddc..379a37f5 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.20;
+pragma solidity ^0.8.21;
 
 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 8c482f3f..6f64e119 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.20;
+pragma solidity ^0.8.21;
 
 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 4207a98b..3a86b011 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.20;
+pragma solidity ^0.8.21;
 
 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 6d424fc8..5caefbe7 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.20;
+pragma solidity ^0.8.21;
 
 import {IERC1155MetadataURI} from "openzeppelin/token/ERC1155/extensions/IERC1155MetadataURI.sol";
 
diff --git a/test/tokens/interfaces/IERC20Extended.sol b/test/tokens/interfaces/IERC20Extended.sol
index d604a9f8..99058581 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.20;
+pragma solidity ^0.8.21;
 
 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 52466374..5e387782 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.20;
+pragma solidity ^0.8.21;
 
 import {IERC165} from "openzeppelin/utils/introspection/IERC165.sol";
 
diff --git a/test/tokens/interfaces/IERC721Extended.sol b/test/tokens/interfaces/IERC721Extended.sol
index c3dd4f95..a5fe9409 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.20;
+pragma solidity ^0.8.21;
 
 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 82a2bcc7..25d12c8c 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.20;
+pragma solidity ^0.8.21;
 
 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 686c2a16..c607464e 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.20;
+pragma solidity ^0.8.21;
 
 import {IERC721Receiver} from "openzeppelin/token/ERC721/IERC721Receiver.sol";
 
diff --git a/test/utils/Base64.t.sol b/test/utils/Base64.t.sol
index 3daa615f..94769fd5 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.20;
+pragma solidity ^0.8.21;
 
 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 b0d8ae4f..386d7ce7 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.20;
+pragma solidity ^0.8.21;
 
 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 ee78c575..deed47d1 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.20;
+pragma solidity ^0.8.21;
 
 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 8fdd99c1..d94bc419 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.20;
+pragma solidity ^0.8.21;
 
 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 91d5c4e0..c7e740f3 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.20;
+pragma solidity ^0.8.21;
 
 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 0e59acce..d04d6b95 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.20;
+pragma solidity ^0.8.21;
 
 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 0bf2a789..6b27b85c 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.20;
+pragma solidity ^0.8.21;
 
 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 5f80fb09..d9937e08 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.20;
+pragma solidity ^0.8.21;
 
 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 a5e5b8de..c7bacab7 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.20;
+pragma solidity ^0.8.21;
 
 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 12c8f82c..75d867a9 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.20;
+pragma solidity ^0.8.21;
 
 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 7af0159d..e6e8c06b 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.20;
+pragma solidity ^0.8.21;
 
 interface IBase64 {
     function encode(
diff --git a/test/utils/interfaces/IBatchDistributor.sol b/test/utils/interfaces/IBatchDistributor.sol
index 843cb410..7da0f349 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.20;
+pragma solidity ^0.8.21;
 
 import {IERC20} from "openzeppelin/token/ERC20/IERC20.sol";
 
diff --git a/test/utils/interfaces/ICreate2Address.sol b/test/utils/interfaces/ICreate2Address.sol
index 45e4cc35..4ee19fca 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.20;
+pragma solidity ^0.8.21;
 
 interface ICreate2Address {
     function compute_address_self(
diff --git a/test/utils/interfaces/ICreateAddress.sol b/test/utils/interfaces/ICreateAddress.sol
index 6100cf46..6996301f 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.20;
+pragma solidity ^0.8.21;
 
 interface ICreateAddress {
     function compute_address_rlp_self(
diff --git a/test/utils/interfaces/IECDSA.sol b/test/utils/interfaces/IECDSA.sol
index 0f0cd856..9556a836 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.20;
+pragma solidity ^0.8.21;
 
 interface IECDSA {
     function recover_sig(
diff --git a/test/utils/interfaces/IEIP712DomainSeparator.sol b/test/utils/interfaces/IEIP712DomainSeparator.sol
index e0650ba4..8a6940f8 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.20;
+pragma solidity ^0.8.21;
 
 import {IERC5267} from "openzeppelin/interfaces/IERC5267.sol";
 
diff --git a/test/utils/interfaces/IMath.sol b/test/utils/interfaces/IMath.sol
index d795ebe6..601aae66 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.20;
+pragma solidity ^0.8.21;
 
 interface IMath {
     function uint256_average(
diff --git a/test/utils/interfaces/IMerkleProofVerification.sol b/test/utils/interfaces/IMerkleProofVerification.sol
index 48760fe0..faa9c3bd 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.20;
+pragma solidity ^0.8.21;
 
 interface IMerkleProofVerification {
     function verify(
diff --git a/test/utils/interfaces/IMulticall.sol b/test/utils/interfaces/IMulticall.sol
index 34f92a97..eb02c62b 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.20;
+pragma solidity ^0.8.21;
 
 interface IMulticall {
     struct Batch {
diff --git a/test/utils/interfaces/ISignatureChecker.sol b/test/utils/interfaces/ISignatureChecker.sol
index c1e35324..dca12dfd 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.20;
+pragma solidity ^0.8.21;
 
 interface ISignatureChecker {
     function is_valid_signature_now(
diff --git a/test/utils/mocks/Create2Impl.sol b/test/utils/mocks/Create2Impl.sol
index dcc2a9f0..62fc25ba 100644
--- a/test/utils/mocks/Create2Impl.sol
+++ b/test/utils/mocks/Create2Impl.sol
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.21;
 
 import {Create2} from "openzeppelin/utils/Create2.sol";
 
diff --git a/test/utils/mocks/ERC1271MaliciousMock.sol b/test/utils/mocks/ERC1271MaliciousMock.sol
index 9dcca025..707d4f04 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.20;
+pragma solidity ^0.8.21;
 
 import {IERC1271} from "openzeppelin/interfaces/IERC1271.sol";
 
diff --git a/test/utils/mocks/ERC1271WalletMock.sol b/test/utils/mocks/ERC1271WalletMock.sol
index 9937cfb5..1278486d 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.20;
+pragma solidity ^0.8.21;
 
 import {Ownable} from "openzeppelin/access/Ownable.sol";
 import {IERC1271} from "openzeppelin/interfaces/IERC1271.sol";
diff --git a/test/utils/mocks/ERC20Mock.sol b/test/utils/mocks/ERC20Mock.sol
index 87fce60a..9a1919f2 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.20;
+pragma solidity ^0.8.21;
 
 import {ERC20} from "openzeppelin/token/ERC20/ERC20.sol";
 
diff --git a/test/utils/mocks/EtherReceiver.sol b/test/utils/mocks/EtherReceiver.sol
index 70ee948a..5ec61be5 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.20;
+pragma solidity ^0.8.21;
 
 /**
  * @title EtherReceiver
diff --git a/test/utils/mocks/MockCallee.sol b/test/utils/mocks/MockCallee.sol
index cd5fddda..92789480 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.20;
+pragma solidity ^0.8.21;
 
 /**
  * @dev Error that occurs when a method reverts.