diff --git a/.gas-snapshot b/.gas-snapshot index 163409a7..641515ba 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -28,11 +28,11 @@ AuthTest:testTransferOwnershipWithPermissiveAuthority(address,address) (runs: 25 Bytes32AddressLibTest:testFillLast12Bytes() (gas: 223) Bytes32AddressLibTest:testFromLast20Bytes() (gas: 191) CREATE3Test:testDeployERC20() (gas: 853111) -CREATE3Test:testDeployERC20(bytes32,string,string,uint8) (runs: 256, μ: 922796, ~: 921961) +CREATE3Test:testDeployERC20(bytes32,string,string,uint8) (runs: 256, μ: 923654, ~: 921961) CREATE3Test:testFailDoubleDeployDifferentBytecode() (gas: 9079256848778914174) CREATE3Test:testFailDoubleDeployDifferentBytecode(bytes32,bytes,bytes) (runs: 256, μ: 5062195514745832485, ~: 8937393460516727435) CREATE3Test:testFailDoubleDeploySameBytecode() (gas: 9079256848778906218) -CREATE3Test:testFailDoubleDeploySameBytecode(bytes32,bytes) (runs: 256, μ: 5027837975401088878, ~: 8937393460516728677) +CREATE3Test:testFailDoubleDeploySameBytecode(bytes32,bytes) (runs: 256, μ: 5027837975401088877, ~: 8937393460516728677) DSTestPlusTest:testBound() (gas: 14214) DSTestPlusTest:testBound(uint256,uint256,uint256) (runs: 256, μ: 2787, ~: 2793) DSTestPlusTest:testBrutalizeMemory() (gas: 823) @@ -42,29 +42,29 @@ DSTestPlusTest:testRelApproxEqBothZeroesPasses() (gas: 425) ERC1155Test:testApproveAll() (gas: 31009) ERC1155Test:testApproveAll(address,bool) (runs: 256, μ: 16872, ~: 11440) ERC1155Test:testBatchBalanceOf() (gas: 157631) -ERC1155Test:testBatchBalanceOf(address[],uint256[],uint256[],bytes) (runs: 256, μ: 3308092, ~: 2596398) +ERC1155Test:testBatchBalanceOf(address[],uint256[],uint256[],bytes) (runs: 256, μ: 3307946, ~: 2596398) ERC1155Test:testBatchBurn() (gas: 151074) -ERC1155Test:testBatchBurn(address,uint256[],uint256[],uint256[],bytes) (runs: 256, μ: 3428615, ~: 3058687) +ERC1155Test:testBatchBurn(address,uint256[],uint256[],uint256[],bytes) (runs: 256, μ: 3425444, ~: 3021348) ERC1155Test:testBatchMintToEOA() (gas: 137337) -ERC1155Test:testBatchMintToEOA(address,uint256[],uint256[],bytes) (runs: 256, μ: 3262419, ~: 2941772) +ERC1155Test:testBatchMintToEOA(address,uint256[],uint256[],bytes) (runs: 256, μ: 3261893, ~: 2923515) ERC1155Test:testBatchMintToERC1155Recipient() (gas: 995703) -ERC1155Test:testBatchMintToERC1155Recipient(uint256[],uint256[],bytes) (runs: 256, μ: 7333548, ~: 6374521) +ERC1155Test:testBatchMintToERC1155Recipient(uint256[],uint256[],bytes) (runs: 256, μ: 7336290, ~: 6396323) ERC1155Test:testBurn() (gas: 38598) -ERC1155Test:testBurn(address,uint256,uint256,bytes,uint256) (runs: 256, μ: 40171, ~: 42098) +ERC1155Test:testBurn(address,uint256,uint256,bytes,uint256) (runs: 256, μ: 40221, ~: 42098) ERC1155Test:testFailBalanceOfBatchWithArrayMismatch() (gas: 7933) ERC1155Test:testFailBalanceOfBatchWithArrayMismatch(address[],uint256[]) (runs: 256, μ: 53386, ~: 54066) ERC1155Test:testFailBatchBurnInsufficientBalance() (gas: 136156) -ERC1155Test:testFailBatchBurnInsufficientBalance(address,uint256[],uint256[],uint256[],bytes) (runs: 256, μ: 1280769, ~: 440335) +ERC1155Test:testFailBatchBurnInsufficientBalance(address,uint256[],uint256[],uint256[],bytes) (runs: 256, μ: 1278568, ~: 440335) ERC1155Test:testFailBatchBurnWithArrayLengthMismatch() (gas: 135542) ERC1155Test:testFailBatchBurnWithArrayLengthMismatch(address,uint256[],uint256[],uint256[],bytes) (runs: 256, μ: 77137, ~: 78751) ERC1155Test:testFailBatchMintToNonERC1155Recipient() (gas: 167292) -ERC1155Test:testFailBatchMintToNonERC1155Recipient(uint256[],uint256[],bytes) (runs: 256, μ: 3129225, ~: 2673077) +ERC1155Test:testFailBatchMintToNonERC1155Recipient(uint256[],uint256[],bytes) (runs: 256, μ: 3131966, ~: 2673077) ERC1155Test:testFailBatchMintToRevertingERC1155Recipient() (gas: 358811) -ERC1155Test:testFailBatchMintToRevertingERC1155Recipient(uint256[],uint256[],bytes) (runs: 256, μ: 3320763, ~: 2864613) +ERC1155Test:testFailBatchMintToRevertingERC1155Recipient(uint256[],uint256[],bytes) (runs: 256, μ: 3323504, ~: 2864613) ERC1155Test:testFailBatchMintToWrongReturnDataERC1155Recipient() (gas: 310743) -ERC1155Test:testFailBatchMintToWrongReturnDataERC1155Recipient(uint256[],uint256[],bytes) (runs: 256, μ: 3272721, ~: 2816572) +ERC1155Test:testFailBatchMintToWrongReturnDataERC1155Recipient(uint256[],uint256[],bytes) (runs: 256, μ: 3275462, ~: 2816572) ERC1155Test:testFailBatchMintToZero() (gas: 131737) -ERC1155Test:testFailBatchMintToZero(uint256[],uint256[],bytes) (runs: 256, μ: 3069725, ~: 2612336) +ERC1155Test:testFailBatchMintToZero(uint256[],uint256[],bytes) (runs: 256, μ: 3072466, ~: 2612336) ERC1155Test:testFailBatchMintWithArrayMismatch() (gas: 9600) ERC1155Test:testFailBatchMintWithArrayMismatch(address,uint256[],uint256[],bytes) (runs: 256, μ: 69252, ~: 68809) ERC1155Test:testFailBurnInsufficientBalance() (gas: 34852) @@ -78,17 +78,17 @@ ERC1155Test:testFailMintToWrongReturnDataERC155Recipient(uint256,uint256,bytes) ERC1155Test:testFailMintToZero() (gas: 33705) ERC1155Test:testFailMintToZero(uint256,uint256,bytes) (runs: 256, μ: 33815, ~: 34546) ERC1155Test:testFailSafeBatchTransferFromToNonERC1155Recipient() (gas: 321377) -ERC1155Test:testFailSafeBatchTransferFromToNonERC1155Recipient(uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 3495098, ~: 2963551) +ERC1155Test:testFailSafeBatchTransferFromToNonERC1155Recipient(uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 3490437, ~: 2963551) ERC1155Test:testFailSafeBatchTransferFromToRevertingERC1155Recipient() (gas: 512956) -ERC1155Test:testFailSafeBatchTransferFromToRevertingERC1155Recipient(uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 3686635, ~: 3155082) +ERC1155Test:testFailSafeBatchTransferFromToRevertingERC1155Recipient(uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 3681974, ~: 3155082) ERC1155Test:testFailSafeBatchTransferFromToWrongReturnDataERC1155Recipient() (gas: 464847) -ERC1155Test:testFailSafeBatchTransferFromToWrongReturnDataERC1155Recipient(uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 3638552, ~: 3107003) +ERC1155Test:testFailSafeBatchTransferFromToWrongReturnDataERC1155Recipient(uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 3633892, ~: 3107003) ERC1155Test:testFailSafeBatchTransferFromToZero() (gas: 286556) -ERC1155Test:testFailSafeBatchTransferFromToZero(uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 3459918, ~: 2928396) +ERC1155Test:testFailSafeBatchTransferFromToZero(uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 3455257, ~: 2928396) ERC1155Test:testFailSafeBatchTransferFromWithArrayLengthMismatch() (gas: 162674) ERC1155Test:testFailSafeBatchTransferFromWithArrayLengthMismatch(address,uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 81184, ~: 82042) ERC1155Test:testFailSafeBatchTransferInsufficientBalance() (gas: 163555) -ERC1155Test:testFailSafeBatchTransferInsufficientBalance(address,uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 1498337, ~: 499517) +ERC1155Test:testFailSafeBatchTransferInsufficientBalance(address,uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 1497154, ~: 499517) ERC1155Test:testFailSafeTransferFromInsufficientBalance() (gas: 63245) ERC1155Test:testFailSafeTransferFromInsufficientBalance(address,uint256,uint256,uint256,bytes,bytes) (runs: 256, μ: 63986, ~: 67405) ERC1155Test:testFailSafeTransferFromSelfInsufficientBalance() (gas: 34297) @@ -106,17 +106,17 @@ ERC1155Test:testMintToEOA(address,uint256,uint256,bytes) (runs: 256, μ: 35426, ERC1155Test:testMintToERC1155Recipient() (gas: 661411) ERC1155Test:testMintToERC1155Recipient(uint256,uint256,bytes) (runs: 256, μ: 691094, ~: 684374) ERC1155Test:testSafeBatchTransferFromToEOA() (gas: 297822) -ERC1155Test:testSafeBatchTransferFromToEOA(address,uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 4696020, ~: 3780789) +ERC1155Test:testSafeBatchTransferFromToEOA(address,uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 4692589, ~: 3776319) ERC1155Test:testSafeBatchTransferFromToERC1155Recipient() (gas: 1175327) -ERC1155Test:testSafeBatchTransferFromToERC1155Recipient(uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 7688857, ~: 6559140) +ERC1155Test:testSafeBatchTransferFromToERC1155Recipient(uint256[],uint256[],uint256[],bytes,bytes) (runs: 256, μ: 7683519, ~: 6515438) ERC1155Test:testSafeTransferFromSelf() (gas: 64177) ERC1155Test:testSafeTransferFromSelf(uint256,uint256,bytes,uint256,address,bytes) (runs: 256, μ: 64824, ~: 68564) ERC1155Test:testSafeTransferFromToEOA() (gas: 93167) -ERC1155Test:testSafeTransferFromToEOA(uint256,uint256,bytes,uint256,address,bytes) (runs: 256, μ: 93478, ~: 97450) +ERC1155Test:testSafeTransferFromToEOA(uint256,uint256,bytes,uint256,address,bytes) (runs: 256, μ: 93578, ~: 97450) ERC1155Test:testSafeTransferFromToERC1155Recipient() (gas: 739583) ERC1155Test:testSafeTransferFromToERC1155Recipient(uint256,uint256,bytes,uint256,bytes) (runs: 256, μ: 769591, ~: 765729) -ERC20Invariants:invariantBalanceSum() (runs: 256, calls: 3840, reverts: 2388) -ERC20Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2583) +ERC20Invariants:invariantBalanceSum() (runs: 256, calls: 3840, reverts: 2368) +ERC20Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2558) ERC20Test:testApprove() (gas: 31058) ERC20Test:testApprove(address,uint256) (runs: 256, μ: 30424, ~: 31280) ERC20Test:testBurn() (gas: 56970) @@ -137,7 +137,7 @@ ERC20Test:testFailTransferFromInsufficientBalance(address,uint256,uint256) (runs ERC20Test:testFailTransferInsufficientBalance() (gas: 52806) ERC20Test:testFailTransferInsufficientBalance(address,uint256,uint256) (runs: 256, μ: 51720, ~: 55310) ERC20Test:testInfiniteApproveTransferFrom() (gas: 89793) -ERC20Test:testMetadata(string,string,uint8) (runs: 256, μ: 869914, ~: 863277) +ERC20Test:testMetadata(string,string,uint8) (runs: 256, μ: 869043, ~: 863173) ERC20Test:testMint() (gas: 53746) ERC20Test:testMint(address,uint256) (runs: 256, μ: 52214, ~: 53925) ERC20Test:testPermit() (gas: 63193) @@ -146,7 +146,7 @@ ERC20Test:testTransfer() (gas: 60272) ERC20Test:testTransfer(address,uint256) (runs: 256, μ: 58773, ~: 60484) ERC20Test:testTransferFrom() (gas: 83777) ERC20Test:testTransferFrom(address,uint256,uint256) (runs: 256, μ: 86308, ~: 92841) -ERC4626Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2885) +ERC4626Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2936) ERC4626Test:testFailDepositWithNoApproval() (gas: 13357) ERC4626Test:testFailDepositWithNotEnoughApproval() (gas: 86993) ERC4626Test:testFailDepositZero() (gas: 7780) @@ -156,14 +156,14 @@ ERC4626Test:testFailRedeemWithNotEnoughShareAmount() (gas: 203631) ERC4626Test:testFailRedeemZero() (gas: 7967) ERC4626Test:testFailWithdrawWithNoUnderlyingAmount() (gas: 32289) ERC4626Test:testFailWithdrawWithNotEnoughUnderlyingAmount() (gas: 203595) -ERC4626Test:testMetadata(string,string) (runs: 256, μ: 1489261, ~: 1481501) +ERC4626Test:testMetadata(string,string) (runs: 256, μ: 1489616, ~: 1481501) ERC4626Test:testMintZero() (gas: 54595) ERC4626Test:testMultipleMintDepositRedeemWithdraw() (gas: 411747) ERC4626Test:testSingleDepositWithdraw(uint128) (runs: 256, μ: 201526, ~: 201536) ERC4626Test:testSingleMintRedeem(uint128) (runs: 256, μ: 201451, ~: 201461) ERC4626Test:testVaultInteractionsForSomeoneElse() (gas: 286209) ERC4626Test:testWithdrawZero() (gas: 52462) -ERC721Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2170) +ERC721Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2183) ERC721Test:testApprove() (gas: 78427) ERC721Test:testApprove(address,uint256) (runs: 256, μ: 78637, ~: 78637) ERC721Test:testApproveAll() (gas: 31063) @@ -219,7 +219,7 @@ ERC721Test:testFailTransferFromUnOwned() (gas: 8000) ERC721Test:testFailTransferFromUnOwned(address,address,uint256) (runs: 256, μ: 8311, ~: 8241) ERC721Test:testFailTransferFromWrongFrom() (gas: 53361) ERC721Test:testFailTransferFromWrongFrom(address,address,address,uint256) (runs: 256, μ: 53566, ~: 53752) -ERC721Test:testMetadata(string,string) (runs: 256, μ: 1340567, ~: 1332786) +ERC721Test:testMetadata(string,string) (runs: 256, μ: 1341878, ~: 1332786) ERC721Test:testMint() (gas: 54336) ERC721Test:testMint(address,uint256) (runs: 256, μ: 54521, ~: 54521) ERC721Test:testSafeMintToEOA() (gas: 56993) @@ -240,17 +240,17 @@ ERC721Test:testTransferFromApproveAll() (gas: 92898) ERC721Test:testTransferFromApproveAll(uint256,address) (runs: 256, μ: 93182, ~: 93182) ERC721Test:testTransferFromSelf() (gas: 64776) ERC721Test:testTransferFromSelf(uint256,address) (runs: 256, μ: 65061, ~: 65061) -FixedPointMathLibTest:testDifferentiallyFuzzSqrt(uint256) (runs: 256, μ: 13830, ~: 4181) +FixedPointMathLibTest:testDifferentiallyFuzzSqrt(uint256) (runs: 256, μ: 13809, ~: 4181) FixedPointMathLibTest:testDivWadDown() (gas: 820) -FixedPointMathLibTest:testDivWadDown(uint256,uint256) (runs: 256, μ: 713, ~: 813) +FixedPointMathLibTest:testDivWadDown(uint256,uint256) (runs: 256, μ: 712, ~: 813) FixedPointMathLibTest:testDivWadDownEdgeCases() (gas: 439) FixedPointMathLibTest:testDivWadUp() (gas: 943) -FixedPointMathLibTest:testDivWadUp(uint256,uint256) (runs: 256, μ: 795, ~: 952) +FixedPointMathLibTest:testDivWadUp(uint256,uint256) (runs: 256, μ: 792, ~: 952) FixedPointMathLibTest:testDivWadUpEdgeCases() (gas: 442) -FixedPointMathLibTest:testFailDivWadDownOverflow(uint256,uint256) (runs: 256, μ: 441, ~: 419) +FixedPointMathLibTest:testFailDivWadDownOverflow(uint256,uint256) (runs: 256, μ: 442, ~: 419) FixedPointMathLibTest:testFailDivWadDownZeroDenominator() (gas: 332) FixedPointMathLibTest:testFailDivWadDownZeroDenominator(uint256) (runs: 256, μ: 387, ~: 387) -FixedPointMathLibTest:testFailDivWadUpOverflow(uint256,uint256) (runs: 256, μ: 396, ~: 374) +FixedPointMathLibTest:testFailDivWadUpOverflow(uint256,uint256) (runs: 256, μ: 397, ~: 374) FixedPointMathLibTest:testFailDivWadUpZeroDenominator() (gas: 332) FixedPointMathLibTest:testFailDivWadUpZeroDenominator(uint256) (runs: 256, μ: 386, ~: 386) FixedPointMathLibTest:testFailMulDivDownOverflow(uint256,uint256,uint256) (runs: 256, μ: 434, ~: 414) @@ -277,12 +277,15 @@ FixedPointMathLibTest:testRPow() (gas: 2164) FixedPointMathLibTest:testSqrt() (gas: 2580) FixedPointMathLibTest:testSqrt(uint256) (runs: 256, μ: 997, ~: 1013) FixedPointMathLibTest:testSqrtBack(uint256) (runs: 256, μ: 15210, ~: 340) -FixedPointMathLibTest:testSqrtBackHashed(uint256) (runs: 256, μ: 59034, ~: 59500) +FixedPointMathLibTest:testSqrtBackHashed(uint256) (runs: 256, μ: 59066, ~: 59500) FixedPointMathLibTest:testSqrtBackHashedSingle() (gas: 58937) -LibStringTest:testDifferentiallyFuzzToString(uint256,bytes) (runs: 256, μ: 20749, ~: 8925) -LibStringTest:testToString() (gas: 10047) -LibStringTest:testToStringDirty() (gas: 8123) -LibStringTest:testToStringOverwrite() (gas: 484) +LibStringTest:testDifferentiallyFuzzToString(uint256,bytes) (runs: 256, μ: 20875, ~: 8988) +LibStringTest:testDifferentiallyFuzzToStringInt(int256,bytes) (runs: 256, μ: 20129, ~: 8360) +LibStringTest:testToString() (gas: 10069) +LibStringTest:testToStringDirty() (gas: 8145) +LibStringTest:testToStringIntNegative() (gas: 11096) +LibStringTest:testToStringIntPositive() (gas: 10509) +LibStringTest:testToStringOverwrite() (gas: 506) MerkleProofLibTest:testValidProofSupplied() (gas: 2153) MerkleProofLibTest:testVerifyEmptyMerkleProofSuppliedLeafAndRootDifferent() (gas: 1458) MerkleProofLibTest:testVerifyEmptyMerkleProofSuppliedLeafAndRootSame() (gas: 1452) @@ -300,7 +303,7 @@ MultiRolesAuthorityTest:testCanCallWithCustomAuthorityOverridesUserWithRole(addr MultiRolesAuthorityTest:testSetPublicCapabilities() (gas: 27727) MultiRolesAuthorityTest:testSetPublicCapabilities(bytes4) (runs: 256, μ: 27836, ~: 27835) MultiRolesAuthorityTest:testSetRoleCapabilities() (gas: 28932) -MultiRolesAuthorityTest:testSetRoleCapabilities(uint8,bytes4) (runs: 256, μ: 29073, ~: 29072) +MultiRolesAuthorityTest:testSetRoleCapabilities(uint8,bytes4) (runs: 256, μ: 29073, ~: 29073) MultiRolesAuthorityTest:testSetRoles() (gas: 28918) MultiRolesAuthorityTest:testSetRoles(address,uint8) (runs: 256, μ: 29030, ~: 29016) MultiRolesAuthorityTest:testSetTargetCustomAuthority() (gas: 28102) @@ -310,7 +313,7 @@ OwnedTest:testCallFunctionAsNonOwner(address) (runs: 256, μ: 16252, ~: 16290) OwnedTest:testCallFunctionAsOwner() (gas: 10435) OwnedTest:testTransferOwnership() (gas: 13123) OwnedTest:testTransferOwnership(address) (runs: 256, μ: 13154, ~: 13192) -ReentrancyGuardTest:invariantReentrancyStatusAlways1() (runs: 256, calls: 3840, reverts: 319) +ReentrancyGuardTest:invariantReentrancyStatusAlways1() (runs: 256, calls: 3840, reverts: 331) ReentrancyGuardTest:testFailUnprotectedCall() (gas: 46147) ReentrancyGuardTest:testNoReentrancy() (gas: 7515) ReentrancyGuardTest:testProtectedCall() (gas: 33467) @@ -338,7 +341,7 @@ SSTORE2Test:testFailWriteReadOutOfStartBound() (gas: 34362) SSTORE2Test:testWriteRead() (gas: 53497) SSTORE2Test:testWriteRead(bytes,bytes) (runs: 256, μ: 44019, ~: 41555) SSTORE2Test:testWriteReadCustomBounds() (gas: 34869) -SSTORE2Test:testWriteReadCustomBounds(bytes,uint256,uint256,bytes) (runs: 256, μ: 29324, ~: 44495) +SSTORE2Test:testWriteReadCustomBounds(bytes,uint256,uint256,bytes) (runs: 256, μ: 29483, ~: 44592) SSTORE2Test:testWriteReadCustomStartBound() (gas: 34740) SSTORE2Test:testWriteReadCustomStartBound(bytes,uint256,bytes) (runs: 256, μ: 46484, ~: 44053) SSTORE2Test:testWriteReadEmptyBound() (gas: 34677) @@ -427,7 +430,7 @@ SafeTransferLibTest:testTransferFromWithGarbage(address,address,uint256,bytes,by SafeTransferLibTest:testTransferFromWithMissingReturn() (gas: 49186) SafeTransferLibTest:testTransferFromWithMissingReturn(address,address,uint256,bytes) (runs: 256, μ: 48355, ~: 49598) SafeTransferLibTest:testTransferFromWithNonContract() (gas: 3035) -SafeTransferLibTest:testTransferFromWithNonContract(address,address,address,uint256,bytes) (runs: 256, μ: 4223, ~: 4228) +SafeTransferLibTest:testTransferFromWithNonContract(address,address,address,uint256,bytes) (runs: 256, μ: 4222, ~: 4228) SafeTransferLibTest:testTransferFromWithReturnsTooMuch() (gas: 49810) SafeTransferLibTest:testTransferFromWithReturnsTooMuch(address,address,uint256,bytes) (runs: 256, μ: 49002, ~: 50237) SafeTransferLibTest:testTransferFromWithStandardERC20() (gas: 47603) @@ -446,11 +449,11 @@ SignedWadMathTest:testFailWadDivZeroDenominator(int256) (runs: 256, μ: 296, ~: SignedWadMathTest:testFailWadMulOverflow(int256,int256) (runs: 256, μ: 323, ~: 296) SignedWadMathTest:testWadDiv(uint256,uint256,bool,bool) (runs: 256, μ: 5696, ~: 5664) SignedWadMathTest:testWadMul(uint256,uint256,bool,bool) (runs: 256, μ: 5720, ~: 5688) -WETHInvariants:invariantTotalSupplyEqualsBalance() (runs: 256, calls: 3840, reverts: 1908) +WETHInvariants:invariantTotalSupplyEqualsBalance() (runs: 256, calls: 3840, reverts: 1931) WETHTest:testDeposit() (gas: 63535) WETHTest:testDeposit(uint256) (runs: 256, μ: 62792, ~: 65880) WETHTest:testFallbackDeposit() (gas: 63249) WETHTest:testFallbackDeposit(uint256) (runs: 256, μ: 62516, ~: 65604) WETHTest:testPartialWithdraw() (gas: 73281) WETHTest:testWithdraw() (gas: 54360) -WETHTest:testWithdraw(uint256,uint256) (runs: 256, μ: 75417, ~: 78076) +WETHTest:testWithdraw(uint256,uint256) (runs: 256, μ: 75443, ~: 78076) diff --git a/src/test/LibString.t.sol b/src/test/LibString.t.sol index 51a1e8f0..36ed435d 100644 --- a/src/test/LibString.t.sol +++ b/src/test/LibString.t.sol @@ -7,13 +7,32 @@ import {LibString} from "../utils/LibString.sol"; contract LibStringTest is DSTestPlus { function testToString() public { - assertEq(LibString.toString(0), "0"); - assertEq(LibString.toString(1), "1"); - assertEq(LibString.toString(17), "17"); - assertEq(LibString.toString(99999999), "99999999"); - assertEq(LibString.toString(99999999999), "99999999999"); - assertEq(LibString.toString(2342343923423), "2342343923423"); - assertEq(LibString.toString(98765685434567), "98765685434567"); + assertEq(LibString.toString(uint256(0)), "0"); + assertEq(LibString.toString(uint256(1)), "1"); + assertEq(LibString.toString(uint256(17)), "17"); + assertEq(LibString.toString(uint256(99999999)), "99999999"); + assertEq(LibString.toString(uint256(99999999999)), "99999999999"); + assertEq(LibString.toString(uint256(2342343923423)), "2342343923423"); + assertEq(LibString.toString(uint256(98765685434567)), "98765685434567"); + } + + function testToStringIntPositive() public { + assertEq(LibString.toString(int256(0)), "0"); + assertEq(LibString.toString(int256(1)), "1"); + assertEq(LibString.toString(int256(17)), "17"); + assertEq(LibString.toString(int256(99999999)), "99999999"); + assertEq(LibString.toString(int256(99999999999)), "99999999999"); + assertEq(LibString.toString(int256(2342343923423)), "2342343923423"); + assertEq(LibString.toString(int256(98765685434567)), "98765685434567"); + } + + function testToStringIntNegative() public { + assertEq(LibString.toString(int256(-0)), "0"); + assertEq(LibString.toString(int256(-17)), "-17"); + assertEq(LibString.toString(int256(-99999999)), "-99999999"); + assertEq(LibString.toString(int256(-99999999999)), "-99999999999"); + assertEq(LibString.toString(int256(-2342343923423)), "-2342343923423"); + assertEq(LibString.toString(int256(-98765685434567)), "-98765685434567"); } function testDifferentiallyFuzzToString(uint256 value, bytes calldata brutalizeWith) @@ -27,8 +46,19 @@ contract LibStringTest is DSTestPlus { assertEq(libString, oz); } + function testDifferentiallyFuzzToStringInt(int256 value, bytes calldata brutalizeWith) + public + brutalizeMemory(brutalizeWith) + { + string memory libString = LibString.toString(value); + string memory oz = toStringOZ(value); + + assertEq(bytes(libString).length, bytes(oz).length); + assertEq(libString, oz); + } + function testToStringOverwrite() public { - string memory str = LibString.toString(1); + string memory str = LibString.toString(uint256(1)); bytes32 data; bytes32 expected; @@ -62,7 +92,7 @@ contract LibStringTest is DSTestPlus { mstore(add(freememptr, 96), dirty) mstore(add(freememptr, 128), dirty) } - string memory str = LibString.toString(1); + string memory str = LibString.toString(uint256(1)); uint256 len; bytes32 data; bytes32 expected; @@ -87,6 +117,10 @@ contract LibStringTest is DSTestPlus { } } +function toStringOZ(int256 value) pure returns (string memory) { + return string(abi.encodePacked(value < 0 ? "-" : "", toStringOZ(absOZ(value)))); +} + function toStringOZ(uint256 value) pure returns (string memory) { if (value == 0) { return "0"; @@ -105,3 +139,10 @@ function toStringOZ(uint256 value) pure returns (string memory) { } return string(buffer); } + +function absOZ(int256 n) pure returns (uint256) { + unchecked { + // must be unchecked in order to support `n = type(int256).min` + return uint256(n >= 0 ? n : -n); + } +} diff --git a/src/utils/LibString.sol b/src/utils/LibString.sol index b69ccdf7..b0576b9d 100644 --- a/src/utils/LibString.sol +++ b/src/utils/LibString.sol @@ -5,6 +5,12 @@ pragma solidity >=0.8.0; /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol) /// @author Modified from Solady (https://github.com/Vectorized/solady/blob/main/src/utils/LibString.sol) library LibString { + function toString(int256 value) internal pure returns (string memory) { + unchecked { + return value >= 0 ? toString(uint256(value)) : string(abi.encodePacked("-", toString(uint256(-value)))); + } + } + function toString(uint256 value) internal pure returns (string memory str) { /// @solidity memory-safe-assembly assembly {