Skip to content

Commit 810054b

Browse files
committed
chore: add paymaster e2e test
1 parent ae7ad11 commit 810054b

File tree

3 files changed

+220
-2
lines changed

3 files changed

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

0 commit comments

Comments
 (0)