{"version":3,"file":"crypto.mjs","sources":["../../../../../../../web/src/utils/crypto.tsx"],"sourcesContent":["import { MessageDescriptor } from '@lingui/core';\nimport { msg } from '@lingui/core/macro';\nimport { Wallets } from '@stytch/core/public';\nimport { encode } from 'bs58';\n\nimport { GenericWalletIcon } from '../assets';\nimport { cryptoIcons } from '../ui/b2c/components/Icons';\nimport { IconRegistry } from '../ui/components/IconRegistry';\nimport { getButtonId, usePresentation } from '../ui/components/PresentationConfig';\n\ntype ProviderRequest = ({\n  method,\n  params,\n}: {\n  method: 'eth_requestAccounts' | 'personal_sign';\n  params?: string[];\n}) => string[] | string;\n\ntype ETHProvider = {\n  isMetaMask?: boolean;\n  isCoinbaseWallet?: boolean;\n  request: ProviderRequest;\n};\n\ndeclare global {\n  interface Window {\n    solana: {\n      isPhantom?: boolean;\n      connect: () => { publicKey: { toString: () => string } };\n      request: ({\n        method,\n        params,\n      }: {\n        method: 'signMessage';\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        params: Record<string, any>;\n      }) => { signature: Uint8Array };\n    };\n\n    ethereum: {\n      isMetaMask?: boolean;\n      isCoinbaseWallet?: boolean;\n      request?: ({ method, params }: { method: string; params?: string[] }) => string[] | string;\n      providers?: ETHProvider[];\n    };\n\n    BinanceChain: { request: ProviderRequest };\n  }\n}\n\nconst hasMultipleEthereumWallets = () => !!window.ethereum?.providers;\n\nconst hasMetaMask = () =>\n  !!(hasMultipleEthereumWallets()\n    ? window.ethereum.providers?.find((wallet) => wallet.isMetaMask)\n    : window.ethereum.isMetaMask);\n\nconst hasCoinbaseWallet = () =>\n  !!(hasMultipleEthereumWallets()\n    ? window.ethereum.providers?.find((wallet) => wallet.isCoinbaseWallet)\n    : window.ethereum?.isCoinbaseWallet);\n\nconst hasOtherEthereumWallet = () => !hasMetaMask() && !hasCoinbaseWallet() && !!window.ethereum;\n\nconst getMetaMaskProvider = () =>\n  hasMultipleEthereumWallets() ? window.ethereum.providers?.find((wallet) => wallet.isMetaMask) : window.ethereum;\n\nconst getCoinbaseProvider = () =>\n  hasMultipleEthereumWallets() ? window.ethereum.providers?.find((wallet) => wallet.isCoinbaseWallet) : window.ethereum;\n\nconst getOtherInjectedProvider = () =>\n  window.ethereum.providers?.find((wallet) => !wallet.isCoinbaseWallet && !wallet.isMetaMask);\n\ntype CryptoIcon = keyof typeof cryptoIcons;\nexport const walletIcons: Partial<Record<Wallets, CryptoIcon>> = {\n  [Wallets.Phantom]: 'phantom',\n  [Wallets.Binance]: 'binance',\n  [Wallets.Coinbase]: 'coinbase',\n  [Wallets.Metamask]: 'metamask',\n};\n\nexport const useCryptoButtonProps = () => {\n  const presentation = usePresentation();\n  const iconRegistry: IconRegistry<CryptoIcon> = presentation.iconRegistry;\n\n  return {\n    getIcon: (wallet: Wallets) => {\n      const iconName = walletIcons[wallet];\n      return iconName ? iconRegistry[iconName] : GenericWalletIcon;\n    },\n    getId: (wallet: Wallets) => getButtonId(`wallet-${wallet}`, presentation.options),\n  };\n};\n\nexport const WalletToText: Record<Wallets, MessageDescriptor> = {\n  [Wallets.Phantom]: msg({ id: 'crypto.wallet.phantom', message: 'Phantom' }),\n  [Wallets.Binance]: msg({ id: 'crypto.wallet.binance', message: 'Binance' }),\n  [Wallets.Coinbase]: msg({ id: 'crypto.wallet.coinbase', message: 'Coinbase' }),\n  [Wallets.Metamask]: msg({ id: 'crypto.wallet.metamask', message: 'Metamask' }),\n  [Wallets.GenericEthereumWallet]: msg({ id: 'crypto.wallet.otherEthereum', message: 'Other Ethereum Wallet' }),\n  [Wallets.GenericSolanaWallet]: msg({ id: 'crypto.wallet.otherSolana', message: 'Other Solana Wallet' }),\n};\n\nexport const isWalletVisible = (wallet: Wallets): boolean => {\n  switch (wallet) {\n    case Wallets.Metamask:\n      return !!window.ethereum && hasMetaMask();\n    case Wallets.Phantom:\n      return (!!window.solana && window.solana?.isPhantom) ?? false;\n    case Wallets.Binance:\n      return !!window.BinanceChain;\n    case Wallets.Coinbase:\n      return !!window.ethereum && hasCoinbaseWallet();\n    case Wallets.GenericEthereumWallet:\n      return !!window.ethereum && hasOtherEthereumWallet();\n    case Wallets.GenericSolanaWallet:\n      return !!window.solana && !window.solana.isPhantom;\n    default:\n      return false;\n  }\n};\n\nconst connectWithEthereumProvider = async (request: ProviderRequest): Promise<string> => {\n  const [address] = await request({\n    method: 'eth_requestAccounts',\n  });\n  return address;\n};\n\nexport const connectWithWallet = async ({ wallet }: { wallet: Wallets }): Promise<string> => {\n  switch (wallet) {\n    case Wallets.Metamask: {\n      const provider = getMetaMaskProvider();\n      return provider?.request ? connectWithEthereumProvider(provider?.request) : '';\n    }\n    case Wallets.Phantom: {\n      const connectResp = await window.solana.connect();\n      return connectResp.publicKey.toString();\n    }\n    case Wallets.Binance: {\n      const provider = window.BinanceChain;\n      return provider?.request ? connectWithEthereumProvider(provider?.request) : '';\n    }\n    case Wallets.Coinbase: {\n      const provider = getCoinbaseProvider();\n      return provider?.request ? connectWithEthereumProvider(provider?.request) : '';\n    }\n    case Wallets.GenericEthereumWallet: {\n      const provider = getOtherInjectedProvider();\n      return provider?.request ? connectWithEthereumProvider(provider?.request) : '';\n    }\n    case Wallets.GenericSolanaWallet: {\n      const connectResp = await window.solana.connect();\n      return connectResp.publicKey.toString();\n    }\n    default:\n      return '';\n  }\n};\n\nconst signMessageWithSolanaProvider = async (message: string): Promise<string> => {\n  const encodedMessage = new TextEncoder().encode(message);\n  const signResp = await window.solana.request({\n    method: 'signMessage',\n    params: {\n      message: encodedMessage,\n      display: 'utf8',\n    },\n  });\n  return encode(signResp.signature);\n};\n\nconst signMessageWithEthereumProvider = async (\n  request: ProviderRequest,\n  message: string,\n  address: string,\n): Promise<string> => {\n  const signature = await request({\n    method: 'personal_sign',\n    params: [message, address],\n  });\n  return signature as string;\n};\n\nexport const signMessageWithWallet = async ({\n  wallet,\n  message,\n  address,\n}: {\n  wallet: Wallets;\n  message: string;\n  address: string;\n}): Promise<string> => {\n  switch (wallet) {\n    case Wallets.Phantom:\n    case Wallets.GenericSolanaWallet:\n      return signMessageWithSolanaProvider(message);\n    case Wallets.Metamask: {\n      const provider = getMetaMaskProvider();\n      return provider?.request ? signMessageWithEthereumProvider(provider?.request, message, address) : '';\n    }\n    case Wallets.Binance: {\n      const provider = window.BinanceChain;\n      return provider?.request ? signMessageWithEthereumProvider(provider?.request, message, address) : '';\n    }\n    case Wallets.Coinbase: {\n      const provider = getCoinbaseProvider();\n      return provider?.request ? signMessageWithEthereumProvider(provider?.request, message, address) : '';\n    }\n    case Wallets.GenericEthereumWallet: {\n      const provider = getOtherInjectedProvider();\n      return provider?.request ? signMessageWithEthereumProvider(provider?.request, message, address) : '';\n    }\n    default:\n      return '';\n  }\n};\n\nexport const isSolanaWallet = (wallet: Wallets) => {\n  const solanaWallets: Wallets[] = [Wallets.Phantom, Wallets.GenericSolanaWallet];\n  return solanaWallets.includes(wallet);\n};\n\nexport const isEthereumWallet = (wallet: Wallets) => {\n  const ethWallets: Wallets[] = [Wallets.Binance, Wallets.GenericEthereumWallet, Wallets.Coinbase, Wallets.Metamask];\n  return ethWallets.includes(wallet);\n};\n"],"names":["hasMultipleEthereumWallets","window","ethereum","providers","hasMetaMask","find","wallet","isMetaMask","hasCoinbaseWallet","isCoinbaseWallet","hasOtherEthereumWallet","getMetaMaskProvider","getCoinbaseProvider","getOtherInjectedProvider","walletIcons","Wallets","Phantom","Binance","Coinbase","Metamask","useCryptoButtonProps","presentation","usePresentation","iconRegistry","getIcon","iconName","GenericWalletIcon","getId","getButtonId","options","WalletToText","GenericEthereumWallet","GenericSolanaWallet","isWalletVisible","solana","isPhantom","BinanceChain","connectWithEthereumProvider","request","address","method","connectWithWallet","provider","connectResp","connect","publicKey","toString","signMessageWithSolanaProvider","message","encodedMessage","TextEncoder","encode","signResp","params","display","signature","signMessageWithEthereumProvider","signMessageWithWallet","isSolanaWallet","solanaWallets","includes"],"mappings":";;;;;;AAkDA,MAAMA,6BAA6B,IAAM,CAAC,CAACC,MAAAA,CAAOC,QAAQ,EAAEC,SAAAA;AAE5D,MAAMC,WAAAA,GAAc,IAClB,CAAC,EAAEJ,0BAAAA,EAAAA,GACCC,MAAAA,CAAOC,QAAQ,CAACC,SAAS,EAAEE,IAAAA,CAAK,CAACC,SAAWA,MAAAA,CAAOC,UAAU,IAC7DN,MAAAA,CAAOC,QAAQ,CAACK,UAAU,CAAD;AAE/B,MAAMC,iBAAAA,GAAoB,IACxB,CAAC,EAAER,0BAAAA,EAAAA,GACCC,MAAAA,CAAOC,QAAQ,CAACC,SAAS,EAAEE,IAAAA,CAAK,CAACC,SAAWA,MAAAA,CAAOG,gBAAgB,IACnER,MAAAA,CAAOC,QAAQ,EAAEO,gBAAe,CAAA;AAEtC,MAAMC,sBAAAA,GAAyB,IAAM,CAACN,WAAAA,EAAAA,IAAiB,CAACI,iBAAAA,EAAAA,IAAuB,CAAC,CAACP,MAAAA,CAAOC,QAAQ;AAEhG,MAAMS,mBAAAA,GAAsB,IAC1BX,0BAAAA,EAAAA,GAA+BC,MAAAA,CAAOC,QAAQ,CAACC,SAAS,EAAEE,IAAAA,CAAK,CAACC,MAAAA,GAAWA,MAAAA,CAAOC,UAAU,CAAA,GAAIN,OAAOC,QAAQ;AAEjH,MAAMU,mBAAAA,GAAsB,IAC1BZ,0BAAAA,EAAAA,GAA+BC,MAAAA,CAAOC,QAAQ,CAACC,SAAS,EAAEE,IAAAA,CAAK,CAACC,MAAAA,GAAWA,MAAAA,CAAOG,gBAAgB,CAAA,GAAIR,OAAOC,QAAQ;AAEvH,MAAMW,2BAA2B,IAC/BZ,MAAAA,CAAOC,QAAQ,CAACC,SAAS,EAAEE,IAAAA,CAAK,CAACC,MAAAA,GAAW,CAACA,MAAAA,CAAOG,gBAAgB,IAAI,CAACH,OAAOC,UAAU,CAAA;MAG/EO,WAAAA,GAAoD;IAC/D,CAACC,OAAAA,CAAQC,OAAO,GAAG,SAAA;IACnB,CAACD,OAAAA,CAAQE,OAAO,GAAG,SAAA;IACnB,CAACF,OAAAA,CAAQG,QAAQ,GAAG,UAAA;IACpB,CAACH,OAAAA,CAAQI,QAAQ,GAAG;AACtB;MAEaC,oBAAAA,GAAuB,IAAA;AAClC,IAAA,MAAMC,YAAAA,GAAeC,eAAAA,EAAAA;IACrB,MAAMC,YAAAA,GAAyCF,aAAaE,YAAY;IAExE,OAAO;AACLC,QAAAA,OAAAA,EAAS,CAAClB,MAAAA,GAAAA;YACR,MAAMmB,QAAAA,GAAWX,WAAW,CAACR,MAAAA,CAAO;AACpC,YAAA,OAAOmB,QAAAA,GAAWF,YAAY,CAACE,QAAAA,CAAS,GAAGC,iBAAAA;AAC7C,QAAA,CAAA;QACAC,KAAAA,EAAO,CAACrB,SAAoBsB,WAAAA,CAAY,CAAC,OAAO,EAAEtB,MAAAA,CAAAA,CAAQ,EAAEe,YAAAA,CAAaQ,OAAO;AAClF,KAAA;AACF;MAEaC,YAAAA,GAAmD;IAC9D,CAACf,OAAAA,CAAQC,OAAO,GAAC;;;;IACjB,CAACD,OAAAA,CAAQE,OAAO,GAAC;;;;IACjB,CAACF,OAAAA,CAAQG,QAAQ,GAAC;;;;IAClB,CAACH,OAAAA,CAAQI,QAAQ,GAAC;;;;IAClB,CAACJ,OAAAA,CAAQgB,qBAAqB,GAAC;;;;IAC/B,CAAChB,OAAAA,CAAQiB,mBAAmB,GAAC;;;;AAC/B;AAEO,MAAMC,kBAAkB,CAAC3B,MAAAA,GAAAA;IAC9B,OAAQA,MAAAA;AACN,QAAA,KAAKS,QAAQI,QAAQ;AACnB,YAAA,OAAO,CAAC,CAAClB,MAAAA,CAAOC,QAAQ,IAAIE,WAAAA,EAAAA;AAC9B,QAAA,KAAKW,QAAQC,OAAO;YAClB,OAAQ,CAAA,CAAC,CAACf,MAAAA,CAAOiC,MAAM,IAAIjC,MAAAA,CAAOiC,MAAM,EAAEC,SAAQ,KAAM,KAAA;AAC1D,QAAA,KAAKpB,QAAQE,OAAO;YAClB,OAAO,CAAC,CAAChB,MAAAA,CAAOmC,YAAY;AAC9B,QAAA,KAAKrB,QAAQG,QAAQ;AACnB,YAAA,OAAO,CAAC,CAACjB,MAAAA,CAAOC,QAAQ,IAAIM,iBAAAA,EAAAA;AAC9B,QAAA,KAAKO,QAAQgB,qBAAqB;AAChC,YAAA,OAAO,CAAC,CAAC9B,MAAAA,CAAOC,QAAQ,IAAIQ,sBAAAA,EAAAA;AAC9B,QAAA,KAAKK,QAAQiB,mBAAmB;YAC9B,OAAO,CAAC,CAAC/B,MAAAA,CAAOiC,MAAM,IAAI,CAACjC,MAAAA,CAAOiC,MAAM,CAACC,SAAS;AACpD,QAAA;YACE,OAAO,KAAA;AACX;AACF;AAEA,MAAME,8BAA8B,OAAOC,OAAAA,GAAAA;AACzC,IAAA,MAAM,CAACC,OAAAA,CAAQ,GAAG,MAAMD,OAAAA,CAAQ;QAC9BE,MAAAA,EAAQ;AACV,KAAA,CAAA;IACA,OAAOD,OAAAA;AACT,CAAA;AAEO,MAAME,iBAAAA,GAAoB,OAAO,EAAEnC,MAAM,EAAuB,GAAA;IACrE,OAAQA,MAAAA;AACN,QAAA,KAAKS,QAAQI,QAAQ;AAAE,YAAA;AACrB,gBAAA,MAAMuB,QAAAA,GAAW/B,mBAAAA,EAAAA;AACjB,gBAAA,OAAO+B,QAAAA,EAAUJ,OAAAA,GAAUD,2BAAAA,CAA4BK,QAAAA,EAAUJ,OAAAA,CAAAA,GAAW,EAAA;AAC9E,YAAA;AACA,QAAA,KAAKvB,QAAQC,OAAO;AAAE,YAAA;AACpB,gBAAA,MAAM2B,WAAAA,GAAc,MAAM1C,MAAAA,CAAOiC,MAAM,CAACU,OAAO,EAAA;gBAC/C,OAAOD,WAAAA,CAAYE,SAAS,CAACC,QAAQ,EAAA;AACvC,YAAA;AACA,QAAA,KAAK/B,QAAQE,OAAO;AAAE,YAAA;gBACpB,MAAMyB,QAAAA,GAAWzC,OAAOmC,YAAY;AACpC,gBAAA,OAAOM,QAAAA,EAAUJ,OAAAA,GAAUD,2BAAAA,CAA4BK,QAAAA,EAAUJ,OAAAA,CAAAA,GAAW,EAAA;AAC9E,YAAA;AACA,QAAA,KAAKvB,QAAQG,QAAQ;AAAE,YAAA;AACrB,gBAAA,MAAMwB,QAAAA,GAAW9B,mBAAAA,EAAAA;AACjB,gBAAA,OAAO8B,QAAAA,EAAUJ,OAAAA,GAAUD,2BAAAA,CAA4BK,QAAAA,EAAUJ,OAAAA,CAAAA,GAAW,EAAA;AAC9E,YAAA;AACA,QAAA,KAAKvB,QAAQgB,qBAAqB;AAAE,YAAA;AAClC,gBAAA,MAAMW,QAAAA,GAAW7B,wBAAAA,EAAAA;AACjB,gBAAA,OAAO6B,QAAAA,EAAUJ,OAAAA,GAAUD,2BAAAA,CAA4BK,QAAAA,EAAUJ,OAAAA,CAAAA,GAAW,EAAA;AAC9E,YAAA;AACA,QAAA,KAAKvB,QAAQiB,mBAAmB;AAAE,YAAA;AAChC,gBAAA,MAAMW,WAAAA,GAAc,MAAM1C,MAAAA,CAAOiC,MAAM,CAACU,OAAO,EAAA;gBAC/C,OAAOD,WAAAA,CAAYE,SAAS,CAACC,QAAQ,EAAA;AACvC,YAAA;AACA,QAAA;YACE,OAAO,EAAA;AACX;AACF;AAEA,MAAMC,gCAAgC,OAAOC,OAAAA,GAAAA;AAC3C,IAAA,MAAMC,cAAAA,GAAiB,IAAIC,WAAAA,EAAAA,CAAcC,MAAM,CAACH,OAAAA,CAAAA;AAChD,IAAA,MAAMI,WAAW,MAAMnD,MAAAA,CAAOiC,MAAM,CAACI,OAAO,CAAC;QAC3CE,MAAAA,EAAQ,aAAA;QACRa,MAAAA,EAAQ;YACNL,OAAAA,EAASC,cAAAA;YACTK,OAAAA,EAAS;AACX;AACF,KAAA,CAAA;IACA,OAAOH,kBAAAA,CAAOC,SAASG,SAAS,CAAA;AAClC,CAAA;AAEA,MAAMC,+BAAAA,GAAkC,OACtClB,OAAAA,EACAU,OAAAA,EACAT,OAAAA,GAAAA;IAEA,MAAMgB,SAAAA,GAAY,MAAMjB,OAAAA,CAAQ;QAC9BE,MAAAA,EAAQ,eAAA;QACRa,MAAAA,EAAQ;AAACL,YAAAA,OAAAA;AAAST,YAAAA;AAAQ;AAC5B,KAAA,CAAA;IACA,OAAOgB,SAAAA;AACT,CAAA;AAEO,MAAME,wBAAwB,OAAO,EAC1CnD,MAAM,EACN0C,OAAO,EACPT,OAAO,EAKR,GAAA;IACC,OAAQjC,MAAAA;AACN,QAAA,KAAKS,QAAQC,OAAO;AACpB,QAAA,KAAKD,QAAQiB,mBAAmB;AAC9B,YAAA,OAAOe,6BAAAA,CAA8BC,OAAAA,CAAAA;AACvC,QAAA,KAAKjC,QAAQI,QAAQ;AAAE,YAAA;AACrB,gBAAA,MAAMuB,QAAAA,GAAW/B,mBAAAA,EAAAA;AACjB,gBAAA,OAAO+B,UAAUJ,OAAAA,GAAUkB,+BAAAA,CAAgCd,QAAAA,EAAUJ,OAAAA,EAASU,SAAST,OAAAA,CAAAA,GAAW,EAAA;AACpG,YAAA;AACA,QAAA,KAAKxB,QAAQE,OAAO;AAAE,YAAA;gBACpB,MAAMyB,QAAAA,GAAWzC,OAAOmC,YAAY;AACpC,gBAAA,OAAOM,UAAUJ,OAAAA,GAAUkB,+BAAAA,CAAgCd,QAAAA,EAAUJ,OAAAA,EAASU,SAAST,OAAAA,CAAAA,GAAW,EAAA;AACpG,YAAA;AACA,QAAA,KAAKxB,QAAQG,QAAQ;AAAE,YAAA;AACrB,gBAAA,MAAMwB,QAAAA,GAAW9B,mBAAAA,EAAAA;AACjB,gBAAA,OAAO8B,UAAUJ,OAAAA,GAAUkB,+BAAAA,CAAgCd,QAAAA,EAAUJ,OAAAA,EAASU,SAAST,OAAAA,CAAAA,GAAW,EAAA;AACpG,YAAA;AACA,QAAA,KAAKxB,QAAQgB,qBAAqB;AAAE,YAAA;AAClC,gBAAA,MAAMW,QAAAA,GAAW7B,wBAAAA,EAAAA;AACjB,gBAAA,OAAO6B,UAAUJ,OAAAA,GAAUkB,+BAAAA,CAAgCd,QAAAA,EAAUJ,OAAAA,EAASU,SAAST,OAAAA,CAAAA,GAAW,EAAA;AACpG,YAAA;AACA,QAAA;YACE,OAAO,EAAA;AACX;AACF;AAEO,MAAMmB,iBAAiB,CAACpD,MAAAA,GAAAA;AAC7B,IAAA,MAAMqD,aAAAA,GAA2B;AAAC5C,QAAAA,OAAAA,CAAQC,OAAO;AAAED,QAAAA,OAAAA,CAAQiB;AAAoB,KAAA;IAC/E,OAAO2B,aAAAA,CAAcC,QAAQ,CAACtD,MAAAA,CAAAA;AAChC;;;;"}