{"version":3,"file":"index.cjs","sources":["../src/constants/values.ts","../src/constants/events.ts","../src/utils/misc.ts","../src/utils/globals.ts","../src/utils/caip25.ts","../src/utils/storage.ts","../src/utils/eip5792.ts","../src/providers/eip155.ts","../src/providers/generic.ts","../src/UniversalProvider.ts","../src/index.ts"],"sourcesContent":["export const LOGGER = \"error\";\n\nexport const RELAY_URL = \"wss://relay.walletconnect.org\";\n\nexport const PROTOCOL = \"wc\";\nexport const WC_VERSION = 2;\nexport const CONTEXT = \"universal_provider\";\n\nexport const STORAGE = `${PROTOCOL}@${WC_VERSION}:${CONTEXT}:`;\n\nexport const RPC_URL = \"https://rpc.walletconnect.org/v1/\";\n\nexport const GENERIC_SUBPROVIDER_NAME = \"generic\";\n\nexport const BUNDLER_URL = `${RPC_URL}bundler`;\n\nexport const CALL_STATUS_STORAGE_KEY = \"call_status\";\n\nexport const CALL_STATUS_RESULT_EXPIRY = 86400; // 24 hours in seconds\n","export const PROVIDER_EVENTS = {\n  DEFAULT_CHAIN_CHANGED: \"default_chain_changed\",\n};\n","import { merge } from \"es-toolkit/compat\";\nimport { SessionTypes } from \"@walletconnect/types\";\nimport {\n  isCaipNamespace,\n  isValidObject,\n  mergeArrays,\n  parseChainId,\n  parseNamespaceKey,\n} from \"@walletconnect/utils\";\nimport { RPC_URL } from \"../constants/index.js\";\nimport { Namespace, NamespaceConfig } from \"../types/index.js\";\n\nexport function getRpcUrl(chainId: string, rpc: Namespace, projectId?: string): string | undefined {\n  const chain = parseChainId(chainId);\n  return (\n    rpc.rpcMap?.[chain.reference] ||\n    `${RPC_URL}?chainId=${chain.namespace}:${chain.reference}&projectId=${projectId}`\n  );\n}\n\nexport function getChainId(chain: string): string {\n  return chain.includes(\":\") ? chain.split(\":\")[1] : chain;\n}\n\nexport function validateChainApproval(chain: string, chains: string[]): void {\n  if (!chains.includes(chain)) {\n    throw new Error(\n      `Chain '${chain}' not approved. Please use one of the following: ${chains.toString()}`,\n    );\n  }\n}\n\nexport function getChainsFromApprovedSession(accounts: string[]): string[] {\n  return accounts.map((address) => `${address.split(\":\")[0]}:${address.split(\":\")[1]}`);\n}\n\nexport function getAccountsFromSession(namespace: string, session: SessionTypes.Struct): string[] {\n  // match namespaces e.g. eip155 with eip155:1\n  const matchedNamespaceKeys = Object.keys(session.namespaces).filter((key) =>\n    key.includes(namespace),\n  );\n  if (!matchedNamespaceKeys.length) return [];\n  const accounts: string[] = [];\n  matchedNamespaceKeys.forEach((key) => {\n    const accountsForNamespace = session.namespaces[key].accounts;\n    accounts.push(...accountsForNamespace);\n  });\n  return accounts;\n}\n\nexport function filterNamespacesWithNoChains(namespaces: NamespaceConfig): NamespaceConfig {\n  return Object.fromEntries(\n    Object.entries(namespaces).filter(([_, ns]) => ns?.chains?.length && ns?.chains?.length > 0),\n  );\n}\n\nexport function mergeRequiredOptionalNamespaces(\n  required: NamespaceConfig = {},\n  optional: NamespaceConfig = {},\n) {\n  const requiredNamespaces = filterNamespacesWithNoChains(normalizeNamespaces(required));\n  const optionalNamespaces = filterNamespacesWithNoChains(normalizeNamespaces(optional));\n  return merge(requiredNamespaces, optionalNamespaces);\n}\n\n/**\n * Converts\n * {\n *  \"eip155:1\": {...},\n *  \"eip155:2\": {...},\n * }\n * into\n * {\n *  \"eip155\": {\n *      chains: [\"eip155:1\", \"eip155:2\"],\n *      ...\n *    }\n * }\n *\n */\nexport function normalizeNamespaces(namespaces: NamespaceConfig): NamespaceConfig {\n  const normalizedNamespaces: NamespaceConfig = {};\n  if (!isValidObject(namespaces)) return normalizedNamespaces;\n\n  for (const [key, values] of Object.entries(namespaces)) {\n    const chains = isCaipNamespace(key) ? [key] : values.chains;\n    const methods = values.methods || [];\n    const events = values.events || [];\n    const rpcMap = values.rpcMap || {};\n    const normalizedKey = parseNamespaceKey(key);\n    normalizedNamespaces[normalizedKey] = {\n      ...normalizedNamespaces[normalizedKey],\n      ...values,\n      chains: mergeArrays(chains, normalizedNamespaces[normalizedKey]?.chains),\n      methods: mergeArrays(methods, normalizedNamespaces[normalizedKey]?.methods),\n      events: mergeArrays(events, normalizedNamespaces[normalizedKey]?.events),\n    };\n    // avoid adding empty `rpcMap: {}` if there are no values for it\n    if (isValidObject(rpcMap) || isValidObject(normalizedNamespaces[normalizedKey]?.rpcMap || {})) {\n      normalizedNamespaces[normalizedKey].rpcMap = {\n        ...rpcMap,\n        ...normalizedNamespaces[normalizedKey]?.rpcMap,\n      };\n    }\n  }\n  return normalizedNamespaces;\n}\n\nexport function parseCaip10Account(caip10Account: string): string {\n  return caip10Account.includes(\":\") ? caip10Account.split(\":\")[2] : caip10Account;\n}\n\n/**\n * Populates the chains array for each namespace with the chains extracted from the accounts if are otherwise missing\n */\nexport function populateNamespacesChains(\n  namespaces: SessionTypes.Namespaces,\n): Record<string, SessionTypes.Namespace> {\n  const parsedNamespaces: Record<string, SessionTypes.Namespace> = {};\n  for (const [key, values] of Object.entries(namespaces)) {\n    const methods = values.methods || [];\n    const events = values.events || [];\n    const accounts = values.accounts || [];\n    // If the key includes a CAIP separator `:` we know it's a namespace + chainId (e.g. `eip155:1`)\n    const chains = isCaipNamespace(key)\n      ? [key]\n      : values.chains\n        ? values.chains\n        : getChainsFromApprovedSession(values.accounts);\n    parsedNamespaces[key] = {\n      chains,\n      methods,\n      events,\n      accounts,\n    };\n  }\n  return parsedNamespaces;\n}\n\nexport function convertChainIdToNumber(chainId: string | number): number | string {\n  if (typeof chainId === \"number\") return chainId;\n  if (chainId.includes(\"0x\")) {\n    return parseInt(chainId, 16);\n  }\n\n  chainId = chainId.includes(\":\") ? chainId.split(\":\")[1] : chainId;\n  return isNaN(Number(chainId)) ? chainId : Number(chainId);\n}\n\nexport function isValidJSONObject(str: string): boolean {\n  try {\n    const parsed = JSON.parse(str);\n    return typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed);\n  } catch {\n    return false;\n  }\n}\n","const globals = {};\nexport const getGlobal = (key: string) => {\n  return globals[key];\n};\n\nexport const setGlobal = (key: string, value: unknown) => {\n  globals[key] = value;\n};\n","import { SessionTypes } from \"@walletconnect/types\";\nimport { isValidObject } from \"@walletconnect/utils\";\n\nimport { isValidJSONObject } from \"./misc.js\";\n\nconst EIP155_PREFIX = \"eip155\";\nconst CAPABILITIES_KEYS = [\n  \"atomic\",\n  \"flow-control\",\n  \"paymasterService\",\n  \"sessionKeys\",\n  \"auxiliaryFunds\",\n];\n\nconst hexToDecimal = (hex?: string) => {\n  return hex && hex.startsWith(\"0x\") ? BigInt(hex).toString(10) : hex;\n};\n\nconst decimalToHex = (decimal: string) => {\n  return decimal && decimal.startsWith(\"0x\") ? decimal : `0x${BigInt(decimal).toString(16)}`;\n};\n\nconst getCapabilitiesFromObject = (object: Record<string, any>) => {\n  const capabilitiesKeys = Object.keys(object).filter((item) => CAPABILITIES_KEYS.includes(item));\n\n  return capabilitiesKeys.reduce(\n    (acc, key) => {\n      acc[key] = parseCapabilityValue(object[key]);\n      return acc;\n    },\n    {} as Record<string, any>,\n  );\n};\n\nconst parseCapabilityValue = (value: any) => {\n  if (typeof value === \"string\" && isValidJSONObject(value)) {\n    return JSON.parse(value);\n  }\n  return value;\n};\n\nexport const extractCapabilitiesFromSession = (\n  session: SessionTypes.Struct,\n  address: string,\n  chainIds: string[],\n) => {\n  const { sessionProperties = {}, scopedProperties = {} } = session;\n  const result: Record<string, any> = {};\n\n  if (!isValidObject(scopedProperties) && !isValidObject(sessionProperties)) {\n    return;\n  }\n\n  // get all capabilities from sessionProperties as they apply to all chains/addresses\n  const globalCapabilities = getCapabilitiesFromObject(sessionProperties);\n\n  for (const chain of chainIds) {\n    const chainId = hexToDecimal(chain);\n    if (!chainId) {\n      continue;\n    }\n\n    result[decimalToHex(chainId)] = globalCapabilities;\n\n    const chainSpecific = scopedProperties?.[`${EIP155_PREFIX}:${chainId}`];\n\n    if (chainSpecific) {\n      const addressSpecific = chainSpecific?.[`${EIP155_PREFIX}:${chainId}:${address}`];\n\n      // use the address specific capabilities if they exist, otherwise use the chain specific capabilities\n      result[decimalToHex(chainId)] = {\n        ...result[decimalToHex(chainId)],\n        ...getCapabilitiesFromObject(addressSpecific || chainSpecific),\n      };\n    }\n  }\n\n  // remove any chains that have no capabilities\n  for (const [key, value] of Object.entries(result)) {\n    if (Object.keys(value).length === 0) {\n      delete result[key];\n    }\n  }\n\n  return Object.keys(result).length > 0 ? result : undefined;\n};\n","import { IKeyValueStorage } from \"@walletconnect/keyvaluestorage\";\n\nlet storage: Storage;\n\nexport class Storage {\n  private storage: IKeyValueStorage;\n  constructor(storage: IKeyValueStorage) {\n    this.storage = storage;\n  }\n\n  async getItem<T>(key: string): Promise<T | undefined> {\n    return await this.storage.getItem<T>(key);\n  }\n\n  async setItem<T>(key: string, value: T) {\n    return await this.storage.setItem(key, value);\n  }\n\n  async removeItem(key: string) {\n    return await this.storage.removeItem(key);\n  }\n\n  static getStorage(kvStorage: IKeyValueStorage) {\n    if (!storage) {\n      storage = new Storage(kvStorage);\n    }\n    return storage;\n  }\n}\n","import { calcExpiry, isExpired, parseChainId } from \"@walletconnect/utils\";\nimport { formatJsonRpcRequest } from \"@walletconnect/jsonrpc-utils\";\nimport JsonRpcProvider from \"@walletconnect/jsonrpc-provider\";\n\nimport { StoredSendCalls, StoreSendCallsParams } from \"../types/index.js\";\nimport { CALL_STATUS_RESULT_EXPIRY, CALL_STATUS_STORAGE_KEY } from \"../constants/index.js\";\nimport { Storage } from \"./storage.js\";\n\nexport async function prepareCallStatusFromStoredSendCalls(\n  storedSendCalls: StoredSendCalls,\n  getHttpProvider: (chainId: number) => JsonRpcProvider,\n) {\n  const chainId = parseChainId(storedSendCalls.result.capabilities.caip345.caip2);\n  const hashes = storedSendCalls.result.capabilities.caip345.transactionHashes;\n  const allPromises = await Promise.allSettled(\n    hashes.map((hash) => getTransactionReceipt(chainId.reference, hash, getHttpProvider)),\n  );\n  const receipts = allPromises\n    .filter((r) => r.status === \"fulfilled\")\n    .map((r) => r.value)\n    .filter((r) => r);\n\n  // log failed transactions\n  allPromises\n    .filter((r) => r.status === \"rejected\")\n    .forEach((r) => console.warn(\"Failed to fetch transaction receipt:\", r.reason));\n\n  const someReceiptsPending = !receipts.length || receipts.some((r) => !r);\n  const allReceiptsSuccessful = receipts.every((r) => r?.status === \"0x1\");\n  const allReceiptsFailed = receipts.every((r) => r?.status === \"0x0\");\n  const someReceiptsFailed = receipts.some((r) => r?.status === \"0x0\");\n\n  let status;\n  if (someReceiptsPending) {\n    //100 = some pending\n    status = 100;\n  } else if (allReceiptsSuccessful) {\n    // 200 = all successful\n    status = 200;\n  } else if (allReceiptsFailed) {\n    // 500 = all failed\n    status = 500;\n  } else if (someReceiptsFailed) {\n    // 600 = some failures\n    status = 600;\n  }\n\n  return {\n    id: storedSendCalls.result.id,\n    version: storedSendCalls.request.version,\n    atomic: storedSendCalls.request.atomicRequired,\n    chainId: storedSendCalls.request.chainId,\n    capabilities: storedSendCalls.result.capabilities,\n    receipts,\n    status,\n  };\n}\n\nexport async function getTransactionReceipt(\n  chainId: string,\n  transactionHash: string,\n  getHttpProvider: (chainId: number) => JsonRpcProvider,\n) {\n  return await getHttpProvider(parseInt(chainId)).request(\n    formatJsonRpcRequest(\"eth_getTransactionReceipt\", [transactionHash]),\n  );\n}\n\nexport async function storeSendCalls({\n  sendCalls,\n  storage,\n}: {\n  sendCalls: StoreSendCallsParams;\n  storage: Storage;\n}) {\n  const sendCallsStatusResults =\n    await storage.getItem<Record<string, StoredSendCalls>>(CALL_STATUS_STORAGE_KEY);\n\n  await storage.setItem(CALL_STATUS_STORAGE_KEY, {\n    ...sendCallsStatusResults,\n    [sendCalls.result.id]: {\n      request: sendCalls.request,\n      result: sendCalls.result,\n      expiry: calcExpiry(CALL_STATUS_RESULT_EXPIRY),\n    },\n  });\n}\n\nexport async function deleteSendCallsResult({\n  resultId,\n  storage,\n}: {\n  resultId: string;\n  storage: Storage;\n}) {\n  const sendCallsStatusResults =\n    await storage.getItem<Record<string, StoredSendCalls>>(CALL_STATUS_STORAGE_KEY);\n  if (!sendCallsStatusResults) return;\n\n  delete sendCallsStatusResults[resultId];\n  await storage.setItem(CALL_STATUS_STORAGE_KEY, sendCallsStatusResults);\n\n  // delete old expired results\n  for (const resultId in sendCallsStatusResults) {\n    if (isExpired(sendCallsStatusResults[resultId].expiry)) {\n      delete sendCallsStatusResults[resultId];\n    }\n  }\n  await storage.setItem(CALL_STATUS_STORAGE_KEY, sendCallsStatusResults);\n}\n\nexport async function getStoredSendCalls({\n  resultId,\n  storage,\n}: {\n  resultId: string;\n  storage: Storage;\n}): Promise<StoredSendCalls | undefined> {\n  const storedSendCalls =\n    await storage.getItem<Record<string, StoredSendCalls>>(CALL_STATUS_STORAGE_KEY);\n\n  const result = storedSendCalls?.[resultId];\n  if (result && !isExpired(result.expiry)) {\n    return result;\n  } else {\n    await deleteSendCallsResult({ resultId, storage });\n  }\n\n  return undefined;\n}\n","import Client from \"@walletconnect/sign-client\";\nimport { JsonRpcProvider } from \"@walletconnect/jsonrpc-provider\";\nimport { HttpConnection } from \"@walletconnect/jsonrpc-http-connection\";\nimport { EngineTypes, SessionTypes } from \"@walletconnect/types\";\nimport { formatJsonRpcRequest } from \"@walletconnect/jsonrpc-utils\";\n\nimport {\n  IProvider,\n  RpcProvidersMap,\n  SubProviderOpts,\n  RequestParams,\n  SessionNamespace,\n  SendCallsResult,\n} from \"../types/index.js\";\n\nimport {\n  extractCapabilitiesFromSession,\n  getChainId,\n  getGlobal,\n  getRpcUrl,\n  getStoredSendCalls,\n  prepareCallStatusFromStoredSendCalls,\n  Storage,\n  storeSendCalls,\n} from \"../utils/index.js\";\nimport EventEmitter from \"events\";\nimport { BUNDLER_URL, PROVIDER_EVENTS } from \"../constants/index.js\";\n\nclass Eip155Provider implements IProvider {\n  public name = \"eip155\";\n  public client: Client;\n  // the active chainId on the dapp\n  public chainId: number;\n  public namespace: SessionNamespace;\n  public httpProviders: RpcProvidersMap;\n  public events: EventEmitter;\n  public storage: Storage;\n\n  constructor(opts: SubProviderOpts) {\n    this.namespace = opts.namespace;\n    this.events = getGlobal(\"events\");\n    this.client = getGlobal(\"client\");\n    this.httpProviders = this.createHttpProviders();\n    this.chainId = parseInt(this.getDefaultChain());\n    this.storage = Storage.getStorage(this.client.core.storage);\n  }\n\n  public async request<T = unknown>(args: RequestParams): Promise<T> {\n    switch (args.request.method) {\n      case \"eth_requestAccounts\":\n        return this.getAccounts() as unknown as T;\n      case \"eth_accounts\":\n        return this.getAccounts() as unknown as T;\n      case \"wallet_switchEthereumChain\": {\n        return (await this.handleSwitchChain(args)) as unknown as T;\n      }\n      case \"eth_chainId\":\n        return parseInt(this.getDefaultChain()) as unknown as T;\n      case \"wallet_getCapabilities\":\n        return (await this.getCapabilities(args)) as unknown as T;\n      case \"wallet_getCallsStatus\":\n        return (await this.getCallStatus(args)) as unknown as T;\n      case \"wallet_sendCalls\":\n        return (await this.sendCalls(args)) as unknown as T;\n      default:\n        break;\n    }\n    if (this.namespace.methods.includes(args.request.method)) {\n      return await this.client.request(args as EngineTypes.RequestParams);\n    }\n    return this.getHttpProvider().request(args.request);\n  }\n\n  public updateNamespace(namespace: SessionTypes.Namespace) {\n    this.namespace = Object.assign(this.namespace, namespace);\n  }\n\n  public setDefaultChain(chainId: string, rpcUrl?: string | undefined) {\n    // http provider exists so just set the chainId\n    if (!this.httpProviders[chainId]) {\n      this.setHttpProvider(parseInt(chainId), rpcUrl);\n    }\n    const previous = this.chainId;\n    this.chainId = parseInt(chainId);\n    this.events.emit(PROVIDER_EVENTS.DEFAULT_CHAIN_CHANGED, {\n      currentCaipChainId: `${this.name}:${chainId}`,\n      previousCaipChainId: `${this.name}:${previous}`,\n    });\n  }\n\n  public requestAccounts(): string[] {\n    return this.getAccounts();\n  }\n\n  public getDefaultChain(): string {\n    if (this.chainId) return this.chainId.toString();\n    if (this.namespace.defaultChain) return this.namespace.defaultChain;\n\n    const chainId = this.namespace.chains[0];\n    if (!chainId) throw new Error(`ChainId not found`);\n\n    return chainId.split(\":\")[1];\n  }\n\n  // ---------- Private ----------------------------------------------- //\n\n  private createHttpProvider(\n    chainId: number,\n    rpcUrl?: string | undefined,\n  ): JsonRpcProvider | undefined {\n    const rpc =\n      rpcUrl || getRpcUrl(`${this.name}:${chainId}`, this.namespace, this.client.core.projectId);\n    if (!rpc) {\n      throw new Error(`No RPC url provided for chainId: ${chainId}`);\n    }\n    const http = new JsonRpcProvider(new HttpConnection(rpc, getGlobal(\"disableProviderPing\")));\n    return http;\n  }\n\n  private setHttpProvider(chainId: number, rpcUrl?: string): void {\n    const http = this.createHttpProvider(chainId, rpcUrl);\n    if (http) {\n      this.httpProviders[chainId] = http;\n    }\n  }\n\n  private createHttpProviders(): RpcProvidersMap {\n    const http = {};\n    this.namespace.chains.forEach((chain) => {\n      const parsedChain = parseInt(getChainId(chain));\n      http[parsedChain] = this.createHttpProvider(parsedChain, this.namespace.rpcMap?.[chain]);\n    });\n    return http;\n  }\n\n  private getAccounts(): string[] {\n    const accounts = this.namespace.accounts;\n    if (!accounts) {\n      return [];\n    }\n    return [\n      ...new Set(\n        accounts\n          // get the accounts from the active chain\n          .filter((account) => account.split(\":\")[1] === this.chainId.toString())\n          // remove namespace & chainId from the string\n          .map((account) => account.split(\":\")[2]),\n      ),\n    ];\n  }\n\n  private getHttpProvider(chainId?: number): JsonRpcProvider {\n    const chain = chainId || this.chainId;\n    const http = this.httpProviders[chain];\n    if (http) {\n      return http;\n    }\n\n    this.httpProviders = {\n      ...this.httpProviders,\n      [chain]: this.createHttpProvider(chain),\n    };\n    return this.httpProviders[chain];\n  }\n\n  private async handleSwitchChain(args: RequestParams): Promise<any> {\n    let hexChainId = args.request.params ? args.request.params[0]?.chainId : \"0x0\";\n    hexChainId = hexChainId.startsWith(\"0x\") ? hexChainId : `0x${hexChainId}`;\n    const parsedChainId = parseInt(hexChainId, 16);\n    // if chainId is already approved, switch locally\n    if (this.isChainApproved(parsedChainId)) {\n      this.setDefaultChain(`${parsedChainId}`);\n    } else if (this.namespace.methods.includes(\"wallet_switchEthereumChain\")) {\n      // try to switch chain within the wallet\n      await this.client.request({\n        topic: args.topic,\n        request: {\n          method: args.request.method,\n          params: [\n            {\n              chainId: hexChainId,\n            },\n          ],\n        },\n        chainId: this.namespace.chains?.[0], // Sending a previously unapproved chainId will cause namespace validation failure so we must set request chainId to the first chainId in the namespace to avoid it\n      } as EngineTypes.RequestParams);\n      this.setDefaultChain(`${parsedChainId}`);\n    } else {\n      throw new Error(\n        `Failed to switch to chain 'eip155:${parsedChainId}'. The chain is not approved or the wallet does not support 'wallet_switchEthereumChain' method.`,\n      );\n    }\n    return null;\n  }\n\n  private isChainApproved(chainId: number): boolean {\n    return this.namespace.chains.includes(`${this.name}:${chainId}`);\n  }\n\n  /**\n   * util method to get the capabilities for given address and chainIds from the wallet\n   * 1. check if the capabilities are stored in the sessionProperties legacy way - address+chainIds for backwards compatibility\n   * 2. check if the capabilities are stored in the sessionProperties\n   * 3. check if the capabilities are stored in the scopedProperties\n   * 4. if not, send the request to the wallet\n   * 5. update the session with the capabilities so they can be retrieved later\n   * 6. return the capabilities\n   */\n  private async getCapabilities(args: RequestParams) {\n    // if capabilities are stored in the session, return them, else send the request to the wallet\n    const address = args.request?.params?.[0];\n    const chainIds: string[] = args.request?.params?.[1] || [];\n\n    if (!address) throw new Error(\"Missing address parameter in `wallet_getCapabilities` request\");\n    const session = this.client.session.get(args.topic);\n    const sessionCapabilities = session?.sessionProperties?.capabilities || {};\n\n    // cache key is address + chainIds to allow requests to be made to different chains\n    // when no chainIds are provided, use the current active chainId to ensure\n    // cache is invalidated when switching chains\n    const cacheChainKey =\n      chainIds.length > 0 ? chainIds.join(\",\") : `0x${this.chainId.toString(16)}`;\n    const capabilitiesKey = `${address}${cacheChainKey}`;\n\n    const legacyCapabilities = sessionCapabilities?.[capabilitiesKey];\n    if (legacyCapabilities) {\n      return legacyCapabilities;\n    }\n    let cachedCapabilities;\n    try {\n      cachedCapabilities = extractCapabilitiesFromSession(session, address, chainIds);\n    } catch (error) {\n      console.warn(\"Failed to extract capabilities from session\", error);\n    }\n\n    if (cachedCapabilities) {\n      return cachedCapabilities;\n    }\n\n    // intentionally omit catching errors/rejection during `request` to allow the error to bubble up\n    const capabilities = await this.client.request(args as EngineTypes.RequestParams);\n    try {\n      // update the session with the capabilities so they can be retrieved later\n      await this.client.session.update(args.topic, {\n        sessionProperties: {\n          ...(session.sessionProperties || {}),\n          capabilities: {\n            ...(sessionCapabilities || {}),\n            [capabilitiesKey]: capabilities,\n          } as any, // by spec sessionProperties should be <string, string> but here are used as objects?\n        },\n      });\n    } catch (error) {\n      console.warn(\"Failed to update session with capabilities\", error);\n    }\n    return capabilities;\n  }\n\n  private async getCallStatus(args: RequestParams) {\n    const session = this.client.session.get(args.topic);\n    const bundlerName = session.sessionProperties?.bundler_name as string;\n    if (bundlerName) {\n      const bundlerUrl = this.getBundlerUrl(args.chainId, bundlerName);\n      try {\n        return await this.getUserOperationReceipt(bundlerUrl, args);\n      } catch (error) {\n        console.warn(\"Failed to fetch call status from bundler\", error, bundlerUrl);\n      }\n    }\n    const customUrl = session.sessionProperties?.bundler_url as string;\n    if (customUrl) {\n      try {\n        return await this.getUserOperationReceipt(customUrl, args);\n      } catch (error) {\n        console.warn(\"Failed to fetch call status from custom bundler\", error, customUrl);\n      }\n    }\n\n    const storedSendCalls = await getStoredSendCalls({\n      resultId: args.request.params?.[0] as string,\n      storage: this.storage,\n    });\n    if (storedSendCalls) {\n      try {\n        return await prepareCallStatusFromStoredSendCalls(\n          storedSendCalls,\n          this.getHttpProvider.bind(this),\n        );\n      } catch (error) {\n        console.warn(\"Failed to fetch call status from stored send calls\", error, storedSendCalls);\n      }\n    }\n\n    if (this.namespace.methods.includes(args.request.method)) {\n      return await this.client.request(args as EngineTypes.RequestParams);\n    }\n\n    throw new Error(\"Fetching call status not approved by the wallet.\");\n  }\n\n  private async getUserOperationReceipt(bundlerUrl: string, args: RequestParams) {\n    const url = new URL(bundlerUrl);\n    const response = await fetch(url, {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify(\n        formatJsonRpcRequest(\"eth_getUserOperationReceipt\", [args.request.params?.[0]]),\n      ),\n    });\n    if (!response.ok) {\n      throw new Error(`Failed to fetch user operation receipt - ${response.status}`);\n    }\n    return await response.json();\n  }\n\n  private getBundlerUrl(cap2ChainId: string, bundlerName: string) {\n    return `${BUNDLER_URL}?projectId=${this.client.core.projectId}&chainId=${cap2ChainId}&bundler=${bundlerName}`;\n  }\n\n  private async sendCalls(args: RequestParams) {\n    const result = await this.client.request<SendCallsResult>(args as EngineTypes.RequestParams);\n    const sendCallsParams = args.request.params?.[0];\n    const resultId = result?.id;\n    const capabilities = result?.capabilities || {};\n    const caip2 = capabilities?.caip345?.caip2;\n    const transactionHashes = capabilities?.caip345?.transactionHashes;\n\n    if (!resultId || !caip2 || !transactionHashes?.length) {\n      return result;\n    }\n\n    await storeSendCalls({\n      sendCalls: { request: sendCallsParams, result },\n      storage: this.storage,\n    });\n    return result;\n  }\n}\n\nexport default Eip155Provider;\n","import HttpConnection from \"@walletconnect/jsonrpc-http-connection\";\nimport { JsonRpcProvider } from \"@walletconnect/jsonrpc-provider\";\nimport Client from \"@walletconnect/sign-client\";\nimport { EngineTypes, SessionTypes } from \"@walletconnect/types\";\nimport EventEmitter from \"events\";\nimport { GENERIC_SUBPROVIDER_NAME, PROVIDER_EVENTS } from \"../constants/index.js\";\nimport {\n  IProvider,\n  RequestParams,\n  RpcProvidersMap,\n  SessionNamespace,\n  SubProviderOpts,\n} from \"../types/index.js\";\nimport { getGlobal, getRpcUrl } from \"../utils/index.js\";\nimport { parseChainId } from \"@walletconnect/utils\";\n\nclass GenericProvider implements IProvider {\n  public name = GENERIC_SUBPROVIDER_NAME;\n  public client: Client;\n  public httpProviders: RpcProvidersMap;\n  public events: EventEmitter;\n  public namespace: SessionNamespace;\n  public chainId: string;\n\n  constructor(opts: SubProviderOpts) {\n    this.namespace = opts.namespace;\n    this.events = getGlobal(\"events\");\n    this.client = getGlobal(\"client\");\n    this.chainId = this.getDefaultChain();\n    this.name = this.getNamespaceName();\n    this.httpProviders = this.createHttpProviders();\n  }\n\n  public updateNamespace(namespace: SessionTypes.Namespace) {\n    this.namespace.chains = [\n      ...new Set((this.namespace.chains || []).concat(namespace.chains || [])),\n    ];\n    this.namespace.accounts = [\n      ...new Set((this.namespace.accounts || []).concat(namespace.accounts || [])),\n    ];\n    this.namespace.methods = [\n      ...new Set((this.namespace.methods || []).concat(namespace.methods || [])),\n    ];\n    this.namespace.events = [\n      ...new Set((this.namespace.events || []).concat(namespace.events || [])),\n    ];\n    this.httpProviders = this.createHttpProviders();\n  }\n\n  public requestAccounts(): string[] {\n    return this.getAccounts();\n  }\n\n  public request<T = unknown>(args: RequestParams): Promise<T> {\n    if (this.namespace.methods.includes(args.request.method)) {\n      return this.client.request(args as EngineTypes.RequestParams);\n    }\n    return this.getHttpProvider(args.chainId).request(args.request);\n  }\n\n  public setDefaultChain(chainId: string, rpcUrl?: string | undefined) {\n    // http provider exists so just set the chainId\n    if (!this.httpProviders[chainId]) {\n      this.setHttpProvider(chainId, rpcUrl);\n    }\n    const previous = this.chainId;\n    this.chainId = chainId;\n    this.events.emit(PROVIDER_EVENTS.DEFAULT_CHAIN_CHANGED, {\n      currentCaipChainId: `${this.name}:${chainId}`,\n      previousCaipChainId: `${this.name}:${previous}`,\n    });\n  }\n\n  public getDefaultChain(): string {\n    if (this.chainId) return this.chainId;\n    if (this.namespace.defaultChain) return this.namespace.defaultChain;\n\n    const chainId = this.namespace.chains[0];\n    if (!chainId) throw new Error(`ChainId not found`);\n\n    return chainId.split(\":\")[1];\n  }\n\n  public getNamespaceName(): string {\n    const chainId = this.namespace.chains[0];\n    if (!chainId) throw new Error(`ChainId not found`);\n\n    return parseChainId(chainId).namespace;\n  }\n\n  // --------- PRIVATE --------- //\n\n  private getAccounts(): string[] {\n    const accounts = this.namespace.accounts;\n    if (!accounts) {\n      return [];\n    }\n\n    return [\n      ...new Set(\n        accounts\n          // get the accounts from the active chain\n          .filter((account) => account.split(\":\")[1] === this.chainId.toString())\n          // remove namespace & chainId from the string\n          .map((account) => account.split(\":\")[2]),\n      ),\n    ];\n  }\n\n  private createHttpProviders(): RpcProvidersMap {\n    const http = {};\n    this.namespace?.accounts?.forEach((account) => {\n      const chain = parseChainId(account);\n      const customRpcUrl = this.namespace?.rpcMap?.[`${chain.namespace}:${chain.reference}`];\n      http[chain.reference] = this.createHttpProvider(account, customRpcUrl);\n    });\n    return http;\n  }\n\n  private getHttpProvider(chain: string): JsonRpcProvider {\n    const chainReference = parseChainId(chain).reference;\n    const http = this.httpProviders[chainReference];\n    if (typeof http === \"undefined\") {\n      throw new Error(`JSON-RPC provider for ${chain} not found`);\n    }\n    return http;\n  }\n\n  private setHttpProvider(chainId: string, rpcUrl?: string): void {\n    const http = this.createHttpProvider(chainId, rpcUrl);\n    if (http) {\n      this.httpProviders[chainId] = http;\n    }\n  }\n\n  private createHttpProvider(chainId: string, rpcUrl?: string): JsonRpcProvider | undefined {\n    const rpc = rpcUrl || getRpcUrl(chainId, this.namespace, this.client.core.projectId);\n    if (!rpc) {\n      throw new Error(`No RPC url provided for chainId: ${chainId}`);\n    }\n    const http = new JsonRpcProvider(new HttpConnection(rpc, getGlobal(\"disableProviderPing\")));\n    return http;\n  }\n}\n\nexport default GenericProvider;\n","import { SignClient } from \"@walletconnect/sign-client\";\nimport { SessionTypes } from \"@walletconnect/types\";\nimport { JsonRpcResult } from \"@walletconnect/jsonrpc-types\";\nimport { createLogger, getSdkError, isValidArray, parseNamespaceKey } from \"@walletconnect/utils\";\nimport { Logger } from \"@walletconnect/logger\";\n\nimport {\n  convertChainIdToNumber,\n  getAccountsFromSession,\n  getChainsFromApprovedSession,\n  mergeRequiredOptionalNamespaces,\n  parseCaip10Account,\n  populateNamespacesChains,\n  setGlobal,\n} from \"./utils/index.js\";\nimport Eip155Provider from \"./providers/eip155.js\";\nimport GenericProvider from \"./providers/generic.js\";\n\nimport {\n  IUniversalProvider,\n  IProvider,\n  RpcProviderMap,\n  ConnectParams,\n  RequestArguments,\n  UniversalProviderOpts,\n  NamespaceConfig,\n  PairingsCleanupOpts,\n  ProviderAccounts,\n  AuthenticateParams,\n  DefaultChainChanged,\n  OnChainChanged,\n  EmitAccountsChangedOnChainChange,\n} from \"./types/index.js\";\n\nimport {\n  RELAY_URL,\n  LOGGER,\n  STORAGE,\n  PROVIDER_EVENTS,\n  GENERIC_SUBPROVIDER_NAME,\n  CONTEXT,\n} from \"./constants/index.js\";\nimport EventEmitter from \"events\";\nimport { formatJsonRpcResult } from \"@walletconnect/jsonrpc-utils\";\n\nexport class UniversalProvider implements IUniversalProvider {\n  public client!: InstanceType<typeof SignClient>;\n  public namespaces?: NamespaceConfig;\n  public optionalNamespaces?: NamespaceConfig;\n  public sessionProperties?: SessionTypes.SessionProperties;\n  public scopedProperties?: SessionTypes.ScopedProperties;\n  public events: EventEmitter = new EventEmitter();\n  public rpcProviders: RpcProviderMap = {};\n  public session?: SessionTypes.Struct;\n  public providerOpts: UniversalProviderOpts;\n  public logger: Logger;\n  public uri: string | undefined;\n\n  private disableProviderPing = false;\n  private connectParams?: ConnectParams;\n\n  static async init(opts: UniversalProviderOpts) {\n    const provider = new UniversalProvider(opts);\n    await provider.initialize();\n    return provider;\n  }\n\n  constructor(opts: UniversalProviderOpts) {\n    this.providerOpts = opts;\n    this.logger = createLogger({\n      logger: opts.logger ?? LOGGER,\n      name: this.providerOpts.name ?? CONTEXT,\n    });\n    this.disableProviderPing = opts?.disableProviderPing || false;\n  }\n\n  public async request<T = unknown>(\n    args: RequestArguments,\n    chain?: string | undefined,\n    expiry?: number | undefined,\n  ): Promise<T> {\n    const [namespace, chainId] = this.validateChain(chain);\n\n    if (!this.session) {\n      throw new Error(\"Please call connect() before request()\");\n    }\n    return (await this.getProvider(namespace).request({\n      request: {\n        ...args,\n      },\n      chainId: `${namespace}:${chainId}`,\n      topic: this.session.topic,\n      expiry,\n    })) as T;\n  }\n\n  public sendAsync(\n    args: RequestArguments,\n    callback: (error: Error | null, response: JsonRpcResult) => void,\n    chain?: string | undefined,\n    expiry?: number | undefined,\n  ): void {\n    const id = new Date().getTime();\n    this.request(args, chain, expiry)\n      .then((response) => callback(null, formatJsonRpcResult(id, response)))\n      .catch((error) => callback(error, undefined as any));\n  }\n\n  public async enable(): Promise<ProviderAccounts> {\n    if (!this.client) {\n      throw new Error(\"Sign Client not initialized\");\n    }\n    if (!this.session) {\n      await this.connect({\n        namespaces: this.namespaces,\n        optionalNamespaces: this.optionalNamespaces,\n        sessionProperties: this.sessionProperties,\n        scopedProperties: this.scopedProperties,\n      });\n    }\n    const accounts = await this.requestAccounts();\n    return accounts as ProviderAccounts;\n  }\n\n  public async disconnect(): Promise<void> {\n    if (!this.session) {\n      throw new Error(\"Please call connect() before enable()\");\n    }\n    await this.client.disconnect({\n      topic: this.session?.topic,\n      reason: getSdkError(\"USER_DISCONNECTED\"),\n    });\n    await this.cleanup();\n  }\n\n  public async connect(opts: ConnectParams): Promise<SessionTypes.Struct | undefined> {\n    if (!this.client) {\n      throw new Error(\"Sign Client not initialized\");\n    }\n    this.connectParams = opts;\n    this.setNamespaces(opts);\n    // omit `await` to avoid delaying the pairing flow\n    this.cleanupPendingPairings();\n    if (opts.skipPairing) return;\n\n    return await this.pair(opts.pairingTopic);\n  }\n\n  public async authenticate(opts: AuthenticateParams, walletUniversalLink?: string) {\n    if (!this.client) {\n      throw new Error(\"Sign Client not initialized\");\n    }\n    this.setNamespaces(opts);\n    await this.cleanupPendingPairings();\n\n    const { uri, response } = await this.client.authenticate(opts, walletUniversalLink);\n    if (uri) {\n      this.uri = uri;\n      this.events.emit(\"display_uri\", uri);\n    }\n    const result = await response();\n    this.session = result.session;\n    if (this.session) {\n      // assign namespaces from session if not already defined\n      const approved = populateNamespacesChains(this.session.namespaces) as NamespaceConfig;\n      this.namespaces = mergeRequiredOptionalNamespaces(this.namespaces, approved);\n      await this.persist(\"namespaces\", this.namespaces);\n      this.onConnect();\n    }\n    return result;\n  }\n\n  public on(event: any, listener: any): void {\n    this.events.on(event, listener);\n  }\n\n  public once(event: string, listener: any): void {\n    this.events.once(event, listener);\n  }\n\n  public removeListener(event: string, listener: any): void {\n    this.events.removeListener(event, listener);\n  }\n\n  public off(event: string, listener: any): void {\n    this.events.off(event, listener);\n  }\n\n  get isWalletConnect() {\n    return true;\n  }\n\n  public async pair(pairingTopic: string | undefined): Promise<SessionTypes.Struct> {\n    const { uri, approval } = await this.client.connect({\n      pairingTopic,\n      requiredNamespaces: this.namespaces,\n      optionalNamespaces: this.optionalNamespaces,\n      sessionProperties: this.sessionProperties,\n      scopedProperties: this.scopedProperties,\n      authentication: this.connectParams?.authentication,\n      walletPay: this.connectParams?.walletPay,\n    });\n\n    if (uri) {\n      this.uri = uri;\n      this.events.emit(\"display_uri\", uri);\n    }\n\n    const session = await approval();\n    this.session = session;\n    // assign namespaces from session if not already defined\n    const approved = populateNamespacesChains(session.namespaces) as NamespaceConfig;\n    this.namespaces = mergeRequiredOptionalNamespaces(this.namespaces, approved);\n    await this.persist(\"namespaces\", this.namespaces);\n    await this.persist(\"optionalNamespaces\", this.optionalNamespaces);\n\n    this.onConnect();\n    return this.session;\n  }\n\n  public setDefaultChain(chain: string, rpcUrl?: string | undefined) {\n    try {\n      // ignore without active session\n      if (!this.session) return;\n      const [namespace, chainId] = this.validateChain(chain);\n      const provider = this.getProvider(namespace);\n      if (provider) {\n        provider.setDefaultChain(chainId, rpcUrl);\n      } else if (this.session) {\n        this.logger.warn(`Provider for namespace '${namespace}' not found in setDefaultChain`);\n      }\n      // If session is undefined, we're in cleanup - silently ignore\n    } catch (error) {\n      // ignore the error if the fx is used prematurely before namespaces are set\n      if (!/Please call connect/.test((error as Error).message)) throw error;\n    }\n  }\n\n  public async cleanupPendingPairings(opts: PairingsCleanupOpts = {}): Promise<void> {\n    try {\n      this.logger.info(\"Cleaning up inactive pairings...\");\n      const inactivePairings = this.client.pairing.getAll();\n\n      if (!isValidArray(inactivePairings)) return;\n\n      for (const pairing of inactivePairings) {\n        if (opts.deletePairings) {\n          this.client.core.expirer.set(pairing.topic, 0);\n        } else {\n          await this.client.core.relayer.subscriber.unsubscribe(pairing.topic);\n        }\n      }\n\n      this.logger.info(`Inactive pairings cleared: ${inactivePairings.length}`);\n    } catch (error) {\n      this.logger.warn(error, \"Failed to cleanup pending pairings\");\n    }\n  }\n\n  public abortPairingAttempt() {\n    this.logger.warn(\"abortPairingAttempt is deprecated. This is now a no-op.\");\n  }\n\n  // ---------- Private ----------------------------------------------- //\n\n  private async checkStorage() {\n    this.namespaces = (await this.getFromStore(`namespaces`)) || {};\n    this.optionalNamespaces = (await this.getFromStore(`optionalNamespaces`)) || {};\n    if (this.session) this.createProviders();\n  }\n\n  private async initialize() {\n    this.logger.trace(`Initialized`);\n    await this.createClient();\n    await this.checkStorage();\n    this.registerEventListeners();\n  }\n\n  private async createClient() {\n    this.client =\n      this.providerOpts.client ||\n      (await SignClient.init({\n        core: this.providerOpts.core,\n        logger: this.providerOpts.logger || LOGGER,\n        relayUrl: this.providerOpts.relayUrl || RELAY_URL,\n        projectId: this.providerOpts.projectId,\n        metadata: this.providerOpts.metadata,\n        storageOptions: this.providerOpts.storageOptions,\n        storage: this.providerOpts.storage,\n        name: this.providerOpts.name,\n        customStoragePrefix: this.providerOpts.customStoragePrefix,\n        telemetryEnabled: this.providerOpts.telemetryEnabled,\n      }));\n\n    if (this.providerOpts.session) {\n      try {\n        this.session = this.client.session.get(this.providerOpts.session.topic);\n      } catch (error) {\n        this.logger.error(error, \"Failed to get session\");\n        throw new Error(\n          `The provided session: ${this.providerOpts?.session?.topic} doesn't exist in the Sign client`,\n        );\n      }\n    } else {\n      const sessions = this.client.session.getAll();\n      this.session = sessions[0];\n    }\n    this.logger.trace(`SignClient Initialized`);\n  }\n\n  private createProviders(): void {\n    if (!this.client) {\n      throw new Error(\"Sign Client not initialized\");\n    }\n\n    if (!this.session) {\n      throw new Error(\"Session not initialized. Please call connect() before enable()\");\n    }\n\n    const providersToCreate = [\n      ...new Set(\n        Object.keys(this.session.namespaces).map((namespace) => parseNamespaceKey(namespace)),\n      ),\n    ];\n\n    setGlobal(\"client\", this.client);\n    setGlobal(\"events\", this.events);\n    setGlobal(\"disableProviderPing\", this.disableProviderPing);\n\n    providersToCreate.forEach((namespace) => {\n      if (!this.session) return;\n      const accounts = getAccountsFromSession(namespace, this.session);\n      if (accounts?.length === 0) {\n        return;\n      }\n      const approvedChains = getChainsFromApprovedSession(accounts);\n      const mergedNamespaces = mergeRequiredOptionalNamespaces(\n        this.namespaces,\n        this.optionalNamespaces,\n      );\n      const combinedNamespace = {\n        ...mergedNamespaces[namespace],\n        accounts,\n        chains: approvedChains,\n      };\n      switch (namespace) {\n        case \"eip155\":\n          this.rpcProviders[namespace] = new Eip155Provider({\n            namespace: combinedNamespace,\n          });\n          break;\n        default:\n          this.rpcProviders[namespace] = new GenericProvider({\n            namespace: combinedNamespace,\n          });\n      }\n    });\n  }\n\n  private registerEventListeners(): void {\n    if (typeof this.client === \"undefined\") {\n      throw new Error(\"Sign Client is not initialized\");\n    }\n\n    this.client.on(\"session_ping\", (args) => {\n      const { topic } = args;\n      if (topic !== this.session?.topic) return;\n      this.events.emit(\"session_ping\", args);\n    });\n\n    this.client.on(\"session_event\", (args) => {\n      const { params, topic } = args;\n      if (topic !== this.session?.topic) return;\n      const { event } = params;\n      if (event.name === \"accountsChanged\") {\n        const accounts = event.data;\n        if (accounts && isValidArray(accounts))\n          this.events.emit(\"accountsChanged\", accounts.map(parseCaip10Account));\n      } else if (event.name === \"chainChanged\") {\n        const requestChainId = params.chainId;\n        const payloadChainId = params.event.data as number;\n        const namespace = parseNamespaceKey(requestChainId);\n        // chainIds might differ between the request & payload - request is always in CAIP2 format, while payload might be string, number, CAIP2 or hex\n        // take priority of the payload chainId\n        const chainIdToProcess =\n          convertChainIdToNumber(requestChainId) !== convertChainIdToNumber(payloadChainId)\n            ? `${namespace}:${convertChainIdToNumber(payloadChainId)}`\n            : requestChainId;\n\n        this.onChainChanged({ currentCaipChainId: chainIdToProcess });\n      } else {\n        this.events.emit(event.name, event.data);\n      }\n\n      this.events.emit(\"session_event\", args);\n    });\n\n    this.client.on(\"session_update\", ({ topic, params }) => {\n      if (topic !== this.session?.topic) return;\n      const { namespaces } = params;\n      const _session = this.client?.session.get(topic);\n      this.session = { ..._session, namespaces } as SessionTypes.Struct;\n      this.onSessionUpdate();\n      this.events.emit(\"session_update\", { topic, params });\n    });\n\n    this.client.on(\"session_delete\", async (payload) => {\n      if (payload.topic !== this.session?.topic) return;\n      await this.cleanup();\n      this.events.emit(\"session_delete\", payload);\n      this.events.emit(\"disconnect\", {\n        ...getSdkError(\"USER_DISCONNECTED\"),\n        data: payload.topic,\n      });\n    });\n\n    this.on(PROVIDER_EVENTS.DEFAULT_CHAIN_CHANGED, (params: DefaultChainChanged) => {\n      this.onChainChanged({ ...params, internal: true });\n    });\n  }\n\n  private getProvider(namespace: string): IProvider {\n    return this.rpcProviders[namespace] || this.rpcProviders[GENERIC_SUBPROVIDER_NAME];\n  }\n\n  private onSessionUpdate(): void {\n    Object.keys(this.rpcProviders).forEach((namespace: string) => {\n      this.getProvider(namespace).updateNamespace(\n        this.session?.namespaces[namespace] as SessionTypes.BaseNamespace,\n      );\n    });\n  }\n\n  private setNamespaces(params: ConnectParams): void {\n    const {\n      namespaces = {},\n      optionalNamespaces = {},\n      sessionProperties,\n      scopedProperties,\n    } = params;\n\n    // requiredNamespaces are deprecated, assign them to optionalNamespaces\n    this.optionalNamespaces = mergeRequiredOptionalNamespaces(namespaces, optionalNamespaces);\n    this.sessionProperties = sessionProperties;\n    this.scopedProperties = scopedProperties;\n  }\n\n  private validateChain(chain?: string): [string, string] {\n    const [namespace, chainId] = chain?.split(\":\") || [\"\", \"\"];\n    if (!this.namespaces || !Object.keys(this.namespaces).length) return [namespace, chainId];\n    // validate namespace\n    if (namespace) {\n      if (\n        // some namespaces might be defined with inline chainId e.g. eip155:1\n        // and we need to parse them\n        !Object.keys(this.namespaces || {})\n          .map((key) => parseNamespaceKey(key))\n          .includes(namespace)\n      ) {\n        throw new Error(\n          `Namespace '${namespace}' is not configured. Please call connect() first with namespace config.`,\n        );\n      }\n    }\n    if (namespace && chainId) {\n      return [namespace, chainId];\n    }\n    const defaultNamespace = parseNamespaceKey(Object.keys(this.namespaces)[0]);\n    const defaultChain = this.rpcProviders[defaultNamespace].getDefaultChain();\n    return [defaultNamespace, defaultChain];\n  }\n\n  private async requestAccounts(): Promise<string[]> {\n    const [namespace] = this.validateChain();\n    return await this.getProvider(namespace).requestAccounts();\n  }\n\n  private async onChainChanged({\n    currentCaipChainId,\n    previousCaipChainId,\n    internal = false,\n  }: OnChainChanged): Promise<void> {\n    if (!this.namespaces) return;\n\n    const [namespace, chainId] = this.validateChain(currentCaipChainId);\n\n    if (!chainId) return;\n\n    this.updateNamespaceChain(namespace, chainId);\n\n    if (!internal) {\n      const provider = this.getProvider(namespace);\n      if (provider) {\n        provider.setDefaultChain(chainId);\n      } else if (this.session) {\n        this.logger.warn(`Provider for namespace '${namespace}' not found during chain change`);\n      }\n      // If session is undefined, we're in cleanup - silently ignore\n    } else {\n      // emit the events during the `internal` cycle of chain change\n      // otherwise events are emitted twice\n      // once on the chainChanged event and once triggered by `this.getProvider(namespace).setDefaultChain(chainId);`\n      this.events.emit(\"chainChanged\", chainId);\n      this.emitAccountsChangedOnChainChange({\n        namespace,\n        currentCaipChainId,\n        previousCaipChainId,\n      });\n    }\n\n    await this.persist(\"namespaces\", this.namespaces);\n  }\n\n  /**\n   * Emits `accountsChanged` event when a chain is changed and there are new accounts on the new chain\n   */\n  private emitAccountsChangedOnChainChange({\n    namespace,\n    currentCaipChainId,\n    previousCaipChainId,\n  }: EmitAccountsChangedOnChainChange): void {\n    try {\n      if (previousCaipChainId === currentCaipChainId) {\n        return;\n      }\n\n      const accounts = this.session?.namespaces[namespace]?.accounts;\n      if (!accounts) return;\n      const newChainIdAccounts = accounts\n        .filter((account) => account.includes(`${currentCaipChainId}:`))\n        .map(parseCaip10Account);\n      if (!isValidArray(newChainIdAccounts)) return;\n      this.events.emit(\"accountsChanged\", newChainIdAccounts);\n    } catch (error) {\n      this.logger.warn(error, \"Failed to emit accountsChanged on chain change\");\n    }\n  }\n\n  private updateNamespaceChain(namespace: string, chainId: string): void {\n    if (!this.namespaces) return;\n\n    const namespaceKey = this.namespaces[namespace] ? namespace : `${namespace}:${chainId}`;\n\n    const defaultNamespace = {\n      chains: [],\n      methods: [],\n      events: [],\n      defaultChain: chainId,\n    };\n\n    if (!this.namespaces[namespaceKey]) {\n      this.namespaces[namespaceKey] = defaultNamespace;\n    } else if (this.namespaces[namespaceKey]) {\n      this.namespaces[namespaceKey].defaultChain = chainId;\n    }\n  }\n\n  private onConnect() {\n    this.createProviders();\n    this.events.emit(\"connect\", { session: this.session });\n  }\n\n  private async cleanup() {\n    this.connectParams = undefined;\n    this.namespaces = undefined;\n    this.optionalNamespaces = undefined;\n    this.sessionProperties = undefined;\n    await this.deleteFromStore(\"namespaces\");\n    await this.deleteFromStore(\"optionalNamespaces\");\n    await this.deleteFromStore(\"sessionProperties\");\n    // reset the session after removing from store as the topic is used there\n    this.session = undefined;\n    this.cleanupPendingPairings({ deletePairings: true });\n    await this.cleanupStorage();\n  }\n\n  private async persist(key: string, data: unknown) {\n    const topic = this.session?.topic || \"\";\n    await this.client.core.storage.setItem(`${STORAGE}/${key}${topic}`, data);\n  }\n\n  private async getFromStore(key: string) {\n    const topic = this.session?.topic || \"\";\n    return await this.client.core.storage.getItem(`${STORAGE}/${key}${topic}`);\n  }\n\n  private async deleteFromStore(key: string) {\n    const topic = this.session?.topic || \"\";\n    await this.client.core.storage.removeItem(`${STORAGE}/${key}${topic}`);\n  }\n\n  // remove all storage items if there are no sessions left\n  private async cleanupStorage() {\n    try {\n      if (this.client?.session.length > 0) {\n        return;\n      }\n      const keys = await this.client.core.storage.getKeys();\n      for (const key of keys) {\n        if (key.startsWith(STORAGE)) {\n          await this.client.core.storage.removeItem(key);\n        }\n      }\n    } catch (error) {\n      this.logger.warn(error, \"Failed to cleanup storage\");\n    }\n  }\n}\nexport default UniversalProvider;\n","import { UniversalProvider as Provider } from \"./UniversalProvider.js\";\nexport * from \"./types/index.js\";\nexport const UniversalProvider = Provider;\nexport default Provider;\n"],"names":["LOGGER","RELAY_URL","PROTOCOL","CONTEXT","STORAGE","RPC_URL","GENERIC_SUBPROVIDER_NAME","BUNDLER_URL","CALL_STATUS_STORAGE_KEY","CALL_STATUS_RESULT_EXPIRY","PROVIDER_EVENTS","getRpcUrl","chainId","rpc","projectId","chain","parseChainId","getChainId","getChainsFromApprovedSession","accounts","address","getAccountsFromSession","namespace","session","matchedNamespaceKeys","key","accountsForNamespace","filterNamespacesWithNoChains","namespaces","_","ns","mergeRequiredOptionalNamespaces","required","optional","requiredNamespaces","normalizeNamespaces","optionalNamespaces","merge","normalizedNamespaces","isValidObject","values","chains","isCaipNamespace","methods","events","rpcMap","normalizedKey","parseNamespaceKey","mergeArrays","parseCaip10Account","caip10Account","populateNamespacesChains","parsedNamespaces","convertChainIdToNumber","isValidJSONObject","str","parsed","globals","getGlobal","setGlobal","value","EIP155_PREFIX","CAPABILITIES_KEYS","hexToDecimal","hex","decimalToHex","decimal","getCapabilitiesFromObject","object","item","acc","parseCapabilityValue","extractCapabilitiesFromSession","chainIds","sessionProperties","scopedProperties","result","globalCapabilities","chainSpecific","addressSpecific","storage","Storage","kvStorage","prepareCallStatusFromStoredSendCalls","storedSendCalls","getHttpProvider","hashes","allPromises","hash","getTransactionReceipt","receipts","r","someReceiptsPending","allReceiptsSuccessful","allReceiptsFailed","someReceiptsFailed","status","transactionHash","formatJsonRpcRequest","storeSendCalls","sendCalls","sendCallsStatusResults","calcExpiry","deleteSendCallsResult","resultId","isExpired","getStoredSendCalls","Eip155Provider","opts","args","rpcUrl","previous","JsonRpcProvider","HttpConnection","http","parsedChain","account","hexChainId","parsedChainId","sessionCapabilities","cacheChainKey","capabilitiesKey","legacyCapabilities","cachedCapabilities","error","capabilities","bundlerName","bundlerUrl","customUrl","url","response","cap2ChainId","sendCallsParams","caip2","transactionHashes","GenericProvider","customRpcUrl","chainReference","UniversalProvider$1","UniversalProvider","EventEmitter","createLogger","provider","expiry","callback","id","formatJsonRpcResult","getSdkError","walletUniversalLink","uri","approved","event","listener","pairingTopic","approval","inactivePairings","isValidArray","pairing","SignClient","sessions","providersToCreate","approvedChains","combinedNamespace","topic","params","requestChainId","payloadChainId","chainIdToProcess","_session","payload","defaultNamespace","defaultChain","currentCaipChainId","previousCaipChainId","internal","newChainIdAccounts","namespaceKey","data","keys","Provider"],"mappings":"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"}