From ca003503723fdd50851aafb5c99948cfbfef7fa3 Mon Sep 17 00:00:00 2001 From: Vectorized Date: Thu, 16 May 2024 09:48:14 +0000 Subject: [PATCH] Optimize --- .gas-snapshot | 116 ++++++++++++++++---------------- src/utils/FixedPointMathLib.sol | 13 ++-- test/FixedPointMathLib.t.sol | 15 +++-- 3 files changed, 74 insertions(+), 70 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index 7baeef0e9e..0a0a418917 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, μ: 339313, ~: 340930) +ERC1967FactoryTest:testDeployAndCall(uint256) (runs: 276, μ: 339314, ~: 340931) ERC1967FactoryTest:testDeployAndCallWithRevert() (gas: 211881) -ERC1967FactoryTest:testDeployBrutalized(uint256) (runs: 276, μ: 96573, ~: 44131) +ERC1967FactoryTest:testDeployBrutalized(uint256) (runs: 276, μ: 95821, ~: 44128) 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, μ: 543820, ~: 669063) +ERC4337Test:testExecuteBatch(uint256) (runs: 276, μ: 541588, ~: 669054) ERC4337Test:testInitializer() (gas: 285472) ERC4337Test:testIsValidSignature() (gas: 119651) ERC4337Test:testIsValidSignaturePersonalSign() (gas: 102966) @@ -257,14 +257,14 @@ ERC4337Test:testValidateUserOp() (gas: 480104) ERC4337Test:test__codesize() (gas: 57110) ERC4626Test:testDepositWithNoApprovalReverts() (gas: 16565) ERC4626Test:testDepositWithNotEnoughApprovalReverts() (gas: 90175) -ERC4626Test:testDifferentialFullMulDiv(uint256,uint256,uint256) (runs: 276, μ: 3334, ~: 3287) +ERC4626Test:testDifferentialFullMulDiv(uint256,uint256,uint256) (runs: 276, μ: 3341, ~: 3319) ERC4626Test:testMetadata() (gas: 14406) ERC4626Test:testMintWithNoApprovalReverts() (gas: 16539) ERC4626Test:testMintZero() (gas: 53547) ERC4626Test:testMultipleMintDepositRedeemWithdraw() (gas: 410453) ERC4626Test:testRedeemWithNoShareAmountReverts() (gas: 10918) ERC4626Test:testRedeemWithNotEnoughShareAmountReverts() (gas: 143206) -ERC4626Test:testSingleDepositWithdraw(uint128) (runs: 276, μ: 201952, ~: 201957) +ERC4626Test:testSingleDepositWithdraw(uint128) (runs: 276, μ: 201951, ~: 201957) ERC4626Test:testSingleMintRedeem(uint128) (runs: 276, μ: 200917, ~: 200923) ERC4626Test:testTryGetAssetDecimals() (gas: 31553187) ERC4626Test:testUseVirtualShares() (gas: 2433734) @@ -280,17 +280,17 @@ ERC6551Test:testDeployERC6551(uint256) (runs: 276, μ: 170622, ~: 168890) ERC6551Test:testDeployERC6551Proxy() (gas: 80395) ERC6551Test:testExecute() (gas: 506735) ERC6551Test:testExecuteBatch() (gas: 816151) -ERC6551Test:testExecuteBatch(uint256) (runs: 276, μ: 621703, ~: 482714) +ERC6551Test:testExecuteBatch(uint256) (runs: 276, μ: 620667, ~: 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, μ: 450422, ~: 455366) +ERC6551Test:testOnERC721ReceivedCyclesWithDifferentChainIds(uint256) (runs: 276, μ: 450428, ~: 455366) ERC6551Test:testOwnerWorksWithChainIdChange(uint256,uint256) (runs: 276, μ: 1363686, ~: 1363678) ERC6551Test:testSupportsInterface() (gas: 169450) -ERC6551Test:testUpdateState(uint256) (runs: 276, μ: 235179, ~: 235121) +ERC6551Test:testUpdateState(uint256) (runs: 276, μ: 235178, ~: 235121) ERC6551Test:testUpgrade() (gas: 248420) ERC6551Test:test__codesize() (gas: 51483) ERC6909Test:testApprove() (gas: 36868) @@ -398,7 +398,7 @@ FixedPointMathLibTest:testAvgEdgeCase() (gas: 470) FixedPointMathLibTest:testAvgSigned() (gas: 851) FixedPointMathLibTest:testCbrt() (gas: 10283) FixedPointMathLibTest:testCbrt(uint256) (runs: 276, μ: 1505, ~: 1513) -FixedPointMathLibTest:testCbrtBack(uint256) (runs: 276, μ: 33548, ~: 42887) +FixedPointMathLibTest:testCbrtBack(uint256) (runs: 276, μ: 33989, ~: 42887) FixedPointMathLibTest:testCbrtWad() (gas: 11984) FixedPointMathLibTest:testCbrtWad(uint256) (runs: 276, μ: 1978, ~: 1983) FixedPointMathLibTest:testClamp(uint256,uint256,uint256) (runs: 276, μ: 568, ~: 568) @@ -407,11 +407,11 @@ FixedPointMathLibTest:testDist() (gas: 678) FixedPointMathLibTest:testDist(int256,int256) (runs: 276, μ: 497, ~: 502) FixedPointMathLibTest:testDistEdgeCases() (gas: 570) FixedPointMathLibTest:testDivWad() (gas: 702) -FixedPointMathLibTest:testDivWad(uint256,uint256) (runs: 276, μ: 816, ~: 891) +FixedPointMathLibTest:testDivWad(uint256,uint256) (runs: 276, μ: 813, ~: 891) FixedPointMathLibTest:testDivWadEdgeCases() (gas: 436) FixedPointMathLibTest:testDivWadOverflowReverts(uint256,uint256) (runs: 259, μ: 3793, ~: 3793) FixedPointMathLibTest:testDivWadUp() (gas: 3129) -FixedPointMathLibTest:testDivWadUp(uint256,uint256) (runs: 276, μ: 893, ~: 987) +FixedPointMathLibTest:testDivWadUp(uint256,uint256) (runs: 276, μ: 889, ~: 987) FixedPointMathLibTest:testDivWadUpEdgeCases() (gas: 483) FixedPointMathLibTest:testDivWadUpOverflowReverts(uint256,uint256) (runs: 259, μ: 3792, ~: 3792) FixedPointMathLibTest:testDivWadUpZeroDenominatorReverts() (gas: 3261) @@ -421,28 +421,28 @@ FixedPointMathLibTest:testDivWadZeroDenominatorReverts(uint256) (runs: 276, μ: FixedPointMathLibTest:testExpWad() (gas: 8047) FixedPointMathLibTest:testFactorial() (gas: 98781) FixedPointMathLibTest:testFactorialOriginal() (gas: 94187) -FixedPointMathLibTest:testFullMulDiv() (gas: 1086) -FixedPointMathLibTest:testFullMulDiv(uint256,uint256,uint256) (runs: 276, μ: 1333, ~: 940) -FixedPointMathLibTest:testFullMulDivAlwaysRevertsIfDivisorIsZero(uint256,uint256) (runs: 276, μ: 3446, ~: 3446) -FixedPointMathLibTest:testFullMulDivUp(uint256,uint256,uint256) (runs: 276, μ: 1777, ~: 1449) -FixedPointMathLibTest:testFullMulDivUpRevertsIfRoundedUpResultOverflowsCase1() (gas: 3697) -FixedPointMathLibTest:testFullMulDivUpRevertsIfRoundedUpResultOverflowsCase2() (gas: 3730) +FixedPointMathLibTest:testFullMulDiv() (gas: 1083) +FixedPointMathLibTest:testFullMulDiv(uint256,uint256,uint256) (runs: 276, μ: 1322, ~: 940) +FixedPointMathLibTest:testFullMulDivAlwaysRevertsIfDivisorIsZero(uint256,uint256) (runs: 276, μ: 3478, ~: 3478) +FixedPointMathLibTest:testFullMulDivUp(uint256,uint256,uint256) (runs: 276, μ: 1772, ~: 1449) +FixedPointMathLibTest:testFullMulDivUpRevertsIfRoundedUpResultOverflowsCase1() (gas: 3694) +FixedPointMathLibTest:testFullMulDivUpRevertsIfRoundedUpResultOverflowsCase2() (gas: 3727) FixedPointMathLibTest:testGcd() (gas: 4228) -FixedPointMathLibTest:testGcd(uint256,uint256) (runs: 276, μ: 6831, ~: 2800) +FixedPointMathLibTest:testGcd(uint256,uint256) (runs: 276, μ: 6770, ~: 3077) FixedPointMathLibTest:testLambertW0WadAccuracy() (gas: 7164) -FixedPointMathLibTest:testLambertW0WadAccuracy(uint184) (runs: 276, μ: 2331, ~: 408) +FixedPointMathLibTest:testLambertW0WadAccuracy(uint184) (runs: 276, μ: 2383, ~: 408) FixedPointMathLibTest:testLambertW0WadKnownValues() (gas: 1689664) FixedPointMathLibTest:testLambertW0WadMonoDebug() (gas: 772644) FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasing() (gas: 18485651) -FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasing(int256,int256) (runs: 276, μ: 7308, ~: 7017) +FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasing(int256,int256) (runs: 276, μ: 7236, ~: 7012) FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasing2() (gas: 4045144) -FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasingAround(int256) (runs: 276, μ: 28946, ~: 35664) -FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasingAround2(uint96) (runs: 276, μ: 23712, ~: 17376) +FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasingAround(int256) (runs: 276, μ: 28252, ~: 35664) +FixedPointMathLibTest:testLambertW0WadMonotonicallyIncreasingAround2(uint96) (runs: 276, μ: 38572, ~: 17376) FixedPointMathLibTest:testLambertW0WadRevertsForOutOfDomain() (gas: 16612) FixedPointMathLibTest:testLambertW0WadWithinBounds() (gas: 122497) -FixedPointMathLibTest:testLambertW0WadWithinBounds(int256) (runs: 276, μ: 3596, ~: 5008) -FixedPointMathLibTest:testLerp(int256,int256,int256,int256,int256) (runs: 276, μ: 1762, ~: 1261) -FixedPointMathLibTest:testLerp(uint256,uint256,uint256,uint256,uint256) (runs: 276, μ: 1106, ~: 840) +FixedPointMathLibTest:testLambertW0WadWithinBounds(int256) (runs: 276, μ: 3477, ~: 5008) +FixedPointMathLibTest:testLerp(int256,int256,int256,int256,int256) (runs: 276, μ: 1748, ~: 1261) +FixedPointMathLibTest:testLerp(uint256,uint256,uint256,uint256,uint256) (runs: 276, μ: 1138, ~: 840) FixedPointMathLibTest:testLerpOriginal() (gas: 12438) FixedPointMathLibTest:testLnWad() (gas: 2054) FixedPointMathLibTest:testLnWadBig() (gas: 2065) @@ -450,28 +450,28 @@ FixedPointMathLibTest:testLnWadNegativeReverts() (gas: 3340) FixedPointMathLibTest:testLnWadOverflowReverts() (gas: 3315) FixedPointMathLibTest:testLnWadSmall() (gas: 2708) FixedPointMathLibTest:testLog10() (gas: 76168) -FixedPointMathLibTest:testLog10(uint256,uint256) (runs: 276, μ: 2188, ~: 2209) +FixedPointMathLibTest:testLog10(uint256,uint256) (runs: 276, μ: 2186, ~: 2210) FixedPointMathLibTest:testLog10Up() (gas: 4369) FixedPointMathLibTest:testLog2() (gas: 243209) FixedPointMathLibTest:testLog256() (gas: 22831) -FixedPointMathLibTest:testLog256(uint256,uint256) (runs: 276, μ: 2116, ~: 2173) +FixedPointMathLibTest:testLog256(uint256,uint256) (runs: 276, μ: 2118, ~: 2173) FixedPointMathLibTest:testLog256Up() (gas: 1271) -FixedPointMathLibTest:testLog2Differential(uint256) (runs: 276, μ: 890, ~: 886) +FixedPointMathLibTest:testLog2Differential(uint256) (runs: 276, μ: 891, ~: 886) FixedPointMathLibTest:testLog2Up() (gas: 297302) -FixedPointMathLibTest:testMax(uint256,uint256) (runs: 276, μ: 477, ~: 477) -FixedPointMathLibTest:testMaxCasted(uint32,uint32,uint256) (runs: 276, μ: 887, ~: 887) +FixedPointMathLibTest:testMax(uint256,uint256) (runs: 276, μ: 476, ~: 472) +FixedPointMathLibTest:testMaxCasted(uint32,uint32,uint256) (runs: 276, μ: 886, ~: 882) FixedPointMathLibTest:testMaxSigned(int256,int256) (runs: 276, μ: 519, ~: 515) FixedPointMathLibTest:testMin(uint256,uint256) (runs: 276, μ: 477, ~: 482) -FixedPointMathLibTest:testMinBrutalized(uint256,uint256) (runs: 276, μ: 806, ~: 797) +FixedPointMathLibTest:testMinBrutalized(uint256,uint256) (runs: 276, μ: 807, ~: 817) FixedPointMathLibTest:testMinSigned(int256,int256) (runs: 276, μ: 475, ~: 480) FixedPointMathLibTest:testMulDiv() (gas: 1845) -FixedPointMathLibTest:testMulDiv(uint256,uint256,uint256) (runs: 276, μ: 723, ~: 836) +FixedPointMathLibTest:testMulDiv(uint256,uint256,uint256) (runs: 276, μ: 1798, ~: 836) FixedPointMathLibTest:testMulDivEdgeCases() (gas: 784) -FixedPointMathLibTest:testMulDivOverflowReverts(uint256,uint256,uint256) (runs: 261, μ: 3857, ~: 3857) +FixedPointMathLibTest:testMulDivOverflowReverts(uint256,uint256,uint256) (runs: 262, μ: 3869, ~: 3869) FixedPointMathLibTest:testMulDivUp() (gas: 2125) -FixedPointMathLibTest:testMulDivUp(uint256,uint256,uint256) (runs: 276, μ: 923, ~: 1143) +FixedPointMathLibTest:testMulDivUp(uint256,uint256,uint256) (runs: 276, μ: 1996, ~: 1143) FixedPointMathLibTest:testMulDivUpEdgeCases() (gas: 817) -FixedPointMathLibTest:testMulDivUpOverflowReverts(uint256,uint256,uint256) (runs: 261, μ: 3858, ~: 3858) +FixedPointMathLibTest:testMulDivUpOverflowReverts(uint256,uint256,uint256) (runs: 262, μ: 3858, ~: 3858) FixedPointMathLibTest:testMulDivUpZeroDenominator() (gas: 3256) FixedPointMathLibTest:testMulDivUpZeroDenominatorReverts(uint256,uint256) (runs: 276, μ: 3357, ~: 3357) FixedPointMathLibTest:testMulDivZeroDenominatorReverts() (gas: 3255) @@ -479,13 +479,13 @@ FixedPointMathLibTest:testMulDivZeroDenominatorReverts(uint256,uint256) (runs: 2 FixedPointMathLibTest:testMulWad() (gas: 736) FixedPointMathLibTest:testMulWad(uint256,uint256) (runs: 276, μ: 728, ~: 854) FixedPointMathLibTest:testMulWadEdgeCases() (gas: 714) -FixedPointMathLibTest:testMulWadOverflowReverts(uint256,uint256) (runs: 261, μ: 3791, ~: 3791) +FixedPointMathLibTest:testMulWadOverflowReverts(uint256,uint256) (runs: 262, μ: 3791, ~: 3791) FixedPointMathLibTest:testMulWadUp() (gas: 837) FixedPointMathLibTest:testMulWadUp(uint256,uint256) (runs: 276, μ: 876, ~: 1065) FixedPointMathLibTest:testMulWadUpEdgeCases() (gas: 815) -FixedPointMathLibTest:testMulWadUpOverflowReverts(uint256,uint256) (runs: 261, μ: 3834, ~: 3834) +FixedPointMathLibTest:testMulWadUpOverflowReverts(uint256,uint256) (runs: 262, μ: 3834, ~: 3834) FixedPointMathLibTest:testPackUnpackSci() (gas: 129349) -FixedPointMathLibTest:testPackUnpackSci(uint256) (runs: 276, μ: 30188, ~: 30182) +FixedPointMathLibTest:testPackUnpackSci(uint256) (runs: 276, μ: 30176, ~: 30185) FixedPointMathLibTest:testRPow() (gas: 3320) FixedPointMathLibTest:testRPowOverflowReverts() (gas: 4974) FixedPointMathLibTest:testRawAdd(int256,int256) (runs: 276, μ: 440, ~: 440) @@ -501,29 +501,29 @@ FixedPointMathLibTest:testRawSMod(int256,int256) (runs: 276, μ: 488, ~: 488) FixedPointMathLibTest:testRawSub(int256,int256) (runs: 276, μ: 441, ~: 441) FixedPointMathLibTest:testRawSub(uint256,uint256) (runs: 276, μ: 440, ~: 440) FixedPointMathLibTest:testSDivWad() (gas: 916) -FixedPointMathLibTest:testSDivWad(int256,int256) (runs: 276, μ: 930, ~: 1015) +FixedPointMathLibTest:testSDivWad(int256,int256) (runs: 276, μ: 928, ~: 1015) FixedPointMathLibTest:testSDivWadEdgeCases() (gas: 422) FixedPointMathLibTest:testSDivWadOverflowReverts(int256,int256) (runs: 260, μ: 3803, ~: 3803) FixedPointMathLibTest:testSDivWadZeroDenominatorReverts(int256) (runs: 276, μ: 3330, ~: 3330) FixedPointMathLibTest:testSMulWad() (gas: 1010) -FixedPointMathLibTest:testSMulWad(int256,int256) (runs: 276, μ: 885, ~: 1047) +FixedPointMathLibTest:testSMulWad(int256,int256) (runs: 276, μ: 891, ~: 1047) FixedPointMathLibTest:testSMulWadEdgeCases() (gas: 1243) -FixedPointMathLibTest:testSMulWadOverflowRevertsOnCondition1(int256,int256) (runs: 259, μ: 3842, ~: 3842) +FixedPointMathLibTest:testSMulWadOverflowRevertsOnCondition1(int256,int256) (runs: 260, μ: 3842, ~: 3842) FixedPointMathLibTest:testSMulWadOverflowRevertsOnCondition2(int256) (runs: 261, μ: 3706, ~: 3706) FixedPointMathLibTest:testSMulWadOverflowTrickDifferential(int256,int256) (runs: 276, μ: 600, ~: 610) FixedPointMathLibTest:testSci() (gas: 1838614) -FixedPointMathLibTest:testSci(uint256) (runs: 276, μ: 34642, ~: 38257) -FixedPointMathLibTest:testSci2(uint256) (runs: 276, μ: 960, ~: 955) +FixedPointMathLibTest:testSci(uint256) (runs: 276, μ: 35083, ~: 39326) +FixedPointMathLibTest:testSci2(uint256) (runs: 276, μ: 959, ~: 955) FixedPointMathLibTest:testSqrt() (gas: 42598) FixedPointMathLibTest:testSqrt(uint256) (runs: 276, μ: 1060, ~: 1064) -FixedPointMathLibTest:testSqrtBack(uint256) (runs: 276, μ: 9608, ~: 341) -FixedPointMathLibTest:testSqrtHashed(uint256) (runs: 276, μ: 53172, ~: 53571) +FixedPointMathLibTest:testSqrtBack(uint256) (runs: 276, μ: 9450, ~: 341) +FixedPointMathLibTest:testSqrtHashed(uint256) (runs: 276, μ: 53152, ~: 53157) 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: 42975) +FixedPointMathLibTest:testSqrtWad(uint256) (runs: 276, μ: 1561, ~: 1565) +FixedPointMathLibTest:testZeroFloorSub(uint256,uint256) (runs: 276, μ: 550, ~: 579) +FixedPointMathLibTest:testZeroFloorSubCasted(uint32,uint32,uint256) (runs: 276, μ: 882, ~: 923) +FixedPointMathLibTest:test__codesize() (gas: 43136) 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, μ: 168287, ~: 89356) +LibPRNGTest:testLazyShufflerProducesShuffledRange(uint256) (runs: 276, μ: 168286, ~: 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, μ: 63890, ~: 56825) +LibPRNGTest:testLazyShufflerRevertsOnFinshedNext(uint256) (runs: 276, μ: 63897, ~: 56825) LibPRNGTest:testLazyShufflerRevertsOnGrowWithInvalidLength(uint256,uint256) (runs: 276, μ: 24695, ~: 24783) LibPRNGTest:testLazyShufflerRevertsOnInitWithInvalidLength(uint256) (runs: 276, μ: 23240, ~: 23680) LibPRNGTest:testLazyShufflerRevertsOnZeroLengthNext() (gas: 27843) @@ -1070,12 +1070,12 @@ 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, μ: 109886, ~: 123604) +SafeTransferLibTest:testApproveWithGarbageReverts(address,uint256) (runs: 276, μ: 109870, ~: 123521) SafeTransferLibTest:testApproveWithMissingReturn() (gas: 32065) SafeTransferLibTest:testApproveWithMissingReturn(address,uint256) (runs: 276, μ: 32212, ~: 32285) SafeTransferLibTest:testApproveWithNonContract() (gas: 3012) SafeTransferLibTest:testApproveWithNonContract(address,address,uint256) (runs: 276, μ: 3602, ~: 3613) -SafeTransferLibTest:testApproveWithNonGarbage(address,uint256) (runs: 276, μ: 79994, ~: 59368) +SafeTransferLibTest:testApproveWithNonGarbage(address,uint256) (runs: 276, μ: 79840, ~: 59368) SafeTransferLibTest:testApproveWithRetry() (gas: 839904) SafeTransferLibTest:testApproveWithRetry(address,uint256,uint256) (runs: 276, μ: 839686, ~: 840020) SafeTransferLibTest:testApproveWithRetryWithNonContract() (gas: 2990) @@ -1130,21 +1130,21 @@ 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, μ: 746864, ~: 648388) +SafeTransferLibTest:testTransferWithGarbageReverts(address,uint256) (runs: 276, μ: 746673, ~: 648368) SafeTransferLibTest:testTransferWithMissingReturn() (gas: 554420) -SafeTransferLibTest:testTransferWithMissingReturn(address,uint256) (runs: 276, μ: 673152, ~: 554767) +SafeTransferLibTest:testTransferWithMissingReturn(address,uint256) (runs: 276, μ: 673151, ~: 554767) SafeTransferLibTest:testTransferWithNonContract() (gas: 3010) SafeTransferLibTest:testTransferWithNonContract(address,address,uint256) (runs: 276, μ: 3623, ~: 3634) -SafeTransferLibTest:testTransferWithNonGarbage(address,uint256) (runs: 276, μ: 736976, ~: 624046) +SafeTransferLibTest:testTransferWithNonGarbage(address,uint256) (runs: 276, μ: 736975, ~: 624046) SafeTransferLibTest:testTransferWithReturnsFalseReverts() (gas: 530949) SafeTransferLibTest:testTransferWithReturnsFalseReverts(address,uint256) (runs: 276, μ: 685548, ~: 531206) SafeTransferLibTest:testTransferWithReturnsTooLittleReverts() (gas: 531136) SafeTransferLibTest:testTransferWithReturnsTooLittleReverts(address,uint256) (runs: 276, μ: 680577, ~: 531152) SafeTransferLibTest:testTransferWithReturnsTooMuch() (gas: 554821) -SafeTransferLibTest:testTransferWithReturnsTooMuch(address,uint256) (runs: 276, μ: 631021, ~: 555224) +SafeTransferLibTest:testTransferWithReturnsTooMuch(address,uint256) (runs: 276, μ: 631020, ~: 555224) SafeTransferLibTest:testTransferWithReturnsTwoReverts(address,uint256) (runs: 276, μ: 673917, ~: 531163) SafeTransferLibTest:testTransferWithRevertingReverts() (gas: 530843) -SafeTransferLibTest:testTransferWithRevertingReverts(address,uint256) (runs: 276, μ: 738591, ~: 531131) +SafeTransferLibTest:testTransferWithRevertingReverts(address,uint256) (runs: 276, μ: 740147, ~: 531142) SafeTransferLibTest:testTransferWithStandardERC20() (gas: 555088) SafeTransferLibTest:testTransferWithStandardERC20(address,uint256) (runs: 276, μ: 624176, ~: 555059) SafeTransferLibTest:testTrySafeTransferFrom(address,address,uint256) (runs: 276, μ: 109032, ~: 111573) diff --git a/src/utils/FixedPointMathLib.sol b/src/utils/FixedPointMathLib.sol index ba457dffb2..8cccd7d646 100644 --- a/src/utils/FixedPointMathLib.sol +++ b/src/utils/FixedPointMathLib.sol @@ -449,17 +449,18 @@ library FixedPointMathLib { if iszero(mul(or(iszero(x), eq(div(result, x), y)), d)) { let mm := mulmod(x, y, not(0)) let p1 := sub(mm, add(result, lt(mm, result))) // Upper 256 bits of `x * y`. - // Make sure the result is less than `2**256`. Also prevents `d == 0`. - if iszero(gt(d, p1)) { - mstore(0x00, 0xae47f702) // `FullMulDivFailed()`. - revert(0x1c, 0x04) - } /*------------------- 512 by 256 division --------------------*/ // Make division exact by subtracting the remainder from `[p1 p0]`. let r := mulmod(x, y, d) // Compute remainder using mulmod. let t := and(d, sub(0, d)) // The least significant bit of `d`. `t >= 1`. + // Make sure the result is less than `2**256`. Also prevents `d == 0`. + // Placing the check here seems to give more optimal stack operations. + if iszero(gt(d, p1)) { + mstore(0x00, 0xae47f702) // `FullMulDivFailed()`. + revert(0x1c, 0x04) + } d := div(d, t) // Divide `d` by `t`, which is a power of two. // Invert `d mod 2**256` // Now that `d` is an odd number, it has an inverse @@ -484,7 +485,7 @@ library FixedPointMathLib { mul(sub(p1, gt(r, result)), add(div(sub(0, t), t), 1)), div(sub(result, r), t) ), - mul(inv, sub(2, mul(d, inv))) // inverse mod 2**256 + mul(sub(2, mul(d, inv)), inv) // inverse mod 2**256 ) break } diff --git a/test/FixedPointMathLib.t.sol b/test/FixedPointMathLib.t.sol index 77aaa9eb3f..d16a2354db 100644 --- a/test/FixedPointMathLib.t.sol +++ b/test/FixedPointMathLib.t.sol @@ -1268,11 +1268,13 @@ contract FixedPointMathLibTest is SoladyTest { } function testMulDiv(uint256 x, uint256 y, uint256 denominator) public { - // Ignore cases where x * y overflows or denominator is 0. unchecked { - if (denominator == 0 || (x != 0 && (x * y) / x != y)) return; + if (denominator == 0 || (x != 0 && (x * y) / x != y)) { + vm.expectRevert(FixedPointMathLib.MulDivFailed.selector); + FixedPointMathLib.mulDiv(x, y, denominator); + return; + } } - assertEq(FixedPointMathLib.mulDiv(x, y, denominator), (x * y) / denominator); } @@ -1290,11 +1292,12 @@ contract FixedPointMathLibTest is SoladyTest { } function testMulDivUp(uint256 x, uint256 y, uint256 denominator) public { - // Ignore cases where x * y overflows or denominator is 0. unchecked { - if (denominator == 0 || (x != 0 && (x * y) / x != y)) return; + if (denominator == 0 || (x != 0 && (x * y) / x != y)) { + vm.expectRevert(FixedPointMathLib.MulDivFailed.selector); + FixedPointMathLib.mulDivUp(x, y, denominator); + } } - assertEq( FixedPointMathLib.mulDivUp(x, y, denominator), x * y == 0 ? 0 : (x * y - 1) / denominator + 1