@@ -49,7 +49,7 @@ contract SimpleAccountTest is BaseTest {
4949 address private nonSigner;
5050
5151 // UserOp terminology: `sender` is the smart wallet.
52- address private sender = 0xBB956D56140CA3f3060986586A2631922a4B347E ;
52+ address private sender = 0x0df2C3523703d165Aa7fA1a552f3F0B56275DfC6 ;
5353 address payable private beneficiary = payable (address (0x45654 ));
5454
5555 bytes32 private uidCache = bytes32 ("random uid " );
@@ -141,6 +141,63 @@ contract SimpleAccountTest is BaseTest {
141141 ops[0 ] = op;
142142 }
143143
144+ function _setupUserOpWithSender (
145+ bytes memory _initCode ,
146+ bytes memory _callDataForEntrypoint ,
147+ address _sender
148+ ) internal returns (UserOperation[] memory ops ) {
149+ uint256 nonce = entrypoint.getNonce (_sender, 0 );
150+
151+ // Get user op fields
152+ UserOperation memory op = UserOperation ({
153+ sender: _sender,
154+ nonce: nonce,
155+ initCode: _initCode,
156+ callData: _callDataForEntrypoint,
157+ callGasLimit: 500_000 ,
158+ verificationGasLimit: 500_000 ,
159+ preVerificationGas: 500_000 ,
160+ maxFeePerGas: 0 ,
161+ maxPriorityFeePerGas: 0 ,
162+ paymasterAndData: bytes ("" ),
163+ signature: bytes ("" )
164+ });
165+
166+ // Sign UserOp
167+ bytes32 opHash = EntryPoint (entrypoint).getUserOpHash (op);
168+ bytes32 msgHash = ECDSA.toEthSignedMessageHash (opHash);
169+
170+ (uint8 v , bytes32 r , bytes32 s ) = vm.sign (accountAdminPKey, msgHash);
171+ bytes memory userOpSignature = abi.encodePacked (r, s, v);
172+
173+ address recoveredSigner = ECDSA.recover (msgHash, v, r, s);
174+ address expectedSigner = vm.addr (accountAdminPKey);
175+ assertEq (recoveredSigner, expectedSigner);
176+
177+ op.signature = userOpSignature;
178+
179+ // Store UserOp
180+ ops = new UserOperation [](1 );
181+ ops[0 ] = op;
182+ }
183+
184+ function _setupUserOpExecuteWithSender (
185+ bytes memory _initCode ,
186+ address _target ,
187+ uint256 _value ,
188+ bytes memory _callData ,
189+ address _sender
190+ ) internal returns (UserOperation[] memory ) {
191+ bytes memory callDataForEntrypoint = abi.encodeWithSignature (
192+ "execute(address,uint256,bytes) " ,
193+ _target,
194+ _value,
195+ _callData
196+ );
197+
198+ return _setupUserOpWithSender (_initCode, callDataForEntrypoint, _sender);
199+ }
200+
144201 function _setupUserOpExecute (
145202 uint256 _signerPKey ,
146203 bytes memory _initCode ,
@@ -175,6 +232,11 @@ contract SimpleAccountTest is BaseTest {
175232 return _setupUserOp (_signerPKey, _initCode, callDataForEntrypoint);
176233 }
177234
235+ /// @dev Returns the salt used when deploying an Account.
236+ function _generateSalt (address _admin , bytes memory _data ) internal view virtual returns (bytes32 ) {
237+ return keccak256 (abi.encode (_admin, _data));
238+ }
239+
178240 function setUp () public override {
179241 super .setUp ();
180242
@@ -234,7 +296,53 @@ contract SimpleAccountTest is BaseTest {
234296 function test_revert_onRegister_nonFactoryChildContract () public {
235297 vm.prank (address (0x12345 ));
236298 vm.expectRevert ("AccountFactory: not an account. " );
237- accountFactory.onRegister (accountAdmin, "" );
299+ accountFactory.onRegister (_generateSalt (accountAdmin, "" ));
300+ }
301+
302+ /// @dev Create more than one accounts with the same admin.
303+ function test_state_createAccount_viaEntrypoint_multipleAccountSameAdmin () public {
304+ uint256 amount = 100 ;
305+
306+ for (uint256 i = 0 ; i < amount; i += 1 ) {
307+ bytes memory initCallData = abi.encodeWithSignature (
308+ "createAccount(address,bytes) " ,
309+ accountAdmin,
310+ bytes (abi.encode (i))
311+ );
312+ bytes memory initCode = abi.encodePacked (abi.encodePacked (address (accountFactory)), initCallData);
313+
314+ address expectedSenderAddress = Clones.predictDeterministicAddress (
315+ accountFactory.accountImplementation (),
316+ _generateSalt (accountAdmin, bytes (abi.encode (i))),
317+ address (accountFactory)
318+ );
319+
320+ UserOperation[] memory userOpCreateAccount = _setupUserOpExecuteWithSender (
321+ initCode,
322+ address (0 ),
323+ 0 ,
324+ bytes (abi.encode (i)),
325+ expectedSenderAddress
326+ );
327+
328+ vm.expectEmit (true , true , false , true );
329+ emit AccountCreated (expectedSenderAddress, accountAdmin);
330+ EntryPoint (entrypoint).handleOps (userOpCreateAccount, beneficiary);
331+ }
332+
333+ address [] memory allAccounts = accountFactory.getAllAccounts ();
334+ assertEq (allAccounts.length , amount);
335+
336+ for (uint256 i = 0 ; i < amount; i += 1 ) {
337+ assertEq (
338+ allAccounts[i],
339+ Clones.predictDeterministicAddress (
340+ accountFactory.accountImplementation (),
341+ _generateSalt (accountAdmin, bytes (abi.encode (i))),
342+ address (accountFactory)
343+ )
344+ );
345+ }
238346 }
239347
240348 /*///////////////////////////////////////////////////////////////
0 commit comments