@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/providers/index.ts","../../../src/aztec-wallet/providers/AztecWalletProvider.tsx","../../../src/utils/cn.ts","../../../src/utils/configValidation.ts","../../../src/utils/iconSize.ts","../../../src/utils/string.ts","../../../src/aztec-wallet/components/AztecWalletModals/AztecWalletModals.tsx","../../../src/aztec-wallet/providers/context.tsx","../../../src/aztec-wallet/store/modal.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/connectors/BrowserWalletConnector.ts","../../../src/aztec-wallet/connectors/registry.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/components/AccountModal/AccountModal.tsx","../../../src/components/ui/Button.tsx","../../../src/aztec-wallet/theme/classes.ts","../../../src/components/ui/Badge.tsx","../../../src/components/ui/Dialog.tsx","../../../src/components/ui/VisuallyHidden.tsx","../../../src/hooks/useCopyToClipboard.ts","../../../src/utils/clipboard.ts","../../../src/aztec-wallet/config/networkPresets.ts","../../../src/aztec-wallet/components/ConnectButton/ConnectButton.tsx","../../../src/aztec-wallet/components/shared/Spinner.tsx","../../../src/aztec-wallet/components/shared/AddressDisplay.tsx","../../../src/aztec-wallet/components/shared/IconRenderer.tsx","../../../src/aztec-wallet/components/shared/WalletButton.tsx","../../../src/aztec-wallet/components/shared/WalletGroupButton.tsx","../../../src/aztec-wallet/components/shared/BackButton.tsx","../../../src/aztec-wallet/components/shared/NetworkIcon.tsx","../../../src/aztec-wallet/components/ConnectModal/context.tsx","../../../src/aztec-wallet/components/ConnectModal/views/MainView.tsx","../../../src/aztec-wallet/components/ConnectModal/views/AztecWalletsView.tsx","../../../src/aztec-wallet/hooks/useWalletAvailability.ts","../../../src/aztec-wallet/store/evm/store.ts","../../../src/aztec-wallet/components/ConnectModal/views/EVMWalletsView.tsx","../../../src/aztec-wallet/components/ConnectModal/views/ConnectingView.tsx","../../../src/aztec-wallet/components/ConnectModal/views/SuccessView.tsx","../../../src/aztec-wallet/components/ConnectModal/ConnectModal.tsx","../../../src/aztec-wallet/components/NetworkModal/NetworkModal.tsx","../../../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/hooks/useEIP6963Discovery.ts","../../../src/aztec-wallet/theme/style-injector.tsx"],"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 {\n AztecWalletProvider,\n type AztecWalletProviderProps,\n} from './AztecWalletProvider';\nexport { AztecWalletContext, useAztecWalletContext } from './context';\n","import React, { useEffect, useMemo, useRef } from 'react'\nimport { useShallow } from 'zustand/react/shallow'\nimport { isValidConfig } from '../../utils'\nimport { AztecWalletModals } from '../components/AztecWalletModals'\nimport { createAztecWalletConfig } from '../config'\nimport { createConnectorRegistry } from '../connectors/registry'\nimport { useEIP6963Discovery } from '../hooks/useEIP6963Discovery'\nimport { getEIP6963Service, getEVMWalletService } from '../services/evm'\nimport { getNetworkStore, useNetworkStore } from '../store/network'\nimport {\n useWalletStore,\n getWalletStore,\n getStoredWalletConnection,\n setupWalletCrossTabSync,\n} from '../store/wallet'\nimport { WalletType } from '../types/aztec'\nimport { AztecWalletContext } from './context'\nimport { ThemeStyleInjector } from '../theme'\nimport type { AztecNetwork } from '../../config/networks/constants'\nimport type { ExternalSignerWalletConnector } from '../../types/walletConnector'\nimport type {\n AztecWalletConfig,\n NetworkPreset,\n StoreNetworkPreset,\n} from '../types'\n\nexport interface AztecWalletProviderProps {\n /** AztecWallet configuration */\n config: AztecWalletConfig\n /** Child components */\n children: React.ReactNode\n /**\n * Whether to inject default theme styles.\n * Set to false if you want complete control over styling via your own CSS.\n * @default true\n */\n enableDefaultTheme?: boolean\n /**\n * Custom CSS to inject alongside or instead of the default theme.\n * Use this to override specific variables without disabling the entire default theme.\n */\n customThemeCss?: string\n}\n\n/**\n * Internal component that handles auto-reconnection on mount.\n * Automatically reconnects to the last connected wallet when the app loads.\n */\nconst AutoReconnect: React.FC = () => {\n const autoConnectAttempted = useRef(false)\n\n const connectors = useWalletStore((state) => state.connectors)\n const status = useWalletStore((state) => state.status)\n\n const walletActions = useWalletStore(\n useShallow((state) => ({\n connect: state.connect,\n connectExistingEmbedded: state.connectExistingEmbedded,\n hasSavedEmbeddedAccount: state.hasSavedEmbeddedAccount,\n })),\n )\n\n const isInitialized = connectors.length > 0\n const isConnected = status === 'connected'\n const isConnecting = status === 'connecting' || status === 'deploying'\n\n useEffect(() => {\n // Only attempt once, when initialized, and not already connected\n if (\n autoConnectAttempted.current ||\n !isInitialized ||\n isConnected ||\n isConnecting\n ) {\n return\n }\n\n autoConnectAttempted.current = true\n\n // Check if there was an active connection saved\n const storedConnection = getStoredWalletConnection()\n\n if (!storedConnection) {\n console.log('AztecWallet: No saved connection found')\n return\n }\n\n const { connectorId, walletType } = storedConnection\n console.log(\n `AztecWallet: Found saved connection - ${connectorId} (${walletType})`,\n )\n\n // Find the connector\n const savedConnector = connectors.find((c) => c.id === connectorId)\n\n if (!savedConnector) {\n console.warn(`AztecWallet: Saved connector \"${connectorId}\" not found`)\n return\n }\n\n // Auto-reconnect based on wallet type\n const reconnect = async () => {\n try {\n switch (walletType) {\n case WalletType.EMBEDDED:\n // For embedded, check if credentials exist\n if (walletActions.hasSavedEmbeddedAccount()) {\n console.log(\n 'AztecWallet: Auto-reconnecting to embedded wallet...',\n )\n await walletActions.connectExistingEmbedded(connectorId)\n } else {\n console.warn('AztecWallet: No saved embedded credentials found')\n }\n break\n\n case WalletType.EXTERNAL_SIGNER:\n // For external signer (MetaMask, etc.), try silent reconnection\n await tryExternalSignerReconnect(savedConnector, connectorId)\n break\n\n case WalletType.BROWSER_WALLET:\n // For browser wallets, try to reconnect - if session exists it will be silent\n console.log('AztecWallet: Auto-reconnecting to browser wallet...')\n await walletActions.connect(connectorId)\n break\n\n default:\n console.warn(`AztecWallet: Unknown wallet type: ${walletType}`)\n }\n } catch (err) {\n console.warn('AztecWallet: Auto-reconnect failed:', err)\n }\n }\n\n /**\n * Try to silently reconnect to an external signer wallet.\n * Uses eth_accounts (no popup) to check if we still have permissions.\n */\n const tryExternalSignerReconnect = async (\n connector: (typeof connectors)[0],\n id: string,\n ) => {\n const externalConnector = connector as ExternalSignerWalletConnector\n const rdns = externalConnector.rdns\n\n if (!rdns) {\n console.log(\n 'AztecWallet: External signer has no rdns, skipping auto-reconnect',\n )\n return\n }\n\n // Check if the wallet is available via EIP-6963\n const eip6963 = getEIP6963Service()\n const provider = eip6963.getProviderByRdns(rdns)\n\n if (!provider) {\n console.log(\n `AztecWallet: Wallet ${rdns} not found via EIP-6963, cannot auto-reconnect`,\n )\n return\n }\n\n try {\n // Use eth_accounts to check if we have permissions (no popup)\n const accounts = (await provider.request({\n method: 'eth_accounts',\n })) as string[]\n\n if (accounts && accounts.length > 0) {\n console.log(\n `AztecWallet: Found existing permission for ${rdns}, auto-reconnecting...`,\n )\n await walletActions.connect(id)\n } else {\n console.log(\n `AztecWallet: No existing permission for ${rdns}, user needs to reconnect manually`,\n )\n }\n } catch (err) {\n console.warn(`AztecWallet: Failed to check ${rdns} permissions:`, err)\n }\n }\n\n reconnect()\n }, [isInitialized, isConnected, isConnecting, connectors, walletActions])\n\n return null\n}\n\n/**\n * Convert AztecWalletConfig networks to StoreNetworkPreset format for the store\n */\nfunction toStoreNetworkPresets(\n networks: NetworkPreset[],\n): StoreNetworkPreset[] {\n return networks.map((n) => ({\n aztecNetwork: n.name as AztecNetwork,\n nodeUrl: n.nodeUrl,\n }))\n}\n\n/**\n * AztecWallet Provider\n *\n * Main provider that:\n * 1. Resolves the configuration with defaults\n * 2. Auto-creates connectors from walletGroups\n * 3. Initializes network and wallet stores\n * 4. Sets up cross-tab synchronization\n * 5. Provides configuration context to components\n * 6. Renders wallet modals\n * 7. Injects default theme styles (can be disabled)\n *\n * @example\n * ```tsx\n * // With default theme (recommended)\n * <AztecWalletProvider config={config}>\n * <App />\n * </AztecWalletProvider>\n *\n * // With custom theme (disable default)\n * <AztecWalletProvider config={config} enableDefaultTheme={false}>\n * <App />\n * </AztecWalletProvider>\n *\n * // With custom CSS overrides\n * <AztecWalletProvider \n * config={config} \n * customThemeCss={`:root { --aw-accent: #your-color; }`}\n * >\n * <App />\n * </AztecWalletProvider>\n * ```\n */\nexport const AztecWalletProvider: React.FC<AztecWalletProviderProps> = ({\n config: userConfig,\n children,\n enableDefaultTheme = true,\n customThemeCss,\n}) => {\n const { setConnectors, disconnect } = useWalletStore(\n useShallow((state) => ({\n setConnectors: state.setConnectors,\n disconnect: state.disconnect,\n })),\n )\n const { initialize: initializeNetwork, resetToDefault } = useNetworkStore(\n useShallow((state) => ({\n initialize: state.initialize,\n resetToDefault: state.resetToDefault,\n })),\n )\n const currentConfig = useNetworkStore((state) => state.currentConfig)\n\n // Trigger EIP-6963 wallet discovery for EVM wallets\n // This populates the EVM store with discovered wallets\n const evmServiceAvailable = getEVMWalletService().isAvailable()\n useEIP6963Discovery(evmServiceAvailable)\n\n // Resolve config with defaults\n const resolvedConfig = useMemo(\n () => createAztecWalletConfig(userConfig),\n [userConfig],\n )\n\n // Initialize network store\n useEffect(() => {\n const networkPresets = toStoreNetworkPresets(userConfig.networks)\n\n if (!getNetworkStore().isInitialized) {\n initializeNetwork(networkPresets)\n }\n\n setupWalletCrossTabSync()\n }, [userConfig.networks, initializeNetwork])\n\n // Validate network config\n useEffect(() => {\n if (!isValidConfig(currentConfig)) {\n console.warn(\n `⚠️ Invalid config for ${currentConfig.name}, falling back to default`,\n )\n resetToDefault()\n }\n }, [currentConfig, resetToDefault])\n\n // Check network availability in background when network changes\n useEffect(() => {\n if (currentConfig?.nodeUrl) {\n // Reset status and check in background (non-blocking)\n const walletStore = getWalletStore()\n walletStore.setNetworkStatus('idle')\n void walletStore.checkNetwork()\n }\n }, [currentConfig?.nodeUrl])\n\n // Initialize connectors from resolved config\n useEffect(() => {\n const registry = createConnectorRegistry(resolvedConfig.connectors)\n setConnectors(registry.getConnectors())\n\n return () => {\n disconnect()\n }\n }, [\n resolvedConfig.connectors,\n currentConfig.nodeUrl,\n setConnectors,\n disconnect,\n ])\n\n // Check if connectors are initialized\n const connectors = useWalletStore((state) => state.connectors)\n const isInitialized = connectors.length > 0\n\n // Context value\n const contextValue = useMemo(\n () => ({\n config: resolvedConfig,\n isInitialized,\n }),\n [resolvedConfig, isInitialized],\n )\n\n return (\n <AztecWalletContext.Provider value={contextValue}>\n <ThemeStyleInjector enabled={enableDefaultTheme} customCss={customThemeCss} />\n <AutoReconnect />\n {children}\n <AztecWalletModals />\n </AztecWalletContext.Provider>\n )\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Utility to merge Tailwind classes\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { AztecAddress } from '@aztec/aztec.js/addresses';\nimport { Fr } from '@aztec/aztec.js/fields';\n\nconst PLACEHOLDER_ADDRESS = '0x0000000000000000000000000000000000000000000000000000000000000000';\n\n/**\n * Validates that a network configuration has valid contract addresses.\n * Returns false if addresses are placeholders or invalid.\n * \n * Stub implementation for SDK - checks basic requirements.\n */\nexport const isValidConfig = (config: {\n nodeUrl?: string;\n tokenContractAddress?: string;\n dripperContractAddress?: string;\n deployerAddress?: string;\n dripperDeploymentSalt?: string;\n tokenDeploymentSalt?: string;\n}): boolean => {\n // Check required fields exist\n if (\n !config.nodeUrl\n ) {\n return false;\n }\n\n // If contract addresses are provided, validate them\n if (config.tokenContractAddress) {\n if (config.tokenContractAddress === PLACEHOLDER_ADDRESS) {\n return false;\n }\n try {\n AztecAddress.fromString(config.tokenContractAddress);\n } catch {\n return false;\n }\n }\n\n if (config.dripperContractAddress) {\n if (config.dripperContractAddress === PLACEHOLDER_ADDRESS) {\n return false;\n }\n try {\n AztecAddress.fromString(config.dripperContractAddress);\n } catch {\n return false;\n }\n }\n\n // Validate deployment salts if provided\n if (config.dripperDeploymentSalt) {\n try {\n Fr.fromString(config.dripperDeploymentSalt);\n } catch {\n return false;\n }\n }\n\n if (config.tokenDeploymentSalt) {\n try {\n Fr.fromString(config.tokenDeploymentSalt);\n } catch {\n return false;\n }\n }\n\n return true;\n};\n","/**\n * Icon size utility for consistent Lucide icon sizing across the app.\n *\n * Returns pixel values to use with Lucide's `size` prop.\n */\n\nconst sizes = {\n xxs: 8,\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n '2xl': 48,\n} as const;\n\nexport type IconSize = keyof typeof sizes;\n\n/**\n * Returns pixel size for Lucide icons.\n * @param size - Size variant: 'xxs', 'xs', 'sm' (default), 'md', 'lg', 'xl', '2xl'\n * @returns Pixel value for the icon size\n */\nexport const iconSize = (size: IconSize = 'sm'): number => sizes[size];\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 React, { useCallback } from 'react';\nimport { useShallow } from 'zustand/react/shallow';\nimport { useAztecWalletContext } from '../../providers/context';\nimport { useModalStore } from '../../store/modal';\nimport { useNetworkStore } from '../../store/network';\nimport { useWalletStore } from '../../store/wallet';\nimport { AccountModal } from '../AccountModal';\nimport { ConnectModal } from '../ConnectModal';\nimport { NetworkModal } from '../NetworkModal';\nimport type { ModalWalletType } from '../../types';\n\n/**\n * Internal component that renders all AztecWallet modals\n *\n * This component is automatically rendered inside AztecWalletProvider.\n * Users don't need to render modals manually.\n */\nexport const AztecWalletModals: React.FC = () => {\n const { config } = useAztecWalletContext();\n\n // Modal state\n const { openModal, closeModal, setModal } = useModalStore(\n useShallow((state) => ({\n openModal: state.openModal,\n closeModal: state.closeModal,\n setModal: state.setModal,\n }))\n );\n\n // Wallet state\n const walletState = useWalletStore(\n useShallow((state) => ({\n account: state.account,\n status: state.status,\n connect: state.connect,\n connectEmbedded: state.connectEmbedded,\n connectExistingEmbedded: state.connectExistingEmbedded,\n hasSavedEmbeddedAccount: state.hasSavedEmbeddedAccount,\n disconnect: state.disconnect,\n connectors: state.connectors,\n }))\n );\n\n // Network state\n const currentConfig = useNetworkStore((state) => state.currentConfig);\n\n const isConnected = walletState.status === 'connected';\n const address = walletState.account?.getAddress().toString() ?? '';\n\n // Handle connect modal open change\n const handleConnectOpenChange = useCallback(\n (open: boolean) => {\n setModal(open ? 'connect' : null);\n },\n [setModal]\n );\n\n // Handle account modal open change\n const handleAccountOpenChange = useCallback(\n (open: boolean) => {\n setModal(open ? 'account' : null);\n },\n [setModal]\n );\n\n // Handle network modal open change\n const handleNetworkOpenChange = useCallback(\n (open: boolean) => {\n setModal(open ? 'network' : null);\n },\n [setModal]\n );\n\n // Handle wallet connection from modal\n const handleConnect = useCallback(\n async (walletId: string, walletType: ModalWalletType) => {\n // Use the appropriate connection method based on wallet type\n if (walletType === 'embedded') {\n if (walletState.hasSavedEmbeddedAccount()) {\n await walletState.connectExistingEmbedded(walletId);\n } else {\n await walletState.connectEmbedded(walletId);\n }\n } else {\n await walletState.connect(walletId);\n }\n\n closeModal();\n },\n [walletState, closeModal]\n );\n\n // Handle disconnect\n const handleDisconnect = useCallback(async () => {\n await walletState.disconnect();\n closeModal();\n }, [walletState, closeModal]);\n\n return (\n <>\n {/* Connect Modal */}\n <ConnectModal\n open={openModal === 'connect'}\n onOpenChange={handleConnectOpenChange}\n config={config}\n onConnect={handleConnect}\n />\n\n {/* Account Modal */}\n {isConnected && address && (\n <AccountModal\n open={openModal === 'account'}\n onOpenChange={handleAccountOpenChange}\n address={address}\n networkName={currentConfig?.name}\n showNetwork={config.accountModal?.showNetwork}\n onDisconnect={handleDisconnect}\n />\n )}\n\n {/* Network Modal */}\n <NetworkModal\n open={openModal === 'network'}\n onOpenChange={handleNetworkOpenChange}\n networks={config.networks}\n />\n </>\n );\n};\n","import { createContext, useContext, type Context } from 'react'\nimport type { ResolvedAztecWalletConfig } from '../types'\n\nexport interface AztecWalletContextValue {\n /** Resolved configuration */\n config: ResolvedAztecWalletConfig\n /** Whether the wallet is initialized */\n isInitialized: boolean\n}\n\nconst AZTEC_WALLET_CONTEXT_KEY = Symbol.for(\n 'ravenhouse.aztec-wallet.context',\n)\n\nconst globalContextStore = globalThis as typeof globalThis & {\n [AZTEC_WALLET_CONTEXT_KEY]?: Context<AztecWalletContextValue | null>\n}\n\nexport const AztecWalletContext =\n globalContextStore[AZTEC_WALLET_CONTEXT_KEY] ??\n (globalContextStore[AZTEC_WALLET_CONTEXT_KEY] =\n createContext<AztecWalletContextValue | null>(null))\n\nexport const useAztecWalletContext = (): AztecWalletContextValue => {\n const context = useContext(AztecWalletContext)\n if (!context) {\n throw new Error(\n 'useAztecWalletContext must be used within AztecWalletProvider',\n )\n }\n return context\n}\n","import { create } from 'zustand';\n\ntype ModalType = 'connect' | 'account' | 'network' | null;\n\ninterface ModalState {\n /** Currently open modal */\n openModal: ModalType;\n /** Open the connect modal */\n openConnectModal: () => void;\n /** Open the account modal */\n openAccountModal: () => void;\n /** Open the network modal */\n openNetworkModal: () => void;\n /** Close any open modal */\n closeModal: () => void;\n /** Set modal (for onOpenChange handlers) */\n setModal: (modal: ModalType) => void;\n}\n\n/**\n * Global modal state store\n *\n * Manages which modal is currently open. Only one modal can be open at a time.\n */\nexport const useModalStore = create<ModalState>((set) => ({\n openModal: null,\n\n openConnectModal: () => set({ openModal: 'connect' }),\n\n openAccountModal: () => set({ openModal: 'account' }),\n\n openNetworkModal: () => set({ openModal: 'network' }),\n\n closeModal: () => set({ openModal: null }),\n\n setModal: (modal) => set({ openModal: modal }),\n}));\n\n/**\n * Get modal store outside of React components\n */\nexport const getModalStore = () => useModalStore.getState();\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 * 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 {\n WalletConnector,\n WalletConnectorId,\n} from '../../types/walletConnector'\n\nexport type ConnectorFactory = () => WalletConnector\n\nexport interface ConnectorRegistryOptions {\n /**\n * Optional priority list to override default connector order.\n * Connectors not listed here maintain their factory order after the prioritized entries.\n */\n priority?: WalletConnectorId[]\n}\n\nexport class ConnectorRegistry {\n private readonly connectors: WalletConnector[]\n\n constructor(\n factories: ConnectorFactory[],\n options: ConnectorRegistryOptions = {},\n ) {\n const instantiated = factories.map((factory) => factory())\n\n if (options.priority && options.priority.length > 0) {\n const prioritySet = new Set(options.priority)\n const prioritized: WalletConnector[] = []\n\n options.priority.forEach((id) => {\n const connector = instantiated.find((c) => c.id === id)\n if (connector) {\n prioritized.push(connector)\n }\n })\n\n const remaining = instantiated.filter((c) => !prioritySet.has(c.id))\n this.connectors = [...prioritized, ...remaining]\n } else {\n this.connectors = instantiated\n }\n }\n\n /**\n * Get all instantiated connectors in priority order.\n */\n getConnectors(): WalletConnector[] {\n return this.connectors\n }\n\n /**\n * Find connector by ID.\n */\n getConnector(id: WalletConnectorId): WalletConnector | undefined {\n return this.connectors.find((connector) => connector.id === id)\n }\n\n /**\n * Resolve the first connector that currently has an active account.\n */\n getActiveConnector(): WalletConnector | null {\n for (const connector of this.connectors) {\n if (connector.getAccount()) {\n return connector\n }\n }\n return null\n }\n}\n\nexport const createConnectorRegistry = (\n factories: ConnectorFactory[],\n options?: ConnectorRegistryOptions,\n): ConnectorRegistry => new ConnectorRegistry(factories, options)\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","import React, { useCallback, useMemo } from 'react'\nimport { Copy, Check, LogOut } from 'lucide-react'\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Button,\n VisuallyHidden,\n} from '../../../components/ui'\nimport { useCopyToClipboard } from '../../../hooks'\nimport { cn, iconSize, truncateAddress } from '../../../utils'\nimport {\n getNetworkIcon,\n getNetworkDisplayName,\n} from '../../config/networkPresets'\nimport { getAddressEmoji } from '../ConnectButton/ConnectButton'\nimport { NetworkIcon } from '../shared'\nimport { bg, border, text, componentStyles } from '../../theme/classes'\nimport type { AztecNetwork } from '../../../config/networks/constants'\n\nconst styles = {\n content: 'sm:max-w-sm',\n header: 'flex flex-col items-center gap-3 pb-2',\n emojiContainer: [\n 'w-16 h-16 rounded-2xl',\n 'bg-surface-secondary',\n 'border border-[var(--aw-border-default)]',\n 'flex items-center justify-center',\n 'text-4xl',\n 'shadow-lg',\n ].join(' '),\n statusBadge: [\n 'inline-flex items-center gap-1.5',\n 'px-2.5 py-1 rounded-full',\n 'text-xs font-medium',\n ].join(' '),\n statusDot: 'w-1.5 h-1.5 rounded-full',\n sectionsContainer: 'flex flex-col gap-4 stagger-children',\n section: 'flex flex-col gap-2',\n addressContainer: [\n 'group relative flex items-center justify-between',\n 'bg-surface-secondary px-4 py-3 rounded-xl',\n 'border border-[var(--aw-border-default)]',\n 'transition-all duration-200',\n ].join(' '),\n addressContainerCopied: 'animate-copy-flash',\n copyButton: [\n 'flex items-center justify-center',\n 'w-8 h-8 rounded-lg',\n 'transition-all duration-200',\n 'cursor-pointer',\n ].join(' '),\n networkContainer: [\n 'flex items-center justify-between',\n 'bg-surface-secondary px-4 py-3 rounded-xl',\n 'border border-[var(--aw-border-default)]',\n ].join(' '),\n networkInfo: 'flex items-center gap-3',\n networkIconContainer: [\n 'flex items-center justify-center',\n 'w-8 h-8 rounded-lg',\n ].join(' '),\n networkIconText: 'text-base',\n networkBadge: ['text-xs px-2 py-0.5 rounded-full'].join(' '),\n actions: 'flex flex-col gap-2 pt-2',\n disconnectButton: [\n 'w-full justify-center',\n 'bg-transparent',\n 'border',\n 'transition-all duration-200',\n ].join(' '),\n} as const\n\n/**\n * Network section component\n */\nconst NetworkSection: React.FC<{ networkName: AztecNetwork }> = ({\n networkName,\n}) => {\n const icon = useMemo(() => getNetworkIcon(networkName), [networkName])\n const displayName = useMemo(\n () => getNetworkDisplayName(networkName),\n [networkName],\n )\n\n return (\n <div className={styles.section}>\n <span\n className={cn(\n 'text-xs uppercase tracking-wider font-medium',\n text.muted,\n )}\n >\n Network\n </span>\n <div\n className={cn(\n styles.networkContainer,\n bg.surfaceSecondary,\n border.default,\n )}\n >\n <div className={styles.networkInfo}>\n <div\n className={cn(\n styles.networkIconContainer,\n 'bg-[var(--aw-accent)]/10 text-[var(--aw-accent)]',\n )}\n >\n <NetworkIcon icon={icon} className={styles.networkIconText} />\n </div>\n <span className={cn('text-sm font-medium', text.default)}>\n {displayName}\n </span>\n </div>\n <span\n className={cn(styles.networkBadge, bg.surfaceTertiary, text.muted)}\n >\n Active\n </span>\n </div>\n </div>\n )\n}\n\nexport interface AccountModalProps {\n /** Whether the modal is open */\n open: boolean\n /** Callback when modal should close */\n onOpenChange: (open: boolean) => void\n /** Connected account address */\n address: string\n /** Current network name */\n networkName?: AztecNetwork\n /** Whether to show network section (default: false) */\n showNetwork?: boolean\n /** Callback when disconnect is clicked */\n onDisconnect?: () => void\n}\n\n/**\n * Account details modal\n *\n * Displays connected account information in a modal dialog:\n * - Avatar with address initials\n * - Account address (with copy button)\n * - Network name (optional)\n * - Disconnect button\n */\nexport const AccountModal: React.FC<AccountModalProps> = ({\n open,\n onOpenChange,\n address,\n networkName,\n showNetwork = false,\n onDisconnect,\n}) => {\n const { copied, copy } = useCopyToClipboard()\n\n const handleDisconnect = useCallback(() => {\n onDisconnect?.()\n onOpenChange(false)\n }, [onDisconnect, onOpenChange])\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className={styles.content} aria-describedby={undefined}>\n <VisuallyHidden>\n <DialogTitle>Account Details</DialogTitle>\n </VisuallyHidden>\n <DialogHeader className={styles.header}>\n <div\n className={cn(\n styles.emojiContainer,\n bg.surfaceSecondary,\n border.default,\n )}\n >\n {getAddressEmoji(address)}\n </div>\n <div\n className={cn(\n styles.statusBadge,\n 'bg-[var(--aw-success)]/10 text-[var(--aw-success)]',\n )}\n >\n <span className={cn(styles.statusDot, 'bg-[var(--aw-success)]')} />\n Connected\n </div>\n </DialogHeader>\n\n <div className={styles.sectionsContainer}>\n {/* Address Section */}\n <div className={styles.section}>\n <span\n className={cn(\n 'text-xs uppercase tracking-wider font-medium',\n text.muted,\n )}\n >\n Wallet Address\n </span>\n <div\n className={cn(\n styles.addressContainer,\n bg.surfaceSecondary,\n border.default,\n copied && styles.addressContainerCopied,\n )}\n >\n <span\n className={cn('font-mono text-sm', text.default)}\n title={address}\n >\n {truncateAddress(address, 10, 8)}\n </span>\n <button\n onClick={() => copy(address)}\n className={cn(\n styles.copyButton,\n bg.surfaceTertiary,\n text.muted,\n 'hover:bg-[var(--aw-accent)]/10 hover:text-[var(--aw-accent)]',\n copied &&\n 'bg-[var(--aw-success)]/10 text-[var(--aw-success)]',\n )}\n aria-label={copied ? 'Copied!' : 'Copy address'}\n >\n {copied ? (\n <Check size={iconSize()} />\n ) : (\n <Copy size={iconSize()} />\n )}\n </button>\n </div>\n </div>\n\n {/* Network Section */}\n {showNetwork && networkName && (\n <NetworkSection networkName={networkName} />\n )}\n\n {/* Actions */}\n <div className={styles.actions}>\n <Button\n variant=\"ghost\"\n className={cn(\n styles.disconnectButton,\n 'text-[var(--aw-error)] hover:bg-[var(--aw-error)]/10 border-[var(--aw-error)]/20 hover:border-[var(--aw-error)]/40',\n )}\n onClick={handleDisconnect}\n icon={<LogOut size={iconSize()} />}\n >\n Disconnect Wallet\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","import React from 'react';\nimport { cn } from '../../utils/cn';\nimport { componentStyles } from '../../aztec-wallet/theme/classes';\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'primary' | 'secondary' | 'outline' | 'ghost';\n size?: 'sm' | 'md' | 'lg';\n isLoading?: boolean;\n /** Icon to display before the button text */\n icon?: React.ReactNode;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = 'primary',\n size = 'md',\n isLoading,\n disabled,\n icon,\n children,\n ...props\n },\n ref\n ) => {\n const baseStyles = 'inline-flex items-center justify-center font-medium rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed';\n \n const sizes = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-base',\n lg: 'px-6 py-3 text-lg',\n };\n\n const variants = {\n primary: componentStyles.button.primary,\n secondary: componentStyles.button.secondary,\n outline: componentStyles.button.outline,\n ghost: componentStyles.button.ghost,\n };\n\n return (\n <button\n className={cn(\n baseStyles,\n variants[variant],\n sizes[size],\n className\n )}\n ref={ref}\n disabled={disabled || isLoading}\n {...props}\n >\n {isLoading ? (\n <>\n <span className=\"mr-2 inline-block h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n {children}\n </>\n ) : (\n <>\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {children}\n </>\n )}\n </button>\n );\n }\n);\n\nButton.displayName = 'Button';\n","/**\n * Theme-aware CSS class mappings for Aztec Wallet components.\n * \n * These classes use Tailwind's arbitrary value syntax to reference CSS custom properties.\n * This approach provides:\n * 1. Full compatibility with Tailwind CSS (standard classes)\n * 2. Theme customization via CSS variables (no Tailwind config needed)\n * 3. Works in any React app, with or without Tailwind\n */\n\n// Background colors\nexport const bg = {\n /** Primary background (page background) */\n background: 'bg-[var(--aw-background)]',\n /** Surface primary (cards, modals) */\n surfacePrimary: 'bg-[var(--aw-surface-primary)]',\n /** Surface secondary (buttons, inputs) */\n surfaceSecondary: 'bg-[var(--aw-surface-secondary)]',\n /** Surface tertiary (hover states, subtle backgrounds) */\n surfaceTertiary: 'bg-[var(--aw-surface-tertiary)]',\n /** Accent color background */\n accent: 'bg-[var(--aw-accent)]',\n /** Success state background */\n success: 'bg-[var(--aw-success-bg)]',\n /** Warning state background */\n warning: 'bg-[var(--aw-warning-bg)]',\n /** Error state background */\n error: 'bg-[var(--aw-error-bg)]',\n} as const;\n\n// Text colors\nexport const text = {\n /** Default text color (headings, body) */\n default: 'text-[var(--aw-text-default)]',\n /** Muted text color (placeholders, disabled) */\n muted: 'text-[var(--aw-text-muted)]',\n /** Secondary text color (labels, descriptions) */\n secondary: 'text-[var(--aw-text-secondary)]',\n /** Inverse text color (for colored backgrounds) */\n inverse: 'text-[var(--aw-text-inverse)]',\n /** Accent text color */\n accent: 'text-[var(--aw-accent)]',\n /** Success text color */\n success: 'text-[var(--aw-success)]',\n /** Warning text color */\n warning: 'text-[var(--aw-warning)]',\n /** Error text color */\n error: 'text-[var(--aw-error)]',\n} as const;\n\n// Border colors\nexport const border = {\n /** Default border color */\n default: 'border-[var(--aw-border-default)]',\n /** Subtle border color */\n subtle: 'border-[var(--aw-border-subtle)]',\n /** Accent border color */\n accent: 'border-[var(--aw-border-accent)]',\n} as const;\n\n// Component-specific style combinations\nexport const componentStyles = {\n // Modal styles\n modal: {\n overlay: 'bg-[var(--aw-overlay)]',\n content: 'bg-[var(--aw-surface-primary)] border-[var(--aw-border-default)]',\n title: 'text-[var(--aw-text-default)]',\n description: 'text-[var(--aw-text-muted)]',\n },\n \n // Button styles\n button: {\n primary: 'bg-[var(--aw-accent)] text-[var(--aw-accent-foreground)] hover:bg-[var(--aw-accent-hover)]',\n secondary: 'bg-[var(--aw-surface-secondary)] text-[var(--aw-text-default)] hover:bg-[var(--aw-surface-tertiary)]',\n ghost: 'text-[var(--aw-text-default)] hover:bg-[var(--aw-surface-secondary)]',\n outline: 'border-[var(--aw-border-default)] text-[var(--aw-text-default)] hover:bg-[var(--aw-surface-secondary)]',\n },\n \n // Wallet button styles\n walletButton: {\n base: 'bg-[var(--aw-surface-secondary)] border-transparent hover:bg-[var(--aw-surface-tertiary)] hover:border-[var(--aw-accent)]/30',\n active: 'border-[var(--aw-accent)]/50 bg-[var(--aw-accent)]/5',\n iconContainer: 'bg-[var(--aw-surface-tertiary)]',\n iconContainerHover: 'group-hover:bg-[var(--aw-accent)]/10',\n name: 'text-[var(--aw-text-default)]',\n nameDisabled: 'text-[var(--aw-text-muted)]',\n notInstalled: 'text-[var(--aw-warning)]',\n },\n \n // Wallet group button styles\n walletGroupButton: {\n base: 'bg-[var(--aw-surface-secondary)] hover:bg-[var(--aw-surface-tertiary)] border-transparent hover:border-[var(--aw-accent)]/30',\n iconContainer: 'bg-[var(--aw-accent)]/10 text-[var(--aw-accent)] group-hover:bg-[var(--aw-accent)]/20',\n label: 'text-[var(--aw-text-default)]',\n description: 'text-[var(--aw-text-muted)]',\n arrow: 'text-[var(--aw-text-muted)] group-hover:text-[var(--aw-accent)]',\n },\n \n // Input/Field styles\n input: {\n base: 'bg-[var(--aw-surface-secondary)] border-[var(--aw-border-default)] text-[var(--aw-text-default)]',\n focus: 'focus:border-[var(--aw-accent)] focus:ring-[var(--aw-accent)]',\n placeholder: 'placeholder:text-[var(--aw-text-muted)]',\n },\n \n // Badge styles\n badge: {\n default: 'bg-[var(--aw-accent)]/10 text-[var(--aw-accent)]',\n secondary: 'bg-[var(--aw-surface-tertiary)] text-[var(--aw-text-muted)]',\n outline: 'border-[var(--aw-border-default)] text-[var(--aw-text-default)]',\n success: 'bg-[var(--aw-success-bg)] text-[var(--aw-success)]',\n warning: 'bg-[var(--aw-warning-bg)] text-[var(--aw-warning)]',\n error: 'bg-[var(--aw-error-bg)] text-[var(--aw-error)]',\n },\n \n // Network picker styles\n networkPicker: {\n base: 'bg-[var(--aw-surface-secondary)] hover:bg-[var(--aw-surface-tertiary)] border-[var(--aw-border-default)] hover:border-[var(--aw-accent)]/50',\n icon: 'text-[var(--aw-text-muted)] group-hover:text-[var(--aw-text-default)]',\n name: 'text-[var(--aw-text-default)]',\n },\n \n // Account modal styles\n accountModal: {\n emojiContainer: 'bg-[var(--aw-surface-secondary)] border-[var(--aw-border-default)]',\n addressContainer: 'bg-[var(--aw-surface-secondary)] border-[var(--aw-border-default)]',\n copyButton: 'bg-[var(--aw-surface-tertiary)] text-[var(--aw-text-muted)] hover:bg-[var(--aw-accent)]/10 hover:text-[var(--aw-accent)]',\n disconnectButton: 'text-[var(--aw-error)] hover:bg-[var(--aw-error)]/10 border-[var(--aw-error)]/20 hover:border-[var(--aw-error)]/40',\n },\n} as const;\n\n/**\n * Helper to combine theme classes with user-provided classes.\n * This is a type-safe way to merge classes.\n */\nexport function combineClasses(\n baseClasses: string,\n userClasses?: string\n): string {\n if (!userClasses) return baseClasses;\n return `${baseClasses} ${userClasses}`;\n}\n","import React from 'react';\nimport { cn } from '../../utils/cn';\nimport { componentStyles } from '../../aztec-wallet/theme/classes';\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: 'default' | 'primary' | 'secondary' | 'outline' | 'success' | 'warning' | 'error';\n}\n\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n ({ className, variant = 'default', ...props }, ref) => {\n const variants = {\n default: componentStyles.badge.default,\n primary: componentStyles.badge.default,\n secondary: componentStyles.badge.secondary,\n outline: componentStyles.badge.outline,\n success: componentStyles.badge.success,\n warning: componentStyles.badge.warning,\n error: componentStyles.badge.error,\n };\n\n return (\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',\n variants[variant],\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\n\nBadge.displayName = 'Badge';\n","import React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { cn } from '../../utils/cn';\nimport { componentStyles } from '../../aztec-wallet/theme/classes';\n\nexport const Dialog = DialogPrimitive.Root;\nexport const DialogTrigger = DialogPrimitive.Trigger;\nexport const DialogPortal = DialogPrimitive.Portal;\nexport const DialogClose = DialogPrimitive.Close;\n\nexport const DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n componentStyles.modal.overlay,\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nexport interface DialogContentProps\n extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {}\n\nexport const DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg border',\n componentStyles.modal.content,\n className\n )}\n {...props}\n >\n {children}\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nexport const DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n 'flex flex-col space-y-1.5 text-center sm:text-left',\n className\n )}\n {...props}\n />\n);\nDialogHeader.displayName = 'DialogHeader';\n\nexport const DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n 'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n className\n )}\n {...props}\n />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nexport const DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n 'text-lg font-semibold leading-none tracking-tight',\n componentStyles.modal.title,\n className\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nexport const DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\n 'text-sm',\n componentStyles.modal.description,\n className\n )}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n","import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface VisuallyHiddenProps\n extends React.HTMLAttributes<HTMLSpanElement> {}\n\n/**\n * VisuallyHidden component - hides content visually but keeps it accessible to screen readers.\n */\nexport const VisuallyHidden = React.forwardRef<\n HTMLSpanElement,\n VisuallyHiddenProps\n>(({ className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(\n 'absolute h-px w-px overflow-hidden whitespace-nowrap border-0 p-0',\n '[clip:rect(0,0,0,0)]',\n className\n )}\n {...props}\n />\n );\n});\n\nVisuallyHidden.displayName = 'VisuallyHidden';\n","import { useState, useCallback, useRef, useEffect } from 'react'\nimport { copyToClipboard } from '../utils/clipboard'\n\nexport const useCopyToClipboard = (resetDelay = 2000) => {\n const [copied, setCopied] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined,\n )\n\n const copy = useCallback(\n async (text: string): Promise<boolean> => {\n const success = await copyToClipboard(text)\n if (success) {\n setCopied(true)\n clearTimeout(timeoutRef.current)\n timeoutRef.current = setTimeout(() => setCopied(false), resetDelay)\n }\n return success\n },\n [resetDelay],\n )\n\n useEffect(() => {\n return () => clearTimeout(timeoutRef.current)\n }, [])\n\n return { copied, copy }\n}\n","interface CopyToClipboardOptions {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport const copyToClipboard = async (\n text: string | undefined,\n options?: CopyToClipboardOptions\n): Promise<boolean> => {\n if (!text) return false;\n\n try {\n // Ensure we have the proper format with 0x prefix for addresses\n const textToCopy =\n text.startsWith('0x') || !isHexString(text) ? text : `0x${text}`;\n\n await navigator.clipboard.writeText(textToCopy);\n console.log('Copied to clipboard:', textToCopy);\n options?.onSuccess?.();\n return true;\n } catch (err) {\n console.error('Failed to copy to clipboard:', err);\n const error =\n err instanceof Error ? err : new Error('Failed to copy to clipboard');\n options?.onError?.(error);\n return false;\n }\n};\n\n// Helper to check if a string looks like a hex address\nconst isHexString = (str: string): boolean => {\n return /^[0-9a-fA-F]+$/.test(str);\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","import React, { useCallback } from 'react'\nimport { Wallet, ChevronDown } from 'lucide-react'\nimport { useShallow } from 'zustand/react/shallow'\nimport { Button } from '../../../components/ui'\nimport { cn, iconSize, truncateAddress } from '../../../utils'\nimport { useAztecWalletContext } from '../../providers/context'\nimport { useModalStore } from '../../store/modal'\nimport { useWalletStore } from '../../store/wallet'\nimport { NetworkPicker } from '../NetworkPicker'\nimport { Spinner } from '../shared'\nimport { bg, border, text } from '../../theme/classes'\nimport type { NetworkPickerVariant } from '../../types'\n\n// Emoji list for wallet avatars\nconst WALLET_EMOJIS = [\n '🦊',\n '🐸',\n '🦄',\n '🐙',\n '🦋',\n '🌸',\n '🍀',\n '🌈',\n '⭐',\n '🔮',\n '💎',\n '🎭',\n '🎨',\n '🎪',\n '🎯',\n '🎲',\n '🚀',\n '🌙',\n '☀️',\n '🌊',\n '🔥',\n '❄️',\n '⚡',\n '🌺',\n '🍄',\n '🌵',\n '🎸',\n '🎺',\n '🎹',\n '🥁',\n '🎧',\n '🎤',\n]\n\n/**\n * Get a consistent emoji based on wallet address\n */\nexport function getAddressEmoji(address: string): string {\n let hash = 0\n for (let i = 0; i < address.length; i++) {\n hash = (hash << 5) - hash + address.charCodeAt(i)\n hash = hash & hash\n }\n const index = Math.abs(hash) % WALLET_EMOJIS.length\n return WALLET_EMOJIS[index]\n}\n\nconst styles = {\n // Container for network picker + button\n container: 'flex items-center gap-3',\n // Disconnected state - primary CTA\n disconnectedButton: [\n 'group relative overflow-hidden',\n 'bg-[var(--aw-accent)] hover:bg-[var(--aw-accent-hover)]',\n 'transition-all duration-300',\n ].join(' '),\n walletIcon: 'transition-transform duration-300 group-hover:scale-110',\n // Connecting state\n connectingButton: [\n 'relative',\n bg.surfaceSecondary,\n 'border-[var(--aw-accent)]/50',\n 'animate-shimmer',\n ].join(' '),\n connectingContent: 'flex items-center gap-2',\n // Connected state\n connectedButton: [\n 'group flex items-center gap-2',\n 'pl-2.5 pr-2 py-1.5 rounded-lg',\n 'bg-surface-secondary hover:bg-surface-tertiary',\n 'border border-[var(--aw-border-default)] hover:border-accent/50',\n 'transition-all duration-200',\n 'cursor-pointer',\n ].join(' '),\n emoji: 'text-base',\n chevron: ['transition-transform duration-200'].join(' '),\n} as const\n\nexport interface ConnectButtonProps {\n /** Label for disconnected state (default: \"Connect Wallet\") */\n label?: string\n /**\n * Icon for disconnected state button\n * - undefined: shows default Wallet icon\n * - ReactNode: shows custom icon\n * - false/null: no icon\n */\n icon?: React.ReactNode | false | null\n /** Hide the network picker (useful for mobile where it's shown separately) */\n hideNetworkPicker?: boolean\n /** Additional class names */\n className?: string\n}\n\n/**\n * Connect wallet button\n *\n * A \"smart\" button that automatically:\n * - Reads wallet state from the store\n * - Opens connect modal when disconnected\n * - Opens account modal when connected\n * - Shows NetworkPicker when enabled in config (regardless of connection state)\n *\n * Shows different states:\n * - Disconnected: NetworkPicker + Primary CTA button with wallet icon\n * - Connecting: Shimmer loading state\n * - Connected: NetworkPicker + Avatar with truncated address\n */\nexport const ConnectButton: React.FC<ConnectButtonProps> = ({\n label = 'Connect Wallet',\n icon,\n hideNetworkPicker: hideNetworkPickerProp = false,\n className,\n}) => {\n const { config } = useAztecWalletContext()\n\n const walletState = useWalletStore(\n useShallow((state) => ({\n account: state.account,\n status: state.status,\n })),\n )\n\n const { openConnectModal, openAccountModal } = useModalStore(\n useShallow((state) => ({\n openConnectModal: state.openConnectModal,\n openAccountModal: state.openAccountModal,\n })),\n )\n\n const isConnected = walletState.status === 'connected'\n const isConnecting =\n walletState.status === 'connecting' || walletState.status === 'deploying'\n const address = walletState.account?.getAddress().toString() ?? null\n\n const networkPickerVariant = config.showNetworkPicker as\n | NetworkPickerVariant\n | undefined\n const showNetworkPicker = !!networkPickerVariant && !hideNetworkPickerProp\n\n const handleClick = useCallback(() => {\n if (isConnected) {\n openAccountModal()\n } else {\n openConnectModal()\n }\n }, [isConnected, openAccountModal, openConnectModal])\n\n // Connecting state\n if (isConnecting) {\n return (\n <Button\n variant=\"secondary\"\n disabled\n className={cn(styles.connectingButton, className)}\n >\n <div className={styles.connectingContent}>\n <Spinner size=\"sm\" />\n <span>Connecting...</span>\n </div>\n </Button>\n )\n }\n\n // Connected state\n if (isConnected && address) {\n return (\n <div className={styles.container} data-testid=\"connected-account\">\n {showNetworkPicker && <NetworkPicker variant={networkPickerVariant} />}\n <button\n type=\"button\"\n onClick={handleClick}\n className={cn(\n styles.connectedButton,\n bg.surfaceSecondary,\n border.default,\n 'hover:bg-[var(--aw-surface-tertiary)] hover:border-[var(--aw-accent)]/50',\n className,\n )}\n data-testid=\"account-address\"\n >\n <span className={styles.emoji}>{getAddressEmoji(address)}</span>\n <span className={cn('font-mono text-sm', text.default)}>\n {truncateAddress(address)}\n </span>\n <ChevronDown\n size={iconSize()}\n className={cn(\n styles.chevron,\n text.muted,\n 'group-hover:text-[var(--aw-text-default)]',\n )}\n />\n </button>\n </div>\n )\n }\n\n // Resolve icon\n const resolvedIcon =\n icon === undefined ? (\n <Wallet size={iconSize()} className={styles.walletIcon} />\n ) : (\n icon || undefined\n )\n\n // Disconnected state\n return (\n <div className={styles.container}>\n {showNetworkPicker && <NetworkPicker variant={networkPickerVariant} />}\n <Button\n variant=\"primary\"\n onClick={handleClick}\n className={cn(styles.disconnectedButton, className)}\n icon={resolvedIcon}\n data-testid=\"connect-wallet-button\"\n >\n {label}\n </Button>\n </div>\n )\n}\n","import React from 'react';\nimport { cn } from '../../../utils';\n\nconst styles = {\n spinner:\n 'animate-spin rounded-full border-2 border-current border-t-transparent text-accent',\n sizes: {\n sm: 'h-4 w-4',\n md: 'h-6 w-6',\n lg: 'h-8 w-8',\n xl: 'h-12 w-12',\n },\n} as const;\n\nexport interface SpinnerProps {\n /** Size of the spinner */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Additional class names */\n className?: string;\n}\n\n/**\n * Loading spinner component\n */\nexport const Spinner: React.FC<SpinnerProps> = ({ size = 'md', className }) => {\n return (\n <div\n className={cn(styles.spinner, styles.sizes[size], className)}\n role=\"status\"\n aria-label=\"Loading\"\n >\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n};\n","import React from 'react'\nimport { Copy, Check } from 'lucide-react'\nimport { useCopyToClipboard } from '../../../hooks'\nimport { cn, iconSize, truncateAddress } from '../../../utils'\nimport { bg, text, border } from '../../theme/classes'\n\nconst styles = {\n container: 'flex items-center gap-2',\n address:\n 'font-mono text-sm bg-surface-secondary px-3 py-2 rounded-lg border border-[var(--aw-border-default)]',\n addressText: 'text-default',\n copyButton:\n 'p-1 rounded hover:bg-surface-tertiary transition-colors text-muted hover:text-default',\n copySuccess: 'text-green-500',\n} as const\n\nexport interface AddressDisplayProps {\n /** The address to display */\n address: string\n /** Number of characters to show at start (default: 6) */\n startChars?: number\n /** Number of characters to show at end (default: 4) */\n endChars?: number\n /** Whether to show copy button (default: true) */\n showCopy?: boolean\n /** Additional class names */\n className?: string\n}\n\n/**\n * Address display component with copy functionality\n *\n * Displays a truncated Aztec address with an optional copy-to-clipboard button.\n * The address is truncated to show the first and last few characters with\n * ellipsis in between.\n *\n * @param props - Component props\n * @param props.address - The full address to display\n * @param props.startChars - Number of characters to show at start (default: 6)\n * @param props.endChars - Number of characters to show at end (default: 4)\n * @param props.showCopy - Whether to show the copy button (default: true)\n * @param props.className - Additional CSS classes\n *\n * @example Basic usage\n * ```tsx\n * <AddressDisplay address=\"0x1234567890abcdef1234567890abcdef12345678\" />\n * ```\n *\n * @example Custom truncation\n * ```tsx\n * <AddressDisplay\n * address={account.getAddress().toString()}\n * startChars={8}\n * endChars={6}\n * />\n * ```\n *\n * @example Without copy button\n * ```tsx\n * <AddressDisplay address={address} showCopy={false} />\n * ```\n */\nexport const AddressDisplay: React.FC<AddressDisplayProps> = ({\n address,\n startChars = 6,\n endChars = 4,\n showCopy = true,\n className,\n}) => {\n const { copied, copy } = useCopyToClipboard()\n\n const truncated = truncateAddress(address, startChars, endChars)\n\n return (\n <div className={cn(styles.container, className)}>\n <div\n className={cn(\n 'font-mono text-sm px-3 py-2 rounded-lg border',\n bg.surfaceSecondary,\n border.default,\n )}\n >\n <span className={text.default}>{truncated}</span>\n </div>\n {showCopy && (\n <button\n onClick={() => copy(address)}\n className={cn(\n 'p-1 rounded transition-colors cursor-pointer',\n 'hover:bg-[var(--aw-surface-tertiary)]',\n text.muted,\n 'hover:text-[var(--aw-text-default)]',\n copied && styles.copySuccess,\n )}\n aria-label={copied ? 'Copied!' : 'Copy address'}\n >\n {copied ? <Check size={iconSize()} /> : <Copy size={iconSize()} />}\n </button>\n )}\n </div>\n )\n}\n","import React from 'react';\nimport { iconSize, type IconSize } from '../../../utils';\nimport type { IconType } from '../../types';\n\nexport interface IconRendererProps {\n /** Icon - emoji string, URL, or React component */\n icon?: IconType;\n /** Size for component icons (default: 'sm') */\n size?: IconSize;\n /** CSS classes */\n className?: string;\n /** Alt text for image icons */\n alt?: string;\n}\n\n/**\n * Universal icon renderer component\n *\n * Handles rendering of different icon types:\n * - String (emoji like \"🌐\")\n * - URL (http://, /, data:)\n * - React component (Lucide icons, custom SVG components)\n *\n * @example\n * ```tsx\n * // With emoji\n * <IconRenderer icon=\"🌐\" className={styles.icon} />\n *\n * // With URL\n * <IconRenderer icon=\"/icons/wallet.png\" alt=\"Wallet\" className={styles.icon} />\n *\n * // With Lucide component\n * <IconRenderer icon={Globe} size=\"md\" className={styles.icon} />\n * ```\n */\nexport const IconRenderer: React.FC<IconRendererProps> = ({\n icon,\n size = 'sm',\n className,\n alt = '',\n}) => {\n if (!icon) return null;\n\n // String: URL or emoji/text\n if (typeof icon === 'string') {\n // URL (image)\n if (\n icon.startsWith('http') ||\n icon.startsWith('/') ||\n icon.startsWith('data:')\n ) {\n return <img src={icon} alt={alt} className={className} />;\n }\n // Emoji or text\n return <span className={className}>{icon}</span>;\n }\n\n // React component (Lucide, custom SVG, memo wrapped, etc.)\n const IconComponent = icon;\n return <IconComponent size={iconSize(size)} className={className} />;\n};\n","import React from 'react';\nimport { cn } from '../../../utils';\nimport { IconRenderer } from './IconRenderer';\nimport { Spinner } from './Spinner';\nimport { componentStyles } from '../../theme/classes';\nimport type { IconType } from '../../types';\n\nconst styles = {\n button: [\n 'group w-full flex items-center gap-3',\n 'px-4 py-3 rounded-xl',\n 'border border-transparent',\n 'transition-all duration-200',\n 'cursor-pointer',\n ].join(' '),\n buttonEnabled: 'hover:border-[var(--aw-accent)]/30',\n buttonDisabled: 'cursor-not-allowed opacity-50',\n buttonActive: componentStyles.walletButton.active,\n iconContainer: [\n 'flex items-center justify-center',\n 'w-10 h-10 rounded-xl',\n 'transition-all duration-200',\n 'overflow-hidden',\n ].join(' '),\n iconContainerEnabled: componentStyles.walletButton.iconContainerHover,\n iconContainerActive: 'bg-[var(--aw-accent)]/10',\n iconContainerDisabled: 'grayscale',\n iconImage: 'w-6 h-6 rounded-lg object-contain',\n content: 'flex-1 flex flex-col items-start gap-0.5',\n status: 'flex items-center gap-2',\n statusDot: 'w-2 h-2 rounded-full',\n statusDotInstalled: 'bg-[var(--aw-success)] shadow-[0_0_6px_rgba(34,197,94,0.5)]',\n statusDotNotInstalled: 'bg-[var(--aw-warning)]',\n spinnerContainer: 'w-5 h-5',\n} as const;\n\nexport interface WalletButtonProps {\n /** Wallet name */\n name: string;\n /** Wallet icon - emoji, URL, or React component */\n icon?: IconType;\n /** Whether wallet is installed/available */\n isInstalled?: boolean;\n /** Whether this wallet is currently connecting */\n isConnecting?: boolean;\n /** Whether button is disabled */\n disabled?: boolean;\n /** Click handler */\n onClick?: () => void;\n /** Additional class names */\n className?: string;\n /** Test ID for e2e testing */\n 'data-testid'?: string;\n}\n\n/**\n * Button for selecting a wallet\n */\nexport const WalletButton: React.FC<WalletButtonProps> = ({\n name,\n icon,\n isInstalled,\n isConnecting,\n disabled,\n onClick,\n className,\n 'data-testid': testId,\n}) => {\n // Disable button if wallet is explicitly not installed\n const isNotInstalled = isInstalled === false;\n const isDisabled = disabled || isConnecting || isNotInstalled;\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={isDisabled}\n className={cn(\n styles.button,\n componentStyles.walletButton.base,\n isConnecting && styles.buttonActive,\n isNotInstalled ? styles.buttonDisabled : styles.buttonEnabled,\n className\n )}\n data-testid={testId}\n >\n <div\n className={cn(\n styles.iconContainer,\n componentStyles.walletButton.iconContainer,\n isConnecting && styles.iconContainerActive,\n isNotInstalled\n ? styles.iconContainerDisabled\n : styles.iconContainerEnabled\n )}\n >\n <IconRenderer icon={icon} className={styles.iconImage} alt={name} />\n </div>\n\n <div className={styles.content}>\n <span\n className={cn(\n componentStyles.walletButton.name,\n isNotInstalled && componentStyles.walletButton.nameDisabled\n )}\n >\n {name}\n </span>\n {isNotInstalled && (\n <span className={componentStyles.walletButton.notInstalled}>Not installed</span>\n )}\n </div>\n\n <div className={styles.status}>\n {isConnecting && (\n <div className={styles.spinnerContainer}>\n <Spinner size=\"sm\" />\n </div>\n )}\n {!isConnecting && isInstalled !== undefined && (\n <span\n className={cn(\n styles.statusDot,\n isInstalled\n ? styles.statusDotInstalled\n : styles.statusDotNotInstalled\n )}\n />\n )}\n </div>\n </button>\n );\n};\n","import React from 'react';\nimport { ChevronRight, Wallet, Key, CreditCard } from 'lucide-react';\nimport { Badge } from '../../../components/ui';\nimport { cn, iconSize } from '../../../utils';\nimport { componentStyles } from '../../theme/classes';\n\nconst styles = {\n button: [\n 'group w-full flex items-center gap-4',\n 'px-4 py-4 rounded-xl',\n 'border border-transparent',\n 'transition-all duration-200',\n 'cursor-pointer',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n ].join(' '),\n content: 'flex-1 flex flex-col items-start gap-0.5',\n rightSection: 'flex items-center gap-2',\n arrow: [\n 'transition-all duration-200',\n 'group-hover:translate-x-0.5',\n ].join(' '),\n} as const;\n\n/**\n * Get icon based on label hint\n */\nfunction getGroupIcon(label: string): React.ReactNode {\n const lowerLabel = label.toLowerCase();\n if (\n lowerLabel.includes('embedded') ||\n lowerLabel.includes('create') ||\n lowerLabel.includes('new')\n ) {\n return <Key size={iconSize('md')} />;\n }\n if (lowerLabel.includes('evm') || lowerLabel.includes('metamask')) {\n return <CreditCard size={iconSize('md')} />;\n }\n return <Wallet size={iconSize('md')} />;\n}\n\n/**\n * Get description based on label hint\n */\nfunction getGroupDescription(label: string): string {\n const lowerLabel = label.toLowerCase();\n if (\n lowerLabel.includes('embedded') ||\n lowerLabel.includes('create') ||\n lowerLabel.includes('new')\n ) {\n return 'Quick setup, no extension needed';\n }\n if (lowerLabel.includes('evm')) {\n return 'MetaMask, Rabby, and more';\n }\n if (lowerLabel.includes('aztec')) {\n return 'Azguard and other Aztec wallets';\n }\n return 'Select a wallet to continue';\n}\n\nexport interface WalletGroupButtonProps {\n /** Button label */\n label: string;\n /** Optional tag to show next to label (e.g. \"Beta\") */\n tag?: string;\n /** Whether to show arrow (for navigation) */\n showArrow?: boolean;\n /** Whether button is disabled */\n disabled?: boolean;\n /** Click handler */\n onClick?: () => void;\n /** Additional class names */\n className?: string;\n /** Test ID for e2e testing */\n 'data-testid'?: string;\n}\n\n/**\n * Button for wallet group selection in main view\n */\nexport const WalletGroupButton: React.FC<WalletGroupButtonProps> = ({\n label,\n tag,\n showArrow = true,\n disabled,\n onClick,\n className,\n 'data-testid': testId,\n}) => {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className={cn(\n styles.button,\n componentStyles.walletGroupButton.base,\n className\n )}\n data-testid={testId}\n >\n <div className={cn(\n 'flex items-center justify-center w-10 h-10 rounded-xl',\n componentStyles.walletGroupButton.iconContainer\n )}>\n {getGroupIcon(label)}\n </div>\n <div className={styles.content}>\n <span className={componentStyles.walletGroupButton.label}>{label}</span>\n <span className={componentStyles.walletGroupButton.description}>{getGroupDescription(label)}</span>\n </div>\n <div className={styles.rightSection}>\n {tag && <Badge variant=\"primary\">{tag}</Badge>}\n {showArrow && (\n <ChevronRight \n size={iconSize('md')} \n className={cn(styles.arrow, componentStyles.walletGroupButton.arrow)} \n />\n )}\n </div>\n </button>\n );\n};\n","import React from 'react';\nimport { ArrowLeft } from 'lucide-react';\nimport { cn, iconSize } from '../../../utils';\nimport { text } from '../../theme/classes';\n\nconst styles = {\n button: [\n 'flex items-center gap-2',\n 'transition-colors',\n 'cursor-pointer',\n 'text-sm',\n ].join(' '),\n} as const;\n\nexport interface BackButtonProps {\n /** Click handler */\n onClick?: () => void;\n /** Button label (default: \"back\") */\n label?: string;\n /** Additional class names */\n className?: string;\n}\n\n/**\n * Back navigation button\n */\nexport const BackButton: React.FC<BackButtonProps> = ({\n onClick,\n label = 'back',\n className,\n}) => {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n styles.button,\n text.muted,\n 'hover:text-[var(--aw-text-default)]',\n className\n )}\n >\n <ArrowLeft size={iconSize()} />\n <span>{label}</span>\n </button>\n );\n};\n","import React from 'react';\nimport { IconRenderer } from './IconRenderer';\nimport type { IconSize } from '../../../utils';\nimport type { IconType } from '../../types';\n\nexport interface NetworkIconProps {\n /** The icon - either an emoji string or a Lucide-style component */\n icon: IconType;\n /** Size variant for component icons (default: 'sm') */\n size?: IconSize;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Network icon component that handles both emoji strings and Lucide components\n *\n * This is a convenience wrapper around IconRenderer for network-specific icons.\n *\n * @example\n * ```tsx\n * // With emoji\n * <NetworkIcon icon=\"🌐\" className={styles.icon} />\n *\n * // With Lucide component\n * <NetworkIcon icon={Globe} size=\"md\" className={styles.icon} />\n * ```\n */\nexport const NetworkIcon: React.FC<NetworkIconProps> = ({\n icon,\n size = 'sm',\n className,\n}) => {\n return <IconRenderer icon={icon} size={size} className={className} />;\n};\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport type {\n ResolvedAztecWalletConfig,\n ModalView,\n ModalWalletType,\n} from '../../types';\n\ninterface ConnectingState {\n walletId: string;\n walletName: string;\n walletType: ModalWalletType;\n}\n\ninterface SuccessState {\n address: string;\n}\n\ninterface ConnectModalContextValue {\n // Config\n config: ResolvedAztecWalletConfig;\n\n // View navigation\n view: ModalView;\n setView: (view: ModalView) => void;\n goBack: () => void;\n\n // Connecting state\n connectingState: ConnectingState | null;\n setConnectingState: (state: ConnectingState | null) => void;\n\n // Success state\n successState: SuccessState | null;\n setSuccessState: (state: SuccessState | null) => void;\n\n // Error state\n error: string | null;\n setError: (error: string | null) => void;\n\n // Loading state (prevents duplicate calls)\n isLoading: boolean;\n\n // Actions\n onClose: () => void;\n onConnect: (walletId: string, walletType: ModalWalletType) => Promise<void>;\n reset: () => void;\n}\n\nconst ConnectModalContext = createContext<ConnectModalContextValue | null>(\n null\n);\n\nexport interface ConnectModalProviderProps {\n config: ResolvedAztecWalletConfig;\n onClose: () => void;\n onConnect: (walletId: string, walletType: ModalWalletType) => Promise<void>;\n children: React.ReactNode;\n}\n\nexport const ConnectModalProvider: React.FC<ConnectModalProviderProps> = ({\n config,\n onClose,\n onConnect,\n children,\n}) => {\n const [view, setView] = useState<ModalView>('main');\n const [connectingState, setConnectingState] =\n useState<ConnectingState | null>(null);\n const [successState, setSuccessState] = useState<SuccessState | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const connectingRef = useRef(false);\n\n const reset = useCallback(() => {\n setView('main');\n setConnectingState(null);\n setSuccessState(null);\n setError(null);\n setIsLoading(false);\n connectingRef.current = false;\n }, []);\n\n const goBack = useCallback(() => {\n setView('main');\n setError(null);\n setConnectingState(null);\n setIsLoading(false);\n connectingRef.current = false;\n }, []);\n\n const handleConnect = useCallback(\n async (walletId: string, walletType: ModalWalletType) => {\n // Prevent duplicate connection attempts\n if (connectingRef.current || isLoading) {\n console.warn('Modal: Connection already in progress');\n return;\n }\n\n connectingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n await onConnect(walletId, walletType);\n // Connection successful - the parent will close the modal\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'Connection failed';\n console.error('Modal: Connection error:', errorMessage);\n setError(errorMessage);\n setView('main');\n setConnectingState(null);\n } finally {\n setIsLoading(false);\n connectingRef.current = false;\n }\n },\n [onConnect, isLoading]\n );\n\n const handleClose = useCallback(() => {\n reset();\n onClose();\n }, [reset, onClose]);\n\n const value = useMemo(\n () => ({\n config,\n view,\n setView,\n goBack,\n connectingState,\n setConnectingState,\n successState,\n setSuccessState,\n error,\n setError,\n isLoading,\n onClose: handleClose,\n onConnect: handleConnect,\n reset,\n }),\n [\n config,\n view,\n goBack,\n connectingState,\n successState,\n error,\n isLoading,\n handleClose,\n handleConnect,\n reset,\n ]\n );\n\n return (\n <ConnectModalContext.Provider value={value}>\n {children}\n </ConnectModalContext.Provider>\n );\n};\n\nexport const useConnectModalContext = (): ConnectModalContextValue => {\n const context = useContext(ConnectModalContext);\n if (!context) {\n throw new Error(\n 'useConnectModalContext must be used within ConnectModalProvider'\n );\n }\n return context;\n};\n","import React, { useCallback } from 'react';\nimport { cn } from '../../../../utils';\nimport { WalletGroupButton } from '../../shared';\nimport { useConnectModalContext } from '../context';\nimport { text } from '../../../theme/classes';\n\nconst styles = {\n container: 'flex flex-col gap-3 stagger-children',\n error:\n 'text-sm px-4 py-3 rounded-xl border',\n} as const;\n\n/**\n * Main view showing wallet group options\n */\nexport const MainView: React.FC = () => {\n const { config, setView, setConnectingState, onConnect, error, isLoading } =\n useConnectModalContext();\n\n const { walletGroups } = config;\n\n const handleEmbeddedClick = useCallback(async () => {\n if (isLoading) return;\n\n setConnectingState({\n walletId: 'embedded',\n walletName: 'Embedded Wallet',\n walletType: 'embedded',\n });\n setView('connecting');\n await onConnect('embedded', 'embedded');\n }, [setConnectingState, setView, onConnect, isLoading]);\n\n const handleAztecWalletsClick = useCallback(() => {\n if (isLoading) return;\n setView('aztec-wallets');\n }, [setView, isLoading]);\n\n const handleEvmWalletsClick = useCallback(() => {\n if (isLoading) return;\n setView('evm-wallets');\n }, [setView, isLoading]);\n\n return (\n <div className={styles.container}>\n {error && (\n <div className={cn(\n styles.error,\n 'text-[var(--aw-error)] bg-[var(--aw-error)]/10 border-[var(--aw-error)]/20'\n )}>\n {error}\n </div>\n )}\n\n {walletGroups.embedded && (\n <WalletGroupButton\n label={walletGroups.embedded.label || 'Embedded Wallet'}\n tag=\"Beta\"\n showArrow={false}\n onClick={handleEmbeddedClick}\n disabled={isLoading}\n data-testid=\"wallet-group-embedded\"\n />\n )}\n\n {walletGroups.aztecWallets && (\n <WalletGroupButton\n label={walletGroups.aztecWallets.label || 'Aztec Wallet'}\n onClick={handleAztecWalletsClick}\n disabled={isLoading}\n data-testid=\"wallet-group-aztec\"\n />\n )}\n\n {walletGroups.evmWallets && (\n <WalletGroupButton\n label={walletGroups.evmWallets.label || 'EVM Wallet'}\n onClick={handleEvmWalletsClick}\n disabled={isLoading}\n data-testid=\"wallet-group-evm\"\n />\n )}\n </div>\n );\n};\n","import React, { useCallback, useMemo } from 'react';\nimport { cn } from '../../../../utils';\nimport { useAztecWalletsAvailability } from '../../../hooks/useWalletAvailability';\nimport { BackButton, WalletButton } from '../../shared';\nimport { useConnectModalContext } from '../context';\nimport { text } from '../../../theme/classes';\n\nconst styles = {\n container: 'flex flex-col',\n backButton: 'mb-3',\n walletList: 'flex flex-col gap-2 stagger-children',\n} as const;\n\n/**\n * View showing available Aztec browser wallets\n *\n * Uses checkInstalled functions to detect installed wallets.\n * Wallets that aren't installed are shown as disabled with \"Not Installed\" text.\n */\nexport const AztecWalletsView: React.FC = () => {\n const { config, goBack, setView, setConnectingState, onConnect, isLoading } =\n useConnectModalContext();\n\n const aztecWallets = config.walletGroups.aztecWallets;\n\n // Get wallet availability from checkInstalled functions\n const walletsForAvailability = useMemo(\n () => (aztecWallets ? aztecWallets.wallets : []),\n [aztecWallets]\n );\n const walletAvailability = useAztecWalletsAvailability(\n walletsForAvailability\n );\n\n const handleWalletClick = useCallback(\n async (walletId: string, walletName: string) => {\n if (isLoading) return;\n\n // Don't allow clicking if wallet is not installed\n if (walletAvailability[walletId] === false) {\n return;\n }\n\n setConnectingState({\n walletId,\n walletName,\n walletType: 'aztec',\n });\n setView('connecting');\n await onConnect(walletId, 'aztec');\n },\n [setConnectingState, setView, onConnect, isLoading, walletAvailability]\n );\n\n if (!aztecWallets) {\n return null;\n }\n\n return (\n <div className={styles.container}>\n <BackButton onClick={goBack} className={styles.backButton} />\n\n <p className={cn('text-sm mb-4', text.muted)}>\n Connect with a native Aztec wallet for the best experience. These\n wallets are built specifically for the Aztec network.\n </p>\n\n <div className={styles.walletList}>\n {aztecWallets.wallets.map((wallet) => {\n const isInstalled = walletAvailability[wallet.id];\n\n return (\n <WalletButton\n key={wallet.id}\n name={wallet.name}\n icon={wallet.icon}\n isInstalled={isInstalled}\n onClick={() => handleWalletClick(wallet.id, wallet.name)}\n disabled={isLoading}\n />\n );\n })}\n </div>\n </div>\n );\n};\n","import { useMemo, useState, useEffect } from 'react';\nimport { useEVMStore } from '../store/evm';\n\n/**\n * Check if walletless (E2E test provider) is injected\n * Walletless simulates MetaMask for E2E testing\n */\nfunction isWalletlessInjected(): boolean {\n if (typeof window === 'undefined') return false;\n const ethereum = (\n window as Window & { ethereum?: { isWalletless?: boolean } }\n ).ethereum;\n return !!ethereum?.isWalletless;\n}\n\n/**\n * Hook to check if a specific EVM wallet is installed.\n *\n * Uses EIP-6963 discovery to determine wallet availability.\n * This is useful for showing/hiding wallet options or displaying\n * \"Install\" links for wallets that aren't detected.\n *\n * @param rdns - The RDNS identifier of the wallet (e.g., 'io.metamask', 'io.rabby')\n * @returns Whether the wallet is installed\n *\n * @example Check if MetaMask is installed\n * ```tsx\n * const isMetaMaskInstalled = useIsEvmWalletInstalled('io.metamask');\n *\n * if (!isMetaMaskInstalled) {\n * return <a href=\"https://metamask.io\">Install MetaMask</a>;\n * }\n * ```\n *\n * @example Conditional wallet button\n * ```tsx\n * const isRabbyInstalled = useIsEvmWalletInstalled('io.rabby');\n *\n * return (\n * <button disabled={!isRabbyInstalled}>\n * {isRabbyInstalled ? 'Connect Rabby' : 'Rabby Not Installed'}\n * </button>\n * );\n * ```\n */\nexport function useIsEvmWalletInstalled(rdns: string | undefined): boolean {\n const discoveredWallets = useEVMStore((state) => state.discoveredWallets);\n\n // Check for walletless (E2E test provider) - it simulates MetaMask\n const hasWalletless = useMemo(() => isWalletlessInjected(), []);\n\n return useMemo(() => {\n if (!rdns) return false;\n // If walletless is injected and this is MetaMask, consider it installed\n if (hasWalletless && rdns === 'io.metamask') {\n return true;\n }\n return discoveredWallets.some((wallet) => wallet.info.rdns === rdns);\n }, [rdns, discoveredWallets, hasWalletless]);\n}\n\n/**\n * Hook to get all discovered EVM wallets\n *\n * @returns Array of discovered wallet details from EIP-6963\n */\nexport function useDiscoveredWallets() {\n return useEVMStore((state) => state.discoveredWallets);\n}\n\n/**\n * Hook to get availability info for multiple EVM wallets\n *\n * @param wallets - Array of wallet configs with rdns\n * @returns Map of rdns to installation status\n *\n * @example\n * ```tsx\n * const availability = useEvmWalletsAvailability([\n * { id: 'metamask', rdns: 'io.metamask' },\n * { id: 'rabby', rdns: 'io.rabby' },\n * ]);\n * // availability = { 'io.metamask': true, 'io.rabby': false }\n * ```\n */\nexport function useEvmWalletsAvailability(\n wallets: Array<{ rdns?: string }>\n): Record<string, boolean> {\n const discoveredWallets = useEVMStore((state) => state.discoveredWallets);\n\n // Check for walletless (E2E test provider) - it simulates MetaMask\n const hasWalletless = useMemo(() => isWalletlessInjected(), []);\n\n return useMemo(() => {\n const discoveredRdns = new Set(\n discoveredWallets.map((wallet) => wallet.info.rdns)\n );\n\n const availability: Record<string, boolean> = {};\n for (const wallet of wallets) {\n if (wallet.rdns) {\n // If walletless is injected and this is MetaMask, consider it installed\n if (hasWalletless && wallet.rdns === 'io.metamask') {\n availability[wallet.rdns] = true;\n } else {\n availability[wallet.rdns] = discoveredRdns.has(wallet.rdns);\n }\n }\n }\n return availability;\n }, [wallets, discoveredWallets, hasWalletless]);\n}\n\n/**\n * Hook to get availability info for Aztec browser wallets\n *\n * Calls each wallet's `checkInstalled` function asynchronously.\n *\n * @param wallets - Array of wallet configs with optional checkInstalled function\n * @returns Map of wallet id to installation status (undefined while loading)\n *\n * @example\n * ```tsx\n * const availability = useAztecWalletsAvailability([\n * { id: 'azguard', checkInstalled: async () => { ... } },\n * ]);\n * // availability = { 'azguard': true }\n * ```\n */\nexport function useAztecWalletsAvailability(\n wallets: Array<{ id: string; checkInstalled?: () => Promise<boolean> }>\n): Record<string, boolean | undefined> {\n const [availability, setAvailability] = useState<\n Record<string, boolean | undefined>\n >({});\n\n // Create a stable key for the wallets array to avoid unnecessary re-runs\n const walletsKey = useMemo(\n () => wallets.map((w) => w.id).join(','),\n [wallets]\n );\n\n useEffect(() => {\n let cancelled = false;\n\n const checkAll = async () => {\n const results: Record<string, boolean | undefined> = {};\n\n // Initialize all as undefined (loading)\n for (const wallet of wallets) {\n results[wallet.id] = undefined;\n }\n setAvailability({ ...results });\n\n // Check each wallet in parallel\n await Promise.all(\n wallets.map(async (wallet) => {\n if (wallet.checkInstalled) {\n try {\n const isInstalled = await wallet.checkInstalled();\n if (!cancelled) {\n setAvailability((prev) => ({\n ...prev,\n [wallet.id]: isInstalled,\n }));\n }\n } catch (error) {\n console.warn(\n `Failed to check if ${wallet.id} is installed:`,\n error\n );\n if (!cancelled) {\n setAvailability((prev) => ({\n ...prev,\n [wallet.id]: false,\n }));\n }\n }\n } else {\n // No checkInstalled function, assume unknown (don't show status)\n if (!cancelled) {\n setAvailability((prev) => ({\n ...prev,\n [wallet.id]: undefined,\n }));\n }\n }\n })\n );\n };\n\n checkAll();\n\n return () => {\n cancelled = true;\n };\n }, [walletsKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return availability;\n}\n","/**\n * EVM Wallet Store\n *\n * Manages EVM wallet state (address, connection status, discovered wallets).\n * Actions like connect/disconnect stay in the provider as they need service access.\n */\nimport { create } from 'zustand';\nimport type { EIP6963ProviderDetail } from '../../../types/evm';\nimport type { Hex } from 'viem';\n\ntype State = {\n address: Hex | null;\n isConnected: boolean;\n isConnecting: boolean;\n chainId: number | null;\n error: string | null;\n discoveredWallets: EIP6963ProviderDetail[];\n isAvailable: boolean;\n};\n\ntype Actions = {\n setAddress: (address: Hex | null) => void;\n setConnecting: (connecting: boolean) => void;\n setChainId: (chainId: number | null) => void;\n setError: (error: string | null) => void;\n setDiscoveredWallets: (wallets: EIP6963ProviderDetail[]) => void;\n setAvailable: (available: boolean) => void;\n reset: () => void;\n};\n\nexport type EVMStore = State & Actions;\n\nconst INITIAL_STATE: State = {\n address: null,\n isConnected: false,\n isConnecting: false,\n chainId: null,\n error: null,\n discoveredWallets: [],\n isAvailable: false,\n};\n\nexport const useEVMStore = create<EVMStore>((set) => ({\n ...INITIAL_STATE,\n setAddress: (address) => set({ address, isConnected: address !== null }),\n setConnecting: (isConnecting) => set({ isConnecting }),\n setChainId: (chainId) => set({ chainId }),\n setError: (error) => set({ error }),\n setDiscoveredWallets: (discoveredWallets) =>\n set({ discoveredWallets, isAvailable: discoveredWallets.length > 0 }),\n setAvailable: (isAvailable) => set({ isAvailable }),\n reset: () => set(INITIAL_STATE),\n}));\n\nexport const getEVMStore = () => useEVMStore.getState();\n","import React, { useCallback, useMemo } from 'react';\nimport { cn } from '../../../../utils';\nimport { useEvmWalletsAvailability } from '../../../hooks/useWalletAvailability';\nimport { BackButton, WalletButton } from '../../shared';\nimport { useConnectModalContext } from '../context';\nimport { text } from '../../../theme/classes';\n\nconst styles = {\n container: 'flex flex-col',\n backButton: 'mb-3',\n walletList: 'flex flex-col gap-2 stagger-children',\n} as const;\n\n/**\n * View showing available EVM wallets\n *\n * Uses EIP-6963 discovery to detect installed wallets.\n * Wallets that aren't installed are shown as disabled with \"Not Installed\" text.\n */\nexport const EVMWalletsView: React.FC = () => {\n const { config, goBack, setView, setConnectingState, onConnect, isLoading } =\n useConnectModalContext();\n\n const evmWallets = config.walletGroups.evmWallets;\n\n // Get wallet availability from EIP-6963 discovery\n const walletsForAvailability = useMemo(\n () => (evmWallets ? evmWallets.wallets : []),\n [evmWallets]\n );\n const walletAvailability = useEvmWalletsAvailability(walletsForAvailability);\n\n const handleWalletClick = useCallback(\n async (walletId: string, walletName: string, rdns?: string) => {\n if (isLoading) return;\n\n // Don't allow clicking if wallet is not installed\n if (rdns && !walletAvailability[rdns]) {\n return;\n }\n\n setConnectingState({\n walletId,\n walletName,\n walletType: 'evm',\n });\n setView('connecting');\n await onConnect(walletId, 'evm');\n },\n [setConnectingState, setView, onConnect, isLoading, walletAvailability]\n );\n\n if (!evmWallets) {\n return null;\n }\n\n return (\n <div className={styles.container}>\n <BackButton onClick={goBack} className={styles.backButton} />\n\n <p className={cn('text-sm mb-4', text.muted)}>\n Connect using your existing Ethereum wallet. Your EVM account will be\n used to derive an Aztec-compatible address.\n </p>\n\n <div className={styles.walletList}>\n {evmWallets.wallets.map((wallet) => {\n const isInstalled = wallet.rdns\n ? walletAvailability[wallet.rdns]\n : undefined;\n\n return (\n <WalletButton\n key={wallet.id}\n name={wallet.name}\n icon={wallet.icon}\n isInstalled={isInstalled}\n onClick={() =>\n handleWalletClick(wallet.id, wallet.name, wallet.rdns)\n }\n disabled={isLoading}\n data-testid={`wallet-button-${wallet.id}`}\n />\n );\n })}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { Loader2, Info } from 'lucide-react';\nimport { cn, iconSize } from '../../../../utils';\nimport { useConnectModalContext } from '../context';\nimport { text } from '../../../theme/classes';\n\nconst styles = {\n container: 'flex flex-col items-center justify-center py-8 gap-6',\n spinnerContainer: [\n 'relative',\n 'w-24 h-24 rounded-2xl',\n 'flex items-center justify-center',\n ].join(' '),\n spinnerIcon: 'animate-spin',\n textContainer: 'flex flex-col items-center gap-2',\n dots: 'flex gap-1.5',\n dot: ['w-2 h-2 rounded-full', 'animate-pulse'].join(' '),\n infoCard: [\n 'w-full mt-2 p-4 rounded-xl',\n 'flex gap-3',\n ].join(' '),\n infoIcon: 'shrink-0 mt-0.5',\n infoText: 'text-xs leading-relaxed',\n} as const;\n\n/**\n * View showing connection loading state\n */\nexport const ConnectingView: React.FC = () => {\n const { connectingState } = useConnectModalContext();\n\n if (!connectingState) {\n return null;\n }\n\n const { walletName, walletType } = connectingState;\n\n // Show info card for embedded and EVM wallets (account deployment info)\n const showDeploymentInfo = walletType === 'embedded' || walletType === 'evm';\n\n return (\n <div className={styles.container}>\n <div className={cn(\n styles.spinnerContainer,\n 'bg-[var(--aw-accent)]/10'\n )}>\n <Loader2 \n size={iconSize('2xl')} \n className={cn(styles.spinnerIcon, 'text-[var(--aw-accent)]')} \n />\n </div>\n\n <div className={styles.textContainer}>\n <p className={cn('text-lg font-semibold', text.default)}>\n {walletName ? `Connecting to ${walletName}` : 'Connecting...'}\n </p>\n <p className={cn('text-sm text-center max-w-[280px]', text.muted)}>\n Please wait while we connect your wallet. Check for any popups that\n may have appeared on your screen.\n </p>\n </div>\n\n <div className={styles.dots}>\n <span \n className={cn(styles.dot, 'bg-[var(--aw-accent)]/40')} \n style={{ animationDelay: '0ms' }} \n />\n <span \n className={cn(styles.dot, 'bg-[var(--aw-accent)]/40')} \n style={{ animationDelay: '150ms' }} \n />\n <span \n className={cn(styles.dot, 'bg-[var(--aw-accent)]/40')} \n style={{ animationDelay: '300ms' }} \n />\n </div>\n\n {showDeploymentInfo && (\n <div className={cn(\n styles.infoCard,\n 'bg-[var(--aw-accent)]/10 border border-[var(--aw-accent)]/20'\n )}>\n <Info \n size={iconSize()} \n className={cn(styles.infoIcon, 'text-[var(--aw-accent)]')} \n />\n <p className={cn(styles.infoText, text.muted)}>\n If this is your first time connecting, it may take a bit longer as\n we deploy your new account on Aztec. Future connections will be much\n faster.\n </p>\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { Check, ArrowRight } from 'lucide-react';\nimport { cn, iconSize } from '../../../../utils';\nimport { Button } from '../../../../components/ui';\nimport { AddressDisplay } from '../../shared';\nimport { useConnectModalContext } from '../context';\nimport { text, bg } from '../../../theme/classes';\n\nconst styles = {\n container: 'flex flex-col items-center py-8 gap-6',\n iconContainer: [\n 'w-16 h-16 rounded-2xl',\n 'flex items-center justify-center',\n 'animate-scale-bounce',\n ].join(' '),\n checkIcon: 'text-[var(--aw-success)]',\n textContainer: 'flex flex-col items-center gap-1',\n accountSection: 'w-full flex flex-col gap-2',\n continueButton: [\n 'w-full',\n 'bg-[var(--aw-accent)] hover:bg-[var(--aw-accent-hover)]',\n ].join(' '),\n} as const;\n\n/**\n * View showing successful connection\n */\nexport const SuccessView: React.FC = () => {\n const { successState, onClose } = useConnectModalContext();\n\n if (!successState) {\n return null;\n }\n\n const { address } = successState;\n\n return (\n <div className={styles.container}>\n <div className={cn(\n styles.iconContainer,\n 'bg-[var(--aw-success)]/10'\n )}>\n <Check \n size={iconSize('xl')} \n className={styles.checkIcon} \n />\n </div>\n\n <div className={styles.textContainer}>\n <h3 className={cn('text-lg font-semibold', text.default)}>Connected!</h3>\n <p className={cn('text-sm', text.muted)}>Your wallet is now connected</p>\n </div>\n\n <div className={styles.accountSection}>\n <span className={cn('text-xs uppercase tracking-wider font-medium', text.muted)}>\n Your address\n </span>\n <AddressDisplay address={address} showCopy />\n </div>\n\n <Button\n variant=\"primary\"\n className={styles.continueButton}\n onClick={onClose}\n icon={<ArrowRight size={iconSize()} />}\n >\n Continue to App\n </Button>\n </div>\n );\n};\n","import React from 'react'\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n VisuallyHidden,\n} from '../../../components/ui'\nimport { ConnectModalProvider, useConnectModalContext } from './context'\nimport {\n MainView,\n AztecWalletsView,\n EVMWalletsView,\n ConnectingView,\n SuccessView,\n} from './views'\nimport type { ResolvedAztecWalletConfig, ModalWalletType } from '../../types'\n\nconst styles = {\n content: 'sm:max-w-md',\n header: 'mb-4',\n} as const\n\n/**\n * Internal modal content that switches between views\n */\nconst ModalContent: React.FC = () => {\n const { view, config } = useConnectModalContext()\n\n // Render view-specific header\n const renderHeader = () => {\n switch (view) {\n case 'main':\n return (\n <DialogHeader className={styles.header}>\n <DialogTitle>{config.modal?.title || 'Connect Wallet'}</DialogTitle>\n <DialogDescription>\n {config.modal?.subtitle ||\n 'Choose how you want to connect. Each option offers a different balance of convenience and security.'}\n </DialogDescription>\n </DialogHeader>\n )\n case 'aztec-wallets':\n // Visually hidden title for accessibility\n return (\n <VisuallyHidden>\n <DialogTitle>Select Aztec Wallet</DialogTitle>\n </VisuallyHidden>\n )\n case 'evm-wallets':\n // Visually hidden title for accessibility\n return (\n <VisuallyHidden>\n <DialogTitle>Select EVM Wallet</DialogTitle>\n </VisuallyHidden>\n )\n case 'connecting':\n // Visually hidden title for accessibility\n return (\n <VisuallyHidden>\n <DialogTitle>Connecting Wallet</DialogTitle>\n </VisuallyHidden>\n )\n case 'success':\n // Visually hidden title for accessibility\n return (\n <VisuallyHidden>\n <DialogTitle>Connection Successful</DialogTitle>\n </VisuallyHidden>\n )\n default:\n return (\n <VisuallyHidden>\n <DialogTitle>Connect Wallet</DialogTitle>\n </VisuallyHidden>\n )\n }\n }\n\n // Render view content\n const renderView = () => {\n switch (view) {\n case 'main':\n return <MainView />\n case 'aztec-wallets':\n return <AztecWalletsView />\n case 'evm-wallets':\n return <EVMWalletsView />\n case 'connecting':\n return <ConnectingView />\n case 'success':\n return <SuccessView />\n default:\n return <MainView />\n }\n }\n\n return (\n <>\n {renderHeader()}\n {renderView()}\n </>\n )\n}\n\nexport interface ConnectModalProps {\n /** Whether the modal is open */\n open: boolean\n /** Callback when modal should close */\n onOpenChange: (open: boolean) => void\n /** Resolved AztecWallet configuration */\n config: ResolvedAztecWalletConfig\n /** Callback to handle wallet connection */\n onConnect: (walletId: string, walletType: ModalWalletType) => Promise<void>\n}\n\n/**\n * Connect wallet modal component\n *\n * Provides a multi-step flow for connecting different wallet types:\n * - Embedded wallet (app-managed)\n * - Aztec browser wallets (Azguard, etc.)\n * - EVM wallets (MetaMask, Rabby, etc.)\n */\nexport const ConnectModal: React.FC<ConnectModalProps> = ({\n open,\n onOpenChange,\n config,\n onConnect,\n}) => {\n const handleClose = () => {\n onOpenChange(false)\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={styles.content}\n aria-describedby={undefined}\n data-testid=\"connect-wallet-modal\"\n >\n <ConnectModalProvider\n config={config}\n onClose={handleClose}\n onConnect={onConnect}\n >\n <ModalContent />\n </ConnectModalProvider>\n </DialogContent>\n </Dialog>\n )\n}\n","import React, { useCallback, useMemo } from 'react';\nimport { Check } from 'lucide-react';\nimport { Dialog, DialogContent, DialogTitle } from '../../../components/ui';\nimport { cn, iconSize } from '../../../utils';\nimport {\n getNetworkIcon,\n getNetworkDisplayName,\n} from '../../config/networkPresets';\nimport { useNetworkStore } from '../../store/network';\nimport { NetworkIcon } from '../shared';\nimport { bg, border, text } from '../../theme/classes';\nimport type { AztecNetwork } from '../../../config/networks/constants';\nimport type { NetworkPreset } from '../../types';\n\nconst styles = {\n content: 'sm:max-w-sm',\n header: 'mb-2',\n list: 'flex flex-col gap-2 stagger-children',\n networkButton: [\n 'group w-full flex items-center gap-3',\n 'px-4 py-3 rounded-xl',\n 'border border-transparent',\n 'transition-all duration-200',\n 'cursor-pointer',\n ].join(' '),\n iconContainer: [\n 'flex items-center justify-center',\n 'w-10 h-10 rounded-xl',\n ].join(' '),\n networkIcon: 'text-lg',\n spacer: 'flex-1',\n checkIcon: 'text-[var(--aw-success)]',\n} as const;\n\nexport interface NetworkModalProps {\n /** Whether the modal is open */\n open: boolean;\n /** Callback when modal should close */\n onOpenChange: (open: boolean) => void;\n /** Available networks */\n networks: NetworkPreset[];\n /** Optional title */\n title?: string;\n}\n\n/**\n * Network button component for the modal\n */\ninterface NetworkButtonProps {\n network: NetworkPreset;\n isActive: boolean;\n onClick: () => void;\n}\n\nconst NetworkButton: React.FC<NetworkButtonProps> = ({\n network,\n isActive,\n onClick,\n}) => {\n const icon = getNetworkIcon(network.name, network.icon);\n const displayName = getNetworkDisplayName(network.name, network.displayName);\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n styles.networkButton,\n bg.surfaceSecondary,\n 'hover:bg-[var(--aw-surface-tertiary)]',\n 'hover:border-[var(--aw-accent)]/30',\n isActive && 'border-[var(--aw-accent)]/50 bg-[var(--aw-accent)]/5 hover:bg-[var(--aw-accent)]/10'\n )}\n data-testid={`network-option-${network.name}`}\n >\n <div className={cn(\n styles.iconContainer,\n bg.surfaceTertiary\n )}>\n <NetworkIcon \n icon={icon} \n size=\"md\" \n className={cn(styles.networkIcon, 'text-[var(--aw-accent)]')} \n />\n </div>\n <span className={cn('text-sm font-medium', text.default)}>{displayName}</span>\n <span className={styles.spacer} />\n {isActive && <Check size={iconSize()} className={styles.checkIcon} />}\n </button>\n );\n};\n\n/**\n * Network selection modal\n *\n * Shows available networks and allows switching between them.\n */\nexport const NetworkModal: React.FC<NetworkModalProps> = ({\n open,\n onOpenChange,\n networks,\n title = 'Switch Network',\n}) => {\n const currentConfig = useNetworkStore((state) => state.currentConfig);\n const switchToNetwork = useNetworkStore((state) => state.switchToNetwork);\n\n const handleNetworkSelect = useCallback(\n (networkName: AztecNetwork) => {\n switchToNetwork(networkName);\n onOpenChange(false);\n },\n [switchToNetwork, onOpenChange]\n );\n\n const networkList = useMemo(() => {\n return networks.map((network) => ({\n ...network,\n isActive: network.name === currentConfig.name,\n }));\n }, [networks, currentConfig.name]);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={styles.content}\n aria-describedby={undefined}\n data-testid=\"network-modal\"\n >\n <div className={styles.header}>\n <DialogTitle className={cn('text-lg font-semibold', text.default)}>\n {title}\n </DialogTitle>\n </div>\n\n <p className={cn('text-sm mt-2 mb-4', text.muted)}>\n Aztec supports multiple networks for different use cases. Select the\n one that best fits your needs.\n </p>\n\n <div className={styles.list}>\n {networkList.map((network) => (\n <NetworkButton\n key={network.name}\n network={network}\n isActive={network.isActive}\n onClick={() => handleNetworkSelect(network.name)}\n />\n ))}\n </div>\n </DialogContent>\n </Dialog>\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","import { useEffect } from 'react';\nimport { getEIP6963Service, type EIP6963Service } from '../services/evm';\nimport { getEVMStore } from '../store/evm';\n\n/**\n * Hook that initializes EIP-6963 wallet discovery and syncs discovered wallets to Zustand.\n * @param evmServiceAvailable - Fallback availability check (e.g., window.ethereum exists)\n * @returns The EIP6963Service singleton for provider lookups\n */\nexport const useEIP6963Discovery = (\n evmServiceAvailable: boolean\n): EIP6963Service => {\n const eip6963 = getEIP6963Service();\n\n useEffect(() => {\n eip6963.discover();\n\n const unsubscribe = eip6963.subscribe((providers) => {\n getEVMStore().setDiscoveredWallets(providers);\n getEVMStore().setAvailable(providers.length > 0 || evmServiceAvailable);\n });\n\n return unsubscribe;\n }, [evmServiceAvailable, eip6963]);\n\n return eip6963;\n};\n","import React from 'react';\n\n/**\n * Default CSS variables for the Aztec Wallet theme.\n * These provide sensible defaults that work in both light and dark modes.\n * \n * The SDK uses CSS custom properties for theming, allowing users to:\n * 1. Use the default theme (injected automatically)\n * 2. Override specific variables in their own CSS\n * 3. Completely disable the default theme and use their own\n */\nexport const defaultThemeStyles = `\n :root {\n /* Accent/Primary colors */\n --aw-accent: #3b82f6;\n --aw-accent-hover: #2563eb;\n --aw-accent-foreground: #ffffff;\n \n /* Background colors */\n --aw-background: #ffffff;\n --aw-surface-primary: #ffffff;\n --aw-surface-secondary: #f3f4f6;\n --aw-surface-tertiary: #e5e7eb;\n \n /* Text colors */\n --aw-text-default: #111827;\n --aw-text-muted: #6b7280;\n --aw-text-secondary: #4b5563;\n --aw-text-inverse: #ffffff;\n \n /* Border colors */\n --aw-border-default: #e5e7eb;\n --aw-border-subtle: #f3f4f6;\n --aw-border-accent: #3b82f6;\n \n /* Status colors */\n --aw-success: #22c55e;\n --aw-success-bg: rgba(34, 197, 94, 0.1);\n --aw-warning: #f59e0b;\n --aw-warning-bg: rgba(245, 158, 11, 0.1);\n --aw-error: #ef4444;\n --aw-error-bg: rgba(239, 68, 68, 0.1);\n \n /* Overlay */\n --aw-overlay: rgba(0, 0, 0, 0.5);\n \n /* Shadows */\n --aw-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --aw-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --aw-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n \n /* Radius */\n --aw-radius-sm: 0.375rem;\n --aw-radius-md: 0.5rem;\n --aw-radius-lg: 0.75rem;\n --aw-radius-xl: 1rem;\n }\n \n /* Dark mode support - respects user's preference or class */\n @media (prefers-color-scheme: dark) {\n :root {\n --aw-background: #0f0f0f;\n --aw-surface-primary: #1a1a1a;\n --aw-surface-secondary: #262626;\n --aw-surface-tertiary: #333333;\n \n --aw-text-default: #fafafa;\n --aw-text-muted: #a3a3a3;\n --aw-text-secondary: #d4d4d4;\n --aw-text-inverse: #171717;\n \n --aw-border-default: #333333;\n --aw-border-subtle: #262626;\n }\n }\n \n /* Manual dark mode class support */\n .dark {\n --aw-background: #0f0f0f;\n --aw-surface-primary: #1a1a1a;\n --aw-surface-secondary: #262626;\n --aw-surface-tertiary: #333333;\n \n --aw-text-default: #fafafa;\n --aw-text-muted: #a3a3a3;\n --aw-text-secondary: #d4d4d4;\n --aw-text-inverse: #171717;\n \n --aw-border-default: #333333;\n --aw-border-subtle: #262626;\n }\n`;\n\nexport interface ThemeStyleInjectorProps {\n /** Whether to inject the default theme styles. Set to false if you want complete control over styling. */\n enabled?: boolean;\n /** Custom CSS to inject alongside or instead of the default theme */\n customCss?: string;\n}\n\n/**\n * Injects default CSS variables for the Aztec Wallet theme.\n * \n * This component should be mounted once near the root of your app.\n * It injects a style tag with CSS custom properties that the SDK components use.\n * \n * @example\n * ```tsx\n * function App() {\n * return (\n * <>\n * <ThemeStyleInjector />\n * <YourApp />\n * </>\n * );\n * }\n * ```\n * \n * To customize the theme, override the CSS variables in your own stylesheet:\n * ```css\n * :root {\n * --aw-accent: #your-brand-color;\n * --aw-surface-secondary: #your-surface-color;\n * }\n * ```\n */\nexport const ThemeStyleInjector: React.FC<ThemeStyleInjectorProps> = ({\n enabled = true,\n customCss,\n}) => {\n if (!enabled && !customCss) {\n return null;\n }\n\n const css = [enabled ? defaultThemeStyles : '', customCss || '']\n .filter(Boolean)\n .join('\\n');\n\n return <style data-aztec-wallet-theme>{css}</style>;\n};\n"],"mappings":"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","names":["import_addresses","init_azguard","import_react","import_shallow","import_react","import_shallow","import_zustand","PLACEHOLDER_ADDRESS","import_zustand","import_addresses","import_fields","import_log","import_constants","import_SponsoredFPC","import_addresses","import_fields","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_react","import_lucide_react","import_react","React","sizes","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","text","text","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","styles","import_jsx_runtime","import_jsx_runtime","styles","import_lucide_react","import_jsx_runtime","styles","import_lucide_react","import_jsx_runtime","styles","import_jsx_runtime","import_jsx_runtime","styles","import_jsx_runtime","styles","import_react","import_jsx_runtime","import_react","import_jsx_runtime","styles","import_react","import_react","import_zustand","INITIAL_STATE","import_jsx_runtime","styles","import_react","import_jsx_runtime","styles","import_lucide_react","import_jsx_runtime","styles","import_lucide_react","import_jsx_runtime","styles","import_jsx_runtime","styles","import_react","import_lucide_react","import_jsx_runtime","styles","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","AzguardAdapter","AzguardClient","import_react","import_jsx_runtime","import_jsx_runtime"]}
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/providers/index.ts","../../../src/aztec-wallet/providers/AztecWalletProvider.tsx","../../../src/utils/cn.ts","../../../src/utils/configValidation.ts","../../../src/utils/iconSize.ts","../../../src/utils/string.ts","../../../src/aztec-wallet/components/AztecWalletModals/AztecWalletModals.tsx","../../../src/aztec-wallet/providers/context.tsx","../../../src/aztec-wallet/store/modal.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/connectors/BrowserWalletConnector.ts","../../../src/aztec-wallet/connectors/registry.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/components/AccountModal/AccountModal.tsx","../../../src/components/ui/Button.tsx","../../../src/aztec-wallet/theme/classes.ts","../../../src/components/ui/Badge.tsx","../../../src/components/ui/Dialog.tsx","../../../src/components/ui/VisuallyHidden.tsx","../../../src/hooks/useCopyToClipboard.ts","../../../src/utils/clipboard.ts","../../../src/aztec-wallet/config/networkPresets.ts","../../../src/aztec-wallet/components/ConnectButton/ConnectButton.tsx","../../../src/aztec-wallet/components/shared/Spinner.tsx","../../../src/aztec-wallet/components/shared/AddressDisplay.tsx","../../../src/aztec-wallet/components/shared/IconRenderer.tsx","../../../src/aztec-wallet/components/shared/WalletButton.tsx","../../../src/aztec-wallet/components/shared/WalletGroupButton.tsx","../../../src/aztec-wallet/components/shared/BackButton.tsx","../../../src/aztec-wallet/components/shared/NetworkIcon.tsx","../../../src/aztec-wallet/components/ConnectModal/context.tsx","../../../src/aztec-wallet/components/ConnectModal/views/MainView.tsx","../../../src/aztec-wallet/components/ConnectModal/views/AztecWalletsView.tsx","../../../src/aztec-wallet/hooks/useWalletAvailability.ts","../../../src/aztec-wallet/store/evm/store.ts","../../../src/aztec-wallet/components/ConnectModal/views/EVMWalletsView.tsx","../../../src/aztec-wallet/components/ConnectModal/views/ConnectingView.tsx","../../../src/aztec-wallet/components/ConnectModal/views/SuccessView.tsx","../../../src/aztec-wallet/components/ConnectModal/ConnectModal.tsx","../../../src/aztec-wallet/components/NetworkModal/NetworkModal.tsx","../../../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/hooks/useEIP6963Discovery.ts","../../../src/aztec-wallet/theme/style-injector.tsx"],"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 {\n AztecWalletProvider,\n type AztecWalletProviderProps,\n} from './AztecWalletProvider';\nexport { AztecWalletContext, useAztecWalletContext } from './context';\n","import React, { useEffect, useMemo, useRef } from 'react'\nimport { useShallow } from 'zustand/react/shallow'\nimport { isValidConfig } from '../../utils'\nimport { AztecWalletModals } from '../components/AztecWalletModals'\nimport { createAztecWalletConfig } from '../config'\nimport { createConnectorRegistry } from '../connectors/registry'\nimport { useEIP6963Discovery } from '../hooks/useEIP6963Discovery'\nimport { getEIP6963Service, getEVMWalletService } from '../services/evm'\nimport { getNetworkStore, useNetworkStore } from '../store/network'\nimport {\n useWalletStore,\n getWalletStore,\n getStoredWalletConnection,\n setupWalletCrossTabSync,\n} from '../store/wallet'\nimport { WalletType } from '../types/aztec'\nimport { AztecWalletContext } from './context'\nimport { ThemeStyleInjector } from '../theme'\nimport type { AztecNetwork } from '../../config/networks/constants'\nimport type { ExternalSignerWalletConnector } from '../../types/walletConnector'\nimport type {\n AztecWalletConfig,\n NetworkPreset,\n StoreNetworkPreset,\n} from '../types'\n\nexport interface AztecWalletProviderProps {\n /** AztecWallet configuration */\n config: AztecWalletConfig\n /** Child components */\n children: React.ReactNode\n /**\n * Whether to inject default theme styles.\n * Set to false if you want complete control over styling via your own CSS.\n * @default true\n */\n enableDefaultTheme?: boolean\n /**\n * Custom CSS to inject alongside or instead of the default theme.\n * Use this to override specific variables without disabling the entire default theme.\n */\n customThemeCss?: string\n}\n\n/**\n * Internal component that handles auto-reconnection on mount.\n * Automatically reconnects to the last connected wallet when the app loads.\n */\nconst AutoReconnect: React.FC = () => {\n const autoConnectAttempted = useRef(false)\n\n const connectors = useWalletStore((state) => state.connectors)\n const status = useWalletStore((state) => state.status)\n\n const walletActions = useWalletStore(\n useShallow((state) => ({\n connect: state.connect,\n connectExistingEmbedded: state.connectExistingEmbedded,\n hasSavedEmbeddedAccount: state.hasSavedEmbeddedAccount,\n })),\n )\n\n const isInitialized = connectors.length > 0\n const isConnected = status === 'connected'\n const isConnecting = status === 'connecting' || status === 'deploying'\n\n useEffect(() => {\n // Only attempt once, when initialized, and not already connected\n if (\n autoConnectAttempted.current ||\n !isInitialized ||\n isConnected ||\n isConnecting\n ) {\n return\n }\n\n autoConnectAttempted.current = true\n\n // Check if there was an active connection saved\n const storedConnection = getStoredWalletConnection()\n\n if (!storedConnection) {\n console.log('AztecWallet: No saved connection found')\n return\n }\n\n const { connectorId, walletType } = storedConnection\n console.log(\n `AztecWallet: Found saved connection - ${connectorId} (${walletType})`,\n )\n\n // Find the connector\n const savedConnector = connectors.find((c) => c.id === connectorId)\n\n if (!savedConnector) {\n console.warn(`AztecWallet: Saved connector \"${connectorId}\" not found`)\n return\n }\n\n // Auto-reconnect based on wallet type\n const reconnect = async () => {\n try {\n switch (walletType) {\n case WalletType.EMBEDDED:\n // For embedded, check if credentials exist\n if (walletActions.hasSavedEmbeddedAccount()) {\n console.log(\n 'AztecWallet: Auto-reconnecting to embedded wallet...',\n )\n await walletActions.connectExistingEmbedded(connectorId)\n } else {\n console.warn('AztecWallet: No saved embedded credentials found')\n }\n break\n\n case WalletType.EXTERNAL_SIGNER:\n // For external signer (MetaMask, etc.), try silent reconnection\n await tryExternalSignerReconnect(savedConnector, connectorId)\n break\n\n case WalletType.BROWSER_WALLET:\n // For browser wallets, try to reconnect - if session exists it will be silent\n console.log('AztecWallet: Auto-reconnecting to browser wallet...')\n await walletActions.connect(connectorId)\n break\n\n default:\n console.warn(`AztecWallet: Unknown wallet type: ${walletType}`)\n }\n } catch (err) {\n console.warn('AztecWallet: Auto-reconnect failed:', err)\n }\n }\n\n /**\n * Try to silently reconnect to an external signer wallet.\n * Uses eth_accounts (no popup) to check if we still have permissions.\n */\n const tryExternalSignerReconnect = async (\n connector: (typeof connectors)[0],\n id: string,\n ) => {\n const externalConnector = connector as ExternalSignerWalletConnector\n const rdns = externalConnector.rdns\n\n if (!rdns) {\n console.log(\n 'AztecWallet: External signer has no rdns, skipping auto-reconnect',\n )\n return\n }\n\n // Check if the wallet is available via EIP-6963\n const eip6963 = getEIP6963Service()\n const provider = eip6963.getProviderByRdns(rdns)\n\n if (!provider) {\n console.log(\n `AztecWallet: Wallet ${rdns} not found via EIP-6963, cannot auto-reconnect`,\n )\n return\n }\n\n try {\n // Use eth_accounts to check if we have permissions (no popup)\n const accounts = (await provider.request({\n method: 'eth_accounts',\n })) as string[]\n\n if (accounts && accounts.length > 0) {\n console.log(\n `AztecWallet: Found existing permission for ${rdns}, auto-reconnecting...`,\n )\n await walletActions.connect(id)\n } else {\n console.log(\n `AztecWallet: No existing permission for ${rdns}, user needs to reconnect manually`,\n )\n }\n } catch (err) {\n console.warn(`AztecWallet: Failed to check ${rdns} permissions:`, err)\n }\n }\n\n reconnect()\n }, [isInitialized, isConnected, isConnecting, connectors, walletActions])\n\n return null\n}\n\n/**\n * Convert AztecWalletConfig networks to StoreNetworkPreset format for the store\n */\nfunction toStoreNetworkPresets(\n networks: NetworkPreset[],\n): StoreNetworkPreset[] {\n return networks.map((n) => ({\n aztecNetwork: n.name as AztecNetwork,\n nodeUrl: n.nodeUrl,\n }))\n}\n\n/**\n * AztecWallet Provider\n *\n * Main provider that:\n * 1. Resolves the configuration with defaults\n * 2. Auto-creates connectors from walletGroups\n * 3. Initializes network and wallet stores\n * 4. Sets up cross-tab synchronization\n * 5. Provides configuration context to components\n * 6. Renders wallet modals\n * 7. Injects default theme styles (can be disabled)\n *\n * @example\n * ```tsx\n * // With default theme (recommended)\n * <AztecWalletProvider config={config}>\n * <App />\n * </AztecWalletProvider>\n *\n * // With custom theme (disable default)\n * <AztecWalletProvider config={config} enableDefaultTheme={false}>\n * <App />\n * </AztecWalletProvider>\n *\n * // With custom CSS overrides\n * <AztecWalletProvider \n * config={config} \n * customThemeCss={`:root { --aw-accent: #your-color; }`}\n * >\n * <App />\n * </AztecWalletProvider>\n * ```\n */\nexport const AztecWalletProvider: React.FC<AztecWalletProviderProps> = ({\n config: userConfig,\n children,\n enableDefaultTheme = true,\n customThemeCss,\n}) => {\n const { setConnectors, disconnect } = useWalletStore(\n useShallow((state) => ({\n setConnectors: state.setConnectors,\n disconnect: state.disconnect,\n })),\n )\n const { initialize: initializeNetwork, resetToDefault } = useNetworkStore(\n useShallow((state) => ({\n initialize: state.initialize,\n resetToDefault: state.resetToDefault,\n })),\n )\n const currentConfig = useNetworkStore((state) => state.currentConfig)\n\n // Trigger EIP-6963 wallet discovery for EVM wallets\n // This populates the EVM store with discovered wallets\n const evmServiceAvailable = getEVMWalletService().isAvailable()\n useEIP6963Discovery(evmServiceAvailable)\n\n // Resolve config with defaults\n const resolvedConfig = useMemo(\n () => createAztecWalletConfig(userConfig),\n [userConfig],\n )\n\n // Initialize network store\n useEffect(() => {\n const networkPresets = toStoreNetworkPresets(userConfig.networks)\n\n if (!getNetworkStore().isInitialized) {\n initializeNetwork(networkPresets)\n }\n\n setupWalletCrossTabSync()\n }, [userConfig.networks, initializeNetwork])\n\n // Validate network config\n useEffect(() => {\n if (!isValidConfig(currentConfig)) {\n console.warn(\n `⚠️ Invalid config for ${currentConfig.name}, falling back to default`,\n )\n resetToDefault()\n }\n }, [currentConfig, resetToDefault])\n\n // Check network availability in background when network changes\n useEffect(() => {\n if (currentConfig?.nodeUrl) {\n // Reset status and check in background (non-blocking)\n const walletStore = getWalletStore()\n walletStore.setNetworkStatus('idle')\n void walletStore.checkNetwork()\n }\n }, [currentConfig?.nodeUrl])\n\n // Initialize connectors from resolved config\n useEffect(() => {\n const registry = createConnectorRegistry(resolvedConfig.connectors)\n setConnectors(registry.getConnectors())\n\n return () => {\n disconnect()\n }\n }, [\n resolvedConfig.connectors,\n currentConfig.nodeUrl,\n setConnectors,\n disconnect,\n ])\n\n // Check if connectors are initialized\n const connectors = useWalletStore((state) => state.connectors)\n const isInitialized = connectors.length > 0\n\n // Context value\n const contextValue = useMemo(\n () => ({\n config: resolvedConfig,\n isInitialized,\n }),\n [resolvedConfig, isInitialized],\n )\n\n return (\n <AztecWalletContext.Provider value={contextValue}>\n <ThemeStyleInjector enabled={enableDefaultTheme} customCss={customThemeCss} />\n <AutoReconnect />\n {children}\n <AztecWalletModals />\n </AztecWalletContext.Provider>\n )\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Utility to merge Tailwind classes\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { AztecAddress } from '@aztec/aztec.js/addresses';\nimport { Fr } from '@aztec/aztec.js/fields';\n\nconst PLACEHOLDER_ADDRESS = '0x0000000000000000000000000000000000000000000000000000000000000000';\n\n/**\n * Validates that a network configuration has valid contract addresses.\n * Returns false if addresses are placeholders or invalid.\n * \n * Stub implementation for SDK - checks basic requirements.\n */\nexport const isValidConfig = (config: {\n nodeUrl?: string;\n tokenContractAddress?: string;\n dripperContractAddress?: string;\n deployerAddress?: string;\n dripperDeploymentSalt?: string;\n tokenDeploymentSalt?: string;\n}): boolean => {\n // Check required fields exist\n if (\n !config.nodeUrl\n ) {\n return false;\n }\n\n // If contract addresses are provided, validate them\n if (config.tokenContractAddress) {\n if (config.tokenContractAddress === PLACEHOLDER_ADDRESS) {\n return false;\n }\n try {\n AztecAddress.fromString(config.tokenContractAddress);\n } catch {\n return false;\n }\n }\n\n if (config.dripperContractAddress) {\n if (config.dripperContractAddress === PLACEHOLDER_ADDRESS) {\n return false;\n }\n try {\n AztecAddress.fromString(config.dripperContractAddress);\n } catch {\n return false;\n }\n }\n\n // Validate deployment salts if provided\n if (config.dripperDeploymentSalt) {\n try {\n Fr.fromString(config.dripperDeploymentSalt);\n } catch {\n return false;\n }\n }\n\n if (config.tokenDeploymentSalt) {\n try {\n Fr.fromString(config.tokenDeploymentSalt);\n } catch {\n return false;\n }\n }\n\n return true;\n};\n","/**\n * Icon size utility for consistent Lucide icon sizing across the app.\n *\n * Returns pixel values to use with Lucide's `size` prop.\n */\n\nconst sizes = {\n xxs: 8,\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n '2xl': 48,\n} as const;\n\nexport type IconSize = keyof typeof sizes;\n\n/**\n * Returns pixel size for Lucide icons.\n * @param size - Size variant: 'xxs', 'xs', 'sm' (default), 'md', 'lg', 'xl', '2xl'\n * @returns Pixel value for the icon size\n */\nexport const iconSize = (size: IconSize = 'sm'): number => sizes[size];\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 React, { useCallback } from 'react';\nimport { useShallow } from 'zustand/react/shallow';\nimport { useAztecWalletContext } from '../../providers/context';\nimport { useModalStore } from '../../store/modal';\nimport { useNetworkStore } from '../../store/network';\nimport { useWalletStore } from '../../store/wallet';\nimport { AccountModal } from '../AccountModal';\nimport { ConnectModal } from '../ConnectModal';\nimport { NetworkModal } from '../NetworkModal';\nimport type { ModalWalletType } from '../../types';\n\n/**\n * Internal component that renders all AztecWallet modals\n *\n * This component is automatically rendered inside AztecWalletProvider.\n * Users don't need to render modals manually.\n */\nexport const AztecWalletModals: React.FC = () => {\n const { config } = useAztecWalletContext();\n\n // Modal state\n const { openModal, closeModal, setModal } = useModalStore(\n useShallow((state) => ({\n openModal: state.openModal,\n closeModal: state.closeModal,\n setModal: state.setModal,\n }))\n );\n\n // Wallet state\n const walletState = useWalletStore(\n useShallow((state) => ({\n account: state.account,\n status: state.status,\n connect: state.connect,\n connectEmbedded: state.connectEmbedded,\n connectExistingEmbedded: state.connectExistingEmbedded,\n hasSavedEmbeddedAccount: state.hasSavedEmbeddedAccount,\n disconnect: state.disconnect,\n connectors: state.connectors,\n }))\n );\n\n // Network state\n const currentConfig = useNetworkStore((state) => state.currentConfig);\n\n const isConnected = walletState.status === 'connected';\n const address = walletState.account?.getAddress().toString() ?? '';\n\n // Handle connect modal open change\n const handleConnectOpenChange = useCallback(\n (open: boolean) => {\n setModal(open ? 'connect' : null);\n },\n [setModal]\n );\n\n // Handle account modal open change\n const handleAccountOpenChange = useCallback(\n (open: boolean) => {\n setModal(open ? 'account' : null);\n },\n [setModal]\n );\n\n // Handle network modal open change\n const handleNetworkOpenChange = useCallback(\n (open: boolean) => {\n setModal(open ? 'network' : null);\n },\n [setModal]\n );\n\n // Handle wallet connection from modal\n const handleConnect = useCallback(\n async (walletId: string, walletType: ModalWalletType) => {\n // Use the appropriate connection method based on wallet type\n if (walletType === 'embedded') {\n if (walletState.hasSavedEmbeddedAccount()) {\n await walletState.connectExistingEmbedded(walletId);\n } else {\n await walletState.connectEmbedded(walletId);\n }\n } else {\n await walletState.connect(walletId);\n }\n\n closeModal();\n },\n [walletState, closeModal]\n );\n\n // Handle disconnect\n const handleDisconnect = useCallback(async () => {\n await walletState.disconnect();\n closeModal();\n }, [walletState, closeModal]);\n\n return (\n <>\n {/* Connect Modal */}\n <ConnectModal\n open={openModal === 'connect'}\n onOpenChange={handleConnectOpenChange}\n config={config}\n onConnect={handleConnect}\n />\n\n {/* Account Modal */}\n {isConnected && address && (\n <AccountModal\n open={openModal === 'account'}\n onOpenChange={handleAccountOpenChange}\n address={address}\n networkName={currentConfig?.name}\n showNetwork={config.accountModal?.showNetwork}\n onDisconnect={handleDisconnect}\n />\n )}\n\n {/* Network Modal */}\n <NetworkModal\n open={openModal === 'network'}\n onOpenChange={handleNetworkOpenChange}\n networks={config.networks}\n />\n </>\n );\n};\n","import { createContext, useContext, type Context } from 'react'\nimport type { ResolvedAztecWalletConfig } from '../types'\n\nexport interface AztecWalletContextValue {\n /** Resolved configuration */\n config: ResolvedAztecWalletConfig\n /** Whether the wallet is initialized */\n isInitialized: boolean\n}\n\nconst AZTEC_WALLET_CONTEXT_KEY = Symbol.for(\n 'ravenhouse.aztec-wallet.context',\n)\n\nconst globalContextStore = globalThis as typeof globalThis & {\n [AZTEC_WALLET_CONTEXT_KEY]?: Context<AztecWalletContextValue | null>\n}\n\nexport const AztecWalletContext =\n globalContextStore[AZTEC_WALLET_CONTEXT_KEY] ??\n (globalContextStore[AZTEC_WALLET_CONTEXT_KEY] =\n createContext<AztecWalletContextValue | null>(null))\n\nexport const useAztecWalletContext = (): AztecWalletContextValue => {\n const context = useContext(AztecWalletContext)\n if (!context) {\n throw new Error(\n 'useAztecWalletContext must be used within AztecWalletProvider',\n )\n }\n return context\n}\n","import { create } from 'zustand';\n\ntype ModalType = 'connect' | 'account' | 'network' | null;\n\ninterface ModalState {\n /** Currently open modal */\n openModal: ModalType;\n /** Open the connect modal */\n openConnectModal: () => void;\n /** Open the account modal */\n openAccountModal: () => void;\n /** Open the network modal */\n openNetworkModal: () => void;\n /** Close any open modal */\n closeModal: () => void;\n /** Set modal (for onOpenChange handlers) */\n setModal: (modal: ModalType) => void;\n}\n\n/**\n * Global modal state store\n *\n * Manages which modal is currently open. Only one modal can be open at a time.\n */\nexport const useModalStore = create<ModalState>((set) => ({\n openModal: null,\n\n openConnectModal: () => set({ openModal: 'connect' }),\n\n openAccountModal: () => set({ openModal: 'account' }),\n\n openNetworkModal: () => set({ openModal: 'network' }),\n\n closeModal: () => set({ openModal: null }),\n\n setModal: (modal) => set({ openModal: modal }),\n}));\n\n/**\n * Get modal store outside of React components\n */\nexport const getModalStore = () => useModalStore.getState();\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 * 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 {\n WalletConnector,\n WalletConnectorId,\n} from '../../types/walletConnector'\n\nexport type ConnectorFactory = () => WalletConnector\n\nexport interface ConnectorRegistryOptions {\n /**\n * Optional priority list to override default connector order.\n * Connectors not listed here maintain their factory order after the prioritized entries.\n */\n priority?: WalletConnectorId[]\n}\n\nexport class ConnectorRegistry {\n private readonly connectors: WalletConnector[]\n\n constructor(\n factories: ConnectorFactory[],\n options: ConnectorRegistryOptions = {},\n ) {\n const instantiated = factories.map((factory) => factory())\n\n if (options.priority && options.priority.length > 0) {\n const prioritySet = new Set(options.priority)\n const prioritized: WalletConnector[] = []\n\n options.priority.forEach((id) => {\n const connector = instantiated.find((c) => c.id === id)\n if (connector) {\n prioritized.push(connector)\n }\n })\n\n const remaining = instantiated.filter((c) => !prioritySet.has(c.id))\n this.connectors = [...prioritized, ...remaining]\n } else {\n this.connectors = instantiated\n }\n }\n\n /**\n * Get all instantiated connectors in priority order.\n */\n getConnectors(): WalletConnector[] {\n return this.connectors\n }\n\n /**\n * Find connector by ID.\n */\n getConnector(id: WalletConnectorId): WalletConnector | undefined {\n return this.connectors.find((connector) => connector.id === id)\n }\n\n /**\n * Resolve the first connector that currently has an active account.\n */\n getActiveConnector(): WalletConnector | null {\n for (const connector of this.connectors) {\n if (connector.getAccount()) {\n return connector\n }\n }\n return null\n }\n}\n\nexport const createConnectorRegistry = (\n factories: ConnectorFactory[],\n options?: ConnectorRegistryOptions,\n): ConnectorRegistry => new ConnectorRegistry(factories, options)\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","import React, { useCallback, useMemo } from 'react'\nimport { Copy, Check, LogOut } from 'lucide-react'\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Button,\n VisuallyHidden,\n} from '../../../components/ui'\nimport { useCopyToClipboard } from '../../../hooks'\nimport { cn, iconSize, truncateAddress } from '../../../utils'\nimport {\n getNetworkIcon,\n getNetworkDisplayName,\n} from '../../config/networkPresets'\nimport { getAddressEmoji } from '../ConnectButton/ConnectButton'\nimport { NetworkIcon } from '../shared'\nimport { bg, border, text, componentStyles } from '../../theme/classes'\nimport type { AztecNetwork } from '../../../config/networks/constants'\n\nconst styles = {\n content: 'sm:max-w-sm',\n header: 'flex flex-col items-center gap-3 pb-2',\n emojiContainer: [\n 'w-16 h-16 rounded-2xl',\n 'bg-surface-secondary',\n 'border border-[var(--aw-border-default)]',\n 'flex items-center justify-center',\n 'text-4xl',\n 'shadow-lg',\n ].join(' '),\n statusBadge: [\n 'inline-flex items-center gap-1.5',\n 'px-2.5 py-1 rounded-full',\n 'text-xs font-medium',\n ].join(' '),\n statusDot: 'w-1.5 h-1.5 rounded-full',\n sectionsContainer: 'flex flex-col gap-4 stagger-children',\n section: 'flex flex-col gap-2',\n addressContainer: [\n 'group relative flex items-center justify-between',\n 'bg-surface-secondary px-4 py-3 rounded-xl',\n 'border border-[var(--aw-border-default)]',\n 'transition-all duration-200',\n ].join(' '),\n addressContainerCopied: 'animate-copy-flash',\n copyButton: [\n 'flex items-center justify-center',\n 'w-8 h-8 rounded-lg',\n 'transition-all duration-200',\n 'cursor-pointer',\n ].join(' '),\n networkContainer: [\n 'flex items-center justify-between',\n 'bg-surface-secondary px-4 py-3 rounded-xl',\n 'border border-[var(--aw-border-default)]',\n ].join(' '),\n networkInfo: 'flex items-center gap-3',\n networkIconContainer: [\n 'flex items-center justify-center',\n 'w-8 h-8 rounded-lg',\n ].join(' '),\n networkIconText: 'text-base',\n networkBadge: ['text-xs px-2 py-0.5 rounded-full'].join(' '),\n actions: 'flex flex-col gap-2 pt-2',\n disconnectButton: [\n 'w-full justify-center',\n 'bg-transparent',\n 'border',\n 'transition-all duration-200',\n ].join(' '),\n} as const\n\n/**\n * Network section component\n */\nconst NetworkSection: React.FC<{ networkName: AztecNetwork }> = ({\n networkName,\n}) => {\n const icon = useMemo(() => getNetworkIcon(networkName), [networkName])\n const displayName = useMemo(\n () => getNetworkDisplayName(networkName),\n [networkName],\n )\n\n return (\n <div className={styles.section}>\n <span\n className={cn(\n 'text-xs uppercase tracking-wider font-medium',\n text.muted,\n )}\n >\n Network\n </span>\n <div\n className={cn(\n styles.networkContainer,\n bg.surfaceSecondary,\n border.default,\n )}\n >\n <div className={styles.networkInfo}>\n <div\n className={cn(\n styles.networkIconContainer,\n 'bg-[var(--aw-accent)]/10 text-[var(--aw-accent)]',\n )}\n >\n <NetworkIcon icon={icon} className={styles.networkIconText} />\n </div>\n <span className={cn('text-sm font-medium', text.default)}>\n {displayName}\n </span>\n </div>\n <span\n className={cn(styles.networkBadge, bg.surfaceTertiary, text.muted)}\n >\n Active\n </span>\n </div>\n </div>\n )\n}\n\nexport interface AccountModalProps {\n /** Whether the modal is open */\n open: boolean\n /** Callback when modal should close */\n onOpenChange: (open: boolean) => void\n /** Connected account address */\n address: string\n /** Current network name */\n networkName?: AztecNetwork\n /** Whether to show network section (default: false) */\n showNetwork?: boolean\n /** Callback when disconnect is clicked */\n onDisconnect?: () => void\n}\n\n/**\n * Account details modal\n *\n * Displays connected account information in a modal dialog:\n * - Avatar with address initials\n * - Account address (with copy button)\n * - Network name (optional)\n * - Disconnect button\n */\nexport const AccountModal: React.FC<AccountModalProps> = ({\n open,\n onOpenChange,\n address,\n networkName,\n showNetwork = false,\n onDisconnect,\n}) => {\n const { copied, copy } = useCopyToClipboard()\n\n const handleDisconnect = useCallback(() => {\n onDisconnect?.()\n onOpenChange(false)\n }, [onDisconnect, onOpenChange])\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className={styles.content} aria-describedby={undefined}>\n <VisuallyHidden>\n <DialogTitle>Account Details</DialogTitle>\n </VisuallyHidden>\n <DialogHeader className={styles.header}>\n <div\n className={cn(\n styles.emojiContainer,\n bg.surfaceSecondary,\n border.default,\n )}\n >\n {getAddressEmoji(address)}\n </div>\n <div\n className={cn(\n styles.statusBadge,\n 'bg-[var(--aw-success)]/10 text-[var(--aw-success)]',\n )}\n >\n <span className={cn(styles.statusDot, 'bg-[var(--aw-success)]')} />\n Connected\n </div>\n </DialogHeader>\n\n <div className={styles.sectionsContainer}>\n {/* Address Section */}\n <div className={styles.section}>\n <span\n className={cn(\n 'text-xs uppercase tracking-wider font-medium',\n text.muted,\n )}\n >\n Wallet Address\n </span>\n <div\n className={cn(\n styles.addressContainer,\n bg.surfaceSecondary,\n border.default,\n copied && styles.addressContainerCopied,\n )}\n >\n <span\n className={cn('font-mono text-sm', text.default)}\n title={address}\n >\n {truncateAddress(address, 10, 8)}\n </span>\n <button\n onClick={() => copy(address)}\n className={cn(\n styles.copyButton,\n bg.surfaceTertiary,\n text.muted,\n 'hover:bg-[var(--aw-accent)]/10 hover:text-[var(--aw-accent)]',\n copied &&\n 'bg-[var(--aw-success)]/10 text-[var(--aw-success)]',\n )}\n aria-label={copied ? 'Copied!' : 'Copy address'}\n >\n {copied ? (\n <Check size={iconSize()} />\n ) : (\n <Copy size={iconSize()} />\n )}\n </button>\n </div>\n </div>\n\n {/* Network Section */}\n {showNetwork && networkName && (\n <NetworkSection networkName={networkName} />\n )}\n\n {/* Actions */}\n <div className={styles.actions}>\n <Button\n variant=\"ghost\"\n className={cn(\n styles.disconnectButton,\n 'text-[var(--aw-error)] hover:bg-[var(--aw-error)]/10 border-[var(--aw-error)]/20 hover:border-[var(--aw-error)]/40',\n )}\n onClick={handleDisconnect}\n icon={<LogOut size={iconSize()} />}\n >\n Disconnect Wallet\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","import React from 'react';\nimport { cn } from '../../utils/cn';\nimport { componentStyles } from '../../aztec-wallet/theme/classes';\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'primary' | 'secondary' | 'outline' | 'ghost';\n size?: 'sm' | 'md' | 'lg';\n isLoading?: boolean;\n /** Icon to display before the button text */\n icon?: React.ReactNode;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = 'primary',\n size = 'md',\n isLoading,\n disabled,\n icon,\n children,\n ...props\n },\n ref\n ) => {\n const baseStyles = 'inline-flex items-center justify-center font-medium rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed';\n \n const sizes = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-base',\n lg: 'px-6 py-3 text-lg',\n };\n\n const variants = {\n primary: componentStyles.button.primary,\n secondary: componentStyles.button.secondary,\n outline: componentStyles.button.outline,\n ghost: componentStyles.button.ghost,\n };\n\n return (\n <button\n className={cn(\n baseStyles,\n variants[variant],\n sizes[size],\n className\n )}\n ref={ref}\n disabled={disabled || isLoading}\n {...props}\n >\n {isLoading ? (\n <>\n <span className=\"mr-2 inline-block h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n {children}\n </>\n ) : (\n <>\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {children}\n </>\n )}\n </button>\n );\n }\n);\n\nButton.displayName = 'Button';\n","/**\n * Theme-aware CSS class mappings for Aztec Wallet components.\n * \n * These classes use Tailwind's arbitrary value syntax to reference CSS custom properties.\n * This approach provides:\n * 1. Full compatibility with Tailwind CSS (standard classes)\n * 2. Theme customization via CSS variables (no Tailwind config needed)\n * 3. Works in any React app, with or without Tailwind\n */\n\n// Background colors\nexport const bg = {\n /** Primary background (page background) */\n background: 'bg-[var(--aw-background)]',\n /** Surface primary (cards, modals) */\n surfacePrimary: 'bg-[var(--aw-surface-primary)]',\n /** Surface secondary (buttons, inputs) */\n surfaceSecondary: 'bg-[var(--aw-surface-secondary)]',\n /** Surface tertiary (hover states, subtle backgrounds) */\n surfaceTertiary: 'bg-[var(--aw-surface-tertiary)]',\n /** Accent color background */\n accent: 'bg-[var(--aw-accent)]',\n /** Success state background */\n success: 'bg-[var(--aw-success-bg)]',\n /** Warning state background */\n warning: 'bg-[var(--aw-warning-bg)]',\n /** Error state background */\n error: 'bg-[var(--aw-error-bg)]',\n} as const;\n\n// Text colors\nexport const text = {\n /** Default text color (headings, body) */\n default: 'text-[var(--aw-text-default)]',\n /** Muted text color (placeholders, disabled) */\n muted: 'text-[var(--aw-text-muted)]',\n /** Secondary text color (labels, descriptions) */\n secondary: 'text-[var(--aw-text-secondary)]',\n /** Inverse text color (for colored backgrounds) */\n inverse: 'text-[var(--aw-text-inverse)]',\n /** Accent text color */\n accent: 'text-[var(--aw-accent)]',\n /** Success text color */\n success: 'text-[var(--aw-success)]',\n /** Warning text color */\n warning: 'text-[var(--aw-warning)]',\n /** Error text color */\n error: 'text-[var(--aw-error)]',\n} as const;\n\n// Border colors\nexport const border = {\n /** Default border color */\n default: 'border-[var(--aw-border-default)]',\n /** Subtle border color */\n subtle: 'border-[var(--aw-border-subtle)]',\n /** Accent border color */\n accent: 'border-[var(--aw-border-accent)]',\n} as const;\n\n// Component-specific style combinations\nexport const componentStyles = {\n // Modal styles\n modal: {\n overlay: 'bg-[var(--aw-overlay)]',\n content: 'bg-[var(--aw-surface-primary)] border-[var(--aw-border-default)]',\n title: 'text-[var(--aw-text-default)]',\n description: 'text-[var(--aw-text-muted)]',\n },\n \n // Button styles\n button: {\n primary: 'bg-[var(--aw-accent)] text-[var(--aw-accent-foreground)] hover:bg-[var(--aw-accent-hover)]',\n secondary: 'bg-[var(--aw-surface-secondary)] text-[var(--aw-text-default)] hover:bg-[var(--aw-surface-tertiary)]',\n ghost: 'text-[var(--aw-text-default)] hover:bg-[var(--aw-surface-secondary)]',\n outline: 'border-[var(--aw-border-default)] text-[var(--aw-text-default)] hover:bg-[var(--aw-surface-secondary)]',\n },\n \n // Wallet button styles\n walletButton: {\n base: 'bg-[var(--aw-surface-secondary)] border-transparent hover:bg-[var(--aw-surface-tertiary)] hover:border-[var(--aw-accent)]/30',\n active: 'border-[var(--aw-accent)]/50 bg-[var(--aw-accent)]/5',\n iconContainer: 'bg-[var(--aw-surface-tertiary)]',\n iconContainerHover: 'group-hover:bg-[var(--aw-accent)]/10',\n name: 'text-[var(--aw-text-default)]',\n nameDisabled: 'text-[var(--aw-text-muted)]',\n notInstalled: 'text-[var(--aw-warning)]',\n },\n \n // Wallet group button styles\n walletGroupButton: {\n base: 'bg-[var(--aw-surface-secondary)] hover:bg-[var(--aw-surface-tertiary)] border-transparent hover:border-[var(--aw-accent)]/30',\n iconContainer: 'bg-[var(--aw-accent)]/10 text-[var(--aw-accent)] group-hover:bg-[var(--aw-accent)]/20',\n label: 'text-[var(--aw-text-default)]',\n description: 'text-[var(--aw-text-muted)]',\n arrow: 'text-[var(--aw-text-muted)] group-hover:text-[var(--aw-accent)]',\n },\n \n // Input/Field styles\n input: {\n base: 'bg-[var(--aw-surface-secondary)] border-[var(--aw-border-default)] text-[var(--aw-text-default)]',\n focus: 'focus:border-[var(--aw-accent)] focus:ring-[var(--aw-accent)]',\n placeholder: 'placeholder:text-[var(--aw-text-muted)]',\n },\n \n // Badge styles\n badge: {\n default: 'bg-[var(--aw-accent)]/10 text-[var(--aw-accent)]',\n secondary: 'bg-[var(--aw-surface-tertiary)] text-[var(--aw-text-muted)]',\n outline: 'border-[var(--aw-border-default)] text-[var(--aw-text-default)]',\n success: 'bg-[var(--aw-success-bg)] text-[var(--aw-success)]',\n warning: 'bg-[var(--aw-warning-bg)] text-[var(--aw-warning)]',\n error: 'bg-[var(--aw-error-bg)] text-[var(--aw-error)]',\n },\n \n // Network picker styles\n networkPicker: {\n base: 'bg-[var(--aw-surface-secondary)] hover:bg-[var(--aw-surface-tertiary)] border-[var(--aw-border-default)] hover:border-[var(--aw-accent)]/50',\n icon: 'text-[var(--aw-text-muted)] group-hover:text-[var(--aw-text-default)]',\n name: 'text-[var(--aw-text-default)]',\n },\n \n // Account modal styles\n accountModal: {\n emojiContainer: 'bg-[var(--aw-surface-secondary)] border-[var(--aw-border-default)]',\n addressContainer: 'bg-[var(--aw-surface-secondary)] border-[var(--aw-border-default)]',\n copyButton: 'bg-[var(--aw-surface-tertiary)] text-[var(--aw-text-muted)] hover:bg-[var(--aw-accent)]/10 hover:text-[var(--aw-accent)]',\n disconnectButton: 'text-[var(--aw-error)] hover:bg-[var(--aw-error)]/10 border-[var(--aw-error)]/20 hover:border-[var(--aw-error)]/40',\n },\n} as const;\n\n/**\n * Helper to combine theme classes with user-provided classes.\n * This is a type-safe way to merge classes.\n */\nexport function combineClasses(\n baseClasses: string,\n userClasses?: string\n): string {\n if (!userClasses) return baseClasses;\n return `${baseClasses} ${userClasses}`;\n}\n","import React from 'react';\nimport { cn } from '../../utils/cn';\nimport { componentStyles } from '../../aztec-wallet/theme/classes';\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: 'default' | 'primary' | 'secondary' | 'outline' | 'success' | 'warning' | 'error';\n}\n\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n ({ className, variant = 'default', ...props }, ref) => {\n const variants = {\n default: componentStyles.badge.default,\n primary: componentStyles.badge.default,\n secondary: componentStyles.badge.secondary,\n outline: componentStyles.badge.outline,\n success: componentStyles.badge.success,\n warning: componentStyles.badge.warning,\n error: componentStyles.badge.error,\n };\n\n return (\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',\n variants[variant],\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\n\nBadge.displayName = 'Badge';\n","import React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { cn } from '../../utils/cn';\nimport { componentStyles } from '../../aztec-wallet/theme/classes';\n\nexport const Dialog = DialogPrimitive.Root;\nexport const DialogTrigger = DialogPrimitive.Trigger;\nexport const DialogPortal = DialogPrimitive.Portal;\nexport const DialogClose = DialogPrimitive.Close;\n\nexport const DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n componentStyles.modal.overlay,\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nexport interface DialogContentProps\n extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {}\n\nexport const DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg border',\n componentStyles.modal.content,\n className\n )}\n {...props}\n >\n {children}\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nexport const DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n 'flex flex-col space-y-1.5 text-center sm:text-left',\n className\n )}\n {...props}\n />\n);\nDialogHeader.displayName = 'DialogHeader';\n\nexport const DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n 'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n className\n )}\n {...props}\n />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nexport const DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n 'text-lg font-semibold leading-none tracking-tight',\n componentStyles.modal.title,\n className\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nexport const DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\n 'text-sm',\n componentStyles.modal.description,\n className\n )}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n","import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface VisuallyHiddenProps\n extends React.HTMLAttributes<HTMLSpanElement> {}\n\n/**\n * VisuallyHidden component - hides content visually but keeps it accessible to screen readers.\n */\nexport const VisuallyHidden = React.forwardRef<\n HTMLSpanElement,\n VisuallyHiddenProps\n>(({ className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(\n 'absolute h-px w-px overflow-hidden whitespace-nowrap border-0 p-0',\n '[clip:rect(0,0,0,0)]',\n className\n )}\n {...props}\n />\n );\n});\n\nVisuallyHidden.displayName = 'VisuallyHidden';\n","import { useState, useCallback, useRef, useEffect } from 'react'\nimport { copyToClipboard } from '../utils/clipboard'\n\nexport const useCopyToClipboard = (resetDelay = 2000) => {\n const [copied, setCopied] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined,\n )\n\n const copy = useCallback(\n async (text: string): Promise<boolean> => {\n const success = await copyToClipboard(text)\n if (success) {\n setCopied(true)\n clearTimeout(timeoutRef.current)\n timeoutRef.current = setTimeout(() => setCopied(false), resetDelay)\n }\n return success\n },\n [resetDelay],\n )\n\n useEffect(() => {\n return () => clearTimeout(timeoutRef.current)\n }, [])\n\n return { copied, copy }\n}\n","interface CopyToClipboardOptions {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport const copyToClipboard = async (\n text: string | undefined,\n options?: CopyToClipboardOptions\n): Promise<boolean> => {\n if (!text) return false;\n\n try {\n // Ensure we have the proper format with 0x prefix for addresses\n const textToCopy =\n text.startsWith('0x') || !isHexString(text) ? text : `0x${text}`;\n\n await navigator.clipboard.writeText(textToCopy);\n console.log('Copied to clipboard:', textToCopy);\n options?.onSuccess?.();\n return true;\n } catch (err) {\n console.error('Failed to copy to clipboard:', err);\n const error =\n err instanceof Error ? err : new Error('Failed to copy to clipboard');\n options?.onError?.(error);\n return false;\n }\n};\n\n// Helper to check if a string looks like a hex address\nconst isHexString = (str: string): boolean => {\n return /^[0-9a-fA-F]+$/.test(str);\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","import React, { useCallback } from 'react'\nimport { Wallet, ChevronDown } from 'lucide-react'\nimport { useShallow } from 'zustand/react/shallow'\nimport { Button } from '../../../components/ui'\nimport { cn, iconSize, truncateAddress } from '../../../utils'\nimport { useAztecWalletContext } from '../../providers/context'\nimport { useModalStore } from '../../store/modal'\nimport { useWalletStore } from '../../store/wallet'\nimport { NetworkPicker } from '../NetworkPicker'\nimport { Spinner } from '../shared'\nimport { bg, border, text } from '../../theme/classes'\nimport type { NetworkPickerVariant } from '../../types'\n\n// Emoji list for wallet avatars\nconst WALLET_EMOJIS = [\n '🦊',\n '🐸',\n '🦄',\n '🐙',\n '🦋',\n '🌸',\n '🍀',\n '🌈',\n '⭐',\n '🔮',\n '💎',\n '🎭',\n '🎨',\n '🎪',\n '🎯',\n '🎲',\n '🚀',\n '🌙',\n '☀️',\n '🌊',\n '🔥',\n '❄️',\n '⚡',\n '🌺',\n '🍄',\n '🌵',\n '🎸',\n '🎺',\n '🎹',\n '🥁',\n '🎧',\n '🎤',\n]\n\n/**\n * Get a consistent emoji based on wallet address\n */\nexport function getAddressEmoji(address: string): string {\n let hash = 0\n for (let i = 0; i < address.length; i++) {\n hash = (hash << 5) - hash + address.charCodeAt(i)\n hash = hash & hash\n }\n const index = Math.abs(hash) % WALLET_EMOJIS.length\n return WALLET_EMOJIS[index]\n}\n\nconst styles = {\n // Container for network picker + button\n container: 'flex items-center gap-3',\n // Disconnected state - primary CTA\n disconnectedButton: [\n 'group relative overflow-hidden',\n 'bg-[var(--aw-accent)] hover:bg-[var(--aw-accent-hover)]',\n 'transition-all duration-300',\n ].join(' '),\n walletIcon: 'transition-transform duration-300 group-hover:scale-110',\n // Connecting state\n connectingButton: [\n 'relative',\n bg.surfaceSecondary,\n 'border-[var(--aw-accent)]/50',\n 'animate-shimmer',\n ].join(' '),\n connectingContent: 'flex items-center gap-2',\n // Connected state\n connectedButton: [\n 'group flex items-center gap-2',\n 'pl-2.5 pr-2 py-1.5 rounded-lg',\n 'bg-surface-secondary hover:bg-surface-tertiary',\n 'border border-[var(--aw-border-default)] hover:border-accent/50',\n 'transition-all duration-200',\n 'cursor-pointer',\n ].join(' '),\n emoji: 'text-base',\n chevron: ['transition-transform duration-200'].join(' '),\n} as const\n\nexport interface ConnectButtonProps {\n /** Label for disconnected state (default: \"Connect Wallet\") */\n label?: string\n /**\n * Icon for disconnected state button\n * - undefined: shows default Wallet icon\n * - ReactNode: shows custom icon\n * - false/null: no icon\n */\n icon?: React.ReactNode | false | null\n /** Hide the network picker (useful for mobile where it's shown separately) */\n hideNetworkPicker?: boolean\n /** Additional class names */\n className?: string\n}\n\n/**\n * Connect wallet button\n *\n * A \"smart\" button that automatically:\n * - Reads wallet state from the store\n * - Opens connect modal when disconnected\n * - Opens account modal when connected\n * - Shows NetworkPicker when enabled in config (regardless of connection state)\n *\n * Shows different states:\n * - Disconnected: NetworkPicker + Primary CTA button with wallet icon\n * - Connecting: Shimmer loading state\n * - Connected: NetworkPicker + Avatar with truncated address\n */\nexport const ConnectButton: React.FC<ConnectButtonProps> = ({\n label = 'Connect Wallet',\n icon,\n hideNetworkPicker: hideNetworkPickerProp = false,\n className,\n}) => {\n const { config } = useAztecWalletContext()\n\n const walletState = useWalletStore(\n useShallow((state) => ({\n account: state.account,\n status: state.status,\n })),\n )\n\n const { openConnectModal, openAccountModal } = useModalStore(\n useShallow((state) => ({\n openConnectModal: state.openConnectModal,\n openAccountModal: state.openAccountModal,\n })),\n )\n\n const isConnected = walletState.status === 'connected'\n const isConnecting =\n walletState.status === 'connecting' || walletState.status === 'deploying'\n const address = walletState.account?.getAddress().toString() ?? null\n\n const networkPickerVariant = config.showNetworkPicker as\n | NetworkPickerVariant\n | undefined\n const showNetworkPicker = !!networkPickerVariant && !hideNetworkPickerProp\n\n const handleClick = useCallback(() => {\n if (isConnected) {\n openAccountModal()\n } else {\n openConnectModal()\n }\n }, [isConnected, openAccountModal, openConnectModal])\n\n // Connecting state\n if (isConnecting) {\n return (\n <Button\n variant=\"secondary\"\n disabled\n className={cn(styles.connectingButton, className)}\n >\n <div className={styles.connectingContent}>\n <Spinner size=\"sm\" />\n <span>Connecting...</span>\n </div>\n </Button>\n )\n }\n\n // Connected state\n if (isConnected && address) {\n return (\n <div className={styles.container} data-testid=\"connected-account\">\n {showNetworkPicker && <NetworkPicker variant={networkPickerVariant} />}\n <button\n type=\"button\"\n onClick={handleClick}\n className={cn(\n styles.connectedButton,\n bg.surfaceSecondary,\n border.default,\n 'hover:bg-[var(--aw-surface-tertiary)] hover:border-[var(--aw-accent)]/50',\n className,\n )}\n data-testid=\"account-address\"\n >\n <span className={styles.emoji}>{getAddressEmoji(address)}</span>\n <span className={cn('font-mono text-sm', text.default)}>\n {truncateAddress(address)}\n </span>\n <ChevronDown\n size={iconSize()}\n className={cn(\n styles.chevron,\n text.muted,\n 'group-hover:text-[var(--aw-text-default)]',\n )}\n />\n </button>\n </div>\n )\n }\n\n // Resolve icon\n const resolvedIcon =\n icon === undefined ? (\n <Wallet size={iconSize()} className={styles.walletIcon} />\n ) : (\n icon || undefined\n )\n\n // Disconnected state\n return (\n <div className={styles.container}>\n {showNetworkPicker && <NetworkPicker variant={networkPickerVariant} />}\n <Button\n variant=\"primary\"\n onClick={handleClick}\n className={cn(styles.disconnectedButton, className)}\n icon={resolvedIcon}\n data-testid=\"connect-wallet-button\"\n >\n {label}\n </Button>\n </div>\n )\n}\n","import React from 'react';\nimport { cn } from '../../../utils';\n\nconst styles = {\n spinner:\n 'animate-spin rounded-full border-2 border-current border-t-transparent text-accent',\n sizes: {\n sm: 'h-4 w-4',\n md: 'h-6 w-6',\n lg: 'h-8 w-8',\n xl: 'h-12 w-12',\n },\n} as const;\n\nexport interface SpinnerProps {\n /** Size of the spinner */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Additional class names */\n className?: string;\n}\n\n/**\n * Loading spinner component\n */\nexport const Spinner: React.FC<SpinnerProps> = ({ size = 'md', className }) => {\n return (\n <div\n className={cn(styles.spinner, styles.sizes[size], className)}\n role=\"status\"\n aria-label=\"Loading\"\n >\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n};\n","import React from 'react'\nimport { Copy, Check } from 'lucide-react'\nimport { useCopyToClipboard } from '../../../hooks'\nimport { cn, iconSize, truncateAddress } from '../../../utils'\nimport { bg, text, border } from '../../theme/classes'\n\nconst styles = {\n container: 'flex items-center gap-2',\n address:\n 'font-mono text-sm bg-surface-secondary px-3 py-2 rounded-lg border border-[var(--aw-border-default)]',\n addressText: 'text-default',\n copyButton:\n 'p-1 rounded hover:bg-surface-tertiary transition-colors text-muted hover:text-default',\n copySuccess: 'text-green-500',\n} as const\n\nexport interface AddressDisplayProps {\n /** The address to display */\n address: string\n /** Number of characters to show at start (default: 6) */\n startChars?: number\n /** Number of characters to show at end (default: 4) */\n endChars?: number\n /** Whether to show copy button (default: true) */\n showCopy?: boolean\n /** Additional class names */\n className?: string\n}\n\n/**\n * Address display component with copy functionality\n *\n * Displays a truncated Aztec address with an optional copy-to-clipboard button.\n * The address is truncated to show the first and last few characters with\n * ellipsis in between.\n *\n * @param props - Component props\n * @param props.address - The full address to display\n * @param props.startChars - Number of characters to show at start (default: 6)\n * @param props.endChars - Number of characters to show at end (default: 4)\n * @param props.showCopy - Whether to show the copy button (default: true)\n * @param props.className - Additional CSS classes\n *\n * @example Basic usage\n * ```tsx\n * <AddressDisplay address=\"0x1234567890abcdef1234567890abcdef12345678\" />\n * ```\n *\n * @example Custom truncation\n * ```tsx\n * <AddressDisplay\n * address={account.getAddress().toString()}\n * startChars={8}\n * endChars={6}\n * />\n * ```\n *\n * @example Without copy button\n * ```tsx\n * <AddressDisplay address={address} showCopy={false} />\n * ```\n */\nexport const AddressDisplay: React.FC<AddressDisplayProps> = ({\n address,\n startChars = 6,\n endChars = 4,\n showCopy = true,\n className,\n}) => {\n const { copied, copy } = useCopyToClipboard()\n\n const truncated = truncateAddress(address, startChars, endChars)\n\n return (\n <div className={cn(styles.container, className)}>\n <div\n className={cn(\n 'font-mono text-sm px-3 py-2 rounded-lg border',\n bg.surfaceSecondary,\n border.default,\n )}\n >\n <span className={text.default}>{truncated}</span>\n </div>\n {showCopy && (\n <button\n onClick={() => copy(address)}\n className={cn(\n 'p-1 rounded transition-colors cursor-pointer',\n 'hover:bg-[var(--aw-surface-tertiary)]',\n text.muted,\n 'hover:text-[var(--aw-text-default)]',\n copied && styles.copySuccess,\n )}\n aria-label={copied ? 'Copied!' : 'Copy address'}\n >\n {copied ? <Check size={iconSize()} /> : <Copy size={iconSize()} />}\n </button>\n )}\n </div>\n )\n}\n","import React from 'react';\nimport { iconSize, type IconSize } from '../../../utils';\nimport type { IconType } from '../../types';\n\nexport interface IconRendererProps {\n /** Icon - emoji string, URL, or React component */\n icon?: IconType;\n /** Size for component icons (default: 'sm') */\n size?: IconSize;\n /** CSS classes */\n className?: string;\n /** Alt text for image icons */\n alt?: string;\n}\n\n/**\n * Universal icon renderer component\n *\n * Handles rendering of different icon types:\n * - String (emoji like \"🌐\")\n * - URL (http://, /, data:)\n * - React component (Lucide icons, custom SVG components)\n *\n * @example\n * ```tsx\n * // With emoji\n * <IconRenderer icon=\"🌐\" className={styles.icon} />\n *\n * // With URL\n * <IconRenderer icon=\"/icons/wallet.png\" alt=\"Wallet\" className={styles.icon} />\n *\n * // With Lucide component\n * <IconRenderer icon={Globe} size=\"md\" className={styles.icon} />\n * ```\n */\nexport const IconRenderer: React.FC<IconRendererProps> = ({\n icon,\n size = 'sm',\n className,\n alt = '',\n}) => {\n if (!icon) return null;\n\n // String: URL or emoji/text\n if (typeof icon === 'string') {\n // URL (image)\n if (\n icon.startsWith('http') ||\n icon.startsWith('/') ||\n icon.startsWith('data:')\n ) {\n return <img src={icon} alt={alt} className={className} />;\n }\n // Emoji or text\n return <span className={className}>{icon}</span>;\n }\n\n // React component (Lucide, custom SVG, memo wrapped, etc.)\n const IconComponent = icon;\n return <IconComponent size={iconSize(size)} className={className} />;\n};\n","import React from 'react';\nimport { cn } from '../../../utils';\nimport { IconRenderer } from './IconRenderer';\nimport { Spinner } from './Spinner';\nimport { componentStyles } from '../../theme/classes';\nimport type { IconType } from '../../types';\n\nconst styles = {\n button: [\n 'group w-full flex items-center gap-3',\n 'px-4 py-3 rounded-xl',\n 'border border-transparent',\n 'transition-all duration-200',\n 'cursor-pointer',\n ].join(' '),\n buttonEnabled: 'hover:border-[var(--aw-accent)]/30',\n buttonDisabled: 'cursor-not-allowed opacity-50',\n buttonActive: componentStyles.walletButton.active,\n iconContainer: [\n 'flex items-center justify-center',\n 'w-10 h-10 rounded-xl',\n 'transition-all duration-200',\n 'overflow-hidden',\n ].join(' '),\n iconContainerEnabled: componentStyles.walletButton.iconContainerHover,\n iconContainerActive: 'bg-[var(--aw-accent)]/10',\n iconContainerDisabled: 'grayscale',\n iconImage: 'w-6 h-6 rounded-lg object-contain',\n content: 'flex-1 flex flex-col items-start gap-0.5',\n status: 'flex items-center gap-2',\n statusDot: 'w-2 h-2 rounded-full',\n statusDotInstalled: 'bg-[var(--aw-success)] shadow-[0_0_6px_rgba(34,197,94,0.5)]',\n statusDotNotInstalled: 'bg-[var(--aw-warning)]',\n spinnerContainer: 'w-5 h-5',\n} as const;\n\nexport interface WalletButtonProps {\n /** Wallet name */\n name: string;\n /** Wallet icon - emoji, URL, or React component */\n icon?: IconType;\n /** Whether wallet is installed/available */\n isInstalled?: boolean;\n /** Whether this wallet is currently connecting */\n isConnecting?: boolean;\n /** Whether button is disabled */\n disabled?: boolean;\n /** Click handler */\n onClick?: () => void;\n /** Additional class names */\n className?: string;\n /** Test ID for e2e testing */\n 'data-testid'?: string;\n}\n\n/**\n * Button for selecting a wallet\n */\nexport const WalletButton: React.FC<WalletButtonProps> = ({\n name,\n icon,\n isInstalled,\n isConnecting,\n disabled,\n onClick,\n className,\n 'data-testid': testId,\n}) => {\n // Disable button if wallet is explicitly not installed\n const isNotInstalled = isInstalled === false;\n const isDisabled = disabled || isConnecting || isNotInstalled;\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={isDisabled}\n className={cn(\n styles.button,\n componentStyles.walletButton.base,\n isConnecting && styles.buttonActive,\n isNotInstalled ? styles.buttonDisabled : styles.buttonEnabled,\n className\n )}\n data-testid={testId}\n >\n <div\n className={cn(\n styles.iconContainer,\n componentStyles.walletButton.iconContainer,\n isConnecting && styles.iconContainerActive,\n isNotInstalled\n ? styles.iconContainerDisabled\n : styles.iconContainerEnabled\n )}\n >\n <IconRenderer icon={icon} className={styles.iconImage} alt={name} />\n </div>\n\n <div className={styles.content}>\n <span\n className={cn(\n componentStyles.walletButton.name,\n isNotInstalled && componentStyles.walletButton.nameDisabled\n )}\n >\n {name}\n </span>\n {isNotInstalled && (\n <span className={componentStyles.walletButton.notInstalled}>Not installed</span>\n )}\n </div>\n\n <div className={styles.status}>\n {isConnecting && (\n <div className={styles.spinnerContainer}>\n <Spinner size=\"sm\" />\n </div>\n )}\n {!isConnecting && isInstalled !== undefined && (\n <span\n className={cn(\n styles.statusDot,\n isInstalled\n ? styles.statusDotInstalled\n : styles.statusDotNotInstalled\n )}\n />\n )}\n </div>\n </button>\n );\n};\n","import React from 'react';\nimport { ChevronRight, Wallet, Key, CreditCard } from 'lucide-react';\nimport { Badge } from '../../../components/ui';\nimport { cn, iconSize } from '../../../utils';\nimport { componentStyles } from '../../theme/classes';\n\nconst styles = {\n button: [\n 'group w-full flex items-center gap-4',\n 'px-4 py-4 rounded-xl',\n 'border border-transparent',\n 'transition-all duration-200',\n 'cursor-pointer',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n ].join(' '),\n content: 'flex-1 flex flex-col items-start gap-0.5',\n rightSection: 'flex items-center gap-2',\n arrow: [\n 'transition-all duration-200',\n 'group-hover:translate-x-0.5',\n ].join(' '),\n} as const;\n\n/**\n * Get icon based on label hint\n */\nfunction getGroupIcon(label: string): React.ReactNode {\n const lowerLabel = label.toLowerCase();\n if (\n lowerLabel.includes('embedded') ||\n lowerLabel.includes('create') ||\n lowerLabel.includes('new')\n ) {\n return <Key size={iconSize('md')} />;\n }\n if (lowerLabel.includes('evm') || lowerLabel.includes('metamask')) {\n return <CreditCard size={iconSize('md')} />;\n }\n return <Wallet size={iconSize('md')} />;\n}\n\n/**\n * Get description based on label hint\n */\nfunction getGroupDescription(label: string): string {\n const lowerLabel = label.toLowerCase();\n if (\n lowerLabel.includes('embedded') ||\n lowerLabel.includes('create') ||\n lowerLabel.includes('new')\n ) {\n return 'Quick setup, no extension needed';\n }\n if (lowerLabel.includes('evm')) {\n return 'MetaMask, Rabby, and more';\n }\n if (lowerLabel.includes('aztec')) {\n return 'Azguard and other Aztec wallets';\n }\n return 'Select a wallet to continue';\n}\n\nexport interface WalletGroupButtonProps {\n /** Button label */\n label: string;\n /** Optional tag to show next to label (e.g. \"Beta\") */\n tag?: string;\n /** Whether to show arrow (for navigation) */\n showArrow?: boolean;\n /** Whether button is disabled */\n disabled?: boolean;\n /** Click handler */\n onClick?: () => void;\n /** Additional class names */\n className?: string;\n /** Test ID for e2e testing */\n 'data-testid'?: string;\n}\n\n/**\n * Button for wallet group selection in main view\n */\nexport const WalletGroupButton: React.FC<WalletGroupButtonProps> = ({\n label,\n tag,\n showArrow = true,\n disabled,\n onClick,\n className,\n 'data-testid': testId,\n}) => {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className={cn(\n styles.button,\n componentStyles.walletGroupButton.base,\n className\n )}\n data-testid={testId}\n >\n <div className={cn(\n 'flex items-center justify-center w-10 h-10 rounded-xl',\n componentStyles.walletGroupButton.iconContainer\n )}>\n {getGroupIcon(label)}\n </div>\n <div className={styles.content}>\n <span className={componentStyles.walletGroupButton.label}>{label}</span>\n <span className={componentStyles.walletGroupButton.description}>{getGroupDescription(label)}</span>\n </div>\n <div className={styles.rightSection}>\n {tag && <Badge variant=\"primary\">{tag}</Badge>}\n {showArrow && (\n <ChevronRight \n size={iconSize('md')} \n className={cn(styles.arrow, componentStyles.walletGroupButton.arrow)} \n />\n )}\n </div>\n </button>\n );\n};\n","import React from 'react';\nimport { ArrowLeft } from 'lucide-react';\nimport { cn, iconSize } from '../../../utils';\nimport { text } from '../../theme/classes';\n\nconst styles = {\n button: [\n 'flex items-center gap-2',\n 'transition-colors',\n 'cursor-pointer',\n 'text-sm',\n ].join(' '),\n} as const;\n\nexport interface BackButtonProps {\n /** Click handler */\n onClick?: () => void;\n /** Button label (default: \"back\") */\n label?: string;\n /** Additional class names */\n className?: string;\n}\n\n/**\n * Back navigation button\n */\nexport const BackButton: React.FC<BackButtonProps> = ({\n onClick,\n label = 'back',\n className,\n}) => {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n styles.button,\n text.muted,\n 'hover:text-[var(--aw-text-default)]',\n className\n )}\n >\n <ArrowLeft size={iconSize()} />\n <span>{label}</span>\n </button>\n );\n};\n","import React from 'react';\nimport { IconRenderer } from './IconRenderer';\nimport type { IconSize } from '../../../utils';\nimport type { IconType } from '../../types';\n\nexport interface NetworkIconProps {\n /** The icon - either an emoji string or a Lucide-style component */\n icon: IconType;\n /** Size variant for component icons (default: 'sm') */\n size?: IconSize;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Network icon component that handles both emoji strings and Lucide components\n *\n * This is a convenience wrapper around IconRenderer for network-specific icons.\n *\n * @example\n * ```tsx\n * // With emoji\n * <NetworkIcon icon=\"🌐\" className={styles.icon} />\n *\n * // With Lucide component\n * <NetworkIcon icon={Globe} size=\"md\" className={styles.icon} />\n * ```\n */\nexport const NetworkIcon: React.FC<NetworkIconProps> = ({\n icon,\n size = 'sm',\n className,\n}) => {\n return <IconRenderer icon={icon} size={size} className={className} />;\n};\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport type {\n ResolvedAztecWalletConfig,\n ModalView,\n ModalWalletType,\n} from '../../types';\n\ninterface ConnectingState {\n walletId: string;\n walletName: string;\n walletType: ModalWalletType;\n}\n\ninterface SuccessState {\n address: string;\n}\n\ninterface ConnectModalContextValue {\n // Config\n config: ResolvedAztecWalletConfig;\n\n // View navigation\n view: ModalView;\n setView: (view: ModalView) => void;\n goBack: () => void;\n\n // Connecting state\n connectingState: ConnectingState | null;\n setConnectingState: (state: ConnectingState | null) => void;\n\n // Success state\n successState: SuccessState | null;\n setSuccessState: (state: SuccessState | null) => void;\n\n // Error state\n error: string | null;\n setError: (error: string | null) => void;\n\n // Loading state (prevents duplicate calls)\n isLoading: boolean;\n\n // Actions\n onClose: () => void;\n onConnect: (walletId: string, walletType: ModalWalletType) => Promise<void>;\n reset: () => void;\n}\n\nconst ConnectModalContext = createContext<ConnectModalContextValue | null>(\n null\n);\n\nexport interface ConnectModalProviderProps {\n config: ResolvedAztecWalletConfig;\n onClose: () => void;\n onConnect: (walletId: string, walletType: ModalWalletType) => Promise<void>;\n children: React.ReactNode;\n}\n\nexport const ConnectModalProvider: React.FC<ConnectModalProviderProps> = ({\n config,\n onClose,\n onConnect,\n children,\n}) => {\n const [view, setView] = useState<ModalView>('main');\n const [connectingState, setConnectingState] =\n useState<ConnectingState | null>(null);\n const [successState, setSuccessState] = useState<SuccessState | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const connectingRef = useRef(false);\n\n const reset = useCallback(() => {\n setView('main');\n setConnectingState(null);\n setSuccessState(null);\n setError(null);\n setIsLoading(false);\n connectingRef.current = false;\n }, []);\n\n const goBack = useCallback(() => {\n setView('main');\n setError(null);\n setConnectingState(null);\n setIsLoading(false);\n connectingRef.current = false;\n }, []);\n\n const handleConnect = useCallback(\n async (walletId: string, walletType: ModalWalletType) => {\n // Prevent duplicate connection attempts\n if (connectingRef.current || isLoading) {\n console.warn('Modal: Connection already in progress');\n return;\n }\n\n connectingRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n await onConnect(walletId, walletType);\n // Connection successful - the parent will close the modal\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'Connection failed';\n console.error('Modal: Connection error:', errorMessage);\n setError(errorMessage);\n setView('main');\n setConnectingState(null);\n } finally {\n setIsLoading(false);\n connectingRef.current = false;\n }\n },\n [onConnect, isLoading]\n );\n\n const handleClose = useCallback(() => {\n reset();\n onClose();\n }, [reset, onClose]);\n\n const value = useMemo(\n () => ({\n config,\n view,\n setView,\n goBack,\n connectingState,\n setConnectingState,\n successState,\n setSuccessState,\n error,\n setError,\n isLoading,\n onClose: handleClose,\n onConnect: handleConnect,\n reset,\n }),\n [\n config,\n view,\n goBack,\n connectingState,\n successState,\n error,\n isLoading,\n handleClose,\n handleConnect,\n reset,\n ]\n );\n\n return (\n <ConnectModalContext.Provider value={value}>\n {children}\n </ConnectModalContext.Provider>\n );\n};\n\nexport const useConnectModalContext = (): ConnectModalContextValue => {\n const context = useContext(ConnectModalContext);\n if (!context) {\n throw new Error(\n 'useConnectModalContext must be used within ConnectModalProvider'\n );\n }\n return context;\n};\n","import React, { useCallback } from 'react';\nimport { cn } from '../../../../utils';\nimport { WalletGroupButton } from '../../shared';\nimport { useConnectModalContext } from '../context';\nimport { text } from '../../../theme/classes';\n\nconst styles = {\n container: 'flex flex-col gap-3 stagger-children',\n error:\n 'text-sm px-4 py-3 rounded-xl border',\n} as const;\n\n/**\n * Main view showing wallet group options\n */\nexport const MainView: React.FC = () => {\n const { config, setView, setConnectingState, onConnect, error, isLoading } =\n useConnectModalContext();\n\n const { walletGroups } = config;\n\n const handleEmbeddedClick = useCallback(async () => {\n if (isLoading) return;\n\n setConnectingState({\n walletId: 'embedded',\n walletName: 'Embedded Wallet',\n walletType: 'embedded',\n });\n setView('connecting');\n await onConnect('embedded', 'embedded');\n }, [setConnectingState, setView, onConnect, isLoading]);\n\n const handleAztecWalletsClick = useCallback(() => {\n if (isLoading) return;\n setView('aztec-wallets');\n }, [setView, isLoading]);\n\n const handleEvmWalletsClick = useCallback(() => {\n if (isLoading) return;\n setView('evm-wallets');\n }, [setView, isLoading]);\n\n return (\n <div className={styles.container}>\n {error && (\n <div className={cn(\n styles.error,\n 'text-[var(--aw-error)] bg-[var(--aw-error)]/10 border-[var(--aw-error)]/20'\n )}>\n {error}\n </div>\n )}\n\n {walletGroups.embedded && (\n <WalletGroupButton\n label={walletGroups.embedded.label || 'Embedded Wallet'}\n tag=\"Beta\"\n showArrow={false}\n onClick={handleEmbeddedClick}\n disabled={isLoading}\n data-testid=\"wallet-group-embedded\"\n />\n )}\n\n {walletGroups.aztecWallets && (\n <WalletGroupButton\n label={walletGroups.aztecWallets.label || 'Aztec Wallet'}\n onClick={handleAztecWalletsClick}\n disabled={isLoading}\n data-testid=\"wallet-group-aztec\"\n />\n )}\n\n {walletGroups.evmWallets && (\n <WalletGroupButton\n label={walletGroups.evmWallets.label || 'EVM Wallet'}\n onClick={handleEvmWalletsClick}\n disabled={isLoading}\n data-testid=\"wallet-group-evm\"\n />\n )}\n </div>\n );\n};\n","import React, { useCallback, useMemo } from 'react';\nimport { cn } from '../../../../utils';\nimport { useAztecWalletsAvailability } from '../../../hooks/useWalletAvailability';\nimport { BackButton, WalletButton } from '../../shared';\nimport { useConnectModalContext } from '../context';\nimport { text } from '../../../theme/classes';\n\nconst styles = {\n container: 'flex flex-col',\n backButton: 'mb-3',\n walletList: 'flex flex-col gap-2 stagger-children',\n} as const;\n\n/**\n * View showing available Aztec browser wallets\n *\n * Uses checkInstalled functions to detect installed wallets.\n * Wallets that aren't installed are shown as disabled with \"Not Installed\" text.\n */\nexport const AztecWalletsView: React.FC = () => {\n const { config, goBack, setView, setConnectingState, onConnect, isLoading } =\n useConnectModalContext();\n\n const aztecWallets = config.walletGroups.aztecWallets;\n\n // Get wallet availability from checkInstalled functions\n const walletsForAvailability = useMemo(\n () => (aztecWallets ? aztecWallets.wallets : []),\n [aztecWallets]\n );\n const walletAvailability = useAztecWalletsAvailability(\n walletsForAvailability\n );\n\n const handleWalletClick = useCallback(\n async (walletId: string, walletName: string) => {\n if (isLoading) return;\n\n // Don't allow clicking if wallet is not installed\n if (walletAvailability[walletId] === false) {\n return;\n }\n\n setConnectingState({\n walletId,\n walletName,\n walletType: 'aztec',\n });\n setView('connecting');\n await onConnect(walletId, 'aztec');\n },\n [setConnectingState, setView, onConnect, isLoading, walletAvailability]\n );\n\n if (!aztecWallets) {\n return null;\n }\n\n return (\n <div className={styles.container}>\n <BackButton onClick={goBack} className={styles.backButton} />\n\n <p className={cn('text-sm mb-4', text.muted)}>\n Connect with a native Aztec wallet for the best experience. These\n wallets are built specifically for the Aztec network.\n </p>\n\n <div className={styles.walletList}>\n {aztecWallets.wallets.map((wallet) => {\n const isInstalled = walletAvailability[wallet.id];\n\n return (\n <WalletButton\n key={wallet.id}\n name={wallet.name}\n icon={wallet.icon}\n isInstalled={isInstalled}\n onClick={() => handleWalletClick(wallet.id, wallet.name)}\n disabled={isLoading}\n />\n );\n })}\n </div>\n </div>\n );\n};\n","import { useMemo, useState, useEffect } from 'react';\nimport { useEVMStore } from '../store/evm';\n\n/**\n * Check if walletless (E2E test provider) is injected\n * Walletless simulates MetaMask for E2E testing\n */\nfunction isWalletlessInjected(): boolean {\n if (typeof window === 'undefined') return false;\n const ethereum = (\n window as Window & { ethereum?: { isWalletless?: boolean } }\n ).ethereum;\n return !!ethereum?.isWalletless;\n}\n\n/**\n * Hook to check if a specific EVM wallet is installed.\n *\n * Uses EIP-6963 discovery to determine wallet availability.\n * This is useful for showing/hiding wallet options or displaying\n * \"Install\" links for wallets that aren't detected.\n *\n * @param rdns - The RDNS identifier of the wallet (e.g., 'io.metamask', 'io.rabby')\n * @returns Whether the wallet is installed\n *\n * @example Check if MetaMask is installed\n * ```tsx\n * const isMetaMaskInstalled = useIsEvmWalletInstalled('io.metamask');\n *\n * if (!isMetaMaskInstalled) {\n * return <a href=\"https://metamask.io\">Install MetaMask</a>;\n * }\n * ```\n *\n * @example Conditional wallet button\n * ```tsx\n * const isRabbyInstalled = useIsEvmWalletInstalled('io.rabby');\n *\n * return (\n * <button disabled={!isRabbyInstalled}>\n * {isRabbyInstalled ? 'Connect Rabby' : 'Rabby Not Installed'}\n * </button>\n * );\n * ```\n */\nexport function useIsEvmWalletInstalled(rdns: string | undefined): boolean {\n const discoveredWallets = useEVMStore((state) => state.discoveredWallets);\n\n // Check for walletless (E2E test provider) - it simulates MetaMask\n const hasWalletless = useMemo(() => isWalletlessInjected(), []);\n\n return useMemo(() => {\n if (!rdns) return false;\n // If walletless is injected and this is MetaMask, consider it installed\n if (hasWalletless && rdns === 'io.metamask') {\n return true;\n }\n return discoveredWallets.some((wallet) => wallet.info.rdns === rdns);\n }, [rdns, discoveredWallets, hasWalletless]);\n}\n\n/**\n * Hook to get all discovered EVM wallets\n *\n * @returns Array of discovered wallet details from EIP-6963\n */\nexport function useDiscoveredWallets() {\n return useEVMStore((state) => state.discoveredWallets);\n}\n\n/**\n * Hook to get availability info for multiple EVM wallets\n *\n * @param wallets - Array of wallet configs with rdns\n * @returns Map of rdns to installation status\n *\n * @example\n * ```tsx\n * const availability = useEvmWalletsAvailability([\n * { id: 'metamask', rdns: 'io.metamask' },\n * { id: 'rabby', rdns: 'io.rabby' },\n * ]);\n * // availability = { 'io.metamask': true, 'io.rabby': false }\n * ```\n */\nexport function useEvmWalletsAvailability(\n wallets: Array<{ rdns?: string }>\n): Record<string, boolean> {\n const discoveredWallets = useEVMStore((state) => state.discoveredWallets);\n\n // Check for walletless (E2E test provider) - it simulates MetaMask\n const hasWalletless = useMemo(() => isWalletlessInjected(), []);\n\n return useMemo(() => {\n const discoveredRdns = new Set(\n discoveredWallets.map((wallet) => wallet.info.rdns)\n );\n\n const availability: Record<string, boolean> = {};\n for (const wallet of wallets) {\n if (wallet.rdns) {\n // If walletless is injected and this is MetaMask, consider it installed\n if (hasWalletless && wallet.rdns === 'io.metamask') {\n availability[wallet.rdns] = true;\n } else {\n availability[wallet.rdns] = discoveredRdns.has(wallet.rdns);\n }\n }\n }\n return availability;\n }, [wallets, discoveredWallets, hasWalletless]);\n}\n\n/**\n * Hook to get availability info for Aztec browser wallets\n *\n * Calls each wallet's `checkInstalled` function asynchronously.\n *\n * @param wallets - Array of wallet configs with optional checkInstalled function\n * @returns Map of wallet id to installation status (undefined while loading)\n *\n * @example\n * ```tsx\n * const availability = useAztecWalletsAvailability([\n * { id: 'azguard', checkInstalled: async () => { ... } },\n * ]);\n * // availability = { 'azguard': true }\n * ```\n */\nexport function useAztecWalletsAvailability(\n wallets: Array<{ id: string; checkInstalled?: () => Promise<boolean> }>\n): Record<string, boolean | undefined> {\n const [availability, setAvailability] = useState<\n Record<string, boolean | undefined>\n >({});\n\n // Create a stable key for the wallets array to avoid unnecessary re-runs\n const walletsKey = useMemo(\n () => wallets.map((w) => w.id).join(','),\n [wallets]\n );\n\n useEffect(() => {\n let cancelled = false;\n\n const checkAll = async () => {\n const results: Record<string, boolean | undefined> = {};\n\n // Initialize all as undefined (loading)\n for (const wallet of wallets) {\n results[wallet.id] = undefined;\n }\n setAvailability({ ...results });\n\n // Check each wallet in parallel\n await Promise.all(\n wallets.map(async (wallet) => {\n if (wallet.checkInstalled) {\n try {\n const isInstalled = await wallet.checkInstalled();\n if (!cancelled) {\n setAvailability((prev) => ({\n ...prev,\n [wallet.id]: isInstalled,\n }));\n }\n } catch (error) {\n console.warn(\n `Failed to check if ${wallet.id} is installed:`,\n error\n );\n if (!cancelled) {\n setAvailability((prev) => ({\n ...prev,\n [wallet.id]: false,\n }));\n }\n }\n } else {\n // No checkInstalled function, assume unknown (don't show status)\n if (!cancelled) {\n setAvailability((prev) => ({\n ...prev,\n [wallet.id]: undefined,\n }));\n }\n }\n })\n );\n };\n\n checkAll();\n\n return () => {\n cancelled = true;\n };\n }, [walletsKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return availability;\n}\n","/**\n * EVM Wallet Store\n *\n * Manages EVM wallet state (address, connection status, discovered wallets).\n * Actions like connect/disconnect stay in the provider as they need service access.\n */\nimport { create } from 'zustand';\nimport type { EIP6963ProviderDetail } from '../../../types/evm';\nimport type { Hex } from 'viem';\n\ntype State = {\n address: Hex | null;\n isConnected: boolean;\n isConnecting: boolean;\n chainId: number | null;\n error: string | null;\n discoveredWallets: EIP6963ProviderDetail[];\n isAvailable: boolean;\n};\n\ntype Actions = {\n setAddress: (address: Hex | null) => void;\n setConnecting: (connecting: boolean) => void;\n setChainId: (chainId: number | null) => void;\n setError: (error: string | null) => void;\n setDiscoveredWallets: (wallets: EIP6963ProviderDetail[]) => void;\n setAvailable: (available: boolean) => void;\n reset: () => void;\n};\n\nexport type EVMStore = State & Actions;\n\nconst INITIAL_STATE: State = {\n address: null,\n isConnected: false,\n isConnecting: false,\n chainId: null,\n error: null,\n discoveredWallets: [],\n isAvailable: false,\n};\n\nexport const useEVMStore = create<EVMStore>((set) => ({\n ...INITIAL_STATE,\n setAddress: (address) => set({ address, isConnected: address !== null }),\n setConnecting: (isConnecting) => set({ isConnecting }),\n setChainId: (chainId) => set({ chainId }),\n setError: (error) => set({ error }),\n setDiscoveredWallets: (discoveredWallets) =>\n set({ discoveredWallets, isAvailable: discoveredWallets.length > 0 }),\n setAvailable: (isAvailable) => set({ isAvailable }),\n reset: () => set(INITIAL_STATE),\n}));\n\nexport const getEVMStore = () => useEVMStore.getState();\n","import React, { useCallback, useMemo } from 'react';\nimport { cn } from '../../../../utils';\nimport { useEvmWalletsAvailability } from '../../../hooks/useWalletAvailability';\nimport { BackButton, WalletButton } from '../../shared';\nimport { useConnectModalContext } from '../context';\nimport { text } from '../../../theme/classes';\n\nconst styles = {\n container: 'flex flex-col',\n backButton: 'mb-3',\n walletList: 'flex flex-col gap-2 stagger-children',\n} as const;\n\n/**\n * View showing available EVM wallets\n *\n * Uses EIP-6963 discovery to detect installed wallets.\n * Wallets that aren't installed are shown as disabled with \"Not Installed\" text.\n */\nexport const EVMWalletsView: React.FC = () => {\n const { config, goBack, setView, setConnectingState, onConnect, isLoading } =\n useConnectModalContext();\n\n const evmWallets = config.walletGroups.evmWallets;\n\n // Get wallet availability from EIP-6963 discovery\n const walletsForAvailability = useMemo(\n () => (evmWallets ? evmWallets.wallets : []),\n [evmWallets]\n );\n const walletAvailability = useEvmWalletsAvailability(walletsForAvailability);\n\n const handleWalletClick = useCallback(\n async (walletId: string, walletName: string, rdns?: string) => {\n if (isLoading) return;\n\n // Don't allow clicking if wallet is not installed\n if (rdns && !walletAvailability[rdns]) {\n return;\n }\n\n setConnectingState({\n walletId,\n walletName,\n walletType: 'evm',\n });\n setView('connecting');\n await onConnect(walletId, 'evm');\n },\n [setConnectingState, setView, onConnect, isLoading, walletAvailability]\n );\n\n if (!evmWallets) {\n return null;\n }\n\n return (\n <div className={styles.container}>\n <BackButton onClick={goBack} className={styles.backButton} />\n\n <p className={cn('text-sm mb-4', text.muted)}>\n Connect using your existing Ethereum wallet. Your EVM account will be\n used to derive an Aztec-compatible address.\n </p>\n\n <div className={styles.walletList}>\n {evmWallets.wallets.map((wallet) => {\n const isInstalled = wallet.rdns\n ? walletAvailability[wallet.rdns]\n : undefined;\n\n return (\n <WalletButton\n key={wallet.id}\n name={wallet.name}\n icon={wallet.icon}\n isInstalled={isInstalled}\n onClick={() =>\n handleWalletClick(wallet.id, wallet.name, wallet.rdns)\n }\n disabled={isLoading}\n data-testid={`wallet-button-${wallet.id}`}\n />\n );\n })}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { Loader2, Info } from 'lucide-react';\nimport { cn, iconSize } from '../../../../utils';\nimport { useConnectModalContext } from '../context';\nimport { text } from '../../../theme/classes';\n\nconst styles = {\n container: 'flex flex-col items-center justify-center py-8 gap-6',\n spinnerContainer: [\n 'relative',\n 'w-24 h-24 rounded-2xl',\n 'flex items-center justify-center',\n ].join(' '),\n spinnerIcon: 'animate-spin',\n textContainer: 'flex flex-col items-center gap-2',\n dots: 'flex gap-1.5',\n dot: ['w-2 h-2 rounded-full', 'animate-pulse'].join(' '),\n infoCard: [\n 'w-full mt-2 p-4 rounded-xl',\n 'flex gap-3',\n ].join(' '),\n infoIcon: 'shrink-0 mt-0.5',\n infoText: 'text-xs leading-relaxed',\n} as const;\n\n/**\n * View showing connection loading state\n */\nexport const ConnectingView: React.FC = () => {\n const { connectingState } = useConnectModalContext();\n\n if (!connectingState) {\n return null;\n }\n\n const { walletName, walletType } = connectingState;\n\n // Show info card for embedded and EVM wallets (account deployment info)\n const showDeploymentInfo = walletType === 'embedded' || walletType === 'evm';\n\n return (\n <div className={styles.container}>\n <div className={cn(\n styles.spinnerContainer,\n 'bg-[var(--aw-accent)]/10'\n )}>\n <Loader2 \n size={iconSize('2xl')} \n className={cn(styles.spinnerIcon, 'text-[var(--aw-accent)]')} \n />\n </div>\n\n <div className={styles.textContainer}>\n <p className={cn('text-lg font-semibold', text.default)}>\n {walletName ? `Connecting to ${walletName}` : 'Connecting...'}\n </p>\n <p className={cn('text-sm text-center max-w-[280px]', text.muted)}>\n Please wait while we connect your wallet. Check for any popups that\n may have appeared on your screen.\n </p>\n </div>\n\n <div className={styles.dots}>\n <span \n className={cn(styles.dot, 'bg-[var(--aw-accent)]/40')} \n style={{ animationDelay: '0ms' }} \n />\n <span \n className={cn(styles.dot, 'bg-[var(--aw-accent)]/40')} \n style={{ animationDelay: '150ms' }} \n />\n <span \n className={cn(styles.dot, 'bg-[var(--aw-accent)]/40')} \n style={{ animationDelay: '300ms' }} \n />\n </div>\n\n {showDeploymentInfo && (\n <div className={cn(\n styles.infoCard,\n 'bg-[var(--aw-accent)]/10 border border-[var(--aw-accent)]/20'\n )}>\n <Info \n size={iconSize()} \n className={cn(styles.infoIcon, 'text-[var(--aw-accent)]')} \n />\n <p className={cn(styles.infoText, text.muted)}>\n If this is your first time connecting, it may take a bit longer as\n we deploy your new account on Aztec. Future connections will be much\n faster.\n </p>\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { Check, ArrowRight } from 'lucide-react';\nimport { cn, iconSize } from '../../../../utils';\nimport { Button } from '../../../../components/ui';\nimport { AddressDisplay } from '../../shared';\nimport { useConnectModalContext } from '../context';\nimport { text, bg } from '../../../theme/classes';\n\nconst styles = {\n container: 'flex flex-col items-center py-8 gap-6',\n iconContainer: [\n 'w-16 h-16 rounded-2xl',\n 'flex items-center justify-center',\n 'animate-scale-bounce',\n ].join(' '),\n checkIcon: 'text-[var(--aw-success)]',\n textContainer: 'flex flex-col items-center gap-1',\n accountSection: 'w-full flex flex-col gap-2',\n continueButton: [\n 'w-full',\n 'bg-[var(--aw-accent)] hover:bg-[var(--aw-accent-hover)]',\n ].join(' '),\n} as const;\n\n/**\n * View showing successful connection\n */\nexport const SuccessView: React.FC = () => {\n const { successState, onClose } = useConnectModalContext();\n\n if (!successState) {\n return null;\n }\n\n const { address } = successState;\n\n return (\n <div className={styles.container}>\n <div className={cn(\n styles.iconContainer,\n 'bg-[var(--aw-success)]/10'\n )}>\n <Check \n size={iconSize('xl')} \n className={styles.checkIcon} \n />\n </div>\n\n <div className={styles.textContainer}>\n <h3 className={cn('text-lg font-semibold', text.default)}>Connected!</h3>\n <p className={cn('text-sm', text.muted)}>Your wallet is now connected</p>\n </div>\n\n <div className={styles.accountSection}>\n <span className={cn('text-xs uppercase tracking-wider font-medium', text.muted)}>\n Your address\n </span>\n <AddressDisplay address={address} showCopy />\n </div>\n\n <Button\n variant=\"primary\"\n className={styles.continueButton}\n onClick={onClose}\n icon={<ArrowRight size={iconSize()} />}\n >\n Continue to App\n </Button>\n </div>\n );\n};\n","import React from 'react'\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n VisuallyHidden,\n} from '../../../components/ui'\nimport { ConnectModalProvider, useConnectModalContext } from './context'\nimport {\n MainView,\n AztecWalletsView,\n EVMWalletsView,\n ConnectingView,\n SuccessView,\n} from './views'\nimport type { ResolvedAztecWalletConfig, ModalWalletType } from '../../types'\n\nconst styles = {\n content: 'sm:max-w-md',\n header: 'mb-4',\n} as const\n\n/**\n * Internal modal content that switches between views\n */\nconst ModalContent: React.FC = () => {\n const { view, config } = useConnectModalContext()\n\n // Render view-specific header\n const renderHeader = () => {\n switch (view) {\n case 'main':\n return (\n <DialogHeader className={styles.header}>\n <DialogTitle>{config.modal?.title || 'Connect Wallet'}</DialogTitle>\n <DialogDescription>\n {config.modal?.subtitle ||\n 'Choose how you want to connect. Each option offers a different balance of convenience and security.'}\n </DialogDescription>\n </DialogHeader>\n )\n case 'aztec-wallets':\n // Visually hidden title for accessibility\n return (\n <VisuallyHidden>\n <DialogTitle>Select Aztec Wallet</DialogTitle>\n </VisuallyHidden>\n )\n case 'evm-wallets':\n // Visually hidden title for accessibility\n return (\n <VisuallyHidden>\n <DialogTitle>Select EVM Wallet</DialogTitle>\n </VisuallyHidden>\n )\n case 'connecting':\n // Visually hidden title for accessibility\n return (\n <VisuallyHidden>\n <DialogTitle>Connecting Wallet</DialogTitle>\n </VisuallyHidden>\n )\n case 'success':\n // Visually hidden title for accessibility\n return (\n <VisuallyHidden>\n <DialogTitle>Connection Successful</DialogTitle>\n </VisuallyHidden>\n )\n default:\n return (\n <VisuallyHidden>\n <DialogTitle>Connect Wallet</DialogTitle>\n </VisuallyHidden>\n )\n }\n }\n\n // Render view content\n const renderView = () => {\n switch (view) {\n case 'main':\n return <MainView />\n case 'aztec-wallets':\n return <AztecWalletsView />\n case 'evm-wallets':\n return <EVMWalletsView />\n case 'connecting':\n return <ConnectingView />\n case 'success':\n return <SuccessView />\n default:\n return <MainView />\n }\n }\n\n return (\n <>\n {renderHeader()}\n {renderView()}\n </>\n )\n}\n\nexport interface ConnectModalProps {\n /** Whether the modal is open */\n open: boolean\n /** Callback when modal should close */\n onOpenChange: (open: boolean) => void\n /** Resolved AztecWallet configuration */\n config: ResolvedAztecWalletConfig\n /** Callback to handle wallet connection */\n onConnect: (walletId: string, walletType: ModalWalletType) => Promise<void>\n}\n\n/**\n * Connect wallet modal component\n *\n * Provides a multi-step flow for connecting different wallet types:\n * - Embedded wallet (app-managed)\n * - Aztec browser wallets (Azguard, etc.)\n * - EVM wallets (MetaMask, Rabby, etc.)\n */\nexport const ConnectModal: React.FC<ConnectModalProps> = ({\n open,\n onOpenChange,\n config,\n onConnect,\n}) => {\n const handleClose = () => {\n onOpenChange(false)\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={styles.content}\n aria-describedby={undefined}\n data-testid=\"connect-wallet-modal\"\n >\n <ConnectModalProvider\n config={config}\n onClose={handleClose}\n onConnect={onConnect}\n >\n <ModalContent />\n </ConnectModalProvider>\n </DialogContent>\n </Dialog>\n )\n}\n","import React, { useCallback, useMemo } from 'react';\nimport { Check } from 'lucide-react';\nimport { Dialog, DialogContent, DialogTitle } from '../../../components/ui';\nimport { cn, iconSize } from '../../../utils';\nimport {\n getNetworkIcon,\n getNetworkDisplayName,\n} from '../../config/networkPresets';\nimport { useNetworkStore } from '../../store/network';\nimport { NetworkIcon } from '../shared';\nimport { bg, border, text } from '../../theme/classes';\nimport type { AztecNetwork } from '../../../config/networks/constants';\nimport type { NetworkPreset } from '../../types';\n\nconst styles = {\n content: 'sm:max-w-sm',\n header: 'mb-2',\n list: 'flex flex-col gap-2 stagger-children',\n networkButton: [\n 'group w-full flex items-center gap-3',\n 'px-4 py-3 rounded-xl',\n 'border border-transparent',\n 'transition-all duration-200',\n 'cursor-pointer',\n ].join(' '),\n iconContainer: [\n 'flex items-center justify-center',\n 'w-10 h-10 rounded-xl',\n ].join(' '),\n networkIcon: 'text-lg',\n spacer: 'flex-1',\n checkIcon: 'text-[var(--aw-success)]',\n} as const;\n\nexport interface NetworkModalProps {\n /** Whether the modal is open */\n open: boolean;\n /** Callback when modal should close */\n onOpenChange: (open: boolean) => void;\n /** Available networks */\n networks: NetworkPreset[];\n /** Optional title */\n title?: string;\n}\n\n/**\n * Network button component for the modal\n */\ninterface NetworkButtonProps {\n network: NetworkPreset;\n isActive: boolean;\n onClick: () => void;\n}\n\nconst NetworkButton: React.FC<NetworkButtonProps> = ({\n network,\n isActive,\n onClick,\n}) => {\n const icon = getNetworkIcon(network.name, network.icon);\n const displayName = getNetworkDisplayName(network.name, network.displayName);\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n styles.networkButton,\n bg.surfaceSecondary,\n 'hover:bg-[var(--aw-surface-tertiary)]',\n 'hover:border-[var(--aw-accent)]/30',\n isActive && 'border-[var(--aw-accent)]/50 bg-[var(--aw-accent)]/5 hover:bg-[var(--aw-accent)]/10'\n )}\n data-testid={`network-option-${network.name}`}\n >\n <div className={cn(\n styles.iconContainer,\n bg.surfaceTertiary\n )}>\n <NetworkIcon \n icon={icon} \n size=\"md\" \n className={cn(styles.networkIcon, 'text-[var(--aw-accent)]')} \n />\n </div>\n <span className={cn('text-sm font-medium', text.default)}>{displayName}</span>\n <span className={styles.spacer} />\n {isActive && <Check size={iconSize()} className={styles.checkIcon} />}\n </button>\n );\n};\n\n/**\n * Network selection modal\n *\n * Shows available networks and allows switching between them.\n */\nexport const NetworkModal: React.FC<NetworkModalProps> = ({\n open,\n onOpenChange,\n networks,\n title = 'Switch Network',\n}) => {\n const currentConfig = useNetworkStore((state) => state.currentConfig);\n const switchToNetwork = useNetworkStore((state) => state.switchToNetwork);\n\n const handleNetworkSelect = useCallback(\n (networkName: AztecNetwork) => {\n switchToNetwork(networkName);\n onOpenChange(false);\n },\n [switchToNetwork, onOpenChange]\n );\n\n const networkList = useMemo(() => {\n return networks.map((network) => ({\n ...network,\n isActive: network.name === currentConfig.name,\n }));\n }, [networks, currentConfig.name]);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={styles.content}\n aria-describedby={undefined}\n data-testid=\"network-modal\"\n >\n <div className={styles.header}>\n <DialogTitle className={cn('text-lg font-semibold', text.default)}>\n {title}\n </DialogTitle>\n </div>\n\n <p className={cn('text-sm mt-2 mb-4', text.muted)}>\n Aztec supports multiple networks for different use cases. Select the\n one that best fits your needs.\n </p>\n\n <div className={styles.list}>\n {networkList.map((network) => (\n <NetworkButton\n key={network.name}\n network={network}\n isActive={network.isActive}\n onClick={() => handleNetworkSelect(network.name)}\n />\n ))}\n </div>\n </DialogContent>\n </Dialog>\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","import { useEffect } from 'react';\nimport { getEIP6963Service, type EIP6963Service } from '../services/evm';\nimport { getEVMStore } from '../store/evm';\n\n/**\n * Hook that initializes EIP-6963 wallet discovery and syncs discovered wallets to Zustand.\n * @param evmServiceAvailable - Fallback availability check (e.g., window.ethereum exists)\n * @returns The EIP6963Service singleton for provider lookups\n */\nexport const useEIP6963Discovery = (\n evmServiceAvailable: boolean\n): EIP6963Service => {\n const eip6963 = getEIP6963Service();\n\n useEffect(() => {\n eip6963.discover();\n\n const unsubscribe = eip6963.subscribe((providers) => {\n getEVMStore().setDiscoveredWallets(providers);\n getEVMStore().setAvailable(providers.length > 0 || evmServiceAvailable);\n });\n\n return unsubscribe;\n }, [evmServiceAvailable, eip6963]);\n\n return eip6963;\n};\n","import React from 'react';\n\n/**\n * Default CSS variables for the Aztec Wallet theme.\n * These provide sensible defaults that work in both light and dark modes.\n * \n * The SDK uses CSS custom properties for theming, allowing users to:\n * 1. Use the default theme (injected automatically)\n * 2. Override specific variables in their own CSS\n * 3. Completely disable the default theme and use their own\n */\nexport const defaultThemeStyles = `\n :root {\n /* Accent/Primary colors */\n --aw-accent: #3b82f6;\n --aw-accent-hover: #2563eb;\n --aw-accent-foreground: #ffffff;\n \n /* Background colors */\n --aw-background: #ffffff;\n --aw-surface-primary: #ffffff;\n --aw-surface-secondary: #f3f4f6;\n --aw-surface-tertiary: #e5e7eb;\n \n /* Text colors */\n --aw-text-default: #111827;\n --aw-text-muted: #6b7280;\n --aw-text-secondary: #4b5563;\n --aw-text-inverse: #ffffff;\n \n /* Border colors */\n --aw-border-default: #e5e7eb;\n --aw-border-subtle: #f3f4f6;\n --aw-border-accent: #3b82f6;\n \n /* Status colors */\n --aw-success: #22c55e;\n --aw-success-bg: rgba(34, 197, 94, 0.1);\n --aw-warning: #f59e0b;\n --aw-warning-bg: rgba(245, 158, 11, 0.1);\n --aw-error: #ef4444;\n --aw-error-bg: rgba(239, 68, 68, 0.1);\n \n /* Overlay */\n --aw-overlay: rgba(0, 0, 0, 0.5);\n \n /* Shadows */\n --aw-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --aw-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --aw-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n \n /* Radius */\n --aw-radius-sm: 0.375rem;\n --aw-radius-md: 0.5rem;\n --aw-radius-lg: 0.75rem;\n --aw-radius-xl: 1rem;\n }\n \n /* Dark mode support - respects user's preference or class */\n @media (prefers-color-scheme: dark) {\n :root {\n --aw-background: #0f0f0f;\n --aw-surface-primary: #1a1a1a;\n --aw-surface-secondary: #262626;\n --aw-surface-tertiary: #333333;\n \n --aw-text-default: #fafafa;\n --aw-text-muted: #a3a3a3;\n --aw-text-secondary: #d4d4d4;\n --aw-text-inverse: #171717;\n \n --aw-border-default: #333333;\n --aw-border-subtle: #262626;\n }\n }\n \n /* Manual dark mode class support */\n .dark {\n --aw-background: #0f0f0f;\n --aw-surface-primary: #1a1a1a;\n --aw-surface-secondary: #262626;\n --aw-surface-tertiary: #333333;\n \n --aw-text-default: #fafafa;\n --aw-text-muted: #a3a3a3;\n --aw-text-secondary: #d4d4d4;\n --aw-text-inverse: #171717;\n \n --aw-border-default: #333333;\n --aw-border-subtle: #262626;\n }\n`;\n\nexport interface ThemeStyleInjectorProps {\n /** Whether to inject the default theme styles. Set to false if you want complete control over styling. */\n enabled?: boolean;\n /** Custom CSS to inject alongside or instead of the default theme */\n customCss?: string;\n}\n\n/**\n * Injects default CSS variables for the Aztec Wallet theme.\n * \n * This component should be mounted once near the root of your app.\n * It injects a style tag with CSS custom properties that the SDK components use.\n * \n * @example\n * ```tsx\n * function App() {\n * return (\n * <>\n * <ThemeStyleInjector />\n * <YourApp />\n * </>\n * );\n * }\n * ```\n * \n * To customize the theme, override the CSS variables in your own stylesheet:\n * ```css\n * :root {\n * --aw-accent: #your-brand-color;\n * --aw-surface-secondary: #your-surface-color;\n * }\n * ```\n */\nexport const ThemeStyleInjector: React.FC<ThemeStyleInjectorProps> = ({\n enabled = true,\n customCss,\n}) => {\n if (!enabled && !customCss) {\n return null;\n }\n\n const css = [enabled ? defaultThemeStyles : '', customCss || '']\n .filter(Boolean)\n .join('\\n');\n\n return <style data-aztec-wallet-theme>{css}</style>;\n};\n"],"mappings":"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","names":["import_addresses","init_azguard","import_react","import_shallow","import_react","import_shallow","import_zustand","PLACEHOLDER_ADDRESS","import_zustand","import_addresses","import_fields","import_log","import_constants","import_SponsoredFPC","import_addresses","import_fields","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_react","import_lucide_react","import_react","React","sizes","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","text","text","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","styles","import_jsx_runtime","import_jsx_runtime","styles","import_lucide_react","import_jsx_runtime","styles","import_lucide_react","import_jsx_runtime","styles","import_jsx_runtime","import_jsx_runtime","styles","import_jsx_runtime","styles","import_react","import_jsx_runtime","import_react","import_jsx_runtime","styles","import_react","import_react","import_zustand","INITIAL_STATE","import_jsx_runtime","styles","import_react","import_jsx_runtime","styles","import_lucide_react","import_jsx_runtime","styles","import_lucide_react","import_jsx_runtime","styles","import_jsx_runtime","styles","import_react","import_lucide_react","import_jsx_runtime","styles","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","AzguardAdapter","AzguardClient","import_react","import_jsx_runtime","import_jsx_runtime"]}