@ravenhouse/omni-sdk 0.1.37 → 0.1.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/config/networks/constants.ts","../../../src/utils/azguard.ts","../../../src/aztec-wallet/adapters/azguard/AzguardWalletService.ts","../../../src/aztec-wallet/adapters/azguard/AzguardAdapter.ts","../../../src/aztec-wallet/adapters/azguard/index.ts","../../../src/aztec-wallet/config/index.ts","../../../src/utils/string.ts","../../../src/aztec-wallet/store/network/store.ts","../../../src/config/networks/index.ts","../../../src/config/deployments/types.ts","../../../src/config/deployments/sandbox.json","../../../src/config/deployments/index.ts","../../../src/config/networks/sandbox.ts","../../../src/config/networks/devnet.ts","../../../src/store/contractRegistry.ts","../../../src/aztec-wallet/store/wallet/store.ts","../../../src/aztec-wallet/services/aztec/network/NetworkService.ts","../../../src/aztec-wallet/store/wallet/actions/browser.ts","../../../src/aztec-wallet/services/aztec/pxe/SharedPXEService.ts","../../../src/services/aztec/feePayment/FeePaymentRegister.ts","../../../src/utils/MinimalWallet.ts","../../../src/aztec-wallet/services/aztec/storage/AztecStorageService.ts","../../../src/aztec-wallet/connectors/EmbeddedConnector.ts","../../../src/aztec-wallet/services/evm/EVMWalletService.ts","../../../src/aztec-wallet/services/evm/EIP6963Service.ts","../../../src/aztec-wallet/signers/EVMSigner.ts","../../../src/aztec-wallet/signers/MetaMaskAuthWitnessProvider.ts","../../../src/aztec-wallet/signers/utils/evmPublicKeyRecovery.ts","../../../src/aztec-wallet/signers/EcdsaKEthSignerAccountContract.ts","../../../src/aztec-wallet/connectors/ExternalSignerConnector.ts","../../../src/aztec-wallet/services/wallet/errors.ts","../../../src/aztec-wallet/services/wallet/deployAccount.ts","../../../src/aztec-wallet/services/wallet/embeddedAccount.ts","../../../src/utils/accountCredentials.ts","../../../src/aztec-wallet/services/wallet/externalSignerAccount.ts","../../../src/aztec-wallet/store/wallet/actions/embedded.ts","../../../src/aztec-wallet/store/wallet/actions/externalSigner.ts","../../../src/aztec-wallet/store/wallet/types.ts","../../../src/aztec-wallet/connectors/BrowserWalletConnector.ts","../../../src/aztec-wallet/config/defaults.ts","../../../src/aztec-wallet/assets/icons/MetaMaskIcon.tsx","../../../src/aztec-wallet/assets/icons/RabbyIcon.tsx","../../../src/aztec-wallet/assets/icons/AzguardIcon.tsx","../../../src/aztec-wallet/config/walletPresets.ts","../../../src/aztec-wallet/config/createConfig.ts","../../../src/aztec-wallet/config/networkPresets.ts"],"sourcesContent":["/**\n * Centralized network configuration.\n * Single source of truth for all Aztec network URLs and chain IDs.\n */\n\n/**\n * Default node URLs for each network type\n */\nexport const NETWORK_URLS = {\n sandbox: 'http://localhost:8080',\n devnet: 'https://v4-devnet-1.aztec-labs.com',\n} as const\n\n/**\n * Default artifact registry URL for fetching contract artifacts\n */\nexport const DEFAULT_ARTIFACT_REGISTRY_URL = 'https://devnet.aztec-registry.xyz'\n\n/**\n * Available network types\n */\nexport type NetworkType = keyof typeof NETWORK_URLS\n\n/**\n * Supported Aztec network identifiers\n */\nexport type AztecNetwork = 'sandbox' | 'devnet'\n\n/**\n * Default network used when none is specified\n */\nexport const DEFAULT_NETWORK: AztecNetwork = 'devnet'\n\n/**\n * Aztec chain ID type - follows CAIP-2 format\n */\nexport type AztecChainId = `aztec:${number}`\n\n/**\n * Chain IDs for each network (CAIP-2 format)\n * Note: devnet chain ID must match browser wallet configuration\n */\nexport const CHAIN_IDS: Record<AztecNetwork, AztecChainId> = {\n sandbox: 'aztec:0',\n devnet: 'aztec:604129785',\n}\n\n/**\n * Display names for each network\n */\nexport const NETWORK_NAMES: Record<AztecNetwork, string> = {\n sandbox: 'Local Network',\n devnet: 'Devnet',\n}\n\n/**\n * Map chain ID number to network name for lookups\n */\nexport const CHAIN_ID_TO_NETWORK: Record<string, AztecNetwork> = {\n '0': 'sandbox',\n '604129785': 'devnet',\n}\n\n/**\n * All supported Aztec chains\n */\nexport const SUPPORTED_CHAINS: AztecChainId[] = Object.values(CHAIN_IDS)\n\n/**\n * Get the default URL for a network type\n */\nexport const getNetworkUrl = (network: NetworkType): string => {\n return NETWORK_URLS[network]\n}\n\n/**\n * Get the chain ID for a network name\n */\nexport const getChainId = (network: string): AztecChainId => {\n return CHAIN_IDS[network as AztecNetwork] ?? CHAIN_IDS.devnet\n}\n","import { AztecAddress } from '@aztec/aztec.js/addresses';\nimport type { CaipAccount } from '@azguardwallet/types';\n\n/**\n * Extracts the chain identifier from a CAIP account string.\n * CAIP format: namespace:chainId:address (e.g., \"aztec:testnet:0x1234...\")\n *\n * @param caipAccount - The full CAIP account string\n * @returns The chain identifier (e.g., \"aztec:testnet\")\n */\nexport const getChainFromCaipAccount = (\n caipAccount: CaipAccount | string\n): string => {\n const [namespace, chainId] = caipAccount.split(':');\n return `${namespace}:${chainId}`;\n};\n\n/**\n * Parses an AztecAddress from a CAIP account string.\n * CAIP format: aztec:chainId:address (e.g., \"aztec:testnet:0x1234...\")\n *\n * Handles both:\n * - Full CAIP format: \"aztec:chainId:0x...\"\n * - Plain address: \"0x...\"\n * - Aztec addresses (66 chars) and Ethereum addresses (42 chars, padded)\n *\n * @param caipAccount - The CAIP account string or plain address\n * @returns The parsed AztecAddress\n */\nexport const parseAddressFromCaip = (caipAccount: string): AztecAddress => {\n const parts = caipAccount.split(':');\n const hasPrefix = parts.length === 3 && parts[0] === 'aztec';\n const addressStr = hasPrefix ? parts[2] : caipAccount;\n\n // Handle Aztec address format (66 chars: 0x + 64 hex)\n if (addressStr.length === 66) {\n return AztecAddress.fromString(addressStr);\n }\n\n // Handle Ethereum address format (42 chars: 0x + 40 hex) - pad to Aztec format\n if (addressStr.length === 42) {\n const paddedAddress = '0x' + addressStr.slice(2).padStart(64, '0');\n return AztecAddress.fromString(paddedAddress);\n }\n\n throw new Error(`Unsupported account format: ${caipAccount}`);\n};\n","import { AzguardClient } from '@azguardwallet/client';\nimport type {\n CaipAccount,\n DappMetadata,\n DappPermissions,\n Operation,\n OperationResult,\n} from '@azguardwallet/types';\nimport { SUPPORTED_CHAINS } from '../../../config/networks/constants';\nimport type { AzguardWalletState } from '../../../types/azguard';\n\n// Polling timeout for window.azguard to appear — content scripts load asynchronously\nconst INIT_TIMEOUT_MS = 300;\n// How long to wait for the user to unlock wallet and approve connection\nconst CONNECTION_TIMEOUT_MS = 60_000;\n\nexport class AzguardWalletService {\n private client: AzguardClient | null = null;\n private state: AzguardWalletState = {\n isInstalled: false,\n status: 'disconnected',\n accounts: [],\n selectedAccount: null,\n supportedChains: [],\n error: null,\n };\n private eventListeners: Map<string, Set<(...args: unknown[]) => void>> =\n new Map();\n private accountsChangedHandler?: (accounts: CaipAccount[]) => void;\n private disconnectedHandler?: () => void;\n\n /**\n * Helper to wrap a promise with a timeout to prevent indefinite hangs\n */\n private withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n errorMessage: string\n ): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error(errorMessage)), timeoutMs)\n ),\n ]);\n }\n\n async initialize(): Promise<void> {\n try {\n // isAzguardInstalled polls with setInterval — handles async content script load\n const isInstalled = await AzguardClient.isAzguardInstalled(INIT_TIMEOUT_MS);\n this.updateState({ isInstalled });\n\n if (isInstalled) {\n // create() restores a previous session from localStorage if one exists\n this.client = await AzguardClient.create('omni-sdk', INIT_TIMEOUT_MS);\n\n this.setupEventListeners();\n\n const supportedChains = this.getSupportedChains();\n this.updateState({ supportedChains });\n\n // If a previous session was restored, reflect that in the state\n if (this.client.connected) {\n const accounts = this.client.accounts;\n const selectedAccount = accounts.length > 0 ? accounts[0] : null;\n this.updateState({ status: 'connected', accounts, selectedAccount });\n console.log('Azguard wallet session restored:', { accounts });\n }\n\n console.log('Azguard wallet service initialized successfully');\n } else {\n console.warn('⚠️ Azguard wallet is not installed');\n this.updateState({\n error:\n 'Azguard wallet extension is not installed. Please install it from the Chrome Web Store.',\n });\n }\n } catch (error) {\n console.error('Failed to initialize Azguard wallet service:', error);\n this.updateState({\n error:\n error instanceof Error\n ? error.message\n : 'Failed to initialize Azguard wallet service',\n });\n throw error;\n }\n }\n\n /**\n * Connect to Azguard wallet.\n * In v0.8.0, connect() returns void — accounts are read from client.accounts afterwards.\n */\n async connect(\n dappMetadata: DappMetadata,\n requiredPermissions: DappPermissions[],\n optionalPermissions?: DappPermissions[]\n ): Promise<CaipAccount[]> {\n if (!this.client) {\n throw new Error('Azguard wallet service not initialized');\n }\n\n try {\n this.updateState({ status: 'connecting', error: null });\n\n this.validateConnectionParams(\n dappMetadata,\n requiredPermissions,\n optionalPermissions\n );\n\n await this.withTimeout(\n this.client.connect(dappMetadata, requiredPermissions, optionalPermissions),\n CONNECTION_TIMEOUT_MS,\n 'Connection timed out. The wallet may be locked - please unlock it and try again.'\n );\n\n const accounts = this.client.accounts;\n const selectedAccount = accounts.length > 0 ? accounts[0] : null;\n\n this.updateState({\n status: 'connected',\n accounts,\n selectedAccount,\n });\n\n console.log('Connected to Azguard wallet:', { accounts, selectedAccount });\n return accounts;\n } catch (error) {\n console.error('Failed to connect to Azguard wallet:', error);\n\n if (error instanceof Error) {\n console.error('Error details:', {\n message: error.message,\n stack: error.stack,\n name: error.name,\n });\n }\n\n this.updateState({\n status: 'disconnected',\n error:\n error instanceof Error\n ? error.message\n : 'Failed to connect to Azguard wallet',\n });\n throw error;\n }\n }\n\n /**\n * Validate connection parameters before attempting connection\n */\n private validateConnectionParams(\n dappMetadata: DappMetadata,\n requiredPermissions: DappPermissions[],\n optionalPermissions?: DappPermissions[]\n ): void {\n if (!dappMetadata || typeof dappMetadata !== 'object') {\n throw new Error('dappMetadata is required and must be an object');\n }\n\n if (dappMetadata.url && typeof dappMetadata.url !== 'string') {\n throw new Error('dappMetadata.url must be a string if provided');\n }\n\n if (dappMetadata.logo && typeof dappMetadata.logo !== 'string') {\n throw new Error('dappMetadata.logo must be a string if provided');\n }\n\n const validatePermissions = (\n permissions: DappPermissions[],\n label: string\n ) => {\n if (!Array.isArray(permissions)) {\n throw new Error(`${label} must be an array`);\n }\n\n if (permissions.length === 0) {\n throw new Error(`${label} array cannot be empty`);\n }\n\n permissions.forEach((permission, index) => {\n if (!permission || typeof permission !== 'object') {\n throw new Error(`${label}[${index}] must be an object`);\n }\n\n if (permission.chains !== undefined) {\n if (!Array.isArray(permission.chains)) {\n throw new Error(`${label}[${index}].chains must be an array`);\n }\n\n permission.chains.forEach((chain: string, chainIndex: number) => {\n if (typeof chain !== 'string') {\n throw new Error(\n `${label}[${index}].chains[${chainIndex}] must be a string`\n );\n }\n if (!chain.startsWith('aztec:')) {\n throw new Error(\n `${label}[${index}].chains[${chainIndex}] must start with \"aztec:\"`\n );\n }\n });\n }\n\n if (permission.methods !== undefined) {\n if (!Array.isArray(permission.methods)) {\n throw new Error(`${label}[${index}].methods must be an array`);\n }\n\n permission.methods.forEach((method: string, methodIndex: number) => {\n if (typeof method !== 'string') {\n throw new Error(\n `${label}[${index}].methods[${methodIndex}] must be a string`\n );\n }\n });\n }\n });\n };\n\n validatePermissions(requiredPermissions, 'requiredPermissions');\n\n if (optionalPermissions && optionalPermissions.length > 0) {\n validatePermissions(optionalPermissions, 'optionalPermissions');\n }\n }\n\n /**\n * Disconnect from Azguard wallet\n */\n async disconnect(): Promise<void> {\n if (!this.client) {\n return;\n }\n\n try {\n await this.client.disconnect();\n\n this.updateState({\n status: 'disconnected',\n accounts: [],\n selectedAccount: null,\n error: null,\n });\n\n console.log('Disconnected from Azguard wallet');\n } catch (error) {\n console.error('Failed to disconnect from Azguard wallet:', error);\n throw error;\n }\n }\n\n /**\n * Execute multiple operations in batch\n */\n async executeOperations(operations: Operation[]): Promise<OperationResult[]> {\n if (!this.client || this.state.status !== 'connected') {\n throw new Error('Azguard wallet not connected');\n }\n\n try {\n const results = await this.client.execute(operations);\n\n const succeeded = results.filter((r: OperationResult) => r.status === 'ok').length;\n const failed = results.filter((r: OperationResult) => r.status === 'failed').length;\n const skipped = results.filter((r: OperationResult) => r.status === 'skipped').length;\n\n console.log(\n `📋 Batch operations completed: ${succeeded} ok, ${failed} failed, ${skipped} skipped`\n );\n\n results.forEach((result: OperationResult, index: number) => {\n if (result.status === 'failed') {\n const errorMsg = 'error' in result ? result.error : 'Unknown error';\n console.error(`❌ Operation ${index} failed:`, errorMsg);\n } else if (result.status === 'skipped') {\n console.warn(`⏭️ Operation ${index} skipped`);\n }\n });\n\n return results;\n } catch (error) {\n console.error('❌ Failed to execute operations:', error);\n throw error;\n }\n }\n\n /**\n * Set up event listeners for wallet events\n */\n private setupEventListeners(): void {\n if (!this.client) return;\n\n this.accountsChangedHandler = (accounts: CaipAccount[]) => {\n this.updateState({\n accounts,\n selectedAccount: accounts.length > 0 ? accounts[0] : null,\n status: accounts.length > 0 ? 'connected' : 'disconnected',\n });\n };\n\n this.disconnectedHandler = () => {\n this.updateState({\n status: 'disconnected',\n accounts: [],\n selectedAccount: null,\n });\n this.emitEvent('disconnected');\n };\n\n this.client.onAccountsChanged.addHandler(this.accountsChangedHandler);\n this.client.onDisconnected.addHandler(this.disconnectedHandler);\n }\n\n /**\n * Add accounts-changed event listener\n */\n onAccountsChanged(callback: (accounts: CaipAccount[]) => void): void {\n this.addEventListener(\n 'accountsChanged',\n callback as (...args: unknown[]) => void\n );\n }\n\n /**\n * Add disconnection event listener\n */\n onDisconnected(callback: () => void): void {\n this.addEventListener(\n 'disconnected',\n callback as (...args: unknown[]) => void\n );\n }\n\n getSupportedChains(): string[] {\n return [...SUPPORTED_CHAINS];\n }\n\n /**\n * Get the underlying AzguardClient\n */\n getClient(): AzguardClient | null {\n return this.client;\n }\n\n /**\n * Get current wallet state\n */\n getState(): AzguardWalletState {\n return { ...this.state };\n }\n\n /**\n * Update wallet state and notify listeners\n */\n private updateState(updates: Partial<AzguardWalletState>): void {\n const previousState = { ...this.state };\n this.state = { ...this.state, ...updates };\n\n if (\n updates.accounts &&\n JSON.stringify(previousState.accounts) !==\n JSON.stringify(updates.accounts)\n ) {\n this.emitEvent('accountsChanged', updates.accounts);\n }\n }\n\n private addEventListener(\n event: string,\n callback: (...args: unknown[]) => void\n ): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n private emitEvent(event: string, ...args: unknown[]): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((callback) => {\n try {\n callback(...args);\n } catch (error) {\n console.error(`Error in ${event} event listener:`, error);\n }\n });\n }\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.client) {\n if (this.accountsChangedHandler) {\n this.client.onAccountsChanged.removeHandler(this.accountsChangedHandler);\n }\n if (this.disconnectedHandler) {\n this.client.onDisconnected.removeHandler(this.disconnectedHandler);\n }\n }\n this.accountsChangedHandler = undefined;\n this.disconnectedHandler = undefined;\n this.eventListeners.clear();\n this.client = null;\n this.state = {\n isInstalled: false,\n status: 'disconnected',\n accounts: [],\n selectedAccount: null,\n supportedChains: [],\n error: null,\n };\n }\n}\n","/**\n * AzguardAdapter - Browser wallet adapter for Azguard wallet.\n *\n * Implements IBrowserWalletAdapter to provide Azguard-specific\n * connection logic while keeping the hook wallet-agnostic.\n */\n\nimport type { ContractArtifact } from '@aztec/aztec.js/abi'\nimport type { AccountWithSecretKey } from '@aztec/aztec.js/account'\nimport {\n getChainId,\n type AztecChainId,\n type AztecNetwork,\n} from '../../../config/networks/constants'\nimport { parseAddressFromCaip } from '../../../utils/azguard'\nimport { AzguardWalletService } from './AzguardWalletService'\nimport type {\n IBrowserWalletAdapter,\n BrowserWalletState,\n BrowserWalletOperationResult,\n BrowserWalletOperation,\n} from '../../../types/browserWallet'\nimport type {\n CaipAccount,\n CaipChain,\n SimulateViewsOperation,\n SendTransactionOperation,\n RegisterContractOperation,\n Operation,\n} from '@azguardwallet/types'\n\n// =============================================================================\n// Azguard-specific artifact normalization\n// =============================================================================\n\n/**\n * Add `isInternal: false` to function artifacts if missing.\n * Azguard wallet requires this field in the schema.\n */\nconst addIsInternal = <T extends object>(\n obj: T,\n): T & { isInternal: boolean } => ({\n ...obj,\n isInternal: (obj as T & { isInternal?: boolean }).isInternal ?? false,\n})\n\n/**\n * Normalize a contract artifact for Azguard wallet compatibility.\n * Azguard wallet expects `isInternal` on all function artifacts.\n */\nconst normalizeArtifactForAzguard = (artifact: ContractArtifact): unknown => ({\n ...artifact,\n functions: artifact.functions.map(addIsInternal),\n ...(artifact.nonDispatchPublicFunctions && {\n nonDispatchPublicFunctions:\n artifact.nonDispatchPublicFunctions.map(addIsInternal),\n }),\n})\n\nconst AZGUARD_METHODS = [\n 'register_contract',\n 'send_transaction',\n 'simulate_views',\n 'simulate_utility',\n 'add_private_authwit',\n 'call',\n] as const\n\nconst buildDappMetadata = () => ({\n name: 'Aztec Web Boilerplate',\n description: 'Privacy-first application built on Aztec Network',\n url: typeof window !== 'undefined' ? window.location.origin : undefined,\n})\n\nexport class AzguardAdapter implements IBrowserWalletAdapter {\n readonly id = 'azguard'\n readonly label = 'Azguard Wallet'\n\n private service: AzguardWalletService\n\n constructor() {\n this.service = new AzguardWalletService()\n }\n\n async initialize(): Promise<void> {\n await this.service.initialize()\n }\n\n destroy(): void {\n this.service.destroy()\n }\n\n getState(): BrowserWalletState {\n return this.service.getState()\n }\n\n async connect(networkName: AztecNetwork): Promise<string[]> {\n const chain: AztecChainId = getChainId(networkName)\n const dappMetadata = buildDappMetadata()\n const requiredPermissions = [\n { chains: [chain], methods: [...AZGUARD_METHODS] },\n ]\n\n return this.service.connect(dappMetadata, requiredPermissions)\n }\n\n async disconnect(): Promise<void> {\n return this.service.disconnect()\n }\n\n async executeOperations(\n ops: BrowserWalletOperation[],\n ): Promise<BrowserWalletOperationResult[]> {\n const azguardOps = ops.map((op) => this.toAzguardOperation(op))\n return this.service.executeOperations(azguardOps)\n }\n\n /**\n * Translate generic operations to Azguard-specific format.\n * This is where all wallet-specific type casting happens.\n */\n private toAzguardOperation(op: BrowserWalletOperation): Operation {\n switch (op.kind) {\n case 'simulate_views': {\n const azguardOp: SimulateViewsOperation = {\n kind: 'simulate_views',\n account: op.account as CaipAccount,\n calls: op.calls.map((call) => ({\n kind: 'call' as const,\n contract: call.contract,\n method: call.method,\n args: call.args.map((arg) =>\n typeof arg === 'bigint' ? arg.toString() : String(arg),\n ),\n })),\n }\n return azguardOp\n }\n case 'send_transaction': {\n const azguardOp: SendTransactionOperation = {\n kind: 'send_transaction',\n account: op.account as CaipAccount,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions: op.calls.map((call): any => {\n if (\n call.kind === 'add_private_authwit' ||\n call.kind === 'add_public_authwit'\n ) {\n return {\n kind: call.kind,\n content: {\n kind: 'call' as const,\n caller: call.caller,\n contract: call.contract,\n method: call.method,\n args: call.args.map((arg) =>\n typeof arg === 'bigint' ? arg.toString() : String(arg),\n ),\n },\n }\n }\n return {\n kind: 'call' as const,\n contract: call.contract,\n method: call.method,\n args: call.args.map((arg) =>\n typeof arg === 'bigint' ? arg.toString() : arg,\n ),\n }\n }),\n }\n return azguardOp\n }\n case 'register_contract': {\n const azguardOp: RegisterContractOperation = {\n kind: 'register_contract',\n chain: op.chain as CaipChain,\n address: op.address,\n instance: op.instance,\n // Apply Azguard-specific normalization (adds isInternal to functions)\n artifact: normalizeArtifactForAzguard(\n op.artifact as ContractArtifact,\n ),\n }\n return azguardOp\n }\n default: {\n const kind = (op as BrowserWalletOperation).kind\n throw new Error(`Azguard wallet does not support operation: ${kind}`)\n }\n }\n }\n\n async toAccountWallet(accountId: string): Promise<AccountWithSecretKey> {\n const address = parseAddressFromCaip(accountId)\n return { getAddress: () => address } as unknown as AccountWithSecretKey\n }\n\n onAccountsChanged(cb: (accounts: string[]) => void): void {\n this.service.onAccountsChanged(cb)\n }\n\n onDisconnected(cb: () => void): void {\n this.service.onDisconnected(cb)\n }\n}\n\nexport const createAzguardAdapter = (): IBrowserWalletAdapter =>\n new AzguardAdapter()\n","export { AzguardAdapter, createAzguardAdapter } from './AzguardAdapter';\nexport { AzguardWalletService } from './AzguardWalletService';\n","export { createAztecWalletConfig } from './createConfig';\nexport {\n DEFAULT_LABELS,\n DEFAULT_MODAL_CONFIG,\n DEFAULT_EMBEDDED_CONFIG,\n} from './defaults';\nexport {\n EVM_WALLET_PRESETS,\n AZTEC_WALLET_PRESETS,\n getEVMWalletPreset,\n getAztecWalletPreset,\n getAvailableEVMWalletIds,\n getAvailableAztecWalletIds,\n type EVMWalletPreset,\n type AztecWalletPreset,\n type EVMWalletId,\n type AztecWalletId,\n} from './walletPresets';\nexport {\n NETWORK_PRESETS,\n getNetworkPreset,\n getNetworkIcon,\n getNetworkDisplayName,\n type NetworkPresetDefaults,\n} from './networkPresets';\n","/**\n * String utility functions for text transformations.\n */\n\n/**\n * Convert snake_case or camelCase to Title Case.\n * @param str - The string to convert\n * @returns The string in Title Case format\n */\nexport const toTitleCase = (str: string): string => {\n return str\n .replace(/_/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n}\n\n/**\n * Safely stringify a value, converting BigInt to string.\n * @param value - The value to stringify\n * @returns JSON string with BigInt values converted to strings\n */\nexport const safeStringify = (value: unknown): string =>\n JSON.stringify(value, (_key, v) => (typeof v === 'bigint' ? v.toString() : v))\n\n/**\n * Type guard to check if value is a string array\n * @param value - The value to check\n * @returns True if value is a string array\n */\nexport function isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((v) => typeof v === 'string')\n}\n\n/**\n * Truncate an address for display\n * @param address - The address to truncate\n * @param startChars - Number of characters to show at start\n * @param endChars - Number of characters to show at end\n * @returns Truncated address string\n */\nexport function truncateAddress(\n address: string,\n startChars = 6,\n endChars = 4,\n): string {\n if (address.length <= startChars + endChars + 3) {\n return address\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`\n}\n","import { create } from 'zustand';\nimport {\n SANDBOX_CONFIG,\n DEVNET_CONFIG,\n type NetworkConfig,\n} from '../../../config/networks';\nimport { getContractRegistryStore } from '../../../store/contractRegistry';\nimport { isValidConfig } from '../../../utils';\nimport { getWalletStore } from '../wallet';\nimport type { AztecNetwork } from '../../../config/networks/constants';\nimport type { StoreNetworkPreset } from '../../types';\n\nconst STORAGE_KEY = 'aztec-wallet-network';\n\nconst BASE_CONFIGS: Record<AztecNetwork, NetworkConfig> = {\n sandbox: SANDBOX_CONFIG,\n devnet: DEVNET_CONFIG,\n};\n\ntype State = {\n currentConfig: NetworkConfig;\n configuredNetworks: Record<AztecNetwork, NetworkConfig>;\n defaultNetwork: AztecNetwork;\n isInitialized: boolean;\n};\n\ntype Actions = {\n initialize: (presets: StoreNetworkPreset[]) => void;\n switchToNetwork: (name: AztecNetwork) => boolean;\n resetToDefault: () => void;\n syncFromStorage: () => void;\n};\n\nexport type NetworkStore = State & Actions;\n\nconst INITIAL_STATE: State = {\n currentConfig: DEVNET_CONFIG,\n configuredNetworks: {} as Record<AztecNetwork, NetworkConfig>,\n defaultNetwork: 'devnet',\n isInitialized: false,\n};\n\nexport const useNetworkStore = create<NetworkStore>((set, get) => ({\n ...INITIAL_STATE,\n\n initialize: (presets) => {\n const configuredNetworks: Record<AztecNetwork, NetworkConfig> =\n {} as Record<AztecNetwork, NetworkConfig>;\n for (const preset of presets) {\n const base = BASE_CONFIGS[preset.aztecNetwork];\n if (base) {\n configuredNetworks[preset.aztecNetwork] = {\n ...base,\n nodeUrl: preset.nodeUrl,\n };\n }\n }\n\n const defaultNetwork = presets[0]?.aztecNetwork ?? 'sandbox';\n const defaultConfig = configuredNetworks[defaultNetwork] ?? SANDBOX_CONFIG;\n\n const savedNetwork = localStorage.getItem(\n STORAGE_KEY\n ) as AztecNetwork | null;\n const initialConfig =\n savedNetwork && configuredNetworks[savedNetwork]\n ? configuredNetworks[savedNetwork]\n : defaultConfig;\n\n set({\n configuredNetworks,\n defaultNetwork,\n currentConfig: initialConfig,\n isInitialized: true,\n });\n\n setupCrossTabSync();\n },\n\n switchToNetwork: (name) => {\n const { configuredNetworks, currentConfig } = get();\n const config = configuredNetworks[name as AztecNetwork];\n if (config && config.name !== currentConfig.name) {\n getContractRegistryStore().reset();\n getWalletStore().setPXEStatus('idle');\n set({ currentConfig: config });\n localStorage.setItem(STORAGE_KEY, name);\n return true;\n }\n return false;\n },\n\n resetToDefault: () => {\n const { defaultNetwork, configuredNetworks, currentConfig } = get();\n const defaultConfig = configuredNetworks[defaultNetwork] ?? SANDBOX_CONFIG;\n if (defaultConfig.name !== currentConfig.name) {\n getContractRegistryStore().reset();\n getWalletStore().setPXEStatus('idle');\n }\n localStorage.setItem(STORAGE_KEY, defaultNetwork);\n set({ currentConfig: defaultConfig });\n },\n\n syncFromStorage: () => {\n const { configuredNetworks, currentConfig } = get();\n const savedNetwork = localStorage.getItem(\n STORAGE_KEY\n ) as AztecNetwork | null;\n if (savedNetwork && configuredNetworks[savedNetwork]) {\n const newConfig = configuredNetworks[savedNetwork];\n if (newConfig.name !== currentConfig.name) {\n getContractRegistryStore().reset();\n getWalletStore().setPXEStatus('idle');\n }\n set({ currentConfig: newConfig });\n }\n },\n}));\n\nexport const getNetworkStore = () => useNetworkStore.getState();\n\nlet isListenerSetup = false;\nfunction setupCrossTabSync() {\n if (isListenerSetup) return;\n isListenerSetup = true;\n\n window.addEventListener('storage', (e: StorageEvent) => {\n if (e.key === STORAGE_KEY) {\n getNetworkStore().syncFromStorage();\n }\n });\n}\n\n/**\n * Get network options for UI dropdowns.\n * @param configuredNetworks - The configured networks from store\n * @param presets - The original network presets\n */\nexport const buildNetworkOptions = (\n configuredNetworks: Record<AztecNetwork, NetworkConfig>,\n presets: StoreNetworkPreset[]\n) => {\n return presets.map((preset) => {\n const config = configuredNetworks[preset.aztecNetwork];\n return {\n value: preset.aztecNetwork,\n label: config?.displayName ?? preset.aztecNetwork,\n description: config?.description ?? '',\n disabled: !config || !isValidConfig(config),\n };\n });\n};\n","export * from './types';\nexport * from './constants';\nexport * from './sandbox';\nexport * from './devnet';\n\nimport { DEVNET_CONFIG } from './devnet';\nimport { SANDBOX_CONFIG } from './sandbox';\nimport { NetworkConfig } from './types';\n\nexport const AVAILABLE_NETWORKS: NetworkConfig[] = [\n SANDBOX_CONFIG,\n DEVNET_CONFIG,\n];\n","/**\n * Deployment configuration types for Aztec contracts\n */\n\nimport { NETWORK_URLS, type NetworkType } from '../networks/constants';\n\n/**\n * Contract deployment information\n */\nexport interface ContractDeployment {\n address: string;\n salt: string;\n}\n\n/**\n * Full deployment configuration for a network\n */\nexport interface DeploymentConfig {\n network: NetworkType;\n nodeUrl: string;\n dripperContract: ContractDeployment;\n tokenContract: ContractDeployment;\n deployer: string;\n proverEnabled: boolean;\n deployedAt: string;\n}\n\n/**\n * Placeholder values for undeployed contracts\n */\nexport const PLACEHOLDER_ADDRESS =\n '0x0000000000000000000000000000000000000000000000000000000000000000';\nexport const PLACEHOLDER_SALT =\n '0x0000000000000000000000000000000000000000000000000000000000000000';\n\n/**\n * Check if a deployment config has valid (non-placeholder) contract addresses\n */\nexport const isDeploymentValid = (config: DeploymentConfig): boolean => {\n return (\n config.dripperContract.address !== PLACEHOLDER_ADDRESS &&\n config.tokenContract.address !== PLACEHOLDER_ADDRESS &&\n config.deployer !== PLACEHOLDER_ADDRESS\n );\n};\n\n/**\n * Default sandbox deployment config (placeholder until contracts are deployed)\n */\nexport const DEFAULT_SANDBOX_DEPLOYMENT: DeploymentConfig = {\n network: 'sandbox',\n nodeUrl: NETWORK_URLS.sandbox,\n dripperContract: {\n address: PLACEHOLDER_ADDRESS,\n salt: PLACEHOLDER_SALT,\n },\n tokenContract: {\n address: PLACEHOLDER_ADDRESS,\n salt: PLACEHOLDER_SALT,\n },\n deployer: PLACEHOLDER_ADDRESS,\n proverEnabled: false,\n deployedAt: '',\n};\n\n/**\n * Default devnet deployment config (placeholder until contracts are deployed)\n */\nexport const DEFAULT_DEVNET_DEPLOYMENT: DeploymentConfig = {\n network: 'devnet',\n nodeUrl: NETWORK_URLS.devnet,\n dripperContract: {\n address: PLACEHOLDER_ADDRESS,\n salt: PLACEHOLDER_SALT,\n },\n tokenContract: {\n address: PLACEHOLDER_ADDRESS,\n salt: PLACEHOLDER_SALT,\n },\n deployer: PLACEHOLDER_ADDRESS,\n proverEnabled: true,\n deployedAt: '',\n};\n","{\n \"network\": \"sandbox\",\n \"nodeUrl\": \"http://localhost:8080\",\n \"dripperContract\": {\n \"address\": \"0x294f2f4d12fc8308fcde6df4025a9e83004928e58b4082e49b93b4bb69f6b0d8\",\n \"salt\": \"0x0000000000000000000000000000000000000000000000000000000000000539\"\n },\n \"tokenContract\": {\n \"address\": \"0x24bf78296b515bab819d4e6bc39ef2dad7291699342d674f6ee155cae964fe55\",\n \"salt\": \"0x0000000000000000000000000000000000000000000000000000000000000539\"\n },\n \"deployer\": \"0x1d7d30cbf75ffed8cd68ac3df642b46b1cc3e2ff43f7e901d6b4fa43d28a0eff\",\n \"proverEnabled\": false,\n \"deployedAt\": \"2026-02-21T10:49:45.563Z\"\n}\n","export * from './types';\n\nimport devnetDeployment from './devnet.json';\nimport sandboxDeployment from './sandbox.json';\nimport {\n DeploymentConfig,\n DEFAULT_SANDBOX_DEPLOYMENT,\n DEFAULT_DEVNET_DEPLOYMENT,\n} from './types';\n\nexport const getSandboxDeployment = (): DeploymentConfig => {\n try {\n return sandboxDeployment as DeploymentConfig;\n } catch {\n return DEFAULT_SANDBOX_DEPLOYMENT;\n }\n};\n\nexport const getDevnetDeployment = (): DeploymentConfig => {\n try {\n return devnetDeployment as DeploymentConfig;\n } catch {\n return DEFAULT_DEVNET_DEPLOYMENT;\n }\n};\n","import { getSandboxDeployment, isDeploymentValid } from '../deployments'\nimport { NetworkConfig } from './types'\n\n/**\n * Load sandbox deployment from JSON config file.\n */\nconst deployment = getSandboxDeployment()\n\n/**\n * Sandbox configuration for local development.\n *\n * Contract addresses are loaded from src/config/deployments/sandbox.json\n * Run `yarn deploy-contracts` to deploy contracts and generate this config.\n *\n * Uses local artifacts for offline development (no external registry).\n */\nexport const SANDBOX_CONFIG: NetworkConfig = {\n name: 'sandbox',\n displayName: 'Local Network',\n description: isDeploymentValid(deployment)\n ? 'Local development environment with deployed contracts'\n : 'Local network - run \"yarn deploy-contracts\" to deploy',\n nodeUrl: deployment.nodeUrl,\n dripperContractAddress: deployment.dripperContract.address,\n tokenContractAddress: deployment.tokenContract.address,\n deployerAddress: deployment.deployer,\n dripperDeploymentSalt: deployment.dripperContract.salt,\n tokenDeploymentSalt: deployment.tokenContract.salt,\n proverEnabled: false,\n isTestnet: false,\n}\n","import { AztecAddress } from '@aztec/stdlib/aztec-address'\nimport { NetworkConfig } from './types'\n\n/**\n * Devnet configuration for public development network.\n *\n * Contract addresses are hardcoded for the public devnet.\n * These contracts are already deployed and available for testing.\n */\nexport const DEVNET_CONFIG: NetworkConfig = {\n name: 'devnet',\n displayName: 'Devnet',\n description: 'Public development network for testing with real tokens',\n nodeUrl: 'https://v4-devnet-2.aztec-labs.com',\n dripperContractAddress:\n '0x294f2f4d12fc8308fcde6df4025a9e83004928e58b4082e49b93b4bb69f6b0d8',\n tokenContractAddress:\n '0x24bf78296b515bab819d4e6bc39ef2dad7291699342d674f6ee155cae964fe55',\n deployerAddress: AztecAddress.ZERO.toString(),\n dripperDeploymentSalt: '1337',\n tokenDeploymentSalt: '1337',\n proverEnabled: true,\n isTestnet: true,\n // feePaymentContracts: {\n // metered: {\n // address:\n // '0x2a39ba8b469adc19bfc0f5c1a9d496f73b82e95fb113e020214c729ff9cd1ff4',\n // salt: '1337',\n // deployer: AztecAddress.ZERO.toString(),\n // },\n // },\n}\n","/**\n * Stub implementation of contract registry store for SDK compatibility.\n * This is a minimal implementation that satisfies the interface needed by aztec-wallet.\n */\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst noop = () => {}\n\n/**\n * Stub store that does nothing - contract registry is app-specific\n * and not needed for the SDK wallet functionality.\n */\nexport const getContractRegistryStore = () => ({\n reset: noop,\n})\n\n/**\n * Hook stub - returns empty state\n */\nexport const useContractRegistryStore = () => ({\n reset: noop,\n})\n\nexport type ContractRegistryStore = ReturnType<typeof getContractRegistryStore>\n","import { create } from 'zustand';\nimport { getContractRegistryStore } from '../../../store/contractRegistry';\nimport { NetworkService } from '../../services/aztec/network';\nimport { getNetworkStore } from '../network';\nimport { createBrowserActions } from './actions/browser';\nimport { createEmbeddedActions } from './actions/embedded';\nimport { createExternalSignerActions } from './actions/externalSigner';\nimport { isValidPXETransition } from './types';\nimport type { WalletStore, WalletState } from './types';\nimport type {\n WalletConnector,\n WalletConnectorId,\n} from '../../../types/walletConnector';\nimport type { WalletType } from '../../types/aztec';\n\nexport type { WalletStore, PXEStatus, NetworkStatus } from './types';\n\nconst WALLET_CONNECTION_STORAGE_KEY = 'aztec-wallet-connection';\n\ninterface StoredWalletConnection {\n connectorId: WalletConnectorId;\n walletType: WalletType;\n}\n\nconst saveWalletConnection = (data: StoredWalletConnection): void => {\n try {\n localStorage.setItem(WALLET_CONNECTION_STORAGE_KEY, JSON.stringify(data));\n } catch {\n // Ignore storage errors\n }\n};\n\nconst clearWalletConnection = (): void => {\n try {\n localStorage.removeItem(WALLET_CONNECTION_STORAGE_KEY);\n } catch {\n // Ignore\n }\n};\n\nexport const getStoredWalletConnection = (): StoredWalletConnection | null => {\n try {\n const data = localStorage.getItem(WALLET_CONNECTION_STORAGE_KEY);\n return data ? JSON.parse(data) : null;\n } catch {\n return null;\n }\n};\n\nconst INITIAL_STATE: WalletState = {\n account: null,\n walletType: null,\n status: 'disconnected',\n error: null,\n networkStatus: 'idle',\n networkError: null,\n pxeStatus: 'idle',\n pxeError: null,\n signerType: null,\n connectedRdns: null,\n caipAccount: null,\n caipAccounts: [],\n supportedChains: [],\n isInstalled: false,\n connectors: [],\n activeConnectorId: null,\n connectingConnectorId: null,\n};\n\nexport const useWalletStore = create<WalletStore>((set, get) => ({\n ...INITIAL_STATE,\n\n // Shared connect orchestration\n _connectWith: async <T>(\n connectorId: WalletConnectorId,\n run: (connector: WalletConnector) => Promise<T>\n ) => {\n const connector = get().connectors.find((item) => item.id === connectorId);\n if (!connector) {\n set({\n error: `Connector \"${connectorId}\" not found`,\n status: 'disconnected',\n connectingConnectorId: null,\n });\n throw new Error(`Connector \"${connectorId}\" not found`);\n }\n\n if (get().connectingConnectorId === connectorId) {\n throw new Error(`Connector \"${connectorId}\" is already connecting`);\n }\n\n set({\n connectingConnectorId: connectorId,\n error: null,\n });\n\n try {\n const result = await run(connector);\n set({\n activeConnectorId: connector.id,\n walletType: connector.type,\n status: 'connected',\n connectingConnectorId: null,\n });\n saveWalletConnection({\n connectorId: connector.id,\n walletType: connector.type,\n });\n return result;\n } catch (err) {\n const message =\n err instanceof Error ? err.message : 'Failed to connect to wallet';\n set({\n status: 'disconnected',\n error: message,\n activeConnectorId: null,\n walletType: null,\n connectingConnectorId: null,\n });\n throw err;\n }\n },\n\n _disconnectWith: async (cleanup?: () => Promise<void> | void) => {\n const { activeConnectorId, connectors } = get();\n if (!activeConnectorId) return;\n\n try {\n if (cleanup) {\n await cleanup();\n }\n } finally {\n clearWalletConnection();\n getContractRegistryStore().reset();\n set({\n account: null,\n walletType: null,\n status: 'disconnected',\n error: null,\n signerType: null,\n connectedRdns: null,\n caipAccount: null,\n caipAccounts: [],\n supportedChains: [],\n isInstalled: false,\n activeConnectorId: null,\n connectingConnectorId: null,\n pxeStatus: 'idle',\n pxeError: null,\n connectors,\n });\n }\n },\n\n setConnectors: (connectors) => set({ connectors }),\n\n /**\n * Generic connect method that delegates to the connector.\n *\n * NOTE: This does NOT wrap in `_connectWith` because each connector's\n * `connect()` method is responsible for calling the appropriate store action\n * (e.g., `connectEmbedded`, `connectExternalSigner`) which already uses\n * `_connectWith` internally. This avoids double-wrapping.\n */\n connect: async (connectorId) => {\n const connector = get().connectors.find((c) => c.id === connectorId);\n if (!connector) {\n set({\n error: `Connector \"${connectorId}\" not found`,\n status: 'disconnected',\n });\n throw new Error(`Connector \"${connectorId}\" not found`);\n }\n await connector.connect();\n },\n\n // Embedded actions\n ...createEmbeddedActions(set, get),\n\n // External Signer actions\n ...createExternalSignerActions(set, get),\n\n // Browser Wallet actions\n ...createBrowserActions(set, get),\n\n // Shared actions\n disconnect: async (cleanup?: () => Promise<void> | void) => {\n await get()._disconnectWith(cleanup);\n },\n\n setError: (error) => set({ error }),\n\n setNetworkStatus: (networkStatus, networkError = null) => {\n set({ networkStatus, networkError });\n },\n\n setPXEStatus: (pxeStatus, pxeError = null) => {\n const currentStatus = get().pxeStatus;\n if (!isValidPXETransition(currentStatus, pxeStatus)) {\n console.warn(\n `Invalid PXE state transition: ${currentStatus} → ${pxeStatus}`\n );\n }\n set({ pxeStatus, pxeError });\n },\n\n checkNetwork: async () => {\n const { networkStatus } = get();\n if (networkStatus === 'checking' || networkStatus === 'available') {\n return;\n }\n\n const { currentConfig } = getNetworkStore();\n set({ networkStatus: 'checking', networkError: null });\n\n try {\n await NetworkService.checkAvailability(currentConfig.nodeUrl);\n set({ networkStatus: 'available' });\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Failed to connect to network';\n set({ networkStatus: 'error', networkError: message });\n }\n },\n\n reset: () =>\n set((state) => ({\n ...INITIAL_STATE,\n connectors: state.connectors,\n })),\n\n syncFromStorage: async () => {\n const { activeConnectorId, connectExistingEmbedded } = get();\n const stored = getStoredWalletConnection();\n\n if (stored && !activeConnectorId) {\n // Another tab connected - try to reconnect if embedded wallet\n if (stored.walletType === 'embedded') {\n try {\n await connectExistingEmbedded(stored.connectorId);\n } catch {\n // Silent fail - user can manually reconnect\n }\n }\n } else if (!stored && activeConnectorId) {\n // Another tab disconnected - clear our state\n clearWalletConnection();\n getContractRegistryStore().reset();\n set((state) => ({\n ...INITIAL_STATE,\n connectors: state.connectors,\n }));\n }\n },\n}));\n\nexport const getWalletStore = () => useWalletStore.getState();\n\nlet isWalletListenerSetup = false;\n\nexport const setupWalletCrossTabSync = (): void => {\n if (isWalletListenerSetup) return;\n isWalletListenerSetup = true;\n\n window.addEventListener('storage', (e: StorageEvent) => {\n if (e.key === WALLET_CONNECTION_STORAGE_KEY) {\n getWalletStore().syncFromStorage();\n }\n });\n};\n","import { createLogger } from '@aztec/aztec.js/log';\nimport { createAztecNodeClient, type AztecNode } from '@aztec/aztec.js/node';\n\nconst logger = createLogger('network-service');\n\nclass NetworkServiceClass {\n private nodeClients: Map<string, AztecNode> = new Map();\n private checkPromises: Map<string, Promise<void>> = new Map();\n\n private normalizeUrl(nodeUrl: string): string {\n if (!nodeUrl) return nodeUrl;\n return nodeUrl.endsWith('/') ? nodeUrl.slice(0, -1) : nodeUrl;\n }\n\n /**\n * Get or create an AztecNode client for a given URL.\n * Clients are cached by URL.\n */\n getNodeClient(nodeUrl: string): AztecNode {\n const normalizedUrl = this.normalizeUrl(nodeUrl);\n const existing = this.nodeClients.get(normalizedUrl);\n\n if (existing) {\n return existing;\n }\n\n const client = createAztecNodeClient(normalizedUrl);\n this.nodeClients.set(normalizedUrl, client);\n logger.info(`Created AztecNode client for ${normalizedUrl}`);\n\n return client;\n }\n\n /**\n * Check if the network is available by pinging the node.\n * Deduplicates concurrent checks for the same URL.\n */\n async checkAvailability(nodeUrl: string): Promise<void> {\n const normalizedUrl = this.normalizeUrl(nodeUrl);\n\n const existingCheck = this.checkPromises.get(normalizedUrl);\n if (existingCheck) {\n return existingCheck;\n }\n\n const checkPromise = this.performCheck(normalizedUrl);\n this.checkPromises.set(normalizedUrl, checkPromise);\n\n try {\n await checkPromise;\n } finally {\n this.checkPromises.delete(normalizedUrl);\n }\n }\n\n private async performCheck(nodeUrl: string): Promise<void> {\n const client = this.getNodeClient(nodeUrl);\n const nodeInfo = await client.getNodeInfo();\n logger.info(`Network available: ${nodeUrl}`, nodeInfo);\n }\n\n /**\n * Clear cached client for a specific URL.\n */\n clearClient(nodeUrl: string): void {\n const normalizedUrl = this.normalizeUrl(nodeUrl);\n this.nodeClients.delete(normalizedUrl);\n logger.info(`Cleared node client for ${normalizedUrl}`);\n }\n\n /**\n * Clear all cached clients.\n */\n clearAll(): void {\n this.nodeClients.clear();\n logger.info('Cleared all node clients');\n }\n}\n\nexport const NetworkService = new NetworkServiceClass();\n","import type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport { WalletType } from '../../../types/aztec';\nimport type { AztecNetwork } from '../../../../config/networks/constants';\nimport type { IBrowserWalletAdapter } from '../../../../types/browserWallet';\nimport type { WalletConnectorId } from '../../../../types/walletConnector';\nimport type { SetState, GetState, WalletState } from '../types';\n\nexport const createBrowserActions = (set: SetState, get: GetState) => ({\n connectBrowserWallet: async (\n adapter: IBrowserWalletAdapter,\n networkName: AztecNetwork,\n connectorId: WalletConnectorId\n ): Promise<void> => {\n const connectWith = get()._connectWith;\n await connectWith(connectorId, async () => {\n set({\n status: 'connecting',\n error: null,\n });\n\n const accounts = await adapter.connect(networkName);\n\n const selectedAccount = accounts.length > 0 ? accounts[0] : null;\n const state = adapter.getState();\n\n let accountWallet: AccountWithSecretKey | null = null;\n if (selectedAccount) {\n try {\n accountWallet = await adapter.toAccountWallet(selectedAccount);\n } catch {\n // Ignore - accountWallet stays null\n }\n }\n\n set({\n account: accountWallet,\n walletType: WalletType.BROWSER_WALLET,\n caipAccount: selectedAccount,\n caipAccounts: accounts,\n supportedChains: state.supportedChains,\n isInstalled: state.isInstalled,\n });\n });\n },\n\n setBrowserWalletState: (\n state: Partial<\n Pick<\n WalletState,\n | 'account'\n | 'caipAccount'\n | 'caipAccounts'\n | 'supportedChains'\n | 'isInstalled'\n >\n >\n ) => {\n set(state);\n },\n});\n","import { AztecAddress } from '@aztec/aztec.js/addresses'\nimport { SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee'\nimport { Fr } from '@aztec/aztec.js/fields'\nimport { createLogger } from '@aztec/aztec.js/log'\nimport type { AztecNode } from '@aztec/aztec.js/node'\nimport { SPONSORED_FPC_SALT } from '@aztec/constants'\nimport { createStore } from '@aztec/kv-store/indexeddb'\nimport { SponsoredFPCContractArtifact } from '@aztec/noir-contracts.js/SponsoredFPC'\nimport { createPXE } from '@aztec/pxe/client/bundle'\nimport { getPXEConfig } from '@aztec/pxe/config'\nimport type { PXE } from '@aztec/pxe/server'\nimport { AVAILABLE_NETWORKS } from '../../../../config/networks'\nimport { FeePaymentRegister } from '../../../../services/aztec/feePayment/FeePaymentRegister'\nimport { MinimalWallet } from '../../../../utils/MinimalWallet'\nimport { NetworkService } from '../network'\nimport { AztecStorageService } from '../storage'\nimport type { AztecNetwork } from '../../../../config/networks/constants'\n\nconst logger = createLogger('shared-pxe-service')\nconst pxeLogger = createLogger('pxe')\nconst getProverEnabled = (networkName: AztecNetwork): boolean => {\n const networkConfig = AVAILABLE_NETWORKS.find((n) => n.name === networkName)\n if (!networkConfig) {\n throw new Error(`Network configuration not found for: ${networkName}`)\n }\n return networkConfig.proverEnabled\n}\n\nexport interface SharedPXEInstance {\n pxe: PXE\n aztecNode: AztecNode\n wallet: MinimalWallet\n storageService: AztecStorageService\n getSponsoredFeePaymentMethod: () => Promise<SponsoredFeePaymentMethod>\n}\n\ninterface PXEInstanceEntry {\n instance: SharedPXEInstance\n nodeUrl: string\n networkName: AztecNetwork\n}\n\n/**\n * SharedPXEService manages PXE instances across the application.\n * Uses singleton pattern with lazy initialization.\n */\nclass SharedPXEServiceClass {\n private instances: Map<string, PXEInstanceEntry> = new Map()\n private initPromises: Map<string, Promise<SharedPXEInstance>> = new Map()\n private cachedPaymentMethods: Map<string, SponsoredFeePaymentMethod> =\n new Map()\n private storePromises: Map<\n string,\n Promise<Awaited<ReturnType<typeof createStore>>>\n > = new Map()\n private static readonly PERSISTED_STORE_KB = 5e5 // 500MB\n private static readonly FALLBACK_STORE_KB = 1e5 // 100MB\n\n /**\n * Get or create a PXE instance for a specific network.\n * If already initializing, returns the same promise to avoid duplicate initialization.\n */\n async getInstance(\n nodeUrl: string,\n networkName: AztecNetwork,\n ): Promise<SharedPXEInstance> {\n const normalizedNodeUrl = this.normalizeNodeUrl(nodeUrl)\n const key = this.getInstanceKey(networkName)\n\n // Return existing instance if available\n const existing = this.instances.get(key)\n if (existing) {\n // Reuse if URL matches, else replace stale one for this network\n if (existing.nodeUrl === normalizedNodeUrl) {\n return existing.instance\n }\n this.clearInstance(existing.networkName)\n }\n\n // Return in-progress initialization if exists\n const initPromise = this.initPromises.get(key)\n if (initPromise) {\n return initPromise\n }\n\n // Start new initialization\n const promise = this.initializeInstance(normalizedNodeUrl, networkName, key)\n this.initPromises.set(key, promise)\n\n try {\n const instance = await promise\n return instance\n } finally {\n this.initPromises.delete(key)\n }\n }\n\n /**\n * Check if a PXE instance is initialized for a network\n */\n isInitialized(networkName: AztecNetwork): boolean {\n const key = this.getInstanceKey(networkName)\n return this.instances.has(key)\n }\n\n /**\n * Check if initialization is in progress for a network\n */\n isInitializing(networkName: AztecNetwork): boolean {\n const key = this.getInstanceKey(networkName)\n return this.initPromises.has(key)\n }\n\n /**\n * Get existing instance without initialization (returns null if not initialized)\n */\n getExistingInstance(networkName: AztecNetwork): SharedPXEInstance | null {\n const key = this.getInstanceKey(networkName)\n return this.instances.get(key)?.instance ?? null\n }\n\n /**\n * Clear a specific PXE instance (useful for network switching)\n */\n clearInstance(networkName: AztecNetwork): void {\n const key = this.getInstanceKey(networkName)\n this.instances.delete(key)\n this.cachedPaymentMethods.delete(key)\n logger.info(`Cleared PXE instance for ${networkName}`)\n }\n\n /**\n * Clear all PXE instances\n */\n clearAll(): void {\n this.instances.clear()\n this.cachedPaymentMethods.clear()\n logger.info('Cleared all PXE instances')\n }\n\n private getInstanceKey(networkName: AztecNetwork | string): string {\n return `${networkName}`\n }\n\n private getFeePaymentConfig(networkName: string) {\n const networkConfig = AVAILABLE_NETWORKS.find((n) => n.name === networkName)\n return networkConfig?.feePaymentContracts\n }\n\n private normalizeNodeUrl(nodeUrl: string): string {\n if (!nodeUrl) {\n return nodeUrl\n }\n return nodeUrl.endsWith('/') ? nodeUrl.slice(0, -1) : nodeUrl\n }\n\n private async initializeInstance(\n nodeUrl: string,\n networkName: AztecNetwork,\n key: string,\n ): Promise<SharedPXEInstance> {\n logger.info(`Initializing PXE for network: ${networkName}`)\n\n const aztecNode = NetworkService.getNodeClient(nodeUrl)\n\n // Get L1 contracts for network-specific database\n const l1Contracts = await aztecNode.getL1ContractAddresses()\n const storeName = `aztec-pxe-${networkName}`\n\n // Reuse a single store per network\n const pxeStore = await this.getOrCreateStore(networkName, storeName)\n\n const config = getPXEConfig()\n config.l1Contracts = l1Contracts\n config.proverEnabled = getProverEnabled(networkName)\n\n const pxe = await createPXE(aztecNode, config, {\n store: pxeStore,\n })\n\n const wallet = new MinimalWallet(pxe, aztecNode)\n\n // Register fee payment contracts (SponsoredFPC + any network-specific FPCs)\n const feePaymentConfig = this.getFeePaymentConfig(networkName)\n const feePaymentRegister = new FeePaymentRegister()\n await feePaymentRegister.registerAll(pxe, feePaymentConfig as any)\n\n // Initialize storage service\n const storageService = new AztecStorageService()\n\n // Register saved senders\n await this.registerSavedSenders(pxe, storageService)\n\n const nodeInfo = await aztecNode.getNodeInfo()\n logger.info(`PXE connected to ${networkName}`, nodeInfo)\n\n const instance: SharedPXEInstance = {\n pxe,\n aztecNode,\n wallet,\n storageService,\n getSponsoredFeePaymentMethod: () =>\n this.getSponsoredFeePaymentMethod(key, pxe),\n }\n\n this.instances.set(key, {\n instance,\n nodeUrl,\n networkName,\n })\n\n return instance\n }\n\n private async getOrCreateStore(\n networkName: AztecNetwork,\n storeName: string,\n ): Promise<Awaited<ReturnType<typeof createStore>>> {\n const existingPromise = this.storePromises.get(networkName)\n if (existingPromise) {\n return existingPromise\n }\n\n const createPromise = this.createPXEStoreWithFallback(storeName)\n this.storePromises.set(networkName, createPromise)\n return createPromise\n }\n\n private async createPXEStoreWithFallback(\n storeName: string,\n ): Promise<Awaited<ReturnType<typeof createStore>>> {\n try {\n return await createStore(\n storeName,\n {\n dataDirectory: 'pxe',\n dataStoreMapSizeKb: SharedPXEServiceClass.PERSISTED_STORE_KB,\n },\n undefined,\n pxeLogger,\n )\n } catch (error) {\n logger.warn(\n `Failed to create persistent PXE store (limit ${\n SharedPXEServiceClass.PERSISTED_STORE_KB\n } KB). Retrying with smaller ephemeral store.`,\n { error },\n )\n\n return await createStore(\n `${storeName}-tmp`,\n {\n dataDirectory: 'pxe-tmp',\n dataStoreMapSizeKb: SharedPXEServiceClass.FALLBACK_STORE_KB,\n },\n undefined,\n pxeLogger,\n )\n }\n }\n\n private async getSponsoredPFCContract(_pxe: PXE) {\n const { getContractInstanceFromInstantiationParams } =\n await import('@aztec/aztec.js/contracts')\n\n return await getContractInstanceFromInstantiationParams(\n SponsoredFPCContractArtifact,\n {\n salt: new Fr(SPONSORED_FPC_SALT),\n },\n )\n }\n\n private async getSponsoredFeePaymentMethod(\n key: string,\n pxe: PXE,\n ): Promise<SponsoredFeePaymentMethod> {\n const cached = this.cachedPaymentMethods.get(key)\n if (cached) {\n return cached\n }\n\n const sponsoredPFCContract = await this.getSponsoredPFCContract(pxe)\n const paymentMethod = new SponsoredFeePaymentMethod(\n sponsoredPFCContract.address,\n )\n\n this.cachedPaymentMethods.set(key, paymentMethod)\n\n return paymentMethod\n }\n\n private async registerSavedSenders(\n pxe: PXE,\n storageService: AztecStorageService,\n ): Promise<void> {\n try {\n const savedSenders = storageService.getSenders()\n\n if (savedSenders.length === 0) {\n return\n }\n\n logger.info(`Registering ${savedSenders.length} saved senders with PXE`)\n\n for (const senderAddressString of savedSenders) {\n try {\n const senderAddress = AztecAddress.fromString(senderAddressString)\n await pxe.registerSender(senderAddress)\n } catch {\n // Sender might already be registered\n logger.warn(`Failed to register sender ${senderAddressString}`)\n }\n }\n } catch (error) {\n logger.error('Error registering saved senders:', error)\n }\n }\n}\n\n// Export singleton instance\nexport const SharedPXEService = new SharedPXEServiceClass()\n","/**\n * Fee Payment Register\n *\n * Handles registration of fee payment contracts with PXE.\n */\n\nimport { MeteredContractArtifact } from '@defi-wonderland/aztec-fee-payment/artifacts'\nimport type { ContractArtifact } from '@aztec/aztec.js/abi'\nimport { AztecAddress } from '@aztec/aztec.js/addresses'\nimport { Fr } from '@aztec/aztec.js/fields'\nimport { createLogger } from '@aztec/aztec.js/log'\nimport { SPONSORED_FPC_SALT } from '@aztec/constants'\nimport { SponsoredFPCContractArtifact } from '@aztec/noir-contracts.js/SponsoredFPC'\nimport type { PXE } from '@aztec/pxe/server'\nimport type { DeployedContractConfig } from '../../../config/networks/types'\n\nconst logger = createLogger('fee-payment-register')\n\ninterface FPCConfig {\n name: string\n artifact: ContractArtifact\n salt: Fr\n deployer?: AztecAddress\n expectedAddress?: string\n}\n\ninterface RegisteredFPC {\n name: string\n address: AztecAddress\n}\n\n/**\n * Register for fee payment contracts.\n * Tracks and registers all FPCs needed by the application.\n */\nexport class FeePaymentRegister {\n private registeredFPCs: RegisteredFPC[] = []\n\n async registerAll(\n pxe: PXE,\n feePaymentConfig?: Record<string, DeployedContractConfig>,\n ): Promise<RegisteredFPC[]> {\n this.registeredFPCs = []\n\n const fpcsToRegister: FPCConfig[] = [\n {\n name: 'sponsored',\n artifact: SponsoredFPCContractArtifact,\n salt: new Fr(SPONSORED_FPC_SALT),\n },\n ]\n\n if (feePaymentConfig?.metered?.address) {\n fpcsToRegister.push({\n name: 'metered',\n artifact: MeteredContractArtifact,\n salt: Fr.fromString(feePaymentConfig.metered.salt ?? '1337'),\n deployer: feePaymentConfig.metered.deployer\n ? AztecAddress.fromString(feePaymentConfig.metered.deployer)\n : AztecAddress.ZERO,\n expectedAddress: feePaymentConfig.metered.address,\n })\n }\n\n for (const fpc of fpcsToRegister) {\n await this.registerFPC(pxe, fpc)\n }\n\n logger.info(\n `Registered ${this.registeredFPCs.length} fee payment contract(s)`,\n this.registeredFPCs.map((fpc) => fpc.name),\n )\n\n return this.registeredFPCs\n }\n\n getRegisteredFPCs(): RegisteredFPC[] {\n return [...this.registeredFPCs]\n }\n\n private async registerFPC(pxe: PXE, config: FPCConfig): Promise<void> {\n const { getContractInstanceFromInstantiationParams } =\n await import('@aztec/aztec.js/contracts')\n\n const instance = await getContractInstanceFromInstantiationParams(\n config.artifact,\n {\n salt: config.salt,\n deployer: config.deployer,\n },\n )\n\n if (config.expectedAddress) {\n const expected = AztecAddress.fromString(config.expectedAddress)\n if (!instance.address.equals(expected)) {\n logger.warn(\n `${config.name} FPC address mismatch: expected ${config.expectedAddress}, got ${instance.address.toString()}`,\n )\n }\n }\n\n await pxe.registerContract({\n instance,\n artifact: config.artifact,\n })\n\n this.registeredFPCs.push({\n name: config.name,\n address: instance.address,\n })\n\n logger.debug(`Registered ${config.name} FPC`, {\n address: instance.address.toString(),\n })\n }\n}\n","import {\n type AccountWithSecretKey,\n type Account,\n SignerlessAccount,\n} from '@aztec/aztec.js/account'\nimport { AztecAddress } from '@aztec/aztec.js/addresses'\nimport type { AztecNode } from '@aztec/aztec.js/node'\nimport type { PXE } from '@aztec/pxe/server'\nimport { BaseWallet } from '@aztec/wallet-sdk/base-wallet'\n\n/**\n * MinimalWallet extends BaseWallet to bootstrap account creation.\n * This bridges PXE to the Wallet interface required by AccountManager.\n *\n * The Aztec SDK requires a Wallet to create an AccountManager, but we need\n * to create accounts before we have a wallet. This minimal implementation\n * provides the necessary interface to bootstrap the account creation process.\n */\nexport class MinimalWallet extends BaseWallet {\n private readonly addressToAccount = new Map<string, AccountWithSecretKey>()\n\n constructor(pxe: PXE, aztecNode: AztecNode) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n super(pxe as unknown as any, aztecNode)\n }\n\n public addAccount(account: AccountWithSecretKey): void {\n this.addressToAccount.set(account.getAddress().toString(), account)\n }\n\n protected async getAccountFromAddress(\n address: AztecAddress,\n ): Promise<Account> {\n if (address.equals(AztecAddress.ZERO)) {\n return new SignerlessAccount()\n }\n\n const account = this.addressToAccount.get(address.toString())\n if (!account) {\n throw new Error(\n `Account not found in wallet for address: ${address.toString()}`,\n )\n }\n return account\n }\n\n async getAccounts(): Promise<{ alias: string; item: AztecAddress }[]> {\n return Array.from(this.addressToAccount.values()).map((acc) => ({\n alias: '',\n item: acc.getAddress(),\n }))\n }\n}\n","/**\n * Service for handling Aztec wallet storage operations\n *\n * ⚠️ SECURITY WARNING: Account keys are stored in localStorage in plain text.\n * This is suitable for TESTNET ONLY. For production apps with real funds,\n * use an external wallet provider (like Azguard).\n *\n * The embedded wallet is designed for development and demonstration purposes.\n */\nimport { IAztecStorageService, AccountData } from '../../../types/aztec';\n\nexport class AztecStorageService implements IAztecStorageService {\n private static readonly STORAGE_KEY = 'aztec-account';\n private static readonly SENDERS_STORAGE_KEY = 'aztec-senders';\n\n /**\n * Save account data to localStorage\n * ⚠️ Keys are stored in plain text - testnet only!\n */\n saveAccount(accountData: AccountData): void {\n localStorage.setItem(\n AztecStorageService.STORAGE_KEY,\n JSON.stringify(accountData)\n );\n }\n\n /**\n * Get account data from localStorage\n */\n getAccount(): AccountData | null {\n const data = localStorage.getItem(AztecStorageService.STORAGE_KEY);\n\n if (!data) {\n return null;\n }\n\n try {\n return JSON.parse(data) as AccountData;\n } catch (error) {\n console.error('Failed to parse account data:', error);\n this.clearAccount();\n return null;\n }\n }\n\n /**\n * Clear account data from localStorage\n */\n clearAccount(): void {\n localStorage.removeItem(AztecStorageService.STORAGE_KEY);\n }\n\n /**\n * Save senders array to localStorage\n */\n saveSenders(senders: string[]): void {\n localStorage.setItem(\n AztecStorageService.SENDERS_STORAGE_KEY,\n JSON.stringify(senders)\n );\n }\n\n /**\n * Get senders array from localStorage\n */\n getSenders(): string[] {\n const data = localStorage.getItem(AztecStorageService.SENDERS_STORAGE_KEY);\n if (!data) {\n return [];\n }\n try {\n return JSON.parse(data) as string[];\n } catch (error) {\n console.warn('Failed to parse saved senders:', error);\n return [];\n }\n }\n\n /**\n * Add a new sender to the stored list\n */\n addSender(sender: string): void {\n const existingSenders = this.getSenders();\n if (!existingSenders.includes(sender)) {\n existingSenders.push(sender);\n this.saveSenders(existingSenders);\n }\n }\n\n /**\n * Remove a sender from the stored list\n */\n removeSender(sender: string): void {\n const existingSenders = this.getSenders();\n const filteredSenders = existingSenders.filter((s) => s !== sender);\n this.saveSenders(filteredSenders);\n }\n\n /**\n * Clear all saved senders from localStorage\n */\n clearSenders(): void {\n localStorage.removeItem(AztecStorageService.SENDERS_STORAGE_KEY);\n }\n}\n","/**\n * EmbeddedConnector - Connector for Embedded wallets\n *\n * Uses app-managed PXE with internal signing.\n * Keys are stored locally in the browser.\n */\n\nimport type { SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';\nimport type { Wallet } from '@aztec/aztec.js/wallet';\nimport type { PXE } from '@aztec/pxe/server';\nimport { SharedPXEService } from '../services/aztec/pxe';\nimport { getNetworkStore } from '../store/network';\nimport { getWalletStore, clearSavedAccount } from '../store/wallet';\nimport { WalletType } from '../types/aztec';\nimport type {\n EmbeddedWalletConnector,\n ConnectorStatus,\n} from '../../types/walletConnector';\n\nexport const EMBEDDED_CONNECTOR_ID = 'embedded' as const;\n\n/**\n * Connector for Embedded wallets (internal signing).\n *\n * This connector uses app-managed PXE with keys stored locally.\n * All signing happens within the app.\n *\n * Reads state directly from the Zustand store.\n */\nexport class EmbeddedConnector implements EmbeddedWalletConnector {\n readonly id = EMBEDDED_CONNECTOR_ID;\n readonly label = 'Embedded Wallet';\n readonly type = WalletType.EMBEDDED;\n\n getStatus(): ConnectorStatus {\n const state = getWalletStore();\n const isThisConnector = state.walletType === WalletType.EMBEDDED;\n\n return {\n isInstalled: true,\n status: isThisConnector ? state.status : 'disconnected',\n error: isThisConnector ? state.error : null,\n };\n }\n\n getAccount() {\n const state = getWalletStore();\n return state.walletType === WalletType.EMBEDDED ? state.account : null;\n }\n\n async connect(): Promise<void> {\n const state = getWalletStore();\n if (state.walletType === WalletType.EMBEDDED && state.account) {\n return;\n }\n await state.connectEmbedded();\n }\n\n async disconnect(): Promise<void> {\n await getWalletStore().disconnect(clearSavedAccount);\n }\n\n getPXE(): PXE | null {\n const config = getNetworkStore().currentConfig;\n const instance = SharedPXEService.getExistingInstance(config.name);\n return instance?.pxe ?? null;\n }\n\n getWallet(): Wallet | null {\n const config = getNetworkStore().currentConfig;\n const instance = SharedPXEService.getExistingInstance(config.name);\n return instance?.wallet ?? null;\n }\n\n async getSponsoredFeePaymentMethod(): Promise<SponsoredFeePaymentMethod> {\n const config = getNetworkStore().currentConfig;\n const instance = SharedPXEService.getExistingInstance(config.name);\n if (!instance) {\n throw new Error('PXE not initialized');\n }\n return instance.getSponsoredFeePaymentMethod();\n }\n}\n\n/**\n * Factory function to create an Embedded connector\n */\nexport const createEmbeddedConnector = (): EmbeddedConnector => {\n return new EmbeddedConnector();\n};\n","/**\n * EVMWalletService - Core service for EVM wallet management using viem\n *\n * Supports EIP-6963 for multi-wallet discovery.\n */\n\nimport {\n createWalletClient,\n custom,\n type WalletClient,\n type Hex,\n Account,\n} from 'viem';\nimport type { EIP1193Provider } from '../../../types/evm';\n\nexport type EVMWalletListener = () => void;\n\nexport interface EVMWalletState {\n address: Hex | null;\n isConnected: boolean;\n chainId: number | null;\n connectedRdns: string | null;\n}\n\nexport class EVMWalletService {\n private walletClient: WalletClient | null = null;\n private address: Hex | null = null;\n private chainId: number | null = null;\n private connectedRdns: string | null = null;\n private listeners: Set<EVMWalletListener> = new Set();\n private isListeningToEvents = false;\n private currentProvider: EIP1193Provider | null = null;\n\n isAvailable(): boolean {\n return typeof window !== 'undefined' && !!window.ethereum;\n }\n\n isConnected(): boolean {\n return this.address !== null && this.walletClient !== null;\n }\n\n getState(): EVMWalletState {\n return {\n address: this.address,\n isConnected: this.isConnected(),\n chainId: this.chainId,\n connectedRdns: this.connectedRdns,\n };\n }\n\n getConnectedRdns(): string | null {\n return this.connectedRdns;\n }\n\n getAddress(): Hex | null {\n return this.address;\n }\n\n getWalletClient(): WalletClient | null {\n return this.walletClient;\n }\n\n /**\n * Connect to a wallet provider\n * @param provider - Specific EIP-1193 provider (from EIP-6963) or uses window.ethereum\n * @param rdns - Optional rdns identifier for the connected wallet (for multi-wallet tracking)\n */\n async connect(provider?: EIP1193Provider, rdns?: string): Promise<Hex> {\n // Disconnect any previous connection first\n if (this.currentProvider) {\n this.disconnect();\n }\n\n const ethereum = provider ?? window.ethereum;\n\n if (!ethereum) {\n throw new Error('No wallet provider found');\n }\n\n try {\n const accounts = (await ethereum.request({\n method: 'eth_requestAccounts',\n })) as Hex[];\n\n if (!accounts || accounts.length === 0) {\n throw new Error('No accounts returned from wallet');\n }\n\n const address = accounts[0];\n\n const chainIdHex = (await ethereum.request({\n method: 'eth_chainId',\n })) as string;\n const chainId = parseInt(chainIdHex, 16);\n\n this.walletClient = createWalletClient({\n account: { address } as Account,\n transport: custom(ethereum),\n });\n\n this.address = address;\n this.chainId = chainId;\n this.currentProvider = ethereum;\n this.connectedRdns = rdns ?? null;\n\n this.setupEventListeners();\n this.notifyListeners();\n\n return address;\n } catch (error) {\n // Reset state on failure (e.g., user rejected)\n this.walletClient = null;\n this.address = null;\n this.chainId = null;\n this.currentProvider = null;\n this.connectedRdns = null;\n throw error;\n }\n }\n\n disconnect(): void {\n this.removeEventListeners();\n this.walletClient = null;\n this.address = null;\n this.chainId = null;\n this.currentProvider = null;\n this.connectedRdns = null;\n this.notifyListeners();\n }\n\n async signMessage(message: string | { raw: Uint8Array }): Promise<Hex> {\n if (!this.walletClient || !this.address) {\n throw new Error('Wallet not connected');\n }\n\n return this.walletClient.signMessage({\n account: this.address,\n message,\n });\n }\n\n subscribe(listener: EVMWalletListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(): void {\n this.listeners.forEach((listener) => listener());\n }\n\n private setupEventListeners(): void {\n const provider = this.currentProvider;\n if (this.isListeningToEvents || !provider) return;\n\n provider.on('accountsChanged', this.handleAccountsChanged);\n provider.on('chainChanged', this.handleChainChanged);\n provider.on('disconnect', this.handleDisconnect);\n\n this.isListeningToEvents = true;\n }\n\n private removeEventListeners(): void {\n const provider = this.currentProvider;\n if (!this.isListeningToEvents || !provider) return;\n\n provider.removeListener('accountsChanged', this.handleAccountsChanged);\n provider.removeListener('chainChanged', this.handleChainChanged);\n provider.removeListener('disconnect', this.handleDisconnect);\n\n this.isListeningToEvents = false;\n }\n\n private handleAccountsChanged = (accounts: unknown): void => {\n const accountsArray = accounts as Hex[];\n\n if (!accountsArray || accountsArray.length === 0) {\n this.disconnect();\n return;\n }\n\n const newAddress = accountsArray[0];\n if (newAddress !== this.address) {\n this.address = newAddress;\n\n if (this.currentProvider) {\n this.walletClient = createWalletClient({\n account: { address: newAddress } as Account,\n transport: custom(this.currentProvider),\n });\n }\n\n this.notifyListeners();\n }\n };\n\n private handleChainChanged = (chainIdHex: unknown): void => {\n const newChainId = parseInt(chainIdHex as string, 16);\n\n if (newChainId !== this.chainId) {\n this.chainId = newChainId;\n this.notifyListeners();\n }\n };\n\n private handleDisconnect = (): void => {\n this.disconnect();\n };\n}\n\nlet evmWalletServiceInstance: EVMWalletService | null = null;\n\nexport const getEVMWalletService = (): EVMWalletService => {\n if (!evmWalletServiceInstance) {\n evmWalletServiceInstance = new EVMWalletService();\n }\n return evmWalletServiceInstance;\n};\n\nexport const createEVMWalletService = (): EVMWalletService => {\n return new EVMWalletService();\n};\n","/**\n * EIP-6963 Multi Wallet Discovery Service\n *\n * Discovers all injected EVM wallets using the EIP-6963 standard.\n * @see https://eips.ethereum.org/EIPS/eip-6963\n */\n\nimport type {\n EIP1193Provider,\n EIP6963ProviderDetail,\n EIP6963AnnounceProviderEvent,\n} from '../../../types/evm'\n\nexport type EIP6963Listener = (providers: EIP6963ProviderDetail[]) => void\n\nclass EIP6963Service {\n private providers: Map<string, EIP6963ProviderDetail> = new Map()\n private listeners: Set<EIP6963Listener> = new Set()\n private isDiscovering = false\n\n discover(): void {\n if (typeof window === 'undefined' || this.isDiscovering) return\n this.isDiscovering = true\n\n window.addEventListener(\n 'eip6963:announceProvider',\n this.handleAnnouncement as EventListener,\n )\n\n window.dispatchEvent(new Event('eip6963:requestProvider'))\n }\n\n private handleAnnouncement = (event: EIP6963AnnounceProviderEvent): void => {\n const { info, provider } = event.detail\n this.providers.set(info.rdns, { info, provider })\n this.notifyListeners()\n }\n\n getProviders(): EIP6963ProviderDetail[] {\n return Array.from(this.providers.values())\n }\n\n getProviderByRdns(rdns: string): EIP1193Provider | null {\n return this.providers.get(rdns)?.provider ?? null\n }\n\n getProviderInfo(rdns: string): EIP6963ProviderDetail | null {\n return this.providers.get(rdns) ?? null\n }\n\n isWalletAvailable(rdns: string): boolean {\n return this.providers.has(rdns)\n }\n\n subscribe(listener: EIP6963Listener): () => void {\n this.listeners.add(listener)\n listener(this.getProviders())\n return () => this.listeners.delete(listener)\n }\n\n private notifyListeners(): void {\n const providers = this.getProviders()\n this.listeners.forEach((listener) => listener(providers))\n }\n\n destroy(): void {\n if (typeof window === 'undefined') return\n window.removeEventListener(\n 'eip6963:announceProvider',\n this.handleAnnouncement as EventListener,\n )\n this.providers.clear()\n this.listeners.clear()\n this.isDiscovering = false\n }\n}\n\nlet eip6963ServiceInstance: EIP6963Service | null = null\n\nexport const getEIP6963Service = (): EIP6963Service => {\n if (!eip6963ServiceInstance) {\n eip6963ServiceInstance = new EIP6963Service()\n }\n return eip6963ServiceInstance\n}\n\nexport { EIP6963Service }\n","/**\n * EVMSigner - External signer implementation for EVM wallets\n *\n * Works with any EVM wallet via EIP-6963 discovery.\n * Uses personal_sign for signing Aztec transactions.\n * The user's private key never leaves the wallet.\n */\n\nimport { type Hex, keccak256, toBytes } from 'viem';\nimport type { AuthWitnessProvider } from '@aztec/aztec.js/account';\nimport type { CompleteAddress } from '@aztec/aztec.js/addresses';\nimport { getEIP6963Service } from '../services/evm/EIP6963Service';\nimport { MetaMaskAuthWitnessProvider } from './MetaMaskAuthWitnessProvider';\nimport { ExternalSignerType } from './types';\nimport {\n recoverPublicKeyFromSignature,\n getPublicKeyRecoveryMessage,\n} from './utils/evmPublicKeyRecovery';\nimport type { ExternalSigner, ECDSAPublicKey } from './types';\nimport type { EVMWalletService } from '../services/evm/EVMWalletService';\n\nexport class EVMSigner implements ExternalSigner {\n readonly type: ExternalSignerType = ExternalSignerType.EVM_WALLET;\n readonly label = 'EVM Wallet';\n readonly rdns?: string;\n\n private evmService: EVMWalletService;\n private cachedPublicKey: ECDSAPublicKey | null = null;\n private cachedSecretKey: Buffer | null = null;\n private cachedSalt: Buffer | null = null;\n\n constructor(evmService: EVMWalletService, rdns?: string) {\n this.evmService = evmService;\n this.rdns = rdns;\n }\n\n isAvailable(): boolean {\n if (this.rdns) {\n return getEIP6963Service().isWalletAvailable(this.rdns);\n }\n return this.evmService.isAvailable();\n }\n\n isConnected(): boolean {\n if (!this.evmService.isConnected()) {\n return false;\n }\n const connectedRdns = this.evmService.getConnectedRdns();\n if (!this.rdns) {\n return true;\n }\n return connectedRdns === this.rdns;\n }\n\n async connect(): Promise<void> {\n // If already connected to this specific wallet, skip\n if (this.isConnected()) {\n return;\n }\n\n // Get specific provider via EIP-6963 if rdns is set\n const provider = this.rdns\n ? getEIP6963Service().getProviderByRdns(this.rdns)\n : null;\n\n if (this.rdns && !provider) {\n console.warn(\n `[EVMSigner] Wallet ${this.rdns} not found via EIP-6963, falling back to window.ethereum`\n );\n }\n\n await this.evmService.connect(provider ?? undefined, this.rdns);\n }\n\n disconnect(): void {\n this.evmService.disconnect();\n this.clearCache();\n }\n\n getEVMAddress(): string | null {\n return this.evmService.getAddress();\n }\n\n async getPublicKey(): Promise<ECDSAPublicKey> {\n if (this.cachedPublicKey) {\n return this.cachedPublicKey;\n }\n\n const walletClient = this.evmService.getWalletClient();\n if (!walletClient) {\n throw new Error('EVM wallet client not available');\n }\n\n const address = this.evmService.getAddress();\n if (!address) {\n throw new Error('EVM wallet not connected');\n }\n\n const message = getPublicKeyRecoveryMessage(address);\n\n const signature = await walletClient.signMessage({\n account: address,\n message,\n });\n\n this.cacheSignatureDerivatives(signature, address);\n\n const publicKey = await recoverPublicKeyFromSignature(message, signature);\n this.cachedPublicKey = publicKey;\n\n return publicKey;\n }\n\n createAuthWitnessProvider(_address: CompleteAddress): AuthWitnessProvider {\n const walletClient = this.evmService.getWalletClient();\n const address = this.evmService.getAddress();\n\n if (!walletClient || !address) {\n throw new Error('EVM wallet not connected');\n }\n\n return new MetaMaskAuthWitnessProvider(walletClient, address);\n }\n\n async deriveSecretKey(): Promise<Buffer> {\n if (this.cachedSecretKey) {\n return this.cachedSecretKey;\n }\n\n await this.getPublicKey();\n\n if (!this.cachedSecretKey) {\n throw new Error('Secret key derivation failed - no signature cached');\n }\n\n return this.cachedSecretKey;\n }\n\n deriveSalt(): Buffer {\n if (this.cachedSalt) {\n return this.cachedSalt;\n }\n\n const address = this.getEVMAddress();\n if (!address) {\n throw new Error('EVM wallet not connected');\n }\n\n const addressBytes = Buffer.from(address.slice(2).padStart(64, '0'), 'hex');\n this.cachedSalt = addressBytes.slice(0, 32);\n\n return this.cachedSalt;\n }\n\n private cacheSignatureDerivatives(signature: Hex, _address: Hex): void {\n const signatureHash = keccak256(toBytes(signature));\n this.cachedSecretKey = Buffer.from(signatureHash.slice(2), 'hex');\n }\n\n private clearCache(): void {\n this.cachedPublicKey = null;\n this.cachedSecretKey = null;\n this.cachedSalt = null;\n }\n}\n\nexport const createEVMSigner = (\n evmService: EVMWalletService,\n rdns?: string\n): EVMSigner => {\n return new EVMSigner(evmService, rdns);\n};\n","import type { AuthWitnessProvider } from '@aztec/aztec.js/account';\nimport { Fr } from '@aztec/aztec.js/fields';\nimport { AuthWitness } from '@aztec/stdlib/auth-witness';\nimport type { Hex, WalletClient } from 'viem';\n\n/**\n * AuthWitnessProvider that uses MetaMask's personal_sign for creating auth witnesses.\n *\n * When createAuthWit is called:\n * 1. Converts the messageHash (Fr) to raw bytes (32 bytes)\n * 2. Calls MetaMask signMessage with those raw bytes\n * 3. MetaMask internally computes: keccak256(\"\\x19Ethereum Signed Message:\\n32\" + messageHash)\n * 4. MetaMask signs with the user's private key\n * 5. Returns the signature as the auth witness (r[32] + s[32])\n *\n * The corresponding Noir contract (EcdsaKEthSignerAccount) reconstructs the same\n * Ethereum-prefixed hash and verifies the signature.\n */\nexport class MetaMaskAuthWitnessProvider implements AuthWitnessProvider {\n private readonly walletClient: WalletClient;\n private readonly account: Hex;\n\n /**\n * Creates a new MetaMaskAuthWitnessProvider.\n *\n * @param walletClient - Viem wallet client connected to MetaMask\n * @param account - The connected Ethereum address (used for signing)\n */\n constructor(walletClient: WalletClient, account: Hex) {\n this.walletClient = walletClient;\n this.account = account;\n }\n\n /**\n * Create an auth witness by signing with MetaMask.\n *\n * @param messageHash - The outer_hash from Aztec (Poseidon hash of the action)\n * @returns AuthWitness containing the signature fields (r and s as Fr array)\n */\n async createAuthWit(messageHash: Fr): Promise<AuthWitness> {\n // Convert Fr to 32-byte buffer for MetaMask\n const messageBytes = messageHash.toBuffer();\n\n // Call MetaMask signMessage with raw bytes\n // MetaMask will prepend \"\\x19Ethereum Signed Message:\\n32\" automatically\n const signature = await this.walletClient.signMessage({\n account: this.account,\n message: { raw: messageBytes },\n });\n\n // Parse the signature (65 bytes: r[32] + s[32] + v[1])\n // Remove 0x prefix, split into r, s (we don't need v for the witness)\n const sigHex = signature.slice(2);\n const r = Buffer.from(sigHex.slice(0, 64), 'hex');\n const s = Buffer.from(sigHex.slice(64, 128), 'hex');\n\n // Convert signature bytes to Field array (64 fields, one per byte)\n // This matches how the Noir contract reads the auth witness\n const witnessFields: Fr[] = [];\n for (let i = 0; i < 32; i++) {\n witnessFields.push(new Fr(r[i]));\n }\n for (let i = 0; i < 32; i++) {\n witnessFields.push(new Fr(s[i]));\n }\n\n return new AuthWitness(messageHash, witnessFields);\n }\n}\n","import { hashMessage, recoverPublicKey, type Hex } from 'viem';\n\n/**\n * Recover the uncompressed public key from a signed message.\n *\n * This function uses Ethereum's ecrecover to extract the public key from a signature.\n * The public key can then be used to deploy an Aztec account contract.\n *\n * @param message - The original message that was signed\n * @param signature - The signature from personal_sign (65 bytes with v)\n * @returns Object with x and y coordinates (each 32 bytes)\n */\nexport async function recoverPublicKeyFromSignature(\n message: string,\n signature: Hex\n): Promise<{ x: Buffer; y: Buffer }> {\n // Hash the message the same way MetaMask does for personal_sign\n const messageHash = hashMessage(message);\n\n // recoverPublicKey returns uncompressed public key (65 bytes: 0x04 + x[32] + y[32])\n const publicKey = await recoverPublicKey({\n hash: messageHash,\n signature,\n });\n\n // Remove the 0x04 prefix (indicates uncompressed format) and split into x and y\n const pubKeyHex = publicKey.slice(4); // Remove '0x04'\n const x = Buffer.from(pubKeyHex.slice(0, 64), 'hex');\n const y = Buffer.from(pubKeyHex.slice(64, 128), 'hex');\n\n return { x, y };\n}\n\n/**\n * Standard message for public key recovery during account setup.\n *\n * Using a deterministic message that includes the EVM address ensures:\n * 1. The same EVM address always produces the same Aztec account\n * 2. Users understand what they're signing\n *\n * @param evmAddress - The connected Ethereum address\n * @returns The message to sign\n */\nexport function getPublicKeyRecoveryMessage(evmAddress: Hex): string {\n return `Sign to allow creation and inspection state of your Aztec account linked to ${evmAddress}`;\n}\n","import type { ContractArtifact } from '@aztec/aztec.js/abi';\nimport {\n BaseAccount,\n type AccountContract,\n type Account,\n type AuthWitnessProvider,\n} from '@aztec/aztec.js/account';\nimport type { CompleteAddress } from '@aztec/aztec.js/addresses';\nimport { DefaultAccountEntrypoint } from '@aztec/entrypoints/account';\n// TODO: temporary\n// import { EcdsaKEthSignerAccountContractArtifact } from '../../artifacts/EcdsaKEthSignerAccount';\n\n/**\n * AccountContract implementation for ECDSA K accounts that use\n * MetaMask's personal_sign for authentication.\n *\n * Unlike standard ECDSA accounts, this does NOT store private keys.\n * Instead, it:\n * 1. Takes the public key coordinates (x, y) during construction\n * 2. Delegates signing to an external AuthWitnessProvider (MetaMask)\n *\n * The Noir contract verifies Ethereum-style personal_sign signatures:\n * - Prepends \"\\x19Ethereum Signed Message:\\n32\" to the outer_hash\n * - Computes keccak256 of the prefixed message\n * - Verifies secp256k1 ECDSA signature against this hash\n */\nexport class EcdsaKEthSignerAccountContract implements AccountContract {\n private readonly publicKeyX: Buffer;\n private readonly publicKeyY: Buffer;\n private readonly authWitnessProvider: AuthWitnessProvider;\n\n /**\n * Creates a new EcdsaKEthSignerAccountContract.\n *\n * @param publicKeyX - The x coordinate of the secp256k1 public key (32 bytes)\n * @param publicKeyY - The y coordinate of the secp256k1 public key (32 bytes)\n * @param authWitnessProvider - External provider that calls MetaMask for signing\n */\n constructor(\n publicKeyX: Buffer,\n publicKeyY: Buffer,\n authWitnessProvider: AuthWitnessProvider\n ) {\n if (publicKeyX.length !== 32 || publicKeyY.length !== 32) {\n throw new Error('Public key coordinates must be 32 bytes each');\n }\n this.publicKeyX = publicKeyX;\n this.publicKeyY = publicKeyY;\n this.authWitnessProvider = authWitnessProvider;\n }\n\n /**\n * Returns the contract artifact for deployment.\n */\n getContractArtifact(): Promise<ContractArtifact> {\n return Promise.resolve(null as unknown as ContractArtifact);\n // return Promise.resolve(EcdsaKEthSignerAccountContractArtifact);\n }\n\n /**\n * Returns the initialization function and its arguments.\n * The constructor takes the public key coordinates as u8 arrays.\n */\n async getInitializationFunctionAndArgs(): Promise<{\n constructorName: string;\n constructorArgs: unknown[];\n }> {\n return {\n constructorName: 'constructor',\n constructorArgs: [\n Array.from(this.publicKeyX), // Convert Buffer to number array for Noir\n Array.from(this.publicKeyY),\n ],\n };\n }\n\n /**\n * Returns the account for creating tx requests.\n */\n getAccount(address: CompleteAddress): Account {\n const authWitnessProvider = this.getAuthWitnessProvider(address);\n return new BaseAccount(\n new DefaultAccountEntrypoint(address.address, authWitnessProvider),\n authWitnessProvider,\n address\n );\n }\n\n /**\n * Returns the auth witness provider.\n * This delegates to MetaMask for signing.\n */\n getAuthWitnessProvider(_address: CompleteAddress): AuthWitnessProvider {\n return this.authWitnessProvider;\n }\n}\n","/**\n * ExternalSignerConnector - Connector for External Signer wallets\n *\n * Uses app-managed PXE with external signing (MetaMask, WalletConnect, etc.)\n * Self-contained: creates and manages its own signer internally.\n */\n\nimport type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport type { SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';\nimport type { Wallet } from '@aztec/aztec.js/wallet';\nimport type { PXE } from '@aztec/pxe/server';\nimport { SharedPXEService } from '../services/aztec/pxe';\nimport { getEVMWalletService } from '../services/evm';\nimport { createEVMSigner } from '../signers';\nimport { getNetworkStore } from '../store/network';\nimport { getWalletStore } from '../store/wallet';\nimport { WalletType, ExternalSignerType } from '../types/aztec';\nimport type {\n ExternalSignerWalletConnector,\n ConnectorStatus,\n} from '../../types/walletConnector';\nimport type { ExternalSigner } from '../signers/types';\n\ninterface ExternalSignerConnectorConfig {\n id?: string;\n label?: string;\n signerType: ExternalSignerType;\n rdns?: string;\n}\n\n/**\n * Connector for External Signer wallets (MetaMask, WalletConnect, etc.)\n *\n * This connector uses app-managed PXE with external signing.\n * The external wallet only signs transactions - all Aztec logic runs in the app.\n *\n * Creates its own signer internally using EVMWalletService singleton.\n */\nexport class ExternalSignerConnector implements ExternalSignerWalletConnector {\n readonly id: string;\n readonly label: string;\n readonly type = WalletType.EXTERNAL_SIGNER;\n readonly signerType: ExternalSignerType;\n readonly rdns?: string;\n\n // Signer created lazily on first access\n private _signer: ExternalSigner | null = null;\n\n constructor(config: ExternalSignerConnectorConfig) {\n this.signerType = config.signerType;\n this.id = config.id ?? `external-${config.signerType}`;\n this.label = config.label ?? this.getDefaultLabel(config.signerType);\n this.rdns = config.rdns;\n }\n\n private getDefaultLabel(signerType: ExternalSignerType): string {\n switch (signerType) {\n case ExternalSignerType.EVM_WALLET:\n return 'EVM Wallet';\n default:\n return 'External Wallet';\n }\n }\n\n /**\n * Get or create the signer for this connector.\n * Creates lazily using the EVMWalletService singleton.\n */\n private getSigner(): ExternalSigner {\n if (!this._signer) {\n if (this.signerType !== ExternalSignerType.EVM_WALLET) {\n throw new Error(`Unknown signer type: ${this.signerType}`);\n }\n const evmService = getEVMWalletService();\n this._signer = createEVMSigner(evmService, this.rdns);\n }\n return this._signer;\n }\n\n getStatus(): ConnectorStatus {\n const state = getWalletStore();\n const isExternalSigner = state.walletType === WalletType.EXTERNAL_SIGNER;\n const isThisConnectorConnected =\n isExternalSigner && state.connectedRdns === this.rdns;\n\n const status =\n isExternalSigner && !isThisConnectorConnected\n ? 'disconnected'\n : isExternalSigner\n ? state.status\n : 'disconnected';\n\n const signer = this.getSigner();\n\n return {\n isInstalled: signer.isAvailable(),\n status,\n error: isThisConnectorConnected ? state.error : null,\n };\n }\n\n getAccount(): AccountWithSecretKey | null {\n const state = getWalletStore();\n // Only return account if this connector's rdns matches the connected one\n if (\n state.walletType === WalletType.EXTERNAL_SIGNER &&\n state.connectedRdns === this.rdns\n ) {\n return state.account;\n }\n return null;\n }\n\n async connect(): Promise<void> {\n const signer = this.getSigner();\n await getWalletStore().connectExternalSigner(signer, this.id);\n }\n\n async disconnect(): Promise<void> {\n const signer = this._signer;\n await getWalletStore().disconnect(() => {\n if (signer) {\n signer.disconnect();\n }\n this._signer = null;\n });\n }\n\n getPXE(): PXE | null {\n const config = getNetworkStore().currentConfig;\n const instance = SharedPXEService.getExistingInstance(config.name);\n return instance?.pxe ?? null;\n }\n\n getWallet(): Wallet | null {\n const config = getNetworkStore().currentConfig;\n const instance = SharedPXEService.getExistingInstance(config.name);\n return instance?.wallet ?? null;\n }\n\n async getSponsoredFeePaymentMethod(): Promise<SponsoredFeePaymentMethod> {\n const config = getNetworkStore().currentConfig;\n const instance = SharedPXEService.getExistingInstance(config.name);\n if (!instance) {\n throw new Error('PXE not initialized');\n }\n return instance.getSponsoredFeePaymentMethod();\n }\n}\n","/**\n * Base error class for wallet service operations\n */\nexport class WalletServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly cause?: unknown\n ) {\n super(message);\n this.name = 'WalletServiceError';\n }\n}\n\n/**\n * Error thrown when PXE initialization fails\n */\nexport class PXEInitError extends WalletServiceError {\n constructor(message: string, cause?: unknown) {\n super(message, 'PXE_INIT_FAILED', cause);\n this.name = 'PXEInitError';\n }\n}\n\n/**\n * Error thrown when account creation fails\n */\nexport class AccountCreationError extends WalletServiceError {\n constructor(message: string, cause?: unknown) {\n super(message, 'ACCOUNT_CREATION_FAILED', cause);\n this.name = 'AccountCreationError';\n }\n}\n\n/**\n * Error thrown when account deployment fails\n */\nexport class AccountDeploymentError extends WalletServiceError {\n constructor(message: string, cause?: unknown) {\n super(message, 'ACCOUNT_DEPLOYMENT_FAILED', cause);\n this.name = 'AccountDeploymentError';\n }\n}\n\n/**\n * Error thrown when loading existing account fails\n */\nexport class AccountLoadError extends WalletServiceError {\n constructor(message: string, cause?: unknown) {\n super(message, 'ACCOUNT_LOAD_FAILED', cause);\n this.name = 'AccountLoadError';\n }\n}\n\n/**\n * Error thrown when external signer connection fails\n */\nexport class SignerConnectionError extends WalletServiceError {\n constructor(message: string, cause?: unknown) {\n super(message, 'SIGNER_CONNECTION_FAILED', cause);\n this.name = 'SignerConnectionError';\n }\n}\n\n/**\n * Error thrown when no saved account is found\n */\nexport class NoSavedAccountError extends WalletServiceError {\n constructor() {\n super('No saved account found', 'NO_SAVED_ACCOUNT');\n this.name = 'NoSavedAccountError';\n }\n}\n","import { AztecAddress } from '@aztec/aztec.js/addresses';\nimport type { AccountManager } from '@aztec/aztec.js/wallet';\nimport { TxStatus } from '@aztec/stdlib/tx';\nimport { AccountDeploymentError } from './errors';\nimport type { SharedPXEInstance } from '../aztec/pxe';\n\nexport interface DeployAccountOptions {\n /** Timeout in seconds for deployment transaction */\n timeout?: number;\n /** Skip class publication during deployment */\n skipClassPublication?: boolean;\n /** Skip instance publication during deployment */\n skipInstancePublication?: boolean;\n}\n\nexport interface DeployAccountResult {\n /** Whether the account was deployed (false if already initialized) */\n deployed: boolean;\n /** Account address */\n address: AztecAddress;\n}\n\nconst DEFAULT_OPTIONS: Required<DeployAccountOptions> = {\n timeout: 120,\n skipClassPublication: false,\n skipInstancePublication: false,\n};\n\n/**\n * Deploy an account contract if not already initialized.\n * Uses sponsored fee payment method for gas-free deployment.\n *\n * @param accountManager - The AccountManager instance\n * @param pxeInstance - SharedPXE instance with wallet and fee methods\n * @param options - Deployment options\n * @returns Deployment result with status and address\n * @throws AccountDeploymentError if deployment fails\n */\nexport async function deployAccountIfNotExists(\n accountManager: AccountManager,\n pxeInstance: SharedPXEInstance,\n options: DeployAccountOptions = {}\n): Promise<DeployAccountResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const accountAddress = accountManager.address;\n\n try {\n console.log('[deploy-account] Checking contract metadata...');\n const metadata =\n await pxeInstance.wallet.getContractMetadata(accountAddress);\n console.log(\n '[deploy-account] Contract initialized:',\n metadata.isContractInitialized\n );\n\n if (metadata.isContractInitialized) {\n return { deployed: false, address: accountAddress };\n }\n\n console.log('[deploy-account] Getting deploy method...');\n const deployMethod = await accountManager.getDeployMethod();\n console.log('[deploy-account] Getting sponsored fee payment method...');\n const paymentMethod = await pxeInstance.getSponsoredFeePaymentMethod();\n console.log('[deploy-account] Sending deploy tx...');\n\n await deployMethod.send({\n from: AztecAddress.ZERO,\n fee: { paymentMethod },\n skipClassPublication: opts.skipClassPublication,\n skipInstancePublication: opts.skipInstancePublication,\n wait: { timeout: opts.timeout, waitForStatus: TxStatus.PROPOSED },\n });\n\n console.log('[deploy-account] Deploy tx confirmed');\n return { deployed: true, address: accountAddress };\n } catch (cause) {\n console.error(\n '[deploy-account] Deployment failed:',\n cause instanceof Error ? cause.message : cause\n );\n throw new AccountDeploymentError(\n `Failed to deploy account at ${accountAddress.toString()}`,\n cause\n );\n }\n}\n","import { EcdsaRAccountContract } from '@aztec/accounts/ecdsa/lazy';\nimport type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport { Fr } from '@aztec/aztec.js/fields';\nimport { AccountManager } from '@aztec/aztec.js/wallet';\nimport { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';\nimport {\n getConfiguredAccountCredentials,\n hasConfiguredCredentials,\n} from '../../../utils/accountCredentials';\nimport { SharedPXEService, type SharedPXEInstance } from '../aztec/pxe';\nimport {\n deployAccountIfNotExists,\n type DeployAccountResult,\n} from './deployAccount';\nimport {\n AccountCreationError,\n AccountLoadError,\n NoSavedAccountError,\n PXEInitError,\n} from './errors';\nimport type { NetworkConfig } from '../../../config/networks/types';\nimport type { AccountCredentials } from '../../types/aztec';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CreateEmbeddedAccountResult {\n account: AccountWithSecretKey;\n pxeInstance: SharedPXEInstance;\n deployment: DeployAccountResult;\n credentials: StoredAccountData;\n}\n\nexport interface LoadEmbeddedAccountResult {\n account: AccountWithSecretKey;\n pxeInstance: SharedPXEInstance;\n}\n\nexport interface StoredAccountData {\n address: string;\n signingKey: string;\n secretKey: string;\n salt: string;\n}\n\n// ============================================================================\n// Storage helpers\n// ============================================================================\n\nconst STORAGE_KEY = 'aztec-embedded-account';\n\nexport const getSavedAccount = (): StoredAccountData | null => {\n try {\n const data = localStorage.getItem(STORAGE_KEY);\n return data ? JSON.parse(data) : null;\n } catch {\n return null;\n }\n};\n\nexport const saveAccount = (data: StoredAccountData): void => {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n } catch {\n // Ignore storage errors\n }\n};\n\nexport const clearSavedAccount = (): void => {\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch {\n // Ignore\n }\n};\n\nexport const hasSavedEmbeddedAccount = (): boolean => {\n if (hasConfiguredCredentials()) {\n return true;\n }\n return getSavedAccount() !== null;\n};\n\n// ============================================================================\n// Account creation service\n// ============================================================================\n\n/**\n * Create a new embedded wallet account.\n * Generates fresh credentials, registers the account with PXE, and deploys if needed.\n *\n * @param networkConfig - Network configuration with node URL\n * @returns Created account, PXE instance, deployment status, and credentials\n * @throws PXEInitError if PXE initialization fails\n * @throws AccountCreationError if account creation fails\n */\nexport async function createEmbeddedAccount(\n networkConfig: NetworkConfig\n): Promise<CreateEmbeddedAccountResult> {\n let pxeInstance: SharedPXEInstance;\n\n console.log('[embedded-account] Starting account creation...');\n\n try {\n console.log('[embedded-account] Initializing PXE...');\n pxeInstance = await SharedPXEService.getInstance(\n networkConfig.nodeUrl,\n networkConfig.name\n );\n console.log('[embedded-account] PXE initialized');\n } catch (cause) {\n console.error('[embedded-account] PXE init failed:', cause);\n throw new PXEInitError(\n `Failed to initialize PXE for network ${networkConfig.name}`,\n cause\n );\n }\n\n try {\n const wallet = pxeInstance.wallet;\n\n // Generate fresh credentials\n console.log('[embedded-account] Generating credentials...');\n const salt = Fr.random();\n const secretKey = await poseidon2Hash([Fr.random()]);\n const signingKey = Buffer.from(secretKey.toBuffer().subarray(0, 32));\n console.log('[embedded-account] Credentials generated');\n\n // Create account manager\n console.log('[embedded-account] Creating AccountManager...');\n const accountContract = new EcdsaRAccountContract(signingKey);\n const accountManager = await AccountManager.create(\n wallet,\n secretKey,\n accountContract,\n salt\n );\n console.log(\n '[embedded-account] AccountManager created, address:',\n accountManager.address.toString()\n );\n\n // Get account and register with PXE\n console.log('[embedded-account] Getting account...');\n const account = await accountManager.getAccount();\n console.log('[embedded-account] Getting instance and artifact...');\n const instance = accountManager.getInstance();\n const artifact = await accountManager\n .getAccountContract()\n .getContractArtifact();\n console.log('[embedded-account] Registering contract with PXE...');\n await wallet.registerContract(\n instance,\n artifact,\n accountManager.getSecretKey()\n );\n wallet.addAccount(account);\n console.log('[embedded-account] Account registered with PXE');\n\n // Deploy if needed (don't throw on deployment failure)\n // Use a hard timeout because send() simulation can hang indefinitely\n // and the SDK's wait.timeout only applies after the tx is actually sent.\n const DEPLOY_HARD_TIMEOUT_MS = 90_000;\n let deployment: DeployAccountResult;\n try {\n console.log('[embedded-account] Starting account deployment...');\n deployment = await Promise.race([\n deployAccountIfNotExists(accountManager, pxeInstance),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error('Account deployment timed out')),\n DEPLOY_HARD_TIMEOUT_MS\n )\n ),\n ]);\n console.log(\n '[embedded-account] Deployment result:',\n deployment.deployed ? 'deployed' : 'already initialized'\n );\n } catch (err) {\n console.warn(\n '[embedded-account] Deployment failed or timed out, continuing without deployment:',\n err instanceof Error ? err.message : err\n );\n deployment = { deployed: false, address: accountManager.address };\n }\n\n // Prepare credentials for storage\n const credentials: StoredAccountData = {\n address: accountManager.address.toString(),\n signingKey: signingKey.toString('hex'),\n secretKey: secretKey.toString(),\n salt: salt.toString(),\n };\n\n console.log('[embedded-account] Account creation complete');\n return { account, pxeInstance, deployment, credentials };\n } catch (cause) {\n console.error(\n '[embedded-account] Account creation failed:',\n cause instanceof Error ? cause.message : cause\n );\n if (cause instanceof PXEInitError) throw cause;\n throw new AccountCreationError('Failed to create embedded account', cause);\n }\n}\n\n// ============================================================================\n// Account loading service\n// ============================================================================\n\n/**\n * Load an existing embedded account from saved credentials or environment config.\n *\n * @param networkConfig - Network configuration with node URL\n * @returns Loaded account and PXE instance\n * @throws PXEInitError if PXE initialization fails\n * @throws NoSavedAccountError if no saved account exists\n * @throws AccountLoadError if loading fails\n */\nexport async function loadExistingEmbeddedAccount(\n networkConfig: NetworkConfig\n): Promise<LoadEmbeddedAccountResult> {\n let pxeInstance: SharedPXEInstance;\n\n try {\n pxeInstance = await SharedPXEService.getInstance(\n networkConfig.nodeUrl,\n networkConfig.name\n );\n } catch (cause) {\n throw new PXEInitError(\n `Failed to initialize PXE for network ${networkConfig.name}`,\n cause\n );\n }\n\n // Try environment credentials first\n const envCredentials = await getConfiguredAccountCredentials();\n if (envCredentials) {\n try {\n const account = await connectWithCredentials(envCredentials, pxeInstance);\n return { account, pxeInstance };\n } catch (cause) {\n throw new AccountLoadError(\n 'Failed to load account from environment credentials',\n cause\n );\n }\n }\n\n // Try saved credentials\n const saved = getSavedAccount();\n if (saved) {\n try {\n const credentials: AccountCredentials = {\n secretKey: Fr.fromString(saved.secretKey),\n signingKey: Buffer.from(saved.signingKey, 'hex'),\n salt: Fr.fromString(saved.salt),\n };\n const account = await connectWithCredentials(credentials, pxeInstance);\n return { account, pxeInstance };\n } catch (cause) {\n throw new AccountLoadError(\n 'Failed to load account from saved credentials',\n cause\n );\n }\n }\n\n throw new NoSavedAccountError();\n}\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\nasync function connectWithCredentials(\n credentials: AccountCredentials,\n pxeInstance: SharedPXEInstance\n): Promise<AccountWithSecretKey> {\n const wallet = pxeInstance.wallet;\n const accountContract = new EcdsaRAccountContract(credentials.signingKey);\n const accountManager = await AccountManager.create(\n wallet,\n credentials.secretKey,\n accountContract,\n credentials.salt\n );\n\n const account = await accountManager.getAccount();\n const instance = accountManager.getInstance();\n const artifact = await accountManager\n .getAccountContract()\n .getContractArtifact();\n await wallet.registerContract(\n instance,\n artifact,\n accountManager.getSecretKey()\n );\n wallet.addAccount(account);\n\n // Deploy account if not yet initialized (e.g., sandbox was restarted)\n // Hard timeout to prevent simulation from hanging indefinitely\n const DEPLOY_HARD_TIMEOUT_MS = 90_000;\n try {\n await Promise.race([\n deployAccountIfNotExists(accountManager, pxeInstance),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error('Account deployment timed out')),\n DEPLOY_HARD_TIMEOUT_MS\n )\n ),\n ]);\n } catch (err) {\n console.warn(\n '[embedded-account] Deployment failed or timed out:',\n err instanceof Error ? err.message : err\n );\n // Non-fatal: account may still work if already deployed\n }\n\n return account;\n}\n","import { Fr } from '@aztec/aztec.js/fields';\nimport type { AccountCredentials } from '../types/aztec';\n\n/**\n * Normalize hex string by removing 0x prefix if present\n */\nconst normalizeHex = (value: string): string => {\n return value.startsWith('0x') ? value.slice(2) : value;\n};\n\n/**\n * Create account credentials from an explicit secret key.\n * SigningKey is derived as the first 32 bytes of secretKey.\n */\nconst createFromSecretKey = (\n secretKeyHex: string,\n salt: string\n): AccountCredentials => {\n const secretKey = Fr.fromString(secretKeyHex);\n const signingKeyBuffer = Buffer.from(\n normalizeHex(secretKeyHex).slice(0, 64),\n 'hex'\n );\n\n return {\n secretKey,\n signingKey: signingKeyBuffer,\n salt: Fr.fromString(salt),\n };\n};\n\n/**\n * Check if account credentials are configured in environment variables.\n * Stub - always returns false in SDK context.\n */\nexport const hasConfiguredCredentials = (): boolean => {\n return false;\n};\n\n/**\n * Get account credentials from environment variables.\n * Stub - always returns null in SDK context.\n */\nexport const getConfiguredAccountCredentials =\n async (): Promise<AccountCredentials | null> => {\n return null;\n };\n\n/**\n * Create account credentials from a secret key and salt.\n * Utility function for SDK consumers.\n */\nexport const createAccountCredentials = (\n secretKeyHex: string,\n salt: string | Fr\n): AccountCredentials => {\n return createFromSecretKey(\n secretKeyHex,\n typeof salt === 'string' ? salt : salt.toString()\n );\n};\n","import type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport { Fr } from '@aztec/aztec.js/fields';\nimport { AccountManager } from '@aztec/aztec.js/wallet';\nimport { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';\nimport { EcdsaKEthSignerAccountContract } from '../../signers/EcdsaKEthSignerAccountContract';\nimport { SharedPXEService, type SharedPXEInstance } from '../aztec/pxe';\nimport {\n deployAccountIfNotExists,\n type DeployAccountResult,\n} from './deployAccount';\nimport {\n AccountCreationError,\n PXEInitError,\n SignerConnectionError,\n} from './errors';\nimport type { NetworkConfig } from '../../../config/networks/types';\nimport type { ExternalSigner } from '../../signers/types';\nimport type { ExternalSignerType } from '../../types/aztec';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CreateExternalSignerAccountResult {\n account: AccountWithSecretKey;\n pxeInstance: SharedPXEInstance;\n deployment: DeployAccountResult;\n signerType: ExternalSignerType;\n rdns: string | null;\n}\n\n// ============================================================================\n// Account creation service\n// ============================================================================\n\n/**\n * Create an account using an external signer (e.g., MetaMask).\n * Connects to the signer, derives keys, and deploys the account if needed.\n *\n * @param signer - External signer instance\n * @param networkConfig - Network configuration with node URL\n * @returns Created account, PXE instance, deployment status, and signer info\n * @throws SignerConnectionError if signer connection fails\n * @throws PXEInitError if PXE initialization fails\n * @throws AccountCreationError if account creation fails\n */\nexport async function createExternalSignerAccount(\n signer: ExternalSigner,\n networkConfig: NetworkConfig\n): Promise<CreateExternalSignerAccountResult> {\n // Connect signer if not connected\n if (!signer.isConnected()) {\n try {\n await signer.connect();\n } catch (cause) {\n throw new SignerConnectionError(\n `Failed to connect to ${signer.label} signer`,\n cause\n );\n }\n }\n\n // Initialize PXE\n let pxeInstance: SharedPXEInstance;\n try {\n pxeInstance = await SharedPXEService.getInstance(\n networkConfig.nodeUrl,\n networkConfig.name\n );\n } catch (cause) {\n throw new PXEInitError(\n `Failed to initialize PXE for network ${networkConfig.name}`,\n cause\n );\n }\n\n try {\n // Get public key from signer\n const { x, y } = await signer.getPublicKey();\n\n // Create auth witness provider for transaction signing\n const authWitnessProvider = signer.createAuthWitnessProvider(\n {} as Parameters<typeof signer.createAuthWitnessProvider>[0]\n );\n\n // Create account contract with signer's public key\n const accountContract = new EcdsaKEthSignerAccountContract(\n x,\n y,\n authWitnessProvider\n );\n\n // Derive secret key and salt from signer\n const secretKeyBuffer = await signer.deriveSecretKey();\n const secretKey = await poseidon2Hash([Fr.fromBuffer(secretKeyBuffer)]);\n const salt = Fr.fromBuffer(signer.deriveSalt());\n\n // Create account manager\n const wallet = pxeInstance.wallet;\n const accountManager = await AccountManager.create(\n wallet,\n secretKey,\n accountContract,\n salt\n );\n\n // Get account and register with PXE\n const account = await accountManager.getAccount();\n const instance = accountManager.getInstance();\n const artifact = await accountManager\n .getAccountContract()\n .getContractArtifact();\n await wallet.registerContract(\n instance,\n artifact,\n accountManager.getSecretKey()\n );\n wallet.addAccount(account);\n\n // Deploy if needed (don't throw on deployment failure)\n let deployment: DeployAccountResult;\n try {\n deployment = await deployAccountIfNotExists(accountManager, pxeInstance);\n } catch {\n // Account created but deployment failed - still usable\n deployment = { deployed: false, address: accountManager.address };\n }\n\n return {\n account,\n pxeInstance,\n deployment,\n signerType: signer.type,\n rdns: signer.rdns ?? null,\n };\n } catch (cause) {\n if (\n cause instanceof PXEInitError ||\n cause instanceof SignerConnectionError\n ) {\n throw cause;\n }\n throw new AccountCreationError(\n `Failed to create account with ${signer.label} signer`,\n cause\n );\n }\n}\n","import type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport { EMBEDDED_CONNECTOR_ID } from '../../../connectors';\nimport {\n createEmbeddedAccount,\n loadExistingEmbeddedAccount,\n saveAccount,\n hasSavedEmbeddedAccount,\n clearSavedAccount,\n NoSavedAccountError,\n} from '../../../services/wallet';\nimport { WalletType } from '../../../types/aztec';\nimport { getNetworkStore } from '../../network';\nimport type { WalletConnectorId } from '../../../../types/walletConnector';\nimport type { SetState, GetState } from '../types';\n\nexport const createEmbeddedActions = (set: SetState, get: GetState) => ({\n connectEmbedded: async (\n connectorId: WalletConnectorId = EMBEDDED_CONNECTOR_ID\n ): Promise<AccountWithSecretKey> => {\n const connectWith = get()._connectWith;\n return connectWith(connectorId, async () => {\n set({\n status: 'connecting',\n error: null,\n pxeError: null,\n });\n\n const config = getNetworkStore().currentConfig;\n\n const result = await createEmbeddedAccount(config);\n\n // Save credentials\n saveAccount(result.credentials);\n\n if (result.deployment.deployed) {\n set({ status: 'deploying' });\n }\n\n set({\n account: result.account,\n walletType: WalletType.EMBEDDED,\n pxeStatus: 'ready',\n });\n\n return result.account;\n });\n },\n\n connectExistingEmbedded: async (\n connectorId: WalletConnectorId = EMBEDDED_CONNECTOR_ID\n ): Promise<AccountWithSecretKey | null> => {\n const connectWith = get()._connectWith;\n return connectWith(connectorId, async () => {\n set({\n status: 'connecting',\n error: null,\n pxeError: null,\n });\n\n const config = getNetworkStore().currentConfig;\n\n try {\n const result = await loadExistingEmbeddedAccount(config);\n\n set({\n account: result.account,\n walletType: WalletType.EMBEDDED,\n status: 'connected',\n pxeStatus: 'ready',\n });\n\n return result.account;\n } catch (error) {\n if (error instanceof NoSavedAccountError) {\n set({\n status: 'disconnected',\n pxeStatus: 'idle',\n pxeError: null,\n });\n return null;\n }\n throw error;\n }\n });\n },\n\n hasSavedEmbeddedAccount,\n});\n\nexport { clearSavedAccount };\n","import type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport { createExternalSignerAccount } from '../../../services/wallet';\nimport { WalletType } from '../../../types/aztec';\nimport { getNetworkStore } from '../../network';\nimport type { WalletConnectorId } from '../../../../types/walletConnector';\nimport type { ExternalSigner } from '../../../signers/types';\nimport type { SetState, GetState } from '../types';\n\nexport const createExternalSignerActions = (set: SetState, get: GetState) => ({\n connectExternalSigner: async (\n signer: ExternalSigner,\n connectorId?: WalletConnectorId\n ): Promise<AccountWithSecretKey> => {\n const connectWith = get()._connectWith;\n return connectWith(connectorId ?? signer.rdns ?? 'external', async () => {\n set({\n status: 'connecting',\n error: null,\n pxeError: null,\n });\n\n const config = getNetworkStore().currentConfig;\n\n const result = await createExternalSignerAccount(signer, config);\n\n if (result.deployment.deployed) {\n set({ status: 'deploying' });\n }\n\n set({\n account: result.account,\n walletType: WalletType.EXTERNAL_SIGNER,\n signerType: result.signerType,\n connectedRdns: result.rdns,\n pxeStatus: 'ready',\n });\n\n return result.account;\n });\n },\n});\n","import type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport type { AztecNetwork } from '../../../config/networks/constants';\nimport type { IBrowserWalletAdapter } from '../../../types/browserWallet';\nimport type {\n ConnectionStatus,\n WalletConnector,\n WalletConnectorId,\n} from '../../../types/walletConnector';\nimport type { ExternalSigner } from '../../signers/types';\nimport type { ExternalSignerType, WalletType } from '../../types/aztec';\n\nexport type PXEStatus = 'idle' | 'initializing' | 'ready' | 'error';\nexport type NetworkStatus = 'idle' | 'checking' | 'available' | 'error';\n\n/**\n * Valid PXE state transitions:\n * - idle → initializing (starting PXE init)\n * - initializing → ready (PXE init success)\n * - initializing → error (PXE init failed)\n * - ready → idle (disconnect/reset)\n * - error → idle (disconnect/reset)\n * - error → initializing (retry)\n */\nexport const VALID_PXE_TRANSITIONS: Record<PXEStatus, PXEStatus[]> = {\n idle: ['initializing'],\n initializing: ['ready', 'error'],\n ready: ['idle'],\n error: ['idle', 'initializing'],\n};\n\nexport const isValidPXETransition = (\n from: PXEStatus,\n to: PXEStatus\n): boolean => {\n if (from === to) return true;\n return VALID_PXE_TRANSITIONS[from]?.includes(to) ?? false;\n};\n\nexport type WalletState = {\n // Core state (always relevant)\n account: AccountWithSecretKey | null;\n walletType: WalletType | null;\n status: ConnectionStatus;\n error: string | null;\n\n // Network availability check\n networkStatus: NetworkStatus;\n networkError: string | null;\n\n // PXE initialization flags (services stay in singleton)\n pxeStatus: PXEStatus;\n pxeError: string | null;\n\n // ExternalSigner-specific (only read when walletType === EXTERNAL_SIGNER)\n signerType: ExternalSignerType | null;\n connectedRdns: string | null;\n\n // BrowserWallet-specific (only read when walletType === BROWSER_WALLET)\n caipAccount: string | null;\n caipAccounts: string[];\n supportedChains: string[];\n isInstalled: boolean;\n\n // Connector management\n connectors: WalletConnector[];\n activeConnectorId: WalletConnectorId | null;\n connectingConnectorId: WalletConnectorId | null;\n};\n\nexport type WalletActions = {\n _connectWith: <T>(\n connectorId: WalletConnectorId,\n run: (connector: WalletConnector) => Promise<T>\n ) => Promise<T>;\n _disconnectWith: (cleanup?: () => Promise<void> | void) => Promise<void>;\n // Connector management\n setConnectors: (connectors: WalletConnector[]) => void;\n connect: (connectorId: WalletConnectorId) => Promise<void>;\n\n // Embedded\n connectEmbedded: (\n connectorId?: WalletConnectorId\n ) => Promise<AccountWithSecretKey>;\n connectExistingEmbedded: (\n connectorId?: WalletConnectorId\n ) => Promise<AccountWithSecretKey | null>;\n hasSavedEmbeddedAccount: () => boolean;\n\n // External Signer\n connectExternalSigner: (\n signer: ExternalSigner,\n connectorId?: WalletConnectorId\n ) => Promise<AccountWithSecretKey>;\n\n // Browser Wallet\n connectBrowserWallet: (\n adapter: IBrowserWalletAdapter,\n networkName: AztecNetwork,\n connectorId: WalletConnectorId\n ) => Promise<void>;\n setBrowserWalletState: (\n state: Partial<\n Pick<\n WalletState,\n | 'account'\n | 'caipAccount'\n | 'caipAccounts'\n | 'supportedChains'\n | 'isInstalled'\n >\n >\n ) => void;\n\n // Shared\n disconnect: (cleanup?: () => Promise<void> | void) => Promise<void>;\n setError: (error: string | null) => void;\n setNetworkStatus: (status: NetworkStatus, error?: string | null) => void;\n setPXEStatus: (status: PXEStatus, error?: string | null) => void;\n checkNetwork: () => Promise<void>;\n reset: () => void;\n syncFromStorage: () => Promise<void>;\n};\n\nexport type WalletStore = WalletState & WalletActions;\n\n// Helper types for action creators\nexport type SetState = (\n partial: Partial<WalletStore> | ((state: WalletStore) => Partial<WalletStore>)\n) => void;\n\nexport type GetState = () => WalletStore;\n","/**\n * BrowserWalletConnector - Connector for Browser Wallet extensions\n *\n * Uses external PXE (browser extension manages everything).\n * Supports any wallet that implements IBrowserWalletAdapter.\n * Self-contained: handles adapter initialization and event listeners internally.\n */\n\nimport type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport { getNetworkStore } from '../store/network';\nimport { getWalletStore } from '../store/wallet';\nimport { WalletType } from '../types/aztec';\nimport type {\n IBrowserWalletAdapter,\n BrowserWalletAdapterFactory,\n BrowserWalletOperation,\n BrowserWalletOperationResult,\n SendTransactionOp,\n ContractCall,\n AuthwitAction,\n ConnectorTransactionAction,\n} from '../../types/browserWallet';\nimport type {\n BrowserWalletConnector as IBrowserWalletConnector,\n ConnectorStatus,\n ConnectorTransactionRequest,\n ConnectorTransactionResult,\n} from '../../types/walletConnector';\nimport type { CaipAccount } from '@azguardwallet/types';\n\nconst toAdapterAction = (\n action: ConnectorTransactionAction\n): ContractCall | AuthwitAction => {\n if (\n action.kind === 'add_private_authwit' ||\n action.kind === 'add_public_authwit'\n ) {\n return action\n }\n return {\n kind: 'call',\n contract: action.contract,\n method: action.method,\n args: action.args,\n }\n};\n\ninterface BrowserWalletConnectorConfig {\n id: string;\n label: string;\n adapterFactory: BrowserWalletAdapterFactory;\n}\n\n/**\n * Connector for Browser Wallet extensions (Azguard, Obsidian, etc.)\n *\n * These wallets have their own PXE running in the extension.\n * We communicate via the adapter interface.\n * Initializes eagerly on construction for immediate \"installed\" status.\n */\nexport class BrowserWalletConnector implements IBrowserWalletConnector {\n readonly id: string;\n readonly label: string;\n readonly type = WalletType.BROWSER_WALLET;\n readonly adapterFactory: BrowserWalletAdapterFactory;\n\n private _adapter: IBrowserWalletAdapter | null = null;\n private _initPromise: Promise<void> | null = null;\n // Guards async account hydration to avoid stale updates; not related to crypto tokens\n private latestAccountChangeMarker: symbol | null = null;\n\n constructor(config: BrowserWalletConnectorConfig) {\n this.id = config.id;\n this.label = config.label;\n this.adapterFactory = config.adapterFactory;\n\n // Start initialization immediately (eager init for \"installed\" badge)\n void this.ensureInitialized().catch((error) => {\n // Swallow to avoid unhandled rejection; installation status will remain false\n console.warn(\n `[BrowserWalletConnector:${this.id}] initialize failed`,\n error\n );\n });\n }\n\n /**\n * Get or create the adapter instance.\n * Async to support dynamic imports for the adapter factory.\n */\n async getAdapter(): Promise<IBrowserWalletAdapter> {\n if (!this._adapter) {\n this._adapter = await this.adapterFactory();\n }\n return this._adapter;\n }\n\n /**\n * Initialize the adapter and set up event listeners.\n * Called automatically in constructor (eager init).\n */\n private async initialize(): Promise<void> {\n const adapter = await this.getAdapter();\n\n await adapter.initialize();\n const state = adapter.getState();\n\n getWalletStore().setBrowserWalletState({\n isInstalled: state.isInstalled,\n supportedChains: state.supportedChains,\n });\n\n // Set up event listeners\n adapter.onAccountsChanged(async (accounts) => {\n const updateMarker = Symbol('accountsChanged');\n this.latestAccountChangeMarker = updateMarker;\n\n const selectedAccount = accounts.length > 0 ? accounts[0] : null;\n const store = getWalletStore();\n\n store.setBrowserWalletState({\n caipAccounts: accounts,\n caipAccount: selectedAccount,\n });\n\n if (selectedAccount) {\n try {\n const accountWallet = await adapter.toAccountWallet(selectedAccount);\n if (this.latestAccountChangeMarker !== updateMarker) {\n return;\n }\n getWalletStore().setBrowserWalletState({ account: accountWallet });\n } catch {\n if (this.latestAccountChangeMarker !== updateMarker) {\n return;\n }\n getWalletStore().setBrowserWalletState({ account: null });\n }\n } else {\n getWalletStore().setBrowserWalletState({ account: null });\n }\n });\n\n adapter.onDisconnected(async () => {\n await getWalletStore().disconnect();\n });\n }\n\n /**\n * Ensure initialization is in-flight or completed.\n * Safe to call multiple times; reinitializes after destroy().\n */\n private ensureInitialized(): Promise<void> {\n if (!this._initPromise) {\n this._initPromise = this.initialize().catch((error) => {\n // Reset so a later retry can occur\n this._initPromise = null;\n throw error;\n });\n }\n return this._initPromise;\n }\n\n /**\n * Clean up adapter resources.\n */\n destroy(): void {\n if (this._adapter) {\n this._adapter.destroy();\n this._adapter = null;\n this._initPromise = null;\n }\n }\n\n getStatus(): ConnectorStatus {\n const state = getWalletStore();\n const isBrowserWallet = state.walletType === WalletType.BROWSER_WALLET;\n\n // Check installation from adapter if not yet connected\n const adapter = this._adapter;\n const isInstalled = isBrowserWallet\n ? state.isInstalled\n : (adapter?.getState().isInstalled ?? false);\n\n return {\n isInstalled,\n status: isBrowserWallet ? state.status : 'disconnected',\n error: isBrowserWallet ? state.error : null,\n };\n }\n\n getAccount(): AccountWithSecretKey | null {\n const state = getWalletStore();\n if (state.walletType === WalletType.BROWSER_WALLET) {\n return state.account;\n }\n return null;\n }\n\n getCaipAccount(): CaipAccount | null {\n const state = getWalletStore();\n if (state.walletType === WalletType.BROWSER_WALLET) {\n return state.caipAccount as CaipAccount | null;\n }\n return null;\n }\n\n async connect(): Promise<void> {\n await this.ensureInitialized();\n\n const adapter = await this.getAdapter();\n const config = getNetworkStore().currentConfig;\n await getWalletStore().connectBrowserWallet(adapter, config.name, this.id);\n }\n\n async disconnect(): Promise<void> {\n const adapter = this._adapter;\n await getWalletStore().disconnect(async () => {\n if (adapter) {\n await adapter.disconnect();\n adapter.destroy();\n }\n this._adapter = null;\n this._initPromise = null;\n });\n }\n\n async sendTransaction(\n request: ConnectorTransactionRequest\n ): Promise<ConnectorTransactionResult> {\n const state = getWalletStore();\n const account = state.caipAccount;\n const chain = state.supportedChains[0] ?? '';\n\n if (!account) {\n throw new Error('No account selected');\n }\n\n const operation: SendTransactionOp = {\n kind: 'send_transaction',\n account,\n chain,\n calls: request.actions.map(toAdapterAction),\n };\n\n const result = await this.executeOperation(operation);\n\n if (result.status !== 'ok') {\n const message =\n 'error' in result && result.error ? result.error : 'Transaction failed';\n return {\n status: 'failed',\n error: message,\n };\n }\n\n return {\n status: 'success',\n txHash: typeof result.result === 'string' ? result.result : undefined,\n rawResult: result.result,\n };\n }\n\n /**\n * Execute a single operation and return the result directly.\n * Throws if no result is returned.\n */\n async executeOperation(\n operation: BrowserWalletOperation\n ): Promise<BrowserWalletOperationResult> {\n const adapter = await this.getAdapter();\n const results = await adapter.executeOperations([operation]);\n\n if (!results.length) {\n throw new Error('No result returned from wallet operation');\n }\n\n return results[0];\n }\n}\n","import type { EmbeddedGroupConfig } from '../types';\n\n/**\n * Default labels for wallet groups\n */\nexport const DEFAULT_LABELS = {\n embedded: 'Embedded Wallet',\n aztecWallets: 'Aztec Wallet',\n evmWallets: 'EVM Wallet',\n} as const;\n\n/**\n * Default modal configuration\n */\nexport const DEFAULT_MODAL_CONFIG = {\n title: 'Connect Wallet',\n subtitle:\n 'Choose how you want to connect. Each option offers a different balance of convenience and security.',\n} as const;\n\n/**\n * Default embedded wallet configuration\n */\nexport const DEFAULT_EMBEDDED_CONFIG: EmbeddedGroupConfig = {\n label: DEFAULT_LABELS.embedded,\n enabled: true,\n};\n","import type { WalletIconProps } from './types';\n\nexport const MetaMaskIcon = ({\n size,\n className,\n ...props\n}: WalletIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 318.6 318.6\"\n width={size}\n height={size}\n className={className}\n {...props}\n >\n <style>\n {`.st1,.st6{fill:#e4761b;stroke:#e4761b;stroke-linecap:round;stroke-linejoin:round}.st6{fill:#f6851b;stroke:#f6851b}`}\n </style>\n <path\n fill=\"#e2761b\"\n stroke=\"#e2761b\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m274.1 35.5-99.5 73.9L193 65.8z\"\n />\n <path\n d=\"m44.4 35.5 98.7 74.6-17.5-44.3zm193.9 171.3-26.5 40.6 56.7 15.6 16.3-55.3zm-204.4.9L50.1 263l56.7-15.6-26.5-40.6z\"\n className=\"st1\"\n />\n <path\n d=\"m103.6 138.2-15.8 23.9 56.3 2.5-2-60.5zm111.3 0-39-34.8-1.3 61.2 56.2-2.5zM106.8 247.4l33.8-16.5-29.2-22.8zm71.1-16.5 33.9 16.5-4.7-39.3z\"\n className=\"st1\"\n />\n <path\n fill=\"#d7c1b3\"\n stroke=\"#d7c1b3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m211.8 247.4-33.9-16.5 2.7 22.1-.3 9.3zm-105 0 31.5 14.9-.2-9.3 2.5-22.1z\"\n />\n <path\n fill=\"#233447\"\n stroke=\"#233447\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m138.8 193.5-28.2-8.3 19.9-9.1zm40.9 0 8.3-17.4 20 9.1z\"\n />\n <path\n fill=\"#cd6116\"\n stroke=\"#cd6116\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m106.8 247.4 4.8-40.6-31.3.9zM207 206.8l4.8 40.6 26.5-39.7zm23.8-44.7-56.2 2.5 5.2 28.9 8.3-17.4 20 9.1zm-120.2 23.1 20-9.1 8.2 17.4 5.3-28.9-56.3-2.5z\"\n />\n <path\n fill=\"#e4751f\"\n stroke=\"#e4751f\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m87.8 162.1 23.6 46-.8-22.9zm120.3 23.1-1 22.9 23.7-46zm-64-20.6-5.3 28.9 6.6 34.1 1.5-44.9zm30.5 0-2.7 18 1.2 45 6.7-34.1z\"\n />\n <path\n d=\"m179.8 193.5-6.7 34.1 4.8 3.3 29.2-22.8 1-22.9zm-69.2-8.3.8 22.9 29.2 22.8 4.8-3.3-6.6-34.1z\"\n className=\"st6\"\n />\n <path\n fill=\"#c0ad9e\"\n stroke=\"#c0ad9e\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m180.3 262.3.3-9.3-2.5-2.2h-37.7l-2.3 2.2.2 9.3-31.5-14.9 11 9 22.3 15.5h38.3l22.4-15.5 11-9z\"\n />\n <path\n fill=\"#161616\"\n stroke=\"#161616\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m177.9 230.9-4.8-3.3h-27.7l-4.8 3.3-2.5 22.1 2.3-2.2h37.7l2.5 2.2z\"\n />\n <path\n fill=\"#763d16\"\n stroke=\"#763d16\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m278.3 114.2 8.5-40.8-12.7-37.9-96.2 71.4 37 31.3 52.3 15.3 11.6-13.5-5-3.6 8-7.3-6.2-4.8 8-6.1zM31.8 73.4l8.5 40.8-5.4 4 8 6.1-6.1 4.8 8 7.3-5 3.6 11.5 13.5 52.3-15.3 37-31.3-96.2-71.4z\"\n />\n <path\n d=\"m267.2 153.5-52.3-15.3 15.9 23.9-23.7 46 31.2-.4h46.5zm-163.6-15.3-52.3 15.3-17.4 54.2h46.4l31.1.4-23.6-46zm71 26.4 3.3-57.7 15.2-41.1h-67.5l15 41.1 3.5 57.7 1.2 18.2.1 44.8h27.7l.2-44.8z\"\n className=\"st6\"\n />\n </svg>\n);\n","import type { WalletIconProps } from './types';\n\nexport const RabbyIcon = ({ size, className, ...props }: WalletIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"70 50 370 370\"\n width={size}\n height={size}\n className={className}\n fill=\"none\"\n {...props}\n >\n <defs>\n <linearGradient\n id=\"rabby-paint0\"\n x1=\"195.972\"\n y1=\"199.97\"\n x2=\"398.584\"\n y2=\"257.233\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#8697FF\" />\n <stop offset=\"1\" stopColor=\"#ABB7FF\" />\n </linearGradient>\n <linearGradient\n id=\"rabby-paint1\"\n x1=\"364.383\"\n y1=\"196.107\"\n x2=\"217.769\"\n y2=\"49.628\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#8697FF\" />\n <stop offset=\"1\" stopColor=\"#5156D8\" stopOpacity=\"0\" />\n </linearGradient>\n <linearGradient\n id=\"rabby-paint2\"\n x1=\"288.926\"\n y1=\"278.313\"\n x2=\"148.327\"\n y2=\"197.75\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#465EED\" />\n <stop offset=\"1\" stopColor=\"#8697FF\" stopOpacity=\"0\" />\n </linearGradient>\n <linearGradient\n id=\"rabby-paint3\"\n x1=\"208.062\"\n y1=\"198.453\"\n x2=\"303.333\"\n y2=\"319.098\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#8898FF\" />\n <stop offset=\"0.983895\" stopColor=\"#6277F1\" />\n </linearGradient>\n </defs>\n <path\n d=\"M400.96 222.806C412.465 197.018 355.59 124.972 301.254 94.9561C267.005 71.7031 231.317 74.8977 224.089 85.1075C208.227 107.514 276.614 126.5 322.35 148.655C312.518 152.94 303.253 160.628 297.805 170.461C280.755 151.783 243.331 135.699 199.418 148.655C169.826 157.386 145.233 177.969 135.728 209.057C133.418 208.028 130.861 207.455 128.171 207.455C117.883 207.455 109.543 215.823 109.543 226.146C109.543 236.468 117.883 244.836 128.171 244.836C130.077 244.836 136.04 243.553 136.04 243.553L231.317 244.246C193.214 304.897 163.101 313.763 163.101 324.271C163.101 334.778 191.914 331.931 202.732 328.014C254.521 309.265 310.145 250.83 319.69 234.009C359.773 239.027 393.459 239.62 400.96 222.806Z\"\n fill=\"url(#rabby-paint0)\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M322.345 148.658C322.348 148.659 322.35 148.66 322.353 148.661C324.473 147.824 324.13 144.682 323.548 142.215C322.21 136.545 299.125 113.672 277.448 103.428C247.909 89.4683 226.157 90.188 222.944 96.622C228.961 108.996 256.855 120.613 285.989 132.746C298.418 137.923 311.073 143.193 322.35 148.656C322.349 148.657 322.347 148.657 322.345 148.658Z\"\n fill=\"url(#rabby-paint1)\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M284.861 273.194C278.887 270.903 272.139 268.802 264.467 266.895C272.647 252.208 274.364 230.467 266.638 216.72C255.796 197.429 242.186 187.161 210.56 187.161C193.166 187.161 146.333 193.039 145.502 232.267C145.414 236.382 145.499 240.155 145.796 243.623L231.317 244.245C219.788 262.597 208.99 276.208 199.536 286.558C210.887 289.476 220.253 291.926 228.852 294.175C237.012 296.31 244.48 298.263 252.297 300.264C264.089 291.644 275.174 282.245 284.861 273.194Z\"\n fill=\"url(#rabby-paint2)\"\n />\n <path\n d=\"M134.586 239.593C138.08 269.392 154.959 281.07 189.448 284.526C223.938 287.982 243.721 285.664 270.06 288.068C292.058 290.076 311.7 301.324 318.986 297.437C325.544 293.939 321.875 281.301 313.101 273.192C301.726 262.682 285.984 255.374 258.284 252.781C263.805 237.616 262.258 216.352 253.684 204.783C241.288 188.056 218.407 180.493 189.448 183.797C159.193 187.25 130.202 202.195 134.586 239.593Z\"\n fill=\"url(#rabby-paint3)\"\n />\n </svg>\n);\n","import type { WalletIconProps } from './types'\n\nexport const AzguardIcon = ({ size, className, ...props }: WalletIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 40 40\"\n width={size}\n height={size}\n className={className}\n fill=\"none\"\n {...props}\n >\n <g clipPath=\"url(#azguard-clip)\">\n <path\n d=\"M0 19.2C0 12.4794 0 9.11906 1.30792 6.55211C2.4584 4.29417 4.29417 2.4584 6.55211 1.30792C9.11906 0 12.4794 0 19.2 0H20.8C27.5206 0 30.8809 0 33.4479 1.30792C35.7058 2.4584 37.5416 4.29417 38.6921 6.55211C40 9.11906 40 12.4794 40 19.2V20.8C40 27.5206 40 30.8809 38.6921 33.4479C37.5416 35.7058 35.7058 37.5416 33.4479 38.6921C30.8809 40 27.5206 40 20.8 40H19.2C12.4794 40 9.11906 40 6.55211 38.6921C4.29417 37.5416 2.4584 35.7058 1.30792 33.4479C0 30.8809 0 27.5206 0 20.8V19.2Z\"\n fill=\"#007AFF\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M20.514 0L21.3797 13.4728L28.3822 0.140515C28.6779 0.161799 28.9625 0.186306 29.2369 0.214526L23.9005 14.5932L37.0989 4.17626C37.2308 4.32971 37.3589 4.48656 37.4831 4.64668L25.7469 16.6404L39.935 13.0222C39.9466 13.3238 39.9561 13.6358 39.964 13.959L26.5996 19.2603L40 20.9442C40 21.2946 40 21.6358 39.9997 21.9681L26.3112 22H26L38.2462 34.2462C37.0925 36.1388 35.4334 37.6804 33.4479 38.6921C30.8809 40 27.5206 40 20.8 40H20V22V16L14 22H13.6888H0.00030146C4.2275e-05 21.6676 5.2804e-06 21.3263 0 20.9758L13.4003 19.2603L0.0360435 13.959C0.043874 13.6359 0.0534058 13.3238 0.0650083 13.0222L14.253 16.6404L2.51691 4.64668C2.64107 4.48656 2.76919 4.32971 2.90113 4.17627L16.0995 14.5932L10.7631 0.214528C11.0375 0.186307 11.3221 0.1618 11.6177 0.140516L18.6203 13.4728L19.486 0H20.514Z\"\n fill=\"white\"\n />\n </g>\n <defs>\n <clipPath id=\"azguard-clip\">\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n","/**\n * Wallet Presets Registry\n *\n * Pre-configured wallet definitions that developers can reference by ID.\n * This simplifies the config - devs just pass ['metamask', 'rabby'] instead of full configs.\n */\n\nimport { MetaMaskIcon, RabbyIcon, AzguardIcon } from '../assets/icons';\nimport type { IBrowserWalletAdapter } from '../../types/browserWallet';\nimport type { IconType } from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface EVMWalletPreset {\n id: string;\n name: string;\n icon: IconType;\n rdns: string;\n}\n\nexport interface AztecWalletPreset {\n id: string;\n name: string;\n icon: IconType;\n /** Lazy adapter factory - only imported when needed (async for dynamic imports) */\n getAdapter: () => Promise<IBrowserWalletAdapter>;\n /** Check if wallet extension is installed (optional, async) */\n checkInstalled?: () => Promise<boolean>;\n}\n\n// =============================================================================\n// EVM Wallet Presets\n// =============================================================================\n\nexport const EVM_WALLET_PRESETS: Record<string, EVMWalletPreset> = {\n metamask: {\n id: 'metamask',\n name: 'MetaMask',\n icon: MetaMaskIcon,\n rdns: 'io.metamask',\n },\n rabby: {\n id: 'rabby',\n name: 'Rabby',\n icon: RabbyIcon,\n rdns: 'io.rabby',\n },\n};\n\n// =============================================================================\n// Aztec Wallet Presets\n// =============================================================================\n\nexport const AZTEC_WALLET_PRESETS: Record<string, AztecWalletPreset> = {\n azguard: {\n id: 'azguard',\n name: 'Azguard',\n icon: AzguardIcon,\n getAdapter: async () => {\n // Dynamic import to avoid bundling if not used (ESM-compatible)\n const { AzguardAdapter } = await import('../adapters/azguard');\n return new AzguardAdapter();\n },\n checkInstalled: async () => {\n const { AzguardClient } = await import('@azguardwallet/client');\n return AzguardClient.isAzguardInstalled();\n },\n },\n // Add more Aztec wallets as they become available:\n // obsidian: {\n // id: 'obsidian',\n // name: 'Obsidian',\n // icon: ObsidianIcon, // Use icon component\n // getAdapter: () => {\n // const { ObsidianAdapter } = require('../../adapters/obsidian');\n // return new ObsidianAdapter();\n // },\n // checkInstalled: async () => {\n // // Check for window.obsidian or similar\n // return typeof window !== 'undefined' && 'obsidian' in window;\n // },\n // },\n};\n\n// =============================================================================\n// Helper functions\n// =============================================================================\n\n/**\n * Get EVM wallet preset by ID\n */\nexport function getEVMWalletPreset(id: string): EVMWalletPreset | undefined {\n return EVM_WALLET_PRESETS[id];\n}\n\n/**\n * Get Aztec wallet preset by ID\n */\nexport function getAztecWalletPreset(\n id: string\n): AztecWalletPreset | undefined {\n return AZTEC_WALLET_PRESETS[id];\n}\n\n/**\n * Get all available EVM wallet IDs\n */\nexport function getAvailableEVMWalletIds(): string[] {\n return Object.keys(EVM_WALLET_PRESETS);\n}\n\n/**\n * Get all available Aztec wallet IDs\n */\nexport function getAvailableAztecWalletIds(): string[] {\n return Object.keys(AZTEC_WALLET_PRESETS);\n}\n\n// =============================================================================\n// Type helpers for config\n// =============================================================================\n\n/** Known EVM wallet IDs */\nexport type EVMWalletId = keyof typeof EVM_WALLET_PRESETS;\n\n/** Known Aztec wallet IDs */\nexport type AztecWalletId = keyof typeof AZTEC_WALLET_PRESETS;\n","import { isStringArray } from '../../utils';\nimport { BrowserWalletConnector } from '../connectors/BrowserWalletConnector';\nimport { createEmbeddedConnector } from '../connectors/EmbeddedConnector';\nimport { ExternalSignerConnector } from '../connectors/ExternalSignerConnector';\nimport { ExternalSignerType } from '../types/aztec';\nimport {\n DEFAULT_LABELS,\n DEFAULT_MODAL_CONFIG,\n DEFAULT_EMBEDDED_CONFIG,\n} from './defaults';\nimport {\n getAztecWalletPreset,\n getEVMWalletPreset,\n AZTEC_WALLET_PRESETS,\n} from './walletPresets';\nimport type { ConnectorFactory } from '../connectors/registry';\nimport type {\n AztecWalletConfig,\n AztecBrowserWalletConfig,\n AztecWalletsGroupConfig,\n EmbeddedGroupConfig,\n EVMWalletConfig,\n EVMWalletsGroupConfig,\n ResolvedAztecWalletConfig,\n} from '../types';\n\n/**\n * Check if value is a full group config (has 'wallets' property)\n */\nfunction isFullGroupConfig(\n value: unknown\n): value is { wallets: unknown[]; label?: string } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'wallets' in value &&\n Array.isArray((value as { wallets: unknown }).wallets)\n );\n}\n\n/**\n * Resolve EVM wallet IDs to full wallet configs\n */\nfunction resolveEVMWallets(ids: string[]): EVMWalletConfig[] {\n const wallets: EVMWalletConfig[] = [];\n\n for (const id of ids) {\n const preset = getEVMWalletPreset(id);\n if (preset) {\n wallets.push({\n id: preset.id,\n name: preset.name,\n icon: preset.icon,\n rdns: preset.rdns,\n });\n } else {\n console.warn(\n `AztecWallet: Unknown EVM wallet \"${id}\". Available: metamask, rabby`\n );\n }\n }\n\n return wallets;\n}\n\n/**\n * Resolve Aztec wallet IDs to full wallet configs\n */\nfunction resolveAztecWallets(ids: string[]): AztecBrowserWalletConfig[] {\n const wallets: AztecBrowserWalletConfig[] = [];\n\n for (const id of ids) {\n const preset = getAztecWalletPreset(id);\n if (preset) {\n wallets.push({\n id: preset.id,\n name: preset.name,\n icon: preset.icon,\n adapter: preset.getAdapter,\n checkInstalled: preset.checkInstalled,\n });\n } else {\n const available = Object.keys(AZTEC_WALLET_PRESETS).join(', ');\n console.warn(\n `AztecWallet: Unknown Aztec wallet \"${id}\". Available: ${available}`\n );\n }\n }\n\n return wallets;\n}\n\n/**\n * Create connector factories from resolved wallet groups.\n * This is called internally by createAztecWalletConfig.\n */\nfunction createConnectorsFromWalletGroups(walletGroups: {\n embedded: EmbeddedGroupConfig | false;\n aztecWallets: AztecWalletsGroupConfig | false;\n evmWallets: EVMWalletsGroupConfig | false;\n}): ConnectorFactory[] {\n const connectors: ConnectorFactory[] = [];\n\n // Add embedded connector\n if (walletGroups.embedded !== false) {\n connectors.push(createEmbeddedConnector);\n }\n\n // Add EVM wallet connectors (external signers)\n if (walletGroups.evmWallets !== false) {\n for (const wallet of walletGroups.evmWallets.wallets) {\n connectors.push(\n () =>\n new ExternalSignerConnector({\n id: wallet.id,\n label: wallet.name,\n signerType: ExternalSignerType.EVM_WALLET,\n rdns: wallet.rdns,\n })\n );\n }\n }\n\n // Add Aztec browser wallet connectors\n if (walletGroups.aztecWallets !== false) {\n for (const wallet of walletGroups.aztecWallets.wallets) {\n const preset = AZTEC_WALLET_PRESETS[wallet.id];\n if (preset) {\n connectors.push(\n () =>\n new BrowserWalletConnector({\n id: wallet.id,\n label: wallet.name,\n adapterFactory: preset.getAdapter,\n })\n );\n }\n }\n }\n\n return connectors;\n}\n\n/**\n * Create an AztecWallet configuration with defaults applied\n *\n * Supports both simple and advanced configuration formats.\n *\n * @param config - User configuration\n * @returns Resolved configuration with all defaults applied\n *\n * @example Simple config (recommended)\n * ```ts\n * const config = createAztecWalletConfig({\n * networks: [{ name: 'devnet', nodeUrl: '...' }],\n * walletGroups: {\n * embedded: true,\n * evmWallets: ['metamask', 'rabby'],\n * aztecWallets: ['azguard'],\n * },\n * });\n * ```\n *\n * @example Advanced config (custom wallets)\n * ```ts\n * const config = createAztecWalletConfig({\n * networks: [{ name: 'devnet', nodeUrl: '...' }],\n * walletGroups: {\n * embedded: { label: 'Create Account' },\n * evmWallets: {\n * label: 'Connect EVM',\n * wallets: [{ id: 'custom', name: 'Custom', icon: '...', rdns: '...' }],\n * },\n * },\n * });\n * ```\n */\nexport function createAztecWalletConfig(\n config: AztecWalletConfig\n): ResolvedAztecWalletConfig {\n const { walletGroups } = config;\n\n // Resolve embedded config\n // Accepts: true, false, or { label?: string, enabled?: boolean }\n let resolvedEmbedded: ResolvedAztecWalletConfig['walletGroups']['embedded'];\n if (walletGroups.embedded === false) {\n resolvedEmbedded = false;\n } else if (walletGroups.embedded === true || !walletGroups.embedded) {\n resolvedEmbedded = { ...DEFAULT_EMBEDDED_CONFIG };\n } else {\n resolvedEmbedded = {\n ...DEFAULT_EMBEDDED_CONFIG,\n ...walletGroups.embedded,\n };\n }\n\n // Resolve Aztec wallets config\n // Accepts: false, ['azguard'], or { label?: string, wallets: [...] }\n let resolvedAztecWallets: AztecWalletsGroupConfig | false;\n if (walletGroups.aztecWallets === false || !walletGroups.aztecWallets) {\n resolvedAztecWallets = false;\n } else if (isStringArray(walletGroups.aztecWallets)) {\n // Simple config: ['azguard', 'obsidian']\n const wallets = resolveAztecWallets(walletGroups.aztecWallets);\n resolvedAztecWallets =\n wallets.length > 0\n ? { label: DEFAULT_LABELS.aztecWallets, wallets }\n : false;\n } else if (isFullGroupConfig(walletGroups.aztecWallets)) {\n // Full config: { label: '...', wallets: [...] }\n resolvedAztecWallets = {\n label: walletGroups.aztecWallets.label ?? DEFAULT_LABELS.aztecWallets,\n wallets: walletGroups.aztecWallets.wallets,\n };\n } else {\n resolvedAztecWallets = false;\n }\n\n // Resolve EVM wallets config\n // Accepts: false, ['metamask', 'rabby'], or { label?: string, wallets: [...] }\n let resolvedEvmWallets: EVMWalletsGroupConfig | false;\n if (walletGroups.evmWallets === false || !walletGroups.evmWallets) {\n resolvedEvmWallets = false;\n } else if (isStringArray(walletGroups.evmWallets)) {\n // Simple config: ['metamask', 'rabby']\n const wallets = resolveEVMWallets(walletGroups.evmWallets);\n resolvedEvmWallets =\n wallets.length > 0\n ? { label: DEFAULT_LABELS.evmWallets, wallets }\n : false;\n } else if (isFullGroupConfig(walletGroups.evmWallets)) {\n // Full config: { label: '...', wallets: [...] }\n resolvedEvmWallets = {\n label: walletGroups.evmWallets.label ?? DEFAULT_LABELS.evmWallets,\n wallets: walletGroups.evmWallets.wallets,\n };\n } else {\n resolvedEvmWallets = false;\n }\n\n const resolvedWalletGroups: ResolvedAztecWalletConfig['walletGroups'] = {\n embedded: resolvedEmbedded,\n aztecWallets: resolvedAztecWallets,\n evmWallets: resolvedEvmWallets,\n };\n\n // Auto-create connectors from wallet groups\n const connectors = createConnectorsFromWalletGroups(resolvedWalletGroups);\n\n return {\n ...config,\n defaultNetwork: config.defaultNetwork ?? config.networks[0]?.name,\n modal: {\n ...DEFAULT_MODAL_CONFIG,\n ...config.modal,\n },\n walletGroups: resolvedWalletGroups,\n connectors,\n };\n}\n","/**\n * Network Presets Registry\n *\n * Default icons and display names for known networks.\n * Users can override these in their config.\n */\n\nimport type { ComponentType } from 'react'\nimport { Globe, FlaskConical, Box, Rocket } from 'lucide-react'\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface NetworkPresetDefaults {\n /** Default display name */\n displayName: string\n /** Default icon component */\n icon: any\n}\n\n// =============================================================================\n// Network Presets\n// =============================================================================\n\nexport const NETWORK_PRESETS: Record<string, NetworkPresetDefaults> = {\n devnet: {\n displayName: 'Devnet',\n icon: Globe,\n },\n sandbox: {\n displayName: 'Local Network',\n icon: FlaskConical,\n },\n testnet: {\n displayName: 'Testnet',\n icon: Box,\n },\n mainnet: {\n displayName: 'Mainnet',\n icon: Rocket,\n },\n}\n\n// =============================================================================\n// Helper functions\n// =============================================================================\n\n/**\n * Get network preset defaults by name\n */\nexport function getNetworkPreset(\n name: string,\n): NetworkPresetDefaults | undefined {\n return NETWORK_PRESETS[name.toLowerCase()]\n}\n\n/**\n * Get the icon for a network (from config or preset defaults)\n */\nexport function getNetworkIcon(\n name: string,\n configIcon?: string | ComponentType<{ className?: string; size?: number }>,\n): ComponentType<any> | string {\n // Use config icon if provided\n if (configIcon) {\n return configIcon\n }\n\n // Fall back to preset icon\n const preset = getNetworkPreset(name)\n if (preset) {\n return preset.icon\n }\n\n // Default to Globe icon\n return Globe\n}\n\n/**\n * Get the display name for a network (from config or preset defaults)\n */\nexport function getNetworkDisplayName(\n name: string,\n configDisplayName?: string,\n): string {\n // Use config display name if provided\n if (configDisplayName) {\n return configDisplayName\n }\n\n // Fall back to preset display name\n const preset = getNetworkPreset(name)\n if (preset) {\n return preset.displayName\n }\n\n // Fall back to capitalized name\n return name.charAt(0).toUpperCase() + name.slice(1)\n}\n"],"mappings":"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","names":["import_addresses","init_azguard","import_zustand","import_addresses","import_fields","import_log","import_constants","import_SponsoredFPC","import_log","import_constants","logger","import_addresses","logger","import_viem","import_fields","import_viem","import_account","import_addresses","import_fields","import_wallet","import_fields","deployment","import_fields","import_wallet","import_poseidon","deployment","STORAGE_KEY","INITIAL_STATE","import_jsx_runtime","import_jsx_runtime","AzguardAdapter","AzguardClient"]}
1
+ {"version":3,"sources":["../../../src/config/networks/constants.ts","../../../src/utils/azguard.ts","../../../src/aztec-wallet/adapters/azguard/AzguardWalletService.ts","../../../src/aztec-wallet/adapters/azguard/AzguardAdapter.ts","../../../src/aztec-wallet/adapters/azguard/index.ts","../../../src/aztec-wallet/config/index.ts","../../../src/utils/string.ts","../../../src/aztec-wallet/store/network/store.ts","../../../src/config/networks/index.ts","../../../src/config/deployments/types.ts","../../../src/config/deployments/sandbox.json","../../../src/config/deployments/index.ts","../../../src/config/networks/sandbox.ts","../../../src/config/networks/devnet.ts","../../../src/store/contractRegistry.ts","../../../src/aztec-wallet/store/wallet/store.ts","../../../src/aztec-wallet/services/aztec/network/NetworkService.ts","../../../src/aztec-wallet/store/wallet/actions/browser.ts","../../../src/aztec-wallet/services/aztec/pxe/SharedPXEService.ts","../../../src/services/aztec/feePayment/FeePaymentRegister.ts","../../../src/utils/MinimalWallet.ts","../../../src/aztec-wallet/services/aztec/storage/AztecStorageService.ts","../../../src/aztec-wallet/connectors/EmbeddedConnector.ts","../../../src/aztec-wallet/services/evm/EVMWalletService.ts","../../../src/aztec-wallet/services/evm/EIP6963Service.ts","../../../src/aztec-wallet/signers/EVMSigner.ts","../../../src/aztec-wallet/signers/MetaMaskAuthWitnessProvider.ts","../../../src/aztec-wallet/signers/utils/evmPublicKeyRecovery.ts","../../../src/aztec-wallet/signers/EcdsaKEthSignerAccountContract.ts","../../../src/aztec-wallet/connectors/ExternalSignerConnector.ts","../../../src/aztec-wallet/services/wallet/errors.ts","../../../src/aztec-wallet/services/wallet/deployAccount.ts","../../../src/aztec-wallet/services/wallet/embeddedAccount.ts","../../../src/utils/accountCredentials.ts","../../../src/aztec-wallet/services/wallet/externalSignerAccount.ts","../../../src/aztec-wallet/store/wallet/actions/embedded.ts","../../../src/aztec-wallet/store/wallet/actions/externalSigner.ts","../../../src/aztec-wallet/store/wallet/types.ts","../../../src/aztec-wallet/connectors/BrowserWalletConnector.ts","../../../src/aztec-wallet/config/defaults.ts","../../../src/aztec-wallet/assets/icons/MetaMaskIcon.tsx","../../../src/aztec-wallet/assets/icons/RabbyIcon.tsx","../../../src/aztec-wallet/assets/icons/AzguardIcon.tsx","../../../src/aztec-wallet/config/walletPresets.ts","../../../src/aztec-wallet/config/createConfig.ts","../../../src/aztec-wallet/config/networkPresets.ts"],"sourcesContent":["/**\n * Centralized network configuration.\n * Single source of truth for all Aztec network URLs and chain IDs.\n */\n\n/**\n * Default node URLs for each network type\n */\nexport const NETWORK_URLS = {\n sandbox: 'http://localhost:8080',\n devnet: 'https://v4-devnet-1.aztec-labs.com',\n} as const\n\n/**\n * Default artifact registry URL for fetching contract artifacts\n */\nexport const DEFAULT_ARTIFACT_REGISTRY_URL = 'https://devnet.aztec-registry.xyz'\n\n/**\n * Available network types\n */\nexport type NetworkType = keyof typeof NETWORK_URLS\n\n/**\n * Supported Aztec network identifiers\n */\nexport type AztecNetwork = 'sandbox' | 'devnet'\n\n/**\n * Default network used when none is specified\n */\nexport const DEFAULT_NETWORK: AztecNetwork = 'devnet'\n\n/**\n * Aztec chain ID type - follows CAIP-2 format\n */\nexport type AztecChainId = `aztec:${number}`\n\n/**\n * Chain IDs for each network (CAIP-2 format)\n * Note: devnet chain ID must match browser wallet configuration\n */\nexport const CHAIN_IDS: Record<AztecNetwork, AztecChainId> = {\n sandbox: 'aztec:0',\n devnet: 'aztec:604129785',\n}\n\n/**\n * Display names for each network\n */\nexport const NETWORK_NAMES: Record<AztecNetwork, string> = {\n sandbox: 'Local Network',\n devnet: 'Devnet',\n}\n\n/**\n * Map chain ID number to network name for lookups\n */\nexport const CHAIN_ID_TO_NETWORK: Record<string, AztecNetwork> = {\n '0': 'sandbox',\n '604129785': 'devnet',\n}\n\n/**\n * All supported Aztec chains\n */\nexport const SUPPORTED_CHAINS: AztecChainId[] = Object.values(CHAIN_IDS)\n\n/**\n * Get the default URL for a network type\n */\nexport const getNetworkUrl = (network: NetworkType): string => {\n return NETWORK_URLS[network]\n}\n\n/**\n * Get the chain ID for a network name\n */\nexport const getChainId = (network: string): AztecChainId => {\n return CHAIN_IDS[network as AztecNetwork] ?? CHAIN_IDS.devnet\n}\n","import { AztecAddress } from '@aztec/aztec.js/addresses';\nimport type { CaipAccount } from '@azguardwallet/types';\n\n/**\n * Extracts the chain identifier from a CAIP account string.\n * CAIP format: namespace:chainId:address (e.g., \"aztec:testnet:0x1234...\")\n *\n * @param caipAccount - The full CAIP account string\n * @returns The chain identifier (e.g., \"aztec:testnet\")\n */\nexport const getChainFromCaipAccount = (\n caipAccount: CaipAccount | string\n): string => {\n const [namespace, chainId] = caipAccount.split(':');\n return `${namespace}:${chainId}`;\n};\n\n/**\n * Parses an AztecAddress from a CAIP account string.\n * CAIP format: aztec:chainId:address (e.g., \"aztec:testnet:0x1234...\")\n *\n * Handles both:\n * - Full CAIP format: \"aztec:chainId:0x...\"\n * - Plain address: \"0x...\"\n * - Aztec addresses (66 chars) and Ethereum addresses (42 chars, padded)\n *\n * @param caipAccount - The CAIP account string or plain address\n * @returns The parsed AztecAddress\n */\nexport const parseAddressFromCaip = (caipAccount: string): AztecAddress => {\n const parts = caipAccount.split(':');\n const hasPrefix = parts.length === 3 && parts[0] === 'aztec';\n const addressStr = hasPrefix ? parts[2] : caipAccount;\n\n // Handle Aztec address format (66 chars: 0x + 64 hex)\n if (addressStr.length === 66) {\n return AztecAddress.fromString(addressStr);\n }\n\n // Handle Ethereum address format (42 chars: 0x + 40 hex) - pad to Aztec format\n if (addressStr.length === 42) {\n const paddedAddress = '0x' + addressStr.slice(2).padStart(64, '0');\n return AztecAddress.fromString(paddedAddress);\n }\n\n throw new Error(`Unsupported account format: ${caipAccount}`);\n};\n","import { AzguardClient } from '@azguardwallet/client';\nimport type {\n CaipAccount,\n DappMetadata,\n DappPermissions,\n Operation,\n OperationResult,\n} from '@azguardwallet/types';\nimport { SUPPORTED_CHAINS } from '../../../config/networks/constants';\nimport type { AzguardWalletState } from '../../../types/azguard';\n\n// Polling timeout for window.azguard to appear — content scripts load asynchronously\nconst INIT_TIMEOUT_MS = 300;\n// How long to wait for the user to unlock wallet and approve connection\nconst CONNECTION_TIMEOUT_MS = 60_000;\n\nexport class AzguardWalletService {\n private client: AzguardClient | null = null;\n private state: AzguardWalletState = {\n isInstalled: false,\n status: 'disconnected',\n accounts: [],\n selectedAccount: null,\n supportedChains: [],\n error: null,\n };\n private eventListeners: Map<string, Set<(...args: unknown[]) => void>> =\n new Map();\n private accountsChangedHandler?: (accounts: CaipAccount[]) => void;\n private disconnectedHandler?: () => void;\n\n /**\n * Helper to wrap a promise with a timeout to prevent indefinite hangs\n */\n private withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n errorMessage: string\n ): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error(errorMessage)), timeoutMs)\n ),\n ]);\n }\n\n async initialize(): Promise<void> {\n try {\n // isAzguardInstalled polls with setInterval — handles async content script load\n const isInstalled = await AzguardClient.isAzguardInstalled(INIT_TIMEOUT_MS);\n this.updateState({ isInstalled });\n\n if (isInstalled) {\n // create() restores a previous session from localStorage if one exists\n this.client = await AzguardClient.create('omni-sdk', INIT_TIMEOUT_MS);\n\n this.setupEventListeners();\n\n const supportedChains = this.getSupportedChains();\n this.updateState({ supportedChains });\n\n // If a previous session was restored, reflect that in the state\n if (this.client.connected) {\n const accounts = this.client.accounts;\n const selectedAccount = accounts.length > 0 ? accounts[0] : null;\n this.updateState({ status: 'connected', accounts, selectedAccount });\n console.log('Azguard wallet session restored:', { accounts });\n }\n\n console.log('Azguard wallet service initialized successfully');\n } else {\n console.warn('⚠️ Azguard wallet is not installed');\n this.updateState({\n error:\n 'Azguard wallet extension is not installed. Please install it from the Chrome Web Store.',\n });\n }\n } catch (error) {\n console.error('Failed to initialize Azguard wallet service:', error);\n this.updateState({\n error:\n error instanceof Error\n ? error.message\n : 'Failed to initialize Azguard wallet service',\n });\n throw error;\n }\n }\n\n /**\n * Connect to Azguard wallet.\n * In v0.8.0, connect() returns void — accounts are read from client.accounts afterwards.\n */\n async connect(\n dappMetadata: DappMetadata,\n requiredPermissions: DappPermissions[],\n optionalPermissions?: DappPermissions[]\n ): Promise<CaipAccount[]> {\n if (!this.client) {\n throw new Error('Azguard wallet service not initialized');\n }\n\n try {\n this.updateState({ status: 'connecting', error: null });\n\n this.validateConnectionParams(\n dappMetadata,\n requiredPermissions,\n optionalPermissions\n );\n\n await this.withTimeout(\n this.client.connect(dappMetadata, requiredPermissions, optionalPermissions),\n CONNECTION_TIMEOUT_MS,\n 'Connection timed out. The wallet may be locked - please unlock it and try again.'\n );\n\n const accounts = this.client.accounts;\n const selectedAccount = accounts.length > 0 ? accounts[0] : null;\n\n this.updateState({\n status: 'connected',\n accounts,\n selectedAccount,\n });\n\n console.log('Connected to Azguard wallet:', { accounts, selectedAccount });\n return accounts;\n } catch (error) {\n console.error('Failed to connect to Azguard wallet:', error);\n\n if (error instanceof Error) {\n console.error('Error details:', {\n message: error.message,\n stack: error.stack,\n name: error.name,\n });\n }\n\n this.updateState({\n status: 'disconnected',\n error:\n error instanceof Error\n ? error.message\n : 'Failed to connect to Azguard wallet',\n });\n throw error;\n }\n }\n\n /**\n * Validate connection parameters before attempting connection\n */\n private validateConnectionParams(\n dappMetadata: DappMetadata,\n requiredPermissions: DappPermissions[],\n optionalPermissions?: DappPermissions[]\n ): void {\n if (!dappMetadata || typeof dappMetadata !== 'object') {\n throw new Error('dappMetadata is required and must be an object');\n }\n\n if (dappMetadata.url && typeof dappMetadata.url !== 'string') {\n throw new Error('dappMetadata.url must be a string if provided');\n }\n\n if (dappMetadata.logo && typeof dappMetadata.logo !== 'string') {\n throw new Error('dappMetadata.logo must be a string if provided');\n }\n\n const validatePermissions = (\n permissions: DappPermissions[],\n label: string\n ) => {\n if (!Array.isArray(permissions)) {\n throw new Error(`${label} must be an array`);\n }\n\n if (permissions.length === 0) {\n throw new Error(`${label} array cannot be empty`);\n }\n\n permissions.forEach((permission, index) => {\n if (!permission || typeof permission !== 'object') {\n throw new Error(`${label}[${index}] must be an object`);\n }\n\n if (permission.chains !== undefined) {\n if (!Array.isArray(permission.chains)) {\n throw new Error(`${label}[${index}].chains must be an array`);\n }\n\n permission.chains.forEach((chain: string, chainIndex: number) => {\n if (typeof chain !== 'string') {\n throw new Error(\n `${label}[${index}].chains[${chainIndex}] must be a string`\n );\n }\n if (!chain.startsWith('aztec:')) {\n throw new Error(\n `${label}[${index}].chains[${chainIndex}] must start with \"aztec:\"`\n );\n }\n });\n }\n\n if (permission.methods !== undefined) {\n if (!Array.isArray(permission.methods)) {\n throw new Error(`${label}[${index}].methods must be an array`);\n }\n\n permission.methods.forEach((method: string, methodIndex: number) => {\n if (typeof method !== 'string') {\n throw new Error(\n `${label}[${index}].methods[${methodIndex}] must be a string`\n );\n }\n });\n }\n });\n };\n\n validatePermissions(requiredPermissions, 'requiredPermissions');\n\n if (optionalPermissions && optionalPermissions.length > 0) {\n validatePermissions(optionalPermissions, 'optionalPermissions');\n }\n }\n\n /**\n * Disconnect from Azguard wallet\n */\n async disconnect(): Promise<void> {\n if (!this.client) {\n return;\n }\n\n try {\n await this.client.disconnect();\n\n this.updateState({\n status: 'disconnected',\n accounts: [],\n selectedAccount: null,\n error: null,\n });\n\n console.log('Disconnected from Azguard wallet');\n } catch (error) {\n console.error('Failed to disconnect from Azguard wallet:', error);\n throw error;\n }\n }\n\n /**\n * Execute multiple operations in batch\n */\n async executeOperations(operations: Operation[]): Promise<OperationResult[]> {\n if (!this.client || this.state.status !== 'connected') {\n throw new Error('Azguard wallet not connected');\n }\n\n try {\n const results = await this.client.execute(operations);\n\n const succeeded = results.filter((r: OperationResult) => r.status === 'ok').length;\n const failed = results.filter((r: OperationResult) => r.status === 'failed').length;\n const skipped = results.filter((r: OperationResult) => r.status === 'skipped').length;\n\n console.log(\n `📋 Batch operations completed: ${succeeded} ok, ${failed} failed, ${skipped} skipped`\n );\n\n results.forEach((result: OperationResult, index: number) => {\n if (result.status === 'failed') {\n const errorMsg = 'error' in result ? result.error : 'Unknown error';\n console.error(`❌ Operation ${index} failed:`, errorMsg);\n } else if (result.status === 'skipped') {\n console.warn(`⏭️ Operation ${index} skipped`);\n }\n });\n\n return results;\n } catch (error) {\n console.error('❌ Failed to execute operations:', error);\n throw error;\n }\n }\n\n /**\n * Set up event listeners for wallet events\n */\n private setupEventListeners(): void {\n if (!this.client) return;\n\n this.accountsChangedHandler = (accounts: CaipAccount[]) => {\n this.updateState({\n accounts,\n selectedAccount: accounts.length > 0 ? accounts[0] : null,\n status: accounts.length > 0 ? 'connected' : 'disconnected',\n });\n };\n\n this.disconnectedHandler = () => {\n this.updateState({\n status: 'disconnected',\n accounts: [],\n selectedAccount: null,\n });\n this.emitEvent('disconnected');\n };\n\n this.client.onAccountsChanged.addHandler(this.accountsChangedHandler);\n this.client.onDisconnected.addHandler(this.disconnectedHandler);\n }\n\n /**\n * Add accounts-changed event listener\n */\n onAccountsChanged(callback: (accounts: CaipAccount[]) => void): void {\n this.addEventListener(\n 'accountsChanged',\n callback as (...args: unknown[]) => void\n );\n }\n\n /**\n * Add disconnection event listener\n */\n onDisconnected(callback: () => void): void {\n this.addEventListener(\n 'disconnected',\n callback as (...args: unknown[]) => void\n );\n }\n\n getSupportedChains(): string[] {\n return [...SUPPORTED_CHAINS];\n }\n\n /**\n * Get the underlying AzguardClient\n */\n getClient(): AzguardClient | null {\n return this.client;\n }\n\n /**\n * Get current wallet state\n */\n getState(): AzguardWalletState {\n return { ...this.state };\n }\n\n /**\n * Update wallet state and notify listeners\n */\n private updateState(updates: Partial<AzguardWalletState>): void {\n const previousState = { ...this.state };\n this.state = { ...this.state, ...updates };\n\n if (\n updates.accounts &&\n JSON.stringify(previousState.accounts) !==\n JSON.stringify(updates.accounts)\n ) {\n this.emitEvent('accountsChanged', updates.accounts);\n }\n }\n\n private addEventListener(\n event: string,\n callback: (...args: unknown[]) => void\n ): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n private emitEvent(event: string, ...args: unknown[]): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach((callback) => {\n try {\n callback(...args);\n } catch (error) {\n console.error(`Error in ${event} event listener:`, error);\n }\n });\n }\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.client) {\n if (this.accountsChangedHandler) {\n this.client.onAccountsChanged.removeHandler(this.accountsChangedHandler);\n }\n if (this.disconnectedHandler) {\n this.client.onDisconnected.removeHandler(this.disconnectedHandler);\n }\n }\n this.accountsChangedHandler = undefined;\n this.disconnectedHandler = undefined;\n this.eventListeners.clear();\n this.client = null;\n this.state = {\n isInstalled: false,\n status: 'disconnected',\n accounts: [],\n selectedAccount: null,\n supportedChains: [],\n error: null,\n };\n }\n}\n","/**\n * AzguardAdapter - Browser wallet adapter for Azguard wallet.\n *\n * Implements IBrowserWalletAdapter to provide Azguard-specific\n * connection logic while keeping the hook wallet-agnostic.\n */\n\nimport type { ContractArtifact } from '@aztec/aztec.js/abi'\nimport type { AccountWithSecretKey } from '@aztec/aztec.js/account'\nimport {\n getChainId,\n type AztecChainId,\n type AztecNetwork,\n} from '../../../config/networks/constants'\nimport { parseAddressFromCaip } from '../../../utils/azguard'\nimport { AzguardWalletService } from './AzguardWalletService'\nimport type {\n IBrowserWalletAdapter,\n BrowserWalletState,\n BrowserWalletOperationResult,\n BrowserWalletOperation,\n} from '../../../types/browserWallet'\nimport type {\n CaipAccount,\n CaipChain,\n SimulateViewsOperation,\n SendTransactionOperation,\n RegisterContractOperation,\n Operation,\n} from '@azguardwallet/types'\n\n// =============================================================================\n// Azguard-specific artifact normalization\n// =============================================================================\n\n/**\n * Add `isInternal: false` to function artifacts if missing.\n * Azguard wallet requires this field in the schema.\n */\nconst addIsInternal = <T extends object>(\n obj: T,\n): T & { isInternal: boolean } => ({\n ...obj,\n isInternal: (obj as T & { isInternal?: boolean }).isInternal ?? false,\n})\n\n/**\n * Normalize a contract artifact for Azguard wallet compatibility.\n * Azguard wallet expects `isInternal` on all function artifacts.\n */\nconst normalizeArtifactForAzguard = (artifact: ContractArtifact): unknown => ({\n ...artifact,\n functions: artifact.functions.map(addIsInternal),\n ...(artifact.nonDispatchPublicFunctions && {\n nonDispatchPublicFunctions:\n artifact.nonDispatchPublicFunctions.map(addIsInternal),\n }),\n})\n\nconst AZGUARD_METHODS = [\n 'register_contract',\n 'send_transaction',\n 'simulate_views',\n 'simulate_utility',\n 'add_private_authwit',\n 'add_public_authwit',\n 'call',\n] as const\n\nconst buildDappMetadata = () => ({\n name: 'Aztec Web Boilerplate',\n description: 'Privacy-first application built on Aztec Network',\n url: typeof window !== 'undefined' ? window.location.origin : undefined,\n})\n\nexport class AzguardAdapter implements IBrowserWalletAdapter {\n readonly id = 'azguard'\n readonly label = 'Azguard Wallet'\n\n private service: AzguardWalletService\n\n constructor() {\n this.service = new AzguardWalletService()\n }\n\n async initialize(): Promise<void> {\n await this.service.initialize()\n }\n\n destroy(): void {\n this.service.destroy()\n }\n\n getState(): BrowserWalletState {\n return this.service.getState()\n }\n\n async connect(networkName: AztecNetwork): Promise<string[]> {\n const chain: AztecChainId = getChainId(networkName)\n const dappMetadata = buildDappMetadata()\n const requiredPermissions = [\n { chains: [chain], methods: [...AZGUARD_METHODS] },\n ]\n\n return this.service.connect(dappMetadata, requiredPermissions)\n }\n\n async disconnect(): Promise<void> {\n return this.service.disconnect()\n }\n\n async executeOperations(\n ops: BrowserWalletOperation[],\n ): Promise<BrowserWalletOperationResult[]> {\n const azguardOps = ops.map((op) => this.toAzguardOperation(op))\n return this.service.executeOperations(azguardOps)\n }\n\n /**\n * Translate generic operations to Azguard-specific format.\n * This is where all wallet-specific type casting happens.\n */\n private toAzguardOperation(op: BrowserWalletOperation): Operation {\n switch (op.kind) {\n case 'simulate_views': {\n const azguardOp: SimulateViewsOperation = {\n kind: 'simulate_views',\n account: op.account as CaipAccount,\n calls: op.calls.map((call) => ({\n kind: 'call' as const,\n contract: call.contract,\n method: call.method,\n args: call.args.map((arg) =>\n typeof arg === 'bigint' ? arg.toString() : String(arg),\n ),\n })),\n }\n return azguardOp\n }\n case 'send_transaction': {\n const azguardOp: SendTransactionOperation = {\n kind: 'send_transaction',\n account: op.account as CaipAccount,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions: op.calls.map((call): any => {\n if (\n call.kind === 'add_private_authwit' ||\n call.kind === 'add_public_authwit'\n ) {\n return {\n kind: call.kind,\n content: {\n kind: 'call' as const,\n caller: call.caller,\n contract: call.contract,\n method: call.method,\n args: call.args.map((arg) =>\n typeof arg === 'bigint' ? arg.toString() : String(arg),\n ),\n },\n }\n }\n return {\n kind: 'call' as const,\n contract: call.contract,\n method: call.method,\n args: call.args.map((arg) =>\n typeof arg === 'bigint' ? arg.toString() : arg,\n ),\n }\n }),\n }\n return azguardOp\n }\n case 'register_contract': {\n const azguardOp: RegisterContractOperation = {\n kind: 'register_contract',\n chain: op.chain as CaipChain,\n address: op.address,\n instance: op.instance,\n // Apply Azguard-specific normalization (adds isInternal to functions)\n artifact: normalizeArtifactForAzguard(\n op.artifact as ContractArtifact,\n ),\n }\n return azguardOp\n }\n default: {\n const kind = (op as BrowserWalletOperation).kind\n throw new Error(`Azguard wallet does not support operation: ${kind}`)\n }\n }\n }\n\n async toAccountWallet(accountId: string): Promise<AccountWithSecretKey> {\n const address = parseAddressFromCaip(accountId)\n return { getAddress: () => address } as unknown as AccountWithSecretKey\n }\n\n onAccountsChanged(cb: (accounts: string[]) => void): void {\n this.service.onAccountsChanged(cb)\n }\n\n onDisconnected(cb: () => void): void {\n this.service.onDisconnected(cb)\n }\n}\n\nexport const createAzguardAdapter = (): IBrowserWalletAdapter =>\n new AzguardAdapter()\n","export { AzguardAdapter, createAzguardAdapter } from './AzguardAdapter';\nexport { AzguardWalletService } from './AzguardWalletService';\n","export { createAztecWalletConfig } from './createConfig';\nexport {\n DEFAULT_LABELS,\n DEFAULT_MODAL_CONFIG,\n DEFAULT_EMBEDDED_CONFIG,\n} from './defaults';\nexport {\n EVM_WALLET_PRESETS,\n AZTEC_WALLET_PRESETS,\n getEVMWalletPreset,\n getAztecWalletPreset,\n getAvailableEVMWalletIds,\n getAvailableAztecWalletIds,\n type EVMWalletPreset,\n type AztecWalletPreset,\n type EVMWalletId,\n type AztecWalletId,\n} from './walletPresets';\nexport {\n NETWORK_PRESETS,\n getNetworkPreset,\n getNetworkIcon,\n getNetworkDisplayName,\n type NetworkPresetDefaults,\n} from './networkPresets';\n","/**\n * String utility functions for text transformations.\n */\n\n/**\n * Convert snake_case or camelCase to Title Case.\n * @param str - The string to convert\n * @returns The string in Title Case format\n */\nexport const toTitleCase = (str: string): string => {\n return str\n .replace(/_/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n}\n\n/**\n * Safely stringify a value, converting BigInt to string.\n * @param value - The value to stringify\n * @returns JSON string with BigInt values converted to strings\n */\nexport const safeStringify = (value: unknown): string =>\n JSON.stringify(value, (_key, v) => (typeof v === 'bigint' ? v.toString() : v))\n\n/**\n * Type guard to check if value is a string array\n * @param value - The value to check\n * @returns True if value is a string array\n */\nexport function isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((v) => typeof v === 'string')\n}\n\n/**\n * Truncate an address for display\n * @param address - The address to truncate\n * @param startChars - Number of characters to show at start\n * @param endChars - Number of characters to show at end\n * @returns Truncated address string\n */\nexport function truncateAddress(\n address: string,\n startChars = 6,\n endChars = 4,\n): string {\n if (address.length <= startChars + endChars + 3) {\n return address\n }\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`\n}\n","import { create } from 'zustand';\nimport {\n SANDBOX_CONFIG,\n DEVNET_CONFIG,\n type NetworkConfig,\n} from '../../../config/networks';\nimport { getContractRegistryStore } from '../../../store/contractRegistry';\nimport { isValidConfig } from '../../../utils';\nimport { getWalletStore } from '../wallet';\nimport type { AztecNetwork } from '../../../config/networks/constants';\nimport type { StoreNetworkPreset } from '../../types';\n\nconst STORAGE_KEY = 'aztec-wallet-network';\n\nconst BASE_CONFIGS: Record<AztecNetwork, NetworkConfig> = {\n sandbox: SANDBOX_CONFIG,\n devnet: DEVNET_CONFIG,\n};\n\ntype State = {\n currentConfig: NetworkConfig;\n configuredNetworks: Record<AztecNetwork, NetworkConfig>;\n defaultNetwork: AztecNetwork;\n isInitialized: boolean;\n};\n\ntype Actions = {\n initialize: (presets: StoreNetworkPreset[]) => void;\n switchToNetwork: (name: AztecNetwork) => boolean;\n resetToDefault: () => void;\n syncFromStorage: () => void;\n};\n\nexport type NetworkStore = State & Actions;\n\nconst INITIAL_STATE: State = {\n currentConfig: DEVNET_CONFIG,\n configuredNetworks: {} as Record<AztecNetwork, NetworkConfig>,\n defaultNetwork: 'devnet',\n isInitialized: false,\n};\n\nexport const useNetworkStore = create<NetworkStore>((set, get) => ({\n ...INITIAL_STATE,\n\n initialize: (presets) => {\n const configuredNetworks: Record<AztecNetwork, NetworkConfig> =\n {} as Record<AztecNetwork, NetworkConfig>;\n for (const preset of presets) {\n const base = BASE_CONFIGS[preset.aztecNetwork];\n if (base) {\n configuredNetworks[preset.aztecNetwork] = {\n ...base,\n nodeUrl: preset.nodeUrl,\n };\n }\n }\n\n const defaultNetwork = presets[0]?.aztecNetwork ?? 'sandbox';\n const defaultConfig = configuredNetworks[defaultNetwork] ?? SANDBOX_CONFIG;\n\n const savedNetwork = localStorage.getItem(\n STORAGE_KEY\n ) as AztecNetwork | null;\n const initialConfig =\n savedNetwork && configuredNetworks[savedNetwork]\n ? configuredNetworks[savedNetwork]\n : defaultConfig;\n\n set({\n configuredNetworks,\n defaultNetwork,\n currentConfig: initialConfig,\n isInitialized: true,\n });\n\n setupCrossTabSync();\n },\n\n switchToNetwork: (name) => {\n const { configuredNetworks, currentConfig } = get();\n const config = configuredNetworks[name as AztecNetwork];\n if (config && config.name !== currentConfig.name) {\n getContractRegistryStore().reset();\n getWalletStore().setPXEStatus('idle');\n set({ currentConfig: config });\n localStorage.setItem(STORAGE_KEY, name);\n return true;\n }\n return false;\n },\n\n resetToDefault: () => {\n const { defaultNetwork, configuredNetworks, currentConfig } = get();\n const defaultConfig = configuredNetworks[defaultNetwork] ?? SANDBOX_CONFIG;\n if (defaultConfig.name !== currentConfig.name) {\n getContractRegistryStore().reset();\n getWalletStore().setPXEStatus('idle');\n }\n localStorage.setItem(STORAGE_KEY, defaultNetwork);\n set({ currentConfig: defaultConfig });\n },\n\n syncFromStorage: () => {\n const { configuredNetworks, currentConfig } = get();\n const savedNetwork = localStorage.getItem(\n STORAGE_KEY\n ) as AztecNetwork | null;\n if (savedNetwork && configuredNetworks[savedNetwork]) {\n const newConfig = configuredNetworks[savedNetwork];\n if (newConfig.name !== currentConfig.name) {\n getContractRegistryStore().reset();\n getWalletStore().setPXEStatus('idle');\n }\n set({ currentConfig: newConfig });\n }\n },\n}));\n\nexport const getNetworkStore = () => useNetworkStore.getState();\n\nlet isListenerSetup = false;\nfunction setupCrossTabSync() {\n if (isListenerSetup) return;\n isListenerSetup = true;\n\n window.addEventListener('storage', (e: StorageEvent) => {\n if (e.key === STORAGE_KEY) {\n getNetworkStore().syncFromStorage();\n }\n });\n}\n\n/**\n * Get network options for UI dropdowns.\n * @param configuredNetworks - The configured networks from store\n * @param presets - The original network presets\n */\nexport const buildNetworkOptions = (\n configuredNetworks: Record<AztecNetwork, NetworkConfig>,\n presets: StoreNetworkPreset[]\n) => {\n return presets.map((preset) => {\n const config = configuredNetworks[preset.aztecNetwork];\n return {\n value: preset.aztecNetwork,\n label: config?.displayName ?? preset.aztecNetwork,\n description: config?.description ?? '',\n disabled: !config || !isValidConfig(config),\n };\n });\n};\n","export * from './types';\nexport * from './constants';\nexport * from './sandbox';\nexport * from './devnet';\n\nimport { DEVNET_CONFIG } from './devnet';\nimport { SANDBOX_CONFIG } from './sandbox';\nimport { NetworkConfig } from './types';\n\nexport const AVAILABLE_NETWORKS: NetworkConfig[] = [\n SANDBOX_CONFIG,\n DEVNET_CONFIG,\n];\n","/**\n * Deployment configuration types for Aztec contracts\n */\n\nimport { NETWORK_URLS, type NetworkType } from '../networks/constants';\n\n/**\n * Contract deployment information\n */\nexport interface ContractDeployment {\n address: string;\n salt: string;\n}\n\n/**\n * Full deployment configuration for a network\n */\nexport interface DeploymentConfig {\n network: NetworkType;\n nodeUrl: string;\n dripperContract: ContractDeployment;\n tokenContract: ContractDeployment;\n deployer: string;\n proverEnabled: boolean;\n deployedAt: string;\n}\n\n/**\n * Placeholder values for undeployed contracts\n */\nexport const PLACEHOLDER_ADDRESS =\n '0x0000000000000000000000000000000000000000000000000000000000000000';\nexport const PLACEHOLDER_SALT =\n '0x0000000000000000000000000000000000000000000000000000000000000000';\n\n/**\n * Check if a deployment config has valid (non-placeholder) contract addresses\n */\nexport const isDeploymentValid = (config: DeploymentConfig): boolean => {\n return (\n config.dripperContract.address !== PLACEHOLDER_ADDRESS &&\n config.tokenContract.address !== PLACEHOLDER_ADDRESS &&\n config.deployer !== PLACEHOLDER_ADDRESS\n );\n};\n\n/**\n * Default sandbox deployment config (placeholder until contracts are deployed)\n */\nexport const DEFAULT_SANDBOX_DEPLOYMENT: DeploymentConfig = {\n network: 'sandbox',\n nodeUrl: NETWORK_URLS.sandbox,\n dripperContract: {\n address: PLACEHOLDER_ADDRESS,\n salt: PLACEHOLDER_SALT,\n },\n tokenContract: {\n address: PLACEHOLDER_ADDRESS,\n salt: PLACEHOLDER_SALT,\n },\n deployer: PLACEHOLDER_ADDRESS,\n proverEnabled: false,\n deployedAt: '',\n};\n\n/**\n * Default devnet deployment config (placeholder until contracts are deployed)\n */\nexport const DEFAULT_DEVNET_DEPLOYMENT: DeploymentConfig = {\n network: 'devnet',\n nodeUrl: NETWORK_URLS.devnet,\n dripperContract: {\n address: PLACEHOLDER_ADDRESS,\n salt: PLACEHOLDER_SALT,\n },\n tokenContract: {\n address: PLACEHOLDER_ADDRESS,\n salt: PLACEHOLDER_SALT,\n },\n deployer: PLACEHOLDER_ADDRESS,\n proverEnabled: true,\n deployedAt: '',\n};\n","{\n \"network\": \"sandbox\",\n \"nodeUrl\": \"http://localhost:8080\",\n \"dripperContract\": {\n \"address\": \"0x294f2f4d12fc8308fcde6df4025a9e83004928e58b4082e49b93b4bb69f6b0d8\",\n \"salt\": \"0x0000000000000000000000000000000000000000000000000000000000000539\"\n },\n \"tokenContract\": {\n \"address\": \"0x24bf78296b515bab819d4e6bc39ef2dad7291699342d674f6ee155cae964fe55\",\n \"salt\": \"0x0000000000000000000000000000000000000000000000000000000000000539\"\n },\n \"deployer\": \"0x1d7d30cbf75ffed8cd68ac3df642b46b1cc3e2ff43f7e901d6b4fa43d28a0eff\",\n \"proverEnabled\": false,\n \"deployedAt\": \"2026-02-21T10:49:45.563Z\"\n}\n","export * from './types';\n\nimport devnetDeployment from './devnet.json';\nimport sandboxDeployment from './sandbox.json';\nimport {\n DeploymentConfig,\n DEFAULT_SANDBOX_DEPLOYMENT,\n DEFAULT_DEVNET_DEPLOYMENT,\n} from './types';\n\nexport const getSandboxDeployment = (): DeploymentConfig => {\n try {\n return sandboxDeployment as DeploymentConfig;\n } catch {\n return DEFAULT_SANDBOX_DEPLOYMENT;\n }\n};\n\nexport const getDevnetDeployment = (): DeploymentConfig => {\n try {\n return devnetDeployment as DeploymentConfig;\n } catch {\n return DEFAULT_DEVNET_DEPLOYMENT;\n }\n};\n","import { getSandboxDeployment, isDeploymentValid } from '../deployments'\nimport { NetworkConfig } from './types'\n\n/**\n * Load sandbox deployment from JSON config file.\n */\nconst deployment = getSandboxDeployment()\n\n/**\n * Sandbox configuration for local development.\n *\n * Contract addresses are loaded from src/config/deployments/sandbox.json\n * Run `yarn deploy-contracts` to deploy contracts and generate this config.\n *\n * Uses local artifacts for offline development (no external registry).\n */\nexport const SANDBOX_CONFIG: NetworkConfig = {\n name: 'sandbox',\n displayName: 'Local Network',\n description: isDeploymentValid(deployment)\n ? 'Local development environment with deployed contracts'\n : 'Local network - run \"yarn deploy-contracts\" to deploy',\n nodeUrl: deployment.nodeUrl,\n dripperContractAddress: deployment.dripperContract.address,\n tokenContractAddress: deployment.tokenContract.address,\n deployerAddress: deployment.deployer,\n dripperDeploymentSalt: deployment.dripperContract.salt,\n tokenDeploymentSalt: deployment.tokenContract.salt,\n proverEnabled: false,\n isTestnet: false,\n}\n","import { AztecAddress } from '@aztec/stdlib/aztec-address'\nimport { NetworkConfig } from './types'\n\n/**\n * Devnet configuration for public development network.\n *\n * Contract addresses are hardcoded for the public devnet.\n * These contracts are already deployed and available for testing.\n */\nexport const DEVNET_CONFIG: NetworkConfig = {\n name: 'devnet',\n displayName: 'Devnet',\n description: 'Public development network for testing with real tokens',\n nodeUrl: 'https://v4-devnet-2.aztec-labs.com',\n dripperContractAddress:\n '0x294f2f4d12fc8308fcde6df4025a9e83004928e58b4082e49b93b4bb69f6b0d8',\n tokenContractAddress:\n '0x24bf78296b515bab819d4e6bc39ef2dad7291699342d674f6ee155cae964fe55',\n deployerAddress: AztecAddress.ZERO.toString(),\n dripperDeploymentSalt: '1337',\n tokenDeploymentSalt: '1337',\n proverEnabled: true,\n isTestnet: true,\n // feePaymentContracts: {\n // metered: {\n // address:\n // '0x2a39ba8b469adc19bfc0f5c1a9d496f73b82e95fb113e020214c729ff9cd1ff4',\n // salt: '1337',\n // deployer: AztecAddress.ZERO.toString(),\n // },\n // },\n}\n","/**\n * Stub implementation of contract registry store for SDK compatibility.\n * This is a minimal implementation that satisfies the interface needed by aztec-wallet.\n */\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst noop = () => {}\n\n/**\n * Stub store that does nothing - contract registry is app-specific\n * and not needed for the SDK wallet functionality.\n */\nexport const getContractRegistryStore = () => ({\n reset: noop,\n})\n\n/**\n * Hook stub - returns empty state\n */\nexport const useContractRegistryStore = () => ({\n reset: noop,\n})\n\nexport type ContractRegistryStore = ReturnType<typeof getContractRegistryStore>\n","import { create } from 'zustand';\nimport { getContractRegistryStore } from '../../../store/contractRegistry';\nimport { NetworkService } from '../../services/aztec/network';\nimport { getNetworkStore } from '../network';\nimport { createBrowserActions } from './actions/browser';\nimport { createEmbeddedActions } from './actions/embedded';\nimport { createExternalSignerActions } from './actions/externalSigner';\nimport { isValidPXETransition } from './types';\nimport type { WalletStore, WalletState } from './types';\nimport type {\n WalletConnector,\n WalletConnectorId,\n} from '../../../types/walletConnector';\nimport type { WalletType } from '../../types/aztec';\n\nexport type { WalletStore, PXEStatus, NetworkStatus } from './types';\n\nconst WALLET_CONNECTION_STORAGE_KEY = 'aztec-wallet-connection';\n\ninterface StoredWalletConnection {\n connectorId: WalletConnectorId;\n walletType: WalletType;\n}\n\nconst saveWalletConnection = (data: StoredWalletConnection): void => {\n try {\n localStorage.setItem(WALLET_CONNECTION_STORAGE_KEY, JSON.stringify(data));\n } catch {\n // Ignore storage errors\n }\n};\n\nconst clearWalletConnection = (): void => {\n try {\n localStorage.removeItem(WALLET_CONNECTION_STORAGE_KEY);\n } catch {\n // Ignore\n }\n};\n\nexport const getStoredWalletConnection = (): StoredWalletConnection | null => {\n try {\n const data = localStorage.getItem(WALLET_CONNECTION_STORAGE_KEY);\n return data ? JSON.parse(data) : null;\n } catch {\n return null;\n }\n};\n\nconst INITIAL_STATE: WalletState = {\n account: null,\n walletType: null,\n status: 'disconnected',\n error: null,\n networkStatus: 'idle',\n networkError: null,\n pxeStatus: 'idle',\n pxeError: null,\n signerType: null,\n connectedRdns: null,\n caipAccount: null,\n caipAccounts: [],\n supportedChains: [],\n isInstalled: false,\n connectors: [],\n activeConnectorId: null,\n connectingConnectorId: null,\n};\n\nexport const useWalletStore = create<WalletStore>((set, get) => ({\n ...INITIAL_STATE,\n\n // Shared connect orchestration\n _connectWith: async <T>(\n connectorId: WalletConnectorId,\n run: (connector: WalletConnector) => Promise<T>\n ) => {\n const connector = get().connectors.find((item) => item.id === connectorId);\n if (!connector) {\n set({\n error: `Connector \"${connectorId}\" not found`,\n status: 'disconnected',\n connectingConnectorId: null,\n });\n throw new Error(`Connector \"${connectorId}\" not found`);\n }\n\n if (get().connectingConnectorId === connectorId) {\n throw new Error(`Connector \"${connectorId}\" is already connecting`);\n }\n\n set({\n connectingConnectorId: connectorId,\n error: null,\n });\n\n try {\n const result = await run(connector);\n set({\n activeConnectorId: connector.id,\n walletType: connector.type,\n status: 'connected',\n connectingConnectorId: null,\n });\n saveWalletConnection({\n connectorId: connector.id,\n walletType: connector.type,\n });\n return result;\n } catch (err) {\n const message =\n err instanceof Error ? err.message : 'Failed to connect to wallet';\n set({\n status: 'disconnected',\n error: message,\n activeConnectorId: null,\n walletType: null,\n connectingConnectorId: null,\n });\n throw err;\n }\n },\n\n _disconnectWith: async (cleanup?: () => Promise<void> | void) => {\n const { activeConnectorId, connectors } = get();\n if (!activeConnectorId) return;\n\n try {\n if (cleanup) {\n await cleanup();\n }\n } finally {\n clearWalletConnection();\n getContractRegistryStore().reset();\n set({\n account: null,\n walletType: null,\n status: 'disconnected',\n error: null,\n signerType: null,\n connectedRdns: null,\n caipAccount: null,\n caipAccounts: [],\n supportedChains: [],\n isInstalled: false,\n activeConnectorId: null,\n connectingConnectorId: null,\n pxeStatus: 'idle',\n pxeError: null,\n connectors,\n });\n }\n },\n\n setConnectors: (connectors) => set({ connectors }),\n\n /**\n * Generic connect method that delegates to the connector.\n *\n * NOTE: This does NOT wrap in `_connectWith` because each connector's\n * `connect()` method is responsible for calling the appropriate store action\n * (e.g., `connectEmbedded`, `connectExternalSigner`) which already uses\n * `_connectWith` internally. This avoids double-wrapping.\n */\n connect: async (connectorId) => {\n const connector = get().connectors.find((c) => c.id === connectorId);\n if (!connector) {\n set({\n error: `Connector \"${connectorId}\" not found`,\n status: 'disconnected',\n });\n throw new Error(`Connector \"${connectorId}\" not found`);\n }\n await connector.connect();\n },\n\n // Embedded actions\n ...createEmbeddedActions(set, get),\n\n // External Signer actions\n ...createExternalSignerActions(set, get),\n\n // Browser Wallet actions\n ...createBrowserActions(set, get),\n\n // Shared actions\n disconnect: async (cleanup?: () => Promise<void> | void) => {\n await get()._disconnectWith(cleanup);\n },\n\n setError: (error) => set({ error }),\n\n setNetworkStatus: (networkStatus, networkError = null) => {\n set({ networkStatus, networkError });\n },\n\n setPXEStatus: (pxeStatus, pxeError = null) => {\n const currentStatus = get().pxeStatus;\n if (!isValidPXETransition(currentStatus, pxeStatus)) {\n console.warn(\n `Invalid PXE state transition: ${currentStatus} → ${pxeStatus}`\n );\n }\n set({ pxeStatus, pxeError });\n },\n\n checkNetwork: async () => {\n const { networkStatus } = get();\n if (networkStatus === 'checking' || networkStatus === 'available') {\n return;\n }\n\n const { currentConfig } = getNetworkStore();\n set({ networkStatus: 'checking', networkError: null });\n\n try {\n await NetworkService.checkAvailability(currentConfig.nodeUrl);\n set({ networkStatus: 'available' });\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Failed to connect to network';\n set({ networkStatus: 'error', networkError: message });\n }\n },\n\n reset: () =>\n set((state) => ({\n ...INITIAL_STATE,\n connectors: state.connectors,\n })),\n\n syncFromStorage: async () => {\n const { activeConnectorId, connectExistingEmbedded } = get();\n const stored = getStoredWalletConnection();\n\n if (stored && !activeConnectorId) {\n // Another tab connected - try to reconnect if embedded wallet\n if (stored.walletType === 'embedded') {\n try {\n await connectExistingEmbedded(stored.connectorId);\n } catch {\n // Silent fail - user can manually reconnect\n }\n }\n } else if (!stored && activeConnectorId) {\n // Another tab disconnected - clear our state\n clearWalletConnection();\n getContractRegistryStore().reset();\n set((state) => ({\n ...INITIAL_STATE,\n connectors: state.connectors,\n }));\n }\n },\n}));\n\nexport const getWalletStore = () => useWalletStore.getState();\n\nlet isWalletListenerSetup = false;\n\nexport const setupWalletCrossTabSync = (): void => {\n if (isWalletListenerSetup) return;\n isWalletListenerSetup = true;\n\n window.addEventListener('storage', (e: StorageEvent) => {\n if (e.key === WALLET_CONNECTION_STORAGE_KEY) {\n getWalletStore().syncFromStorage();\n }\n });\n};\n","import { createLogger } from '@aztec/aztec.js/log';\nimport { createAztecNodeClient, type AztecNode } from '@aztec/aztec.js/node';\n\nconst logger = createLogger('network-service');\n\nclass NetworkServiceClass {\n private nodeClients: Map<string, AztecNode> = new Map();\n private checkPromises: Map<string, Promise<void>> = new Map();\n\n private normalizeUrl(nodeUrl: string): string {\n if (!nodeUrl) return nodeUrl;\n return nodeUrl.endsWith('/') ? nodeUrl.slice(0, -1) : nodeUrl;\n }\n\n /**\n * Get or create an AztecNode client for a given URL.\n * Clients are cached by URL.\n */\n getNodeClient(nodeUrl: string): AztecNode {\n const normalizedUrl = this.normalizeUrl(nodeUrl);\n const existing = this.nodeClients.get(normalizedUrl);\n\n if (existing) {\n return existing;\n }\n\n const client = createAztecNodeClient(normalizedUrl);\n this.nodeClients.set(normalizedUrl, client);\n logger.info(`Created AztecNode client for ${normalizedUrl}`);\n\n return client;\n }\n\n /**\n * Check if the network is available by pinging the node.\n * Deduplicates concurrent checks for the same URL.\n */\n async checkAvailability(nodeUrl: string): Promise<void> {\n const normalizedUrl = this.normalizeUrl(nodeUrl);\n\n const existingCheck = this.checkPromises.get(normalizedUrl);\n if (existingCheck) {\n return existingCheck;\n }\n\n const checkPromise = this.performCheck(normalizedUrl);\n this.checkPromises.set(normalizedUrl, checkPromise);\n\n try {\n await checkPromise;\n } finally {\n this.checkPromises.delete(normalizedUrl);\n }\n }\n\n private async performCheck(nodeUrl: string): Promise<void> {\n const client = this.getNodeClient(nodeUrl);\n const nodeInfo = await client.getNodeInfo();\n logger.info(`Network available: ${nodeUrl}`, nodeInfo);\n }\n\n /**\n * Clear cached client for a specific URL.\n */\n clearClient(nodeUrl: string): void {\n const normalizedUrl = this.normalizeUrl(nodeUrl);\n this.nodeClients.delete(normalizedUrl);\n logger.info(`Cleared node client for ${normalizedUrl}`);\n }\n\n /**\n * Clear all cached clients.\n */\n clearAll(): void {\n this.nodeClients.clear();\n logger.info('Cleared all node clients');\n }\n}\n\nexport const NetworkService = new NetworkServiceClass();\n","import type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport { WalletType } from '../../../types/aztec';\nimport type { AztecNetwork } from '../../../../config/networks/constants';\nimport type { IBrowserWalletAdapter } from '../../../../types/browserWallet';\nimport type { WalletConnectorId } from '../../../../types/walletConnector';\nimport type { SetState, GetState, WalletState } from '../types';\n\nexport const createBrowserActions = (set: SetState, get: GetState) => ({\n connectBrowserWallet: async (\n adapter: IBrowserWalletAdapter,\n networkName: AztecNetwork,\n connectorId: WalletConnectorId\n ): Promise<void> => {\n const connectWith = get()._connectWith;\n await connectWith(connectorId, async () => {\n set({\n status: 'connecting',\n error: null,\n });\n\n const accounts = await adapter.connect(networkName);\n\n const selectedAccount = accounts.length > 0 ? accounts[0] : null;\n const state = adapter.getState();\n\n let accountWallet: AccountWithSecretKey | null = null;\n if (selectedAccount) {\n try {\n accountWallet = await adapter.toAccountWallet(selectedAccount);\n } catch {\n // Ignore - accountWallet stays null\n }\n }\n\n set({\n account: accountWallet,\n walletType: WalletType.BROWSER_WALLET,\n caipAccount: selectedAccount,\n caipAccounts: accounts,\n supportedChains: state.supportedChains,\n isInstalled: state.isInstalled,\n });\n });\n },\n\n setBrowserWalletState: (\n state: Partial<\n Pick<\n WalletState,\n | 'account'\n | 'caipAccount'\n | 'caipAccounts'\n | 'supportedChains'\n | 'isInstalled'\n >\n >\n ) => {\n set(state);\n },\n});\n","import { AztecAddress } from '@aztec/aztec.js/addresses'\nimport { SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee'\nimport { Fr } from '@aztec/aztec.js/fields'\nimport { createLogger } from '@aztec/aztec.js/log'\nimport type { AztecNode } from '@aztec/aztec.js/node'\nimport { SPONSORED_FPC_SALT } from '@aztec/constants'\nimport { createStore } from '@aztec/kv-store/indexeddb'\nimport { SponsoredFPCContractArtifact } from '@aztec/noir-contracts.js/SponsoredFPC'\nimport { createPXE } from '@aztec/pxe/client/bundle'\nimport { getPXEConfig } from '@aztec/pxe/config'\nimport type { PXE } from '@aztec/pxe/server'\nimport { AVAILABLE_NETWORKS } from '../../../../config/networks'\nimport { FeePaymentRegister } from '../../../../services/aztec/feePayment/FeePaymentRegister'\nimport { MinimalWallet } from '../../../../utils/MinimalWallet'\nimport { NetworkService } from '../network'\nimport { AztecStorageService } from '../storage'\nimport type { AztecNetwork } from '../../../../config/networks/constants'\n\nconst logger = createLogger('shared-pxe-service')\nconst pxeLogger = createLogger('pxe')\nconst getProverEnabled = (networkName: AztecNetwork): boolean => {\n const networkConfig = AVAILABLE_NETWORKS.find((n) => n.name === networkName)\n if (!networkConfig) {\n throw new Error(`Network configuration not found for: ${networkName}`)\n }\n return networkConfig.proverEnabled\n}\n\nexport interface SharedPXEInstance {\n pxe: PXE\n aztecNode: AztecNode\n wallet: MinimalWallet\n storageService: AztecStorageService\n getSponsoredFeePaymentMethod: () => Promise<SponsoredFeePaymentMethod>\n}\n\ninterface PXEInstanceEntry {\n instance: SharedPXEInstance\n nodeUrl: string\n networkName: AztecNetwork\n}\n\n/**\n * SharedPXEService manages PXE instances across the application.\n * Uses singleton pattern with lazy initialization.\n */\nclass SharedPXEServiceClass {\n private instances: Map<string, PXEInstanceEntry> = new Map()\n private initPromises: Map<string, Promise<SharedPXEInstance>> = new Map()\n private cachedPaymentMethods: Map<string, SponsoredFeePaymentMethod> =\n new Map()\n private storePromises: Map<\n string,\n Promise<Awaited<ReturnType<typeof createStore>>>\n > = new Map()\n private static readonly PERSISTED_STORE_KB = 5e5 // 500MB\n private static readonly FALLBACK_STORE_KB = 1e5 // 100MB\n\n /**\n * Get or create a PXE instance for a specific network.\n * If already initializing, returns the same promise to avoid duplicate initialization.\n */\n async getInstance(\n nodeUrl: string,\n networkName: AztecNetwork,\n ): Promise<SharedPXEInstance> {\n const normalizedNodeUrl = this.normalizeNodeUrl(nodeUrl)\n const key = this.getInstanceKey(networkName)\n\n // Return existing instance if available\n const existing = this.instances.get(key)\n if (existing) {\n // Reuse if URL matches, else replace stale one for this network\n if (existing.nodeUrl === normalizedNodeUrl) {\n return existing.instance\n }\n this.clearInstance(existing.networkName)\n }\n\n // Return in-progress initialization if exists\n const initPromise = this.initPromises.get(key)\n if (initPromise) {\n return initPromise\n }\n\n // Start new initialization\n const promise = this.initializeInstance(normalizedNodeUrl, networkName, key)\n this.initPromises.set(key, promise)\n\n try {\n const instance = await promise\n return instance\n } finally {\n this.initPromises.delete(key)\n }\n }\n\n /**\n * Check if a PXE instance is initialized for a network\n */\n isInitialized(networkName: AztecNetwork): boolean {\n const key = this.getInstanceKey(networkName)\n return this.instances.has(key)\n }\n\n /**\n * Check if initialization is in progress for a network\n */\n isInitializing(networkName: AztecNetwork): boolean {\n const key = this.getInstanceKey(networkName)\n return this.initPromises.has(key)\n }\n\n /**\n * Get existing instance without initialization (returns null if not initialized)\n */\n getExistingInstance(networkName: AztecNetwork): SharedPXEInstance | null {\n const key = this.getInstanceKey(networkName)\n return this.instances.get(key)?.instance ?? null\n }\n\n /**\n * Clear a specific PXE instance (useful for network switching)\n */\n clearInstance(networkName: AztecNetwork): void {\n const key = this.getInstanceKey(networkName)\n this.instances.delete(key)\n this.cachedPaymentMethods.delete(key)\n logger.info(`Cleared PXE instance for ${networkName}`)\n }\n\n /**\n * Clear all PXE instances\n */\n clearAll(): void {\n this.instances.clear()\n this.cachedPaymentMethods.clear()\n logger.info('Cleared all PXE instances')\n }\n\n private getInstanceKey(networkName: AztecNetwork | string): string {\n return `${networkName}`\n }\n\n private getFeePaymentConfig(networkName: string) {\n const networkConfig = AVAILABLE_NETWORKS.find((n) => n.name === networkName)\n return networkConfig?.feePaymentContracts\n }\n\n private normalizeNodeUrl(nodeUrl: string): string {\n if (!nodeUrl) {\n return nodeUrl\n }\n return nodeUrl.endsWith('/') ? nodeUrl.slice(0, -1) : nodeUrl\n }\n\n private async initializeInstance(\n nodeUrl: string,\n networkName: AztecNetwork,\n key: string,\n ): Promise<SharedPXEInstance> {\n logger.info(`Initializing PXE for network: ${networkName}`)\n\n const aztecNode = NetworkService.getNodeClient(nodeUrl)\n\n // Get L1 contracts for network-specific database\n const l1Contracts = await aztecNode.getL1ContractAddresses()\n const storeName = `aztec-pxe-${networkName}`\n\n // Reuse a single store per network\n const pxeStore = await this.getOrCreateStore(networkName, storeName)\n\n const config = getPXEConfig()\n config.l1Contracts = l1Contracts\n config.proverEnabled = getProverEnabled(networkName)\n\n const pxe = await createPXE(aztecNode, config, {\n store: pxeStore,\n })\n\n const wallet = new MinimalWallet(pxe, aztecNode)\n\n // Register fee payment contracts (SponsoredFPC + any network-specific FPCs)\n const feePaymentConfig = this.getFeePaymentConfig(networkName)\n const feePaymentRegister = new FeePaymentRegister()\n await feePaymentRegister.registerAll(pxe, feePaymentConfig as any)\n\n // Initialize storage service\n const storageService = new AztecStorageService()\n\n // Register saved senders\n await this.registerSavedSenders(pxe, storageService)\n\n const nodeInfo = await aztecNode.getNodeInfo()\n logger.info(`PXE connected to ${networkName}`, nodeInfo)\n\n const instance: SharedPXEInstance = {\n pxe,\n aztecNode,\n wallet,\n storageService,\n getSponsoredFeePaymentMethod: () =>\n this.getSponsoredFeePaymentMethod(key, pxe),\n }\n\n this.instances.set(key, {\n instance,\n nodeUrl,\n networkName,\n })\n\n return instance\n }\n\n private async getOrCreateStore(\n networkName: AztecNetwork,\n storeName: string,\n ): Promise<Awaited<ReturnType<typeof createStore>>> {\n const existingPromise = this.storePromises.get(networkName)\n if (existingPromise) {\n return existingPromise\n }\n\n const createPromise = this.createPXEStoreWithFallback(storeName)\n this.storePromises.set(networkName, createPromise)\n return createPromise\n }\n\n private async createPXEStoreWithFallback(\n storeName: string,\n ): Promise<Awaited<ReturnType<typeof createStore>>> {\n try {\n return await createStore(\n storeName,\n {\n dataDirectory: 'pxe',\n dataStoreMapSizeKb: SharedPXEServiceClass.PERSISTED_STORE_KB,\n },\n undefined,\n pxeLogger,\n )\n } catch (error) {\n logger.warn(\n `Failed to create persistent PXE store (limit ${\n SharedPXEServiceClass.PERSISTED_STORE_KB\n } KB). Retrying with smaller ephemeral store.`,\n { error },\n )\n\n return await createStore(\n `${storeName}-tmp`,\n {\n dataDirectory: 'pxe-tmp',\n dataStoreMapSizeKb: SharedPXEServiceClass.FALLBACK_STORE_KB,\n },\n undefined,\n pxeLogger,\n )\n }\n }\n\n private async getSponsoredPFCContract(_pxe: PXE) {\n const { getContractInstanceFromInstantiationParams } =\n await import('@aztec/aztec.js/contracts')\n\n return await getContractInstanceFromInstantiationParams(\n SponsoredFPCContractArtifact,\n {\n salt: new Fr(SPONSORED_FPC_SALT),\n },\n )\n }\n\n private async getSponsoredFeePaymentMethod(\n key: string,\n pxe: PXE,\n ): Promise<SponsoredFeePaymentMethod> {\n const cached = this.cachedPaymentMethods.get(key)\n if (cached) {\n return cached\n }\n\n const sponsoredPFCContract = await this.getSponsoredPFCContract(pxe)\n const paymentMethod = new SponsoredFeePaymentMethod(\n sponsoredPFCContract.address,\n )\n\n this.cachedPaymentMethods.set(key, paymentMethod)\n\n return paymentMethod\n }\n\n private async registerSavedSenders(\n pxe: PXE,\n storageService: AztecStorageService,\n ): Promise<void> {\n try {\n const savedSenders = storageService.getSenders()\n\n if (savedSenders.length === 0) {\n return\n }\n\n logger.info(`Registering ${savedSenders.length} saved senders with PXE`)\n\n for (const senderAddressString of savedSenders) {\n try {\n const senderAddress = AztecAddress.fromString(senderAddressString)\n await pxe.registerSender(senderAddress)\n } catch {\n // Sender might already be registered\n logger.warn(`Failed to register sender ${senderAddressString}`)\n }\n }\n } catch (error) {\n logger.error('Error registering saved senders:', error)\n }\n }\n}\n\n// Export singleton instance\nexport const SharedPXEService = new SharedPXEServiceClass()\n","/**\n * Fee Payment Register\n *\n * Handles registration of fee payment contracts with PXE.\n */\n\nimport { MeteredContractArtifact } from '@defi-wonderland/aztec-fee-payment/artifacts'\nimport type { ContractArtifact } from '@aztec/aztec.js/abi'\nimport { AztecAddress } from '@aztec/aztec.js/addresses'\nimport { Fr } from '@aztec/aztec.js/fields'\nimport { createLogger } from '@aztec/aztec.js/log'\nimport { SPONSORED_FPC_SALT } from '@aztec/constants'\nimport { SponsoredFPCContractArtifact } from '@aztec/noir-contracts.js/SponsoredFPC'\nimport type { PXE } from '@aztec/pxe/server'\nimport type { DeployedContractConfig } from '../../../config/networks/types'\n\nconst logger = createLogger('fee-payment-register')\n\ninterface FPCConfig {\n name: string\n artifact: ContractArtifact\n salt: Fr\n deployer?: AztecAddress\n expectedAddress?: string\n}\n\ninterface RegisteredFPC {\n name: string\n address: AztecAddress\n}\n\n/**\n * Register for fee payment contracts.\n * Tracks and registers all FPCs needed by the application.\n */\nexport class FeePaymentRegister {\n private registeredFPCs: RegisteredFPC[] = []\n\n async registerAll(\n pxe: PXE,\n feePaymentConfig?: Record<string, DeployedContractConfig>,\n ): Promise<RegisteredFPC[]> {\n this.registeredFPCs = []\n\n const fpcsToRegister: FPCConfig[] = [\n {\n name: 'sponsored',\n artifact: SponsoredFPCContractArtifact,\n salt: new Fr(SPONSORED_FPC_SALT),\n },\n ]\n\n if (feePaymentConfig?.metered?.address) {\n fpcsToRegister.push({\n name: 'metered',\n artifact: MeteredContractArtifact,\n salt: Fr.fromString(feePaymentConfig.metered.salt ?? '1337'),\n deployer: feePaymentConfig.metered.deployer\n ? AztecAddress.fromString(feePaymentConfig.metered.deployer)\n : AztecAddress.ZERO,\n expectedAddress: feePaymentConfig.metered.address,\n })\n }\n\n for (const fpc of fpcsToRegister) {\n await this.registerFPC(pxe, fpc)\n }\n\n logger.info(\n `Registered ${this.registeredFPCs.length} fee payment contract(s)`,\n this.registeredFPCs.map((fpc) => fpc.name),\n )\n\n return this.registeredFPCs\n }\n\n getRegisteredFPCs(): RegisteredFPC[] {\n return [...this.registeredFPCs]\n }\n\n private async registerFPC(pxe: PXE, config: FPCConfig): Promise<void> {\n const { getContractInstanceFromInstantiationParams } =\n await import('@aztec/aztec.js/contracts')\n\n const instance = await getContractInstanceFromInstantiationParams(\n config.artifact,\n {\n salt: config.salt,\n deployer: config.deployer,\n },\n )\n\n if (config.expectedAddress) {\n const expected = AztecAddress.fromString(config.expectedAddress)\n if (!instance.address.equals(expected)) {\n logger.warn(\n `${config.name} FPC address mismatch: expected ${config.expectedAddress}, got ${instance.address.toString()}`,\n )\n }\n }\n\n await pxe.registerContract({\n instance,\n artifact: config.artifact,\n })\n\n this.registeredFPCs.push({\n name: config.name,\n address: instance.address,\n })\n\n logger.debug(`Registered ${config.name} FPC`, {\n address: instance.address.toString(),\n })\n }\n}\n","import {\n type AccountWithSecretKey,\n type Account,\n SignerlessAccount,\n} from '@aztec/aztec.js/account'\nimport { AztecAddress } from '@aztec/aztec.js/addresses'\nimport type { AztecNode } from '@aztec/aztec.js/node'\nimport type { PXE } from '@aztec/pxe/server'\nimport { BaseWallet } from '@aztec/wallet-sdk/base-wallet'\n\n/**\n * MinimalWallet extends BaseWallet to bootstrap account creation.\n * This bridges PXE to the Wallet interface required by AccountManager.\n *\n * The Aztec SDK requires a Wallet to create an AccountManager, but we need\n * to create accounts before we have a wallet. This minimal implementation\n * provides the necessary interface to bootstrap the account creation process.\n */\nexport class MinimalWallet extends BaseWallet {\n private readonly addressToAccount = new Map<string, AccountWithSecretKey>()\n\n constructor(pxe: PXE, aztecNode: AztecNode) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n super(pxe as unknown as any, aztecNode)\n }\n\n public addAccount(account: AccountWithSecretKey): void {\n this.addressToAccount.set(account.getAddress().toString(), account)\n }\n\n protected async getAccountFromAddress(\n address: AztecAddress,\n ): Promise<Account> {\n if (address.equals(AztecAddress.ZERO)) {\n return new SignerlessAccount()\n }\n\n const account = this.addressToAccount.get(address.toString())\n if (!account) {\n throw new Error(\n `Account not found in wallet for address: ${address.toString()}`,\n )\n }\n return account\n }\n\n async getAccounts(): Promise<{ alias: string; item: AztecAddress }[]> {\n return Array.from(this.addressToAccount.values()).map((acc) => ({\n alias: '',\n item: acc.getAddress(),\n }))\n }\n}\n","/**\n * Service for handling Aztec wallet storage operations\n *\n * ⚠️ SECURITY WARNING: Account keys are stored in localStorage in plain text.\n * This is suitable for TESTNET ONLY. For production apps with real funds,\n * use an external wallet provider (like Azguard).\n *\n * The embedded wallet is designed for development and demonstration purposes.\n */\nimport { IAztecStorageService, AccountData } from '../../../types/aztec';\n\nexport class AztecStorageService implements IAztecStorageService {\n private static readonly STORAGE_KEY = 'aztec-account';\n private static readonly SENDERS_STORAGE_KEY = 'aztec-senders';\n\n /**\n * Save account data to localStorage\n * ⚠️ Keys are stored in plain text - testnet only!\n */\n saveAccount(accountData: AccountData): void {\n localStorage.setItem(\n AztecStorageService.STORAGE_KEY,\n JSON.stringify(accountData)\n );\n }\n\n /**\n * Get account data from localStorage\n */\n getAccount(): AccountData | null {\n const data = localStorage.getItem(AztecStorageService.STORAGE_KEY);\n\n if (!data) {\n return null;\n }\n\n try {\n return JSON.parse(data) as AccountData;\n } catch (error) {\n console.error('Failed to parse account data:', error);\n this.clearAccount();\n return null;\n }\n }\n\n /**\n * Clear account data from localStorage\n */\n clearAccount(): void {\n localStorage.removeItem(AztecStorageService.STORAGE_KEY);\n }\n\n /**\n * Save senders array to localStorage\n */\n saveSenders(senders: string[]): void {\n localStorage.setItem(\n AztecStorageService.SENDERS_STORAGE_KEY,\n JSON.stringify(senders)\n );\n }\n\n /**\n * Get senders array from localStorage\n */\n getSenders(): string[] {\n const data = localStorage.getItem(AztecStorageService.SENDERS_STORAGE_KEY);\n if (!data) {\n return [];\n }\n try {\n return JSON.parse(data) as string[];\n } catch (error) {\n console.warn('Failed to parse saved senders:', error);\n return [];\n }\n }\n\n /**\n * Add a new sender to the stored list\n */\n addSender(sender: string): void {\n const existingSenders = this.getSenders();\n if (!existingSenders.includes(sender)) {\n existingSenders.push(sender);\n this.saveSenders(existingSenders);\n }\n }\n\n /**\n * Remove a sender from the stored list\n */\n removeSender(sender: string): void {\n const existingSenders = this.getSenders();\n const filteredSenders = existingSenders.filter((s) => s !== sender);\n this.saveSenders(filteredSenders);\n }\n\n /**\n * Clear all saved senders from localStorage\n */\n clearSenders(): void {\n localStorage.removeItem(AztecStorageService.SENDERS_STORAGE_KEY);\n }\n}\n","/**\n * EmbeddedConnector - Connector for Embedded wallets\n *\n * Uses app-managed PXE with internal signing.\n * Keys are stored locally in the browser.\n */\n\nimport type { SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';\nimport type { Wallet } from '@aztec/aztec.js/wallet';\nimport type { PXE } from '@aztec/pxe/server';\nimport { SharedPXEService } from '../services/aztec/pxe';\nimport { getNetworkStore } from '../store/network';\nimport { getWalletStore, clearSavedAccount } from '../store/wallet';\nimport { WalletType } from '../types/aztec';\nimport type {\n EmbeddedWalletConnector,\n ConnectorStatus,\n} from '../../types/walletConnector';\n\nexport const EMBEDDED_CONNECTOR_ID = 'embedded' as const;\n\n/**\n * Connector for Embedded wallets (internal signing).\n *\n * This connector uses app-managed PXE with keys stored locally.\n * All signing happens within the app.\n *\n * Reads state directly from the Zustand store.\n */\nexport class EmbeddedConnector implements EmbeddedWalletConnector {\n readonly id = EMBEDDED_CONNECTOR_ID;\n readonly label = 'Embedded Wallet';\n readonly type = WalletType.EMBEDDED;\n\n getStatus(): ConnectorStatus {\n const state = getWalletStore();\n const isThisConnector = state.walletType === WalletType.EMBEDDED;\n\n return {\n isInstalled: true,\n status: isThisConnector ? state.status : 'disconnected',\n error: isThisConnector ? state.error : null,\n };\n }\n\n getAccount() {\n const state = getWalletStore();\n return state.walletType === WalletType.EMBEDDED ? state.account : null;\n }\n\n async connect(): Promise<void> {\n const state = getWalletStore();\n if (state.walletType === WalletType.EMBEDDED && state.account) {\n return;\n }\n await state.connectEmbedded();\n }\n\n async disconnect(): Promise<void> {\n await getWalletStore().disconnect(clearSavedAccount);\n }\n\n getPXE(): PXE | null {\n const config = getNetworkStore().currentConfig;\n const instance = SharedPXEService.getExistingInstance(config.name);\n return instance?.pxe ?? null;\n }\n\n getWallet(): Wallet | null {\n const config = getNetworkStore().currentConfig;\n const instance = SharedPXEService.getExistingInstance(config.name);\n return instance?.wallet ?? null;\n }\n\n async getSponsoredFeePaymentMethod(): Promise<SponsoredFeePaymentMethod> {\n const config = getNetworkStore().currentConfig;\n const instance = SharedPXEService.getExistingInstance(config.name);\n if (!instance) {\n throw new Error('PXE not initialized');\n }\n return instance.getSponsoredFeePaymentMethod();\n }\n}\n\n/**\n * Factory function to create an Embedded connector\n */\nexport const createEmbeddedConnector = (): EmbeddedConnector => {\n return new EmbeddedConnector();\n};\n","/**\n * EVMWalletService - Core service for EVM wallet management using viem\n *\n * Supports EIP-6963 for multi-wallet discovery.\n */\n\nimport {\n createWalletClient,\n custom,\n type WalletClient,\n type Hex,\n Account,\n} from 'viem';\nimport type { EIP1193Provider } from '../../../types/evm';\n\nexport type EVMWalletListener = () => void;\n\nexport interface EVMWalletState {\n address: Hex | null;\n isConnected: boolean;\n chainId: number | null;\n connectedRdns: string | null;\n}\n\nexport class EVMWalletService {\n private walletClient: WalletClient | null = null;\n private address: Hex | null = null;\n private chainId: number | null = null;\n private connectedRdns: string | null = null;\n private listeners: Set<EVMWalletListener> = new Set();\n private isListeningToEvents = false;\n private currentProvider: EIP1193Provider | null = null;\n\n isAvailable(): boolean {\n return typeof window !== 'undefined' && !!window.ethereum;\n }\n\n isConnected(): boolean {\n return this.address !== null && this.walletClient !== null;\n }\n\n getState(): EVMWalletState {\n return {\n address: this.address,\n isConnected: this.isConnected(),\n chainId: this.chainId,\n connectedRdns: this.connectedRdns,\n };\n }\n\n getConnectedRdns(): string | null {\n return this.connectedRdns;\n }\n\n getAddress(): Hex | null {\n return this.address;\n }\n\n getWalletClient(): WalletClient | null {\n return this.walletClient;\n }\n\n /**\n * Connect to a wallet provider\n * @param provider - Specific EIP-1193 provider (from EIP-6963) or uses window.ethereum\n * @param rdns - Optional rdns identifier for the connected wallet (for multi-wallet tracking)\n */\n async connect(provider?: EIP1193Provider, rdns?: string): Promise<Hex> {\n // Disconnect any previous connection first\n if (this.currentProvider) {\n this.disconnect();\n }\n\n const ethereum = provider ?? window.ethereum;\n\n if (!ethereum) {\n throw new Error('No wallet provider found');\n }\n\n try {\n const accounts = (await ethereum.request({\n method: 'eth_requestAccounts',\n })) as Hex[];\n\n if (!accounts || accounts.length === 0) {\n throw new Error('No accounts returned from wallet');\n }\n\n const address = accounts[0];\n\n const chainIdHex = (await ethereum.request({\n method: 'eth_chainId',\n })) as string;\n const chainId = parseInt(chainIdHex, 16);\n\n this.walletClient = createWalletClient({\n account: { address } as Account,\n transport: custom(ethereum),\n });\n\n this.address = address;\n this.chainId = chainId;\n this.currentProvider = ethereum;\n this.connectedRdns = rdns ?? null;\n\n this.setupEventListeners();\n this.notifyListeners();\n\n return address;\n } catch (error) {\n // Reset state on failure (e.g., user rejected)\n this.walletClient = null;\n this.address = null;\n this.chainId = null;\n this.currentProvider = null;\n this.connectedRdns = null;\n throw error;\n }\n }\n\n disconnect(): void {\n this.removeEventListeners();\n this.walletClient = null;\n this.address = null;\n this.chainId = null;\n this.currentProvider = null;\n this.connectedRdns = null;\n this.notifyListeners();\n }\n\n async signMessage(message: string | { raw: Uint8Array }): Promise<Hex> {\n if (!this.walletClient || !this.address) {\n throw new Error('Wallet not connected');\n }\n\n return this.walletClient.signMessage({\n account: this.address,\n message,\n });\n }\n\n subscribe(listener: EVMWalletListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(): void {\n this.listeners.forEach((listener) => listener());\n }\n\n private setupEventListeners(): void {\n const provider = this.currentProvider;\n if (this.isListeningToEvents || !provider) return;\n\n provider.on('accountsChanged', this.handleAccountsChanged);\n provider.on('chainChanged', this.handleChainChanged);\n provider.on('disconnect', this.handleDisconnect);\n\n this.isListeningToEvents = true;\n }\n\n private removeEventListeners(): void {\n const provider = this.currentProvider;\n if (!this.isListeningToEvents || !provider) return;\n\n provider.removeListener('accountsChanged', this.handleAccountsChanged);\n provider.removeListener('chainChanged', this.handleChainChanged);\n provider.removeListener('disconnect', this.handleDisconnect);\n\n this.isListeningToEvents = false;\n }\n\n private handleAccountsChanged = (accounts: unknown): void => {\n const accountsArray = accounts as Hex[];\n\n if (!accountsArray || accountsArray.length === 0) {\n this.disconnect();\n return;\n }\n\n const newAddress = accountsArray[0];\n if (newAddress !== this.address) {\n this.address = newAddress;\n\n if (this.currentProvider) {\n this.walletClient = createWalletClient({\n account: { address: newAddress } as Account,\n transport: custom(this.currentProvider),\n });\n }\n\n this.notifyListeners();\n }\n };\n\n private handleChainChanged = (chainIdHex: unknown): void => {\n const newChainId = parseInt(chainIdHex as string, 16);\n\n if (newChainId !== this.chainId) {\n this.chainId = newChainId;\n this.notifyListeners();\n }\n };\n\n private handleDisconnect = (): void => {\n this.disconnect();\n };\n}\n\nlet evmWalletServiceInstance: EVMWalletService | null = null;\n\nexport const getEVMWalletService = (): EVMWalletService => {\n if (!evmWalletServiceInstance) {\n evmWalletServiceInstance = new EVMWalletService();\n }\n return evmWalletServiceInstance;\n};\n\nexport const createEVMWalletService = (): EVMWalletService => {\n return new EVMWalletService();\n};\n","/**\n * EIP-6963 Multi Wallet Discovery Service\n *\n * Discovers all injected EVM wallets using the EIP-6963 standard.\n * @see https://eips.ethereum.org/EIPS/eip-6963\n */\n\nimport type {\n EIP1193Provider,\n EIP6963ProviderDetail,\n EIP6963AnnounceProviderEvent,\n} from '../../../types/evm'\n\nexport type EIP6963Listener = (providers: EIP6963ProviderDetail[]) => void\n\nclass EIP6963Service {\n private providers: Map<string, EIP6963ProviderDetail> = new Map()\n private listeners: Set<EIP6963Listener> = new Set()\n private isDiscovering = false\n\n discover(): void {\n if (typeof window === 'undefined' || this.isDiscovering) return\n this.isDiscovering = true\n\n window.addEventListener(\n 'eip6963:announceProvider',\n this.handleAnnouncement as EventListener,\n )\n\n window.dispatchEvent(new Event('eip6963:requestProvider'))\n }\n\n private handleAnnouncement = (event: EIP6963AnnounceProviderEvent): void => {\n const { info, provider } = event.detail\n this.providers.set(info.rdns, { info, provider })\n this.notifyListeners()\n }\n\n getProviders(): EIP6963ProviderDetail[] {\n return Array.from(this.providers.values())\n }\n\n getProviderByRdns(rdns: string): EIP1193Provider | null {\n return this.providers.get(rdns)?.provider ?? null\n }\n\n getProviderInfo(rdns: string): EIP6963ProviderDetail | null {\n return this.providers.get(rdns) ?? null\n }\n\n isWalletAvailable(rdns: string): boolean {\n return this.providers.has(rdns)\n }\n\n subscribe(listener: EIP6963Listener): () => void {\n this.listeners.add(listener)\n listener(this.getProviders())\n return () => this.listeners.delete(listener)\n }\n\n private notifyListeners(): void {\n const providers = this.getProviders()\n this.listeners.forEach((listener) => listener(providers))\n }\n\n destroy(): void {\n if (typeof window === 'undefined') return\n window.removeEventListener(\n 'eip6963:announceProvider',\n this.handleAnnouncement as EventListener,\n )\n this.providers.clear()\n this.listeners.clear()\n this.isDiscovering = false\n }\n}\n\nlet eip6963ServiceInstance: EIP6963Service | null = null\n\nexport const getEIP6963Service = (): EIP6963Service => {\n if (!eip6963ServiceInstance) {\n eip6963ServiceInstance = new EIP6963Service()\n }\n return eip6963ServiceInstance\n}\n\nexport { EIP6963Service }\n","/**\n * EVMSigner - External signer implementation for EVM wallets\n *\n * Works with any EVM wallet via EIP-6963 discovery.\n * Uses personal_sign for signing Aztec transactions.\n * The user's private key never leaves the wallet.\n */\n\nimport { type Hex, keccak256, toBytes } from 'viem';\nimport type { AuthWitnessProvider } from '@aztec/aztec.js/account';\nimport type { CompleteAddress } from '@aztec/aztec.js/addresses';\nimport { getEIP6963Service } from '../services/evm/EIP6963Service';\nimport { MetaMaskAuthWitnessProvider } from './MetaMaskAuthWitnessProvider';\nimport { ExternalSignerType } from './types';\nimport {\n recoverPublicKeyFromSignature,\n getPublicKeyRecoveryMessage,\n} from './utils/evmPublicKeyRecovery';\nimport type { ExternalSigner, ECDSAPublicKey } from './types';\nimport type { EVMWalletService } from '../services/evm/EVMWalletService';\n\nexport class EVMSigner implements ExternalSigner {\n readonly type: ExternalSignerType = ExternalSignerType.EVM_WALLET;\n readonly label = 'EVM Wallet';\n readonly rdns?: string;\n\n private evmService: EVMWalletService;\n private cachedPublicKey: ECDSAPublicKey | null = null;\n private cachedSecretKey: Buffer | null = null;\n private cachedSalt: Buffer | null = null;\n\n constructor(evmService: EVMWalletService, rdns?: string) {\n this.evmService = evmService;\n this.rdns = rdns;\n }\n\n isAvailable(): boolean {\n if (this.rdns) {\n return getEIP6963Service().isWalletAvailable(this.rdns);\n }\n return this.evmService.isAvailable();\n }\n\n isConnected(): boolean {\n if (!this.evmService.isConnected()) {\n return false;\n }\n const connectedRdns = this.evmService.getConnectedRdns();\n if (!this.rdns) {\n return true;\n }\n return connectedRdns === this.rdns;\n }\n\n async connect(): Promise<void> {\n // If already connected to this specific wallet, skip\n if (this.isConnected()) {\n return;\n }\n\n // Get specific provider via EIP-6963 if rdns is set\n const provider = this.rdns\n ? getEIP6963Service().getProviderByRdns(this.rdns)\n : null;\n\n if (this.rdns && !provider) {\n console.warn(\n `[EVMSigner] Wallet ${this.rdns} not found via EIP-6963, falling back to window.ethereum`\n );\n }\n\n await this.evmService.connect(provider ?? undefined, this.rdns);\n }\n\n disconnect(): void {\n this.evmService.disconnect();\n this.clearCache();\n }\n\n getEVMAddress(): string | null {\n return this.evmService.getAddress();\n }\n\n async getPublicKey(): Promise<ECDSAPublicKey> {\n if (this.cachedPublicKey) {\n return this.cachedPublicKey;\n }\n\n const walletClient = this.evmService.getWalletClient();\n if (!walletClient) {\n throw new Error('EVM wallet client not available');\n }\n\n const address = this.evmService.getAddress();\n if (!address) {\n throw new Error('EVM wallet not connected');\n }\n\n const message = getPublicKeyRecoveryMessage(address);\n\n const signature = await walletClient.signMessage({\n account: address,\n message,\n });\n\n this.cacheSignatureDerivatives(signature, address);\n\n const publicKey = await recoverPublicKeyFromSignature(message, signature);\n this.cachedPublicKey = publicKey;\n\n return publicKey;\n }\n\n createAuthWitnessProvider(_address: CompleteAddress): AuthWitnessProvider {\n const walletClient = this.evmService.getWalletClient();\n const address = this.evmService.getAddress();\n\n if (!walletClient || !address) {\n throw new Error('EVM wallet not connected');\n }\n\n return new MetaMaskAuthWitnessProvider(walletClient, address);\n }\n\n async deriveSecretKey(): Promise<Buffer> {\n if (this.cachedSecretKey) {\n return this.cachedSecretKey;\n }\n\n await this.getPublicKey();\n\n if (!this.cachedSecretKey) {\n throw new Error('Secret key derivation failed - no signature cached');\n }\n\n return this.cachedSecretKey;\n }\n\n deriveSalt(): Buffer {\n if (this.cachedSalt) {\n return this.cachedSalt;\n }\n\n const address = this.getEVMAddress();\n if (!address) {\n throw new Error('EVM wallet not connected');\n }\n\n const addressBytes = Buffer.from(address.slice(2).padStart(64, '0'), 'hex');\n this.cachedSalt = addressBytes.slice(0, 32);\n\n return this.cachedSalt;\n }\n\n private cacheSignatureDerivatives(signature: Hex, _address: Hex): void {\n const signatureHash = keccak256(toBytes(signature));\n this.cachedSecretKey = Buffer.from(signatureHash.slice(2), 'hex');\n }\n\n private clearCache(): void {\n this.cachedPublicKey = null;\n this.cachedSecretKey = null;\n this.cachedSalt = null;\n }\n}\n\nexport const createEVMSigner = (\n evmService: EVMWalletService,\n rdns?: string\n): EVMSigner => {\n return new EVMSigner(evmService, rdns);\n};\n","import type { AuthWitnessProvider } from '@aztec/aztec.js/account';\nimport { Fr } from '@aztec/aztec.js/fields';\nimport { AuthWitness } from '@aztec/stdlib/auth-witness';\nimport type { Hex, WalletClient } from 'viem';\n\n/**\n * AuthWitnessProvider that uses MetaMask's personal_sign for creating auth witnesses.\n *\n * When createAuthWit is called:\n * 1. Converts the messageHash (Fr) to raw bytes (32 bytes)\n * 2. Calls MetaMask signMessage with those raw bytes\n * 3. MetaMask internally computes: keccak256(\"\\x19Ethereum Signed Message:\\n32\" + messageHash)\n * 4. MetaMask signs with the user's private key\n * 5. Returns the signature as the auth witness (r[32] + s[32])\n *\n * The corresponding Noir contract (EcdsaKEthSignerAccount) reconstructs the same\n * Ethereum-prefixed hash and verifies the signature.\n */\nexport class MetaMaskAuthWitnessProvider implements AuthWitnessProvider {\n private readonly walletClient: WalletClient;\n private readonly account: Hex;\n\n /**\n * Creates a new MetaMaskAuthWitnessProvider.\n *\n * @param walletClient - Viem wallet client connected to MetaMask\n * @param account - The connected Ethereum address (used for signing)\n */\n constructor(walletClient: WalletClient, account: Hex) {\n this.walletClient = walletClient;\n this.account = account;\n }\n\n /**\n * Create an auth witness by signing with MetaMask.\n *\n * @param messageHash - The outer_hash from Aztec (Poseidon hash of the action)\n * @returns AuthWitness containing the signature fields (r and s as Fr array)\n */\n async createAuthWit(messageHash: Fr): Promise<AuthWitness> {\n // Convert Fr to 32-byte buffer for MetaMask\n const messageBytes = messageHash.toBuffer();\n\n // Call MetaMask signMessage with raw bytes\n // MetaMask will prepend \"\\x19Ethereum Signed Message:\\n32\" automatically\n const signature = await this.walletClient.signMessage({\n account: this.account,\n message: { raw: messageBytes },\n });\n\n // Parse the signature (65 bytes: r[32] + s[32] + v[1])\n // Remove 0x prefix, split into r, s (we don't need v for the witness)\n const sigHex = signature.slice(2);\n const r = Buffer.from(sigHex.slice(0, 64), 'hex');\n const s = Buffer.from(sigHex.slice(64, 128), 'hex');\n\n // Convert signature bytes to Field array (64 fields, one per byte)\n // This matches how the Noir contract reads the auth witness\n const witnessFields: Fr[] = [];\n for (let i = 0; i < 32; i++) {\n witnessFields.push(new Fr(r[i]));\n }\n for (let i = 0; i < 32; i++) {\n witnessFields.push(new Fr(s[i]));\n }\n\n return new AuthWitness(messageHash, witnessFields);\n }\n}\n","import { hashMessage, recoverPublicKey, type Hex } from 'viem';\n\n/**\n * Recover the uncompressed public key from a signed message.\n *\n * This function uses Ethereum's ecrecover to extract the public key from a signature.\n * The public key can then be used to deploy an Aztec account contract.\n *\n * @param message - The original message that was signed\n * @param signature - The signature from personal_sign (65 bytes with v)\n * @returns Object with x and y coordinates (each 32 bytes)\n */\nexport async function recoverPublicKeyFromSignature(\n message: string,\n signature: Hex\n): Promise<{ x: Buffer; y: Buffer }> {\n // Hash the message the same way MetaMask does for personal_sign\n const messageHash = hashMessage(message);\n\n // recoverPublicKey returns uncompressed public key (65 bytes: 0x04 + x[32] + y[32])\n const publicKey = await recoverPublicKey({\n hash: messageHash,\n signature,\n });\n\n // Remove the 0x04 prefix (indicates uncompressed format) and split into x and y\n const pubKeyHex = publicKey.slice(4); // Remove '0x04'\n const x = Buffer.from(pubKeyHex.slice(0, 64), 'hex');\n const y = Buffer.from(pubKeyHex.slice(64, 128), 'hex');\n\n return { x, y };\n}\n\n/**\n * Standard message for public key recovery during account setup.\n *\n * Using a deterministic message that includes the EVM address ensures:\n * 1. The same EVM address always produces the same Aztec account\n * 2. Users understand what they're signing\n *\n * @param evmAddress - The connected Ethereum address\n * @returns The message to sign\n */\nexport function getPublicKeyRecoveryMessage(evmAddress: Hex): string {\n return `Sign to allow creation and inspection state of your Aztec account linked to ${evmAddress}`;\n}\n","import type { ContractArtifact } from '@aztec/aztec.js/abi';\nimport {\n BaseAccount,\n type AccountContract,\n type Account,\n type AuthWitnessProvider,\n} from '@aztec/aztec.js/account';\nimport type { CompleteAddress } from '@aztec/aztec.js/addresses';\nimport { DefaultAccountEntrypoint } from '@aztec/entrypoints/account';\n// TODO: temporary\n// import { EcdsaKEthSignerAccountContractArtifact } from '../../artifacts/EcdsaKEthSignerAccount';\n\n/**\n * AccountContract implementation for ECDSA K accounts that use\n * MetaMask's personal_sign for authentication.\n *\n * Unlike standard ECDSA accounts, this does NOT store private keys.\n * Instead, it:\n * 1. Takes the public key coordinates (x, y) during construction\n * 2. Delegates signing to an external AuthWitnessProvider (MetaMask)\n *\n * The Noir contract verifies Ethereum-style personal_sign signatures:\n * - Prepends \"\\x19Ethereum Signed Message:\\n32\" to the outer_hash\n * - Computes keccak256 of the prefixed message\n * - Verifies secp256k1 ECDSA signature against this hash\n */\nexport class EcdsaKEthSignerAccountContract implements AccountContract {\n private readonly publicKeyX: Buffer;\n private readonly publicKeyY: Buffer;\n private readonly authWitnessProvider: AuthWitnessProvider;\n\n /**\n * Creates a new EcdsaKEthSignerAccountContract.\n *\n * @param publicKeyX - The x coordinate of the secp256k1 public key (32 bytes)\n * @param publicKeyY - The y coordinate of the secp256k1 public key (32 bytes)\n * @param authWitnessProvider - External provider that calls MetaMask for signing\n */\n constructor(\n publicKeyX: Buffer,\n publicKeyY: Buffer,\n authWitnessProvider: AuthWitnessProvider\n ) {\n if (publicKeyX.length !== 32 || publicKeyY.length !== 32) {\n throw new Error('Public key coordinates must be 32 bytes each');\n }\n this.publicKeyX = publicKeyX;\n this.publicKeyY = publicKeyY;\n this.authWitnessProvider = authWitnessProvider;\n }\n\n /**\n * Returns the contract artifact for deployment.\n */\n getContractArtifact(): Promise<ContractArtifact> {\n return Promise.resolve(null as unknown as ContractArtifact);\n // return Promise.resolve(EcdsaKEthSignerAccountContractArtifact);\n }\n\n /**\n * Returns the initialization function and its arguments.\n * The constructor takes the public key coordinates as u8 arrays.\n */\n async getInitializationFunctionAndArgs(): Promise<{\n constructorName: string;\n constructorArgs: unknown[];\n }> {\n return {\n constructorName: 'constructor',\n constructorArgs: [\n Array.from(this.publicKeyX), // Convert Buffer to number array for Noir\n Array.from(this.publicKeyY),\n ],\n };\n }\n\n /**\n * Returns the account for creating tx requests.\n */\n getAccount(address: CompleteAddress): Account {\n const authWitnessProvider = this.getAuthWitnessProvider(address);\n return new BaseAccount(\n new DefaultAccountEntrypoint(address.address, authWitnessProvider),\n authWitnessProvider,\n address\n );\n }\n\n /**\n * Returns the auth witness provider.\n * This delegates to MetaMask for signing.\n */\n getAuthWitnessProvider(_address: CompleteAddress): AuthWitnessProvider {\n return this.authWitnessProvider;\n }\n}\n","/**\n * ExternalSignerConnector - Connector for External Signer wallets\n *\n * Uses app-managed PXE with external signing (MetaMask, WalletConnect, etc.)\n * Self-contained: creates and manages its own signer internally.\n */\n\nimport type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport type { SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';\nimport type { Wallet } from '@aztec/aztec.js/wallet';\nimport type { PXE } from '@aztec/pxe/server';\nimport { SharedPXEService } from '../services/aztec/pxe';\nimport { getEVMWalletService } from '../services/evm';\nimport { createEVMSigner } from '../signers';\nimport { getNetworkStore } from '../store/network';\nimport { getWalletStore } from '../store/wallet';\nimport { WalletType, ExternalSignerType } from '../types/aztec';\nimport type {\n ExternalSignerWalletConnector,\n ConnectorStatus,\n} from '../../types/walletConnector';\nimport type { ExternalSigner } from '../signers/types';\n\ninterface ExternalSignerConnectorConfig {\n id?: string;\n label?: string;\n signerType: ExternalSignerType;\n rdns?: string;\n}\n\n/**\n * Connector for External Signer wallets (MetaMask, WalletConnect, etc.)\n *\n * This connector uses app-managed PXE with external signing.\n * The external wallet only signs transactions - all Aztec logic runs in the app.\n *\n * Creates its own signer internally using EVMWalletService singleton.\n */\nexport class ExternalSignerConnector implements ExternalSignerWalletConnector {\n readonly id: string;\n readonly label: string;\n readonly type = WalletType.EXTERNAL_SIGNER;\n readonly signerType: ExternalSignerType;\n readonly rdns?: string;\n\n // Signer created lazily on first access\n private _signer: ExternalSigner | null = null;\n\n constructor(config: ExternalSignerConnectorConfig) {\n this.signerType = config.signerType;\n this.id = config.id ?? `external-${config.signerType}`;\n this.label = config.label ?? this.getDefaultLabel(config.signerType);\n this.rdns = config.rdns;\n }\n\n private getDefaultLabel(signerType: ExternalSignerType): string {\n switch (signerType) {\n case ExternalSignerType.EVM_WALLET:\n return 'EVM Wallet';\n default:\n return 'External Wallet';\n }\n }\n\n /**\n * Get or create the signer for this connector.\n * Creates lazily using the EVMWalletService singleton.\n */\n private getSigner(): ExternalSigner {\n if (!this._signer) {\n if (this.signerType !== ExternalSignerType.EVM_WALLET) {\n throw new Error(`Unknown signer type: ${this.signerType}`);\n }\n const evmService = getEVMWalletService();\n this._signer = createEVMSigner(evmService, this.rdns);\n }\n return this._signer;\n }\n\n getStatus(): ConnectorStatus {\n const state = getWalletStore();\n const isExternalSigner = state.walletType === WalletType.EXTERNAL_SIGNER;\n const isThisConnectorConnected =\n isExternalSigner && state.connectedRdns === this.rdns;\n\n const status =\n isExternalSigner && !isThisConnectorConnected\n ? 'disconnected'\n : isExternalSigner\n ? state.status\n : 'disconnected';\n\n const signer = this.getSigner();\n\n return {\n isInstalled: signer.isAvailable(),\n status,\n error: isThisConnectorConnected ? state.error : null,\n };\n }\n\n getAccount(): AccountWithSecretKey | null {\n const state = getWalletStore();\n // Only return account if this connector's rdns matches the connected one\n if (\n state.walletType === WalletType.EXTERNAL_SIGNER &&\n state.connectedRdns === this.rdns\n ) {\n return state.account;\n }\n return null;\n }\n\n async connect(): Promise<void> {\n const signer = this.getSigner();\n await getWalletStore().connectExternalSigner(signer, this.id);\n }\n\n async disconnect(): Promise<void> {\n const signer = this._signer;\n await getWalletStore().disconnect(() => {\n if (signer) {\n signer.disconnect();\n }\n this._signer = null;\n });\n }\n\n getPXE(): PXE | null {\n const config = getNetworkStore().currentConfig;\n const instance = SharedPXEService.getExistingInstance(config.name);\n return instance?.pxe ?? null;\n }\n\n getWallet(): Wallet | null {\n const config = getNetworkStore().currentConfig;\n const instance = SharedPXEService.getExistingInstance(config.name);\n return instance?.wallet ?? null;\n }\n\n async getSponsoredFeePaymentMethod(): Promise<SponsoredFeePaymentMethod> {\n const config = getNetworkStore().currentConfig;\n const instance = SharedPXEService.getExistingInstance(config.name);\n if (!instance) {\n throw new Error('PXE not initialized');\n }\n return instance.getSponsoredFeePaymentMethod();\n }\n}\n","/**\n * Base error class for wallet service operations\n */\nexport class WalletServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly cause?: unknown\n ) {\n super(message);\n this.name = 'WalletServiceError';\n }\n}\n\n/**\n * Error thrown when PXE initialization fails\n */\nexport class PXEInitError extends WalletServiceError {\n constructor(message: string, cause?: unknown) {\n super(message, 'PXE_INIT_FAILED', cause);\n this.name = 'PXEInitError';\n }\n}\n\n/**\n * Error thrown when account creation fails\n */\nexport class AccountCreationError extends WalletServiceError {\n constructor(message: string, cause?: unknown) {\n super(message, 'ACCOUNT_CREATION_FAILED', cause);\n this.name = 'AccountCreationError';\n }\n}\n\n/**\n * Error thrown when account deployment fails\n */\nexport class AccountDeploymentError extends WalletServiceError {\n constructor(message: string, cause?: unknown) {\n super(message, 'ACCOUNT_DEPLOYMENT_FAILED', cause);\n this.name = 'AccountDeploymentError';\n }\n}\n\n/**\n * Error thrown when loading existing account fails\n */\nexport class AccountLoadError extends WalletServiceError {\n constructor(message: string, cause?: unknown) {\n super(message, 'ACCOUNT_LOAD_FAILED', cause);\n this.name = 'AccountLoadError';\n }\n}\n\n/**\n * Error thrown when external signer connection fails\n */\nexport class SignerConnectionError extends WalletServiceError {\n constructor(message: string, cause?: unknown) {\n super(message, 'SIGNER_CONNECTION_FAILED', cause);\n this.name = 'SignerConnectionError';\n }\n}\n\n/**\n * Error thrown when no saved account is found\n */\nexport class NoSavedAccountError extends WalletServiceError {\n constructor() {\n super('No saved account found', 'NO_SAVED_ACCOUNT');\n this.name = 'NoSavedAccountError';\n }\n}\n","import { AztecAddress } from '@aztec/aztec.js/addresses';\nimport type { AccountManager } from '@aztec/aztec.js/wallet';\nimport { TxStatus } from '@aztec/stdlib/tx';\nimport { AccountDeploymentError } from './errors';\nimport type { SharedPXEInstance } from '../aztec/pxe';\n\nexport interface DeployAccountOptions {\n /** Timeout in seconds for deployment transaction */\n timeout?: number;\n /** Skip class publication during deployment */\n skipClassPublication?: boolean;\n /** Skip instance publication during deployment */\n skipInstancePublication?: boolean;\n}\n\nexport interface DeployAccountResult {\n /** Whether the account was deployed (false if already initialized) */\n deployed: boolean;\n /** Account address */\n address: AztecAddress;\n}\n\nconst DEFAULT_OPTIONS: Required<DeployAccountOptions> = {\n timeout: 120,\n skipClassPublication: false,\n skipInstancePublication: false,\n};\n\n/**\n * Deploy an account contract if not already initialized.\n * Uses sponsored fee payment method for gas-free deployment.\n *\n * @param accountManager - The AccountManager instance\n * @param pxeInstance - SharedPXE instance with wallet and fee methods\n * @param options - Deployment options\n * @returns Deployment result with status and address\n * @throws AccountDeploymentError if deployment fails\n */\nexport async function deployAccountIfNotExists(\n accountManager: AccountManager,\n pxeInstance: SharedPXEInstance,\n options: DeployAccountOptions = {}\n): Promise<DeployAccountResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const accountAddress = accountManager.address;\n\n try {\n console.log('[deploy-account] Checking contract metadata...');\n const metadata =\n await pxeInstance.wallet.getContractMetadata(accountAddress);\n console.log(\n '[deploy-account] Contract initialized:',\n metadata.isContractInitialized\n );\n\n if (metadata.isContractInitialized) {\n return { deployed: false, address: accountAddress };\n }\n\n console.log('[deploy-account] Getting deploy method...');\n const deployMethod = await accountManager.getDeployMethod();\n console.log('[deploy-account] Getting sponsored fee payment method...');\n const paymentMethod = await pxeInstance.getSponsoredFeePaymentMethod();\n console.log('[deploy-account] Sending deploy tx...');\n\n await deployMethod.send({\n from: AztecAddress.ZERO,\n fee: { paymentMethod },\n skipClassPublication: opts.skipClassPublication,\n skipInstancePublication: opts.skipInstancePublication,\n wait: { timeout: opts.timeout, waitForStatus: TxStatus.PROPOSED },\n });\n\n console.log('[deploy-account] Deploy tx confirmed');\n return { deployed: true, address: accountAddress };\n } catch (cause) {\n console.error(\n '[deploy-account] Deployment failed:',\n cause instanceof Error ? cause.message : cause\n );\n throw new AccountDeploymentError(\n `Failed to deploy account at ${accountAddress.toString()}`,\n cause\n );\n }\n}\n","import { EcdsaRAccountContract } from '@aztec/accounts/ecdsa/lazy';\nimport type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport { Fr } from '@aztec/aztec.js/fields';\nimport { AccountManager } from '@aztec/aztec.js/wallet';\nimport { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';\nimport {\n getConfiguredAccountCredentials,\n hasConfiguredCredentials,\n} from '../../../utils/accountCredentials';\nimport { SharedPXEService, type SharedPXEInstance } from '../aztec/pxe';\nimport {\n deployAccountIfNotExists,\n type DeployAccountResult,\n} from './deployAccount';\nimport {\n AccountCreationError,\n AccountLoadError,\n NoSavedAccountError,\n PXEInitError,\n} from './errors';\nimport type { NetworkConfig } from '../../../config/networks/types';\nimport type { AccountCredentials } from '../../types/aztec';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CreateEmbeddedAccountResult {\n account: AccountWithSecretKey;\n pxeInstance: SharedPXEInstance;\n deployment: DeployAccountResult;\n credentials: StoredAccountData;\n}\n\nexport interface LoadEmbeddedAccountResult {\n account: AccountWithSecretKey;\n pxeInstance: SharedPXEInstance;\n}\n\nexport interface StoredAccountData {\n address: string;\n signingKey: string;\n secretKey: string;\n salt: string;\n}\n\n// ============================================================================\n// Storage helpers\n// ============================================================================\n\nconst STORAGE_KEY = 'aztec-embedded-account';\n\nexport const getSavedAccount = (): StoredAccountData | null => {\n try {\n const data = localStorage.getItem(STORAGE_KEY);\n return data ? JSON.parse(data) : null;\n } catch {\n return null;\n }\n};\n\nexport const saveAccount = (data: StoredAccountData): void => {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n } catch {\n // Ignore storage errors\n }\n};\n\nexport const clearSavedAccount = (): void => {\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch {\n // Ignore\n }\n};\n\nexport const hasSavedEmbeddedAccount = (): boolean => {\n if (hasConfiguredCredentials()) {\n return true;\n }\n return getSavedAccount() !== null;\n};\n\n// ============================================================================\n// Account creation service\n// ============================================================================\n\n/**\n * Create a new embedded wallet account.\n * Generates fresh credentials, registers the account with PXE, and deploys if needed.\n *\n * @param networkConfig - Network configuration with node URL\n * @returns Created account, PXE instance, deployment status, and credentials\n * @throws PXEInitError if PXE initialization fails\n * @throws AccountCreationError if account creation fails\n */\nexport async function createEmbeddedAccount(\n networkConfig: NetworkConfig\n): Promise<CreateEmbeddedAccountResult> {\n let pxeInstance: SharedPXEInstance;\n\n console.log('[embedded-account] Starting account creation...');\n\n try {\n console.log('[embedded-account] Initializing PXE...');\n pxeInstance = await SharedPXEService.getInstance(\n networkConfig.nodeUrl,\n networkConfig.name\n );\n console.log('[embedded-account] PXE initialized');\n } catch (cause) {\n console.error('[embedded-account] PXE init failed:', cause);\n throw new PXEInitError(\n `Failed to initialize PXE for network ${networkConfig.name}`,\n cause\n );\n }\n\n try {\n const wallet = pxeInstance.wallet;\n\n // Generate fresh credentials\n console.log('[embedded-account] Generating credentials...');\n const salt = Fr.random();\n const secretKey = await poseidon2Hash([Fr.random()]);\n const signingKey = Buffer.from(secretKey.toBuffer().subarray(0, 32));\n console.log('[embedded-account] Credentials generated');\n\n // Create account manager\n console.log('[embedded-account] Creating AccountManager...');\n const accountContract = new EcdsaRAccountContract(signingKey);\n const accountManager = await AccountManager.create(\n wallet,\n secretKey,\n accountContract,\n salt\n );\n console.log(\n '[embedded-account] AccountManager created, address:',\n accountManager.address.toString()\n );\n\n // Get account and register with PXE\n console.log('[embedded-account] Getting account...');\n const account = await accountManager.getAccount();\n console.log('[embedded-account] Getting instance and artifact...');\n const instance = accountManager.getInstance();\n const artifact = await accountManager\n .getAccountContract()\n .getContractArtifact();\n console.log('[embedded-account] Registering contract with PXE...');\n await wallet.registerContract(\n instance,\n artifact,\n accountManager.getSecretKey()\n );\n wallet.addAccount(account);\n console.log('[embedded-account] Account registered with PXE');\n\n // Deploy if needed (don't throw on deployment failure)\n // Use a hard timeout because send() simulation can hang indefinitely\n // and the SDK's wait.timeout only applies after the tx is actually sent.\n const DEPLOY_HARD_TIMEOUT_MS = 90_000;\n let deployment: DeployAccountResult;\n try {\n console.log('[embedded-account] Starting account deployment...');\n deployment = await Promise.race([\n deployAccountIfNotExists(accountManager, pxeInstance),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error('Account deployment timed out')),\n DEPLOY_HARD_TIMEOUT_MS\n )\n ),\n ]);\n console.log(\n '[embedded-account] Deployment result:',\n deployment.deployed ? 'deployed' : 'already initialized'\n );\n } catch (err) {\n console.warn(\n '[embedded-account] Deployment failed or timed out, continuing without deployment:',\n err instanceof Error ? err.message : err\n );\n deployment = { deployed: false, address: accountManager.address };\n }\n\n // Prepare credentials for storage\n const credentials: StoredAccountData = {\n address: accountManager.address.toString(),\n signingKey: signingKey.toString('hex'),\n secretKey: secretKey.toString(),\n salt: salt.toString(),\n };\n\n console.log('[embedded-account] Account creation complete');\n return { account, pxeInstance, deployment, credentials };\n } catch (cause) {\n console.error(\n '[embedded-account] Account creation failed:',\n cause instanceof Error ? cause.message : cause\n );\n if (cause instanceof PXEInitError) throw cause;\n throw new AccountCreationError('Failed to create embedded account', cause);\n }\n}\n\n// ============================================================================\n// Account loading service\n// ============================================================================\n\n/**\n * Load an existing embedded account from saved credentials or environment config.\n *\n * @param networkConfig - Network configuration with node URL\n * @returns Loaded account and PXE instance\n * @throws PXEInitError if PXE initialization fails\n * @throws NoSavedAccountError if no saved account exists\n * @throws AccountLoadError if loading fails\n */\nexport async function loadExistingEmbeddedAccount(\n networkConfig: NetworkConfig\n): Promise<LoadEmbeddedAccountResult> {\n let pxeInstance: SharedPXEInstance;\n\n try {\n pxeInstance = await SharedPXEService.getInstance(\n networkConfig.nodeUrl,\n networkConfig.name\n );\n } catch (cause) {\n throw new PXEInitError(\n `Failed to initialize PXE for network ${networkConfig.name}`,\n cause\n );\n }\n\n // Try environment credentials first\n const envCredentials = await getConfiguredAccountCredentials();\n if (envCredentials) {\n try {\n const account = await connectWithCredentials(envCredentials, pxeInstance);\n return { account, pxeInstance };\n } catch (cause) {\n throw new AccountLoadError(\n 'Failed to load account from environment credentials',\n cause\n );\n }\n }\n\n // Try saved credentials\n const saved = getSavedAccount();\n if (saved) {\n try {\n const credentials: AccountCredentials = {\n secretKey: Fr.fromString(saved.secretKey),\n signingKey: Buffer.from(saved.signingKey, 'hex'),\n salt: Fr.fromString(saved.salt),\n };\n const account = await connectWithCredentials(credentials, pxeInstance);\n return { account, pxeInstance };\n } catch (cause) {\n throw new AccountLoadError(\n 'Failed to load account from saved credentials',\n cause\n );\n }\n }\n\n throw new NoSavedAccountError();\n}\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\nasync function connectWithCredentials(\n credentials: AccountCredentials,\n pxeInstance: SharedPXEInstance\n): Promise<AccountWithSecretKey> {\n const wallet = pxeInstance.wallet;\n const accountContract = new EcdsaRAccountContract(credentials.signingKey);\n const accountManager = await AccountManager.create(\n wallet,\n credentials.secretKey,\n accountContract,\n credentials.salt\n );\n\n const account = await accountManager.getAccount();\n const instance = accountManager.getInstance();\n const artifact = await accountManager\n .getAccountContract()\n .getContractArtifact();\n await wallet.registerContract(\n instance,\n artifact,\n accountManager.getSecretKey()\n );\n wallet.addAccount(account);\n\n // Deploy account if not yet initialized (e.g., sandbox was restarted)\n // Hard timeout to prevent simulation from hanging indefinitely\n const DEPLOY_HARD_TIMEOUT_MS = 90_000;\n try {\n await Promise.race([\n deployAccountIfNotExists(accountManager, pxeInstance),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error('Account deployment timed out')),\n DEPLOY_HARD_TIMEOUT_MS\n )\n ),\n ]);\n } catch (err) {\n console.warn(\n '[embedded-account] Deployment failed or timed out:',\n err instanceof Error ? err.message : err\n );\n // Non-fatal: account may still work if already deployed\n }\n\n return account;\n}\n","import { Fr } from '@aztec/aztec.js/fields';\nimport type { AccountCredentials } from '../types/aztec';\n\n/**\n * Normalize hex string by removing 0x prefix if present\n */\nconst normalizeHex = (value: string): string => {\n return value.startsWith('0x') ? value.slice(2) : value;\n};\n\n/**\n * Create account credentials from an explicit secret key.\n * SigningKey is derived as the first 32 bytes of secretKey.\n */\nconst createFromSecretKey = (\n secretKeyHex: string,\n salt: string\n): AccountCredentials => {\n const secretKey = Fr.fromString(secretKeyHex);\n const signingKeyBuffer = Buffer.from(\n normalizeHex(secretKeyHex).slice(0, 64),\n 'hex'\n );\n\n return {\n secretKey,\n signingKey: signingKeyBuffer,\n salt: Fr.fromString(salt),\n };\n};\n\n/**\n * Check if account credentials are configured in environment variables.\n * Stub - always returns false in SDK context.\n */\nexport const hasConfiguredCredentials = (): boolean => {\n return false;\n};\n\n/**\n * Get account credentials from environment variables.\n * Stub - always returns null in SDK context.\n */\nexport const getConfiguredAccountCredentials =\n async (): Promise<AccountCredentials | null> => {\n return null;\n };\n\n/**\n * Create account credentials from a secret key and salt.\n * Utility function for SDK consumers.\n */\nexport const createAccountCredentials = (\n secretKeyHex: string,\n salt: string | Fr\n): AccountCredentials => {\n return createFromSecretKey(\n secretKeyHex,\n typeof salt === 'string' ? salt : salt.toString()\n );\n};\n","import type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport { Fr } from '@aztec/aztec.js/fields';\nimport { AccountManager } from '@aztec/aztec.js/wallet';\nimport { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';\nimport { EcdsaKEthSignerAccountContract } from '../../signers/EcdsaKEthSignerAccountContract';\nimport { SharedPXEService, type SharedPXEInstance } from '../aztec/pxe';\nimport {\n deployAccountIfNotExists,\n type DeployAccountResult,\n} from './deployAccount';\nimport {\n AccountCreationError,\n PXEInitError,\n SignerConnectionError,\n} from './errors';\nimport type { NetworkConfig } from '../../../config/networks/types';\nimport type { ExternalSigner } from '../../signers/types';\nimport type { ExternalSignerType } from '../../types/aztec';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CreateExternalSignerAccountResult {\n account: AccountWithSecretKey;\n pxeInstance: SharedPXEInstance;\n deployment: DeployAccountResult;\n signerType: ExternalSignerType;\n rdns: string | null;\n}\n\n// ============================================================================\n// Account creation service\n// ============================================================================\n\n/**\n * Create an account using an external signer (e.g., MetaMask).\n * Connects to the signer, derives keys, and deploys the account if needed.\n *\n * @param signer - External signer instance\n * @param networkConfig - Network configuration with node URL\n * @returns Created account, PXE instance, deployment status, and signer info\n * @throws SignerConnectionError if signer connection fails\n * @throws PXEInitError if PXE initialization fails\n * @throws AccountCreationError if account creation fails\n */\nexport async function createExternalSignerAccount(\n signer: ExternalSigner,\n networkConfig: NetworkConfig\n): Promise<CreateExternalSignerAccountResult> {\n // Connect signer if not connected\n if (!signer.isConnected()) {\n try {\n await signer.connect();\n } catch (cause) {\n throw new SignerConnectionError(\n `Failed to connect to ${signer.label} signer`,\n cause\n );\n }\n }\n\n // Initialize PXE\n let pxeInstance: SharedPXEInstance;\n try {\n pxeInstance = await SharedPXEService.getInstance(\n networkConfig.nodeUrl,\n networkConfig.name\n );\n } catch (cause) {\n throw new PXEInitError(\n `Failed to initialize PXE for network ${networkConfig.name}`,\n cause\n );\n }\n\n try {\n // Get public key from signer\n const { x, y } = await signer.getPublicKey();\n\n // Create auth witness provider for transaction signing\n const authWitnessProvider = signer.createAuthWitnessProvider(\n {} as Parameters<typeof signer.createAuthWitnessProvider>[0]\n );\n\n // Create account contract with signer's public key\n const accountContract = new EcdsaKEthSignerAccountContract(\n x,\n y,\n authWitnessProvider\n );\n\n // Derive secret key and salt from signer\n const secretKeyBuffer = await signer.deriveSecretKey();\n const secretKey = await poseidon2Hash([Fr.fromBuffer(secretKeyBuffer)]);\n const salt = Fr.fromBuffer(signer.deriveSalt());\n\n // Create account manager\n const wallet = pxeInstance.wallet;\n const accountManager = await AccountManager.create(\n wallet,\n secretKey,\n accountContract,\n salt\n );\n\n // Get account and register with PXE\n const account = await accountManager.getAccount();\n const instance = accountManager.getInstance();\n const artifact = await accountManager\n .getAccountContract()\n .getContractArtifact();\n await wallet.registerContract(\n instance,\n artifact,\n accountManager.getSecretKey()\n );\n wallet.addAccount(account);\n\n // Deploy if needed (don't throw on deployment failure)\n let deployment: DeployAccountResult;\n try {\n deployment = await deployAccountIfNotExists(accountManager, pxeInstance);\n } catch {\n // Account created but deployment failed - still usable\n deployment = { deployed: false, address: accountManager.address };\n }\n\n return {\n account,\n pxeInstance,\n deployment,\n signerType: signer.type,\n rdns: signer.rdns ?? null,\n };\n } catch (cause) {\n if (\n cause instanceof PXEInitError ||\n cause instanceof SignerConnectionError\n ) {\n throw cause;\n }\n throw new AccountCreationError(\n `Failed to create account with ${signer.label} signer`,\n cause\n );\n }\n}\n","import type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport { EMBEDDED_CONNECTOR_ID } from '../../../connectors';\nimport {\n createEmbeddedAccount,\n loadExistingEmbeddedAccount,\n saveAccount,\n hasSavedEmbeddedAccount,\n clearSavedAccount,\n NoSavedAccountError,\n} from '../../../services/wallet';\nimport { WalletType } from '../../../types/aztec';\nimport { getNetworkStore } from '../../network';\nimport type { WalletConnectorId } from '../../../../types/walletConnector';\nimport type { SetState, GetState } from '../types';\n\nexport const createEmbeddedActions = (set: SetState, get: GetState) => ({\n connectEmbedded: async (\n connectorId: WalletConnectorId = EMBEDDED_CONNECTOR_ID\n ): Promise<AccountWithSecretKey> => {\n const connectWith = get()._connectWith;\n return connectWith(connectorId, async () => {\n set({\n status: 'connecting',\n error: null,\n pxeError: null,\n });\n\n const config = getNetworkStore().currentConfig;\n\n const result = await createEmbeddedAccount(config);\n\n // Save credentials\n saveAccount(result.credentials);\n\n if (result.deployment.deployed) {\n set({ status: 'deploying' });\n }\n\n set({\n account: result.account,\n walletType: WalletType.EMBEDDED,\n pxeStatus: 'ready',\n });\n\n return result.account;\n });\n },\n\n connectExistingEmbedded: async (\n connectorId: WalletConnectorId = EMBEDDED_CONNECTOR_ID\n ): Promise<AccountWithSecretKey | null> => {\n const connectWith = get()._connectWith;\n return connectWith(connectorId, async () => {\n set({\n status: 'connecting',\n error: null,\n pxeError: null,\n });\n\n const config = getNetworkStore().currentConfig;\n\n try {\n const result = await loadExistingEmbeddedAccount(config);\n\n set({\n account: result.account,\n walletType: WalletType.EMBEDDED,\n status: 'connected',\n pxeStatus: 'ready',\n });\n\n return result.account;\n } catch (error) {\n if (error instanceof NoSavedAccountError) {\n set({\n status: 'disconnected',\n pxeStatus: 'idle',\n pxeError: null,\n });\n return null;\n }\n throw error;\n }\n });\n },\n\n hasSavedEmbeddedAccount,\n});\n\nexport { clearSavedAccount };\n","import type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport { createExternalSignerAccount } from '../../../services/wallet';\nimport { WalletType } from '../../../types/aztec';\nimport { getNetworkStore } from '../../network';\nimport type { WalletConnectorId } from '../../../../types/walletConnector';\nimport type { ExternalSigner } from '../../../signers/types';\nimport type { SetState, GetState } from '../types';\n\nexport const createExternalSignerActions = (set: SetState, get: GetState) => ({\n connectExternalSigner: async (\n signer: ExternalSigner,\n connectorId?: WalletConnectorId\n ): Promise<AccountWithSecretKey> => {\n const connectWith = get()._connectWith;\n return connectWith(connectorId ?? signer.rdns ?? 'external', async () => {\n set({\n status: 'connecting',\n error: null,\n pxeError: null,\n });\n\n const config = getNetworkStore().currentConfig;\n\n const result = await createExternalSignerAccount(signer, config);\n\n if (result.deployment.deployed) {\n set({ status: 'deploying' });\n }\n\n set({\n account: result.account,\n walletType: WalletType.EXTERNAL_SIGNER,\n signerType: result.signerType,\n connectedRdns: result.rdns,\n pxeStatus: 'ready',\n });\n\n return result.account;\n });\n },\n});\n","import type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport type { AztecNetwork } from '../../../config/networks/constants';\nimport type { IBrowserWalletAdapter } from '../../../types/browserWallet';\nimport type {\n ConnectionStatus,\n WalletConnector,\n WalletConnectorId,\n} from '../../../types/walletConnector';\nimport type { ExternalSigner } from '../../signers/types';\nimport type { ExternalSignerType, WalletType } from '../../types/aztec';\n\nexport type PXEStatus = 'idle' | 'initializing' | 'ready' | 'error';\nexport type NetworkStatus = 'idle' | 'checking' | 'available' | 'error';\n\n/**\n * Valid PXE state transitions:\n * - idle → initializing (starting PXE init)\n * - initializing → ready (PXE init success)\n * - initializing → error (PXE init failed)\n * - ready → idle (disconnect/reset)\n * - error → idle (disconnect/reset)\n * - error → initializing (retry)\n */\nexport const VALID_PXE_TRANSITIONS: Record<PXEStatus, PXEStatus[]> = {\n idle: ['initializing'],\n initializing: ['ready', 'error'],\n ready: ['idle'],\n error: ['idle', 'initializing'],\n};\n\nexport const isValidPXETransition = (\n from: PXEStatus,\n to: PXEStatus\n): boolean => {\n if (from === to) return true;\n return VALID_PXE_TRANSITIONS[from]?.includes(to) ?? false;\n};\n\nexport type WalletState = {\n // Core state (always relevant)\n account: AccountWithSecretKey | null;\n walletType: WalletType | null;\n status: ConnectionStatus;\n error: string | null;\n\n // Network availability check\n networkStatus: NetworkStatus;\n networkError: string | null;\n\n // PXE initialization flags (services stay in singleton)\n pxeStatus: PXEStatus;\n pxeError: string | null;\n\n // ExternalSigner-specific (only read when walletType === EXTERNAL_SIGNER)\n signerType: ExternalSignerType | null;\n connectedRdns: string | null;\n\n // BrowserWallet-specific (only read when walletType === BROWSER_WALLET)\n caipAccount: string | null;\n caipAccounts: string[];\n supportedChains: string[];\n isInstalled: boolean;\n\n // Connector management\n connectors: WalletConnector[];\n activeConnectorId: WalletConnectorId | null;\n connectingConnectorId: WalletConnectorId | null;\n};\n\nexport type WalletActions = {\n _connectWith: <T>(\n connectorId: WalletConnectorId,\n run: (connector: WalletConnector) => Promise<T>\n ) => Promise<T>;\n _disconnectWith: (cleanup?: () => Promise<void> | void) => Promise<void>;\n // Connector management\n setConnectors: (connectors: WalletConnector[]) => void;\n connect: (connectorId: WalletConnectorId) => Promise<void>;\n\n // Embedded\n connectEmbedded: (\n connectorId?: WalletConnectorId\n ) => Promise<AccountWithSecretKey>;\n connectExistingEmbedded: (\n connectorId?: WalletConnectorId\n ) => Promise<AccountWithSecretKey | null>;\n hasSavedEmbeddedAccount: () => boolean;\n\n // External Signer\n connectExternalSigner: (\n signer: ExternalSigner,\n connectorId?: WalletConnectorId\n ) => Promise<AccountWithSecretKey>;\n\n // Browser Wallet\n connectBrowserWallet: (\n adapter: IBrowserWalletAdapter,\n networkName: AztecNetwork,\n connectorId: WalletConnectorId\n ) => Promise<void>;\n setBrowserWalletState: (\n state: Partial<\n Pick<\n WalletState,\n | 'account'\n | 'caipAccount'\n | 'caipAccounts'\n | 'supportedChains'\n | 'isInstalled'\n >\n >\n ) => void;\n\n // Shared\n disconnect: (cleanup?: () => Promise<void> | void) => Promise<void>;\n setError: (error: string | null) => void;\n setNetworkStatus: (status: NetworkStatus, error?: string | null) => void;\n setPXEStatus: (status: PXEStatus, error?: string | null) => void;\n checkNetwork: () => Promise<void>;\n reset: () => void;\n syncFromStorage: () => Promise<void>;\n};\n\nexport type WalletStore = WalletState & WalletActions;\n\n// Helper types for action creators\nexport type SetState = (\n partial: Partial<WalletStore> | ((state: WalletStore) => Partial<WalletStore>)\n) => void;\n\nexport type GetState = () => WalletStore;\n","/**\n * BrowserWalletConnector - Connector for Browser Wallet extensions\n *\n * Uses external PXE (browser extension manages everything).\n * Supports any wallet that implements IBrowserWalletAdapter.\n * Self-contained: handles adapter initialization and event listeners internally.\n */\n\nimport type { AccountWithSecretKey } from '@aztec/aztec.js/account';\nimport { getNetworkStore } from '../store/network';\nimport { getWalletStore } from '../store/wallet';\nimport { WalletType } from '../types/aztec';\nimport type {\n IBrowserWalletAdapter,\n BrowserWalletAdapterFactory,\n BrowserWalletOperation,\n BrowserWalletOperationResult,\n SendTransactionOp,\n ContractCall,\n AuthwitAction,\n ConnectorTransactionAction,\n} from '../../types/browserWallet';\nimport type {\n BrowserWalletConnector as IBrowserWalletConnector,\n ConnectorStatus,\n ConnectorTransactionRequest,\n ConnectorTransactionResult,\n} from '../../types/walletConnector';\nimport type { CaipAccount } from '@azguardwallet/types';\n\nconst toAdapterAction = (\n action: ConnectorTransactionAction\n): ContractCall | AuthwitAction => {\n if (\n action.kind === 'add_private_authwit' ||\n action.kind === 'add_public_authwit'\n ) {\n return action\n }\n return {\n kind: 'call',\n contract: action.contract,\n method: action.method,\n args: action.args,\n }\n};\n\ninterface BrowserWalletConnectorConfig {\n id: string;\n label: string;\n adapterFactory: BrowserWalletAdapterFactory;\n}\n\n/**\n * Connector for Browser Wallet extensions (Azguard, Obsidian, etc.)\n *\n * These wallets have their own PXE running in the extension.\n * We communicate via the adapter interface.\n * Initializes eagerly on construction for immediate \"installed\" status.\n */\nexport class BrowserWalletConnector implements IBrowserWalletConnector {\n readonly id: string;\n readonly label: string;\n readonly type = WalletType.BROWSER_WALLET;\n readonly adapterFactory: BrowserWalletAdapterFactory;\n\n private _adapter: IBrowserWalletAdapter | null = null;\n private _initPromise: Promise<void> | null = null;\n // Guards async account hydration to avoid stale updates; not related to crypto tokens\n private latestAccountChangeMarker: symbol | null = null;\n\n constructor(config: BrowserWalletConnectorConfig) {\n this.id = config.id;\n this.label = config.label;\n this.adapterFactory = config.adapterFactory;\n\n // Start initialization immediately (eager init for \"installed\" badge)\n void this.ensureInitialized().catch((error) => {\n // Swallow to avoid unhandled rejection; installation status will remain false\n console.warn(\n `[BrowserWalletConnector:${this.id}] initialize failed`,\n error\n );\n });\n }\n\n /**\n * Get or create the adapter instance.\n * Async to support dynamic imports for the adapter factory.\n */\n async getAdapter(): Promise<IBrowserWalletAdapter> {\n if (!this._adapter) {\n this._adapter = await this.adapterFactory();\n }\n return this._adapter;\n }\n\n /**\n * Initialize the adapter and set up event listeners.\n * Called automatically in constructor (eager init).\n */\n private async initialize(): Promise<void> {\n const adapter = await this.getAdapter();\n\n await adapter.initialize();\n const state = adapter.getState();\n\n getWalletStore().setBrowserWalletState({\n isInstalled: state.isInstalled,\n supportedChains: state.supportedChains,\n });\n\n // Set up event listeners\n adapter.onAccountsChanged(async (accounts) => {\n const updateMarker = Symbol('accountsChanged');\n this.latestAccountChangeMarker = updateMarker;\n\n const selectedAccount = accounts.length > 0 ? accounts[0] : null;\n const store = getWalletStore();\n\n store.setBrowserWalletState({\n caipAccounts: accounts,\n caipAccount: selectedAccount,\n });\n\n if (selectedAccount) {\n try {\n const accountWallet = await adapter.toAccountWallet(selectedAccount);\n if (this.latestAccountChangeMarker !== updateMarker) {\n return;\n }\n getWalletStore().setBrowserWalletState({ account: accountWallet });\n } catch {\n if (this.latestAccountChangeMarker !== updateMarker) {\n return;\n }\n getWalletStore().setBrowserWalletState({ account: null });\n }\n } else {\n getWalletStore().setBrowserWalletState({ account: null });\n }\n });\n\n adapter.onDisconnected(async () => {\n await getWalletStore().disconnect();\n });\n }\n\n /**\n * Ensure initialization is in-flight or completed.\n * Safe to call multiple times; reinitializes after destroy().\n */\n private ensureInitialized(): Promise<void> {\n if (!this._initPromise) {\n this._initPromise = this.initialize().catch((error) => {\n // Reset so a later retry can occur\n this._initPromise = null;\n throw error;\n });\n }\n return this._initPromise;\n }\n\n /**\n * Clean up adapter resources.\n */\n destroy(): void {\n if (this._adapter) {\n this._adapter.destroy();\n this._adapter = null;\n this._initPromise = null;\n }\n }\n\n getStatus(): ConnectorStatus {\n const state = getWalletStore();\n const isBrowserWallet = state.walletType === WalletType.BROWSER_WALLET;\n\n // Check installation from adapter if not yet connected\n const adapter = this._adapter;\n const isInstalled = isBrowserWallet\n ? state.isInstalled\n : (adapter?.getState().isInstalled ?? false);\n\n return {\n isInstalled,\n status: isBrowserWallet ? state.status : 'disconnected',\n error: isBrowserWallet ? state.error : null,\n };\n }\n\n getAccount(): AccountWithSecretKey | null {\n const state = getWalletStore();\n if (state.walletType === WalletType.BROWSER_WALLET) {\n return state.account;\n }\n return null;\n }\n\n getCaipAccount(): CaipAccount | null {\n const state = getWalletStore();\n if (state.walletType === WalletType.BROWSER_WALLET) {\n return state.caipAccount as CaipAccount | null;\n }\n return null;\n }\n\n async connect(): Promise<void> {\n await this.ensureInitialized();\n\n const adapter = await this.getAdapter();\n const config = getNetworkStore().currentConfig;\n await getWalletStore().connectBrowserWallet(adapter, config.name, this.id);\n }\n\n async disconnect(): Promise<void> {\n const adapter = this._adapter;\n await getWalletStore().disconnect(async () => {\n if (adapter) {\n await adapter.disconnect();\n adapter.destroy();\n }\n this._adapter = null;\n this._initPromise = null;\n });\n }\n\n async sendTransaction(\n request: ConnectorTransactionRequest\n ): Promise<ConnectorTransactionResult> {\n const state = getWalletStore();\n const account = state.caipAccount;\n const chain = state.supportedChains[0] ?? '';\n\n if (!account) {\n throw new Error('No account selected');\n }\n\n const operation: SendTransactionOp = {\n kind: 'send_transaction',\n account,\n chain,\n calls: request.actions.map(toAdapterAction),\n };\n\n const result = await this.executeOperation(operation);\n\n if (result.status !== 'ok') {\n const message =\n 'error' in result && result.error ? result.error : 'Transaction failed';\n return {\n status: 'failed',\n error: message,\n };\n }\n\n return {\n status: 'success',\n txHash: typeof result.result === 'string' ? result.result : undefined,\n rawResult: result.result,\n };\n }\n\n /**\n * Execute a single operation and return the result directly.\n * Throws if no result is returned.\n */\n async executeOperation(\n operation: BrowserWalletOperation\n ): Promise<BrowserWalletOperationResult> {\n const adapter = await this.getAdapter();\n const results = await adapter.executeOperations([operation]);\n\n if (!results.length) {\n throw new Error('No result returned from wallet operation');\n }\n\n return results[0];\n }\n}\n","import type { EmbeddedGroupConfig } from '../types';\n\n/**\n * Default labels for wallet groups\n */\nexport const DEFAULT_LABELS = {\n embedded: 'Embedded Wallet',\n aztecWallets: 'Aztec Wallet',\n evmWallets: 'EVM Wallet',\n} as const;\n\n/**\n * Default modal configuration\n */\nexport const DEFAULT_MODAL_CONFIG = {\n title: 'Connect Wallet',\n subtitle:\n 'Choose how you want to connect. Each option offers a different balance of convenience and security.',\n} as const;\n\n/**\n * Default embedded wallet configuration\n */\nexport const DEFAULT_EMBEDDED_CONFIG: EmbeddedGroupConfig = {\n label: DEFAULT_LABELS.embedded,\n enabled: true,\n};\n","import type { WalletIconProps } from './types';\n\nexport const MetaMaskIcon = ({\n size,\n className,\n ...props\n}: WalletIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 318.6 318.6\"\n width={size}\n height={size}\n className={className}\n {...props}\n >\n <style>\n {`.st1,.st6{fill:#e4761b;stroke:#e4761b;stroke-linecap:round;stroke-linejoin:round}.st6{fill:#f6851b;stroke:#f6851b}`}\n </style>\n <path\n fill=\"#e2761b\"\n stroke=\"#e2761b\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m274.1 35.5-99.5 73.9L193 65.8z\"\n />\n <path\n d=\"m44.4 35.5 98.7 74.6-17.5-44.3zm193.9 171.3-26.5 40.6 56.7 15.6 16.3-55.3zm-204.4.9L50.1 263l56.7-15.6-26.5-40.6z\"\n className=\"st1\"\n />\n <path\n d=\"m103.6 138.2-15.8 23.9 56.3 2.5-2-60.5zm111.3 0-39-34.8-1.3 61.2 56.2-2.5zM106.8 247.4l33.8-16.5-29.2-22.8zm71.1-16.5 33.9 16.5-4.7-39.3z\"\n className=\"st1\"\n />\n <path\n fill=\"#d7c1b3\"\n stroke=\"#d7c1b3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m211.8 247.4-33.9-16.5 2.7 22.1-.3 9.3zm-105 0 31.5 14.9-.2-9.3 2.5-22.1z\"\n />\n <path\n fill=\"#233447\"\n stroke=\"#233447\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m138.8 193.5-28.2-8.3 19.9-9.1zm40.9 0 8.3-17.4 20 9.1z\"\n />\n <path\n fill=\"#cd6116\"\n stroke=\"#cd6116\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m106.8 247.4 4.8-40.6-31.3.9zM207 206.8l4.8 40.6 26.5-39.7zm23.8-44.7-56.2 2.5 5.2 28.9 8.3-17.4 20 9.1zm-120.2 23.1 20-9.1 8.2 17.4 5.3-28.9-56.3-2.5z\"\n />\n <path\n fill=\"#e4751f\"\n stroke=\"#e4751f\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m87.8 162.1 23.6 46-.8-22.9zm120.3 23.1-1 22.9 23.7-46zm-64-20.6-5.3 28.9 6.6 34.1 1.5-44.9zm30.5 0-2.7 18 1.2 45 6.7-34.1z\"\n />\n <path\n d=\"m179.8 193.5-6.7 34.1 4.8 3.3 29.2-22.8 1-22.9zm-69.2-8.3.8 22.9 29.2 22.8 4.8-3.3-6.6-34.1z\"\n className=\"st6\"\n />\n <path\n fill=\"#c0ad9e\"\n stroke=\"#c0ad9e\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m180.3 262.3.3-9.3-2.5-2.2h-37.7l-2.3 2.2.2 9.3-31.5-14.9 11 9 22.3 15.5h38.3l22.4-15.5 11-9z\"\n />\n <path\n fill=\"#161616\"\n stroke=\"#161616\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m177.9 230.9-4.8-3.3h-27.7l-4.8 3.3-2.5 22.1 2.3-2.2h37.7l2.5 2.2z\"\n />\n <path\n fill=\"#763d16\"\n stroke=\"#763d16\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m278.3 114.2 8.5-40.8-12.7-37.9-96.2 71.4 37 31.3 52.3 15.3 11.6-13.5-5-3.6 8-7.3-6.2-4.8 8-6.1zM31.8 73.4l8.5 40.8-5.4 4 8 6.1-6.1 4.8 8 7.3-5 3.6 11.5 13.5 52.3-15.3 37-31.3-96.2-71.4z\"\n />\n <path\n d=\"m267.2 153.5-52.3-15.3 15.9 23.9-23.7 46 31.2-.4h46.5zm-163.6-15.3-52.3 15.3-17.4 54.2h46.4l31.1.4-23.6-46zm71 26.4 3.3-57.7 15.2-41.1h-67.5l15 41.1 3.5 57.7 1.2 18.2.1 44.8h27.7l.2-44.8z\"\n className=\"st6\"\n />\n </svg>\n);\n","import type { WalletIconProps } from './types';\n\nexport const RabbyIcon = ({ size, className, ...props }: WalletIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"70 50 370 370\"\n width={size}\n height={size}\n className={className}\n fill=\"none\"\n {...props}\n >\n <defs>\n <linearGradient\n id=\"rabby-paint0\"\n x1=\"195.972\"\n y1=\"199.97\"\n x2=\"398.584\"\n y2=\"257.233\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#8697FF\" />\n <stop offset=\"1\" stopColor=\"#ABB7FF\" />\n </linearGradient>\n <linearGradient\n id=\"rabby-paint1\"\n x1=\"364.383\"\n y1=\"196.107\"\n x2=\"217.769\"\n y2=\"49.628\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#8697FF\" />\n <stop offset=\"1\" stopColor=\"#5156D8\" stopOpacity=\"0\" />\n </linearGradient>\n <linearGradient\n id=\"rabby-paint2\"\n x1=\"288.926\"\n y1=\"278.313\"\n x2=\"148.327\"\n y2=\"197.75\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#465EED\" />\n <stop offset=\"1\" stopColor=\"#8697FF\" stopOpacity=\"0\" />\n </linearGradient>\n <linearGradient\n id=\"rabby-paint3\"\n x1=\"208.062\"\n y1=\"198.453\"\n x2=\"303.333\"\n y2=\"319.098\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#8898FF\" />\n <stop offset=\"0.983895\" stopColor=\"#6277F1\" />\n </linearGradient>\n </defs>\n <path\n d=\"M400.96 222.806C412.465 197.018 355.59 124.972 301.254 94.9561C267.005 71.7031 231.317 74.8977 224.089 85.1075C208.227 107.514 276.614 126.5 322.35 148.655C312.518 152.94 303.253 160.628 297.805 170.461C280.755 151.783 243.331 135.699 199.418 148.655C169.826 157.386 145.233 177.969 135.728 209.057C133.418 208.028 130.861 207.455 128.171 207.455C117.883 207.455 109.543 215.823 109.543 226.146C109.543 236.468 117.883 244.836 128.171 244.836C130.077 244.836 136.04 243.553 136.04 243.553L231.317 244.246C193.214 304.897 163.101 313.763 163.101 324.271C163.101 334.778 191.914 331.931 202.732 328.014C254.521 309.265 310.145 250.83 319.69 234.009C359.773 239.027 393.459 239.62 400.96 222.806Z\"\n fill=\"url(#rabby-paint0)\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M322.345 148.658C322.348 148.659 322.35 148.66 322.353 148.661C324.473 147.824 324.13 144.682 323.548 142.215C322.21 136.545 299.125 113.672 277.448 103.428C247.909 89.4683 226.157 90.188 222.944 96.622C228.961 108.996 256.855 120.613 285.989 132.746C298.418 137.923 311.073 143.193 322.35 148.656C322.349 148.657 322.347 148.657 322.345 148.658Z\"\n fill=\"url(#rabby-paint1)\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M284.861 273.194C278.887 270.903 272.139 268.802 264.467 266.895C272.647 252.208 274.364 230.467 266.638 216.72C255.796 197.429 242.186 187.161 210.56 187.161C193.166 187.161 146.333 193.039 145.502 232.267C145.414 236.382 145.499 240.155 145.796 243.623L231.317 244.245C219.788 262.597 208.99 276.208 199.536 286.558C210.887 289.476 220.253 291.926 228.852 294.175C237.012 296.31 244.48 298.263 252.297 300.264C264.089 291.644 275.174 282.245 284.861 273.194Z\"\n fill=\"url(#rabby-paint2)\"\n />\n <path\n d=\"M134.586 239.593C138.08 269.392 154.959 281.07 189.448 284.526C223.938 287.982 243.721 285.664 270.06 288.068C292.058 290.076 311.7 301.324 318.986 297.437C325.544 293.939 321.875 281.301 313.101 273.192C301.726 262.682 285.984 255.374 258.284 252.781C263.805 237.616 262.258 216.352 253.684 204.783C241.288 188.056 218.407 180.493 189.448 183.797C159.193 187.25 130.202 202.195 134.586 239.593Z\"\n fill=\"url(#rabby-paint3)\"\n />\n </svg>\n);\n","import type { WalletIconProps } from './types'\n\nexport const AzguardIcon = ({ size, className, ...props }: WalletIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 40 40\"\n width={size}\n height={size}\n className={className}\n fill=\"none\"\n {...props}\n >\n <g clipPath=\"url(#azguard-clip)\">\n <path\n d=\"M0 19.2C0 12.4794 0 9.11906 1.30792 6.55211C2.4584 4.29417 4.29417 2.4584 6.55211 1.30792C9.11906 0 12.4794 0 19.2 0H20.8C27.5206 0 30.8809 0 33.4479 1.30792C35.7058 2.4584 37.5416 4.29417 38.6921 6.55211C40 9.11906 40 12.4794 40 19.2V20.8C40 27.5206 40 30.8809 38.6921 33.4479C37.5416 35.7058 35.7058 37.5416 33.4479 38.6921C30.8809 40 27.5206 40 20.8 40H19.2C12.4794 40 9.11906 40 6.55211 38.6921C4.29417 37.5416 2.4584 35.7058 1.30792 33.4479C0 30.8809 0 27.5206 0 20.8V19.2Z\"\n fill=\"#007AFF\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M20.514 0L21.3797 13.4728L28.3822 0.140515C28.6779 0.161799 28.9625 0.186306 29.2369 0.214526L23.9005 14.5932L37.0989 4.17626C37.2308 4.32971 37.3589 4.48656 37.4831 4.64668L25.7469 16.6404L39.935 13.0222C39.9466 13.3238 39.9561 13.6358 39.964 13.959L26.5996 19.2603L40 20.9442C40 21.2946 40 21.6358 39.9997 21.9681L26.3112 22H26L38.2462 34.2462C37.0925 36.1388 35.4334 37.6804 33.4479 38.6921C30.8809 40 27.5206 40 20.8 40H20V22V16L14 22H13.6888H0.00030146C4.2275e-05 21.6676 5.2804e-06 21.3263 0 20.9758L13.4003 19.2603L0.0360435 13.959C0.043874 13.6359 0.0534058 13.3238 0.0650083 13.0222L14.253 16.6404L2.51691 4.64668C2.64107 4.48656 2.76919 4.32971 2.90113 4.17627L16.0995 14.5932L10.7631 0.214528C11.0375 0.186307 11.3221 0.1618 11.6177 0.140516L18.6203 13.4728L19.486 0H20.514Z\"\n fill=\"white\"\n />\n </g>\n <defs>\n <clipPath id=\"azguard-clip\">\n <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n","/**\n * Wallet Presets Registry\n *\n * Pre-configured wallet definitions that developers can reference by ID.\n * This simplifies the config - devs just pass ['metamask', 'rabby'] instead of full configs.\n */\n\nimport { MetaMaskIcon, RabbyIcon, AzguardIcon } from '../assets/icons';\nimport type { IBrowserWalletAdapter } from '../../types/browserWallet';\nimport type { IconType } from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface EVMWalletPreset {\n id: string;\n name: string;\n icon: IconType;\n rdns: string;\n}\n\nexport interface AztecWalletPreset {\n id: string;\n name: string;\n icon: IconType;\n /** Lazy adapter factory - only imported when needed (async for dynamic imports) */\n getAdapter: () => Promise<IBrowserWalletAdapter>;\n /** Check if wallet extension is installed (optional, async) */\n checkInstalled?: () => Promise<boolean>;\n}\n\n// =============================================================================\n// EVM Wallet Presets\n// =============================================================================\n\nexport const EVM_WALLET_PRESETS: Record<string, EVMWalletPreset> = {\n metamask: {\n id: 'metamask',\n name: 'MetaMask',\n icon: MetaMaskIcon,\n rdns: 'io.metamask',\n },\n rabby: {\n id: 'rabby',\n name: 'Rabby',\n icon: RabbyIcon,\n rdns: 'io.rabby',\n },\n};\n\n// =============================================================================\n// Aztec Wallet Presets\n// =============================================================================\n\nexport const AZTEC_WALLET_PRESETS: Record<string, AztecWalletPreset> = {\n azguard: {\n id: 'azguard',\n name: 'Azguard',\n icon: AzguardIcon,\n getAdapter: async () => {\n // Dynamic import to avoid bundling if not used (ESM-compatible)\n const { AzguardAdapter } = await import('../adapters/azguard');\n return new AzguardAdapter();\n },\n checkInstalled: async () => {\n const { AzguardClient } = await import('@azguardwallet/client');\n return AzguardClient.isAzguardInstalled();\n },\n },\n // Add more Aztec wallets as they become available:\n // obsidian: {\n // id: 'obsidian',\n // name: 'Obsidian',\n // icon: ObsidianIcon, // Use icon component\n // getAdapter: () => {\n // const { ObsidianAdapter } = require('../../adapters/obsidian');\n // return new ObsidianAdapter();\n // },\n // checkInstalled: async () => {\n // // Check for window.obsidian or similar\n // return typeof window !== 'undefined' && 'obsidian' in window;\n // },\n // },\n};\n\n// =============================================================================\n// Helper functions\n// =============================================================================\n\n/**\n * Get EVM wallet preset by ID\n */\nexport function getEVMWalletPreset(id: string): EVMWalletPreset | undefined {\n return EVM_WALLET_PRESETS[id];\n}\n\n/**\n * Get Aztec wallet preset by ID\n */\nexport function getAztecWalletPreset(\n id: string\n): AztecWalletPreset | undefined {\n return AZTEC_WALLET_PRESETS[id];\n}\n\n/**\n * Get all available EVM wallet IDs\n */\nexport function getAvailableEVMWalletIds(): string[] {\n return Object.keys(EVM_WALLET_PRESETS);\n}\n\n/**\n * Get all available Aztec wallet IDs\n */\nexport function getAvailableAztecWalletIds(): string[] {\n return Object.keys(AZTEC_WALLET_PRESETS);\n}\n\n// =============================================================================\n// Type helpers for config\n// =============================================================================\n\n/** Known EVM wallet IDs */\nexport type EVMWalletId = keyof typeof EVM_WALLET_PRESETS;\n\n/** Known Aztec wallet IDs */\nexport type AztecWalletId = keyof typeof AZTEC_WALLET_PRESETS;\n","import { isStringArray } from '../../utils';\nimport { BrowserWalletConnector } from '../connectors/BrowserWalletConnector';\nimport { createEmbeddedConnector } from '../connectors/EmbeddedConnector';\nimport { ExternalSignerConnector } from '../connectors/ExternalSignerConnector';\nimport { ExternalSignerType } from '../types/aztec';\nimport {\n DEFAULT_LABELS,\n DEFAULT_MODAL_CONFIG,\n DEFAULT_EMBEDDED_CONFIG,\n} from './defaults';\nimport {\n getAztecWalletPreset,\n getEVMWalletPreset,\n AZTEC_WALLET_PRESETS,\n} from './walletPresets';\nimport type { ConnectorFactory } from '../connectors/registry';\nimport type {\n AztecWalletConfig,\n AztecBrowserWalletConfig,\n AztecWalletsGroupConfig,\n EmbeddedGroupConfig,\n EVMWalletConfig,\n EVMWalletsGroupConfig,\n ResolvedAztecWalletConfig,\n} from '../types';\n\n/**\n * Check if value is a full group config (has 'wallets' property)\n */\nfunction isFullGroupConfig(\n value: unknown\n): value is { wallets: unknown[]; label?: string } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'wallets' in value &&\n Array.isArray((value as { wallets: unknown }).wallets)\n );\n}\n\n/**\n * Resolve EVM wallet IDs to full wallet configs\n */\nfunction resolveEVMWallets(ids: string[]): EVMWalletConfig[] {\n const wallets: EVMWalletConfig[] = [];\n\n for (const id of ids) {\n const preset = getEVMWalletPreset(id);\n if (preset) {\n wallets.push({\n id: preset.id,\n name: preset.name,\n icon: preset.icon,\n rdns: preset.rdns,\n });\n } else {\n console.warn(\n `AztecWallet: Unknown EVM wallet \"${id}\". Available: metamask, rabby`\n );\n }\n }\n\n return wallets;\n}\n\n/**\n * Resolve Aztec wallet IDs to full wallet configs\n */\nfunction resolveAztecWallets(ids: string[]): AztecBrowserWalletConfig[] {\n const wallets: AztecBrowserWalletConfig[] = [];\n\n for (const id of ids) {\n const preset = getAztecWalletPreset(id);\n if (preset) {\n wallets.push({\n id: preset.id,\n name: preset.name,\n icon: preset.icon,\n adapter: preset.getAdapter,\n checkInstalled: preset.checkInstalled,\n });\n } else {\n const available = Object.keys(AZTEC_WALLET_PRESETS).join(', ');\n console.warn(\n `AztecWallet: Unknown Aztec wallet \"${id}\". Available: ${available}`\n );\n }\n }\n\n return wallets;\n}\n\n/**\n * Create connector factories from resolved wallet groups.\n * This is called internally by createAztecWalletConfig.\n */\nfunction createConnectorsFromWalletGroups(walletGroups: {\n embedded: EmbeddedGroupConfig | false;\n aztecWallets: AztecWalletsGroupConfig | false;\n evmWallets: EVMWalletsGroupConfig | false;\n}): ConnectorFactory[] {\n const connectors: ConnectorFactory[] = [];\n\n // Add embedded connector\n if (walletGroups.embedded !== false) {\n connectors.push(createEmbeddedConnector);\n }\n\n // Add EVM wallet connectors (external signers)\n if (walletGroups.evmWallets !== false) {\n for (const wallet of walletGroups.evmWallets.wallets) {\n connectors.push(\n () =>\n new ExternalSignerConnector({\n id: wallet.id,\n label: wallet.name,\n signerType: ExternalSignerType.EVM_WALLET,\n rdns: wallet.rdns,\n })\n );\n }\n }\n\n // Add Aztec browser wallet connectors\n if (walletGroups.aztecWallets !== false) {\n for (const wallet of walletGroups.aztecWallets.wallets) {\n const preset = AZTEC_WALLET_PRESETS[wallet.id];\n if (preset) {\n connectors.push(\n () =>\n new BrowserWalletConnector({\n id: wallet.id,\n label: wallet.name,\n adapterFactory: preset.getAdapter,\n })\n );\n }\n }\n }\n\n return connectors;\n}\n\n/**\n * Create an AztecWallet configuration with defaults applied\n *\n * Supports both simple and advanced configuration formats.\n *\n * @param config - User configuration\n * @returns Resolved configuration with all defaults applied\n *\n * @example Simple config (recommended)\n * ```ts\n * const config = createAztecWalletConfig({\n * networks: [{ name: 'devnet', nodeUrl: '...' }],\n * walletGroups: {\n * embedded: true,\n * evmWallets: ['metamask', 'rabby'],\n * aztecWallets: ['azguard'],\n * },\n * });\n * ```\n *\n * @example Advanced config (custom wallets)\n * ```ts\n * const config = createAztecWalletConfig({\n * networks: [{ name: 'devnet', nodeUrl: '...' }],\n * walletGroups: {\n * embedded: { label: 'Create Account' },\n * evmWallets: {\n * label: 'Connect EVM',\n * wallets: [{ id: 'custom', name: 'Custom', icon: '...', rdns: '...' }],\n * },\n * },\n * });\n * ```\n */\nexport function createAztecWalletConfig(\n config: AztecWalletConfig\n): ResolvedAztecWalletConfig {\n const { walletGroups } = config;\n\n // Resolve embedded config\n // Accepts: true, false, or { label?: string, enabled?: boolean }\n let resolvedEmbedded: ResolvedAztecWalletConfig['walletGroups']['embedded'];\n if (walletGroups.embedded === false) {\n resolvedEmbedded = false;\n } else if (walletGroups.embedded === true || !walletGroups.embedded) {\n resolvedEmbedded = { ...DEFAULT_EMBEDDED_CONFIG };\n } else {\n resolvedEmbedded = {\n ...DEFAULT_EMBEDDED_CONFIG,\n ...walletGroups.embedded,\n };\n }\n\n // Resolve Aztec wallets config\n // Accepts: false, ['azguard'], or { label?: string, wallets: [...] }\n let resolvedAztecWallets: AztecWalletsGroupConfig | false;\n if (walletGroups.aztecWallets === false || !walletGroups.aztecWallets) {\n resolvedAztecWallets = false;\n } else if (isStringArray(walletGroups.aztecWallets)) {\n // Simple config: ['azguard', 'obsidian']\n const wallets = resolveAztecWallets(walletGroups.aztecWallets);\n resolvedAztecWallets =\n wallets.length > 0\n ? { label: DEFAULT_LABELS.aztecWallets, wallets }\n : false;\n } else if (isFullGroupConfig(walletGroups.aztecWallets)) {\n // Full config: { label: '...', wallets: [...] }\n resolvedAztecWallets = {\n label: walletGroups.aztecWallets.label ?? DEFAULT_LABELS.aztecWallets,\n wallets: walletGroups.aztecWallets.wallets,\n };\n } else {\n resolvedAztecWallets = false;\n }\n\n // Resolve EVM wallets config\n // Accepts: false, ['metamask', 'rabby'], or { label?: string, wallets: [...] }\n let resolvedEvmWallets: EVMWalletsGroupConfig | false;\n if (walletGroups.evmWallets === false || !walletGroups.evmWallets) {\n resolvedEvmWallets = false;\n } else if (isStringArray(walletGroups.evmWallets)) {\n // Simple config: ['metamask', 'rabby']\n const wallets = resolveEVMWallets(walletGroups.evmWallets);\n resolvedEvmWallets =\n wallets.length > 0\n ? { label: DEFAULT_LABELS.evmWallets, wallets }\n : false;\n } else if (isFullGroupConfig(walletGroups.evmWallets)) {\n // Full config: { label: '...', wallets: [...] }\n resolvedEvmWallets = {\n label: walletGroups.evmWallets.label ?? DEFAULT_LABELS.evmWallets,\n wallets: walletGroups.evmWallets.wallets,\n };\n } else {\n resolvedEvmWallets = false;\n }\n\n const resolvedWalletGroups: ResolvedAztecWalletConfig['walletGroups'] = {\n embedded: resolvedEmbedded,\n aztecWallets: resolvedAztecWallets,\n evmWallets: resolvedEvmWallets,\n };\n\n // Auto-create connectors from wallet groups\n const connectors = createConnectorsFromWalletGroups(resolvedWalletGroups);\n\n return {\n ...config,\n defaultNetwork: config.defaultNetwork ?? config.networks[0]?.name,\n modal: {\n ...DEFAULT_MODAL_CONFIG,\n ...config.modal,\n },\n walletGroups: resolvedWalletGroups,\n connectors,\n };\n}\n","/**\n * Network Presets Registry\n *\n * Default icons and display names for known networks.\n * Users can override these in their config.\n */\n\nimport type { ComponentType } from 'react'\nimport { Globe, FlaskConical, Box, Rocket } from 'lucide-react'\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface NetworkPresetDefaults {\n /** Default display name */\n displayName: string\n /** Default icon component */\n icon: any\n}\n\n// =============================================================================\n// Network Presets\n// =============================================================================\n\nexport const NETWORK_PRESETS: Record<string, NetworkPresetDefaults> = {\n devnet: {\n displayName: 'Devnet',\n icon: Globe,\n },\n sandbox: {\n displayName: 'Local Network',\n icon: FlaskConical,\n },\n testnet: {\n displayName: 'Testnet',\n icon: Box,\n },\n mainnet: {\n displayName: 'Mainnet',\n icon: Rocket,\n },\n}\n\n// =============================================================================\n// Helper functions\n// =============================================================================\n\n/**\n * Get network preset defaults by name\n */\nexport function getNetworkPreset(\n name: string,\n): NetworkPresetDefaults | undefined {\n return NETWORK_PRESETS[name.toLowerCase()]\n}\n\n/**\n * Get the icon for a network (from config or preset defaults)\n */\nexport function getNetworkIcon(\n name: string,\n configIcon?: string | ComponentType<{ className?: string; size?: number }>,\n): ComponentType<any> | string {\n // Use config icon if provided\n if (configIcon) {\n return configIcon\n }\n\n // Fall back to preset icon\n const preset = getNetworkPreset(name)\n if (preset) {\n return preset.icon\n }\n\n // Default to Globe icon\n return Globe\n}\n\n/**\n * Get the display name for a network (from config or preset defaults)\n */\nexport function getNetworkDisplayName(\n name: string,\n configDisplayName?: string,\n): string {\n // Use config display name if provided\n if (configDisplayName) {\n return configDisplayName\n }\n\n // Fall back to preset display name\n const preset = getNetworkPreset(name)\n if (preset) {\n return preset.displayName\n }\n\n // Fall back to capitalized name\n return name.charAt(0).toUpperCase() + name.slice(1)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAQa,cAkCA,WAwBA,kBAYA;AA9Eb;AAAA;AAAA;AAQO,IAAM,eAAe;AAAA,MAC1B,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AA+BO,IAAM,YAAgD;AAAA,MAC3D,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAqBO,IAAM,mBAAmC,OAAO,OAAO,SAAS;AAYhE,IAAM,aAAa,CAAC,YAAkC;AAC3D,aAAO,UAAU,OAAuB,KAAK,UAAU;AAAA,IACzD;AAAA;AAAA;;;AChFA,IAAAA,mBA6Ba;AA7Bb;AAAA;AAAA;AAAA,IAAAA,oBAA6B;AA6BtB,IAAM,uBAAuB,CAAC,gBAAsC;AACzE,YAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,YAAM,YAAY,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM;AACrD,YAAM,aAAa,YAAY,MAAM,CAAC,IAAI;AAG1C,UAAI,WAAW,WAAW,IAAI;AAC5B,eAAO,+BAAa,WAAW,UAAU;AAAA,MAC3C;AAGA,UAAI,WAAW,WAAW,IAAI;AAC5B,cAAM,gBAAgB,OAAO,WAAW,MAAM,CAAC,EAAE,SAAS,IAAI,GAAG;AACjE,eAAO,+BAAa,WAAW,aAAa;AAAA,MAC9C;AAEA,YAAM,IAAI,MAAM,+BAA+B,WAAW,EAAE;AAAA,IAC9D;AAAA;AAAA;;;AC9CA,mBAYM,iBAEA,uBAEO;AAhBb;AAAA;AAAA;AAAA,oBAA8B;AAQ9B;AAIA,IAAM,kBAAkB;AAExB,IAAM,wBAAwB;AAEvB,IAAM,uBAAN,MAA2B;AAAA,MAA3B;AACL,aAAQ,SAA+B;AACvC,aAAQ,QAA4B;AAAA,UAClC,aAAa;AAAA,UACb,QAAQ;AAAA,UACR,UAAU,CAAC;AAAA,UACX,iBAAiB;AAAA,UACjB,iBAAiB,CAAC;AAAA,UAClB,OAAO;AAAA,QACT;AACA,aAAQ,iBACN,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,MAOF,YACN,SACA,WACA,cACY;AACZ,eAAO,QAAQ,KAAK;AAAA,UAClB;AAAA,UACA,IAAI;AAAA,YAAW,CAAC,GAAG,WACjB,WAAW,MAAM,OAAO,IAAI,MAAM,YAAY,CAAC,GAAG,SAAS;AAAA,UAC7D;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,aAA4B;AAChC,YAAI;AAEF,gBAAM,cAAc,MAAM,4BAAc,mBAAmB,eAAe;AAC1E,eAAK,YAAY,EAAE,YAAY,CAAC;AAEhC,cAAI,aAAa;AAEf,iBAAK,SAAS,MAAM,4BAAc,OAAO,YAAY,eAAe;AAEpE,iBAAK,oBAAoB;AAEzB,kBAAM,kBAAkB,KAAK,mBAAmB;AAChD,iBAAK,YAAY,EAAE,gBAAgB,CAAC;AAGpC,gBAAI,KAAK,OAAO,WAAW;AACzB,oBAAM,WAAW,KAAK,OAAO;AAC7B,oBAAM,kBAAkB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAC5D,mBAAK,YAAY,EAAE,QAAQ,aAAa,UAAU,gBAAgB,CAAC;AACnE,sBAAQ,IAAI,oCAAoC,EAAE,SAAS,CAAC;AAAA,YAC9D;AAEA,oBAAQ,IAAI,iDAAiD;AAAA,UAC/D,OAAO;AACL,oBAAQ,KAAK,8CAAoC;AACjD,iBAAK,YAAY;AAAA,cACf,OACE;AAAA,YACJ,CAAC;AAAA,UACH;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,MAAM,gDAAgD,KAAK;AACnE,eAAK,YAAY;AAAA,YACf,OACE,iBAAiB,QACb,MAAM,UACN;AAAA,UACR,CAAC;AACD,gBAAM;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,QACJ,cACA,qBACA,qBACwB;AACxB,YAAI,CAAC,KAAK,QAAQ;AAChB,gBAAM,IAAI,MAAM,wCAAwC;AAAA,QAC1D;AAEA,YAAI;AACF,eAAK,YAAY,EAAE,QAAQ,cAAc,OAAO,KAAK,CAAC;AAEtD,eAAK;AAAA,YACH;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,KAAK;AAAA,YACT,KAAK,OAAO,QAAQ,cAAc,qBAAqB,mBAAmB;AAAA,YAC1E;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,WAAW,KAAK,OAAO;AAC7B,gBAAM,kBAAkB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAE5D,eAAK,YAAY;AAAA,YACf,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,UACF,CAAC;AAED,kBAAQ,IAAI,gCAAgC,EAAE,UAAU,gBAAgB,CAAC;AACzE,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,kBAAQ,MAAM,wCAAwC,KAAK;AAE3D,cAAI,iBAAiB,OAAO;AAC1B,oBAAQ,MAAM,kBAAkB;AAAA,cAC9B,SAAS,MAAM;AAAA,cACf,OAAO,MAAM;AAAA,cACb,MAAM,MAAM;AAAA,YACd,CAAC;AAAA,UACH;AAEA,eAAK,YAAY;AAAA,YACf,QAAQ;AAAA,YACR,OACE,iBAAiB,QACb,MAAM,UACN;AAAA,UACR,CAAC;AACD,gBAAM;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,yBACN,cACA,qBACA,qBACM;AACN,YAAI,CAAC,gBAAgB,OAAO,iBAAiB,UAAU;AACrD,gBAAM,IAAI,MAAM,gDAAgD;AAAA,QAClE;AAEA,YAAI,aAAa,OAAO,OAAO,aAAa,QAAQ,UAAU;AAC5D,gBAAM,IAAI,MAAM,+CAA+C;AAAA,QACjE;AAEA,YAAI,aAAa,QAAQ,OAAO,aAAa,SAAS,UAAU;AAC9D,gBAAM,IAAI,MAAM,gDAAgD;AAAA,QAClE;AAEA,cAAM,sBAAsB,CAC1B,aACA,UACG;AACH,cAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B,kBAAM,IAAI,MAAM,GAAG,KAAK,mBAAmB;AAAA,UAC7C;AAEA,cAAI,YAAY,WAAW,GAAG;AAC5B,kBAAM,IAAI,MAAM,GAAG,KAAK,wBAAwB;AAAA,UAClD;AAEA,sBAAY,QAAQ,CAAC,YAAY,UAAU;AACzC,gBAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AACjD,oBAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,qBAAqB;AAAA,YACxD;AAEA,gBAAI,WAAW,WAAW,QAAW;AACnC,kBAAI,CAAC,MAAM,QAAQ,WAAW,MAAM,GAAG;AACrC,sBAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,2BAA2B;AAAA,cAC9D;AAEA,yBAAW,OAAO,QAAQ,CAAC,OAAe,eAAuB;AAC/D,oBAAI,OAAO,UAAU,UAAU;AAC7B,wBAAM,IAAI;AAAA,oBACR,GAAG,KAAK,IAAI,KAAK,YAAY,UAAU;AAAA,kBACzC;AAAA,gBACF;AACA,oBAAI,CAAC,MAAM,WAAW,QAAQ,GAAG;AAC/B,wBAAM,IAAI;AAAA,oBACR,GAAG,KAAK,IAAI,KAAK,YAAY,UAAU;AAAA,kBACzC;AAAA,gBACF;AAAA,cACF,CAAC;AAAA,YACH;AAEA,gBAAI,WAAW,YAAY,QAAW;AACpC,kBAAI,CAAC,MAAM,QAAQ,WAAW,OAAO,GAAG;AACtC,sBAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,4BAA4B;AAAA,cAC/D;AAEA,yBAAW,QAAQ,QAAQ,CAAC,QAAgB,gBAAwB;AAClE,oBAAI,OAAO,WAAW,UAAU;AAC9B,wBAAM,IAAI;AAAA,oBACR,GAAG,KAAK,IAAI,KAAK,aAAa,WAAW;AAAA,kBAC3C;AAAA,gBACF;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF,CAAC;AAAA,QACH;AAEA,4BAAoB,qBAAqB,qBAAqB;AAE9D,YAAI,uBAAuB,oBAAoB,SAAS,GAAG;AACzD,8BAAoB,qBAAqB,qBAAqB;AAAA,QAChE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,aAA4B;AAChC,YAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,KAAK,OAAO,WAAW;AAE7B,eAAK,YAAY;AAAA,YACf,QAAQ;AAAA,YACR,UAAU,CAAC;AAAA,YACX,iBAAiB;AAAA,YACjB,OAAO;AAAA,UACT,CAAC;AAED,kBAAQ,IAAI,kCAAkC;AAAA,QAChD,SAAS,OAAO;AACd,kBAAQ,MAAM,6CAA6C,KAAK;AAChE,gBAAM;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,kBAAkB,YAAqD;AAC3E,YAAI,CAAC,KAAK,UAAU,KAAK,MAAM,WAAW,aAAa;AACrD,gBAAM,IAAI,MAAM,8BAA8B;AAAA,QAChD;AAEA,YAAI;AACF,gBAAM,UAAU,MAAM,KAAK,OAAO,QAAQ,UAAU;AAEpD,gBAAM,YAAY,QAAQ,OAAO,CAAC,MAAuB,EAAE,WAAW,IAAI,EAAE;AAC5E,gBAAM,SAAS,QAAQ,OAAO,CAAC,MAAuB,EAAE,WAAW,QAAQ,EAAE;AAC7E,gBAAM,UAAU,QAAQ,OAAO,CAAC,MAAuB,EAAE,WAAW,SAAS,EAAE;AAE/E,kBAAQ;AAAA,YACN,yCAAkC,SAAS,QAAQ,MAAM,YAAY,OAAO;AAAA,UAC9E;AAEA,kBAAQ,QAAQ,CAAC,QAAyB,UAAkB;AAC1D,gBAAI,OAAO,WAAW,UAAU;AAC9B,oBAAM,WAAW,WAAW,SAAS,OAAO,QAAQ;AACpD,sBAAQ,MAAM,oBAAe,KAAK,YAAY,QAAQ;AAAA,YACxD,WAAW,OAAO,WAAW,WAAW;AACtC,sBAAQ,KAAK,0BAAgB,KAAK,UAAU;AAAA,YAC9C;AAAA,UACF,CAAC;AAED,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,kBAAQ,MAAM,wCAAmC,KAAK;AACtD,gBAAM;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,sBAA4B;AAClC,YAAI,CAAC,KAAK,OAAQ;AAElB,aAAK,yBAAyB,CAAC,aAA4B;AACzD,eAAK,YAAY;AAAA,YACf;AAAA,YACA,iBAAiB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAAA,YACrD,QAAQ,SAAS,SAAS,IAAI,cAAc;AAAA,UAC9C,CAAC;AAAA,QACH;AAEA,aAAK,sBAAsB,MAAM;AAC/B,eAAK,YAAY;AAAA,YACf,QAAQ;AAAA,YACR,UAAU,CAAC;AAAA,YACX,iBAAiB;AAAA,UACnB,CAAC;AACD,eAAK,UAAU,cAAc;AAAA,QAC/B;AAEA,aAAK,OAAO,kBAAkB,WAAW,KAAK,sBAAsB;AACpE,aAAK,OAAO,eAAe,WAAW,KAAK,mBAAmB;AAAA,MAChE;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAkB,UAAmD;AACnE,aAAK;AAAA,UACH;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe,UAA4B;AACzC,aAAK;AAAA,UACH;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,qBAA+B;AAC7B,eAAO,CAAC,GAAG,gBAAgB;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,YAAkC;AAChC,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,WAA+B;AAC7B,eAAO,EAAE,GAAG,KAAK,MAAM;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA,MAKQ,YAAY,SAA4C;AAC9D,cAAM,gBAAgB,EAAE,GAAG,KAAK,MAAM;AACtC,aAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,GAAG,QAAQ;AAEzC,YACE,QAAQ,YACR,KAAK,UAAU,cAAc,QAAQ,MACnC,KAAK,UAAU,QAAQ,QAAQ,GACjC;AACA,eAAK,UAAU,mBAAmB,QAAQ,QAAQ;AAAA,QACpD;AAAA,MACF;AAAA,MAEQ,iBACN,OACA,UACM;AACN,YAAI,CAAC,KAAK,eAAe,IAAI,KAAK,GAAG;AACnC,eAAK,eAAe,IAAI,OAAO,oBAAI,IAAI,CAAC;AAAA,QAC1C;AACA,aAAK,eAAe,IAAI,KAAK,EAAG,IAAI,QAAQ;AAAA,MAC9C;AAAA,MAEQ,UAAU,UAAkB,MAAuB;AACzD,cAAM,YAAY,KAAK,eAAe,IAAI,KAAK;AAC/C,YAAI,WAAW;AACb,oBAAU,QAAQ,CAAC,aAAa;AAC9B,gBAAI;AACF,uBAAS,GAAG,IAAI;AAAA,YAClB,SAAS,OAAO;AACd,sBAAQ,MAAM,YAAY,KAAK,oBAAoB,KAAK;AAAA,YAC1D;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,UAAgB;AACd,YAAI,KAAK,QAAQ;AACf,cAAI,KAAK,wBAAwB;AAC/B,iBAAK,OAAO,kBAAkB,cAAc,KAAK,sBAAsB;AAAA,UACzE;AACA,cAAI,KAAK,qBAAqB;AAC5B,iBAAK,OAAO,eAAe,cAAc,KAAK,mBAAmB;AAAA,UACnE;AAAA,QACF;AACA,aAAK,yBAAyB;AAC9B,aAAK,sBAAsB;AAC3B,aAAK,eAAe,MAAM;AAC1B,aAAK,SAAS;AACd,aAAK,QAAQ;AAAA,UACX,aAAa;AAAA,UACb,QAAQ;AAAA,UACR,UAAU,CAAC;AAAA,UACX,iBAAiB;AAAA,UACjB,iBAAiB,CAAC;AAAA,UAClB,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACnaA,IAuCM,eAWA,6BASA,iBAUA,mBAMO,gBAqIA;AAhNb;AAAA;AAAA;AASA;AAKA;AACA;AAwBA,IAAM,gBAAgB,CACpB,SACiC;AAAA,MACjC,GAAG;AAAA,MACH,YAAa,IAAqC,cAAc;AAAA,IAClE;AAMA,IAAM,8BAA8B,CAAC,cAAyC;AAAA,MAC5E,GAAG;AAAA,MACH,WAAW,SAAS,UAAU,IAAI,aAAa;AAAA,MAC/C,GAAI,SAAS,8BAA8B;AAAA,QACzC,4BACE,SAAS,2BAA2B,IAAI,aAAa;AAAA,MACzD;AAAA,IACF;AAEA,IAAM,kBAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,IAAM,oBAAoB,OAAO;AAAA,MAC/B,MAAM;AAAA,MACN,aAAa;AAAA,MACb,KAAK,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAAA,IAChE;AAEO,IAAM,iBAAN,MAAsD;AAAA,MAM3D,cAAc;AALd,aAAS,KAAK;AACd,aAAS,QAAQ;AAKf,aAAK,UAAU,IAAI,qBAAqB;AAAA,MAC1C;AAAA,MAEA,MAAM,aAA4B;AAChC,cAAM,KAAK,QAAQ,WAAW;AAAA,MAChC;AAAA,MAEA,UAAgB;AACd,aAAK,QAAQ,QAAQ;AAAA,MACvB;AAAA,MAEA,WAA+B;AAC7B,eAAO,KAAK,QAAQ,SAAS;AAAA,MAC/B;AAAA,MAEA,MAAM,QAAQ,aAA8C;AAC1D,cAAM,QAAsB,WAAW,WAAW;AAClD,cAAM,eAAe,kBAAkB;AACvC,cAAM,sBAAsB;AAAA,UAC1B,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,eAAe,EAAE;AAAA,QACnD;AAEA,eAAO,KAAK,QAAQ,QAAQ,cAAc,mBAAmB;AAAA,MAC/D;AAAA,MAEA,MAAM,aAA4B;AAChC,eAAO,KAAK,QAAQ,WAAW;AAAA,MACjC;AAAA,MAEA,MAAM,kBACJ,KACyC;AACzC,cAAM,aAAa,IAAI,IAAI,CAAC,OAAO,KAAK,mBAAmB,EAAE,CAAC;AAC9D,eAAO,KAAK,QAAQ,kBAAkB,UAAU;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA;AAAA,MAMQ,mBAAmB,IAAuC;AAChE,gBAAQ,GAAG,MAAM;AAAA,UACf,KAAK,kBAAkB;AACrB,kBAAM,YAAoC;AAAA,cACxC,MAAM;AAAA,cACN,SAAS,GAAG;AAAA,cACZ,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU;AAAA,gBAC7B,MAAM;AAAA,gBACN,UAAU,KAAK;AAAA,gBACf,QAAQ,KAAK;AAAA,gBACb,MAAM,KAAK,KAAK;AAAA,kBAAI,CAAC,QACnB,OAAO,QAAQ,WAAW,IAAI,SAAS,IAAI,OAAO,GAAG;AAAA,gBACvD;AAAA,cACF,EAAE;AAAA,YACJ;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAK,oBAAoB;AACvB,kBAAM,YAAsC;AAAA,cAC1C,MAAM;AAAA,cACN,SAAS,GAAG;AAAA;AAAA,cAEZ,SAAS,GAAG,MAAM,IAAI,CAAC,SAAc;AACnC,oBACE,KAAK,SAAS,yBACd,KAAK,SAAS,sBACd;AACA,yBAAO;AAAA,oBACL,MAAM,KAAK;AAAA,oBACX,SAAS;AAAA,sBACP,MAAM;AAAA,sBACN,QAAQ,KAAK;AAAA,sBACb,UAAU,KAAK;AAAA,sBACf,QAAQ,KAAK;AAAA,sBACb,MAAM,KAAK,KAAK;AAAA,wBAAI,CAAC,QACnB,OAAO,QAAQ,WAAW,IAAI,SAAS,IAAI,OAAO,GAAG;AAAA,sBACvD;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AACA,uBAAO;AAAA,kBACL,MAAM;AAAA,kBACN,UAAU,KAAK;AAAA,kBACf,QAAQ,KAAK;AAAA,kBACb,MAAM,KAAK,KAAK;AAAA,oBAAI,CAAC,QACnB,OAAO,QAAQ,WAAW,IAAI,SAAS,IAAI;AAAA,kBAC7C;AAAA,gBACF;AAAA,cACF,CAAC;AAAA,YACH;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAK,qBAAqB;AACxB,kBAAM,YAAuC;AAAA,cAC3C,MAAM;AAAA,cACN,OAAO,GAAG;AAAA,cACV,SAAS,GAAG;AAAA,cACZ,UAAU,GAAG;AAAA;AAAA,cAEb,UAAU;AAAA,gBACR,GAAG;AAAA,cACL;AAAA,YACF;AACA,mBAAO;AAAA,UACT;AAAA,UACA,SAAS;AACP,kBAAM,OAAQ,GAA8B;AAC5C,kBAAM,IAAI,MAAM,8CAA8C,IAAI,EAAE;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,gBAAgB,WAAkD;AACtE,cAAM,UAAU,qBAAqB,SAAS;AAC9C,eAAO,EAAE,YAAY,MAAM,QAAQ;AAAA,MACrC;AAAA,MAEA,kBAAkB,IAAwC;AACxD,aAAK,QAAQ,kBAAkB,EAAE;AAAA,MACnC;AAAA,MAEA,eAAe,IAAsB;AACnC,aAAK,QAAQ,eAAe,EAAE;AAAA,MAChC;AAAA,IACF;AAEO,IAAM,uBAAuB,MAClC,IAAI,eAAe;AAAA;AAAA;;;ACjNrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAC,gBAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC+BO,SAAS,cAAc,OAAmC;AAC/D,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ;AACzE;;;ACjCA,IAAAC,kBAAuB;;;ACCvB;;;ACGA;AA0BO,IAAM,sBACX;AACK,IAAM,mBACX;AAKK,IAAM,oBAAoB,CAAC,WAAsC;AACtE,SACE,OAAO,gBAAgB,YAAY,uBACnC,OAAO,cAAc,YAAY,uBACjC,OAAO,aAAa;AAExB;AAKO,IAAM,6BAA+C;AAAA,EAC1D,SAAS;AAAA,EACT,SAAS,aAAa;AAAA,EACtB,iBAAiB;AAAA,IACf,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,eAAe;AAAA,IACb,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,EACV,eAAe;AAAA,EACf,YAAY;AACd;AAKO,IAAM,4BAA8C;AAAA,EACzD,SAAS;AAAA,EACT,SAAS,aAAa;AAAA,EACtB,iBAAiB;AAAA,IACf,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,eAAe;AAAA,IACb,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,EACV,eAAe;AAAA,EACf,YAAY;AACd;;;AClFA;AAAA,EACE,SAAW;AAAA,EACX,SAAW;AAAA,EACX,iBAAmB;AAAA,IACjB,SAAW;AAAA,IACX,MAAQ;AAAA,EACV;AAAA,EACA,eAAiB;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,EACV;AAAA,EACA,UAAY;AAAA,EACZ,eAAiB;AAAA,EACjB,YAAc;AAChB;;;ACJO,IAAM,uBAAuB,MAAwB;AAC1D,MAAI;AACF,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACVA,IAAM,aAAa,qBAAqB;AAUjC,IAAM,iBAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa,kBAAkB,UAAU,IACrC,0DACA;AAAA,EACJ,SAAS,WAAW;AAAA,EACpB,wBAAwB,WAAW,gBAAgB;AAAA,EACnD,sBAAsB,WAAW,cAAc;AAAA,EAC/C,iBAAiB,WAAW;AAAA,EAC5B,uBAAuB,WAAW,gBAAgB;AAAA,EAClD,qBAAqB,WAAW,cAAc;AAAA,EAC9C,eAAe;AAAA,EACf,WAAW;AACb;;;AC9BA,2BAA6B;AAStB,IAAM,gBAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,EACb,SAAS;AAAA,EACT,wBACE;AAAA,EACF,sBACE;AAAA,EACF,iBAAiB,kCAAa,KAAK,SAAS;AAAA,EAC5C,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASb;;;ALtBO,IAAM,qBAAsC;AAAA,EACjD;AAAA,EACA;AACF;;;AMNA,IAAM,OAAO,MAAM;AAAC;AAMb,IAAM,2BAA2B,OAAO;AAAA,EAC7C,OAAO;AACT;;;ACdA,qBAAuB;;;ACAvB,iBAA6B;AAC7B,kBAAsD;AAEtD,IAAM,aAAS,yBAAa,iBAAiB;AAE7C,IAAM,sBAAN,MAA0B;AAAA,EAA1B;AACE,SAAQ,cAAsC,oBAAI,IAAI;AACtD,SAAQ,gBAA4C,oBAAI,IAAI;AAAA;AAAA,EAEpD,aAAa,SAAyB;AAC5C,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,SAA4B;AACxC,UAAM,gBAAgB,KAAK,aAAa,OAAO;AAC/C,UAAM,WAAW,KAAK,YAAY,IAAI,aAAa;AAEnD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,aAAS,mCAAsB,aAAa;AAClD,SAAK,YAAY,IAAI,eAAe,MAAM;AAC1C,WAAO,KAAK,gCAAgC,aAAa,EAAE;AAE3D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAkB,SAAgC;AACtD,UAAM,gBAAgB,KAAK,aAAa,OAAO;AAE/C,UAAM,gBAAgB,KAAK,cAAc,IAAI,aAAa;AAC1D,QAAI,eAAe;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,KAAK,aAAa,aAAa;AACpD,SAAK,cAAc,IAAI,eAAe,YAAY;AAElD,QAAI;AACF,YAAM;AAAA,IACR,UAAE;AACA,WAAK,cAAc,OAAO,aAAa;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAc,aAAa,SAAgC;AACzD,UAAM,SAAS,KAAK,cAAc,OAAO;AACzC,UAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,WAAO,KAAK,sBAAsB,OAAO,IAAI,QAAQ;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAuB;AACjC,UAAM,gBAAgB,KAAK,aAAa,OAAO;AAC/C,SAAK,YAAY,OAAO,aAAa;AACrC,WAAO,KAAK,2BAA2B,aAAa,EAAE;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAiB;AACf,SAAK,YAAY,MAAM;AACvB,WAAO,KAAK,0BAA0B;AAAA,EACxC;AACF;AAEO,IAAM,iBAAiB,IAAI,oBAAoB;;;ACxE/C,IAAM,uBAAuB,CAAC,KAAe,SAAmB;AAAA,EACrE,sBAAsB,OACpB,SACA,aACA,gBACkB;AAClB,UAAM,cAAc,IAAI,EAAE;AAC1B,UAAM,YAAY,aAAa,YAAY;AACzC,UAAI;AAAA,QACF,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AAED,YAAM,WAAW,MAAM,QAAQ,QAAQ,WAAW;AAElD,YAAM,kBAAkB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAC5D,YAAM,QAAQ,QAAQ,SAAS;AAE/B,UAAI,gBAA6C;AACjD,UAAI,iBAAiB;AACnB,YAAI;AACF,0BAAgB,MAAM,QAAQ,gBAAgB,eAAe;AAAA,QAC/D,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,UAAI;AAAA,QACF,SAAS;AAAA,QACT;AAAA,QACA,aAAa;AAAA,QACb,cAAc;AAAA,QACd,iBAAiB,MAAM;AAAA,QACvB,aAAa,MAAM;AAAA,MACrB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,uBAAuB,CACrB,UAUG;AACH,QAAI,KAAK;AAAA,EACX;AACF;;;AC3DA,IAAAC,oBAA6B;AAC7B,iBAA0C;AAC1C,IAAAC,iBAAmB;AACnB,IAAAC,cAA6B;AAE7B,IAAAC,oBAAmC;AACnC,uBAA4B;AAC5B,IAAAC,uBAA6C;AAC7C,oBAA0B;AAC1B,oBAA6B;;;ACH7B,uBAAwC;AAExC,uBAA6B;AAC7B,oBAAmB;AACnB,IAAAC,cAA6B;AAC7B,IAAAC,oBAAmC;AACnC,0BAA6C;AAI7C,IAAMC,cAAS,0BAAa,sBAAsB;AAmB3C,IAAM,qBAAN,MAAyB;AAAA,EAAzB;AACL,SAAQ,iBAAkC,CAAC;AAAA;AAAA,EAE3C,MAAM,YACJ,KACA,kBAC0B;AAC1B,SAAK,iBAAiB,CAAC;AAEvB,UAAM,iBAA8B;AAAA,MAClC;AAAA,QACE,MAAM;AAAA,QACN,UAAU;AAAA,QACV,MAAM,IAAI,iBAAG,oCAAkB;AAAA,MACjC;AAAA,IACF;AAEA,QAAI,kBAAkB,SAAS,SAAS;AACtC,qBAAe,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,UAAU;AAAA,QACV,MAAM,iBAAG,WAAW,iBAAiB,QAAQ,QAAQ,MAAM;AAAA,QAC3D,UAAU,iBAAiB,QAAQ,WAC/B,8BAAa,WAAW,iBAAiB,QAAQ,QAAQ,IACzD,8BAAa;AAAA,QACjB,iBAAiB,iBAAiB,QAAQ;AAAA,MAC5C,CAAC;AAAA,IACH;AAEA,eAAW,OAAO,gBAAgB;AAChC,YAAM,KAAK,YAAY,KAAK,GAAG;AAAA,IACjC;AAEA,IAAAA,QAAO;AAAA,MACL,cAAc,KAAK,eAAe,MAAM;AAAA,MACxC,KAAK,eAAe,IAAI,CAAC,QAAQ,IAAI,IAAI;AAAA,IAC3C;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,oBAAqC;AACnC,WAAO,CAAC,GAAG,KAAK,cAAc;AAAA,EAChC;AAAA,EAEA,MAAc,YAAY,KAAU,QAAkC;AACpE,UAAM,EAAE,2CAA2C,IACjD,MAAM,OAAO,2BAA2B;AAE1C,UAAM,WAAW,MAAM;AAAA,MACrB,OAAO;AAAA,MACP;AAAA,QACE,MAAM,OAAO;AAAA,QACb,UAAU,OAAO;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,OAAO,iBAAiB;AAC1B,YAAM,WAAW,8BAAa,WAAW,OAAO,eAAe;AAC/D,UAAI,CAAC,SAAS,QAAQ,OAAO,QAAQ,GAAG;AACtC,QAAAA,QAAO;AAAA,UACL,GAAG,OAAO,IAAI,mCAAmC,OAAO,eAAe,SAAS,SAAS,QAAQ,SAAS,CAAC;AAAA,QAC7G;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,iBAAiB;AAAA,MACzB;AAAA,MACA,UAAU,OAAO;AAAA,IACnB,CAAC;AAED,SAAK,eAAe,KAAK;AAAA,MACvB,MAAM,OAAO;AAAA,MACb,SAAS,SAAS;AAAA,IACpB,CAAC;AAED,IAAAA,QAAO,MAAM,cAAc,OAAO,IAAI,QAAQ;AAAA,MAC5C,SAAS,SAAS,QAAQ,SAAS;AAAA,IACrC,CAAC;AAAA,EACH;AACF;;;ACnHA,qBAIO;AACP,IAAAC,oBAA6B;AAG7B,yBAA2B;AAUpB,IAAM,gBAAN,cAA4B,8BAAW;AAAA,EAG5C,YAAY,KAAU,WAAsB;AAE1C,UAAM,KAAuB,SAAS;AAJxC,SAAiB,mBAAmB,oBAAI,IAAkC;AAAA,EAK1E;AAAA,EAEO,WAAW,SAAqC;AACrD,SAAK,iBAAiB,IAAI,QAAQ,WAAW,EAAE,SAAS,GAAG,OAAO;AAAA,EACpE;AAAA,EAEA,MAAgB,sBACd,SACkB;AAClB,QAAI,QAAQ,OAAO,+BAAa,IAAI,GAAG;AACrC,aAAO,IAAI,iCAAkB;AAAA,IAC/B;AAEA,UAAM,UAAU,KAAK,iBAAiB,IAAI,QAAQ,SAAS,CAAC;AAC5D,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR,4CAA4C,QAAQ,SAAS,CAAC;AAAA,MAChE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAgE;AACpE,WAAO,MAAM,KAAK,KAAK,iBAAiB,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS;AAAA,MAC9D,OAAO;AAAA,MACP,MAAM,IAAI,WAAW;AAAA,IACvB,EAAE;AAAA,EACJ;AACF;;;ACzCO,IAAM,uBAAN,MAAM,qBAAoD;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/D,YAAY,aAAgC;AAC1C,iBAAa;AAAA,MACX,qBAAoB;AAAA,MACpB,KAAK,UAAU,WAAW;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAiC;AAC/B,UAAM,OAAO,aAAa,QAAQ,qBAAoB,WAAW;AAEjE,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,KAAK;AACpD,WAAK,aAAa;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAqB;AACnB,iBAAa,WAAW,qBAAoB,WAAW;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAyB;AACnC,iBAAa;AAAA,MACX,qBAAoB;AAAA,MACpB,KAAK,UAAU,OAAO;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAuB;AACrB,UAAM,OAAO,aAAa,QAAQ,qBAAoB,mBAAmB;AACzE,QAAI,CAAC,MAAM;AACT,aAAO,CAAC;AAAA,IACV;AACA,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,SAAS,OAAO;AACd,cAAQ,KAAK,kCAAkC,KAAK;AACpD,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAAsB;AAC9B,UAAM,kBAAkB,KAAK,WAAW;AACxC,QAAI,CAAC,gBAAgB,SAAS,MAAM,GAAG;AACrC,sBAAgB,KAAK,MAAM;AAC3B,WAAK,YAAY,eAAe;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAsB;AACjC,UAAM,kBAAkB,KAAK,WAAW;AACxC,UAAM,kBAAkB,gBAAgB,OAAO,CAAC,MAAM,MAAM,MAAM;AAClE,SAAK,YAAY,eAAe;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAqB;AACnB,iBAAa,WAAW,qBAAoB,mBAAmB;AAAA,EACjE;AACF;AA7Fa,qBACa,cAAc;AAD3B,qBAEa,sBAAsB;AAFzC,IAAM,sBAAN;;;AHOP,IAAMC,cAAS,0BAAa,oBAAoB;AAChD,IAAM,gBAAY,0BAAa,KAAK;AACpC,IAAM,mBAAmB,CAAC,gBAAuC;AAC/D,QAAM,gBAAgB,mBAAmB,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AAC3E,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,wCAAwC,WAAW,EAAE;AAAA,EACvE;AACA,SAAO,cAAc;AACvB;AAoBA,IAAM,yBAAN,MAAM,uBAAsB;AAAA,EAA5B;AACE,SAAQ,YAA2C,oBAAI,IAAI;AAC3D,SAAQ,eAAwD,oBAAI,IAAI;AACxE,SAAQ,uBACN,oBAAI,IAAI;AACV,SAAQ,gBAGJ,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQZ,MAAM,YACJ,SACA,aAC4B;AAC5B,UAAM,oBAAoB,KAAK,iBAAiB,OAAO;AACvD,UAAM,MAAM,KAAK,eAAe,WAAW;AAG3C,UAAM,WAAW,KAAK,UAAU,IAAI,GAAG;AACvC,QAAI,UAAU;AAEZ,UAAI,SAAS,YAAY,mBAAmB;AAC1C,eAAO,SAAS;AAAA,MAClB;AACA,WAAK,cAAc,SAAS,WAAW;AAAA,IACzC;AAGA,UAAM,cAAc,KAAK,aAAa,IAAI,GAAG;AAC7C,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AAGA,UAAM,UAAU,KAAK,mBAAmB,mBAAmB,aAAa,GAAG;AAC3E,SAAK,aAAa,IAAI,KAAK,OAAO;AAElC,QAAI;AACF,YAAM,WAAW,MAAM;AACvB,aAAO;AAAA,IACT,UAAE;AACA,WAAK,aAAa,OAAO,GAAG;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,aAAoC;AAChD,UAAM,MAAM,KAAK,eAAe,WAAW;AAC3C,WAAO,KAAK,UAAU,IAAI,GAAG;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,aAAoC;AACjD,UAAM,MAAM,KAAK,eAAe,WAAW;AAC3C,WAAO,KAAK,aAAa,IAAI,GAAG;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,aAAqD;AACvE,UAAM,MAAM,KAAK,eAAe,WAAW;AAC3C,WAAO,KAAK,UAAU,IAAI,GAAG,GAAG,YAAY;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,aAAiC;AAC7C,UAAM,MAAM,KAAK,eAAe,WAAW;AAC3C,SAAK,UAAU,OAAO,GAAG;AACzB,SAAK,qBAAqB,OAAO,GAAG;AACpC,IAAAA,QAAO,KAAK,4BAA4B,WAAW,EAAE;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAiB;AACf,SAAK,UAAU,MAAM;AACrB,SAAK,qBAAqB,MAAM;AAChC,IAAAA,QAAO,KAAK,2BAA2B;AAAA,EACzC;AAAA,EAEQ,eAAe,aAA4C;AACjE,WAAO,GAAG,WAAW;AAAA,EACvB;AAAA,EAEQ,oBAAoB,aAAqB;AAC/C,UAAM,gBAAgB,mBAAmB,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AAC3E,WAAO,eAAe;AAAA,EACxB;AAAA,EAEQ,iBAAiB,SAAyB;AAChD,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI;AAAA,EACxD;AAAA,EAEA,MAAc,mBACZ,SACA,aACA,KAC4B;AAC5B,IAAAA,QAAO,KAAK,iCAAiC,WAAW,EAAE;AAE1D,UAAM,YAAY,eAAe,cAAc,OAAO;AAGtD,UAAM,cAAc,MAAM,UAAU,uBAAuB;AAC3D,UAAM,YAAY,aAAa,WAAW;AAG1C,UAAM,WAAW,MAAM,KAAK,iBAAiB,aAAa,SAAS;AAEnE,UAAM,aAAS,4BAAa;AAC5B,WAAO,cAAc;AACrB,WAAO,gBAAgB,iBAAiB,WAAW;AAEnD,UAAM,MAAM,UAAM,yBAAU,WAAW,QAAQ;AAAA,MAC7C,OAAO;AAAA,IACT,CAAC;AAED,UAAM,SAAS,IAAI,cAAc,KAAK,SAAS;AAG/C,UAAM,mBAAmB,KAAK,oBAAoB,WAAW;AAC7D,UAAM,qBAAqB,IAAI,mBAAmB;AAClD,UAAM,mBAAmB,YAAY,KAAK,gBAAuB;AAGjE,UAAM,iBAAiB,IAAI,oBAAoB;AAG/C,UAAM,KAAK,qBAAqB,KAAK,cAAc;AAEnD,UAAM,WAAW,MAAM,UAAU,YAAY;AAC7C,IAAAA,QAAO,KAAK,oBAAoB,WAAW,IAAI,QAAQ;AAEvD,UAAM,WAA8B;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,8BAA8B,MAC5B,KAAK,6BAA6B,KAAK,GAAG;AAAA,IAC9C;AAEA,SAAK,UAAU,IAAI,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,iBACZ,aACA,WACkD;AAClD,UAAM,kBAAkB,KAAK,cAAc,IAAI,WAAW;AAC1D,QAAI,iBAAiB;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,KAAK,2BAA2B,SAAS;AAC/D,SAAK,cAAc,IAAI,aAAa,aAAa;AACjD,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,2BACZ,WACkD;AAClD,QAAI;AACF,aAAO,UAAM;AAAA,QACX;AAAA,QACA;AAAA,UACE,eAAe;AAAA,UACf,oBAAoB,uBAAsB;AAAA,QAC5C;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,MAAAA,QAAO;AAAA,QACL,gDACE,uBAAsB,kBACxB;AAAA,QACA,EAAE,MAAM;AAAA,MACV;AAEA,aAAO,UAAM;AAAA,QACX,GAAG,SAAS;AAAA,QACZ;AAAA,UACE,eAAe;AAAA,UACf,oBAAoB,uBAAsB;AAAA,QAC5C;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,wBAAwB,MAAW;AAC/C,UAAM,EAAE,2CAA2C,IACjD,MAAM,OAAO,2BAA2B;AAE1C,WAAO,MAAM;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAM,IAAI,kBAAG,oCAAkB;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,6BACZ,KACA,KACoC;AACpC,UAAM,SAAS,KAAK,qBAAqB,IAAI,GAAG;AAChD,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAEA,UAAM,uBAAuB,MAAM,KAAK,wBAAwB,GAAG;AACnE,UAAM,gBAAgB,IAAI;AAAA,MACxB,qBAAqB;AAAA,IACvB;AAEA,SAAK,qBAAqB,IAAI,KAAK,aAAa;AAEhD,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,qBACZ,KACA,gBACe;AACf,QAAI;AACF,YAAM,eAAe,eAAe,WAAW;AAE/C,UAAI,aAAa,WAAW,GAAG;AAC7B;AAAA,MACF;AAEA,MAAAA,QAAO,KAAK,eAAe,aAAa,MAAM,yBAAyB;AAEvE,iBAAW,uBAAuB,cAAc;AAC9C,YAAI;AACF,gBAAM,gBAAgB,+BAAa,WAAW,mBAAmB;AACjE,gBAAM,IAAI,eAAe,aAAa;AAAA,QACxC,QAAQ;AAEN,UAAAA,QAAO,KAAK,6BAA6B,mBAAmB,EAAE;AAAA,QAChE;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,MAAAA,QAAO,MAAM,oCAAoC,KAAK;AAAA,IACxD;AAAA,EACF;AACF;AAhRM,uBASoB,qBAAqB;AAAA;AATzC,uBAUoB,oBAAoB;AAV9C,IAAM,wBAAN;AAmRO,IAAM,mBAAmB,IAAI,sBAAsB;;;AI9SnD,IAAM,wBAAwB;AAU9B,IAAM,oBAAN,MAA2D;AAAA,EAA3D;AACL,SAAS,KAAK;AACd,SAAS,QAAQ;AACjB,SAAS;AAAA;AAAA,EAET,YAA6B;AAC3B,UAAM,QAAQ,eAAe;AAC7B,UAAM,kBAAkB,MAAM;AAE9B,WAAO;AAAA,MACL,aAAa;AAAA,MACb,QAAQ,kBAAkB,MAAM,SAAS;AAAA,MACzC,OAAO,kBAAkB,MAAM,QAAQ;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,aAAa;AACX,UAAM,QAAQ,eAAe;AAC7B,WAAO,MAAM,2CAAqC,MAAM,UAAU;AAAA,EACpE;AAAA,EAEA,MAAM,UAAyB;AAC7B,UAAM,QAAQ,eAAe;AAC7B,QAAI,MAAM,4CAAsC,MAAM,SAAS;AAC7D;AAAA,IACF;AACA,UAAM,MAAM,gBAAgB;AAAA,EAC9B;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,eAAe,EAAE,WAAW,iBAAiB;AAAA,EACrD;AAAA,EAEA,SAAqB;AACnB,UAAM,SAAS,gBAAgB,EAAE;AACjC,UAAM,WAAW,iBAAiB,oBAAoB,OAAO,IAAI;AACjE,WAAO,UAAU,OAAO;AAAA,EAC1B;AAAA,EAEA,YAA2B;AACzB,UAAM,SAAS,gBAAgB,EAAE;AACjC,UAAM,WAAW,iBAAiB,oBAAoB,OAAO,IAAI;AACjE,WAAO,UAAU,UAAU;AAAA,EAC7B;AAAA,EAEA,MAAM,+BAAmE;AACvE,UAAM,SAAS,gBAAgB,EAAE;AACjC,UAAM,WAAW,iBAAiB,oBAAoB,OAAO,IAAI;AACjE,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,WAAO,SAAS,6BAA6B;AAAA,EAC/C;AACF;AAKO,IAAM,0BAA0B,MAAyB;AAC9D,SAAO,IAAI,kBAAkB;AAC/B;;;ACnFA,kBAMO;AAYA,IAAM,mBAAN,MAAuB;AAAA,EAAvB;AACL,SAAQ,eAAoC;AAC5C,SAAQ,UAAsB;AAC9B,SAAQ,UAAyB;AACjC,SAAQ,gBAA+B;AACvC,SAAQ,YAAoC,oBAAI,IAAI;AACpD,SAAQ,sBAAsB;AAC9B,SAAQ,kBAA0C;AA6IlD,SAAQ,wBAAwB,CAAC,aAA4B;AAC3D,YAAM,gBAAgB;AAEtB,UAAI,CAAC,iBAAiB,cAAc,WAAW,GAAG;AAChD,aAAK,WAAW;AAChB;AAAA,MACF;AAEA,YAAM,aAAa,cAAc,CAAC;AAClC,UAAI,eAAe,KAAK,SAAS;AAC/B,aAAK,UAAU;AAEf,YAAI,KAAK,iBAAiB;AACxB,eAAK,mBAAe,gCAAmB;AAAA,YACrC,SAAS,EAAE,SAAS,WAAW;AAAA,YAC/B,eAAW,oBAAO,KAAK,eAAe;AAAA,UACxC,CAAC;AAAA,QACH;AAEA,aAAK,gBAAgB;AAAA,MACvB;AAAA,IACF;AAEA,SAAQ,qBAAqB,CAAC,eAA8B;AAC1D,YAAM,aAAa,SAAS,YAAsB,EAAE;AAEpD,UAAI,eAAe,KAAK,SAAS;AAC/B,aAAK,UAAU;AACf,aAAK,gBAAgB;AAAA,MACvB;AAAA,IACF;AAEA,SAAQ,mBAAmB,MAAY;AACrC,WAAK,WAAW;AAAA,IAClB;AAAA;AAAA,EA7KA,cAAuB;AACrB,WAAO,OAAO,WAAW,eAAe,CAAC,CAAC,OAAO;AAAA,EACnD;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK,YAAY,QAAQ,KAAK,iBAAiB;AAAA,EACxD;AAAA,EAEA,WAA2B;AACzB,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,aAAa,KAAK,YAAY;AAAA,MAC9B,SAAS,KAAK;AAAA,MACd,eAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,mBAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAAuC;AACrC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAQ,UAA4B,MAA6B;AAErE,QAAI,KAAK,iBAAiB;AACxB,WAAK,WAAW;AAAA,IAClB;AAEA,UAAM,WAAW,YAAY,OAAO;AAEpC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,QAAI;AACF,YAAM,WAAY,MAAM,SAAS,QAAQ;AAAA,QACvC,QAAQ;AAAA,MACV,CAAC;AAED,UAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,cAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD;AAEA,YAAM,UAAU,SAAS,CAAC;AAE1B,YAAM,aAAc,MAAM,SAAS,QAAQ;AAAA,QACzC,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,UAAU,SAAS,YAAY,EAAE;AAEvC,WAAK,mBAAe,gCAAmB;AAAA,QACrC,SAAS,EAAE,QAAQ;AAAA,QACnB,eAAW,oBAAO,QAAQ;AAAA,MAC5B,CAAC;AAED,WAAK,UAAU;AACf,WAAK,UAAU;AACf,WAAK,kBAAkB;AACvB,WAAK,gBAAgB,QAAQ;AAE7B,WAAK,oBAAoB;AACzB,WAAK,gBAAgB;AAErB,aAAO;AAAA,IACT,SAAS,OAAO;AAEd,WAAK,eAAe;AACpB,WAAK,UAAU;AACf,WAAK,UAAU;AACf,WAAK,kBAAkB;AACvB,WAAK,gBAAgB;AACrB,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,aAAmB;AACjB,SAAK,qBAAqB;AAC1B,SAAK,eAAe;AACpB,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,kBAAkB;AACvB,SAAK,gBAAgB;AACrB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,MAAM,YAAY,SAAqD;AACrE,QAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,SAAS;AACvC,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AAEA,WAAO,KAAK,aAAa,YAAY;AAAA,MACnC,SAAS,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,UAAyC;AACjD,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,EAC7C;AAAA,EAEQ,kBAAwB;AAC9B,SAAK,UAAU,QAAQ,CAAC,aAAa,SAAS,CAAC;AAAA,EACjD;AAAA,EAEQ,sBAA4B;AAClC,UAAM,WAAW,KAAK;AACtB,QAAI,KAAK,uBAAuB,CAAC,SAAU;AAE3C,aAAS,GAAG,mBAAmB,KAAK,qBAAqB;AACzD,aAAS,GAAG,gBAAgB,KAAK,kBAAkB;AACnD,aAAS,GAAG,cAAc,KAAK,gBAAgB;AAE/C,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEQ,uBAA6B;AACnC,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC,KAAK,uBAAuB,CAAC,SAAU;AAE5C,aAAS,eAAe,mBAAmB,KAAK,qBAAqB;AACrE,aAAS,eAAe,gBAAgB,KAAK,kBAAkB;AAC/D,aAAS,eAAe,cAAc,KAAK,gBAAgB;AAE3D,SAAK,sBAAsB;AAAA,EAC7B;AAqCF;AAEA,IAAI,2BAAoD;AAEjD,IAAM,sBAAsB,MAAwB;AACzD,MAAI,CAAC,0BAA0B;AAC7B,+BAA2B,IAAI,iBAAiB;AAAA,EAClD;AACA,SAAO;AACT;;;ACzMA,IAAM,iBAAN,MAAqB;AAAA,EAArB;AACE,SAAQ,YAAgD,oBAAI,IAAI;AAChE,SAAQ,YAAkC,oBAAI,IAAI;AAClD,SAAQ,gBAAgB;AAcxB,SAAQ,qBAAqB,CAAC,UAA8C;AAC1E,YAAM,EAAE,MAAM,SAAS,IAAI,MAAM;AACjC,WAAK,UAAU,IAAI,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAChD,WAAK,gBAAgB;AAAA,IACvB;AAAA;AAAA,EAhBA,WAAiB;AACf,QAAI,OAAO,WAAW,eAAe,KAAK,cAAe;AACzD,SAAK,gBAAgB;AAErB,WAAO;AAAA,MACL;AAAA,MACA,KAAK;AAAA,IACP;AAEA,WAAO,cAAc,IAAI,MAAM,yBAAyB,CAAC;AAAA,EAC3D;AAAA,EAQA,eAAwC;AACtC,WAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,EAC3C;AAAA,EAEA,kBAAkB,MAAsC;AACtD,WAAO,KAAK,UAAU,IAAI,IAAI,GAAG,YAAY;AAAA,EAC/C;AAAA,EAEA,gBAAgB,MAA4C;AAC1D,WAAO,KAAK,UAAU,IAAI,IAAI,KAAK;AAAA,EACrC;AAAA,EAEA,kBAAkB,MAAuB;AACvC,WAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EAChC;AAAA,EAEA,UAAU,UAAuC;AAC/C,SAAK,UAAU,IAAI,QAAQ;AAC3B,aAAS,KAAK,aAAa,CAAC;AAC5B,WAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,EAC7C;AAAA,EAEQ,kBAAwB;AAC9B,UAAM,YAAY,KAAK,aAAa;AACpC,SAAK,UAAU,QAAQ,CAAC,aAAa,SAAS,SAAS,CAAC;AAAA,EAC1D;AAAA,EAEA,UAAgB;AACd,QAAI,OAAO,WAAW,YAAa;AACnC,WAAO;AAAA,MACL;AAAA,MACA,KAAK;AAAA,IACP;AACA,SAAK,UAAU,MAAM;AACrB,SAAK,UAAU,MAAM;AACrB,SAAK,gBAAgB;AAAA,EACvB;AACF;AAEA,IAAI,yBAAgD;AAE7C,IAAM,oBAAoB,MAAsB;AACrD,MAAI,CAAC,wBAAwB;AAC3B,6BAAyB,IAAI,eAAe;AAAA,EAC9C;AACA,SAAO;AACT;;;AC5EA,IAAAC,eAA6C;;;ACP7C,IAAAC,iBAAmB;AACnB,0BAA4B;AAgBrB,IAAM,8BAAN,MAAiE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUtE,YAAY,cAA4B,SAAc;AACpD,SAAK,eAAe;AACpB,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAc,aAAuC;AAEzD,UAAM,eAAe,YAAY,SAAS;AAI1C,UAAM,YAAY,MAAM,KAAK,aAAa,YAAY;AAAA,MACpD,SAAS,KAAK;AAAA,MACd,SAAS,EAAE,KAAK,aAAa;AAAA,IAC/B,CAAC;AAID,UAAM,SAAS,UAAU,MAAM,CAAC;AAChC,UAAM,IAAI,OAAO,KAAK,OAAO,MAAM,GAAG,EAAE,GAAG,KAAK;AAChD,UAAM,IAAI,OAAO,KAAK,OAAO,MAAM,IAAI,GAAG,GAAG,KAAK;AAIlD,UAAM,gBAAsB,CAAC;AAC7B,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,oBAAc,KAAK,IAAI,kBAAG,EAAE,CAAC,CAAC,CAAC;AAAA,IACjC;AACA,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,oBAAc,KAAK,IAAI,kBAAG,EAAE,CAAC,CAAC,CAAC;AAAA,IACjC;AAEA,WAAO,IAAI,gCAAY,aAAa,aAAa;AAAA,EACnD;AACF;;;ACpEA,IAAAC,eAAwD;AAYxD,eAAsB,8BACpB,SACA,WACmC;AAEnC,QAAM,kBAAc,0BAAY,OAAO;AAGvC,QAAM,YAAY,UAAM,+BAAiB;AAAA,IACvC,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AAGD,QAAM,YAAY,UAAU,MAAM,CAAC;AACnC,QAAM,IAAI,OAAO,KAAK,UAAU,MAAM,GAAG,EAAE,GAAG,KAAK;AACnD,QAAM,IAAI,OAAO,KAAK,UAAU,MAAM,IAAI,GAAG,GAAG,KAAK;AAErD,SAAO,EAAE,GAAG,EAAE;AAChB;AAYO,SAAS,4BAA4B,YAAyB;AACnE,SAAO,+EAA+E,UAAU;AAClG;;;AFxBO,IAAM,YAAN,MAA0C;AAAA,EAU/C,YAAY,YAA8B,MAAe;AATzD,SAAS;AACT,SAAS,QAAQ;AAIjB,SAAQ,kBAAyC;AACjD,SAAQ,kBAAiC;AACzC,SAAQ,aAA4B;AAGlC,SAAK,aAAa;AAClB,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,cAAuB;AACrB,QAAI,KAAK,MAAM;AACb,aAAO,kBAAkB,EAAE,kBAAkB,KAAK,IAAI;AAAA,IACxD;AACA,WAAO,KAAK,WAAW,YAAY;AAAA,EACrC;AAAA,EAEA,cAAuB;AACrB,QAAI,CAAC,KAAK,WAAW,YAAY,GAAG;AAClC,aAAO;AAAA,IACT;AACA,UAAM,gBAAgB,KAAK,WAAW,iBAAiB;AACvD,QAAI,CAAC,KAAK,MAAM;AACd,aAAO;AAAA,IACT;AACA,WAAO,kBAAkB,KAAK;AAAA,EAChC;AAAA,EAEA,MAAM,UAAyB;AAE7B,QAAI,KAAK,YAAY,GAAG;AACtB;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,OAClB,kBAAkB,EAAE,kBAAkB,KAAK,IAAI,IAC/C;AAEJ,QAAI,KAAK,QAAQ,CAAC,UAAU;AAC1B,cAAQ;AAAA,QACN,sBAAsB,KAAK,IAAI;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,KAAK,WAAW,QAAQ,YAAY,QAAW,KAAK,IAAI;AAAA,EAChE;AAAA,EAEA,aAAmB;AACjB,SAAK,WAAW,WAAW;AAC3B,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,gBAA+B;AAC7B,WAAO,KAAK,WAAW,WAAW;AAAA,EACpC;AAAA,EAEA,MAAM,eAAwC;AAC5C,QAAI,KAAK,iBAAiB;AACxB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,eAAe,KAAK,WAAW,gBAAgB;AACrD,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,UAAM,UAAU,4BAA4B,OAAO;AAEnD,UAAM,YAAY,MAAM,aAAa,YAAY;AAAA,MAC/C,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAED,SAAK,0BAA0B,WAAW,OAAO;AAEjD,UAAM,YAAY,MAAM,8BAA8B,SAAS,SAAS;AACxE,SAAK,kBAAkB;AAEvB,WAAO;AAAA,EACT;AAAA,EAEA,0BAA0B,UAAgD;AACxE,UAAM,eAAe,KAAK,WAAW,gBAAgB;AACrD,UAAM,UAAU,KAAK,WAAW,WAAW;AAE3C,QAAI,CAAC,gBAAgB,CAAC,SAAS;AAC7B,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,WAAO,IAAI,4BAA4B,cAAc,OAAO;AAAA,EAC9D;AAAA,EAEA,MAAM,kBAAmC;AACvC,QAAI,KAAK,iBAAiB;AACxB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,KAAK,aAAa;AAExB,QAAI,CAAC,KAAK,iBAAiB;AACzB,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAqB;AACnB,QAAI,KAAK,YAAY;AACnB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,UAAU,KAAK,cAAc;AACnC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,UAAM,eAAe,OAAO,KAAK,QAAQ,MAAM,CAAC,EAAE,SAAS,IAAI,GAAG,GAAG,KAAK;AAC1E,SAAK,aAAa,aAAa,MAAM,GAAG,EAAE;AAE1C,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,0BAA0B,WAAgB,UAAqB;AACrE,UAAM,oBAAgB,4BAAU,sBAAQ,SAAS,CAAC;AAClD,SAAK,kBAAkB,OAAO,KAAK,cAAc,MAAM,CAAC,GAAG,KAAK;AAAA,EAClE;AAAA,EAEQ,aAAmB;AACzB,SAAK,kBAAkB;AACvB,SAAK,kBAAkB;AACvB,SAAK,aAAa;AAAA,EACpB;AACF;AAEO,IAAM,kBAAkB,CAC7B,YACA,SACc;AACd,SAAO,IAAI,UAAU,YAAY,IAAI;AACvC;;;AG1KA,IAAAC,kBAKO;AAEP,IAAAA,kBAAyC;AAkBlC,IAAM,iCAAN,MAAgE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYrE,YACE,YACA,YACA,qBACA;AACA,QAAI,WAAW,WAAW,MAAM,WAAW,WAAW,IAAI;AACxD,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AACA,SAAK,aAAa;AAClB,SAAK,aAAa;AAClB,SAAK,sBAAsB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAiD;AAC/C,WAAO,QAAQ,QAAQ,IAAmC;AAAA,EAE5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mCAGH;AACD,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,QACf,MAAM,KAAK,KAAK,UAAU;AAAA;AAAA,QAC1B,MAAM,KAAK,KAAK,UAAU;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,SAAmC;AAC5C,UAAM,sBAAsB,KAAK,uBAAuB,OAAO;AAC/D,WAAO,IAAI;AAAA,MACT,IAAI,yCAAyB,QAAQ,SAAS,mBAAmB;AAAA,MACjE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAuB,UAAgD;AACrE,WAAO,KAAK;AAAA,EACd;AACF;;;ACzDO,IAAM,0BAAN,MAAuE;AAAA,EAU5E,YAAY,QAAuC;AAPnD,SAAS;AAKT;AAAA,SAAQ,UAAiC;AAGvC,SAAK,aAAa,OAAO;AACzB,SAAK,KAAK,OAAO,MAAM,YAAY,OAAO,UAAU;AACpD,SAAK,QAAQ,OAAO,SAAS,KAAK,gBAAgB,OAAO,UAAU;AACnE,SAAK,OAAO,OAAO;AAAA,EACrB;AAAA,EAEQ,gBAAgB,YAAwC;AAC9D,YAAQ,YAAY;AAAA,MAClB;AACE,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,YAA4B;AAClC,QAAI,CAAC,KAAK,SAAS;AACjB,UAAI,KAAK,uCAA8C;AACrD,cAAM,IAAI,MAAM,wBAAwB,KAAK,UAAU,EAAE;AAAA,MAC3D;AACA,YAAM,aAAa,oBAAoB;AACvC,WAAK,UAAU,gBAAgB,YAAY,KAAK,IAAI;AAAA,IACtD;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAA6B;AAC3B,UAAM,QAAQ,eAAe;AAC7B,UAAM,mBAAmB,MAAM;AAC/B,UAAM,2BACJ,oBAAoB,MAAM,kBAAkB,KAAK;AAEnD,UAAM,SACJ,oBAAoB,CAAC,2BACjB,iBACA,mBACE,MAAM,SACN;AAER,UAAM,SAAS,KAAK,UAAU;AAE9B,WAAO;AAAA,MACL,aAAa,OAAO,YAAY;AAAA,MAChC;AAAA,MACA,OAAO,2BAA2B,MAAM,QAAQ;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,aAA0C;AACxC,UAAM,QAAQ,eAAe;AAE7B,QACE,MAAM,mDACN,MAAM,kBAAkB,KAAK,MAC7B;AACA,aAAO,MAAM;AAAA,IACf;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAyB;AAC7B,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,eAAe,EAAE,sBAAsB,QAAQ,KAAK,EAAE;AAAA,EAC9D;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,SAAS,KAAK;AACpB,UAAM,eAAe,EAAE,WAAW,MAAM;AACtC,UAAI,QAAQ;AACV,eAAO,WAAW;AAAA,MACpB;AACA,WAAK,UAAU;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,SAAqB;AACnB,UAAM,SAAS,gBAAgB,EAAE;AACjC,UAAM,WAAW,iBAAiB,oBAAoB,OAAO,IAAI;AACjE,WAAO,UAAU,OAAO;AAAA,EAC1B;AAAA,EAEA,YAA2B;AACzB,UAAM,SAAS,gBAAgB,EAAE;AACjC,UAAM,WAAW,iBAAiB,oBAAoB,OAAO,IAAI;AACjE,WAAO,UAAU,UAAU;AAAA,EAC7B;AAAA,EAEA,MAAM,+BAAmE;AACvE,UAAM,SAAS,gBAAgB,EAAE;AACjC,UAAM,WAAW,iBAAiB,oBAAoB,OAAO,IAAI;AACjE,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,WAAO,SAAS,6BAA6B;AAAA,EAC/C;AACF;;;ACjJO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC5C,YACE,SACgB,MACA,OAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,eAAN,cAA2B,mBAAmB;AAAA,EACnD,YAAY,SAAiB,OAAiB;AAC5C,UAAM,SAAS,mBAAmB,KAAK;AACvC,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,uBAAN,cAAmC,mBAAmB;AAAA,EAC3D,YAAY,SAAiB,OAAiB;AAC5C,UAAM,SAAS,2BAA2B,KAAK;AAC/C,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,yBAAN,cAAqC,mBAAmB;AAAA,EAC7D,YAAY,SAAiB,OAAiB;AAC5C,UAAM,SAAS,6BAA6B,KAAK;AACjD,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,mBAAN,cAA+B,mBAAmB;AAAA,EACvD,YAAY,SAAiB,OAAiB;AAC5C,UAAM,SAAS,uBAAuB,KAAK;AAC3C,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,wBAAN,cAAoC,mBAAmB;AAAA,EAC5D,YAAY,SAAiB,OAAiB;AAC5C,UAAM,SAAS,4BAA4B,KAAK;AAChD,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,sBAAN,cAAkC,mBAAmB;AAAA,EAC1D,cAAc;AACZ,UAAM,0BAA0B,kBAAkB;AAClD,SAAK,OAAO;AAAA,EACd;AACF;;;ACxEA,IAAAC,oBAA6B;AAE7B,gBAAyB;AAoBzB,IAAM,kBAAkD;AAAA,EACtD,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,yBAAyB;AAC3B;AAYA,eAAsB,yBACpB,gBACA,aACA,UAAgC,CAAC,GACH;AAC9B,QAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAC9C,QAAM,iBAAiB,eAAe;AAEtC,MAAI;AACF,YAAQ,IAAI,gDAAgD;AAC5D,UAAM,WACJ,MAAM,YAAY,OAAO,oBAAoB,cAAc;AAC7D,YAAQ;AAAA,MACN;AAAA,MACA,SAAS;AAAA,IACX;AAEA,QAAI,SAAS,uBAAuB;AAClC,aAAO,EAAE,UAAU,OAAO,SAAS,eAAe;AAAA,IACpD;AAEA,YAAQ,IAAI,2CAA2C;AACvD,UAAM,eAAe,MAAM,eAAe,gBAAgB;AAC1D,YAAQ,IAAI,0DAA0D;AACtE,UAAM,gBAAgB,MAAM,YAAY,6BAA6B;AACrE,YAAQ,IAAI,uCAAuC;AAEnD,UAAM,aAAa,KAAK;AAAA,MACtB,MAAM,+BAAa;AAAA,MACnB,KAAK,EAAE,cAAc;AAAA,MACrB,sBAAsB,KAAK;AAAA,MAC3B,yBAAyB,KAAK;AAAA,MAC9B,MAAM,EAAE,SAAS,KAAK,SAAS,eAAe,mBAAS,SAAS;AAAA,IAClE,CAAC;AAED,YAAQ,IAAI,sCAAsC;AAClD,WAAO,EAAE,UAAU,MAAM,SAAS,eAAe;AAAA,EACnD,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAC3C;AACA,UAAM,IAAI;AAAA,MACR,+BAA+B,eAAe,SAAS,CAAC;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACF;;;ACrFA,kBAAsC;AAEtC,IAAAC,iBAAmB;AACnB,IAAAC,iBAA+B;AAC/B,sBAA8B;;;ACJ9B,IAAAC,iBAAmB;AAmCZ,IAAM,2BAA2B,MAAe;AACrD,SAAO;AACT;AAMO,IAAM,kCACX,YAAgD;AAC9C,SAAO;AACT;;;ADIF,IAAM,cAAc;AAEb,IAAM,kBAAkB,MAAgC;AAC7D,MAAI;AACF,UAAM,OAAO,aAAa,QAAQ,WAAW;AAC7C,WAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,cAAc,CAAC,SAAkC;AAC5D,MAAI;AACF,iBAAa,QAAQ,aAAa,KAAK,UAAU,IAAI,CAAC;AAAA,EACxD,QAAQ;AAAA,EAER;AACF;AAEO,IAAM,oBAAoB,MAAY;AAC3C,MAAI;AACF,iBAAa,WAAW,WAAW;AAAA,EACrC,QAAQ;AAAA,EAER;AACF;AAEO,IAAM,0BAA0B,MAAe;AACpD,MAAI,yBAAyB,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,SAAO,gBAAgB,MAAM;AAC/B;AAeA,eAAsB,sBACpB,eACsC;AACtC,MAAI;AAEJ,UAAQ,IAAI,iDAAiD;AAE7D,MAAI;AACF,YAAQ,IAAI,wCAAwC;AACpD,kBAAc,MAAM,iBAAiB;AAAA,MACnC,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AACA,YAAQ,IAAI,oCAAoC;AAAA,EAClD,SAAS,OAAO;AACd,YAAQ,MAAM,uCAAuC,KAAK;AAC1D,UAAM,IAAI;AAAA,MACR,wCAAwC,cAAc,IAAI;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,YAAY;AAG3B,YAAQ,IAAI,8CAA8C;AAC1D,UAAM,OAAO,kBAAG,OAAO;AACvB,UAAM,YAAY,UAAM,+BAAc,CAAC,kBAAG,OAAO,CAAC,CAAC;AACnD,UAAM,aAAa,OAAO,KAAK,UAAU,SAAS,EAAE,SAAS,GAAG,EAAE,CAAC;AACnE,YAAQ,IAAI,0CAA0C;AAGtD,YAAQ,IAAI,+CAA+C;AAC3D,UAAM,kBAAkB,IAAI,kCAAsB,UAAU;AAC5D,UAAM,iBAAiB,MAAM,8BAAe;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,YAAQ;AAAA,MACN;AAAA,MACA,eAAe,QAAQ,SAAS;AAAA,IAClC;AAGA,YAAQ,IAAI,uCAAuC;AACnD,UAAM,UAAU,MAAM,eAAe,WAAW;AAChD,YAAQ,IAAI,qDAAqD;AACjE,UAAM,WAAW,eAAe,YAAY;AAC5C,UAAM,WAAW,MAAM,eACpB,mBAAmB,EACnB,oBAAoB;AACvB,YAAQ,IAAI,qDAAqD;AACjE,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA,eAAe,aAAa;AAAA,IAC9B;AACA,WAAO,WAAW,OAAO;AACzB,YAAQ,IAAI,gDAAgD;AAK5D,UAAM,yBAAyB;AAC/B,QAAIC;AACJ,QAAI;AACF,cAAQ,IAAI,mDAAmD;AAC/D,MAAAA,cAAa,MAAM,QAAQ,KAAK;AAAA,QAC9B,yBAAyB,gBAAgB,WAAW;AAAA,QACpD,IAAI;AAAA,UAAe,CAAC,GAAG,WACrB;AAAA,YACE,MAAM,OAAO,IAAI,MAAM,8BAA8B,CAAC;AAAA,YACtD;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD,cAAQ;AAAA,QACN;AAAA,QACAA,YAAW,WAAW,aAAa;AAAA,MACrC;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ;AAAA,QACN;AAAA,QACA,eAAe,QAAQ,IAAI,UAAU;AAAA,MACvC;AACA,MAAAA,cAAa,EAAE,UAAU,OAAO,SAAS,eAAe,QAAQ;AAAA,IAClE;AAGA,UAAM,cAAiC;AAAA,MACrC,SAAS,eAAe,QAAQ,SAAS;AAAA,MACzC,YAAY,WAAW,SAAS,KAAK;AAAA,MACrC,WAAW,UAAU,SAAS;AAAA,MAC9B,MAAM,KAAK,SAAS;AAAA,IACtB;AAEA,YAAQ,IAAI,8CAA8C;AAC1D,WAAO,EAAE,SAAS,aAAa,YAAAA,aAAY,YAAY;AAAA,EACzD,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAC3C;AACA,QAAI,iBAAiB,aAAc,OAAM;AACzC,UAAM,IAAI,qBAAqB,qCAAqC,KAAK;AAAA,EAC3E;AACF;AAeA,eAAsB,4BACpB,eACoC;AACpC,MAAI;AAEJ,MAAI;AACF,kBAAc,MAAM,iBAAiB;AAAA,MACnC,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,wCAAwC,cAAc,IAAI;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAGA,QAAM,iBAAiB,MAAM,gCAAgC;AAC7D,MAAI,gBAAgB;AAClB,QAAI;AACF,YAAM,UAAU,MAAM,uBAAuB,gBAAgB,WAAW;AACxE,aAAO,EAAE,SAAS,YAAY;AAAA,IAChC,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ,gBAAgB;AAC9B,MAAI,OAAO;AACT,QAAI;AACF,YAAM,cAAkC;AAAA,QACtC,WAAW,kBAAG,WAAW,MAAM,SAAS;AAAA,QACxC,YAAY,OAAO,KAAK,MAAM,YAAY,KAAK;AAAA,QAC/C,MAAM,kBAAG,WAAW,MAAM,IAAI;AAAA,MAChC;AACA,YAAM,UAAU,MAAM,uBAAuB,aAAa,WAAW;AACrE,aAAO,EAAE,SAAS,YAAY;AAAA,IAChC,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,oBAAoB;AAChC;AAMA,eAAe,uBACb,aACA,aAC+B;AAC/B,QAAM,SAAS,YAAY;AAC3B,QAAM,kBAAkB,IAAI,kCAAsB,YAAY,UAAU;AACxE,QAAM,iBAAiB,MAAM,8BAAe;AAAA,IAC1C;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,EACd;AAEA,QAAM,UAAU,MAAM,eAAe,WAAW;AAChD,QAAM,WAAW,eAAe,YAAY;AAC5C,QAAM,WAAW,MAAM,eACpB,mBAAmB,EACnB,oBAAoB;AACvB,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA,eAAe,aAAa;AAAA,EAC9B;AACA,SAAO,WAAW,OAAO;AAIzB,QAAM,yBAAyB;AAC/B,MAAI;AACF,UAAM,QAAQ,KAAK;AAAA,MACjB,yBAAyB,gBAAgB,WAAW;AAAA,MACpD,IAAI;AAAA,QAAe,CAAC,GAAG,WACrB;AAAA,UACE,MAAM,OAAO,IAAI,MAAM,8BAA8B,CAAC;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ;AAAA,MACN;AAAA,MACA,eAAe,QAAQ,IAAI,UAAU;AAAA,IACvC;AAAA,EAEF;AAEA,SAAO;AACT;;;AEpUA,IAAAC,iBAAmB;AACnB,IAAAC,iBAA+B;AAC/B,IAAAC,mBAA8B;AA2C9B,eAAsB,4BACpB,QACA,eAC4C;AAE5C,MAAI,CAAC,OAAO,YAAY,GAAG;AACzB,QAAI;AACF,YAAM,OAAO,QAAQ;AAAA,IACvB,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,wBAAwB,OAAO,KAAK;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACJ,MAAI;AACF,kBAAc,MAAM,iBAAiB;AAAA,MACnC,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,wCAAwC,cAAc,IAAI;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AAEF,UAAM,EAAE,GAAG,EAAE,IAAI,MAAM,OAAO,aAAa;AAG3C,UAAM,sBAAsB,OAAO;AAAA,MACjC,CAAC;AAAA,IACH;AAGA,UAAM,kBAAkB,IAAI;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,UAAM,kBAAkB,MAAM,OAAO,gBAAgB;AACrD,UAAM,YAAY,UAAM,gCAAc,CAAC,kBAAG,WAAW,eAAe,CAAC,CAAC;AACtE,UAAM,OAAO,kBAAG,WAAW,OAAO,WAAW,CAAC;AAG9C,UAAM,SAAS,YAAY;AAC3B,UAAM,iBAAiB,MAAM,8BAAe;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,UAAM,UAAU,MAAM,eAAe,WAAW;AAChD,UAAM,WAAW,eAAe,YAAY;AAC5C,UAAM,WAAW,MAAM,eACpB,mBAAmB,EACnB,oBAAoB;AACvB,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA,eAAe,aAAa;AAAA,IAC9B;AACA,WAAO,WAAW,OAAO;AAGzB,QAAIC;AACJ,QAAI;AACF,MAAAA,cAAa,MAAM,yBAAyB,gBAAgB,WAAW;AAAA,IACzE,QAAQ;AAEN,MAAAA,cAAa,EAAE,UAAU,OAAO,SAAS,eAAe,QAAQ;AAAA,IAClE;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,YAAAA;AAAA,MACA,YAAY,OAAO;AAAA,MACnB,MAAM,OAAO,QAAQ;AAAA,IACvB;AAAA,EACF,SAAS,OAAO;AACd,QACE,iBAAiB,gBACjB,iBAAiB,uBACjB;AACA,YAAM;AAAA,IACR;AACA,UAAM,IAAI;AAAA,MACR,iCAAiC,OAAO,KAAK;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACF;;;ACpIO,IAAM,wBAAwB,CAAC,KAAe,SAAmB;AAAA,EACtE,iBAAiB,OACf,cAAiC,0BACC;AAClC,UAAM,cAAc,IAAI,EAAE;AAC1B,WAAO,YAAY,aAAa,YAAY;AAC1C,UAAI;AAAA,QACF,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,CAAC;AAED,YAAM,SAAS,gBAAgB,EAAE;AAEjC,YAAM,SAAS,MAAM,sBAAsB,MAAM;AAGjD,kBAAY,OAAO,WAAW;AAE9B,UAAI,OAAO,WAAW,UAAU;AAC9B,YAAI,EAAE,QAAQ,YAAY,CAAC;AAAA,MAC7B;AAEA,UAAI;AAAA,QACF,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AAED,aAAO,OAAO;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,yBAAyB,OACvB,cAAiC,0BACQ;AACzC,UAAM,cAAc,IAAI,EAAE;AAC1B,WAAO,YAAY,aAAa,YAAY;AAC1C,UAAI;AAAA,QACF,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,CAAC;AAED,YAAM,SAAS,gBAAgB,EAAE;AAEjC,UAAI;AACF,cAAM,SAAS,MAAM,4BAA4B,MAAM;AAEvD,YAAI;AAAA,UACF,SAAS,OAAO;AAAA,UAChB;AAAA,UACA,QAAQ;AAAA,UACR,WAAW;AAAA,QACb,CAAC;AAED,eAAO,OAAO;AAAA,MAChB,SAAS,OAAO;AACd,YAAI,iBAAiB,qBAAqB;AACxC,cAAI;AAAA,YACF,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,UAAU;AAAA,UACZ,CAAC;AACD,iBAAO;AAAA,QACT;AACA,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA;AACF;;;AC/EO,IAAM,8BAA8B,CAAC,KAAe,SAAmB;AAAA,EAC5E,uBAAuB,OACrB,QACA,gBACkC;AAClC,UAAM,cAAc,IAAI,EAAE;AAC1B,WAAO,YAAY,eAAe,OAAO,QAAQ,YAAY,YAAY;AACvE,UAAI;AAAA,QACF,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,CAAC;AAED,YAAM,SAAS,gBAAgB,EAAE;AAEjC,YAAM,SAAS,MAAM,4BAA4B,QAAQ,MAAM;AAE/D,UAAI,OAAO,WAAW,UAAU;AAC9B,YAAI,EAAE,QAAQ,YAAY,CAAC;AAAA,MAC7B;AAEA,UAAI;AAAA,QACF,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,YAAY,OAAO;AAAA,QACnB,eAAe,OAAO;AAAA,QACtB,WAAW;AAAA,MACb,CAAC;AAED,aAAO,OAAO;AAAA,IAChB,CAAC;AAAA,EACH;AACF;;;ACjBO,IAAM,wBAAwD;AAAA,EACnE,MAAM,CAAC,cAAc;AAAA,EACrB,cAAc,CAAC,SAAS,OAAO;AAAA,EAC/B,OAAO,CAAC,MAAM;AAAA,EACd,OAAO,CAAC,QAAQ,cAAc;AAChC;AAEO,IAAM,uBAAuB,CAClC,MACA,OACY;AACZ,MAAI,SAAS,GAAI,QAAO;AACxB,SAAO,sBAAsB,IAAI,GAAG,SAAS,EAAE,KAAK;AACtD;;;AtBnBA,IAAM,gCAAgC;AAOtC,IAAM,uBAAuB,CAAC,SAAuC;AACnE,MAAI;AACF,iBAAa,QAAQ,+BAA+B,KAAK,UAAU,IAAI,CAAC;AAAA,EAC1E,QAAQ;AAAA,EAER;AACF;AAEA,IAAM,wBAAwB,MAAY;AACxC,MAAI;AACF,iBAAa,WAAW,6BAA6B;AAAA,EACvD,QAAQ;AAAA,EAER;AACF;AAEO,IAAM,4BAA4B,MAAqC;AAC5E,MAAI;AACF,UAAM,OAAO,aAAa,QAAQ,6BAA6B;AAC/D,WAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,gBAA6B;AAAA,EACjC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,aAAa;AAAA,EACb,cAAc,CAAC;AAAA,EACf,iBAAiB,CAAC;AAAA,EAClB,aAAa;AAAA,EACb,YAAY,CAAC;AAAA,EACb,mBAAmB;AAAA,EACnB,uBAAuB;AACzB;AAEO,IAAM,qBAAiB,uBAAoB,CAAC,KAAK,SAAS;AAAA,EAC/D,GAAG;AAAA;AAAA,EAGH,cAAc,OACZ,aACA,QACG;AACH,UAAM,YAAY,IAAI,EAAE,WAAW,KAAK,CAAC,SAAS,KAAK,OAAO,WAAW;AACzE,QAAI,CAAC,WAAW;AACd,UAAI;AAAA,QACF,OAAO,cAAc,WAAW;AAAA,QAChC,QAAQ;AAAA,QACR,uBAAuB;AAAA,MACzB,CAAC;AACD,YAAM,IAAI,MAAM,cAAc,WAAW,aAAa;AAAA,IACxD;AAEA,QAAI,IAAI,EAAE,0BAA0B,aAAa;AAC/C,YAAM,IAAI,MAAM,cAAc,WAAW,yBAAyB;AAAA,IACpE;AAEA,QAAI;AAAA,MACF,uBAAuB;AAAA,MACvB,OAAO;AAAA,IACT,CAAC;AAED,QAAI;AACF,YAAM,SAAS,MAAM,IAAI,SAAS;AAClC,UAAI;AAAA,QACF,mBAAmB,UAAU;AAAA,QAC7B,YAAY,UAAU;AAAA,QACtB,QAAQ;AAAA,QACR,uBAAuB;AAAA,MACzB,CAAC;AACD,2BAAqB;AAAA,QACnB,aAAa,UAAU;AAAA,QACvB,YAAY,UAAU;AAAA,MACxB,CAAC;AACD,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,UACJ,eAAe,QAAQ,IAAI,UAAU;AACvC,UAAI;AAAA,QACF,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,mBAAmB;AAAA,QACnB,YAAY;AAAA,QACZ,uBAAuB;AAAA,MACzB,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,iBAAiB,OAAO,YAAyC;AAC/D,UAAM,EAAE,mBAAmB,WAAW,IAAI,IAAI;AAC9C,QAAI,CAAC,kBAAmB;AAExB,QAAI;AACF,UAAI,SAAS;AACX,cAAM,QAAQ;AAAA,MAChB;AAAA,IACF,UAAE;AACA,4BAAsB;AACtB,+BAAyB,EAAE,MAAM;AACjC,UAAI;AAAA,QACF,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,aAAa;AAAA,QACb,cAAc,CAAC;AAAA,QACf,iBAAiB,CAAC;AAAA,QAClB,aAAa;AAAA,QACb,mBAAmB;AAAA,QACnB,uBAAuB;AAAA,QACvB,WAAW;AAAA,QACX,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,CAAC,eAAe,IAAI,EAAE,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUjD,SAAS,OAAO,gBAAgB;AAC9B,UAAM,YAAY,IAAI,EAAE,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW;AACnE,QAAI,CAAC,WAAW;AACd,UAAI;AAAA,QACF,OAAO,cAAc,WAAW;AAAA,QAChC,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,IAAI,MAAM,cAAc,WAAW,aAAa;AAAA,IACxD;AACA,UAAM,UAAU,QAAQ;AAAA,EAC1B;AAAA;AAAA,EAGA,GAAG,sBAAsB,KAAK,GAAG;AAAA;AAAA,EAGjC,GAAG,4BAA4B,KAAK,GAAG;AAAA;AAAA,EAGvC,GAAG,qBAAqB,KAAK,GAAG;AAAA;AAAA,EAGhC,YAAY,OAAO,YAAyC;AAC1D,UAAM,IAAI,EAAE,gBAAgB,OAAO;AAAA,EACrC;AAAA,EAEA,UAAU,CAAC,UAAU,IAAI,EAAE,MAAM,CAAC;AAAA,EAElC,kBAAkB,CAAC,eAAe,eAAe,SAAS;AACxD,QAAI,EAAE,eAAe,aAAa,CAAC;AAAA,EACrC;AAAA,EAEA,cAAc,CAAC,WAAW,WAAW,SAAS;AAC5C,UAAM,gBAAgB,IAAI,EAAE;AAC5B,QAAI,CAAC,qBAAqB,eAAe,SAAS,GAAG;AACnD,cAAQ;AAAA,QACN,iCAAiC,aAAa,WAAM,SAAS;AAAA,MAC/D;AAAA,IACF;AACA,QAAI,EAAE,WAAW,SAAS,CAAC;AAAA,EAC7B;AAAA,EAEA,cAAc,YAAY;AACxB,UAAM,EAAE,cAAc,IAAI,IAAI;AAC9B,QAAI,kBAAkB,cAAc,kBAAkB,aAAa;AACjE;AAAA,IACF;AAEA,UAAM,EAAE,cAAc,IAAI,gBAAgB;AAC1C,QAAI,EAAE,eAAe,YAAY,cAAc,KAAK,CAAC;AAErD,QAAI;AACF,YAAM,eAAe,kBAAkB,cAAc,OAAO;AAC5D,UAAI,EAAE,eAAe,YAAY,CAAC;AAAA,IACpC,SAAS,OAAO;AACd,YAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,UAAI,EAAE,eAAe,SAAS,cAAc,QAAQ,CAAC;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,OAAO,MACL,IAAI,CAAC,WAAW;AAAA,IACd,GAAG;AAAA,IACH,YAAY,MAAM;AAAA,EACpB,EAAE;AAAA,EAEJ,iBAAiB,YAAY;AAC3B,UAAM,EAAE,mBAAmB,wBAAwB,IAAI,IAAI;AAC3D,UAAM,SAAS,0BAA0B;AAEzC,QAAI,UAAU,CAAC,mBAAmB;AAEhC,UAAI,OAAO,eAAe,YAAY;AACpC,YAAI;AACF,gBAAM,wBAAwB,OAAO,WAAW;AAAA,QAClD,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,WAAW,CAAC,UAAU,mBAAmB;AAEvC,4BAAsB;AACtB,+BAAyB,EAAE,MAAM;AACjC,UAAI,CAAC,WAAW;AAAA,QACd,GAAG;AAAA,QACH,YAAY,MAAM;AAAA,MACpB,EAAE;AAAA,IACJ;AAAA,EACF;AACF,EAAE;AAEK,IAAM,iBAAiB,MAAM,eAAe,SAAS;;;ARpP5D,IAAMC,eAAc;AAEpB,IAAM,eAAoD;AAAA,EACxD,SAAS;AAAA,EACT,QAAQ;AACV;AAkBA,IAAMC,iBAAuB;AAAA,EAC3B,eAAe;AAAA,EACf,oBAAoB,CAAC;AAAA,EACrB,gBAAgB;AAAA,EAChB,eAAe;AACjB;AAEO,IAAM,sBAAkB,wBAAqB,CAAC,KAAK,SAAS;AAAA,EACjE,GAAGA;AAAA,EAEH,YAAY,CAAC,YAAY;AACvB,UAAM,qBACJ,CAAC;AACH,eAAW,UAAU,SAAS;AAC5B,YAAM,OAAO,aAAa,OAAO,YAAY;AAC7C,UAAI,MAAM;AACR,2BAAmB,OAAO,YAAY,IAAI;AAAA,UACxC,GAAG;AAAA,UACH,SAAS,OAAO;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB,QAAQ,CAAC,GAAG,gBAAgB;AACnD,UAAM,gBAAgB,mBAAmB,cAAc,KAAK;AAE5D,UAAM,eAAe,aAAa;AAAA,MAChCD;AAAA,IACF;AACA,UAAM,gBACJ,gBAAgB,mBAAmB,YAAY,IAC3C,mBAAmB,YAAY,IAC/B;AAEN,QAAI;AAAA,MACF;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,IACjB,CAAC;AAED,sBAAkB;AAAA,EACpB;AAAA,EAEA,iBAAiB,CAAC,SAAS;AACzB,UAAM,EAAE,oBAAoB,cAAc,IAAI,IAAI;AAClD,UAAM,SAAS,mBAAmB,IAAoB;AACtD,QAAI,UAAU,OAAO,SAAS,cAAc,MAAM;AAChD,+BAAyB,EAAE,MAAM;AACjC,qBAAe,EAAE,aAAa,MAAM;AACpC,UAAI,EAAE,eAAe,OAAO,CAAC;AAC7B,mBAAa,QAAQA,cAAa,IAAI;AACtC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,MAAM;AACpB,UAAM,EAAE,gBAAgB,oBAAoB,cAAc,IAAI,IAAI;AAClE,UAAM,gBAAgB,mBAAmB,cAAc,KAAK;AAC5D,QAAI,cAAc,SAAS,cAAc,MAAM;AAC7C,+BAAyB,EAAE,MAAM;AACjC,qBAAe,EAAE,aAAa,MAAM;AAAA,IACtC;AACA,iBAAa,QAAQA,cAAa,cAAc;AAChD,QAAI,EAAE,eAAe,cAAc,CAAC;AAAA,EACtC;AAAA,EAEA,iBAAiB,MAAM;AACrB,UAAM,EAAE,oBAAoB,cAAc,IAAI,IAAI;AAClD,UAAM,eAAe,aAAa;AAAA,MAChCA;AAAA,IACF;AACA,QAAI,gBAAgB,mBAAmB,YAAY,GAAG;AACpD,YAAM,YAAY,mBAAmB,YAAY;AACjD,UAAI,UAAU,SAAS,cAAc,MAAM;AACzC,iCAAyB,EAAE,MAAM;AACjC,uBAAe,EAAE,aAAa,MAAM;AAAA,MACtC;AACA,UAAI,EAAE,eAAe,UAAU,CAAC;AAAA,IAClC;AAAA,EACF;AACF,EAAE;AAEK,IAAM,kBAAkB,MAAM,gBAAgB,SAAS;AAE9D,IAAI,kBAAkB;AACtB,SAAS,oBAAoB;AAC3B,MAAI,gBAAiB;AACrB,oBAAkB;AAElB,SAAO,iBAAiB,WAAW,CAAC,MAAoB;AACtD,QAAI,EAAE,QAAQA,cAAa;AACzB,sBAAgB,EAAE,gBAAgB;AAAA,IACpC;AAAA,EACF,CAAC;AACH;;;A+BrGA,IAAM,kBAAkB,CACtB,WACiC;AACjC,MACE,OAAO,SAAS,yBAChB,OAAO,SAAS,sBAChB;AACA,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,MAAM,OAAO;AAAA,EACf;AACF;AAeO,IAAM,yBAAN,MAAgE;AAAA,EAWrE,YAAY,QAAsC;AARlD,SAAS;AAGT,SAAQ,WAAyC;AACjD,SAAQ,eAAqC;AAE7C;AAAA,SAAQ,4BAA2C;AAGjD,SAAK,KAAK,OAAO;AACjB,SAAK,QAAQ,OAAO;AACpB,SAAK,iBAAiB,OAAO;AAG7B,SAAK,KAAK,kBAAkB,EAAE,MAAM,CAAC,UAAU;AAE7C,cAAQ;AAAA,QACN,2BAA2B,KAAK,EAAE;AAAA,QAClC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAA6C;AACjD,QAAI,CAAC,KAAK,UAAU;AAClB,WAAK,WAAW,MAAM,KAAK,eAAe;AAAA,IAC5C;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,aAA4B;AACxC,UAAM,UAAU,MAAM,KAAK,WAAW;AAEtC,UAAM,QAAQ,WAAW;AACzB,UAAM,QAAQ,QAAQ,SAAS;AAE/B,mBAAe,EAAE,sBAAsB;AAAA,MACrC,aAAa,MAAM;AAAA,MACnB,iBAAiB,MAAM;AAAA,IACzB,CAAC;AAGD,YAAQ,kBAAkB,OAAO,aAAa;AAC5C,YAAM,eAAe,uBAAO,iBAAiB;AAC7C,WAAK,4BAA4B;AAEjC,YAAM,kBAAkB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAC5D,YAAM,QAAQ,eAAe;AAE7B,YAAM,sBAAsB;AAAA,QAC1B,cAAc;AAAA,QACd,aAAa;AAAA,MACf,CAAC;AAED,UAAI,iBAAiB;AACnB,YAAI;AACF,gBAAM,gBAAgB,MAAM,QAAQ,gBAAgB,eAAe;AACnE,cAAI,KAAK,8BAA8B,cAAc;AACnD;AAAA,UACF;AACA,yBAAe,EAAE,sBAAsB,EAAE,SAAS,cAAc,CAAC;AAAA,QACnE,QAAQ;AACN,cAAI,KAAK,8BAA8B,cAAc;AACnD;AAAA,UACF;AACA,yBAAe,EAAE,sBAAsB,EAAE,SAAS,KAAK,CAAC;AAAA,QAC1D;AAAA,MACF,OAAO;AACL,uBAAe,EAAE,sBAAsB,EAAE,SAAS,KAAK,CAAC;AAAA,MAC1D;AAAA,IACF,CAAC;AAED,YAAQ,eAAe,YAAY;AACjC,YAAM,eAAe,EAAE,WAAW;AAAA,IACpC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAmC;AACzC,QAAI,CAAC,KAAK,cAAc;AACtB,WAAK,eAAe,KAAK,WAAW,EAAE,MAAM,CAAC,UAAU;AAErD,aAAK,eAAe;AACpB,cAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,QAAQ;AACtB,WAAK,WAAW;AAChB,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,YAA6B;AAC3B,UAAM,QAAQ,eAAe;AAC7B,UAAM,kBAAkB,MAAM;AAG9B,UAAM,UAAU,KAAK;AACrB,UAAM,cAAc,kBAChB,MAAM,cACL,SAAS,SAAS,EAAE,eAAe;AAExC,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,kBAAkB,MAAM,SAAS;AAAA,MACzC,OAAO,kBAAkB,MAAM,QAAQ;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,aAA0C;AACxC,UAAM,QAAQ,eAAe;AAC7B,QAAI,MAAM,+CAA0C;AAClD,aAAO,MAAM;AAAA,IACf;AACA,WAAO;AAAA,EACT;AAAA,EAEA,iBAAqC;AACnC,UAAM,QAAQ,eAAe;AAC7B,QAAI,MAAM,+CAA0C;AAClD,aAAO,MAAM;AAAA,IACf;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAyB;AAC7B,UAAM,KAAK,kBAAkB;AAE7B,UAAM,UAAU,MAAM,KAAK,WAAW;AACtC,UAAM,SAAS,gBAAgB,EAAE;AACjC,UAAM,eAAe,EAAE,qBAAqB,SAAS,OAAO,MAAM,KAAK,EAAE;AAAA,EAC3E;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,UAAU,KAAK;AACrB,UAAM,eAAe,EAAE,WAAW,YAAY;AAC5C,UAAI,SAAS;AACX,cAAM,QAAQ,WAAW;AACzB,gBAAQ,QAAQ;AAAA,MAClB;AACA,WAAK,WAAW;AAChB,WAAK,eAAe;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBACJ,SACqC;AACrC,UAAM,QAAQ,eAAe;AAC7B,UAAM,UAAU,MAAM;AACtB,UAAM,QAAQ,MAAM,gBAAgB,CAAC,KAAK;AAE1C,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AAEA,UAAM,YAA+B;AAAA,MACnC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,OAAO,QAAQ,QAAQ,IAAI,eAAe;AAAA,IAC5C;AAEA,UAAM,SAAS,MAAM,KAAK,iBAAiB,SAAS;AAEpD,QAAI,OAAO,WAAW,MAAM;AAC1B,YAAM,UACJ,WAAW,UAAU,OAAO,QAAQ,OAAO,QAAQ;AACrD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AAAA,MAC5D,WAAW,OAAO;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBACJ,WACuC;AACvC,UAAM,UAAU,MAAM,KAAK,WAAW;AACtC,UAAM,UAAU,MAAM,QAAQ,kBAAkB,CAAC,SAAS,CAAC;AAE3D,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AAEA,WAAO,QAAQ,CAAC;AAAA,EAClB;AACF;;;AClRO,IAAM,iBAAiB;AAAA,EAC5B,UAAU;AAAA,EACV,cAAc;AAAA,EACd,YAAY;AACd;AAKO,IAAM,uBAAuB;AAAA,EAClC,OAAO;AAAA,EACP,UACE;AACJ;AAKO,IAAM,0BAA+C;AAAA,EAC1D,OAAO,eAAe;AAAA,EACtB,SAAS;AACX;;;ACnBE;AALK,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACE;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR;AAAA,IACC,GAAG;AAAA,IAEJ;AAAA,kDAAC,WACE,gIACH;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,GAAE;AAAA;AAAA,MACJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,WAAU;AAAA;AAAA,MACZ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,WAAU;AAAA;AAAA,MACZ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,GAAE;AAAA;AAAA,MACJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,GAAE;AAAA;AAAA,MACJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,GAAE;AAAA;AAAA,MACJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,GAAE;AAAA;AAAA,MACJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,WAAU;AAAA;AAAA,MACZ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,GAAE;AAAA;AAAA,MACJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,GAAE;AAAA;AAAA,MACJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,GAAE;AAAA;AAAA,MACJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,WAAU;AAAA;AAAA,MACZ;AAAA;AAAA;AACF;;;AC7EI,IAAAE,sBAAA;AAXC,IAAM,YAAY,CAAC,EAAE,MAAM,WAAW,GAAG,MAAM,MACpD;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR;AAAA,IACA,MAAK;AAAA,IACJ,GAAG;AAAA,IAEJ;AAAA,oDAAC,UACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,eAAc;AAAA,YAEd;AAAA,2DAAC,UAAK,WAAU,WAAU;AAAA,cAC1B,6CAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA;AAAA;AAAA,QACvC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,eAAc;AAAA,YAEd;AAAA,2DAAC,UAAK,WAAU,WAAU;AAAA,cAC1B,6CAAC,UAAK,QAAO,KAAI,WAAU,WAAU,aAAY,KAAI;AAAA;AAAA;AAAA,QACvD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,eAAc;AAAA,YAEd;AAAA,2DAAC,UAAK,WAAU,WAAU;AAAA,cAC1B,6CAAC,UAAK,QAAO,KAAI,WAAU,WAAU,aAAY,KAAI;AAAA;AAAA;AAAA,QACvD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,eAAc;AAAA,YAEd;AAAA,2DAAC,UAAK,WAAU,WAAU;AAAA,cAC1B,6CAAC,UAAK,QAAO,YAAW,WAAU,WAAU;AAAA;AAAA;AAAA,QAC9C;AAAA,SACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,UAAS;AAAA,UACT,UAAS;AAAA,UACT,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,UAAS;AAAA,UACT,UAAS;AAAA,UACT,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA;AAAA;AACF;;;AClEE,IAAAC,sBAAA;AAVG,IAAM,cAAc,CAAC,EAAE,MAAM,WAAW,GAAG,MAAM,MACtD;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR;AAAA,IACA,MAAK;AAAA,IACJ,GAAG;AAAA,IAEJ;AAAA,oDAAC,OAAE,UAAS,sBACV;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,UAAS;AAAA,YACT,UAAS;AAAA,YACT,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,SACF;AAAA,MACA,6CAAC,UACC,uDAAC,cAAS,IAAG,gBACX,uDAAC,UAAK,OAAM,MAAK,QAAO,MAAK,IAAG,MAAK,MAAK,SAAQ,GACpD,GACF;AAAA;AAAA;AACF;;;ACOK,IAAM,qBAAsD;AAAA,EACjE,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAMO,IAAM,uBAA0D;AAAA,EACrE,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,YAAY;AAEtB,YAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM;AACjC,aAAO,IAAIA,gBAAe;AAAA,IAC5B;AAAA,IACA,gBAAgB,YAAY;AAC1B,YAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,uBAAuB;AAC9D,aAAOA,eAAc,mBAAmB;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeF;AASO,SAAS,mBAAmB,IAAyC;AAC1E,SAAO,mBAAmB,EAAE;AAC9B;AAKO,SAAS,qBACd,IAC+B;AAC/B,SAAO,qBAAqB,EAAE;AAChC;AAKO,SAAS,2BAAqC;AACnD,SAAO,OAAO,KAAK,kBAAkB;AACvC;AAKO,SAAS,6BAAuC;AACrD,SAAO,OAAO,KAAK,oBAAoB;AACzC;;;ACzFA,SAAS,kBACP,OACiD;AACjD,SACE,OAAO,UAAU,YACjB,UAAU,QACV,aAAa,SACb,MAAM,QAAS,MAA+B,OAAO;AAEzD;AAKA,SAAS,kBAAkB,KAAkC;AAC3D,QAAM,UAA6B,CAAC;AAEpC,aAAW,MAAM,KAAK;AACpB,UAAM,SAAS,mBAAmB,EAAE;AACpC,QAAI,QAAQ;AACV,cAAQ,KAAK;AAAA,QACX,IAAI,OAAO;AAAA,QACX,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,MACf,CAAC;AAAA,IACH,OAAO;AACL,cAAQ;AAAA,QACN,oCAAoC,EAAE;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,oBAAoB,KAA2C;AACtE,QAAM,UAAsC,CAAC;AAE7C,aAAW,MAAM,KAAK;AACpB,UAAM,SAAS,qBAAqB,EAAE;AACtC,QAAI,QAAQ;AACV,cAAQ,KAAK;AAAA,QACX,IAAI,OAAO;AAAA,QACX,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb,SAAS,OAAO;AAAA,QAChB,gBAAgB,OAAO;AAAA,MACzB,CAAC;AAAA,IACH,OAAO;AACL,YAAM,YAAY,OAAO,KAAK,oBAAoB,EAAE,KAAK,IAAI;AAC7D,cAAQ;AAAA,QACN,sCAAsC,EAAE,iBAAiB,SAAS;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,iCAAiC,cAInB;AACrB,QAAM,aAAiC,CAAC;AAGxC,MAAI,aAAa,aAAa,OAAO;AACnC,eAAW,KAAK,uBAAuB;AAAA,EACzC;AAGA,MAAI,aAAa,eAAe,OAAO;AACrC,eAAW,UAAU,aAAa,WAAW,SAAS;AACpD,iBAAW;AAAA,QACT,MACE,IAAI,wBAAwB;AAAA,UAC1B,IAAI,OAAO;AAAA,UACX,OAAO,OAAO;AAAA,UACd;AAAA,UACA,MAAM,OAAO;AAAA,QACf,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAGA,MAAI,aAAa,iBAAiB,OAAO;AACvC,eAAW,UAAU,aAAa,aAAa,SAAS;AACtD,YAAM,SAAS,qBAAqB,OAAO,EAAE;AAC7C,UAAI,QAAQ;AACV,mBAAW;AAAA,UACT,MACE,IAAI,uBAAuB;AAAA,YACzB,IAAI,OAAO;AAAA,YACX,OAAO,OAAO;AAAA,YACd,gBAAgB,OAAO;AAAA,UACzB,CAAC;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAoCO,SAAS,wBACd,QAC2B;AAC3B,QAAM,EAAE,aAAa,IAAI;AAIzB,MAAI;AACJ,MAAI,aAAa,aAAa,OAAO;AACnC,uBAAmB;AAAA,EACrB,WAAW,aAAa,aAAa,QAAQ,CAAC,aAAa,UAAU;AACnE,uBAAmB,EAAE,GAAG,wBAAwB;AAAA,EAClD,OAAO;AACL,uBAAmB;AAAA,MACjB,GAAG;AAAA,MACH,GAAG,aAAa;AAAA,IAClB;AAAA,EACF;AAIA,MAAI;AACJ,MAAI,aAAa,iBAAiB,SAAS,CAAC,aAAa,cAAc;AACrE,2BAAuB;AAAA,EACzB,WAAW,cAAc,aAAa,YAAY,GAAG;AAEnD,UAAM,UAAU,oBAAoB,aAAa,YAAY;AAC7D,2BACE,QAAQ,SAAS,IACb,EAAE,OAAO,eAAe,cAAc,QAAQ,IAC9C;AAAA,EACR,WAAW,kBAAkB,aAAa,YAAY,GAAG;AAEvD,2BAAuB;AAAA,MACrB,OAAO,aAAa,aAAa,SAAS,eAAe;AAAA,MACzD,SAAS,aAAa,aAAa;AAAA,IACrC;AAAA,EACF,OAAO;AACL,2BAAuB;AAAA,EACzB;AAIA,MAAI;AACJ,MAAI,aAAa,eAAe,SAAS,CAAC,aAAa,YAAY;AACjE,yBAAqB;AAAA,EACvB,WAAW,cAAc,aAAa,UAAU,GAAG;AAEjD,UAAM,UAAU,kBAAkB,aAAa,UAAU;AACzD,yBACE,QAAQ,SAAS,IACb,EAAE,OAAO,eAAe,YAAY,QAAQ,IAC5C;AAAA,EACR,WAAW,kBAAkB,aAAa,UAAU,GAAG;AAErD,yBAAqB;AAAA,MACnB,OAAO,aAAa,WAAW,SAAS,eAAe;AAAA,MACvD,SAAS,aAAa,WAAW;AAAA,IACnC;AAAA,EACF,OAAO;AACL,yBAAqB;AAAA,EACvB;AAEA,QAAM,uBAAkE;AAAA,IACtE,UAAU;AAAA,IACV,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AAGA,QAAM,aAAa,iCAAiC,oBAAoB;AAExE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,gBAAgB,OAAO,kBAAkB,OAAO,SAAS,CAAC,GAAG;AAAA,IAC7D,OAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG,OAAO;AAAA,IACZ;AAAA,IACA,cAAc;AAAA,IACd;AAAA,EACF;AACF;;;AC3PA,0BAAiD;AAiB1C,IAAM,kBAAyD;AAAA,EACpE,QAAQ;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AACF;AASO,SAAS,iBACd,MACmC;AACnC,SAAO,gBAAgB,KAAK,YAAY,CAAC;AAC3C;AAKO,SAAS,eACd,MACA,YAC6B;AAE7B,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,iBAAiB,IAAI;AACpC,MAAI,QAAQ;AACV,WAAO,OAAO;AAAA,EAChB;AAGA,SAAO;AACT;AAKO,SAAS,sBACd,MACA,mBACQ;AAER,MAAI,mBAAmB;AACrB,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,iBAAiB,IAAI;AACpC,MAAI,QAAQ;AACV,WAAO,OAAO;AAAA,EAChB;AAGA,SAAO,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AACpD;","names":["import_addresses","init_azguard","import_zustand","import_addresses","import_fields","import_log","import_constants","import_SponsoredFPC","import_log","import_constants","logger","import_addresses","logger","import_viem","import_fields","import_viem","import_account","import_addresses","import_fields","import_wallet","import_fields","deployment","import_fields","import_wallet","import_poseidon","deployment","STORAGE_KEY","INITIAL_STATE","import_jsx_runtime","import_jsx_runtime","AzguardAdapter","AzguardClient"]}