@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.
- package/dist/{azguard-BNPZ5FTM.cjs → azguard-6ES4JOS5.cjs} +2 -1
- package/dist/azguard-6ES4JOS5.cjs.map +1 -0
- package/dist/{azguard-4NXAWPJ7.cjs → azguard-BEN62C56.cjs} +2 -1
- package/dist/azguard-BEN62C56.cjs.map +1 -0
- package/dist/{azguard-ZUTEO5Y2.js → azguard-BSLSWNEY.js} +2 -1
- package/dist/{azguard-ZUTEO5Y2.js.map → azguard-BSLSWNEY.js.map} +1 -1
- package/dist/{azguard-ZTHZ3NX3.js → azguard-NELRWXGF.js} +2 -1
- package/dist/{azguard-ZTHZ3NX3.js.map → azguard-NELRWXGF.js.map} +1 -1
- package/dist/aztec-wallet/adapters/index.cjs +1 -0
- package/dist/aztec-wallet/adapters/index.cjs.map +1 -1
- package/dist/aztec-wallet/adapters/index.js +1 -0
- package/dist/aztec-wallet/adapters/index.js.map +1 -1
- package/dist/aztec-wallet/config/index.cjs +1 -0
- package/dist/aztec-wallet/config/index.cjs.map +1 -1
- package/dist/aztec-wallet/config/index.js +1 -0
- package/dist/aztec-wallet/config/index.js.map +1 -1
- package/dist/aztec-wallet/index.cjs +1 -1
- package/dist/aztec-wallet/index.js +1 -1
- package/dist/aztec-wallet/providers/index.cjs +1 -0
- package/dist/aztec-wallet/providers/index.cjs.map +1 -1
- package/dist/aztec-wallet/providers/index.js +1 -0
- package/dist/aztec-wallet/providers/index.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/azguard-4NXAWPJ7.cjs.map +0 -1
- package/dist/azguard-BNPZ5FTM.cjs.map +0 -1
|
@@ -361,6 +361,7 @@ var AZGUARD_METHODS = [
|
|
|
361
361
|
"simulate_views",
|
|
362
362
|
"simulate_utility",
|
|
363
363
|
"add_private_authwit",
|
|
364
|
+
"add_public_authwit",
|
|
364
365
|
"call"
|
|
365
366
|
];
|
|
366
367
|
var buildDappMetadata = () => ({
|
|
@@ -487,4 +488,4 @@ var createAzguardAdapter = () => new AzguardAdapter();
|
|
|
487
488
|
|
|
488
489
|
|
|
489
490
|
exports.AzguardAdapter = AzguardAdapter; exports.AzguardWalletService = AzguardWalletService; exports.createAzguardAdapter = createAzguardAdapter;
|
|
490
|
-
//# sourceMappingURL=azguard-
|
|
491
|
+
//# sourceMappingURL=azguard-6ES4JOS5.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ravenhouse/ravenhouse/packages/omni-sdk/dist/azguard-6ES4JOS5.cjs","../src/utils/azguard.ts","../src/aztec-wallet/adapters/azguard/AzguardWalletService.ts","../src/aztec-wallet/adapters/azguard/AzguardAdapter.ts"],"names":[],"mappings":"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","file":"/home/runner/work/ravenhouse/ravenhouse/packages/omni-sdk/dist/azguard-6ES4JOS5.cjs","sourcesContent":[null,"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"]}
|
|
@@ -361,6 +361,7 @@ var AZGUARD_METHODS = [
|
|
|
361
361
|
"simulate_views",
|
|
362
362
|
"simulate_utility",
|
|
363
363
|
"add_private_authwit",
|
|
364
|
+
"add_public_authwit",
|
|
364
365
|
"call"
|
|
365
366
|
];
|
|
366
367
|
var buildDappMetadata = () => ({
|
|
@@ -487,4 +488,4 @@ var createAzguardAdapter = () => new AzguardAdapter();
|
|
|
487
488
|
|
|
488
489
|
|
|
489
490
|
exports.AzguardAdapter = AzguardAdapter; exports.AzguardWalletService = AzguardWalletService; exports.createAzguardAdapter = createAzguardAdapter;
|
|
490
|
-
//# sourceMappingURL=azguard-
|
|
491
|
+
//# sourceMappingURL=azguard-BEN62C56.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ravenhouse/ravenhouse/packages/omni-sdk/dist/azguard-BEN62C56.cjs","../src/utils/azguard.ts","../src/aztec-wallet/adapters/azguard/AzguardWalletService.ts","../src/aztec-wallet/adapters/azguard/AzguardAdapter.ts"],"names":[],"mappings":"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","file":"/home/runner/work/ravenhouse/ravenhouse/packages/omni-sdk/dist/azguard-BEN62C56.cjs","sourcesContent":[null,"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"]}
|
|
@@ -361,6 +361,7 @@ var AZGUARD_METHODS = [
|
|
|
361
361
|
"simulate_views",
|
|
362
362
|
"simulate_utility",
|
|
363
363
|
"add_private_authwit",
|
|
364
|
+
"add_public_authwit",
|
|
364
365
|
"call"
|
|
365
366
|
];
|
|
366
367
|
var buildDappMetadata = () => ({
|
|
@@ -487,4 +488,4 @@ export {
|
|
|
487
488
|
AzguardWalletService,
|
|
488
489
|
createAzguardAdapter
|
|
489
490
|
};
|
|
490
|
-
//# sourceMappingURL=azguard-
|
|
491
|
+
//# sourceMappingURL=azguard-BSLSWNEY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/azguard.ts","../src/aztec-wallet/adapters/azguard/AzguardWalletService.ts","../src/aztec-wallet/adapters/azguard/AzguardAdapter.ts"],"sourcesContent":["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"],"mappings":";;;;;;AAAA,SAAS,oBAAoB;AA6BtB,IAAM,uBAAuB,CAAC,gBAAsC;AACzE,QAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,QAAM,YAAY,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM;AACrD,QAAM,aAAa,YAAY,MAAM,CAAC,IAAI;AAG1C,MAAI,WAAW,WAAW,IAAI;AAC5B,WAAO,aAAa,WAAW,UAAU;AAAA,EAC3C;AAGA,MAAI,WAAW,WAAW,IAAI;AAC5B,UAAM,gBAAgB,OAAO,WAAW,MAAM,CAAC,EAAE,SAAS,IAAI,GAAG;AACjE,WAAO,aAAa,WAAW,aAAa;AAAA,EAC9C;AAEA,QAAM,IAAI,MAAM,+BAA+B,WAAW,EAAE;AAC9D;;;AC9CA,SAAS,qBAAqB;AAY9B,IAAM,kBAAkB;AAExB,IAAM,wBAAwB;AAEvB,IAAM,uBAAN,MAA2B;AAAA,EAA3B;AACL,SAAQ,SAA+B;AACvC,SAAQ,QAA4B;AAAA,MAClC,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU,CAAC;AAAA,MACX,iBAAiB;AAAA,MACjB,iBAAiB,CAAC;AAAA,MAClB,OAAO;AAAA,IACT;AACA,SAAQ,iBACN,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,YACN,SACA,WACA,cACY;AACZ,WAAO,QAAQ,KAAK;AAAA,MAClB;AAAA,MACA,IAAI;AAAA,QAAW,CAAC,GAAG,WACjB,WAAW,MAAM,OAAO,IAAI,MAAM,YAAY,CAAC,GAAG,SAAS;AAAA,MAC7D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAA4B;AAChC,QAAI;AAEF,YAAM,cAAc,MAAM,cAAc,mBAAmB,eAAe;AAC1E,WAAK,YAAY,EAAE,YAAY,CAAC;AAEhC,UAAI,aAAa;AAEf,aAAK,SAAS,MAAM,cAAc,OAAO,YAAY,eAAe;AAEpE,aAAK,oBAAoB;AAEzB,cAAM,kBAAkB,KAAK,mBAAmB;AAChD,aAAK,YAAY,EAAE,gBAAgB,CAAC;AAGpC,YAAI,KAAK,OAAO,WAAW;AACzB,gBAAM,WAAW,KAAK,OAAO;AAC7B,gBAAM,kBAAkB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAC5D,eAAK,YAAY,EAAE,QAAQ,aAAa,UAAU,gBAAgB,CAAC;AACnE,kBAAQ,IAAI,oCAAoC,EAAE,SAAS,CAAC;AAAA,QAC9D;AAEA,gBAAQ,IAAI,iDAAiD;AAAA,MAC/D,OAAO;AACL,gBAAQ,KAAK,8CAAoC;AACjD,aAAK,YAAY;AAAA,UACf,OACE;AAAA,QACJ,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,gDAAgD,KAAK;AACnE,WAAK,YAAY;AAAA,QACf,OACE,iBAAiB,QACb,MAAM,UACN;AAAA,MACR,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QACJ,cACA,qBACA,qBACwB;AACxB,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAEA,QAAI;AACF,WAAK,YAAY,EAAE,QAAQ,cAAc,OAAO,KAAK,CAAC;AAEtD,WAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,KAAK;AAAA,QACT,KAAK,OAAO,QAAQ,cAAc,qBAAqB,mBAAmB;AAAA,QAC1E;AAAA,QACA;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,OAAO;AAC7B,YAAM,kBAAkB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAE5D,WAAK,YAAY;AAAA,QACf,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF,CAAC;AAED,cAAQ,IAAI,gCAAgC,EAAE,UAAU,gBAAgB,CAAC;AACzE,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAwC,KAAK;AAE3D,UAAI,iBAAiB,OAAO;AAC1B,gBAAQ,MAAM,kBAAkB;AAAA,UAC9B,SAAS,MAAM;AAAA,UACf,OAAO,MAAM;AAAA,UACb,MAAM,MAAM;AAAA,QACd,CAAC;AAAA,MACH;AAEA,WAAK,YAAY;AAAA,QACf,QAAQ;AAAA,QACR,OACE,iBAAiB,QACb,MAAM,UACN;AAAA,MACR,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBACN,cACA,qBACA,qBACM;AACN,QAAI,CAAC,gBAAgB,OAAO,iBAAiB,UAAU;AACrD,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAEA,QAAI,aAAa,OAAO,OAAO,aAAa,QAAQ,UAAU;AAC5D,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAEA,QAAI,aAAa,QAAQ,OAAO,aAAa,SAAS,UAAU;AAC9D,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAEA,UAAM,sBAAsB,CAC1B,aACA,UACG;AACH,UAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B,cAAM,IAAI,MAAM,GAAG,KAAK,mBAAmB;AAAA,MAC7C;AAEA,UAAI,YAAY,WAAW,GAAG;AAC5B,cAAM,IAAI,MAAM,GAAG,KAAK,wBAAwB;AAAA,MAClD;AAEA,kBAAY,QAAQ,CAAC,YAAY,UAAU;AACzC,YAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AACjD,gBAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,qBAAqB;AAAA,QACxD;AAEA,YAAI,WAAW,WAAW,QAAW;AACnC,cAAI,CAAC,MAAM,QAAQ,WAAW,MAAM,GAAG;AACrC,kBAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,2BAA2B;AAAA,UAC9D;AAEA,qBAAW,OAAO,QAAQ,CAAC,OAAe,eAAuB;AAC/D,gBAAI,OAAO,UAAU,UAAU;AAC7B,oBAAM,IAAI;AAAA,gBACR,GAAG,KAAK,IAAI,KAAK,YAAY,UAAU;AAAA,cACzC;AAAA,YACF;AACA,gBAAI,CAAC,MAAM,WAAW,QAAQ,GAAG;AAC/B,oBAAM,IAAI;AAAA,gBACR,GAAG,KAAK,IAAI,KAAK,YAAY,UAAU;AAAA,cACzC;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI,WAAW,YAAY,QAAW;AACpC,cAAI,CAAC,MAAM,QAAQ,WAAW,OAAO,GAAG;AACtC,kBAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,4BAA4B;AAAA,UAC/D;AAEA,qBAAW,QAAQ,QAAQ,CAAC,QAAgB,gBAAwB;AAClE,gBAAI,OAAO,WAAW,UAAU;AAC9B,oBAAM,IAAI;AAAA,gBACR,GAAG,KAAK,IAAI,KAAK,aAAa,WAAW;AAAA,cAC3C;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAEA,wBAAoB,qBAAqB,qBAAqB;AAE9D,QAAI,uBAAuB,oBAAoB,SAAS,GAAG;AACzD,0BAAoB,qBAAqB,qBAAqB;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,QAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,OAAO,WAAW;AAE7B,WAAK,YAAY;AAAA,QACf,QAAQ;AAAA,QACR,UAAU,CAAC;AAAA,QACX,iBAAiB;AAAA,QACjB,OAAO;AAAA,MACT,CAAC;AAED,cAAQ,IAAI,kCAAkC;AAAA,IAChD,SAAS,OAAO;AACd,cAAQ,MAAM,6CAA6C,KAAK;AAChE,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,YAAqD;AAC3E,QAAI,CAAC,KAAK,UAAU,KAAK,MAAM,WAAW,aAAa;AACrD,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,OAAO,QAAQ,UAAU;AAEpD,YAAM,YAAY,QAAQ,OAAO,CAAC,MAAuB,EAAE,WAAW,IAAI,EAAE;AAC5E,YAAM,SAAS,QAAQ,OAAO,CAAC,MAAuB,EAAE,WAAW,QAAQ,EAAE;AAC7E,YAAM,UAAU,QAAQ,OAAO,CAAC,MAAuB,EAAE,WAAW,SAAS,EAAE;AAE/E,cAAQ;AAAA,QACN,yCAAkC,SAAS,QAAQ,MAAM,YAAY,OAAO;AAAA,MAC9E;AAEA,cAAQ,QAAQ,CAAC,QAAyB,UAAkB;AAC1D,YAAI,OAAO,WAAW,UAAU;AAC9B,gBAAM,WAAW,WAAW,SAAS,OAAO,QAAQ;AACpD,kBAAQ,MAAM,oBAAe,KAAK,YAAY,QAAQ;AAAA,QACxD,WAAW,OAAO,WAAW,WAAW;AACtC,kBAAQ,KAAK,0BAAgB,KAAK,UAAU;AAAA,QAC9C;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAmC,KAAK;AACtD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA4B;AAClC,QAAI,CAAC,KAAK,OAAQ;AAElB,SAAK,yBAAyB,CAAC,aAA4B;AACzD,WAAK,YAAY;AAAA,QACf;AAAA,QACA,iBAAiB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAAA,QACrD,QAAQ,SAAS,SAAS,IAAI,cAAc;AAAA,MAC9C,CAAC;AAAA,IACH;AAEA,SAAK,sBAAsB,MAAM;AAC/B,WAAK,YAAY;AAAA,QACf,QAAQ;AAAA,QACR,UAAU,CAAC;AAAA,QACX,iBAAiB;AAAA,MACnB,CAAC;AACD,WAAK,UAAU,cAAc;AAAA,IAC/B;AAEA,SAAK,OAAO,kBAAkB,WAAW,KAAK,sBAAsB;AACpE,SAAK,OAAO,eAAe,WAAW,KAAK,mBAAmB;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,UAAmD;AACnE,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAA4B;AACzC,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAA+B;AAC7B,WAAO,CAAC,GAAG,gBAAgB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAA+B;AAC7B,WAAO,EAAE,GAAG,KAAK,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,SAA4C;AAC9D,UAAM,gBAAgB,EAAE,GAAG,KAAK,MAAM;AACtC,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,GAAG,QAAQ;AAEzC,QACE,QAAQ,YACR,KAAK,UAAU,cAAc,QAAQ,MACnC,KAAK,UAAU,QAAQ,QAAQ,GACjC;AACA,WAAK,UAAU,mBAAmB,QAAQ,QAAQ;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,iBACN,OACA,UACM;AACN,QAAI,CAAC,KAAK,eAAe,IAAI,KAAK,GAAG;AACnC,WAAK,eAAe,IAAI,OAAO,oBAAI,IAAI,CAAC;AAAA,IAC1C;AACA,SAAK,eAAe,IAAI,KAAK,EAAG,IAAI,QAAQ;AAAA,EAC9C;AAAA,EAEQ,UAAU,UAAkB,MAAuB;AACzD,UAAM,YAAY,KAAK,eAAe,IAAI,KAAK;AAC/C,QAAI,WAAW;AACb,gBAAU,QAAQ,CAAC,aAAa;AAC9B,YAAI;AACF,mBAAS,GAAG,IAAI;AAAA,QAClB,SAAS,OAAO;AACd,kBAAQ,MAAM,YAAY,KAAK,oBAAoB,KAAK;AAAA,QAC1D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,QAAI,KAAK,QAAQ;AACf,UAAI,KAAK,wBAAwB;AAC/B,aAAK,OAAO,kBAAkB,cAAc,KAAK,sBAAsB;AAAA,MACzE;AACA,UAAI,KAAK,qBAAqB;AAC5B,aAAK,OAAO,eAAe,cAAc,KAAK,mBAAmB;AAAA,MACnE;AAAA,IACF;AACA,SAAK,yBAAyB;AAC9B,SAAK,sBAAsB;AAC3B,SAAK,eAAe,MAAM;AAC1B,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,MACX,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU,CAAC;AAAA,MACX,iBAAiB;AAAA,MACjB,iBAAiB,CAAC;AAAA,MAClB,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC5XA,IAAM,gBAAgB,CACpB,SACiC;AAAA,EACjC,GAAG;AAAA,EACH,YAAa,IAAqC,cAAc;AAClE;AAMA,IAAM,8BAA8B,CAAC,cAAyC;AAAA,EAC5E,GAAG;AAAA,EACH,WAAW,SAAS,UAAU,IAAI,aAAa;AAAA,EAC/C,GAAI,SAAS,8BAA8B;AAAA,IACzC,4BACE,SAAS,2BAA2B,IAAI,aAAa;AAAA,EACzD;AACF;AAEA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,oBAAoB,OAAO;AAAA,EAC/B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,KAAK,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAChE;AAEO,IAAM,iBAAN,MAAsD;AAAA,EAM3D,cAAc;AALd,SAAS,KAAK;AACd,SAAS,QAAQ;AAKf,SAAK,UAAU,IAAI,qBAAqB;AAAA,EAC1C;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,KAAK,QAAQ,WAAW;AAAA,EAChC;AAAA,EAEA,UAAgB;AACd,SAAK,QAAQ,QAAQ;AAAA,EACvB;AAAA,EAEA,WAA+B;AAC7B,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AAAA,EAEA,MAAM,QAAQ,aAA8C;AAC1D,UAAM,QAAsB,WAAW,WAAW;AAClD,UAAM,eAAe,kBAAkB;AACvC,UAAM,sBAAsB;AAAA,MAC1B,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,eAAe,EAAE;AAAA,IACnD;AAEA,WAAO,KAAK,QAAQ,QAAQ,cAAc,mBAAmB;AAAA,EAC/D;AAAA,EAEA,MAAM,aAA4B;AAChC,WAAO,KAAK,QAAQ,WAAW;AAAA,EACjC;AAAA,EAEA,MAAM,kBACJ,KACyC;AACzC,UAAM,aAAa,IAAI,IAAI,CAAC,OAAO,KAAK,mBAAmB,EAAE,CAAC;AAC9D,WAAO,KAAK,QAAQ,kBAAkB,UAAU;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,IAAuC;AAChE,YAAQ,GAAG,MAAM;AAAA,MACf,KAAK,kBAAkB;AACrB,cAAM,YAAoC;AAAA,UACxC,MAAM;AAAA,UACN,SAAS,GAAG;AAAA,UACZ,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU;AAAA,YAC7B,MAAM;AAAA,YACN,UAAU,KAAK;AAAA,YACf,QAAQ,KAAK;AAAA,YACb,MAAM,KAAK,KAAK;AAAA,cAAI,CAAC,QACnB,OAAO,QAAQ,WAAW,IAAI,SAAS,IAAI,OAAO,GAAG;AAAA,YACvD;AAAA,UACF,EAAE;AAAA,QACJ;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,oBAAoB;AACvB,cAAM,YAAsC;AAAA,UAC1C,MAAM;AAAA,UACN,SAAS,GAAG;AAAA;AAAA,UAEZ,SAAS,GAAG,MAAM,IAAI,CAAC,SAAc;AACnC,gBACE,KAAK,SAAS,yBACd,KAAK,SAAS,sBACd;AACA,qBAAO;AAAA,gBACL,MAAM,KAAK;AAAA,gBACX,SAAS;AAAA,kBACP,MAAM;AAAA,kBACN,QAAQ,KAAK;AAAA,kBACb,UAAU,KAAK;AAAA,kBACf,QAAQ,KAAK;AAAA,kBACb,MAAM,KAAK,KAAK;AAAA,oBAAI,CAAC,QACnB,OAAO,QAAQ,WAAW,IAAI,SAAS,IAAI,OAAO,GAAG;AAAA,kBACvD;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,QAAQ,KAAK;AAAA,cACb,MAAM,KAAK,KAAK;AAAA,gBAAI,CAAC,QACnB,OAAO,QAAQ,WAAW,IAAI,SAAS,IAAI;AAAA,cAC7C;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,qBAAqB;AACxB,cAAM,YAAuC;AAAA,UAC3C,MAAM;AAAA,UACN,OAAO,GAAG;AAAA,UACV,SAAS,GAAG;AAAA,UACZ,UAAU,GAAG;AAAA;AAAA,UAEb,UAAU;AAAA,YACR,GAAG;AAAA,UACL;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACA,SAAS;AACP,cAAM,OAAQ,GAA8B;AAC5C,cAAM,IAAI,MAAM,8CAA8C,IAAI,EAAE;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,WAAkD;AACtE,UAAM,UAAU,qBAAqB,SAAS;AAC9C,WAAO,EAAE,YAAY,MAAM,QAAQ;AAAA,EACrC;AAAA,EAEA,kBAAkB,IAAwC;AACxD,SAAK,QAAQ,kBAAkB,EAAE;AAAA,EACnC;AAAA,EAEA,eAAe,IAAsB;AACnC,SAAK,QAAQ,eAAe,EAAE;AAAA,EAChC;AACF;AAEO,IAAM,uBAAuB,MAClC,IAAI,eAAe;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/azguard.ts","../src/aztec-wallet/adapters/azguard/AzguardWalletService.ts","../src/aztec-wallet/adapters/azguard/AzguardAdapter.ts"],"sourcesContent":["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"],"mappings":"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","names":[]}
|
|
@@ -361,6 +361,7 @@ var AZGUARD_METHODS = [
|
|
|
361
361
|
"simulate_views",
|
|
362
362
|
"simulate_utility",
|
|
363
363
|
"add_private_authwit",
|
|
364
|
+
"add_public_authwit",
|
|
364
365
|
"call"
|
|
365
366
|
];
|
|
366
367
|
var buildDappMetadata = () => ({
|
|
@@ -487,4 +488,4 @@ export {
|
|
|
487
488
|
AzguardWalletService,
|
|
488
489
|
createAzguardAdapter
|
|
489
490
|
};
|
|
490
|
-
//# sourceMappingURL=azguard-
|
|
491
|
+
//# sourceMappingURL=azguard-NELRWXGF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/azguard.ts","../src/aztec-wallet/adapters/azguard/AzguardWalletService.ts","../src/aztec-wallet/adapters/azguard/AzguardAdapter.ts"],"sourcesContent":["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"],"mappings":";;;;;;AAAA,SAAS,oBAAoB;AA6BtB,IAAM,uBAAuB,CAAC,gBAAsC;AACzE,QAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,QAAM,YAAY,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM;AACrD,QAAM,aAAa,YAAY,MAAM,CAAC,IAAI;AAG1C,MAAI,WAAW,WAAW,IAAI;AAC5B,WAAO,aAAa,WAAW,UAAU;AAAA,EAC3C;AAGA,MAAI,WAAW,WAAW,IAAI;AAC5B,UAAM,gBAAgB,OAAO,WAAW,MAAM,CAAC,EAAE,SAAS,IAAI,GAAG;AACjE,WAAO,aAAa,WAAW,aAAa;AAAA,EAC9C;AAEA,QAAM,IAAI,MAAM,+BAA+B,WAAW,EAAE;AAC9D;;;AC9CA,SAAS,qBAAqB;AAY9B,IAAM,kBAAkB;AAExB,IAAM,wBAAwB;AAEvB,IAAM,uBAAN,MAA2B;AAAA,EAA3B;AACL,SAAQ,SAA+B;AACvC,SAAQ,QAA4B;AAAA,MAClC,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU,CAAC;AAAA,MACX,iBAAiB;AAAA,MACjB,iBAAiB,CAAC;AAAA,MAClB,OAAO;AAAA,IACT;AACA,SAAQ,iBACN,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,YACN,SACA,WACA,cACY;AACZ,WAAO,QAAQ,KAAK;AAAA,MAClB;AAAA,MACA,IAAI;AAAA,QAAW,CAAC,GAAG,WACjB,WAAW,MAAM,OAAO,IAAI,MAAM,YAAY,CAAC,GAAG,SAAS;AAAA,MAC7D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAA4B;AAChC,QAAI;AAEF,YAAM,cAAc,MAAM,cAAc,mBAAmB,eAAe;AAC1E,WAAK,YAAY,EAAE,YAAY,CAAC;AAEhC,UAAI,aAAa;AAEf,aAAK,SAAS,MAAM,cAAc,OAAO,YAAY,eAAe;AAEpE,aAAK,oBAAoB;AAEzB,cAAM,kBAAkB,KAAK,mBAAmB;AAChD,aAAK,YAAY,EAAE,gBAAgB,CAAC;AAGpC,YAAI,KAAK,OAAO,WAAW;AACzB,gBAAM,WAAW,KAAK,OAAO;AAC7B,gBAAM,kBAAkB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAC5D,eAAK,YAAY,EAAE,QAAQ,aAAa,UAAU,gBAAgB,CAAC;AACnE,kBAAQ,IAAI,oCAAoC,EAAE,SAAS,CAAC;AAAA,QAC9D;AAEA,gBAAQ,IAAI,iDAAiD;AAAA,MAC/D,OAAO;AACL,gBAAQ,KAAK,8CAAoC;AACjD,aAAK,YAAY;AAAA,UACf,OACE;AAAA,QACJ,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,gDAAgD,KAAK;AACnE,WAAK,YAAY;AAAA,QACf,OACE,iBAAiB,QACb,MAAM,UACN;AAAA,MACR,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QACJ,cACA,qBACA,qBACwB;AACxB,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAEA,QAAI;AACF,WAAK,YAAY,EAAE,QAAQ,cAAc,OAAO,KAAK,CAAC;AAEtD,WAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,KAAK;AAAA,QACT,KAAK,OAAO,QAAQ,cAAc,qBAAqB,mBAAmB;AAAA,QAC1E;AAAA,QACA;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,OAAO;AAC7B,YAAM,kBAAkB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAE5D,WAAK,YAAY;AAAA,QACf,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF,CAAC;AAED,cAAQ,IAAI,gCAAgC,EAAE,UAAU,gBAAgB,CAAC;AACzE,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAwC,KAAK;AAE3D,UAAI,iBAAiB,OAAO;AAC1B,gBAAQ,MAAM,kBAAkB;AAAA,UAC9B,SAAS,MAAM;AAAA,UACf,OAAO,MAAM;AAAA,UACb,MAAM,MAAM;AAAA,QACd,CAAC;AAAA,MACH;AAEA,WAAK,YAAY;AAAA,QACf,QAAQ;AAAA,QACR,OACE,iBAAiB,QACb,MAAM,UACN;AAAA,MACR,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBACN,cACA,qBACA,qBACM;AACN,QAAI,CAAC,gBAAgB,OAAO,iBAAiB,UAAU;AACrD,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAEA,QAAI,aAAa,OAAO,OAAO,aAAa,QAAQ,UAAU;AAC5D,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAEA,QAAI,aAAa,QAAQ,OAAO,aAAa,SAAS,UAAU;AAC9D,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAEA,UAAM,sBAAsB,CAC1B,aACA,UACG;AACH,UAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B,cAAM,IAAI,MAAM,GAAG,KAAK,mBAAmB;AAAA,MAC7C;AAEA,UAAI,YAAY,WAAW,GAAG;AAC5B,cAAM,IAAI,MAAM,GAAG,KAAK,wBAAwB;AAAA,MAClD;AAEA,kBAAY,QAAQ,CAAC,YAAY,UAAU;AACzC,YAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AACjD,gBAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,qBAAqB;AAAA,QACxD;AAEA,YAAI,WAAW,WAAW,QAAW;AACnC,cAAI,CAAC,MAAM,QAAQ,WAAW,MAAM,GAAG;AACrC,kBAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,2BAA2B;AAAA,UAC9D;AAEA,qBAAW,OAAO,QAAQ,CAAC,OAAe,eAAuB;AAC/D,gBAAI,OAAO,UAAU,UAAU;AAC7B,oBAAM,IAAI;AAAA,gBACR,GAAG,KAAK,IAAI,KAAK,YAAY,UAAU;AAAA,cACzC;AAAA,YACF;AACA,gBAAI,CAAC,MAAM,WAAW,QAAQ,GAAG;AAC/B,oBAAM,IAAI;AAAA,gBACR,GAAG,KAAK,IAAI,KAAK,YAAY,UAAU;AAAA,cACzC;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI,WAAW,YAAY,QAAW;AACpC,cAAI,CAAC,MAAM,QAAQ,WAAW,OAAO,GAAG;AACtC,kBAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,4BAA4B;AAAA,UAC/D;AAEA,qBAAW,QAAQ,QAAQ,CAAC,QAAgB,gBAAwB;AAClE,gBAAI,OAAO,WAAW,UAAU;AAC9B,oBAAM,IAAI;AAAA,gBACR,GAAG,KAAK,IAAI,KAAK,aAAa,WAAW;AAAA,cAC3C;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAEA,wBAAoB,qBAAqB,qBAAqB;AAE9D,QAAI,uBAAuB,oBAAoB,SAAS,GAAG;AACzD,0BAAoB,qBAAqB,qBAAqB;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,QAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,OAAO,WAAW;AAE7B,WAAK,YAAY;AAAA,QACf,QAAQ;AAAA,QACR,UAAU,CAAC;AAAA,QACX,iBAAiB;AAAA,QACjB,OAAO;AAAA,MACT,CAAC;AAED,cAAQ,IAAI,kCAAkC;AAAA,IAChD,SAAS,OAAO;AACd,cAAQ,MAAM,6CAA6C,KAAK;AAChE,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,YAAqD;AAC3E,QAAI,CAAC,KAAK,UAAU,KAAK,MAAM,WAAW,aAAa;AACrD,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,OAAO,QAAQ,UAAU;AAEpD,YAAM,YAAY,QAAQ,OAAO,CAAC,MAAuB,EAAE,WAAW,IAAI,EAAE;AAC5E,YAAM,SAAS,QAAQ,OAAO,CAAC,MAAuB,EAAE,WAAW,QAAQ,EAAE;AAC7E,YAAM,UAAU,QAAQ,OAAO,CAAC,MAAuB,EAAE,WAAW,SAAS,EAAE;AAE/E,cAAQ;AAAA,QACN,yCAAkC,SAAS,QAAQ,MAAM,YAAY,OAAO;AAAA,MAC9E;AAEA,cAAQ,QAAQ,CAAC,QAAyB,UAAkB;AAC1D,YAAI,OAAO,WAAW,UAAU;AAC9B,gBAAM,WAAW,WAAW,SAAS,OAAO,QAAQ;AACpD,kBAAQ,MAAM,oBAAe,KAAK,YAAY,QAAQ;AAAA,QACxD,WAAW,OAAO,WAAW,WAAW;AACtC,kBAAQ,KAAK,0BAAgB,KAAK,UAAU;AAAA,QAC9C;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAmC,KAAK;AACtD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA4B;AAClC,QAAI,CAAC,KAAK,OAAQ;AAElB,SAAK,yBAAyB,CAAC,aAA4B;AACzD,WAAK,YAAY;AAAA,QACf;AAAA,QACA,iBAAiB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAAA,QACrD,QAAQ,SAAS,SAAS,IAAI,cAAc;AAAA,MAC9C,CAAC;AAAA,IACH;AAEA,SAAK,sBAAsB,MAAM;AAC/B,WAAK,YAAY;AAAA,QACf,QAAQ;AAAA,QACR,UAAU,CAAC;AAAA,QACX,iBAAiB;AAAA,MACnB,CAAC;AACD,WAAK,UAAU,cAAc;AAAA,IAC/B;AAEA,SAAK,OAAO,kBAAkB,WAAW,KAAK,sBAAsB;AACpE,SAAK,OAAO,eAAe,WAAW,KAAK,mBAAmB;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,UAAmD;AACnE,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAA4B;AACzC,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAA+B;AAC7B,WAAO,CAAC,GAAG,gBAAgB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAA+B;AAC7B,WAAO,EAAE,GAAG,KAAK,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,SAA4C;AAC9D,UAAM,gBAAgB,EAAE,GAAG,KAAK,MAAM;AACtC,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,GAAG,QAAQ;AAEzC,QACE,QAAQ,YACR,KAAK,UAAU,cAAc,QAAQ,MACnC,KAAK,UAAU,QAAQ,QAAQ,GACjC;AACA,WAAK,UAAU,mBAAmB,QAAQ,QAAQ;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,iBACN,OACA,UACM;AACN,QAAI,CAAC,KAAK,eAAe,IAAI,KAAK,GAAG;AACnC,WAAK,eAAe,IAAI,OAAO,oBAAI,IAAI,CAAC;AAAA,IAC1C;AACA,SAAK,eAAe,IAAI,KAAK,EAAG,IAAI,QAAQ;AAAA,EAC9C;AAAA,EAEQ,UAAU,UAAkB,MAAuB;AACzD,UAAM,YAAY,KAAK,eAAe,IAAI,KAAK;AAC/C,QAAI,WAAW;AACb,gBAAU,QAAQ,CAAC,aAAa;AAC9B,YAAI;AACF,mBAAS,GAAG,IAAI;AAAA,QAClB,SAAS,OAAO;AACd,kBAAQ,MAAM,YAAY,KAAK,oBAAoB,KAAK;AAAA,QAC1D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,QAAI,KAAK,QAAQ;AACf,UAAI,KAAK,wBAAwB;AAC/B,aAAK,OAAO,kBAAkB,cAAc,KAAK,sBAAsB;AAAA,MACzE;AACA,UAAI,KAAK,qBAAqB;AAC5B,aAAK,OAAO,eAAe,cAAc,KAAK,mBAAmB;AAAA,MACnE;AAAA,IACF;AACA,SAAK,yBAAyB;AAC9B,SAAK,sBAAsB;AAC3B,SAAK,eAAe,MAAM;AAC1B,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,MACX,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU,CAAC;AAAA,MACX,iBAAiB;AAAA,MACjB,iBAAiB,CAAC;AAAA,MAClB,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC5XA,IAAM,gBAAgB,CACpB,SACiC;AAAA,EACjC,GAAG;AAAA,EACH,YAAa,IAAqC,cAAc;AAClE;AAMA,IAAM,8BAA8B,CAAC,cAAyC;AAAA,EAC5E,GAAG;AAAA,EACH,WAAW,SAAS,UAAU,IAAI,aAAa;AAAA,EAC/C,GAAI,SAAS,8BAA8B;AAAA,IACzC,4BACE,SAAS,2BAA2B,IAAI,aAAa;AAAA,EACzD;AACF;AAEA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,oBAAoB,OAAO;AAAA,EAC/B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,KAAK,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAChE;AAEO,IAAM,iBAAN,MAAsD;AAAA,EAM3D,cAAc;AALd,SAAS,KAAK;AACd,SAAS,QAAQ;AAKf,SAAK,UAAU,IAAI,qBAAqB;AAAA,EAC1C;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,KAAK,QAAQ,WAAW;AAAA,EAChC;AAAA,EAEA,UAAgB;AACd,SAAK,QAAQ,QAAQ;AAAA,EACvB;AAAA,EAEA,WAA+B;AAC7B,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AAAA,EAEA,MAAM,QAAQ,aAA8C;AAC1D,UAAM,QAAsB,WAAW,WAAW;AAClD,UAAM,eAAe,kBAAkB;AACvC,UAAM,sBAAsB;AAAA,MAC1B,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,eAAe,EAAE;AAAA,IACnD;AAEA,WAAO,KAAK,QAAQ,QAAQ,cAAc,mBAAmB;AAAA,EAC/D;AAAA,EAEA,MAAM,aAA4B;AAChC,WAAO,KAAK,QAAQ,WAAW;AAAA,EACjC;AAAA,EAEA,MAAM,kBACJ,KACyC;AACzC,UAAM,aAAa,IAAI,IAAI,CAAC,OAAO,KAAK,mBAAmB,EAAE,CAAC;AAC9D,WAAO,KAAK,QAAQ,kBAAkB,UAAU;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,IAAuC;AAChE,YAAQ,GAAG,MAAM;AAAA,MACf,KAAK,kBAAkB;AACrB,cAAM,YAAoC;AAAA,UACxC,MAAM;AAAA,UACN,SAAS,GAAG;AAAA,UACZ,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU;AAAA,YAC7B,MAAM;AAAA,YACN,UAAU,KAAK;AAAA,YACf,QAAQ,KAAK;AAAA,YACb,MAAM,KAAK,KAAK;AAAA,cAAI,CAAC,QACnB,OAAO,QAAQ,WAAW,IAAI,SAAS,IAAI,OAAO,GAAG;AAAA,YACvD;AAAA,UACF,EAAE;AAAA,QACJ;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,oBAAoB;AACvB,cAAM,YAAsC;AAAA,UAC1C,MAAM;AAAA,UACN,SAAS,GAAG;AAAA;AAAA,UAEZ,SAAS,GAAG,MAAM,IAAI,CAAC,SAAc;AACnC,gBACE,KAAK,SAAS,yBACd,KAAK,SAAS,sBACd;AACA,qBAAO;AAAA,gBACL,MAAM,KAAK;AAAA,gBACX,SAAS;AAAA,kBACP,MAAM;AAAA,kBACN,QAAQ,KAAK;AAAA,kBACb,UAAU,KAAK;AAAA,kBACf,QAAQ,KAAK;AAAA,kBACb,MAAM,KAAK,KAAK;AAAA,oBAAI,CAAC,QACnB,OAAO,QAAQ,WAAW,IAAI,SAAS,IAAI,OAAO,GAAG;AAAA,kBACvD;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,QAAQ,KAAK;AAAA,cACb,MAAM,KAAK,KAAK;AAAA,gBAAI,CAAC,QACnB,OAAO,QAAQ,WAAW,IAAI,SAAS,IAAI;AAAA,cAC7C;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,qBAAqB;AACxB,cAAM,YAAuC;AAAA,UAC3C,MAAM;AAAA,UACN,OAAO,GAAG;AAAA,UACV,SAAS,GAAG;AAAA,UACZ,UAAU,GAAG;AAAA;AAAA,UAEb,UAAU;AAAA,YACR,GAAG;AAAA,UACL;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACA,SAAS;AACP,cAAM,OAAQ,GAA8B;AAC5C,cAAM,IAAI,MAAM,8CAA8C,IAAI,EAAE;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,WAAkD;AACtE,UAAM,UAAU,qBAAqB,SAAS;AAC9C,WAAO,EAAE,YAAY,MAAM,QAAQ;AAAA,EACrC;AAAA,EAEA,kBAAkB,IAAwC;AACxD,SAAK,QAAQ,kBAAkB,EAAE;AAAA,EACnC;AAAA,EAEA,eAAe,IAAsB;AACnC,SAAK,QAAQ,eAAe,EAAE;AAAA,EAChC;AACF;AAEO,IAAM,uBAAuB,MAClC,IAAI,eAAe;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/azguard.ts","../src/aztec-wallet/adapters/azguard/AzguardWalletService.ts","../src/aztec-wallet/adapters/azguard/AzguardAdapter.ts"],"sourcesContent":["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"],"mappings":";;;;;;AAAA,SAAS,oBAAoB;AA6BtB,IAAM,uBAAuB,CAAC,gBAAsC;AACzE,QAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,QAAM,YAAY,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM;AACrD,QAAM,aAAa,YAAY,MAAM,CAAC,IAAI;AAG1C,MAAI,WAAW,WAAW,IAAI;AAC5B,WAAO,aAAa,WAAW,UAAU;AAAA,EAC3C;AAGA,MAAI,WAAW,WAAW,IAAI;AAC5B,UAAM,gBAAgB,OAAO,WAAW,MAAM,CAAC,EAAE,SAAS,IAAI,GAAG;AACjE,WAAO,aAAa,WAAW,aAAa;AAAA,EAC9C;AAEA,QAAM,IAAI,MAAM,+BAA+B,WAAW,EAAE;AAC9D;;;AC9CA,SAAS,qBAAqB;AAY9B,IAAM,kBAAkB;AAExB,IAAM,wBAAwB;AAEvB,IAAM,uBAAN,MAA2B;AAAA,EAA3B;AACL,SAAQ,SAA+B;AACvC,SAAQ,QAA4B;AAAA,MAClC,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU,CAAC;AAAA,MACX,iBAAiB;AAAA,MACjB,iBAAiB,CAAC;AAAA,MAClB,OAAO;AAAA,IACT;AACA,SAAQ,iBACN,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,YACN,SACA,WACA,cACY;AACZ,WAAO,QAAQ,KAAK;AAAA,MAClB;AAAA,MACA,IAAI;AAAA,QAAW,CAAC,GAAG,WACjB,WAAW,MAAM,OAAO,IAAI,MAAM,YAAY,CAAC,GAAG,SAAS;AAAA,MAC7D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAA4B;AAChC,QAAI;AAEF,YAAM,cAAc,MAAM,cAAc,mBAAmB,eAAe;AAC1E,WAAK,YAAY,EAAE,YAAY,CAAC;AAEhC,UAAI,aAAa;AAEf,aAAK,SAAS,MAAM,cAAc,OAAO,YAAY,eAAe;AAEpE,aAAK,oBAAoB;AAEzB,cAAM,kBAAkB,KAAK,mBAAmB;AAChD,aAAK,YAAY,EAAE,gBAAgB,CAAC;AAGpC,YAAI,KAAK,OAAO,WAAW;AACzB,gBAAM,WAAW,KAAK,OAAO;AAC7B,gBAAM,kBAAkB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAC5D,eAAK,YAAY,EAAE,QAAQ,aAAa,UAAU,gBAAgB,CAAC;AACnE,kBAAQ,IAAI,oCAAoC,EAAE,SAAS,CAAC;AAAA,QAC9D;AAEA,gBAAQ,IAAI,iDAAiD;AAAA,MAC/D,OAAO;AACL,gBAAQ,KAAK,8CAAoC;AACjD,aAAK,YAAY;AAAA,UACf,OACE;AAAA,QACJ,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,gDAAgD,KAAK;AACnE,WAAK,YAAY;AAAA,QACf,OACE,iBAAiB,QACb,MAAM,UACN;AAAA,MACR,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QACJ,cACA,qBACA,qBACwB;AACxB,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAEA,QAAI;AACF,WAAK,YAAY,EAAE,QAAQ,cAAc,OAAO,KAAK,CAAC;AAEtD,WAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,KAAK;AAAA,QACT,KAAK,OAAO,QAAQ,cAAc,qBAAqB,mBAAmB;AAAA,QAC1E;AAAA,QACA;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,OAAO;AAC7B,YAAM,kBAAkB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAE5D,WAAK,YAAY;AAAA,QACf,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF,CAAC;AAED,cAAQ,IAAI,gCAAgC,EAAE,UAAU,gBAAgB,CAAC;AACzE,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAwC,KAAK;AAE3D,UAAI,iBAAiB,OAAO;AAC1B,gBAAQ,MAAM,kBAAkB;AAAA,UAC9B,SAAS,MAAM;AAAA,UACf,OAAO,MAAM;AAAA,UACb,MAAM,MAAM;AAAA,QACd,CAAC;AAAA,MACH;AAEA,WAAK,YAAY;AAAA,QACf,QAAQ;AAAA,QACR,OACE,iBAAiB,QACb,MAAM,UACN;AAAA,MACR,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBACN,cACA,qBACA,qBACM;AACN,QAAI,CAAC,gBAAgB,OAAO,iBAAiB,UAAU;AACrD,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAEA,QAAI,aAAa,OAAO,OAAO,aAAa,QAAQ,UAAU;AAC5D,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAEA,QAAI,aAAa,QAAQ,OAAO,aAAa,SAAS,UAAU;AAC9D,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAEA,UAAM,sBAAsB,CAC1B,aACA,UACG;AACH,UAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B,cAAM,IAAI,MAAM,GAAG,KAAK,mBAAmB;AAAA,MAC7C;AAEA,UAAI,YAAY,WAAW,GAAG;AAC5B,cAAM,IAAI,MAAM,GAAG,KAAK,wBAAwB;AAAA,MAClD;AAEA,kBAAY,QAAQ,CAAC,YAAY,UAAU;AACzC,YAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AACjD,gBAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,qBAAqB;AAAA,QACxD;AAEA,YAAI,WAAW,WAAW,QAAW;AACnC,cAAI,CAAC,MAAM,QAAQ,WAAW,MAAM,GAAG;AACrC,kBAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,2BAA2B;AAAA,UAC9D;AAEA,qBAAW,OAAO,QAAQ,CAAC,OAAe,eAAuB;AAC/D,gBAAI,OAAO,UAAU,UAAU;AAC7B,oBAAM,IAAI;AAAA,gBACR,GAAG,KAAK,IAAI,KAAK,YAAY,UAAU;AAAA,cACzC;AAAA,YACF;AACA,gBAAI,CAAC,MAAM,WAAW,QAAQ,GAAG;AAC/B,oBAAM,IAAI;AAAA,gBACR,GAAG,KAAK,IAAI,KAAK,YAAY,UAAU;AAAA,cACzC;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI,WAAW,YAAY,QAAW;AACpC,cAAI,CAAC,MAAM,QAAQ,WAAW,OAAO,GAAG;AACtC,kBAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,4BAA4B;AAAA,UAC/D;AAEA,qBAAW,QAAQ,QAAQ,CAAC,QAAgB,gBAAwB;AAClE,gBAAI,OAAO,WAAW,UAAU;AAC9B,oBAAM,IAAI;AAAA,gBACR,GAAG,KAAK,IAAI,KAAK,aAAa,WAAW;AAAA,cAC3C;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAEA,wBAAoB,qBAAqB,qBAAqB;AAE9D,QAAI,uBAAuB,oBAAoB,SAAS,GAAG;AACzD,0BAAoB,qBAAqB,qBAAqB;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,QAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,OAAO,WAAW;AAE7B,WAAK,YAAY;AAAA,QACf,QAAQ;AAAA,QACR,UAAU,CAAC;AAAA,QACX,iBAAiB;AAAA,QACjB,OAAO;AAAA,MACT,CAAC;AAED,cAAQ,IAAI,kCAAkC;AAAA,IAChD,SAAS,OAAO;AACd,cAAQ,MAAM,6CAA6C,KAAK;AAChE,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,YAAqD;AAC3E,QAAI,CAAC,KAAK,UAAU,KAAK,MAAM,WAAW,aAAa;AACrD,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,OAAO,QAAQ,UAAU;AAEpD,YAAM,YAAY,QAAQ,OAAO,CAAC,MAAuB,EAAE,WAAW,IAAI,EAAE;AAC5E,YAAM,SAAS,QAAQ,OAAO,CAAC,MAAuB,EAAE,WAAW,QAAQ,EAAE;AAC7E,YAAM,UAAU,QAAQ,OAAO,CAAC,MAAuB,EAAE,WAAW,SAAS,EAAE;AAE/E,cAAQ;AAAA,QACN,yCAAkC,SAAS,QAAQ,MAAM,YAAY,OAAO;AAAA,MAC9E;AAEA,cAAQ,QAAQ,CAAC,QAAyB,UAAkB;AAC1D,YAAI,OAAO,WAAW,UAAU;AAC9B,gBAAM,WAAW,WAAW,SAAS,OAAO,QAAQ;AACpD,kBAAQ,MAAM,oBAAe,KAAK,YAAY,QAAQ;AAAA,QACxD,WAAW,OAAO,WAAW,WAAW;AACtC,kBAAQ,KAAK,0BAAgB,KAAK,UAAU;AAAA,QAC9C;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAmC,KAAK;AACtD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA4B;AAClC,QAAI,CAAC,KAAK,OAAQ;AAElB,SAAK,yBAAyB,CAAC,aAA4B;AACzD,WAAK,YAAY;AAAA,QACf;AAAA,QACA,iBAAiB,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI;AAAA,QACrD,QAAQ,SAAS,SAAS,IAAI,cAAc;AAAA,MAC9C,CAAC;AAAA,IACH;AAEA,SAAK,sBAAsB,MAAM;AAC/B,WAAK,YAAY;AAAA,QACf,QAAQ;AAAA,QACR,UAAU,CAAC;AAAA,QACX,iBAAiB;AAAA,MACnB,CAAC;AACD,WAAK,UAAU,cAAc;AAAA,IAC/B;AAEA,SAAK,OAAO,kBAAkB,WAAW,KAAK,sBAAsB;AACpE,SAAK,OAAO,eAAe,WAAW,KAAK,mBAAmB;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,UAAmD;AACnE,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAA4B;AACzC,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAA+B;AAC7B,WAAO,CAAC,GAAG,gBAAgB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAA+B;AAC7B,WAAO,EAAE,GAAG,KAAK,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,SAA4C;AAC9D,UAAM,gBAAgB,EAAE,GAAG,KAAK,MAAM;AACtC,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,GAAG,QAAQ;AAEzC,QACE,QAAQ,YACR,KAAK,UAAU,cAAc,QAAQ,MACnC,KAAK,UAAU,QAAQ,QAAQ,GACjC;AACA,WAAK,UAAU,mBAAmB,QAAQ,QAAQ;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,iBACN,OACA,UACM;AACN,QAAI,CAAC,KAAK,eAAe,IAAI,KAAK,GAAG;AACnC,WAAK,eAAe,IAAI,OAAO,oBAAI,IAAI,CAAC;AAAA,IAC1C;AACA,SAAK,eAAe,IAAI,KAAK,EAAG,IAAI,QAAQ;AAAA,EAC9C;AAAA,EAEQ,UAAU,UAAkB,MAAuB;AACzD,UAAM,YAAY,KAAK,eAAe,IAAI,KAAK;AAC/C,QAAI,WAAW;AACb,gBAAU,QAAQ,CAAC,aAAa;AAC9B,YAAI;AACF,mBAAS,GAAG,IAAI;AAAA,QAClB,SAAS,OAAO;AACd,kBAAQ,MAAM,YAAY,KAAK,oBAAoB,KAAK;AAAA,QAC1D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,QAAI,KAAK,QAAQ;AACf,UAAI,KAAK,wBAAwB;AAC/B,aAAK,OAAO,kBAAkB,cAAc,KAAK,sBAAsB;AAAA,MACzE;AACA,UAAI,KAAK,qBAAqB;AAC5B,aAAK,OAAO,eAAe,cAAc,KAAK,mBAAmB;AAAA,MACnE;AAAA,IACF;AACA,SAAK,yBAAyB;AAC9B,SAAK,sBAAsB;AAC3B,SAAK,eAAe,MAAM;AAC1B,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,MACX,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU,CAAC;AAAA,MACX,iBAAiB;AAAA,MACjB,iBAAiB,CAAC;AAAA,MAClB,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC5XA,IAAM,gBAAgB,CACpB,SACiC;AAAA,EACjC,GAAG;AAAA,EACH,YAAa,IAAqC,cAAc;AAClE;AAMA,IAAM,8BAA8B,CAAC,cAAyC;AAAA,EAC5E,GAAG;AAAA,EACH,WAAW,SAAS,UAAU,IAAI,aAAa;AAAA,EAC/C,GAAI,SAAS,8BAA8B;AAAA,IACzC,4BACE,SAAS,2BAA2B,IAAI,aAAa;AAAA,EACzD;AACF;AAEA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,oBAAoB,OAAO;AAAA,EAC/B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,KAAK,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAChE;AAEO,IAAM,iBAAN,MAAsD;AAAA,EAM3D,cAAc;AALd,SAAS,KAAK;AACd,SAAS,QAAQ;AAKf,SAAK,UAAU,IAAI,qBAAqB;AAAA,EAC1C;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,KAAK,QAAQ,WAAW;AAAA,EAChC;AAAA,EAEA,UAAgB;AACd,SAAK,QAAQ,QAAQ;AAAA,EACvB;AAAA,EAEA,WAA+B;AAC7B,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AAAA,EAEA,MAAM,QAAQ,aAA8C;AAC1D,UAAM,QAAsB,WAAW,WAAW;AAClD,UAAM,eAAe,kBAAkB;AACvC,UAAM,sBAAsB;AAAA,MAC1B,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,eAAe,EAAE;AAAA,IACnD;AAEA,WAAO,KAAK,QAAQ,QAAQ,cAAc,mBAAmB;AAAA,EAC/D;AAAA,EAEA,MAAM,aAA4B;AAChC,WAAO,KAAK,QAAQ,WAAW;AAAA,EACjC;AAAA,EAEA,MAAM,kBACJ,KACyC;AACzC,UAAM,aAAa,IAAI,IAAI,CAAC,OAAO,KAAK,mBAAmB,EAAE,CAAC;AAC9D,WAAO,KAAK,QAAQ,kBAAkB,UAAU;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,IAAuC;AAChE,YAAQ,GAAG,MAAM;AAAA,MACf,KAAK,kBAAkB;AACrB,cAAM,YAAoC;AAAA,UACxC,MAAM;AAAA,UACN,SAAS,GAAG;AAAA,UACZ,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU;AAAA,YAC7B,MAAM;AAAA,YACN,UAAU,KAAK;AAAA,YACf,QAAQ,KAAK;AAAA,YACb,MAAM,KAAK,KAAK;AAAA,cAAI,CAAC,QACnB,OAAO,QAAQ,WAAW,IAAI,SAAS,IAAI,OAAO,GAAG;AAAA,YACvD;AAAA,UACF,EAAE;AAAA,QACJ;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,oBAAoB;AACvB,cAAM,YAAsC;AAAA,UAC1C,MAAM;AAAA,UACN,SAAS,GAAG;AAAA;AAAA,UAEZ,SAAS,GAAG,MAAM,IAAI,CAAC,SAAc;AACnC,gBACE,KAAK,SAAS,yBACd,KAAK,SAAS,sBACd;AACA,qBAAO;AAAA,gBACL,MAAM,KAAK;AAAA,gBACX,SAAS;AAAA,kBACP,MAAM;AAAA,kBACN,QAAQ,KAAK;AAAA,kBACb,UAAU,KAAK;AAAA,kBACf,QAAQ,KAAK;AAAA,kBACb,MAAM,KAAK,KAAK;AAAA,oBAAI,CAAC,QACnB,OAAO,QAAQ,WAAW,IAAI,SAAS,IAAI,OAAO,GAAG;AAAA,kBACvD;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,cACf,QAAQ,KAAK;AAAA,cACb,MAAM,KAAK,KAAK;AAAA,gBAAI,CAAC,QACnB,OAAO,QAAQ,WAAW,IAAI,SAAS,IAAI;AAAA,cAC7C;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,qBAAqB;AACxB,cAAM,YAAuC;AAAA,UAC3C,MAAM;AAAA,UACN,OAAO,GAAG;AAAA,UACV,SAAS,GAAG;AAAA,UACZ,UAAU,GAAG;AAAA;AAAA,UAEb,UAAU;AAAA,YACR,GAAG;AAAA,UACL;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACA,SAAS;AACP,cAAM,OAAQ,GAA8B;AAC5C,cAAM,IAAI,MAAM,8CAA8C,IAAI,EAAE;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,WAAkD;AACtE,UAAM,UAAU,qBAAqB,SAAS;AAC9C,WAAO,EAAE,YAAY,MAAM,QAAQ;AAAA,EACrC;AAAA,EAEA,kBAAkB,IAAwC;AACxD,SAAK,QAAQ,kBAAkB,EAAE;AAAA,EACnC;AAAA,EAEA,eAAe,IAAsB;AACnC,SAAK,QAAQ,eAAe,EAAE;AAAA,EAChC;AACF;AAEO,IAAM,uBAAuB,MAClC,IAAI,eAAe;","names":[]}
|