@aurum-sdk/core 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AurumCore.ts","../src/utils/chainHelpers.ts","../src/components/ConnectModal/ModalShell.tsx","../src/utils/createModalContainer.ts","../src/utils/createShadowRoot.ts","../src/components/ConnectModal/renderConnectModal.tsx","../src/wallet-adapters/AppKitAdapter.ts","../src/wallet-adapters/RabbyAdapter.ts","../src/wallet-adapters/BraveAdapter.ts","../src/wallet-adapters/LedgerAdapter.ts","../src/wallet-adapters/PhantomAdapter.ts","../src/wallet-adapters/CoinbaseWalletAdapter.ts","../src/wallet-adapters/MetaMaskAdapter.ts","../src/wallet-adapters/WalletConnectAdapter.ts","../src/wallet-adapters/EmailAdapter.ts","../src/utils/createWalletAdapters.ts","../src/providers/RpcProvider.ts","../src/Aurum.ts"],"sourcesContent":["import { Chain, checksumAddress } from 'viem';\nimport { useAurumStore, waitForStoreHydration } from '@src/store';\nimport { normalizeChainId, isChainNotAddedError, isChainExistsError } from '@src/utils/chainHelpers';\nimport { renderConnectModal } from '@src/components/ConnectModal/renderConnectModal';\nimport { DEFAULT_THEME, getDefaultThemeConfig } from '@src/constants/theme';\nimport { createWalletAdapters } from '@src/utils/createWalletAdapters';\nimport type { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport type {\n UserInfo,\n AurumRpcProvider,\n AurumConfig,\n NonNullableBrandConfig,\n WalletsConfig,\n WalletName,\n EmailAuthStartResult,\n EmailAuthVerifyResult,\n WalletConnectSessionResult,\n} from '@aurum-sdk/types';\nimport { WalletId } from '@aurum-sdk/types';\nimport { RpcProvider } from '@src/providers/RpcProvider';\nimport { initSentry, sentryLogger } from '@src/services/sentry';\nimport { WalletConnectAdapter } from '@src/wallet-adapters/WalletConnectAdapter';\nimport { EmailAdapter } from '@src/wallet-adapters/EmailAdapter';\n\nexport class AurumCore {\n // Singleton instance\n private static instance: AurumCore | null = null;\n\n // Events managed by AurumCore (not forwarded to underlying provider)\n private static readonly MANAGED_EVENTS = ['accountsChanged', 'connect', 'disconnect'];\n\n // Current RPC provider (proxy that always points to current provider)\n public rpcProvider!: AurumRpcProvider;\n\n // `true` once we have restored the connection state\n public ready: boolean = false;\n\n private wallets!: WalletAdapter[];\n private excludedWallets!: Set<WalletId>;\n private readyPromise!: Promise<void>;\n private brandConfig!: NonNullableBrandConfig;\n private userInfo: UserInfo | undefined = undefined;\n private connectedWalletAdapter: WalletAdapter | null = null;\n\n // Minimal provider that satisfies EIP-1193 to use when no wallet is connected\n private skeletonProvider!: AurumRpcProvider;\n private currentProvider!: AurumRpcProvider;\n private eventListeners: Map<string, Set<(...args: unknown[]) => void>> = new Map();\n\n constructor(config: AurumConfig) {\n if (AurumCore.instance) {\n return AurumCore.instance;\n }\n\n const telemetryEnabled = config.telemetry !== false;\n initSentry(telemetryEnabled);\n\n this.brandConfig = this.resolveBrandConfig(config);\n this.excludedWallets = new Set((config.wallets?.exclude as WalletId[]) ?? []);\n this.wallets = createWalletAdapters({\n walletsConfig: config.wallets,\n appName: this.brandConfig.appName,\n appLogoUrl: this.brandConfig.logo,\n modalZIndex: this.brandConfig.modalZIndex,\n theme: this.brandConfig.theme,\n });\n\n this.skeletonProvider = new RpcProvider(() => this.connect());\n this.currentProvider = this.skeletonProvider;\n this.rpcProvider = this.createProviderProxy();\n\n this.readyPromise = this.tryRestoreConnection();\n\n AurumCore.instance = this;\n }\n\n public async whenReady(): Promise<void> {\n try {\n await this.readyPromise;\n } catch {\n this.resetConnectionState();\n this.ready = true;\n }\n }\n\n public get resolvedBrandConfig(): NonNullableBrandConfig {\n return this.brandConfig;\n }\n\n public get walletAdapters(): WalletAdapter[] {\n return this.wallets;\n }\n\n public get excludedWalletIds(): Set<WalletId> {\n return this.excludedWallets;\n }\n\n public async connect(walletId?: WalletId): Promise<`0x${string}`> {\n await this.whenReady();\n\n if (walletId === 'email') {\n throw new Error('Use emailAuthStart() and emailAuthVerify() for email wallet connections');\n }\n if (walletId === 'walletconnect') {\n throw new Error('Use getWalletConnectSession() for WalletConnect connections');\n }\n\n // If already connected, return existing address (unless requesting a different wallet)\n if (this.userInfo?.publicAddress && this.connectedWalletAdapter?.getProvider()) {\n if (!walletId || this.userInfo.walletId === walletId) {\n return this.userInfo.publicAddress as `0x${string}`;\n }\n // Different wallet requested - disconnect first\n await this.disconnect();\n }\n\n let adapter: WalletAdapter | null = null;\n let result: WalletConnectionResult;\n\n if (walletId) {\n // Direct connection - bypass modal\n if (this.excludedWallets.has(walletId)) {\n throw new Error(`${walletId} is excluded from wallet options`);\n }\n adapter = this.wallets.find((w) => w.id === walletId) || null;\n if (!adapter) {\n throw new Error(`${walletId} is not configured`);\n }\n if (!adapter.isInstalled()) {\n throw new Error(`${adapter.name} is not installed`);\n }\n result = await adapter.connect();\n } else {\n // Open modal to let user choose\n const displayedWallets = this.wallets.filter((w) => !this.excludedWallets.has(w.id));\n const modalResult = await renderConnectModal({ displayedWallets, brandConfig: this.brandConfig });\n if (!modalResult) {\n sentryLogger.error('Missing modal result');\n throw new Error('Missing modal result');\n }\n\n adapter = this.wallets.find((w) => w.id === modalResult.walletId) || null;\n if (!adapter) {\n sentryLogger.error(`Selected wallet adapter not found: ${modalResult.walletId}`);\n throw new Error('Selected wallet adapter not found');\n }\n result = modalResult;\n }\n\n const provider = result.provider ?? adapter.getProvider();\n if (!provider) {\n sentryLogger.error(`Error fetching provider on login: ${adapter.id}`);\n throw new Error('Error fetching provider. Please try again.');\n }\n\n // Update internal state\n const checksumAdr = checksumAddress(result.address as `0x${string}`);\n this.connectedWalletAdapter = adapter;\n this.updateProvider(provider);\n this.userInfo = {\n publicAddress: checksumAdr,\n walletName: adapter.name,\n walletId: adapter.id,\n email: result.email,\n };\n\n this.persistConnectionState(adapter, checksumAdr, result.email);\n this.setInternalAccountChangeListener(adapter);\n\n // Notify listeners - EIP-1193 events\n const chainId = await provider.request<string>({ method: 'eth_chainId' });\n this.emitConnect(chainId);\n this.emitAccountsChanged([checksumAdr]);\n\n sentryLogger.info(`Wallet connected: ${adapter.id} (${walletId ? 'headless' : 'modal'})`);\n\n return checksumAdr;\n }\n\n public async disconnect(): Promise<void> {\n await this.whenReady();\n\n // Clean up event listeners before disconnecting\n if (this.connectedWalletAdapter) {\n this.connectedWalletAdapter.removeListeners();\n await this.connectedWalletAdapter.disconnect();\n }\n\n this.resetConnectionState();\n\n // Notify listeners - EIP-1193 events\n this.emitDisconnect();\n this.emitAccountsChanged([]);\n }\n\n public async getUserInfo(): Promise<UserInfo | undefined> {\n await this.whenReady();\n return this.userInfo;\n }\n\n public async isConnected(): Promise<boolean> {\n await this.whenReady();\n return Boolean(\n this.userInfo?.publicAddress && this.userInfo?.walletName && this.connectedWalletAdapter?.getProvider(),\n );\n }\n\n public async handleWidgetConnection(result: WalletConnectionResult): Promise<void> {\n await this.whenReady();\n\n const adapter = this.wallets.find((w) => w.id === result.walletId) || null;\n if (!adapter) throw new Error('Selected wallet adapter not found');\n\n const provider = result.provider ?? adapter.getProvider();\n if (!provider) {\n sentryLogger.error(`Error fetching provider on widget login: ${result?.walletId}`);\n throw new Error('Error fetching provider. Please try again.');\n }\n\n // Update internal state (mirrors connect() logic)\n const checksumAdr = checksumAddress(result.address as `0x${string}`);\n this.connectedWalletAdapter = adapter;\n this.updateProvider(provider);\n this.userInfo = {\n publicAddress: checksumAdr,\n walletName: adapter.name,\n walletId: adapter.id,\n email: result.email,\n };\n\n this.persistConnectionState(adapter, checksumAdr, result.email);\n this.setInternalAccountChangeListener(adapter);\n\n // Notify listeners - EIP-1193 events\n const chainId = await provider.request<string>({ method: 'eth_chainId' });\n this.emitConnect(chainId);\n this.emitAccountsChanged([checksumAdr]);\n\n sentryLogger.info(`Wallet connected: ${adapter.id} (widget)`);\n }\n\n public async getChainId(): Promise<number> {\n await this.whenReady();\n const chainId = await this.rpcProvider.request({ method: 'eth_chainId' });\n return Number(chainId);\n }\n\n public async switchChain(chainId: `0x${string}` | string | number, chain?: Chain): Promise<void> {\n await this.whenReady();\n\n const hexChainId = normalizeChainId(chainId);\n\n try {\n await this.attemptSwitchChain(hexChainId);\n } catch (switchError: unknown) {\n if (!isChainNotAddedError(switchError as { code?: number; message?: string }) || !chain) throw switchError;\n await this.handleMissingChain(hexChainId, chain);\n }\n }\n\n public updateBrandConfig(newConfig: Partial<NonNullableBrandConfig>): void {\n // Get defaults based on the theme (use new theme if provided, otherwise current)\n const defaultTheme = getDefaultThemeConfig(newConfig.theme ?? this.brandConfig.theme);\n\n // For each property:\n // - If not in newConfig: keep current value\n // - If in newConfig with value: use new value\n // - If in newConfig with undefined: reset to default\n this.brandConfig = {\n logo: 'logo' in newConfig ? (newConfig.logo ?? defaultTheme.logo) : this.brandConfig.logo,\n theme: 'theme' in newConfig ? (newConfig.theme ?? defaultTheme.theme) : this.brandConfig.theme,\n primaryColor:\n 'primaryColor' in newConfig\n ? (newConfig.primaryColor ?? defaultTheme.primaryColor)\n : this.brandConfig.primaryColor,\n borderRadius:\n 'borderRadius' in newConfig\n ? (newConfig.borderRadius ?? defaultTheme.borderRadius)\n : this.brandConfig.borderRadius,\n modalZIndex:\n 'modalZIndex' in newConfig\n ? typeof newConfig.modalZIndex === 'number'\n ? newConfig.modalZIndex\n : defaultTheme.modalZIndex\n : this.brandConfig.modalZIndex,\n appName: 'appName' in newConfig ? (newConfig.appName ?? defaultTheme.appName) : this.brandConfig.appName,\n hideFooter:\n 'hideFooter' in newConfig ? (newConfig.hideFooter ?? defaultTheme.hideFooter) : this.brandConfig.hideFooter,\n font: 'font' in newConfig ? (newConfig.font ?? defaultTheme.font) : this.brandConfig.font,\n walletLayout:\n 'walletLayout' in newConfig\n ? (newConfig.walletLayout ?? defaultTheme.walletLayout)\n : this.brandConfig.walletLayout,\n };\n }\n\n public updateWalletsConfig(newConfig: Partial<Pick<WalletsConfig, 'exclude'>>): void {\n if (newConfig.exclude !== undefined) {\n this.excludedWallets = new Set((newConfig.exclude as WalletId[]) ?? []);\n }\n }\n\n /* HEADLESS / WHITELABEL API */\n\n /**\n * Starts the email authentication flow by sending an OTP to the provided email.\n * @returns flowId to use with emailAuthVerify\n */\n public async emailAuthStart(email: string): Promise<EmailAuthStartResult> {\n await this.whenReady();\n\n const emailAdapter = this.wallets.find((w) => w.id === WalletId.Email) as EmailAdapter | undefined;\n if (!emailAdapter || !emailAdapter.emailAuthStart) {\n throw new Error('Email wallet is not configured');\n }\n\n const result = await emailAdapter.emailAuthStart(email);\n return { flowId: result.flowId };\n }\n\n /**\n * Verifies the email OTP and completes the connection.\n * @param flowId - The flowId returned from emailAuthStart\n * @param otp - The OTP code the user received via email\n * @returns The connected wallet address and email\n */\n public async emailAuthVerify(flowId: string, otp: string): Promise<EmailAuthVerifyResult> {\n await this.whenReady();\n\n const emailAdapter = this.wallets.find((w) => w.id === WalletId.Email) as EmailAdapter | undefined;\n if (!emailAdapter || !emailAdapter.emailAuthVerify) {\n throw new Error('Email wallet is not configured');\n }\n\n const verifyResult = await emailAdapter.emailAuthVerify(flowId, otp);\n const provider = emailAdapter.getProvider();\n\n if (!provider) {\n sentryLogger.error('Failed to get provider after email verification');\n throw new Error('Failed to get provider after email verification');\n }\n\n const address = verifyResult.user?.evmAccounts?.[0];\n const email = verifyResult.user?.authenticationMethods?.email?.email;\n\n if (!address || !email) {\n sentryLogger.error('Address or email not found after email verification');\n throw new Error('Address or email not found after email verification');\n }\n\n const checksumAdr = checksumAddress(address as `0x${string}`);\n\n this.connectedWalletAdapter = emailAdapter;\n this.updateProvider(provider);\n this.userInfo = {\n publicAddress: checksumAdr,\n walletName: emailAdapter.name,\n walletId: emailAdapter.id,\n email,\n };\n\n this.persistConnectionState(emailAdapter, checksumAdr, email);\n this.setInternalAccountChangeListener(emailAdapter);\n\n // Notify listeners - EIP-1193 events\n const chainId = await provider.request<string>({ method: 'eth_chainId' });\n this.emitConnect(chainId);\n this.emitAccountsChanged([checksumAdr]);\n\n sentryLogger.info(`Wallet connected: ${emailAdapter.id} (headless)`);\n\n return { address: checksumAdr, email: email ?? '', isNewUser: verifyResult.isNewUser ?? false };\n }\n\n /**\n * Initiates a WalletConnect session and returns the URI for displaying a custom QR code.\n * @returns URI string and a promise that resolves when the user connects\n */\n public async getWalletConnectSession(): Promise<WalletConnectSessionResult> {\n await this.whenReady();\n\n const wcAdapter = this.wallets.find((w) => w.id === WalletId.WalletConnect) as WalletConnectAdapter | undefined;\n if (!wcAdapter) {\n throw new Error('WalletConnect is not enabled');\n }\n\n const session = await wcAdapter.startSession();\n\n return {\n uri: session.uri,\n waitForConnection: async (): Promise<`0x${string}`> => {\n const result = await session.waitForConnection();\n const provider = result.provider ?? wcAdapter.getProvider();\n\n if (!provider) {\n sentryLogger.error('Failed to get provider after WalletConnect connection');\n throw new Error('Failed to get provider after WalletConnect connection');\n }\n\n const checksumAdr = checksumAddress(result.address as `0x${string}`);\n this.connectedWalletAdapter = wcAdapter;\n this.updateProvider(provider);\n this.userInfo = {\n publicAddress: checksumAdr,\n walletName: wcAdapter.name,\n walletId: wcAdapter.id,\n };\n\n this.persistConnectionState(wcAdapter, checksumAdr);\n this.setInternalAccountChangeListener(wcAdapter);\n\n // Notify listeners - EIP-1193 events\n const chainId = await provider.request<string>({ method: 'eth_chainId' });\n this.emitConnect(chainId);\n this.emitAccountsChanged([checksumAdr]);\n\n sentryLogger.info(`Wallet connected: ${wcAdapter.id} (headless)`);\n\n return checksumAdr;\n },\n };\n }\n\n /* PROVIDER METHODS */\n\n private createProviderProxy(): AurumRpcProvider {\n type EventCallback = (...args: unknown[]) => void;\n const handler: ProxyHandler<AurumRpcProvider> = {\n get: (_, prop) => {\n // Handle event listener methods specially - these are managed by AurumCore\n if (prop === 'on') {\n return (event: string, callback: EventCallback) => {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n // accountsChanged/connect/disconnect: AurumCore emits manually\n // Other events (chainChanged, etc.): Forward to provider directly\n if (!AurumCore.MANAGED_EVENTS.includes(event)) {\n (this.currentProvider.on as (e: string, cb: EventCallback) => void)?.(event, callback);\n }\n };\n }\n\n if (prop === 'removeListener') {\n return (event: string, callback: EventCallback) => {\n this.eventListeners.get(event)?.delete(callback);\n if (!AurumCore.MANAGED_EVENTS.includes(event)) {\n (this.currentProvider.removeListener as (e: string, cb: EventCallback) => void)?.(event, callback);\n }\n };\n }\n\n // Get the value from currentProvider\n const provider = this.currentProvider as unknown as Record<string, unknown>;\n const value = provider[prop as string];\n\n // If it's a function, bind it to currentProvider and return\n // This ensures the function is called with correct context at CALL time\n if (typeof value === 'function') {\n return (...args: unknown[]) => {\n // Re-fetch in case provider changed between get and call (important for viem)\n const currentValue = (this.currentProvider as unknown as Record<string, unknown>)[prop as string];\n if (typeof currentValue === 'function') {\n return (currentValue as (...a: unknown[]) => unknown).apply(this.currentProvider, args);\n }\n return currentValue;\n };\n }\n\n // For non-function properties (isConnected, chainId, etc.), return the value directly\n return value;\n },\n };\n return new Proxy({} as AurumRpcProvider, handler);\n }\n\n private updateProvider(newProvider: AurumRpcProvider): void {\n this.currentProvider = newProvider;\n // Re-register provider-managed listeners on the new provider\n // (accountsChanged/connect/disconnect are managed by AurumCore)\n type EventCallback = (...args: unknown[]) => void;\n this.eventListeners.forEach((callbacks, event) => {\n if (!AurumCore.MANAGED_EVENTS.includes(event)) {\n callbacks.forEach((callback) => {\n (newProvider.on as (e: string, cb: EventCallback) => void)?.(event, callback);\n });\n }\n });\n }\n\n /* BRAND & THEME METHODS */\n\n private resolveBrandConfig(config?: AurumConfig): NonNullableBrandConfig {\n const { brand = {} } = config || {};\n const themeConfig = getDefaultThemeConfig(brand.theme || DEFAULT_THEME);\n\n return {\n logo: brand.logo ?? themeConfig.logo,\n theme: brand.theme ?? themeConfig.theme,\n primaryColor: brand.primaryColor ?? themeConfig.primaryColor,\n borderRadius: brand.borderRadius ?? themeConfig.borderRadius,\n modalZIndex: typeof brand.modalZIndex === 'number' ? brand.modalZIndex : themeConfig.modalZIndex,\n appName: brand.appName ?? themeConfig.appName,\n hideFooter: brand.hideFooter ?? themeConfig.hideFooter,\n font: brand.font ?? themeConfig.font,\n walletLayout: brand.walletLayout ?? themeConfig.walletLayout,\n };\n }\n\n private async tryRestoreConnection(): Promise<void> {\n try {\n // Wait for Zustand to finish hydrating from localStorage\n await waitForStoreHydration();\n\n const store = useAurumStore.getState();\n if (!store.isConnected || !store.walletId || !store.address || !store.walletName) {\n return;\n }\n\n const persistedAdapter = this.wallets.find((w) => w.id === store.walletId) || null;\n if (!persistedAdapter || !persistedAdapter.isInstalled()) {\n store.clearConnection();\n return;\n }\n\n const connectionResult = await persistedAdapter.tryRestoreConnection();\n if (!connectionResult || connectionResult.address.toLowerCase() !== store.address.toLowerCase()) {\n store.clearConnection();\n return;\n }\n\n this.connectedWalletAdapter = persistedAdapter;\n this.updateProvider(connectionResult.provider);\n this.userInfo = {\n publicAddress: checksumAddress(connectionResult.address as `0x${string}`),\n walletName: store.walletName,\n walletId: persistedAdapter.id,\n email: store.email ?? undefined,\n };\n\n this.setInternalAccountChangeListener(persistedAdapter);\n } catch {\n this.resetConnectionState();\n } finally {\n this.ready = true;\n }\n }\n\n private persistConnectionState(adapter: WalletAdapter, address: string, email?: string): void {\n useAurumStore.getState().setConnection(adapter.id, checksumAddress(address as `0x${string}`), adapter.name, email);\n }\n\n /* INTERNAL LISTENER METHODS */\n\n private setInternalAccountChangeListener(adapter: WalletAdapter): void {\n adapter.onAccountsChanged(async (accounts) => {\n if (accounts.length === 0) {\n await this.disconnect();\n return;\n }\n this.syncStateFromAccountsChanged(accounts);\n });\n }\n\n private async syncStateFromAccountsChanged(accounts: string[]): Promise<void> {\n if (!accounts.length || !accounts[0]) return;\n\n const prevAccount = this.userInfo?.publicAddress;\n const newAccount = checksumAddress(accounts[0] as `0x${string}`);\n\n if (newAccount !== prevAccount) {\n this.userInfo = {\n publicAddress: newAccount,\n walletName: this.userInfo?.walletName as WalletName,\n walletId: this.userInfo?.walletId as WalletId,\n email: this.userInfo?.email,\n };\n if (this.connectedWalletAdapter) {\n this.persistConnectionState(this.connectedWalletAdapter, newAccount, this.userInfo.email);\n }\n // Notify listeners of account change (provider-initiated, e.g. user switched in wallet UI)\n this.emitAccountsChanged([newAccount]);\n }\n }\n\n /**\n * Emit accountsChanged to listeners registered via rpcProvider.on('accountsChanged', cb)\n * This is the single source of truth - we don't forward to underlying providers to prevent duplicates\n */\n private emitAccountsChanged(accounts: string[]): void {\n const listeners = this.eventListeners.get('accountsChanged');\n if (listeners) {\n listeners.forEach((callback) => callback(accounts));\n }\n }\n\n /**\n * Emit connect event per EIP-1193 when provider becomes connected\n * @param chainId - The chain ID in hex format (e.g., \"0x1\")\n */\n private emitConnect(chainId: string): void {\n const listeners = this.eventListeners.get('connect');\n if (listeners) {\n listeners.forEach((callback) => callback({ chainId }));\n }\n }\n\n /**\n * Emit disconnect event per EIP-1193 when provider becomes disconnected\n * @param error - Optional error that caused the disconnection\n */\n private emitDisconnect(error?: { code: number; message: string }): void {\n const listeners = this.eventListeners.get('disconnect');\n if (listeners) {\n const disconnectError = error || { code: 4900, message: 'Disconnected' };\n listeners.forEach((callback) => callback(disconnectError));\n }\n }\n\n /* SWITCH CHAIN METHODS */\n\n private async attemptSwitchChain(hexChainId: string): Promise<void> {\n await this.rpcProvider.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: hexChainId }],\n });\n }\n\n private async handleMissingChain(hexChainId: string, chain: Chain): Promise<void> {\n try {\n await this.addChain(chain);\n await this.attemptSwitchChain(hexChainId);\n } catch (addError: unknown) {\n if (isChainExistsError(addError as { code?: number; message?: string })) {\n await this.attemptSwitchChain(hexChainId);\n } else {\n throw addError;\n }\n }\n }\n\n private async addChain(chain: Chain): Promise<void> {\n if (!chain?.id || !chain?.name || !chain?.nativeCurrency || !chain?.rpcUrls?.default?.http) {\n throw new Error('Invalid chain configuration: missing required properties');\n }\n\n await this.rpcProvider.request({\n method: 'wallet_addEthereumChain',\n params: [\n {\n chainId: `0x${chain.id.toString(16)}`,\n chainName: chain.name,\n nativeCurrency: chain.nativeCurrency,\n rpcUrls: chain.rpcUrls.default.http,\n blockExplorerUrls: chain.blockExplorers ? [chain.blockExplorers.default.url] : undefined,\n },\n ],\n });\n }\n\n /* REST */\n private resetConnectionState(): void {\n useAurumStore.getState().clearConnection();\n this.connectedWalletAdapter = null;\n this.updateProvider(this.skeletonProvider);\n this.userInfo = undefined;\n }\n}\n","export function normalizeChainId(chainId: `0x${string}` | string | number): string {\n if (typeof chainId === 'string' && chainId.startsWith('0x')) return chainId;\n const numericId = typeof chainId === 'number' ? chainId : Number(chainId);\n if (Number.isNaN(numericId)) {\n throw new Error(`Invalid chainId: ${chainId}`);\n }\n return `0x${numericId.toString(16)}`;\n}\n\nexport function isChainNotAddedError(error: { code?: number; message?: string }): boolean {\n return Boolean(\n error?.code === 4902 ||\n error?.message?.includes('Unrecognized chain ID') ||\n error?.message?.includes('Chain ID not supported'),\n );\n}\n\nexport function isChainExistsError(error: { code?: number; message?: string }): boolean {\n return Boolean(\n error?.code === 4001 || // User rejected\n error?.code === -32000 || // Chain already pending/exists\n error?.message?.includes('already exists') ||\n error?.message?.includes('already pending'),\n );\n}\n","import React, { useState } from 'react';\nimport { Modal } from '@src/ui';\nimport { ConnectPages } from '@src/components/ConnectModal/ConnectPages';\nimport { useNavigation } from '@src/contexts/NavigationContext';\nimport { NonNullableBrandConfig } from '@aurum-sdk/types';\n\ninterface ModalShellProps {\n onClose: () => void;\n brandConfig: NonNullableBrandConfig;\n}\n\n/**\n * Shell component for the connect modal.\n *\n * Wraps the Modal UI component and renders ConnectPages inside.\n * Provider hierarchy is handled by renderConnectModal.\n *\n * ## Hierarchy\n * ```\n * renderConnectModal\n * └── ThemeContainer\n * └── ConnectUIProviders (NavigationProvider + ConnectModalProvider)\n * └── ModalShell ← you are here\n * └── Modal\n * └── WidgetProvider (mode='modal')\n * └── PageTransitionContainer\n * └── ConnectPages\n * ```\n */\nexport const ModalShell: React.FC<ModalShellProps> = ({ onClose, brandConfig }) => {\n const [isOpen, setIsOpen] = useState(true);\n const { currentPage } = useNavigation();\n\n const handleClose = () => {\n setIsOpen(false);\n onClose();\n };\n\n return (\n <Modal\n isOpen={isOpen}\n closeOnOverlayClick\n onCloseComplete={handleClose}\n brandConfig={brandConfig}\n transitionKey={currentPage}\n >\n <ConnectPages />\n </Modal>\n );\n};\n","import { createRoot, Root } from 'react-dom/client';\nimport { createShadowRoot } from '@src/utils/createShadowRoot';\nimport { NonNullableBrandConfig } from '@aurum-sdk/types';\n\n/** Tracks active modal roots by container ID for cleanup */\nconst activeRoots = new Map<string, Root>();\n\nexport interface ModalContainer {\n root: Root;\n cleanup: () => void;\n}\n\n/**\n * Creates a Shadow DOM container for modal rendering with automatic cleanup.\n *\n * Handles:\n * - Cleanup of any existing modal with the same ID\n * - Shadow DOM creation for style isolation\n * - React root creation\n * - Tracking for proper cleanup\n */\nexport function createModalContainer(id: string, brandConfig: NonNullableBrandConfig): ModalContainer {\n // Cleanup any existing modal with this ID\n const existingRoot = activeRoots.get(id);\n if (existingRoot) {\n existingRoot.unmount();\n document.getElementById(id)?.remove();\n activeRoots.delete(id);\n }\n\n // Create container with Shadow DOM for style isolation\n const container = document.createElement('div');\n container.id = id;\n document.body.appendChild(container);\n\n const shadowDOMRoot = createShadowRoot(container, brandConfig);\n const root = createRoot(shadowDOMRoot);\n activeRoots.set(id, root);\n\n const cleanup = () => {\n root.unmount();\n container.remove();\n activeRoots.delete(id);\n };\n\n return { root, cleanup };\n}\n","import { NonNullableBrandConfig } from '@aurum-sdk/types';\nimport { generateCompleteStyles } from '@src/utils/generateBrandStyles';\n\n/**\n * Creates a Shadow DOM with all SDK styles injected.\n * Used by modals for style isolation from the host page.\n */\nexport function createShadowRoot(container: HTMLElement, brandConfig: NonNullableBrandConfig): HTMLElement {\n const shadowRoot = container.attachShadow({ mode: 'open' });\n\n shadowRoot.innerHTML = `\n <style>${generateCompleteStyles(brandConfig)}</style>\n <div class=\"aurum-modal-root\"></div>\n `;\n\n return shadowRoot.querySelector('.aurum-modal-root') as HTMLElement;\n}\n","import { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport { ThemeContainer } from '@src/ui';\nimport { ConnectUIProviders } from '@src/components/ConnectUIProviders';\nimport { ModalShell } from '@src/components/ConnectModal/ModalShell';\nimport { sortWallets } from '@src/utils/sortWallets';\nimport { createModalContainer } from '@src/utils/createModalContainer';\nimport { isMobile } from '@src/utils/platform/isMobile';\nimport { NonNullableBrandConfig, WalletId } from '@aurum-sdk/types';\nimport { sentryLogger } from '@src/services/sentry';\n\nconst CONTAINER_ID = 'aurum-modal-container';\n\ninterface RenderConnectModalProps {\n displayedWallets: WalletAdapter[];\n brandConfig: NonNullableBrandConfig;\n}\n\nexport function renderConnectModal({\n displayedWallets,\n brandConfig,\n}: RenderConnectModalProps): Promise<WalletConnectionResult> {\n return new Promise((resolve, reject) => {\n let sortedWallets = sortWallets(displayedWallets, { filterHidden: false });\n\n // On mobile, WalletConnect requires AppKit. Hide WalletConnect if AppKit is not available.\n const hasAppKit = sortedWallets.some((w) => w.id === WalletId.AppKit);\n if (isMobile() && !hasAppKit) {\n sortedWallets = sortedWallets.filter((w) => w.id !== WalletId.WalletConnect);\n }\n\n const { root, cleanup } = createModalContainer(CONTAINER_ID, brandConfig);\n\n const onConnect = (result: WalletConnectionResult) => {\n cleanup();\n resolve(result);\n };\n\n const onClose = () => {\n cleanup();\n reject(new Error('User rejected request'));\n };\n\n root.render(\n <ThemeContainer theme={brandConfig.theme}>\n <ConnectUIProviders onConnect={onConnect} displayedWallets={sortedWallets}>\n <ModalShell onClose={onClose} brandConfig={brandConfig} />\n </ConnectUIProviders>\n </ThemeContainer>,\n );\n });\n}\n","import type { AppKit } from '@reown/appkit';\nimport type { WagmiAdapter } from '@reown/appkit-adapter-wagmi';\nimport { sentryLogger } from '@src/services/sentry';\nimport { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { createConfigError } from '@src/utils/isConfigError';\n\ninterface AppKitConfig {\n projectId?: string;\n appName: string;\n modalZIndex: number;\n theme: 'light' | 'dark';\n}\n\nexport class AppKitAdapter implements WalletAdapter {\n readonly id = WalletId.AppKit;\n readonly name = WalletName.AppKit;\n readonly icon = getLogoDataUri(WalletId.AppKit, 'brand') ?? '';\n readonly hide = true;\n readonly downloadUrl = null;\n readonly wcDeepLinkUrl = null;\n\n private modal: AppKit | null = null;\n private wagmiAdapter: WagmiAdapter | null = null;\n private provider: AurumRpcProvider | null = null;\n private address: string | null = null;\n private config: AppKitConfig;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private unsubscribeFunctions: Array<() => void> = [];\n private initPromise: Promise<void> | null = null;\n\n constructor(config: AppKitConfig) {\n this.config = {\n projectId: config.projectId,\n appName: config.appName,\n modalZIndex: config.modalZIndex,\n theme: config.theme,\n };\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.modal) return;\n if (!this.initPromise) {\n this.initPromise = this.initializeAppKit();\n }\n await this.initPromise;\n }\n\n private async initializeAppKit(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const [{ createAppKit }, { WagmiAdapter }, { mainnet }] = await Promise.all([\n import('@reown/appkit'),\n import('@reown/appkit-adapter-wagmi'),\n import('@reown/appkit/networks'),\n ]);\n\n const networks = [mainnet];\n\n this.wagmiAdapter = new WagmiAdapter({\n projectId: this.config.projectId!,\n networks,\n ssr: true,\n });\n\n this.modal = createAppKit({\n adapters: [this.wagmiAdapter],\n networks: networks as [typeof mainnet],\n projectId: this.config.projectId!,\n metadata: {\n name: this.config.appName,\n description: this.config.appName,\n url: window.location.origin,\n icons: [],\n },\n allowUnsupportedChain: true,\n themeMode: this.config.theme,\n themeVariables: {\n '--apkt-z-index': this.config.modalZIndex + 1,\n },\n });\n\n this.setupEventListeners();\n }\n\n private setupEventListeners(): void {\n if (!this.modal) return;\n\n const unsubscribeProviders = this.modal.subscribeProviders((state) => {\n const eip155Provider = (state as Record<string, AurumRpcProvider | undefined>)['eip155'];\n this.provider = eip155Provider || null;\n if (!eip155Provider) {\n this.address = null;\n }\n });\n this.unsubscribeFunctions.push(unsubscribeProviders);\n }\n\n private syncAddressFromWagmi(): void {\n if (!this.wagmiAdapter?.wagmiConfig) return;\n\n const { state } = this.wagmiAdapter.wagmiConfig;\n if (state.current && state.connections) {\n const connection = state.connections.get(state.current);\n if (connection?.accounts?.[0]) {\n this.address = connection.accounts[0];\n }\n }\n }\n\n private async syncProviderFromModal(): Promise<void> {\n if (!this.modal) return;\n\n try {\n // Try to get providers directly from modal\n const getProvidersFn = (this.modal as unknown as { getProviders?: () => Record<string, AurumRpcProvider> })\n .getProviders;\n if (typeof getProvidersFn === 'function') {\n const providers = getProvidersFn.call(this.modal);\n const eip155Provider = providers?.['eip155'];\n if (eip155Provider) {\n this.provider = eip155Provider;\n return;\n }\n }\n\n // Fallback: try to get provider from wagmi connector\n if (this.wagmiAdapter?.wagmiConfig) {\n const { state } = this.wagmiAdapter.wagmiConfig;\n if (state.current && state.connections) {\n const connection = state.connections.get(state.current);\n const connector = connection?.connector;\n if (connector && typeof connector.getProvider === 'function') {\n try {\n const provider = await connector.getProvider();\n if (provider) {\n this.provider = provider as AurumRpcProvider;\n }\n } catch (error) {\n sentryLogger.warn('Failed to get provider from wagmi connector', { error });\n }\n }\n }\n }\n } catch (error) {\n sentryLogger.warn('Failed to get provider from AppKit', { error });\n }\n }\n\n isInstalled(): boolean {\n return true;\n }\n\n async connect(): Promise<WalletConnectionResult> {\n if (!this.config.projectId) {\n throw createConfigError('AppKit');\n }\n\n await this.ensureInitialized();\n\n if (!this.modal) {\n sentryLogger.error('AppKit is not available');\n throw new Error('AppKit is not available');\n }\n\n // Check if AppKit already has a wallet connected\n const existingAddress = this.modal.getAddress();\n if (this.modal.getIsConnectedState() && existingAddress) {\n await this.syncProviderFromModal();\n if (this.provider) {\n this.address = existingAddress;\n return {\n address: existingAddress,\n provider: this.provider,\n walletId: this.id,\n };\n }\n // If we can't get provider, disconnect and reconnect fresh\n await this.disconnect();\n }\n\n this.modal.open({ view: 'Connect' });\n\n return await this.waitForConnection();\n }\n\n private waitForConnection(timeout = 60000): Promise<WalletConnectionResult> {\n return new Promise((resolve, reject) => {\n const startTime = Date.now();\n let unsubscribeState: (() => void) | null = null;\n let isResolved = false;\n\n const cleanup = () => {\n unsubscribeState?.();\n };\n\n const checkConnection = async (): Promise<boolean> => {\n if (isResolved) return true;\n\n this.syncAddressFromWagmi();\n\n // If we have address but no provider, try to get it directly\n if (this.address && !this.provider) {\n await this.syncProviderFromModal();\n }\n\n if (this.provider && this.address) {\n try {\n const accounts = (await this.provider.request({ method: 'eth_accounts' })) as string[];\n if (accounts && accounts.length > 0) {\n isResolved = true;\n cleanup();\n // Close the modal after successful connection\n this.modal?.close();\n resolve({\n address: this.address,\n provider: this.provider,\n walletId: this.id,\n });\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n return false;\n };\n\n // Watch for modal state changes\n unsubscribeState = this.modal!.subscribeState(async (state: { open: boolean }) => {\n if (await checkConnection()) return;\n\n // Modal closed without connection = user rejected\n if (state.open === false && !this.address && !isResolved) {\n cleanup();\n reject(new Error('Connection rejected by user'));\n }\n });\n\n // Polling fallback for timeout\n const pollTimeout = async () => {\n if (await checkConnection()) return;\n\n if (Date.now() - startTime > timeout) {\n cleanup();\n reject(new Error('Connection timeout'));\n return;\n }\n\n setTimeout(pollTimeout, 500);\n };\n\n pollTimeout();\n });\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n await this.ensureInitialized();\n\n if (!this.modal || !this.wagmiAdapter) return null;\n\n try {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n const wagmiConfig = this.wagmiAdapter.wagmiConfig;\n if (wagmiConfig?.state?.current && wagmiConfig.state.connections) {\n const connection = wagmiConfig.state.connections.get(wagmiConfig.state.current);\n if (connection?.accounts?.[0]) {\n this.address = connection.accounts[0];\n\n if (this.provider && this.address) {\n return {\n address: this.address,\n provider: this.provider,\n walletId: this.id,\n };\n }\n }\n }\n\n return null;\n } catch {\n // sentryLogger.warn('Failed to restore connection to AppKit', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {\n if (!this.modal) {\n this.address = null;\n this.provider = null;\n return;\n }\n\n await this.modal.disconnect('eip155' as Parameters<typeof this.modal.disconnect>[0]);\n\n // Wait for AppKit state to clear (required due to async state updates)\n const timeout = Date.now() + 2000;\n while (Date.now() < timeout && (this.modal.getIsConnectedState() || this.modal.getAddress())) {\n await new Promise((r) => setTimeout(r, 100));\n }\n this.address = null;\n this.provider = null;\n }\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = (accounts: string[]) => {\n this.address = accounts[0] || null;\n callback(accounts);\n };\n\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (this.provider?.removeListener && this.accountsChangedCallback) {\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n\n this.unsubscribeFunctions.forEach((unsub) => unsub());\n this.unsubscribeFunctions = [];\n }\n}\n","import { WalletAdapter, WalletConnectionResult, EIP6963AnnounceProviderEvent } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { sentryLogger } from '@src/services/sentry';\n\nconst RABBY_RDNS = 'io.rabby';\n\ninterface RabbyProvider extends AurumRpcProvider {\n isRabby: boolean;\n providers?: RabbyProvider[];\n}\n\nexport class RabbyAdapter implements WalletAdapter {\n readonly id = WalletId.Rabby;\n readonly name = WalletName.Rabby;\n readonly icon = getLogoDataUri(WalletId.Rabby, 'brand') ?? '';\n readonly hide = false;\n readonly downloadUrl = 'https://rabby.io';\n readonly wcDeepLinkUrl = null;\n\n private provider: RabbyProvider | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private providerPromise: Promise<RabbyProvider | null> | null = null;\n\n constructor() {\n // Start EIP-6963 discovery immediately\n this.providerPromise = this.discoverProvider();\n }\n\n /**\n * Uses EIP-6963 to discover the Rabby provider by its RDNS identifier.\n * Falls back to window.ethereum for legacy detection.\n */\n private discoverProvider(): Promise<RabbyProvider | null> {\n if (typeof window === 'undefined') return Promise.resolve(null);\n\n return new Promise((resolve) => {\n let resolved = false;\n\n const onAnnouncement = (event: Event) => {\n const { detail } = event as EIP6963AnnounceProviderEvent<RabbyProvider>;\n if (detail.info.rdns === RABBY_RDNS) {\n resolved = true;\n this.provider = detail.provider;\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n resolve(detail.provider);\n }\n };\n\n window.addEventListener('eip6963:announceProvider', onAnnouncement);\n window.dispatchEvent(new Event('eip6963:requestProvider'));\n\n // Timeout after 100ms - fall back to legacy detection\n setTimeout(() => {\n if (!resolved) {\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n const legacyProvider = this.detectLegacyProvider();\n if (legacyProvider) {\n this.provider = legacyProvider;\n }\n resolve(legacyProvider);\n }\n }, 100);\n });\n }\n\n /**\n * Fallback detection for legacy Rabby installations.\n * Checks window.ethereum for Rabby-specific flags.\n */\n private detectLegacyProvider(): RabbyProvider | null {\n const ethereum = (window as unknown as { ethereum?: RabbyProvider }).ethereum;\n if (ethereum?.isRabby) {\n return ethereum;\n }\n return null;\n }\n\n isInstalled(): boolean {\n return Boolean(this.provider);\n }\n\n async connect(): Promise<WalletConnectionResult> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n sentryLogger.error('Rabby is not available');\n throw new Error('Rabby is not available');\n }\n\n try {\n // Force Rabby to prompt for a fresh connection instead of returning cached accounts\n await this.provider.request({\n method: 'wallet_requestPermissions',\n params: [{ eth_accounts: {} }],\n });\n\n const accounts = await this.provider.request<string[]>({\n method: 'eth_requestAccounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('No accounts returned from Rabby');\n throw new Error('No accounts returned from Rabby');\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n throw new Error('Failed to connect to Rabby');\n }\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n return null;\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to Rabby', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {}\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n // Called by Aurum when user connects wallet\n // Passes Aurum.ts --> syncStateFromAccountsChanged() to handle the provider accounts changed event\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","import { WalletAdapter, WalletConnectionResult, EIP6963AnnounceProviderEvent } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { sentryLogger } from '@src/services/sentry';\n\nconst BRAVE_RDNS = 'com.brave.wallet';\n\ninterface BraveProvider extends AurumRpcProvider {\n isBraveWallet: boolean;\n}\n\n/**\n * Detects if the user is on Brave browser\n */\nfunction isBraveBrowser(): boolean {\n if (typeof navigator === 'undefined') return false;\n return (navigator as unknown as { brave?: unknown }).brave !== undefined;\n}\n\nexport class BraveAdapter implements WalletAdapter {\n readonly id = WalletId.Brave;\n readonly name = WalletName.Brave;\n readonly icon = getLogoDataUri(WalletId.Brave, 'brand') ?? '';\n readonly hide: boolean;\n readonly downloadUrl = 'https://brave.com/download';\n readonly wcDeepLinkUrl = null;\n\n private provider: BraveProvider | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private providerPromise: Promise<BraveProvider | null> | null = null;\n\n constructor() {\n // Hide if not on Brave browser\n this.hide = !isBraveBrowser();\n // Start EIP-6963 discovery immediately\n this.providerPromise = this.discoverProvider();\n }\n\n /**\n * Uses EIP-6963 to discover the Brave Wallet provider by its RDNS identifier.\n * Falls back to window.ethereum for legacy detection.\n */\n private discoverProvider(): Promise<BraveProvider | null> {\n if (typeof window === 'undefined') return Promise.resolve(null);\n\n return new Promise((resolve) => {\n let resolved = false;\n\n const onAnnouncement = (event: Event) => {\n const { detail } = event as EIP6963AnnounceProviderEvent<BraveProvider>;\n if (detail.info.rdns === BRAVE_RDNS) {\n resolved = true;\n this.provider = detail.provider;\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n resolve(detail.provider);\n }\n };\n\n window.addEventListener('eip6963:announceProvider', onAnnouncement);\n window.dispatchEvent(new Event('eip6963:requestProvider'));\n\n // Timeout after 100ms - fall back to legacy detection\n setTimeout(() => {\n if (!resolved) {\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n const legacyProvider = this.detectLegacyProvider();\n if (legacyProvider) {\n this.provider = legacyProvider;\n }\n resolve(legacyProvider);\n }\n }, 100);\n });\n }\n\n /**\n * Fallback detection for legacy Brave Wallet detection.\n * Checks window.ethereum for Brave-specific flags.\n */\n private detectLegacyProvider(): BraveProvider | null {\n const ethereum = (window as unknown as { ethereum?: BraveProvider }).ethereum;\n if (ethereum?.isBraveWallet) {\n return ethereum;\n }\n return null;\n }\n\n isInstalled(): boolean {\n return Boolean(this.provider);\n }\n\n async connect(): Promise<WalletConnectionResult> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n sentryLogger.error('Brave Wallet is not available');\n throw new Error('Brave Wallet is not available');\n }\n\n try {\n // Force Brave Wallet to prompt for a fresh connection instead of returning cached accounts\n await this.provider.request({\n method: 'wallet_requestPermissions',\n params: [{ eth_accounts: {} }],\n });\n\n const accounts = await this.provider.request<string[]>({\n method: 'eth_requestAccounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('No accounts returned from Brave Wallet');\n throw new Error('No accounts returned from Brave Wallet');\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n throw new Error('Failed to connect to Brave Wallet');\n }\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n return null;\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to Brave Wallet', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {}\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n // Called by Aurum when user connects wallet\n // Passes Aurum.ts --> syncStateFromAccountsChanged() to handle the provider accounts changed event\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","import { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { sentryLogger } from '@src/services/sentry';\nimport { createConfigError } from '@src/utils/isConfigError';\nimport { SupportedProviders } from '@ledgerhq/connect-kit-loader';\nimport { mainnet } from 'viem/chains';\n\ninterface LedgerAdapterConfig {\n walletConnectProjectId?: string;\n}\n\nexport class LedgerAdapter implements WalletAdapter {\n readonly id = WalletId.Ledger;\n readonly name = WalletName.Ledger;\n readonly icon = getLogoDataUri(WalletId.Ledger, 'brand') ?? '';\n readonly hide = false;\n readonly downloadUrl = 'https://www.ledger.com/ledger-live';\n readonly wcDeepLinkUrl = 'ledgerlive://wc?uri=';\n\n private provider: AurumRpcProvider | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private walletConnectProjectId?: string;\n\n constructor(config?: LedgerAdapterConfig) {\n this.walletConnectProjectId = config?.walletConnectProjectId;\n }\n\n isInstalled(): boolean {\n return true;\n }\n\n async connect(): Promise<WalletConnectionResult> {\n try {\n if (!this.walletConnectProjectId) {\n throw createConfigError('Ledger');\n }\n\n const { loadConnectKit } = await import('@ledgerhq/connect-kit-loader');\n const connectKit = await loadConnectKit();\n\n connectKit.enableDebugLogs();\n\n connectKit.checkSupport({\n providerType: SupportedProviders.Ethereum,\n chainId: 1,\n walletConnectVersion: 2,\n projectId: this.walletConnectProjectId,\n rpc: { 1: mainnet.rpcUrls.default.http[0] },\n });\n\n this.provider = (await connectKit.getProvider()) as AurumRpcProvider;\n\n if (!this.provider) {\n sentryLogger.error('Failed to get Ledger provider');\n throw new Error('Failed to get Ledger provider');\n }\n\n const accounts = await this.provider.request<string[]>({\n method: 'eth_requestAccounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('No accounts returned from Ledger');\n throw new Error('No accounts returned from Ledger');\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n throw new Error('Failed to connect to Ledger');\n }\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n try {\n const { loadConnectKit } = await import('@ledgerhq/connect-kit-loader');\n const connectKit = await loadConnectKit();\n\n connectKit.checkSupport({\n providerType: SupportedProviders.Ethereum,\n chainId: 1,\n walletConnectVersion: 2,\n projectId: this.walletConnectProjectId,\n rpc: { 1: mainnet.rpcUrls.default.http[0] },\n });\n\n this.provider = (await connectKit.getProvider()) as AurumRpcProvider;\n\n if (!this.provider) {\n return null;\n }\n\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to Ledger', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n const provider = this.provider as AurumRpcProvider & { disconnect?: () => Promise<void> };\n if (provider?.disconnect) {\n await provider.disconnect();\n }\n this.provider = null;\n } catch (error) {\n sentryLogger.warn('Failed to disconnect from Ledger', { error });\n }\n }\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","import { WalletAdapter, WalletConnectionResult, EIP6963AnnounceProviderEvent } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { sentryLogger } from '@src/services/sentry';\n\nconst PHANTOM_RDNS = 'app.phantom';\n\ninterface PhantomProvider extends AurumRpcProvider {\n isPhantom: boolean;\n providers?: PhantomProvider[];\n}\n\nexport class PhantomAdapter implements WalletAdapter {\n readonly id = WalletId.Phantom;\n readonly name = WalletName.Phantom;\n readonly icon = getLogoDataUri(WalletId.Phantom, 'brand') ?? '';\n readonly hide = false;\n readonly downloadUrl = 'https://phantom.com/download';\n readonly wcDeepLinkUrl = 'phantom://wc?uri=';\n\n private provider: PhantomProvider | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private providerPromise: Promise<PhantomProvider | null> | null = null;\n\n constructor() {\n // Start EIP-6963 discovery immediately\n this.providerPromise = this.discoverProvider();\n }\n\n /**\n * Uses EIP-6963 to discover the Phantom provider by its RDNS identifier.\n * Falls back to window.phantom.ethereum for in-app browser support (Phantom Mobile).\n * This prevents other wallets from hijacking the connection.\n */\n private discoverProvider(): Promise<PhantomProvider | null> {\n if (typeof window === 'undefined') return Promise.resolve(null);\n\n return new Promise((resolve) => {\n let resolved = false;\n\n const onAnnouncement = (event: Event) => {\n const { detail } = event as EIP6963AnnounceProviderEvent<PhantomProvider>;\n if (detail.info.rdns === PHANTOM_RDNS) {\n resolved = true;\n this.provider = detail.provider;\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n resolve(detail.provider);\n }\n };\n\n window.addEventListener('eip6963:announceProvider', onAnnouncement);\n window.dispatchEvent(new Event('eip6963:requestProvider'));\n\n // Timeout after 100ms - fall back to legacy detection for in-app browsers\n setTimeout(() => {\n if (!resolved) {\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n const legacyProvider = this.detectLegacyProvider();\n if (legacyProvider) {\n this.provider = legacyProvider;\n }\n resolve(legacyProvider);\n }\n }, 100);\n });\n }\n\n /**\n * Fallback detection for in-app browsers (Phantom Mobile) that don't support EIP-6963.\n * Checks window.phantom.ethereum and window.ethereum for Phantom-specific flags.\n */\n private detectLegacyProvider(): PhantomProvider | null {\n // Phantom prefers window.phantom.ethereum namespace\n const phantom = (window as unknown as { phantom?: { ethereum?: PhantomProvider } }).phantom;\n if (phantom?.ethereum?.isPhantom) {\n return phantom.ethereum;\n }\n\n // Fallback to window.ethereum if Phantom is the only provider\n const ethereum = (window as unknown as { ethereum?: PhantomProvider }).ethereum;\n if (ethereum?.isPhantom) {\n return ethereum;\n }\n\n return null;\n }\n\n isInstalled(): boolean {\n return Boolean(this.provider);\n }\n\n async connect(): Promise<WalletConnectionResult> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n sentryLogger.error('Phantom is not available');\n throw new Error('Phantom is not available');\n }\n\n try {\n // Force Phantom to prompt for a fresh connection instead of returning cached accounts\n await this.provider.request({\n method: 'wallet_requestPermissions',\n params: [{ eth_accounts: {} }],\n });\n\n const accounts = await this.provider.request<string[]>({\n method: 'eth_requestAccounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('No accounts returned from Phantom');\n throw new Error('No accounts returned from Phantom');\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n throw new Error('Failed to connect to Phantom');\n }\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n return null;\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to Phantom', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {}\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n // Called by Aurum when user connects wallet\n // Passes Aurum.ts --> syncStateFromAccountsChanged() to handle the provider accounts changed event\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","import { createCoinbaseWalletSDK } from '@coinbase/wallet-sdk';\nimport { sentryLogger } from '@src/services/sentry';\nimport { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\n\ninterface CoinbaseProvider extends AurumRpcProvider {\n isWalletLink?: boolean;\n isCoinbaseWallet?: boolean;\n selectedAddress?: string | null;\n close?: () => Promise<void>;\n disconnect?: () => Promise<void>;\n}\n\nexport class CoinbaseWalletAdapter implements WalletAdapter {\n readonly id = WalletId.CoinbaseWallet;\n readonly name = WalletName.CoinbaseWallet;\n readonly icon = getLogoDataUri(WalletId.CoinbaseWallet, 'brand') ?? '';\n readonly hide = false;\n readonly downloadUrl = 'https://www.coinbase.com/wallet/downloads';\n readonly wcDeepLinkUrl = 'cbwallet://wc?uri=';\n\n private provider: CoinbaseProvider | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n\n constructor({ appName, appLogoUrl }: { appName: string; appLogoUrl?: string }) {\n this.provider = this.detectProvider({ appName, appLogoUrl });\n }\n\n private detectProvider({ appName, appLogoUrl }: { appName: string; appLogoUrl?: string }): CoinbaseProvider | null {\n if (typeof window === 'undefined') return null;\n\n try {\n const coinbaseSdk = createCoinbaseWalletSDK({\n appName,\n appLogoUrl,\n });\n\n return coinbaseSdk.getProvider() as CoinbaseProvider;\n } catch (error) {\n sentryLogger.warn('Failed to initialize Coinbase Wallet provider', { error });\n return null;\n }\n }\n\n isInstalled(): boolean {\n return Boolean(this.provider);\n }\n\n async connect(): Promise<WalletConnectionResult> {\n if (!this.isInstalled() || !this.provider) {\n sentryLogger.error('Coinbase Wallet is not available');\n throw new Error('Coinbase Wallet is not available');\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_requestAccounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('No accounts returned from Coinbase Wallet');\n throw new Error('No accounts returned from Coinbase Wallet');\n }\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n throw new Error('Failed to connect to Coinbase Wallet');\n }\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n if (!this.isInstalled() || !this.provider) {\n return null;\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to Coinbase Wallet', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n if (this.provider?.close) {\n await this.provider.close();\n } else if (this.provider?.disconnect) {\n await this.provider.disconnect();\n }\n } catch (error) {\n sentryLogger.warn('Error disconnecting from Coinbase Wallet', { error });\n } finally {\n this.clearLocalStorage();\n }\n }\n\n private clearLocalStorage(): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n\n const keysToRemove: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (\n key &&\n (key.startsWith('-walletlink') ||\n key.startsWith('-CBWSDK') ||\n key.startsWith('walletlink:') ||\n key.startsWith('CBWSDK:'))\n ) {\n keysToRemove.push(key);\n }\n }\n\n keysToRemove.forEach((key) => {\n localStorage.removeItem(key);\n });\n }\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n // Called by Aurum when user connects wallet\n // Passes Aurum.ts --> syncStateFromAccountsChanged() to handle the provider accounts changed event\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","import { WalletAdapter, WalletConnectionResult, EIP6963AnnounceProviderEvent } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { sentryLogger } from '@src/services/sentry';\n\nconst METAMASK_RDNS = 'io.metamask';\n\ninterface MetaMaskProvider extends AurumRpcProvider {\n isMetaMask: boolean;\n isBraveWallet: boolean;\n providers?: MetaMaskProvider[];\n}\n\nexport class MetaMaskAdapter implements WalletAdapter {\n readonly id = WalletId.MetaMask;\n readonly name = WalletName.MetaMask;\n readonly icon = getLogoDataUri(WalletId.MetaMask, 'brand') ?? '';\n readonly hide = false;\n readonly downloadUrl = 'https://metamask.io/download';\n readonly wcDeepLinkUrl = 'metamask://wc?uri=';\n\n private provider: MetaMaskProvider | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private providerPromise: Promise<MetaMaskProvider | null> | null = null;\n\n constructor() {\n // Start EIP-6963 discovery immediately\n this.providerPromise = this.discoverProvider();\n }\n\n /**\n * Uses EIP-6963 to discover the MetaMask provider by its RDNS identifier.\n * Falls back to window.ethereum for in-app browser support (MetaMask Mobile).\n * This prevents other wallets (like Rabby) from hijacking the connection.\n */\n private discoverProvider(): Promise<MetaMaskProvider | null> {\n if (typeof window === 'undefined') return Promise.resolve(null);\n\n return new Promise((resolve) => {\n let resolved = false;\n\n const onAnnouncement = (event: Event) => {\n const { detail } = event as EIP6963AnnounceProviderEvent<MetaMaskProvider>;\n if (detail.info.rdns === METAMASK_RDNS) {\n resolved = true;\n this.provider = detail.provider;\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n resolve(detail.provider);\n }\n };\n\n window.addEventListener('eip6963:announceProvider', onAnnouncement);\n window.dispatchEvent(new Event('eip6963:requestProvider'));\n\n // Timeout after 100ms - fall back to legacy window.ethereum for in-app browsers\n setTimeout(() => {\n if (!resolved) {\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n const legacyProvider = this.detectLegacyProvider();\n if (legacyProvider) {\n this.provider = legacyProvider;\n }\n resolve(legacyProvider);\n }\n }, 100);\n });\n }\n\n /**\n * Fallback detection for in-app browsers (MetaMask Mobile) that don't support EIP-6963.\n * Checks window.ethereum for MetaMask-specific flags.\n */\n private detectLegacyProvider(): MetaMaskProvider | null {\n const ethereum = (window as unknown as { ethereum?: MetaMaskProvider }).ethereum;\n if (!ethereum) return null;\n\n // Check providers array first (multiple wallets installed)\n if (ethereum.providers?.length) {\n const metaMaskProvider = ethereum.providers.find((p) => p.isMetaMask && !p.isBraveWallet);\n if (metaMaskProvider) return metaMaskProvider;\n }\n\n // Single provider - check if it's MetaMask (and not Brave masquerading)\n if (ethereum.isMetaMask && !ethereum.isBraveWallet) {\n return ethereum;\n }\n\n return null;\n }\n\n isInstalled(): boolean {\n return Boolean(this.provider);\n }\n\n async connect(): Promise<WalletConnectionResult> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n sentryLogger.error('MetaMask is not available');\n throw new Error('MetaMask is not available');\n }\n\n try {\n // Force MetaMask to prompt for a fresh connection instead of returning cached accounts\n await this.provider.request({\n method: 'wallet_requestPermissions',\n params: [{ eth_accounts: {} }],\n });\n\n const accounts = await this.provider.request<string[]>({\n method: 'eth_requestAccounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('No accounts returned from MetaMask');\n throw new Error('No accounts returned from MetaMask');\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n throw new Error('Failed to connect to MetaMask');\n }\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n return null;\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to MetaMask', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {}\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n // Called by Aurum when user connects wallet\n // Passes Aurum.ts --> syncStateFromAccountsChanged() to handle the provider accounts changed event\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","import type { EthereumProvider } from '@walletconnect/ethereum-provider';\nimport { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { sentryLogger } from '@src/services/sentry';\nimport { createConfigError } from '@src/utils/isConfigError';\n\ntype WalletConnectProvider = Awaited<ReturnType<typeof EthereumProvider.init>>;\n\ninterface WalletConnectConfig {\n projectId?: string;\n appName: string;\n}\n\nexport interface WalletConnectSession {\n uri: string;\n waitForConnection: () => Promise<WalletConnectionResult>;\n}\n\nexport class WalletConnectAdapter implements WalletAdapter {\n readonly id = WalletId.WalletConnect;\n readonly name = WalletName.WalletConnect;\n readonly icon = getLogoDataUri(WalletId.WalletConnect, 'brand') ?? '';\n readonly hide = false;\n readonly downloadUrl = null;\n readonly wcDeepLinkUrl = null;\n\n private provider: WalletConnectProvider | null = null;\n private config: WalletConnectConfig;\n private connectionUri: string | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private initPromise: Promise<void> | null = null;\n\n constructor(config: WalletConnectConfig) {\n this.config = {\n projectId: config.projectId,\n appName: config.appName,\n };\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.provider) return;\n if (!this.initPromise) {\n this.initPromise = this.initializeProvider();\n }\n await this.initPromise;\n }\n\n private async initializeProvider(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const { EthereumProvider } = await import('@walletconnect/ethereum-provider');\n\n this.provider = await EthereumProvider.init({\n projectId: this.config.projectId ?? '',\n optionalChains: [1],\n showQrModal: false,\n metadata: {\n name: this.config.appName,\n description: this.config.appName,\n url: window.location.origin,\n icons: [],\n },\n });\n\n this.provider.on('display_uri', (uri) => {\n this.connectionUri = uri;\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('walletconnect:uri', { detail: { uri } }));\n }\n });\n\n this.provider.on('connect', (session) => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('walletconnect:connect', { detail: { session } }));\n }\n });\n\n this.provider.on('disconnect', () => {\n this.connectionUri = null;\n });\n\n this.provider.on('session_delete', () => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('walletconnect:disconnect'));\n }\n });\n }\n\n isInstalled(): boolean {\n return true;\n }\n\n async connect(): Promise<WalletConnectionResult> {\n if (!this.config.projectId) {\n throw createConfigError('WalletConnect');\n }\n\n try {\n await this.ensureInitialized();\n\n if (!this.provider) {\n sentryLogger.error('connect: WalletConnect is not available');\n throw new Error('WalletConnect is not available');\n }\n\n const accounts = await this.provider.enable();\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('connect: No accounts returned from WalletConnect');\n throw new Error('No accounts returned from WalletConnect');\n }\n\n return {\n address: accounts[0],\n provider: this.provider as unknown as AurumRpcProvider,\n walletId: this.id,\n };\n } catch {\n this.connectionUri = null;\n throw new Error('Failed to connect to WalletConnect');\n }\n }\n\n getConnectionUri(): string | null {\n return this.connectionUri;\n }\n\n /**\n * Starts a WalletConnect session for headless/custom QR code flows.\n * Returns the URI immediately and a function to wait for the connection.\n */\n async startSession(timeout = 10000): Promise<WalletConnectSession> {\n if (!this.config.projectId) {\n throw new Error('WalletConnect projectId is required');\n }\n\n await this.ensureInitialized();\n\n if (!this.provider) {\n sentryLogger.error('startSession: WalletConnect is not available');\n throw new Error('WalletConnect is not available');\n }\n\n // Reset state for fresh connection\n this.connectionUri = null;\n\n // Create a promise that resolves when URI is generated\n const uriPromise = new Promise<string>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error('Timeout waiting for WalletConnect URI'));\n }, timeout);\n\n // Use 'once' to listen for single URI event\n (this.provider as WalletConnectProvider).once('display_uri', (uri: string) => {\n clearTimeout(timeoutId);\n this.connectionUri = uri;\n resolve(uri);\n });\n });\n\n // Start connection process (triggers display_uri, then waits for user approval)\n const connectionPromise = (async (): Promise<WalletConnectionResult> => {\n const accounts = await (this.provider as WalletConnectProvider).enable();\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('startSession: No accounts returned from WalletConnect');\n throw new Error('No accounts returned from WalletConnect');\n }\n return {\n address: accounts[0],\n provider: this.provider as unknown as AurumRpcProvider,\n walletId: this.id,\n };\n })();\n\n // Wait for URI to be generated\n const uri = await uriPromise;\n\n return {\n uri,\n waitForConnection: async () => {\n try {\n return await connectionPromise;\n } catch {\n this.connectionUri = null;\n throw new Error('Failed to connect via WalletConnect');\n }\n },\n };\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n try {\n await this.ensureInitialized();\n\n if (!this.provider) {\n return null;\n }\n\n const accounts = this.provider.accounts;\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider as unknown as AurumRpcProvider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to WalletConnect', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n if (this.provider) {\n await this.provider.disconnect();\n }\n } finally {\n this.connectionUri = null;\n this.provider = null;\n this.initPromise = null;\n }\n }\n\n getProvider(): AurumRpcProvider | null {\n return this.provider as unknown as AurumRpcProvider | null;\n }\n\n // Called by Aurum when user connects wallet\n // Passes Aurum.ts --> syncStateFromAccountsChanged() to handle the provider accounts changed event\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","import { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport type { SignInWithEmailResult, VerifyEmailOTPResult } from '@coinbase/cdp-core';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport type { Transport, PublicClient, Chain } from 'viem';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { sentryLogger } from '@src/services/sentry';\nimport { createConfigError } from '@src/utils/isConfigError';\n\ninterface EmailProvider extends AurumRpcProvider {\n selectedAddress?: string | null;\n close?: () => Promise<void>;\n disconnect?: () => Promise<void>;\n}\n\ninterface EmailAdapterConfig {\n projectId?: string;\n}\n\nexport class EmailAdapter implements WalletAdapter {\n readonly id = WalletId.Email;\n readonly name = WalletName.Email;\n readonly icon = getLogoDataUri(WalletId.Email, 'brand') ?? '';\n readonly hide = true;\n readonly downloadUrl = null;\n readonly wcDeepLinkUrl = null;\n\n private provider: EmailProvider | null = null;\n private initPromise: Promise<void> | null = null;\n private publicClientCache: Map<number, PublicClient> = new Map();\n private projectId: string;\n\n // Static variables - computed once across all instances\n private static chainIdMap: Map<number, Chain> | null = null;\n private static viemChains: Chain[] | null = null;\n private static viemTransports: Record<number, Transport> | null = null;\n\n constructor(config?: EmailAdapterConfig) {\n this.projectId = config?.projectId || '';\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.provider) return;\n if (!this.initPromise) {\n this.initPromise = this.initializeProvider();\n }\n await this.initPromise;\n }\n\n isInstalled(): boolean {\n return true;\n }\n\n async emailAuthStart(email: string): Promise<SignInWithEmailResult> {\n if (!this.projectId) {\n throw createConfigError('Email');\n }\n\n await this.ensureInitialized();\n\n if (!this.provider) {\n sentryLogger.error('Email is not available');\n throw new Error('Email is not available');\n }\n\n try {\n const { signInWithEmail } = await import('@coinbase/cdp-core');\n const authResult = await signInWithEmail({ email });\n return authResult;\n } catch (error) {\n sentryLogger.error('Failed to start email authentication', { error });\n throw error;\n }\n }\n\n async emailAuthVerify(flowId: string, otp: string): Promise<VerifyEmailOTPResult> {\n if (!flowId || !otp) {\n throw new Error('flowId and otp are required');\n }\n\n await this.ensureInitialized();\n if (!this.provider) {\n sentryLogger.error('Email provider not initialized');\n throw new Error('Email provider not initialized');\n }\n\n const { verifyEmailOTP } = await import('@coinbase/cdp-core');\n return verifyEmailOTP({ flowId, otp });\n }\n\n async connect(): Promise<WalletConnectionResult> {\n sentryLogger.error('EmailAdapter.connect() is not implemented');\n throw new Error('EmailAdapter.connect() is not implemented');\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n await this.ensureInitialized();\n\n if (!this.provider) {\n return null;\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to Email', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.ensureInitialized();\n const { signOut } = await import('@coinbase/cdp-core');\n await signOut();\n } catch {\n // no-op - if user is not logged in, this is expected to throw an error\n }\n }\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n private static async initializeChainData(): Promise<void> {\n if (this.chainIdMap !== null) return; // Already initialized\n\n const [allChains, { http }] = await Promise.all([import('viem/chains'), import('viem')]);\n\n const chains = Object.values(allChains).filter(\n (chain) => typeof chain === 'object' && chain !== null && 'id' in chain,\n ) as Chain[];\n\n this.chainIdMap = new Map(chains.map((chain) => [chain.id, chain]));\n\n this.viemChains = chains;\n this.viemTransports = chains.reduce(\n (acc, chain) => {\n acc[chain.id] = http() as Transport;\n return acc;\n },\n {} as Record<number, Transport>,\n );\n }\n\n private async getPublicClientForChain(chainId: number): Promise<PublicClient> {\n if (this.publicClientCache.has(chainId)) {\n return this.publicClientCache.get(chainId)!;\n }\n\n await EmailAdapter.initializeChainData();\n\n const viemChain = EmailAdapter.chainIdMap!.get(chainId);\n if (!viemChain) {\n throw new Error(`Chain ${chainId} not supported`);\n }\n\n const { createPublicClient, http } = await import('viem');\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(),\n });\n\n this.publicClientCache.set(chainId, publicClient);\n return publicClient;\n }\n\n /**\n * Initializes CDP and creates the provider.\n * Called by ensureInitialized() - deduplication handled via initPromise.\n */\n private async initializeProvider(): Promise<void> {\n const { initialize } = await import('@coinbase/cdp-core');\n\n await initialize({\n projectId: this.projectId,\n ethereum: {\n createOnLogin: 'eoa',\n },\n });\n\n this.provider = await this.createProvider();\n }\n\n /**\n * Special case:\n * Coinbase default provider does not support generic read methods like eth_getBalance.\n * Wraps the provider to send unsupported methods to a public RPC endpoint.\n */\n private async createProvider(): Promise<EmailProvider | null> {\n try {\n await EmailAdapter.initializeChainData();\n\n const { createCDPEmbeddedWallet } = await import('@coinbase/cdp-core');\n\n const wallet = createCDPEmbeddedWallet({\n chains: EmailAdapter.viemChains as [Chain, ...Chain[]],\n transports: EmailAdapter.viemTransports as Record<number, Transport>,\n });\n\n const base = wallet.provider as EmailProvider;\n const getPublicClient = this.getPublicClientForChain.bind(this);\n\n const wrapped: EmailProvider = {\n ...base,\n async request<T = unknown>(args: { method: string; params?: unknown[] | object }): Promise<T> {\n try {\n return await base.request<T>(args);\n } catch (err: unknown) {\n const msg = String((err as Error)?.message || '');\n const isUnsupported =\n msg.includes('not supported') ||\n msg.includes('Unsupported') ||\n (err as { code?: number })?.code === -32601;\n\n if (isUnsupported) {\n // Get current chainId to use the correct RPC endpoint\n let chainId: number;\n try {\n const chainIdHex = await base.request<string>({ method: 'eth_chainId', params: [] });\n chainId = parseInt(chainIdHex, 16);\n } catch {\n sentryLogger.error('Failed to get chainId for fallback request');\n throw new Error('Failed to get chainId for fallback request');\n }\n\n // Get or create publicClient for this chain\n const publicClient = await getPublicClient(chainId);\n\n return (await publicClient.transport.request({\n method: args.method as unknown as string,\n params: Array.isArray(args.params)\n ? (args.params as unknown[])\n : args.params\n ? [args.params as unknown]\n : undefined,\n })) as T;\n }\n throw err;\n }\n },\n };\n\n return wrapped;\n } catch (error) {\n sentryLogger.error('Failed to initialize Email provider', { error });\n return null;\n }\n }\n\n // Email wallets don't support account switching - user must re-authenticate to change accounts\n onAccountsChanged(): void {}\n removeListeners(): void {}\n}\n","import { WalletAdapter } from '@src/types/internal';\nimport { WalletsConfig } from '@aurum-sdk/types';\nimport {\n AppKitAdapter,\n RabbyAdapter,\n BraveAdapter,\n LedgerAdapter,\n PhantomAdapter,\n CoinbaseWalletAdapter,\n MetaMaskAdapter,\n WalletConnectAdapter,\n EmailAdapter,\n} from '@src/wallet-adapters';\n\ninterface CreateWalletAdaptersParams {\n walletsConfig?: WalletsConfig;\n appName: string;\n appLogoUrl?: string;\n modalZIndex: number;\n theme: 'light' | 'dark';\n}\n\n/**\n * Creates all wallet adapters with the provided configuration.\n * Filtering (via `wallets.exclude`) is handled at render time in AurumCore.\n */\nexport function createWalletAdapters({\n walletsConfig,\n appName,\n appLogoUrl,\n modalZIndex,\n theme,\n}: CreateWalletAdaptersParams): WalletAdapter[] {\n return [\n new EmailAdapter({ projectId: walletsConfig?.email?.projectId }),\n new MetaMaskAdapter(),\n new WalletConnectAdapter({ projectId: walletsConfig?.walletConnect?.projectId, appName }),\n new CoinbaseWalletAdapter({ appName, appLogoUrl }),\n new PhantomAdapter(),\n new RabbyAdapter(),\n new BraveAdapter(),\n new LedgerAdapter({ walletConnectProjectId: walletsConfig?.walletConnect?.projectId }),\n new AppKitAdapter({ projectId: walletsConfig?.walletConnect?.projectId, appName, modalZIndex, theme }),\n ];\n}\n","import type { AurumRpcProvider } from '@aurum-sdk/types';\n\n/**\n * RpcProvider acts as a default provider when no wallet is connected.\n * It accepts eth_requestAccounts to prompt the wallet modal to connect.\n * It accepts eth_accounts and returns [].\n * It rejects all other methods.\n */\nexport class RpcProvider implements AurumRpcProvider {\n readonly isConnected = false;\n readonly chainId = '0x1';\n readonly networkVersion = '1';\n readonly selectedAddress = null;\n\n private handleConnect: () => Promise<string>;\n\n constructor(handleConnect: () => Promise<string>) {\n this.handleConnect = handleConnect;\n }\n\n async request<T = unknown>(args: { method: string; params?: unknown[] | object }): Promise<T> {\n const { method } = args;\n\n switch (method) {\n // Account methods - return empty when not connected\n case 'eth_accounts':\n return [] as T;\n\n // Trigger connection flow\n case 'enable':\n case 'eth_requestAccounts':\n if (this.handleConnect) {\n const address = await this.handleConnect();\n return [address] as T;\n } else {\n throw new Error('No wallet connection available. Please use aurum.connect() instead.');\n }\n\n // Chain/network information\n case 'eth_chainId':\n return this.chainId as T;\n\n case 'net_version':\n return this.networkVersion as T;\n\n // Default case for rest of methods\n default:\n throw new Error(\n `Method ${method} requires an active connection to a JSON-RPC provider. Please connect a wallet.`,\n );\n }\n }\n\n // No-op: disconnected provider doesn't emit events\n on(): void {}\n\n // No-op: disconnected provider doesn't manage listeners\n removeListener(): void {}\n\n // No listeners to notify in disconnected state\n emit(): boolean {\n return false;\n }\n}\n","import { Chain } from 'viem';\nimport { AurumCore } from '@src/AurumCore';\nimport type { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport type {\n UserInfo,\n AurumRpcProvider,\n AurumConfig,\n NonNullableBrandConfig,\n WalletsConfig,\n WalletId,\n EmailAuthStartResult,\n EmailAuthVerifyResult,\n WalletConnectSessionResult,\n} from '@aurum-sdk/types';\n\n/**\n * Aurum SDK - Web3 Wallet Integration Library\n */\n\nexport class Aurum {\n private core: AurumCore;\n\n /**\n * Creates a new Aurum instance.\n *\n * @param config - Configuration for branding and wallets\n *\n * @example\n * ```typescript\n * const aurum = new Aurum({\n * brand: { appName: 'Your App Name' },\n * wallets: {\n * email: { projectId: 'cdp-project-id' },\n * walletConnect: { projectId: 'reown-project-id' },\n * },\n * });\n * ```\n */\n constructor(config: AurumConfig) {\n this.core = new AurumCore(config);\n }\n\n /**\n * EIP1193 compatible RPC provider that can be used to interact with the connected wallet.\n * Compatible with viem, ethers.js, and other web3 libraries.\n *\n * @example\n * ```typescript\n * const balance = await aurum.rpcProvider.request({\n * method: 'eth_getBalance',\n * params: [address, 'latest']\n * });\n * ```\n */\n public get rpcProvider(): AurumRpcProvider {\n return this.core.rpcProvider;\n }\n\n /**\n * Indicates whether the SDK is finished initializing.\n */\n public get ready(): boolean {\n return this.core.ready;\n }\n\n /**\n * Returns the resolved brand configuration.\n * @internal Used by widget components (i.e. ConnectWidget)\n */\n public get brandConfig(): NonNullableBrandConfig {\n return this.core.resolvedBrandConfig;\n }\n\n /**\n * Returns the wallet adapters configured for this instance.\n * @internal Used by widget components (i.e. ConnectWidget)\n */\n public get walletAdapters(): WalletAdapter[] {\n return this.core.walletAdapters;\n }\n\n /**\n * Returns the set of excluded wallet IDs.\n * @internal Used by widget components (i.e. ConnectWidget)\n */\n public get excludedWalletIds(): Set<WalletId> {\n return this.core.excludedWalletIds;\n }\n\n /**\n * Waits for the SDK to finish initializing.\n * This should be called before calling methods with the provider to ensure provider is set (such as after a page refresh).\n *\n * @example\n * ```typescript\n * await aurum.whenReady();\n * const balance = await aurum.rpcProvider.request({\n * method: 'eth_getBalance',\n * params: [address, 'latest']\n * });\n * ```\n */\n public async whenReady(): Promise<void> {\n return this.core.whenReady();\n }\n\n /**\n * Opens the wallet connection modal or connects directly to a specific wallet.\n *\n * @param walletId - Optional wallet ID for direct connection (bypasses modal).\n * Cannot be 'email' or 'walletconnect' (use their dedicated methods).\n * @returns The connected wallet address\n * @throws Error if user closes the modal without connecting a wallet\n *\n * @example\n * ```typescript\n * // Open modal for user to choose\n * const address = await aurum.connect();\n *\n * // Or connect directly to a specific wallet\n * import { WalletId } from '@aurum-sdk/types';\n * const address = await aurum.connect(WalletId.MetaMask);\n * ```\n */\n public async connect(walletId?: WalletId): Promise<`0x${string}`> {\n return this.core.connect(walletId);\n }\n\n /**\n * Disconnects the currently connected wallet and clears the connection state.\n *\n * @example\n * ```typescript\n * await aurum.disconnect();\n * ```\n */\n public async disconnect(): Promise<void> {\n return this.core.disconnect();\n }\n\n /**\n * Gets information about the currently connected user.\n *\n * @returns User information including wallet address and wallet name, or undefined if no wallet is connected\n *\n * @example\n * ```typescript\n * const userInfo = await aurum.getUserInfo();\n * if (userInfo) {\n * console.log(`Connected to ${userInfo.walletName}: ${userInfo.publicAddress}`);\n * } else {\n * console.log('No wallet connected');\n * }\n * ```\n */\n public async getUserInfo(): Promise<UserInfo | undefined> {\n return this.core.getUserInfo();\n }\n\n /**\n * Checks if a wallet is currently connected.\n *\n * @returns `true` if a wallet is connected, `false` otherwise\n *\n * @example\n * ```typescript\n * const isConnected = await aurum.isConnected();\n * console.log('Is user connected:', isConnected);\n * ```\n */\n public async isConnected(): Promise<boolean> {\n return this.core.isConnected();\n }\n\n /**\n * Gets the current chain ID of the connected wallet.\n *\n * @returns The current chain ID as a number\n *\n * @example\n * ```typescript\n * const chainId = await aurum.getChainId();\n * console.log('Connected to chain:', chainId);\n * ```\n */\n public async getChainId(): Promise<number> {\n return this.core.getChainId();\n }\n\n /**\n * Switches the connected wallet to a different blockchain network.\n * If the chain is not added to the wallet, it will attempt to add it using the provided chain config.\n *\n * @param chainId - The chain ID to switch to (can be hex string, decimal string, or number)\n * @param chain - Optional viem Chain object with chain configuration (required if chain needs to be added)\n * @throws Error if the switch fails or the user rejects the request\n *\n * @example\n * ```typescript\n * import { sepolia } from 'viem/chains';\n *\n * await aurum.switchChain(sepolia.id, sepolia);\n * ```\n */\n public async switchChain(chainId: `0x${string}` | string | number, chain?: Chain): Promise<void> {\n return this.core.switchChain(chainId, chain);\n }\n\n /**\n * Updates the brand configuration at runtime.\n * Changes will be reflected the next time the connect modal is opened.\n *\n * @param newConfig - Partial brand config to merge with existing config\n *\n * @example\n * ```typescript\n * aurum.updateBrandConfig({\n * theme: 'light',\n * });\n * ```\n */\n public updateBrandConfig(newConfig: Partial<NonNullableBrandConfig>): void {\n this.core.updateBrandConfig(newConfig);\n }\n\n /**\n * Updates the wallets configuration at runtime.\n * Changes will be reflected the next time the connect modal is opened.\n *\n * @param newConfig - Partial wallets config to update (currently supports `exclude`)\n *\n * @example\n * ```typescript\n * import { WalletId } from '@aurum-sdk/types';\n *\n * aurum.updateWalletsConfig({\n * exclude: [WalletId.Email, WalletId.AppKit],\n * });\n * ```\n */\n public updateWalletsConfig(newConfig: Partial<Pick<WalletsConfig, 'exclude'>>): void {\n this.core.updateWalletsConfig(newConfig);\n }\n\n /**\n * Notifies the SDK of a widget-initiated connection.\n * Updates internal state so getUserInfo(), isConnected(), etc. work correctly.\n * @internal Used by ConnectWidget - not intended for direct use\n */\n public async handleWidgetConnection(result: WalletConnectionResult): Promise<void> {\n return this.core.handleWidgetConnection(result);\n }\n\n /* ===== HEADLESS / WHITELABEL API ===== */\n\n /**\n * Starts the email authentication flow by sending an OTP to the provided email.\n * Use with `emailAuthVerify()` to complete the connection.\n *\n * @param email - The email address to send the OTP to\n * @returns Object containing flowId to use with emailAuthVerify\n * @throws Error if email wallet is not configured\n *\n * @example\n * ```typescript\n * const { flowId } = await aurum.emailAuthStart('user@example.com');\n * // User receives OTP email, then verify:\n * const { address, email, isNewUser } = await aurum.emailAuthVerify(flowId, '123456');\n * ```\n */\n public async emailAuthStart(email: string): Promise<EmailAuthStartResult> {\n return this.core.emailAuthStart(email);\n }\n\n /**\n * Verifies the email OTP and completes the wallet connection.\n *\n * @param flowId - The flowId returned from emailAuthStart\n * @param otp - The OTP code the user received via email\n * @returns Object containing the connected address and email\n * @throws Error if verification fails\n *\n * @example\n * ```typescript\n * const { flowId } = await aurum.emailAuthStart('user@example.com');\n * // User receives OTP...\n * const { address, email, isNewUser } = await aurum.emailAuthVerify(flowId, '123456');\n * console.log(`Connected: ${address} (${email})`);\n * ```\n */\n public async emailAuthVerify(flowId: string, otp: string): Promise<EmailAuthVerifyResult> {\n return this.core.emailAuthVerify(flowId, otp);\n }\n\n /**\n * Initiates a WalletConnect session and returns the URI for displaying a custom QR code.\n * Use this for building custom QR code UIs instead of using the built-in modal.\n *\n * @returns Object containing the URI and a function to wait for the connection\n * @throws Error if WalletConnect is not configured\n *\n * @example\n * ```typescript\n * // Get the WalletConnect URI\n * const { uri, waitForConnection } = await aurum.getWalletConnectSession();\n *\n * // Display your custom QR code with the URI\n * myQRCodeComponent.render(uri);\n *\n * // Wait for user to scan and approve\n * const address = await waitForConnection();\n * console.log('Connected:', address);\n * ```\n */\n public async getWalletConnectSession(): Promise<WalletConnectSessionResult> {\n return this.core.getWalletConnectSession();\n }\n}\n"],"mappings":"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","names":["jsx","WalletId","WalletId","mainnet","getLogoDataUri","WalletId","WalletName","WalletId","WalletName","getLogoDataUri","getLogoDataUri","WalletId","WalletName","WalletId","WalletName","getLogoDataUri","getLogoDataUri","WalletId","WalletName","WalletId","WalletName","getLogoDataUri","getLogoDataUri","WalletId","WalletName","WalletId","WalletName","getLogoDataUri","getLogoDataUri","WalletId","WalletName","getLogoDataUri","WalletId","WalletName","WalletId","WalletName","getLogoDataUri","getLogoDataUri","WalletId","WalletName","WalletId","WalletName","getLogoDataUri","uri","WalletId","WalletName","getLogoDataUri","WalletId","WalletName","getLogoDataUri","WalletId","WalletId"]}
1
+ {"version":3,"sources":["../src/AurumCore.ts","../src/utils/chainHelpers.ts","../src/components/ConnectModal/ModalShell.tsx","../src/utils/createModalContainer.ts","../src/utils/createShadowRoot.ts","../src/components/ConnectModal/renderConnectModal.tsx","../src/wallet-adapters/AppKitAdapter.ts","../src/wallet-adapters/RabbyAdapter.ts","../src/wallet-adapters/BraveAdapter.ts","../src/utils/platform/isBraveBrowser.ts","../src/wallet-adapters/LedgerAdapter.ts","../src/wallet-adapters/PhantomAdapter.ts","../src/wallet-adapters/CoinbaseWalletAdapter.ts","../src/wallet-adapters/MetaMaskAdapter.ts","../src/wallet-adapters/WalletConnectAdapter.ts","../src/wallet-adapters/EmailAdapter.ts","../src/utils/createWalletAdapters.ts","../src/providers/RpcProvider.ts","../src/Aurum.ts"],"sourcesContent":["import { Chain, checksumAddress } from 'viem';\nimport { useAurumStore, waitForStoreHydration } from '@src/store';\nimport { normalizeChainId, isChainNotAddedError, isChainExistsError } from '@src/utils/chainHelpers';\nimport { renderConnectModal } from '@src/components/ConnectModal/renderConnectModal';\nimport { DEFAULT_THEME, getDefaultThemeConfig } from '@src/constants/theme';\nimport { createWalletAdapters } from '@src/utils/createWalletAdapters';\nimport type { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport type {\n UserInfo,\n AurumRpcProvider,\n AurumConfig,\n NonNullableBrandConfig,\n WalletsConfig,\n WalletName,\n EmailAuthStartResult,\n EmailAuthVerifyResult,\n WalletConnectSessionResult,\n} from '@aurum-sdk/types';\nimport { WalletId } from '@aurum-sdk/types';\nimport { RpcProvider } from '@src/providers/RpcProvider';\nimport { initSentry, sentryLogger } from '@src/services/sentry';\nimport { WalletConnectAdapter } from '@src/wallet-adapters/WalletConnectAdapter';\nimport { EmailAdapter } from '@src/wallet-adapters/EmailAdapter';\n\nexport class AurumCore {\n // Singleton instance\n private static instance: AurumCore | null = null;\n\n // Events managed by AurumCore (not forwarded to underlying provider)\n private static readonly MANAGED_EVENTS = ['accountsChanged', 'connect', 'disconnect'];\n\n // Current RPC provider (proxy that always points to current provider)\n public rpcProvider!: AurumRpcProvider;\n\n // `true` once we have restored the connection state\n public ready: boolean = false;\n\n private wallets!: WalletAdapter[];\n private excludedWallets!: Set<WalletId>;\n private readyPromise!: Promise<void>;\n private brandConfig!: NonNullableBrandConfig;\n private userInfo: UserInfo | undefined = undefined;\n private connectedWalletAdapter: WalletAdapter | null = null;\n\n // Minimal provider that satisfies EIP-1193 to use when no wallet is connected\n private skeletonProvider!: AurumRpcProvider;\n private currentProvider!: AurumRpcProvider;\n private eventListeners: Map<string, Set<(...args: unknown[]) => void>> = new Map();\n\n constructor(config: AurumConfig) {\n if (AurumCore.instance) {\n return AurumCore.instance;\n }\n\n const telemetryEnabled = config.telemetry !== false;\n initSentry(telemetryEnabled);\n\n this.brandConfig = this.resolveBrandConfig(config);\n this.excludedWallets = new Set((config.wallets?.exclude as WalletId[]) ?? []);\n this.wallets = createWalletAdapters({\n walletsConfig: config.wallets,\n appName: this.brandConfig.appName,\n appLogoUrl: this.brandConfig.logo,\n modalZIndex: this.brandConfig.modalZIndex,\n theme: this.brandConfig.theme,\n });\n\n this.skeletonProvider = new RpcProvider(() => this.connect());\n this.currentProvider = this.skeletonProvider;\n this.rpcProvider = this.createProviderProxy();\n\n this.readyPromise = this.tryRestoreConnection();\n\n AurumCore.instance = this;\n }\n\n public async whenReady(): Promise<void> {\n try {\n await this.readyPromise;\n } catch {\n this.resetConnectionState();\n this.ready = true;\n }\n }\n\n public get resolvedBrandConfig(): NonNullableBrandConfig {\n return this.brandConfig;\n }\n\n public get walletAdapters(): WalletAdapter[] {\n return this.wallets;\n }\n\n public get excludedWalletIds(): Set<WalletId> {\n return this.excludedWallets;\n }\n\n public async connect(walletId?: WalletId): Promise<`0x${string}`> {\n await this.whenReady();\n\n if (walletId === 'email') {\n throw new Error('Use emailAuthStart() and emailAuthVerify() for email wallet connections');\n }\n if (walletId === 'walletconnect') {\n throw new Error('Use getWalletConnectSession() for WalletConnect connections');\n }\n\n // If already connected, return existing address (unless requesting a different wallet)\n if (this.userInfo?.publicAddress && this.connectedWalletAdapter?.getProvider()) {\n if (!walletId || this.userInfo.walletId === walletId) {\n return this.userInfo.publicAddress as `0x${string}`;\n }\n // Different wallet requested - disconnect first\n await this.disconnect();\n }\n\n let adapter: WalletAdapter | null = null;\n let result: WalletConnectionResult;\n\n if (walletId) {\n // Direct connection - bypass modal\n if (this.excludedWallets.has(walletId)) {\n throw new Error(`${walletId} is excluded from wallet options`);\n }\n adapter = this.wallets.find((w) => w.id === walletId) || null;\n if (!adapter) {\n throw new Error(`${walletId} is not configured`);\n }\n if (!adapter.isInstalled()) {\n throw new Error(`${adapter.name} is not installed`);\n }\n result = await adapter.connect();\n } else {\n // Open modal to let user choose\n const displayedWallets = this.wallets.filter((w) => !this.excludedWallets.has(w.id));\n const modalResult = await renderConnectModal({ displayedWallets, brandConfig: this.brandConfig });\n if (!modalResult) {\n sentryLogger.error('Missing modal result');\n throw new Error('Missing modal result');\n }\n\n adapter = this.wallets.find((w) => w.id === modalResult.walletId) || null;\n if (!adapter) {\n sentryLogger.error(`Selected wallet adapter not found: ${modalResult.walletId}`);\n throw new Error('Selected wallet adapter not found');\n }\n result = modalResult;\n }\n\n const provider = result.provider ?? adapter.getProvider();\n if (!provider) {\n sentryLogger.error(`Error fetching provider on login: ${adapter.id}`);\n throw new Error('Error fetching provider. Please try again.');\n }\n\n // Update internal state\n const checksumAdr = checksumAddress(result.address as `0x${string}`);\n this.connectedWalletAdapter = adapter;\n this.updateProvider(provider);\n this.userInfo = {\n publicAddress: checksumAdr,\n walletName: adapter.name,\n walletId: adapter.id,\n email: result.email,\n };\n\n this.persistConnectionState(adapter, checksumAdr, result.email);\n this.setInternalAccountChangeListener(adapter);\n\n // Notify listeners - EIP-1193 events\n const chainId = await provider.request<string>({ method: 'eth_chainId' });\n this.emitConnect(chainId);\n this.emitAccountsChanged([checksumAdr]);\n\n sentryLogger.info(`Wallet connected: ${adapter.id} (${walletId ? 'headless' : 'modal'})`);\n\n return checksumAdr;\n }\n\n public async disconnect(): Promise<void> {\n await this.whenReady();\n\n // Clean up event listeners before disconnecting\n if (this.connectedWalletAdapter) {\n this.connectedWalletAdapter.removeListeners();\n await this.connectedWalletAdapter.disconnect();\n }\n\n this.resetConnectionState();\n\n // Notify listeners - EIP-1193 events\n this.emitDisconnect();\n this.emitAccountsChanged([]);\n }\n\n public async getUserInfo(): Promise<UserInfo | undefined> {\n await this.whenReady();\n return this.userInfo;\n }\n\n public async isConnected(): Promise<boolean> {\n await this.whenReady();\n return Boolean(\n this.userInfo?.publicAddress && this.userInfo?.walletName && this.connectedWalletAdapter?.getProvider(),\n );\n }\n\n public async handleWidgetConnection(result: WalletConnectionResult): Promise<void> {\n await this.whenReady();\n\n const adapter = this.wallets.find((w) => w.id === result.walletId) || null;\n if (!adapter) throw new Error('Selected wallet adapter not found');\n\n const provider = result.provider ?? adapter.getProvider();\n if (!provider) {\n sentryLogger.error(`Error fetching provider on widget login: ${result?.walletId}`);\n throw new Error('Error fetching provider. Please try again.');\n }\n\n // Update internal state (mirrors connect() logic)\n const checksumAdr = checksumAddress(result.address as `0x${string}`);\n this.connectedWalletAdapter = adapter;\n this.updateProvider(provider);\n this.userInfo = {\n publicAddress: checksumAdr,\n walletName: adapter.name,\n walletId: adapter.id,\n email: result.email,\n };\n\n this.persistConnectionState(adapter, checksumAdr, result.email);\n this.setInternalAccountChangeListener(adapter);\n\n // Notify listeners - EIP-1193 events\n const chainId = await provider.request<string>({ method: 'eth_chainId' });\n this.emitConnect(chainId);\n this.emitAccountsChanged([checksumAdr]);\n\n sentryLogger.info(`Wallet connected: ${adapter.id} (widget)`);\n }\n\n public async getChainId(): Promise<number> {\n await this.whenReady();\n const chainId = await this.rpcProvider.request({ method: 'eth_chainId' });\n return Number(chainId);\n }\n\n public async switchChain(chainId: `0x${string}` | string | number, chain?: Chain): Promise<void> {\n await this.whenReady();\n\n const hexChainId = normalizeChainId(chainId);\n\n try {\n await this.attemptSwitchChain(hexChainId);\n } catch (switchError: unknown) {\n if (!isChainNotAddedError(switchError as { code?: number; message?: string }) || !chain) throw switchError;\n await this.handleMissingChain(hexChainId, chain);\n }\n }\n\n public updateBrandConfig(newConfig: Partial<NonNullableBrandConfig>): void {\n // Get defaults based on the theme (use new theme if provided, otherwise current)\n const defaultTheme = getDefaultThemeConfig(newConfig.theme ?? this.brandConfig.theme);\n\n // For each property:\n // - If not in newConfig: keep current value\n // - If in newConfig with value: use new value\n // - If in newConfig with undefined: reset to default\n this.brandConfig = {\n logo: 'logo' in newConfig ? (newConfig.logo ?? defaultTheme.logo) : this.brandConfig.logo,\n theme: 'theme' in newConfig ? (newConfig.theme ?? defaultTheme.theme) : this.brandConfig.theme,\n primaryColor:\n 'primaryColor' in newConfig\n ? (newConfig.primaryColor ?? defaultTheme.primaryColor)\n : this.brandConfig.primaryColor,\n borderRadius:\n 'borderRadius' in newConfig\n ? (newConfig.borderRadius ?? defaultTheme.borderRadius)\n : this.brandConfig.borderRadius,\n modalZIndex:\n 'modalZIndex' in newConfig\n ? typeof newConfig.modalZIndex === 'number'\n ? newConfig.modalZIndex\n : defaultTheme.modalZIndex\n : this.brandConfig.modalZIndex,\n appName: 'appName' in newConfig ? (newConfig.appName ?? defaultTheme.appName) : this.brandConfig.appName,\n hideFooter:\n 'hideFooter' in newConfig ? (newConfig.hideFooter ?? defaultTheme.hideFooter) : this.brandConfig.hideFooter,\n font: 'font' in newConfig ? (newConfig.font ?? defaultTheme.font) : this.brandConfig.font,\n walletLayout:\n 'walletLayout' in newConfig\n ? (newConfig.walletLayout ?? defaultTheme.walletLayout)\n : this.brandConfig.walletLayout,\n };\n }\n\n public updateWalletsConfig(newConfig: Partial<Pick<WalletsConfig, 'exclude'>>): void {\n if (newConfig.exclude !== undefined) {\n this.excludedWallets = new Set((newConfig.exclude as WalletId[]) ?? []);\n }\n }\n\n /* HEADLESS / WHITELABEL API */\n\n /**\n * Starts the email authentication flow by sending an OTP to the provided email.\n * @returns flowId to use with emailAuthVerify\n */\n public async emailAuthStart(email: string): Promise<EmailAuthStartResult> {\n await this.whenReady();\n\n const emailAdapter = this.wallets.find((w) => w.id === WalletId.Email) as EmailAdapter | undefined;\n if (!emailAdapter || !emailAdapter.emailAuthStart) {\n throw new Error('Email wallet is not configured');\n }\n\n const result = await emailAdapter.emailAuthStart(email);\n return { flowId: result.flowId };\n }\n\n /**\n * Verifies the email OTP and completes the connection.\n * @param flowId - The flowId returned from emailAuthStart\n * @param otp - The OTP code the user received via email\n * @returns The connected wallet address and email\n */\n public async emailAuthVerify(flowId: string, otp: string): Promise<EmailAuthVerifyResult> {\n await this.whenReady();\n\n const emailAdapter = this.wallets.find((w) => w.id === WalletId.Email) as EmailAdapter | undefined;\n if (!emailAdapter || !emailAdapter.emailAuthVerify) {\n throw new Error('Email wallet is not configured');\n }\n\n const verifyResult = await emailAdapter.emailAuthVerify(flowId, otp);\n const provider = emailAdapter.getProvider();\n\n if (!provider) {\n sentryLogger.error('Failed to get provider after email verification');\n throw new Error('Failed to get provider after email verification');\n }\n\n const address = verifyResult.user?.evmAccounts?.[0];\n const email = verifyResult.user?.authenticationMethods?.email?.email;\n\n if (!address || !email) {\n sentryLogger.error('Address or email not found after email verification');\n throw new Error('Address or email not found after email verification');\n }\n\n const checksumAdr = checksumAddress(address as `0x${string}`);\n\n this.connectedWalletAdapter = emailAdapter;\n this.updateProvider(provider);\n this.userInfo = {\n publicAddress: checksumAdr,\n walletName: emailAdapter.name,\n walletId: emailAdapter.id,\n email,\n };\n\n this.persistConnectionState(emailAdapter, checksumAdr, email);\n this.setInternalAccountChangeListener(emailAdapter);\n\n // Notify listeners - EIP-1193 events\n const chainId = await provider.request<string>({ method: 'eth_chainId' });\n this.emitConnect(chainId);\n this.emitAccountsChanged([checksumAdr]);\n\n sentryLogger.info(`Wallet connected: ${emailAdapter.id} (headless)`);\n\n return { address: checksumAdr, email: email ?? '', isNewUser: verifyResult.isNewUser ?? false };\n }\n\n /**\n * Initiates a WalletConnect session and returns the URI for displaying a custom QR code.\n * @returns URI string and a promise that resolves when the user connects\n */\n public async getWalletConnectSession(): Promise<WalletConnectSessionResult> {\n await this.whenReady();\n\n const wcAdapter = this.wallets.find((w) => w.id === WalletId.WalletConnect) as WalletConnectAdapter | undefined;\n if (!wcAdapter) {\n throw new Error('WalletConnect is not enabled');\n }\n\n const session = await wcAdapter.startSession();\n\n return {\n uri: session.uri,\n waitForConnection: async (): Promise<`0x${string}`> => {\n const result = await session.waitForConnection();\n const provider = result.provider ?? wcAdapter.getProvider();\n\n if (!provider) {\n sentryLogger.error('Failed to get provider after WalletConnect connection');\n throw new Error('Failed to get provider after WalletConnect connection');\n }\n\n const checksumAdr = checksumAddress(result.address as `0x${string}`);\n this.connectedWalletAdapter = wcAdapter;\n this.updateProvider(provider);\n this.userInfo = {\n publicAddress: checksumAdr,\n walletName: wcAdapter.name,\n walletId: wcAdapter.id,\n };\n\n this.persistConnectionState(wcAdapter, checksumAdr);\n this.setInternalAccountChangeListener(wcAdapter);\n\n // Notify listeners - EIP-1193 events\n const chainId = await provider.request<string>({ method: 'eth_chainId' });\n this.emitConnect(chainId);\n this.emitAccountsChanged([checksumAdr]);\n\n sentryLogger.info(`Wallet connected: ${wcAdapter.id} (headless)`);\n\n return checksumAdr;\n },\n };\n }\n\n /* PROVIDER METHODS */\n\n private createProviderProxy(): AurumRpcProvider {\n type EventCallback = (...args: unknown[]) => void;\n const handler: ProxyHandler<AurumRpcProvider> = {\n get: (_, prop) => {\n // Handle event listener methods specially - these are managed by AurumCore\n if (prop === 'on') {\n return (event: string, callback: EventCallback) => {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n // accountsChanged/connect/disconnect: AurumCore emits manually\n // Other events (chainChanged, etc.): Forward to provider directly\n if (!AurumCore.MANAGED_EVENTS.includes(event)) {\n (this.currentProvider.on as (e: string, cb: EventCallback) => void)?.(event, callback);\n }\n };\n }\n\n if (prop === 'removeListener') {\n return (event: string, callback: EventCallback) => {\n this.eventListeners.get(event)?.delete(callback);\n if (!AurumCore.MANAGED_EVENTS.includes(event)) {\n (this.currentProvider.removeListener as (e: string, cb: EventCallback) => void)?.(event, callback);\n }\n };\n }\n\n // Get the value from currentProvider\n const provider = this.currentProvider as unknown as Record<string, unknown>;\n const value = provider[prop as string];\n\n // If it's a function, bind it to currentProvider and return\n // This ensures the function is called with correct context at CALL time\n if (typeof value === 'function') {\n return (...args: unknown[]) => {\n // Re-fetch in case provider changed between get and call (important for viem)\n const currentValue = (this.currentProvider as unknown as Record<string, unknown>)[prop as string];\n if (typeof currentValue === 'function') {\n return (currentValue as (...a: unknown[]) => unknown).apply(this.currentProvider, args);\n }\n return currentValue;\n };\n }\n\n // For non-function properties (isConnected, chainId, etc.), return the value directly\n return value;\n },\n };\n return new Proxy({} as AurumRpcProvider, handler);\n }\n\n private updateProvider(newProvider: AurumRpcProvider): void {\n this.currentProvider = newProvider;\n // Re-register provider-managed listeners on the new provider\n // (accountsChanged/connect/disconnect are managed by AurumCore)\n type EventCallback = (...args: unknown[]) => void;\n this.eventListeners.forEach((callbacks, event) => {\n if (!AurumCore.MANAGED_EVENTS.includes(event)) {\n callbacks.forEach((callback) => {\n (newProvider.on as (e: string, cb: EventCallback) => void)?.(event, callback);\n });\n }\n });\n }\n\n /* BRAND & THEME METHODS */\n\n private resolveBrandConfig(config?: AurumConfig): NonNullableBrandConfig {\n const { brand = {} } = config || {};\n const themeConfig = getDefaultThemeConfig(brand.theme || DEFAULT_THEME);\n\n return {\n logo: brand.logo ?? themeConfig.logo,\n theme: brand.theme ?? themeConfig.theme,\n primaryColor: brand.primaryColor ?? themeConfig.primaryColor,\n borderRadius: brand.borderRadius ?? themeConfig.borderRadius,\n modalZIndex: typeof brand.modalZIndex === 'number' ? brand.modalZIndex : themeConfig.modalZIndex,\n appName: brand.appName ?? themeConfig.appName,\n hideFooter: brand.hideFooter ?? themeConfig.hideFooter,\n font: brand.font ?? themeConfig.font,\n walletLayout: brand.walletLayout ?? themeConfig.walletLayout,\n };\n }\n\n private async tryRestoreConnection(): Promise<void> {\n try {\n // Wait for Zustand to finish hydrating from localStorage\n await waitForStoreHydration();\n\n const store = useAurumStore.getState();\n if (!store.isConnected || !store.walletId || !store.address || !store.walletName) {\n return;\n }\n\n const persistedAdapter = this.wallets.find((w) => w.id === store.walletId) || null;\n if (!persistedAdapter || !persistedAdapter.isInstalled()) {\n store.clearConnection();\n return;\n }\n\n const connectionResult = await persistedAdapter.tryRestoreConnection();\n if (!connectionResult || connectionResult.address.toLowerCase() !== store.address.toLowerCase()) {\n store.clearConnection();\n return;\n }\n\n this.connectedWalletAdapter = persistedAdapter;\n this.updateProvider(connectionResult.provider);\n this.userInfo = {\n publicAddress: checksumAddress(connectionResult.address as `0x${string}`),\n walletName: store.walletName,\n walletId: persistedAdapter.id,\n email: store.email ?? undefined,\n };\n\n this.setInternalAccountChangeListener(persistedAdapter);\n } catch {\n this.resetConnectionState();\n } finally {\n this.ready = true;\n }\n }\n\n private persistConnectionState(adapter: WalletAdapter, address: string, email?: string): void {\n useAurumStore.getState().setConnection(adapter.id, checksumAddress(address as `0x${string}`), adapter.name, email);\n }\n\n /* INTERNAL LISTENER METHODS */\n\n private setInternalAccountChangeListener(adapter: WalletAdapter): void {\n adapter.onAccountsChanged(async (accounts) => {\n if (accounts.length === 0) {\n await this.disconnect();\n return;\n }\n this.syncStateFromAccountsChanged(accounts);\n });\n }\n\n private async syncStateFromAccountsChanged(accounts: string[]): Promise<void> {\n if (!accounts.length || !accounts[0]) return;\n\n const prevAccount = this.userInfo?.publicAddress;\n const newAccount = checksumAddress(accounts[0] as `0x${string}`);\n\n if (newAccount !== prevAccount) {\n this.userInfo = {\n publicAddress: newAccount,\n walletName: this.userInfo?.walletName as WalletName,\n walletId: this.userInfo?.walletId as WalletId,\n email: this.userInfo?.email,\n };\n if (this.connectedWalletAdapter) {\n this.persistConnectionState(this.connectedWalletAdapter, newAccount, this.userInfo.email);\n }\n // Notify listeners of account change (provider-initiated, e.g. user switched in wallet UI)\n this.emitAccountsChanged([newAccount]);\n }\n }\n\n /**\n * Emit accountsChanged to listeners registered via rpcProvider.on('accountsChanged', cb)\n * This is the single source of truth - we don't forward to underlying providers to prevent duplicates\n */\n private emitAccountsChanged(accounts: string[]): void {\n const listeners = this.eventListeners.get('accountsChanged');\n if (listeners) {\n listeners.forEach((callback) => callback(accounts));\n }\n }\n\n /**\n * Emit connect event per EIP-1193 when provider becomes connected\n * @param chainId - The chain ID in hex format (e.g., \"0x1\")\n */\n private emitConnect(chainId: string): void {\n const listeners = this.eventListeners.get('connect');\n if (listeners) {\n listeners.forEach((callback) => callback({ chainId }));\n }\n }\n\n /**\n * Emit disconnect event per EIP-1193 when provider becomes disconnected\n * @param error - Optional error that caused the disconnection\n */\n private emitDisconnect(error?: { code: number; message: string }): void {\n const listeners = this.eventListeners.get('disconnect');\n if (listeners) {\n const disconnectError = error || { code: 4900, message: 'Disconnected' };\n listeners.forEach((callback) => callback(disconnectError));\n }\n }\n\n /* SWITCH CHAIN METHODS */\n\n private async attemptSwitchChain(hexChainId: string): Promise<void> {\n await this.rpcProvider.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: hexChainId }],\n });\n }\n\n private async handleMissingChain(hexChainId: string, chain: Chain): Promise<void> {\n try {\n await this.addChain(chain);\n await this.attemptSwitchChain(hexChainId);\n } catch (addError: unknown) {\n if (isChainExistsError(addError as { code?: number; message?: string })) {\n await this.attemptSwitchChain(hexChainId);\n } else {\n throw addError;\n }\n }\n }\n\n private async addChain(chain: Chain): Promise<void> {\n if (!chain?.id || !chain?.name || !chain?.nativeCurrency || !chain?.rpcUrls?.default?.http) {\n throw new Error('Invalid chain configuration: missing required properties');\n }\n\n await this.rpcProvider.request({\n method: 'wallet_addEthereumChain',\n params: [\n {\n chainId: `0x${chain.id.toString(16)}`,\n chainName: chain.name,\n nativeCurrency: chain.nativeCurrency,\n rpcUrls: chain.rpcUrls.default.http,\n blockExplorerUrls: chain.blockExplorers ? [chain.blockExplorers.default.url] : undefined,\n },\n ],\n });\n }\n\n /* REST */\n private resetConnectionState(): void {\n useAurumStore.getState().clearConnection();\n this.connectedWalletAdapter = null;\n this.updateProvider(this.skeletonProvider);\n this.userInfo = undefined;\n }\n}\n","export function normalizeChainId(chainId: `0x${string}` | string | number): string {\n if (typeof chainId === 'string' && chainId.startsWith('0x')) return chainId;\n const numericId = typeof chainId === 'number' ? chainId : Number(chainId);\n if (Number.isNaN(numericId)) {\n throw new Error(`Invalid chainId: ${chainId}`);\n }\n return `0x${numericId.toString(16)}`;\n}\n\nexport function isChainNotAddedError(error: { code?: number; message?: string }): boolean {\n return Boolean(\n error?.code === 4902 ||\n error?.message?.includes('Unrecognized chain ID') ||\n error?.message?.includes('Chain ID not supported'),\n );\n}\n\nexport function isChainExistsError(error: { code?: number; message?: string }): boolean {\n return Boolean(\n error?.code === 4001 || // User rejected\n error?.code === -32000 || // Chain already pending/exists\n error?.message?.includes('already exists') ||\n error?.message?.includes('already pending'),\n );\n}\n","import React, { useState } from 'react';\nimport { Modal } from '@src/ui';\nimport { ConnectPages } from '@src/components/ConnectModal/ConnectPages';\nimport { useNavigation } from '@src/contexts/NavigationContext';\nimport { NonNullableBrandConfig } from '@aurum-sdk/types';\n\ninterface ModalShellProps {\n onClose: () => void;\n brandConfig: NonNullableBrandConfig;\n}\n\n/**\n * Shell component for the connect modal.\n *\n * Wraps the Modal UI component and renders ConnectPages inside.\n * Provider hierarchy is handled by renderConnectModal.\n *\n * ## Hierarchy\n * ```\n * renderConnectModal\n * └── ThemeContainer\n * └── ConnectUIProviders (NavigationProvider + ConnectModalProvider)\n * └── ModalShell ← you are here\n * └── Modal\n * └── WidgetProvider (mode='modal')\n * └── PageTransitionContainer\n * └── ConnectPages\n * ```\n */\nexport const ModalShell: React.FC<ModalShellProps> = ({ onClose, brandConfig }) => {\n const [isOpen, setIsOpen] = useState(true);\n const { currentPage } = useNavigation();\n\n const handleClose = () => {\n setIsOpen(false);\n onClose();\n };\n\n return (\n <Modal\n isOpen={isOpen}\n closeOnOverlayClick\n onCloseComplete={handleClose}\n brandConfig={brandConfig}\n transitionKey={currentPage}\n >\n <ConnectPages />\n </Modal>\n );\n};\n","import { createRoot, Root } from 'react-dom/client';\nimport { createShadowRoot } from '@src/utils/createShadowRoot';\nimport { NonNullableBrandConfig } from '@aurum-sdk/types';\n\n/** Tracks active modal roots by container ID for cleanup */\nconst activeRoots = new Map<string, Root>();\n\nexport interface ModalContainer {\n root: Root;\n cleanup: () => void;\n}\n\n/**\n * Creates a Shadow DOM container for modal rendering with automatic cleanup.\n *\n * Handles:\n * - Cleanup of any existing modal with the same ID\n * - Shadow DOM creation for style isolation\n * - React root creation\n * - Tracking for proper cleanup\n */\nexport function createModalContainer(id: string, brandConfig: NonNullableBrandConfig): ModalContainer {\n // Cleanup any existing modal with this ID\n const existingRoot = activeRoots.get(id);\n if (existingRoot) {\n existingRoot.unmount();\n document.getElementById(id)?.remove();\n activeRoots.delete(id);\n }\n\n // Create container with Shadow DOM for style isolation\n const container = document.createElement('div');\n container.id = id;\n document.body.appendChild(container);\n\n const shadowDOMRoot = createShadowRoot(container, brandConfig);\n const root = createRoot(shadowDOMRoot);\n activeRoots.set(id, root);\n\n const cleanup = () => {\n root.unmount();\n container.remove();\n activeRoots.delete(id);\n };\n\n return { root, cleanup };\n}\n","import { NonNullableBrandConfig } from '@aurum-sdk/types';\nimport { generateCompleteStyles } from '@src/utils/generateBrandStyles';\n\n/**\n * Creates a Shadow DOM with all SDK styles injected.\n * Used by modals for style isolation from the host page.\n */\nexport function createShadowRoot(container: HTMLElement, brandConfig: NonNullableBrandConfig): HTMLElement {\n const shadowRoot = container.attachShadow({ mode: 'open' });\n\n shadowRoot.innerHTML = `\n <style>${generateCompleteStyles(brandConfig)}</style>\n <div class=\"aurum-modal-root\"></div>\n `;\n\n return shadowRoot.querySelector('.aurum-modal-root') as HTMLElement;\n}\n","import { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport { ThemeContainer } from '@src/ui';\nimport { ConnectUIProviders } from '@src/components/ConnectUIProviders';\nimport { ModalShell } from '@src/components/ConnectModal/ModalShell';\nimport { sortWallets } from '@src/utils/sortWallets';\nimport { createModalContainer } from '@src/utils/createModalContainer';\nimport { isMobile } from '@src/utils/platform/isMobile';\nimport { NonNullableBrandConfig, WalletId } from '@aurum-sdk/types';\n\nconst CONTAINER_ID = 'aurum-modal-container';\n\ninterface RenderConnectModalProps {\n displayedWallets: WalletAdapter[];\n brandConfig: NonNullableBrandConfig;\n}\n\nexport function renderConnectModal({\n displayedWallets,\n brandConfig,\n}: RenderConnectModalProps): Promise<WalletConnectionResult> {\n return new Promise((resolve, reject) => {\n let sortedWallets = sortWallets(displayedWallets, { filterHidden: false });\n\n // On mobile, WalletConnect requires AppKit. Hide WalletConnect if AppKit is not available.\n const hasAppKit = sortedWallets.some((w) => w.id === WalletId.AppKit);\n if (isMobile() && !hasAppKit) {\n sortedWallets = sortedWallets.filter((w) => w.id !== WalletId.WalletConnect);\n }\n\n const { root, cleanup } = createModalContainer(CONTAINER_ID, brandConfig);\n\n const onConnect = (result: WalletConnectionResult) => {\n cleanup();\n resolve(result);\n };\n\n const onClose = () => {\n cleanup();\n reject(new Error('User rejected request'));\n };\n\n root.render(\n <ThemeContainer theme={brandConfig.theme}>\n <ConnectUIProviders onConnect={onConnect} displayedWallets={sortedWallets}>\n <ModalShell onClose={onClose} brandConfig={brandConfig} />\n </ConnectUIProviders>\n </ThemeContainer>,\n );\n });\n}\n","import type { AppKit } from '@reown/appkit';\nimport type { WagmiAdapter } from '@reown/appkit-adapter-wagmi';\nimport { sentryLogger } from '@src/services/sentry';\nimport { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { createConfigError } from '@src/utils/isConfigError';\n\ninterface AppKitConfig {\n projectId?: string;\n appName: string;\n modalZIndex: number;\n theme: 'light' | 'dark';\n}\n\nexport class AppKitAdapter implements WalletAdapter {\n readonly id = WalletId.AppKit;\n readonly name = WalletName.AppKit;\n readonly icon = getLogoDataUri(WalletId.AppKit, 'brand') ?? '';\n readonly hide = true;\n readonly downloadUrl = null;\n readonly wcDeepLinkUrl = null;\n\n private modal: AppKit | null = null;\n private wagmiAdapter: WagmiAdapter | null = null;\n private provider: AurumRpcProvider | null = null;\n private address: string | null = null;\n private config: AppKitConfig;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private unsubscribeFunctions: Array<() => void> = [];\n private initPromise: Promise<void> | null = null;\n\n constructor(config: AppKitConfig) {\n this.config = {\n projectId: config.projectId,\n appName: config.appName,\n modalZIndex: config.modalZIndex,\n theme: config.theme,\n };\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.modal) return;\n if (!this.initPromise) {\n this.initPromise = this.initializeAppKit();\n }\n await this.initPromise;\n }\n\n private async initializeAppKit(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const [{ createAppKit }, { WagmiAdapter }, { mainnet }] = await Promise.all([\n import('@reown/appkit'),\n import('@reown/appkit-adapter-wagmi'),\n import('@reown/appkit/networks'),\n ]);\n\n const networks = [mainnet];\n\n this.wagmiAdapter = new WagmiAdapter({\n projectId: this.config.projectId!,\n networks,\n ssr: true,\n });\n\n this.modal = createAppKit({\n adapters: [this.wagmiAdapter],\n networks: networks as [typeof mainnet],\n projectId: this.config.projectId!,\n metadata: {\n name: this.config.appName,\n description: this.config.appName,\n url: window.location.origin,\n icons: [],\n },\n allowUnsupportedChain: true,\n themeMode: this.config.theme,\n themeVariables: {\n '--apkt-z-index': this.config.modalZIndex + 1,\n },\n });\n\n this.setupEventListeners();\n }\n\n private setupEventListeners(): void {\n if (!this.modal) return;\n\n const unsubscribeProviders = this.modal.subscribeProviders((state) => {\n const eip155Provider = (state as Record<string, AurumRpcProvider | undefined>)['eip155'];\n this.provider = eip155Provider || null;\n if (!eip155Provider) {\n this.address = null;\n }\n });\n this.unsubscribeFunctions.push(unsubscribeProviders);\n }\n\n private syncAddressFromWagmi(): void {\n if (!this.wagmiAdapter?.wagmiConfig) return;\n\n const { state } = this.wagmiAdapter.wagmiConfig;\n if (state.current && state.connections) {\n const connection = state.connections.get(state.current);\n if (connection?.accounts?.[0]) {\n this.address = connection.accounts[0];\n }\n }\n }\n\n private async syncProviderFromModal(): Promise<void> {\n if (!this.modal) return;\n\n try {\n // Try to get providers directly from modal\n const getProvidersFn = (this.modal as unknown as { getProviders?: () => Record<string, AurumRpcProvider> })\n .getProviders;\n if (typeof getProvidersFn === 'function') {\n const providers = getProvidersFn.call(this.modal);\n const eip155Provider = providers?.['eip155'];\n if (eip155Provider) {\n this.provider = eip155Provider;\n return;\n }\n }\n\n // Fallback: try to get provider from wagmi connector\n if (this.wagmiAdapter?.wagmiConfig) {\n const { state } = this.wagmiAdapter.wagmiConfig;\n if (state.current && state.connections) {\n const connection = state.connections.get(state.current);\n const connector = connection?.connector;\n if (connector && typeof connector.getProvider === 'function') {\n try {\n const provider = await connector.getProvider();\n if (provider) {\n this.provider = provider as AurumRpcProvider;\n }\n } catch (error) {\n sentryLogger.warn('Failed to get provider from wagmi connector', { error });\n }\n }\n }\n }\n } catch (error) {\n sentryLogger.warn('Failed to get provider from AppKit', { error });\n }\n }\n\n isInstalled(): boolean {\n return true;\n }\n\n async connect(): Promise<WalletConnectionResult> {\n if (!this.config.projectId) {\n throw createConfigError('AppKit');\n }\n\n await this.ensureInitialized();\n\n if (!this.modal) {\n sentryLogger.error('AppKit is not available');\n throw new Error('AppKit is not available');\n }\n\n // Check if AppKit already has a wallet connected\n const existingAddress = this.modal.getAddress();\n if (this.modal.getIsConnectedState() && existingAddress) {\n await this.syncProviderFromModal();\n if (this.provider) {\n this.address = existingAddress;\n return {\n address: existingAddress,\n provider: this.provider,\n walletId: this.id,\n };\n }\n // If we can't get provider, disconnect and reconnect fresh\n await this.disconnect();\n }\n\n this.modal.open({ view: 'AllWallets' });\n\n return await this.waitForConnection();\n }\n\n private waitForConnection(timeout = 60000): Promise<WalletConnectionResult> {\n return new Promise((resolve, reject) => {\n const startTime = Date.now();\n let unsubscribeState: (() => void) | null = null;\n let isResolved = false;\n\n const cleanup = () => {\n unsubscribeState?.();\n };\n\n const checkConnection = async (): Promise<boolean> => {\n if (isResolved) return true;\n\n this.syncAddressFromWagmi();\n\n // If we have address but no provider, try to get it directly\n if (this.address && !this.provider) {\n await this.syncProviderFromModal();\n }\n\n if (this.provider && this.address) {\n try {\n const accounts = (await this.provider.request({ method: 'eth_accounts' })) as string[];\n if (accounts && accounts.length > 0) {\n isResolved = true;\n cleanup();\n // Close the modal after successful connection\n this.modal?.close();\n resolve({\n address: this.address,\n provider: this.provider,\n walletId: this.id,\n });\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n return false;\n };\n\n // Watch for modal state changes\n unsubscribeState = this.modal!.subscribeState(async (state: { open: boolean }) => {\n if (await checkConnection()) return;\n\n // Modal closed without connection = user rejected\n if (state.open === false && !this.address && !isResolved) {\n cleanup();\n reject(new Error('Connection rejected by user'));\n }\n });\n\n // Polling fallback for timeout\n const pollTimeout = async () => {\n if (await checkConnection()) return;\n\n if (Date.now() - startTime > timeout) {\n cleanup();\n reject(new Error('Connection timeout'));\n return;\n }\n\n setTimeout(pollTimeout, 500);\n };\n\n pollTimeout();\n });\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n await this.ensureInitialized();\n\n if (!this.modal || !this.wagmiAdapter) return null;\n\n try {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n const wagmiConfig = this.wagmiAdapter.wagmiConfig;\n if (wagmiConfig?.state?.current && wagmiConfig.state.connections) {\n const connection = wagmiConfig.state.connections.get(wagmiConfig.state.current);\n if (connection?.accounts?.[0]) {\n this.address = connection.accounts[0];\n\n if (this.provider && this.address) {\n return {\n address: this.address,\n provider: this.provider,\n walletId: this.id,\n };\n }\n }\n }\n\n return null;\n } catch {\n // sentryLogger.warn('Failed to restore connection to AppKit', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {\n if (!this.modal) {\n this.address = null;\n this.provider = null;\n return;\n }\n\n await this.modal.disconnect('eip155' as Parameters<typeof this.modal.disconnect>[0]);\n\n // Wait for AppKit state to clear (required due to async state updates)\n const timeout = Date.now() + 2000;\n while (Date.now() < timeout && (this.modal.getIsConnectedState() || this.modal.getAddress())) {\n await new Promise((r) => setTimeout(r, 100));\n }\n this.address = null;\n this.provider = null;\n }\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = (accounts: string[]) => {\n this.address = accounts[0] || null;\n callback(accounts);\n };\n\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (this.provider?.removeListener && this.accountsChangedCallback) {\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n\n this.unsubscribeFunctions.forEach((unsub) => unsub());\n this.unsubscribeFunctions = [];\n }\n}\n","import { WalletAdapter, WalletConnectionResult, EIP6963AnnounceProviderEvent } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { sentryLogger } from '@src/services/sentry';\n\nconst RABBY_RDNS = 'io.rabby';\n\ninterface RabbyProvider extends AurumRpcProvider {\n isRabby: boolean;\n providers?: RabbyProvider[];\n}\n\nexport class RabbyAdapter implements WalletAdapter {\n readonly id = WalletId.Rabby;\n readonly name = WalletName.Rabby;\n readonly icon = getLogoDataUri(WalletId.Rabby, 'brand') ?? '';\n readonly hide = false;\n readonly downloadUrl = 'https://rabby.io';\n readonly wcDeepLinkUrl = null;\n\n private provider: RabbyProvider | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private providerPromise: Promise<RabbyProvider | null> | null = null;\n\n constructor() {\n // Start EIP-6963 discovery immediately\n this.providerPromise = this.discoverProvider();\n }\n\n /**\n * Uses EIP-6963 to discover the Rabby provider by its RDNS identifier.\n * Falls back to window.ethereum for legacy detection.\n */\n private discoverProvider(): Promise<RabbyProvider | null> {\n if (typeof window === 'undefined') return Promise.resolve(null);\n\n return new Promise((resolve) => {\n let resolved = false;\n\n const onAnnouncement = (event: Event) => {\n const { detail } = event as EIP6963AnnounceProviderEvent<RabbyProvider>;\n if (detail.info.rdns === RABBY_RDNS) {\n resolved = true;\n this.provider = detail.provider;\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n resolve(detail.provider);\n }\n };\n\n window.addEventListener('eip6963:announceProvider', onAnnouncement);\n window.dispatchEvent(new Event('eip6963:requestProvider'));\n\n // Timeout after 100ms - fall back to legacy detection\n setTimeout(() => {\n if (!resolved) {\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n const legacyProvider = this.detectLegacyProvider();\n if (legacyProvider) {\n this.provider = legacyProvider;\n }\n resolve(legacyProvider);\n }\n }, 100);\n });\n }\n\n /**\n * Fallback detection for legacy Rabby installations.\n * Checks window.ethereum for Rabby-specific flags.\n */\n private detectLegacyProvider(): RabbyProvider | null {\n const ethereum = (window as unknown as { ethereum?: RabbyProvider }).ethereum;\n if (ethereum?.isRabby) {\n return ethereum;\n }\n return null;\n }\n\n isInstalled(): boolean {\n return Boolean(this.provider);\n }\n\n async connect(): Promise<WalletConnectionResult> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n sentryLogger.error('Rabby is not available');\n throw new Error('Rabby is not available');\n }\n\n try {\n // Force Rabby to prompt for a fresh connection instead of returning cached accounts\n await this.provider.request({\n method: 'wallet_requestPermissions',\n params: [{ eth_accounts: {} }],\n });\n\n const accounts = await this.provider.request<string[]>({\n method: 'eth_requestAccounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('No accounts returned from Rabby');\n throw new Error('No accounts returned from Rabby');\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n throw new Error('Failed to connect to Rabby');\n }\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n return null;\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to Rabby', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {}\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n // Called by Aurum when user connects wallet\n // Passes Aurum.ts --> syncStateFromAccountsChanged() to handle the provider accounts changed event\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","import { WalletAdapter, WalletConnectionResult, EIP6963AnnounceProviderEvent } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { sentryLogger } from '@src/services/sentry';\nimport { isBraveBrowser } from '@src/utils/platform/isBraveBrowser';\n\nconst BRAVE_RDNS = 'com.brave.wallet';\n\ninterface BraveProvider extends AurumRpcProvider {\n isBraveWallet: boolean;\n}\n\nexport class BraveAdapter implements WalletAdapter {\n readonly id = WalletId.Brave;\n readonly name = WalletName.Brave;\n readonly icon = getLogoDataUri(WalletId.Brave, 'brand') ?? '';\n readonly downloadUrl = 'https://brave.com/download';\n readonly wcDeepLinkUrl = null;\n\n private provider: BraveProvider | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private providerPromise: Promise<BraveProvider | null> | null = null;\n\n constructor() {\n // Start EIP-6963 discovery immediately\n this.providerPromise = this.discoverProvider();\n }\n\n get hide(): boolean {\n if (this.provider) return false;\n if (isBraveBrowser()) return false;\n return true;\n }\n\n /**\n * Uses EIP-6963 to discover the Brave Wallet provider by its RDNS identifier.\n * Falls back to window.ethereum for legacy detection.\n */\n private discoverProvider(): Promise<BraveProvider | null> {\n if (typeof window === 'undefined') return Promise.resolve(null);\n\n return new Promise((resolve) => {\n let resolved = false;\n\n const onAnnouncement = (event: Event) => {\n const { detail } = event as EIP6963AnnounceProviderEvent<BraveProvider>;\n if (detail.info.rdns === BRAVE_RDNS) {\n resolved = true;\n this.provider = detail.provider;\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n resolve(detail.provider);\n }\n };\n\n window.addEventListener('eip6963:announceProvider', onAnnouncement);\n window.dispatchEvent(new Event('eip6963:requestProvider'));\n\n // Timeout after 100ms - fall back to legacy detection\n setTimeout(() => {\n if (!resolved) {\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n const legacyProvider = this.detectLegacyProvider();\n if (legacyProvider) {\n this.provider = legacyProvider;\n }\n resolve(legacyProvider);\n }\n }, 100);\n });\n }\n\n /**\n * Fallback detection for legacy Brave Wallet detection.\n * Checks window.ethereum for Brave-specific flags.\n */\n private detectLegacyProvider(): BraveProvider | null {\n const ethereum = (window as unknown as { ethereum?: BraveProvider }).ethereum;\n if (ethereum?.isBraveWallet) {\n return ethereum;\n }\n return null;\n }\n\n isInstalled(): boolean {\n return Boolean(this.provider);\n }\n\n async connect(): Promise<WalletConnectionResult> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n sentryLogger.error('Brave Wallet is not available');\n throw new Error('Brave Wallet is not available');\n }\n\n try {\n // Force Brave Wallet to prompt for a fresh connection instead of returning cached accounts\n await this.provider.request({\n method: 'wallet_requestPermissions',\n params: [{ eth_accounts: {} }],\n });\n\n const accounts = await this.provider.request<string[]>({\n method: 'eth_requestAccounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('No accounts returned from Brave Wallet');\n throw new Error('No accounts returned from Brave Wallet');\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n throw new Error('Failed to connect to Brave Wallet');\n }\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n return null;\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to Brave Wallet', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {}\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n // Called by Aurum when user connects wallet\n // Passes Aurum.ts --> syncStateFromAccountsChanged() to handle the provider accounts changed event\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","interface NavigatorWithBrave extends Navigator {\n brave?: {\n isBrave: () => Promise<boolean>;\n };\n}\n\nexport function isBraveBrowser(): boolean {\n if (typeof navigator === 'undefined') return false;\n return (navigator as NavigatorWithBrave).brave !== undefined;\n}\n","import { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { sentryLogger } from '@src/services/sentry';\nimport { createConfigError } from '@src/utils/isConfigError';\nimport { SupportedProviders } from '@ledgerhq/connect-kit-loader';\nimport { mainnet } from 'viem/chains';\n\ninterface LedgerAdapterConfig {\n walletConnectProjectId?: string;\n}\n\nexport class LedgerAdapter implements WalletAdapter {\n readonly id = WalletId.Ledger;\n readonly name = WalletName.Ledger;\n readonly icon = getLogoDataUri(WalletId.Ledger, 'brand') ?? '';\n readonly hide = false;\n readonly downloadUrl = 'https://www.ledger.com/ledger-live';\n readonly wcDeepLinkUrl = 'ledgerlive://wc?uri=';\n\n private provider: AurumRpcProvider | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private walletConnectProjectId?: string;\n\n constructor(config?: LedgerAdapterConfig) {\n this.walletConnectProjectId = config?.walletConnectProjectId;\n }\n\n isInstalled(): boolean {\n return true;\n }\n\n async connect(): Promise<WalletConnectionResult> {\n try {\n if (!this.walletConnectProjectId) {\n throw createConfigError('Ledger');\n }\n\n const { loadConnectKit } = await import('@ledgerhq/connect-kit-loader');\n const connectKit = await loadConnectKit();\n\n connectKit.enableDebugLogs();\n\n connectKit.checkSupport({\n providerType: SupportedProviders.Ethereum,\n chainId: 1,\n walletConnectVersion: 2,\n projectId: this.walletConnectProjectId,\n rpc: { 1: mainnet.rpcUrls.default.http[0] },\n });\n\n this.provider = (await connectKit.getProvider()) as AurumRpcProvider;\n\n if (!this.provider) {\n sentryLogger.error('Failed to get Ledger provider');\n throw new Error('Failed to get Ledger provider');\n }\n\n const accounts = await this.provider.request<string[]>({\n method: 'eth_requestAccounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('No accounts returned from Ledger');\n throw new Error('No accounts returned from Ledger');\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n throw new Error('Failed to connect to Ledger');\n }\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n try {\n const { loadConnectKit } = await import('@ledgerhq/connect-kit-loader');\n const connectKit = await loadConnectKit();\n\n connectKit.checkSupport({\n providerType: SupportedProviders.Ethereum,\n chainId: 1,\n walletConnectVersion: 2,\n projectId: this.walletConnectProjectId,\n rpc: { 1: mainnet.rpcUrls.default.http[0] },\n });\n\n this.provider = (await connectKit.getProvider()) as AurumRpcProvider;\n\n if (!this.provider) {\n return null;\n }\n\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to Ledger', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n const provider = this.provider as AurumRpcProvider & { disconnect?: () => Promise<void> };\n if (provider?.disconnect) {\n await provider.disconnect();\n }\n this.provider = null;\n } catch (error) {\n sentryLogger.warn('Failed to disconnect from Ledger', { error });\n }\n }\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","import { WalletAdapter, WalletConnectionResult, EIP6963AnnounceProviderEvent } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { sentryLogger } from '@src/services/sentry';\n\nconst PHANTOM_RDNS = 'app.phantom';\n\ninterface PhantomProvider extends AurumRpcProvider {\n isPhantom: boolean;\n providers?: PhantomProvider[];\n}\n\nexport class PhantomAdapter implements WalletAdapter {\n readonly id = WalletId.Phantom;\n readonly name = WalletName.Phantom;\n readonly icon = getLogoDataUri(WalletId.Phantom, 'brand') ?? '';\n readonly hide = false;\n readonly downloadUrl = 'https://phantom.com/download';\n readonly wcDeepLinkUrl = 'phantom://wc?uri=';\n\n private provider: PhantomProvider | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private providerPromise: Promise<PhantomProvider | null> | null = null;\n\n constructor() {\n // Start EIP-6963 discovery immediately\n this.providerPromise = this.discoverProvider();\n }\n\n /**\n * Uses EIP-6963 to discover the Phantom provider by its RDNS identifier.\n * Falls back to window.phantom.ethereum for in-app browser support (Phantom Mobile).\n * This prevents other wallets from hijacking the connection.\n */\n private discoverProvider(): Promise<PhantomProvider | null> {\n if (typeof window === 'undefined') return Promise.resolve(null);\n\n return new Promise((resolve) => {\n let resolved = false;\n\n const onAnnouncement = (event: Event) => {\n const { detail } = event as EIP6963AnnounceProviderEvent<PhantomProvider>;\n if (detail.info.rdns === PHANTOM_RDNS) {\n resolved = true;\n this.provider = detail.provider;\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n resolve(detail.provider);\n }\n };\n\n window.addEventListener('eip6963:announceProvider', onAnnouncement);\n window.dispatchEvent(new Event('eip6963:requestProvider'));\n\n // Timeout after 100ms - fall back to legacy detection for in-app browsers\n setTimeout(() => {\n if (!resolved) {\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n const legacyProvider = this.detectLegacyProvider();\n if (legacyProvider) {\n this.provider = legacyProvider;\n }\n resolve(legacyProvider);\n }\n }, 100);\n });\n }\n\n /**\n * Fallback detection for in-app browsers (Phantom Mobile) that don't support EIP-6963.\n * Checks window.phantom.ethereum and window.ethereum for Phantom-specific flags.\n */\n private detectLegacyProvider(): PhantomProvider | null {\n // Phantom prefers window.phantom.ethereum namespace\n const phantom = (window as unknown as { phantom?: { ethereum?: PhantomProvider } }).phantom;\n if (phantom?.ethereum?.isPhantom) {\n return phantom.ethereum;\n }\n\n // Fallback to window.ethereum if Phantom is the only provider\n const ethereum = (window as unknown as { ethereum?: PhantomProvider }).ethereum;\n if (ethereum?.isPhantom) {\n return ethereum;\n }\n\n return null;\n }\n\n isInstalled(): boolean {\n return Boolean(this.provider);\n }\n\n async connect(): Promise<WalletConnectionResult> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n sentryLogger.error('Phantom is not available');\n throw new Error('Phantom is not available');\n }\n\n try {\n // Force Phantom to prompt for a fresh connection instead of returning cached accounts\n await this.provider.request({\n method: 'wallet_requestPermissions',\n params: [{ eth_accounts: {} }],\n });\n\n const accounts = await this.provider.request<string[]>({\n method: 'eth_requestAccounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('No accounts returned from Phantom');\n throw new Error('No accounts returned from Phantom');\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n throw new Error('Failed to connect to Phantom');\n }\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n return null;\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to Phantom', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {}\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n // Called by Aurum when user connects wallet\n // Passes Aurum.ts --> syncStateFromAccountsChanged() to handle the provider accounts changed event\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","import { createCoinbaseWalletSDK } from '@coinbase/wallet-sdk';\nimport { sentryLogger } from '@src/services/sentry';\nimport { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\n\ninterface CoinbaseProvider extends AurumRpcProvider {\n isWalletLink?: boolean;\n isCoinbaseWallet?: boolean;\n selectedAddress?: string | null;\n close?: () => Promise<void>;\n disconnect?: () => Promise<void>;\n}\n\nexport class CoinbaseWalletAdapter implements WalletAdapter {\n readonly id = WalletId.CoinbaseWallet;\n readonly name = WalletName.CoinbaseWallet;\n readonly icon = getLogoDataUri(WalletId.CoinbaseWallet, 'brand') ?? '';\n readonly hide = false;\n readonly downloadUrl = 'https://www.coinbase.com/wallet/downloads';\n readonly wcDeepLinkUrl = 'cbwallet://wc?uri=';\n\n private provider: CoinbaseProvider | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n\n constructor({ appName, appLogoUrl }: { appName: string; appLogoUrl?: string }) {\n this.provider = this.detectProvider({ appName, appLogoUrl });\n }\n\n private detectProvider({ appName, appLogoUrl }: { appName: string; appLogoUrl?: string }): CoinbaseProvider | null {\n if (typeof window === 'undefined') return null;\n\n try {\n const coinbaseSdk = createCoinbaseWalletSDK({\n appName,\n appLogoUrl,\n });\n\n return coinbaseSdk.getProvider() as CoinbaseProvider;\n } catch (error) {\n sentryLogger.warn('Failed to initialize Coinbase Wallet provider', { error });\n return null;\n }\n }\n\n isInstalled(): boolean {\n return Boolean(this.provider);\n }\n\n async connect(): Promise<WalletConnectionResult> {\n if (!this.isInstalled() || !this.provider) {\n sentryLogger.error('Coinbase Wallet is not available');\n throw new Error('Coinbase Wallet is not available');\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_requestAccounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('No accounts returned from Coinbase Wallet');\n throw new Error('No accounts returned from Coinbase Wallet');\n }\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n throw new Error('Failed to connect to Coinbase Wallet');\n }\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n if (!this.isInstalled() || !this.provider) {\n return null;\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to Coinbase Wallet', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n if (this.provider?.close) {\n await this.provider.close();\n } else if (this.provider?.disconnect) {\n await this.provider.disconnect();\n }\n } catch (error) {\n sentryLogger.warn('Error disconnecting from Coinbase Wallet', { error });\n } finally {\n this.clearLocalStorage();\n }\n }\n\n private clearLocalStorage(): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n\n const keysToRemove: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (\n key &&\n (key.startsWith('-walletlink') ||\n key.startsWith('-CBWSDK') ||\n key.startsWith('walletlink:') ||\n key.startsWith('CBWSDK:'))\n ) {\n keysToRemove.push(key);\n }\n }\n\n keysToRemove.forEach((key) => {\n localStorage.removeItem(key);\n });\n }\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n // Called by Aurum when user connects wallet\n // Passes Aurum.ts --> syncStateFromAccountsChanged() to handle the provider accounts changed event\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","import { WalletAdapter, WalletConnectionResult, EIP6963AnnounceProviderEvent } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { sentryLogger } from '@src/services/sentry';\n\nconst METAMASK_RDNS = 'io.metamask';\n\ninterface MetaMaskProvider extends AurumRpcProvider {\n isMetaMask: boolean;\n isBraveWallet: boolean;\n providers?: MetaMaskProvider[];\n}\n\nexport class MetaMaskAdapter implements WalletAdapter {\n readonly id = WalletId.MetaMask;\n readonly name = WalletName.MetaMask;\n readonly icon = getLogoDataUri(WalletId.MetaMask, 'brand') ?? '';\n readonly hide = false;\n readonly downloadUrl = 'https://metamask.io/download';\n readonly wcDeepLinkUrl = 'metamask://wc?uri=';\n\n private provider: MetaMaskProvider | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private providerPromise: Promise<MetaMaskProvider | null> | null = null;\n\n constructor() {\n // Start EIP-6963 discovery immediately\n this.providerPromise = this.discoverProvider();\n }\n\n /**\n * Uses EIP-6963 to discover the MetaMask provider by its RDNS identifier.\n * Falls back to window.ethereum for in-app browser support (MetaMask Mobile).\n * This prevents other wallets (like Rabby) from hijacking the connection.\n */\n private discoverProvider(): Promise<MetaMaskProvider | null> {\n if (typeof window === 'undefined') return Promise.resolve(null);\n\n return new Promise((resolve) => {\n let resolved = false;\n\n const onAnnouncement = (event: Event) => {\n const { detail } = event as EIP6963AnnounceProviderEvent<MetaMaskProvider>;\n if (detail.info.rdns === METAMASK_RDNS) {\n resolved = true;\n this.provider = detail.provider;\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n resolve(detail.provider);\n }\n };\n\n window.addEventListener('eip6963:announceProvider', onAnnouncement);\n window.dispatchEvent(new Event('eip6963:requestProvider'));\n\n // Timeout after 100ms - fall back to legacy window.ethereum for in-app browsers\n setTimeout(() => {\n if (!resolved) {\n window.removeEventListener('eip6963:announceProvider', onAnnouncement);\n const legacyProvider = this.detectLegacyProvider();\n if (legacyProvider) {\n this.provider = legacyProvider;\n }\n resolve(legacyProvider);\n }\n }, 100);\n });\n }\n\n /**\n * Fallback detection for in-app browsers (MetaMask Mobile) that don't support EIP-6963.\n * Checks window.ethereum for MetaMask-specific flags.\n */\n private detectLegacyProvider(): MetaMaskProvider | null {\n const ethereum = (window as unknown as { ethereum?: MetaMaskProvider }).ethereum;\n if (!ethereum) return null;\n\n // Check providers array first (multiple wallets installed)\n if (ethereum.providers?.length) {\n const metaMaskProvider = ethereum.providers.find((p) => p.isMetaMask && !p.isBraveWallet);\n if (metaMaskProvider) return metaMaskProvider;\n }\n\n // Single provider - check if it's MetaMask (and not Brave masquerading)\n if (ethereum.isMetaMask && !ethereum.isBraveWallet) {\n return ethereum;\n }\n\n return null;\n }\n\n isInstalled(): boolean {\n return Boolean(this.provider);\n }\n\n async connect(): Promise<WalletConnectionResult> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n sentryLogger.error('MetaMask is not available');\n throw new Error('MetaMask is not available');\n }\n\n try {\n // Force MetaMask to prompt for a fresh connection instead of returning cached accounts\n await this.provider.request({\n method: 'wallet_requestPermissions',\n params: [{ eth_accounts: {} }],\n });\n\n const accounts = await this.provider.request<string[]>({\n method: 'eth_requestAccounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('No accounts returned from MetaMask');\n throw new Error('No accounts returned from MetaMask');\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n throw new Error('Failed to connect to MetaMask');\n }\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n // Wait for EIP-6963 discovery to complete if not already done\n if (!this.provider && this.providerPromise) {\n await this.providerPromise;\n }\n\n if (!this.provider) {\n return null;\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to MetaMask', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {}\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n // Called by Aurum when user connects wallet\n // Passes Aurum.ts --> syncStateFromAccountsChanged() to handle the provider accounts changed event\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","import type { EthereumProvider } from '@walletconnect/ethereum-provider';\nimport { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport { sentryLogger } from '@src/services/sentry';\nimport { createConfigError } from '@src/utils/isConfigError';\n\ntype WalletConnectProvider = Awaited<ReturnType<typeof EthereumProvider.init>>;\n\ninterface WalletConnectConfig {\n projectId?: string;\n appName: string;\n}\n\nexport interface WalletConnectSession {\n uri: string;\n waitForConnection: () => Promise<WalletConnectionResult>;\n}\n\nexport class WalletConnectAdapter implements WalletAdapter {\n readonly id = WalletId.WalletConnect;\n readonly name = WalletName.WalletConnect;\n readonly icon = getLogoDataUri(WalletId.WalletConnect, 'brand') ?? '';\n readonly hide = false;\n readonly downloadUrl = null;\n readonly wcDeepLinkUrl = null;\n\n private provider: WalletConnectProvider | null = null;\n private config: WalletConnectConfig;\n private connectionUri: string | null = null;\n private accountsChangedCallback: ((accounts: string[]) => void) | null = null;\n private initPromise: Promise<void> | null = null;\n\n constructor(config: WalletConnectConfig) {\n this.config = {\n projectId: config.projectId,\n appName: config.appName,\n };\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.provider) return;\n if (!this.initPromise) {\n this.initPromise = this.initializeProvider();\n }\n await this.initPromise;\n }\n\n private async initializeProvider(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const { EthereumProvider } = await import('@walletconnect/ethereum-provider');\n\n this.provider = await EthereumProvider.init({\n projectId: this.config.projectId ?? '',\n optionalChains: [1],\n showQrModal: false,\n metadata: {\n name: this.config.appName,\n description: this.config.appName,\n url: window.location.origin,\n icons: [],\n },\n });\n\n this.provider.on('display_uri', (uri) => {\n this.connectionUri = uri;\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('walletconnect:uri', { detail: { uri } }));\n }\n });\n\n this.provider.on('connect', (session) => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('walletconnect:connect', { detail: { session } }));\n }\n });\n\n this.provider.on('disconnect', () => {\n this.connectionUri = null;\n });\n\n this.provider.on('session_delete', () => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('walletconnect:disconnect'));\n }\n });\n }\n\n isInstalled(): boolean {\n return true;\n }\n\n async connect(): Promise<WalletConnectionResult> {\n if (!this.config.projectId) {\n throw createConfigError('WalletConnect');\n }\n\n try {\n await this.ensureInitialized();\n\n if (!this.provider) {\n sentryLogger.error('connect: WalletConnect is not available');\n throw new Error('WalletConnect is not available');\n }\n\n const accounts = await this.provider.enable();\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('connect: No accounts returned from WalletConnect');\n throw new Error('No accounts returned from WalletConnect');\n }\n\n return {\n address: accounts[0],\n provider: this.provider as unknown as AurumRpcProvider,\n walletId: this.id,\n };\n } catch {\n this.connectionUri = null;\n throw new Error('Failed to connect to WalletConnect');\n }\n }\n\n getConnectionUri(): string | null {\n return this.connectionUri;\n }\n\n /**\n * Starts a WalletConnect session for headless/custom QR code flows.\n * Returns the URI immediately and a function to wait for the connection.\n */\n async startSession(timeout = 10000): Promise<WalletConnectSession> {\n if (!this.config.projectId) {\n throw new Error('WalletConnect projectId is required');\n }\n\n await this.ensureInitialized();\n\n if (!this.provider) {\n sentryLogger.error('startSession: WalletConnect is not available');\n throw new Error('WalletConnect is not available');\n }\n\n // Reset state for fresh connection\n this.connectionUri = null;\n\n // Create a promise that resolves when URI is generated\n const uriPromise = new Promise<string>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error('Timeout waiting for WalletConnect URI'));\n }, timeout);\n\n // Use 'once' to listen for single URI event\n (this.provider as WalletConnectProvider).once('display_uri', (uri: string) => {\n clearTimeout(timeoutId);\n this.connectionUri = uri;\n resolve(uri);\n });\n });\n\n // Start connection process (triggers display_uri, then waits for user approval)\n const connectionPromise = (async (): Promise<WalletConnectionResult> => {\n const accounts = await (this.provider as WalletConnectProvider).enable();\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n sentryLogger.error('startSession: No accounts returned from WalletConnect');\n throw new Error('No accounts returned from WalletConnect');\n }\n return {\n address: accounts[0],\n provider: this.provider as unknown as AurumRpcProvider,\n walletId: this.id,\n };\n })();\n\n // Wait for URI to be generated\n const uri = await uriPromise;\n\n return {\n uri,\n waitForConnection: async () => {\n try {\n return await connectionPromise;\n } catch {\n this.connectionUri = null;\n throw new Error('Failed to connect via WalletConnect');\n }\n },\n };\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n try {\n await this.ensureInitialized();\n\n if (!this.provider) {\n return null;\n }\n\n const accounts = this.provider.accounts;\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider as unknown as AurumRpcProvider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to WalletConnect', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n if (this.provider) {\n await this.provider.disconnect();\n }\n } finally {\n this.connectionUri = null;\n this.provider = null;\n this.initPromise = null;\n }\n }\n\n getProvider(): AurumRpcProvider | null {\n return this.provider as unknown as AurumRpcProvider | null;\n }\n\n // Called by Aurum when user connects wallet\n // Passes Aurum.ts --> syncStateFromAccountsChanged() to handle the provider accounts changed event\n onAccountsChanged(callback: (accounts: string[]) => void): void {\n if (!this.provider?.on) return;\n\n if (this.accountsChangedCallback) {\n this.provider.removeListener?.('accountsChanged', this.accountsChangedCallback);\n }\n\n this.accountsChangedCallback = callback;\n this.provider.on('accountsChanged', this.accountsChangedCallback);\n }\n\n removeListeners(): void {\n if (!this.provider?.removeListener || !this.accountsChangedCallback) return;\n this.provider.removeListener('accountsChanged', this.accountsChangedCallback);\n this.accountsChangedCallback = null;\n }\n}\n","import { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport type { SignInWithEmailResult, VerifyEmailOTPResult } from '@coinbase/cdp-core';\nimport { AurumRpcProvider, WalletId, WalletName } from '@aurum-sdk/types';\nimport type { Transport, PublicClient, Chain } from 'viem';\nimport { getLogoDataUri } from '@aurum-sdk/logos';\nimport { sentryLogger } from '@src/services/sentry';\nimport { createConfigError } from '@src/utils/isConfigError';\n\ninterface EmailProvider extends AurumRpcProvider {\n selectedAddress?: string | null;\n close?: () => Promise<void>;\n disconnect?: () => Promise<void>;\n}\n\ninterface EmailAdapterConfig {\n projectId?: string;\n}\n\nexport class EmailAdapter implements WalletAdapter {\n readonly id = WalletId.Email;\n readonly name = WalletName.Email;\n readonly icon = getLogoDataUri(WalletId.Email, 'brand') ?? '';\n readonly hide = true;\n readonly downloadUrl = null;\n readonly wcDeepLinkUrl = null;\n\n private provider: EmailProvider | null = null;\n private initPromise: Promise<void> | null = null;\n private publicClientCache: Map<number, PublicClient> = new Map();\n private projectId: string;\n\n // Static variables - computed once across all instances\n private static chainIdMap: Map<number, Chain> | null = null;\n private static viemChains: Chain[] | null = null;\n private static viemTransports: Record<number, Transport> | null = null;\n\n constructor(config?: EmailAdapterConfig) {\n this.projectId = config?.projectId || '';\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.provider) return;\n if (!this.initPromise) {\n this.initPromise = this.initializeProvider();\n }\n await this.initPromise;\n }\n\n isInstalled(): boolean {\n return true;\n }\n\n async emailAuthStart(email: string): Promise<SignInWithEmailResult> {\n if (!this.projectId) {\n throw createConfigError('Email');\n }\n\n await this.ensureInitialized();\n\n if (!this.provider) {\n sentryLogger.error('Email is not available');\n throw new Error('Email is not available');\n }\n\n try {\n const { signInWithEmail } = await import('@coinbase/cdp-core');\n const authResult = await signInWithEmail({ email });\n return authResult;\n } catch (error) {\n sentryLogger.error('Failed to start email authentication', { error });\n throw error;\n }\n }\n\n async emailAuthVerify(flowId: string, otp: string): Promise<VerifyEmailOTPResult> {\n if (!flowId || !otp) {\n throw new Error('flowId and otp are required');\n }\n\n await this.ensureInitialized();\n if (!this.provider) {\n sentryLogger.error('Email provider not initialized');\n throw new Error('Email provider not initialized');\n }\n\n const { verifyEmailOTP } = await import('@coinbase/cdp-core');\n return verifyEmailOTP({ flowId, otp });\n }\n\n async connect(): Promise<WalletConnectionResult> {\n sentryLogger.error('EmailAdapter.connect() is not implemented');\n throw new Error('EmailAdapter.connect() is not implemented');\n }\n\n async tryRestoreConnection(): Promise<WalletConnectionResult | null> {\n await this.ensureInitialized();\n\n if (!this.provider) {\n return null;\n }\n\n try {\n const accounts = await this.provider.request<string[]>({\n method: 'eth_accounts',\n params: [],\n });\n\n if (!accounts || accounts.length === 0 || !accounts[0]) {\n return null;\n }\n\n return {\n address: accounts[0],\n provider: this.provider,\n walletId: this.id,\n };\n } catch {\n // sentryLogger.warn('Failed to restore connection to Email', { error });\n return null;\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.ensureInitialized();\n const { signOut } = await import('@coinbase/cdp-core');\n await signOut();\n } catch {\n // no-op - if user is not logged in, this is expected to throw an error\n }\n }\n\n getProvider(): AurumRpcProvider | null {\n return this.provider;\n }\n\n private static async initializeChainData(): Promise<void> {\n if (this.chainIdMap !== null) return; // Already initialized\n\n const [allChains, { http }] = await Promise.all([import('viem/chains'), import('viem')]);\n\n const chains = Object.values(allChains).filter(\n (chain) => typeof chain === 'object' && chain !== null && 'id' in chain,\n ) as Chain[];\n\n this.chainIdMap = new Map(chains.map((chain) => [chain.id, chain]));\n\n this.viemChains = chains;\n this.viemTransports = chains.reduce(\n (acc, chain) => {\n acc[chain.id] = http() as Transport;\n return acc;\n },\n {} as Record<number, Transport>,\n );\n }\n\n private async getPublicClientForChain(chainId: number): Promise<PublicClient> {\n if (this.publicClientCache.has(chainId)) {\n return this.publicClientCache.get(chainId)!;\n }\n\n await EmailAdapter.initializeChainData();\n\n const viemChain = EmailAdapter.chainIdMap!.get(chainId);\n if (!viemChain) {\n throw new Error(`Chain ${chainId} not supported`);\n }\n\n const { createPublicClient, http } = await import('viem');\n\n const publicClient = createPublicClient({\n chain: viemChain,\n transport: http(),\n });\n\n this.publicClientCache.set(chainId, publicClient);\n return publicClient;\n }\n\n /**\n * Initializes CDP and creates the provider.\n * Called by ensureInitialized() - deduplication handled via initPromise.\n */\n private async initializeProvider(): Promise<void> {\n const { initialize } = await import('@coinbase/cdp-core');\n\n await initialize({\n projectId: this.projectId,\n ethereum: {\n createOnLogin: 'eoa',\n },\n });\n\n this.provider = await this.createProvider();\n }\n\n /**\n * Special case:\n * Coinbase default provider does not support generic read methods like eth_getBalance.\n * Wraps the provider to send unsupported methods to a public RPC endpoint.\n */\n private async createProvider(): Promise<EmailProvider | null> {\n try {\n await EmailAdapter.initializeChainData();\n\n const { createCDPEmbeddedWallet } = await import('@coinbase/cdp-core');\n\n const wallet = createCDPEmbeddedWallet({\n chains: EmailAdapter.viemChains as [Chain, ...Chain[]],\n transports: EmailAdapter.viemTransports as Record<number, Transport>,\n });\n\n const base = wallet.provider as EmailProvider;\n const getPublicClient = this.getPublicClientForChain.bind(this);\n\n const wrapped: EmailProvider = {\n ...base,\n async request<T = unknown>(args: { method: string; params?: unknown[] | object }): Promise<T> {\n try {\n return await base.request<T>(args);\n } catch (err: unknown) {\n const msg = String((err as Error)?.message || '');\n const isUnsupported =\n msg.includes('not supported') ||\n msg.includes('Unsupported') ||\n (err as { code?: number })?.code === -32601;\n\n if (isUnsupported) {\n // Get current chainId to use the correct RPC endpoint\n let chainId: number;\n try {\n const chainIdHex = await base.request<string>({ method: 'eth_chainId', params: [] });\n chainId = parseInt(chainIdHex, 16);\n } catch {\n sentryLogger.error('Failed to get chainId for fallback request');\n throw new Error('Failed to get chainId for fallback request');\n }\n\n // Get or create publicClient for this chain\n const publicClient = await getPublicClient(chainId);\n\n return (await publicClient.transport.request({\n method: args.method as unknown as string,\n params: Array.isArray(args.params)\n ? (args.params as unknown[])\n : args.params\n ? [args.params as unknown]\n : undefined,\n })) as T;\n }\n throw err;\n }\n },\n };\n\n return wrapped;\n } catch (error) {\n sentryLogger.error('Failed to initialize Email provider', { error });\n return null;\n }\n }\n\n // Email wallets don't support account switching - user must re-authenticate to change accounts\n onAccountsChanged(): void {}\n removeListeners(): void {}\n}\n","import { WalletAdapter } from '@src/types/internal';\nimport { WalletsConfig } from '@aurum-sdk/types';\nimport {\n AppKitAdapter,\n RabbyAdapter,\n BraveAdapter,\n LedgerAdapter,\n PhantomAdapter,\n CoinbaseWalletAdapter,\n MetaMaskAdapter,\n WalletConnectAdapter,\n EmailAdapter,\n} from '@src/wallet-adapters';\n\ninterface CreateWalletAdaptersParams {\n walletsConfig?: WalletsConfig;\n appName: string;\n appLogoUrl?: string;\n modalZIndex: number;\n theme: 'light' | 'dark';\n}\n\n/**\n * Creates all wallet adapters with the provided configuration.\n * Filtering (via `wallets.exclude`) is handled at render time in AurumCore.\n */\nexport function createWalletAdapters({\n walletsConfig,\n appName,\n appLogoUrl,\n modalZIndex,\n theme,\n}: CreateWalletAdaptersParams): WalletAdapter[] {\n return [\n new EmailAdapter({ projectId: walletsConfig?.email?.projectId }),\n new MetaMaskAdapter(),\n new WalletConnectAdapter({ projectId: walletsConfig?.walletConnect?.projectId, appName }),\n new CoinbaseWalletAdapter({ appName, appLogoUrl }),\n new PhantomAdapter(),\n new RabbyAdapter(),\n new BraveAdapter(),\n new LedgerAdapter({ walletConnectProjectId: walletsConfig?.walletConnect?.projectId }),\n new AppKitAdapter({ projectId: walletsConfig?.walletConnect?.projectId, appName, modalZIndex, theme }),\n ];\n}\n","import type { AurumRpcProvider } from '@aurum-sdk/types';\n\n/**\n * RpcProvider acts as a default provider when no wallet is connected.\n * It accepts eth_requestAccounts to prompt the wallet modal to connect.\n * It accepts eth_accounts and returns [].\n * It rejects all other methods.\n */\nexport class RpcProvider implements AurumRpcProvider {\n readonly isConnected = false;\n readonly chainId = '0x1';\n readonly networkVersion = '1';\n readonly selectedAddress = null;\n\n private handleConnect: () => Promise<string>;\n\n constructor(handleConnect: () => Promise<string>) {\n this.handleConnect = handleConnect;\n }\n\n async request<T = unknown>(args: { method: string; params?: unknown[] | object }): Promise<T> {\n const { method } = args;\n\n switch (method) {\n // Account methods - return empty when not connected\n case 'eth_accounts':\n return [] as T;\n\n // Trigger connection flow\n case 'enable':\n case 'eth_requestAccounts':\n if (this.handleConnect) {\n const address = await this.handleConnect();\n return [address] as T;\n } else {\n throw new Error('No wallet connection available. Please use aurum.connect() instead.');\n }\n\n // Chain/network information\n case 'eth_chainId':\n return this.chainId as T;\n\n case 'net_version':\n return this.networkVersion as T;\n\n // Default case for rest of methods\n default:\n throw new Error(\n `Method ${method} requires an active connection to a JSON-RPC provider. Please connect a wallet.`,\n );\n }\n }\n\n // No-op: disconnected provider doesn't emit events\n on(): void {}\n\n // No-op: disconnected provider doesn't manage listeners\n removeListener(): void {}\n\n // No listeners to notify in disconnected state\n emit(): boolean {\n return false;\n }\n}\n","import { Chain } from 'viem';\nimport { AurumCore } from '@src/AurumCore';\nimport type { WalletAdapter, WalletConnectionResult } from '@src/types/internal';\nimport type {\n UserInfo,\n AurumRpcProvider,\n AurumConfig,\n NonNullableBrandConfig,\n WalletsConfig,\n WalletId,\n EmailAuthStartResult,\n EmailAuthVerifyResult,\n WalletConnectSessionResult,\n} from '@aurum-sdk/types';\n\n/**\n * Aurum SDK - Web3 Wallet Integration Library\n */\n\nexport class Aurum {\n private core: AurumCore;\n\n /**\n * Creates a new Aurum instance.\n *\n * @param config - Configuration for branding and wallets\n *\n * @example\n * ```typescript\n * const aurum = new Aurum({\n * brand: { appName: 'Your App Name' },\n * wallets: {\n * email: { projectId: 'cdp-project-id' },\n * walletConnect: { projectId: 'reown-project-id' },\n * },\n * });\n * ```\n */\n constructor(config: AurumConfig) {\n this.core = new AurumCore(config);\n }\n\n /**\n * EIP1193 compatible RPC provider that can be used to interact with the connected wallet.\n * Compatible with viem, ethers.js, and other web3 libraries.\n *\n * @example\n * ```typescript\n * const balance = await aurum.rpcProvider.request({\n * method: 'eth_getBalance',\n * params: [address, 'latest']\n * });\n * ```\n */\n public get rpcProvider(): AurumRpcProvider {\n return this.core.rpcProvider;\n }\n\n /**\n * Indicates whether the SDK is finished initializing.\n */\n public get ready(): boolean {\n return this.core.ready;\n }\n\n /**\n * Returns the resolved brand configuration.\n * @internal Used by widget components (i.e. ConnectWidget)\n */\n public get brandConfig(): NonNullableBrandConfig {\n return this.core.resolvedBrandConfig;\n }\n\n /**\n * Returns the wallet adapters configured for this instance.\n * @internal Used by widget components (i.e. ConnectWidget)\n */\n public get walletAdapters(): WalletAdapter[] {\n return this.core.walletAdapters;\n }\n\n /**\n * Returns the set of excluded wallet IDs.\n * @internal Used by widget components (i.e. ConnectWidget)\n */\n public get excludedWalletIds(): Set<WalletId> {\n return this.core.excludedWalletIds;\n }\n\n /**\n * Waits for the SDK to finish initializing.\n * This should be called before calling methods with the provider to ensure provider is set (such as after a page refresh).\n *\n * @example\n * ```typescript\n * await aurum.whenReady();\n * const balance = await aurum.rpcProvider.request({\n * method: 'eth_getBalance',\n * params: [address, 'latest']\n * });\n * ```\n */\n public async whenReady(): Promise<void> {\n return this.core.whenReady();\n }\n\n /**\n * Opens the wallet connection modal or connects directly to a specific wallet.\n *\n * @param walletId - Optional wallet ID for direct connection (bypasses modal).\n * Cannot be 'email' or 'walletconnect' (use their dedicated methods).\n * @returns The connected wallet address\n * @throws Error if user closes the modal without connecting a wallet\n *\n * @example\n * ```typescript\n * // Open modal for user to choose\n * const address = await aurum.connect();\n *\n * // Or connect directly to a specific wallet\n * import { WalletId } from '@aurum-sdk/types';\n * const address = await aurum.connect(WalletId.MetaMask);\n * ```\n */\n public async connect(walletId?: WalletId): Promise<`0x${string}`> {\n return this.core.connect(walletId);\n }\n\n /**\n * Disconnects the currently connected wallet and clears the connection state.\n *\n * @example\n * ```typescript\n * await aurum.disconnect();\n * ```\n */\n public async disconnect(): Promise<void> {\n return this.core.disconnect();\n }\n\n /**\n * Gets information about the currently connected user.\n *\n * @returns User information including wallet address and wallet name, or undefined if no wallet is connected\n *\n * @example\n * ```typescript\n * const userInfo = await aurum.getUserInfo();\n * if (userInfo) {\n * console.log(`Connected to ${userInfo.walletName}: ${userInfo.publicAddress}`);\n * } else {\n * console.log('No wallet connected');\n * }\n * ```\n */\n public async getUserInfo(): Promise<UserInfo | undefined> {\n return this.core.getUserInfo();\n }\n\n /**\n * Checks if a wallet is currently connected.\n *\n * @returns `true` if a wallet is connected, `false` otherwise\n *\n * @example\n * ```typescript\n * const isConnected = await aurum.isConnected();\n * console.log('Is user connected:', isConnected);\n * ```\n */\n public async isConnected(): Promise<boolean> {\n return this.core.isConnected();\n }\n\n /**\n * Gets the current chain ID of the connected wallet.\n *\n * @returns The current chain ID as a number\n *\n * @example\n * ```typescript\n * const chainId = await aurum.getChainId();\n * console.log('Connected to chain:', chainId);\n * ```\n */\n public async getChainId(): Promise<number> {\n return this.core.getChainId();\n }\n\n /**\n * Switches the connected wallet to a different blockchain network.\n * If the chain is not added to the wallet, it will attempt to add it using the provided chain config.\n *\n * @param chainId - The chain ID to switch to (can be hex string, decimal string, or number)\n * @param chain - Optional viem Chain object with chain configuration (required if chain needs to be added)\n * @throws Error if the switch fails or the user rejects the request\n *\n * @example\n * ```typescript\n * import { sepolia } from 'viem/chains';\n *\n * await aurum.switchChain(sepolia.id, sepolia);\n * ```\n */\n public async switchChain(chainId: `0x${string}` | string | number, chain?: Chain): Promise<void> {\n return this.core.switchChain(chainId, chain);\n }\n\n /**\n * Updates the brand configuration at runtime.\n * Changes will be reflected the next time the connect modal is opened.\n *\n * @param newConfig - Partial brand config to merge with existing config\n *\n * @example\n * ```typescript\n * aurum.updateBrandConfig({\n * theme: 'light',\n * });\n * ```\n */\n public updateBrandConfig(newConfig: Partial<NonNullableBrandConfig>): void {\n this.core.updateBrandConfig(newConfig);\n }\n\n /**\n * Updates the wallets configuration at runtime.\n * Changes will be reflected the next time the connect modal is opened.\n *\n * @param newConfig - Partial wallets config to update (currently supports `exclude`)\n *\n * @example\n * ```typescript\n * import { WalletId } from '@aurum-sdk/types';\n *\n * aurum.updateWalletsConfig({\n * exclude: [WalletId.Email, WalletId.AppKit],\n * });\n * ```\n */\n public updateWalletsConfig(newConfig: Partial<Pick<WalletsConfig, 'exclude'>>): void {\n this.core.updateWalletsConfig(newConfig);\n }\n\n /**\n * Notifies the SDK of a widget-initiated connection.\n * Updates internal state so getUserInfo(), isConnected(), etc. work correctly.\n * @internal Used by ConnectWidget - not intended for direct use\n */\n public async handleWidgetConnection(result: WalletConnectionResult): Promise<void> {\n return this.core.handleWidgetConnection(result);\n }\n\n /* ===== HEADLESS / WHITELABEL API ===== */\n\n /**\n * Starts the email authentication flow by sending an OTP to the provided email.\n * Use with `emailAuthVerify()` to complete the connection.\n *\n * @param email - The email address to send the OTP to\n * @returns Object containing flowId to use with emailAuthVerify\n * @throws Error if email wallet is not configured\n *\n * @example\n * ```typescript\n * const { flowId } = await aurum.emailAuthStart('user@example.com');\n * // User receives OTP email, then verify:\n * const { address, email, isNewUser } = await aurum.emailAuthVerify(flowId, '123456');\n * ```\n */\n public async emailAuthStart(email: string): Promise<EmailAuthStartResult> {\n return this.core.emailAuthStart(email);\n }\n\n /**\n * Verifies the email OTP and completes the wallet connection.\n *\n * @param flowId - The flowId returned from emailAuthStart\n * @param otp - The OTP code the user received via email\n * @returns Object containing the connected address and email\n * @throws Error if verification fails\n *\n * @example\n * ```typescript\n * const { flowId } = await aurum.emailAuthStart('user@example.com');\n * // User receives OTP...\n * const { address, email, isNewUser } = await aurum.emailAuthVerify(flowId, '123456');\n * console.log(`Connected: ${address} (${email})`);\n * ```\n */\n public async emailAuthVerify(flowId: string, otp: string): Promise<EmailAuthVerifyResult> {\n return this.core.emailAuthVerify(flowId, otp);\n }\n\n /**\n * Initiates a WalletConnect session and returns the URI for displaying a custom QR code.\n * Use this for building custom QR code UIs instead of using the built-in modal.\n *\n * @returns Object containing the URI and a function to wait for the connection\n * @throws Error if WalletConnect is not configured\n *\n * @example\n * ```typescript\n * // Get the WalletConnect URI\n * const { uri, waitForConnection } = await aurum.getWalletConnectSession();\n *\n * // Display your custom QR code with the URI\n * myQRCodeComponent.render(uri);\n *\n * // Wait for user to scan and approve\n * const address = await waitForConnection();\n * console.log('Connected:', address);\n * ```\n */\n public async getWalletConnectSession(): Promise<WalletConnectSessionResult> {\n return this.core.getWalletConnectSession();\n }\n}\n"],"mappings":"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","names":["jsx","WalletId","WalletId","mainnet","getLogoDataUri","WalletId","WalletName","WalletId","WalletName","getLogoDataUri","getLogoDataUri","WalletId","WalletName","WalletId","WalletName","getLogoDataUri","getLogoDataUri","WalletId","WalletName","WalletId","WalletName","getLogoDataUri","getLogoDataUri","WalletId","WalletName","WalletId","WalletName","getLogoDataUri","getLogoDataUri","WalletId","WalletName","getLogoDataUri","WalletId","WalletName","WalletId","WalletName","getLogoDataUri","getLogoDataUri","WalletId","WalletName","WalletId","WalletName","getLogoDataUri","uri","WalletId","WalletName","getLogoDataUri","WalletId","WalletName","getLogoDataUri","WalletId","WalletId"]}