Skip to content

Commit 2d34ff7

Browse files
committed
fix: rust tests without session deployment
still need e2e fixes
1 parent ee44e16 commit 2d34ff7

File tree

7 files changed

+201
-87
lines changed

7 files changed

+201
-87
lines changed

packages/sdk-platforms/rust/zksync-sso-erc4337/crates/zksync-sso-erc4337-core/src/erc4337/account/modular_smart_account/deploy.rs

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ mod tests {
218218
calls::{Execution, encode_calls},
219219
module::{
220220
Module,
221+
add::{AddModuleParams, AddModulePayload, add_module},
221222
installed::{
222223
IsModuleInstalledParams, is_module_installed,
223224
},
@@ -246,8 +247,9 @@ mod tests {
246247
},
247248
};
248249
use alloy::{
249-
primitives::{U256, Uint, address},
250-
signers::local::PrivateKeySigner,
250+
primitives::{U256, Uint, address, keccak256},
251+
signers::{SignerSync, local::PrivateKeySigner},
252+
sol_types::SolValue,
251253
};
252254
use std::{future::Future, pin::Pin, str::FromStr, sync::Arc};
253255

@@ -458,30 +460,27 @@ mod tests {
458460
PrivateKeySigner::from_str(session_key_hex)?.address();
459461
println!("Session signer address: {}", session_signer_address);
460462

461-
// Deploy account WITH session validator pre-installed
463+
// Deploy account WITHOUT session validator pre-installed
462464
let signers =
463465
vec![address!("0xa0Ee7A142d267C1f36714E4a8F75612F20a79720")];
464466
let eoa_signers = EOASigners {
465467
addresses: signers,
466468
validator_address: eoa_validator_address,
467469
};
468-
let session_config = SessionValidatorConfig {
469-
validator_address: session_validator_address,
470-
};
471470

472471
let address = deploy_account(DeployAccountParams {
473472
factory_address,
474473
eoa_signers: Some(eoa_signers),
475474
webauthn_signer: None,
476-
session_validator: Some(session_config),
475+
session_validator: None,
477476
id: None,
478477
provider: provider.clone(),
479478
})
480479
.await?;
481480

482-
println!("✓ Account deployed with session validator pre-installed");
481+
println!("✓ Account deployed (without session validator)");
483482

484-
// Verify both modules are installed
483+
// Verify EOA module is installed
485484
let is_eoa_installed = is_module_installed(IsModuleInstalledParams {
486485
module: Module::eoa_validator(eoa_validator_address),
487486
account: address,
@@ -490,6 +489,31 @@ mod tests {
490489
.await?;
491490
eyre::ensure!(is_eoa_installed, "EOA validator not installed");
492491

492+
// Fund the account
493+
fund_account_with_default_amount(address, provider.clone()).await?;
494+
println!("✓ Account funded");
495+
496+
// Create EOA signer
497+
let eoa_signer = create_eoa_signer(
498+
signer_private_key.clone(),
499+
eoa_validator_address,
500+
)?;
501+
502+
// Install Session Validator Module
503+
add_module(AddModuleParams {
504+
account_address: address,
505+
module: AddModulePayload::session_key(session_validator_address),
506+
entry_point_address,
507+
paymaster: None,
508+
provider: provider.clone(),
509+
bundler_client: bundler_client.clone(),
510+
signer: eoa_signer.clone(),
511+
})
512+
.await?;
513+
514+
println!("✓ Session validator installed");
515+
516+
// Verify session module is installed
493517
let is_session_installed =
494518
is_module_installed(IsModuleInstalledParams {
495519
module: Module::session_key_validator(
@@ -503,16 +527,6 @@ mod tests {
503527

504528
println!("✓ Both EOA and Session validators verified as installed");
505529

506-
// Fund the account
507-
fund_account_with_default_amount(address, provider.clone()).await?;
508-
println!("✓ Account funded");
509-
510-
// Create a session using EOA signer
511-
let eoa_signer = create_eoa_signer(
512-
signer_private_key.clone(),
513-
eoa_validator_address,
514-
)?;
515-
516530
let expires_at = Uint::from(2088558400u64); // Year 2036
517531
let target = address!("0xa0Ee7A142d267C1f36714E4a8F75612F20a79720");
518532

@@ -536,6 +550,16 @@ mod tests {
536550
}],
537551
};
538552

553+
// Calculate proof
554+
let session_lib_spec: crate::erc4337::account::modular_smart_account::session::contract::SessionLib::SessionSpec = session_spec.clone().into();
555+
let session_hash = keccak256(session_lib_spec.abi_encode());
556+
let digest = keccak256((session_hash, address).abi_encode());
557+
558+
let session_signer_instance =
559+
PrivateKeySigner::from_str(session_key_hex)?;
560+
let proof =
561+
session_signer_instance.sign_hash_sync(&digest)?.as_bytes().into();
562+
539563
create_session(CreateSessionParams {
540564
account_address: address,
541565
spec: session_spec.clone(),
@@ -545,7 +569,7 @@ mod tests {
545569
bundler_client: bundler_client.clone(),
546570
provider: provider.clone(),
547571
signer: eoa_signer,
548-
proof: Bytes::default(),
572+
proof,
549573
})
550574
.await?;
551575

packages/sdk-platforms/rust/zksync-sso-erc4337/crates/zksync-sso-erc4337-core/src/erc4337/account/modular_smart_account/session.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ pub mod signature_wasm;
1111
pub mod state;
1212
pub mod status;
1313

14-
mod contract;
14+
pub mod contract;

packages/sdk-platforms/rust/zksync-sso-erc4337/crates/zksync-sso-erc4337-core/src/erc4337/account/modular_smart_account/session/active.rs

Lines changed: 80 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,12 @@ mod tests {
144144
},
145145
};
146146
use alloy::{
147-
primitives::{Bytes, FixedBytes, U256, Uint, address},
147+
primitives::{FixedBytes, U256, Uint, address, keccak256},
148148
rpc::types::{BlockNumberOrTag, FilterBlockOption, FilterSet},
149+
signers::{SignerSync, local::PrivateKeySigner},
150+
sol_types::SolValue,
149151
};
150-
use std::collections::HashSet;
152+
use std::{collections::HashSet, str::FromStr};
151153

152154
fn create_session_logs_filter(
153155
session_key_validator_address: Address,
@@ -270,11 +272,12 @@ mod tests {
270272

271273
// Create first session (will remain active)
272274
let session_spec_1 = {
273-
let signer_address =
274-
address!("0xa0Ee7A142d267C1f36714E4a8F75612F20a79720");
275+
let signer_key =
276+
PrivateKeySigner::from_str(&signer_private_key).unwrap();
277+
let signer_address = signer_key.address();
275278
let expires_at = Uint::from(2088558400u64);
276279
let target = address!("0xa0Ee7A142d267C1f36714E4a8F75612F20a79720");
277-
SessionSpec {
280+
let spec = SessionSpec {
278281
signer: signer_address,
279282
expires_at,
280283
call_policies: vec![],
@@ -292,31 +295,39 @@ mod tests {
292295
period: Uint::from(0),
293296
},
294297
}],
295-
}
296-
};
298+
};
297299

298-
create_session(CreateSessionParams {
299-
account_address,
300-
spec: session_spec_1.clone(),
301-
entry_point_address,
302-
session_key_validator: session_key_module,
303-
paymaster: None,
304-
bundler_client: bundler_client.clone(),
305-
provider: provider.clone(),
306-
signer: signer.clone(),
307-
proof: Bytes::default(),
308-
})
309-
.await?;
300+
let session_hash = hash_session(spec.clone());
301+
let hash_to_sign =
302+
keccak256((session_hash, account_address).abi_encode());
303+
let signature = signer_key.sign_hash_sync(&hash_to_sign).unwrap();
304+
let proof = signature.as_bytes();
305+
306+
create_session(CreateSessionParams {
307+
account_address,
308+
spec: spec.clone(),
309+
entry_point_address,
310+
session_key_validator: session_key_module,
311+
paymaster: None,
312+
bundler_client: bundler_client.clone(),
313+
provider: provider.clone(),
314+
signer: signer.clone(),
315+
proof: proof.into(),
316+
})
317+
.await?;
318+
319+
spec
320+
};
310321

311322
println!("Session 1 created");
312323

313324
// Create second session (will be revoked)
314325
let session_spec_2 = {
315-
let signer_address =
316-
address!("0xb0Ee7A142d267C1f36714E4a8F75612F20a79721");
326+
let signer_key = PrivateKeySigner::random();
327+
let signer_address = signer_key.address();
317328
let expires_at = Uint::from(2088558400u64);
318329
let target = address!("0xb0Ee7A142d267C1f36714E4a8F75612F20a79721");
319-
SessionSpec {
330+
let spec = SessionSpec {
320331
signer: signer_address,
321332
expires_at,
322333
call_policies: vec![],
@@ -334,31 +345,39 @@ mod tests {
334345
period: Uint::from(0),
335346
},
336347
}],
337-
}
338-
};
348+
};
339349

340-
create_session(CreateSessionParams {
341-
account_address,
342-
spec: session_spec_2.clone(),
343-
entry_point_address,
344-
session_key_validator: session_key_module,
345-
paymaster: None,
346-
bundler_client: bundler_client.clone(),
347-
provider: provider.clone(),
348-
signer: signer.clone(),
349-
proof: Bytes::default(),
350-
})
351-
.await?;
350+
let session_hash = hash_session(spec.clone());
351+
let hash_to_sign =
352+
keccak256((session_hash, account_address).abi_encode());
353+
let signature = signer_key.sign_hash_sync(&hash_to_sign).unwrap();
354+
let proof = signature.as_bytes();
355+
356+
create_session(CreateSessionParams {
357+
account_address,
358+
spec: spec.clone(),
359+
entry_point_address,
360+
session_key_validator: session_key_module,
361+
paymaster: None,
362+
bundler_client: bundler_client.clone(),
363+
provider: provider.clone(),
364+
signer: signer.clone(),
365+
proof: proof.into(),
366+
})
367+
.await?;
368+
369+
spec
370+
};
352371

353372
println!("Session 2 created");
354373

355374
// Create third session (will remain active)
356375
let session_spec_3 = {
357-
let signer_address =
358-
address!("0xc0Ee7A142d267C1f36714E4a8F75612F20a79722");
376+
let signer_key = PrivateKeySigner::random();
377+
let signer_address = signer_key.address();
359378
let expires_at = Uint::from(2088558400u64);
360379
let target = address!("0xc0Ee7A142d267C1f36714E4a8F75612F20a79722");
361-
SessionSpec {
380+
let spec = SessionSpec {
362381
signer: signer_address,
363382
expires_at,
364383
call_policies: vec![],
@@ -376,21 +395,29 @@ mod tests {
376395
period: Uint::from(0),
377396
},
378397
}],
379-
}
380-
};
398+
};
381399

382-
create_session(CreateSessionParams {
383-
account_address,
384-
spec: session_spec_3.clone(),
385-
entry_point_address,
386-
session_key_validator: session_key_module,
387-
paymaster: None,
388-
bundler_client: bundler_client.clone(),
389-
provider: provider.clone(),
390-
signer: signer.clone(),
391-
proof: Bytes::default(),
392-
})
393-
.await?;
400+
let session_hash = hash_session(spec.clone());
401+
let hash_to_sign =
402+
keccak256((session_hash, account_address).abi_encode());
403+
let signature = signer_key.sign_hash_sync(&hash_to_sign).unwrap();
404+
let proof = signature.as_bytes();
405+
406+
create_session(CreateSessionParams {
407+
account_address,
408+
spec: spec.clone(),
409+
entry_point_address,
410+
session_key_validator: session_key_module,
411+
paymaster: None,
412+
bundler_client: bundler_client.clone(),
413+
provider: provider.clone(),
414+
signer: signer.clone(),
415+
proof: proof.into(),
416+
})
417+
.await?;
418+
419+
spec
420+
};
394421

395422
println!("Session 3 created");
396423

0 commit comments

Comments
 (0)