Skip to content

Commit 5b42199

Browse files
committed
chore: add paymaster e2e test
1 parent c587bd5 commit 5b42199

File tree

3 files changed

+210
-2
lines changed

3 files changed

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

0 commit comments

Comments
 (0)