Skip to content

Commit

Permalink
Edit errors (Uniswap#109)
Browse files Browse the repository at this point in the history
* errors

* errors

* nit
  • Loading branch information
snreynolds authored Nov 10, 2022
1 parent 41e405b commit 8e981ae
Show file tree
Hide file tree
Showing 33 changed files with 136 additions and 126 deletions.
2 changes: 1 addition & 1 deletion .forge-snapshots/batchTransferFrom.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
62244
62268
2 changes: 1 addition & 1 deletion .forge-snapshots/batchTransferFromMultiToken.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
84076
84086
Original file line number Diff line number Diff line change
@@ -1 +1 @@
60848
60864
2 changes: 1 addition & 1 deletion .forge-snapshots/permitBatchCleanWrite.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
91880
91885
2 changes: 1 addition & 1 deletion .forge-snapshots/permitBatchDirtyWrite.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
57680
57685
Original file line number Diff line number Diff line change
@@ -1 +1 @@
143570
143590
2 changes: 1 addition & 1 deletion .forge-snapshots/permitBatchTransferFromSingleToken.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
88886
88896
2 changes: 1 addition & 1 deletion .forge-snapshots/permitCleanWrite.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
63133
63144
2 changes: 1 addition & 1 deletion .forge-snapshots/permitCompactSig.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
63081
63092
2 changes: 1 addition & 1 deletion .forge-snapshots/permitDirtyNonce.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
44028
44039
2 changes: 1 addition & 1 deletion .forge-snapshots/permitDirtyWrite.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
46033
46044
2 changes: 1 addition & 1 deletion .forge-snapshots/permitInvalidSigner.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
40546
40557
2 changes: 1 addition & 1 deletion .forge-snapshots/permitSetMaxAllowanceCleanWrite.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
61128
61139
2 changes: 1 addition & 1 deletion .forge-snapshots/permitSetMaxAllowanceDirtyWrite.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
44028
44039
2 changes: 1 addition & 1 deletion .forge-snapshots/permitSignatureExpired.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
31354
31828
2 changes: 1 addition & 1 deletion .forge-snapshots/permitTransferFromBatchTypedWitness.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
120766
120781
2 changes: 1 addition & 1 deletion .forge-snapshots/permitTransferFromCompactSig.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
88554
88573
2 changes: 1 addition & 1 deletion .forge-snapshots/permitTransferFromSingleToken.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
88606
88625
2 changes: 1 addition & 1 deletion .forge-snapshots/permitTransferFromTypedWitness.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
90427
90446
2 changes: 1 addition & 1 deletion .forge-snapshots/single recipient 2 tokens.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
118626
118641
2 changes: 1 addition & 1 deletion .forge-snapshots/single recipient many tokens.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
134304
134359
2 changes: 1 addition & 1 deletion .forge-snapshots/transferFrom with different owners.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
62176
62186
2 changes: 1 addition & 1 deletion .forge-snapshots/transferFrom.snap
Original file line number Diff line number Diff line change
@@ -1 +1 @@
52354
52359
160 changes: 80 additions & 80 deletions .gas-snapshot
Original file line number Diff line number Diff line change
@@ -1,87 +1,87 @@
AllowanceTransferTest:testApprove() (gas: 47747)
AllowanceTransferTest:testBatchTransferFrom() (gas: 159742)
AllowanceTransferTest:testBatchTransferFromDifferentOwners() (gas: 235756)
AllowanceTransferTest:testBatchTransferFromMultiToken() (gas: 232008)
AllowanceTransferTest:testBatchTransferFromWithGasSnapshot() (gas: 160270)
AllowanceTransferTest:testExcessiveInvalidation() (gas: 64187)
AllowanceTransferTest:testInvalidateMultipleNonces() (gas: 83635)
AllowanceTransferTest:testInvalidateNonces() (gas: 63151)
AllowanceTransferTest:testInvalidateNoncesInvalid() (gas: 16308)
AllowanceTransferTest:testLockdown() (gas: 146051)
AllowanceTransferTest:testLockdownEvent() (gas: 117879)
AllowanceTransferTest:testMaxAllowance() (gas: 134990)
AllowanceTransferTest:testMaxAllowanceDirtyWrite() (gas: 117579)
AllowanceTransferTest:testPartialAllowance() (gas: 105214)
AllowanceTransferTest:testReuseOrderedNonceInvalid() (gas: 69347)
AllowanceTransferTest:testSetAllowance() (gas: 89563)
AllowanceTransferTest:testSetAllowanceBatch() (gas: 133539)
AllowanceTransferTest:testSetAllowanceBatchDifferentNonces() (gas: 118489)
AllowanceTransferTest:testSetAllowanceBatchDirtyWrite() (gas: 99054)
AllowanceTransferTest:testSetAllowanceBatchEvent() (gas: 111671)
AllowanceTransferTest:testSetAllowanceCompactSig() (gas: 89496)
AllowanceTransferTest:testSetAllowanceDeadlinePassed() (gas: 56197)
AllowanceTransferTest:testSetAllowanceDirtyWrite() (gas: 72177)
AllowanceTransferTest:testSetAllowanceIncorrectSigLength() (gas: 29265)
AllowanceTransferTest:testSetAllowanceInvalidSignature() (gas: 64316)
AllowanceTransferTest:testSetAllowanceTransfer() (gas: 103298)
AllowanceTransferTest:testSetAllowanceTransferDirtyNonceDirtyTransfer() (gas: 97569)
AllowanceTransferTest:testTransferFromWithGasSnapshot() (gas: 133141)
CompactSignature:testCompactSignature27() (gas: 231)
AllowanceTransferTest:testBatchTransferFrom() (gas: 159731)
AllowanceTransferTest:testBatchTransferFromDifferentOwners() (gas: 235810)
AllowanceTransferTest:testBatchTransferFromMultiToken() (gas: 232023)
AllowanceTransferTest:testBatchTransferFromWithGasSnapshot() (gas: 160281)
AllowanceTransferTest:testExcessiveInvalidation() (gas: 64220)
AllowanceTransferTest:testInvalidateMultipleNonces() (gas: 83657)
AllowanceTransferTest:testInvalidateNonces() (gas: 63184)
AllowanceTransferTest:testInvalidateNoncesInvalid() (gas: 16330)
AllowanceTransferTest:testLockdown() (gas: 146078)
AllowanceTransferTest:testLockdownEvent() (gas: 117884)
AllowanceTransferTest:testMaxAllowance() (gas: 135031)
AllowanceTransferTest:testMaxAllowanceDirtyWrite() (gas: 117620)
AllowanceTransferTest:testPartialAllowance() (gas: 105230)
AllowanceTransferTest:testReuseOrderedNonceInvalid() (gas: 69391)
AllowanceTransferTest:testSetAllowance() (gas: 89596)
AllowanceTransferTest:testSetAllowanceBatch() (gas: 133566)
AllowanceTransferTest:testSetAllowanceBatchDifferentNonces() (gas: 118533)
AllowanceTransferTest:testSetAllowanceBatchDirtyWrite() (gas: 99081)
AllowanceTransferTest:testSetAllowanceBatchEvent() (gas: 111698)
AllowanceTransferTest:testSetAllowanceCompactSig() (gas: 89529)
AllowanceTransferTest:testSetAllowanceDeadlinePassed() (gas: 56602)
AllowanceTransferTest:testSetAllowanceDirtyWrite() (gas: 72188)
AllowanceTransferTest:testSetAllowanceIncorrectSigLength() (gas: 29298)
AllowanceTransferTest:testSetAllowanceInvalidSignature() (gas: 64327)
AllowanceTransferTest:testSetAllowanceTransfer() (gas: 103336)
AllowanceTransferTest:testSetAllowanceTransferDirtyNonceDirtyTransfer() (gas: 97607)
AllowanceTransferTest:testTransferFromWithGasSnapshot() (gas: 133179)
CompactSignature:testCompactSignature27() (gas: 253)
CompactSignature:testCompactSignature28() (gas: 141)
EIP712Test:testDomainSeparator() (gas: 5759)
EIP712Test:testDomainSeparatorAfterFork() (gas: 10696)
NonceBitmapTest:testHighNonces() (gas: 35936)
NonceBitmapTest:testInvalidateFullWord() (gas: 62827)
EIP712Test:testDomainSeparator() (gas: 5781)
EIP712Test:testDomainSeparatorAfterFork() (gas: 10718)
NonceBitmapTest:testHighNonces() (gas: 35958)
NonceBitmapTest:testInvalidateFullWord() (gas: 62849)
NonceBitmapTest:testInvalidateNonzeroWord() (gas: 85329)
NonceBitmapTest:testLowNonces() (gas: 40649)
NonceBitmapTest:testNonceWordBoundary() (gas: 42024)
NonceBitmapTest:testUseTwoRandomNonces(uint256,uint256) (runs: 256, μ: 49067, ~: 51501)
NonceBitmapTest:testUsingNonceTwiceFails(uint256) (runs: 256, μ: 21758, ~: 21780)
Permit2LibTest:testOZSafePermit() (gas: 24421)
Permit2LibTest:testOZSafePermitPlusOZSafeTransferFrom() (gas: 129137)
Permit2LibTest:testOZSafeTransferFrom() (gas: 38853)
Permit2LibTest:testPermit2() (gas: 22715)
Permit2LibTest:testPermit2DSLessToken() (gas: 6796)
Permit2LibTest:testPermit2DSMore32Token() (gas: 6883)
Permit2LibTest:testPermit2DSMoreToken() (gas: 6786)
Permit2LibTest:testPermit2Full() (gas: 42049)
Permit2LibTest:testPermit2InvalidAmount() (gas: 20423)
Permit2LibTest:testPermit2LargerDS() (gas: 51018)
Permit2LibTest:testPermit2LargerDSRevert() (gas: 32735)
Permit2LibTest:testPermit2NonPermitToken() (gas: 31858)
Permit2LibTest:testPermit2PlusTransferFrom2() (gas: 126838)
Permit2LibTest:testPermit2PlusTransferFrom2WithNonPermit() (gas: 147975)
Permit2LibTest:testPermit2SmallerDS() (gas: 77505)
NonceBitmapTest:testLowNonces() (gas: 40671)
NonceBitmapTest:testNonceWordBoundary() (gas: 42042)
NonceBitmapTest:testUseTwoRandomNonces(uint256,uint256) (runs: 256, μ: 48918, ~: 51523)
NonceBitmapTest:testUsingNonceTwiceFails(uint256) (runs: 256, μ: 21775, ~: 21798)
Permit2LibTest:testOZSafePermit() (gas: 24443)
Permit2LibTest:testOZSafePermitPlusOZSafeTransferFrom() (gas: 129153)
Permit2LibTest:testOZSafeTransferFrom() (gas: 38875)
Permit2LibTest:testPermit2() (gas: 22737)
Permit2LibTest:testPermit2DSLessToken() (gas: 6818)
Permit2LibTest:testPermit2DSMore32Token() (gas: 6905)
Permit2LibTest:testPermit2DSMoreToken() (gas: 6808)
Permit2LibTest:testPermit2Full() (gas: 42082)
Permit2LibTest:testPermit2InvalidAmount() (gas: 20445)
Permit2LibTest:testPermit2LargerDS() (gas: 51051)
Permit2LibTest:testPermit2LargerDSRevert() (gas: 32768)
Permit2LibTest:testPermit2NonPermitToken() (gas: 31891)
Permit2LibTest:testPermit2PlusTransferFrom2() (gas: 126854)
Permit2LibTest:testPermit2PlusTransferFrom2WithNonPermit() (gas: 148007)
Permit2LibTest:testPermit2SmallerDS() (gas: 77516)
Permit2LibTest:testPermit2SmallerDSNoRevert() (gas: 59230)
Permit2LibTest:testStandardPermit() (gas: 22230)
Permit2LibTest:testStandardTransferFrom() (gas: 38055)
Permit2LibTest:testTransferFrom2() (gas: 38492)
Permit2LibTest:testTransferFrom2Full() (gas: 53349)
Permit2LibTest:testStandardPermit() (gas: 22252)
Permit2LibTest:testStandardTransferFrom() (gas: 38077)
Permit2LibTest:testTransferFrom2() (gas: 38514)
Permit2LibTest:testTransferFrom2Full() (gas: 53376)
Permit2LibTest:testTransferFrom2InvalidAmount() (gas: 12666)
Permit2LibTest:testTransferFrom2NonPermitToken() (gas: 53195)
Permit2LibTest:testTransferFrom2NonPermitToken() (gas: 53222)
SignatureTransferTest:testCorrectWitnessTypehashes() (gas: 3075)
SignatureTransferTest:testGasMultiplePermitBatchTransferFrom() (gas: 271080)
SignatureTransferTest:testGasSinglePermitBatchTransferFrom() (gas: 186313)
SignatureTransferTest:testGasSinglePermitTransferFrom() (gas: 123961)
SignatureTransferTest:testInvalidateUnorderedNonces() (gas: 41180)
SignatureTransferTest:testPermitBatchMultiPermitSingleTransfer() (gas: 133684)
SignatureTransferTest:testPermitBatchTransferFrom() (gas: 162111)
SignatureTransferTest:testPermitBatchTransferFromSingleRecipient() (gas: 190398)
SignatureTransferTest:testPermitBatchTransferFromTypedWitness() (gas: 240201)
SignatureTransferTest:testPermitBatchTransferFromTypedWitnessInvalidType() (gas: 84705)
SignatureTransferTest:testPermitBatchTransferFromTypedWitnessInvalidTypeHash() (gas: 86164)
SignatureTransferTest:testPermitBatchTransferFromTypedWitnessInvalidWitness() (gas: 85907)
SignatureTransferTest:testPermitBatchTransferInvalidAmountsLengthMismatch() (gas: 43812)
SignatureTransferTest:testPermitBatchTransferMultiAddr() (gas: 160485)
SignatureTransferTest:testPermitBatchTransferSingleRecipientManyTokens() (gas: 212581)
SignatureTransferTest:testPermitTransferFrom() (gas: 93052)
SignatureTransferTest:testPermitTransferFromCompactSig() (gas: 124010)
SignatureTransferTest:testPermitTransferFromIncorrectSigLength() (gas: 51305)
SignatureTransferTest:testPermitTransferFromInvalidNonce() (gas: 73275)
SignatureTransferTest:testPermitTransferFromRandomNonceAndAmount(uint256,uint128) (runs: 256, μ: 95708, ~: 96684)
SignatureTransferTest:testPermitTransferFromToSpender() (gas: 93360)
SignatureTransferTest:testPermitTransferFromTypedWitness() (gas: 125534)
SignatureTransferTest:testPermitTransferFromTypedWitnessInvalidType() (gas: 56077)
SignatureTransferTest:testPermitTransferFromTypedWitnessInvalidTypehash() (gas: 56961)
SignatureTransferTest:testPermitTransferSpendLessThanFull(uint256,uint128) (runs: 256, μ: 98021, ~: 99739)
SignatureTransferTest:testGasMultiplePermitBatchTransferFrom() (gas: 271122)
SignatureTransferTest:testGasSinglePermitBatchTransferFrom() (gas: 186345)
SignatureTransferTest:testGasSinglePermitTransferFrom() (gas: 124002)
SignatureTransferTest:testInvalidateUnorderedNonces() (gas: 41213)
SignatureTransferTest:testPermitBatchMultiPermitSingleTransfer() (gas: 133699)
SignatureTransferTest:testPermitBatchTransferFrom() (gas: 162126)
SignatureTransferTest:testPermitBatchTransferFromSingleRecipient() (gas: 190435)
SignatureTransferTest:testPermitBatchTransferFromTypedWitness() (gas: 240313)
SignatureTransferTest:testPermitBatchTransferFromTypedWitnessInvalidType() (gas: 84785)
SignatureTransferTest:testPermitBatchTransferFromTypedWitnessInvalidTypeHash() (gas: 86191)
SignatureTransferTest:testPermitBatchTransferFromTypedWitnessInvalidWitness() (gas: 86009)
SignatureTransferTest:testPermitBatchTransferInvalidAmountsLengthMismatch() (gas: 43839)
SignatureTransferTest:testPermitBatchTransferMultiAddr() (gas: 160522)
SignatureTransferTest:testPermitBatchTransferSingleRecipientManyTokens() (gas: 212658)
SignatureTransferTest:testPermitTransferFrom() (gas: 93071)
SignatureTransferTest:testPermitTransferFromCompactSig() (gas: 124051)
SignatureTransferTest:testPermitTransferFromIncorrectSigLength() (gas: 51324)
SignatureTransferTest:testPermitTransferFromInvalidNonce() (gas: 73335)
SignatureTransferTest:testPermitTransferFromRandomNonceAndAmount(uint256,uint128) (runs: 256, μ: 95749, ~: 96725)
SignatureTransferTest:testPermitTransferFromToSpender() (gas: 93401)
SignatureTransferTest:testPermitTransferFromTypedWitness() (gas: 125525)
SignatureTransferTest:testPermitTransferFromTypedWitnessInvalidType() (gas: 56093)
SignatureTransferTest:testPermitTransferFromTypedWitnessInvalidTypehash() (gas: 57002)
SignatureTransferTest:testPermitTransferSpendLessThanFull(uint256,uint128) (runs: 256, μ: 98062, ~: 99780)
MockPermit2Lib:testPermit2Code(address):(bool) (runs: 256, μ: 2911, ~: 2911)
8 changes: 4 additions & 4 deletions src/AllowanceTransfer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ 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();
if (block.timestamp > permitSingle.sigDeadline) revert SignatureExpired(permitSingle.sigDeadline);

// Verify the signer address from the signature.
signature.verify(_hashTypedData(permitSingle.hash()), owner);
Expand All @@ -41,7 +41,7 @@ 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();
if (block.timestamp > permitBatch.sigDeadline) revert SignatureExpired(permitBatch.sigDeadline);

// Verify the signer address from the signature.
signature.verify(_hashTypedData(permitBatch.hash()), owner);
Expand Down Expand Up @@ -76,12 +76,12 @@ contract AllowanceTransfer is IAllowanceTransfer, EIP712 {
function _transfer(address token, address from, address to, uint160 amount) private {
PackedAllowance storage allowed = allowance[from][token][msg.sender];

if (block.timestamp > allowed.expiration) revert AllowanceExpired();
if (block.timestamp > allowed.expiration) revert AllowanceExpired(allowed.expiration);

uint256 maxAmount = allowed.amount;
if (maxAmount != type(uint160).max) {
if (amount > maxAmount) {
revert InsufficientAllowance();
revert InsufficientAllowance(maxAmount);
} else {
unchecked {
allowed.amount = uint160(maxAmount) - amount;
Expand Down
6 changes: 5 additions & 1 deletion src/PermitErrors.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,9 @@ pragma solidity 0.8.17;

/// @notice Shared errors between signature based transfers and allowance based transfers.

error SignatureExpired();
/// @notice Thrown when validating an inputted signature that is stale
/// @param signatureDeadline The timestamp at which a signature is no longer valid
error SignatureExpired(uint256 signatureDeadline);

/// @notice Thrown when validating that the inputted nonce has not been used
error InvalidNonce();
8 changes: 4 additions & 4 deletions src/SignatureTransfer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ contract SignatureTransfer is ISignatureTransfer, EIP712 {
uint256 requestedAmount,
bytes calldata signature
) internal {
if (block.timestamp > permit.deadline) revert SignatureExpired();
if (requestedAmount > permit.permitted.amount) revert InvalidAmount();
if (block.timestamp > permit.deadline) revert SignatureExpired(permit.deadline);
if (requestedAmount > permit.permitted.amount) revert InvalidAmount(permit.permitted.amount);
_useUnorderedNonce(owner, permit.nonce);

signature.verify(_hashTypedData(dataHash), owner);
Expand Down Expand Up @@ -108,7 +108,7 @@ contract SignatureTransfer is ISignatureTransfer, EIP712 {
) internal {
uint256 numPermitted = permit.permitted.length;

if (block.timestamp > permit.deadline) revert SignatureExpired();
if (block.timestamp > permit.deadline) revert SignatureExpired(permit.deadline);
if (numPermitted != transferDetails.length) revert LengthMismatch();

_useUnorderedNonce(owner, permit.nonce);
Expand All @@ -119,7 +119,7 @@ contract SignatureTransfer is ISignatureTransfer, EIP712 {
TokenPermissions memory permitted = permit.permitted[i];
uint256 requestedAmount = transferDetails[i].requestedAmount;

if (requestedAmount > permitted.amount) revert InvalidAmount();
if (requestedAmount > permitted.amount) revert InvalidAmount(permitted.amount);

if (requestedAmount != 0) {
// allow spender to specify which of the permitted tokens should be transferred
Expand Down
6 changes: 4 additions & 2 deletions src/interfaces/IAllowanceTransfer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ pragma solidity ^0.8.17;
/// @notice Handles ERC20 token transfers through signature based actions
/// @dev Requires user's token approval on the Permit2 contract
interface IAllowanceTransfer {
error AllowanceExpired();
error InsufficientAllowance();
/// @param deadline The timestamp at which the allowed amount is no longer valid
error AllowanceExpired(uint256 deadline);
/// @param amount The maximum amount allowed
error InsufficientAllowance(uint256 amount);
error ExcessiveInvalidation();

/// @notice Emits an event when the owner successfully invalidates an ordered nonce.
Expand Down
3 changes: 2 additions & 1 deletion src/interfaces/ISignatureTransfer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ pragma solidity ^0.8.17;
/// @notice Handles ERC20 token transfers through signature based actions
/// @dev Requires user's token approval on the Permit2 contract
interface ISignatureTransfer {
/// @param maxAmount The maximum amount a spender can request to transfer
error InvalidAmount(uint256 maxAmount);
error NotSpender();
error InvalidAmount();
error LengthMismatch();

/// @notice Emits an event when the owner successfully invalidates an unordered nonce.
Expand Down
3 changes: 2 additions & 1 deletion src/libraries/SignatureVerification.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ pragma solidity ^0.8.17;
import {IERC1271} from "../interfaces/IERC1271.sol";

library SignatureVerification {
error InvalidSignatureLength();
error InvalidSignature();
error InvalidSigner();
error InvalidContractSignature();
Expand All @@ -26,7 +27,7 @@ library SignatureVerification {
s = vs & UPPER_BIT_MASK;
v = uint8(uint256(vs >> 255)) + 27;
} else {
revert InvalidSignature();
revert InvalidSignatureLength();
}
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) revert InvalidSignature();
Expand Down
Loading

0 comments on commit 8e981ae

Please sign in to comment.