{"version":3,"file":"eip-6963-metamask-provider.mjs","sourceRoot":"","sources":["../../../src/sdk/utils/eip-6963-metamask-provider.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,mBAAmB;IAC1B,aAAa,EAAE,iBAAiB;CACjC,CAAC;AAMF,oFAAoF;AACpF,MAAM,aAAa,GAAyD,EAAE,CAAC;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAA2B,KAAK;IAEhC,OAAO,IAAI,OAAO,CAAyB,CAAC,OAAO,EAAE,EAAE;QACrD,IAAI,IAAI,KAAK,KAAK,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC;YACd,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,cAAc,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAkD,EAAE,CAAC;QAEpE,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAE,EAAE;YAC7C,MAAM,UAAU,GAAG,KAAiD,CAAC;YACrE,MAAM,cAAc,GAAG,UAAU,EAAE,MAAM,CAAC;YAC1C,IAAI,cAAc,EAAE,QAAQ,IAAI,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAC3D,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI;oBAChC,QAAQ,EAAE,cAAc,EAAE,QAAQ;iBACnC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,0BAA0B,EAAE,mBAAmB,CAAC,CAAC;QACzE,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAE3D;;;WAGG;QACH,UAAU,CAAC,GAAG,EAAE;YACd,2BAA2B;YAC3B,MAAM,CAAC,mBAAmB,CACxB,0BAA0B,EAC1B,mBAAmB,CACpB,CAAC;YAEF,IAAI,QAAgC,CAAC;YACrC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;gBACnB,qCAAqC;gBACrC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBAC3D,QAAQ;oBACN,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ;wBACjE,IAAI,CAAC;YACT,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC/C,QAAQ;oBACN,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC;YACrE,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,aAAa,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;YACjC,CAAC;YACD,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Eip1193Provider } from 'ethers';\n\n// We can isolate and create a metamask function/closure\nexport type AnnounceProviderEventDetail = {\n  info?: { rdns?: string };\n  provider?: Eip1193Provider;\n};\nexport type AnnounceProviderEvent = CustomEvent<AnnounceProviderEventDetail>;\n\nexport const metamaskClientsRdns = {\n  main: 'io.metamask',\n  flask: 'io.metamask.flask',\n  institutional: 'io.metamask.mmi',\n};\n\nexport type MetamaskClientRdnsKey = keyof typeof metamaskClientsRdns;\n\ntype MetaMaskClientType = 'any' | MetamaskClientRdnsKey;\n\n// Cache, as when the function is recalled, we can reuse instead of continue waiting\nconst providerCache: Partial<Record<MetaMaskClientType, Eip1193Provider>> = {};\n\n/**\n * This uses EIP6963 to find all metamask accounts and returns the first matching provider\n * the consumer requests (main, flask, institutional, or any)\n *\n * @param type - the MetaMask Wallet type (main, flask, institutional, or any)\n * @returns a ethers provider so you can make requests to that specific wallet\n */\nexport function getMetaMaskProviderEIP6963(\n  type: MetaMaskClientType = 'any',\n): Promise<Eip1193Provider | null> {\n  return new Promise<Eip1193Provider | null>((resolve) => {\n    if (type !== 'any' && metamaskClientsRdns[type] === undefined) {\n      resolve(null);\n      return;\n    }\n\n    const cachedProvider = providerCache[type];\n    if (cachedProvider) {\n      resolve(cachedProvider);\n      return;\n    }\n\n    const providers: { rdns: string; provider: Eip1193Provider }[] = [];\n\n    const handleProviderEvent = (event: unknown) => {\n      const typedEvent = event as CustomEvent<AnnounceProviderEventDetail>;\n      const providerDetail = typedEvent?.detail;\n      if (providerDetail?.provider && providerDetail?.info?.rdns) {\n        providers.push({\n          rdns: providerDetail?.info?.rdns,\n          provider: providerDetail?.provider,\n        });\n      }\n    };\n\n    window.addEventListener('eip6963:announceProvider', handleProviderEvent);\n    window.dispatchEvent(new Event('eip6963:requestProvider'));\n\n    /**\n     * It may take some time for the events to be emitted from the different wallets.\n     * So waiting a small period of time before we use the collected events.\n     */\n    setTimeout(() => {\n      // remove attached listener\n      window.removeEventListener(\n        'eip6963:announceProvider',\n        handleProviderEvent,\n      );\n\n      let provider: Eip1193Provider | null;\n      if (type === 'any') {\n        // return the first MM client we find\n        const metamaskClients = Object.values(metamaskClientsRdns);\n        provider =\n          providers.find((p) => metamaskClients.includes(p.rdns))?.provider ??\n          null;\n      } else {\n        const metamaskRdns = metamaskClientsRdns[type];\n        provider =\n          providers.find((p) => p.rdns === metamaskRdns)?.provider ?? null;\n      }\n\n      if (provider) {\n        providerCache[type] = provider;\n      }\n      return resolve(provider);\n    }, 100);\n  });\n}\n"]}