Skip to content

Commit 96952fb

Browse files
committed
fix: update deploy type
kinda passing now?
1 parent 99a8687 commit 96952fb

File tree

5 files changed

+107
-60
lines changed

5 files changed

+107
-60
lines changed

packages/auth-server-api/src/config.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ let contractsFromFile: {
1717
eoaValidator?: string;
1818
webauthnValidator?: string;
1919
sessionValidator?: string;
20+
guardianExecutor?: string;
2021
} = {};
2122

2223
try {
@@ -39,6 +40,7 @@ const envSchema = z.object({
3940
EOA_VALIDATOR_ADDRESS: z.string().optional(),
4041
WEBAUTHN_VALIDATOR_ADDRESS: z.string().optional(),
4142
SESSION_VALIDATOR_ADDRESS: z.string().optional(),
43+
GUARDIAN_EXECUTOR_ADDRESS: z.string().optional(),
4244
});
4345

4446
// Parse and validate environment variables
@@ -55,6 +57,7 @@ const FACTORY_ADDRESS = env.FACTORY_ADDRESS || contractsFromFile.factory;
5557
const EOA_VALIDATOR_ADDRESS = env.EOA_VALIDATOR_ADDRESS || contractsFromFile.eoaValidator;
5658
const WEBAUTHN_VALIDATOR_ADDRESS = env.WEBAUTHN_VALIDATOR_ADDRESS || contractsFromFile.webauthnValidator;
5759
const SESSION_VALIDATOR_ADDRESS = env.SESSION_VALIDATOR_ADDRESS || contractsFromFile.sessionValidator;
60+
const GUARDIAN_EXECUTOR_ADDRESS = env.GUARDIAN_EXECUTOR_ADDRESS || contractsFromFile.guardianExecutor;
5861

5962
// Validate that we have all required contract addresses
6063
if (!FACTORY_ADDRESS || !EOA_VALIDATOR_ADDRESS || !WEBAUTHN_VALIDATOR_ADDRESS || !SESSION_VALIDATOR_ADDRESS) {
@@ -68,6 +71,10 @@ if (!FACTORY_ADDRESS || !EOA_VALIDATOR_ADDRESS || !WEBAUTHN_VALIDATOR_ADDRESS ||
6871
process.exit(1);
6972
}
7073

74+
if (GUARDIAN_EXECUTOR_ADDRESS) {
75+
console.log("GuardianExecutor module will be installed during account deployment:", GUARDIAN_EXECUTOR_ADDRESS);
76+
}
77+
7178
// Supported chains configuration
7279
const zksyncOsTestnet = defineChain({
7380
id: 8022833,
@@ -99,4 +106,4 @@ function getChain(chainId: number): Chain {
99106
return chain;
100107
}
101108

102-
export { env, EOA_VALIDATOR_ADDRESS, FACTORY_ADDRESS, getChain, SESSION_VALIDATOR_ADDRESS, SUPPORTED_CHAINS, WEBAUTHN_VALIDATOR_ADDRESS };
109+
export { env, EOA_VALIDATOR_ADDRESS, FACTORY_ADDRESS, getChain, GUARDIAN_EXECUTOR_ADDRESS, SESSION_VALIDATOR_ADDRESS, SUPPORTED_CHAINS, WEBAUTHN_VALIDATOR_ADDRESS };

packages/auth-server-api/src/handlers/deploy-account.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { privateKeyToAccount } from "viem/accounts";
44
import { waitForTransactionReceipt } from "viem/actions";
55
import { getAccountAddressFromLogs, prepareDeploySmartAccount } from "zksync-sso-4337/client";
66

7-
import { env, EOA_VALIDATOR_ADDRESS, FACTORY_ADDRESS, getChain, SESSION_VALIDATOR_ADDRESS, WEBAUTHN_VALIDATOR_ADDRESS } from "../config.js";
7+
import { env, EOA_VALIDATOR_ADDRESS, FACTORY_ADDRESS, getChain, GUARDIAN_EXECUTOR_ADDRESS, SESSION_VALIDATOR_ADDRESS, WEBAUTHN_VALIDATOR_ADDRESS } from "../config.js";
88
import { deployAccountSchema } from "../schemas.js";
99

1010
type DeployAccountRequest = {
@@ -58,6 +58,13 @@ export const deployAccountHandler = async (req: Request, res: Response): Promise
5858
}
5959

6060
// Prepare deployment transaction
61+
const executorModulesToInstall = GUARDIAN_EXECUTOR_ADDRESS ? [GUARDIAN_EXECUTOR_ADDRESS as Address] : [];
62+
console.log("🔧 Deployment params:", {
63+
hasGuardianExecutor: !!GUARDIAN_EXECUTOR_ADDRESS,
64+
guardianExecutorAddress: GUARDIAN_EXECUTOR_ADDRESS,
65+
executorModules: executorModulesToInstall,
66+
});
67+
6168
const { transaction, accountId } = prepareDeploySmartAccount({
6269
contracts: {
6370
factory: FACTORY_ADDRESS as Address,
@@ -75,6 +82,7 @@ export const deployAccountHandler = async (req: Request, res: Response): Promise
7582
eoaSigners: body.eoaSigners,
7683
userId: body.userId,
7784
installSessionValidator: true,
85+
executorModules: executorModulesToInstall,
7886
});
7987

8088
console.log("Deploying account with ID:", accountId);

packages/auth-server/composables/useRecoveryGuardian.ts

Lines changed: 12 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Account, Address, Chain, Hex, Transport, WalletClient } from "viem";
2-
import { encodeAbiParameters, encodeFunctionData, keccak256, parseAbiParameters, toHex } from "viem";
2+
import { encodeAbiParameters, keccak256, parseAbiParameters, toHex } from "viem";
33
import { waitForTransactionReceipt } from "viem/actions";
44
import { base64urlToUint8Array, getPublicKeyBytesFromPasskeySignature } from "zksync-sso-4337/utils";
55

@@ -185,67 +185,21 @@ export const useRecoveryGuardian = () => {
185185
stateMutability: "view",
186186
}],
187187
functionName: "isModuleInstalled",
188-
args: [1n, contracts.guardianExecutor, "0x"], // 1 = MODULE_TYPE_EXECUTOR
188+
args: [2n, contracts.guardianExecutor, "0x"], // 2 = MODULE_TYPE_EXECUTOR
189189
});
190190

191-
// Install module if not already installed
191+
// Module should be installed during account deployment
192192
if (!isModuleInstalled) {
193-
// NOTE: installModule must be called DIRECTLY on the account (not wrapped in execute)
194-
// We use sendTransaction with the encoded installModule call as the data
195-
const installModuleData = encodeFunctionData({
196-
abi: [{
197-
type: "function",
198-
name: "installModule",
199-
inputs: [
200-
{ name: "moduleTypeId", type: "uint256" },
201-
{ name: "module", type: "address" },
202-
{ name: "initData", type: "bytes" },
203-
],
204-
outputs: [],
205-
stateMutability: "nonpayable",
206-
}],
207-
functionName: "installModule",
208-
args: [1n, contracts.guardianExecutor, "0x"], // 1 = MODULE_TYPE_EXECUTOR, empty initData
209-
});
210-
211-
const installTx = await client.sendTransaction({
212-
to: accountAddress,
213-
data: installModuleData,
214-
});
215-
216-
const installReceipt = await client.waitForTransactionReceipt({ hash: installTx });
217-
218-
if (installReceipt.status === "reverted") {
219-
throw new Error(`Failed to install GuardianExecutor module for account ${accountAddress}`);
220-
}
221-
222-
// Verify module installation succeeded
223-
const isInitialized = await publicClient.readContract({
224-
address: contracts.guardianExecutor,
225-
abi: GuardianExecutorAbi,
226-
functionName: "isInitialized",
227-
args: [accountAddress],
228-
});
229-
230-
// eslint-disable-next-line no-console
231-
console.log("📋 Module installation verification:", {
232-
guardianExecutor: contracts.guardianExecutor,
233-
account: accountAddress,
234-
isInitialized,
235-
installationTxHash: installTx,
236-
});
237-
238-
if (!isInitialized) {
239-
throw new Error(
240-
`Module installation failed: GuardianExecutor.isInitialized(${accountAddress}) returned false. `
241-
+ `Installation transaction: ${installTx}`,
242-
);
243-
}
244-
245-
// eslint-disable-next-line no-console
246-
console.log("✅ Module installation confirmed");
193+
throw new Error(
194+
`GuardianExecutor module is not installed for account ${accountAddress}. `
195+
+ "The module should be installed during account deployment. "
196+
+ `GuardianExecutor address: ${contracts.guardianExecutor}`,
197+
);
247198
}
248199

200+
// eslint-disable-next-line no-console
201+
console.log("✅ GuardianExecutor module is installed");
202+
249203
// eslint-disable-next-line no-console
250204
console.log("🔍 Proposing guardian:", {
251205
guardianExecutor: contracts.guardianExecutor,
@@ -294,7 +248,7 @@ export const useRecoveryGuardian = () => {
294248
}
295249

296250
// Verify the guardian was actually proposed by checking for the GuardianProposed event
297-
const guardianProposedEventTopic = "0x6d05492139c5ea989514a5d2150c028041e5c087e2a39967f67dc7d2655adb81"; // keccak256("GuardianProposed(address,address)")
251+
const guardianProposedEventTopic = "0xf1284770232ce131bb37044a576145e0b24fd6b24f5710624b11255d5ac61a81"; // keccak256("GuardianProposed(address,address)")
298252
const proposalEvent = receipt.logs.find((log) =>
299253
log.topics[0] === guardianProposedEventTopic
300254
&& log.topics[1]?.toLowerCase() === `0x000000000000000000000000${accountAddress.slice(2).toLowerCase()}`

packages/sdk-4337/src/client/actions/deploy.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ export type PrepareDeploySmartAccountParams = {
3838
/** Optional: Install session validator module during deployment */
3939
installSessionValidator?: boolean;
4040

41+
/** Optional array of executor module addresses to install during deployment */
42+
executorModules?: Address[];
43+
4144
/** Optional user ID for deterministic account deployment. If provided, generates deterministic accountId from userId */
4245
userId?: string;
4346

@@ -103,6 +106,7 @@ export function prepareDeploySmartAccount(
103106
userId,
104107
accountId: customAccountId,
105108
installSessionValidator,
109+
executorModules,
106110
} = params;
107111

108112
// Validation: Check that required validators are provided
@@ -162,6 +166,17 @@ export function prepareDeploySmartAccount(
162166
);
163167
}
164168

169+
// Debug logging
170+
console.log("🔍 encode_deploy_account_call_data params:", {
171+
accountId,
172+
eoaSigners: eoaSigners || [],
173+
eoaValidator: contracts.eoaValidator || null,
174+
hasPasskey: !!passkeyPayload,
175+
webauthnValidator: contracts.webauthnValidator || null,
176+
sessionValidator: (installSessionValidator && contracts.sessionValidator) || null,
177+
executorModules: executorModules || [],
178+
});
179+
165180
const encodedCallData = encode_deploy_account_call_data(
166181
accountId,
167182
eoaSigners || [],
@@ -170,8 +185,11 @@ export function prepareDeploySmartAccount(
170185
passkeyPayload as any,
171186
contracts.webauthnValidator || null,
172187
(installSessionValidator && contracts.sessionValidator) || null,
188+
executorModules || [],
173189
) as Hex;
174190

191+
console.log("✅ Encoded call data length:", encodedCallData.length);
192+
175193
return {
176194
transaction: {
177195
to: contracts.factory,

packages/sdk-platforms/rust/zksync-sso-erc4337/crates/zksync-sso-erc4337-ffi-web/src/lib.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2519,6 +2519,7 @@ pub fn encode_deploy_account_call_data(
25192519
passkey_payload: Option<PasskeyPayload>,
25202520
webauthn_validator_address: Option<String>,
25212521
session_validator_address: Option<String>,
2522+
executor_modules: Option<Vec<String>>,
25222523
) -> Result<String, JsValue> {
25232524
use zksync_sso_erc4337_core::erc4337::account::modular_smart_account::{
25242525
deploy::{
@@ -2633,11 +2634,45 @@ pub fn encode_deploy_account_call_data(
26332634
None => None,
26342635
};
26352636

2637+
// Parse executor modules if provided
2638+
let executor_modules_core = match executor_modules {
2639+
Some(addresses) => {
2640+
web_sys::console::log_1(&format!(
2641+
"🦀 Rust parsing {} executor modules",
2642+
addresses.len()
2643+
).into());
2644+
let mut parsed_addresses = Vec::new();
2645+
for addr_str in addresses {
2646+
match addr_str.parse::<Address>() {
2647+
Ok(addr) => {
2648+
web_sys::console::log_1(&format!(
2649+
"🦀 Parsed executor module: {}",
2650+
addr
2651+
).into());
2652+
parsed_addresses.push(addr);
2653+
}
2654+
Err(e) => {
2655+
return Err(JsValue::from_str(&format!(
2656+
"Invalid executor module address '{}': {}",
2657+
addr_str, e
2658+
)));
2659+
}
2660+
}
2661+
}
2662+
Some(parsed_addresses)
2663+
}
2664+
None => {
2665+
web_sys::console::log_1(&"🦀 No executor modules provided".into());
2666+
None
2667+
}
2668+
};
2669+
26362670
// Create init data using the same logic as deploy.rs
26372671
let init_data = create_init_data_for_deployment(
26382672
eoa_signers_core,
26392673
webauthn_signer_core,
26402674
session_validator_core,
2675+
executor_modules_core,
26412676
);
26422677

26432678
// Encode the call
@@ -2704,6 +2739,7 @@ fn create_init_data_for_deployment(
27042739
eoa_signers: Option<CoreEOASigners>,
27052740
webauthn_signer: Option<CoreWebauthNSigner>,
27062741
session_validator: Option<Address>,
2742+
executor_modules: Option<Vec<Address>>,
27072743
) -> Bytes {
27082744
sol! {
27092745
struct SignersParams {
@@ -2737,6 +2773,30 @@ fn create_init_data_for_deployment(
27372773
data.push(Bytes::new()); // Empty bytes for session validator
27382774
}
27392775

2776+
// Add executor modules if provided (no initialization data needed)
2777+
if let Some(executor_addrs) = executor_modules {
2778+
web_sys::console::log_1(&format!(
2779+
"🦀 Adding {} executor modules to initializeAccount",
2780+
executor_addrs.len()
2781+
).into());
2782+
for executor_addr in executor_addrs {
2783+
web_sys::console::log_1(&format!(
2784+
"🦀 Adding executor module to modules array: {}",
2785+
executor_addr
2786+
).into());
2787+
modules.push(executor_addr);
2788+
data.push(Bytes::new()); // Empty bytes for executor modules
2789+
}
2790+
} else {
2791+
web_sys::console::log_1(&"🦀 No executor modules to add".into());
2792+
}
2793+
2794+
web_sys::console::log_1(&format!(
2795+
"🦀 Final modules count: {}, data count: {}",
2796+
modules.len(),
2797+
data.len()
2798+
).into());
2799+
27402800
// Create initializeAccount call
27412801

27422802
initialize_account_call_data_core(modules, data)

0 commit comments

Comments
 (0)