Skip to content

Commit acd6a74

Browse files
committed
feat: remove EIP-191 user operation hash wrapping in SMA and validataion modules
1 parent 9e235f0 commit acd6a74

22 files changed

+77
-125
lines changed

gas-snapshots/ModularAccount.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
"Runtime_NativeTransfer": "54261",
77
"Runtime_UseSessionKey_Case1_Counter": "78463",
88
"Runtime_UseSessionKey_Case1_Token": "111478",
9-
"UserOp_BatchTransfers": "178973",
10-
"UserOp_Erc20Transfer": "165953",
11-
"UserOp_InstallSessionKey_Case1": "518452",
12-
"UserOp_NativeTransfer": "142226",
13-
"UserOp_UseSessionKey_Case1_Counter": "175349",
14-
"UserOp_UseSessionKey_Case1_Token": "208454",
15-
"UserOp_deferredValidation": "214053"
9+
"UserOp_BatchTransfers": "178933",
10+
"UserOp_Erc20Transfer": "165901",
11+
"UserOp_InstallSessionKey_Case1": "518400",
12+
"UserOp_NativeTransfer": "142174",
13+
"UserOp_UseSessionKey_Case1_Counter": "175309",
14+
"UserOp_UseSessionKey_Case1_Token": "208402",
15+
"UserOp_deferredValidation": "214001"
1616
}

gas-snapshots/SemiModularAccount.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
"Runtime_NativeTransfer": "50173",
77
"Runtime_UseSessionKey_Case1_Counter": "78765",
88
"Runtime_UseSessionKey_Case1_Token": "111780",
9-
"UserOp_BatchTransfers": "174154",
10-
"UserOp_Erc20Transfer": "161190",
11-
"UserOp_InstallSessionKey_Case1": "515796",
12-
"UserOp_NativeTransfer": "137481",
13-
"UserOp_UseSessionKey_Case1_Counter": "175616",
14-
"UserOp_UseSessionKey_Case1_Token": "208709",
15-
"UserOp_deferredValidation": "210071"
9+
"UserOp_BatchTransfers": "174087",
10+
"UserOp_Erc20Transfer": "161123",
11+
"UserOp_InstallSessionKey_Case1": "515729",
12+
"UserOp_NativeTransfer": "137402",
13+
"UserOp_UseSessionKey_Case1_Counter": "175540",
14+
"UserOp_UseSessionKey_Case1_Token": "208657",
15+
"UserOp_deferredValidation": "210031"
1616
}

gas/modular-account/ModularAccount.gas.t.sol

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {
88
ValidationConfigLib
99
} from "@erc6900/reference-implementation/libraries/ValidationConfigLib.sol";
1010
import {PackedUserOperation} from "@eth-infinitism/account-abstraction/interfaces/PackedUserOperation.sol";
11-
import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
1211
import {Vm} from "forge-std/Vm.sol";
1312

1413
import {ModularAccountBase} from "../../src/account/ModularAccountBase.sol";
@@ -93,7 +92,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("ModularAccount")
9392
});
9493

9594
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
96-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
95+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, userOpHash);
9796
userOp.signature = _encodeSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
9897

9998
uint256 gasUsed = _userOpBenchmark(userOp);
@@ -152,7 +151,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("ModularAccount")
152151
});
153152

154153
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
155-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
154+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, userOpHash);
156155
userOp.signature = _encodeSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
157156

158157
uint256 gasUsed = _userOpBenchmark(userOp);
@@ -220,7 +219,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("ModularAccount")
220219
});
221220

222221
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
223-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
222+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, userOpHash);
224223
userOp.signature = _encodeSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
225224

226225
uint256 gasUsed = _userOpBenchmark(userOp);
@@ -256,7 +255,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("ModularAccount")
256255
});
257256

258257
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
259-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner2Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
258+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner2Key, userOpHash);
260259
bytes memory uoValidationSig = _packFinalSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
261260

262261
ValidationConfig newUOValidation =
@@ -332,7 +331,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("ModularAccount")
332331
});
333332

334333
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
335-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
334+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, userOpHash);
336335
userOp.signature = _encodeSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
337336

338337
uint256 gasUsed = _userOpBenchmark(userOp);
@@ -399,8 +398,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("ModularAccount")
399398
});
400399

401400
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
402-
(uint8 v, bytes32 r, bytes32 s) =
403-
vm.sign(sessionSigner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
401+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(sessionSigner1Key, userOpHash);
404402
userOp.signature = _encodeSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
405403

406404
uint256 gasUsed = _userOpBenchmark(userOp);
@@ -472,8 +470,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("ModularAccount")
472470
});
473471

474472
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
475-
(uint8 v, bytes32 r, bytes32 s) =
476-
vm.sign(sessionSigner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
473+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(sessionSigner1Key, userOpHash);
477474
userOp.signature = _encodeSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
478475

479476
uint256 gasUsed = _userOpBenchmark(userOp);

gas/modular-account/SemiModularAccount.gas.t.sol

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {
88
ValidationConfigLib
99
} from "@erc6900/reference-implementation/libraries/ValidationConfigLib.sol";
1010
import {PackedUserOperation} from "@eth-infinitism/account-abstraction/interfaces/PackedUserOperation.sol";
11-
import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
1211
import {Vm} from "forge-std/Vm.sol";
1312

1413
import {ModularAccountBase} from "../../src/account/ModularAccountBase.sol";
@@ -87,7 +86,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("SemiModularAccoun
8786
});
8887

8988
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
90-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
89+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, userOpHash);
9190
userOp.signature = _encodeSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
9291

9392
uint256 gasUsed = _userOpBenchmark(userOp);
@@ -146,7 +145,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("SemiModularAccoun
146145
});
147146

148147
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
149-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
148+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, userOpHash);
150149
userOp.signature = _encodeSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
151150

152151
uint256 gasUsed = _userOpBenchmark(userOp);
@@ -214,7 +213,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("SemiModularAccoun
214213
});
215214

216215
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
217-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
216+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, userOpHash);
218217
userOp.signature = _encodeSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
219218

220219
uint256 gasUsed = _userOpBenchmark(userOp);
@@ -250,7 +249,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("SemiModularAccoun
250249
});
251250

252251
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
253-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner2Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
252+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner2Key, userOpHash);
254253
bytes memory uoValidationSig = _packFinalSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
255254

256255
ValidationConfig newUOValidation =
@@ -322,7 +321,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("SemiModularAccoun
322321
});
323322

324323
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
325-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
324+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, userOpHash);
326325
userOp.signature = _encodeSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
327326

328327
uint256 gasUsed = _userOpBenchmark(userOp);
@@ -389,8 +388,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("SemiModularAccoun
389388
});
390389

391390
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
392-
(uint8 v, bytes32 r, bytes32 s) =
393-
vm.sign(sessionSigner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
391+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(sessionSigner1Key, userOpHash);
394392
userOp.signature = _encodeSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
395393

396394
uint256 gasUsed = _userOpBenchmark(userOp);
@@ -462,8 +460,7 @@ contract ModularAccountGasTest is ModularAccountBenchmarkBase("SemiModularAccoun
462460
});
463461

464462
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
465-
(uint8 v, bytes32 r, bytes32 s) =
466-
vm.sign(sessionSigner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
463+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(sessionSigner1Key, userOpHash);
467464
userOp.signature = _encodeSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
468465

469466
uint256 gasUsed = _userOpBenchmark(userOp);

src/account/SemiModularAccountBase.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ abstract contract SemiModularAccountBase is ModularAccountBase {
117117
if (validationLookupKey.eq(FALLBACK_VALIDATION_LOOKUP_KEY)) {
118118
address fallbackSigner = _getFallbackSigner();
119119

120-
if (_checkSignature(fallbackSigner, userOpHash.toEthSignedMessageHash(), signatureSegment)) {
120+
if (_checkSignature(fallbackSigner, userOpHash, signatureSegment)) {
121121
return _SIG_VALIDATION_PASSED;
122122
}
123123
return _SIG_VALIDATION_FAILED;

src/modules/validation/SingleSignerValidationModule.sol

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import {ReplaySafeWrapper} from "@erc6900/reference-implementation/modules/Repla
2323
import {PackedUserOperation} from "@eth-infinitism/account-abstraction/interfaces/PackedUserOperation.sol";
2424
import {IERC165} from "@openzeppelin/contracts/interfaces/IERC165.sol";
2525
import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
26-
import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
2726
import {SignatureChecker} from "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol";
2827

2928
import {SignatureType} from "../../helpers/SignatureType.sol";
@@ -43,8 +42,6 @@ import {ModuleBase} from "../ModuleBase.sol";
4342
/// - This validation supports composition that other validation can relay on entities in this validation to
4443
/// validate partially or fully.
4544
contract SingleSignerValidationModule is IValidationModule, ReplaySafeWrapper, ModuleBase {
46-
using MessageHashUtils for bytes32;
47-
4845
uint256 internal constant _SIG_VALIDATION_PASSED = 0;
4946
uint256 internal constant _SIG_VALIDATION_FAILED = 1;
5047

@@ -93,7 +90,7 @@ contract SingleSignerValidationModule is IValidationModule, ReplaySafeWrapper, M
9390
returns (uint256)
9491
{
9592
// Validate the user op signature against the owner.
96-
if (_checkSig(signers[entityId][userOp.sender], userOpHash.toEthSignedMessageHash(), userOp.signature)) {
93+
if (_checkSig(signers[entityId][userOp.sender], userOpHash, userOp.signature)) {
9794
return _SIG_VALIDATION_PASSED;
9895
}
9996
return _SIG_VALIDATION_FAILED;

src/modules/validation/WebAuthnValidationModule.sol

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import {IValidationModule} from "@erc6900/reference-implementation/interfaces/IV
2222
import {ReplaySafeWrapper} from "@erc6900/reference-implementation/modules/ReplaySafeWrapper.sol";
2323
import {PackedUserOperation} from "@eth-infinitism/account-abstraction/interfaces/PackedUserOperation.sol";
2424
import {IERC165} from "@openzeppelin/contracts/interfaces/IERC165.sol";
25-
import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
2625
import {WebAuthn} from "webauthn-sol/src/WebAuthn.sol";
2726

2827
import {ModuleBase} from "../ModuleBase.sol";
@@ -40,7 +39,6 @@ import {ModuleBase} from "../ModuleBase.sol";
4039
/// - This validation supports composition that other validation can relay on entities in this validation to
4140
/// validate partially or fully.
4241
contract WebAuthnValidationModule is IValidationModule, ReplaySafeWrapper, ModuleBase {
43-
using MessageHashUtils for bytes32;
4442
using WebAuthn for WebAuthn.WebAuthnAuth;
4543

4644
struct PubKey {
@@ -103,7 +101,7 @@ contract WebAuthnValidationModule is IValidationModule, ReplaySafeWrapper, Modul
103101
override
104102
returns (uint256)
105103
{
106-
if (_validateSignature(entityId, userOp.sender, userOpHash.toEthSignedMessageHash(), userOp.signature)) {
104+
if (_validateSignature(entityId, userOp.sender, userOpHash, userOp.signature)) {
107105
return _SIG_VALIDATION_PASSED;
108106
}
109107

test/account/DeferredAction.t.sol

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import {ValidationConfigLib} from "@erc6900/reference-implementation/libraries/V
2929
import {IAccountExecute} from "@eth-infinitism/account-abstraction/interfaces/IAccountExecute.sol";
3030
import {IEntryPoint} from "@eth-infinitism/account-abstraction/interfaces/IEntryPoint.sol";
3131
import {PackedUserOperation} from "@eth-infinitism/account-abstraction/interfaces/PackedUserOperation.sol";
32-
import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
3332

3433
import {ModularAccount} from "../../src/account/ModularAccount.sol";
3534
import {ModularAccountBase} from "../../src/account/ModularAccountBase.sol";
@@ -96,7 +95,7 @@ contract DeferredActionTest is AccountTestBase {
9695
});
9796

9897
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
99-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
98+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, userOpHash);
10099
bytes memory uoSig = _packFinalSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
101100

102101
uint48 deferredInstallDeadline = 0;
@@ -146,7 +145,7 @@ contract DeferredActionTest is AccountTestBase {
146145
});
147146

148147
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
149-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
148+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, userOpHash);
150149
bytes memory uoSig = _packFinalSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
151150

152151
uint48 deferredInstallDeadline = 0;
@@ -187,7 +186,7 @@ contract DeferredActionTest is AccountTestBase {
187186
});
188187

189188
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
190-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
189+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, userOpHash);
191190
bytes memory uoSig = _packFinalSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
192191

193192
uint48 deferredInstallDeadline = 0;
@@ -230,7 +229,7 @@ contract DeferredActionTest is AccountTestBase {
230229
});
231230

232231
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
233-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
232+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner1Key, userOpHash);
234233
bytes memory uoSig = _packFinalSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
235234

236235
uint48 deferredInstallDeadline = 0;
@@ -309,7 +308,7 @@ contract DeferredActionTest is AccountTestBase {
309308
});
310309

311310
bytes32 userOpHash = entryPoint.getUserOpHash(userOp);
312-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner2Key, MessageHashUtils.toEthSignedMessageHash(userOpHash));
311+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(owner2Key, userOpHash);
313312
bytes memory uoSig = _packFinalSignature(abi.encodePacked(EOA_TYPE_SIGNATURE, r, s, v));
314313

315314
uint48 deferredInstallDeadline = 0;

0 commit comments

Comments
 (0)