Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 46 additions & 46 deletions .gas-snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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)
26 changes: 12 additions & 14 deletions src/tokens/ERC20.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/*//////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -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,
Expand All @@ -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)
)
Expand Down