Skip to content

Commit 640491c

Browse files
committed
chore: add paymaster e2e test
1 parent ae7ad11 commit 640491c

File tree

3 files changed

+219
-2
lines changed

3 files changed

+219
-2
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ fn add_session_call_data(
8484
}
8585

8686
#[cfg(test)]
87-
mod tests {
87+
pub mod tests {
8888
use super::*;
8989
use crate::{
9090
erc4337::{
@@ -128,7 +128,7 @@ mod tests {
128128
};
129129
use std::str::FromStr;
130130

131-
fn generate_session_proof(
131+
pub fn generate_session_proof(
132132
session_spec: &SessionSpec,
133133
account_address: Address,
134134
signer_private_key: &str,
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
pub mod params;
22
pub mod pimlico;
33

4+
#[cfg(test)]
5+
pub mod paymaster_test;
6+
47
#[cfg(test)]
58
pub mod mock_paymaster;
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
mod tests {
2+
use crate::{
3+
erc4337::{
4+
account::{
5+
erc7579::module::{
6+
Module,
7+
add::{AddModuleParams, AddModulePayload, add_module},
8+
installed::{IsModuleInstalledParams, is_module_installed},
9+
},
10+
modular_smart_account::{
11+
deploy::{
12+
DeployAccountParams, EOASigners,
13+
user_op::{
14+
DeployAccountWithUserOpParams,
15+
deploy_account_with_user_op,
16+
},
17+
},
18+
session::{
19+
create::{
20+
CreateSessionParams, create_session,
21+
tests::generate_session_proof,
22+
},
23+
session_lib::session_spec::{
24+
SessionSpec, limit_type::LimitType,
25+
transfer_spec::TransferSpec,
26+
usage_limit::UsageLimit,
27+
},
28+
},
29+
test_utilities::fund_account_with_default_amount,
30+
},
31+
},
32+
paymaster::{
33+
mock_paymaster::deploy_mock_paymaster_and_deposit_amount,
34+
params::PaymasterParams,
35+
},
36+
signer::create_eoa_signer,
37+
},
38+
utils::alloy_utilities::test_utilities::{
39+
TestInfraConfig,
40+
start_anvil_and_deploy_contracts_and_start_bundler_with_config,
41+
},
42+
};
43+
use alloy::primitives::{U256, Uint, address};
44+
use alloy_provider::ProviderBuilder;
45+
46+
#[tokio::test]
47+
async fn test_deploy_account_create_session_with_paymaster()
48+
-> eyre::Result<()> {
49+
let (
50+
node_url,
51+
anvil_instance,
52+
provider,
53+
contracts,
54+
signer_private_key,
55+
bundler,
56+
bundler_client,
57+
) = {
58+
let signer_private_key = "0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6".to_string();
59+
start_anvil_and_deploy_contracts_and_start_bundler_with_config(
60+
&TestInfraConfig {
61+
signer_private_key: signer_private_key.clone(),
62+
},
63+
)
64+
.await?
65+
};
66+
67+
let unfunded_provider =
68+
ProviderBuilder::new().connect_http(node_url.clone());
69+
70+
let entry_point_address =
71+
address!("0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108");
72+
73+
let factory_address = contracts.account_factory;
74+
let session_key_module = contracts.session_validator;
75+
let eoa_validator_address = contracts.eoa_validator;
76+
77+
let signers =
78+
vec![address!("0xa0Ee7A142d267C1f36714E4a8F75612F20a79720")];
79+
80+
let eoa_signers = EOASigners {
81+
addresses: signers,
82+
validator_address: eoa_validator_address,
83+
};
84+
85+
let (mock_paymaster, paymaster_address) =
86+
deploy_mock_paymaster_and_deposit_amount(
87+
U256::from(1_000_000_000_000_000_000u64),
88+
provider.clone(),
89+
)
90+
.await?;
91+
let paymaster =
92+
Some(PaymasterParams::default_paymaster(paymaster_address));
93+
94+
let signer = create_eoa_signer(
95+
signer_private_key.clone(),
96+
eoa_validator_address,
97+
)?;
98+
99+
// sponsored account deployment
100+
let address =
101+
deploy_account_with_user_op(DeployAccountWithUserOpParams {
102+
deploy_params: DeployAccountParams {
103+
factory_address,
104+
eoa_signers: Some(eoa_signers),
105+
webauthn_signer: None,
106+
session_validator: None,
107+
id: None,
108+
provider: unfunded_provider.clone(),
109+
},
110+
entry_point_address,
111+
bundler_client: bundler_client.clone(),
112+
signer,
113+
paymaster: paymaster.clone(),
114+
nonce_key: None,
115+
})
116+
.await?;
117+
118+
fund_account_with_default_amount(address, provider.clone()).await?;
119+
120+
// add session module
121+
{
122+
let signer = create_eoa_signer(
123+
signer_private_key.clone(),
124+
eoa_validator_address,
125+
)?;
126+
127+
add_module(AddModuleParams {
128+
account_address: address,
129+
module: AddModulePayload::session_key(session_key_module),
130+
entry_point_address,
131+
paymaster: None,
132+
provider: provider.clone(),
133+
bundler_client: bundler_client.clone(),
134+
signer,
135+
})
136+
.await?;
137+
138+
let is_session_key_module_installed =
139+
is_module_installed(IsModuleInstalledParams {
140+
module: Module::session_key_validator(session_key_module),
141+
account: address,
142+
provider: provider.clone(),
143+
})
144+
.await?;
145+
146+
eyre::ensure!(
147+
is_session_key_module_installed,
148+
"session_key_module is not installed"
149+
);
150+
151+
println!("\n\n\nsession_key_module successfully installed\n\n\n")
152+
}
153+
154+
// create session with rich wallet
155+
let signer = create_eoa_signer(
156+
signer_private_key.clone(),
157+
eoa_validator_address,
158+
)?;
159+
160+
{
161+
let signer_address =
162+
address!("0xa0Ee7A142d267C1f36714E4a8F75612F20a79720");
163+
let expires_at = Uint::from(2088558400u64);
164+
let target = address!("0xa0Ee7A142d267C1f36714E4a8F75612F20a79720");
165+
let session_spec = SessionSpec {
166+
signer: signer_address,
167+
expires_at,
168+
call_policies: vec![],
169+
fee_limit: UsageLimit {
170+
limit_type: LimitType::Lifetime,
171+
limit: U256::from(1_000_000_000_000_000_000u64),
172+
period: Uint::from(0),
173+
},
174+
transfer_policies: vec![TransferSpec {
175+
max_value_per_use: U256::from(1),
176+
target,
177+
value_limit: UsageLimit {
178+
limit_type: LimitType::Unlimited,
179+
limit: U256::from(0),
180+
period: Uint::from(0),
181+
},
182+
}],
183+
};
184+
185+
// Calculate proof
186+
let proof = generate_session_proof(
187+
&session_spec,
188+
address,
189+
&signer_private_key,
190+
)?;
191+
192+
create_session(CreateSessionParams {
193+
account_address: address,
194+
spec: session_spec,
195+
entry_point_address,
196+
session_key_validator: session_key_module,
197+
paymaster,
198+
bundler_client,
199+
provider: unfunded_provider,
200+
signer,
201+
proof,
202+
})
203+
.await?;
204+
}
205+
206+
println!("Session successfully created");
207+
208+
drop(mock_paymaster);
209+
drop(bundler);
210+
drop(anvil_instance);
211+
212+
Ok(())
213+
}
214+
}

0 commit comments

Comments
 (0)