UNPKG

@toruslabs/torus-embed

Version:
1,371 lines (1,309 loc) 86.1 kB
/******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ // The require scope /******/ var __webpack_require__ = {}; /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ (() => { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = (module) => { /******/ var getter = module && module.__esModule ? /******/ () => (module['default']) : /******/ () => (module); /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ })(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // ESM COMPAT FLAG __webpack_require__.r(__webpack_exports__); // EXPORTS __webpack_require__.d(__webpack_exports__, { BUTTON_POSITION: () => (/* reexport */ BUTTON_POSITION), PAYMENT_PROVIDER: () => (/* reexport */ PAYMENT_PROVIDER), SUPPORTED_PAYMENT_NETWORK: () => (/* reexport */ SUPPORTED_PAYMENT_NETWORK), TORUS_BUILD_ENV: () => (/* reexport */ TORUS_BUILD_ENV), TorusInpageProvider: () => (/* reexport */ inpage_provider), WALLET_OPENLOGIN_VERIFIER_MAP: () => (/* reexport */ WALLET_OPENLOGIN_VERIFIER_MAP), WALLET_VERIFIERS: () => (/* reexport */ WALLET_VERIFIERS), "default": () => (/* reexport */ src_embed) }); ;// CONCATENATED MODULE: external "@babel/runtime/helpers/objectSpread2" const objectSpread2_namespaceObject = require("@babel/runtime/helpers/objectSpread2"); var objectSpread2_default = /*#__PURE__*/__webpack_require__.n(objectSpread2_namespaceObject); ;// CONCATENATED MODULE: external "@babel/runtime/helpers/objectWithoutProperties" const objectWithoutProperties_namespaceObject = require("@babel/runtime/helpers/objectWithoutProperties"); var objectWithoutProperties_default = /*#__PURE__*/__webpack_require__.n(objectWithoutProperties_namespaceObject); ;// CONCATENATED MODULE: external "@babel/runtime/helpers/defineProperty" const defineProperty_namespaceObject = require("@babel/runtime/helpers/defineProperty"); var defineProperty_default = /*#__PURE__*/__webpack_require__.n(defineProperty_namespaceObject); ;// CONCATENATED MODULE: external "@toruslabs/http-helpers" const http_helpers_namespaceObject = require("@toruslabs/http-helpers"); ;// CONCATENATED MODULE: external "@toruslabs/openlogin-jrpc" const openlogin_jrpc_namespaceObject = require("@toruslabs/openlogin-jrpc"); ;// CONCATENATED MODULE: external "lodash.merge" const external_lodash_merge_namespaceObject = require("lodash.merge"); var external_lodash_merge_default = /*#__PURE__*/__webpack_require__.n(external_lodash_merge_namespaceObject); ;// CONCATENATED MODULE: ./src/interfaces.ts const WALLET_VERIFIERS = { GOOGLE: "google", FACEBOOK: "facebook", TWITCH: "twitch", REDDIT: "reddit", DISCORD: "discord", EMAIL_PASSWORDLESS: "torus-auth0-email-passwordless" }; const WALLET_OPENLOGIN_VERIFIER_MAP = { [WALLET_VERIFIERS.GOOGLE]: "tkey-google", [WALLET_VERIFIERS.FACEBOOK]: "tkey-facebook", [WALLET_VERIFIERS.TWITCH]: "tkey-twitch", [WALLET_VERIFIERS.REDDIT]: "tkey-reddit", [WALLET_VERIFIERS.DISCORD]: "tkey-discord", [WALLET_VERIFIERS.EMAIL_PASSWORDLESS]: "tkey-auth0-email-passwordless" }; const PAYMENT_PROVIDER = { MOONPAY: "moonpay", RAMPNETWORK: "rampnetwork", MERCURYO: "mercuryo", TRANSAK: "transak", BANXA: "banxa" }; const SUPPORTED_PAYMENT_NETWORK = { MAINNET: "mainnet", MATIC: "matic", BSC_MAINNET: "bsc_mainnet", AVALANCHE_MAINNET: "avalanche_mainnet", XDAI: "xdai", ARBITRUM_MAINNET: "arbitrum_mainnet", OPTIMISM_MAINNET: "optimism_mainnet" }; const TORUS_BUILD_ENV = { PRODUCTION: "production", DEVELOPMENT: "development", BINANCE: "binance", TESTING: "testing", LRC: "lrc", BETA: "beta", BNB: "bnb", POLYGON: "polygon", ALPHA: "alpha" }; const BUTTON_POSITION = { BOTTOM_LEFT: "bottom-left", TOP_LEFT: "top-left", BOTTOM_RIGHT: "bottom-right", TOP_RIGHT: "top-right" }; ;// CONCATENATED MODULE: ./src/supportedCurrencies.ts /** * From https://min-api.cryptocompare.com/data/v2/pair/mapping/fsym?fsym=BTC&extraParams=YourSite * GET https://min-api.cryptocompare.com/data/v2/pair/mapping/fsym?fsym=BTC * Then map over returned entries, picking tsym * * Last updated: Date of commit */ const CRYPTO_COMPARE_CURRENCIES = ["ETH", "USDT", "USDC", "TUSD", "EOSDT", "USD", "DAI", "GUSD", "DKKT", "PAX", "ILS", "RUB", "BYN", "EUR", "GBP", "JPY", "KRW", "PLN", "MXN", "AUD", "BRL", "CAD", "CHF", "KPW", "LAK", "LBP", "LKR", "XOF", "CNHT", "DOGE", "UAH", "TRY", "HKD", "XJP", "SGD", "USC", "NZD", "NGN", "RUR", "COP", "GHS", "EGP", "IDR", "BHD", "CRC", "PEN", "AED", "DOP", "PKR", "HUF", "VND", "XAR", "LTC", "RON", "OMR", "MYR", "DKK", "UGX", "ZMW", "SAR", "SEK", "GEL", "RWF", "IRR", "TZS", "CNY", "VEF", "BDT", "HRK", "CLP", "THB", "XAF", "ARS", "UYU", "SZL", "KZT", "NOK", "KES", "PAB", "INR", "CZK", "MAD", "TWD", "PHP", "ZAR", "BOB", "CDF", "DASH", "VES", "ISK", "MWK", "BAM", "TTD", "XRP", "JOD", "RSD", "HNL", "BGN", "GTQ", "BWP", "XMR", "MMK", "QAR", "AOA", "KWD", "MUR", "WUSD", "WEUR", "WAVES", "WTRY", "LRD", "LSL", "LYD", "AWG", "MDL", "BTO", "EURS", "CHFT", "MKD", "MNT", "MOP", "MRO", "MVR", "VOLLAR", "CKUSD", "KHR", "VUV", "BITCNY", "QC", "BBD", "NAD", "NPR", "PGK", "PYG", "BIF", "BMD", "BND", "XLM", "BNB", "SCR", "BAT", "CRO", "HT", "KCS", "LEO", "LINK", "MKR", "NPXS", "OMG", "REP", "ZB", "ZIL", "ZRX", "BCH", "BZD", "CUP", "CVE", "DJF", "DZD", "ERN", "ETB", "FJD", "FKP", "BUSD", "ANCT", "ALL", "AMD", "ANG", "CNYX", "IQD", "UZS", "TND", "GGP", "XAU", "KGS", "GIP", "JMD", "ZEC", "USDP", "BSV", "EMC2", "SNT", "GTO", "POWR", "EUSD", "EURT", "BCY", "BTS", "ATM", "BLOCKPAY", "ARDR", "AMP", "B2X", "BITGOLD", "BITEUR", "ATB", "BITUSD", "AGRS", "DFXT", "HIKEN", "BIX", "KNC", "EOS", "COB", "COSS", "BMH", "NANO", "BDG", "BNT", "XVG", "LKK1Y", "LKK", "USDK", "EURN", "NZDT", "JSE", "GMD", "GNF", "GYD", "YER", "XPF", "HTG", "SLL", "SOS", "WST", "SVC", "SYP", "NEO", "KMF", "JUMP", "AYA", "BLAST", "WGR", "BCN", "BTG", "URALS", "INN", "USDQ", "CNH", "HUSD", "BKRW", "NZDX", "EURX", "CADX", "USDEX", "JPYX", "AUDX", "VNDC", "EON", "GBPX", "CHFX", "USDJ", "IDRT", "USDS", "USDN", "BIDR", "IDK", "BSD", "BTN", "KYD", "NIO", "SBD", "SDG", "SHP", "TOP", "XCD", "XCHF", "CNYT", "GYEN", "ZUSD", "GOLD", "TRX", "TRYB", "PLATC", "STRAX", "UST", "GLM", "VAI", "BRZ", "DDRST", "XAUT", "MIM"]; /** * currencies supported by the payment provider * Last updated: Date of commit */ const PROVIDER_SUPPORTED_FIAT_CURRENCIES = { // https://integrations.simplex.com/supported_currencies // https://support.moonpay.com/hc/en-gb/articles/360011931457-Which-fiat-currencies-are-supported- [PAYMENT_PROVIDER.MOONPAY]: ["AUD", "BGN", "BRL", "CAD", "CHF", "CNY", "COP", "CZK", "DKK", "DOP", "EGP", "EUR", "GBP", "HKD", "HRK", "IDR", "ILS", "JPY", "JOD", "KES", "KRW", "KWD", "LKR", "MAD", "MXN", "MYR", "NGN", "NOK", "NZD", "OMR", "PEN", "PKR", "PLN", "RON", "RUB", "SEK", "SGD", "THB", "TRY", "TWD", "USD", "VND", "ZAR"], // https://support.ramp.network/en/articles/471-supported-fiat-currencies [PAYMENT_PROVIDER.RAMPNETWORK]: ["USD", "EUR", "GBP", "BMD", "BAM", "BWP", "BRL", "BGN", "COP", "CRC", "CZK", "DKK", "DOP", "GEL", "GTQ", "HNL", "HUF", "ISK", "INR", "ILS", "KZT", "KES", "KWD", "LAK", "MKD", "MYR", "MXN", "MDL", "MZN", "NZD", "NGN", "PYG", "PEN", "PLN", "RON", "RSD", "SGD", "ZAR", "LKR", "SEK", "CHF", "TJS", "THB", "UYU"], // https://help.mercuryo.io/en/articles/6121246-which-fiat-currencies-are-supported // RUB / UAH currently not supported [PAYMENT_PROVIDER.MERCURYO]: ["EUR", "USD", "GBP", "TRY", "JPY", "BRL", "NGN", "VND", "MXN", "KRW", "PLN", "SEK", "CHF", "CAD", "CZK", "DKK", "BGN", "HKD", "AUD", "INR"], /** * https://support.transak.com/hc/en-us/articles/360020615578-Credit-and-Debit-Card-Payments-through-Transak * or * https://transak.stoplight.io/docs/transak-docs/b3A6OTk1ODQ0-2-get-fiat-currencies */ [PAYMENT_PROVIDER.TRANSAK]: ["ARS", "AUD", "BBD", "BGN", "BMD", "BRL", "CAD", "CHF", "CLP", "CRC", "CZK", "DKK", "DOP", "EUR", "FJD", "FKP", "GBP", "GIP", "HRK", "HUF", "IDR", "ILS", "ISK", "JMD", "JPY", "KES", "KRW", "MDL", "MXN", "MYR", "NOK", "NZD", "PEN", "PHP", "PLN", "PYG", "RON", "SEK", "SGD", "THB", "TRY", "TZS", "USD", "ZAR"], [PAYMENT_PROVIDER.BANXA]: ["AUD", "CAD", "CZK", "DKK", "EUR", "GBP", "HKD", "JPY", "NOK", "NZD", "NZD", "PLN", "RUB", "SEK", "SGD", "TRY", "USD"] }; const cryptoCompareCurrenciesSet = new Set(CRYPTO_COMPARE_CURRENCIES); /** * Fiat currencies that we support */ function supportedFiatCurrencies(provider) { const providerSupportedFiatCurrencies = PROVIDER_SUPPORTED_FIAT_CURRENCIES[provider]; return providerSupportedFiatCurrencies.filter(currency => cryptoCompareCurrenciesSet.has(currency)); } ;// CONCATENATED MODULE: ./src/config.ts const paymentProviders = { [PAYMENT_PROVIDER.MOONPAY]: { line1: "Credit/ Debit Card/ Apple Pay", line2: "4.5% or 5 USD", line3: "2,000€/day, 10,000€/mo", supportPage: "https://help.moonpay.io/en/", minOrderValue: 24.99, maxOrderValue: 50000, validCurrencies: supportedFiatCurrencies(PAYMENT_PROVIDER.MOONPAY), validCryptoCurrenciesByChain: { [SUPPORTED_PAYMENT_NETWORK.MAINNET]: [{ value: "aave", display: "AAVE" }, { value: "bat", display: "BAT" }, { value: "dai", display: "DAI" }, { value: "eth", display: "ETH" }, { value: "mkr", display: "MKR" }, { value: "matic", display: "MATIC" }, { value: "usdt", display: "USDT" }, { value: "uni", display: "UNI" }, { value: "usdc", display: "USDC" }, { value: "weth", display: "WETH" }], [SUPPORTED_PAYMENT_NETWORK.MATIC]: [{ value: "eth_polygon", display: "ETH" }, { value: "matic_polygon", display: "MATIC" }, { value: "usdc_polygon", display: "USDC" }, { value: "usdt_polygon", display: "USDT" }], [SUPPORTED_PAYMENT_NETWORK.BSC_MAINNET]: [{ value: "bnb_bsc", display: "BNB" }, { value: "busd_bsc", display: "BUSD" }], [SUPPORTED_PAYMENT_NETWORK.AVALANCHE_MAINNET]: [{ value: "avax_cchain", display: "AVAX" }, { value: "usdc_cchain", display: "USDC" }], [SUPPORTED_PAYMENT_NETWORK.ARBITRUM_MAINNET]: [{ value: "eth_arbitrum", display: "ETH" }, { value: "usdc_arbitrum", display: "USDC" }], [SUPPORTED_PAYMENT_NETWORK.OPTIMISM_MAINNET]: [{ value: "eth_optimism", display: "ETH" }, { value: "usdc_optimism", display: "USDC" }] }, includeFees: true, api: true, enforceMax: false }, [PAYMENT_PROVIDER.RAMPNETWORK]: { line1: "Debit Card/ <br>Apple Pay/ Bank transfer", line2: "0.49% - 2.9%", line3: "5,000€/purchase, 20,000€/mo", supportPage: "https://instant.ramp.network/", minOrderValue: 50, maxOrderValue: 20000, validCurrencies: supportedFiatCurrencies(PAYMENT_PROVIDER.RAMPNETWORK), validCryptoCurrenciesByChain: { [SUPPORTED_PAYMENT_NETWORK.MAINNET]: [{ value: "ETH", display: "ETH" }, { value: "DAI", display: "DAI" }, { value: "BAT", display: "BAT" }, { value: "USDC", display: "USDC" }, { value: "USDT", display: "USDT" }], [SUPPORTED_PAYMENT_NETWORK.MATIC]: [{ value: "MATIC_BAT", display: "BAT" }, { value: "MATIC_DAI", display: "DAI" }, { value: "MATIC_MATIC", display: "MATIC" }, { value: "MATIC_USDC", display: "USDC" }, { value: "MATIC_USDT", display: "USDT" }], [SUPPORTED_PAYMENT_NETWORK.AVALANCHE_MAINNET]: [{ value: "AVAX_AVAX", display: "AVAX" }, { value: "AVAX_USDC", display: "USDC" }, { value: "AVAX_USDT", display: "USDT" }], [SUPPORTED_PAYMENT_NETWORK.ARBITRUM_MAINNET]: [{ value: "ARBITRUM_ETH", display: "ETH" }, { value: "ARBITRUM_USDC.e ", display: "USDC" }, { value: "ARBITRUM_USDT", display: "USDT" }], [SUPPORTED_PAYMENT_NETWORK.OPTIMISM_MAINNET]: [{ value: "OPTIMISM_DAI", display: "DAI" }, { value: "OPTIMISM_OPTIMISM", display: "OPTIMISM" }, { value: "OPTIMISM_USDC", display: "USDC" }, { value: "OPTIMISM_USDT", display: "USDT" }], [SUPPORTED_PAYMENT_NETWORK.BSC_MAINNET]: [{ value: "BSC_BNB", display: "BNB" }, { value: "BSC_BUSD", display: "BUSD" }] }, includeFees: true, api: true, receiveHint: "walletTopUp.receiveHintRamp", enforceMax: false }, [PAYMENT_PROVIDER.MERCURYO]: { line1: "Credit/ Debit Card/ Apple Pay", line2: "3.95% or 4 USD", line3: "10,000€/day, 25,000€/mo", supportPage: "mailto:support@mercuryo.io", minOrderValue: 30, maxOrderValue: 5000, validCurrencies: supportedFiatCurrencies(PAYMENT_PROVIDER.MERCURYO), validCryptoCurrenciesByChain: { [SUPPORTED_PAYMENT_NETWORK.MAINNET]: [{ value: "ETH", display: "ETH" }, { value: "BAT", display: "BAT" }, { value: "USDT", display: "USDT" }, { value: "DAI", display: "DAI" }], [SUPPORTED_PAYMENT_NETWORK.BSC_MAINNET]: [{ value: "BNB", display: "BNB" }, { value: "BUSD", display: "BUSD" }, { value: "1INCH", display: "1INCH" }], [SUPPORTED_PAYMENT_NETWORK.AVALANCHE_MAINNET]: [{ value: "AVAX", display: "AVAX" }], [SUPPORTED_PAYMENT_NETWORK.MATIC]: [{ value: "MATIC", display: "MATIC" }] }, includeFees: true, api: true, enforceMax: false }, [PAYMENT_PROVIDER.TRANSAK]: { line1: "Apple & Google Pay / Credit/Debit Card<br/>Bangkok Bank Mobile & iPay<br/>Bank Transfer (sepa/gbp) / SCB Mobile & Easy", line2: "0.99% - 5.5% or 5 USD", line3: "$5,000/day, $28,000/mo", supportPage: "https://support.transak.com/hc/en-US", minOrderValue: 30, maxOrderValue: 500, validCurrencies: supportedFiatCurrencies(PAYMENT_PROVIDER.TRANSAK), validCryptoCurrenciesByChain: { [SUPPORTED_PAYMENT_NETWORK.MAINNET]: [{ value: "1INCH", display: "1INCH" }, { value: "BAT", display: "BAT" }, { value: "AAVE", display: "AAVE" }, { value: "DAI", display: "DAI" }, { value: "ETH", display: "ETH" }, { value: "USDC", display: "USDC" }, { value: "USDT", display: "USDT" }], [SUPPORTED_PAYMENT_NETWORK.MATIC]: [{ value: "BAT", display: "BAT" }, { value: "AAVE", display: "AAVE" }, { value: "DAI", display: "DAI" }, { value: "MATIC", display: "MATIC" }, { value: "USDC", display: "USDC" }, { value: "USDT", display: "USDT" }, { value: "WETH", display: "WETH" }], [SUPPORTED_PAYMENT_NETWORK.BSC_MAINNET]: [{ value: "BAT", display: "BAT" }, { value: "BNB", display: "BNB" }, { value: "BUSD", display: "BUSD" }], [SUPPORTED_PAYMENT_NETWORK.AVALANCHE_MAINNET]: [{ value: "AVAX", display: "AVAX" }], [SUPPORTED_PAYMENT_NETWORK.OPTIMISM_MAINNET]: [{ value: "ETH", display: "ETH" }, { value: "USDC", display: "USDC" }], [SUPPORTED_PAYMENT_NETWORK.ARBITRUM_MAINNET]: [{ value: "USDC", display: "USDC" }, { value: "ETH", display: "ETH" }] }, includeFees: true, enforceMax: true }, [PAYMENT_PROVIDER.BANXA]: { line1: "Debit Card/ <br>Apple Pay/ Bank transfer", line2: "0.49% - 2.9%", line3: "5,000€/purchase, 20,000€/mo", supportPage: "https://support.banxa.com", minOrderValue: 20, maxOrderValue: 15000, validCurrencies: supportedFiatCurrencies(PAYMENT_PROVIDER.BANXA), validCryptoCurrenciesByChain: { [SUPPORTED_PAYMENT_NETWORK.MAINNET]: [{ value: "ETH", display: "ETH" }, { value: "DAI", display: "DAI" }, { value: "MKR", display: "MKR" }, { value: "USDT", display: "USDT" }, { value: "BUSD", display: "BUSD" }, { value: "USDC", display: "USDC" }, { value: "BAT", display: "BAT" }, { value: "AAVE", display: "AAVE" }, { value: "COMP", display: "COMP" }, { value: "UNI", display: "UNI" }], [SUPPORTED_PAYMENT_NETWORK.MATIC]: [{ value: "MATIC", display: "MATIC" }] // [BSC_MAINNET]: [{ value: 'BNB', display: 'BNB' }], }, includeFees: true, enforceMax: true } }; const translations = { en: { embed: { continue: "Continue", actionRequired: "Authorization required", pendingAction: "Click continue to proceed with your request in a popup", cookiesRequired: "Cookies Required", enableCookies: "Please enable cookies in your browser preferences to access Torus", clickHere: "More Info" } }, de: { embed: { continue: "Fortsetzen", actionRequired: "Autorisierung erforderlich", pendingAction: "Klicken Sie in einem Popup auf Weiter, um mit Ihrer Anfrage fortzufahren", cookiesRequired: "Cookies benötigt", enableCookies: "Bitte aktivieren Sie Cookies in Ihren Browsereinstellungen, um auf Torus zuzugreifen", clickHere: "Mehr Info" } }, ja: { embed: { continue: "継続する", actionRequired: "認証が必要です", pendingAction: "続行をクリックして、ポップアップでリクエストを続行します", cookiesRequired: "必要なクッキー", enableCookies: "Torusにアクセスするには、ブラウザの設定でCookieを有効にしてください。", clickHere: "詳しくは" } }, ko: { embed: { continue: "계속하다", actionRequired: "승인 필요", pendingAction: "팝업에서 요청을 진행하려면 계속을 클릭하십시오.", cookiesRequired: "쿠키 필요", enableCookies: "브라우저 환경 설정에서 쿠키를 활성화하여 Torus에 액세스하십시오.", clickHere: "더 많은 정보" } }, zh: { embed: { continue: "继续", actionRequired: "需要授权", pendingAction: "单击继续以在弹出窗口中继续您的请求", cookiesRequired: "必填Cookie", enableCookies: "请在您的浏览器首选项中启用cookie以访问Torus。", clickHere: "更多信息" } } }; /* harmony default export */ const config = ({ supportedVerifierList: Object.values(WALLET_VERIFIERS), paymentProviders, api: "https://api.tor.us", translations, prodTorusUrl: "", localStorageKeyPrefix: `torus-` }); ;// CONCATENATED MODULE: ./src/embedUtils.ts const htmlToElement = html => { const template = window.document.createElement("template"); const trimmedHtml = html.trim(); // Never return a text node of whitespace as the result template.innerHTML = trimmedHtml; return template.content.firstChild; }; const handleEvent = function (handle, eventName, handler) { for (var _len = arguments.length, handlerArgs = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { handlerArgs[_key - 3] = arguments[_key]; } const handlerWrapper = () => { handler(...handlerArgs); handle.removeEventListener(eventName, handlerWrapper); }; handle.addEventListener(eventName, handlerWrapper); }; const handleStream = (handle, eventName, handler) => { const handlerWrapper = chunk => { handler(chunk); handle.removeListener(eventName, handlerWrapper); }; handle.on(eventName, handlerWrapper); }; ;// CONCATENATED MODULE: external "@metamask/rpc-errors" const rpc_errors_namespaceObject = require("@metamask/rpc-errors"); ;// CONCATENATED MODULE: external "fast-deep-equal" const external_fast_deep_equal_namespaceObject = require("fast-deep-equal"); var external_fast_deep_equal_default = /*#__PURE__*/__webpack_require__.n(external_fast_deep_equal_namespaceObject); ;// CONCATENATED MODULE: external "pump" const external_pump_namespaceObject = require("pump"); var external_pump_default = /*#__PURE__*/__webpack_require__.n(external_pump_namespaceObject); ;// CONCATENATED MODULE: ./src/isStream.ts /* eslint-disable @typescript-eslint/no-explicit-any */ function isStream(stream) { return stream !== null && typeof stream === "object" && typeof stream.pipe === "function"; } function isWritableStream(stream) { return isStream(stream) && stream.writable !== false && typeof stream._write === "function" && typeof stream._writableState === "object"; } function isReadableStream(stream) { return isStream(stream) && stream.readable !== false && typeof stream._read === "function" && typeof stream._readableState === "object"; } function isDuplexStream(stream) { return isWritableStream(stream) && isReadableStream(stream); } ;// CONCATENATED MODULE: external "loglevel" const external_loglevel_namespaceObject = require("loglevel"); var external_loglevel_default = /*#__PURE__*/__webpack_require__.n(external_loglevel_namespaceObject); ;// CONCATENATED MODULE: ./src/loglevel.ts /* harmony default export */ const loglevel = (external_loglevel_default().getLogger("torus-embed")); ;// CONCATENATED MODULE: ./src/messages.ts /* harmony default export */ const messages = ({ errors: { disconnected: () => "Torus: Lost connection to Torus.", permanentlyDisconnected: () => "Torus: Disconnected from iframe. Page reload required.", sendSiteMetadata: () => "Torus: Failed to send site metadata. This is an internal error, please report this bug.", unsupportedSync: method => `Torus: The Torus Ethereum provider does not support synchronous methods like ${method} without a callback parameter.`, invalidDuplexStream: () => "Must provide a Node.js-style duplex stream.", invalidOptions: (maxEventListeners, shouldSendMetadata) => `Invalid options. Received: { maxEventListeners: ${maxEventListeners}, shouldSendMetadata: ${shouldSendMetadata} }`, invalidRequestArgs: () => `Expected a single, non-array, object argument.`, invalidRequestMethod: () => `'args.method' must be a non-empty string.`, invalidRequestParams: () => `'args.params' must be an object or array if provided.`, invalidLoggerObject: () => `'args.logger' must be an object if provided.`, invalidLoggerMethod: method => `'args.logger' must include required method '${method}'.` }, info: { connected: chainId => `Torus: Connected to chain with ID "${chainId}".` }, warnings: { // deprecated methods enableDeprecation: 'Torus: ""ethereum.enable()" is deprecated and may be removed in the future. ' + 'Please use "ethereum.send("eth_requestAccounts")" instead. For more information, see: https://eips.ethereum.org/EIPS/eip-1102', sendDeprecation: 'Torus: "ethereum.send(...)" is deprecated and may be removed in the future.' + ' Please use "ethereum.sendAsync(...)" or "ethereum.request(...)" instead.\nFor more information, see: https://eips.ethereum.org/EIPS/eip-1193' } }); ;// CONCATENATED MODULE: ./src/utils.ts const { paymentProviders: utils_paymentProviders } = config; const validatePaymentProvider = (provider, params) => { const errors = {}; if (!provider) { return { errors, isValid: true }; } if (provider && !utils_paymentProviders[provider]) { errors.provider = "Invalid Provider"; return { errors, isValid: Object.keys(errors).length === 0 }; } const selectedProvider = utils_paymentProviders[provider]; const selectedParams = params || {}; // set default values // if (!selectedParams.selectedCurrency) [selectedParams.selectedCurrency] = selectedProvider.validCurrencies // if (!selectedParams.fiatValue) selectedParams.fiatValue = selectedProvider.minOrderValue // if (!selectedParams.selectedCryptoCurrency) [selectedParams.selectedCryptoCurrency] = selectedProvider.validCryptoCurrencies // validations if (selectedParams.fiatValue) { const requestedOrderAmount = +parseFloat(selectedParams.fiatValue.toString()) || 0; if (requestedOrderAmount < selectedProvider.minOrderValue) errors.fiatValue = "Requested amount is lower than supported"; if (requestedOrderAmount > selectedProvider.maxOrderValue && selectedProvider.enforceMax) errors.fiatValue = "Requested amount is higher than supported"; } if (selectedParams.selectedCurrency && !selectedProvider.validCurrencies.includes(selectedParams.selectedCurrency)) { errors.selectedCurrency = "Unsupported currency"; } if (selectedParams.selectedCryptoCurrency) { const validCryptoCurrenciesByChain = Object.values(selectedProvider.validCryptoCurrenciesByChain).flat().map(currency => currency.value); const finalCryptoCurrency = provider === PAYMENT_PROVIDER.MOONPAY ? selectedParams.selectedCryptoCurrency.toLowerCase() : selectedParams.selectedCryptoCurrency; if (validCryptoCurrenciesByChain && !validCryptoCurrenciesByChain.includes(finalCryptoCurrency)) errors.selectedCryptoCurrency = "Unsupported cryptoCurrency"; } return { errors, isValid: Object.keys(errors).length === 0 }; }; // utility functions /** * json-rpc-engine middleware that logs RPC errors and and validates req.method. * * @param log - The logging API to use. * @returns json-rpc-engine middleware function */ function createErrorMiddleware() { return (req, res, next) => { // json-rpc-engine will terminate the request when it notices this error if (typeof req.method !== "string" || !req.method) { res.error = rpc_errors_namespaceObject.rpcErrors.invalidRequest({ message: `The request 'method' must be a non-empty string.`, data: objectSpread2_default()(objectSpread2_default()({}, req || {}), {}, { cause: "The request 'method' must be a non-empty string." }) }); } next(done => { const { error } = res; if (!error) { return done(); } loglevel.error(`MetaMask - RPC Error: ${error.message}`, error); return done(); }); }; } // resolve response.result or response, reject errors const getRpcPromiseCallback = function (resolve, reject) { let unwrapResult = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; return (error, response) => { if (error || response.error) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore reject(error || response.error); } else { resolve(!unwrapResult || Array.isArray(response) ? response : response.result); } }; }; /** * Logs a stream disconnection error. Emits an 'error' if given an * EventEmitter that has listeners for the 'error' event. * * @param log - The logging API to use. * @param remoteLabel - The label of the disconnected stream. * @param error - The associated error to log. * @param emitter - The logging API to use. */ function logStreamDisconnectWarning(remoteLabel, error, emitter) { let warningMsg = `MetaMask: Lost connection to "${remoteLabel}".`; if (error !== null && error !== void 0 && error.stack) { warningMsg += `\n${error.stack}`; } loglevel.warn(warningMsg); if (emitter && emitter.listenerCount("error") > 0) { emitter.emit("error", warningMsg); } } const getPreopenInstanceId = () => Math.random().toString(36).slice(2); const getTorusUrl = async (buildEnv, integrity) => { let torusUrl; let logLevel; // Do not change this line const version = "5.0.1"; let versionUsed = integrity.version || version; try { if ((buildEnv === "binance" || buildEnv === "production") && !integrity.version) { let response; if (!config.prodTorusUrl) response = await (0,http_helpers_namespaceObject.get)(`${config.api}/latestversion?name=@toruslabs/torus-embed&version=${version}`, {}, { useAPIKey: true });else response = { data: config.prodTorusUrl }; versionUsed = response.data; // eslint-disable-next-line require-atomic-updates config.prodTorusUrl = response.data; } } catch (error) { loglevel.error(error, "unable to fetch latest version"); } loglevel.info("version used: ", versionUsed); switch (buildEnv) { case "binance": torusUrl = `https://binance.tor.us/v${versionUsed}`; logLevel = "info"; break; case "testing": torusUrl = "https://testing.tor.us"; logLevel = "debug"; break; case "bnb": torusUrl = "https://bnb.tor.us"; logLevel = "error"; break; case "polygon": torusUrl = "https://polygon.tor.us"; logLevel = "error"; break; case "lrc": torusUrl = "https://lrc.tor.us"; logLevel = "debug"; break; case "beta": torusUrl = "https://beta.tor.us"; logLevel = "debug"; break; case "development": torusUrl = "http://localhost:4050"; logLevel = "debug"; break; case "alpha": torusUrl = "https://alpha.tor.us"; logLevel = "debug"; break; default: torusUrl = `https://app.tor.us/v${versionUsed}`; logLevel = "error"; break; } return { torusUrl, logLevel }; }; const getUserLanguage = () => { let userLanguage = window.navigator.language || "en-US"; const userLanguages = userLanguage.split("-"); userLanguage = Object.prototype.hasOwnProperty.call(config.translations, userLanguages[0]) ? userLanguages[0] : "en"; return userLanguage; }; const EMITTED_NOTIFICATIONS = ["eth_subscription" // per eth-json-rpc-filters/subscriptionManager ]; const NOOP = () => { // empty function }; const FEATURES_PROVIDER_CHANGE_WINDOW = "directories=0,titlebar=0,toolbar=0,status=0,location=0,menubar=0,height=660,width=375"; const FEATURES_DEFAULT_WALLET_WINDOW = "directories=0,titlebar=0,toolbar=0,status=0,location=0,menubar=0,height=740,width=1315"; const FEATURES_DEFAULT_POPUP_WINDOW = "directories=0,titlebar=0,toolbar=0,status=0,location=0,menubar=0,height=700,width=1200"; const FEATURES_CONFIRM_WINDOW = "directories=0,titlebar=0,toolbar=0,status=0,location=0,menubar=0,height=700,width=450"; function getPopupFeatures() { // Fixes dual-screen position Most browsers Firefox const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : window.screenX; const dualScreenTop = window.screenTop !== undefined ? window.screenTop : window.screenY; const w = 1200; const h = 700; const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : window.screen.width; const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : window.screen.height; const systemZoom = 1; // No reliable estimate const left = Math.abs((width - w) / 2 / systemZoom + dualScreenLeft); const top = Math.abs((height - h) / 2 / systemZoom + dualScreenTop); const features = `titlebar=0,toolbar=0,status=0,location=0,menubar=0,height=${h / systemZoom},width=${w / systemZoom},top=${top},left=${left}`; return features; } ;// CONCATENATED MODULE: ./src/inpage-provider.ts openlogin_jrpc_namespaceObject.SafeEventEmitter.defaultMaxListeners = 100; // resolve response.result, reject errors const inpage_provider_getRpcPromiseCallback = function (resolve, reject) { let unwrapResult = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; return (error, response) => { if (error || response.error) { return reject(error || response.error); } return !unwrapResult || Array.isArray(response) ? resolve(response) : resolve(response.result); }; }; class TorusInpageProvider extends openlogin_jrpc_namespaceObject.SafeEventEmitter { constructor(connectionStream) { let { maxEventListeners = 100, shouldSendMetadata = true, jsonRpcStreamName = "provider" } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; super(); /** * The chain ID of the currently connected Ethereum chain. * See [chainId.network]{@link https://chainid.network} for more information. */ defineProperty_default()(this, "chainId", void 0); /** * The user's currently selected Ethereum address. * If null, MetaMask is either locked or the user has not permitted any * addresses to be viewed. */ defineProperty_default()(this, "selectedAddress", void 0); defineProperty_default()(this, "_rpcEngine", void 0); defineProperty_default()(this, "networkVersion", void 0); defineProperty_default()(this, "shouldSendMetadata", void 0); /** * Indicating that this provider is a MetaMask provider. */ defineProperty_default()(this, "isTorus", void 0); defineProperty_default()(this, "tryPreopenHandle", void 0); defineProperty_default()(this, "enable", void 0); defineProperty_default()(this, "_state", void 0); defineProperty_default()(this, "_jsonRpcConnection", void 0); if (!isDuplexStream(connectionStream)) { throw new Error(messages.errors.invalidDuplexStream()); } this.isTorus = true; this.setMaxListeners(maxEventListeners); // private state this._state = objectSpread2_default()({}, TorusInpageProvider._defaultState); // public state this.selectedAddress = null; this.networkVersion = null; this.chainId = null; this.shouldSendMetadata = shouldSendMetadata; // bind functions (to prevent e.g. web3@1.x from making unbound calls) this._handleAccountsChanged = this._handleAccountsChanged.bind(this); this._handleChainChanged = this._handleChainChanged.bind(this); this._handleUnlockStateChanged = this._handleUnlockStateChanged.bind(this); this._handleConnect = this._handleConnect.bind(this); this._handleDisconnect = this._handleDisconnect.bind(this); this._handleStreamDisconnect = this._handleStreamDisconnect.bind(this); this._sendSync = this._sendSync.bind(this); this._rpcRequest = this._rpcRequest.bind(this); this._initializeState = this._initializeState.bind(this); this.request = this.request.bind(this); this.send = this.send.bind(this); this.sendAsync = this.sendAsync.bind(this); // this.enable = this.enable.bind(this); // setup connectionStream multiplexing const mux = new openlogin_jrpc_namespaceObject.ObjectMultiplex(); external_pump_default()(connectionStream, mux, connectionStream, this._handleStreamDisconnect.bind(this, "MetaMask")); // ignore phishing warning message (handled elsewhere) mux.ignoreStream("phishing"); // setup own event listeners // EIP-1193 connect this.on("connect", () => { this._state.isConnected = true; }); // connect to async provider const jsonRpcConnection = (0,openlogin_jrpc_namespaceObject.createStreamMiddleware)(); external_pump_default()(jsonRpcConnection.stream, mux.createStream(jsonRpcStreamName), jsonRpcConnection.stream, this._handleStreamDisconnect.bind(this, "MetaMask RpcProvider")); // handle RPC requests via dapp-side rpc engine const rpcEngine = new openlogin_jrpc_namespaceObject.JRPCEngine(); rpcEngine.push((0,openlogin_jrpc_namespaceObject.createIdRemapMiddleware)()); rpcEngine.push(createErrorMiddleware()); rpcEngine.push(jsonRpcConnection.middleware); this._rpcEngine = rpcEngine; // json rpc notification listener jsonRpcConnection.events.on("notification", payload => { const { method, params } = payload; if (method === "wallet_accountsChanged") { this._handleAccountsChanged(params); } else if (method === "wallet_unlockStateChanged") { this._handleUnlockStateChanged(params); } else if (method === "wallet_chainChanged") { this._handleChainChanged(params); } else if (EMITTED_NOTIFICATIONS.includes(payload.method)) { // EIP 1193 subscriptions, per eth-json-rpc-filters/subscriptionManager this.emit("data", payload); // deprecated this.emit("notification", params.result); this.emit("message", { type: method, data: params }); } // Backward compatibility for older non EIP 1193 subscriptions // this.emit('data', null, payload) }); } /** * Returns whether the inpage provider is connected to Torus. */ isConnected() { return this._state.isConnected; } /** * Submits an RPC request for the given method, with the given params. * Resolves with the result of the method call, or rejects on error. * * @param args - The RPC request arguments. * @returns A Promise that resolves with the result of the RPC method, * or rejects if an error is encountered. */ async request(args) { if (!args || typeof args !== "object" || Array.isArray(args)) { throw rpc_errors_namespaceObject.rpcErrors.invalidRequest({ message: messages.errors.invalidRequestArgs(), data: objectSpread2_default()(objectSpread2_default()({}, args || {}), {}, { cause: messages.errors.invalidRequestArgs() }) }); } const { method, params } = args; if (typeof method !== "string" || method.length === 0) { throw rpc_errors_namespaceObject.rpcErrors.invalidRequest({ message: messages.errors.invalidRequestMethod(), data: objectSpread2_default()(objectSpread2_default()({}, args || {}), {}, { cause: messages.errors.invalidRequestArgs() }) }); } if (params !== undefined && !Array.isArray(params) && (typeof params !== "object" || params === null)) { throw rpc_errors_namespaceObject.rpcErrors.invalidRequest({ message: messages.errors.invalidRequestParams(), data: objectSpread2_default()(objectSpread2_default()({}, args || {}), {}, { cause: messages.errors.invalidRequestArgs() }) }); } return new Promise((resolve, reject) => { this._rpcRequest({ method, params }, inpage_provider_getRpcPromiseCallback(resolve, reject)); }); } /** * Submits an RPC request per the given JSON-RPC request object. * * @param payload - The RPC request object. * @param cb - The callback function. */ sendAsync(payload, callback) { this._rpcRequest(payload, callback); } // Private Methods //= =================== /** * Constructor helper. * Populates initial state by calling 'wallet_getProviderState' and emits * necessary events. */ async _initializeState() { try { const { accounts, chainId, isUnlocked, networkVersion } = await this.request({ method: "wallet_getProviderState" }); // indicate that we've connected, for EIP-1193 compliance this.emit("connect", { chainId }); this._handleChainChanged({ chainId, networkVersion }); this._handleUnlockStateChanged({ accounts, isUnlocked }); this._handleAccountsChanged(accounts); } catch (error) { loglevel.error("MetaMask: Failed to get initial state. Please report this bug.", error); } finally { loglevel.info("initialized state"); this._state.initialized = true; this.emit("_initialized"); } } /** * Internal RPC method. Forwards requests to background via the RPC engine. * Also remap ids inbound and outbound. * * @param payload - The RPC request object. * @param callback - The consumer's callback. * @param isInternal - false - Whether the request is internal. */ _rpcRequest(payload, callback) { let isInternal = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; let cb = callback; const _payload = payload; if (!Array.isArray(_payload)) { if (!_payload.jsonrpc) { _payload.jsonrpc = "2.0"; } if (_payload.method === "eth_accounts" || _payload.method === "eth_requestAccounts") { // handle accounts changing cb = (err, res) => { this._handleAccountsChanged(res.result || [], _payload.method === "eth_accounts", isInternal); callback(err, res); }; } else if (_payload.method === "wallet_getProviderState") { this._rpcEngine.handle(payload, cb); return; } } this.tryPreopenHandle(_payload, cb); } /** * Submits an RPC request for the given method, with the given params. * * @deprecated Use "request" instead. * @param method - The method to request. * @param params - Any params for the method. * @returns A Promise that resolves with the JSON-RPC response object for the * request. */ /** * Submits an RPC request per the given JSON-RPC request object. * * @deprecated Use "request" instead. * @param payload - A JSON-RPC request object. * @param callback - An error-first callback that will receive the JSON-RPC * response object. */ /** * Accepts a JSON-RPC request object, and synchronously returns the cached result * for the given method. Only supports 4 specific RPC methods. * * @deprecated Use "request" instead. * @param payload - A JSON-RPC request object. * @returns A JSON-RPC response object. */ send(methodOrPayload, callbackOrArgs) { if (typeof methodOrPayload === "string" && (!callbackOrArgs || Array.isArray(callbackOrArgs))) { return new Promise((resolve, reject) => { try { this._rpcRequest({ method: methodOrPayload, params: callbackOrArgs }, inpage_provider_getRpcPromiseCallback(resolve, reject, false)); } catch (error) { reject(error); } }); } if (methodOrPayload && typeof methodOrPayload === "object" && typeof callbackOrArgs === "function") { return this._rpcRequest(methodOrPayload, callbackOrArgs); } return this._sendSync(methodOrPayload); } /** * DEPRECATED. * Internal backwards compatibility method, used in send. */ _sendSync(payload) { let result; switch (payload.method) { case "eth_accounts": result = this.selectedAddress ? [this.selectedAddress] : []; break; case "eth_coinbase": result = this.selectedAddress || null; break; case "eth_uninstallFilter": this._rpcRequest(payload, NOOP); result = true; break; case "net_version": result = this.networkVersion || null; break; default: throw new Error(messages.errors.unsupportedSync(payload.method)); } return { id: payload.id, jsonrpc: payload.jsonrpc, result }; } /** * When the provider becomes connected, updates internal state and emits * required events. Idempotent. * * @param chainId - The ID of the newly connected chain. * emits MetaMaskInpageProvider#connect */ _handleConnect(chainId) { if (!this._state.isConnected) { this._state.isConnected = true; this.emit("connect", { chainId }); loglevel.debug(messages.info.connected(chainId)); } } /** * When the provider becomes disconnected, updates internal state and emits * required events. Idempotent with respect to the isRecoverable parameter. * * Error codes per the CloseEvent status codes as required by EIP-1193: * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes * * @param isRecoverable - Whether the disconnection is recoverable. * @param errorMessage - A custom error message. * emits MetaMaskInpageProvider#disconnect */ _handleDisconnect(isRecoverable, errorMessage) { if (this._state.isConnected || !this._state.isPermanentlyDisconnected && !isRecoverable) { this._state.isConnected = false; let error; if (isRecoverable) { error = new rpc_errors_namespaceObject.EthereumProviderError(1013, // Try again later errorMessage || messages.errors.disconnected()); loglevel.debug(error); } else { error = new rpc_errors_namespaceObject.EthereumProviderError(1011, // Internal error errorMessage || messages.errors.permanentlyDisconnected()); loglevel.error(error); this.chainId = null; this._state.accounts = null; this.selectedAddress = null; this._state.isUnlocked = false; this._state.isPermanentlyDisconnected = true; } this.emit("disconnect", error); } } /** * Called when connection is lost to critical streams. * * emits MetamaskInpageProvider#disconnect */ _handleStreamDisconnect(streamName, error) { logStreamDisconnectWarning(streamName, error, this); this._handleDisconnect(false, error ? error.message : undefined); } /** * Called when accounts may have changed. */ _handleAccountsChanged(accounts) { let isEthAccounts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; let isInternal = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; // defensive programming let finalAccounts = accounts; if (!Array.isArray(finalAccounts)) { loglevel.error("MetaMask: Received non-array accounts parameter. Please report this bug.", finalAccounts); finalAccounts = []; } for (const account of accounts) { if (typeof account !== "string") { loglevel.error("MetaMask: Received non-string account. Please report this bug.", accounts); finalAccounts = []; break; } } // emit accountsChanged if anything about the accounts array has changed if (!external_fast_deep_equal_default()(this._state.accounts, finalAccounts)) { // we should always have the correct accounts even before eth_accounts // returns, except in cases where isInternal is true if (isEthAccounts && Array.isArray(this._state.accounts) && this._state.accounts.length > 0 && !isInternal) { loglevel.error('MetaMask: "eth_accounts" unexpectedly updated accounts. Please report this bug.', finalAccounts); } this._state.accounts = finalAccounts; this.emit("accountsChanged", finalAccounts); } // handle selectedAddress if (this.selectedAddress !== finalAccounts[0]) { this.selectedAddress = finalAccounts[0] || null; } } /** * Upon receipt of a new chainId and networkVersion, emits corresponding * events and sets relevant public state. * Does nothing if neither the chainId nor the networkVersion are different * from existing values. * * emits MetamaskInpageProvider#chainChanged * @param networkInfo - An object with network info. */ _handleChainChanged() { let { chainId, networkVersion } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (!chainId || !networkVersion) { loglevel.error("MetaMask: Received invalid network parameters. Please report this bug.", { chainId, networkVersion }); return; } if (networkVersion === "loading") { this._handleDisconnect(true); } else { this._handleConnect(chainId); if (chainId !== this.chainId) { this.chainId = chainId; if (this._state.initialized) { this.emit("chainChanged", this.chainId); } } } } /** * Upon receipt of a new isUnlocked state, sets relevant public state. * Calls the accounts changed handler with the received accounts, or an empty * array. * * Does nothing if the received value is equal to the existing value. * There are no lock/unlock events. * * @param opts - Options bag. */ _handleUnlockStateChanged() { let { accounts, isUnlocked } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (typeof isUnlocked !== "boolean") { loglevel.error("MetaMask: Received invalid isUnlocked parameter. Please