{"version":3,"file":"index.cjs","sources":["../src/constants/core.ts","../src/constants/crypto.ts","../src/constants/keychain.ts","../src/constants/messages.ts","../src/constants/publisher.ts","../src/constants/relayer.ts","../src/constants/store.ts","../src/constants/subscriber.ts","../src/constants/pairing.ts","../src/constants/history.ts","../src/constants/expirer.ts","../src/constants/verify.ts","../src/constants/echo.ts","../src/constants/events.ts","../src/controllers/keychain.ts","../src/controllers/crypto.ts","../src/controllers/messages.ts","../src/controllers/publisher.ts","../src/controllers/topicmap.ts","../src/controllers/subscriber.ts","../src/controllers/relayer.ts","../src/controllers/store.ts","../src/controllers/pairing.ts","../src/controllers/history.ts","../src/controllers/expirer.ts","../src/controllers/verify.ts","../src/controllers/echo.ts","../src/controllers/events.ts","../src/core.ts","../src/index.ts"],"sourcesContent":["export const CORE_PROTOCOL = \"wc\";\nexport const CORE_VERSION = 2;\nexport const CORE_CONTEXT = \"core\";\n\nexport const CORE_STORAGE_PREFIX = `${CORE_PROTOCOL}@${CORE_VERSION}:${CORE_CONTEXT}:`;\n\nexport const CORE_DEFAULT = {\n  name: CORE_CONTEXT,\n  logger: \"error\",\n};\n\nexport const CORE_STORAGE_OPTIONS = {\n  database: \":memory:\",\n};\n","import { ONE_DAY } from \"@walletconnect/time\";\n\nexport const CRYPTO_CONTEXT = \"crypto\";\n\nexport const CRYPTO_CLIENT_SEED = \"client_ed25519_seed\";\n\nexport const CRYPTO_JWT_TTL = ONE_DAY;\n","export const KEYCHAIN_CONTEXT = \"keychain\";\n\nexport const KEYCHAIN_STORAGE_VERSION = \"0.3\";\n","export const MESSAGES_CONTEXT = \"messages\";\n\nexport const MESSAGES_STORAGE_VERSION = \"0.3\";\n","import { SIX_HOURS } from \"@walletconnect/time\";\n\nexport const PUBLISHER_DEFAULT_TTL = SIX_HOURS;\n\nexport const PUBLISHER_CONTEXT = \"publisher\";\n","export const RELAYER_DEFAULT_PROTOCOL = \"irn\";\n\nexport const RELAYER_DEFAULT_LOGGER = \"error\";\n\nexport const RELAYER_DEFAULT_RELAY_URL = \"wss://relay.walletconnect.org\";\n\nexport const RELAYER_CONTEXT = \"relayer\";\n\nexport const RELAYER_EVENTS = {\n  message: \"relayer_message\",\n  message_ack: \"relayer_message_ack\",\n  connect: \"relayer_connect\",\n  disconnect: \"relayer_disconnect\",\n  error: \"relayer_error\",\n  connection_stalled: \"relayer_connection_stalled\",\n  transport_closed: \"relayer_transport_closed\",\n  publish: \"relayer_publish\",\n};\n\nexport const RELAYER_SUBSCRIBER_SUFFIX = \"_subscription\";\n\nexport const RELAYER_PROVIDER_EVENTS = {\n  payload: \"payload\",\n  connect: \"connect\",\n  disconnect: \"disconnect\",\n  error: \"error\",\n};\n\nexport const RELAYER_RECONNECT_TIMEOUT = 0.1;\n\nexport const RELAYER_STORAGE_OPTIONS = {\n  database: \":memory:\",\n};\n\n// Updated automatically via `new-version` npm script.\n\nexport const RELAYER_SDK_VERSION = \"2.23.9\";\n\n// delay to wait before closing the transport connection after init if not active\nexport const RELAYER_TRANSPORT_CUTOFF = 10_000;\n\nexport const TRANSPORT_TYPES = {\n  link_mode: \"link_mode\",\n  relay: \"relay\",\n} as const;\n\nexport const MESSAGE_DIRECTION = {\n  inbound: \"inbound\",\n  outbound: \"outbound\",\n} as const;\n","export const STORE_STORAGE_VERSION = \"0.3\";\n\nexport const WALLETCONNECT_CLIENT_ID = \"WALLETCONNECT_CLIENT_ID\";\nexport const WALLETCONNECT_LINK_MODE_APPS = \"WALLETCONNECT_LINK_MODE_APPS\";\n","import { THIRTY_DAYS, FIVE_SECONDS } from \"@walletconnect/time\";\n\nexport const SUBSCRIBER_EVENTS = {\n  created: \"subscription_created\",\n  deleted: \"subscription_deleted\",\n  expired: \"subscription_expired\",\n  disabled: \"subscription_disabled\",\n  sync: \"subscription_sync\",\n  resubscribed: \"subscription_resubscribed\",\n};\n\nexport const SUBSCRIBER_DEFAULT_TTL = THIRTY_DAYS;\n\nexport const SUBSCRIBER_CONTEXT = \"subscription\";\n\nexport const SUBSCRIBER_STORAGE_VERSION = \"0.3\";\n\nexport const PENDING_SUB_RESOLUTION_TIMEOUT = FIVE_SECONDS * 1000;\n","import { THIRTY_DAYS, ONE_DAY, THIRTY_SECONDS } from \"@walletconnect/time\";\nimport { RelayerTypes, PairingJsonRpcTypes } from \"@walletconnect/types\";\n\nexport const PAIRING_CONTEXT = \"pairing\";\n\nexport const PAIRING_STORAGE_VERSION = \"0.3\";\n\nexport const PAIRING_DEFAULT_TTL = THIRTY_DAYS;\n\nexport const PAIRING_RPC_OPTS: Record<\n  PairingJsonRpcTypes.WcMethod | \"unregistered_method\",\n  {\n    req: RelayerTypes.PublishOptions;\n    res: RelayerTypes.PublishOptions;\n  }\n> = {\n  wc_pairingDelete: {\n    req: {\n      ttl: ONE_DAY,\n      prompt: false,\n      tag: 1000,\n    },\n    res: {\n      ttl: ONE_DAY,\n      prompt: false,\n      tag: 1001,\n    },\n  },\n  wc_pairingPing: {\n    req: {\n      ttl: THIRTY_SECONDS,\n      prompt: false,\n      tag: 1002,\n    },\n    res: {\n      ttl: THIRTY_SECONDS,\n      prompt: false,\n      tag: 1003,\n    },\n  },\n  unregistered_method: {\n    req: {\n      ttl: ONE_DAY,\n      prompt: false,\n      tag: 0,\n    },\n    res: {\n      ttl: ONE_DAY,\n      prompt: false,\n      tag: 0,\n    },\n  },\n};\n\nexport const PAIRING_EVENTS = {\n  create: \"pairing_create\",\n  expire: \"pairing_expire\",\n  delete: \"pairing_delete\",\n  ping: \"pairing_ping\",\n};\n","export const HISTORY_EVENTS = {\n  created: \"history_created\",\n  updated: \"history_updated\",\n  deleted: \"history_deleted\",\n  sync: \"history_sync\",\n};\n\nexport const HISTORY_CONTEXT = \"history\";\n\nexport const HISTORY_STORAGE_VERSION = \"0.3\";\n","import { ONE_DAY } from \"@walletconnect/time\";\n\nexport const EXPIRER_CONTEXT = \"expirer\";\n\nexport const EXPIRER_EVENTS = {\n  created: \"expirer_created\",\n  deleted: \"expirer_deleted\",\n  expired: \"expirer_expired\",\n  sync: \"expirer_sync\",\n};\n\nexport const EXPIRER_STORAGE_VERSION = \"0.3\";\n\nexport const EXPIRER_DEFAULT_TTL = ONE_DAY;\n","export const VERIFY_CONTEXT = \"verify-api\";\n\nconst VERIFY_SERVER_COM = \"https://verify.walletconnect.com\";\nconst VERIFY_SERVER_ORG = \"https://verify.walletconnect.org\";\nexport const VERIFY_SERVER = VERIFY_SERVER_ORG;\nexport const VERIFY_SERVER_V3 = `${VERIFY_SERVER}/v3`;\n\nexport const TRUSTED_VERIFY_URLS = [VERIFY_SERVER_COM, VERIFY_SERVER_ORG];\n","export const ECHO_CONTEXT = \"echo\";\n\nexport const ECHO_URL = \"https://echo.walletconnect.com\";\n","export const EVENT_CLIENT_CONTEXT = \"event-client\";\n\nexport const EVENT_CLIENT_PAIRING_TRACES = {\n  pairing_started: \"pairing_started\",\n  pairing_uri_validation_success: \"pairing_uri_validation_success\",\n  pairing_uri_not_expired: \"pairing_uri_not_expired\",\n  store_new_pairing: \"store_new_pairing\",\n  subscribing_pairing_topic: \"subscribing_pairing_topic\",\n  subscribe_pairing_topic_success: \"subscribe_pairing_topic_success\",\n  existing_pairing: \"existing_pairing\",\n  pairing_not_expired: \"pairing_not_expired\",\n  emit_inactive_pairing: \"emit_inactive_pairing\",\n  emit_session_proposal: \"emit_session_proposal\",\n  subscribing_to_pairing_topic: \"subscribing_to_pairing_topic\",\n};\n\nexport const EVENT_CLIENT_PAIRING_ERRORS = {\n  no_wss_connection: \"no_wss_connection\",\n  no_internet_connection: \"no_internet_connection\",\n  malformed_pairing_uri: \"malformed_pairing_uri\",\n  active_pairing_already_exists: \"active_pairing_already_exists\",\n  subscribe_pairing_topic_failure: \"subscribe_pairing_topic_failure\",\n  pairing_expired: \"pairing_expired\",\n  proposal_expired: \"proposal_expired\",\n  proposal_listener_not_found: \"proposal_listener_not_found\",\n};\n\nexport const EVENT_CLIENT_SESSION_TRACES = {\n  session_approve_started: \"session_approve_started\",\n  proposal_not_expired: \"proposal_not_expired\",\n  session_namespaces_validation_success: \"session_namespaces_validation_success\",\n  create_session_topic: \"create_session_topic\",\n  subscribing_session_topic: \"subscribing_session_topic\",\n  subscribe_session_topic_success: \"subscribe_session_topic_success\",\n  publishing_session_approve: \"publishing_session_approve\",\n  session_approve_publish_success: \"session_approve_publish_success\",\n  store_session: \"store_session\",\n  publishing_session_settle: \"publishing_session_settle\",\n  session_settle_publish_success: \"session_settle_publish_success\",\n  session_request_response_started: \"session_request_response_started\",\n  session_request_response_validation_success: \"session_request_response_validation_success\",\n  session_request_response_publish_started: \"session_request_response_publish_started\",\n};\n\nexport const EVENT_CLIENT_SESSION_ERRORS = {\n  no_internet_connection: \"no_internet_connection\",\n  no_wss_connection: \"no_wss_connection\",\n  proposal_expired: \"proposal_expired\",\n  subscribe_session_topic_failure: \"subscribe_session_topic_failure\",\n  session_approve_publish_failure: \"session_approve_publish_failure\",\n  session_settle_publish_failure: \"session_settle_publish_failure\",\n  session_approve_namespace_validation_failure: \"session_approve_namespace_validation_failure\",\n  proposal_not_found: \"proposal_not_found\",\n  session_request_response_validation_failure: \"session_request_response_validation_failure\",\n  session_request_response_publish_failure: \"session_request_response_publish_failure\",\n};\n\nexport const EVENT_CLIENT_AUTHENTICATE_TRACES = {\n  authenticated_session_approve_started: \"authenticated_session_approve_started\",\n  authenticated_session_not_expired: \"authenticated_session_not_expired\",\n  chains_caip2_compliant: \"chains_caip2_compliant\",\n  chains_evm_compliant: \"chains_evm_compliant\",\n  create_authenticated_session_topic: \"create_authenticated_session_topic\",\n  cacaos_verified: \"cacaos_verified\",\n  store_authenticated_session: \"store_authenticated_session\",\n  subscribing_authenticated_session_topic: \"subscribing_authenticated_session_topic\",\n  subscribe_authenticated_session_topic_success: \"subscribe_authenticated_session_topic_success\",\n  publishing_authenticated_session_approve: \"publishing_authenticated_session_approve\",\n  authenticated_session_approve_publish_success: \"authenticated_session_approve_publish_success\",\n};\n\nexport const EVENT_CLIENT_AUTHENTICATE_ERRORS = {\n  no_internet_connection: \"no_internet_connection\",\n  no_wss_connection: \"no_wss_connection\",\n  missing_session_authenticate_request: \"missing_session_authenticate_request\",\n  session_authenticate_request_expired: \"session_authenticate_request_expired\",\n  chains_caip2_compliant_failure: \"chains_caip2_compliant_failure\",\n  chains_evm_compliant_failure: \"chains_evm_compliant_failure\",\n  invalid_cacao: \"invalid_cacao\",\n  subscribe_authenticated_session_topic_failure: \"subscribe_authenticated_session_topic_failure\",\n  authenticated_session_approve_publish_failure: \"authenticated_session_approve_publish_failure\",\n  authenticated_session_pending_request_not_found:\n    \"authenticated_session_pending_request_not_found\",\n};\n\nexport const EVENTS_STORAGE_VERSION = 0.1;\n\nexport const EVENTS_STORAGE_CONTEXT = \"event-client\";\n\nexport const EVENTS_STORAGE_CLEANUP_INTERVAL = 86400;\n\nexport const EVENTS_CLIENT_API_URL = \"https://pulse.walletconnect.org/batch\";\n","import { generateChildLogger, getLoggerContext, Logger } from \"@walletconnect/logger\";\nimport { ICore, IKeyChain } from \"@walletconnect/types\";\nimport { getInternalError, mapToObj, objToMap } from \"@walletconnect/utils\";\n\nimport {\n  CORE_STORAGE_PREFIX,\n  KEYCHAIN_CONTEXT,\n  KEYCHAIN_STORAGE_VERSION,\n} from \"../constants/index.js\";\n\nexport class KeyChain implements IKeyChain {\n  public keychain = new Map<string, string>();\n  public name = KEYCHAIN_CONTEXT;\n  public version = KEYCHAIN_STORAGE_VERSION;\n\n  private initialized = false;\n  private storagePrefix = CORE_STORAGE_PREFIX;\n\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n  ) {\n    this.core = core;\n    this.logger = generateChildLogger(logger, this.name);\n  }\n\n  public init: IKeyChain[\"init\"] = async () => {\n    if (!this.initialized) {\n      const keychain = await this.getKeyChain();\n      if (typeof keychain !== \"undefined\") {\n        this.keychain = keychain;\n      }\n      this.initialized = true;\n    }\n  };\n\n  get context() {\n    return getLoggerContext(this.logger);\n  }\n\n  get storageKey() {\n    return this.storagePrefix + this.version + this.core.customStoragePrefix + \"//\" + this.name;\n  }\n\n  public has: IKeyChain[\"has\"] = (tag) => {\n    this.isInitialized();\n    return this.keychain.has(tag);\n  };\n\n  public set: IKeyChain[\"set\"] = async (tag, key) => {\n    this.isInitialized();\n    this.keychain.set(tag, key);\n    await this.persist();\n  };\n\n  public get: IKeyChain[\"get\"] = (tag) => {\n    this.isInitialized();\n    const key = this.keychain.get(tag);\n    if (typeof key === \"undefined\") {\n      const { message } = getInternalError(\"NO_MATCHING_KEY\", `${this.name}: ${tag}`);\n      throw new Error(message);\n    }\n    return key;\n  };\n\n  public del: IKeyChain[\"del\"] = async (tag) => {\n    this.isInitialized();\n    this.keychain.delete(tag);\n    await this.persist();\n  };\n\n  // ---------- Private ----------------------------------------------- //\n\n  private async setKeyChain(keychain: Map<string, string>) {\n    await this.core.storage.setItem<Record<string, string>>(this.storageKey, mapToObj(keychain));\n  }\n\n  private async getKeyChain() {\n    const keychain = await this.core.storage.getItem<Record<string, string>>(this.storageKey);\n    return typeof keychain !== \"undefined\" ? objToMap(keychain) : undefined;\n  }\n\n  private async persist() {\n    await this.setKeyChain(this.keychain);\n  }\n\n  private isInitialized() {\n    if (!this.initialized) {\n      const { message } = getInternalError(\"NOT_INITIALIZED\", this.name);\n      throw new Error(message);\n    }\n  }\n}\n","import { generateChildLogger, getLoggerContext, Logger } from \"@walletconnect/logger\";\nimport { safeJsonParse, safeJsonStringify } from \"@walletconnect/safe-json\";\nimport { ICore, ICrypto, IKeyChain } from \"@walletconnect/types\";\nimport * as relayAuth from \"@walletconnect/relay-auth\";\nimport { fromString } from \"uint8arrays/from-string\";\nimport {\n  decrypt,\n  deriveSymKey,\n  encrypt,\n  generateKeyPair as generateKeyPairUtil,\n  hashKey,\n  getInternalError,\n  generateRandomBytes32,\n  validateEncoding,\n  validateDecoding,\n  isTypeOneEnvelope,\n  isTypeTwoEnvelope,\n  encodeTypeTwoEnvelope,\n  decodeTypeTwoEnvelope,\n  deserialize,\n  decodeTypeByte,\n  BASE16,\n  BASE64,\n} from \"@walletconnect/utils\";\nimport { toString } from \"uint8arrays\";\n\nimport { CRYPTO_CONTEXT, CRYPTO_CLIENT_SEED, CRYPTO_JWT_TTL } from \"../constants/index.js\";\nimport { KeyChain } from \"./keychain.js\";\n\nexport class Crypto implements ICrypto {\n  public name = CRYPTO_CONTEXT;\n  public keychain: ICrypto[\"keychain\"];\n  public readonly randomSessionIdentifier = generateRandomBytes32();\n\n  private initialized = false;\n  private clientId: string | undefined;\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n    keychain?: IKeyChain,\n  ) {\n    this.core = core;\n    this.logger = generateChildLogger(logger, this.name);\n    this.keychain = keychain || new KeyChain(this.core, this.logger);\n  }\n\n  public init: ICrypto[\"init\"] = async () => {\n    if (!this.initialized) {\n      await this.keychain.init();\n      this.initialized = true;\n    }\n  };\n\n  get context() {\n    return getLoggerContext(this.logger);\n  }\n\n  public hasKeys: ICrypto[\"hasKeys\"] = (tag) => {\n    this.isInitialized();\n    return this.keychain.has(tag);\n  };\n\n  public getClientId: ICrypto[\"getClientId\"] = async () => {\n    this.isInitialized();\n    if (this.clientId) {\n      return this.clientId;\n    }\n    const seed = await this.getClientSeed();\n    const keyPair = relayAuth.generateKeyPair(seed);\n    const clientId = relayAuth.encodeIss(keyPair.publicKey);\n    this.clientId = clientId;\n    return clientId;\n  };\n\n  public generateKeyPair: ICrypto[\"generateKeyPair\"] = () => {\n    this.isInitialized();\n    const keyPair = generateKeyPairUtil();\n    return this.setPrivateKey(keyPair.publicKey, keyPair.privateKey);\n  };\n\n  public signJWT: ICrypto[\"signJWT\"] = async (aud) => {\n    this.isInitialized();\n    const seed = await this.getClientSeed();\n    const keyPair = relayAuth.generateKeyPair(seed);\n    const sub = this.randomSessionIdentifier;\n    const ttl = CRYPTO_JWT_TTL;\n    const jwt = await relayAuth.signJWT(sub, aud, ttl, keyPair);\n    return jwt;\n  };\n\n  public generateSharedKey: ICrypto[\"generateSharedKey\"] = (\n    selfPublicKey,\n    peerPublicKey,\n    overrideTopic,\n  ) => {\n    this.isInitialized();\n    const selfPrivateKey = this.getPrivateKey(selfPublicKey);\n    const symKey = deriveSymKey(selfPrivateKey, peerPublicKey);\n    return this.setSymKey(symKey, overrideTopic);\n  };\n\n  public setSymKey: ICrypto[\"setSymKey\"] = async (symKey, overrideTopic) => {\n    this.isInitialized();\n    const topic = overrideTopic || hashKey(symKey);\n    await this.keychain.set(topic, symKey);\n    return topic;\n  };\n\n  public deleteKeyPair: ICrypto[\"deleteKeyPair\"] = async (publicKey: string) => {\n    this.isInitialized();\n    await this.keychain.del(publicKey);\n  };\n\n  public deleteSymKey: ICrypto[\"deleteSymKey\"] = async (topic: string) => {\n    this.isInitialized();\n    await this.keychain.del(topic);\n  };\n\n  public encode: ICrypto[\"encode\"] = async (topic, payload, opts) => {\n    this.isInitialized();\n    const params = validateEncoding(opts);\n    const message = safeJsonStringify(payload);\n\n    if (isTypeTwoEnvelope(params)) {\n      return encodeTypeTwoEnvelope(message, opts?.encoding);\n    }\n\n    if (isTypeOneEnvelope(params)) {\n      const selfPublicKey = params.senderPublicKey;\n      const peerPublicKey = params.receiverPublicKey;\n      topic = await this.generateSharedKey(selfPublicKey, peerPublicKey);\n    }\n    const symKey = this.getSymKey(topic);\n    const { type, senderPublicKey } = params;\n    const result = encrypt({ type, symKey, message, senderPublicKey, encoding: opts?.encoding });\n    return result;\n  };\n\n  public decode: ICrypto[\"decode\"] = async (topic, encoded, opts) => {\n    this.isInitialized();\n    const params = validateDecoding(encoded, opts);\n    if (isTypeTwoEnvelope(params)) {\n      const message = decodeTypeTwoEnvelope(encoded, opts?.encoding);\n      return safeJsonParse(message);\n    }\n    if (isTypeOneEnvelope(params)) {\n      const selfPublicKey = params.receiverPublicKey;\n      const peerPublicKey = params.senderPublicKey;\n      topic = await this.generateSharedKey(selfPublicKey, peerPublicKey);\n    }\n    try {\n      const symKey = this.getSymKey(topic);\n      const message = decrypt({ symKey, encoded, encoding: opts?.encoding });\n      const payload = safeJsonParse(message);\n      return payload;\n    } catch (error) {\n      this.logger.error(\n        `Failed to decode message from topic: '${topic}', clientId: '${await this.getClientId()}'`,\n      );\n      this.logger.error(error);\n    }\n  };\n\n  public getPayloadType: ICrypto[\"getPayloadType\"] = (encoded, encoding = BASE64) => {\n    const deserialized = deserialize({ encoded, encoding });\n    return decodeTypeByte(deserialized.type);\n  };\n\n  public getPayloadSenderPublicKey: ICrypto[\"getPayloadSenderPublicKey\"] = (\n    encoded,\n    encoding = BASE64,\n  ) => {\n    const deserialized = deserialize({ encoded, encoding });\n    return deserialized.senderPublicKey\n      ? toString(deserialized.senderPublicKey, BASE16)\n      : undefined;\n  };\n\n  // ---------- Private ----------------------------------------------- //\n\n  private async setPrivateKey(publicKey: string, privateKey: string): Promise<string> {\n    await this.keychain.set(publicKey, privateKey);\n    return publicKey;\n  }\n\n  private getPrivateKey(publicKey: string) {\n    const privateKey = this.keychain.get(publicKey);\n    return privateKey;\n  }\n\n  private async getClientSeed(): Promise<Uint8Array> {\n    let seed = \"\";\n    try {\n      seed = this.keychain.get(CRYPTO_CLIENT_SEED);\n    } catch {\n      seed = generateRandomBytes32();\n      await this.keychain.set(CRYPTO_CLIENT_SEED, seed);\n    }\n    return fromString(seed, \"base16\");\n  }\n\n  private getSymKey(topic: string) {\n    const symKey = this.keychain.get(topic);\n    return symKey;\n  }\n\n  private isInitialized() {\n    if (!this.initialized) {\n      const { message } = getInternalError(\"NOT_INITIALIZED\", this.name);\n      throw new Error(message);\n    }\n  }\n}\n","import { generateChildLogger, getLoggerContext, Logger } from \"@walletconnect/logger\";\nimport { ICore, IMessageTracker, MessageRecord } from \"@walletconnect/types\";\nimport { hashMessage, mapToObj, objToMap, getInternalError } from \"@walletconnect/utils\";\nimport {\n  CORE_STORAGE_PREFIX,\n  MESSAGE_DIRECTION,\n  MESSAGES_CONTEXT,\n  MESSAGES_STORAGE_VERSION,\n} from \"../constants/index.js\";\n\nexport class MessageTracker extends IMessageTracker {\n  public messages = new Map<string, MessageRecord>();\n  /**\n   * stores messages that have not been acknowledged by the implementing client\n   * this is used to prevent losing messages in race conditions such as\n   * when a message is received by the relayer before the implementing client is ready to receive it\n   */\n  public messagesWithoutClientAck = new Map<string, MessageRecord>();\n  public name = MESSAGES_CONTEXT;\n  public version = MESSAGES_STORAGE_VERSION;\n\n  private initialized = false;\n  private storagePrefix = CORE_STORAGE_PREFIX;\n\n  constructor(\n    public logger: Logger,\n    public core: ICore,\n  ) {\n    super(logger, core);\n    this.logger = generateChildLogger(logger, this.name);\n    this.core = core;\n  }\n\n  public init: IMessageTracker[\"init\"] = async () => {\n    if (!this.initialized) {\n      this.logger.trace(`Initialized`);\n      try {\n        const messages = await this.getRelayerMessages();\n        if (typeof messages !== \"undefined\") {\n          this.messages = messages;\n        }\n        const messagesWithoutClientAck = await this.getRelayerMessagesWithoutClientAck();\n        if (typeof messagesWithoutClientAck !== \"undefined\") {\n          this.messagesWithoutClientAck = messagesWithoutClientAck;\n        }\n        this.logger.debug(`Successfully Restored records for ${this.name}`);\n        this.logger.trace({ type: \"method\", method: \"restore\", size: this.messages.size });\n      } catch (e) {\n        this.logger.debug(`Failed to Restore records for ${this.name}`);\n        this.logger.error(e as any);\n      } finally {\n        this.initialized = true;\n      }\n    }\n  };\n\n  get context(): string {\n    return getLoggerContext(this.logger);\n  }\n\n  get storageKey() {\n    return this.storagePrefix + this.version + this.core.customStoragePrefix + \"//\" + this.name;\n  }\n\n  get storageKeyWithoutClientAck() {\n    return (\n      this.storagePrefix +\n      this.version +\n      this.core.customStoragePrefix +\n      \"//\" +\n      this.name +\n      \"_withoutClientAck\"\n    );\n  }\n\n  public set: IMessageTracker[\"set\"] = async (topic, message, direction) => {\n    this.isInitialized();\n    const hash = hashMessage(message);\n    let messages = this.messages.get(topic);\n    if (typeof messages === \"undefined\") {\n      messages = {};\n    }\n    if (typeof messages[hash] !== \"undefined\") {\n      return hash;\n    }\n    messages[hash] = message;\n    this.messages.set(topic, messages);\n    // Only store messages without client ack for inbound messages\n    if (direction === MESSAGE_DIRECTION.inbound) {\n      const messagesWithoutClientAck = this.messagesWithoutClientAck.get(topic) || {};\n      this.messagesWithoutClientAck.set(topic, {\n        ...messagesWithoutClientAck,\n        [hash]: message,\n      });\n    }\n\n    await this.persist();\n    return hash;\n  };\n\n  public get: IMessageTracker[\"get\"] = (topic) => {\n    this.isInitialized();\n    let messages = this.messages.get(topic);\n    if (typeof messages === \"undefined\") {\n      messages = {};\n    }\n    return messages;\n  };\n\n  public getWithoutAck: IMessageTracker[\"getWithoutAck\"] = (topics) => {\n    this.isInitialized();\n    const messages: Record<string, string[]> = {};\n    for (const topic of topics) {\n      const messagesWithoutClientAck = this.messagesWithoutClientAck.get(topic) || {};\n      messages[topic] = Object.values(messagesWithoutClientAck);\n    }\n    return messages;\n  };\n\n  public has: IMessageTracker[\"has\"] = (topic, message) => {\n    this.isInitialized();\n    const messages = this.get(topic);\n    const hash = hashMessage(message);\n    return typeof messages[hash] !== \"undefined\";\n  };\n\n  public ack: IMessageTracker[\"ack\"] = async (topic, message) => {\n    this.isInitialized();\n    const messages = this.messagesWithoutClientAck.get(topic);\n    if (typeof messages === \"undefined\") {\n      return;\n    }\n\n    const hash = hashMessage(message);\n\n    delete messages[hash];\n    if (Object.keys(messages).length === 0) {\n      this.messagesWithoutClientAck.delete(topic);\n    } else {\n      this.messagesWithoutClientAck.set(topic, messages);\n    }\n    await this.persist();\n  };\n\n  public del: IMessageTracker[\"del\"] = async (topic) => {\n    this.isInitialized();\n    this.messages.delete(topic);\n    this.messagesWithoutClientAck.delete(topic);\n    await this.persist();\n  };\n\n  // ---------- Private ----------------------------------------------- //\n\n  private async setRelayerMessages(messages: Map<string, MessageRecord>): Promise<void> {\n    await this.core.storage.setItem<Record<string, MessageRecord>>(\n      this.storageKey,\n      mapToObj(messages),\n    );\n  }\n\n  private async setRelayerMessagesWithoutClientAck(\n    messages: Map<string, MessageRecord>,\n  ): Promise<void> {\n    await this.core.storage.setItem<Record<string, MessageRecord>>(\n      this.storageKeyWithoutClientAck,\n      mapToObj(messages),\n    );\n  }\n\n  private async getRelayerMessages(): Promise<Map<string, MessageRecord> | undefined> {\n    const messages = await this.core.storage.getItem<Record<string, MessageRecord>>(\n      this.storageKey,\n    );\n    return typeof messages !== \"undefined\" ? objToMap(messages) : undefined;\n  }\n\n  private async getRelayerMessagesWithoutClientAck(): Promise<\n    Map<string, MessageRecord> | undefined\n  > {\n    const messages = await this.core.storage.getItem<Record<string, MessageRecord>>(\n      this.storageKeyWithoutClientAck,\n    );\n    return typeof messages !== \"undefined\" ? objToMap(messages) : undefined;\n  }\n\n  private async persist() {\n    await this.setRelayerMessages(this.messages);\n    await this.setRelayerMessagesWithoutClientAck(this.messagesWithoutClientAck);\n  }\n\n  private isInitialized() {\n    if (!this.initialized) {\n      const { message } = getInternalError(\"NOT_INITIALIZED\", this.name);\n      throw new Error(message);\n    }\n  }\n}\n","import { EventEmitter } from \"events\";\nimport { HEARTBEAT_EVENTS } from \"@walletconnect/heartbeat\";\nimport { JsonRpcPayload, RequestArguments } from \"@walletconnect/jsonrpc-types\";\nimport { generateChildLogger, getLoggerContext, Logger } from \"@walletconnect/logger\";\nimport { RelayJsonRpc } from \"@walletconnect/relay-api\";\nimport { IPublisher, IRelayer, RelayerTypes } from \"@walletconnect/types\";\nimport {\n  getRelayProtocolApi,\n  getRelayProtocolName,\n  isUndefined,\n  createExpiringPromise,\n} from \"@walletconnect/utils\";\nimport { getBigIntRpcId } from \"@walletconnect/jsonrpc-utils\";\nimport { FIVE_MINUTES, ONE_MINUTE, ONE_SECOND, toMiliseconds } from \"@walletconnect/time\";\n\nimport { PUBLISHER_CONTEXT, PUBLISHER_DEFAULT_TTL, RELAYER_EVENTS } from \"../constants/index.js\";\n\ntype IPublishType = {\n  attestation?: string;\n  attempt: number;\n  request: RequestArguments;\n  opts?: RelayerTypes.PublishOptions;\n};\n\nexport class Publisher extends IPublisher {\n  public events = new EventEmitter();\n  public name = PUBLISHER_CONTEXT;\n  public queue = new Map<string, IPublishType>();\n\n  private publishTimeout = toMiliseconds(ONE_MINUTE);\n  private initialPublishTimeout = toMiliseconds(ONE_SECOND * 15);\n  private needsTransportRestart = false;\n\n  constructor(\n    public relayer: IRelayer,\n    public logger: Logger,\n  ) {\n    super(relayer, logger);\n    this.relayer = relayer;\n    this.logger = generateChildLogger(logger, this.name);\n    this.registerEventListeners();\n  }\n\n  get context() {\n    return getLoggerContext(this.logger);\n  }\n\n  public publish: IPublisher[\"publish\"] = async (topic, message, opts) => {\n    this.logger.debug(`Publishing Payload`);\n    this.logger.trace({ type: \"method\", method: \"publish\", params: { topic, message, opts } });\n\n    const ttl = opts?.ttl || PUBLISHER_DEFAULT_TTL;\n    const prompt = opts?.prompt || false;\n    const tag = opts?.tag || 0;\n    const id = opts?.id || (getBigIntRpcId().toString() as any);\n\n    const api = getRelayProtocolApi(getRelayProtocolName().protocol);\n\n    const request: RequestArguments<RelayJsonRpc.PublishParams> = {\n      id,\n      method: opts?.publishMethod || api.publish,\n      params: {\n        topic,\n        message,\n        ttl,\n        prompt,\n        tag,\n        attestation: opts?.attestation,\n        ...opts?.tvf,\n      },\n    };\n\n    const failedPublishMessage = `Failed to publish payload, please try again. id:${id} tag:${tag}`;\n    try {\n      if (isUndefined(request.params?.prompt)) delete request.params?.prompt;\n      if (isUndefined(request.params?.tag)) delete request.params?.tag;\n\n      /**\n       * attempt to publish the payload for <initialPublishTimeout> seconds,\n       * if the publish fails, add the payload to the queue and it will be retried on every pulse\n       * until it is successfully published or <publishTimeout> seconds have passed\n       */\n      const publishPromise = new Promise<void>(async (resolve) => {\n        const onPublish = ({ id }: { id: string }) => {\n          if (request.id?.toString() === id.toString()) {\n            this.removeRequestFromQueue(id);\n            this.relayer.events.removeListener(RELAYER_EVENTS.publish, onPublish);\n            resolve();\n          }\n        };\n        this.relayer.events.on(RELAYER_EVENTS.publish, onPublish);\n        const initialPublish = createExpiringPromise(\n          new Promise((resolve, reject) => {\n            this.rpcPublish(request, opts)\n              .then(resolve)\n              .catch((e) => {\n                this.logger.warn(e, e?.message);\n                reject(e);\n              });\n          }),\n          this.initialPublishTimeout,\n          `Failed initial publish, retrying.... id:${id} tag:${tag}`,\n        );\n        try {\n          await initialPublish;\n          this.events.removeListener(RELAYER_EVENTS.publish, onPublish);\n        } catch (e) {\n          this.queue.set(id, { request, opts, attempt: 1 });\n          this.logger.warn(e, (e as Error)?.message);\n        }\n      });\n      this.logger.trace({\n        type: \"method\",\n        method: \"publish\",\n        params: { id, topic, message, opts },\n      });\n\n      await createExpiringPromise(publishPromise, this.publishTimeout, failedPublishMessage);\n    } catch (e) {\n      this.logger.debug(`Failed to Publish Payload`);\n      this.logger.error(e as any);\n      if (opts?.internal?.throwOnFailedPublish) {\n        throw e;\n      }\n    } finally {\n      this.queue.delete(id);\n    }\n  };\n\n  public publishCustom: IPublisher[\"publishCustom\"] = async (params) => {\n    this.logger.debug(`Publishing custom payload`);\n    this.logger.trace({ type: \"method\", method: \"publishCustom\", params });\n\n    const { payload, opts = {} } = params;\n    const { attestation, tvf, publishMethod, prompt, tag, ttl = FIVE_MINUTES } = opts;\n\n    const id = opts.id || (getBigIntRpcId().toString() as any);\n    const api = getRelayProtocolApi(getRelayProtocolName().protocol);\n    const method = publishMethod || api.publish;\n    const request: RequestArguments<RelayJsonRpc.PublishParams> = {\n      id,\n      method,\n      params: {\n        ...payload,\n        ttl,\n        prompt,\n        tag,\n        attestation,\n        ...tvf,\n      },\n    };\n    const failedPublishMessage = `Failed to publish custom payload, please try again. id:${id} tag:${tag}`;\n    try {\n      if (isUndefined(request.params?.prompt)) delete request.params?.prompt;\n      if (isUndefined(request.params?.tag)) delete request.params?.tag;\n\n      /**\n       * attempt to publish the payload for <initialPublishTimeout> seconds,\n       * if the publish fails, add the payload to the queue and it will be retried on every pulse\n       * until it is successfully published or <publishTimeout> seconds have passed\n       */\n      const publishPromise = new Promise<void>(async (resolve) => {\n        const onPublish = ({ id }: { id: string }) => {\n          if (request.id?.toString() === id.toString()) {\n            this.removeRequestFromQueue(id);\n            this.relayer.events.removeListener(RELAYER_EVENTS.publish, onPublish);\n            resolve();\n          }\n        };\n        this.relayer.events.on(RELAYER_EVENTS.publish, onPublish);\n        const initialPublish = createExpiringPromise(\n          new Promise((resolve, reject) => {\n            this.rpcPublish(request, opts)\n              .then(resolve)\n              .catch((e) => {\n                this.logger.warn(e, e?.message);\n                reject(e);\n              });\n          }),\n          this.initialPublishTimeout,\n          `Failed initial custom payload publish, retrying.... method:${method} id:${id} tag:${tag}`,\n        );\n        try {\n          await initialPublish;\n          this.events.removeListener(RELAYER_EVENTS.publish, onPublish);\n        } catch (e) {\n          this.queue.set(id, { request, opts, attempt: 1 });\n          this.logger.warn(e, (e as Error)?.message);\n        }\n      });\n      this.logger.trace({\n        type: \"method\",\n        method: \"publish\",\n        params: { id, payload, opts },\n      });\n\n      await createExpiringPromise(publishPromise, this.publishTimeout, failedPublishMessage);\n    } catch (e) {\n      this.logger.debug(`Failed to Publish Payload`);\n      this.logger.error(e as any);\n      if (opts?.internal?.throwOnFailedPublish) {\n        throw e;\n      }\n    } finally {\n      this.queue.delete(id);\n    }\n  };\n\n  public on: IPublisher[\"on\"] = (event, listener) => {\n    this.events.on(event, listener);\n  };\n\n  public once: IPublisher[\"once\"] = (event, listener) => {\n    this.events.once(event, listener);\n  };\n\n  public off: IPublisher[\"off\"] = (event, listener) => {\n    this.events.off(event, listener);\n  };\n\n  public removeListener: IPublisher[\"removeListener\"] = (event, listener) => {\n    this.events.removeListener(event, listener);\n  };\n\n  // ---------- Private ----------------------------------------------- //\n\n  private async rpcPublish(request: RequestArguments, opts?: RelayerTypes.PublishOptions) {\n    this.logger.debug(`Outgoing Relay Payload`);\n    this.logger.trace({ type: \"message\", direction: \"outgoing\", request });\n    const result = await this.relayer.request(request);\n\n    this.relayer.events.emit(RELAYER_EVENTS.publish, { ...request, ...opts });\n    this.logger.debug(`Successfully Published Payload`);\n    return result;\n  }\n\n  private removeRequestFromQueue(id: string) {\n    this.queue.delete(id);\n  }\n\n  private checkQueue() {\n    this.queue.forEach(async (params, id) => {\n      const attempt = params.attempt + 1;\n      this.queue.set(id, { ...params, attempt });\n      this.logger.warn(\n        {},\n        `Publisher: queue->publishing: ${params.request.id}, tag: ${params.request.params?.tag}, attempt: ${attempt}`,\n      );\n      await this.rpcPublish(params.request, params.opts);\n      this.logger.warn({}, `Publisher: queue->published: ${params.request.id}`);\n    });\n  }\n\n  private registerEventListeners() {\n    this.relayer.core.heartbeat.on(HEARTBEAT_EVENTS.pulse, () => {\n      // restart the transport if needed\n      // queue will be processed on the next pulse\n      if (this.needsTransportRestart) {\n        this.needsTransportRestart = false;\n        this.relayer.events.emit(RELAYER_EVENTS.connection_stalled);\n        return;\n      }\n      this.checkQueue();\n    });\n    this.relayer.on(RELAYER_EVENTS.message_ack, (event: JsonRpcPayload) => {\n      this.removeRequestFromQueue(event.id.toString());\n    });\n  }\n}\n","import { ISubscriberTopicMap } from \"@walletconnect/types\";\n\nexport class SubscriberTopicMap implements ISubscriberTopicMap {\n  public map = new Map<string, string[]>();\n\n  get topics(): string[] {\n    return Array.from(this.map.keys());\n  }\n\n  public set: ISubscriberTopicMap[\"set\"] = (topic, id) => {\n    const ids = this.get(topic);\n    if (this.exists(topic, id)) return;\n    this.map.set(topic, [...ids, id]);\n  };\n\n  public get: ISubscriberTopicMap[\"get\"] = (topic) => {\n    const ids = this.map.get(topic);\n    return ids || [];\n  };\n\n  public exists: ISubscriberTopicMap[\"exists\"] = (topic, id) => {\n    const ids = this.get(topic);\n    return ids.includes(id);\n  };\n\n  public delete: ISubscriberTopicMap[\"delete\"] = (topic, id) => {\n    if (typeof id === \"undefined\") {\n      this.map.delete(topic);\n      return;\n    }\n    if (!this.map.has(topic)) return;\n    const ids = this.get(topic);\n    if (!this.exists(topic, id)) return;\n    const remaining = ids.filter((x) => x !== id);\n    if (!remaining.length) {\n      this.map.delete(topic);\n      return;\n    }\n    this.map.set(topic, remaining);\n  };\n\n  public clear: ISubscriberTopicMap[\"clear\"] = () => {\n    this.map.clear();\n  };\n}\n","import { EventEmitter } from \"events\";\nimport { HEARTBEAT_EVENTS } from \"@walletconnect/heartbeat\";\nimport { ErrorResponse, RequestArguments } from \"@walletconnect/jsonrpc-types\";\nimport { generateChildLogger, getLoggerContext, Logger } from \"@walletconnect/logger\";\nimport { RelayJsonRpc } from \"@walletconnect/relay-api\";\nimport { ONE_SECOND, ONE_MINUTE, toMiliseconds } from \"@walletconnect/time\";\nimport {\n  IRelayer,\n  ISubscriber,\n  RelayerTypes,\n  SubscriberEvents,\n  SubscriberTypes,\n} from \"@walletconnect/types\";\nimport {\n  getSdkError,\n  getInternalError,\n  getRelayProtocolApi,\n  getRelayProtocolName,\n  createExpiringPromise,\n  hashMessage,\n  sleep,\n} from \"@walletconnect/utils\";\nimport {\n  CORE_STORAGE_PREFIX,\n  SUBSCRIBER_CONTEXT,\n  SUBSCRIBER_EVENTS,\n  SUBSCRIBER_STORAGE_VERSION,\n  RELAYER_EVENTS,\n  TRANSPORT_TYPES,\n} from \"../constants/index.js\";\nimport { SubscriberTopicMap } from \"./topicmap.js\";\n\nexport class Subscriber extends ISubscriber {\n  public subscriptions = new Map<string, SubscriberTypes.Active>();\n\n  public topicMap = new SubscriberTopicMap();\n  public events = new EventEmitter();\n  public name = SUBSCRIBER_CONTEXT;\n  public version = SUBSCRIBER_STORAGE_VERSION;\n  public pending = new Map<string, SubscriberTypes.Params>();\n\n  private cached: SubscriberTypes.Active[] = [];\n  private initialized = false;\n  private storagePrefix = CORE_STORAGE_PREFIX;\n  private subscribeTimeout = toMiliseconds(ONE_MINUTE);\n  private initialSubscribeTimeout = toMiliseconds(ONE_SECOND * 15);\n  private clientId: string;\n  private batchSubscribeTopicsLimit = 500;\n\n  constructor(\n    public relayer: IRelayer,\n    public logger: Logger,\n  ) {\n    super(relayer, logger);\n    this.relayer = relayer;\n    this.logger = generateChildLogger(logger, this.name);\n    this.clientId = \"\"; // assigned when calling this.getClientId()\n  }\n\n  public init: ISubscriber[\"init\"] = async () => {\n    if (!this.initialized) {\n      this.logger.trace(`Initialized`);\n      this.registerEventListeners();\n      await this.restore();\n    }\n    this.initialized = true;\n  };\n\n  get context() {\n    return getLoggerContext(this.logger);\n  }\n\n  get storageKey() {\n    return (\n      this.storagePrefix + this.version + this.relayer.core.customStoragePrefix + \"//\" + this.name\n    );\n  }\n\n  get length() {\n    return this.subscriptions.size;\n  }\n\n  get ids() {\n    return Array.from(this.subscriptions.keys());\n  }\n\n  get values() {\n    return Array.from(this.subscriptions.values());\n  }\n\n  get topics() {\n    return this.topicMap.topics;\n  }\n\n  get hasAnyTopics() {\n    return (\n      this.topicMap.topics.length > 0 ||\n      this.pending.size > 0 ||\n      this.cached.length > 0 ||\n      this.subscriptions.size > 0\n    );\n  }\n\n  public subscribe: ISubscriber[\"subscribe\"] = async (topic, opts) => {\n    this.isInitialized();\n    this.logger.debug(`Subscribing Topic`);\n    this.logger.trace({ type: \"method\", method: \"subscribe\", params: { topic, opts } });\n    try {\n      const relay = getRelayProtocolName(opts);\n      const params = { topic, relay, transportType: opts?.transportType };\n      if (!opts?.internal?.skipSubscribe) {\n        this.pending.set(topic, params);\n      }\n      const id = await this.rpcSubscribe(topic, relay, opts);\n      if (typeof id === \"string\") {\n        this.onSubscribe(id, params);\n        this.logger.debug(`Successfully Subscribed Topic`);\n        this.logger.trace({ type: \"method\", method: \"subscribe\", params: { topic, opts } });\n      }\n      return id;\n    } catch (e) {\n      this.logger.debug(`Failed to Subscribe Topic`);\n      this.logger.error(e as any);\n      throw e;\n    }\n  };\n\n  public unsubscribe: ISubscriber[\"unsubscribe\"] = async (topic, opts) => {\n    this.isInitialized();\n    if (typeof opts?.id !== \"undefined\") {\n      await this.unsubscribeById(topic, opts.id, opts);\n    } else {\n      await this.unsubscribeByTopic(topic, opts);\n    }\n  };\n\n  /**\n   * returns `true` only if the topic is actively subscribed to i.e. not pending or cached\n   */\n  public isSubscribed: ISubscriber[\"isSubscribed\"] = (topic: string) => {\n    return new Promise((resolve) => {\n      resolve(this.topicMap.topics.includes(topic));\n    });\n  };\n\n  /**\n   * returns `true` if the topic is known to the subscriber i.e. it is actively subscribed, pending, cached or in the topic map\n   */\n  public isKnownTopic: ISubscriber[\"isKnownTopic\"] = (topic: string) => {\n    return new Promise((resolve) => {\n      resolve(\n        this.topicMap.topics.includes(topic) ||\n          this.pending.has(topic) ||\n          this.cached.some((s) => s.topic === topic),\n      );\n    });\n  };\n\n  public on: ISubscriber[\"on\"] = (event, listener) => {\n    this.events.on(event, listener);\n  };\n\n  public once: ISubscriber[\"once\"] = (event, listener) => {\n    this.events.once(event, listener);\n  };\n\n  public off: ISubscriber[\"off\"] = (event, listener) => {\n    this.events.off(event, listener);\n  };\n\n  public removeListener: ISubscriber[\"removeListener\"] = (event, listener) => {\n    this.events.removeListener(event, listener);\n  };\n\n  public start: ISubscriber[\"start\"] = async () => {\n    await this.onConnect();\n  };\n\n  public stop: ISubscriber[\"stop\"] = async () => {\n    await this.onDisconnect();\n  };\n\n  // ---------- Private ----------------------------------------------- //\n\n  private hasSubscription(id: string, topic: string) {\n    let result = false;\n    try {\n      const subscription = this.getSubscription(id);\n      result = subscription.topic === topic;\n    } catch (e) {\n      // ignore error\n    }\n    return result;\n  }\n\n  private reset() {\n    this.cached = [];\n    this.initialized = true;\n  }\n\n  private onDisable() {\n    // only write to this.cached if there are active subscriptions\n    // as this.cached can be overridden if onDisable is called multiple times\n    if (this.values.length > 0) {\n      this.cached = this.values;\n    }\n    this.subscriptions.clear();\n    this.topicMap.clear();\n  }\n\n  private async unsubscribeByTopic(topic: string, opts?: RelayerTypes.UnsubscribeOptions) {\n    const ids = this.topicMap.get(topic);\n    await Promise.all(ids.map(async (id) => await this.unsubscribeById(topic, id, opts)));\n  }\n\n  private async unsubscribeById(topic: string, id: string, opts?: RelayerTypes.UnsubscribeOptions) {\n    this.logger.debug(`Unsubscribing Topic`);\n    this.logger.trace({ type: \"method\", method: \"unsubscribe\", params: { topic, id, opts } });\n    try {\n      // optimistically remove the subscription from the local state\n      const reason = getSdkError(\"USER_DISCONNECTED\", `${this.name}, ${topic}`);\n      await this.onUnsubscribe(topic, id, reason);\n      const relay = getRelayProtocolName(opts);\n      await this.restartToComplete({ topic, id, relay });\n      await this.rpcUnsubscribe(topic, id, relay);\n      this.logger.debug(`Successfully Unsubscribed Topic`);\n      this.logger.trace({ type: \"method\", method: \"unsubscribe\", params: { topic, id, opts } });\n    } catch (e) {\n      this.logger.debug(`Failed to Unsubscribe Topic`);\n      this.logger.error(e as any);\n      throw e;\n    }\n  }\n\n  private async rpcSubscribe(\n    topic: string,\n    relay: RelayerTypes.ProtocolOptions,\n    opts?: RelayerTypes.SubscribeOptions,\n  ) {\n    const subId = await this.getSubscriptionId(topic);\n    if (opts?.internal?.skipSubscribe) {\n      return subId;\n    }\n    if (!opts || opts?.transportType === TRANSPORT_TYPES.relay) {\n      await this.restartToComplete({ topic, id: topic, relay });\n    }\n    const api = getRelayProtocolApi(relay.protocol);\n    const request: RequestArguments<RelayJsonRpc.SubscribeParams> = {\n      method: api.subscribe,\n      params: {\n        topic,\n      },\n    };\n    this.logger.debug(`Outgoing Relay Payload`);\n    this.logger.trace({ type: \"payload\", direction: \"outgoing\", request });\n    const shouldThrow = opts?.internal?.throwOnFailedPublish;\n    try {\n      // in link mode, allow the app to update its network state (i.e. active airplane mode) with small delay before attempting to subscribe\n      if (opts?.transportType === TRANSPORT_TYPES.link_mode) {\n        setTimeout(() => {\n          if (this.relayer.connected || this.relayer.connecting) {\n            this.relayer.request(request).catch((e) => this.logger.warn(e));\n          }\n        }, toMiliseconds(ONE_SECOND));\n        return subId;\n      }\n      const subscribePromise = new Promise(async (resolve) => {\n        const onSubscribe = (subscription: SubscriberEvents.Created) => {\n          if (subscription.topic === topic) {\n            this.events.removeListener(SUBSCRIBER_EVENTS.created, onSubscribe);\n            resolve(subscription.id);\n          }\n        };\n        this.events.on(SUBSCRIBER_EVENTS.created, onSubscribe);\n        try {\n          const result = await createExpiringPromise(\n            new Promise((resolve, reject) => {\n              this.relayer\n                .request(request)\n                .catch((e) => {\n                  this.logger.warn(e, e?.message);\n                  reject(e);\n                })\n                .then(resolve);\n            }),\n            this.initialSubscribeTimeout,\n            `Subscribing to ${topic} failed, please try again`,\n          );\n          this.events.removeListener(SUBSCRIBER_EVENTS.created, onSubscribe);\n          resolve(result);\n        } catch (err) {}\n      });\n\n      const subscribe = createExpiringPromise(\n        subscribePromise,\n        this.subscribeTimeout,\n        `Subscribing to ${topic} failed, please try again`,\n      );\n\n      const result = await subscribe;\n      if (!result && shouldThrow) {\n        throw new Error(`Subscribing to ${topic} failed, please try again`);\n      }\n      // return null to indicate that the subscription failed\n      return result ? subId : null;\n    } catch (err) {\n      this.logger.debug(`Outgoing Relay Subscribe Payload stalled`);\n      this.relayer.events.emit(RELAYER_EVENTS.connection_stalled);\n      if (shouldThrow) {\n        throw err;\n      }\n    }\n    return null;\n  }\n\n  private async rpcBatchSubscribe(subscriptions: SubscriberTypes.Params[]): Promise<boolean> {\n    if (!subscriptions.length) return true;\n    const relay = subscriptions[0].relay;\n    const api = getRelayProtocolApi(relay!.protocol);\n    const request: RequestArguments<RelayJsonRpc.BatchSubscribeParams> = {\n      method: api.batchSubscribe,\n      params: {\n        topics: subscriptions.map((s) => s.topic),\n      },\n    };\n    this.logger.debug(`Outgoing Relay Payload`);\n    this.logger.trace({ type: \"payload\", direction: \"outgoing\", request });\n    try {\n      await createExpiringPromise(\n        new Promise((resolve, reject) => {\n          this.relayer\n            .request(request)\n            .then(resolve)\n            .catch((e) => {\n              this.logger.warn(e);\n              reject(e);\n            });\n        }),\n        this.subscribeTimeout,\n        \"rpcBatchSubscribe failed, please try again\",\n      );\n      return true;\n    } catch (err) {\n      this.relayer.events.emit(RELAYER_EVENTS.connection_stalled);\n      return false;\n    }\n  }\n\n  private async rpcBatchFetchMessages(subscriptions: SubscriberTypes.Params[]) {\n    if (!subscriptions.length) return;\n    const relay = subscriptions[0].relay;\n    const api = getRelayProtocolApi(relay!.protocol);\n    const request: RequestArguments<RelayJsonRpc.BatchFetchMessagesParams> = {\n      method: api.batchFetchMessages,\n      params: {\n        topics: subscriptions.map((s) => s.topic),\n      },\n    };\n    this.logger.debug(`Outgoing Relay Payload`);\n    this.logger.trace({ type: \"payload\", direction: \"outgoing\", request });\n    let result;\n    try {\n      const fetchMessagesPromise = await createExpiringPromise(\n        new Promise((resolve, reject) => {\n          this.relayer\n            .request(request)\n            .catch((e) => {\n              this.logger.warn(e);\n              reject(e);\n            })\n            .then(resolve);\n        }),\n        this.subscribeTimeout,\n        \"rpcBatchFetchMessages failed, please try again\",\n      );\n      result = (await fetchMessagesPromise) as {\n        messages: RelayerTypes.MessageEvent[];\n      };\n    } catch (err) {\n      this.relayer.events.emit(RELAYER_EVENTS.connection_stalled);\n    }\n    return result;\n  }\n\n  private rpcUnsubscribe(topic: string, id: string, relay: RelayerTypes.ProtocolOptions) {\n    const api = getRelayProtocolApi(relay.protocol);\n    const request: RequestArguments<RelayJsonRpc.UnsubscribeParams> = {\n      method: api.unsubscribe,\n      params: {\n        topic,\n        id,\n      },\n    };\n    this.logger.debug(`Outgoing Relay Payload`);\n    this.logger.trace({ type: \"payload\", direction: \"outgoing\", request });\n    return this.relayer.request(request);\n  }\n\n  private onSubscribe(id: string, params: SubscriberTypes.Params) {\n    this.setSubscription(id, { ...params, id });\n    this.pending.delete(params.topic);\n  }\n\n  private onBatchSubscribe(subscriptions: SubscriberTypes.Active[]) {\n    if (!subscriptions.length) return;\n    subscriptions.forEach((subscription) => {\n      this.setSubscription(subscription.id, { ...subscription });\n      this.pending.delete(subscription.topic);\n    });\n  }\n\n  private async onUnsubscribe(topic: string, id: string, reason: ErrorResponse) {\n    this.events.removeAllListeners(id);\n    if (this.hasSubscription(id, topic)) {\n      this.deleteSubscription(id, reason);\n    }\n    await this.relayer.messages.del(topic);\n  }\n\n  private async setRelayerSubscriptions(subscriptions: SubscriberTypes.Active[]) {\n    await this.relayer.core.storage.setItem<SubscriberTypes.Active[]>(\n      this.storageKey,\n      subscriptions,\n    );\n  }\n\n  private async getRelayerSubscriptions() {\n    const subscriptions = await this.relayer.core.storage.getItem<SubscriberTypes.Active[]>(\n      this.storageKey,\n    );\n    return subscriptions;\n  }\n\n  private setSubscription(id: string, subscription: SubscriberTypes.Active) {\n    this.logger.debug(`Setting subscription`);\n    this.logger.trace({ type: \"method\", method: \"setSubscription\", id, subscription });\n    this.addSubscription(id, subscription);\n  }\n\n  private addSubscription(id: string, subscription: SubscriberTypes.Active) {\n    this.subscriptions.set(id, { ...subscription });\n    this.topicMap.set(subscription.topic, id);\n    this.events.emit(SUBSCRIBER_EVENTS.created, subscription);\n  }\n\n  private getSubscription(id: string) {\n    this.logger.debug(`Getting subscription`);\n    this.logger.trace({ type: \"method\", method: \"getSubscription\", id });\n    const subscription = this.subscriptions.get(id);\n    if (!subscription) {\n      const { message } = getInternalError(\"NO_MATCHING_KEY\", `${this.name}: ${id}`);\n      throw new Error(message);\n    }\n    return subscription;\n  }\n\n  private deleteSubscription(id: string, reason: ErrorResponse) {\n    this.logger.debug(`Deleting subscription`);\n    this.logger.trace({ type: \"method\", method: \"deleteSubscription\", id, reason });\n    const subscription = this.getSubscription(id);\n    this.subscriptions.delete(id);\n    this.topicMap.delete(subscription.topic, id);\n    this.events.emit(SUBSCRIBER_EVENTS.deleted, {\n      ...subscription,\n      reason,\n    } as SubscriberEvents.Deleted);\n  }\n\n  private restart = async () => {\n    await this.restore();\n    await this.onRestart();\n  };\n\n  private async persist() {\n    await this.setRelayerSubscriptions(this.values);\n    this.events.emit(SUBSCRIBER_EVENTS.sync);\n  }\n\n  private async onRestart() {\n    if (this.cached.length) {\n      const subs = [...this.cached];\n      const numOfBatches = Math.ceil(this.cached.length / this.batchSubscribeTopicsLimit);\n      for (let i = 0; i < numOfBatches; i++) {\n        const batch = subs.splice(0, this.batchSubscribeTopicsLimit);\n        await this.batchSubscribe(batch);\n      }\n    }\n    this.events.emit(SUBSCRIBER_EVENTS.resubscribed);\n  }\n\n  private async restore() {\n    try {\n      const persisted = await this.getRelayerSubscriptions();\n      if (typeof persisted === \"undefined\") return;\n      if (!persisted.length) return;\n      if (\n        this.subscriptions.size &&\n        // throw only if the persisted topics differ\n        !persisted.every((s) => s.topic === this.subscriptions.get(s.id)?.topic)\n      ) {\n        const { message } = getInternalError(\"RESTORE_WILL_OVERRIDE\", this.name);\n        this.logger.error(message);\n        this.logger.error(`${this.name}: ${JSON.stringify(this.values)}`);\n        throw new Error(message);\n      }\n      this.cached = persisted;\n      this.logger.debug(`Successfully Restored subscriptions for ${this.name}`);\n      this.logger.trace({ type: \"method\", method: \"restore\", subscriptions: this.values });\n    } catch (e) {\n      this.logger.debug(`Failed to Restore subscriptions for ${this.name}`);\n      this.logger.error(e as any);\n    }\n  }\n\n  private async batchSubscribe(subscriptions: SubscriberTypes.Params[]) {\n    if (!subscriptions.length) return;\n\n    const success = await this.rpcBatchSubscribe(subscriptions);\n    if (!success) {\n      this.logger.warn(\n        `Batch subscribe failed for ${subscriptions.length} topics, adding to pending for retry`,\n      );\n      subscriptions.forEach((s) => {\n        this.pending.set(s.topic, s);\n      });\n      return;\n    }\n    this.onBatchSubscribe(\n      await Promise.all(\n        subscriptions.map(async (s) => {\n          return { ...s, id: await this.getSubscriptionId(s.topic) };\n        }),\n      ),\n    );\n  }\n\n  // @ts-ignore\n  private async batchFetchMessages(subscriptions: SubscriberTypes.Params[]) {\n    if (!subscriptions.length) return;\n    this.logger.trace(`Fetching batch messages for ${subscriptions.length} subscriptions`);\n    const response = await this.rpcBatchFetchMessages(subscriptions);\n    if (response && response.messages) {\n      await sleep(toMiliseconds(ONE_SECOND));\n      await this.relayer.handleBatchMessageEvents(response.messages);\n    }\n  }\n\n  private async onConnect() {\n    await this.restart();\n    this.reset();\n  }\n\n  private onDisconnect() {\n    this.onDisable();\n  }\n\n  private checkPending = async () => {\n    if (this.pending.size === 0 && (!this.initialized || !this.relayer.connected)) {\n      return;\n    }\n    const pendingSubscriptions: SubscriberTypes.Params[] = [];\n    this.pending.forEach((params) => {\n      pendingSubscriptions.push(params);\n    });\n\n    await this.batchSubscribe(pendingSubscriptions);\n  };\n\n  private registerEventListeners = () => {\n    this.relayer.core.heartbeat.on(HEARTBEAT_EVENTS.pulse, async () => {\n      await this.checkPending();\n    });\n    this.events.on(SUBSCRIBER_EVENTS.created, async (createdEvent: SubscriberEvents.Created) => {\n      const eventName = SUBSCRIBER_EVENTS.created;\n      this.logger.info(`Emitting ${eventName}`);\n      this.logger.debug({ type: \"event\", event: eventName, data: createdEvent });\n      await this.persist();\n    });\n    this.events.on(SUBSCRIBER_EVENTS.deleted, async (deletedEvent: SubscriberEvents.Deleted) => {\n      const eventName = SUBSCRIBER_EVENTS.deleted;\n      this.logger.info(`Emitting ${eventName}`);\n      this.logger.debug({ type: \"event\", event: eventName, data: deletedEvent });\n      await this.persist();\n    });\n  };\n\n  private isInitialized() {\n    if (!this.initialized) {\n      const { message } = getInternalError(\"NOT_INITIALIZED\", this.name);\n      throw new Error(message);\n    }\n  }\n\n  private async restartToComplete(subscription: SubscriberTypes.Active) {\n    if (!this.relayer.connected && !this.relayer.connecting) {\n      this.cached.push(subscription);\n      await this.relayer.transportOpen();\n    }\n  }\n\n  private async getClientId() {\n    if (!this.clientId) {\n      this.clientId = await this.relayer.core.crypto.getClientId();\n    }\n    return this.clientId;\n  }\n\n  private async getSubscriptionId(topic: string) {\n    return hashMessage(topic + (await this.getClientId()));\n  }\n}\n","import { EventEmitter } from \"events\";\nimport { JsonRpcProvider } from \"@walletconnect/jsonrpc-provider\";\nimport {\n  formatJsonRpcResult,\n  getBigIntRpcId,\n  IJsonRpcProvider,\n  isJsonRpcRequest,\n  isJsonRpcResponse,\n  JsonRpcPayload,\n  JsonRpcRequest,\n  RequestArguments,\n} from \"@walletconnect/jsonrpc-utils\";\nimport WsConnection from \"@walletconnect/jsonrpc-ws-connection\";\nimport { RelayJsonRpc } from \"@walletconnect/relay-api\";\nimport {\n  FIVE_MINUTES,\n  ONE_SECOND,\n  FIVE_SECONDS,\n  THIRTY_SECONDS,\n  toMiliseconds,\n} from \"@walletconnect/time\";\nimport {\n  ICore,\n  IMessageTracker,\n  IPublisher,\n  IRelayer,\n  ISubscriber,\n  RelayerOptions,\n  RelayerTypes,\n  SubscriberTypes,\n} from \"@walletconnect/types\";\nimport {\n  createExpiringPromise,\n  formatRelayRpcUrl,\n  isOnline,\n  subscribeToNetworkChange,\n  getAppId,\n  isAndroid,\n  isIos,\n  getInternalError,\n  isNode,\n  calcExpiry,\n  isAppVisible,\n  createLogger,\n} from \"@walletconnect/utils\";\n\nimport { HEARTBEAT_EVENTS } from \"@walletconnect/heartbeat\";\nimport { getLoggerContext, Logger } from \"@walletconnect/logger\";\n\nimport {\n  RELAYER_SDK_VERSION,\n  RELAYER_CONTEXT,\n  RELAYER_DEFAULT_LOGGER,\n  RELAYER_EVENTS,\n  RELAYER_PROVIDER_EVENTS,\n  RELAYER_SUBSCRIBER_SUFFIX,\n  RELAYER_DEFAULT_RELAY_URL,\n  SUBSCRIBER_EVENTS,\n  RELAYER_RECONNECT_TIMEOUT,\n  TRANSPORT_TYPES,\n  MESSAGE_DIRECTION,\n} from \"../constants/index.js\";\nimport { MessageTracker } from \"./messages.js\";\nimport { Publisher } from \"./publisher.js\";\nimport { Subscriber } from \"./subscriber.js\";\n\nexport class Relayer extends IRelayer {\n  public protocol = \"wc\";\n  public version = 2;\n\n  public core: ICore;\n  public logger: Logger;\n  public events = new EventEmitter();\n  public provider: IJsonRpcProvider;\n  public messages: IMessageTracker;\n  public subscriber: ISubscriber;\n  public publisher: IPublisher;\n  public name = RELAYER_CONTEXT;\n  public transportExplicitlyClosed = false;\n\n  private initialized = false;\n  private connectionAttemptInProgress = false;\n\n  private relayUrl: string;\n  private projectId: string | undefined;\n  private packageName: string | undefined;\n  private bundleId: string | undefined;\n  private hasExperiencedNetworkDisruption = false;\n  private pingTimeout: NodeJS.Timeout | undefined;\n  /**\n   * the relay pings the client 30 seconds after the last message was received\n   * meaning if we don't receive a message in 30 seconds, the connection can be considered dead\n   */\n  private heartBeatTimeout = toMiliseconds(THIRTY_SECONDS + FIVE_SECONDS);\n  private reconnectTimeout: NodeJS.Timeout | undefined;\n  private connectPromise: Promise<void> | undefined;\n  private reconnectInProgress = false;\n  private requestsInFlight: string[] = [];\n  private connectTimeout = toMiliseconds(ONE_SECOND * 15);\n  private stalledRestartInProgress = false;\n  private stalledRestartTimeout: NodeJS.Timeout | undefined;\n  private stalledRestartBackoff = 0;\n  private readonly stalledRestartBaseInterval = toMiliseconds(ONE_SECOND * 2);\n  private readonly stalledRestartMaxInterval = toMiliseconds(THIRTY_SECONDS);\n  constructor(opts: RelayerOptions) {\n    super(opts);\n    this.core = opts.core;\n    this.logger = createLogger({\n      logger: opts.logger ?? RELAYER_DEFAULT_LOGGER,\n      name: this.name,\n    });\n    this.messages = new MessageTracker(this.logger, opts.core);\n    this.subscriber = new Subscriber(this, this.logger);\n    this.publisher = new Publisher(this, this.logger);\n\n    this.projectId = opts.projectId;\n    this.relayUrl = opts.relayUrl || RELAYER_DEFAULT_RELAY_URL;\n\n    if (isAndroid()) {\n      this.packageName = getAppId();\n    } else if (isIos()) {\n      this.bundleId = getAppId();\n    }\n\n    // re-assigned during init()\n    this.provider = {} as IJsonRpcProvider;\n  }\n\n  public async init() {\n    this.logger.trace(`Initialized`);\n    this.registerEventListeners();\n    await Promise.all([this.messages.init(), this.subscriber.init()]);\n    this.initialized = true;\n    // don't block init with transportOpen\n    this.transportOpen().catch((e) => this.logger.warn(e, (e as Error)?.message));\n  }\n\n  get context() {\n    return getLoggerContext(this.logger);\n  }\n\n  get connected() {\n    // @ts-expect-error\n    return this.provider?.connection?.socket?.readyState === 1;\n  }\n\n  get connecting() {\n    return (\n      // @ts-expect-error\n      this.provider?.connection?.socket?.readyState === 0 || this.connectPromise !== undefined\n    );\n  }\n\n  public async publish(topic: string, message: string, opts?: RelayerTypes.PublishOptions) {\n    this.isInitialized();\n    await this.publisher.publish(topic, message, opts);\n    await this.recordMessageEvent(\n      {\n        topic,\n        message,\n        // We don't have `publishedAt` from the relay server on outgoing, so use current time to satisfy type.\n        publishedAt: Date.now(),\n        transportType: TRANSPORT_TYPES.relay,\n      },\n      MESSAGE_DIRECTION.outbound,\n    );\n  }\n\n  public async publishCustom(params: { payload: any; opts?: RelayerTypes.PublishOptions }) {\n    this.isInitialized();\n    await this.publisher.publishCustom(params);\n  }\n\n  public async subscribe(topic: string, opts?: RelayerTypes.SubscribeOptions) {\n    this.isInitialized();\n    if (!opts?.transportType || opts?.transportType === \"relay\") {\n      await this.toEstablishConnection();\n    }\n    const shouldThrowOnFailure = opts?.internal?.throwOnFailedPublish ?? true;\n\n    let id = this.subscriber.topicMap.get(topic)?.[0] || \"\";\n    let resolvePromise: () => void;\n    const onSubCreated = (subscription: SubscriberTypes.Active) => {\n      if (subscription.topic === topic) {\n        this.subscriber.off(SUBSCRIBER_EVENTS.created, onSubCreated);\n        resolvePromise();\n      }\n    };\n\n    await Promise.all([\n      new Promise<void>((resolve) => {\n        resolvePromise = resolve;\n        this.subscriber.on(SUBSCRIBER_EVENTS.created, onSubCreated);\n      }),\n      new Promise<void>((resolve, reject) => {\n        this.subscriber\n          .subscribe(topic, {\n            internal: {\n              throwOnFailedPublish: shouldThrowOnFailure,\n            },\n            ...opts,\n          })\n          .then((result) => {\n            id = result || id;\n            resolve();\n          })\n          .catch((error) => {\n            if (shouldThrowOnFailure) {\n              reject(error);\n            } else {\n              resolve();\n            }\n          });\n      }),\n    ]);\n    return id;\n  }\n\n  public request = async (request: RequestArguments<RelayJsonRpc.SubscribeParams>) => {\n    this.logger.debug(`Publishing Request Payload`);\n    const id = request.id || (getBigIntRpcId().toString() as any);\n    await this.toEstablishConnection();\n    try {\n      this.logger.trace(\n        {\n          id,\n          method: request.method,\n          topic: request.params?.topic,\n        },\n        \"relayer.request - publishing...\",\n      );\n      const tag = `${id}:${(request.params as any)?.tag || \"\"}`;\n      this.requestsInFlight.push(tag);\n      const result = await this.provider.request(request);\n      this.requestsInFlight = this.requestsInFlight.filter((i) => i !== tag);\n      return result;\n    } catch (e) {\n      this.logger.debug(`Failed to Publish Request: ${id}`);\n      throw e;\n    }\n  };\n\n  public async unsubscribe(topic: string, opts?: RelayerTypes.UnsubscribeOptions) {\n    this.isInitialized();\n    await this.subscriber.unsubscribe(topic, opts);\n  }\n\n  public on(event: string, listener: any) {\n    this.events.on(event, listener);\n  }\n\n  public once(event: string, listener: any) {\n    this.events.once(event, listener);\n  }\n\n  public off(event: string, listener: any) {\n    this.events.off(event, listener);\n  }\n\n  public removeListener(event: string, listener: any) {\n    this.events.removeListener(event, listener);\n  }\n\n  public async transportDisconnect() {\n    if (this.provider.disconnect && (this.hasExperiencedNetworkDisruption || this.connected)) {\n      await createExpiringPromise(this.provider.disconnect(), 2000, \"provider.disconnect()\").catch(\n        () => this.onProviderDisconnect(),\n      );\n    } else {\n      this.onProviderDisconnect();\n    }\n  }\n\n  public async transportClose() {\n    this.transportExplicitlyClosed = true;\n    clearTimeout(this.stalledRestartTimeout);\n    this.stalledRestartInProgress = false;\n    this.stalledRestartBackoff = 0;\n    await this.resetTransport();\n  }\n\n  async transportOpen(relayUrl?: string) {\n    if (!this.subscriber.hasAnyTopics) {\n      this.logger.info(\n        \"Starting WS connection skipped because the client has no topics to work with.\",\n      );\n      return;\n    }\n\n    if (this.connectPromise) {\n      this.logger.debug({}, `Waiting for existing connection attempt to resolve...`);\n      await this.connectPromise;\n      this.logger.debug({}, `Existing connection attempt resolved`);\n    } else {\n      this.connectPromise = this.connect(relayUrl).finally(() => {\n        this.connectPromise = undefined;\n      });\n      await this.connectPromise;\n    }\n    if (!this.connected) {\n      throw new Error(`Couldn't establish socket connection to the relay server: ${this.relayUrl}`);\n    }\n  }\n\n  public async restartTransport(relayUrl?: string) {\n    this.logger.debug({}, \"Restarting transport...\");\n    if (this.connectionAttemptInProgress) return;\n    this.relayUrl = relayUrl || this.relayUrl;\n    await this.confirmOnlineStateOrThrow();\n    await this.resetTransport();\n    await this.transportOpen();\n  }\n\n  private async resetTransport() {\n    // Guards must be set synchronously before any async work:\n    // - reconnectInProgress prevents onProviderDisconnect from scheduling a competing reconnect\n    // - clearTimeout prevents a pending reconnectTimeout from firing during transportDisconnect\n    this.reconnectInProgress = true;\n    clearTimeout(this.reconnectTimeout);\n    this.reconnectTimeout = undefined;\n    await this.transportDisconnect();\n    await this.subscriber.stop();\n    this.reconnectInProgress = false;\n  }\n\n  public async confirmOnlineStateOrThrow() {\n    if (await isOnline()) return;\n    throw new Error(\"No internet connection detected. Please restart your network and try again.\");\n  }\n\n  public async handleBatchMessageEvents(messages: RelayerTypes.MessageEvent[]) {\n    if (messages?.length === 0) {\n      this.logger.trace(\"Batch message events is empty. Ignoring...\");\n      return;\n    }\n    const sortedMessages = messages.sort((a, b) => a.publishedAt - b.publishedAt);\n    this.logger.debug(`Batch of ${sortedMessages.length} message events sorted`);\n    for (const message of sortedMessages) {\n      try {\n        await this.onMessageEvent(message);\n      } catch (e) {\n        this.logger.warn(e, \"Error while processing batch message event: \" + (e as Error)?.message);\n      }\n    }\n    this.logger.trace(`Batch of ${sortedMessages.length} message events processed`);\n  }\n\n  public async onLinkMessageEvent(\n    messageEvent: RelayerTypes.MessageEvent,\n    opts: { sessionExists: boolean },\n  ) {\n    const { topic } = messageEvent;\n\n    if (!opts.sessionExists) {\n      const expiry = calcExpiry(FIVE_MINUTES);\n      const pairing = { topic, expiry, relay: { protocol: \"irn\" }, active: false };\n      await this.core.pairing.pairings.set(topic, pairing);\n    }\n\n    this.events.emit(RELAYER_EVENTS.message, messageEvent);\n    await this.recordMessageEvent(messageEvent, MESSAGE_DIRECTION.inbound);\n  }\n\n  // ---------- Private ----------------------------------------------- //\n\n  private async connect(relayUrl?: string) {\n    await this.confirmOnlineStateOrThrow();\n    if (relayUrl && relayUrl !== this.relayUrl) {\n      this.relayUrl = relayUrl;\n      await this.transportDisconnect();\n    }\n\n    this.transportExplicitlyClosed = false;\n    let attempt = 1;\n    try {\n      while (attempt < 6) {\n        this.connectionAttemptInProgress = true;\n        try {\n          if (this.transportExplicitlyClosed) {\n            break;\n          }\n          this.logger.debug({}, `Connecting to ${this.relayUrl}, attempt: ${attempt}...`);\n          await this.createProvider();\n\n          // Step A: establish WebSocket connection\n          await new Promise<void>((resolve, reject) => {\n            const onDisconnect = () => {\n              reject(new Error(`Connection interrupted while trying to connect`));\n            };\n            this.provider.once(RELAYER_PROVIDER_EVENTS.disconnect, onDisconnect);\n            createExpiringPromise(\n              this.provider.connect(),\n              this.connectTimeout,\n              `Socket stalled when trying to connect to ${this.relayUrl}`,\n            )\n              .then(() => resolve())\n              .catch(reject)\n              .finally(() => {\n                this.provider.off(RELAYER_PROVIDER_EVENTS.disconnect, onDisconnect);\n                clearTimeout(this.reconnectTimeout);\n              });\n          });\n\n          // Step B: re-subscribe (only reached if Step A resolved)\n          await new Promise<void>((resolve, reject) => {\n            const onDisconnect = () => {\n              reject(new Error(`Connection interrupted while trying to subscribe`));\n            };\n            this.provider.once(RELAYER_PROVIDER_EVENTS.disconnect, onDisconnect);\n            this.subscriber\n              .start()\n              .then(resolve)\n              .catch(reject)\n              .finally(() => {\n                this.provider.off(RELAYER_PROVIDER_EVENTS.disconnect, onDisconnect);\n              });\n          });\n\n          this.hasExperiencedNetworkDisruption = false;\n        } catch (e) {\n          await this.subscriber.stop();\n          const error = e as Error;\n          this.logger.warn({}, error.message);\n          this.hasExperiencedNetworkDisruption = true;\n        }\n\n        if (this.connected) {\n          this.logger.debug(\n            {},\n            `Connected to ${this.relayUrl} successfully on attempt: ${attempt}`,\n          );\n          break;\n        }\n\n        await new Promise((resolve) => setTimeout(resolve, toMiliseconds(attempt * 1)));\n        attempt++;\n      }\n    } finally {\n      this.connectionAttemptInProgress = false;\n      clearTimeout(this.reconnectTimeout);\n      this.reconnectTimeout = undefined;\n      this.reconnectInProgress = false;\n    }\n  }\n\n  /*\n   * In Node, we must detect when the connection is stalled and terminate it.\n   * The logic is, if we don't receive ping from the relay within a certain time, we terminate the connection.\n   * The timer is refreshed on every message received from the relay.\n   *\n   * In the browser, ping/pong events are not exposed, so the above behaviour is handled by `subscribeToNetworkChange` and `isOnline` functions.\n   */\n  private startPingTimeout() {\n    if (!isNode()) return;\n    try {\n      //@ts-expect-error - Types are divergent between the node and browser WS API\n      this.provider?.connection?.socket?.on(\"ping\", () => {\n        this.resetPingTimeout();\n      });\n      this.resetPingTimeout();\n    } catch (e) {\n      this.logger.warn(e, (e as Error)?.message);\n    }\n  }\n\n  private resetPingTimeout = () => {\n    if (!isNode()) return;\n    clearTimeout(this.pingTimeout);\n    this.pingTimeout = setTimeout(() => {\n      try {\n        this.logger.debug({}, \"pingTimeout: Connection stalled, terminating...\");\n        //@ts-expect-error\n        this.provider?.connection?.socket?.terminate?.();\n      } catch (e) {\n        this.logger.warn(e, (e as Error)?.message);\n      }\n    }, this.heartBeatTimeout);\n  };\n\n  private async createProvider() {\n    if (this.provider.connection) {\n      this.unregisterProviderListeners();\n      if (this.connected) {\n        try {\n          await createExpiringPromise(\n            this.provider.disconnect(),\n            1000,\n            \"Closing previous provider\",\n          );\n        } catch {\n          // best-effort cleanup of old socket\n        }\n      }\n    }\n    const auth = await this.core.crypto.signJWT(this.relayUrl);\n\n    this.provider = new JsonRpcProvider(\n      new WsConnection(\n        formatRelayRpcUrl({\n          sdkVersion: RELAYER_SDK_VERSION,\n          protocol: this.protocol,\n          version: this.version,\n          relayUrl: this.relayUrl,\n          projectId: this.projectId,\n          auth,\n          useOnCloseEvent: true,\n          bundleId: this.bundleId,\n          packageName: this.packageName,\n        }),\n      ),\n    );\n    this.registerProviderListeners();\n  }\n\n  private async recordMessageEvent(\n    messageEvent: RelayerTypes.MessageEvent,\n    direction?: RelayerTypes.MessageDirection,\n  ) {\n    const { topic, message } = messageEvent;\n    await this.messages.set(topic, message, direction);\n  }\n\n  private async shouldIgnoreMessageEvent(\n    messageEvent: RelayerTypes.MessageEvent,\n  ): Promise<boolean> {\n    const { topic, message } = messageEvent;\n\n    // Ignore if incoming `message` is clearly invalid.\n    if (!message || message.length === 0) {\n      this.logger.warn(`Ignoring invalid/empty message: ${message}`);\n      return true;\n    }\n\n    // Ignore if `topic` is not known to the subscriber.\n    if (!(await this.subscriber.isKnownTopic(topic))) {\n      this.logger.warn(`Ignoring message for unknown topic ${topic}`);\n      return true;\n    }\n\n    // Ignore if `message` is a duplicate.\n    const exists = this.messages.has(topic, message);\n    if (exists) {\n      this.logger.warn(`Ignoring duplicate message: ${message}`);\n    }\n    return exists;\n  }\n\n  private async onProviderPayload(payload: JsonRpcPayload) {\n    this.logger.debug(`Incoming Relay Payload`);\n    this.logger.trace({ type: \"payload\", direction: \"incoming\", payload });\n    if (isJsonRpcRequest(payload)) {\n      if (!payload.method.endsWith(RELAYER_SUBSCRIBER_SUFFIX)) return;\n      const event = (payload as JsonRpcRequest<RelayJsonRpc.SubscriptionParams>).params;\n      const { topic, message, publishedAt, attestation } = event.data;\n      const messageEvent: RelayerTypes.MessageEvent = {\n        topic,\n        message,\n        publishedAt,\n        transportType: TRANSPORT_TYPES.relay,\n        attestation,\n      };\n      this.logger.debug(`Emitting Relayer Payload`);\n      this.logger.trace({ type: \"event\", event: event.id, ...messageEvent });\n      this.events.emit(event.id, messageEvent);\n      await this.acknowledgePayload(payload);\n      await this.onMessageEvent(messageEvent);\n    } else if (isJsonRpcResponse(payload)) {\n      this.events.emit(RELAYER_EVENTS.message_ack, payload);\n    }\n  }\n\n  private async onMessageEvent(messageEvent: RelayerTypes.MessageEvent) {\n    if (await this.shouldIgnoreMessageEvent(messageEvent)) {\n      return;\n    }\n    await this.recordMessageEvent(messageEvent, MESSAGE_DIRECTION.inbound);\n    this.events.emit(RELAYER_EVENTS.message, messageEvent);\n  }\n\n  private async acknowledgePayload(payload: JsonRpcPayload) {\n    const response = formatJsonRpcResult(payload.id, true);\n    await this.provider.connection.send(response);\n  }\n\n  // ---------- Events Handlers ----------------------------------------------- //\n  private onPayloadHandler = (payload: JsonRpcPayload) => {\n    this.onProviderPayload(payload);\n    this.resetPingTimeout();\n  };\n\n  private onConnectHandler = () => {\n    this.logger.warn({}, \"Relayer connected 🛜\");\n    this.startPingTimeout();\n    this.stalledRestartBackoff = 0;\n    this.events.emit(RELAYER_EVENTS.connect);\n  };\n\n  private onDisconnectHandler = () => {\n    this.logger.warn({}, `Relayer disconnected 🛑`);\n    this.requestsInFlight = [];\n    this.onProviderDisconnect();\n  };\n\n  private onProviderErrorHandler = (error: Error) => {\n    this.logger.fatal(`Fatal socket error: ${error.message}`);\n    this.events.emit(RELAYER_EVENTS.error, error);\n    this.logger.fatal(\"Fatal socket error received, closing transport\");\n    this.transportExplicitlyClosed = true;\n    clearTimeout(this.reconnectTimeout);\n    this.reconnectTimeout = undefined;\n    this.reconnectInProgress = false;\n    this.transportClose().catch((e) => this.logger.warn(e));\n  };\n\n  private registerProviderListeners = () => {\n    this.provider.on(RELAYER_PROVIDER_EVENTS.payload, this.onPayloadHandler);\n    this.provider.on(RELAYER_PROVIDER_EVENTS.connect, this.onConnectHandler);\n    this.provider.on(RELAYER_PROVIDER_EVENTS.disconnect, this.onDisconnectHandler);\n    this.provider.on(RELAYER_PROVIDER_EVENTS.error, this.onProviderErrorHandler);\n  };\n\n  private unregisterProviderListeners() {\n    this.provider.off(RELAYER_PROVIDER_EVENTS.payload, this.onPayloadHandler);\n    this.provider.off(RELAYER_PROVIDER_EVENTS.connect, this.onConnectHandler);\n    this.provider.off(RELAYER_PROVIDER_EVENTS.disconnect, this.onDisconnectHandler);\n    this.provider.off(RELAYER_PROVIDER_EVENTS.error, this.onProviderErrorHandler);\n    clearTimeout(this.pingTimeout);\n  }\n\n  private async registerEventListeners() {\n    let lastConnectedState = await isOnline();\n    subscribeToNetworkChange(async (connected: boolean) => {\n      // sometimes the network change event is triggered multiple times so avoid reacting to the samFe value\n      if (lastConnectedState === connected) return;\n\n      lastConnectedState = connected;\n      if (!connected) {\n        // when the device network is restarted, the socket might stay in false `connected` state\n        this.hasExperiencedNetworkDisruption = true;\n        await this.transportDisconnect();\n        this.transportExplicitlyClosed = false;\n      } else {\n        await this.transportOpen().catch((error) =>\n          this.logger.error(error, (error as Error)?.message),\n        );\n      }\n    });\n\n    this.core.heartbeat.on(HEARTBEAT_EVENTS.pulse, async () => {\n      if (this.transportExplicitlyClosed) return;\n      if (!this.connected && isAppVisible()) {\n        try {\n          await this.confirmOnlineStateOrThrow();\n          await this.transportOpen();\n        } catch (error) {\n          this.logger.warn(error, (error as Error)?.message);\n        }\n      }\n    });\n\n    this.events.on(RELAYER_EVENTS.connection_stalled, () => {\n      if (this.transportExplicitlyClosed) return;\n      if (this.stalledRestartInProgress) return;\n      this.stalledRestartInProgress = true;\n\n      const delay =\n        this.stalledRestartBackoff === 0\n          ? 0\n          : Math.min(\n              Math.pow(2, this.stalledRestartBackoff - 1) * this.stalledRestartBaseInterval,\n              this.stalledRestartMaxInterval,\n            );\n      this.stalledRestartBackoff++;\n\n      this.logger.warn(\n        `Connection stalled, restarting transport${delay ? ` in ${delay}ms` : \"\"}...`,\n      );\n      this.stalledRestartTimeout = setTimeout(async () => {\n        try {\n          if (this.transportExplicitlyClosed) return;\n          await this.restartTransport();\n        } catch (error) {\n          this.logger.error(error, (error as Error)?.message);\n        } finally {\n          this.stalledRestartInProgress = false;\n        }\n      }, delay);\n    });\n  }\n\n  private async onProviderDisconnect() {\n    clearTimeout(this.pingTimeout);\n    this.events.emit(RELAYER_EVENTS.disconnect);\n    if (this.reconnectInProgress) return;\n\n    this.reconnectInProgress = true;\n    try {\n      await this.subscriber.stop();\n    } catch (e) {\n      this.logger.warn(e, \"subscriber.stop() failed during disconnect\");\n    }\n\n    if (!this.subscriber.hasAnyTopics || this.transportExplicitlyClosed) {\n      this.reconnectInProgress = false;\n      return;\n    }\n\n    this.reconnectTimeout = setTimeout(async () => {\n      await this.transportOpen().catch((error) =>\n        this.logger.error(error, (error as Error)?.message),\n      );\n      this.reconnectTimeout = undefined;\n      this.reconnectInProgress = false;\n    }, toMiliseconds(RELAYER_RECONNECT_TIMEOUT));\n  }\n\n  private isInitialized() {\n    if (!this.initialized) {\n      const { message } = getInternalError(\"NOT_INITIALIZED\", this.name);\n      throw new Error(message);\n    }\n  }\n\n  private async toEstablishConnection() {\n    await this.confirmOnlineStateOrThrow();\n    if (this.connected) return;\n    if (this.connectPromise) {\n      await this.connectPromise;\n      return;\n    }\n    this.connectPromise = this.connect().finally(() => {\n      this.connectPromise = undefined;\n    });\n    await this.connectPromise;\n  }\n}\n","import { isEqual } from \"es-toolkit/compat\";\nimport { generateChildLogger, getLoggerContext, Logger } from \"@walletconnect/logger\";\nimport { ICore, IStore } from \"@walletconnect/types\";\nimport {\n  getInternalError,\n  isProposalStruct,\n  isSessionStruct,\n  isUndefined,\n} from \"@walletconnect/utils\";\nimport { CORE_STORAGE_PREFIX, STORE_STORAGE_VERSION } from \"../constants/index.js\";\n\nexport class Store<Key, Data extends Record<string, any>> extends IStore<Key, Data> {\n  public map = new Map<Key, Data>();\n  public version = STORE_STORAGE_VERSION;\n\n  private cached: Data[] = [];\n  private initialized = false;\n\n  /**\n   * Regenerates the value key to retrieve it from cache\n   */\n  private getKey: ((data: Data) => Key) | undefined;\n\n  private storagePrefix = CORE_STORAGE_PREFIX;\n\n  // stores recently deleted key to return different rejection message when key is not found\n  private recentlyDeleted: Key[] = [];\n  private recentlyDeletedLimit = 200;\n\n  /**\n   * @param {ICore} core Core\n   * @param {Logger} logger Logger\n   * @param {string} name Store's name\n   * @param {Store<Key, Data>[\"getKey\"]} getKey Regenerates the value key to retrieve it from cache\n   * @param {string} storagePrefix Prefixes value keys\n   */\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n    public name: string,\n    storagePrefix: string = CORE_STORAGE_PREFIX,\n    getKey: Store<Key, Data>[\"getKey\"] = undefined,\n  ) {\n    super(core, logger, name, storagePrefix);\n    this.logger = generateChildLogger(logger, this.name);\n    this.storagePrefix = storagePrefix;\n    this.getKey = getKey;\n  }\n\n  public init: IStore<Key, Data>[\"init\"] = async () => {\n    if (!this.initialized) {\n      this.logger.trace(`Initialized`);\n\n      await this.restore();\n\n      this.cached.forEach((value) => {\n        if (this.getKey && value !== null && !isUndefined(value)) {\n          this.map.set(this.getKey(value), value);\n        } else if (isProposalStruct(value)) {\n          // TODO(pedro) revert type casting as any\n          this.map.set(value.id as any, value);\n        } else if (isSessionStruct(value)) {\n          // TODO(pedro) revert type casting as any\n          this.map.set(value.topic as any, value);\n        }\n      });\n\n      this.cached = [];\n      this.initialized = true;\n    }\n  };\n\n  get context() {\n    return getLoggerContext(this.logger);\n  }\n\n  get storageKey() {\n    return this.storagePrefix + this.version + this.core.customStoragePrefix + \"//\" + this.name;\n  }\n\n  get length() {\n    return this.map.size;\n  }\n\n  get keys() {\n    return Array.from(this.map.keys());\n  }\n\n  get values() {\n    return Array.from(this.map.values());\n  }\n\n  public set: IStore<Key, Data>[\"set\"] = async (key, value) => {\n    this.isInitialized();\n    if (this.map.has(key)) {\n      await this.update(key, value);\n    } else {\n      this.logger.debug(`Setting value`);\n      this.logger.trace({ type: \"method\", method: \"set\", key, value });\n      this.map.set(key, value);\n      await this.persist();\n    }\n  };\n\n  public get: IStore<Key, Data>[\"get\"] = (key) => {\n    this.isInitialized();\n    this.logger.debug(`Getting value`);\n    this.logger.trace({ type: \"method\", method: \"get\", key });\n    const value = this.getData(key);\n    return value;\n  };\n\n  public getAll: IStore<Key, Data>[\"getAll\"] = (filter) => {\n    this.isInitialized();\n    if (!filter) return this.values;\n\n    return this.values.filter((value) =>\n      Object.keys(filter).every((key) => isEqual(value[key], filter[key])),\n    );\n  };\n\n  public update: IStore<Key, Data>[\"update\"] = async (key, update) => {\n    this.isInitialized();\n    this.logger.debug(`Updating value`);\n    this.logger.trace({ type: \"method\", method: \"update\", key, update });\n    const value = { ...this.getData(key), ...update };\n    this.map.set(key, value);\n    await this.persist();\n  };\n\n  public delete: IStore<Key, Data>[\"delete\"] = async (key, reason) => {\n    this.isInitialized();\n    if (!this.map.has(key)) return;\n    this.logger.debug(`Deleting value`);\n    this.logger.trace({ type: \"method\", method: \"delete\", key, reason });\n    this.map.delete(key);\n    this.addToRecentlyDeleted(key);\n    await this.persist();\n  };\n\n  // ---------- Private ----------------------------------------------- //\n\n  private addToRecentlyDeleted(key: Key) {\n    this.recentlyDeleted.push(key);\n    // limit the size of the recentlyDeleted array, truncate the 100 oldest entries.\n    if (this.recentlyDeleted.length >= this.recentlyDeletedLimit) {\n      this.recentlyDeleted.splice(0, this.recentlyDeletedLimit / 2);\n    }\n  }\n\n  private async setDataStore(value: Data[]) {\n    await this.core.storage.setItem<Data[]>(this.storageKey, value);\n  }\n\n  private async getDataStore() {\n    const value = await this.core.storage.getItem<Data[]>(this.storageKey);\n    return value;\n  }\n\n  private getData(key: Key) {\n    const value = this.map.get(key);\n    if (!value) {\n      if (this.recentlyDeleted.includes(key)) {\n        const { message } = getInternalError(\n          \"MISSING_OR_INVALID\",\n          `Record was recently deleted - ${this.name}: ${key}`,\n        );\n        this.logger.error(message);\n        throw new Error(message);\n      }\n\n      const { message } = getInternalError(\"NO_MATCHING_KEY\", `${this.name}: ${key}`);\n      this.logger.error(message);\n      throw new Error(message);\n    }\n    return value;\n  }\n\n  private async persist() {\n    await this.setDataStore(this.values);\n  }\n\n  private async restore() {\n    try {\n      const persisted = await this.getDataStore();\n      if (typeof persisted === \"undefined\") return;\n      if (!persisted.length) return;\n      if (this.map.size) {\n        const { message } = getInternalError(\"RESTORE_WILL_OVERRIDE\", this.name);\n        this.logger.error(message);\n        throw new Error(message);\n      }\n      this.cached = persisted;\n      this.logger.debug(`Successfully Restored value for ${this.name}`);\n      this.logger.trace({ type: \"method\", method: \"restore\", value: this.values });\n    } catch (e) {\n      this.logger.debug(`Failed to Restore value for ${this.name}`);\n      this.logger.error(e as any);\n    }\n  }\n\n  private isInitialized() {\n    if (!this.initialized) {\n      const { message } = getInternalError(\"NOT_INITIALIZED\", this.name);\n      throw new Error(message);\n    }\n  }\n}\n","import { generateChildLogger, getLoggerContext, Logger } from \"@walletconnect/logger\";\nimport {\n  ICore,\n  PairingTypes,\n  IPairing,\n  IPairingPrivate,\n  IStore,\n  RelayerTypes,\n  PairingJsonRpcTypes,\n  ExpirerTypes,\n  EventClientTypes,\n} from \"@walletconnect/types\";\nimport {\n  getInternalError,\n  parseUri,\n  calcExpiry,\n  generateRandomBytes32,\n  formatUri,\n  getSdkError,\n  engineEvent,\n  createDelayedPromise,\n  isValidParams,\n  isValidUrl,\n  isValidString,\n  isExpired,\n  parseExpirerTarget,\n  TYPE_1,\n} from \"@walletconnect/utils\";\nimport {\n  formatJsonRpcRequest,\n  formatJsonRpcResult,\n  formatJsonRpcError,\n  isJsonRpcRequest,\n  isJsonRpcResponse,\n  isJsonRpcResult,\n  isJsonRpcError,\n} from \"@walletconnect/jsonrpc-utils\";\nimport { FIVE_MINUTES, toMiliseconds } from \"@walletconnect/time\";\nimport EventEmitter from \"events\";\nimport {\n  PAIRING_CONTEXT,\n  PAIRING_STORAGE_VERSION,\n  CORE_STORAGE_PREFIX,\n  RELAYER_DEFAULT_PROTOCOL,\n  PAIRING_RPC_OPTS,\n  RELAYER_EVENTS,\n  EXPIRER_EVENTS,\n  PAIRING_EVENTS,\n  EVENT_CLIENT_PAIRING_TRACES,\n  EVENT_CLIENT_PAIRING_ERRORS,\n  TRANSPORT_TYPES,\n} from \"../constants/index.js\";\nimport { Store } from \"../controllers/store.js\";\n\nexport class Pairing implements IPairing {\n  public name = PAIRING_CONTEXT;\n  public version = PAIRING_STORAGE_VERSION;\n\n  public events = new EventEmitter();\n  public pairings: IStore<string, PairingTypes.Struct>;\n\n  private initialized = false;\n  private storagePrefix = CORE_STORAGE_PREFIX;\n  private ignoredPayloadTypes = [TYPE_1];\n  private registeredMethods: string[] = [];\n\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n  ) {\n    this.core = core;\n    this.logger = generateChildLogger(logger, this.name);\n    this.pairings = new Store(this.core, this.logger, this.name, this.storagePrefix);\n  }\n\n  public init: IPairing[\"init\"] = async () => {\n    if (!this.initialized) {\n      await this.pairings.init();\n      await this.cleanup();\n      this.registerRelayerEvents();\n      this.registerExpirerEvents();\n      this.initialized = true;\n      this.logger.trace(`Initialized`);\n    }\n  };\n\n  get context() {\n    return getLoggerContext(this.logger);\n  }\n\n  public register: IPairing[\"register\"] = ({ methods }) => {\n    this.isInitialized();\n    this.registeredMethods = [...new Set([...this.registeredMethods, ...methods])];\n  };\n\n  public create: IPairing[\"create\"] = async (params) => {\n    this.isInitialized();\n    const symKey = generateRandomBytes32();\n    const topic = await this.core.crypto.setSymKey(symKey);\n    const expiry = calcExpiry(FIVE_MINUTES);\n    const relay = { protocol: RELAYER_DEFAULT_PROTOCOL };\n    const pairing = { topic, expiry, relay, active: false, methods: params?.methods };\n    const uri = formatUri({\n      protocol: this.core.protocol,\n      version: this.core.version,\n      topic,\n      symKey,\n      relay,\n      expiryTimestamp: expiry,\n      methods: params?.methods,\n    });\n    this.events.emit(PAIRING_EVENTS.create, pairing);\n    this.core.expirer.set(topic, expiry);\n    await this.pairings.set(topic, pairing);\n    await this.core.relayer.subscribe(topic, {\n      transportType: params?.transportType,\n      internal: params?.internal,\n    });\n\n    return { topic, uri };\n  };\n\n  public pair: IPairing[\"pair\"] = async (params) => {\n    this.isInitialized();\n\n    const event = this.core.eventClient.createEvent({\n      properties: {\n        topic: params?.uri,\n        trace: [EVENT_CLIENT_PAIRING_TRACES.pairing_started],\n      },\n    });\n\n    this.isValidPair(params, event);\n\n    const { topic, symKey, relay, expiryTimestamp, methods } = parseUri(params.uri);\n\n    event.props.properties.topic = topic;\n    event.addTrace(EVENT_CLIENT_PAIRING_TRACES.pairing_uri_validation_success);\n    event.addTrace(EVENT_CLIENT_PAIRING_TRACES.pairing_uri_not_expired);\n\n    let existingPairing;\n    if (this.pairings.keys.includes(topic)) {\n      existingPairing = this.pairings.get(topic);\n      event.addTrace(EVENT_CLIENT_PAIRING_TRACES.existing_pairing);\n      if (existingPairing.active) {\n        event.setError(EVENT_CLIENT_PAIRING_ERRORS.active_pairing_already_exists);\n        throw new Error(\n          `Pairing already exists: ${topic}. Please try again with a new connection URI.`,\n        );\n      } else {\n        event.addTrace(EVENT_CLIENT_PAIRING_TRACES.pairing_not_expired);\n      }\n    }\n\n    const expiry = expiryTimestamp || calcExpiry(FIVE_MINUTES);\n    const pairing = { topic, relay, expiry, active: false, methods };\n    this.core.expirer.set(topic, expiry);\n    await this.pairings.set(topic, pairing);\n\n    event.addTrace(EVENT_CLIENT_PAIRING_TRACES.store_new_pairing);\n\n    if (params.activatePairing) {\n      await this.activate({ topic });\n    }\n\n    this.events.emit(PAIRING_EVENTS.create, pairing);\n\n    event.addTrace(EVENT_CLIENT_PAIRING_TRACES.emit_inactive_pairing);\n\n    // avoid overwriting keychain pairing already exists\n    if (!this.core.crypto.keychain.has(topic)) {\n      await this.core.crypto.setSymKey(symKey, topic);\n    }\n    event.addTrace(EVENT_CLIENT_PAIRING_TRACES.subscribing_pairing_topic);\n\n    try {\n      await this.core.relayer.confirmOnlineStateOrThrow();\n    } catch (error) {\n      event.setError(EVENT_CLIENT_PAIRING_ERRORS.no_internet_connection);\n    }\n\n    try {\n      await this.core.relayer.subscribe(topic, { relay });\n    } catch (error) {\n      event.setError(EVENT_CLIENT_PAIRING_ERRORS.subscribe_pairing_topic_failure);\n      throw error;\n    }\n\n    event.addTrace(EVENT_CLIENT_PAIRING_TRACES.subscribe_pairing_topic_success);\n\n    return pairing;\n  };\n\n  public activate: IPairing[\"activate\"] = async ({ topic }) => {\n    this.isInitialized();\n    const expiry = calcExpiry(FIVE_MINUTES);\n    this.core.expirer.set(topic, expiry);\n    await this.pairings.update(topic, { active: true, expiry });\n  };\n\n  /**\n   * @deprecated Ping will be removed in the next major release.\n   */\n  public ping: IPairing[\"ping\"] = async (params) => {\n    this.isInitialized();\n    await this.isValidPing(params);\n    this.logger.warn(\"ping() is deprecated and will be removed in the next major release.\");\n    const { topic } = params;\n    if (this.pairings.keys.includes(topic)) {\n      const id = await this.sendRequest(topic, \"wc_pairingPing\", {});\n      const { done, resolve, reject } = createDelayedPromise<void>();\n      this.events.once(engineEvent(\"pairing_ping\", id), ({ error }) => {\n        if (error) reject(error);\n        else resolve();\n      });\n      await done();\n    }\n  };\n\n  public updateExpiry: IPairing[\"updateExpiry\"] = async ({ topic, expiry }) => {\n    this.isInitialized();\n    await this.pairings.update(topic, { expiry });\n  };\n\n  public updateMetadata: IPairing[\"updateMetadata\"] = async ({ topic, metadata }) => {\n    this.isInitialized();\n    await this.pairings.update(topic, { peerMetadata: metadata });\n  };\n\n  public getPairings: IPairing[\"getPairings\"] = () => {\n    this.isInitialized();\n    return this.pairings.values;\n  };\n\n  public disconnect: IPairing[\"disconnect\"] = async (params) => {\n    this.isInitialized();\n    await this.isValidDisconnect(params);\n    const { topic } = params;\n    if (this.pairings.keys.includes(topic)) {\n      await this.sendRequest(topic, \"wc_pairingDelete\", getSdkError(\"USER_DISCONNECTED\"));\n      await this.deletePairing(topic);\n    }\n  };\n\n  public formatUriFromPairing: IPairing[\"formatUriFromPairing\"] = (pairing) => {\n    this.isInitialized();\n    const { topic, relay, expiry, methods } = pairing;\n    const symKey = this.core.crypto.keychain.get(topic);\n    return formatUri({\n      protocol: this.core.protocol,\n      version: this.core.version,\n      topic,\n      symKey,\n      relay,\n      expiryTimestamp: expiry,\n      methods,\n    });\n  };\n\n  // ---------- Private Helpers ----------------------------------------------- //\n\n  private sendRequest: IPairingPrivate[\"sendRequest\"] = async (topic, method, params) => {\n    const payload = formatJsonRpcRequest(method, params);\n    const message = await this.core.crypto.encode(topic, payload);\n    const opts = PAIRING_RPC_OPTS[method].req;\n    this.core.history.set(topic, payload);\n    this.core.relayer.publish(topic, message, opts);\n    return payload.id;\n  };\n\n  private sendResult: IPairingPrivate[\"sendResult\"] = async (id, topic, result) => {\n    const payload = formatJsonRpcResult(id, result);\n    const message = await this.core.crypto.encode(topic, payload);\n    const record = await this.core.history.get(topic, id);\n    const method = record.request.method as PairingJsonRpcTypes.WcMethod;\n    const opts = PAIRING_RPC_OPTS[method].res;\n    await this.core.relayer.publish(topic, message, opts);\n    await this.core.history.resolve(payload);\n  };\n\n  private sendError: IPairingPrivate[\"sendError\"] = async (id, topic, error) => {\n    const payload = formatJsonRpcError(id, error);\n    const message = await this.core.crypto.encode(topic, payload);\n    const record = await this.core.history.get(topic, id);\n    const method = record.request.method as PairingJsonRpcTypes.WcMethod;\n\n    const opts = PAIRING_RPC_OPTS[method]\n      ? PAIRING_RPC_OPTS[method].res\n      : PAIRING_RPC_OPTS.unregistered_method.res;\n\n    await this.core.relayer.publish(topic, message, opts);\n    await this.core.history.resolve(payload);\n  };\n\n  private deletePairing: IPairingPrivate[\"deletePairing\"] = async (topic, expirerHasDeleted) => {\n    // Await the unsubscribe first to avoid deleting the symKey too early below.\n    await this.core.relayer.unsubscribe(topic);\n    await Promise.all([\n      this.pairings.delete(topic, getSdkError(\"USER_DISCONNECTED\")),\n      this.core.crypto.deleteSymKey(topic),\n      expirerHasDeleted ? Promise.resolve() : this.core.expirer.del(topic),\n    ]);\n  };\n\n  private isInitialized() {\n    if (!this.initialized) {\n      const { message } = getInternalError(\"NOT_INITIALIZED\", this.name);\n      throw new Error(message);\n    }\n  }\n\n  private cleanup = async () => {\n    const expiredPairings = this.pairings.getAll().filter((pairing) => isExpired(pairing.expiry));\n    await Promise.all(expiredPairings.map((pairing) => this.deletePairing(pairing.topic)));\n  };\n\n  // ---------- Relay Events Router ----------------------------------- //\n\n  private registerRelayerEvents() {\n    this.core.relayer.on(RELAYER_EVENTS.message, async (event: RelayerTypes.MessageEvent) => {\n      const { topic, message, transportType } = event;\n\n      // Do not handle if the topic is not related to known pairing topics.\n      if (!this.pairings.keys.includes(topic)) return;\n\n      // Do not handle link-mode messages\n      if (transportType === TRANSPORT_TYPES.link_mode) return;\n\n      // messages of certain types should be ignored as they are handled by their respective SDKs\n      if (this.ignoredPayloadTypes.includes(this.core.crypto.getPayloadType(message))) return;\n\n      try {\n        const payload = await this.core.crypto.decode(topic, message);\n\n        if (isJsonRpcRequest(payload)) {\n          this.core.history.set(topic, payload);\n          await this.onRelayEventRequest({ topic, payload });\n        } else if (isJsonRpcResponse(payload)) {\n          await this.core.history.resolve(payload);\n          await this.onRelayEventResponse({ topic, payload });\n          this.core.history.delete(topic, payload.id);\n        }\n        await this.core.relayer.messages.ack(topic, message);\n      } catch (error) {\n        this.logger.error(error);\n      }\n    });\n  }\n\n  private onRelayEventRequest: IPairingPrivate[\"onRelayEventRequest\"] = async (event) => {\n    const { topic, payload } = event;\n    const reqMethod = payload.method as PairingJsonRpcTypes.WcMethod;\n\n    switch (reqMethod) {\n      case \"wc_pairingPing\":\n        return await this.onPairingPingRequest(topic, payload);\n      case \"wc_pairingDelete\":\n        return await this.onPairingDeleteRequest(topic, payload);\n      default:\n        return await this.onUnknownRpcMethodRequest(topic, payload);\n    }\n  };\n\n  private onRelayEventResponse: IPairingPrivate[\"onRelayEventResponse\"] = async (event) => {\n    const { topic, payload } = event;\n    const record = await this.core.history.get(topic, payload.id);\n    const resMethod = record.request.method as PairingJsonRpcTypes.WcMethod;\n\n    switch (resMethod) {\n      case \"wc_pairingPing\":\n        return this.onPairingPingResponse(topic, payload);\n      default:\n        return this.onUnknownRpcMethodResponse(resMethod);\n    }\n  };\n\n  private onPairingPingRequest: IPairingPrivate[\"onPairingPingRequest\"] = async (\n    topic,\n    payload,\n  ) => {\n    const { id } = payload;\n    try {\n      this.isValidPing({ topic });\n      await this.sendResult<\"wc_pairingPing\">(id, topic, true);\n      this.events.emit(PAIRING_EVENTS.ping, { id, topic });\n    } catch (err: any) {\n      await this.sendError(id, topic, err);\n      this.logger.error(err);\n    }\n  };\n\n  private onPairingPingResponse: IPairingPrivate[\"onPairingPingResponse\"] = (_topic, payload) => {\n    const { id } = payload;\n    // put at the end of the stack to avoid a race condition\n    // where pairing_ping listener is not yet initialized\n    setTimeout(() => {\n      if (isJsonRpcResult(payload)) {\n        this.events.emit(engineEvent(\"pairing_ping\", id), {});\n      } else if (isJsonRpcError(payload)) {\n        this.events.emit(engineEvent(\"pairing_ping\", id), { error: payload.error });\n      }\n    }, 500);\n  };\n\n  private onPairingDeleteRequest: IPairingPrivate[\"onPairingDeleteRequest\"] = async (\n    topic,\n    payload,\n  ) => {\n    const { id } = payload;\n    try {\n      this.isValidDisconnect({ topic });\n      await this.deletePairing(topic);\n      this.events.emit(PAIRING_EVENTS.delete, { id, topic });\n    } catch (err: any) {\n      await this.sendError(id, topic, err);\n      this.logger.error(err);\n    }\n  };\n\n  private onUnknownRpcMethodRequest: IPairingPrivate[\"onUnknownRpcMethodRequest\"] = async (\n    topic,\n    payload,\n  ) => {\n    const { id, method } = payload;\n\n    try {\n      // Ignore if the implementing client has registered this method as known.\n      if (this.registeredMethods.includes(method)) return;\n      const error = getSdkError(\"WC_METHOD_UNSUPPORTED\", method);\n      await this.sendError(id, topic, error);\n      this.logger.error(error);\n    } catch (err: any) {\n      await this.sendError(id, topic, err);\n      this.logger.error(err);\n    }\n  };\n\n  private onUnknownRpcMethodResponse: IPairingPrivate[\"onUnknownRpcMethodResponse\"] = (method) => {\n    // Ignore if the implementing client has registered this method as known.\n    if (this.registeredMethods.includes(method)) return;\n    this.logger.error(getSdkError(\"WC_METHOD_UNSUPPORTED\", method));\n  };\n\n  // ---------- Expirer Events ---------------------------------------- //\n\n  private registerExpirerEvents() {\n    this.core.expirer.on(EXPIRER_EVENTS.expired, async (event: ExpirerTypes.Expiration) => {\n      const { topic } = parseExpirerTarget(event.target);\n      if (!topic) return;\n      if (!this.pairings.keys.includes(topic)) return;\n      await this.deletePairing(topic, true);\n      this.events.emit(PAIRING_EVENTS.expire, { topic });\n    });\n  }\n\n  // ---------- Validation Helpers ----------------------------------- //\n\n  private isValidPair = (params: { uri: string }, event: EventClientTypes.Event) => {\n    if (!isValidParams(params)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `pair() params: ${params}`);\n      event.setError(EVENT_CLIENT_PAIRING_ERRORS.malformed_pairing_uri);\n      throw new Error(message);\n    }\n    if (!isValidUrl(params.uri)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `pair() uri: ${params.uri}`);\n      event.setError(EVENT_CLIENT_PAIRING_ERRORS.malformed_pairing_uri);\n      throw new Error(message);\n    }\n    const uri = parseUri(params?.uri);\n    if (!uri?.relay?.protocol) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `pair() uri#relay-protocol`);\n      event.setError(EVENT_CLIENT_PAIRING_ERRORS.malformed_pairing_uri);\n      throw new Error(message);\n    }\n    if (!uri?.symKey) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `pair() uri#symKey`);\n      event.setError(EVENT_CLIENT_PAIRING_ERRORS.malformed_pairing_uri);\n      throw new Error(message);\n    }\n    if (uri?.expiryTimestamp) {\n      const expiration = toMiliseconds(uri?.expiryTimestamp);\n      if (expiration < Date.now()) {\n        event.setError(EVENT_CLIENT_PAIRING_ERRORS.pairing_expired);\n        const { message } = getInternalError(\n          \"EXPIRED\",\n          `pair() URI has expired. Please try again with a new connection URI.`,\n        );\n        throw new Error(message);\n      }\n    }\n  };\n\n  private isValidPing = async (params: { topic: string }) => {\n    if (!isValidParams(params)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `ping() params: ${params}`);\n      throw new Error(message);\n    }\n    const { topic } = params;\n    await this.isValidPairingTopic(topic);\n  };\n\n  private isValidDisconnect = async (params: { topic: string }) => {\n    if (!isValidParams(params)) {\n      const { message } = getInternalError(\"MISSING_OR_INVALID\", `disconnect() params: ${params}`);\n      throw new Error(message);\n    }\n    const { topic } = params;\n    await this.isValidPairingTopic(topic);\n  };\n\n  private isValidPairingTopic = async (topic: any) => {\n    if (!isValidString(topic, false)) {\n      const { message } = getInternalError(\n        \"MISSING_OR_INVALID\",\n        `pairing topic should be a string: ${topic}`,\n      );\n      throw new Error(message);\n    }\n    if (!this.pairings.keys.includes(topic)) {\n      const { message } = getInternalError(\n        \"NO_MATCHING_KEY\",\n        `pairing topic doesn't exist: ${topic}`,\n      );\n      throw new Error(message);\n    }\n    if (isExpired(this.pairings.get(topic).expiry)) {\n      await this.deletePairing(topic);\n      const { message } = getInternalError(\"EXPIRED\", `pairing topic: ${topic}`);\n      throw new Error(message);\n    }\n  };\n}\n","import { formatJsonRpcRequest, isJsonRpcError } from \"@walletconnect/jsonrpc-utils\";\nimport { generateChildLogger, getLoggerContext, Logger } from \"@walletconnect/logger\";\nimport { IJsonRpcHistory, JsonRpcRecord, RequestEvent, ICore } from \"@walletconnect/types\";\nimport { calcExpiry, getInternalError } from \"@walletconnect/utils\";\nimport { EventEmitter } from \"events\";\nimport { THIRTY_DAYS, toMiliseconds } from \"@walletconnect/time\";\nimport { HEARTBEAT_EVENTS } from \"@walletconnect/heartbeat\";\nimport {\n  CORE_STORAGE_PREFIX,\n  HISTORY_CONTEXT,\n  HISTORY_EVENTS,\n  HISTORY_STORAGE_VERSION,\n} from \"../constants/index.js\";\n\nexport class JsonRpcHistory extends IJsonRpcHistory {\n  public records = new Map<number, JsonRpcRecord>();\n  public events = new EventEmitter();\n  public name = HISTORY_CONTEXT;\n  public version = HISTORY_STORAGE_VERSION;\n\n  private cached: JsonRpcRecord[] = [];\n  private initialized = false;\n  private storagePrefix = CORE_STORAGE_PREFIX;\n\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n  ) {\n    super(core, logger);\n    this.logger = generateChildLogger(logger, this.name);\n  }\n\n  public init: IJsonRpcHistory[\"init\"] = async () => {\n    if (!this.initialized) {\n      this.logger.trace(`Initialized`);\n      await this.restore();\n      this.cached.forEach((record) => this.records.set(record.id, record));\n      this.cached = [];\n      this.registerEventListeners();\n      this.initialized = true;\n    }\n  };\n\n  get context(): string {\n    return getLoggerContext(this.logger);\n  }\n\n  get storageKey() {\n    return this.storagePrefix + this.version + this.core.customStoragePrefix + \"//\" + this.name;\n  }\n\n  get size(): number {\n    return this.records.size;\n  }\n\n  get keys(): number[] {\n    return Array.from(this.records.keys());\n  }\n\n  get values() {\n    return Array.from(this.records.values());\n  }\n\n  get pending(): RequestEvent[] {\n    const requests: RequestEvent[] = [];\n    this.values.forEach((record) => {\n      if (typeof record.response !== \"undefined\") return;\n      const requestEvent: RequestEvent = {\n        topic: record.topic,\n        request: formatJsonRpcRequest(record.request.method, record.request.params, record.id),\n        chainId: record.chainId,\n      };\n      return requests.push(requestEvent);\n    });\n    return requests;\n  }\n\n  public set: IJsonRpcHistory[\"set\"] = (topic, request, chainId) => {\n    this.isInitialized();\n    this.logger.debug(`Setting JSON-RPC request history record`);\n    this.logger.trace({ type: \"method\", method: \"set\", topic, request, chainId });\n    if (this.records.has(request.id)) return;\n    const record: JsonRpcRecord = {\n      id: request.id,\n      topic,\n      request: { method: request.method, params: request.params || null },\n      chainId,\n      expiry: calcExpiry(THIRTY_DAYS),\n    };\n    this.records.set(record.id, record);\n    this.persist();\n    this.events.emit(HISTORY_EVENTS.created, record);\n  };\n\n  public resolve: IJsonRpcHistory[\"resolve\"] = async (response) => {\n    this.isInitialized();\n    this.logger.debug(`Updating JSON-RPC response history record`);\n    this.logger.trace({ type: \"method\", method: \"update\", response });\n    if (!this.records.has(response.id)) return;\n    const record = await this.getRecord(response.id);\n    if (typeof record.response !== \"undefined\") return;\n    record.response = isJsonRpcError(response)\n      ? { error: response.error }\n      : { result: response.result };\n    this.records.set(record.id, record);\n    this.persist();\n    this.events.emit(HISTORY_EVENTS.updated, record);\n  };\n\n  public get: IJsonRpcHistory[\"get\"] = async (topic, id) => {\n    this.isInitialized();\n    this.logger.debug(`Getting record`);\n    this.logger.trace({ type: \"method\", method: \"get\", topic, id });\n    const record = await this.getRecord(id);\n    return record;\n  };\n\n  public delete: IJsonRpcHistory[\"delete\"] = (topic, id) => {\n    this.isInitialized();\n    this.logger.debug(`Deleting record`);\n    this.logger.trace({ type: \"method\", method: \"delete\", id });\n    this.values.forEach((record: JsonRpcRecord) => {\n      if (record.topic === topic) {\n        if (typeof id !== \"undefined\" && record.id !== id) return;\n        this.records.delete(record.id);\n        this.events.emit(HISTORY_EVENTS.deleted, record);\n      }\n    });\n    this.persist();\n  };\n\n  public exists: IJsonRpcHistory[\"exists\"] = async (topic, id) => {\n    this.isInitialized();\n    if (!this.records.has(id)) return false;\n    const record = await this.getRecord(id);\n    return record.topic === topic;\n  };\n\n  public on: IJsonRpcHistory[\"on\"] = (event, listener) => {\n    this.events.on(event, listener);\n  };\n\n  public once: IJsonRpcHistory[\"once\"] = (event, listener) => {\n    this.events.once(event, listener);\n  };\n\n  public off: IJsonRpcHistory[\"off\"] = (event, listener) => {\n    this.events.off(event, listener);\n  };\n\n  public removeListener: IJsonRpcHistory[\"removeListener\"] = (event, listener) => {\n    this.events.removeListener(event, listener);\n  };\n\n  // ---------- Private ----------------------------------------------- //\n\n  private async setJsonRpcRecords(records: JsonRpcRecord[]): Promise<void> {\n    await this.core.storage.setItem<JsonRpcRecord[]>(this.storageKey, records);\n  }\n\n  private async getJsonRpcRecords(): Promise<JsonRpcRecord[] | undefined> {\n    const records = await this.core.storage.getItem<JsonRpcRecord[]>(this.storageKey);\n    return records;\n  }\n\n  private getRecord(id: number) {\n    this.isInitialized();\n    const record = this.records.get(id);\n    if (!record) {\n      const { message } = getInternalError(\"NO_MATCHING_KEY\", `${this.name}: ${id}`);\n      throw new Error(message);\n    }\n    return record;\n  }\n\n  private async persist() {\n    await this.setJsonRpcRecords(this.values);\n    this.events.emit(HISTORY_EVENTS.sync);\n  }\n\n  private async restore() {\n    try {\n      const persisted = await this.getJsonRpcRecords();\n      if (typeof persisted === \"undefined\") return;\n      if (!persisted.length) return;\n      if (this.records.size) {\n        const { message } = getInternalError(\"RESTORE_WILL_OVERRIDE\", this.name);\n        this.logger.error(message);\n        throw new Error(message);\n      }\n      this.cached = persisted;\n      this.logger.debug(`Successfully Restored records for ${this.name}`);\n      this.logger.trace({ type: \"method\", method: \"restore\", records: this.values });\n    } catch (e) {\n      this.logger.debug(`Failed to Restore records for ${this.name}`);\n      this.logger.error(e as any);\n    }\n  }\n\n  private registerEventListeners(): void {\n    this.events.on(HISTORY_EVENTS.created, (record: JsonRpcRecord) => {\n      const eventName = HISTORY_EVENTS.created;\n      this.logger.info(`Emitting ${eventName}`);\n      this.logger.debug({ type: \"event\", event: eventName, record });\n    });\n    this.events.on(HISTORY_EVENTS.updated, (record: JsonRpcRecord) => {\n      const eventName = HISTORY_EVENTS.updated;\n      this.logger.info(`Emitting ${eventName}`);\n      this.logger.debug({ type: \"event\", event: eventName, record });\n    });\n\n    this.events.on(HISTORY_EVENTS.deleted, (record: JsonRpcRecord) => {\n      const eventName = HISTORY_EVENTS.deleted;\n      this.logger.info(`Emitting ${eventName}`);\n      this.logger.debug({ type: \"event\", event: eventName, record });\n    });\n\n    this.core.heartbeat.on(HEARTBEAT_EVENTS.pulse, () => {\n      this.cleanup();\n    });\n  }\n\n  private cleanup() {\n    try {\n      this.isInitialized();\n      let deleted = false;\n      this.records.forEach((record: JsonRpcRecord) => {\n        const msToExpiry = toMiliseconds(record.expiry || 0) - Date.now();\n        if (msToExpiry <= 0) {\n          this.logger.info(`Deleting expired history log: ${record.id}`);\n          this.records.delete(record.id);\n          this.events.emit(HISTORY_EVENTS.deleted, record, false);\n          deleted = true;\n        }\n      });\n      if (deleted) {\n        this.persist();\n      }\n    } catch (e) {\n      this.logger.warn(e);\n    }\n  }\n\n  private isInitialized() {\n    if (!this.initialized) {\n      const { message } = getInternalError(\"NOT_INITIALIZED\", this.name);\n      throw new Error(message);\n    }\n  }\n}\n","import { HEARTBEAT_EVENTS } from \"@walletconnect/heartbeat\";\nimport { generateChildLogger, getLoggerContext, Logger } from \"@walletconnect/logger\";\nimport { toMiliseconds } from \"@walletconnect/time\";\nimport { ExpirerTypes, ICore, IExpirer } from \"@walletconnect/types\";\nimport { getInternalError, formatIdTarget, formatTopicTarget } from \"@walletconnect/utils\";\nimport { EventEmitter } from \"events\";\nimport {\n  CORE_STORAGE_PREFIX,\n  EXPIRER_CONTEXT,\n  EXPIRER_EVENTS,\n  EXPIRER_STORAGE_VERSION,\n} from \"../constants/index.js\";\n\nexport class Expirer extends IExpirer {\n  public expirations = new Map<string, ExpirerTypes.Expiration>();\n  public events = new EventEmitter();\n  public name = EXPIRER_CONTEXT;\n  public version = EXPIRER_STORAGE_VERSION;\n\n  private cached: ExpirerTypes.Expiration[] = [];\n  private initialized = false;\n\n  private storagePrefix = CORE_STORAGE_PREFIX;\n\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n  ) {\n    super(core, logger);\n    this.logger = generateChildLogger(logger, this.name);\n  }\n\n  public init: IExpirer[\"init\"] = async () => {\n    if (!this.initialized) {\n      this.logger.trace(`Initialized`);\n      await this.restore();\n      this.cached.forEach((expiration) => this.expirations.set(expiration.target, expiration));\n      this.cached = [];\n      this.registerEventListeners();\n      this.initialized = true;\n    }\n  };\n\n  get context(): string {\n    return getLoggerContext(this.logger);\n  }\n\n  get storageKey() {\n    return this.storagePrefix + this.version + this.core.customStoragePrefix + \"//\" + this.name;\n  }\n\n  get length(): number {\n    return this.expirations.size;\n  }\n\n  get keys(): string[] {\n    return Array.from(this.expirations.keys());\n  }\n\n  get values(): ExpirerTypes.Expiration[] {\n    return Array.from(this.expirations.values());\n  }\n\n  public has: IExpirer[\"has\"] = (key) => {\n    try {\n      const target = this.formatTarget(key);\n      const expiration = this.getExpiration(target);\n      return typeof expiration !== \"undefined\";\n    } catch (e) {\n      // ignore\n      return false;\n    }\n  };\n\n  public set: IExpirer[\"set\"] = (key, expiry) => {\n    this.isInitialized();\n    const target = this.formatTarget(key);\n    const expiration = { target, expiry };\n    this.expirations.set(target, expiration);\n    this.checkExpiry(target, expiration);\n    this.events.emit(EXPIRER_EVENTS.created, {\n      target,\n      expiration,\n    } as ExpirerTypes.Created);\n  };\n\n  public get: IExpirer[\"get\"] = (key) => {\n    this.isInitialized();\n    const target = this.formatTarget(key);\n    return this.getExpiration(target);\n  };\n\n  public del: IExpirer[\"del\"] = (key) => {\n    this.isInitialized();\n    const exists = this.has(key);\n    if (exists) {\n      const target = this.formatTarget(key);\n      const expiration = this.getExpiration(target);\n      this.expirations.delete(target);\n      this.events.emit(EXPIRER_EVENTS.deleted, {\n        target,\n        expiration,\n      } as ExpirerTypes.Deleted);\n    }\n  };\n\n  public on: IExpirer[\"on\"] = (event, listener) => {\n    this.events.on(event, listener);\n  };\n\n  public once: IExpirer[\"once\"] = (event, listener) => {\n    this.events.once(event, listener);\n  };\n\n  public off: IExpirer[\"off\"] = (event, listener) => {\n    this.events.off(event, listener);\n  };\n\n  public removeListener: IExpirer[\"removeListener\"] = (event, listener) => {\n    this.events.removeListener(event, listener);\n  };\n\n  // ---------- Private ----------------------------------------------- //\n\n  private formatTarget(key: string | number) {\n    if (typeof key === \"string\") {\n      return formatTopicTarget(key);\n    } else if (typeof key === \"number\") {\n      return formatIdTarget(key);\n    }\n    const { message } = getInternalError(\"UNKNOWN_TYPE\", `Target type: ${typeof key}`);\n    throw new Error(message);\n  }\n\n  private async setExpirations(expirations: ExpirerTypes.Expiration[]): Promise<void> {\n    await this.core.storage.setItem<ExpirerTypes.Expiration[]>(this.storageKey, expirations);\n  }\n\n  private async getExpirations(): Promise<ExpirerTypes.Expiration[] | undefined> {\n    const expirations = await this.core.storage.getItem<ExpirerTypes.Expiration[]>(this.storageKey);\n    return expirations;\n  }\n\n  private async persist() {\n    await this.setExpirations(this.values);\n    this.events.emit(EXPIRER_EVENTS.sync);\n  }\n\n  private async restore() {\n    try {\n      const persisted = await this.getExpirations();\n      if (typeof persisted === \"undefined\") return;\n      if (!persisted.length) return;\n      if (this.expirations.size) {\n        const { message } = getInternalError(\"RESTORE_WILL_OVERRIDE\", this.name);\n        this.logger.error(message);\n        throw new Error(message);\n      }\n      this.cached = persisted;\n      this.logger.debug(`Successfully Restored expirations for ${this.name}`);\n      this.logger.trace({ type: \"method\", method: \"restore\", expirations: this.values });\n    } catch (e) {\n      this.logger.debug(`Failed to Restore expirations for ${this.name}`);\n      this.logger.error(e as any);\n    }\n  }\n\n  private getExpiration(target: string): ExpirerTypes.Expiration {\n    const expiration = this.expirations.get(target);\n    if (!expiration) {\n      const { message } = getInternalError(\"NO_MATCHING_KEY\", `${this.name}: ${target}`);\n      this.logger.warn(message);\n      throw new Error(message);\n    }\n    return expiration;\n  }\n\n  private checkExpiry(target: string, expiration: ExpirerTypes.Expiration): void {\n    const { expiry } = expiration;\n    const msToTimeout = toMiliseconds(expiry) - Date.now();\n    if (msToTimeout <= 0) this.expire(target, expiration);\n  }\n\n  private expire(target: string, expiration: ExpirerTypes.Expiration): void {\n    this.expirations.delete(target);\n    this.events.emit(EXPIRER_EVENTS.expired, {\n      target,\n      expiration,\n    } as ExpirerTypes.Expired);\n  }\n\n  private checkExpirations(): void {\n    // avoid auto expiring if the relayer is not connected\n    if (!this.core.relayer.connected) return;\n    this.expirations.forEach((expiration, target) => this.checkExpiry(target, expiration));\n  }\n\n  private registerEventListeners(): void {\n    this.core.heartbeat.on(HEARTBEAT_EVENTS.pulse, () => this.checkExpirations());\n    this.events.on(EXPIRER_EVENTS.created, (createdEvent: ExpirerTypes.Created) => {\n      const eventName = EXPIRER_EVENTS.created;\n      this.logger.info(`Emitting ${eventName}`);\n      this.logger.debug({ type: \"event\", event: eventName, data: createdEvent });\n      this.persist();\n    });\n    this.events.on(EXPIRER_EVENTS.expired, (expiredEvent: ExpirerTypes.Expired) => {\n      const eventName = EXPIRER_EVENTS.expired;\n      this.logger.info(`Emitting ${eventName}`);\n      this.logger.debug({ type: \"event\", event: eventName, data: expiredEvent });\n      this.persist();\n    });\n    this.events.on(EXPIRER_EVENTS.deleted, (deletedEvent: ExpirerTypes.Deleted) => {\n      const eventName = EXPIRER_EVENTS.deleted;\n      this.logger.info(`Emitting ${eventName}`);\n      this.logger.debug({ type: \"event\", event: eventName, data: deletedEvent });\n      this.persist();\n    });\n  }\n\n  private isInitialized() {\n    if (!this.initialized) {\n      const { message } = getInternalError(\"NOT_INITIALIZED\", this.name);\n      throw new Error(message);\n    }\n  }\n}\n","import { generateChildLogger, getLoggerContext, Logger } from \"@walletconnect/logger\";\nimport { ICore, IVerify } from \"@walletconnect/types\";\nimport { isBrowser, isTestRun, P256KeyDataType, verifyP256Jwt } from \"@walletconnect/utils\";\nimport { FIVE_SECONDS, ONE_SECOND, toMiliseconds } from \"@walletconnect/time\";\nimport { getDocument } from \"@walletconnect/window-getters\";\nimport { decodeJWT } from \"@walletconnect/relay-auth\";\nimport { IKeyValueStorage } from \"@walletconnect/keyvaluestorage\";\n\nimport {\n  CORE_STORAGE_PREFIX,\n  CORE_VERSION,\n  TRUSTED_VERIFY_URLS,\n  VERIFY_CONTEXT,\n  VERIFY_SERVER,\n  VERIFY_SERVER_V3,\n} from \"../constants/index.js\";\n\ntype Jwk = {\n  publicKey: P256KeyDataType;\n  expiresAt: number;\n};\ntype JwkPayload = {\n  exp: number;\n  id: string;\n  origin: string;\n  isScam: boolean;\n  isVerified: boolean;\n};\nexport class Verify extends IVerify {\n  public name = VERIFY_CONTEXT;\n  private abortController: AbortController;\n  private isDevEnv;\n  private verifyUrlV3 = VERIFY_SERVER_V3;\n  private storagePrefix = CORE_STORAGE_PREFIX;\n  private version = CORE_VERSION;\n  private publicKey?: Jwk;\n  private fetchPromise?: Promise<Jwk>;\n\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n    public store: IKeyValueStorage,\n  ) {\n    super(core, logger, store);\n    this.logger = generateChildLogger(logger, this.name);\n    this.abortController = new AbortController();\n    this.isDevEnv = isTestRun();\n    this.init();\n  }\n\n  get storeKey(): string {\n    return (\n      this.storagePrefix + this.version + this.core.customStoragePrefix + \"//\" + `verify:public:key`\n    );\n  }\n\n  public init = async () => {\n    if (this.isDevEnv) return;\n    this.publicKey = await this.store.getItem(this.storeKey);\n    if (this.publicKey && toMiliseconds(this.publicKey?.expiresAt) < Date.now()) {\n      this.logger.debug(\"verify v2 public key expired\");\n      await this.removePublicKey();\n    }\n  };\n\n  public register: IVerify[\"register\"] = async (params) => {\n    if (!isBrowser() || this.isDevEnv) return;\n    const origin = window.location.origin;\n    const { id, decryptedId } = params;\n    const src = `${this.verifyUrlV3}/attestation?projectId=${this.core.projectId}&origin=${origin}&id=${id}&decryptedId=${decryptedId}`;\n    try {\n      const document = getDocument() as Document;\n      const abortTimeout = this.startAbortTimer(ONE_SECOND * 5);\n      const attestationJwt = await new Promise((resolve, reject) => {\n        const abortListener = () => {\n          window.removeEventListener(\"message\", listener);\n          document.body.removeChild(iframe);\n          reject(\"attestation aborted\");\n        };\n        this.abortController.signal.addEventListener(\"abort\", abortListener);\n        const iframe = document.createElement(\"iframe\");\n        iframe.src = src;\n        iframe.style.display = \"none\";\n        iframe.addEventListener(\"error\", abortListener, { signal: this.abortController.signal });\n        const listener = (event: MessageEvent) => {\n          if (!event.data) return;\n          if (typeof event.data !== \"string\") return;\n          try {\n            const data = JSON.parse(event.data);\n            if (data.type === \"verify_attestation\") {\n              const decoded = decodeJWT(data.attestation) as unknown as { payload: JwkPayload };\n              if (decoded.payload.id !== id) return;\n\n              clearInterval(abortTimeout);\n              document.body.removeChild(iframe);\n              this.abortController.signal.removeEventListener(\"abort\", abortListener);\n              window.removeEventListener(\"message\", listener);\n              resolve(data.attestation === null ? \"\" : data.attestation);\n            }\n          } catch (e) {\n            this.logger.warn(e);\n          }\n        };\n        document.body.appendChild(iframe);\n        window.addEventListener(\"message\", listener, { signal: this.abortController.signal });\n      });\n      this.logger.debug(attestationJwt, \"jwt attestation\");\n      return attestationJwt as string;\n    } catch (e) {\n      this.logger.warn(e);\n    }\n    return \"\";\n  };\n\n  public resolve: IVerify[\"resolve\"] = async (params) => {\n    if (this.isDevEnv) return \"\";\n    const { attestationId, hash, encryptedId } = params;\n    if (attestationId === \"\") {\n      this.logger.debug(\"resolve: attestationId is empty, skipping\");\n      return;\n    }\n\n    if (attestationId) {\n      const decoded = decodeJWT(attestationId) as unknown as { payload: JwkPayload };\n      if (decoded.payload.id !== encryptedId) return;\n      const validation = await this.isValidJwtAttestation(attestationId);\n      if (validation) {\n        if (!validation.isVerified) {\n          this.logger.warn(\"resolve: jwt attestation: origin url not verified\");\n          return;\n        }\n        return validation;\n      }\n    }\n    if (!hash) return;\n    const verifyUrl = this.getVerifyUrl(params?.verifyUrl);\n    return this.fetchAttestation(hash, verifyUrl);\n  };\n\n  get context(): string {\n    return getLoggerContext(this.logger);\n  }\n\n  private fetchAttestation = async (attestationId: string, url: string) => {\n    this.logger.debug(`resolving attestation: ${attestationId} from url: ${url}`);\n    // set artificial timeout to prevent hanging\n    const timeout = this.startAbortTimer(ONE_SECOND * 5);\n    const result = await fetch(`${url}/attestation/${attestationId}?v2Supported=true`, {\n      signal: this.abortController.signal,\n    });\n    clearTimeout(timeout);\n    return result.status === 200 ? await result.json() : undefined;\n  };\n\n  private startAbortTimer(timer: number) {\n    this.abortController = new AbortController();\n    return setTimeout(() => this.abortController.abort(), toMiliseconds(timer));\n  }\n\n  private getVerifyUrl = (verifyUrl?: string) => {\n    let url = verifyUrl || VERIFY_SERVER;\n    if (!TRUSTED_VERIFY_URLS.includes(url)) {\n      this.logger.info(\n        `verify url: ${url}, not included in trusted list, assigning default: ${VERIFY_SERVER}`,\n      );\n      url = VERIFY_SERVER;\n    }\n    return url;\n  };\n\n  private fetchPublicKey = async () => {\n    try {\n      this.logger.debug(`fetching public key from: ${this.verifyUrlV3}`);\n      const timeout = this.startAbortTimer(FIVE_SECONDS);\n      const result = await fetch(`${this.verifyUrlV3}/public-key`, {\n        signal: this.abortController.signal,\n      });\n      clearTimeout(timeout);\n      return (await result.json()) as Jwk;\n    } catch (e) {\n      this.logger.warn(e);\n    }\n    return undefined;\n  };\n\n  private persistPublicKey = async (publicKey: Jwk) => {\n    this.logger.debug(publicKey, `persisting public key to local storage`);\n    await this.store.setItem(this.storeKey, publicKey);\n    this.publicKey = publicKey;\n  };\n\n  private removePublicKey = async () => {\n    this.logger.debug(`removing verify v2 public key from storage`);\n    await this.store.removeItem(this.storeKey);\n    this.publicKey = undefined;\n  };\n\n  private isValidJwtAttestation = async (attestation: string) => {\n    const key = await this.getPublicKey();\n    try {\n      if (key) {\n        const validation = this.validateAttestation(attestation, key);\n        return validation;\n      }\n    } catch (e) {\n      this.logger.error(e);\n      this.logger.warn(\"error validating attestation\");\n    }\n    const newKey = await this.fetchAndPersistPublicKey();\n    try {\n      if (newKey) {\n        const validation = this.validateAttestation(attestation, newKey);\n        return validation;\n      }\n    } catch (e) {\n      this.logger.error(e);\n      this.logger.warn(\"error validating attestation\");\n    }\n    return undefined;\n  };\n\n  private getPublicKey = async () => {\n    if (this.publicKey) return this.publicKey;\n    return await this.fetchAndPersistPublicKey();\n  };\n\n  private fetchAndPersistPublicKey = async () => {\n    if (this.fetchPromise) {\n      await this.fetchPromise;\n      return this.publicKey;\n    }\n    this.fetchPromise = new Promise(async (resolve) => {\n      const key = await this.fetchPublicKey();\n      if (!key) return;\n      await this.persistPublicKey(key);\n      resolve(key);\n    });\n    const key = await this.fetchPromise;\n    this.fetchPromise = undefined;\n    return key;\n  };\n\n  private validateAttestation = (attestation: string, key: Jwk) => {\n    const result = verifyP256Jwt<JwkPayload>(attestation, key.publicKey);\n    const validation = {\n      hasExpired: toMiliseconds(result.exp) < Date.now(),\n      payload: result,\n    };\n\n    if (validation.hasExpired) {\n      this.logger.warn(\"resolve: jwt attestation expired\");\n      throw new Error(\"JWT attestation expired\");\n    }\n\n    return {\n      origin: validation.payload.origin,\n      isScam: validation.payload.isScam,\n      isVerified: validation.payload.isVerified,\n    };\n  };\n}\n","import { generateChildLogger, Logger } from \"@walletconnect/logger\";\nimport { IEchoClient } from \"@walletconnect/types\";\nimport { ECHO_CONTEXT, ECHO_URL } from \"../constants/index.js\";\n\nexport class EchoClient extends IEchoClient {\n  public readonly context = ECHO_CONTEXT;\n  constructor(\n    public projectId: string,\n    public logger: Logger,\n  ) {\n    super(projectId, logger);\n    this.logger = generateChildLogger(logger, this.context);\n  }\n\n  public registerDeviceToken: IEchoClient[\"registerDeviceToken\"] = async (params) => {\n    const { clientId, token, notificationType, enableEncrypted = false } = params;\n\n    const echoUrl = `${ECHO_URL}/${this.projectId}/clients`;\n\n    await fetch(echoUrl, {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({\n        client_id: clientId,\n        type: notificationType,\n        token,\n        always_raw: enableEncrypted,\n      }),\n    });\n  };\n}\n","import { generateChildLogger, Logger } from \"@walletconnect/logger\";\nimport { ICore, IEventClient, EventClientTypes } from \"@walletconnect/types\";\nimport { formatUA, isTestRun, uuidv4, getAppMetadata } from \"@walletconnect/utils\";\nimport { HEARTBEAT_EVENTS } from \"@walletconnect/heartbeat\";\nimport { fromMiliseconds } from \"@walletconnect/time\";\nimport {\n  CORE_STORAGE_PREFIX,\n  EVENTS_CLIENT_API_URL,\n  EVENTS_STORAGE_CLEANUP_INTERVAL,\n  EVENTS_STORAGE_CONTEXT,\n  EVENTS_STORAGE_VERSION,\n  RELAYER_SDK_VERSION,\n} from \"../constants/index.js\";\n\nexport class EventClient extends IEventClient {\n  public readonly context = EVENTS_STORAGE_CONTEXT;\n  private readonly storagePrefix = CORE_STORAGE_PREFIX;\n  private readonly storageVersion = EVENTS_STORAGE_VERSION;\n  private events = new Map<string, EventClientTypes.Event>();\n  private shouldPersist = false;\n  constructor(\n    public core: ICore,\n    public logger: Logger,\n    telemetryEnabled = true,\n  ) {\n    super(core, logger, telemetryEnabled);\n    this.logger = generateChildLogger(logger, this.context);\n    this.telemetryEnabled = telemetryEnabled;\n    if (telemetryEnabled) {\n      this.restore().then(async () => {\n        await this.submit();\n        this.setEventListeners();\n      });\n    } else {\n      // overwrite any persisted events with an empty array\n      this.persist();\n    }\n  }\n\n  get storageKey() {\n    return (\n      this.storagePrefix + this.storageVersion + this.core.customStoragePrefix + \"//\" + this.context\n    );\n  }\n\n  public init: IEventClient[\"init\"] = async () => {\n    if (isTestRun()) return;\n    try {\n      const initEvent = {\n        eventId: uuidv4(),\n        timestamp: Date.now(),\n        domain: this.getAppDomain(),\n        props: {\n          event: \"INIT\",\n          type: \"\",\n          properties: {\n            client_id: await this.core.crypto.getClientId(),\n            user_agent: formatUA(\n              this.core.relayer.protocol,\n              this.core.relayer.version,\n              RELAYER_SDK_VERSION,\n            ),\n          },\n        },\n      };\n      await this.sendEvent([initEvent] as unknown as EventClientTypes.Event[]);\n    } catch (error) {\n      this.logger.warn(error);\n    }\n  };\n\n  public createEvent: IEventClient[\"createEvent\"] = (params) => {\n    const {\n      event = \"ERROR\",\n      type = \"\",\n      properties: { topic, trace },\n    } = params;\n    const eventId = uuidv4();\n    const bundleId = this.core.projectId || \"\";\n    const timestamp = Date.now();\n    const props = {\n      event,\n      type,\n      properties: {\n        topic,\n        trace,\n      },\n    };\n    const eventObj = {\n      eventId,\n      timestamp,\n      props,\n      bundleId,\n      domain: this.getAppDomain(),\n      ...this.setMethods(eventId),\n    };\n    if (this.telemetryEnabled) {\n      this.events.set(eventId, eventObj);\n      this.shouldPersist = true;\n    }\n\n    return eventObj;\n  };\n\n  public getEvent: IEventClient[\"getEvent\"] = (params) => {\n    const { eventId, topic } = params;\n    if (eventId) {\n      return this.events.get(eventId);\n    }\n    const event = Array.from(this.events.values()).find(\n      (event) => event.props.properties.topic === topic,\n    );\n\n    if (!event) return;\n\n    return {\n      ...event,\n      ...this.setMethods(event.eventId),\n    };\n  };\n\n  public deleteEvent: IEventClient[\"deleteEvent\"] = (params) => {\n    const { eventId } = params;\n    this.events.delete(eventId);\n    this.shouldPersist = true;\n  };\n\n  private setEventListeners = () => {\n    this.core.heartbeat.on(HEARTBEAT_EVENTS.pulse, async () => {\n      if (this.shouldPersist) await this.persist();\n      // cleanup events older than EVENTS_STORAGE_CLEANUP_INTERVAL\n      this.events.forEach((event) => {\n        if (\n          fromMiliseconds(Date.now()) - fromMiliseconds(event.timestamp) >\n          EVENTS_STORAGE_CLEANUP_INTERVAL\n        ) {\n          this.events.delete(event.eventId);\n          this.shouldPersist = true;\n        }\n      });\n    });\n  };\n\n  private setMethods = (eventId: string) => {\n    return {\n      addTrace: (trace: string) => this.addTrace(eventId, trace),\n      setError: (errorType: string) => this.setError(eventId, errorType),\n    };\n  };\n\n  private addTrace = (eventId: string, trace: string) => {\n    const event = this.events.get(eventId);\n    if (!event) return;\n    event.props.properties.trace.push(trace);\n    this.events.set(eventId, event);\n    this.shouldPersist = true;\n  };\n\n  private setError = (eventId: string, errorType: string) => {\n    const event = this.events.get(eventId);\n    if (!event) return;\n    event.props.type = errorType;\n    event.timestamp = Date.now();\n    this.events.set(eventId, event);\n    this.shouldPersist = true;\n  };\n\n  private persist = async () => {\n    await this.core.storage.setItem(this.storageKey, Array.from(this.events.values()));\n    this.shouldPersist = false;\n  };\n\n  private restore = async () => {\n    try {\n      const events =\n        (await this.core.storage.getItem<EventClientTypes.Event[]>(this.storageKey)) || [];\n      if (!events.length) return;\n      events.forEach((event) => {\n        this.events.set(event.eventId, {\n          ...event,\n          ...this.setMethods(event.eventId),\n        });\n      });\n    } catch (error) {\n      this.logger.warn(error);\n    }\n  };\n\n  private submit = async () => {\n    if (!this.telemetryEnabled) return;\n\n    if (this.events.size === 0) return;\n\n    const eventsToSend: EventClientTypes.Event[] = [];\n    // exclude events without type as they can be considered `in progress`\n    for (const [_, event] of this.events) {\n      if (event.props.type) {\n        eventsToSend.push(event);\n      }\n    }\n\n    if (eventsToSend.length === 0) return;\n\n    try {\n      const response = await this.sendEvent(eventsToSend);\n      if (response.ok) {\n        for (const event of eventsToSend) {\n          this.events.delete(event.eventId);\n          this.shouldPersist = true;\n        }\n      }\n    } catch (error) {\n      this.logger.warn(error);\n    }\n  };\n\n  private sendEvent = async (events: EventClientTypes.Event[]) => {\n    // if domain isn't available, set `sp` as `desktop` so data would be extracted on api side\n    const platform = this.getAppDomain() ? \"\" : \"&sp=desktop\";\n    const response = await fetch(\n      `${EVENTS_CLIENT_API_URL}?projectId=${this.core.projectId}&st=events_sdk&sv=js-${RELAYER_SDK_VERSION}${platform}`,\n      {\n        method: \"POST\",\n        body: JSON.stringify(events),\n      },\n    );\n    return response;\n  };\n\n  private getAppDomain = () => {\n    return getAppMetadata().url;\n  };\n}\n","import { EventEmitter } from \"events\";\n\nimport { HeartBeat } from \"@walletconnect/heartbeat\";\nimport KeyValueStorage from \"@walletconnect/keyvaluestorage\";\nimport {\n  ChunkLoggerController,\n  generateChildLogger,\n  generatePlatformLogger,\n  getDefaultLoggerOptions,\n  getLoggerContext,\n} from \"@walletconnect/logger\";\nimport { CoreTypes, ICore } from \"@walletconnect/types\";\n\nimport {\n  CORE_CONTEXT,\n  CORE_DEFAULT,\n  CORE_PROTOCOL,\n  CORE_STORAGE_OPTIONS,\n  CORE_VERSION,\n  RELAYER_DEFAULT_RELAY_URL,\n  TRANSPORT_TYPES,\n  WALLETCONNECT_CLIENT_ID,\n  WALLETCONNECT_LINK_MODE_APPS,\n} from \"./constants/index.js\";\nimport {\n  Crypto,\n  EchoClient,\n  EventClient,\n  Expirer,\n  JsonRpcHistory,\n  Pairing,\n  Relayer,\n  Verify,\n} from \"./controllers/index.js\";\n\nexport class Core extends ICore {\n  public readonly protocol = CORE_PROTOCOL;\n  public readonly version = CORE_VERSION;\n\n  public readonly name: ICore[\"name\"] = CORE_CONTEXT;\n  public readonly relayUrl: ICore[\"relayUrl\"];\n  public readonly projectId: ICore[\"projectId\"];\n  public readonly customStoragePrefix: ICore[\"customStoragePrefix\"];\n  public events: ICore[\"events\"] = new EventEmitter();\n  public logger: ICore[\"logger\"];\n  public heartbeat: ICore[\"heartbeat\"];\n  public relayer: ICore[\"relayer\"];\n  public crypto: ICore[\"crypto\"];\n  public storage: ICore[\"storage\"];\n  public history: ICore[\"history\"];\n  public expirer: ICore[\"expirer\"];\n  public pairing: ICore[\"pairing\"];\n  public verify: ICore[\"verify\"];\n  public echoClient: ICore[\"echoClient\"];\n  public linkModeSupportedApps: ICore[\"linkModeSupportedApps\"];\n  public eventClient: ICore[\"eventClient\"];\n\n  private initialized = false;\n  private logChunkController: ChunkLoggerController | null;\n\n  static async init(opts?: CoreTypes.Options) {\n    const core = new Core(opts);\n    await core.initialize();\n    const clientId = await core.crypto.getClientId();\n    await core.storage.setItem(WALLETCONNECT_CLIENT_ID, clientId);\n\n    return core;\n  }\n\n  constructor(opts?: CoreTypes.Options) {\n    super(opts);\n\n    const globalCore = this.getGlobalCore(opts?.customStoragePrefix);\n    if (globalCore) {\n      try {\n        this.customStoragePrefix = globalCore.customStoragePrefix;\n        this.logger = globalCore.logger;\n        this.heartbeat = globalCore.heartbeat;\n        this.crypto = globalCore.crypto;\n        this.history = globalCore.history;\n        this.expirer = globalCore.expirer;\n        this.storage = globalCore.storage;\n        this.relayer = globalCore.relayer;\n        this.pairing = globalCore.pairing;\n        this.verify = globalCore.verify;\n        this.echoClient = globalCore.echoClient;\n        this.linkModeSupportedApps = globalCore.linkModeSupportedApps;\n        this.eventClient = globalCore.eventClient;\n        this.initialized = globalCore.initialized;\n        this.logChunkController = globalCore.logChunkController;\n        return globalCore;\n      } catch (error) {\n        console.warn(\"Failed to copy global core\", error);\n      }\n    }\n\n    this.projectId = opts?.projectId;\n    this.relayUrl = opts?.relayUrl || RELAYER_DEFAULT_RELAY_URL;\n    this.customStoragePrefix = opts?.customStoragePrefix ? `:${opts.customStoragePrefix}` : \"\";\n\n    const loggerOptions = getDefaultLoggerOptions({\n      level: typeof opts?.logger === \"string\" && opts.logger ? opts.logger : CORE_DEFAULT.logger,\n      name: CORE_CONTEXT,\n    });\n\n    const { logger, chunkLoggerController } = generatePlatformLogger({\n      opts: loggerOptions,\n      maxSizeInBytes: opts?.maxLogBlobSizeInBytes,\n      loggerOverride: opts?.logger,\n    });\n\n    this.logChunkController = chunkLoggerController;\n\n    if (this.logChunkController?.downloadLogsBlobInBrowser) {\n      // @ts-ignore\n      window.downloadLogsBlobInBrowser = async () => {\n        // Have to null check twice because there is no guarantee\n        // this.logChunkController.downloadLogsBlobInBrowser is always truthy\n        if (this.logChunkController?.downloadLogsBlobInBrowser) {\n          this.logChunkController?.downloadLogsBlobInBrowser({\n            clientId: await this.crypto.getClientId(),\n          });\n        }\n      };\n    }\n\n    this.logger = generateChildLogger(logger, this.name);\n    this.heartbeat = new HeartBeat();\n    this.crypto = new Crypto(this, this.logger, opts?.keychain);\n    this.history = new JsonRpcHistory(this, this.logger);\n    this.expirer = new Expirer(this, this.logger);\n    this.storage = opts?.storage\n      ? opts.storage\n      : new KeyValueStorage({ ...CORE_STORAGE_OPTIONS, ...opts?.storageOptions });\n    this.relayer = new Relayer({\n      core: this,\n      logger: this.logger,\n      relayUrl: this.relayUrl,\n      projectId: this.projectId,\n    });\n    this.pairing = new Pairing(this, this.logger);\n    this.verify = new Verify(this, this.logger, this.storage);\n    this.echoClient = new EchoClient(this.projectId || \"\", this.logger);\n    this.linkModeSupportedApps = [];\n    this.eventClient = new EventClient(this, this.logger, opts?.telemetryEnabled);\n    this.setGlobalCore(this);\n  }\n\n  get context() {\n    return getLoggerContext(this.logger);\n  }\n\n  // ---------- Public ----------------------------------------------- //\n\n  public async start() {\n    if (this.initialized) return;\n    await this.initialize();\n  }\n\n  public async getLogsBlob() {\n    return this.logChunkController?.logsToBlob({\n      clientId: await this.crypto.getClientId(),\n    });\n  }\n\n  public async addLinkModeSupportedApp(universalLink: string) {\n    if (this.linkModeSupportedApps.includes(universalLink)) return;\n    this.linkModeSupportedApps.push(universalLink);\n    await this.storage.setItem(WALLETCONNECT_LINK_MODE_APPS, this.linkModeSupportedApps);\n  }\n\n  // ---------- Events ----------------------------------------------- //\n\n  public on = (name: any, listener: any) => {\n    return this.events.on(name, listener);\n  };\n\n  public once = (name: any, listener: any) => {\n    return this.events.once(name, listener);\n  };\n\n  public off = (name: any, listener: any) => {\n    return this.events.off(name, listener);\n  };\n\n  public removeListener = (name: any, listener: any) => {\n    return this.events.removeListener(name, listener);\n  };\n\n  // ---------- Link-mode ----------------------------------------------- //\n\n  public dispatchEnvelope = ({\n    topic,\n    message,\n    sessionExists,\n  }: {\n    topic: string;\n    message: string;\n    sessionExists: boolean;\n  }) => {\n    if (!topic || !message) return;\n\n    const payload = {\n      topic,\n      message,\n      publishedAt: Date.now(),\n      transportType: TRANSPORT_TYPES.link_mode,\n    };\n\n    this.relayer.onLinkMessageEvent(payload, { sessionExists });\n  };\n\n  // ---------- Private ----------------------------------------------- //\n\n  private async initialize() {\n    this.logger.trace(`Initialized`);\n    try {\n      await this.crypto.init();\n      await this.history.init();\n      await this.expirer.init();\n      await this.relayer.init();\n      await this.heartbeat.init();\n      await this.pairing.init();\n      this.linkModeSupportedApps = (await this.storage.getItem(WALLETCONNECT_LINK_MODE_APPS)) || [];\n\n      this.initialized = true;\n      this.logger.info(`Core Initialization Success`);\n    } catch (error) {\n      this.logger.warn(error, `Core Initialization Failure at epoch ${Date.now()}`);\n      this.logger.error((error as any).message);\n      throw error;\n    }\n  }\n\n  private getGlobalCore(customStoragePrefix = \"\"): Core | undefined {\n    try {\n      if (this.isGlobalCoreDisabled()) {\n        return undefined;\n      }\n      const globalCorePrefix = `_walletConnectCore_${customStoragePrefix}`;\n\n      const counterKey = `${globalCorePrefix}_count`;\n      globalThis[counterKey] = (globalThis[counterKey] || 0) + 1;\n      if (globalThis[counterKey] > 1) {\n        console.warn(\n          `WalletConnect Core is already initialized. This is probably a mistake and can lead to unexpected behavior. Init() was called ${globalThis[counterKey]} times.`,\n        );\n      }\n\n      return globalThis[globalCorePrefix];\n    } catch (error) {\n      console.warn(\"Failed to get global WalletConnect core\", error);\n      return undefined;\n    }\n  }\n\n  private setGlobalCore(core: Core) {\n    try {\n      if (this.isGlobalCoreDisabled()) {\n        return;\n      }\n      const customStoragePrefix = core.opts?.customStoragePrefix || \"\";\n      const globalCorePrefix = `_walletConnectCore_${customStoragePrefix}`;\n      globalThis[globalCorePrefix] = core;\n    } catch (error) {\n      console.warn(\"Failed to set global WalletConnect core\", error);\n    }\n  }\n\n  private isGlobalCoreDisabled() {\n    try {\n      return typeof process !== \"undefined\" && process.env.DISABLE_GLOBAL_CORE === \"true\";\n    } catch (error) {\n      return true;\n    }\n  }\n}\n","import { Core as WalletConnectCore } from \"./core.js\";\n\nexport * from \"./constants/index.js\";\nexport * from \"./controllers/index.js\";\n\nexport const Core = WalletConnectCore;\nexport default WalletConnectCore;\n"],"names":["CORE_PROTOCOL","CORE_VERSION","CORE_CONTEXT","CORE_STORAGE_PREFIX","CORE_DEFAULT","CORE_STORAGE_OPTIONS","CRYPTO_CONTEXT","CRYPTO_CLIENT_SEED","CRYPTO_JWT_TTL","ONE_DAY","KEYCHAIN_CONTEXT","KEYCHAIN_STORAGE_VERSION","MESSAGES_CONTEXT","MESSAGES_STORAGE_VERSION","PUBLISHER_DEFAULT_TTL","SIX_HOURS","PUBLISHER_CONTEXT","RELAYER_DEFAULT_PROTOCOL","RELAYER_DEFAULT_LOGGER","RELAYER_DEFAULT_RELAY_URL","RELAYER_CONTEXT","RELAYER_EVENTS","RELAYER_SUBSCRIBER_SUFFIX","RELAYER_PROVIDER_EVENTS","RELAYER_RECONNECT_TIMEOUT","RELAYER_STORAGE_OPTIONS","RELAYER_SDK_VERSION","RELAYER_TRANSPORT_CUTOFF","TRANSPORT_TYPES","MESSAGE_DIRECTION","STORE_STORAGE_VERSION","WALLETCONNECT_CLIENT_ID","WALLETCONNECT_LINK_MODE_APPS","SUBSCRIBER_EVENTS","SUBSCRIBER_DEFAULT_TTL","THIRTY_DAYS","SUBSCRIBER_CONTEXT","SUBSCRIBER_STORAGE_VERSION","PENDING_SUB_RESOLUTION_TIMEOUT","FIVE_SECONDS","PAIRING_CONTEXT","PAIRING_STORAGE_VERSION","PAIRING_DEFAULT_TTL","PAIRING_RPC_OPTS","THIRTY_SECONDS","PAIRING_EVENTS","HISTORY_EVENTS","HISTORY_CONTEXT","HISTORY_STORAGE_VERSION","EXPIRER_CONTEXT","EXPIRER_EVENTS","EXPIRER_STORAGE_VERSION","EXPIRER_DEFAULT_TTL","VERIFY_CONTEXT","VERIFY_SERVER_COM","VERIFY_SERVER_ORG","VERIFY_SERVER","VERIFY_SERVER_V3","TRUSTED_VERIFY_URLS","ECHO_CONTEXT","ECHO_URL","EVENT_CLIENT_CONTEXT","EVENT_CLIENT_PAIRING_TRACES","EVENT_CLIENT_PAIRING_ERRORS","EVENT_CLIENT_SESSION_TRACES","EVENT_CLIENT_SESSION_ERRORS","EVENT_CLIENT_AUTHENTICATE_TRACES","EVENT_CLIENT_AUTHENTICATE_ERRORS","EVENTS_STORAGE_VERSION","EVENTS_STORAGE_CONTEXT","EVENTS_STORAGE_CLEANUP_INTERVAL","EVENTS_CLIENT_API_URL","KeyChain","core","logger","keychain","tag","key","message","getInternalError","generateChildLogger","getLoggerContext","mapToObj","objToMap","Crypto","generateRandomBytes32","seed","keyPair","relayAuth","clientId","generateKeyPairUtil","aud","sub","ttl","selfPublicKey","peerPublicKey","overrideTopic","selfPrivateKey","symKey","deriveSymKey","topic","hashKey","publicKey","payload","opts","params","validateEncoding","safeJsonStringify","isTypeTwoEnvelope","encodeTypeTwoEnvelope","isTypeOneEnvelope","type","senderPublicKey","encrypt","encoded","validateDecoding","decodeTypeTwoEnvelope","safeJsonParse","decrypt","error","encoding","BASE64","deserialized","deserialize","decodeTypeByte","toString","BASE16","privateKey","fromString","MessageTracker","IMessageTracker","messages","messagesWithoutClientAck","e","direction","hash","hashMessage","topics","Publisher","IPublisher","relayer","EventEmitter","toMiliseconds","ONE_MINUTE","ONE_SECOND","prompt","id","getBigIntRpcId","api","getRelayProtocolApi","getRelayProtocolName","request","failedPublishMessage","isUndefined","publishPromise","resolve","onPublish","initialPublish","createExpiringPromise","reject","attestation","tvf","publishMethod","FIVE_MINUTES","method","event","listener","result","attempt","HEARTBEAT_EVENTS","SubscriberTopicMap","ids","remaining","x","Subscriber","ISubscriber","relay","s","pendingSubscriptions","createdEvent","eventName","deletedEvent","reason","getSdkError","subId","shouldThrow","subscribePromise","onSubscribe","subscription","err","subscriptions","subs","numOfBatches","i","batch","persisted","response","sleep","Relayer","IRelayer","isNode","createLogger","isAndroid","getAppId","isIos","shouldThrowOnFailure","resolvePromise","onSubCreated","relayUrl","isOnline","sortedMessages","a","b","messageEvent","expiry","calcExpiry","pairing","onDisconnect","auth","JsonRpcProvider","WsConnection","formatRelayRpcUrl","exists","isJsonRpcRequest","publishedAt","isJsonRpcResponse","formatJsonRpcResult","lastConnectedState","subscribeToNetworkChange","connected","isAppVisible","delay","Store","IStore","name","storagePrefix","getKey","value","isProposalStruct","isSessionStruct","filter","isEqual","update","Pairing","TYPE_1","methods","uri","formatUri","expiryTimestamp","parseUri","existingPairing","done","createDelayedPromise","engineEvent","metadata","formatJsonRpcRequest","formatJsonRpcError","expirerHasDeleted","expiredPairings","isExpired","resMethod","_topic","isJsonRpcResult","isJsonRpcError","isValidParams","isValidUrl","isValidString","transportType","parseExpirerTarget","JsonRpcHistory","IJsonRpcHistory","record","chainId","requests","requestEvent","records","deleted","Expirer","IExpirer","expiration","target","formatTopicTarget","formatIdTarget","expirations","expiredEvent","Verify","IVerify","store","isBrowser","origin","decryptedId","src","document","getDocument","abortTimeout","attestationJwt","abortListener","iframe","data","decodeJWT","attestationId","encryptedId","validation","verifyUrl","url","timeout","newKey","verifyP256Jwt","isTestRun","timer","EchoClient","IEchoClient","projectId","token","notificationType","enableEncrypted","echoUrl","EventClient","IEventClient","telemetryEnabled","initEvent","uuidv4","formatUA","trace","eventId","bundleId","timestamp","eventObj","fromMiliseconds","errorType","events","eventsToSend","_","platform","getAppMetadata","Core$1","Core","ICore","sessionExists","globalCore","loggerOptions","getDefaultLoggerOptions","chunkLoggerController","generatePlatformLogger","HeartBeat","KeyValueStorage","universalLink","customStoragePrefix","globalCorePrefix","counterKey","WalletConnectCore"],"mappings":"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"}