diff --git a/.gas-snapshot b/.gas-snapshot index c4c5c840..83d2d445 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -115,8 +115,8 @@ ERC1155Test:testSafeTransferFromToEOA() (gas: 93167) 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: 2368) -ERC20Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2558) +ERC20Invariants:invariantBalanceSum() (runs: 256, calls: 3840, reverts: 2388) +ERC20Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2610) ERC20Test:testApprove() (gas: 31058) ERC20Test:testApprove(address,uint256) (runs: 256, μ: 30424, ~: 31280) ERC20Test:testBurn() (gas: 56970) @@ -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: 2936) +ERC4626Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2868) ERC4626Test:testFailDepositWithNoApproval() (gas: 13357) ERC4626Test:testFailDepositWithNotEnoughApproval() (gas: 86993) ERC4626Test:testFailDepositZero() (gas: 7780) @@ -313,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: 331) +ReentrancyGuardTest:invariantReentrancyStatusAlways1() (runs: 256, calls: 3840, reverts: 266) ReentrancyGuardTest:testFailUnprotectedCall() (gas: 46147) ReentrancyGuardTest:testNoReentrancy() (gas: 7515) ReentrancyGuardTest:testProtectedCall() (gas: 33467) @@ -347,25 +347,27 @@ SSTORE2Test:testWriteReadCustomStartBound(bytes,uint256,bytes) (runs: 256, μ: 4 SSTORE2Test:testWriteReadEmptyBound() (gas: 34677) SSTORE2Test:testWriteReadFullBoundedRead() (gas: 53672) SSTORE2Test:testWriteReadFullStartBound() (gas: 34764) -SafeCastLibTest:testFailSafeCastTo128() (gas: 321) +SafeCastLibTest:testFailSafeCastTo128() (gas: 364) SafeCastLibTest:testFailSafeCastTo128(uint256) (runs: 256, μ: 443, ~: 443) SafeCastLibTest:testFailSafeCastTo16() (gas: 343) -SafeCastLibTest:testFailSafeCastTo16(uint256) (runs: 256, μ: 401, ~: 401) -SafeCastLibTest:testFailSafeCastTo160() (gas: 342) +SafeCastLibTest:testFailSafeCastTo16(uint256) (runs: 256, μ: 446, ~: 446) +SafeCastLibTest:testFailSafeCastTo160() (gas: 320) SafeCastLibTest:testFailSafeCastTo160(uint256) (runs: 256, μ: 422, ~: 422) SafeCastLibTest:testFailSafeCastTo192() (gas: 322) SafeCastLibTest:testFailSafeCastTo192(uint256) (runs: 256, μ: 401, ~: 401) -SafeCastLibTest:testFailSafeCastTo224() (gas: 365) +SafeCastLibTest:testFailSafeCastTo224() (gas: 343) SafeCastLibTest:testFailSafeCastTo224(uint256) (runs: 256, μ: 445, ~: 445) SafeCastLibTest:testFailSafeCastTo24(uint256) (runs: 256, μ: 402, ~: 402) -SafeCastLibTest:testFailSafeCastTo248() (gas: 321) -SafeCastLibTest:testFailSafeCastTo248(uint256) (runs: 256, μ: 444, ~: 444) -SafeCastLibTest:testFailSafeCastTo32() (gas: 364) +SafeCastLibTest:testFailSafeCastTo248() (gas: 365) +SafeCastLibTest:testFailSafeCastTo248(uint256) (runs: 256, μ: 422, ~: 422) +SafeCastLibTest:testFailSafeCastTo32() (gas: 342) SafeCastLibTest:testFailSafeCastTo32(uint256) (runs: 256, μ: 446, ~: 446) -SafeCastLibTest:testFailSafeCastTo64() (gas: 343) -SafeCastLibTest:testFailSafeCastTo64(uint256) (runs: 256, μ: 423, ~: 423) +SafeCastLibTest:testFailSafeCastTo48() (gas: 344) +SafeCastLibTest:testFailSafeCastTo48(uint256) (runs: 256, μ: 444, ~: 444) +SafeCastLibTest:testFailSafeCastTo64() (gas: 321) +SafeCastLibTest:testFailSafeCastTo64(uint256) (runs: 256, μ: 401, ~: 401) SafeCastLibTest:testFailSafeCastTo8() (gas: 341) -SafeCastLibTest:testFailSafeCastTo8(uint256) (runs: 256, μ: 421, ~: 421) +SafeCastLibTest:testFailSafeCastTo8(uint256) (runs: 256, μ: 399, ~: 399) SafeCastLibTest:testFailSafeCastTo96() (gas: 343) SafeCastLibTest:testFailSafeCastTo96(uint256) (runs: 256, μ: 424, ~: 424) SafeCastLibTest:testSafeCastTo128() (gas: 472) @@ -375,20 +377,22 @@ SafeCastLibTest:testSafeCastTo16(uint256) (runs: 256, μ: 2734, ~: 2734) SafeCastLibTest:testSafeCastTo160() (gas: 470) SafeCastLibTest:testSafeCastTo160(uint256) (runs: 256, μ: 2731, ~: 2731) SafeCastLibTest:testSafeCastTo192() (gas: 449) -SafeCastLibTest:testSafeCastTo192(uint256) (runs: 256, μ: 2711, ~: 2711) +SafeCastLibTest:testSafeCastTo192(uint256) (runs: 256, μ: 2756, ~: 2756) SafeCastLibTest:testSafeCastTo224() (gas: 491) -SafeCastLibTest:testSafeCastTo224(uint256) (runs: 256, μ: 2710, ~: 2710) -SafeCastLibTest:testSafeCastTo24() (gas: 492) +SafeCastLibTest:testSafeCastTo224(uint256) (runs: 256, μ: 2755, ~: 2755) +SafeCastLibTest:testSafeCastTo24() (gas: 470) SafeCastLibTest:testSafeCastTo248() (gas: 450) SafeCastLibTest:testSafeCastTo248(uint256) (runs: 256, μ: 2755, ~: 2755) -SafeCastLibTest:testSafeCastTo32() (gas: 449) -SafeCastLibTest:testSafeCastTo32(uint256) (runs: 256, μ: 2733, ~: 2733) -SafeCastLibTest:testSafeCastTo64() (gas: 492) -SafeCastLibTest:testSafeCastTo64(uint256) (runs: 256, μ: 2732, ~: 2732) +SafeCastLibTest:testSafeCastTo32() (gas: 494) +SafeCastLibTest:testSafeCastTo32(uint256) (runs: 256, μ: 2711, ~: 2711) +SafeCastLibTest:testSafeCastTo48() (gas: 448) +SafeCastLibTest:testSafeCastTo48(uint256) (runs: 256, μ: 2711, ~: 2711) +SafeCastLibTest:testSafeCastTo64() (gas: 470) +SafeCastLibTest:testSafeCastTo64(uint256) (runs: 256, μ: 2710, ~: 2710) SafeCastLibTest:testSafeCastTo8() (gas: 491) SafeCastLibTest:testSafeCastTo8(uint256) (runs: 256, μ: 2710, ~: 2710) SafeCastLibTest:testSafeCastTo96() (gas: 469) -SafeCastLibTest:testSafeCastTo96(uint256) (runs: 256, μ: 2711, ~: 2711) +SafeCastLibTest:testSafeCastTo96(uint256) (runs: 256, μ: 2755, ~: 2755) SafeTransferLibTest:testApproveWithGarbage(address,uint256,bytes,bytes) (runs: 256, μ: 2664, ~: 2231) SafeTransferLibTest:testApproveWithMissingReturn() (gas: 30751) SafeTransferLibTest:testApproveWithMissingReturn(address,uint256,bytes) (runs: 256, μ: 30328, ~: 31566) @@ -449,11 +453,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: 1931) +WETHInvariants:invariantTotalSupplyEqualsBalance() (runs: 256, calls: 3840, reverts: 1929) 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, μ: 75443, ~: 78076) +WETHTest:testWithdraw(uint256,uint256) (runs: 256, μ: 75443, ~: 78076) \ No newline at end of file diff --git a/src/test/SafeCastLib.t.sol b/src/test/SafeCastLib.t.sol index 0a564538..6fb12dad 100644 --- a/src/test/SafeCastLib.t.sol +++ b/src/test/SafeCastLib.t.sol @@ -41,6 +41,11 @@ contract SafeCastLibTest is DSTestPlus { assertEq(SafeCastLib.safeCastTo64(2.5e17), 2.5e17); } + function testSafeCastTo48() public { + assertEq(SafeCastLib.safeCastTo32(2.5e8), 2.5e8); + assertEq(SafeCastLib.safeCastTo32(2.5e7), 2.5e7); + } + function testSafeCastTo32() public { assertEq(SafeCastLib.safeCastTo32(2.5e8), 2.5e8); assertEq(SafeCastLib.safeCastTo32(2.5e7), 2.5e7); @@ -89,6 +94,10 @@ contract SafeCastLibTest is DSTestPlus { SafeCastLib.safeCastTo64(type(uint64).max + 1); } + function testFailSafeCastTo48() public pure { + SafeCastLib.safeCastTo48(type(uint48).max + 1); + } + function testFailSafeCastTo32() public pure { SafeCastLib.safeCastTo32(type(uint32).max + 1); } @@ -143,6 +152,12 @@ contract SafeCastLibTest is DSTestPlus { assertEq(SafeCastLib.safeCastTo64(x), x); } + function testSafeCastTo48(uint256 x) public { + x = bound(x, 0, type(uint48).max); + + assertEq(SafeCastLib.safeCastTo48(x), x); + } + function testSafeCastTo32(uint256 x) public { x = bound(x, 0, type(uint32).max); @@ -203,6 +218,12 @@ contract SafeCastLibTest is DSTestPlus { SafeCastLib.safeCastTo64(x); } + function testFailSafeCastTo48(uint256 x) public { + x = bound(x, type(uint48).max + 1, type(uint256).max); + + SafeCastLib.safeCastTo48(x); + } + function testFailSafeCastTo32(uint256 x) public { x = bound(x, type(uint32).max + 1, type(uint256).max); diff --git a/src/utils/SafeCastLib.sol b/src/utils/SafeCastLib.sol index ebbed225..eb7da456 100644 --- a/src/utils/SafeCastLib.sol +++ b/src/utils/SafeCastLib.sol @@ -47,6 +47,12 @@ library SafeCastLib { y = uint64(x); } + function safeCastTo48(uint256 x) internal pure returns (uint48 y) { + require(x < 1 << 48); + + y = uint48(x); + } + function safeCastTo32(uint256 x) internal pure returns (uint32 y) { require(x < 1 << 32);