@@ -21,6 +21,12 @@ contract UserOpMultiSigVerifier is IVerifier, OnlyKeystore {
2121 bytes signature;
2222 }
2323
24+ struct SignatureCheck {
25+ uint8 valid;
26+ uint8 invalid;
27+ bytes32 message;
28+ }
29+
2430 constructor (address aKeystore ) OnlyKeystore (aKeystore) {}
2531
2632 /**
@@ -65,18 +71,18 @@ contract UserOpMultiSigVerifier is IVerifier, OnlyKeystore {
6571 uint256 length = signatures.length ;
6672 require (length <= type (uint8 ).max, MaxSignaturesExceeded ());
6773
68- uint8 valid = 0 ;
69- uint8 invalid = 0 ;
74+ SignatureCheck memory sc ;
75+ sc.message = ECDSA. toEthSignedMessageHash (message) ;
7076 bool [] memory seen = new bool [](owners.length );
7177 for (uint256 i = 0 ; i < length; i++ ) {
7278 SignerData memory sd = signatures[i];
7379
7480 // Note: we need to ensure gas usage is consistent during simulation with dummy signers.
75- ! seen[sd.index] && owners[sd.index] == _ecdsaRecover ( message, sd.signature) ? valid++ : invalid++ ;
81+ ! seen[sd.index] && owners[sd.index] == ECDSA. recover (sc. message, sd.signature) ? sc. valid++ : sc. invalid++ ;
7682 seen[sd.index] = true ;
7783 }
7884
79- return valid >= threshold ? SIG_VALIDATION_SUCCESS : SIG_VALIDATION_FAILED;
85+ return sc. valid >= threshold ? SIG_VALIDATION_SUCCESS : SIG_VALIDATION_FAILED;
8086 }
8187
8288 // ================================================================
@@ -94,8 +100,4 @@ contract UserOpMultiSigVerifier is IVerifier, OnlyKeystore {
94100 require (owners[i] > owners[i - 1 ], OwnersUnsortedOrHasDuplicates ());
95101 }
96102 }
97-
98- function _ecdsaRecover (bytes32 message , bytes memory signature ) internal view returns (address ) {
99- return ECDSA.recover (ECDSA.toEthSignedMessageHash (message), signature);
100- }
101103}
0 commit comments