|
| 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