{"version":3,"file":"EIP6963.mjs","sourceRoot":"","sources":["../src/EIP6963.ts"],"names":[],"mappings":"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","sourcesContent":["import { isObject } from '@metamask/utils';\n\nimport type { BaseProvider } from './BaseProvider';\nimport type { BaseProviderInfo } from './types';\nimport { FQDN_REGEX, UUID_V4_REGEX } from './utils';\n\n/**\n * Describes the possible EIP-6963 event names\n */\nenum EIP6963EventNames {\n  Announce = 'eip6963:announceProvider',\n  Request = 'eip6963:requestProvider', // eslint-disable-line @typescript-eslint/no-shadow\n}\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n  interface WindowEventMap {\n    [EIP6963EventNames.Request]: EIP6963RequestProviderEvent;\n    [EIP6963EventNames.Announce]: EIP6963AnnounceProviderEvent;\n  }\n}\n\n/**\n * Represents the assets needed to display and identify a wallet.\n *\n * @type EIP6963ProviderInfo\n * @property uuid - A locally unique identifier for the wallet. MUST be a v4 UUID.\n * @property name - The name of the wallet.\n * @property icon - The icon for the wallet. MUST be data URI.\n * @property rdns - The reverse syntax domain name identifier for the wallet.\n */\nexport type EIP6963ProviderInfo = BaseProviderInfo;\n\n/**\n * Represents a provider and the information relevant for the dapp.\n *\n * @type EIP6963ProviderDetail\n * @property info - The EIP6963ProviderInfo object.\n * @property provider - The provider instance.\n */\nexport type EIP6963ProviderDetail = {\n  info: EIP6963ProviderInfo;\n  provider: BaseProvider;\n};\n\n/**\n * Event for requesting an EVM provider.\n *\n * @type EIP6963RequestProviderEvent\n * @property type - The name of the event.\n */\nexport type EIP6963RequestProviderEvent = Event & {\n  type: EIP6963EventNames.Request;\n};\n\n/**\n * Event for announcing an EVM provider.\n *\n * @type EIP6963RequestProviderEvent\n * @property type - The name of the event.\n * @property detail - The detail object of the event.\n */\nexport type EIP6963AnnounceProviderEvent = CustomEvent & {\n  type: EIP6963EventNames.Announce;\n  detail: EIP6963ProviderDetail;\n};\n\n/**\n * Intended to be used by a dapp. Forwards every announced provider to the\n * provided handler by listening for * {@link EIP6963AnnounceProviderEvent},\n * and dispatches an {@link EIP6963RequestProviderEvent}.\n *\n * @param handleProvider - A function that handles an announced provider.\n */\nexport function requestProvider<HandlerReturnType>(\n  handleProvider: (providerDetail: EIP6963ProviderDetail) => HandlerReturnType,\n): void {\n  window.addEventListener(\n    EIP6963EventNames.Announce,\n    (event: EIP6963AnnounceProviderEvent) => {\n      if (!isValidAnnounceProviderEvent(event)) {\n        throwErrorEIP6963(\n          `Invalid EIP-6963 AnnounceProviderEvent object received from ${EIP6963EventNames.Announce} event.`,\n        );\n      }\n      handleProvider(event.detail);\n    },\n  );\n\n  window.dispatchEvent(new Event(EIP6963EventNames.Request));\n}\n\n/**\n * Intended to be used by a wallet. Announces a provider by dispatching\n * an {@link EIP6963AnnounceProviderEvent}, and listening for\n * {@link EIP6963RequestProviderEvent} to re-announce.\n *\n * @throws If the {@link EIP6963ProviderDetail} is invalid.\n * @param providerDetail - The {@link EIP6963ProviderDetail} to announce.\n * @param providerDetail.info - The {@link EIP6963ProviderInfo} to announce.\n * @param providerDetail.provider - The provider to announce.\n */\nexport function announceProvider(providerDetail: EIP6963ProviderDetail): void {\n  if (!isValidProviderDetail(providerDetail)) {\n    throwErrorEIP6963('Invalid EIP-6963 ProviderDetail object.');\n  }\n  const { info, provider } = providerDetail;\n\n  const _announceProvider = () =>\n    window.dispatchEvent(\n      new CustomEvent(EIP6963EventNames.Announce, {\n        detail: Object.freeze({ info: { ...info }, provider }),\n      }),\n    );\n\n  _announceProvider();\n  window.addEventListener(\n    EIP6963EventNames.Request,\n    (event: EIP6963RequestProviderEvent) => {\n      if (!isValidRequestProviderEvent(event)) {\n        throwErrorEIP6963(\n          `Invalid EIP-6963 RequestProviderEvent object received from ${EIP6963EventNames.Request} event.`,\n        );\n      }\n      _announceProvider();\n    },\n  );\n}\n\n/**\n * Validates an {@link EIP6963RequestProviderEvent} object.\n *\n * @param event - The {@link EIP6963RequestProviderEvent} to validate.\n * @returns Whether the {@link EIP6963RequestProviderEvent} is valid.\n */\nfunction isValidRequestProviderEvent(\n  event: unknown,\n): event is EIP6963RequestProviderEvent {\n  return event instanceof Event && event.type === EIP6963EventNames.Request;\n}\n\n/**\n * Validates an {@link EIP6963AnnounceProviderEvent} object.\n *\n * @param event - The {@link EIP6963AnnounceProviderEvent} to validate.\n * @returns Whether the {@link EIP6963AnnounceProviderEvent} is valid.\n */\nfunction isValidAnnounceProviderEvent(\n  event: unknown,\n): event is EIP6963AnnounceProviderEvent {\n  return (\n    event instanceof CustomEvent &&\n    event.type === EIP6963EventNames.Announce &&\n    Object.isFrozen(event.detail) &&\n    isValidProviderDetail(event.detail)\n  );\n}\n\n/**\n * Validates an {@link EIP6963ProviderDetail} object.\n *\n * @param providerDetail - The {@link EIP6963ProviderDetail} to validate.\n * @returns Whether the {@link EIP6963ProviderDetail} is valid.\n */\nfunction isValidProviderDetail(\n  providerDetail: unknown,\n): providerDetail is EIP6963ProviderDetail {\n  if (\n    !isObject(providerDetail) ||\n    !isObject(providerDetail.info) ||\n    !isObject(providerDetail.provider)\n  ) {\n    return false;\n  }\n  const { info } = providerDetail;\n\n  return (\n    typeof info.uuid === 'string' &&\n    UUID_V4_REGEX.test(info.uuid) &&\n    typeof info.name === 'string' &&\n    Boolean(info.name) &&\n    typeof info.icon === 'string' &&\n    info.icon.startsWith('data:image') &&\n    typeof info.rdns === 'string' &&\n    FQDN_REGEX.test(info.rdns)\n  );\n}\n\n/**\n * Throws an error with link to EIP-6963 specifications.\n *\n * @param message - The message to include.\n * @throws a friendly error with a link to EIP-6963.\n */\nfunction throwErrorEIP6963(message: string) {\n  throw new Error(\n    `${message} See https://eips.ethereum.org/EIPS/eip-6963 for requirements.`,\n  );\n}\n"]}