diff --git a/.gas-snapshot b/.gas-snapshot index d380c45a5a..7baeef0e9e 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -181,9 +181,9 @@ ERC1271Test:test__codesize() (gas: 30379) ERC1967FactoryTest:testChangeAdmin() (gas: 266356) ERC1967FactoryTest:testChangeAdminUnauthorized() (gas: 257316) ERC1967FactoryTest:testDeploy() (gas: 257375) -ERC1967FactoryTest:testDeployAndCall(uint256) (runs: 276, μ: 339314, ~: 340931) +ERC1967FactoryTest:testDeployAndCall(uint256) (runs: 276, μ: 339313, ~: 340930) ERC1967FactoryTest:testDeployAndCallWithRevert() (gas: 211881) -ERC1967FactoryTest:testDeployBrutalized(uint256) (runs: 276, μ: 95821, ~: 44128) +ERC1967FactoryTest:testDeployBrutalized(uint256) (runs: 276, μ: 96573, ~: 44131) ERC1967FactoryTest:testDeployDeterministicAndCall(uint256) (runs: 276, μ: 318052, ~: 350141) ERC1967FactoryTest:testFactoryDeployment() (gas: 494435) ERC1967FactoryTest:testProxyFails() (gas: 259019) @@ -243,7 +243,7 @@ ERC4337Test:testDisableInitializerForImplementation() (gas: 1320597) ERC4337Test:testETHReceived() (gas: 16584) ERC4337Test:testExecute() (gas: 382808) ERC4337Test:testExecuteBatch() (gas: 692731) -ERC4337Test:testExecuteBatch(uint256) (runs: 276, μ: 541588, ~: 669054) +ERC4337Test:testExecuteBatch(uint256) (runs: 276, μ: 543820, ~: 669063) ERC4337Test:testInitializer() (gas: 285472) ERC4337Test:testIsValidSignature() (gas: 119651) ERC4337Test:testIsValidSignaturePersonalSign() (gas: 102966) @@ -276,19 +276,19 @@ ERC4626Test:testWithdrawZero() (gas: 51874) ERC4626Test:test__codesize() (gas: 37177) ERC6551Test:testBaseFeeMini() (gas: 39514) ERC6551Test:testCdFallback() (gas: 894982) -ERC6551Test:testDeployERC6551(uint256) (runs: 276, μ: 170673, ~: 168890) +ERC6551Test:testDeployERC6551(uint256) (runs: 276, μ: 170622, ~: 168890) ERC6551Test:testDeployERC6551Proxy() (gas: 80395) ERC6551Test:testExecute() (gas: 506735) ERC6551Test:testExecuteBatch() (gas: 816151) -ERC6551Test:testExecuteBatch(uint256) (runs: 276, μ: 620668, ~: 482714) +ERC6551Test:testExecuteBatch(uint256) (runs: 276, μ: 621703, ~: 482714) ERC6551Test:testInitializeERC6551ProxyImplementation() (gas: 189914) ERC6551Test:testIsValidSigner(address) (runs: 276, μ: 167491, ~: 167474) ERC6551Test:testOnERC1155BatchReceived() (gas: 1697916) ERC6551Test:testOnERC1155Received() (gas: 1695271) ERC6551Test:testOnERC721Received() (gas: 1738609) ERC6551Test:testOnERC721ReceivedCycles() (gas: 1727948) -ERC6551Test:testOnERC721ReceivedCyclesWithDifferentChainIds(uint256) (runs: 276, μ: 450433, ~: 455366) -ERC6551Test:testOwnerWorksWithChainIdChange(uint256,uint256) (runs: 276, μ: 1363687, ~: 1363678) +ERC6551Test:testOnERC721ReceivedCyclesWithDifferentChainIds(uint256) (runs: 276, μ: 450422, ~: 455366) +ERC6551Test:testOwnerWorksWithChainIdChange(uint256,uint256) (runs: 276, μ: 1363686, ~: 1363678) ERC6551Test:testSupportsInterface() (gas: 169450) ERC6551Test:testUpdateState(uint256) (runs: 276, μ: 235179, ~: 235121) ERC6551Test:testUpgrade() (gas: 248420) @@ -428,7 +428,7 @@ FixedPointMathLibTest:testFullMulDivUp(uint256,uint256,uint256) (runs: 276, μ: FixedPointMathLibTest:testFullMulDivUpRevertsIfRoundedUpResultOverflowsCase1() (gas: 3697) FixedPointMathLibTest:testFullMulDivUpRevertsIfRoundedUpResultOverflowsCase2() (gas: 3730) FixedPointMathLibTest:testGcd() (gas: 4228) -FixedPointMathLibTest:testGcd(uint256,uint256) (runs: 276, μ: 6833, ~: 2800) +FixedPointMathLibTest:testGcd(uint256,uint256) (runs: 276, μ: 6831, ~: 2800) FixedPointMathLibTest:testLambertW0WadAccuracy() (gas: 7164) FixedPointMathLibTest:testLambertW0WadAccuracy(uint184) (runs: 276, μ: 2331, ~: 408) FixedPointMathLibTest:testLambertW0WadKnownValues() (gas: 1689664) @@ -450,11 +450,11 @@ FixedPointMathLibTest:testLnWadNegativeReverts() (gas: 3340) FixedPointMathLibTest:testLnWadOverflowReverts() (gas: 3315) FixedPointMathLibTest:testLnWadSmall() (gas: 2708) FixedPointMathLibTest:testLog10() (gas: 76168) -FixedPointMathLibTest:testLog10(uint256,uint256) (runs: 276, μ: 2188, ~: 2210) +FixedPointMathLibTest:testLog10(uint256,uint256) (runs: 276, μ: 2188, ~: 2209) FixedPointMathLibTest:testLog10Up() (gas: 4369) FixedPointMathLibTest:testLog2() (gas: 243209) FixedPointMathLibTest:testLog256() (gas: 22831) -FixedPointMathLibTest:testLog256(uint256,uint256) (runs: 276, μ: 2115, ~: 2173) +FixedPointMathLibTest:testLog256(uint256,uint256) (runs: 276, μ: 2116, ~: 2173) FixedPointMathLibTest:testLog256Up() (gas: 1271) FixedPointMathLibTest:testLog2Differential(uint256) (runs: 276, μ: 890, ~: 886) FixedPointMathLibTest:testLog2Up() (gas: 297302) @@ -467,15 +467,15 @@ FixedPointMathLibTest:testMinSigned(int256,int256) (runs: 276, μ: 475, ~: 480) FixedPointMathLibTest:testMulDiv() (gas: 1845) FixedPointMathLibTest:testMulDiv(uint256,uint256,uint256) (runs: 276, μ: 723, ~: 836) FixedPointMathLibTest:testMulDivEdgeCases() (gas: 784) -FixedPointMathLibTest:testMulDivOverflowReverts(uint256,uint256,uint256) (runs: 261, μ: 3854, ~: 3854) +FixedPointMathLibTest:testMulDivOverflowReverts(uint256,uint256,uint256) (runs: 261, μ: 3857, ~: 3857) FixedPointMathLibTest:testMulDivUp() (gas: 2125) FixedPointMathLibTest:testMulDivUp(uint256,uint256,uint256) (runs: 276, μ: 923, ~: 1143) FixedPointMathLibTest:testMulDivUpEdgeCases() (gas: 817) -FixedPointMathLibTest:testMulDivUpOverflowReverts(uint256,uint256,uint256) (runs: 261, μ: 3855, ~: 3855) -FixedPointMathLibTest:testMulDivUpZeroDenominator() (gas: 3253) -FixedPointMathLibTest:testMulDivUpZeroDenominatorReverts(uint256,uint256) (runs: 276, μ: 3354, ~: 3354) -FixedPointMathLibTest:testMulDivZeroDenominatorReverts() (gas: 3252) -FixedPointMathLibTest:testMulDivZeroDenominatorReverts(uint256,uint256) (runs: 276, μ: 3355, ~: 3355) +FixedPointMathLibTest:testMulDivUpOverflowReverts(uint256,uint256,uint256) (runs: 261, μ: 3858, ~: 3858) +FixedPointMathLibTest:testMulDivUpZeroDenominator() (gas: 3256) +FixedPointMathLibTest:testMulDivUpZeroDenominatorReverts(uint256,uint256) (runs: 276, μ: 3357, ~: 3357) +FixedPointMathLibTest:testMulDivZeroDenominatorReverts() (gas: 3255) +FixedPointMathLibTest:testMulDivZeroDenominatorReverts(uint256,uint256) (runs: 276, μ: 3358, ~: 3358) FixedPointMathLibTest:testMulWad() (gas: 736) FixedPointMathLibTest:testMulWad(uint256,uint256) (runs: 276, μ: 728, ~: 854) FixedPointMathLibTest:testMulWadEdgeCases() (gas: 714) @@ -485,7 +485,7 @@ FixedPointMathLibTest:testMulWadUp(uint256,uint256) (runs: 276, μ: 876, ~: 1065 FixedPointMathLibTest:testMulWadUpEdgeCases() (gas: 815) FixedPointMathLibTest:testMulWadUpOverflowReverts(uint256,uint256) (runs: 261, μ: 3834, ~: 3834) FixedPointMathLibTest:testPackUnpackSci() (gas: 129349) -FixedPointMathLibTest:testPackUnpackSci(uint256) (runs: 276, μ: 30189, ~: 30182) +FixedPointMathLibTest:testPackUnpackSci(uint256) (runs: 276, μ: 30188, ~: 30182) FixedPointMathLibTest:testRPow() (gas: 3320) FixedPointMathLibTest:testRPowOverflowReverts() (gas: 4974) FixedPointMathLibTest:testRawAdd(int256,int256) (runs: 276, μ: 440, ~: 440) @@ -517,13 +517,13 @@ FixedPointMathLibTest:testSci2(uint256) (runs: 276, μ: 960, ~: 955) FixedPointMathLibTest:testSqrt() (gas: 42598) FixedPointMathLibTest:testSqrt(uint256) (runs: 276, μ: 1060, ~: 1064) FixedPointMathLibTest:testSqrtBack(uint256) (runs: 276, μ: 9608, ~: 341) -FixedPointMathLibTest:testSqrtHashed(uint256) (runs: 276, μ: 53176, ~: 53571) +FixedPointMathLibTest:testSqrtHashed(uint256) (runs: 276, μ: 53172, ~: 53571) FixedPointMathLibTest:testSqrtHashedSingle() (gas: 53063) FixedPointMathLibTest:testSqrtWad() (gas: 7426) FixedPointMathLibTest:testSqrtWad(uint256) (runs: 276, μ: 1560, ~: 1565) FixedPointMathLibTest:testZeroFloorSub(uint256,uint256) (runs: 276, μ: 548, ~: 548) FixedPointMathLibTest:testZeroFloorSubCasted(uint32,uint32,uint256) (runs: 276, μ: 882, ~: 882) -FixedPointMathLibTest:test__codesize() (gas: 42984) +FixedPointMathLibTest:test__codesize() (gas: 42975) GasBurnerLibTest:testBurnGas() (gas: 1700805) GasBurnerLibTest:test__codesize() (gas: 1189) InitializableTest:testDisableInitializers() (gas: 42000) @@ -692,12 +692,12 @@ LibPRNGTest:testLCGGas() (gas: 20803) LibPRNGTest:testLazyShufflerGet() (gas: 298258) LibPRNGTest:testLazyShufflerGetOutOfBoundsReverts(uint256,uint256) (runs: 276, μ: 26539, ~: 26497) LibPRNGTest:testLazyShufflerNoStorageCollisions() (gas: 266085) -LibPRNGTest:testLazyShufflerProducesShuffledRange(uint256) (runs: 276, μ: 168346, ~: 89443) +LibPRNGTest:testLazyShufflerProducesShuffledRange(uint256) (runs: 276, μ: 168287, ~: 89356) LibPRNGTest:testLazyShufflerProducesShuffledRange2() (gas: 8971724) LibPRNGTest:testLazyShufflerProducesShuffledRangeWithGrow(uint256,uint256) (runs: 276, μ: 186890, ~: 176631) LibPRNGTest:testLazyShufflerRestart() (gas: 274632) LibPRNGTest:testLazyShufflerRevertsOnDoubleInit() (gas: 26779) -LibPRNGTest:testLazyShufflerRevertsOnFinshedNext(uint256) (runs: 276, μ: 63897, ~: 56825) +LibPRNGTest:testLazyShufflerRevertsOnFinshedNext(uint256) (runs: 276, μ: 63890, ~: 56825) LibPRNGTest:testLazyShufflerRevertsOnGrowWithInvalidLength(uint256,uint256) (runs: 276, μ: 24695, ~: 24783) LibPRNGTest:testLazyShufflerRevertsOnInitWithInvalidLength(uint256) (runs: 276, μ: 23240, ~: 23680) LibPRNGTest:testLazyShufflerRevertsOnZeroLengthNext() (gas: 27843) @@ -1070,7 +1070,7 @@ SafeCastLibTest:testSafeCastUint256ToIntBench() (gas: 330222) SafeCastLibTest:testSafeCastUint256ToUintBench() (gas: 326262) SafeCastLibTest:testSafeCastUintToUint(uint256,uint256) (runs: 276, μ: 19307, ~: 24926) SafeCastLibTest:test__codesize() (gas: 23270) -SafeTransferLibTest:testApproveWithGarbageReverts(address,uint256) (runs: 276, μ: 110039, ~: 123604) +SafeTransferLibTest:testApproveWithGarbageReverts(address,uint256) (runs: 276, μ: 109886, ~: 123604) SafeTransferLibTest:testApproveWithMissingReturn() (gas: 32065) SafeTransferLibTest:testApproveWithMissingReturn(address,uint256) (runs: 276, μ: 32212, ~: 32285) SafeTransferLibTest:testApproveWithNonContract() (gas: 3012) @@ -1110,7 +1110,7 @@ SafeTransferLibTest:testTransferAllFromWithStandardERC20(address,address,uint256 SafeTransferLibTest:testTransferAllWithStandardERC20() (gas: 30832) SafeTransferLibTest:testTransferAllWithStandardERC20(address,uint256) (runs: 276, μ: 42538, ~: 42538) SafeTransferLibTest:testTransferETH() (gas: 34622) -SafeTransferLibTest:testTransferETH(address,uint256) (runs: 276, μ: 34738, ~: 35266) +SafeTransferLibTest:testTransferETH(address,uint256) (runs: 276, μ: 34855, ~: 35266) SafeTransferLibTest:testTransferETHToContractWithoutFallbackReverts() (gas: 10851) SafeTransferLibTest:testTransferETHToContractWithoutFallbackReverts(uint256) (runs: 276, μ: 10822, ~: 10888) SafeTransferLibTest:testTransferFromWithGarbageReverts(address,address,uint256) (runs: 276, μ: 790953, ~: 702964) @@ -1130,19 +1130,19 @@ SafeTransferLibTest:testTransferFromWithRevertingReverts() (gas: 527143) SafeTransferLibTest:testTransferFromWithRevertingReverts(address,address,uint256) (runs: 276, μ: 652860, ~: 527301) SafeTransferLibTest:testTransferFromWithStandardERC20() (gas: 566534) SafeTransferLibTest:testTransferFromWithStandardERC20(address,address,uint256) (runs: 276, μ: 688343, ~: 566572) -SafeTransferLibTest:testTransferWithGarbageReverts(address,uint256) (runs: 276, μ: 746682, ~: 648368) +SafeTransferLibTest:testTransferWithGarbageReverts(address,uint256) (runs: 276, μ: 746864, ~: 648388) SafeTransferLibTest:testTransferWithMissingReturn() (gas: 554420) SafeTransferLibTest:testTransferWithMissingReturn(address,uint256) (runs: 276, μ: 673152, ~: 554767) SafeTransferLibTest:testTransferWithNonContract() (gas: 3010) SafeTransferLibTest:testTransferWithNonContract(address,address,uint256) (runs: 276, μ: 3623, ~: 3634) -SafeTransferLibTest:testTransferWithNonGarbage(address,uint256) (runs: 276, μ: 736975, ~: 624046) +SafeTransferLibTest:testTransferWithNonGarbage(address,uint256) (runs: 276, μ: 736976, ~: 624046) SafeTransferLibTest:testTransferWithReturnsFalseReverts() (gas: 530949) -SafeTransferLibTest:testTransferWithReturnsFalseReverts(address,uint256) (runs: 276, μ: 685549, ~: 531206) +SafeTransferLibTest:testTransferWithReturnsFalseReverts(address,uint256) (runs: 276, μ: 685548, ~: 531206) SafeTransferLibTest:testTransferWithReturnsTooLittleReverts() (gas: 531136) -SafeTransferLibTest:testTransferWithReturnsTooLittleReverts(address,uint256) (runs: 276, μ: 682990, ~: 531152) +SafeTransferLibTest:testTransferWithReturnsTooLittleReverts(address,uint256) (runs: 276, μ: 680577, ~: 531152) SafeTransferLibTest:testTransferWithReturnsTooMuch() (gas: 554821) -SafeTransferLibTest:testTransferWithReturnsTooMuch(address,uint256) (runs: 276, μ: 631020, ~: 555224) -SafeTransferLibTest:testTransferWithReturnsTwoReverts(address,uint256) (runs: 276, μ: 673918, ~: 531163) +SafeTransferLibTest:testTransferWithReturnsTooMuch(address,uint256) (runs: 276, μ: 631021, ~: 555224) +SafeTransferLibTest:testTransferWithReturnsTwoReverts(address,uint256) (runs: 276, μ: 673917, ~: 531163) SafeTransferLibTest:testTransferWithRevertingReverts() (gas: 530843) SafeTransferLibTest:testTransferWithRevertingReverts(address,uint256) (runs: 276, μ: 738591, ~: 531131) SafeTransferLibTest:testTransferWithStandardERC20() (gas: 555088) diff --git a/src/utils/FixedPointMathLib.sol b/src/utils/FixedPointMathLib.sol index 6a298731ca..ba457dffb2 100644 --- a/src/utils/FixedPointMathLib.sol +++ b/src/utils/FixedPointMathLib.sol @@ -517,12 +517,13 @@ library FixedPointMathLib { function mulDiv(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) { /// @solidity memory-safe-assembly assembly { - // Equivalent to require(d != 0 && (y == 0 || x <= type(uint256).max / y)) - if iszero(mul(d, iszero(mul(y, gt(x, div(not(0), y)))))) { + z := mul(x, y) + // Equivalent to `require(d != 0 && (y == 0 || x <= type(uint256).max / y))`. + if iszero(mul(or(iszero(x), eq(div(z, x), y)), d)) { mstore(0x00, 0xad251c27) // `MulDivFailed()`. revert(0x1c, 0x04) } - z := div(mul(x, y), d) + z := div(z, d) } } @@ -531,12 +532,13 @@ library FixedPointMathLib { function mulDivUp(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) { /// @solidity memory-safe-assembly assembly { - // Equivalent to require(d != 0 && (y == 0 || x <= type(uint256).max / y)) - if iszero(mul(d, iszero(mul(y, gt(x, div(not(0), y)))))) { + z := mul(x, y) + // Equivalent to `require(d != 0 && (y == 0 || x <= type(uint256).max / y))`. + if iszero(mul(or(iszero(x), eq(div(z, x), y)), d)) { mstore(0x00, 0xad251c27) // `MulDivFailed()`. revert(0x1c, 0x04) } - z := add(iszero(iszero(mod(mul(x, y), d))), div(mul(x, y), d)) + z := add(iszero(iszero(mod(z, d))), div(z, d)) } }