diff --git a/.gas-snapshot b/.gas-snapshot index eb62dce4..dd00603f 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -27,12 +27,12 @@ AuthTest:testTransferOwnershipWithPermissiveAuthority() (gas: 127926) AuthTest:testTransferOwnershipWithPermissiveAuthority(address,address) (runs: 256, μ: 130981, ~: 131000) Bytes32AddressLibTest:testFillLast12Bytes() (gas: 223) Bytes32AddressLibTest:testFromLast20Bytes() (gas: 191) -CREATE3Test:testDeployERC20() (gas: 853111) -CREATE3Test:testDeployERC20(bytes32,string,string,uint8) (runs: 256, μ: 922796, ~: 921961) -CREATE3Test:testFailDoubleDeployDifferentBytecode() (gas: 9079256848778914174) -CREATE3Test:testFailDoubleDeployDifferentBytecode(bytes32,bytes,bytes) (runs: 256, μ: 5062195514745832485, ~: 8937393460516727435) +CREATE3Test:testDeployERC20() (gas: 887935) +CREATE3Test:testDeployERC20(bytes32,string,string,uint8) (runs: 256, μ: 960277, ~: 957040) +CREATE3Test:testFailDoubleDeployDifferentBytecode() (gas: 9079256848778914835) +CREATE3Test:testFailDoubleDeployDifferentBytecode(bytes32,bytes,bytes) (runs: 256, μ: 5062749668606231585, ~: 8937393460516727435) CREATE3Test:testFailDoubleDeploySameBytecode() (gas: 9079256848778906218) -CREATE3Test:testFailDoubleDeploySameBytecode(bytes32,bytes) (runs: 256, μ: 5027837975401088878, ~: 8937393460516728677) +CREATE3Test:testFailDoubleDeploySameBytecode(bytes32,bytes) (runs: 256, μ: 5027283821540689776, ~: 8937393460516728677) DSTestPlusTest:testBound() (gas: 14214) DSTestPlusTest:testBound(uint256,uint256,uint256) (runs: 256, μ: 2787, ~: 2793) DSTestPlusTest:testBrutalizeMemory() (gas: 823) @@ -115,13 +115,13 @@ ERC1155Test:testSafeTransferFromToEOA() (gas: 93167) ERC1155Test:testSafeTransferFromToEOA(uint256,uint256,bytes,uint256,address,bytes) (runs: 256, μ: 93478, ~: 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: 2606) +ERC20Invariants:invariantBalanceSum() (runs: 256, calls: 3840, reverts: 2391) +ERC20Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2544) ERC20Test:testApprove() (gas: 31058) ERC20Test:testApprove(address,uint256) (runs: 256, μ: 30424, ~: 31280) -ERC20Test:testBurn() (gas: 56970) -ERC20Test:testBurn(address,uint256,uint256) (runs: 256, μ: 56678, ~: 59645) -ERC20Test:testFailBurnInsufficientBalance(address,uint256,uint256) (runs: 256, μ: 51897, ~: 55492) +ERC20Test:testBurn() (gas: 56993) +ERC20Test:testBurn(address,uint256,uint256) (runs: 256, μ: 56637, ~: 59668) +ERC20Test:testFailBurnInsufficientBalance(address,uint256,uint256) (runs: 256, μ: 51919, ~: 55515) ERC20Test:testFailPermitBadDeadline() (gas: 36924) ERC20Test:testFailPermitBadDeadline(uint256,address,uint256,uint256) (runs: 256, μ: 32148, ~: 37218) ERC20Test:testFailPermitBadNonce() (gas: 36874) @@ -130,39 +130,39 @@ ERC20Test:testFailPermitPastDeadline() (gas: 10938) ERC20Test:testFailPermitPastDeadline(uint256,address,uint256,uint256) (runs: 256, μ: 12037, ~: 13101) ERC20Test:testFailPermitReplay() (gas: 66285) ERC20Test:testFailPermitReplay(uint256,address,uint256,uint256) (runs: 256, μ: 57071, ~: 66592) -ERC20Test:testFailTransferFromInsufficientAllowance() (gas: 80882) -ERC20Test:testFailTransferFromInsufficientAllowance(address,uint256,uint256) (runs: 256, μ: 79858, ~: 83393) -ERC20Test:testFailTransferFromInsufficientBalance() (gas: 81358) -ERC20Test:testFailTransferFromInsufficientBalance(address,uint256,uint256) (runs: 256, μ: 79359, ~: 83870) -ERC20Test:testFailTransferInsufficientBalance() (gas: 52806) -ERC20Test:testFailTransferInsufficientBalance(address,uint256,uint256) (runs: 256, μ: 51720, ~: 55310) -ERC20Test:testInfiniteApproveTransferFrom() (gas: 89793) -ERC20Test:testMetadata(string,string,uint8) (runs: 256, μ: 870618, ~: 863277) +ERC20Test:testFailTransferFromInsufficientAllowance() (gas: 80949) +ERC20Test:testFailTransferFromInsufficientAllowance(address,uint256,uint256) (runs: 256, μ: 79923, ~: 83460) +ERC20Test:testFailTransferFromInsufficientBalance() (gas: 81425) +ERC20Test:testFailTransferFromInsufficientBalance(address,uint256,uint256) (runs: 256, μ: 79424, ~: 83937) +ERC20Test:testFailTransferInsufficientBalance() (gas: 52829) +ERC20Test:testFailTransferInsufficientBalance(address,uint256,uint256) (runs: 256, μ: 51742, ~: 55333) +ERC20Test:testInfiniteApproveTransferFrom() (gas: 89860) +ERC20Test:testMetadata(string,string,uint8) (runs: 256, μ: 902642, ~: 897073) ERC20Test:testMint() (gas: 53746) ERC20Test:testMint(address,uint256) (runs: 256, μ: 52214, ~: 53925) ERC20Test:testPermit() (gas: 63193) ERC20Test:testPermit(uint248,address,uint256,uint256) (runs: 256, μ: 62584, ~: 63517) -ERC20Test:testTransfer() (gas: 60272) -ERC20Test:testTransfer(address,uint256) (runs: 256, μ: 58773, ~: 60484) -ERC20Test:testTransferFrom() (gas: 83777) -ERC20Test:testTransferFrom(address,uint256,uint256) (runs: 256, μ: 86464, ~: 92841) -ERC4626Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2881) -ERC4626Test:testFailDepositWithNoApproval() (gas: 13357) -ERC4626Test:testFailDepositWithNotEnoughApproval() (gas: 86993) +ERC20Test:testTransfer() (gas: 60295) +ERC20Test:testTransfer(address,uint256) (runs: 256, μ: 58796, ~: 60507) +ERC20Test:testTransferFrom() (gas: 83831) +ERC20Test:testTransferFrom(address,uint256,uint256) (runs: 256, μ: 86503, ~: 92908) +ERC4626Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2867) +ERC4626Test:testFailDepositWithNoApproval() (gas: 13424) +ERC4626Test:testFailDepositWithNotEnoughApproval() (gas: 87060) ERC4626Test:testFailDepositZero() (gas: 7780) -ERC4626Test:testFailMintWithNoApproval() (gas: 13296) +ERC4626Test:testFailMintWithNoApproval() (gas: 13385) ERC4626Test:testFailRedeemWithNoShareAmount() (gas: 32342) -ERC4626Test:testFailRedeemWithNotEnoughShareAmount() (gas: 203638) +ERC4626Test:testFailRedeemWithNotEnoughShareAmount() (gas: 203705) ERC4626Test:testFailRedeemZero() (gas: 7967) ERC4626Test:testFailWithdrawWithNoUnderlyingAmount() (gas: 32289) -ERC4626Test:testFailWithdrawWithNotEnoughUnderlyingAmount() (gas: 203615) -ERC4626Test:testMetadata(string,string) (runs: 256, μ: 1479572, ~: 1471277) -ERC4626Test:testMintZero() (gas: 54595) -ERC4626Test:testMultipleMintDepositRedeemWithdraw() (gas: 411940) -ERC4626Test:testSingleDepositWithdraw(uint128) (runs: 256, μ: 201569, ~: 201579) -ERC4626Test:testSingleMintRedeem(uint128) (runs: 256, μ: 201484, ~: 201494) -ERC4626Test:testVaultInteractionsForSomeoneElse() (gas: 286247) -ERC4626Test:testWithdrawZero() (gas: 52462) +ERC4626Test:testFailWithdrawWithNotEnoughUnderlyingAmount() (gas: 203682) +ERC4626Test:testMetadata(string,string) (runs: 256, μ: 1514439, ~: 1505178) +ERC4626Test:testMintZero() (gas: 54662) +ERC4626Test:testMultipleMintDepositRedeemWithdraw() (gas: 412069) +ERC4626Test:testSingleDepositWithdraw(uint128) (runs: 256, μ: 201606, ~: 201616) +ERC4626Test:testSingleMintRedeem(uint128) (runs: 256, μ: 201538, ~: 201548) +ERC4626Test:testVaultInteractionsForSomeoneElse() (gas: 286408) +ERC4626Test:testWithdrawZero() (gas: 52463) ERC721Test:invariantMetadata() (runs: 256, calls: 3840, reverts: 2170) ERC721Test:testApprove() (gas: 78427) ERC721Test:testApprove(address,uint256) (runs: 256, μ: 78637, ~: 78637) @@ -390,7 +390,7 @@ SafeTransferLibTest:testApproveWithGarbage(address,uint256,bytes,bytes) (runs: 2 SafeTransferLibTest:testApproveWithMissingReturn() (gas: 30751) SafeTransferLibTest:testApproveWithMissingReturn(address,uint256,bytes) (runs: 256, μ: 30328, ~: 31566) SafeTransferLibTest:testApproveWithNonContract() (gas: 3035) -SafeTransferLibTest:testApproveWithNonContract(address,address,uint256,bytes) (runs: 256, μ: 4121, ~: 4117) +SafeTransferLibTest:testApproveWithNonContract(address,address,uint256,bytes) (runs: 256, μ: 4120, ~: 4117) SafeTransferLibTest:testApproveWithReturnsTooMuch() (gas: 31134) SafeTransferLibTest:testApproveWithReturnsTooMuch(address,uint256,bytes) (runs: 256, μ: 30796, ~: 32034) SafeTransferLibTest:testApproveWithStandardERC20() (gas: 30882) @@ -405,7 +405,7 @@ SafeTransferLibTest:testFailApproveWithReverting() (gas: 5502) SafeTransferLibTest:testFailApproveWithReverting(address,uint256,bytes) (runs: 256, μ: 6403, ~: 6398) SafeTransferLibTest:testFailTransferETHToContractWithoutFallback() (gas: 7244) SafeTransferLibTest:testFailTransferETHToContractWithoutFallback(uint256,bytes) (runs: 256, μ: 7758, ~: 8055) -SafeTransferLibTest:testFailTransferFromWithGarbage(address,address,uint256,bytes,bytes) (runs: 256, μ: 123242, ~: 117401) +SafeTransferLibTest:testFailTransferFromWithGarbage(address,address,uint256,bytes,bytes) (runs: 256, μ: 122782, ~: 117401) SafeTransferLibTest:testFailTransferFromWithReturnsFalse() (gas: 13663) SafeTransferLibTest:testFailTransferFromWithReturnsFalse(address,address,uint256,bytes) (runs: 256, μ: 14593, ~: 14588) SafeTransferLibTest:testFailTransferFromWithReturnsTooLittle() (gas: 13544) @@ -430,27 +430,27 @@ SafeTransferLibTest:testTransferFromWithNonContract() (gas: 3035) SafeTransferLibTest:testTransferFromWithNonContract(address,address,address,uint256,bytes) (runs: 256, μ: 4223, ~: 4228) SafeTransferLibTest:testTransferFromWithReturnsTooMuch() (gas: 49810) SafeTransferLibTest:testTransferFromWithReturnsTooMuch(address,address,uint256,bytes) (runs: 256, μ: 49002, ~: 50237) -SafeTransferLibTest:testTransferFromWithStandardERC20() (gas: 47603) -SafeTransferLibTest:testTransferFromWithStandardERC20(address,address,uint256,bytes) (runs: 256, μ: 46786, ~: 48049) +SafeTransferLibTest:testTransferFromWithStandardERC20() (gas: 47675) +SafeTransferLibTest:testTransferFromWithStandardERC20(address,address,uint256,bytes) (runs: 256, μ: 46859, ~: 48121) SafeTransferLibTest:testTransferWithGarbage(address,uint256,bytes,bytes) (runs: 256, μ: 2620, ~: 2187) SafeTransferLibTest:testTransferWithMissingReturn() (gas: 36666) SafeTransferLibTest:testTransferWithMissingReturn(address,uint256,bytes) (runs: 256, μ: 36001, ~: 37546) SafeTransferLibTest:testTransferWithNonContract() (gas: 3012) -SafeTransferLibTest:testTransferWithNonContract(address,address,uint256,bytes) (runs: 256, μ: 4185, ~: 4181) +SafeTransferLibTest:testTransferWithNonContract(address,address,uint256,bytes) (runs: 256, μ: 4184, ~: 4181) SafeTransferLibTest:testTransferWithReturnsTooMuch() (gas: 37112) SafeTransferLibTest:testTransferWithReturnsTooMuch(address,uint256,bytes) (runs: 256, μ: 36404, ~: 37949) -SafeTransferLibTest:testTransferWithStandardERC20() (gas: 36696) -SafeTransferLibTest:testTransferWithStandardERC20(address,uint256,bytes) (runs: 256, μ: 36054, ~: 37599) +SafeTransferLibTest:testTransferWithStandardERC20() (gas: 36719) +SafeTransferLibTest:testTransferWithStandardERC20(address,uint256,bytes) (runs: 256, μ: 36077, ~: 37622) SignedWadMathTest:testFailWadDivOverflow(int256,int256) (runs: 256, μ: 368, ~: 351) SignedWadMathTest:testFailWadDivZeroDenominator(int256) (runs: 256, μ: 296, ~: 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: 1864) 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:testPartialWithdraw() (gas: 73259) +WETHTest:testWithdraw() (gas: 54342) +WETHTest:testWithdraw(uint256,uint256) (runs: 256, μ: 75395, ~: 78054) diff --git a/src/tokens/ERC20.sol b/src/tokens/ERC20.sol index 96570446..57c62978 100644 --- a/src/tokens/ERC20.sol +++ b/src/tokens/ERC20.sol @@ -42,6 +42,15 @@ abstract contract ERC20 { bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; + // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)") + bytes32 public constant EIP712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f; + + // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)") + bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; + + // Version 1 of the code: keccak256("1") + bytes32 public constant VERSION_TYPEHASH = 0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6; + mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// @@ -132,18 +141,7 @@ abstract contract ERC20 { abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), - keccak256( - abi.encode( - keccak256( - "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" - ), - owner, - spender, - value, - nonces[owner]++, - deadline - ) - ) + keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)) ) ), v, @@ -167,9 +165,9 @@ abstract contract ERC20 { return keccak256( abi.encode( - keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), + EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), - keccak256("1"), + VERSION_TYPEHASH, block.chainid, address(this) )