@solana/connector 0.2.1 → 0.2.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.
- package/dist/{chunk-HPQ5T32K.mjs → chunk-3623Z2QL.mjs} +4 -4
- package/dist/{chunk-HPQ5T32K.mjs.map → chunk-3623Z2QL.mjs.map} +1 -1
- package/dist/{chunk-UCISIAOG.mjs → chunk-A7WQ3K75.mjs} +3 -3
- package/dist/{chunk-UCISIAOG.mjs.map → chunk-A7WQ3K75.mjs.map} +1 -1
- package/dist/{chunk-SITQ4JWM.js → chunk-BF67LVVM.js} +17 -21
- package/dist/chunk-BF67LVVM.js.map +1 -0
- package/dist/{chunk-MDR4Y37Z.mjs → chunk-DFHJYZKZ.mjs} +5 -4
- package/dist/chunk-DFHJYZKZ.mjs.map +1 -0
- package/dist/chunk-E3DAIOYS.mjs +22 -0
- package/dist/chunk-E3DAIOYS.mjs.map +1 -0
- package/dist/chunk-FG7HTQTV.mjs +7 -0
- package/dist/chunk-FG7HTQTV.mjs.map +1 -0
- package/dist/{chunk-BJAVJQLK.js → chunk-I2XX5FUG.js} +6 -6
- package/dist/{chunk-BJAVJQLK.js.map → chunk-I2XX5FUG.js.map} +1 -1
- package/dist/chunk-L5FWMNWO.js +9 -0
- package/dist/chunk-L5FWMNWO.js.map +1 -0
- package/dist/{chunk-HN5AJF7F.js → chunk-NLPEO5GT.js} +5 -5
- package/dist/{chunk-HN5AJF7F.js.map → chunk-NLPEO5GT.js.map} +1 -1
- package/dist/chunk-QST7XLMB.js +26 -0
- package/dist/chunk-QST7XLMB.js.map +1 -0
- package/dist/{chunk-ZZTY3O4N.mjs → chunk-SJCQ3KZE.mjs} +4 -7
- package/dist/chunk-SJCQ3KZE.mjs.map +1 -0
- package/dist/{chunk-IDTUFDNB.mjs → chunk-SQ2JEA2M.mjs} +58 -11
- package/dist/chunk-SQ2JEA2M.mjs.map +1 -0
- package/dist/{chunk-BZ2VBJCZ.js → chunk-TRSJSU33.js} +141 -94
- package/dist/chunk-TRSJSU33.js.map +1 -0
- package/dist/{chunk-4Z2F6ERB.js → chunk-VVLY6QPI.js} +49 -48
- package/dist/chunk-VVLY6QPI.js.map +1 -0
- package/dist/compat.js +2 -2
- package/dist/compat.mjs +1 -1
- package/dist/fireblocks-FLKRTJU3.js +67 -0
- package/dist/fireblocks-FLKRTJU3.js.map +1 -0
- package/dist/fireblocks-KCJV3GEK.mjs +65 -0
- package/dist/fireblocks-KCJV3GEK.mjs.map +1 -0
- package/dist/headless.d.mts +6 -11
- package/dist/headless.d.ts +6 -11
- package/dist/headless.js +147 -147
- package/dist/headless.mjs +4 -4
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +188 -188
- package/dist/index.mjs +5 -5
- package/dist/privy-6LYDE24Z.mjs +64 -0
- package/dist/privy-6LYDE24Z.mjs.map +1 -0
- package/dist/privy-ID4YFTKR.js +66 -0
- package/dist/privy-ID4YFTKR.js.map +1 -0
- package/dist/protocol-G-z1lRqo.d.mts +166 -0
- package/dist/protocol-G-z1lRqo.d.ts +166 -0
- package/dist/react.d.mts +3 -3
- package/dist/react.d.ts +3 -3
- package/dist/react.js +49 -49
- package/dist/react.mjs +2 -2
- package/dist/remote.d.mts +46 -0
- package/dist/remote.d.ts +46 -0
- package/dist/remote.js +212 -0
- package/dist/remote.js.map +1 -0
- package/dist/remote.mjs +198 -0
- package/dist/remote.mjs.map +1 -0
- package/dist/server.d.mts +141 -0
- package/dist/server.d.ts +141 -0
- package/dist/server.js +189 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +187 -0
- package/dist/server.mjs.map +1 -0
- package/dist/{standard-shim-tmnQelaJ.d.ts → standard-shim-Cg6fmjK_.d.ts} +10 -0
- package/dist/{standard-shim-CGB88PPO.d.mts → standard-shim-Cz4UNS7t.d.mts} +10 -0
- package/dist/{walletconnect-447EY3OJ.js → walletconnect-F2M3PAAN.js} +8 -8
- package/dist/{walletconnect-447EY3OJ.js.map → walletconnect-F2M3PAAN.js.map} +1 -1
- package/dist/walletconnect-Z6LPGALR.mjs +3 -0
- package/dist/{walletconnect-U455PO4I.mjs.map → walletconnect-Z6LPGALR.mjs.map} +1 -1
- package/package.json +27 -2
- package/dist/chunk-4Z2F6ERB.js.map +0 -1
- package/dist/chunk-BZ2VBJCZ.js.map +0 -1
- package/dist/chunk-IDTUFDNB.mjs.map +0 -1
- package/dist/chunk-MDR4Y37Z.mjs.map +0 -1
- package/dist/chunk-SITQ4JWM.js.map +0 -1
- package/dist/chunk-ZZTY3O4N.mjs.map +0 -1
- package/dist/walletconnect-U455PO4I.mjs +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/session.ts","../src/lib/wallet/standard-shim.ts","../src/utils/network.ts","../src/utils/cluster.ts","../src/lib/constants.ts","../src/lib/core/state-manager.ts","../src/lib/core/event-emitter.ts","../src/lib/core/debug-metrics.ts","../src/lib/core/base-collaborator.ts","../src/lib/wallet/authenticity-verifier.ts","../src/lib/wallet/wallet-icon-overrides.ts","../src/lib/wallet/detector.ts","../src/lib/wallet/connection-manager.ts","../src/lib/wallet/auto-connector.ts","../src/lib/cluster/cluster-manager.ts","../src/lib/transaction/transaction-tracker.ts","../src/lib/health/health-monitor.ts","../src/lib/core/connector-client.ts","../src/lib/utils/polyfills.ts","../src/lib/wallet/enhanced-storage.ts","../src/config/default-config.ts","../src/config/schemas.ts","../src/utils/formatting.ts","../src/utils/clipboard.ts","../src/lib/transaction/transaction-validator.ts","../src/lib/transaction/transaction-signer.ts","../src/lib/transaction/kit-transaction-signer.ts"],"names":["presets","isMainnet","name","logger","ready","registry","WalletUiStorage","formatted","ClipboardErrorType","isAddress","error","message","getBase58Decoder","createAddress"],"mappings":"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","file":"chunk-SQ2JEA2M.mjs","sourcesContent":["/**\n * Wallet Session Types - Framework-kit-inspired connector/session abstraction\n *\n * Provides stable connector identity, explicit session management, and\n * a clear status state machine for wallet connections.\n */\n\nimport type { Wallet, WalletAccount } from '@wallet-standard/base';\nimport type { Address } from '@solana/addresses';\n\n// ============================================================================\n// Connector Identity\n// ============================================================================\n\n/**\n * Branded string type for stable wallet connector identification.\n * Format: `wallet-standard:{kebab-cased-wallet-name}` or `walletconnect`\n *\n * @example\n * - 'wallet-standard:phantom'\n * - 'wallet-standard:solflare'\n * - 'walletconnect'\n */\nexport type WalletConnectorId = string & { readonly __brand: 'WalletConnectorId' };\n\n/**\n * Create a connector ID from a wallet name\n */\nexport function createConnectorId(walletName: string): WalletConnectorId {\n const kebab = walletName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return `wallet-standard:${kebab}` as WalletConnectorId;\n}\n\n/**\n * Check if a string is a valid WalletConnectorId\n *\n * Valid formats:\n * - `wallet-standard:<adapter-name>` - Wallet Standard adapters (e.g., 'wallet-standard:phantom')\n * - `walletconnect` - WalletConnect connector\n * - `mwa:<adapter-name>` - Mobile Wallet Adapter (MWA) connectors for mobile wallets\n * (e.g., 'mwa:phantom')\n *\n * The 'mwa:' prefix identifies connectors using the Solana Mobile Wallet Adapter protocol,\n * which enables communication with mobile wallet apps on iOS and Android devices.\n */\nexport function isWalletConnectorId(value: string): value is WalletConnectorId {\n return (\n typeof value === 'string' &&\n (value.startsWith('wallet-standard:') || value === 'walletconnect' || value.startsWith('mwa:'))\n );\n}\n\n/**\n * Extract the wallet name from a connector ID (for display purposes)\n */\nexport function getWalletNameFromConnectorId(connectorId: WalletConnectorId): string {\n if (connectorId === 'walletconnect') return 'WalletConnect';\n if (connectorId.startsWith('mwa:')) return connectorId.slice(4);\n if (connectorId.startsWith('wallet-standard:')) {\n // Convert kebab-case to Title Case\n const kebab = connectorId.slice('wallet-standard:'.length);\n return kebab\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n }\n return connectorId;\n}\n\n// ============================================================================\n// Connector Metadata\n// ============================================================================\n\n/**\n * Serializable metadata about a wallet connector.\n * This is what gets stored in state (not the Wallet itself).\n */\nexport interface WalletConnectorMetadata {\n /** Stable connector identifier */\n id: WalletConnectorId;\n /** Human-readable display name */\n name: string;\n /** Wallet icon (data URI or URL) */\n icon: string;\n /** Whether this connector is ready to connect */\n ready: boolean;\n /** Supported Solana chains (e.g., 'solana:mainnet', 'solana:devnet') */\n chains: readonly string[];\n /** Supported wallet standard features */\n features: readonly string[];\n}\n\n/**\n * Full wallet connector with methods (not stored in state, kept in registry)\n */\nexport interface WalletConnector extends WalletConnectorMetadata {\n /** The underlying Wallet Standard wallet (reference, not serialized) */\n readonly wallet: Wallet;\n\n /**\n * Connect to the wallet\n * @param options Connection options\n * @returns Session with accounts\n */\n connect(options?: ConnectOptions): Promise<WalletSession>;\n\n /**\n * Disconnect from the wallet\n */\n disconnect(): Promise<void>;\n\n /**\n * Check if this connector supports a specific feature\n */\n supportsFeature(feature: string): boolean;\n}\n\n// ============================================================================\n// Connection Options\n// ============================================================================\n\n/**\n * Options for connecting to a wallet\n */\nexport interface ConnectOptions {\n /**\n * Attempt silent connection without user prompt.\n * If the wallet has previously authorized this app, it may connect\n * without showing a popup.\n * @default false\n */\n silent?: boolean;\n\n /**\n * If silent connection fails, allow falling back to interactive connection.\n * @default true (when silent is true)\n */\n allowInteractiveFallback?: boolean;\n\n /**\n * Preferred account address to select after connection.\n * If not available, the first account will be selected.\n */\n preferredAccount?: Address;\n}\n\n// ============================================================================\n// Session\n// ============================================================================\n\n/**\n * Account information within a session\n */\nexport interface SessionAccount {\n /** Account address */\n address: Address;\n /** Display label (if provided by wallet) */\n label?: string;\n /** Wallet standard account reference */\n readonly account: WalletAccount;\n}\n\n/**\n * Active wallet session with signing capabilities.\n * Created after successful connection.\n */\nexport interface WalletSession {\n /** Connector that created this session */\n connectorId: WalletConnectorId;\n\n /** All available accounts in this session */\n accounts: SessionAccount[];\n\n /** Currently selected account */\n selectedAccount: SessionAccount;\n\n /**\n * Subscribe to account changes within the session.\n * Returns unsubscribe function.\n */\n onAccountsChanged(listener: (accounts: SessionAccount[]) => void): () => void;\n\n /**\n * Select a different account within the session\n */\n selectAccount(address: Address): void;\n}\n\n// ============================================================================\n// Wallet Status State Machine\n// ============================================================================\n\n/**\n * Disconnected state - no wallet connected\n */\nexport interface WalletStatusDisconnected {\n status: 'disconnected';\n}\n\n/**\n * Connecting state - connection in progress\n */\nexport interface WalletStatusConnecting {\n status: 'connecting';\n /** Connector being connected to */\n connectorId: WalletConnectorId;\n}\n\n/**\n * Connected state - wallet successfully connected\n */\nexport interface WalletStatusConnected {\n status: 'connected';\n /** Active session */\n session: WalletSession;\n}\n\n/**\n * Error state - connection or session error\n */\nexport interface WalletStatusError {\n status: 'error';\n /** Error that occurred */\n error: Error;\n /** Connector that failed (if known) */\n connectorId?: WalletConnectorId;\n /** Whether this error is recoverable */\n recoverable: boolean;\n}\n\n/**\n * Union of all wallet status states.\n * Use discriminated union pattern for type narrowing.\n *\n * @example\n * ```ts\n * if (wallet.status === 'connected') {\n * // TypeScript knows wallet.session exists\n * console.log(wallet.session.selectedAccount.address);\n * }\n * ```\n */\nexport type WalletStatus =\n | WalletStatusDisconnected\n | WalletStatusConnecting\n | WalletStatusConnected\n | WalletStatusError;\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isDisconnected(status: WalletStatus): status is WalletStatusDisconnected {\n return status.status === 'disconnected';\n}\n\nexport function isConnecting(status: WalletStatus): status is WalletStatusConnecting {\n return status.status === 'connecting';\n}\n\nexport function isConnected(status: WalletStatus): status is WalletStatusConnected {\n return status.status === 'connected';\n}\n\nexport function isStatusError(status: WalletStatus): status is WalletStatusError {\n return status.status === 'error';\n}\n\n/**\n * @deprecated Use isStatusError instead. This alias is kept for backward compatibility.\n */\nexport const isWalletStatusError = isStatusError;\n\n// ============================================================================\n// Initial State\n// ============================================================================\n\n/**\n * Initial disconnected wallet status\n */\nexport const INITIAL_WALLET_STATUS: WalletStatusDisconnected = {\n status: 'disconnected',\n};\n\n// ============================================================================\n// Legacy Compatibility\n// ============================================================================\n\n/**\n * Extract legacy-style state from WalletStatus.\n * Useful for backwards compatibility during migration.\n *\n * @deprecated Use the new WalletStatus discriminated union directly\n */\nexport function toLegacyWalletState(wallet: WalletStatus): {\n connected: boolean;\n connecting: boolean;\n selectedAccount: Address | null;\n accounts: Array<{ address: Address; label?: string }>;\n} {\n switch (wallet.status) {\n case 'disconnected':\n return { connected: false, connecting: false, selectedAccount: null, accounts: [] };\n case 'connecting':\n return { connected: false, connecting: true, selectedAccount: null, accounts: [] };\n case 'connected':\n return {\n connected: true,\n connecting: false,\n selectedAccount: wallet.session.selectedAccount.address,\n accounts: wallet.session.accounts.map(a => ({ address: a.address, label: a.label })),\n };\n case 'error':\n return { connected: false, connecting: false, selectedAccount: null, accounts: [] };\n }\n}\n","import type {\n Wallet as BaseWallet,\n WalletAccount as BaseWalletAccount,\n WalletWithFeatures,\n} from '@wallet-standard/base';\nimport type {\n StandardConnectFeature,\n StandardDisconnectFeature,\n StandardEventsFeature,\n} from '@wallet-standard/features';\n\n/*\n * @solana/connector - wallet-standard integration\n *\n * Simplified wallet standard types and registry access\n */\n\n// Re-export wallet standard types for convenience\nexport type { BaseWallet as Wallet, BaseWalletAccount as WalletAccount, WalletWithFeatures };\n\n// Common feature combinations\nexport type StandardFeatures = StandardConnectFeature & StandardDisconnectFeature & StandardEventsFeature;\nexport type WalletWithStandardFeatures = WalletWithFeatures<StandardFeatures>;\n\nexport interface WalletsRegistry {\n get(): readonly BaseWallet[];\n on(event: 'register' | 'unregister', callback: (wallet: BaseWallet) => void): () => void;\n}\n\n// Legacy aliases for backward compatibility\nexport type WalletStandardWallet = BaseWallet;\nexport type WalletStandardAccount = BaseWalletAccount;\n\n// Simple registry reference\nlet registry: WalletsRegistry | null = null;\n\n// Registry initialization state for the `ready` Promise\nlet registryInitPromise: Promise<void> | null = null;\nlet registryInitResolve: (() => void) | null = null;\n\n/**\n * Promise that resolves when the wallet registry is initialized and ready.\n *\n * Use this when you need deterministic wallet detection (e.g., auto-reconnect,\n * checking if a specific wallet is installed before showing UI).\n *\n * Resolves immediately if the registry is already available.\n * Rejects only on fatal errors (e.g., module load failure in browser environment).\n *\n * @example\n * ```ts\n * import { ready, getWalletsRegistry } from '@solana/connector';\n *\n * // Wait for registry to be ready before detecting wallets\n * await ready;\n * const wallets = getWalletsRegistry().get();\n * ```\n */\nexport const ready: Promise<void> = new Promise((resolve, reject) => {\n // SSR: resolve immediately, no wallets available server-side\n if (typeof window === 'undefined') {\n resolve();\n return;\n }\n\n // Store resolver for deferred resolution\n registryInitResolve = resolve;\n\n // Check if navigator.wallets is already available (injected by wallet extensions)\n const nav = window.navigator as Navigator & { wallets?: WalletsRegistry };\n if (nav.wallets && typeof nav.wallets.get === 'function') {\n registry = nav.wallets;\n resolve();\n return;\n }\n\n // Fallback: dynamically import @wallet-standard/app\n // This handles cases where no wallet extension has set navigator.wallets\n registryInitPromise = import('@wallet-standard/app')\n .then(mod => {\n const walletStandardRegistry = mod.getWallets?.();\n if (walletStandardRegistry) {\n registry = walletStandardRegistry;\n }\n resolve();\n })\n .catch(err => {\n // Resolve anyway to allow graceful degradation - wallets just won't be detected\n // Only reject on truly fatal errors (extremely rare)\n console.warn('[standard-shim] Failed to load @wallet-standard/app:', err);\n resolve();\n });\n});\n\n/**\n * Get the wallets registry - simplified approach\n *\n * ⚠️ RACE CONDITION WARNING:\n * The dynamic import of '@wallet-standard/app' is asynchronous. If `window.navigator.wallets`\n * is not pre-populated by a wallet extension, the registry may be undefined briefly during\n * initial page load. Calls to `getWalletsRegistry().get()` during this window will return\n * an empty array as graceful degradation.\n *\n * For deterministic wallet detection (e.g., auto-reconnect, pre-checking wallet availability),\n * await the exported `ready` Promise before calling `get()`:\n *\n * @example\n * ```ts\n * await ready;\n * const wallets = getWalletsRegistry().get(); // Guaranteed to have registry loaded\n * ```\n */\nexport function getWalletsRegistry(): WalletsRegistry {\n if (typeof window === 'undefined') {\n return {\n get: () => [],\n on: () => () => {},\n };\n }\n\n // Trigger initialization if not already started (lazy init for sync callers)\n // Note: The `ready` Promise constructor already handles this, but this ensures\n // registry setup kicks off even if `ready` hasn't been imported yet.\n if (!registry && !registryInitPromise) {\n const nav = window.navigator as Navigator & { wallets?: WalletsRegistry };\n\n if (nav.wallets && typeof nav.wallets.get === 'function') {\n registry = nav.wallets;\n registryInitResolve?.();\n } else {\n // ASYNC: This import is asynchronous. Until it completes, `registry` remains null\n // and get() will return an empty array. This is expected graceful degradation.\n // Consumers needing deterministic detection should `await ready` first.\n registryInitPromise = import('@wallet-standard/app')\n .then(mod => {\n const walletStandardRegistry = mod.getWallets?.();\n if (walletStandardRegistry) {\n registry = walletStandardRegistry;\n }\n registryInitResolve?.();\n })\n .catch(() => {\n registryInitResolve?.();\n });\n }\n }\n\n return {\n get: () => {\n try {\n const nav = window.navigator as Navigator & { wallets?: WalletsRegistry };\n const activeRegistry = nav.wallets || registry;\n if (activeRegistry && typeof activeRegistry.get === 'function') {\n const wallets = activeRegistry.get();\n return Array.isArray(wallets) ? wallets : [];\n }\n return [];\n } catch {\n return [];\n }\n },\n on: (event, callback) => {\n try {\n const nav = window.navigator as Navigator & { wallets?: WalletsRegistry };\n const activeRegistry = nav.wallets || registry;\n if (activeRegistry && typeof activeRegistry.on === 'function') {\n return activeRegistry.on(event, callback);\n }\n return () => {};\n } catch {\n return () => {};\n }\n },\n };\n}\n\n/**\n * Reset wallet registry cache\n * ⚠️ FOR TESTING ONLY - Do not use in production code\n * @internal\n */\nexport function __resetWalletRegistryForTesting(): void {\n registry = null;\n registryInitPromise = null;\n // Note: registryInitResolve is not reset as the original `ready` Promise\n // is already resolved/rejected and cannot be reset. Tests should reload\n // the module if they need a fresh `ready` Promise.\n}\n","/**\n * @solana/connector - Network utilities\n *\n * Utilities for translating between different Solana network naming conventions.\n * Ensures compatibility with WalletUI (SolanaClusterId) and Gill types.\n *\n * Primary type: SolanaNetwork - normalized network names\n * External integration: Use WalletUI's SolanaClusterId for cluster operations\n */\n\nimport type { SolanaClusterId } from '@wallet-ui/core';\nimport { getPublicSolanaRpcUrl, type SolanaClusterMoniker } from '../lib/kit';\n\n/**\n * Normalized Solana network names\n *\n * This is the canonical network type used throughout the connector.\n * Use `toClusterId()` to convert to WalletUI's SolanaClusterId format.\n * Aligned with Gill's SolanaClusterMoniker type.\n */\nexport type SolanaNetwork = 'mainnet' | 'devnet' | 'testnet' | 'localnet';\n\n/**\n * Public RPC endpoints for each Solana network\n *\n * ⚠️ WARNING: These are public, rate-limited endpoints provided by Solana Labs.\n * For production applications, use a dedicated RPC provider like:\n * - Triton (https://triton.one)\n * - Helius (https://helius.dev)\n * - QuickNode (https://quicknode.com)\n * - Alchemy (https://alchemy.com)\n *\n * Note: These values are now sourced from Gill's getPublicSolanaRpcUrl for consistency.\n * Kept here for reference and backward compatibility.\n */\nexport const PUBLIC_RPC_ENDPOINTS: Record<SolanaNetwork, string> = {\n mainnet: 'https://api.mainnet-beta.solana.com',\n devnet: 'https://api.devnet.solana.com',\n testnet: 'https://api.testnet.solana.com',\n localnet: 'http://localhost:8899',\n} as const;\n\n/**\n * Normalize network name to standard format\n * Accepts various naming conventions and returns the canonical SolanaNetwork format\n *\n * @example\n * normalizeNetwork('mainnet-beta') // Returns: 'mainnet'\n * normalizeNetwork('mainnet') // Returns: 'mainnet'\n * normalizeNetwork('MAINNET') // Returns: 'mainnet'\n */\nexport function normalizeNetwork(network: string): SolanaNetwork {\n const normalized = network.toLowerCase().replace('-beta', '');\n\n switch (normalized) {\n case 'mainnet':\n return 'mainnet';\n case 'devnet':\n return 'devnet';\n case 'testnet':\n return 'testnet';\n case 'localnet':\n return 'localnet';\n default:\n // Default to mainnet for unknown networks\n return 'mainnet';\n }\n}\n\n/**\n * Convert network name to RPC format (internal)\n *\n * Mainnet uses 'mainnet-beta' in RPC URLs, while other networks don't have a suffix.\n * This is an internal implementation detail - consumers should use SolanaNetwork.\n *\n * @internal\n * @example\n * toRpcNetwork('mainnet') // Returns: 'mainnet-beta'\n * toRpcNetwork('devnet') // Returns: 'devnet'\n */\nfunction toRpcNetwork(network: SolanaNetwork): string {\n return network === 'mainnet' ? 'mainnet-beta' : network;\n}\n\n/**\n * Convert network name to WalletUI cluster ID format\n *\n * WalletUI uses the 'solana:network' format for cluster identification.\n *\n * @example\n * toClusterId('mainnet') // Returns: 'solana:mainnet'\n * toClusterId('mainnet-beta') // Returns: 'solana:mainnet' (normalized)\n */\nexport function toClusterId(network: string): SolanaClusterId {\n const normalized = normalizeNetwork(network);\n return `solana:${normalized}` as SolanaClusterId;\n}\n\n/**\n * Get the public RPC URL for a network\n *\n * ⚠️ Returns public, rate-limited endpoints. For production, use a dedicated RPC provider.\n *\n * Now uses Gill's getPublicSolanaRpcUrl for consistency with the Gill ecosystem.\n * Falls back to localnet URL for unknown networks.\n *\n * @example\n * getDefaultRpcUrl('mainnet') // Returns: 'https://api.mainnet-beta.solana.com'\n * getDefaultRpcUrl('devnet') // Returns: 'https://api.devnet.solana.com'\n */\nexport function getDefaultRpcUrl(network: string): string {\n const normalized = normalizeNetwork(network);\n\n // Use Gill's public RPC URL helper for standard clusters\n // This ensures consistency with Gill and automatic updates when Gill updates endpoints\n try {\n return getPublicSolanaRpcUrl(normalized as SolanaClusterMoniker);\n } catch {\n // Fallback to our constant for localnet or if Gill doesn't recognize the network\n return PUBLIC_RPC_ENDPOINTS[normalized] ?? PUBLIC_RPC_ENDPOINTS.localnet;\n }\n}\n\n/**\n * Check if a network is mainnet\n *\n * @example\n * isMainnet('mainnet') // Returns: true\n * isMainnet('mainnet-beta') // Returns: true\n * isMainnet('devnet') // Returns: false\n */\nexport function isMainnet(network: string): boolean {\n const normalized = normalizeNetwork(network);\n return normalized === 'mainnet';\n}\n\n/**\n * Check if a network is devnet\n *\n * @example\n * isDevnet('devnet') // Returns: true\n * isDevnet('mainnet') // Returns: false\n */\nexport function isDevnet(network: string): boolean {\n const normalized = normalizeNetwork(network);\n return normalized === 'devnet';\n}\n\n/**\n * Check if a network is testnet\n *\n * @example\n * isTestnet('testnet') // Returns: true\n * isTestnet('mainnet') // Returns: false\n */\nexport function isTestnet(network: string): boolean {\n const normalized = normalizeNetwork(network);\n return normalized === 'testnet';\n}\n\n/**\n * Check if a network is localnet\n *\n * @example\n * isLocalnet('localnet') // Returns: true\n * isLocalnet('mainnet') // Returns: false\n */\nexport function isLocalnet(network: string): boolean {\n const normalized = normalizeNetwork(network);\n return normalized === 'localnet';\n}\n\n/**\n * Get a user-friendly display name for a network\n *\n * @example\n * getNetworkDisplayName('mainnet-beta') // Returns: 'Mainnet'\n * getNetworkDisplayName('devnet') // Returns: 'Devnet'\n */\nexport function getNetworkDisplayName(network: string): string {\n const normalized = normalizeNetwork(network);\n return normalized.charAt(0).toUpperCase() + normalized.slice(1);\n}\n","/**\n * @solana/connector - Cluster utilities\n *\n * Utility functions for working with Solana clusters (networks)\n */\n\nimport type { SolanaCluster } from '@wallet-ui/core';\nimport { getExplorerLink } from '../lib/kit';\nimport { PUBLIC_RPC_ENDPOINTS } from './network';\n\n/**\n * Cluster type enum for all supported Solana cluster types\n */\nexport type ClusterType = 'mainnet' | 'devnet' | 'testnet' | 'localnet' | 'custom';\n\nfunction getMaybeStringProp(value: unknown, prop: string): string | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const record = value as Record<string, unknown>;\n const v = record[prop];\n return typeof v === 'string' ? v : undefined;\n}\n\nexport function getClusterRpcUrl(cluster: SolanaCluster | string): string {\n // Handle string input (cluster name/ID)\n if (typeof cluster === 'string') {\n const presets: Record<string, string> = {\n ...PUBLIC_RPC_ENDPOINTS,\n 'mainnet-beta': PUBLIC_RPC_ENDPOINTS.mainnet,\n };\n if (presets[cluster]) {\n return presets[cluster];\n }\n throw new Error(`Unknown cluster: ${cluster}`);\n }\n\n const url = cluster.url ?? getMaybeStringProp(cluster, 'rpcUrl');\n\n if (!url) {\n throw new Error('Cluster URL is required');\n }\n\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return url;\n }\n\n const presets: Record<string, string> = {\n ...PUBLIC_RPC_ENDPOINTS,\n 'mainnet-beta': PUBLIC_RPC_ENDPOINTS.mainnet,\n };\n\n if (presets[url]) {\n return presets[url];\n }\n\n return url;\n}\n\nexport function getClusterExplorerUrl(cluster: SolanaCluster, path?: string): string {\n const parts = cluster.id.split(':');\n const clusterSegment = parts[1] || 'devnet';\n\n const isMainnet = cluster.id === 'solana:mainnet' || cluster.id === 'solana:mainnet-beta';\n\n const base = isMainnet ? 'https://explorer.solana.com' : `https://explorer.solana.com?cluster=${clusterSegment}`;\n\n if (path) {\n return isMainnet\n ? `https://explorer.solana.com/${path}`\n : `https://explorer.solana.com/${path}?cluster=${clusterSegment}`;\n }\n\n return base;\n}\n\nexport function getTransactionUrl(signature: string, cluster: SolanaCluster): string {\n const clusterType = getClusterType(cluster);\n const explorerCluster = clusterType === 'custom' || clusterType === 'localnet' ? 'devnet' : clusterType;\n return getExplorerLink({\n transaction: signature,\n cluster: explorerCluster === 'mainnet' ? 'mainnet' : explorerCluster,\n });\n}\n\nexport function getAddressUrl(address: string, cluster: SolanaCluster): string {\n const clusterType = getClusterType(cluster);\n const explorerCluster = clusterType === 'custom' || clusterType === 'localnet' ? 'devnet' : clusterType;\n return getExplorerLink({\n address,\n cluster: explorerCluster === 'mainnet' ? 'mainnet' : explorerCluster,\n });\n}\n\nexport function getTokenUrl(tokenAddress: string, cluster: SolanaCluster): string {\n return getClusterExplorerUrl(cluster, `token/${tokenAddress}`);\n}\n\nexport function getBlockUrl(slot: number, cluster: SolanaCluster): string {\n return getClusterExplorerUrl(cluster, `block/${slot}`);\n}\n\nexport function isMainnetCluster(cluster: SolanaCluster): boolean {\n return cluster.id === 'solana:mainnet' || cluster.id === 'solana:mainnet-beta';\n}\n\nexport function isDevnetCluster(cluster: SolanaCluster): boolean {\n return cluster.id === 'solana:devnet';\n}\n\nexport function isTestnetCluster(cluster: SolanaCluster): boolean {\n return cluster.id === 'solana:testnet';\n}\n\nexport function isLocalCluster(cluster: SolanaCluster): boolean {\n const url = cluster.url ?? getMaybeStringProp(cluster, 'rpcUrl');\n if (!url) return cluster.id === 'solana:localnet';\n return cluster.id === 'solana:localnet' || url.includes('localhost') || url.includes('127.0.0.1');\n}\n\nexport function getClusterName(cluster: SolanaCluster): string {\n if (cluster.label) return cluster.label;\n const name = getMaybeStringProp(cluster, 'name');\n if (name) return name;\n\n const parts = cluster.id.split(':');\n if (parts.length >= 2 && parts[1]) {\n const name = parts.slice(1).join(':');\n // Capitalize first letter\n return name.charAt(0).toUpperCase() + name.slice(1).replace(/-/g, ' ');\n }\n return 'Unknown';\n}\n\nexport function getClusterType(cluster: SolanaCluster): ClusterType {\n if (isMainnetCluster(cluster)) return 'mainnet';\n if (isDevnetCluster(cluster)) return 'devnet';\n if (isTestnetCluster(cluster)) return 'testnet';\n if (isLocalCluster(cluster)) return 'localnet';\n return 'custom';\n}\n\nexport function getClusterChainId(cluster: SolanaCluster): `solana:${string}` | null {\n const clusterType = getClusterType(cluster);\n\n if (clusterType === 'localnet' || clusterType === 'custom') {\n return null;\n }\n\n switch (clusterType) {\n case 'mainnet':\n return 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp';\n case 'devnet':\n return 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1';\n case 'testnet':\n return 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z';\n default:\n return null;\n }\n}\n\nexport function getChainIdForWalletStandard(cluster: SolanaCluster): `solana:${string}` | null {\n return getClusterChainId(cluster);\n}\n","/**\n * Connector Kit - Shared Constants\n *\n * Centralized constant values for timeouts, intervals, and other magic numbers\n * used throughout the connector library.\n */\n\n// ============================================================================\n// Timing Constants\n// ============================================================================\n\n/**\n * Auto-connect initialization delay in milliseconds\n * Allows wallet detection to complete before attempting connection\n */\nexport const AUTO_CONNECT_DELAY_MS = 100;\n\n/**\n * State notification debounce delay in milliseconds\n * Batches rapid state updates to prevent excessive re-renders (one frame at 60fps)\n */\nexport const STATE_NOTIFY_DEBOUNCE_MS = 16;\n\n/**\n * Clipboard \"copied\" indicator duration in milliseconds\n */\nexport const COPY_FEEDBACK_DURATION_MS = 2000;\n\n// ============================================================================\n// Polling Constants (for wallets without event support)\n// ============================================================================\n\n/**\n * Maximum number of polling attempts before giving up\n * At current intervals, this equals approximately 1 minute of polling\n */\nexport const MAX_POLL_ATTEMPTS = 20;\n\n/**\n * Polling interval pattern with exponential backoff (in milliseconds)\n * Pattern: 1s, 2s, 3s, 5s, 5s (continues at 5s)\n */\nexport const POLL_INTERVALS_MS = [1000, 2000, 3000, 5000, 5000] as const;\n\n// ============================================================================\n// Configuration Defaults\n// ============================================================================\n\n/**\n * Default maximum retry attempts for error recovery\n */\nexport const DEFAULT_MAX_RETRIES = 3;\n\n/**\n * Default maximum tracked transactions in debugger\n */\nexport const DEFAULT_MAX_TRACKED_TRANSACTIONS = 20;\n","import type { ConnectorState, Listener } from '../../types/connector';\nimport { STATE_NOTIFY_DEBOUNCE_MS } from '../constants';\n\n/**\n * StateManager - Handles state updates and notifications with structural sharing\n *\n * Optimizes React re-renders by using deep equality checks for arrays and objects,\n * only updating state when values truly differ.\n */\nexport class StateManager {\n private state: ConnectorState;\n private listeners = new Set<Listener>();\n private notifyTimeout?: ReturnType<typeof setTimeout>;\n\n constructor(initialState: ConnectorState) {\n this.state = initialState;\n }\n\n /**\n * Optimized state update with structural sharing\n * Only updates if values actually changed\n */\n updateState(updates: Partial<ConnectorState>, immediate = false): boolean {\n let hasChanges = false;\n const nextState = { ...this.state };\n\n for (const [key, value] of Object.entries(updates)) {\n const stateKey = key as keyof ConnectorState & string;\n const currentValue = nextState[stateKey];\n\n if (Array.isArray(value) && Array.isArray(currentValue)) {\n if (!this.arraysEqual(value as readonly unknown[], currentValue as readonly unknown[])) {\n (nextState as Record<string, unknown>)[stateKey] = value;\n hasChanges = true;\n }\n } else if (value && typeof value === 'object' && currentValue && typeof currentValue === 'object') {\n if (!this.objectsEqual(value, currentValue)) {\n (nextState as Record<string, unknown>)[stateKey] = value;\n hasChanges = true;\n }\n } else if (currentValue !== value) {\n (nextState as Record<string, unknown>)[stateKey] = value;\n hasChanges = true;\n }\n }\n\n if (hasChanges) {\n this.state = nextState;\n\n if (immediate) {\n this.notifyImmediate();\n } else {\n this.notify();\n }\n }\n\n return hasChanges;\n }\n\n /**\n * Fast array equality check for wallet/account arrays\n */\n private arraysEqual<T>(a: readonly T[], b: readonly T[]): boolean {\n if (a.length !== b.length) return false;\n\n // Empty arrays are equal\n if (a.length === 0) return true;\n\n if (a[0] && typeof a[0] === 'object' && 'name' in a[0] && b[0] && typeof b[0] === 'object' && 'name' in b[0]) {\n return a.every((item, i) => {\n const aItem = item as Record<string, unknown>;\n const bItem = b[i] as Record<string, unknown> | undefined;\n\n if (!bItem || typeof bItem !== 'object') return false;\n\n const keysA = Object.keys(aItem);\n const keysB = Object.keys(bItem);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every(key => aItem[key] === bItem[key]);\n });\n }\n\n if (\n a[0] &&\n typeof a[0] === 'object' &&\n 'address' in a[0] &&\n b[0] &&\n typeof b[0] === 'object' &&\n 'address' in b[0]\n ) {\n return a.every((item, i) => {\n const aItem = item as { address: string };\n const bItem = b[i] as { address: string };\n return aItem.address === bItem?.address;\n });\n }\n\n return a === b;\n }\n\n /**\n * Deep equality check for objects\n * Used to prevent unnecessary state updates when object contents haven't changed\n */\n private objectsEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n\n if (!a || !b) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every(key => (a as Record<string, unknown>)[key] === (b as Record<string, unknown>)[key]);\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n getSnapshot(): ConnectorState {\n return this.state;\n }\n\n private notify(): void {\n if (this.notifyTimeout) {\n clearTimeout(this.notifyTimeout);\n }\n\n this.notifyTimeout = setTimeout(() => {\n this.listeners.forEach(l => l(this.state));\n this.notifyTimeout = undefined;\n }, STATE_NOTIFY_DEBOUNCE_MS);\n }\n\n private notifyImmediate(): void {\n if (this.notifyTimeout) {\n clearTimeout(this.notifyTimeout);\n this.notifyTimeout = undefined;\n }\n this.listeners.forEach(l => l(this.state));\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import type { ConnectorEvent, ConnectorEventListener } from '../../types/events';\nimport { createLogger } from '../utils/secure-logger';\n\nconst logger = createLogger('EventEmitter');\n\n/**\n * EventEmitter - Handles event system for connector\n *\n * Provides event listener management and emission with error handling.\n * Automatically adds timestamps to events if not provided.\n * Used for analytics, logging, monitoring, and custom behavior.\n */\nexport class EventEmitter {\n private listeners = new Set<ConnectorEventListener>();\n private debug: boolean;\n\n constructor(debug = false) {\n this.debug = debug;\n }\n\n /**\n * Subscribe to connector events\n */\n on(listener: ConnectorEventListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Remove a specific event listener\n */\n off(listener: ConnectorEventListener): void {\n this.listeners.delete(listener);\n }\n\n /**\n * Remove all event listeners\n */\n offAll(): void {\n this.listeners.clear();\n }\n\n /**\n * Emit an event to all listeners\n * Automatically adds timestamp if not already present\n */\n emit(event: ConnectorEvent): void {\n // Ensure timestamp is present\n const eventWithTimestamp: ConnectorEvent = {\n ...event,\n timestamp: event.timestamp ?? new Date().toISOString(),\n } as ConnectorEvent;\n\n // Log events in debug mode\n if (this.debug) {\n logger.debug('Event emitted', { type: eventWithTimestamp.type, event: eventWithTimestamp });\n }\n\n // Call all event listeners\n this.listeners.forEach(listener => {\n try {\n listener(eventWithTimestamp);\n } catch (error) {\n // Don't let listener errors crash the connector\n logger.error('Event listener error', { error });\n }\n });\n }\n\n /**\n * Get the number of active listeners\n */\n getListenerCount(): number {\n return this.listeners.size;\n }\n\n /**\n * Generate ISO timestamp for events\n * Utility method for creating timestamps consistently\n */\n static timestamp(): string {\n return new Date().toISOString();\n }\n}\n","import type { ConnectorDebugMetrics } from '../../types/connector';\n\n/**\n * DebugMetrics - Tracks performance and debug metrics\n *\n * Provides insights into connector performance and optimization effectiveness.\n */\nexport class DebugMetrics {\n private stateUpdates = 0;\n private noopUpdates = 0;\n private updateTimes: number[] = [];\n private lastUpdateTime = 0;\n private eventListenerCount = 0;\n private subscriptionCount = 0;\n\n /**\n * Record a state update attempt\n */\n recordUpdate(duration: number, hadChanges: boolean): void {\n if (hadChanges) {\n this.stateUpdates++;\n } else {\n this.noopUpdates++;\n }\n\n this.updateTimes.push(duration);\n if (this.updateTimes.length > 100) {\n this.updateTimes.shift();\n }\n this.lastUpdateTime = Date.now();\n }\n\n /**\n * Update listener counts\n */\n updateListenerCounts(eventListeners: number, subscriptions: number): void {\n this.eventListenerCount = eventListeners;\n this.subscriptionCount = subscriptions;\n }\n\n /**\n * Get current metrics\n */\n getMetrics(): ConnectorDebugMetrics {\n const totalUpdates = this.stateUpdates + this.noopUpdates;\n const optimizationRate = totalUpdates > 0 ? Math.round((this.noopUpdates / totalUpdates) * 100) : 0;\n\n const avgUpdateTime =\n this.updateTimes.length > 0 ? this.updateTimes.reduce((a, b) => a + b, 0) / this.updateTimes.length : 0;\n\n return {\n stateUpdates: this.stateUpdates,\n noopUpdates: this.noopUpdates,\n optimizationRate,\n eventListenerCount: this.eventListenerCount,\n subscriptionCount: this.subscriptionCount,\n avgUpdateTimeMs: Math.round(avgUpdateTime * 100) / 100,\n lastUpdateTime: this.lastUpdateTime,\n };\n }\n\n /**\n * Reset all metrics\n */\n resetMetrics(): void {\n this.stateUpdates = 0;\n this.noopUpdates = 0;\n this.updateTimes = [];\n this.lastUpdateTime = 0;\n }\n}\n","/**\n * Base class for connector collaborators\n * Provides shared dependencies and utilities for all manager classes\n */\n\nimport type { StateManager } from './state-manager';\nimport type { EventEmitter } from './event-emitter';\nimport { createLogger } from '../utils/secure-logger';\n\n/**\n * Configuration for base collaborator\n */\nexport interface BaseCollaboratorConfig {\n stateManager: StateManager;\n eventEmitter: EventEmitter;\n debug?: boolean;\n}\n\n/**\n * Base collaborator class that all managers extend\n * Provides common functionality and reduces boilerplate\n */\nexport abstract class BaseCollaborator {\n protected readonly stateManager: StateManager;\n protected readonly eventEmitter: EventEmitter;\n protected readonly debug: boolean;\n protected readonly logger: ReturnType<typeof createLogger>;\n\n constructor(config: BaseCollaboratorConfig, loggerPrefix: string) {\n this.stateManager = config.stateManager;\n this.eventEmitter = config.eventEmitter;\n this.debug = config.debug ?? false;\n this.logger = createLogger(loggerPrefix);\n }\n\n /**\n * Log debug message if debug mode is enabled\n */\n protected log(message: string, data?: unknown): void {\n if (this.debug) {\n this.logger.debug(message, data);\n }\n }\n\n /**\n * Log error message if debug mode is enabled\n */\n protected error(message: string, data?: unknown): void {\n if (this.debug) {\n this.logger.error(message, data);\n }\n }\n\n /**\n * Get current state snapshot\n */\n protected getState() {\n return this.stateManager.getSnapshot();\n }\n}\n","/**\n * @solana/connector - Wallet Authenticity Verifier\n *\n * Verifies that detected wallets are authentic and not malicious browser extensions\n * Uses dynamic heuristic-based approach instead of hard-coded wallet lists\n * Helps protect users from phishing attacks and fake wallet injections\n */\n\nimport type { DirectWallet } from './detector';\nimport { createLogger } from '../utils/secure-logger';\n\nconst logger = createLogger('WalletAuthenticity');\n\n/**\n * Result of wallet authenticity verification\n */\nexport interface WalletVerificationResult {\n /** Whether the wallet passed verification */\n authentic: boolean;\n /** Confidence level (0-1) in the verification */\n confidence: number;\n /** Reason for the result */\n reason: string;\n /** Warnings about the wallet */\n warnings: string[];\n /** Security score breakdown */\n securityScore: {\n walletStandardCompliance: number;\n methodIntegrity: number;\n chainSupport: number;\n maliciousPatterns: number;\n identityConsistency: number;\n };\n}\n\n/**\n * WalletAuthenticityVerifier - Verifies wallet extensions are genuine\n *\n * Uses dynamic heuristics instead of hard-coded wallet lists:\n * 1. Wallet Standard compliance checks\n * 2. Method integrity validation\n * 3. Chain support verification\n * 4. Malicious pattern detection\n * 5. Identity consistency checks\n *\n * This approach is future-proof and works with any wallet, including new ones.\n *\n * @example\n * ```ts\n * const result = WalletAuthenticityVerifier.verify(walletObject, 'phantom');\n *\n * if (!result.authentic) {\n * console.warn('Potentially fake wallet detected:', result.reason);\n * return;\n * }\n *\n * if (result.warnings.length > 0) {\n * console.warn('Wallet verification warnings:', result.warnings);\n * }\n * ```\n */\nexport class WalletAuthenticityVerifier {\n /**\n * Verify a wallet's authenticity using dynamic heuristics\n *\n * @param wallet - The wallet object to verify\n * @param walletName - Expected wallet name\n * @returns Verification result with confidence score\n */\n static verify(wallet: DirectWallet, walletName: string): WalletVerificationResult {\n const warnings: string[] = [];\n const name = walletName.toLowerCase();\n\n logger.debug('Verifying wallet with dynamic heuristics', { name });\n\n // Initialize security score components\n const securityScore = {\n walletStandardCompliance: 0,\n methodIntegrity: 0,\n chainSupport: 0,\n maliciousPatterns: 1, // Start at 1, deduct for issues\n identityConsistency: 0,\n };\n\n // 1. Check Wallet Standard compliance (0-1)\n const walletStandardScore = this.checkWalletStandardCompliance(wallet);\n securityScore.walletStandardCompliance = walletStandardScore.score;\n warnings.push(...walletStandardScore.warnings);\n\n // 2. Validate method integrity (0-1)\n const methodIntegrityScore = this.checkMethodIntegrity(wallet);\n securityScore.methodIntegrity = methodIntegrityScore.score;\n warnings.push(...methodIntegrityScore.warnings);\n\n // 3. Verify chain support (0-1)\n const chainSupportScore = this.checkChainSupport(wallet);\n securityScore.chainSupport = chainSupportScore.score;\n warnings.push(...chainSupportScore.warnings);\n\n // 4. Detect malicious patterns (0-1)\n const maliciousPatterns = this.detectMaliciousPatterns(wallet, name);\n securityScore.maliciousPatterns = maliciousPatterns.score;\n warnings.push(...maliciousPatterns.warnings);\n\n // 5. Check identity consistency (0-1)\n const identityScore = this.checkIdentityConsistency(wallet, name);\n securityScore.identityConsistency = identityScore.score;\n warnings.push(...identityScore.warnings);\n\n // Calculate overall confidence (weighted average)\n const weights = {\n walletStandardCompliance: 0.25,\n methodIntegrity: 0.2,\n chainSupport: 0.15,\n maliciousPatterns: 0.3, // Highest weight - security critical\n identityConsistency: 0.1,\n };\n\n const confidence =\n securityScore.walletStandardCompliance * weights.walletStandardCompliance +\n securityScore.methodIntegrity * weights.methodIntegrity +\n securityScore.chainSupport * weights.chainSupport +\n securityScore.maliciousPatterns * weights.maliciousPatterns +\n securityScore.identityConsistency * weights.identityConsistency;\n\n // Determine authenticity threshold\n const AUTHENTICITY_THRESHOLD = 0.6; // 60% confidence required\n const authentic = confidence >= AUTHENTICITY_THRESHOLD && securityScore.maliciousPatterns > 0.5;\n\n const reason = authentic\n ? 'Wallet passed all security checks'\n : `Wallet failed security checks (confidence: ${Math.round(confidence * 100)}%)`;\n\n logger.debug('Wallet verification complete', {\n name,\n authentic,\n confidence: Math.round(confidence * 100) / 100,\n warnings: warnings.length,\n });\n\n return {\n authentic,\n confidence,\n reason,\n warnings,\n securityScore,\n };\n }\n\n /**\n * Check Wallet Standard compliance\n * Returns score 0-1 based on how well the wallet implements the standard\n */\n private static checkWalletStandardCompliance(wallet: DirectWallet): { score: number; warnings: string[] } {\n const warnings: string[] = [];\n let score = 0;\n\n // Check for Wallet Standard features object\n if (wallet.features && typeof wallet.features === 'object') {\n score += 0.3;\n\n // Check for required Wallet Standard features\n const requiredFeatures = ['standard:connect', 'standard:disconnect', 'standard:events'];\n const presentFeatures = requiredFeatures.filter(feature => feature in wallet.features!);\n\n score += (presentFeatures.length / requiredFeatures.length) * 0.4;\n\n // Check for Solana-specific features (bonus points)\n const solanaFeatures = [\n 'solana:signTransaction',\n 'solana:signAndSendTransaction',\n 'solana:signMessage',\n 'solana:signAllTransactions',\n ];\n const presentSolanaFeatures = solanaFeatures.filter(feature => feature in wallet.features!);\n\n score += (presentSolanaFeatures.length / solanaFeatures.length) * 0.3;\n\n if (presentFeatures.length < requiredFeatures.length) {\n warnings.push('Wallet missing some standard features');\n }\n } else {\n warnings.push('Wallet does not implement Wallet Standard');\n }\n\n return { score: Math.min(score, 1), warnings };\n }\n\n /**\n * Validate method integrity\n * Checks if methods appear to be genuine and not tampered with\n */\n private static checkMethodIntegrity(wallet: DirectWallet): { score: number; warnings: string[] } {\n const warnings: string[] = [];\n let score = 0;\n const walletObj = wallet as Record<string, unknown>;\n\n // Critical methods that should exist\n const criticalMethods = ['connect', 'disconnect'];\n const existingMethods = criticalMethods.filter(method => typeof walletObj[method] === 'function');\n\n if (existingMethods.length === 0) {\n warnings.push('Wallet missing critical methods');\n return { score: 0, warnings };\n }\n\n score += (existingMethods.length / criticalMethods.length) * 0.5;\n\n // Check method signatures (native functions are typically shorter)\n let suspiciousMethodCount = 0;\n for (const method of existingMethods) {\n const func = walletObj[method] as Function;\n const funcStr = func.toString();\n\n // Native functions or well-written async functions should be reasonable length\n // Extremely long functions (>1000 chars) could indicate injection\n if (funcStr.length > 1000) {\n suspiciousMethodCount++;\n warnings.push(`Method ${method} has unusually long implementation`);\n }\n\n // Check for suspicious keywords in function body\n const suspiciousKeywords = ['fetch(', 'XMLHttpRequest', 'sendToServer', 'exfiltrate', 'steal', 'phish'];\n\n for (const keyword of suspiciousKeywords) {\n if (funcStr.includes(keyword)) {\n suspiciousMethodCount++;\n warnings.push(`Method ${method} contains suspicious code pattern`);\n break;\n }\n }\n }\n\n // Deduct score for suspicious methods\n const suspiciousRatio = suspiciousMethodCount / existingMethods.length;\n score += (1 - suspiciousRatio) * 0.5;\n\n return { score: Math.max(0, Math.min(score, 1)), warnings };\n }\n\n /**\n * Verify Solana chain support\n */\n private static checkChainSupport(wallet: DirectWallet): { score: number; warnings: string[] } {\n const warnings: string[] = [];\n let score = 0;\n\n // Check chains array\n if (Array.isArray(wallet.chains)) {\n const hasSolanaChain = wallet.chains.some(chain => {\n const chainStr = String(chain).toLowerCase();\n return chainStr.includes('solana');\n });\n\n if (hasSolanaChain) {\n score = 1.0;\n } else {\n warnings.push('Wallet does not explicitly support Solana chain');\n score = 0.3; // Some partial credit - might still work\n }\n } else if (wallet.chains === undefined) {\n // Some legacy wallets don't have chains property\n warnings.push('Wallet does not declare supported chains');\n score = 0.5; // Benefit of the doubt for older wallets\n }\n\n return { score, warnings };\n }\n\n /**\n * Detect common patterns used by malicious wallet extensions\n */\n private static detectMaliciousPatterns(\n wallet: DirectWallet,\n expectedName: string,\n ): { score: number; warnings: string[] } {\n const warnings: string[] = [];\n let score = 1.0; // Start at perfect, deduct for issues\n const walletObj = wallet as Record<string, unknown>;\n\n // 1. Check for multiple wallet identity flags (impersonation attempt)\n const identityFlags = Object.keys(walletObj).filter(\n key =>\n key.startsWith('is') &&\n (key.endsWith('Wallet') || key.endsWith('wallet') || /^is[A-Z]/.test(key)) &&\n walletObj[key] === true,\n );\n\n if (identityFlags.length > 2) {\n // More than 2 identity flags is suspicious\n score -= 0.3;\n warnings.push(`Multiple wallet identity flags detected: ${identityFlags.join(', ')}`);\n }\n\n // 2. Check for explicit malicious property names\n const explicitlyMaliciousProps = [\n 'stealPrivateKey',\n 'getPrivateKey',\n 'exportPrivateKey',\n 'sendToAttacker',\n 'phishingUrl',\n 'malware',\n 'backdoor',\n ];\n\n const lowerCaseKeys = Object.keys(walletObj).map(k => k.toLowerCase());\n for (const prop of explicitlyMaliciousProps) {\n if (lowerCaseKeys.includes(prop.toLowerCase())) {\n score = 0; // Instant fail\n warnings.push(`Explicitly malicious property detected: ${prop}`);\n }\n }\n\n // 3. Check URL properties for suspicious domains\n const urlProps = ['iconUrl', 'url', 'homepage', 'website'];\n for (const prop of urlProps) {\n const value = walletObj[prop];\n if (typeof value === 'string' && this.isSuspiciousUrl(value)) {\n score -= 0.2;\n warnings.push(`Suspicious URL in ${prop}: ${value}`);\n }\n }\n\n // 4. Check for proto pollution or __proto__ manipulation\n if ('__proto__' in walletObj || 'constructor' in walletObj) {\n // These are normal on all objects, but check if they're been tampered with\n const proto = Object.getPrototypeOf(walletObj);\n if (proto !== Object.prototype && proto !== null) {\n score -= 0.1;\n warnings.push('Wallet has unusual prototype chain');\n }\n }\n\n // 5. Check for excessive property count (bloated objects can indicate injection)\n const propCount = Object.keys(walletObj).length;\n if (propCount > 100) {\n score -= 0.1;\n warnings.push(`Wallet has unusually many properties (${propCount})`);\n }\n\n return { score: Math.max(0, score), warnings };\n }\n\n /**\n * Check if wallet identity is consistent with expected name\n */\n private static checkIdentityConsistency(\n wallet: DirectWallet,\n expectedName: string,\n ): {\n score: number;\n warnings: string[];\n } {\n const warnings: string[] = [];\n let score = 0;\n const walletObj = wallet as Record<string, unknown>;\n const name = expectedName.toLowerCase();\n\n // Build list of identity indicators\n const identityIndicators = [\n walletObj.name,\n walletObj.providerName,\n (walletObj.metadata as Record<string, unknown>)?.name,\n (walletObj._metadata as Record<string, unknown>)?.name,\n ].filter(Boolean) as string[];\n\n // Check if any identity indicator matches expected name\n let hasMatch = false;\n for (const indicator of identityIndicators) {\n if (typeof indicator === 'string' && indicator.toLowerCase().includes(name)) {\n hasMatch = true;\n score += 0.5;\n break;\n }\n }\n\n // Check for identity flag (e.g., isPhantom)\n const capitalizedName = name.charAt(0).toUpperCase() + name.slice(1);\n const identityFlags = [\n `is${capitalizedName}`,\n `is${capitalizedName}Wallet`,\n `is${capitalizedName.toLowerCase()}`,\n ];\n\n for (const flag of identityFlags) {\n if (walletObj[flag] === true) {\n hasMatch = true;\n score += 0.5;\n break;\n }\n }\n\n if (!hasMatch) {\n warnings.push(`Wallet identity does not match expected name: ${expectedName}`);\n }\n\n return { score: Math.min(score, 1), warnings };\n }\n\n /**\n * Check if a URL looks suspicious\n */\n private static isSuspiciousUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n\n // Check for common phishing indicators\n const suspiciousPatterns = [\n 'bit.ly',\n 'tinyurl.com',\n 'tiny.cc',\n 'is.gd',\n 'goo.gl',\n 't.co',\n '.tk', // Free domain TLDs\n '.ml',\n '.ga',\n '.cf',\n '.gq',\n ];\n\n const hostname = parsed.hostname.toLowerCase();\n\n // Check for URL shorteners and free domains\n if (suspiciousPatterns.some(pattern => hostname.includes(pattern))) {\n return true;\n }\n\n // Check for IP addresses (wallets should use proper domains)\n if (/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(hostname)) {\n return true;\n }\n\n // Check for excessive subdomains (common in phishing)\n const subdomains = hostname.split('.');\n if (subdomains.length > 4) {\n return true;\n }\n\n return false;\n } catch {\n // Invalid URL format\n return true;\n }\n }\n\n /**\n * Batch verify multiple wallets\n *\n * @param wallets - Array of wallet objects with their names\n * @returns Map of wallet names to verification results\n */\n static verifyBatch(wallets: Array<{ wallet: DirectWallet; name: string }>): Map<string, WalletVerificationResult> {\n const results = new Map<string, WalletVerificationResult>();\n\n for (const { wallet, name } of wallets) {\n results.set(name, this.verify(wallet, name));\n }\n\n return results;\n }\n\n /**\n * Get a human-readable security report for a wallet\n *\n * @param result - Verification result\n * @returns Formatted security report\n */\n static getSecurityReport(result: WalletVerificationResult): string {\n const lines: string[] = [];\n lines.push(`Security Assessment: ${result.authentic ? '✅ PASSED' : '❌ FAILED'}`);\n lines.push(`Overall Confidence: ${Math.round(result.confidence * 100)}%`);\n lines.push('');\n lines.push('Score Breakdown:');\n lines.push(\n ` - Wallet Standard Compliance: ${Math.round(result.securityScore.walletStandardCompliance * 100)}%`,\n );\n lines.push(` - Method Integrity: ${Math.round(result.securityScore.methodIntegrity * 100)}%`);\n lines.push(` - Chain Support: ${Math.round(result.securityScore.chainSupport * 100)}%`);\n lines.push(` - Malicious Patterns: ${Math.round(result.securityScore.maliciousPatterns * 100)}%`);\n lines.push(` - Identity Consistency: ${Math.round(result.securityScore.identityConsistency * 100)}%`);\n\n if (result.warnings.length > 0) {\n lines.push('');\n lines.push('Warnings:');\n result.warnings.forEach(w => lines.push(` ⚠️ ${w}`));\n }\n\n return lines.join('\\n');\n }\n}\n","import type { Wallet } from '../../types/wallets';\n\n/**\n * Wallet icon overrides\n *\n * Goal: Replace inconsistent Wallet Standard icons with a uniform set.\n *\n * Notes:\n * - Keep these SVGs **SVGO-optimized**. Large inline SVG strings will increase bundle size.\n * - Prefer a single-line, minified SVG (no whitespace) before pasting here.\n * - If these ever grow beyond a handful, we should move to a separate optional package + dynamic import.\n */\n\n// Placeholder uniform icons (swap these with your actual SVGO-minified SVGs).\n// Wallet Standard's `WalletIcon` type expects base64 data URIs.\n// Keeping placeholders tiny prevents bundle size regressions while we wire the feature.\nconst PHANTOM_ICON: Wallet['icon'] =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSIjOTc4NkU0Ii8+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF80NF82MTApIj4KPHBhdGggZD0iTTUuNzY1NSAxNS43OTdDNS43NjU1IDE3LjIyMiA2LjQ5ODc5IDE3LjU1IDcuMjYxNDEgMTcuNTVDOC44NzQ2MyAxNy41NSAxMC4wODcgMTYuMDg0MSAxMC44MTA1IDE0LjkyNTZDMTAuNzIyNSAxNS4xODE5IDEwLjY3MzYgMTUuNDM4MiAxMC42NzM2IDE1LjY4NDJDMTAuNjczNiAxNi4zNjA5IDExLjA0NTIgMTYuODQyNyAxMS43Nzg1IDE2Ljg0MjdDMTIuNzg1NSAxNi44NDI3IDEzLjg2MSAxNS45MiAxNC40MTgzIDE0LjkyNTZDMTQuMzc5MiAxNS4wNjkyIDE0LjM1OTYgMTUuMjAyNCAxNC4zNTk2IDE1LjMyNTRDMTQuMzU5NiAxNS43OTcgMTQuNjEzOCAxNi4wOTQzIDE1LjEzMiAxNi4wOTQzQzE2Ljc2NDggMTYuMDk0MyAxOC40MDc0IDEzLjA3MDEgMTguNDA3NCAxMC40MjUyQzE4LjQwNzQgOC4zNjQ1OSAxNy40MTAxIDYuNTUwMDUgMTQuOTA3MSA2LjU1MDA1QzEwLjUwNzQgNi41NTAwNSA1Ljc2NTUgMTIuMTY3OSA1Ljc2NTUgMTUuNzk3Wk0xMy4zOTE3IDEwLjE5OTZDMTMuMzkxNyA5LjY4NzA1IDEzLjY2NTQgOS4zMjgyNSAxNC4wNjYzIDkuMzI4MjVDMTQuNDU3NCA5LjMyODI1IDE0LjczMTIgOS42ODcwNSAxNC43MzEyIDEwLjE5OTZDMTQuNzMxMiAxMC43MTIyIDE0LjQ1NzQgMTEuMDgxMyAxNC4wNjYzIDExLjA4MTNDMTMuNjY1NCAxMS4wODEzIDEzLjM5MTcgMTAuNzEyMiAxMy4zOTE3IDEwLjE5OTZaTTE1LjQ4NCAxMC4xOTk2QzE1LjQ4NCA5LjY4NzA1IDE1Ljc1NzggOS4zMjgyNSAxNi4xNTg2IDkuMzI4MjVDMTYuNTQ5NyA5LjMyODI1IDE2LjgyMzUgOS42ODcwNSAxNi44MjM1IDEwLjE5OTZDMTYuODIzNSAxMC43MTIyIDE2LjU0OTcgMTEuMDgxMyAxNi4xNTg2IDExLjA4MTNDMTUuNzU3OCAxMS4wODEzIDE1LjQ4NCAxMC43MTIyIDE1LjQ4NCAxMC4xOTk2WiIgZmlsbD0iI0ZFRkRGOCIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzQ0XzYxMCI+CjxyZWN0IHdpZHRoPSIxMi43NiIgaGVpZ2h0PSIxMSIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuNzA2NDIgNi41NDk5MykiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4=';\nconst SOLFLARE_ICON: Wallet['icon'] =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSIjRkZFRjQ2Ii8+CjxwYXRoIGQ9Ik0xMi4xMjg1IDEyLjUyNjZMMTIuOTU1NiAxMS43Mjc2TDE0LjQ5NzYgMTIuMjMyM0MxNS41MDcgMTIuNTY4NyAxNi4wMTE3IDEzLjE4NTUgMTYuMDExNyAxNC4wNTQ3QzE2LjAxMTcgMTQuNzEzNiAxNS43NTkzIDE1LjE0ODIgMTUuMjU0NyAxNS43MDg5TDE1LjEwMDUgMTUuODc3MUwxNS4xNTY1IDE1LjQ4NDZDMTUuMzgwOCAxNC4wNTQ3IDE0Ljk2MDMgMTMuNDM3OSAxMy41NzI0IDEyLjk4OTJMMTIuMTI4NSAxMi41MjY2Wk0xMC4wNTM3IDcuNjM0MTRMMTQuMjU5MyA5LjAzNkwxMy4zNDgxIDkuOTA1MTdMMTEuMTYxMiA5LjE3NjE5QzEwLjQwNDIgOC45MjM4NSAxMC4xNTE4IDguNTE3MzEgMTAuMDUzNyA3LjY2MjE3VjcuNjM0MTRaTTkuODAxMzUgMTQuNzU1NkwxMC43NTQ2IDEzLjg0NDRMMTIuNTQ5MSAxNC40MzMyQzEzLjQ4ODMgMTQuNzQxNiAxMy44MTA3IDE1LjE0ODIgMTMuNzEyNiAxNi4xNzE1TDkuODAxMzUgMTQuNzU1NlpNOC41OTU3NyAxMC42OTAyQzguNTk1NzcgMTAuNDIzOSA4LjczNTk1IDEwLjE3MTUgOC45NzQyNyA5Ljk2MTIyQzkuMjI2NjEgMTAuMzI1NyA5LjY2MTE4IDEwLjY0ODEgMTAuMzQ4MSAxMC44NzI1TDExLjgzNDEgMTEuMzYzMUwxMS4wMDcgMTIuMTYyMkw5LjU0OTAzIDExLjY4NTVDOC44NzYxNCAxMS40NjEyIDguNTk1NzcgMTEuMTI0OCA4LjU5NTc3IDEwLjY5MDJaTTEyLjk5NzYgMTguMDVDMTYuMDgxNyAxNi4wMDMzIDE3LjczNTkgMTQuNjE1NCAxNy43MzU5IDEyLjkwNTJDMTcuNzM1OSAxMS43Njk2IDE3LjA2MyAxMS4xMzg4IDE1LjU3NzEgMTAuNjQ4MUwxNC40NTU2IDEwLjI2OTZMMTcuNTI1NyA3LjMyNTcyTDE2LjkwODggNi42NjY4NEwxNS45OTc2IDcuNDY1OUwxMS42OTM5IDYuMDUwMDJDMTAuMzYyMSA2LjQ4NDYgOC42Nzk4OCA3Ljc2MDMgOC42Nzk4OCA5LjAzNkM4LjY3OTg4IDkuMTc2MTggOC42OTM5IDkuMzE2MzcgOC43MzU5NSA5LjQ3MDU5QzcuNjI4NDcgMTAuMTAxNCA3LjE3OTg4IDEwLjY5MDIgNy4xNzk4OCAxMS40MTkxQzcuMTc5ODggMTIuMTA2MSA3LjU0NDM2IDEyLjc5MyA4LjcwNzkyIDEzLjE3MTVMOS42MzMxNCAxMy40Nzk5TDYuNDM2ODkgMTYuNTVMNy4wNTM3MSAxNy4yMDg5TDguMDQ5MDQgMTYuMjk3N0wxMi45OTc2IDE4LjA1WiIgZmlsbD0iIzAyMDUwQSIvPgo8L3N2Zz4=';\nconst BACKPACK_ICON: Wallet['icon'] =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSIjRTMzRTNGIi8+CjxwYXRoIGQ9Ik0xNS41MTg2IDEzLjkyNzJDMTUuOTgxMSAxMy45MjcyIDE2LjIxMjcgMTMuOTI3MSAxNi4zNTY0IDE0LjA3MDhDMTYuNTAwMiAxNC4yMTQ1IDE2LjUgMTQuNDQ2MiAxNi41IDE0LjkwODdWMTUuNTY0QzE2LjUgMTYuNDg5MyAxNi41MDAyIDE2Ljk1MjIgMTYuMjEyOSAxNy4yMzk3QzE1LjkyNTMgMTcuNTI3MyAxNS40NjE4IDE3LjUyNzggMTQuNTM2MSAxNy41Mjc4SDkuNDYzODdDOC41Mzg0MiAxNy41Mjc4IDguMDc1NjcgMTcuNTI3MSA3Ljc4ODA5IDE3LjIzOTdDNy41MDA1NCAxNi45NTIyIDcuNSAxNi40ODk0IDcuNSAxNS41NjRWMTQuOTA4N0M3LjUgMTQuNDQ2MiA3LjQ5OTgyIDE0LjIxNDUgNy42NDM1NSAxNC4wNzA4QzcuNzg3MyAxMy45MjcxIDguMDE4OTEgMTMuOTI3MiA4LjQ4MTQ1IDEzLjkyNzJIMTUuNTE4NlpNMTIgNi4zNTg4OUMxNi41NjUzIDYuMzU4ODkgMTYuNSA5LjQwMjM4IDE2LjUgMTAuODU4OVYxMi40OTU2QzE2LjQ5OTkgMTIuNzY2NyAxNi4yNzk5IDEyLjk4NjggMTYuMDA4OCAxMi45ODY4SDcuOTkxMjFDNy43MjAxMiAxMi45ODY4IDcuNTAwMDYgMTIuNzY2NyA3LjUgMTIuNDk1NkM3LjUgMTIuNDk1NiA3LjUgMTIuMzE1MyA3LjUgMTAuODU4OUM3LjQ5OTk5IDkuNDAyMzkgNy40MzQ3OCA2LjM1ODkzIDEyIDYuMzU4ODlaTTEyIDcuNTE5MDRDMTEuMjMxOSA3LjUxOTEgMTAuNjA5NCA4LjE0MTU1IDEwLjYwOTQgOC45MDk2N0MxMC42MDk0IDkuNjc3NzggMTEuMjMxOSAxMC4zMDAyIDEyIDEwLjMwMDNDMTIuNzY4MiAxMC4zMDAzIDEzLjM5MDYgOS42Nzc4MiAxMy4zOTA2IDguOTA5NjdDMTMuMzkwNiA4LjE0MTUxIDEyLjc2ODIgNy41MTkwNCAxMiA3LjUxOTA0Wk0xMS45OTkgNC40NzIxN0MxMi45ODQxIDQuNDcyMjIgMTMuODQ2MiA0LjgxNjczIDE0LjA3NDIgNS4zNzc0NEMxNC4xMDg1IDUuNDczODcgMTQuMTI1OCA1LjUyMjIyIDE0LjA5NTcgNS41NTgxMUMxNC4wNjUyIDUuNTk0MDIgMTQuMDA1OCA1LjU4MzQyIDEzLjg4NzcgNS41NjIwMUMxMy41ODIyIDUuNTA2NjUgMTMuMTQ5MyA1LjQ2ODc3IDEyLjc2ODYgNS40NTc1MkMxMi41MjU4IDUuNDQ0NDggMTIuMjY5NSA1LjQzNzk5IDEyIDUuNDM3OTlDMTEuNzMwNSA1LjQzNzk5IDExLjQ3NDIgNS40NDQ0OCAxMS4yMzE0IDUuNDU3NTJDMTAuODQ5IDUuNDY4NzcgMTAuNDE0OSA1LjUwNjU4IDEwLjEwODQgNS41NjAwNkM5Ljk5MzM1IDUuNTgwMTMgOS45MzU2NSA1LjU5MDQ3IDkuOTA1MjcgNS41NTUxOEM5Ljg3NDk3IDUuNTE5MzUgOS44OTEyOCA1LjQ3MTQ0IDkuOTI0OCA1LjM3NjQ2QzEwLjE1MSA0LjgxNzQ4IDExLjAxNDIgNC40NzIxNyAxMS45OTkgNC40NzIxN1oiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg==';\n\nconst WALLET_ICON_OVERRIDES: Record<string, Wallet['icon']> = {\n Phantom: PHANTOM_ICON,\n Solflare: SOLFLARE_ICON,\n Backpack: BACKPACK_ICON,\n};\n\nconst ICON_PROXY_CACHE = new WeakMap<Wallet, Wallet>();\n\nexport function getWalletIconOverride(walletName: string): Wallet['icon'] | undefined {\n return WALLET_ICON_OVERRIDES[walletName];\n}\n\nfunction createIconProxy(wallet: Wallet, icon: Wallet['icon']): Wallet {\n const cached = ICON_PROXY_CACHE.get(wallet);\n if (cached) return cached;\n\n const proxy = new Proxy(wallet as unknown as Record<string, unknown>, {\n get(target, prop) {\n if (prop === 'icon') return icon;\n // Important: use `target` as the receiver so prototype getters that rely on private fields\n // (or expect `this` to be the original instance) keep working.\n const value = Reflect.get(target, prop, target);\n if (typeof value === 'function') {\n // Preserve method semantics for class-based wallets that use `this`/private fields.\n return value.bind(target);\n }\n return value;\n },\n }) as unknown as Wallet;\n\n ICON_PROXY_CACHE.set(wallet, proxy);\n return proxy;\n}\n\n/**\n * Apply a uniform icon override in-place when possible.\n *\n * We prefer mutation here because some Wallet Standard implementations update the wallet object\n * (e.g. `wallet.accounts`) over time. Creating a shallow copy can break that linkage.\n */\nexport function applyWalletIconOverride(wallet: Wallet): Wallet {\n const override = getWalletIconOverride(wallet.name);\n if (!override || wallet.icon === override) return wallet;\n\n // If we can mutate, do so to preserve identity with the Wallet Standard registry object.\n // Some wallets may use prototype-based getters and/or prevent extensions; in that case we\n // fall back to a Proxy wrapper that preserves all other fields/methods.\n if (Object.isExtensible(wallet)) {\n try {\n // WalletIcon is a string at runtime; Wallet Standard objects are typically plain and mutable.\n (wallet as unknown as { icon?: Wallet['icon'] }).icon = override;\n return wallet;\n } catch {\n // continue to proxy fallback\n }\n }\n\n return createIconProxy(wallet, override);\n}\n","import { getWalletsRegistry, ready } from './standard-shim';\nimport type { Wallet, WalletInfo } from '../../types/wallets';\nimport type { WalletConnectorId, WalletConnectorMetadata } from '../../types/session';\nimport { createConnectorId } from '../../types/session';\nimport { BaseCollaborator } from '../core/base-collaborator';\nimport { WalletAuthenticityVerifier } from './authenticity-verifier';\nimport { createLogger } from '../utils/secure-logger';\nimport { applyWalletIconOverride } from './wallet-icon-overrides';\n\nconst logger = createLogger('WalletDetector');\n\nfunction isSolanaWallet(wallet: Wallet): boolean {\n return (\n Array.isArray(wallet.chains) &&\n wallet.chains.some(chain => typeof chain === 'string' && chain.startsWith('solana:'))\n );\n}\n\n/**\n * Legacy wallet PublicKey interface\n */\nexport interface LegacyPublicKey {\n toString(): string;\n toBytes?(): Uint8Array;\n}\n\n/**\n * Direct wallet interface for legacy wallets\n */\nexport interface DirectWallet {\n connect?: (options?: Record<string, unknown>) => Promise<unknown>;\n disconnect?: () => Promise<void> | void;\n signTransaction?: (tx: unknown) => Promise<unknown>;\n signMessage?: (msg: Uint8Array) => Promise<{ signature: Uint8Array }>;\n publicKey?: LegacyPublicKey;\n features?: Record<string, unknown>;\n chains?: readonly string[];\n accounts?: readonly unknown[];\n icon?: string;\n _metadata?: { icon?: string };\n adapter?: { icon?: string };\n metadata?: { icon?: string };\n iconUrl?: string;\n}\n\n/**\n * Check if wallet has a specific feature\n */\nfunction hasFeature(wallet: Wallet, featureName: string): boolean {\n return wallet.features != null && (wallet.features as Record<string, unknown>)[featureName] !== undefined;\n}\n\n/**\n * Verify if a wallet candidate matches the requested wallet name\n */\nfunction verifyWalletName(wallet: DirectWallet | Record<string, unknown>, requestedName: string): boolean {\n const name = requestedName.toLowerCase();\n const walletObj = wallet as Record<string, unknown>;\n\n const nameFields = [\n walletObj.name,\n walletObj.providerName,\n (walletObj.metadata as Record<string, unknown>)?.name,\n ].filter(Boolean) as string[];\n\n for (const field of nameFields) {\n if (typeof field === 'string' && field.toLowerCase().includes(name)) {\n return true;\n }\n }\n\n const capitalizedName = name.charAt(0).toUpperCase() + name.slice(1);\n const commonFlagPatterns = [`is${capitalizedName}`, `is${capitalizedName}Wallet`];\n\n for (const flagName of commonFlagPatterns) {\n if (walletObj[flagName] === true) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * WalletDetector - Handles wallet discovery and registry management\n *\n * Integrates with Wallet Standard registry and provides direct wallet detection.\n * Supports additional wallets (e.g., remote signers) via `setAdditionalWallets()`.\n * Maintains a stable connector ID -> Wallet mapping for vNext APIs.\n */\nexport class WalletDetector extends BaseCollaborator {\n private unsubscribers: Array<() => void> = [];\n private additionalWallets: Wallet[] = [];\n /** Map from stable connector ID to Wallet reference (not stored in state) */\n private connectorRegistry = new Map<WalletConnectorId, Wallet>();\n\n constructor(\n stateManager: import('../core/state-manager').StateManager,\n eventEmitter: import('../core/event-emitter').EventEmitter,\n debug = false,\n ) {\n super({ stateManager, eventEmitter, debug }, 'WalletDetector');\n }\n\n /**\n * Set additional wallets to include alongside Wallet Standard wallets.\n * These wallets (e.g., remote signers) will be merged with detected wallets.\n *\n * @param wallets - Array of Wallet Standard compatible wallets\n */\n setAdditionalWallets(wallets: Wallet[]): void {\n this.additionalWallets = wallets;\n // Re-run detection to merge new wallets\n this.refreshWallets();\n }\n\n /**\n * Get additional wallets that have been configured\n */\n getAdditionalWallets(): Wallet[] {\n return this.additionalWallets;\n }\n\n /**\n * Refresh wallet list (re-detect and merge)\n */\n private refreshWallets(): void {\n if (typeof window === 'undefined') return;\n\n try {\n const walletsApi = getWalletsRegistry();\n const ws = walletsApi.get();\n\n // - Only include Solana wallets (Wallet Standard supports multi-chain registries)\n // - If multiple wallets share the same name (e.g. multi-chain variants), prefer the Solana one\n // by filtering to solana:* first, then deduplicating by name.\n const registryWallets = ws.filter(isSolanaWallet);\n const additionalWallets = this.additionalWallets.filter(isSolanaWallet);\n const unique = this.deduplicateWallets([...registryWallets, ...additionalWallets]);\n\n // Update connector registry (connectorId -> Wallet map)\n this.updateConnectorRegistry(unique);\n\n this.stateManager.updateState({\n wallets: unique.map(w => this.mapToWalletInfo(w)),\n connectors: unique.map(w => this.mapToConnectorMetadata(w)),\n });\n\n this.log('🔍 WalletDetector: refreshed wallets', {\n registry: registryWallets.length,\n additional: additionalWallets.length,\n total: unique.length,\n });\n } catch {\n // Ignore errors during refresh\n }\n }\n\n /**\n * Initialize wallet detection (synchronous)\n *\n * Sets up registry listeners immediately. Due to the async nature of registry initialization,\n * the initial call to `get()` may return an empty array if called before the registry is ready.\n * Event listeners will fire as wallets register, providing eventual consistency.\n *\n * For deterministic detection where you need all wallets available immediately,\n * use `initializeAsync()` instead.\n */\n initialize(): void {\n if (typeof window === 'undefined') return;\n\n try {\n const walletsApi = getWalletsRegistry();\n const update = () => {\n const ws = walletsApi.get();\n const previousCount = this.getState().wallets.length;\n\n // - Only include Solana wallets (Wallet Standard supports multi-chain registries)\n // - If multiple wallets share the same name (e.g. multi-chain variants), prefer the Solana one\n // by filtering to solana:* first, then deduplicating by name.\n const registryWallets = ws.filter(isSolanaWallet);\n const additionalWallets = this.additionalWallets.filter(isSolanaWallet);\n const unique = this.deduplicateWallets([...registryWallets, ...additionalWallets]);\n const newCount = unique.length;\n\n if (newCount !== previousCount) {\n this.log('🔍 WalletDetector: found wallets:', {\n registry: registryWallets.length,\n additional: additionalWallets.length,\n total: newCount,\n });\n }\n\n // Update connector registry (connectorId -> Wallet map)\n this.updateConnectorRegistry(unique);\n\n // Update state with both legacy WalletInfo[] and vNext connectors[]\n this.stateManager.updateState({\n wallets: unique.map(w => this.mapToWalletInfo(w)),\n connectors: unique.map(w => this.mapToConnectorMetadata(w)),\n });\n\n if (newCount !== previousCount && newCount > 0) {\n this.eventEmitter.emit({\n type: 'wallets:detected',\n count: newCount,\n timestamp: new Date().toISOString(),\n });\n }\n };\n\n update();\n\n this.unsubscribers.push(walletsApi.on('register', update));\n this.unsubscribers.push(walletsApi.on('unregister', update));\n\n setTimeout(() => {\n if (!this.getState().connected) {\n update();\n }\n }, 1000);\n } catch {}\n }\n\n /**\n * Initialize wallet detection with deterministic registry availability (async)\n *\n * Awaits the registry `ready` Promise before performing initial detection,\n * ensuring all registered wallets are available on the first `get()` call.\n *\n * Use this when you need guaranteed wallet availability before proceeding\n * (e.g., auto-reconnect logic, checking if a specific wallet is installed).\n *\n * @example\n * ```ts\n * await walletDetector.initializeAsync();\n * const wallets = walletDetector.getDetectedWallets(); // Guaranteed populated\n * ```\n */\n async initializeAsync(): Promise<void> {\n if (typeof window === 'undefined') return;\n\n // Wait for registry to be ready before initial detection\n await ready;\n\n // Now initialize with guaranteed registry availability\n this.initialize();\n }\n\n /**\n * Check if a specific wallet is available immediately via direct window object detection\n */\n detectDirectWallet(walletName: string): DirectWallet | null {\n if (typeof window === 'undefined') return null;\n\n const name = walletName.toLowerCase();\n const windowObj = window as unknown as Record<string, unknown>;\n\n const checks = [\n () => windowObj[name],\n () => windowObj[`${name}Wallet`],\n () => windowObj.solana,\n () => {\n const keys = Object.keys(window).filter(k => k.toLowerCase().includes(name));\n return keys.length > 0 ? windowObj[keys[0]] : null;\n },\n ];\n\n for (const check of checks) {\n try {\n const result = check();\n if (result && typeof result === 'object') {\n const wallet = result as DirectWallet;\n\n if (!verifyWalletName(wallet, walletName)) {\n continue;\n }\n\n // Verify wallet authenticity before returning\n const verification = WalletAuthenticityVerifier.verify(wallet, walletName);\n\n if (!verification.authentic) {\n logger.warn('Rejecting potentially malicious wallet', {\n name: walletName,\n reason: verification.reason,\n confidence: verification.confidence,\n });\n continue;\n }\n\n if (verification.warnings.length > 0) {\n logger.warn('Wallet verification warnings', {\n name: walletName,\n warnings: verification.warnings,\n });\n }\n\n const hasStandardConnect = wallet.features?.['standard:connect'];\n const hasLegacyConnect = typeof wallet.connect === 'function';\n if (hasStandardConnect || hasLegacyConnect) {\n logger.debug('Authentic wallet detected', {\n name: walletName,\n confidence: verification.confidence,\n });\n return wallet;\n }\n }\n } catch (e) {\n continue;\n }\n }\n\n return null;\n }\n\n /**\n * Get currently detected wallets (legacy)\n * @deprecated Use getConnectors() for vNext API\n */\n getDetectedWallets(): WalletInfo[] {\n return this.getState().wallets;\n }\n\n /**\n * Get all available connectors (vNext API)\n */\n getConnectors(): WalletConnectorMetadata[] {\n return this.getState().connectors;\n }\n\n /**\n * Get a wallet by its stable connector ID (vNext API)\n * Returns the Wallet reference for connection operations\n */\n getConnectorById(connectorId: WalletConnectorId): Wallet | undefined {\n return this.connectorRegistry.get(connectorId);\n }\n\n /**\n * Get connector metadata by ID\n */\n getConnectorMetadata(connectorId: WalletConnectorId): WalletConnectorMetadata | undefined {\n return this.getState().connectors.find(c => c.id === connectorId);\n }\n\n /**\n * Update the connector registry map\n */\n private updateConnectorRegistry(wallets: Wallet[]): void {\n // Clear and rebuild to handle unregistered wallets\n this.connectorRegistry.clear();\n for (const wallet of wallets) {\n const connectorId = createConnectorId(wallet.name);\n this.connectorRegistry.set(connectorId, wallet);\n }\n }\n\n /**\n * Convert a Wallet Standard wallet to WalletConnectorMetadata (serializable)\n */\n private mapToConnectorMetadata(wallet: Wallet): WalletConnectorMetadata {\n const walletWithIcon = applyWalletIconOverride(wallet);\n const hasConnect = hasFeature(walletWithIcon, 'standard:connect');\n const isSolana = isSolanaWallet(walletWithIcon);\n // Wallet UI considers a wallet \"available\" if it's in the registry and supports Solana.\n // We additionally require standard:connect so the UX doesn't offer unconnectable wallets.\n // Do NOT require standard:disconnect; some wallets omit it but still connect fine.\n const ready = hasConnect && isSolana;\n\n return {\n id: createConnectorId(wallet.name),\n name: wallet.name,\n icon: typeof walletWithIcon.icon === 'string' ? walletWithIcon.icon : '',\n ready,\n chains: walletWithIcon.chains ?? [],\n features: Object.keys(walletWithIcon.features ?? {}),\n };\n }\n\n /**\n * Convert a Wallet Standard wallet to WalletInfo with capability checks (legacy)\n */\n private mapToWalletInfo(wallet: Wallet): WalletInfo {\n const walletWithIcon = applyWalletIconOverride(wallet);\n const hasConnect = hasFeature(walletWithIcon, 'standard:connect');\n const isSolana = isSolanaWallet(walletWithIcon);\n const connectable = hasConnect && isSolana;\n\n return {\n wallet: walletWithIcon,\n installed: true,\n connectable,\n };\n }\n\n /**\n * Deduplicate wallets by name (keeps first occurrence)\n */\n private deduplicateWallets(wallets: readonly Wallet[]): Wallet[] {\n const seen = new Map<string, Wallet>();\n for (const wallet of wallets) {\n if (!seen.has(wallet.name)) {\n seen.set(wallet.name, wallet);\n }\n }\n return Array.from(seen.values());\n }\n\n /**\n * Cleanup resources\n */\n destroy(): void {\n for (const unsubscribe of this.unsubscribers) {\n try {\n unsubscribe();\n } catch (error) {\n logger.warn('Error during unsubscribe cleanup', { error });\n }\n }\n this.unsubscribers = [];\n }\n}\n","import type { Wallet, WalletAccount, WalletName } from '../../types/wallets';\nimport type { AccountInfo } from '../../types/accounts';\nimport type { StorageAdapter } from '../../types/storage';\nimport type {\n WalletConnectorId,\n ConnectOptions,\n WalletStatus,\n WalletSession,\n SessionAccount,\n} from '../../types/session';\nimport { INITIAL_WALLET_STATUS, createConnectorId } from '../../types/session';\nimport { BaseCollaborator } from '../core/base-collaborator';\nimport type {\n StandardConnectFeature,\n StandardConnectMethod,\n StandardDisconnectFeature,\n StandardDisconnectMethod,\n StandardEventsFeature,\n StandardEventsOnMethod,\n} from '@wallet-standard/features';\nimport type { Address } from '@solana/addresses';\nimport { MAX_POLL_ATTEMPTS, POLL_INTERVALS_MS } from '../constants';\n\n/**\n * Type-safe accessor for standard:connect feature\n */\nfunction getConnectFeature(wallet: Wallet): StandardConnectMethod | null {\n const feature = wallet.features['standard:connect'] as StandardConnectFeature['standard:connect'] | undefined;\n return feature?.connect ?? null;\n}\n\n/**\n * Type-safe accessor for standard:disconnect feature\n */\nfunction getDisconnectFeature(wallet: Wallet): StandardDisconnectMethod | null {\n const feature = wallet.features['standard:disconnect'] as\n | StandardDisconnectFeature['standard:disconnect']\n | undefined;\n return feature?.disconnect ?? null;\n}\n\n/**\n * Type-safe accessor for standard:events feature\n */\nfunction getEventsFeature(wallet: Wallet): StandardEventsOnMethod | null {\n const feature = wallet.features['standard:events'] as StandardEventsFeature['standard:events'] | undefined;\n return feature?.on ?? null;\n}\n\n/**\n * ConnectionManager - Handles wallet connection lifecycle\n *\n * Manages connecting, disconnecting, account selection, and wallet event subscriptions.\n */\nexport class ConnectionManager extends BaseCollaborator {\n private walletStorage?: StorageAdapter<string | undefined>;\n private walletChangeUnsub: (() => void) | null = null;\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private pollAttempts = 0;\n private connectAttemptId = 0;\n private pendingWallet: Wallet | null = null;\n private pendingWalletName: string | null = null;\n\n constructor(\n stateManager: import('../core/state-manager').StateManager,\n eventEmitter: import('../core/event-emitter').EventEmitter,\n walletStorage?: StorageAdapter<string | undefined>,\n debug = false,\n ) {\n super({ stateManager, eventEmitter, debug }, 'ConnectionManager');\n this.walletStorage = walletStorage;\n }\n\n // ========================================================================\n // vNext Connection Methods (connector-id based, silent-first)\n // ========================================================================\n\n /**\n * Connect to a wallet using the vNext API with silent-first support.\n *\n * @param wallet - Wallet Standard wallet instance\n * @param connectorId - Stable connector identifier\n * @param options - Connection options (silent mode, preferred account, etc.)\n */\n async connectWallet(wallet: Wallet, connectorId: WalletConnectorId, options?: ConnectOptions): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const attemptId = ++this.connectAttemptId;\n this.pendingWallet = wallet;\n this.pendingWalletName = wallet.name;\n\n const { silent = false, allowInteractiveFallback = true, preferredAccount } = options ?? {};\n\n // Set wallet status to connecting\n this.updateWalletStatus({\n status: 'connecting',\n connectorId,\n });\n\n this.stateManager.updateState({ connecting: true }, true);\n\n this.eventEmitter.emit({\n type: 'connecting',\n wallet: wallet.name as WalletName,\n timestamp: new Date().toISOString(),\n });\n\n try {\n const connect = getConnectFeature(wallet);\n if (!connect) throw new Error(`Wallet ${wallet.name} does not support standard connect`);\n\n // Attempt silent connection first if requested\n let result;\n if (silent) {\n try {\n result = await connect({ silent: true });\n if (attemptId !== this.connectAttemptId) throw new Error('Connection cancelled');\n\n // Check if silent connect returned accounts\n const hasAccounts = result.accounts.length > 0 || wallet.accounts.length > 0;\n if (!hasAccounts && allowInteractiveFallback) {\n this.log('Silent connect returned no accounts, trying interactive...');\n result = await connect({ silent: false });\n } else if (!hasAccounts) {\n throw new Error('Silent connection failed: no accounts returned');\n }\n } catch (silentError) {\n if (attemptId !== this.connectAttemptId) throw new Error('Connection cancelled');\n\n if (allowInteractiveFallback) {\n this.log('Silent connect failed, trying interactive...', silentError);\n result = await connect({ silent: false });\n } else {\n throw silentError;\n }\n }\n } else {\n result = await connect({ silent: false });\n }\n\n if (attemptId !== this.connectAttemptId) throw new Error('Connection cancelled');\n\n // Merge accounts from wallet and connect result\n const walletAccounts = wallet.accounts;\n const accountMap = new Map<string, WalletAccount>();\n for (const a of [...walletAccounts, ...result.accounts]) accountMap.set(a.address, a);\n\n const sessionAccounts: SessionAccount[] = Array.from(accountMap.values()).map(a => ({\n address: a.address as Address,\n label: a.label,\n account: a,\n }));\n\n const legacyAccounts = sessionAccounts.map(a => this.toAccountInfo(a.account));\n\n // Select account: preferredAccount > first new account > first account\n let selectedAccount = sessionAccounts[0];\n if (preferredAccount) {\n const preferred = sessionAccounts.find(a => a.address === preferredAccount);\n if (preferred) selectedAccount = preferred;\n }\n\n // Create session\n const session = this.createSession(wallet, connectorId, sessionAccounts, selectedAccount);\n\n // Update wallet status to connected\n this.updateWalletStatus({\n status: 'connected',\n session,\n });\n\n // Also update legacy state fields for backwards compatibility\n this.stateManager.updateState(\n {\n selectedWallet: wallet,\n connected: true,\n connecting: false,\n accounts: legacyAccounts,\n selectedAccount: selectedAccount?.address ?? null,\n },\n true,\n );\n\n this.log('✅ Connection successful (vNext)', {\n connectorId,\n selectedAccount: selectedAccount?.address,\n accountsCount: sessionAccounts.length,\n });\n\n if (selectedAccount) {\n this.eventEmitter.emit({\n type: 'wallet:connected',\n wallet: wallet.name as WalletName,\n account: selectedAccount.address,\n timestamp: new Date().toISOString(),\n });\n }\n\n // Save wallet to storage\n if (this.walletStorage) {\n const isAvailable =\n !('isAvailable' in this.walletStorage) ||\n typeof this.walletStorage.isAvailable !== 'function' ||\n this.walletStorage.isAvailable();\n\n if (isAvailable) {\n this.walletStorage.set(wallet.name);\n }\n }\n\n this.subscribeToWalletEventsVNext(wallet, connectorId);\n } catch (e) {\n if (attemptId !== this.connectAttemptId) throw e;\n\n const errorMessage = e instanceof Error ? e.message : String(e);\n const error = e instanceof Error ? e : new Error(errorMessage);\n\n // Update wallet status to error\n this.updateWalletStatus({\n status: 'error',\n error,\n connectorId,\n recoverable: this.isRecoverableError(error),\n });\n\n this.stateManager.updateState(\n {\n selectedWallet: null,\n connected: false,\n connecting: false,\n accounts: [],\n selectedAccount: null,\n },\n true,\n );\n\n this.eventEmitter.emit({\n type: 'connection:failed',\n wallet: wallet.name as WalletName,\n error: errorMessage,\n timestamp: new Date().toISOString(),\n });\n\n throw e;\n } finally {\n if (this.pendingWallet === wallet) {\n this.pendingWallet = null;\n this.pendingWalletName = null;\n }\n }\n }\n\n /**\n * Create a WalletSession object\n */\n private createSession(\n wallet: Wallet,\n connectorId: WalletConnectorId,\n accounts: SessionAccount[],\n selectedAccount: SessionAccount,\n ): WalletSession {\n const listeners = new Set<(accounts: SessionAccount[]) => void>();\n\n return {\n connectorId,\n accounts,\n selectedAccount,\n onAccountsChanged: (listener: (accounts: SessionAccount[]) => void) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n selectAccount: async (address: Address) => {\n const account = accounts.find(a => a.address === address);\n if (account) {\n return this.selectAccount(address);\n }\n },\n };\n }\n\n /**\n * Update wallet status in state\n */\n private updateWalletStatus(status: WalletStatus): void {\n this.stateManager.updateState({ wallet: status });\n }\n\n /**\n * Subscribe to wallet events (vNext version with improved account change handling)\n */\n private subscribeToWalletEventsVNext(wallet: Wallet, connectorId: WalletConnectorId): void {\n if (this.walletChangeUnsub) {\n this.walletChangeUnsub();\n this.walletChangeUnsub = null;\n }\n this.stopPollingWalletAccounts();\n\n const eventsOn = getEventsFeature(wallet);\n if (!eventsOn) {\n this.startPollingWalletAccountsVNext(wallet, connectorId);\n return;\n }\n\n try {\n this.walletChangeUnsub = eventsOn('change', properties => {\n const changeAccounts = properties?.accounts ?? [];\n this.handleAccountsChanged(changeAccounts, connectorId, wallet);\n });\n } catch (error) {\n this.startPollingWalletAccountsVNext(wallet, connectorId);\n }\n }\n\n /**\n * Handle accounts changed event with proper validation\n */\n private handleAccountsChanged(\n newAccounts: readonly WalletAccount[],\n connectorId: WalletConnectorId,\n wallet: Wallet,\n ): void {\n const state = this.getState();\n\n // If no accounts, disconnect\n if (newAccounts.length === 0) {\n this.log('No accounts available, disconnecting...');\n this.disconnect();\n return;\n }\n\n const sessionAccounts: SessionAccount[] = newAccounts.map(a => ({\n address: a.address as Address,\n label: a.label,\n account: a,\n }));\n\n const legacyAccounts = sessionAccounts.map(a => this.toAccountInfo(a.account));\n\n // Check if selected account is still available\n const currentSelected = state.selectedAccount;\n let selectedAccount = sessionAccounts.find(a => a.address === currentSelected);\n\n // If selected account is gone, select first available\n if (!selectedAccount) {\n selectedAccount = sessionAccounts[0];\n this.eventEmitter.emit({\n type: 'account:changed',\n account: selectedAccount.address,\n timestamp: new Date().toISOString(),\n });\n }\n\n // Update session in wallet status\n if (state.wallet.status === 'connected') {\n const session = this.createSession(wallet, connectorId, sessionAccounts, selectedAccount);\n this.updateWalletStatus({\n status: 'connected',\n session,\n });\n }\n\n // Update legacy state\n this.stateManager.updateState({\n accounts: legacyAccounts,\n selectedAccount: selectedAccount.address,\n });\n }\n\n /**\n * Start polling wallet accounts (vNext version)\n */\n private startPollingWalletAccountsVNext(wallet: Wallet, connectorId: WalletConnectorId): void {\n if (this.pollTimer) return;\n\n this.pollAttempts = 0;\n\n const poll = () => {\n if (this.pollAttempts >= MAX_POLL_ATTEMPTS) {\n this.stopPollingWalletAccounts();\n this.log('Stopped wallet polling after max attempts');\n return;\n }\n\n try {\n const walletAccounts = wallet.accounts;\n if (walletAccounts.length > 0) {\n this.handleAccountsChanged(walletAccounts, connectorId, wallet);\n this.pollAttempts = 0; // Reset on success\n }\n } catch (error) {\n this.log('Wallet polling error:', error);\n }\n\n this.pollAttempts++;\n const intervalIndex = Math.min(this.pollAttempts, POLL_INTERVALS_MS.length - 1);\n const interval = POLL_INTERVALS_MS[intervalIndex];\n this.pollTimer = setTimeout(poll, interval);\n };\n\n poll();\n }\n\n /**\n * Check if an error is recoverable\n */\n private isRecoverableError(error: Error): boolean {\n const message = error.message.toLowerCase();\n return (\n message.includes('user rejected') ||\n message.includes('user denied') ||\n message.includes('cancelled') ||\n message.includes('canceled')\n );\n }\n\n // ========================================================================\n // Legacy Connection Methods (kept for backwards compatibility)\n // ========================================================================\n\n /**\n * Connect to a wallet (legacy API)\n * @deprecated Use connectWallet() instead\n */\n async connect(wallet: Wallet, walletName?: string): Promise<void> {\n if (typeof window === 'undefined') return;\n\n const name = walletName || wallet.name;\n const attemptId = ++this.connectAttemptId;\n this.pendingWallet = wallet;\n this.pendingWalletName = name;\n const connectorId = createConnectorId(name);\n\n this.eventEmitter.emit({\n type: 'connecting',\n wallet: name as WalletName,\n timestamp: new Date().toISOString(),\n });\n\n // Keep vNext state machine in sync even when using legacy connect().\n // Auto-connect relies on this method today, and many UIs use `walletStatus/isConnected`.\n this.updateWalletStatus({\n status: 'connecting',\n connectorId,\n });\n\n this.stateManager.updateState({ connecting: true }, true);\n\n try {\n const connect = getConnectFeature(wallet);\n if (!connect) throw new Error(`Wallet ${name} does not support standard connect`);\n\n const result = await connect({ silent: false });\n if (attemptId !== this.connectAttemptId) {\n throw new Error('Connection cancelled');\n }\n\n const walletAccounts = wallet.accounts;\n const accountMap = new Map<string, WalletAccount>();\n for (const a of [...walletAccounts, ...result.accounts]) accountMap.set(a.address, a);\n const sessionAccounts: SessionAccount[] = Array.from(accountMap.values()).map(a => ({\n address: a.address as Address,\n label: a.label,\n account: a,\n }));\n\n if (sessionAccounts.length === 0) {\n throw new Error(`Wallet ${name} connected but returned no accounts`);\n }\n\n const accounts = sessionAccounts.map(a => this.toAccountInfo(a.account));\n\n const state = this.getState();\n const previouslySelected = state.selectedAccount;\n const previousAddresses = new Set(state.accounts.map((a: AccountInfo) => a.address));\n const firstNew = accounts.find(a => !previousAddresses.has(a.address));\n const selected = firstNew?.address ?? previouslySelected ?? accounts[0]?.address ?? null;\n\n const selectedSessionAccount =\n (selected ? sessionAccounts.find(a => a.address === selected) : undefined) ?? sessionAccounts[0];\n\n // Update vNext wallet status to connected\n const session = this.createSession(wallet, connectorId, sessionAccounts, selectedSessionAccount);\n this.updateWalletStatus({\n status: 'connected',\n session,\n });\n\n this.stateManager.updateState(\n {\n selectedWallet: wallet,\n connected: true,\n connecting: false,\n accounts,\n selectedAccount: selected,\n },\n true,\n );\n\n this.log('✅ Connection successful - state updated:', {\n connected: true,\n selectedWallet: wallet.name,\n selectedAccount: selected,\n accountsCount: accounts.length,\n });\n\n // Only emit wallet:connected event if we have a valid account\n // The event type requires a non-null Address\n if (selected) {\n this.eventEmitter.emit({\n type: 'wallet:connected',\n wallet: name as WalletName,\n account: selected as Address,\n timestamp: new Date().toISOString(),\n });\n } else {\n this.log('⚠️ Connection succeeded but no account available', {\n wallet: wallet.name,\n accountsCount: accounts.length,\n });\n }\n\n // Save wallet name to storage (if available)\n if (this.walletStorage) {\n const isAvailable =\n !('isAvailable' in this.walletStorage) ||\n typeof this.walletStorage.isAvailable !== 'function' ||\n this.walletStorage.isAvailable();\n\n if (isAvailable) {\n this.walletStorage.set(name);\n } else {\n this.log('Storage not available (private browsing?), skipping wallet persistence');\n }\n }\n\n this.subscribeToWalletEvents();\n } catch (e) {\n // If this connect attempt was superseded/cancelled, do not mutate state here.\n // The cancel path is handled by disconnect().\n if (attemptId !== this.connectAttemptId) {\n throw e;\n }\n\n const errorMessage = e instanceof Error ? e.message : String(e);\n const error = e instanceof Error ? e : new Error(errorMessage);\n\n this.eventEmitter.emit({\n type: 'connection:failed',\n wallet: name as WalletName,\n error: errorMessage,\n timestamp: new Date().toISOString(),\n });\n\n this.eventEmitter.emit({\n type: 'error',\n error,\n context: 'wallet-connection',\n timestamp: new Date().toISOString(),\n });\n\n // Keep vNext wallet status in sync\n this.updateWalletStatus({\n status: 'error',\n error,\n connectorId,\n recoverable: this.isRecoverableError(error),\n });\n\n this.stateManager.updateState(\n {\n selectedWallet: null,\n connected: false,\n connecting: false,\n accounts: [],\n selectedAccount: null,\n },\n true,\n );\n\n throw e;\n } finally {\n if (this.pendingWallet === wallet && this.pendingWalletName === name) {\n this.pendingWallet = null;\n this.pendingWalletName = null;\n }\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n // Invalidate any in-flight connect attempt so it can't update state later.\n this.connectAttemptId++;\n\n if (this.walletChangeUnsub) {\n this.walletChangeUnsub();\n this.walletChangeUnsub = null;\n }\n this.stopPollingWalletAccounts();\n\n const wallet = this.getState().selectedWallet ?? this.pendingWallet;\n this.pendingWallet = null;\n this.pendingWalletName = null;\n\n // Update wallet status to disconnected (vNext)\n this.updateWalletStatus(INITIAL_WALLET_STATUS);\n\n // Update legacy state immediately so UI is never stuck in a \"connecting\" state.\n this.stateManager.updateState(\n {\n selectedWallet: null,\n connected: false,\n connecting: false,\n accounts: [],\n selectedAccount: null,\n },\n true,\n );\n\n this.eventEmitter.emit({\n type: 'wallet:disconnected',\n timestamp: new Date().toISOString(),\n });\n\n // Clear wallet from storage (remove key entirely)\n if (this.walletStorage && 'clear' in this.walletStorage && typeof this.walletStorage.clear === 'function') {\n this.walletStorage.clear();\n } else {\n // Fallback for storage adapters without clear()\n this.walletStorage?.set(undefined);\n }\n\n // Attempt wallet disconnect after state is reset; don't block UI.\n if (wallet) {\n const disconnect = getDisconnectFeature(wallet);\n if (disconnect) {\n try {\n await disconnect();\n } catch {\n // ignore disconnect errors during cancellation\n }\n }\n }\n }\n\n /**\n * Select a different account\n */\n async selectAccount(address: string): Promise<void> {\n const state = this.getState();\n const current = state.selectedWallet;\n if (!current) throw new Error('No wallet connected');\n\n if (!address || address.length < 5) {\n throw new Error(`Invalid address format: ${address}`);\n }\n\n let target = state.accounts.find((acc: AccountInfo) => acc.address === address)?.raw ?? null;\n\n if (!target) {\n // Try to reconnect and refetch accounts\n try {\n const connect = getConnectFeature(current);\n if (connect) {\n const res = await connect();\n const accounts = res.accounts.map(a => this.toAccountInfo(a));\n target = accounts.find((acc: AccountInfo) => acc.address === address)?.raw ?? null;\n this.stateManager.updateState({ accounts });\n }\n } catch (error) {\n throw new Error('Failed to reconnect wallet for account selection');\n }\n }\n\n if (!target) throw new Error(`Requested account not available: ${address}`);\n\n this.stateManager.updateState({ selectedAccount: target.address as Address });\n\n this.eventEmitter.emit({\n type: 'account:changed',\n account: target.address as Address,\n timestamp: new Date().toISOString(),\n });\n }\n\n /**\n * Convert wallet account to AccountInfo\n */\n private toAccountInfo(account: WalletAccount): AccountInfo {\n return {\n address: account.address as Address,\n icon: account.icon,\n raw: account,\n };\n }\n\n /**\n * Subscribe to wallet change events\n */\n private subscribeToWalletEvents(): void {\n if (this.walletChangeUnsub) {\n this.walletChangeUnsub();\n this.walletChangeUnsub = null;\n }\n this.stopPollingWalletAccounts();\n\n const wallet = this.getState().selectedWallet;\n if (!wallet) return;\n\n const eventsOn = getEventsFeature(wallet);\n if (!eventsOn) {\n this.startPollingWalletAccounts();\n return;\n }\n\n try {\n this.walletChangeUnsub = eventsOn('change', properties => {\n const changeAccounts = properties?.accounts ?? [];\n if (changeAccounts.length === 0) return;\n\n const nextAccounts = changeAccounts.map(a => this.toAccountInfo(a));\n\n if (nextAccounts.length > 0) {\n this.stateManager.updateState({\n accounts: nextAccounts,\n });\n }\n });\n } catch (error) {\n this.startPollingWalletAccounts();\n }\n }\n\n /**\n * Start polling wallet accounts (fallback when events not available)\n * Uses exponential backoff to reduce polling frequency over time\n */\n private startPollingWalletAccounts(): void {\n if (this.pollTimer) return;\n const wallet = this.getState().selectedWallet;\n if (!wallet) return;\n\n this.pollAttempts = 0;\n\n const poll = () => {\n // Stop polling after max attempts\n if (this.pollAttempts >= MAX_POLL_ATTEMPTS) {\n this.stopPollingWalletAccounts();\n this.log('Stopped wallet polling after max attempts');\n return;\n }\n\n try {\n const state = this.getState();\n const walletAccounts = wallet.accounts;\n const nextAccounts = walletAccounts.map((a: WalletAccount) => this.toAccountInfo(a));\n\n if (state.accounts.length === 0 && nextAccounts.length > 0) {\n this.stateManager.updateState({\n accounts: nextAccounts,\n selectedAccount: state.selectedAccount || nextAccounts[0]?.address || null,\n });\n\n // Reset poll attempts on success\n this.pollAttempts = 0;\n }\n } catch (error) {\n this.log('Wallet polling error:', error);\n }\n\n this.pollAttempts++;\n\n // Get interval with exponential backoff\n const intervalIndex = Math.min(this.pollAttempts, POLL_INTERVALS_MS.length - 1);\n const interval = POLL_INTERVALS_MS[intervalIndex];\n\n this.pollTimer = setTimeout(poll, interval);\n };\n\n // Start polling\n poll();\n }\n\n /**\n * Stop polling wallet accounts\n */\n private stopPollingWalletAccounts(): void {\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n this.pollAttempts = 0;\n }\n }\n\n /**\n * Get stored wallet name\n */\n getStoredWallet(): string | null {\n return this.walletStorage?.get() ?? null;\n }\n}\n","import type { Wallet, WalletInfo } from '../../types/wallets';\nimport type { StorageAdapter, PersistedWalletState } from '../../types/storage';\nimport type { WalletConnectorId } from '../../types/session';\nimport { createConnectorId } from '../../types/session';\nimport type { WalletDetector, LegacyPublicKey } from './detector';\nimport type { ConnectionManager } from './connection-manager';\nimport type { StateManager } from '../core/state-manager';\nimport { getWalletsRegistry, ready } from './standard-shim';\nimport { createLogger } from '../utils/secure-logger';\nimport { applyWalletIconOverride } from './wallet-icon-overrides';\n\nconst logger = createLogger('AutoConnector');\n\nconst MIN_ADDRESS_LENGTH = 30;\n\ninterface LegacyConnectResult {\n publicKey?: LegacyPublicKey;\n accounts?: unknown[];\n}\n\nexport class AutoConnector {\n private walletDetector: WalletDetector;\n private connectionManager: ConnectionManager;\n private stateManager: StateManager;\n /** Legacy wallet name storage */\n private walletStorage?: StorageAdapter<string | undefined>;\n /** vNext wallet state storage (connector ID + account) */\n private walletStateStorage?: StorageAdapter<PersistedWalletState | null>;\n private debug: boolean;\n\n constructor(\n walletDetector: WalletDetector,\n connectionManager: ConnectionManager,\n stateManager: StateManager,\n walletStorage?: StorageAdapter<string | undefined>,\n debug = false,\n walletStateStorage?: StorageAdapter<PersistedWalletState | null>,\n ) {\n this.walletDetector = walletDetector;\n this.connectionManager = connectionManager;\n this.stateManager = stateManager;\n this.walletStorage = walletStorage;\n this.walletStateStorage = walletStateStorage;\n this.debug = debug;\n }\n\n async attemptAutoConnect(): Promise<boolean> {\n // First try vNext auto-connect with silent-first approach\n if (this.walletStateStorage) {\n const vNextSuccess = await this.attemptVNextAutoConnect();\n if (vNextSuccess) return true;\n }\n\n // Fall back to legacy auto-connect\n const instantSuccess = await this.attemptInstantConnect();\n if (instantSuccess) return true;\n\n await this.attemptStandardConnect();\n return this.stateManager.getSnapshot().connected;\n }\n\n /**\n * vNext auto-connect using stored connector ID with silent-first approach.\n * This won't prompt the user unless they explicitly initiated the connect.\n */\n private async attemptVNextAutoConnect(): Promise<boolean> {\n const walletState = this.walletStateStorage?.get();\n if (!walletState || !walletState.autoConnect) {\n if (this.debug) {\n logger.debug('vNext auto-connect: No stored wallet state or autoConnect disabled');\n }\n return false;\n }\n\n const { connectorId, lastAccount } = walletState;\n\n // Wait for registry to be ready\n await ready;\n\n // Try to get connector by ID\n const wallet = this.walletDetector.getConnectorById(connectorId as WalletConnectorId);\n if (!wallet) {\n if (this.debug) {\n logger.debug('vNext auto-connect: Connector not found', { connectorId });\n }\n return false;\n }\n\n try {\n if (this.debug) {\n logger.info('vNext auto-connect: Attempting silent connect', {\n connectorId,\n lastAccount,\n });\n }\n\n // Use silent-first connect (won't prompt user)\n await this.connectionManager.connectWallet(wallet, connectorId as WalletConnectorId, {\n silent: true,\n allowInteractiveFallback: false, // Don't prompt on auto-connect\n preferredAccount: lastAccount as import('@solana/addresses').Address | undefined,\n });\n\n if (this.debug) {\n logger.info('vNext auto-connect: Silent connect successful', { connectorId });\n }\n\n return true;\n } catch (error) {\n if (this.debug) {\n logger.debug('vNext auto-connect: Silent connect failed (expected for first-time or revoked)', {\n connectorId,\n error: error instanceof Error ? error.message : error,\n });\n }\n // Silent connect failed - this is normal for first-time connections\n // or when user revoked permissions. Don't clear state, let user retry.\n return false;\n }\n }\n\n private async attemptInstantConnect(): Promise<boolean> {\n const storedWalletName = this.walletStorage?.get();\n if (!storedWalletName) return false;\n\n const directWallet = this.walletDetector.detectDirectWallet(storedWalletName);\n if (!directWallet) return false;\n\n if (this.debug) {\n logger.info('Instant auto-connect: found wallet directly in window', { walletName: storedWalletName });\n }\n\n try {\n const features: Record<string, Record<string, (...args: unknown[]) => unknown>> = {};\n\n if (directWallet.connect) {\n features['standard:connect'] = {\n connect: async (...args: unknown[]) => {\n const options = args[0] as Record<string, unknown> | undefined;\n const result = await directWallet.connect!(options);\n\n if (this.debug) {\n logger.debug('Direct wallet connect result', { result });\n logger.debug('Direct wallet publicKey property', { publicKey: directWallet.publicKey });\n }\n\n if (\n result &&\n typeof result === 'object' &&\n 'accounts' in result &&\n Array.isArray(result.accounts)\n ) {\n return result;\n }\n\n const legacyResult = result as LegacyConnectResult | undefined;\n if (legacyResult?.publicKey && typeof legacyResult.publicKey.toString === 'function') {\n const address = legacyResult.publicKey.toString();\n const publicKeyBytes = legacyResult.publicKey.toBytes\n ? legacyResult.publicKey.toBytes()\n : new Uint8Array();\n\n return {\n accounts: [\n {\n address,\n publicKey: publicKeyBytes,\n chains: ['solana:mainnet', 'solana:devnet', 'solana:testnet'] as const,\n features: [],\n },\n ],\n };\n }\n\n if (directWallet.publicKey && typeof directWallet.publicKey.toString === 'function') {\n const address = directWallet.publicKey.toString();\n const publicKeyBytes = directWallet.publicKey.toBytes\n ? directWallet.publicKey.toBytes()\n : new Uint8Array();\n\n if (this.debug) {\n logger.debug('Using legacy wallet pattern - publicKey from wallet object');\n }\n return {\n accounts: [\n {\n address,\n publicKey: publicKeyBytes,\n chains: ['solana:mainnet', 'solana:devnet', 'solana:testnet'] as const,\n features: [],\n },\n ],\n };\n }\n\n const publicKeyResult = result as LegacyPublicKey | undefined;\n if (\n publicKeyResult &&\n typeof publicKeyResult.toString === 'function' &&\n publicKeyResult.toString().length > MIN_ADDRESS_LENGTH\n ) {\n const address = publicKeyResult.toString();\n const publicKeyBytes = publicKeyResult.toBytes\n ? publicKeyResult.toBytes()\n : new Uint8Array();\n\n return {\n accounts: [\n {\n address,\n publicKey: publicKeyBytes,\n chains: ['solana:mainnet', 'solana:devnet', 'solana:testnet'] as const,\n features: [],\n },\n ],\n };\n }\n\n if (this.debug) {\n logger.error('Legacy wallet: No valid publicKey found in any expected location');\n }\n return { accounts: [] };\n },\n };\n }\n\n if (directWallet.disconnect) {\n const disconnectFn = directWallet.disconnect;\n features['standard:disconnect'] = {\n disconnect: () => disconnectFn.call(directWallet),\n };\n }\n\n if (directWallet.signTransaction) {\n const signTransactionFn = directWallet.signTransaction;\n features['solana:signTransaction'] = {\n signTransaction: (tx: unknown) => signTransactionFn.call(directWallet, tx),\n };\n }\n\n if (directWallet.signMessage) {\n const signMessageFn = directWallet.signMessage;\n features['solana:signMessage'] = {\n signMessage: (...args: unknown[]) => {\n const msg = args[0] as Uint8Array;\n return signMessageFn.call(directWallet, msg);\n },\n };\n }\n\n if (directWallet.features) {\n Object.assign(features, directWallet.features);\n }\n\n const walletIcon =\n directWallet.icon ||\n directWallet._metadata?.icon ||\n directWallet.adapter?.icon ||\n directWallet.metadata?.icon ||\n directWallet.iconUrl;\n\n const wallet: Wallet = {\n version: '1.0.0' as const,\n name: storedWalletName,\n icon: walletIcon as Wallet['icon'],\n chains: (directWallet.chains || [\n 'solana:mainnet',\n 'solana:devnet',\n 'solana:testnet',\n ]) as readonly `${string}:${string}`[],\n features,\n accounts: [] as const,\n };\n\n const walletWithIcon = applyWalletIconOverride(wallet);\n\n this.stateManager.updateState(\n {\n wallets: [\n {\n wallet: walletWithIcon,\n installed: true,\n connectable: true,\n },\n ],\n },\n true,\n );\n\n // Await registry initialization for deterministic wallet detection\n // This ensures we check the registry after it's fully populated\n await ready;\n\n // Check if wallet is already in registry - use that instead for better compatibility\n const walletsApi = getWalletsRegistry();\n const standardWallets = walletsApi.get();\n const registryWallet = standardWallets.find(w => w.name === storedWalletName);\n\n const walletToUse = applyWalletIconOverride(registryWallet || walletWithIcon);\n\n if (this.debug) {\n logger.info('Attempting to connect via instant auto-connect', {\n walletName: storedWalletName,\n usingRegistry: !!registryWallet,\n });\n }\n\n await this.connectionManager.connect(walletToUse, storedWalletName);\n\n if (this.debug) {\n logger.info('Instant auto-connect successful', { walletName: storedWalletName });\n }\n\n setTimeout(() => {\n const ws = walletsApi.get();\n\n if (this.debug) {\n logger.debug('Checking for wallet standard update', {\n wsLength: ws.length,\n currentWalletsLength: this.stateManager.getSnapshot().wallets.length,\n shouldUpdate: ws.length > 1,\n });\n }\n\n if (ws.length > 1) {\n this.walletDetector.initialize();\n }\n }, 500);\n\n return true;\n } catch (error) {\n if (this.debug) {\n logger.error('Instant auto-connect failed', {\n walletName: storedWalletName,\n error: error instanceof Error ? error.message : error,\n });\n }\n return false;\n }\n }\n\n private async attemptStandardConnect(): Promise<void> {\n try {\n if (this.stateManager.getSnapshot().connected) {\n if (this.debug) {\n logger.info('Auto-connect: Already connected, skipping fallback auto-connect');\n }\n return;\n }\n\n const storedWalletName = this.walletStorage?.get();\n if (this.debug) {\n logger.debug('Auto-connect: stored wallet', { storedWalletName });\n logger.debug('Auto-connect: available wallets', {\n wallets: this.stateManager.getSnapshot().wallets.map((w: WalletInfo) => w.wallet.name),\n });\n }\n\n if (!storedWalletName) return;\n\n const wallets = this.stateManager.getSnapshot().wallets;\n const walletInfo = wallets.find((w: WalletInfo) => w.wallet.name === storedWalletName);\n\n if (walletInfo) {\n if (this.debug) {\n logger.info('Auto-connect: Found stored wallet, connecting');\n }\n await this.connectionManager.connect(walletInfo.wallet, storedWalletName);\n } else {\n setTimeout(() => {\n const retryWallets = this.stateManager.getSnapshot().wallets;\n const retryWallet = retryWallets.find((w: WalletInfo) => w.wallet.name === storedWalletName);\n if (retryWallet) {\n if (this.debug) {\n logger.info('Auto-connect: Retry successful');\n }\n this.connectionManager.connect(retryWallet.wallet, storedWalletName).catch(err => {\n logger.error('Auto-connect retry connection failed', { error: err });\n });\n }\n }, 1000);\n }\n } catch (e) {\n if (this.debug) {\n logger.error('Auto-connect failed', { error: e });\n }\n this.walletStorage?.set(undefined);\n }\n }\n}\n","import type { SolanaCluster, SolanaClusterId } from '@wallet-ui/core';\nimport type { StorageAdapter } from '../../types/storage';\nimport type { ConnectorConfig } from '../../types/connector';\nimport { BaseCollaborator } from '../core/base-collaborator';\nimport { Errors } from '../errors';\n\n/**\n * ClusterManager - Handles network/cluster management\n *\n * Manages cluster selection, persistence, and state updates.\n */\nexport class ClusterManager extends BaseCollaborator {\n private clusterStorage?: StorageAdapter<SolanaClusterId>;\n\n constructor(\n stateManager: import('../core/state-manager').StateManager,\n eventEmitter: import('../core/event-emitter').EventEmitter,\n clusterStorage?: StorageAdapter<SolanaClusterId>,\n config?: ConnectorConfig['cluster'],\n debug = false,\n ) {\n super({ stateManager, eventEmitter, debug }, 'ClusterManager');\n this.clusterStorage = clusterStorage;\n\n if (config) {\n const clusters = config.clusters ?? [];\n const storedClusterId = this.clusterStorage?.get();\n const initialClusterId = storedClusterId ?? config.initialCluster ?? 'solana:mainnet';\n const initialCluster = clusters.find(c => c.id === initialClusterId) ?? clusters[0] ?? null;\n\n this.stateManager.updateState({\n cluster: initialCluster,\n clusters,\n });\n }\n }\n\n /**\n * Set the active cluster (network)\n */\n async setCluster(clusterId: SolanaClusterId): Promise<void> {\n const state = this.getState();\n const previousClusterId = state.cluster?.id || null;\n const cluster = state.clusters.find((c: SolanaCluster) => c.id === clusterId);\n\n if (!cluster) {\n throw Errors.clusterNotFound(\n clusterId,\n state.clusters.map((c: SolanaCluster) => c.id),\n );\n }\n\n this.stateManager.updateState({ cluster }, true);\n\n // Save cluster to storage (if available)\n if (this.clusterStorage) {\n const isAvailable =\n !('isAvailable' in this.clusterStorage) ||\n typeof this.clusterStorage.isAvailable !== 'function' ||\n this.clusterStorage.isAvailable();\n\n if (isAvailable) {\n this.clusterStorage.set(clusterId);\n } else {\n this.log('Storage not available (private browsing?), skipping cluster persistence');\n }\n }\n\n if (previousClusterId !== clusterId) {\n this.eventEmitter.emit({\n type: 'cluster:changed',\n cluster: clusterId,\n previousCluster: previousClusterId,\n timestamp: new Date().toISOString(),\n });\n }\n\n this.log('🌐 Cluster changed:', { from: previousClusterId, to: clusterId });\n }\n\n /**\n * Get the currently active cluster\n */\n getCluster(): SolanaCluster | null {\n return this.getState().cluster;\n }\n\n /**\n * Get all available clusters\n */\n getClusters(): SolanaCluster[] {\n return this.getState().clusters;\n }\n}\n","import type { TransactionActivity } from '../../types/transactions';\nimport type { SolanaClusterId } from '@wallet-ui/core';\nimport { BaseCollaborator } from '../core/base-collaborator';\n\n/**\n * TransactionTracker - Tracks transaction history and status updates\n *\n * Provides debugging and monitoring for transaction activity.\n */\nexport class TransactionTracker extends BaseCollaborator {\n private transactions: TransactionActivity[] = [];\n private totalTransactions = 0;\n private maxTransactions: number;\n\n constructor(\n stateManager: import('../core/state-manager').StateManager,\n eventEmitter: import('../core/event-emitter').EventEmitter,\n maxTransactions = 20,\n debug = false,\n ) {\n super({ stateManager, eventEmitter, debug }, 'TransactionTracker');\n this.maxTransactions = maxTransactions;\n }\n\n /**\n * Track a transaction for debugging and monitoring\n */\n trackTransaction(activity: Omit<TransactionActivity, 'timestamp' | 'cluster'>): void {\n const state = this.getState();\n const fallbackClusterId: SolanaClusterId = 'solana:devnet';\n const clusterId = state.cluster?.id ?? fallbackClusterId;\n const fullActivity: TransactionActivity = {\n ...activity,\n timestamp: new Date().toISOString(),\n cluster: clusterId,\n };\n\n this.transactions.unshift(fullActivity);\n if (this.transactions.length > this.maxTransactions) {\n this.transactions.pop();\n }\n this.totalTransactions++;\n\n this.eventEmitter.emit({\n type: 'transaction:tracked',\n signature: fullActivity.signature,\n status: fullActivity.status,\n timestamp: fullActivity.timestamp,\n });\n\n this.log('[Connector] Transaction tracked:', fullActivity);\n }\n\n /**\n * Update transaction status (e.g., from pending to confirmed/failed)\n */\n updateStatus(signature: string, status: TransactionActivity['status'], error?: string): void {\n const tx = this.transactions.find(t => String(t.signature) === signature);\n if (tx) {\n tx.status = status;\n if (error) tx.error = error;\n\n this.eventEmitter.emit({\n type: 'transaction:updated',\n signature: tx.signature,\n status,\n timestamp: new Date().toISOString(),\n });\n\n this.log('[Connector] Transaction updated:', { signature, status, error });\n }\n }\n\n /**\n * Get transaction history\n */\n getTransactions(): TransactionActivity[] {\n return [...this.transactions];\n }\n\n /**\n * Get total transaction count\n */\n getTotalCount(): number {\n return this.totalTransactions;\n }\n\n /**\n * Clear transaction history\n */\n clearHistory(): void {\n this.transactions = [];\n }\n}\n","import type { ConnectorHealth } from '../../types/connector';\nimport type { StorageAdapter } from '../../types/storage';\nimport type { SolanaClusterId } from '@wallet-ui/core';\nimport type { StateManager } from '../core/state-manager';\nimport { getWalletsRegistry } from '../wallet/standard-shim';\n\n/**\n * HealthMonitor - Provides connector diagnostics and health checks\n *\n * Useful for debugging, monitoring, and support.\n */\nexport class HealthMonitor {\n private stateManager: StateManager;\n private walletStorage?: StorageAdapter<string | undefined>;\n private clusterStorage?: StorageAdapter<SolanaClusterId>;\n private isInitialized: () => boolean;\n\n constructor(\n stateManager: StateManager,\n walletStorage?: StorageAdapter<string | undefined>,\n clusterStorage?: StorageAdapter<SolanaClusterId>,\n isInitialized?: () => boolean,\n ) {\n this.stateManager = stateManager;\n this.walletStorage = walletStorage;\n this.clusterStorage = clusterStorage;\n this.isInitialized = isInitialized ?? (() => true);\n }\n\n /**\n * Check connector health and availability\n */\n getHealth(): ConnectorHealth {\n const errors: string[] = [];\n\n let walletStandardAvailable = false;\n try {\n const registry = getWalletsRegistry();\n walletStandardAvailable = Boolean(registry && typeof registry.get === 'function');\n\n if (!walletStandardAvailable) {\n errors.push('Wallet Standard registry not properly initialized');\n }\n } catch (error) {\n errors.push(`Wallet Standard error: ${error instanceof Error ? error.message : 'Unknown error'}`);\n walletStandardAvailable = false;\n }\n\n let storageAvailable = false;\n try {\n if (!this.walletStorage || !this.clusterStorage) {\n errors.push('Storage adapters not configured');\n storageAvailable = false;\n } else {\n if ('isAvailable' in this.walletStorage && typeof this.walletStorage.isAvailable === 'function') {\n storageAvailable = this.walletStorage.isAvailable();\n } else if (typeof window !== 'undefined') {\n try {\n const testKey = '__connector_storage_test__';\n window.localStorage.setItem(testKey, 'test');\n window.localStorage.removeItem(testKey);\n storageAvailable = true;\n } catch {\n storageAvailable = false;\n }\n }\n\n if (!storageAvailable) {\n errors.push('localStorage unavailable (private browsing mode or quota exceeded)');\n }\n }\n } catch (error) {\n errors.push(`Storage error: ${error instanceof Error ? error.message : 'Unknown error'}`);\n storageAvailable = false;\n }\n\n const state = this.stateManager.getSnapshot();\n\n if (state.connected && !state.selectedWallet) {\n errors.push('Inconsistent state: marked as connected but no wallet selected');\n }\n\n if (state.connected && !state.selectedAccount) {\n errors.push('Inconsistent state: marked as connected but no account selected');\n }\n\n if (state.connecting && state.connected) {\n errors.push('Inconsistent state: both connecting and connected flags are true');\n }\n\n return {\n initialized: this.isInitialized(),\n walletStandardAvailable,\n storageAvailable,\n walletsDetected: state.wallets.length,\n errors,\n connectionState: {\n connected: state.connected,\n connecting: state.connecting,\n hasSelectedWallet: Boolean(state.selectedWallet),\n hasSelectedAccount: Boolean(state.selectedAccount),\n },\n timestamp: new Date().toISOString(),\n };\n }\n}\n","import type {\n ConnectorState,\n ConnectorConfig,\n ConnectorHealth,\n ConnectorDebugMetrics,\n ConnectorDebugState,\n Listener,\n} from '../../types/connector';\nimport type { TransactionActivity } from '../../types/transactions';\nimport type { ConnectorEvent, ConnectorEventListener } from '../../types/events';\nimport type { SolanaClusterId, SolanaCluster } from '@wallet-ui/core';\nimport type { WalletInfo } from '../../types/wallets';\nimport type { WalletConnectorId, ConnectOptions } from '../../types/session';\nimport { INITIAL_WALLET_STATUS } from '../../types/session';\nimport { StateManager } from './state-manager';\nimport { EventEmitter } from './event-emitter';\nimport { DebugMetrics } from './debug-metrics';\nimport { WalletDetector } from '../wallet/detector';\nimport { ConnectionManager } from '../wallet/connection-manager';\nimport { AutoConnector } from '../wallet/auto-connector';\nimport { ClusterManager } from '../cluster/cluster-manager';\nimport { TransactionTracker } from '../transaction/transaction-tracker';\nimport { HealthMonitor } from '../health/health-monitor';\nimport { getClusterRpcUrl } from '../../utils/cluster';\nimport { AUTO_CONNECT_DELAY_MS, DEFAULT_MAX_TRACKED_TRANSACTIONS } from '../constants';\nimport { createLogger } from '../utils/secure-logger';\nimport { tryCatchSync } from './try-catch';\nimport type { WalletConnectRegistration } from '../wallet/walletconnect';\n\nconst logger = createLogger('ConnectorClient');\n\nexport class ConnectorClient {\n private stateManager: StateManager;\n private eventEmitter: EventEmitter;\n private walletDetector: WalletDetector;\n private connectionManager: ConnectionManager;\n private autoConnector: AutoConnector;\n private clusterManager: ClusterManager;\n private transactionTracker: TransactionTracker;\n private debugMetrics: DebugMetrics;\n private healthMonitor: HealthMonitor;\n private initialized = false;\n private config: ConnectorConfig;\n private walletConnectRegistration: WalletConnectRegistration | null = null;\n\n constructor(config: ConnectorConfig = {}) {\n this.config = config;\n\n const clusterConfig = config.cluster;\n const clusters = clusterConfig?.clusters ?? [];\n\n const initialState: ConnectorState = {\n // vNext wallet status\n wallet: INITIAL_WALLET_STATUS,\n connectors: [],\n\n // Legacy fields (for backwards compatibility)\n wallets: [],\n selectedWallet: null,\n connected: false,\n connecting: false,\n accounts: [],\n selectedAccount: null,\n cluster: null,\n clusters: [],\n };\n\n this.stateManager = new StateManager(initialState);\n this.eventEmitter = new EventEmitter(config.debug);\n this.debugMetrics = new DebugMetrics();\n\n this.walletDetector = new WalletDetector(this.stateManager, this.eventEmitter, config.debug ?? false);\n\n this.connectionManager = new ConnectionManager(\n this.stateManager,\n this.eventEmitter,\n config.storage?.wallet,\n config.debug ?? false,\n );\n\n this.autoConnector = new AutoConnector(\n this.walletDetector,\n this.connectionManager,\n this.stateManager,\n config.storage?.wallet,\n config.debug ?? false,\n );\n\n this.clusterManager = new ClusterManager(\n this.stateManager,\n this.eventEmitter,\n config.storage?.cluster,\n config.cluster,\n config.debug ?? false,\n );\n\n this.transactionTracker = new TransactionTracker(\n this.stateManager,\n this.eventEmitter,\n DEFAULT_MAX_TRACKED_TRANSACTIONS,\n config.debug ?? false,\n );\n\n this.healthMonitor = new HealthMonitor(\n this.stateManager,\n config.storage?.wallet,\n config.storage?.cluster,\n () => this.initialized,\n );\n\n this.initialize();\n }\n\n private initialize(): void {\n if (typeof window === 'undefined') return;\n if (this.initialized) return;\n\n const { error } = tryCatchSync(() => {\n // Set additional wallets before detection if configured\n if (this.config.additionalWallets && this.config.additionalWallets.length > 0) {\n this.walletDetector.setAdditionalWallets(this.config.additionalWallets);\n }\n\n this.walletDetector.initialize();\n\n // Register WalletConnect wallet if enabled\n if (this.config.walletConnect?.enabled) {\n this.initializeWalletConnect().catch(err => {\n if (this.config.debug) {\n logger.error('WalletConnect initialization failed', { error: err });\n }\n });\n }\n\n if (this.config.autoConnect) {\n setTimeout(() => {\n this.autoConnector.attemptAutoConnect().catch(err => {\n if (this.config.debug) {\n logger.error('Auto-connect error', { error: err });\n }\n });\n }, AUTO_CONNECT_DELAY_MS);\n }\n\n this.initialized = true;\n });\n\n if (error && this.config.debug) {\n logger.error('Connector initialization failed', { error });\n }\n }\n\n /**\n * Initialize WalletConnect integration\n * Dynamically imports and registers the WalletConnect wallet\n */\n private async initializeWalletConnect(): Promise<void> {\n if (!this.config.walletConnect?.enabled) return;\n\n try {\n // Dynamically import to avoid bundling WalletConnect if not used\n const { registerWalletConnectWallet } = await import('../wallet/walletconnect');\n this.walletConnectRegistration = await registerWalletConnectWallet(this.config.walletConnect);\n\n if (this.config.debug) {\n logger.info('WalletConnect wallet registered successfully');\n }\n } catch (error) {\n if (this.config.debug) {\n logger.error('Failed to register WalletConnect wallet', { error });\n }\n // Don't throw - WalletConnect is optional functionality\n }\n }\n\n // ========================================================================\n // vNext Wallet Actions (connector-id based)\n // ========================================================================\n\n /**\n * Connect to a wallet using its stable connector ID.\n * This is the recommended way to connect in vNext.\n *\n * @param connectorId - Stable connector identifier\n * @param options - Connection options (silent mode, preferred account, etc.)\n */\n async connectWallet(connectorId: WalletConnectorId, options?: ConnectOptions): Promise<void> {\n const connector = this.walletDetector.getConnectorById(connectorId);\n if (!connector) {\n throw new Error(`Connector ${connectorId} not found`);\n }\n await this.connectionManager.connectWallet(connector, connectorId, options);\n }\n\n /**\n * Disconnect the current wallet session.\n * This is the vNext equivalent of disconnect().\n */\n async disconnectWallet(): Promise<void> {\n await this.connectionManager.disconnect();\n }\n\n /**\n * Get a connector by its ID (for advanced use cases).\n */\n getConnector(connectorId: WalletConnectorId) {\n return this.walletDetector.getConnectorById(connectorId);\n }\n\n // ========================================================================\n // Legacy Actions (kept for backwards compatibility)\n // ========================================================================\n\n /**\n * @deprecated Use `connectWallet(connectorId)` instead.\n */\n async select(walletName: string): Promise<void> {\n const wallet = this.stateManager\n .getSnapshot()\n .wallets.find((w: WalletInfo) => w.wallet.name === walletName)?.wallet;\n if (!wallet) throw new Error(`Wallet ${walletName} not found`);\n await this.connectionManager.connect(wallet, walletName);\n }\n\n /**\n * @deprecated Use `disconnectWallet()` instead.\n */\n async disconnect(): Promise<void> {\n await this.connectionManager.disconnect();\n }\n\n async selectAccount(address: string): Promise<void> {\n await this.connectionManager.selectAccount(address);\n }\n\n async setCluster(clusterId: SolanaClusterId): Promise<void> {\n await this.clusterManager.setCluster(clusterId);\n }\n\n getCluster(): SolanaCluster | null {\n return this.clusterManager.getCluster();\n }\n\n getClusters(): SolanaCluster[] {\n return this.clusterManager.getClusters();\n }\n\n getRpcUrl(): string | null {\n const cluster = this.clusterManager.getCluster();\n if (!cluster) return null;\n\n const { data, error } = tryCatchSync(() => getClusterRpcUrl(cluster));\n if (error) {\n if (this.config.debug) {\n logger.error('Failed to get RPC URL', { error });\n }\n return null;\n }\n return data;\n }\n\n subscribe(listener: Listener): () => void {\n return this.stateManager.subscribe(listener);\n }\n\n getSnapshot(): ConnectorState {\n return this.stateManager.getSnapshot();\n }\n\n resetStorage(): void {\n if (this.config.debug) {\n logger.info('Resetting all storage to initial values');\n }\n\n const storageKeys = ['account', 'wallet', 'cluster'] as const;\n\n for (const key of storageKeys) {\n const storage = this.config.storage?.[key];\n\n if (storage && 'reset' in storage && typeof storage.reset === 'function') {\n const resetFn = storage.reset as () => void;\n const { error } = tryCatchSync(() => resetFn());\n if (error) {\n if (this.config.debug) {\n logger.error('Failed to reset storage', { key, error });\n }\n } else if (this.config.debug) {\n logger.debug('Reset storage', { key });\n }\n }\n }\n\n this.eventEmitter.emit({\n type: 'storage:reset',\n timestamp: new Date().toISOString(),\n });\n }\n\n on(listener: ConnectorEventListener): () => void {\n return this.eventEmitter.on(listener);\n }\n\n off(listener: ConnectorEventListener): void {\n this.eventEmitter.off(listener);\n }\n\n offAll(): void {\n this.eventEmitter.offAll();\n }\n\n emitEvent(event: ConnectorEvent): void {\n this.eventEmitter.emit(event);\n }\n\n trackTransaction(activity: Omit<TransactionActivity, 'timestamp' | 'cluster'>): void {\n this.transactionTracker.trackTransaction(activity);\n }\n\n updateTransactionStatus(signature: string, status: TransactionActivity['status'], error?: string): void {\n this.transactionTracker.updateStatus(signature, status, error);\n }\n\n clearTransactionHistory(): void {\n this.transactionTracker.clearHistory();\n }\n\n getHealth(): ConnectorHealth {\n return this.healthMonitor.getHealth();\n }\n\n getDebugMetrics(): ConnectorDebugMetrics {\n const snapshot = this.stateManager.getSnapshot();\n this.debugMetrics.updateListenerCounts(this.eventEmitter.getListenerCount(), 0);\n return this.debugMetrics.getMetrics();\n }\n\n getDebugState(): ConnectorDebugState {\n return {\n ...this.getDebugMetrics(),\n transactions: this.transactionTracker.getTransactions(),\n totalTransactions: this.transactionTracker.getTotalCount(),\n };\n }\n\n /**\n * Get the current connector configuration\n */\n getConfig(): ConnectorConfig {\n return this.config;\n }\n\n resetDebugMetrics(): void {\n this.debugMetrics.resetMetrics();\n }\n\n destroy(): void {\n // Unregister WalletConnect wallet if it was registered\n if (this.walletConnectRegistration) {\n try {\n this.walletConnectRegistration.unregister();\n this.walletConnectRegistration = null;\n } catch (error) {\n if (this.config.debug) {\n logger.warn('Error unregistering WalletConnect wallet', { error });\n }\n }\n }\n\n this.connectionManager.disconnect().catch(() => {});\n this.walletDetector.destroy();\n this.eventEmitter.offAll();\n this.stateManager.clear();\n }\n}\n","/**\n * @solana/connector - Browser Compatibility Polyfills\n *\n * Ensures connector works across all browser environments including:\n * - Mobile browsers (iOS Safari, Chrome Mobile, etc.)\n * - Older desktop browsers\n * - Environments with restricted crypto APIs\n *\n * Inspired by wallet-adapter-compat's polyfill strategy\n */\n\nimport { install } from '@solana/webcrypto-ed25519-polyfill';\nimport { createLogger } from './secure-logger';\n\nconst logger = createLogger('Polyfills');\n\n/**\n * Tracks whether polyfills have been installed\n * Prevents duplicate installations\n */\nlet installed = false;\n\n/**\n * Install browser compatibility polyfills\n *\n * This function:\n * - Installs WebCrypto Ed25519 polyfill for signature operations\n * - Is safe to call multiple times (idempotent)\n * - Only runs in browser environments\n * - Fails gracefully if installation errors occur\n *\n * @example\n * ```ts\n * // Automatically called when connector-provider is imported\n * import { ConnectorProvider } from '@solana/connector'\n *\n * // Can also be called manually if needed\n * import { installPolyfills } from '@solana/connector/headless'\n * installPolyfills()\n * ```\n */\nexport function installPolyfills(): void {\n // Skip if already installed or not in browser\n if (installed || typeof window === 'undefined') {\n return;\n }\n\n try {\n // Install WebCrypto Ed25519 polyfill\n // This enables signature verification in browsers that don't natively support Ed25519\n install();\n installed = true;\n\n // Only log if debug mode is explicitly enabled via __CONNECTOR_DEBUG__\n logger.info('Browser compatibility polyfills installed');\n } catch (error) {\n // Polyfill installation failed, but don't crash\n // Most modern browsers won't need the polyfill anyway\n if (logger) {\n logger.warn('Failed to install polyfills', { error });\n }\n\n // Mark as installed anyway to prevent retry loops\n installed = true;\n }\n}\n\n/**\n * Check if polyfills have been installed\n * Useful for debugging and health checks\n *\n * @returns True if polyfills are installed, false otherwise\n *\n * @example\n * ```ts\n * import { isPolyfillInstalled } from '@solana/connector/headless'\n *\n * if (!isPolyfillInstalled()) {\n * console.warn('Polyfills not installed - may have issues on older browsers')\n * }\n * ```\n */\nexport function isPolyfillInstalled(): boolean {\n return installed;\n}\n\n/**\n * Check if WebCrypto API is available\n * Useful for detecting environments with restricted crypto capabilities\n *\n * @returns True if crypto.subtle is available, false otherwise\n *\n * @example\n * ```ts\n * import { isCryptoAvailable } from '@solana/connector/headless'\n *\n * if (!isCryptoAvailable()) {\n * // Show warning to user about unsupported browser\n * }\n * ```\n */\nexport function isCryptoAvailable(): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n return Boolean(window.crypto && window.crypto.subtle && typeof window.crypto.subtle.sign === 'function');\n } catch {\n return false;\n }\n}\n\n/**\n * Get polyfill status information\n * Returns detailed information about polyfill and crypto availability\n *\n * @returns Object with polyfill status details\n *\n * @example\n * ```ts\n * import { getPolyfillStatus } from '@solana/connector/headless'\n *\n * const status = getPolyfillStatus()\n * console.log('Polyfills:', status.installed ? 'installed' : 'not installed')\n * console.log('WebCrypto:', status.cryptoAvailable ? 'available' : 'unavailable')\n * ```\n */\nexport function getPolyfillStatus(): {\n installed: boolean;\n cryptoAvailable: boolean;\n environment: 'browser' | 'server';\n} {\n return {\n installed,\n cryptoAvailable: isCryptoAvailable(),\n environment: typeof window !== 'undefined' ? 'browser' : 'server',\n };\n}\n\n/**\n * Reset polyfill installation state\n * ⚠️ FOR TESTING ONLY - Do not use in production code\n * @internal\n */\nexport function __resetPolyfillsForTesting(): void {\n installed = false;\n}\n","/**\n * Enhanced Storage\n */\n\nimport { Storage as WalletUiStorage } from '@wallet-ui/core';\nimport type { SolanaClusterId } from '@wallet-ui/core';\nimport type {\n StorageOptions,\n StorageAdapter,\n EnhancedStorageAccountOptions,\n EnhancedStorageClusterOptions,\n EnhancedStorageWalletOptions,\n EnhancedStorageWalletStateOptions,\n PersistedWalletState,\n} from '../../types/storage';\nimport { createConnectorId } from '../../types/session';\nimport { createLogger } from '../utils/secure-logger';\n\nconst logger = createLogger('EnhancedStorage');\n\n/**\n * Storage version for migration support\n * Increment when making breaking changes to storage format\n */\nexport const STORAGE_VERSION = 'v1';\n\n/**\n * Enhanced version of wallet-ui's Storage class\n * Extends the base Storage with validation, error handling, and SSR support\n */\nexport class EnhancedStorage<T> extends WalletUiStorage<T> {\n private errorHandlers: Set<(error: Error) => void> = new Set();\n private validators: ((value: T) => boolean)[] = [];\n private memoryFallback: T;\n\n constructor(\n key: string,\n initial: T,\n private options?: StorageOptions<T>,\n ) {\n super(key, initial);\n this.memoryFallback = initial;\n\n if (options?.onError) {\n this.errorHandlers.add(options.onError);\n }\n if (options?.validator) {\n this.validators.push(options.validator);\n }\n }\n\n override set(value: T): boolean {\n try {\n if (!this.validate(value)) {\n logger.warn('Validation failed', { key: this.key });\n return false;\n }\n\n super.set(value);\n\n this.memoryFallback = value;\n return true;\n } catch (error) {\n this.handleError(error as Error);\n\n if (this.options?.useMemoryFallback) {\n this.memoryFallback = value;\n return true;\n }\n\n return false;\n }\n }\n\n override get(): T {\n try {\n return super.get();\n } catch (error) {\n this.handleError(error as Error);\n\n if (this.options?.useMemoryFallback) {\n return this.memoryFallback;\n }\n\n return this.initial;\n }\n }\n\n validate(value: T): boolean {\n return this.validators.every(validator => validator(value));\n }\n\n addValidator(validator: (value: T) => boolean): this {\n this.validators.push(validator);\n return this;\n }\n\n onError(handler: (error: Error) => void): this {\n this.errorHandlers.add(handler);\n return this;\n }\n\n transform<U>(transformer: (value: T) => U): U {\n return transformer(this.get());\n }\n\n reset(): void {\n this.set(this.initial);\n }\n\n clear(): void {\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.removeItem(this.key);\n }\n this.reset();\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n isAvailable(): boolean {\n try {\n if (typeof window === 'undefined') return false;\n const testKey = `__storage_test_${this.key}__`;\n window.localStorage.setItem(testKey, 'test');\n window.localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n }\n\n static migrate<T>(oldKey: string, newStorage: EnhancedStorage<T>): boolean {\n try {\n if (typeof window === 'undefined') return false;\n\n const oldValue = window.localStorage.getItem(oldKey);\n if (oldValue) {\n const parsed = JSON.parse(oldValue) as T;\n newStorage.set(parsed);\n window.localStorage.removeItem(oldKey);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n\n private handleError(error: Error): void {\n logger.error('Storage error', { key: this.key, error });\n this.errorHandlers.forEach(handler => {\n try {\n handler(error);\n } catch (err) {\n logger.error('Error in error handler', { error: err });\n }\n });\n }\n}\n\nexport function createEnhancedStorageAccount(\n options?: EnhancedStorageAccountOptions,\n): EnhancedStorage<string | undefined> {\n const key = options?.key ?? `connector-kit:${STORAGE_VERSION}:account`;\n return new EnhancedStorage(key, options?.initial, {\n validator: options?.validator,\n onError: options?.onError,\n useMemoryFallback: true, // Always fallback for SSR\n });\n}\n\nexport function createEnhancedStorageCluster(\n options?: EnhancedStorageClusterOptions,\n): EnhancedStorage<SolanaClusterId> {\n const key = options?.key ?? `connector-kit:${STORAGE_VERSION}:cluster`;\n const storage = new EnhancedStorage(key, options?.initial ?? 'solana:mainnet', {\n onError: options?.onError,\n useMemoryFallback: true,\n });\n\n if (options?.validClusters) {\n storage.addValidator(clusterId => options.validClusters!.includes(clusterId));\n }\n\n return storage;\n}\n\nexport function createEnhancedStorageWallet(\n options?: EnhancedStorageWalletOptions,\n): EnhancedStorage<string | undefined> {\n const key = options?.key ?? `connector-kit:${STORAGE_VERSION}:wallet`;\n return new EnhancedStorage(key, options?.initial, {\n onError: options?.onError,\n useMemoryFallback: true,\n });\n}\n\n// ============================================================================\n// vNext Wallet State Storage\n// ============================================================================\n\n/**\n * Current version of the persisted wallet state format.\n * Increment when making breaking changes to the state structure.\n */\nexport const WALLET_STATE_VERSION = 1;\n\n/**\n * Create storage for vNext wallet state (connector ID + account + autoconnect).\n * Handles migration from legacy wallet name storage automatically.\n */\nexport function createEnhancedStorageWalletState(\n options?: EnhancedStorageWalletStateOptions,\n): EnhancedStorage<PersistedWalletState | null> {\n const key = options?.key ?? `connector-kit:${STORAGE_VERSION}:wallet-state`;\n const legacyKey = `connector-kit:${STORAGE_VERSION}:wallet`;\n\n const storage = new EnhancedStorage<PersistedWalletState | null>(key, options?.initial ?? null, {\n onError: options?.onError,\n useMemoryFallback: true,\n });\n\n // Attempt migration from legacy storage on first access\n if (typeof window !== 'undefined' && storage.isAvailable()) {\n try {\n const existingState = storage.get();\n if (!existingState) {\n // Check for legacy wallet name storage\n const legacyValue = window.localStorage.getItem(legacyKey);\n if (legacyValue) {\n const legacyWalletName = JSON.parse(legacyValue) as string;\n if (legacyWalletName && typeof legacyWalletName === 'string') {\n // Use custom migration handler if provided, otherwise create connector ID from name\n const connectorId = options?.migrateLegacy\n ? options.migrateLegacy(legacyWalletName)\n : createConnectorId(legacyWalletName);\n\n if (connectorId) {\n const migratedState: PersistedWalletState = {\n version: WALLET_STATE_VERSION,\n connectorId,\n autoConnect: true,\n lastConnected: new Date().toISOString(),\n };\n storage.set(migratedState);\n logger.info('Migrated legacy wallet storage', {\n from: legacyWalletName,\n to: connectorId,\n });\n\n // Optionally remove legacy key\n window.localStorage.removeItem(legacyKey);\n }\n }\n }\n }\n } catch (error) {\n logger.warn('Failed to migrate legacy wallet storage', { error });\n }\n }\n\n return storage;\n}\n\n/**\n * Helper to save wallet state after successful connection\n */\nexport function saveWalletState(\n storage: StorageAdapter<PersistedWalletState | null>,\n connectorId: string,\n account?: string,\n autoConnect = true,\n): void {\n const state: PersistedWalletState = {\n version: WALLET_STATE_VERSION,\n connectorId,\n lastAccount: account,\n autoConnect,\n lastConnected: new Date().toISOString(),\n };\n storage.set(state);\n}\n\n/**\n * Helper to clear wallet state (on disconnect)\n */\nexport function clearWalletState(storage: StorageAdapter<PersistedWalletState | null>): void {\n storage.set(null);\n}\n\nexport class EnhancedStorageAdapter<T> implements StorageAdapter<T> {\n constructor(private storage: EnhancedStorage<T>) {}\n\n get(): T {\n return this.storage.get();\n }\n\n set(value: T): void {\n this.storage.set(value);\n }\n\n subscribe(callback: (value: T) => void): () => void {\n return this.storage.value.subscribe(callback);\n }\n\n validate(value: T): boolean {\n return this.storage.validate(value);\n }\n\n reset(): void {\n this.storage.reset();\n }\n\n clear(): void {\n this.storage.clear();\n }\n\n isAvailable(): boolean {\n return this.storage.isAvailable();\n }\n\n transform<U>(transformer: (value: T) => U): U {\n return this.storage.transform(transformer);\n }\n\n addValidator(validator: (value: T) => boolean): this {\n this.storage.addValidator(validator);\n return this;\n }\n\n onError(handler: (error: Error) => void): this {\n this.storage.onError(handler);\n return this;\n }\n}\n","import type { ConnectorConfig, CoinGeckoConfig } from '../types/connector';\nimport type { WalletConnectConfig } from '../types/walletconnect';\nimport type { SolanaCluster, SolanaClusterId } from '@wallet-ui/core';\nimport type { Wallet } from '../types/wallets';\nimport { createSolanaMainnet, createSolanaDevnet, createSolanaTestnet, createSolanaLocalnet } from '@wallet-ui/core';\nimport {\n createEnhancedStorageAccount,\n createEnhancedStorageCluster,\n createEnhancedStorageWallet,\n EnhancedStorageAdapter,\n EnhancedStorage,\n} from '../lib/wallet/enhanced-storage';\nimport { toClusterId } from '../utils/network';\nimport type React from 'react';\nimport { isAddress } from '@solana/addresses';\nimport { DEFAULT_MAX_RETRIES } from '../lib/constants';\nimport { createLogger } from '../lib/utils/secure-logger';\n\nconst logger = createLogger('DefaultConfig');\n\nexport interface DefaultConfigOptions {\n /** Application name shown in wallet connection prompts */\n appName: string;\n /** Application URL for wallet connection metadata */\n appUrl?: string;\n /** Enable automatic wallet reconnection on page load */\n autoConnect?: boolean;\n /** Enable debug logging */\n debug?: boolean;\n /** Solana network to connect to (accepts both 'mainnet' and 'mainnet-beta' conventions) */\n network?: 'mainnet' | 'mainnet-beta' | 'devnet' | 'testnet' | 'localnet';\n /** Enable Mobile Wallet Adapter support */\n enableMobile?: boolean;\n /** Custom storage implementation */\n storage?: ConnectorConfig['storage'];\n /** Custom cluster configuration - overrides network if provided */\n clusters?: SolanaCluster[];\n /** Additional custom clusters to add to the default list */\n customClusters?: SolanaCluster[];\n /** Persist cluster selection across sessions */\n persistClusterSelection?: boolean;\n /** Custom storage key for cluster persistence */\n clusterStorageKey?: string;\n /** Enable error boundaries for automatic error handling (default: true) */\n enableErrorBoundary?: boolean;\n /** Maximum retry attempts for error recovery (default: 3) */\n maxRetries?: number;\n /** Custom error handler */\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n /**\n * Image proxy URL prefix for token images.\n * When set, token image URLs will be transformed to: `${imageProxy}${encodeURIComponent(originalUrl)}`\n * This prevents direct image fetching which can leak user IPs to untrusted hosts.\n * @example '/_next/image?w=64&q=75&url=' // Next.js Image Optimization\n * @example '/cdn-cgi/image/width=64,quality=75/' // Cloudflare Image Resizing\n */\n imageProxy?: string;\n /**\n * Optional mapping from program IDs to human-readable program names.\n * Used to enrich transaction history (e.g. showing `Jupiter` instead of a raw program address).\n */\n programLabels?: Record<string, string>;\n /**\n * CoinGecko API configuration for token price fetching.\n * Configure API key for higher rate limits and retry behavior for 429 responses.\n * @see https://docs.coingecko.com/reference/introduction for rate limit details\n */\n coingecko?: CoinGeckoConfig;\n /**\n * WalletConnect configuration for connecting via QR code / deep link.\n * When enabled, a \"WalletConnect\" wallet appears in the wallet list.\n *\n * Can be:\n * - `true` to enable with auto-detected project ID from NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID env var\n * - An object with optional overrides (projectId, metadata, etc.)\n * - `undefined` or `false` to disable\n *\n * When using `true` or minimal config, the following are auto-configured:\n * - `projectId`: Read from NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID\n * - `metadata.name`: Uses appName\n * - `metadata.url`: Uses appUrl or window.location.origin\n * - `metadata.description`: Auto-generated from appName\n * - `metadata.icons`: Uses appUrl/icon.svg\n * - `getCurrentChain`: Auto-reads from cluster storage\n * - `onDisplayUri/onSessionEstablished/onSessionDisconnected`: Auto-wired by AppProvider\n *\n * @example\n * ```ts\n * // Simplest - just enable it (reads project ID from env)\n * getDefaultConfig({ appName: 'My App', walletConnect: true })\n *\n * // With explicit project ID\n * getDefaultConfig({\n * appName: 'My App',\n * walletConnect: { projectId: 'my-project-id' }\n * })\n * ```\n *\n * @see https://docs.walletconnect.network/wallet-sdk/chain-support/solana\n */\n walletConnect?: boolean | SimplifiedWalletConnectConfig;\n\n /**\n * Additional wallets to include alongside Wallet Standard wallets.\n * Use this to add remote/server-backed signers created via `createRemoteSignerWallet()`.\n */\n additionalWallets?: Wallet[];\n}\n\n/**\n * Simplified WalletConnect configuration\n * Most fields are auto-generated from appName/appUrl if not provided\n */\nexport interface SimplifiedWalletConnectConfig {\n /**\n * WalletConnect Cloud project ID.\n * If not provided, reads from NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID env var.\n */\n projectId?: string;\n /**\n * Optional metadata overrides. Merged with auto-generated metadata.\n */\n metadata?: Partial<WalletConnectConfig['metadata']>;\n /**\n * Default chain. Defaults to 'solana:mainnet'.\n */\n defaultChain?: WalletConnectConfig['defaultChain'];\n /**\n * Optional relay URL override.\n */\n relayUrl?: string;\n}\n\n/** Extended ConnectorConfig with app metadata */\nexport interface ExtendedConnectorConfig extends ConnectorConfig {\n /** Application name for display and metadata */\n appName?: string;\n /** Application URL for metadata */\n appUrl?: string;\n /** Whether mobile wallet adapter is enabled */\n enableMobile?: boolean;\n /** Selected network for convenience (accepts both 'mainnet' and 'mainnet-beta' conventions) */\n network?: 'mainnet' | 'mainnet-beta' | 'devnet' | 'testnet' | 'localnet';\n /** Error boundary configuration */\n errorBoundary?: {\n /** Enable error boundaries (default: true) */\n enabled?: boolean;\n /** Maximum retry attempts (default: 3) */\n maxRetries?: number;\n /** Custom error handler */\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n /** Custom fallback component */\n fallback?: (error: Error, retry: () => void) => React.ReactNode;\n };\n /**\n * Image proxy URL prefix for token images.\n * When set, token image URLs will be transformed to: `${imageProxy}${encodeURIComponent(originalUrl)}`\n * This prevents direct image fetching which can leak user IPs to untrusted hosts.\n */\n imageProxy?: string;\n /**\n * Optional mapping from program IDs to human-readable program names.\n * Used to enrich transaction history (e.g. showing `Jupiter` instead of a raw program address).\n */\n programLabels?: Record<string, string>;\n /**\n * CoinGecko API configuration for token price fetching.\n */\n coingecko?: CoinGeckoConfig;\n}\n\n/**\n * Creates a default connector configuration with sensible defaults for Solana applications\n */\nexport function getDefaultConfig(options: DefaultConfigOptions): ExtendedConnectorConfig {\n const {\n appName,\n appUrl,\n autoConnect = true,\n debug,\n network = 'mainnet-beta',\n enableMobile = true,\n storage,\n clusters,\n customClusters = [],\n persistClusterSelection = true,\n clusterStorageKey,\n enableErrorBoundary = true,\n maxRetries = DEFAULT_MAX_RETRIES,\n onError,\n imageProxy,\n programLabels,\n coingecko,\n walletConnect,\n additionalWallets,\n } = options;\n\n const defaultClusters: SolanaCluster[] = clusters ?? [\n createSolanaMainnet(),\n createSolanaDevnet(),\n createSolanaTestnet(),\n ...(network === 'localnet' ? [createSolanaLocalnet()] : []),\n ...(customClusters || []),\n ];\n\n const validClusterIds = defaultClusters.map(c => c.id);\n\n const accountStorage = createEnhancedStorageAccount({\n validator: address => {\n if (!address) return true;\n return isAddress(address);\n },\n onError: error => {\n if (debug) {\n logger.error('Account Storage error', { error });\n }\n if (onError) {\n onError(error, {\n componentStack: 'account-storage',\n });\n }\n },\n });\n\n const clusterStorage = createEnhancedStorageCluster({\n key: clusterStorageKey,\n initial: getInitialCluster(network),\n validClusters: persistClusterSelection ? validClusterIds : undefined,\n onError: error => {\n if (debug) {\n logger.error('Cluster Storage error', { error });\n }\n if (onError) {\n onError(error, {\n componentStack: 'cluster-storage',\n });\n }\n },\n });\n\n const walletStorage = createEnhancedStorageWallet({\n onError: error => {\n if (debug) {\n logger.error('Wallet Storage error', { error });\n }\n if (onError) {\n onError(error, {\n componentStack: 'wallet-storage',\n });\n }\n },\n });\n\n // Migrate old storage keys to new versioned format (v1)\n // This allows seamless upgrades from old versions without losing user data\n if (typeof window !== 'undefined') {\n // Old keys (pre-v1): 'connector-kit:account', 'connector-kit:wallet', 'connector-kit:cluster'\n // New keys (v1): 'connector-kit:v1:account', 'connector-kit:v1:wallet', 'connector-kit:v1:cluster'\n const oldAccountKey = 'connector-kit:account';\n const oldWalletKey = 'connector-kit:wallet';\n const oldClusterKey = clusterStorageKey || 'connector-kit:cluster';\n\n EnhancedStorage.migrate(oldAccountKey, accountStorage);\n EnhancedStorage.migrate(oldWalletKey, walletStorage);\n EnhancedStorage.migrate(oldClusterKey, clusterStorage);\n }\n\n const defaultStorage: ConnectorConfig['storage'] = storage ?? {\n account: new EnhancedStorageAdapter(accountStorage),\n cluster: new EnhancedStorageAdapter(clusterStorage),\n wallet: new EnhancedStorageAdapter(walletStorage),\n };\n\n // Compute the actual cluster storage key (same logic as createEnhancedStorageCluster)\n const actualClusterStorageKey = clusterStorageKey ?? 'connector-kit:v1:cluster';\n\n // Build WalletConnect config from simplified options\n const walletConnectConfig = buildWalletConnectConfig(walletConnect, appName, appUrl, actualClusterStorageKey);\n\n const config: ExtendedConnectorConfig = {\n autoConnect,\n debug: debug ?? process.env.NODE_ENV === 'development',\n storage: defaultStorage,\n appName,\n appUrl,\n enableMobile,\n network,\n cluster: {\n clusters: defaultClusters,\n persistSelection: persistClusterSelection,\n initialCluster: getInitialCluster(network),\n },\n errorBoundary: {\n enabled: enableErrorBoundary,\n maxRetries,\n onError,\n },\n imageProxy,\n programLabels,\n coingecko,\n walletConnect: walletConnectConfig,\n additionalWallets,\n };\n\n return config;\n}\n\n/**\n * Build full WalletConnect config from simplified options\n */\nfunction buildWalletConnectConfig(\n walletConnect: boolean | SimplifiedWalletConnectConfig | undefined,\n appName: string,\n appUrl?: string,\n clusterStorageKey?: string,\n): WalletConnectConfig | undefined {\n // Disabled\n if (!walletConnect) return undefined;\n\n // Get project ID from config or environment\n const configProjectId = typeof walletConnect === 'object' ? walletConnect.projectId : undefined;\n const envProjectId = typeof process !== 'undefined' ? process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID : undefined;\n const projectId = configProjectId || envProjectId;\n\n // If no project ID available, WalletConnect is disabled\n if (!projectId) {\n if (typeof walletConnect === 'object' || walletConnect === true) {\n logger.warn(\n 'WalletConnect enabled but no project ID found. Set NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID or provide projectId in config.',\n );\n }\n return undefined;\n }\n\n // Determine origin for metadata\n const origin = appUrl || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000');\n\n // Get custom metadata if provided\n const customMetadata = typeof walletConnect === 'object' ? walletConnect.metadata : undefined;\n const customDefaultChain = typeof walletConnect === 'object' ? walletConnect.defaultChain : undefined;\n const customRelayUrl = typeof walletConnect === 'object' ? walletConnect.relayUrl : undefined;\n\n return {\n enabled: true,\n projectId,\n metadata: {\n name: customMetadata?.name ?? appName,\n description: customMetadata?.description ?? `${appName} - Powered by ConnectorKit`,\n url: customMetadata?.url ?? origin,\n icons: customMetadata?.icons ?? [`${origin}/icon.svg`],\n },\n defaultChain: customDefaultChain ?? 'solana:mainnet',\n relayUrl: customRelayUrl,\n // Auto-sync with cluster storage\n getCurrentChain: () => {\n if (typeof window === 'undefined') return 'solana:mainnet';\n const storageKey = clusterStorageKey || 'connector-kit:v1:cluster';\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n const id = JSON.parse(stored) as string;\n if (id === 'solana:mainnet' || id === 'solana:devnet' || id === 'solana:testnet') {\n return id;\n }\n }\n } catch {\n // Ignore parse errors\n }\n return customDefaultChain ?? 'solana:mainnet';\n },\n // Note: onDisplayUri, onSessionEstablished, onSessionDisconnected are auto-wired by AppProvider\n };\n}\n\n/**\n * Helper to convert network string to cluster ID\n * Uses network utility for consistent translation\n */\nfunction getInitialCluster(\n network: 'mainnet' | 'mainnet-beta' | 'devnet' | 'testnet' | 'localnet' = 'mainnet-beta',\n): SolanaClusterId {\n return toClusterId(network);\n}\n\n/**\n * Default Mobile Wallet Adapter configuration for Solana applications\n */\nexport function getDefaultMobileConfig(options: {\n appName: string;\n appUrl?: string;\n network?: 'mainnet' | 'mainnet-beta' | 'devnet' | 'testnet';\n}) {\n const baseUrl =\n options.appUrl || (typeof window !== 'undefined' ? window.location.origin : 'https://localhost:3000');\n\n return {\n appIdentity: {\n name: options.appName,\n uri: baseUrl,\n icon: `${baseUrl}/favicon.ico`,\n },\n cluster: options.network || 'mainnet-beta',\n };\n}\n","/**\n * @solana/connector - Configuration Schemas\n *\n * Zod schemas for runtime validation of configuration options.\n * These schemas provide type-safe validation with helpful error messages.\n */\n\nimport { z } from 'zod/v4';\n\n// ============================================================================\n// Primitive Schemas\n// ============================================================================\n\n/**\n * Valid Solana network values\n */\nexport const solanaNetworkSchema = z.enum(['mainnet', 'mainnet-beta', 'devnet', 'testnet', 'localnet']);\n\n/**\n * Solana cluster ID format (e.g., 'solana:mainnet', 'solana:devnet')\n */\nexport const solanaClusterIdSchema = z.string().regex(/^solana:(mainnet|devnet|testnet|localnet|[a-zA-Z0-9-]+)$/, {\n message: 'Cluster ID must be in format \"solana:<network>\" (e.g., \"solana:mainnet\")',\n});\n\n/**\n * URL validation with protocol check\n */\nexport const urlSchema = z.string().url('Invalid URL format');\n\n/**\n * Optional URL that allows undefined\n */\nexport const optionalUrlSchema = urlSchema.optional();\n\n// ============================================================================\n// CoinGecko Configuration\n// ============================================================================\n\nexport const coinGeckoConfigSchema = z\n .strictObject({\n apiKey: z.string().optional(),\n isPro: z.boolean().optional(),\n maxRetries: z.number().int().positive().max(10).optional(),\n baseDelay: z.number().int().positive().max(30000).optional(),\n maxTimeout: z.number().int().positive().max(120000).optional(),\n })\n .optional();\n\n// ============================================================================\n// WalletConnect Configuration\n// ============================================================================\n\n/**\n * WalletConnect metadata schema\n */\nexport const walletConnectMetadataSchema = z.object({\n name: z.string().min(1, 'WalletConnect app name is required'),\n description: z.string(),\n url: urlSchema,\n icons: z.array(z.string()),\n});\n\n/**\n * WalletConnect detailed object configuration schema\n */\nexport const walletConnectObjectConfigSchema = z.object({\n enabled: z.boolean().optional(),\n projectId: z.string().min(1, 'WalletConnect projectId is required'),\n metadata: walletConnectMetadataSchema,\n defaultChain: z.enum(['solana:mainnet', 'solana:devnet', 'solana:testnet']).optional(),\n onDisplayUri: z.custom<(uri: string) => void>(val => typeof val === 'function').optional(),\n onSessionEstablished: z.custom<() => void>(val => typeof val === 'function').optional(),\n onSessionDisconnected: z.custom<() => void>(val => typeof val === 'function').optional(),\n relayUrl: urlSchema.optional(),\n});\n\n/**\n * WalletConnect configuration schema\n * Accepts either:\n * - `true` (boolean shorthand to enable with defaults)\n * - Detailed object configuration with projectId and metadata\n */\nexport const walletConnectConfigSchema = z.union([z.literal(true), walletConnectObjectConfigSchema]).optional();\n\n// ============================================================================\n// Storage Configuration\n// ============================================================================\n\n/**\n * Storage adapter interface schema (validates shape, not implementation)\n */\nexport const storageAdapterSchema = z.looseObject({\n get: z.custom<(...args: unknown[]) => unknown>((val: unknown) => typeof val === 'function'),\n set: z.custom<(...args: unknown[]) => unknown>((val: unknown) => typeof val === 'function'),\n});\n\nexport const storageConfigSchema = z\n .object({\n account: storageAdapterSchema,\n cluster: storageAdapterSchema,\n wallet: storageAdapterSchema,\n })\n .optional();\n\n// ============================================================================\n// Cluster Configuration\n// ============================================================================\n\n/**\n * SolanaCluster object schema\n */\nexport const solanaClusterSchema = z.object({\n id: solanaClusterIdSchema,\n label: z.string().min(1, 'Cluster label cannot be empty'),\n url: urlSchema,\n urlWs: urlSchema.optional(),\n});\n\nexport const clusterConfigSchema = z\n .object({\n clusters: z.array(solanaClusterSchema).optional(),\n persistSelection: z.boolean().optional(),\n initialCluster: solanaClusterIdSchema.optional(),\n })\n .optional();\n\n// ============================================================================\n// Default Config Options\n// ============================================================================\n\n/**\n * Wallet Standard wallet schema (shallow validation - just check it's an object with required fields)\n */\nexport const walletSchema = z.custom<import('@wallet-standard/base').Wallet>(\n (val: unknown) =>\n typeof val === 'object' &&\n val !== null &&\n 'name' in val &&\n 'version' in val &&\n 'features' in val &&\n 'chains' in val,\n { message: 'Invalid Wallet Standard wallet object' },\n);\n\nexport const defaultConfigOptionsSchema = z.object({\n // Required\n appName: z.string().min(1, 'Application name is required'),\n\n // Optional strings\n appUrl: optionalUrlSchema,\n imageProxy: z.string().optional(),\n clusterStorageKey: z.string().optional(),\n\n // Optional booleans\n autoConnect: z.boolean().optional(),\n debug: z.boolean().optional(),\n enableMobile: z.boolean().optional(),\n persistClusterSelection: z.boolean().optional(),\n enableErrorBoundary: z.boolean().optional(),\n\n // Network\n network: solanaNetworkSchema.optional(),\n\n // Numbers\n maxRetries: z.number().int().positive().max(10).optional(),\n\n // Complex types\n storage: storageConfigSchema,\n clusters: z.array(solanaClusterSchema).optional(),\n customClusters: z.array(solanaClusterSchema).optional(),\n programLabels: z.record(z.string(), z.string()).optional(),\n coingecko: coinGeckoConfigSchema,\n walletConnect: walletConnectConfigSchema,\n\n // Additional wallets (remote signers, etc.)\n additionalWallets: z.array(walletSchema).optional(),\n\n // Functions (can't validate implementation, just existence)\n onError: z.custom<(...args: unknown[]) => unknown>((val: unknown) => typeof val === 'function').optional(),\n});\n\n// ============================================================================\n// Connector Config (for ConnectorClient)\n// ============================================================================\n\nexport const connectorConfigSchema = z\n .strictObject({\n autoConnect: z.boolean().optional(),\n debug: z.boolean().optional(),\n storage: storageConfigSchema,\n cluster: clusterConfigSchema,\n imageProxy: z.string().optional(),\n programLabels: z.record(z.string(), z.string()).optional(),\n coingecko: coinGeckoConfigSchema,\n walletConnect: walletConnectConfigSchema,\n additionalWallets: z.array(walletSchema).optional(),\n })\n .optional();\n\n// ============================================================================\n// Type Exports (inferred from schemas)\n// ============================================================================\n\nexport type SolanaNetworkInput = z.input<typeof solanaNetworkSchema>;\nexport type SolanaClusterIdInput = z.input<typeof solanaClusterIdSchema>;\nexport type CoinGeckoConfigInput = z.input<typeof coinGeckoConfigSchema>;\nexport type WalletConnectConfigInput = z.input<typeof walletConnectConfigSchema>;\nexport type DefaultConfigOptionsInput = z.input<typeof defaultConfigOptionsSchema>;\n\n// ============================================================================\n// Validation Helpers\n// ============================================================================\n\n/**\n * Validate configuration options and return a result with helpful errors\n *\n * @example\n * ```ts\n * const result = validateConfigOptions({\n * appName: 'My App',\n * network: 'mainnet',\n * });\n *\n * if (!result.success) {\n * console.error('Config validation failed:', result.error.format());\n * }\n * ```\n */\nexport function validateConfigOptions(options: unknown): z.ZodSafeParseResult<DefaultConfigOptionsInput> {\n return defaultConfigOptionsSchema.safeParse(options);\n}\n\n/**\n * Parse and validate config options, throwing on error with formatted message\n *\n * @throws {z.ZodError} If validation fails\n *\n * @example\n * ```ts\n * try {\n * const validOptions = parseConfigOptions(userInput);\n * // validOptions is typed and validated\n * } catch (error) {\n * if (error instanceof z.ZodError) {\n * console.error(error.format());\n * }\n * }\n * ```\n */\nexport function parseConfigOptions(options: unknown): DefaultConfigOptionsInput {\n return defaultConfigOptionsSchema.parse(options);\n}\n","/**\n * @solana/connector - Formatting utilities\n *\n * Unified utility functions for formatting addresses, amounts, and other display values\n * Consolidates both fast (number-based) and precise (bigint-based) formatting options\n */\n\nimport { lamportsToSol, LAMPORTS_PER_SOL } from '../lib/kit';\n\n/**\n * Format a Solana address for display\n *\n * @example\n * formatAddress('7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU')\n * // Returns: '7xKX...gAsU'\n *\n * @example\n * formatAddress('7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU', { length: 6 })\n * // Returns: '7xKXtg...osgAsU'\n */\nexport function formatAddress(\n address: string,\n options: {\n length?: number;\n separator?: string;\n } = {},\n): string {\n const { length = 4, separator = '...' } = options;\n\n if (!address || address.length <= length * 2 + separator.length) {\n return address;\n }\n\n return `${address.slice(0, length)}${separator}${address.slice(-length)}`;\n}\n\n/**\n * Format SOL amount for display\n * Supports both precise bigint and fast number arithmetic\n *\n * @param lamports - Amount in lamports (number or bigint)\n * @param options - Formatting options\n * @param options.decimals - Number of decimal places (default: 4)\n * @param options.suffix - Add 'SOL' suffix (default: true)\n * @param options.fast - Use fast number arithmetic for amounts < 9000 SOL (default: false)\n *\n * @example\n * formatSOL(1000000000n) // Returns: '1.0000 SOL' (precise)\n * formatSOL(1000000000, { fast: true }) // Returns: '1.0000 SOL' (fast)\n * formatSOL(1500000000, { decimals: 2 }) // Returns: '1.50 SOL'\n */\nexport function formatSOL(\n lamports: number | bigint,\n options: {\n decimals?: number;\n suffix?: boolean;\n fast?: boolean;\n } = {},\n): string {\n const { decimals = 4, suffix = true, fast = false } = options;\n\n // Fast path for small numbers (< 2^53 lamports ~9000 SOL)\n if (fast && typeof lamports === 'number') {\n const sol = lamports / LAMPORTS_PER_SOL;\n const formatted = sol.toFixed(decimals);\n return suffix ? `${formatted} SOL` : formatted;\n }\n\n // Precise path: convert to number and format with proper decimals\n // This ensures trailing zeros are included\n const lamportsBigInt = typeof lamports === 'bigint' ? lamports : BigInt(lamports);\n const sol = Number(lamportsBigInt) / LAMPORTS_PER_SOL;\n const formatted = sol.toFixed(decimals);\n return suffix ? `${formatted} SOL` : formatted;\n}\n\n/**\n * Format a number with thousands separators\n *\n * @example\n * formatNumber(1234567.89) // Returns: '1,234,567.89'\n */\nexport function formatNumber(\n value: number,\n options: {\n decimals?: number;\n locale?: string;\n } = {},\n): string {\n const { decimals, locale = 'en-US' } = options;\n\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value);\n}\n\n/**\n * Truncate text with ellipsis\n *\n * @param text - Text to truncate\n * @param maxLength - Maximum length including ellipsis\n * @param position - Where to truncate: 'middle' or 'end' (default: 'middle')\n *\n * @example\n * truncate('Hello World', 8) // Returns: 'He...ld'\n * truncate('Hello World', 8, 'end') // Returns: 'Hello...'\n * truncate('Short', 10) // Returns: 'Short' (no truncation needed)\n */\nexport function truncate(text: string, maxLength: number, position: 'middle' | 'end' = 'middle'): string {\n if (!text || text.length <= maxLength) return text;\n\n if (position === 'end') {\n return text.slice(0, maxLength - 3) + '...';\n }\n\n // Middle truncation\n const half = Math.floor((maxLength - 3) / 2);\n return text.slice(0, half) + '...' + text.slice(-half);\n}\n\n/**\n * Format token amount with proper decimals\n *\n * @example\n * formatTokenAmount(1000000, 6) // Returns: '1.000000'\n */\nexport function formatTokenAmount(\n amount: number | bigint,\n decimals: number,\n options: {\n minimumDecimals?: number;\n maximumDecimals?: number;\n } = {},\n): string {\n const value = Number(amount) / Math.pow(10, decimals);\n const minDecimals = options.minimumDecimals ?? 0;\n const maxDecimals = options.maximumDecimals ?? decimals;\n\n return value.toLocaleString('en-US', {\n minimumFractionDigits: minDecimals,\n maximumFractionDigits: maxDecimals,\n });\n}\n\n// ============================================================================\n// BigInt-Safe Formatting Utilities\n// ============================================================================\n\n/**\n * Maximum safe integer for JavaScript (2^53 - 1)\n */\nconst MAX_SAFE_INTEGER = BigInt(Number.MAX_SAFE_INTEGER);\n\n/**\n * Check if a bigint is safe to convert to a number without precision loss\n */\nfunction isSafeInteger(value: bigint): boolean {\n return value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Split a bigint into whole and fractional parts as strings.\n * This avoids precision loss by using string manipulation.\n *\n * @param amount - The bigint amount in smallest units\n * @param decimals - Number of decimal places\n * @returns Object with whole and fractional parts as strings\n */\nfunction splitBigIntDecimals(amount: bigint, decimals: number): { whole: string; fraction: string } {\n if (decimals <= 0) {\n return { whole: amount.toString(), fraction: '' };\n }\n\n const str = amount.toString();\n const isNegative = str.startsWith('-');\n const absStr = isNegative ? str.slice(1) : str;\n\n if (absStr.length <= decimals) {\n // Pad with leading zeros\n const padded = absStr.padStart(decimals, '0');\n return {\n whole: isNegative ? '-0' : '0',\n fraction: padded,\n };\n }\n\n const splitPoint = absStr.length - decimals;\n return {\n whole: (isNegative ? '-' : '') + absStr.slice(0, splitPoint),\n fraction: absStr.slice(splitPoint),\n };\n}\n\n/**\n * Format a bigint balance with decimals, avoiding Number precision loss.\n * Uses string manipulation for precision beyond Number.MAX_SAFE_INTEGER.\n *\n * @param amount - The bigint amount in smallest units\n * @param decimals - Number of decimal places for the token\n * @param options - Formatting options\n * @returns Formatted string representation\n *\n * @example\n * // Small amounts (uses Number for speed)\n * formatBigIntBalance(1000000n, 6) // Returns: '1'\n *\n * @example\n * // Large amounts (uses string manipulation for precision)\n * formatBigIntBalance(12345678901234567890n, 18) // Returns: '12.345678901234567890'\n *\n * @example\n * // With options\n * formatBigIntBalance(1500000n, 6, { maxDecimals: 2 }) // Returns: '1.5'\n */\nexport function formatBigIntBalance(\n amount: bigint,\n decimals: number,\n options: {\n /** Maximum number of decimal places to show (default: min(decimals, 6)) */\n maxDecimals?: number;\n /** Minimum number of decimal places to show (default: 0) */\n minDecimals?: number;\n /** Locale for number formatting (default: undefined, uses browser locale) */\n locale?: string;\n /** Whether to use grouping separators like commas (default: true) */\n useGrouping?: boolean;\n } = {},\n): string {\n const { maxDecimals = Math.min(decimals, 6), minDecimals = 0, locale, useGrouping = true } = options;\n\n // Fast path: if the amount is safe to convert to Number, use native formatting\n if (isSafeInteger(amount)) {\n const value = Number(amount) / Math.pow(10, decimals);\n return value.toLocaleString(locale, {\n minimumFractionDigits: minDecimals,\n maximumFractionDigits: maxDecimals,\n useGrouping,\n });\n }\n\n // Slow path: use string manipulation for large numbers\n const { whole, fraction } = splitBigIntDecimals(amount, decimals);\n\n // Truncate fraction to maxDecimals\n let truncatedFraction = fraction.slice(0, maxDecimals);\n\n // Remove trailing zeros (but keep at least minDecimals)\n while (truncatedFraction.length > minDecimals && truncatedFraction.endsWith('0')) {\n truncatedFraction = truncatedFraction.slice(0, -1);\n }\n\n // Pad to minDecimals if needed\n truncatedFraction = truncatedFraction.padEnd(minDecimals, '0');\n\n // Format whole part with grouping\n let formattedWhole = whole;\n if (useGrouping) {\n const isNegative = whole.startsWith('-');\n const absWhole = isNegative ? whole.slice(1) : whole;\n\n // Add thousands separators\n const parts: string[] = [];\n for (let i = absWhole.length; i > 0; i -= 3) {\n parts.unshift(absWhole.slice(Math.max(0, i - 3), i));\n }\n\n formattedWhole = (isNegative ? '-' : '') + parts.join(',');\n }\n\n if (truncatedFraction.length === 0) {\n return formattedWhole;\n }\n\n return `${formattedWhole}.${truncatedFraction}`;\n}\n\n/**\n * Convert lamports to SOL string representation with BigInt safety.\n *\n * @param lamports - Amount in lamports (bigint)\n * @param options - Formatting options\n * @returns Formatted SOL string\n *\n * @example\n * formatLamportsToSolSafe(1000000000n) // Returns: '1'\n * formatLamportsToSolSafe(1500000000n, { maxDecimals: 4 }) // Returns: '1.5'\n * formatLamportsToSolSafe(1000000000n, { suffix: true }) // Returns: '1 SOL'\n */\nexport function formatLamportsToSolSafe(\n lamports: bigint,\n options: {\n /** Maximum decimal places (default: 4) */\n maxDecimals?: number;\n /** Minimum decimal places (default: 0) */\n minDecimals?: number;\n /** Add ' SOL' suffix (default: false) */\n suffix?: boolean;\n /** Locale for formatting */\n locale?: string;\n } = {},\n): string {\n const { maxDecimals = 4, minDecimals = 0, suffix = false, locale } = options;\n\n const formatted = formatBigIntBalance(lamports, 9, {\n maxDecimals,\n minDecimals,\n locale,\n });\n\n return suffix ? `${formatted} SOL` : formatted;\n}\n\n/**\n * Format USD value from bigint amount with BigInt safety.\n * Uses the USD price to calculate the value.\n *\n * @param amount - Token amount in smallest units (bigint)\n * @param decimals - Token decimals\n * @param usdPrice - Current USD price per token\n * @param options - Formatting options\n * @returns Formatted USD string\n *\n * @example\n * formatBigIntUsd(1000000000n, 9, 150.50) // Returns: '$150.50'\n */\nexport function formatBigIntUsd(\n amount: bigint,\n decimals: number,\n usdPrice: number,\n options: {\n /** Locale for formatting (default: undefined) */\n locale?: string;\n /** Currency code (default: 'USD') */\n currency?: string;\n } = {},\n): string {\n const { locale, currency = 'USD' } = options;\n\n // For USD calculation, we need to convert to Number at some point.\n // We use the fractional approach to minimize precision loss.\n\n // Split into whole and fractional parts\n const { whole, fraction } = splitBigIntDecimals(amount, decimals);\n\n // Convert whole part (may lose precision for extremely large numbers)\n const wholeNum = parseFloat(whole);\n\n // Convert fractional part (always safe, < 1)\n const fractionNum = fraction ? parseFloat('0.' + fraction) : 0;\n\n // Calculate total token amount\n const tokenAmount = wholeNum + fractionNum;\n\n // Calculate USD value\n const usdValue = tokenAmount * usdPrice;\n\n return usdValue.toLocaleString(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\n/**\n * Format a token balance for display with BigInt safety.\n * Convenience wrapper around formatBigIntBalance.\n *\n * @param amount - Token amount in smallest units\n * @param decimals - Token decimals\n * @param options - Formatting options\n * @returns Formatted balance string\n */\nexport function formatTokenBalanceSafe(\n amount: bigint,\n decimals: number,\n options: {\n maxDecimals?: number;\n locale?: string;\n } = {},\n): string {\n return formatBigIntBalance(amount, decimals, {\n maxDecimals: options.maxDecimals ?? Math.min(decimals, 6),\n locale: options.locale,\n });\n}\n","/**\n * @solana/connector - Enhanced Clipboard Utilities\n *\n * Comprehensive clipboard functionality with validation, formatting, fallbacks,\n * and detailed error reporting for Solana addresses and transaction signatures.\n */\n\nimport { isAddress } from '@solana/addresses';\nimport { formatAddress } from './formatting';\n\n/**\n * Types of errors that can occur during clipboard operations\n */\nexport enum ClipboardErrorType {\n /** Browser doesn't support clipboard API (neither modern nor legacy) */\n NOT_SUPPORTED = 'not_supported',\n /** User denied clipboard permission or browser blocked the operation */\n PERMISSION_DENIED = 'permission_denied',\n /** Running in server-side rendering context (no window/navigator) */\n SSR = 'ssr',\n /** Empty or null value provided */\n EMPTY_VALUE = 'empty_value',\n /** Value failed validation (invalid address/signature format) */\n INVALID_VALUE = 'invalid_value',\n /** Unknown error occurred during copy operation */\n UNKNOWN = 'unknown',\n}\n\n/**\n * Detailed result from clipboard operation\n */\nexport interface ClipboardResult {\n /** Whether the copy operation succeeded */\n success: boolean;\n /** Type of error if operation failed */\n error?: ClipboardErrorType;\n /** Human-readable error message */\n errorMessage?: string;\n /** Whether fallback method (execCommand) was used instead of modern API */\n usedFallback?: boolean;\n /** The actual value that was copied (after formatting) */\n copiedValue?: string;\n}\n\n/**\n * Options for clipboard copy operations\n */\nexport interface CopyOptions {\n /** Callback invoked on successful copy */\n onSuccess?: () => void;\n /** Callback invoked on copy failure */\n onError?: (error: ClipboardErrorType, message: string) => void;\n /** Format to use when copying ('full' = original, 'short' = truncated) */\n format?: 'full' | 'short' | 'custom';\n /** Custom formatter function (only used when format='custom') */\n customFormatter?: (value: string) => string;\n /** Custom validation function */\n validate?: (value: string) => boolean;\n /** Type of value being copied (enables built-in validation) */\n validateType?: 'address' | 'signature' | 'none';\n /** Whether to attempt fallback using execCommand for older browsers */\n useFallback?: boolean;\n /** Number of characters to show on each side when format='short' */\n shortFormatChars?: number;\n}\n\n/**\n * Check clipboard API availability\n *\n * @returns Object indicating which clipboard methods are available\n *\n * @example\n * ```ts\n * const { modern, fallback, available } = isClipboardAvailable();\n * if (!available) {\n * console.warn('Clipboard not supported in this browser');\n * }\n * ```\n */\nexport function isClipboardAvailable(): {\n /** Modern Clipboard API (navigator.clipboard) is available */\n modern: boolean;\n /** Legacy execCommand fallback is available */\n fallback: boolean;\n /** At least one method is available */\n available: boolean;\n} {\n // Check for SSR\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return { modern: false, fallback: false, available: false };\n }\n\n const modern = typeof navigator?.clipboard?.writeText === 'function';\n const fallback = typeof document.execCommand === 'function';\n\n return {\n modern,\n fallback,\n available: modern || fallback,\n };\n}\n\n/**\n * Validate a Solana address\n */\nfunction validateAddress(address: string): boolean {\n try {\n return isAddress(address);\n } catch {\n return false;\n }\n}\n\n/**\n * Validate a transaction signature (base58, 64 bytes = 88 chars)\n */\nfunction validateSignature(signature: string): boolean {\n if (!signature || typeof signature !== 'string') return false;\n // Solana signatures are 64 bytes encoded in base58 (typically 87-88 chars)\n if (signature.length < 87 || signature.length > 88) return false;\n // Check base58 alphabet\n return /^[1-9A-HJ-NP-Za-km-z]+$/.test(signature);\n}\n\n/**\n * Format value based on options\n */\nfunction formatValue(value: string, options: CopyOptions): string {\n const { format = 'full', customFormatter, shortFormatChars = 4 } = options;\n\n if (format === 'custom' && customFormatter) {\n try {\n return customFormatter(value);\n } catch {\n // If custom formatter throws, fall back to original value\n return value;\n }\n }\n\n if (format === 'short') {\n // Use formatAddress for address-like strings, otherwise truncate manually\n if (value.length > 32 && value.length < 50) {\n return formatAddress(value, { length: shortFormatChars });\n }\n // For signatures or other long strings\n if (value.length > shortFormatChars * 2) {\n return `${value.slice(0, shortFormatChars)}...${value.slice(-shortFormatChars)}`;\n }\n }\n\n return value;\n}\n\n/**\n * Fallback copy method using deprecated execCommand\n * Only used for older browsers that don't support Clipboard API\n */\nfunction copyUsingFallback(text: string): boolean {\n try {\n const textArea = document.createElement('textarea');\n textArea.value = text;\n textArea.style.position = 'fixed';\n textArea.style.left = '-999999px';\n textArea.style.top = '-999999px';\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n const successful = document.execCommand('copy');\n document.body.removeChild(textArea);\n\n return successful;\n } catch {\n return false;\n }\n}\n\n/**\n * Copy text to clipboard with comprehensive error handling and features\n *\n * @param text - Text to copy to clipboard\n * @param options - Configuration options for copy operation\n * @returns Promise resolving to detailed result object\n *\n * @example Basic usage\n * ```ts\n * const result = await copyToClipboard('5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp...');\n * if (result.success) {\n * console.log('Copied!');\n * }\n * ```\n *\n * @example With validation and formatting\n * ```ts\n * const result = await copyToClipboard(address, {\n * validateType: 'address',\n * format: 'short',\n * onSuccess: () => toast.success('Address copied!'),\n * onError: (type, msg) => toast.error(msg)\n * });\n * ```\n *\n * @example Custom formatting\n * ```ts\n * const result = await copyToClipboard(signature, {\n * format: 'custom',\n * customFormatter: (sig) => `Signature: ${sig}`,\n * onSuccess: () => setCopied(true)\n * });\n * ```\n */\nexport async function copyToClipboard(text: string, options: CopyOptions = {}): Promise<ClipboardResult> {\n const { onSuccess, onError, validate, validateType = 'none', useFallback = true } = options;\n\n // Validate input\n if (!text || typeof text !== 'string' || text.trim() === '') {\n const error = ClipboardErrorType.EMPTY_VALUE;\n const message = 'No text provided to copy';\n onError?.(error, message);\n return { success: false, error, errorMessage: message };\n }\n\n // Check SSR\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n const error = ClipboardErrorType.SSR;\n const message = 'Clipboard not available in server-side rendering context';\n onError?.(error, message);\n return { success: false, error, errorMessage: message };\n }\n\n // Run validation if specified\n if (validate && !validate(text)) {\n const error = ClipboardErrorType.INVALID_VALUE;\n const message = 'Value failed custom validation';\n onError?.(error, message);\n return { success: false, error, errorMessage: message };\n }\n\n // Built-in validation based on type\n if (validateType === 'address' && !validateAddress(text)) {\n const error = ClipboardErrorType.INVALID_VALUE;\n const message = 'Invalid Solana address format';\n onError?.(error, message);\n return { success: false, error, errorMessage: message };\n }\n\n if (validateType === 'signature' && !validateSignature(text)) {\n const error = ClipboardErrorType.INVALID_VALUE;\n const message = 'Invalid transaction signature format';\n onError?.(error, message);\n return { success: false, error, errorMessage: message };\n }\n\n // Format value if needed\n const formattedValue = formatValue(text, options);\n\n // Check clipboard availability\n const availability = isClipboardAvailable();\n\n if (!availability.available) {\n const error = ClipboardErrorType.NOT_SUPPORTED;\n const message = 'Clipboard API not supported in this browser';\n onError?.(error, message);\n return { success: false, error, errorMessage: message };\n }\n\n // Try modern Clipboard API first\n if (availability.modern) {\n try {\n await navigator.clipboard.writeText(formattedValue);\n onSuccess?.();\n return { success: true, copiedValue: formattedValue };\n } catch (err) {\n // Check if it's a permission error\n const isPermissionError =\n err instanceof Error &&\n (err.name === 'NotAllowedError' || err.message.toLowerCase().includes('permission'));\n\n if (isPermissionError) {\n const error = ClipboardErrorType.PERMISSION_DENIED;\n const message = 'Clipboard permission denied by user or browser';\n onError?.(error, message);\n return { success: false, error, errorMessage: message };\n }\n\n // If modern API fails and fallback is enabled, try execCommand\n if (useFallback && availability.fallback) {\n const fallbackSuccess = copyUsingFallback(formattedValue);\n if (fallbackSuccess) {\n onSuccess?.();\n return { success: true, usedFallback: true, copiedValue: formattedValue };\n }\n }\n\n const error = ClipboardErrorType.UNKNOWN;\n const message = err instanceof Error ? err.message : 'Failed to copy to clipboard';\n onError?.(error, message);\n return { success: false, error, errorMessage: message };\n }\n }\n\n // Use fallback if modern API not available\n if (useFallback && availability.fallback) {\n const fallbackSuccess = copyUsingFallback(formattedValue);\n if (fallbackSuccess) {\n onSuccess?.();\n return { success: true, usedFallback: true, copiedValue: formattedValue };\n }\n\n const error = ClipboardErrorType.UNKNOWN;\n const message = 'Failed to copy using fallback method';\n onError?.(error, message);\n return { success: false, error, errorMessage: message };\n }\n\n // Should never reach here, but handle it\n const error = ClipboardErrorType.NOT_SUPPORTED;\n const message = 'No clipboard method available';\n onError?.(error, message);\n return { success: false, error, errorMessage: message };\n}\n\n/**\n * Copy a Solana wallet address to clipboard with automatic validation\n *\n * @param address - Solana wallet address (base58 encoded public key)\n * @param options - Copy options (validateType will be set to 'address' automatically)\n * @returns Promise resolving to result object\n *\n * @example\n * ```tsx\n * function AddressButton({ address }: { address: string }) {\n * const [copied, setCopied] = useState(false);\n *\n * const handleCopy = async () => {\n * const result = await copyAddressToClipboard(address, {\n * format: 'short',\n * onSuccess: () => {\n * setCopied(true);\n * setTimeout(() => setCopied(false), 2000);\n * }\n * });\n * };\n *\n * return (\n * <button onClick={handleCopy}>\n * {formatAddress(address)} {copied && '✓'}\n * </button>\n * );\n * }\n * ```\n */\nexport async function copyAddressToClipboard(\n address: string,\n options?: Omit<CopyOptions, 'validateType'>,\n): Promise<ClipboardResult> {\n return copyToClipboard(address, {\n ...options,\n validateType: 'address',\n });\n}\n\n/**\n * Copy a transaction signature to clipboard with automatic validation\n *\n * @param signature - Solana transaction signature (base58 encoded, 64 bytes)\n * @param options - Copy options (validateType will be set to 'signature' automatically)\n * @returns Promise resolving to result object\n *\n * @example\n * ```tsx\n * function TransactionRow({ signature }: { signature: string }) {\n * return (\n * <button\n * onClick={async () => {\n * const result = await copySignatureToClipboard(signature, {\n * onSuccess: () => toast.success('Signature copied!'),\n * onError: (type, msg) => toast.error(msg)\n * });\n * }}\n * >\n * Copy Signature\n * </button>\n * );\n * }\n * ```\n */\nexport async function copySignatureToClipboard(\n signature: string,\n options?: Omit<CopyOptions, 'validateType'>,\n): Promise<ClipboardResult> {\n return copyToClipboard(signature, {\n ...options,\n validateType: 'signature',\n });\n}\n","/**\n * @solana/connector - Transaction Validator\n *\n * Validates transactions before signing to prevent malformed or malicious transactions\n * Helps ensure transaction safety and proper error handling\n */\n\nimport type { SolanaTransaction } from '../../types/transactions';\nimport { createLogger } from '../utils/secure-logger';\n\nconst logger = createLogger('TransactionValidator');\n\n/**\n * Maximum transaction size in bytes (Solana network limit)\n * Solana enforces a 1232 byte limit for serialized transactions\n */\nexport const MAX_TRANSACTION_SIZE = 1232;\n\n/**\n * Minimum reasonable transaction size (empty transaction with signature)\n */\nexport const MIN_TRANSACTION_SIZE = 64;\n\n/**\n * Result of transaction validation\n */\nexport interface TransactionValidationResult {\n /** Whether the transaction is valid */\n valid: boolean;\n /** List of validation errors (empty if valid) */\n errors: string[];\n /** List of validation warnings (non-blocking) */\n warnings: string[];\n /** Size of serialized transaction in bytes */\n size?: number;\n}\n\n/**\n * Options for transaction validation\n */\nexport interface TransactionValidationOptions {\n /** Maximum allowed transaction size (default: 1232) */\n maxSize?: number;\n /** Minimum required transaction size (default: 64) */\n minSize?: number;\n /** Whether to check for duplicate signatures */\n checkDuplicateSignatures?: boolean;\n /** Enable strict validation (fails on warnings) */\n strict?: boolean;\n}\n\n/**\n * TransactionValidator - Validates Solana transactions before signing\n *\n * Performs safety checks to prevent:\n * - Oversized transactions that will be rejected by the network\n * - Empty or malformed transactions\n * - Transactions that can't be serialized\n * - Potentially malicious transaction patterns\n *\n * @example\n * ```ts\n * const result = TransactionValidator.validate(transaction);\n *\n * if (!result.valid) {\n * console.error('Invalid transaction:', result.errors);\n * throw new Error(result.errors.join(', '));\n * }\n *\n * if (result.warnings.length > 0) {\n * console.warn('Transaction warnings:', result.warnings);\n * }\n * ```\n */\nexport class TransactionValidator {\n /**\n * Validate a transaction before signing\n *\n * @param transaction - The transaction to validate\n * @param options - Validation options\n * @returns Validation result with errors and warnings\n */\n static validate(\n transaction: SolanaTransaction,\n options: TransactionValidationOptions = {},\n ): TransactionValidationResult {\n const {\n maxSize = MAX_TRANSACTION_SIZE,\n minSize = MIN_TRANSACTION_SIZE,\n checkDuplicateSignatures = true,\n strict = false,\n } = options;\n\n const errors: string[] = [];\n const warnings: string[] = [];\n let size: number | undefined;\n\n // Check if transaction exists\n if (!transaction) {\n errors.push('Transaction is null or undefined');\n return { valid: false, errors, warnings };\n }\n\n // Try to serialize and validate size\n try {\n let serialized: Uint8Array | undefined;\n\n // Handle web3.js Transaction objects\n if (typeof (transaction as { serialize?: () => Uint8Array }).serialize === 'function') {\n try {\n serialized = (transaction as { serialize: () => Uint8Array }).serialize();\n } catch (serializeError) {\n // If serialize fails, it might not be signed yet - this is okay\n logger.debug('Transaction not yet serializable (may need signing)', {\n error: serializeError instanceof Error ? serializeError.message : String(serializeError),\n });\n }\n }\n // Handle already-serialized transactions\n else if (transaction instanceof Uint8Array) {\n serialized = transaction;\n }\n // Handle unknown transaction types\n else {\n errors.push(\n 'Transaction type not recognized - must be a Transaction object with serialize() or Uint8Array',\n );\n return { valid: false, errors, warnings };\n }\n\n // Validate serialized size if available\n if (serialized) {\n size = serialized.length;\n\n // Check maximum size\n if (size > maxSize) {\n errors.push(`Transaction too large: ${size} bytes (max ${maxSize} bytes)`);\n logger.warn('Transaction exceeds maximum size', { size, maxSize });\n }\n\n // Check minimum size\n if (size < minSize) {\n warnings.push(`Transaction is very small: ${size} bytes (min recommended ${minSize} bytes)`);\n }\n\n // Check for empty transaction\n if (size === 0) {\n errors.push('Transaction is empty (0 bytes)');\n }\n\n // Check for suspicious patterns\n if (this.hasSuspiciousPattern(serialized)) {\n warnings.push('Transaction contains unusual patterns - please review carefully');\n }\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n errors.push(`Transaction validation failed: ${errorMessage}`);\n logger.error('Validation error', { error: errorMessage });\n }\n\n // Check for duplicate signatures (if transaction has signatures property)\n if (checkDuplicateSignatures && typeof transaction === 'object' && 'signatures' in transaction) {\n const signatures = (transaction as { signatures?: Array<{ publicKey?: unknown }> }).signatures;\n if (Array.isArray(signatures)) {\n const uniqueKeys = new Set(\n signatures\n .map(sig => {\n const pubKey = sig?.publicKey;\n return pubKey ? String(pubKey) : null;\n })\n .filter(Boolean),\n );\n\n if (uniqueKeys.size < signatures.length) {\n warnings.push('Transaction contains duplicate signers');\n }\n }\n }\n\n // In strict mode, treat warnings as errors\n if (strict && warnings.length > 0) {\n errors.push(...warnings.map(w => `Strict mode: ${w}`));\n warnings.length = 0; // Clear warnings since they're now errors\n }\n\n const valid = errors.length === 0;\n\n if (!valid) {\n logger.warn('Transaction validation failed', { errors, size });\n } else if (warnings.length > 0) {\n logger.debug('Transaction validation passed with warnings', { warnings, size });\n } else {\n logger.debug('Transaction validation passed', { size });\n }\n\n return {\n valid,\n errors,\n warnings,\n size,\n };\n }\n\n /**\n * Check for suspicious patterns in serialized transaction\n * This is a heuristic check to detect potentially malicious transactions\n *\n * @param serialized - Serialized transaction bytes\n * @returns True if suspicious patterns detected\n */\n private static hasSuspiciousPattern(serialized: Uint8Array): boolean {\n // Check for all zeros (potentially uninitialized)\n const allZeros = serialized.every(byte => byte === 0);\n if (allZeros) return true;\n\n // Check for all 0xFF (potentially malicious padding)\n const allFF = serialized.every(byte => byte === 0xff);\n if (allFF) return true;\n\n // Check for unusual repetition (>50% of bytes are the same)\n const byteCounts = new Map<number, number>();\n for (const byte of serialized) {\n byteCounts.set(byte, (byteCounts.get(byte) || 0) + 1);\n }\n\n const maxCount = Math.max(...Array.from(byteCounts.values()));\n const repetitionRatio = maxCount / serialized.length;\n\n if (repetitionRatio > 0.5) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Quick validation check - returns true if valid, throws on error\n * Useful for inline validation\n *\n * @param transaction - Transaction to validate\n * @param options - Validation options\n * @throws Error if validation fails\n *\n * @example\n * ```ts\n * TransactionValidator.assertValid(transaction);\n * // Continues if valid, throws if invalid\n * await signer.signTransaction(transaction);\n * ```\n */\n static assertValid(transaction: SolanaTransaction, options?: TransactionValidationOptions): void {\n const result = this.validate(transaction, options);\n\n if (!result.valid) {\n throw new Error(`Transaction validation failed: ${result.errors.join(', ')}`);\n }\n\n if (result.warnings.length > 0) {\n logger.warn('Transaction validation warnings', { warnings: result.warnings });\n }\n }\n\n /**\n * Batch validate multiple transactions\n * More efficient than validating one-by-one\n *\n * @param transactions - Array of transactions to validate\n * @param options - Validation options\n * @returns Array of validation results\n */\n static validateBatch(\n transactions: SolanaTransaction[],\n options?: TransactionValidationOptions,\n ): TransactionValidationResult[] {\n return transactions.map((tx, index) => {\n logger.debug(`Validating transaction ${index + 1}/${transactions.length}`);\n return this.validate(tx, options);\n });\n }\n}\n","/**\n * Transaction signing abstraction layer\n */\n\nimport type {\n SolanaTransaction,\n TransactionSignerConfig,\n TransactionSignerCapabilities,\n} from '../../types/transactions';\nimport { prepareTransactionForWallet, convertSignedTransaction } from '../../utils/transaction-format';\nimport { TransactionValidator } from './transaction-validator';\nimport { createLogger } from '../utils/secure-logger';\nimport { TransactionError, ValidationError, Errors } from '../errors';\nimport { getBase58Decoder } from '@solana/codecs';\n\nconst logger = createLogger('TransactionSigner');\n\nfunction signatureBytesToBase58(bytes: Uint8Array): string {\n if (bytes.length !== 64) {\n throw new Error(`Invalid signature length: expected 64 bytes, got ${bytes.length}`);\n }\n return getBase58Decoder().decode(bytes);\n}\n\nfunction extractSignatureString(result: unknown): string {\n if (typeof result === 'string') {\n return result;\n }\n\n if (result instanceof Uint8Array) {\n return signatureBytesToBase58(result);\n }\n\n if (Array.isArray(result) && result.length > 0) {\n // Wallet Standard typically returns an array of outputs, e.g. [{ signature: Uint8Array }]\n return extractSignatureString(result[0]);\n }\n\n if (result && typeof result === 'object') {\n const record = result as Record<string, unknown>;\n\n if ('signature' in record) {\n return extractSignatureString(record.signature);\n }\n\n if (Array.isArray(record.signatures) && record.signatures.length > 0) {\n return extractSignatureString(record.signatures[0]);\n }\n }\n\n throw new Error('Unexpected wallet response format for signAndSendTransaction');\n}\n\nfunction extractSignatureBytes(result: unknown): Uint8Array {\n if (result instanceof Uint8Array) {\n return result;\n }\n\n if (Array.isArray(result)) {\n const [first] = result;\n if (!first) {\n throw new Error('Wallet returned empty results array');\n }\n return extractSignatureBytes(first);\n }\n\n if (result && typeof result === 'object') {\n const record = result as Record<string, unknown>;\n\n if ('signature' in record) {\n return extractSignatureBytes(record.signature);\n }\n\n if (Array.isArray(record.signatures) && record.signatures.length > 0) {\n return extractSignatureBytes(record.signatures[0]);\n }\n }\n\n throw new Error('Unexpected wallet response format for signMessage');\n}\n\nexport interface TransactionSigner {\n /** The wallet address that will sign transactions */\n readonly address: string;\n\n signTransaction(transaction: SolanaTransaction): Promise<SolanaTransaction>;\n\n signAllTransactions(transactions: SolanaTransaction[]): Promise<SolanaTransaction[]>;\n\n signAndSendTransaction(\n transaction: SolanaTransaction,\n options?: { skipPreflight?: boolean; maxRetries?: number },\n ): Promise<string>;\n\n signAndSendTransactions(\n transactions: SolanaTransaction[],\n options?: { skipPreflight?: boolean; maxRetries?: number },\n ): Promise<string[]>;\n\n signMessage?(message: Uint8Array): Promise<Uint8Array>;\n\n getCapabilities(): TransactionSignerCapabilities;\n}\n\nexport function createTransactionSigner(config: TransactionSignerConfig): TransactionSigner | null {\n const { wallet, account, cluster, eventEmitter } = config;\n\n if (!wallet || !account) {\n return null;\n }\n\n const features = wallet.features as Record<string, Record<string, (...args: unknown[]) => unknown>>;\n const address = account.address as string;\n\n const capabilities: TransactionSignerCapabilities = {\n canSign: Boolean(features['solana:signTransaction']),\n canSend: Boolean(features['solana:signAndSendTransaction']),\n canSignMessage: Boolean(features['solana:signMessage']),\n supportsBatchSigning: Boolean(features['solana:signAllTransactions']),\n };\n\n const signer: TransactionSigner = {\n address,\n\n async signTransaction(transaction: SolanaTransaction): Promise<SolanaTransaction> {\n if (!capabilities.canSign) {\n throw Errors.featureNotSupported('transaction signing');\n }\n\n const validation = TransactionValidator.validate(transaction);\n if (!validation.valid) {\n logger.error('Transaction validation failed', { errors: validation.errors });\n throw Errors.invalidTransaction(validation.errors.join(', '));\n }\n\n if (validation.warnings.length > 0) {\n logger.warn('Transaction validation warnings', { warnings: validation.warnings });\n }\n\n try {\n const signFeature = features['solana:signTransaction'];\n\n const { serialized, wasWeb3js } = prepareTransactionForWallet(transaction);\n\n logger.debug('Signing transaction', {\n wasWeb3js,\n serializedLength: serialized.length,\n serializedType: serialized.constructor.name,\n accountAddress: account?.address,\n hasAccount: !!account,\n });\n\n let result: Record<string, unknown>;\n let usedFormat = '';\n\n try {\n logger.debug('Trying array format: transactions: [Uint8Array]');\n result = (await signFeature.signTransaction({\n account,\n transactions: [serialized],\n ...(cluster ? { chain: cluster.id } : {}),\n })) as Record<string, unknown>;\n usedFormat = 'array';\n } catch (err1: unknown) {\n const error1 = err1 instanceof Error ? err1 : new Error(String(err1));\n logger.debug('Array format failed, trying singular format', { error: error1.message });\n try {\n logger.debug('Trying singular format: transaction: Uint8Array');\n result = (await signFeature.signTransaction({\n account,\n transaction: serialized,\n ...(cluster ? { chain: cluster.id } : {}),\n })) as Record<string, unknown>;\n usedFormat = 'singular';\n } catch (err2: unknown) {\n const error2 = err2 instanceof Error ? err2 : new Error(String(err2));\n logger.error('Both array and singular formats failed', { error: error2.message });\n throw error2;\n }\n }\n\n logger.debug('Wallet signed successfully', { format: usedFormat });\n\n let signedTx;\n if (Array.isArray(result.signedTransactions) && result.signedTransactions[0]) {\n signedTx = result.signedTransactions[0];\n } else if (result.signedTransaction) {\n signedTx = result.signedTransaction;\n } else if (Array.isArray(result) && result[0]) {\n signedTx = result[0];\n } else if (result instanceof Uint8Array) {\n signedTx = result;\n } else {\n throw new Error(`Unexpected wallet response format: ${JSON.stringify(Object.keys(result))}`);\n }\n\n logger.debug('Extracted signed transaction', {\n hasSignedTx: !!signedTx,\n signedTxType: signedTx?.constructor?.name,\n signedTxLength: signedTx?.length,\n isUint8Array: signedTx instanceof Uint8Array,\n hasSerialize: typeof signedTx?.serialize === 'function',\n });\n\n if (signedTx && typeof signedTx.serialize === 'function') {\n logger.debug('Wallet returned web3.js object directly, no conversion needed');\n return signedTx;\n }\n\n if (signedTx && signedTx.signedTransaction) {\n logger.debug('Found signedTransaction property');\n const bytes = signedTx.signedTransaction;\n if (bytes instanceof Uint8Array) {\n return await convertSignedTransaction(bytes, wasWeb3js);\n }\n }\n\n if (signedTx instanceof Uint8Array) {\n return await convertSignedTransaction(signedTx, wasWeb3js);\n }\n\n logger.error('Unexpected wallet response format', {\n type: typeof signedTx,\n constructor: signedTx?.constructor?.name,\n });\n\n throw new ValidationError(\n 'INVALID_FORMAT',\n 'Wallet returned unexpected format - not a Transaction or Uint8Array',\n );\n } catch (error) {\n throw Errors.signingFailed(error as Error);\n }\n },\n\n async signAllTransactions(transactions: SolanaTransaction[]): Promise<SolanaTransaction[]> {\n if (transactions.length === 0) {\n return [];\n }\n\n if (capabilities.supportsBatchSigning) {\n try {\n const signFeature = features['solana:signAllTransactions'];\n\n const prepared = transactions.map(tx => prepareTransactionForWallet(tx));\n const serializedTxs = prepared.map(p => p.serialized);\n const wasWeb3js = prepared[0].wasWeb3js;\n\n type SignAllResult =\n | { signedTransaction: Uint8Array }[] // Wallet Standard format\n | { signedTransactions: Uint8Array[] }; // Legacy format\n\n const result = (await signFeature.signAllTransactions({\n account,\n transactions: serializedTxs,\n ...(cluster ? { chain: cluster.id } : {}),\n })) as SignAllResult;\n\n // Handle both Wallet Standard formats:\n // 1. Array of { signedTransaction: Uint8Array } (standard format)\n // 2. Legacy { signedTransactions: Uint8Array[] } format\n let signedBytesArray: Uint8Array[];\n\n if (Array.isArray(result)) {\n // Standard format: [{ signedTransaction: Uint8Array }, ...]\n signedBytesArray = result.map(item => item.signedTransaction);\n } else if ('signedTransactions' in result) {\n // Legacy format: { signedTransactions: Uint8Array[] }\n signedBytesArray = result.signedTransactions;\n } else {\n throw new Error('Unexpected signAllTransactions response format');\n }\n\n return await Promise.all(\n signedBytesArray.map((signedBytes: Uint8Array) =>\n convertSignedTransaction(signedBytes, wasWeb3js),\n ),\n );\n } catch (error) {\n throw new TransactionError(\n 'SIGNING_FAILED',\n `Failed to sign transactions in batch`,\n { count: transactions.length },\n error as Error,\n );\n }\n }\n\n if (!capabilities.canSign) {\n throw Errors.featureNotSupported('transaction signing');\n }\n\n const signed: SolanaTransaction[] = [];\n for (let i = 0; i < transactions.length; i++) {\n try {\n const signedTx = await signer.signTransaction(transactions[i]);\n signed.push(signedTx);\n } catch (error) {\n throw new TransactionError(\n 'SIGNING_FAILED',\n `Failed to sign transaction ${i + 1} of ${transactions.length}`,\n { index: i, total: transactions.length },\n error as Error,\n );\n }\n }\n\n return signed;\n },\n\n async signAndSendTransaction(\n transaction: SolanaTransaction,\n options?: { skipPreflight?: boolean; maxRetries?: number },\n ): Promise<string> {\n if (!capabilities.canSend) {\n throw Errors.featureNotSupported('sending transactions');\n }\n\n try {\n const sendFeature = features['solana:signAndSendTransaction'];\n\n const { serialized } = prepareTransactionForWallet(transaction);\n\n if (eventEmitter) {\n eventEmitter.emit({\n type: 'transaction:preparing',\n transaction: serialized,\n size: serialized.length,\n timestamp: new Date().toISOString(),\n });\n }\n\n const inputBase = {\n account,\n ...(cluster ? { chain: cluster.id } : {}),\n ...(options ? { options } : {}),\n };\n\n if (eventEmitter) {\n eventEmitter.emit({\n type: 'transaction:signing',\n timestamp: new Date().toISOString(),\n });\n }\n\n let result: { signature?: string } | string;\n\n try {\n result = (await sendFeature.signAndSendTransaction({\n ...inputBase,\n transactions: [serialized],\n })) as { signature?: string } | string;\n } catch (err1: unknown) {\n result = (await sendFeature.signAndSendTransaction({\n ...inputBase,\n transaction: serialized,\n })) as { signature?: string } | string;\n }\n\n const signature = extractSignatureString(result);\n\n if (eventEmitter) {\n eventEmitter.emit({\n type: 'transaction:sent',\n signature,\n timestamp: new Date().toISOString(),\n });\n }\n\n return signature;\n } catch (error) {\n throw new TransactionError('SEND_FAILED', 'Failed to send transaction', undefined, error as Error);\n }\n },\n\n async signAndSendTransactions(\n transactions: SolanaTransaction[],\n options?: { skipPreflight?: boolean; maxRetries?: number },\n ): Promise<string[]> {\n if (transactions.length === 0) {\n return [];\n }\n\n if (!capabilities.canSend) {\n throw Errors.featureNotSupported('sending transactions');\n }\n\n const signatures: string[] = [];\n\n for (let i = 0; i < transactions.length; i++) {\n try {\n const sig = await signer.signAndSendTransaction(transactions[i], options);\n signatures.push(sig);\n } catch (error) {\n throw new TransactionError(\n 'SEND_FAILED',\n `Failed to send transaction ${i + 1} of ${transactions.length}`,\n { index: i, total: transactions.length },\n error as Error,\n );\n }\n }\n\n return signatures;\n },\n\n ...(capabilities.canSignMessage && {\n async signMessage(message: Uint8Array): Promise<Uint8Array> {\n try {\n const signFeature = features['solana:signMessage'];\n const result = await signFeature.signMessage({\n account,\n message,\n ...(cluster ? { chain: cluster.id } : {}),\n });\n return extractSignatureBytes(result);\n } catch (error) {\n throw new TransactionError('SIGNING_FAILED', 'Failed to sign message', undefined, error as Error);\n }\n },\n }),\n\n getCapabilities(): TransactionSignerCapabilities {\n return { ...capabilities };\n },\n };\n\n return signer;\n}\n\n/**\n * @deprecated Use TransactionError from '../errors' instead\n */\nexport class TransactionSignerError extends TransactionError {\n constructor(\n message: string,\n code: 'WALLET_NOT_CONNECTED' | 'FEATURE_NOT_SUPPORTED' | 'SIGNING_FAILED' | 'SEND_FAILED',\n originalError?: Error,\n ) {\n // Map old codes to new system\n const newCode = code === 'WALLET_NOT_CONNECTED' ? 'FEATURE_NOT_SUPPORTED' : code;\n super(newCode, message, undefined, originalError);\n this.name = 'TransactionSignerError';\n }\n}\n\n/**\n * @deprecated Use isTransactionError from '../errors' instead\n */\nexport function isTransactionSignerError(error: unknown): error is TransactionSignerError {\n return error instanceof TransactionSignerError || error instanceof TransactionError;\n}\n","/**\n * @solana/connector - Kit Transaction Signer Adapter\n *\n * Adapter that wraps connector-kit's TransactionSigner to be compatible with\n * @solana/kit TransactionModifyingSigner interface.\n *\n * This enables connector-kit to work seamlessly with modern Solana libraries\n * that expect @solana/kit's signer interface.\n *\n * Uses TransactionModifyingSigner to return fully signed Transaction objects,\n * ensuring the exact bytes the wallet signed are preserved without re-encoding.\n */\n\nimport type { TransactionSigner as ConnectorTransactionSigner } from './transaction-signer';\nimport type { SolanaTransaction } from '../../types/transactions';\nimport type { Address } from '@solana/addresses';\nimport { address as createAddress } from '@solana/addresses';\nimport type { TransactionModifyingSigner } from '@solana/signers';\nimport type { Transaction, TransactionWithLifetime, TransactionWithinSizeLimit } from '@solana/transactions';\nimport { getTransactionDecoder, assertIsTransactionWithinSizeLimit } from '@solana/transactions';\nimport { getBase58Decoder } from '@solana/codecs';\nimport type { SignatureBytes } from '@solana/keys';\nimport { isWeb3jsTransaction } from '../../utils/transaction-format';\nimport { createLogger } from '../utils/secure-logger';\n\nconst logger = createLogger('KitTransactionSigner');\n\n/**\n * Interface for transactions that can be serialized to bytes\n */\ninterface SerializableTransaction {\n serialize(): Uint8Array;\n}\n\n/**\n * Type helper for transactions that may include a lifetime constraint (local helper)\n */\ntype TransactionWithOptionalLifetime<T extends Transaction> = T & {\n lifetimeConstraint?: unknown;\n};\n\n/**\n * Encode a number as a shortvec\n * @param value - The number to encode\n * @returns Uint8Array containing the shortvec-encoded value\n */\nfunction encodeShortVecLength(value: number): Uint8Array {\n const bytes: number[] = [];\n let remaining = value;\n\n while (remaining >= 0x80) {\n bytes.push((remaining & 0x7f) | 0x80);\n remaining >>= 7;\n }\n bytes.push(remaining);\n\n return new Uint8Array(bytes);\n}\n\n/**\n * Decode shortvec-encoded length prefix from serialized transaction\n * @param data - Serialized transaction bytes\n * @returns Object with length value and number of bytes consumed\n */\nfunction decodeShortVecLength(data: Uint8Array): { length: number; bytesConsumed: number } {\n let length = 0;\n let size = 0;\n\n for (;;) {\n if (size >= data.length) {\n throw new Error('Invalid shortvec encoding: unexpected end of data');\n }\n const byte = data[size];\n length |= (byte & 0x7f) << (size * 7);\n size += 1;\n\n if ((byte & 0x80) === 0) {\n break;\n }\n if (size > 10) {\n throw new Error('Invalid shortvec encoding: length prefix too long');\n }\n }\n\n return { length, bytesConsumed: size };\n}\n\n/**\n * Parse the message to extract signer information\n * @param messageBytes - The compiled transaction message bytes\n * @returns Object with numSigners and static account addresses\n */\nfunction parseMessageSigners(messageBytes: Uint8Array): {\n numSigners: number;\n staticAccounts: string[];\n} {\n let offset = 0;\n\n if (messageBytes.length < 4) {\n throw new Error('Invalid message: too short for header');\n }\n\n // Check for version byte (0x80 = version 0)\n if (messageBytes[0] === 0x80) {\n offset = 1; // Skip version byte\n }\n\n // Read header (3 bytes)\n if (offset + 3 > messageBytes.length) {\n throw new Error('Invalid message: incomplete header');\n }\n const numSignerAccounts = messageBytes[offset];\n const numReadonlySignerAccounts = messageBytes[offset + 1];\n const numReadonlyNonSignerAccounts = messageBytes[offset + 2];\n offset += 3;\n\n // Read static accounts array\n // Format: shortvec(numAccounts), then 32 bytes per account\n if (offset >= messageBytes.length) {\n throw new Error('Invalid message: no static accounts section');\n }\n const { length: numStaticAccounts, bytesConsumed } = decodeShortVecLength(messageBytes.subarray(offset));\n offset += bytesConsumed;\n\n // Extract first numSignerAccounts addresses (these are the ones that sign)\n const staticAccounts: string[] = [];\n const base58Decoder = getBase58Decoder();\n\n for (let i = 0; i < numStaticAccounts && i < numSignerAccounts; i++) {\n if (offset + 32 > messageBytes.length) {\n throw new Error(`Invalid message: incomplete account ${i}`);\n }\n // Each address is 32 bytes\n const accountBytes = messageBytes.subarray(offset, offset + 32);\n // Convert to base58 string using kit's decoder\n const accountAddress = base58Decoder.decode(accountBytes);\n staticAccounts.push(accountAddress);\n offset += 32;\n }\n\n return {\n numSigners: numSignerAccounts,\n staticAccounts,\n };\n}\n\n/**\n * Create a full transaction wire format from message bytes and number of required signers\n * Transaction wire format: [shortvec(numSignatures), ...signatureSlots(64 bytes each), messageBytes]\n * @param messageBytes - The compiled transaction message bytes\n * @param numSigners - Number of required signers\n * @returns Properly formatted transaction bytes for wallet signing\n */\nfunction createTransactionBytesForSigning(messageBytes: Uint8Array, numSigners: number): Uint8Array {\n // Encode number of signatures as shortvec\n const numSignaturesBytes = encodeShortVecLength(numSigners);\n\n // Create empty signature slots (64 bytes of zeros per signer)\n const signatureSlots = new Uint8Array(numSigners * 64);\n\n // Concatenate: [numSigs, ...emptySigs, message]\n const totalLength = numSignaturesBytes.length + signatureSlots.length + messageBytes.length;\n const transactionBytes = new Uint8Array(totalLength);\n\n let offset = 0;\n transactionBytes.set(numSignaturesBytes, offset);\n offset += numSignaturesBytes.length;\n transactionBytes.set(signatureSlots, offset);\n offset += signatureSlots.length;\n transactionBytes.set(messageBytes, offset);\n\n return transactionBytes;\n}\n\n/**\n * Extract signature bytes at a specific index from a signed transaction\n * @param signedTx - Signed transaction in any format\n * @param signerIndex - Index of the signer whose signature to extract\n * @param expectedNumSigners - Expected number of signers (for validation)\n * @returns Signature bytes (64 bytes)\n */\nfunction extractSignatureAtIndex(\n signedTx: SolanaTransaction,\n signerIndex: number,\n expectedNumSigners: number,\n): Uint8Array {\n if (signedTx instanceof Uint8Array) {\n // Serialized transaction format: [shortvec_length, ...signatures, ...]\n // First decode the shortvec prefix to find where signatures start\n const { length: numSignatures, bytesConsumed } = decodeShortVecLength(signedTx);\n\n if (numSignatures === 0) {\n throw new Error('No signatures found in serialized transaction');\n }\n\n if (numSignatures !== expectedNumSigners) {\n logger.warn(`Signature count mismatch - expected ${expectedNumSigners}, found ${numSignatures}`);\n }\n\n if (signerIndex >= numSignatures) {\n throw new Error(`Signer index ${signerIndex} out of range (transaction has ${numSignatures} signatures)`);\n }\n\n // Calculate the position of the signature we want\n // Signatures start after the shortvec prefix, each is 64 bytes\n const signatureStart = bytesConsumed + signerIndex * 64;\n const signatureEnd = signatureStart + 64;\n\n return signedTx.slice(signatureStart, signatureEnd);\n }\n\n if (isWeb3jsTransaction(signedTx)) {\n // Extract from web3.js transaction object\n // Handle both { signature: Uint8Array | null } and raw Uint8Array formats\n const signatures = (signedTx as unknown as { signatures: Array<Uint8Array | { signature: Uint8Array | null }> })\n .signatures;\n\n if (!signatures || signatures.length === 0) {\n throw new Error('No signatures found in web3.js transaction');\n }\n\n if (signerIndex >= signatures.length) {\n throw new Error(\n `Signer index ${signerIndex} out of range (transaction has ${signatures.length} signatures)`,\n );\n }\n\n const targetSig = signatures[signerIndex];\n\n // Handle raw Uint8Array\n if (targetSig instanceof Uint8Array) {\n return targetSig;\n }\n\n // Handle { signature: Uint8Array | null } format\n if (targetSig && typeof targetSig === 'object' && 'signature' in targetSig) {\n if (targetSig.signature) {\n return targetSig.signature;\n }\n }\n\n throw new Error(`Could not extract signature at index ${signerIndex} from web3.js transaction`);\n }\n\n throw new Error('Cannot extract signature from transaction format');\n}\n\n/**\n * Extract signature bytes from a signed transaction (first signature)\n * @param signedTx - Signed transaction in any format\n * @returns Signature bytes (64 bytes)\n */\nfunction extractSignature(signedTx: SolanaTransaction): Uint8Array {\n if (signedTx instanceof Uint8Array) {\n // Serialized transaction format: [shortvec_length, ...signatures, ...]\n // First decode the shortvec prefix to find where signatures start\n const { length: numSignatures, bytesConsumed } = decodeShortVecLength(signedTx);\n\n if (numSignatures === 0) {\n throw new Error('No signatures found in serialized transaction');\n }\n\n // Extract first 64-byte signature after the shortvec prefix\n const signatureStart = bytesConsumed;\n return signedTx.slice(signatureStart, signatureStart + 64);\n }\n\n if (isWeb3jsTransaction(signedTx)) {\n // Extract from web3.js transaction object\n // Handle both { signature: Uint8Array | null } and raw Uint8Array formats\n const signatures = (signedTx as unknown as { signatures: Array<Uint8Array | { signature: Uint8Array | null }> })\n .signatures;\n\n if (!signatures || signatures.length === 0) {\n throw new Error('No signatures found in web3.js transaction');\n }\n\n const firstSig = signatures[0];\n\n // Handle raw Uint8Array\n if (firstSig instanceof Uint8Array) {\n return firstSig;\n }\n\n // Handle { signature: Uint8Array | null } format\n if (firstSig && typeof firstSig === 'object' && 'signature' in firstSig) {\n if (firstSig.signature) {\n return firstSig.signature;\n }\n }\n\n throw new Error('Could not extract signature from web3.js transaction');\n }\n\n throw new Error('Cannot extract signature from transaction format');\n}\n\n/**\n * Create a kit-compatible TransactionPartialSigner from connector-kit's TransactionSigner\n *\n * This adapter allows connector-kit to work with modern Solana libraries that use\n * @solana/kit's signer interfaces.\n *\n * @param connectorSigner - Connector-kit's TransactionSigner instance\n * @returns Kit-compatible TransactionModifyingSigner\n *\n * @example\n * ```typescript\n * import { createTransactionSigner } from '@solana/connector';\n * import { createKitTransactionSigner } from '@solana/connector';\n *\n * const connectorSigner = createTransactionSigner({ wallet, account });\n * const kitSigner = createKitTransactionSigner(connectorSigner);\n *\n * // Now compatible with @solana/kit libraries\n * const instruction = getTransferSolInstruction({\n * source: kitSigner,\n * destination: address('...'),\n * amount: 1000000n\n * });\n * ```\n */\nexport function createKitTransactionSigner<TAddress extends string = string>(\n connectorSigner: ConnectorTransactionSigner,\n): TransactionModifyingSigner<TAddress> {\n const signerAddress = createAddress(connectorSigner.address) as Address<TAddress>;\n\n return {\n address: signerAddress,\n\n async modifyAndSignTransactions(\n transactions: readonly (Transaction | (Transaction & TransactionWithLifetime))[],\n ): Promise<readonly (Transaction & TransactionWithinSizeLimit & TransactionWithLifetime)[]> {\n // Wallets need full wire format to simulate/display transactions\n // Format: [1-byte: num_sigs, ...64-byte sig slots, ...messageBytes]\n // Note: For single-signer transactions, num_sigs = 1 (encoded as 0x01)\n\n // Prepare transaction data for wallet signing\n const transactionData = transactions.map(tx => {\n const messageBytes = new Uint8Array(tx.messageBytes);\n // Derive the required signature count from the message header, not from the\n // current signature dictionary (which is often empty pre-signing).\n const { numSigners } = parseMessageSigners(messageBytes);\n\n // Create full transaction wire format for wallet\n const wireFormat = createTransactionBytesForSigning(messageBytes, numSigners);\n\n logger.debug('Preparing wire format for wallet', {\n signerAddress,\n messageBytesLength: messageBytes.length,\n wireFormatLength: wireFormat.length,\n structure: {\n numSigsByte: wireFormat[0],\n firstSigSlotPreview: Array.from(wireFormat.slice(1, 17)),\n messageBytesStart: wireFormat.length - messageBytes.length,\n },\n });\n\n return {\n originalTransaction: tx,\n messageBytes,\n wireFormat,\n };\n });\n\n // Send full wire format to wallet for signing\n const transactionsForWallet = transactionData.map(data => data.wireFormat);\n const signedTransactions = await connectorSigner.signAllTransactions(transactionsForWallet);\n\n // Extract signatures and return full Transaction objects\n return signedTransactions.map((signedTx, index) => {\n const { originalTransaction, wireFormat } = transactionData[index];\n\n try {\n // Get bytes from the signed transaction\n let signedTxBytes: Uint8Array;\n\n if (signedTx instanceof Uint8Array) {\n signedTxBytes = signedTx;\n } else if (isWeb3jsTransaction(signedTx)) {\n const txObj = signedTx as SerializableTransaction;\n if (typeof txObj.serialize === 'function') {\n signedTxBytes = txObj.serialize();\n } else {\n throw new Error('Web3.js transaction without serialize method');\n }\n } else {\n throw new Error('Unknown signed transaction format');\n }\n\n logger.debug('Wallet returned signed transaction', {\n returnedLength: signedTxBytes.length,\n sentLength: wireFormat.length,\n lengthsMatch: signedTxBytes.length === wireFormat.length,\n signedFirstBytes: Array.from(signedTxBytes.slice(0, 20)),\n sentFirstBytes: Array.from(wireFormat.slice(0, 20)),\n });\n\n // If wallet modified the transaction (different length), we MUST use the wallet's version\n // because the signature is computed over the MODIFIED messageBytes\n if (signedTxBytes.length !== wireFormat.length) {\n logger.warn('Wallet modified transaction! Using wallet version', {\n originalLength: wireFormat.length,\n modifiedLength: signedTxBytes.length,\n difference: signedTxBytes.length - wireFormat.length,\n });\n\n // Decode the wallet's signed transaction and use it entirely\n const decoder = getTransactionDecoder();\n const walletTransaction = decoder.decode(signedTxBytes);\n\n // Preserve lifetimeConstraint from original if present\n const originalWithLifetime =\n originalTransaction as TransactionWithOptionalLifetime<Transaction>;\n const result = {\n ...walletTransaction,\n ...(originalWithLifetime.lifetimeConstraint\n ? {\n lifetimeConstraint: originalWithLifetime.lifetimeConstraint,\n }\n : {}),\n };\n\n logger.debug('Using modified transaction from wallet', {\n modifiedMessageBytesLength: walletTransaction.messageBytes.length,\n signatures: Object.keys(walletTransaction.signatures),\n });\n\n // Assert transaction is within size limit (Kit 5.x requirement)\n assertIsTransactionWithinSizeLimit(result);\n return result as Transaction & TransactionWithinSizeLimit & TransactionWithLifetime;\n }\n\n // Wallet didn't modify - use original messageBytes with wallet signature\n const extractedSignatureBytes = extractSignature(signedTxBytes);\n // Convert to base58 for logging (signature is always 64 bytes)\n const base58Decoder = getBase58Decoder();\n const signatureBase58 = base58Decoder.decode(extractedSignatureBytes);\n\n logger.debug('Extracted signature from wallet (unmodified)', {\n signerAddress,\n signatureLength: extractedSignatureBytes.length,\n signatureBase58, // Human-readable signature for debugging/logging\n });\n\n // Cast the extracted bytes as SignatureBytes (we know it's 64 bytes from the wallet)\n const typedSignatureBytes = extractedSignatureBytes as SignatureBytes;\n\n const signedTransaction = {\n ...originalTransaction,\n signatures: Object.freeze({\n ...originalTransaction.signatures,\n [signerAddress]: typedSignatureBytes,\n }),\n };\n\n // Assert transaction is within size limit (Kit 5.x requirement)\n assertIsTransactionWithinSizeLimit(signedTransaction);\n return signedTransaction as Transaction & TransactionWithinSizeLimit & TransactionWithLifetime;\n } catch (error) {\n logger.error('Failed to decode signed transaction', { error });\n // Return original transaction with assertions if decode fails\n assertIsTransactionWithinSizeLimit(originalTransaction);\n return originalTransaction as Transaction & TransactionWithinSizeLimit & TransactionWithLifetime;\n }\n }) as readonly (Transaction & TransactionWithinSizeLimit & TransactionWithLifetime)[];\n },\n };\n}\n\n/**\n * @deprecated Use `createKitTransactionSigner` instead. This alias is provided for backward compatibility.\n */\nexport const createGillTransactionSigner = createKitTransactionSigner;\n"]}
|