diff --git a/.forge-snapshots/batchTransferFrom.snap b/.forge-snapshots/batchTransferFrom.snap index 12330bfb..5470ea34 100644 --- a/.forge-snapshots/batchTransferFrom.snap +++ b/.forge-snapshots/batchTransferFrom.snap @@ -1 +1 @@ -61797 \ No newline at end of file +61935 \ No newline at end of file diff --git a/.forge-snapshots/batchTransferFromMultiToken.snap b/.forge-snapshots/batchTransferFromMultiToken.snap index 6372f872..b257ae83 100644 --- a/.forge-snapshots/batchTransferFromMultiToken.snap +++ b/.forge-snapshots/batchTransferFromMultiToken.snap @@ -1 +1 @@ -81786 \ No newline at end of file +81878 \ No newline at end of file diff --git a/.forge-snapshots/permit2 + transferFrom2 with WETH9's mainnet address.snap b/.forge-snapshots/permit2 + transferFrom2 with WETH9's mainnet address.snap index 95b3b96c..50ffd1fa 100644 --- a/.forge-snapshots/permit2 + transferFrom2 with WETH9's mainnet address.snap +++ b/.forge-snapshots/permit2 + transferFrom2 with WETH9's mainnet address.snap @@ -1 +1 @@ -60346 \ No newline at end of file +60413 \ No newline at end of file diff --git a/.forge-snapshots/permit2 + transferFrom2 with a non EIP-2612 native token with fallback.snap b/.forge-snapshots/permit2 + transferFrom2 with a non EIP-2612 native token with fallback.snap index 01b62767..8608dcd7 100644 --- a/.forge-snapshots/permit2 + transferFrom2 with a non EIP-2612 native token with fallback.snap +++ b/.forge-snapshots/permit2 + transferFrom2 with a non EIP-2612 native token with fallback.snap @@ -1 +1 @@ -65533 \ No newline at end of file +65600 \ No newline at end of file diff --git a/.forge-snapshots/permit2 + transferFrom2 with a non EIP-2612 native token.snap b/.forge-snapshots/permit2 + transferFrom2 with a non EIP-2612 native token.snap index 70b916f2..996df250 100644 --- a/.forge-snapshots/permit2 + transferFrom2 with a non EIP-2612 native token.snap +++ b/.forge-snapshots/permit2 + transferFrom2 with a non EIP-2612 native token.snap @@ -1 +1 @@ -60811 \ No newline at end of file +60878 \ No newline at end of file diff --git a/.forge-snapshots/permitBatchCleanWrite.snap b/.forge-snapshots/permitBatchCleanWrite.snap index ff36c94f..86ee4d10 100644 --- a/.forge-snapshots/permitBatchCleanWrite.snap +++ b/.forge-snapshots/permitBatchCleanWrite.snap @@ -1 +1 @@ -91924 \ No newline at end of file +91967 \ No newline at end of file diff --git a/.forge-snapshots/permitBatchDirtyWrite.snap b/.forge-snapshots/permitBatchDirtyWrite.snap index 2020125e..0733476e 100644 --- a/.forge-snapshots/permitBatchDirtyWrite.snap +++ b/.forge-snapshots/permitBatchDirtyWrite.snap @@ -1 +1 @@ -57724 \ No newline at end of file +57767 \ No newline at end of file diff --git a/.forge-snapshots/permitBatchTransferFromMultipleTokens.snap b/.forge-snapshots/permitBatchTransferFromMultipleTokens.snap index bd650401..367b4ebe 100644 --- a/.forge-snapshots/permitBatchTransferFromMultipleTokens.snap +++ b/.forge-snapshots/permitBatchTransferFromMultipleTokens.snap @@ -1 +1 @@ -143387 \ No newline at end of file +143430 \ No newline at end of file diff --git a/.forge-snapshots/permitBatchTransferFromSingleToken.snap b/.forge-snapshots/permitBatchTransferFromSingleToken.snap index c1642c97..f8ee8a72 100644 --- a/.forge-snapshots/permitBatchTransferFromSingleToken.snap +++ b/.forge-snapshots/permitBatchTransferFromSingleToken.snap @@ -1 +1 @@ -88867 \ No newline at end of file +88910 \ No newline at end of file diff --git a/.forge-snapshots/permitCleanWrite.snap b/.forge-snapshots/permitCleanWrite.snap index c49bc2ab..135adc3c 100644 --- a/.forge-snapshots/permitCleanWrite.snap +++ b/.forge-snapshots/permitCleanWrite.snap @@ -1 +1 @@ -63119 \ No newline at end of file +63162 \ No newline at end of file diff --git a/.forge-snapshots/permitCompactSig.snap b/.forge-snapshots/permitCompactSig.snap index eb882987..1c74ab37 100644 --- a/.forge-snapshots/permitCompactSig.snap +++ b/.forge-snapshots/permitCompactSig.snap @@ -1 +1 @@ -63094 \ No newline at end of file +63137 \ No newline at end of file diff --git a/.forge-snapshots/permitDirtyNonce.snap b/.forge-snapshots/permitDirtyNonce.snap index a909d364..9d36d22d 100644 --- a/.forge-snapshots/permitDirtyNonce.snap +++ b/.forge-snapshots/permitDirtyNonce.snap @@ -1 +1 @@ -44014 \ No newline at end of file +44057 \ No newline at end of file diff --git a/.forge-snapshots/permitDirtyWrite.snap b/.forge-snapshots/permitDirtyWrite.snap index 451c9a87..dec8625b 100644 --- a/.forge-snapshots/permitDirtyWrite.snap +++ b/.forge-snapshots/permitDirtyWrite.snap @@ -1 +1 @@ -46019 \ No newline at end of file +46062 \ No newline at end of file diff --git a/.forge-snapshots/permitInvalidSigner.snap b/.forge-snapshots/permitInvalidSigner.snap index 73ab357b..b4a3d973 100644 --- a/.forge-snapshots/permitInvalidSigner.snap +++ b/.forge-snapshots/permitInvalidSigner.snap @@ -1 +1 @@ -40301 \ No newline at end of file +40344 \ No newline at end of file diff --git a/.forge-snapshots/permitSetMaxAllowanceCleanWrite.snap b/.forge-snapshots/permitSetMaxAllowanceCleanWrite.snap index 6e633733..43aeb618 100644 --- a/.forge-snapshots/permitSetMaxAllowanceCleanWrite.snap +++ b/.forge-snapshots/permitSetMaxAllowanceCleanWrite.snap @@ -1 +1 @@ -61114 \ No newline at end of file +61157 \ No newline at end of file diff --git a/.forge-snapshots/permitSetMaxAllowanceDirtyWrite.snap b/.forge-snapshots/permitSetMaxAllowanceDirtyWrite.snap index a909d364..9d36d22d 100644 --- a/.forge-snapshots/permitSetMaxAllowanceDirtyWrite.snap +++ b/.forge-snapshots/permitSetMaxAllowanceDirtyWrite.snap @@ -1 +1 @@ -44014 \ No newline at end of file +44057 \ No newline at end of file diff --git a/.forge-snapshots/permitSignatureExpired.snap b/.forge-snapshots/permitSignatureExpired.snap index 309c6d2b..144e4f0c 100644 --- a/.forge-snapshots/permitSignatureExpired.snap +++ b/.forge-snapshots/permitSignatureExpired.snap @@ -1 +1 @@ -31700 \ No newline at end of file +31743 \ No newline at end of file diff --git a/.forge-snapshots/permitTransferFromBatchTypedWitness.snap b/.forge-snapshots/permitTransferFromBatchTypedWitness.snap index 3adcc82d..32308bbb 100644 --- a/.forge-snapshots/permitTransferFromBatchTypedWitness.snap +++ b/.forge-snapshots/permitTransferFromBatchTypedWitness.snap @@ -1 +1 @@ -120325 \ No newline at end of file +120368 \ No newline at end of file diff --git a/.forge-snapshots/permitTransferFromCompactSig.snap b/.forge-snapshots/permitTransferFromCompactSig.snap index 3214529f..77dd8a06 100644 --- a/.forge-snapshots/permitTransferFromCompactSig.snap +++ b/.forge-snapshots/permitTransferFromCompactSig.snap @@ -1 +1 @@ -86066 \ No newline at end of file +86109 \ No newline at end of file diff --git a/.forge-snapshots/permitTransferFromSingleToken.snap b/.forge-snapshots/permitTransferFromSingleToken.snap index 8c739819..fee39576 100644 --- a/.forge-snapshots/permitTransferFromSingleToken.snap +++ b/.forge-snapshots/permitTransferFromSingleToken.snap @@ -1 +1 @@ -86092 \ No newline at end of file +86135 \ No newline at end of file diff --git a/.forge-snapshots/permitTransferFromTypedWitness.snap b/.forge-snapshots/permitTransferFromTypedWitness.snap index bf396ab1..7acf4496 100644 --- a/.forge-snapshots/permitTransferFromTypedWitness.snap +++ b/.forge-snapshots/permitTransferFromTypedWitness.snap @@ -1 +1 @@ -87817 \ No newline at end of file +87860 \ No newline at end of file diff --git a/.forge-snapshots/simplePermit2 + transferFrom2 with a non EIP-2612 native token.snap b/.forge-snapshots/simplePermit2 + transferFrom2 with a non EIP-2612 native token.snap index 70b916f2..996df250 100644 --- a/.forge-snapshots/simplePermit2 + transferFrom2 with a non EIP-2612 native token.snap +++ b/.forge-snapshots/simplePermit2 + transferFrom2 with a non EIP-2612 native token.snap @@ -1 +1 @@ -60811 \ No newline at end of file +60878 \ No newline at end of file diff --git a/.forge-snapshots/single recipient 2 tokens.snap b/.forge-snapshots/single recipient 2 tokens.snap index 37c51f05..261078e4 100644 --- a/.forge-snapshots/single recipient 2 tokens.snap +++ b/.forge-snapshots/single recipient 2 tokens.snap @@ -1 +1 @@ -118525 \ No newline at end of file +118568 \ No newline at end of file diff --git a/.forge-snapshots/single recipient many tokens.snap b/.forge-snapshots/single recipient many tokens.snap index 770e7a83..fffbd516 100644 --- a/.forge-snapshots/single recipient many tokens.snap +++ b/.forge-snapshots/single recipient many tokens.snap @@ -1 +1 @@ -133544 \ No newline at end of file +133587 \ No newline at end of file diff --git a/.forge-snapshots/transferFrom with different owners.snap b/.forge-snapshots/transferFrom with different owners.snap index 26fba36e..69e08653 100644 --- a/.forge-snapshots/transferFrom with different owners.snap +++ b/.forge-snapshots/transferFrom with different owners.snap @@ -1 +1 @@ -61886 \ No newline at end of file +61978 \ No newline at end of file diff --git a/.forge-snapshots/transferFrom.snap b/.forge-snapshots/transferFrom.snap index ebbbd605..0e6a5fa3 100644 --- a/.forge-snapshots/transferFrom.snap +++ b/.forge-snapshots/transferFrom.snap @@ -1 +1 @@ -52197 \ No newline at end of file +52243 \ No newline at end of file diff --git a/.gas-snapshot b/.gas-snapshot index 8a9a0e8e..ba8d206e 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,45 +1,45 @@ -AllowanceTransferInvariants:invariant_balanceEqualsSpent() (runs: 256, calls: 3840, reverts: 879) -AllowanceTransferInvariants:invariant_permit2NeverHoldsBalance() (runs: 256, calls: 3840, reverts: 878) -AllowanceTransferInvariants:invariant_spendNeverExceedsPermit() (runs: 256, calls: 3840, reverts: 881) +AllowanceTransferInvariants:invariant_balanceEqualsSpent() (runs: 256, calls: 3840, reverts: 900) +AllowanceTransferInvariants:invariant_permit2NeverHoldsBalance() (runs: 256, calls: 3840, reverts: 913) +AllowanceTransferInvariants:invariant_spendNeverExceedsPermit() (runs: 256, calls: 3840, reverts: 906) AllowanceTransferTest:testApprove() (gas: 47570) -AllowanceTransferTest:testBatchTransferFrom() (gas: 159197) -AllowanceTransferTest:testBatchTransferFromDifferentOwners() (gas: 235094) -AllowanceTransferTest:testBatchTransferFromMultiToken() (gas: 231841) -AllowanceTransferTest:testBatchTransferFromWithGasSnapshot() (gas: 159857) -AllowanceTransferTest:testExcessiveInvalidation() (gas: 64205) -AllowanceTransferTest:testInvalidateMultipleNonces() (gas: 83150) -AllowanceTransferTest:testInvalidateNonces() (gas: 62847) +AllowanceTransferTest:testBatchTransferFrom() (gas: 159378) +AllowanceTransferTest:testBatchTransferFromDifferentOwners() (gas: 235272) +AllowanceTransferTest:testBatchTransferFromMultiToken() (gas: 231976) +AllowanceTransferTest:testBatchTransferFromWithGasSnapshot() (gas: 160038) +AllowanceTransferTest:testExcessiveInvalidation() (gas: 64248) +AllowanceTransferTest:testInvalidateMultipleNonces() (gas: 83236) +AllowanceTransferTest:testInvalidateNonces() (gas: 62890) AllowanceTransferTest:testInvalidateNoncesInvalid() (gas: 16327) -AllowanceTransferTest:testLockdown() (gas: 145984) -AllowanceTransferTest:testLockdownEvent() (gas: 117749) -AllowanceTransferTest:testMaxAllowance() (gas: 134888) -AllowanceTransferTest:testMaxAllowanceDirtyWrite() (gas: 117455) -AllowanceTransferTest:testPartialAllowance() (gas: 105140) -AllowanceTransferTest:testReuseOrderedNonceInvalid() (gas: 69154) -AllowanceTransferTest:testSetAllowance() (gas: 89627) -AllowanceTransferTest:testSetAllowanceBatch() (gas: 133740) -AllowanceTransferTest:testSetAllowanceBatchDifferentNonces() (gas: 118603) -AllowanceTransferTest:testSetAllowanceBatchDirtyWrite() (gas: 99210) -AllowanceTransferTest:testSetAllowanceBatchEvent() (gas: 116049) -AllowanceTransferTest:testSetAllowanceCompactSig() (gas: 89587) -AllowanceTransferTest:testSetAllowanceDeadlinePassed() (gas: 56512) -AllowanceTransferTest:testSetAllowanceDirtyWrite() (gas: 72175) -AllowanceTransferTest:testSetAllowanceIncorrectSigLength() (gas: 29198) -AllowanceTransferTest:testSetAllowanceInvalidSignature() (gas: 64065) -AllowanceTransferTest:testSetAllowanceTransfer() (gas: 103115) -AllowanceTransferTest:testSetAllowanceTransferDirtyNonceDirtyTransfer() (gas: 97194) -AllowanceTransferTest:testTransferFromWithGasSnapshot() (gas: 132867) +AllowanceTransferTest:testLockdown() (gas: 146027) +AllowanceTransferTest:testLockdownEvent() (gas: 117792) +AllowanceTransferTest:testMaxAllowance() (gas: 134977) +AllowanceTransferTest:testMaxAllowanceDirtyWrite() (gas: 117544) +AllowanceTransferTest:testPartialAllowance() (gas: 105229) +AllowanceTransferTest:testReuseOrderedNonceInvalid() (gas: 69240) +AllowanceTransferTest:testSetAllowance() (gas: 89670) +AllowanceTransferTest:testSetAllowanceBatch() (gas: 133783) +AllowanceTransferTest:testSetAllowanceBatchDifferentNonces() (gas: 118689) +AllowanceTransferTest:testSetAllowanceBatchDirtyWrite() (gas: 99253) +AllowanceTransferTest:testSetAllowanceBatchEvent() (gas: 116092) +AllowanceTransferTest:testSetAllowanceCompactSig() (gas: 89630) +AllowanceTransferTest:testSetAllowanceDeadlinePassed() (gas: 56547) +AllowanceTransferTest:testSetAllowanceDirtyWrite() (gas: 72218) +AllowanceTransferTest:testSetAllowanceIncorrectSigLength() (gas: 29241) +AllowanceTransferTest:testSetAllowanceInvalidSignature() (gas: 64108) +AllowanceTransferTest:testSetAllowanceTransfer() (gas: 103204) +AllowanceTransferTest:testSetAllowanceTransferDirtyNonceDirtyTransfer() (gas: 97283) +AllowanceTransferTest:testTransferFromWithGasSnapshot() (gas: 132956) AllowanceUnitTest:testPackAndUnpack(uint160,uint48,uint48) (runs: 256, μ: 39025, ~: 39103) AllowanceUnitTest:testUpdateAllRandomly(uint160,uint48,uint48) (runs: 256, μ: 40243, ~: 40244) AllowanceUnitTest:testUpdateAmountExpirationRandomly(uint160,uint48) (runs: 256, μ: 39169, ~: 39170) CompactSignature:testCompactSignature27() (gas: 300) CompactSignature:testCompactSignature28() (gas: 144) -DeployPermit2Test:testAllowanceTransferSanityCheck() (gas: 101876) -DeployPermit2Test:testDeployPermit2() (gas: 4337527) -DeployPermit2Test:testSignatureTransferSanityCheck() (gas: 92792) +DeployPermit2Test:testAllowanceTransferSanityCheck() (gas: 101965) +DeployPermit2Test:testDeployPermit2() (gas: 4435732) +DeployPermit2Test:testSignatureTransferSanityCheck() (gas: 92835) EIP712Test:testDomainSeparator() (gas: 5881) EIP712Test:testDomainSeparatorAfterFork() (gas: 10830) -MockPermit2Lib:testPermit2Code(address):(bool) (runs: 256, μ: 3003, ~: 3016) +MockPermit2Lib:testPermit2Code(address) (runs: 256, μ: 3029, ~: 3016) NonceBitmapTest:testHighNonces() (gas: 36305) NonceBitmapTest:testInvalidateFullWord() (gas: 63061) NonceBitmapTest:testInvalidateNoncesRandomly(uint248,uint256) (runs: 256, μ: 30439, ~: 31139) @@ -47,8 +47,8 @@ NonceBitmapTest:testInvalidateNonzeroWord() (gas: 85642) NonceBitmapTest:testInvalidateTwoNoncesRandomly(uint248,uint256,uint256) (runs: 256, μ: 39182, ~: 39182) NonceBitmapTest:testLowNonces() (gas: 41041) NonceBitmapTest:testNonceWordBoundary() (gas: 42284) -NonceBitmapTest:testUseTwoRandomNonces(uint256,uint256) (runs: 256, μ: 49190, ~: 51625) -NonceBitmapTest:testUsingNonceTwiceFails(uint256) (runs: 256, μ: 21935, ~: 21960) +NonceBitmapTest:testUseTwoRandomNonces(uint256,uint256) (runs: 256, μ: 49105, ~: 51625) +NonceBitmapTest:testUsingNonceTwiceFails(uint256) (runs: 256, μ: 21932, ~: 21951) Permit2LibTest:testOZSafePermit() (gas: 24682) Permit2LibTest:testOZSafePermitPlusOZSafeTransferFrom() (gas: 129329) Permit2LibTest:testOZSafeTransferFrom() (gas: 39007) @@ -56,53 +56,53 @@ Permit2LibTest:testPermit2() (gas: 22941) Permit2LibTest:testPermit2DSLessToken() (gas: 7143) Permit2LibTest:testPermit2DSMore32Token() (gas: 7252) Permit2LibTest:testPermit2DSMoreToken() (gas: 7023) -Permit2LibTest:testPermit2Full() (gas: 42356) +Permit2LibTest:testPermit2Full() (gas: 42399) Permit2LibTest:testPermit2InvalidAmount() (gas: 21011) -Permit2LibTest:testPermit2LargerDS() (gas: 51464) -Permit2LibTest:testPermit2LargerDSRevert() (gas: 32841) -Permit2LibTest:testPermit2NonPermitFallback() (gas: 37245) -Permit2LibTest:testPermit2NonPermitToken() (gas: 32164) +Permit2LibTest:testPermit2LargerDS() (gas: 51507) +Permit2LibTest:testPermit2LargerDSRevert() (gas: 32884) +Permit2LibTest:testPermit2NonPermitFallback() (gas: 37288) +Permit2LibTest:testPermit2NonPermitToken() (gas: 32207) Permit2LibTest:testPermit2PlusTransferFrom2() (gas: 126995) -Permit2LibTest:testPermit2PlusTransferFrom2WithNonPermit() (gas: 148221) -Permit2LibTest:testPermit2PlusTransferFrom2WithNonPermitFallback() (gas: 174749) -Permit2LibTest:testPermit2PlusTransferFrom2WithWETH9Mainnet() (gas: 147934) -Permit2LibTest:testPermit2SmallerDS() (gas: 77688) +Permit2LibTest:testPermit2PlusTransferFrom2WithNonPermit() (gas: 148288) +Permit2LibTest:testPermit2PlusTransferFrom2WithNonPermitFallback() (gas: 174816) +Permit2LibTest:testPermit2PlusTransferFrom2WithWETH9Mainnet() (gas: 148001) +Permit2LibTest:testPermit2SmallerDS() (gas: 77731) Permit2LibTest:testPermit2SmallerDSNoRevert() (gas: 59324) -Permit2LibTest:testPermit2WETH9Mainnet() (gas: 28774) -Permit2LibTest:testSimplePermit2() (gas: 29117) +Permit2LibTest:testPermit2WETH9Mainnet() (gas: 28817) +Permit2LibTest:testSimplePermit2() (gas: 29160) Permit2LibTest:testSimplePermit2InvalidAmount() (gas: 16944) -Permit2LibTest:testSimplePermit2PlusTransferFrom2WithNonPermit() (gas: 148463) +Permit2LibTest:testSimplePermit2PlusTransferFrom2WithNonPermit() (gas: 148530) Permit2LibTest:testStandardPermit() (gas: 22535) Permit2LibTest:testStandardTransferFrom() (gas: 38143) Permit2LibTest:testTransferFrom2() (gas: 38734) -Permit2LibTest:testTransferFrom2Full() (gas: 53368) +Permit2LibTest:testTransferFrom2Full() (gas: 53392) Permit2LibTest:testTransferFrom2InvalidAmount() (gas: 12732) -Permit2LibTest:testTransferFrom2NonPermitToken() (gas: 53170) +Permit2LibTest:testTransferFrom2NonPermitToken() (gas: 53194) SignatureTransferTest:testCorrectWitnessTypehashes() (gas: 3091) -SignatureTransferTest:testGasMultiplePermitBatchTransferFrom() (gas: 270972) -SignatureTransferTest:testGasSinglePermitBatchTransferFrom() (gas: 183860) -SignatureTransferTest:testGasSinglePermitTransferFrom() (gas: 123854) -SignatureTransferTest:testInvalidateUnorderedNonces() (gas: 41396) -SignatureTransferTest:testPermitBatchMultiPermitSingleTransfer() (gas: 133675) -SignatureTransferTest:testPermitBatchTransferFrom() (gas: 162019) -SignatureTransferTest:testPermitBatchTransferFromSingleRecipient() (gas: 187957) -SignatureTransferTest:testPermitBatchTransferFromTypedWitness() (gas: 239926) -SignatureTransferTest:testPermitBatchTransferFromTypedWitnessInvalidType() (gas: 84489) -SignatureTransferTest:testPermitBatchTransferFromTypedWitnessInvalidTypeHash() (gas: 86007) -SignatureTransferTest:testPermitBatchTransferFromTypedWitnessInvalidWitness() (gas: 85751) -SignatureTransferTest:testPermitBatchTransferInvalidAmountsLengthMismatch() (gas: 41574) -SignatureTransferTest:testPermitBatchTransferMultiAddr() (gas: 160547) -SignatureTransferTest:testPermitBatchTransferSingleRecipientManyTokens() (gas: 209422) -SignatureTransferTest:testPermitTransferFrom() (gas: 92909) -SignatureTransferTest:testPermitTransferFromCompactSig() (gas: 124059) -SignatureTransferTest:testPermitTransferFromIncorrectSigLength() (gas: 51346) -SignatureTransferTest:testPermitTransferFromInvalidNonce() (gas: 72928) -SignatureTransferTest:testPermitTransferFromRandomNonceAndAmount(uint256,uint128) (runs: 256, μ: 95752, ~: 96728) -SignatureTransferTest:testPermitTransferFromToSpender() (gas: 93283) -SignatureTransferTest:testPermitTransferFromTypedWitness() (gas: 125159) -SignatureTransferTest:testPermitTransferFromTypedWitnessInvalidType() (gas: 55947) -SignatureTransferTest:testPermitTransferFromTypedWitnessInvalidTypehash() (gas: 56879) -SignatureTransferTest:testPermitTransferSpendLessThanFull(uint256,uint128) (runs: 256, μ: 97604, ~: 99733) +SignatureTransferTest:testGasMultiplePermitBatchTransferFrom() (gas: 271015) +SignatureTransferTest:testGasSinglePermitBatchTransferFrom() (gas: 183903) +SignatureTransferTest:testGasSinglePermitTransferFrom() (gas: 123897) +SignatureTransferTest:testInvalidateUnorderedNonces() (gas: 41430) +SignatureTransferTest:testPermitBatchMultiPermitSingleTransfer() (gas: 133718) +SignatureTransferTest:testPermitBatchTransferFrom() (gas: 162062) +SignatureTransferTest:testPermitBatchTransferFromSingleRecipient() (gas: 188000) +SignatureTransferTest:testPermitBatchTransferFromTypedWitness() (gas: 240053) +SignatureTransferTest:testPermitBatchTransferFromTypedWitnessInvalidType() (gas: 84546) +SignatureTransferTest:testPermitBatchTransferFromTypedWitnessInvalidTypeHash() (gas: 86050) +SignatureTransferTest:testPermitBatchTransferFromTypedWitnessInvalidWitness() (gas: 85878) +SignatureTransferTest:testPermitBatchTransferInvalidAmountsLengthMismatch() (gas: 41617) +SignatureTransferTest:testPermitBatchTransferMultiAddr() (gas: 160590) +SignatureTransferTest:testPermitBatchTransferSingleRecipientManyTokens() (gas: 209465) +SignatureTransferTest:testPermitTransferFrom() (gas: 92952) +SignatureTransferTest:testPermitTransferFromCompactSig() (gas: 124102) +SignatureTransferTest:testPermitTransferFromIncorrectSigLength() (gas: 51389) +SignatureTransferTest:testPermitTransferFromInvalidNonce() (gas: 73014) +SignatureTransferTest:testPermitTransferFromRandomNonceAndAmount(uint256,uint128) (runs: 256, μ: 95618, ~: 96771) +SignatureTransferTest:testPermitTransferFromToSpender() (gas: 93326) +SignatureTransferTest:testPermitTransferFromTypedWitness() (gas: 125139) +SignatureTransferTest:testPermitTransferFromTypedWitnessInvalidType() (gas: 55927) +SignatureTransferTest:testPermitTransferFromTypedWitnessInvalidTypehash() (gas: 56922) +SignatureTransferTest:testPermitTransferSpendLessThanFull(uint256,uint128) (runs: 256, μ: 97881, ~: 99776) TypehashGeneration:testPermitBatch() (gas: 40473) TypehashGeneration:testPermitBatchTransferFrom() (gas: 49837) TypehashGeneration:testPermitBatchTransferFromWithWitness() (gas: 56621) diff --git a/src/AllowanceTransfer.sol b/src/AllowanceTransfer.sol index 56c4cce0..9cd4e7a7 100644 --- a/src/AllowanceTransfer.sol +++ b/src/AllowanceTransfer.sol @@ -31,7 +31,9 @@ contract AllowanceTransfer is IAllowanceTransfer, EIP712 { /// @inheritdoc IAllowanceTransfer function permit(address owner, PermitSingle memory permitSingle, bytes calldata signature) external { - if (block.timestamp > permitSingle.sigDeadline) revert SignatureExpired(permitSingle.sigDeadline); + if (permitSingle.sigDeadline != type(uint256).max && block.timestamp > permitSingle.sigDeadline) { + revert SignatureExpired(permitSingle.sigDeadline); + } // Verify the signer address from the signature. signature.verify(_hashTypedData(permitSingle.hash()), owner); @@ -41,7 +43,9 @@ contract AllowanceTransfer is IAllowanceTransfer, EIP712 { /// @inheritdoc IAllowanceTransfer function permit(address owner, PermitBatch memory permitBatch, bytes calldata signature) external { - if (block.timestamp > permitBatch.sigDeadline) revert SignatureExpired(permitBatch.sigDeadline); + if (permitBatch.sigDeadline != type(uint256).max && block.timestamp > permitBatch.sigDeadline) { + revert SignatureExpired(permitBatch.sigDeadline); + } // Verify the signer address from the signature. signature.verify(_hashTypedData(permitBatch.hash()), owner); @@ -76,7 +80,9 @@ contract AllowanceTransfer is IAllowanceTransfer, EIP712 { function _transfer(address from, address to, uint160 amount, address token) private { PackedAllowance storage allowed = allowance[from][token][msg.sender]; - if (block.timestamp > allowed.expiration) revert AllowanceExpired(allowed.expiration); + if (allowed.expiration != type(uint48).max && block.timestamp > allowed.expiration) { + revert AllowanceExpired(allowed.expiration); + } uint256 maxAmount = allowed.amount; if (maxAmount != type(uint160).max) { diff --git a/src/SignatureTransfer.sol b/src/SignatureTransfer.sol index c026553a..dc1da07d 100644 --- a/src/SignatureTransfer.sol +++ b/src/SignatureTransfer.sol @@ -57,7 +57,9 @@ contract SignatureTransfer is ISignatureTransfer, EIP712 { ) private { uint256 requestedAmount = transferDetails.requestedAmount; - if (block.timestamp > permit.deadline) revert SignatureExpired(permit.deadline); + if (permit.deadline != type(uint256).max && block.timestamp > permit.deadline) { + revert SignatureExpired(permit.deadline); + } if (requestedAmount > permit.permitted.amount) revert InvalidAmount(permit.permitted.amount); _useUnorderedNonce(owner, permit.nonce); @@ -105,7 +107,9 @@ contract SignatureTransfer is ISignatureTransfer, EIP712 { ) private { uint256 numPermitted = permit.permitted.length; - if (block.timestamp > permit.deadline) revert SignatureExpired(permit.deadline); + if (permit.deadline != type(uint256).max && block.timestamp > permit.deadline) { + revert SignatureExpired(permit.deadline); + } if (numPermitted != transferDetails.length) revert LengthMismatch(); _useUnorderedNonce(owner, permit.nonce); diff --git a/test/utils/DeployPermit2.sol b/test/utils/DeployPermit2.sol index a347c460..d9009121 100644 --- a/test/utils/DeployPermit2.sol +++ b/test/utils/DeployPermit2.sol @@ -15,7 +15,7 @@ contract DeployPermit2 is Script { function run() public returns (address) { bytes memory bytecode = - hex"6040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f0000000000000000000000000000000000000000000000000000000000007a6903611b69577fd5a17abc3865df5c1400c0299bd4ce2eefc8114aec5f9d3dded1745783e57b9890565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a"; + hex"6040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db146112cc578063137c29fe146110d55780632a2d80d114610de75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff83358181116103325761011490369086016116ab565b60243582811161032e5761012b903690870161167a565b610133611546565b9160843585811161032a5761014b9036908a01611621565b98909560a4359081116103265761016491369101611621565b9690958151906101738261145f565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096612064565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611497565b5190209085515161026b81611f8c565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095612037565b03848101835282611497565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611497565b51902093611d98565b80f35b8061031161030b610321938c516117be565b51612125565b61031b82866117be565b52611fdb565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b90369083016116ab565b60243583811161032e576103a2903690840161167a565b9390926103ad611546565b9160643590811161049f576103c491369101611621565b949093835151976103d489611f8c565b98885b81811061047d5750506102f697988151610425816103f9602082018095612037565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611497565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161147b565b808b61031b8261049461030b61049a968d516117be565b926117be565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161167a565b929091845b848110610504578580f35b8061051a61051560019388886119dd565b6119ed565b61052f84610529848a8a6119dd565b016119ed565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff611500565b93610608611523565b610610611546565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b2611500565b906106bb611523565b916106c4611546565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e5611500565b906107ee611523565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f611500565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a60611500565b610a68611523565b610a70611546565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f693611801565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b8f565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661158a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c6114d8565b9160e43567ffffffffffffffff8111610bda576102f694610b6f91369101611621565b939092610b7c8351612125565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161147b565b51902091611c96565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c18611500565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c5183611443565b1261033257845190610c62826113f8565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe9036908401611621565b9290937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81141580610dde575b610daf575050918591610d9f6102f6999a610da595610d4a885161208f565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d978161145f565b519020611c4a565b91612198565b5192511691611a0e565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b50804211610d2b565b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610e23611500565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f57805197858901898110828211176110aa578252848301358181116103265785019036602383011215610326578382013591610e808361164f565b90610e8d85519283611497565b838252602093878584019160071b830101913683116110a6578801905b828210611049575050508a526044610ec3868801611569565b96838c01978852013594838b019186835260443590811161104557610eeb9036908701611621565b9590967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114158061103c575b611011575050508998995151610f2d81611f8c565b908b5b818110610fee57505092889492610d9f92610fbb97958351610f59816103f98682018095612037565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d978161145f565b51169082515192845b848110610fcf578580f35b80610fe88585610fe260019587516117be565b51611a0e565b01610fc4565b806103116110038e9f9e9361100994516117be565b5161208f565b9b9a9b610f30565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b50804211610f18565b8a80fd5b6080823603126110a657856080918851611062816113f8565b61106b85611569565b8152611078838601611569565b838201526110878a8601611667565b8a8201528d611097818701611667565b90820152815201910190610eaa565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576111103661158a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576111426114d8565b67ffffffffffffffff93906101043585811161049f576111659036908601611621565b90936101243596871161032a57611185610bd1966102f698369101611621565b9690958251906111948261145f565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c000000000000000000000000000000000000000000000000000000006080830152835194859181611243602085018096612064565b918237018b8152039361127c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611497565b5190209261128a8651612125565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b858110611345578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8336030112610326576113f288876001946060835161138c816113f8565b6113c8608461139c8d8601611569565b948584526113ac60448201611569565b80978501526113bd60648201611569565b809885015201611569565b918291015273ffffffffffffffffffffffffffffffffffffffff8080809316951693169116611801565b0161133a565b6080810190811067ffffffffffffffff82111761141457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761141457604052565b60a0810190811067ffffffffffffffff82111761141457604052565b60c0810190811067ffffffffffffffff82111761141457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761141457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff821682036114fb57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036114fb57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036114fb57565b6044359073ffffffffffffffffffffffffffffffffffffffff821682036114fb57565b359073ffffffffffffffffffffffffffffffffffffffff821682036114fb57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0190608082126114fb5760408051906115c382611443565b808294126114fb57805181810181811067ffffffffffffffff82111761141457825260043573ffffffffffffffffffffffffffffffffffffffff811681036114fb578152602435602082015282526044356020830152606435910152565b9181601f840112156114fb5782359167ffffffffffffffff83116114fb57602083818601950101116114fb57565b67ffffffffffffffff81116114145760051b60200190565b359065ffffffffffff821682036114fb57565b9181601f840112156114fb5782359167ffffffffffffffff83116114fb576020808501948460061b0101116114fb57565b9190916060818403126114fb5760408051916116c683611443565b8294813567ffffffffffffffff908181116114fb57830182601f820112156114fb5780356116f38161164f565b9261170087519485611497565b818452602094858086019360061b850101938185116114fb579086899897969594939201925b848410611743575050505050855280820135908501520135910152565b9091929394959697848303126114fb578851908982019082821085831117611790578a928992845261177487611569565b8152828701358382015281520193019190889796959493611726565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117d25760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff808860a01c16908114158061191d575b6118ec57508287169683880361187a575b505061187895501692611926565b565b87848416116000146118b757602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118789a03169116179055388061186a565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b50804211611859565b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561197f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117d25760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036114fb5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611b66579185611b3f94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611b445779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611ad1565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f0000000000000000000000000000000000000000000000000000000000007a6903611bda577fd5a17abc3865df5c1400c0299bd4ce2eefc8114aec5f9d3dded1745783e57b9890565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611c448161145f565b51902090565b611c52611b8f565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611c44816113f8565b9192909360a4359360408401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81141580611d8f575b611d5e5750602084510151808611611d2d5750918591610d9f611cfd94611cf8602088015186611f18565b611c4a565b73ffffffffffffffffffffffffffffffffffffffff80915151169260843591821682036114fb5761187893611926565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b50804211611ccd565b9590939580515195604092838301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81141580611f0f575b611edf5750848803611eb657611df6918691610d9f60209b611cf88d88015186611f18565b60005b868110611e0a575050505050505050565b611e158183516117be565b5188611e2283878a6119dd565b01359089810151808311611e86575091818888886001968596611e4c575b50505050505001611df9565b611e7b95611e759273ffffffffffffffffffffffffffffffffffffffff610515935116956119dd565b91611926565b803888888883611e40565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b50804211611dd1565b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611f6257565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611f968261164f565b611fa36040519182611497565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611fd1829461164f565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120085760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110612050575050505090565b835185529381019392810192600101612042565b9081519160005b83811061207c575050016000815290565b806020809284010151818501520161206b565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176114145760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611c44816113f8565b91908260409103126114fb576020823592013590565b6000843b6122ff57506041820361227d576121b582820182612182565b939092604010156117d25760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156122715773ffffffffffffffffffffffffffffffffffffffff806000511691821561224757160361221d57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b604082036122d55761229191810190612182565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff82116120085760209360009360ff6080946121d3565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156124795782916123fb575b507fffffffff00000000000000000000000000000000000000000000000000000000915016036123d157565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d8211612471575b8161241560209383611497565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386123a5565b3d9150612408565b6040513d84823e3d90fdfea164736f6c6343000811000a"; vm.etch(PERMIT2_ADDRESS, bytecode); return PERMIT2_ADDRESS;