{"version":3,"file":"eip1193-subscribe.cjs","names":[],"sources":["../../src/signer/eip1193-subscribe.ts"],"sourcesContent":["import {\n  getAddress as checksumAddress,\n  type Address,\n  type EIP1193EventMap,\n  type EIP1193Provider,\n} from \"viem\";\nimport type { WalletAccount, WalletAccountListener } from \"../types\";\n\ntype MinimalProvider = Pick<EIP1193Provider, \"on\" | \"removeListener\">;\n\nexport interface Eip1193SubscribeConfig {\n  provider: MinimalProvider | undefined;\n  getInitialWalletAccount?: () => WalletAccount | undefined | Promise<WalletAccount | undefined>;\n  onWalletAccountChange: WalletAccountListener;\n}\n\nfunction normalizeAddress(address: Address | undefined): Address | undefined {\n  if (!address) {\n    return undefined;\n  }\n  try {\n    return checksumAddress(address);\n  } catch {\n    return undefined;\n  }\n}\n\nfunction parseChainId(chainId: string): number | undefined {\n  const parsed = Number(chainId);\n  return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;\n}\n\n/**\n * Subscribe to EIP-1193 wallet events and translate them into\n * {@link WalletAccountChange} transitions.\n *\n * Shared by `ViemSigner` and `EthersSigner`. Listeners are attached before the\n * adapter's initial identity loader runs; if any real provider event arrives\n * first, the stale loader result is ignored.\n */\nexport function eip1193Subscribe({\n  provider,\n  getInitialWalletAccount,\n  onWalletAccountChange,\n}: Eip1193SubscribeConfig): () => void {\n  if (!provider) {\n    return () => {};\n  }\n\n  let current: WalletAccount | undefined;\n  let observedAddress: Address | undefined;\n  let observedChainId: number | undefined;\n  let active = true;\n  let eventVersion = 0;\n\n  function markEvent(): void {\n    eventVersion += 1;\n  }\n\n  function reconcile(): void {\n    if (!active) {\n      return;\n    }\n    const next =\n      observedAddress && observedChainId !== undefined\n        ? { address: observedAddress, chainId: observedChainId }\n        : undefined;\n    if (current?.address === next?.address && current?.chainId === next?.chainId) {\n      return;\n    }\n    const previous = current;\n    current = next;\n    onWalletAccountChange({ previous, next });\n  }\n\n  const handleAccountsChanged: EIP1193EventMap[\"accountsChanged\"] = (accounts) => {\n    markEvent();\n    if (accounts.length === 0 || !accounts[0]) {\n      observedAddress = undefined;\n      observedChainId = undefined;\n      reconcile();\n      return;\n    }\n\n    const nextAddress = normalizeAddress(accounts[0]);\n    if (!nextAddress) {\n      return;\n    }\n\n    observedAddress = nextAddress;\n    reconcile();\n  };\n\n  const handleDisconnect: EIP1193EventMap[\"disconnect\"] = () => {\n    markEvent();\n    observedAddress = undefined;\n    observedChainId = undefined;\n    reconcile();\n  };\n\n  const handleChainChanged: EIP1193EventMap[\"chainChanged\"] = (chainId) => {\n    markEvent();\n    const nextChainId = parseChainId(chainId);\n    if (!nextChainId) {\n      return;\n    }\n\n    observedChainId = nextChainId;\n    reconcile();\n  };\n\n  provider.on(\"accountsChanged\", handleAccountsChanged);\n  provider.on(\"disconnect\", handleDisconnect);\n  provider.on(\"chainChanged\", handleChainChanged);\n\n  if (getInitialWalletAccount) {\n    const initialEventVersion = eventVersion;\n    Promise.resolve()\n      .then(getInitialWalletAccount)\n      .then((account) => {\n        if (!active || eventVersion !== initialEventVersion) {\n          return;\n        }\n        current = account;\n        observedAddress = account?.address;\n        observedChainId = account?.chainId;\n        onWalletAccountChange({ previous: undefined, next: account });\n      })\n      .catch(() => {\n        // Best-effort initial identity load. The failure is non-fatal: real\n        // provider events reconcile wallet-account state, so it is swallowed\n        // silently rather than emitted to the console.\n      });\n  }\n\n  return () => {\n    active = false;\n    provider.removeListener(\"accountsChanged\", handleAccountsChanged);\n    provider.removeListener(\"disconnect\", handleDisconnect);\n    provider.removeListener(\"chainChanged\", handleChainChanged);\n  };\n}\n"],"mappings":"sBAgBA,SAAS,EAAiB,EAAmD,CACtE,KAGL,GAAI,CACF,OAAA,EAAA,EAAA,WAAA,CAAuB,CAAO,CAChC,MAAQ,CACN,MACF,CACF,CAEA,SAAS,EAAa,EAAqC,CACzD,IAAM,EAAS,OAAO,CAAO,EAC7B,OAAO,OAAO,cAAc,CAAM,GAAK,EAAS,EAAI,EAAS,IAAA,EAC/D,CAUA,SAAgB,EAAiB,CAC/B,WACA,0BACA,yBACqC,CACrC,GAAI,CAAC,EACH,UAAa,CAAC,EAGhB,IAAI,EACA,EACA,EACA,EAAS,GACT,EAAe,EAEnB,SAAS,GAAkB,CACzB,GAAgB,CAClB,CAEA,SAAS,GAAkB,CACzB,GAAI,CAAC,EACH,OAEF,IAAM,EACJ,GAAmB,IAAoB,IAAA,GACnC,CAAE,QAAS,EAAiB,QAAS,CAAgB,EACrD,IAAA,GACN,GAAI,GAAS,UAAY,GAAM,SAAW,GAAS,UAAY,GAAM,QACnE,OAEF,IAAM,EAAW,EACjB,EAAU,EACV,EAAsB,CAAE,WAAU,MAAK,CAAC,CAC1C,CAEA,IAAM,EAA6D,GAAa,CAE9E,GADA,EAAU,EACN,EAAS,SAAW,GAAK,CAAC,EAAS,GAAI,CACzC,EAAkB,IAAA,GAClB,EAAkB,IAAA,GAClB,EAAU,EACV,MACF,CAEA,IAAM,EAAc,EAAiB,EAAS,EAAE,EAC3C,IAIL,EAAkB,EAClB,EAAU,EACZ,EAEM,MAAwD,CAC5D,EAAU,EACV,EAAkB,IAAA,GAClB,EAAkB,IAAA,GAClB,EAAU,CACZ,EAEM,EAAuD,GAAY,CACvE,EAAU,EACV,IAAM,EAAc,EAAa,CAAO,EACnC,IAIL,EAAkB,EAClB,EAAU,EACZ,EAMA,GAJA,EAAS,GAAG,kBAAmB,CAAqB,EACpD,EAAS,GAAG,aAAc,CAAgB,EAC1C,EAAS,GAAG,eAAgB,CAAkB,EAE1C,EAAyB,CAC3B,IAAM,EAAsB,EAC5B,QAAQ,QAAQ,CAAC,CACd,KAAK,CAAuB,CAAC,CAC7B,KAAM,GAAY,CACb,CAAC,GAAU,IAAiB,IAGhC,EAAU,EACV,EAAkB,GAAS,QAC3B,EAAkB,GAAS,QAC3B,EAAsB,CAAE,SAAU,IAAA,GAAW,KAAM,CAAQ,CAAC,EAC9D,CAAC,CAAC,CACD,UAAY,CAIb,CAAC,CACL,CAEA,UAAa,CACX,EAAS,GACT,EAAS,eAAe,kBAAmB,CAAqB,EAChE,EAAS,eAAe,aAAc,CAAgB,EACtD,EAAS,eAAe,eAAgB,CAAkB,CAC5D,CACF"}