From 7713dccca5da215f34f41e2d4ba72f5d5e7bfab9 Mon Sep 17 00:00:00 2001 From: heisenberg <110591045+heisenberg-2077@users.noreply.github.com> Date: Fri, 15 Sep 2023 10:38:45 +0800 Subject: [PATCH] WIP feat: init WalletConnect V2 (#1726) * feat: init v2 * fix: chainId * fix: chainId * fix: qrcode * fix: update --- package.json | 2 +- src/background/controller/wallet.ts | 111 ++-- src/background/service/keyring/index.ts | 18 +- src/constant/index.ts | 1 + src/ui/component/ScanCopyQRCode.tsx | 34 +- .../component/WalletConnect/ReconnectView.tsx | 10 - .../WalletConnect/useSessionStatus.ts | 2 +- src/ui/component/WalletConnectBridgeModal.tsx | 6 +- src/ui/utils/WalletContext.tsx | 1 + .../FooterBar/WalletConnectAccount.tsx | 1 + .../WatchAddressWaiting/Process.tsx | 20 +- .../components/WatchAddressWaiting/Scan.tsx | 9 - .../components/WatchAddressWaiting/index.tsx | 41 +- src/ui/views/ImportWatchAddress.tsx | 81 +-- src/ui/views/WalletConnect/index.tsx | 82 +-- src/utils/walletconnect.ts | 15 + yarn.lock | 604 ++++++++++++++---- 17 files changed, 642 insertions(+), 396 deletions(-) create mode 100644 src/utils/walletconnect.ts diff --git a/package.json b/package.json index 45bdecad381..6f367e8270e 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "@rabby-wallet/eth-lattice-keyring": "^1.0.5", "@rabby-wallet/eth-simple-keyring": "^4.2.1", "@rabby-wallet/eth-trezor-keyring": "^2.2.0", - "@rabby-wallet/eth-walletconnect-keyring": "^1.7.21", + "@rabby-wallet/eth-walletconnect-keyring": "2.0.0-beta.5", "@rabby-wallet/eth-watch-keyring": "^1.0.0", "@rabby-wallet/gnosis-sdk": "^1.3.5", "@rabby-wallet/page-provider": "^0.1.20", diff --git a/src/background/controller/wallet.ts b/src/background/controller/wallet.ts index 6952bfaf557..3d3d752ad1c 100644 --- a/src/background/controller/wallet.ts +++ b/src/background/controller/wallet.ts @@ -3,7 +3,7 @@ import Wallet, { thirdparty } from 'ethereumjs-wallet'; import { ethErrors } from 'eth-rpc-errors'; import * as bip39 from 'bip39'; import { ethers, Contract } from 'ethers'; -import { groupBy, uniq } from 'lodash'; +import { chain, groupBy, uniq } from 'lodash'; import abiCoder, { AbiCoder } from 'web3-eth-abi'; import * as optimismContracts from '@eth-optimism/contracts'; import { @@ -60,7 +60,7 @@ import { } from '@rabby-wallet/rabby-security-engine/dist/rules'; import DisplayKeyring from '../service/keyring/display'; import provider from './provider'; -import WalletConnectKeyring from '@rabby-wallet/eth-walletconnect-keyring'; +import { WalletConnectKeyring } from '@rabby-wallet/eth-walletconnect-keyring'; import eventBus from '@/eventBus'; import { setPageStateCacheWhenPopupClose, @@ -98,6 +98,7 @@ import { t } from 'i18next'; import { getWeb3Provider } from './utils'; import { CoboSafeAccount } from '@/utils/cobo-agrus-sdk/cobo-agrus-sdk'; import CoboArgusKeyring from '../service/keyring/eth-cobo-argus-keyring'; +import { GET_WALLETCONNECT_CONFIG } from '@/utils/walletconnect'; const stashKeyrings: Record = {}; @@ -1709,7 +1710,11 @@ export class WalletController extends BaseController { return null; }; - initWalletConnect = async (brandName: string, curStashId?: number | null) => { + initWalletConnect = async ( + brandName: string, + curStashId?: number | null, + chainId = 1 + ) => { let keyring: WalletConnectKeyring, isNewKey; const keyringType = KEYRING_CLASS.WALLETCONNECT; try { @@ -1721,28 +1726,24 @@ export class WalletController extends BaseController { } } catch { const WalletConnect = keyringService.getKeyringClassForType(keyringType); - keyring = new WalletConnect({ - accounts: [], - brandName: brandName, - // 1h - maxDuration: 3600000, - clientMeta: { - description: t('global.appDescription'), - url: 'https://rabby.io', - icons: ['https://rabby.io/assets/images/logo.png'], - name: 'Rabby', - }, - }); + keyring = new WalletConnect(GET_WALLETCONNECT_CONFIG()); isNewKey = true; } - const { uri } = await keyring.initConnector(brandName); + const { uri } = await keyring.initConnector( + brandName, + !chainId ? 1 : chainId + ); let stashId = curStashId; if (isNewKey) { stashId = this.addKeyringToStash(keyring); eventBus.addEventListener( EVENTS.WALLETCONNECT.INIT, - ({ address, brandName }) => { - (keyring as WalletConnectKeyring).init(address, brandName); + ({ address, brandName, chainId }) => { + (keyring as WalletConnectKeyring).init( + address, + brandName, + !chainId ? 1 : chainId + ); } ); (keyring as WalletConnectKeyring).on('inited', (uri) => { @@ -1797,40 +1798,6 @@ export class WalletController extends BaseController { }; }; - getWalletConnectBridge = (address: string, brandName: string) => { - const keyringType = KEYRING_CLASS.WALLETCONNECT; - const keyring: WalletConnectKeyring = this._getKeyringByType(keyringType); - if (keyring) { - const target = keyring.accounts.find( - (account) => - account.address.toLowerCase() === address.toLowerCase() && - brandName === account.brandName - ); - - if (target) return target.bridge; - - return null; - } - return null; - }; - - getWalletConnectConnectors = () => { - const keyringType = KEYRING_CLASS.WALLETCONNECT; - const keyring: WalletConnectKeyring = this._getKeyringByType(keyringType); - if (keyring) { - const result: { address: string; brandName: string }[] = []; - for (const key in keyring.connectors) { - const target = keyring.connectors[key]; - result.push({ - address: key.split('-')[1], - brandName: target.brandName, - }); - } - return result; - } - return []; - }; - killWalletConnectConnector = async ( address: string, brandName: string, @@ -1840,17 +1807,11 @@ export class WalletController extends BaseController { const keyringType = KEYRING_CLASS.WALLETCONNECT; const keyring: WalletConnectKeyring = this._getKeyringByType(keyringType); if (keyring) { - const connector = - keyring.connectors[`${brandName}-${address.toLowerCase()}`]; - if (connector) { - await keyring.closeConnector( - connector.connector, - address, - brandName, - silent - ); + const topic = keyring.cached.findTopic({ address, brandName }); + if (topic) { + await keyring.closeConnector({ topic }, silent); // reset onAfterConnect - if (resetConnect) keyring.onAfterConnect = null; + if (resetConnect) keyring.onAfterSessionCreated = undefined; } } }; @@ -1892,7 +1853,6 @@ export class WalletController extends BaseController { keyring.setAccountToAdd({ address, brandName, - bridge, realBrandName, realBrandUrl, }); @@ -3293,6 +3253,31 @@ export class WalletController extends BaseController { isModuleEnabled, }; }; + + walletConnectScanAccount = async () => { + let keyring: WalletConnectKeyring, isNewKey; + const keyringType = KEYRING_CLASS.WALLETCONNECT; + try { + keyring = this._getKeyringByType(keyringType); + } catch { + const WalletConnect = keyringService.getKeyringClassForType(keyringType); + keyring = new WalletConnect(GET_WALLETCONNECT_CONFIG()); + isNewKey = true; + } + + if (isNewKey) { + this.addKeyringToStash(keyring); + } + + keyring.on('scanAccount', (payload) => { + eventBus.emit(EVENTS.broadcastToUI, { + method: EVENTS.WALLETCONNECT.SCAN_ACCOUNT, + params: payload, + }); + }); + + return await keyring.scanAccount(); + }; } const wallet = new WalletController(); diff --git a/src/background/service/keyring/index.ts b/src/background/service/keyring/index.ts index 843bc3b01e2..5b7a6dac2f4 100644 --- a/src/background/service/keyring/index.ts +++ b/src/background/service/keyring/index.ts @@ -21,9 +21,7 @@ import LatticeKeyring from './eth-lattice-keyring'; import WatchKeyring from '@rabby-wallet/eth-watch-keyring'; import KeystoneKeyring from './eth-keystone-keyring'; import CoboArgusKeyring from './eth-cobo-argus-keyring'; -import WalletConnectKeyring, { - keyringType, -} from '@rabby-wallet/eth-walletconnect-keyring'; +import { WalletConnectKeyring } from '@rabby-wallet/eth-walletconnect-keyring'; import GnosisKeyring, { TransactionBuiltEvent, TransactionConfirmedEvent, @@ -37,6 +35,7 @@ import { isSameAddress } from 'background/utils'; import contactBook from '../contactBook'; import { generateAliasName } from '@/utils/account'; import * as Sentry from '@sentry/browser'; +import { GET_WALLETCONNECT_CONFIG } from '@/utils/walletconnect'; export const KEYRING_SDK_TYPES = { SimpleKeyring, @@ -859,7 +858,10 @@ export class KeyringService extends EventEmitter { async _restoreKeyring(serialized: any): Promise { const { type, data } = serialized; const Keyring = this.getKeyringClassForType(type); - const keyring = new Keyring(); + const keyring = + Keyring?.type === KEYRING_CLASS.WALLETCONNECT + ? new Keyring(GET_WALLETCONNECT_CONFIG()) + : new Keyring(); await keyring.deserialize(data); if ( keyring.type === HARDWARE_KEYRING_TYPES.Ledger.type && @@ -870,8 +872,12 @@ export class KeyringService extends EventEmitter { if (keyring.type === KEYRING_CLASS.WALLETCONNECT) { eventBus.addEventListener( EVENTS.WALLETCONNECT.INIT, - ({ address, brandName }) => { - (keyring as WalletConnectKeyring).init(address, brandName); + ({ address, brandName, chainId }) => { + (keyring as WalletConnectKeyring).init( + address, + brandName, + !chainId ? 1 : chainId + ); } ); (keyring as WalletConnectKeyring).on('inited', (uri) => { diff --git a/src/constant/index.ts b/src/constant/index.ts index df406569e60..f12b6484166 100644 --- a/src/constant/index.ts +++ b/src/constant/index.ts @@ -318,6 +318,7 @@ export const EVENTS = { INIT: 'WALLETCONNECT_INIT', INITED: 'WALLETCONNECT_INITED', TRANSPORT_ERROR: 'TRANSPORT_ERROR', + SCAN_ACCOUNT: 'SCAN_ACCOUNT', }, GNOSIS: { TX_BUILT: 'TransactionBuilt', diff --git a/src/ui/component/ScanCopyQRCode.tsx b/src/ui/component/ScanCopyQRCode.tsx index 0e6ba933540..adc86308c17 100644 --- a/src/ui/component/ScanCopyQRCode.tsx +++ b/src/ui/component/ScanCopyQRCode.tsx @@ -13,15 +13,13 @@ import IconRefresh from 'ui/assets/urlrefresh.svg'; import { ConnectStatus } from './WalletConnect/ConnectStatus'; import { useSessionStatus } from './WalletConnect/useSessionStatus'; import { Account } from '@/background/service/preference'; +import Spin from './Spin'; interface Props { showURL: boolean; changeShowURL: (active: boolean) => void; refreshFun(): void; qrcodeURL: string; - onBridgeChange(val: string): void; - bridgeURL: string; - defaultBridge: string; canChangeBridge?: boolean; brandName?: string; account?: Account; @@ -31,9 +29,6 @@ const ScanCopyQRCode: React.FC = ({ changeShowURL, qrcodeURL, refreshFun, - onBridgeChange, - bridgeURL, - defaultBridge, canChangeBridge = true, brandName, account, @@ -69,11 +64,6 @@ const ScanCopyQRCode: React.FC = ({ }); }; - const handleBridgeServerChange = (val: string) => { - onBridgeChange(val); - setShowOpenApiModal(false); - }; - React.useEffect(() => { // refresh when status is not connected if (status && status !== 'CONNECTED') { @@ -98,8 +88,19 @@ const ScanCopyQRCode: React.FC = ({ {!showURL && ( -
- +
+ {!qrcodeURL ? ( +
+ +
+ ) : ( + + )} {isHovering && (
@@ -145,13 +146,6 @@ const ScanCopyQRCode: React.FC = ({ {t('page.newAddress.walletConnect.changeBridgeServer')}
)} - setShowOpenApiModal(false)} - />
); diff --git a/src/ui/component/WalletConnect/ReconnectView.tsx b/src/ui/component/WalletConnect/ReconnectView.tsx index 293144b71d6..916d217aaed 100644 --- a/src/ui/component/WalletConnect/ReconnectView.tsx +++ b/src/ui/component/WalletConnect/ReconnectView.tsx @@ -1,7 +1,6 @@ import { EVENTS, KEYRING_CLASS } from '@/constant'; import eventBus from '@/eventBus'; import { noop, useCommonPopupView, useWallet } from '@/ui/utils'; -import { DEFAULT_BRIDGE } from '@rabby-wallet/eth-walletconnect-keyring'; import React from 'react'; import { Account } from 'background/service/preference'; import Scan from '@/ui/views/Approval/components/WatchAddressWaiting/Scan'; @@ -25,7 +24,6 @@ export const ReconnectView: React.FC = () => { null ); const { status, errorAccount } = useSessionStatus(account); - const [bridgeURL, setBridge] = React.useState(DEFAULT_BRIDGE); const [displayBrandName] = useDisplayBrandName( account?.realBrandName || account?.brandName ); @@ -55,16 +53,11 @@ export const ReconnectView: React.FC = () => { const init = async () => { if (!account) return; - const bridge = await wallet.getWalletConnectBridge( - account.address, - account.brandName - ); setCurrentAccount({ ...account, brandName: account.realBrandName || account.brandName, type: KEYRING_CLASS.WALLETCONNECT, }); - setBridge(bridge || DEFAULT_BRIDGE); setPopupViewTitle( t('page.newAddress.walletConnect.title', { brandName: displayBrandName }) ); @@ -105,11 +98,8 @@ export const ReconnectView: React.FC = () => { {currentAccount && visible && ( )}
diff --git a/src/ui/component/WalletConnect/useSessionStatus.ts b/src/ui/component/WalletConnect/useSessionStatus.ts index 4d8dc833818..53ef7fc8fe1 100644 --- a/src/ui/component/WalletConnect/useSessionStatus.ts +++ b/src/ui/component/WalletConnect/useSessionStatus.ts @@ -1,7 +1,7 @@ import { EVENTS, WALLET_BRAND_TYPES } from '@/constant'; import eventBus from '@/eventBus'; import { isSameAddress, useWallet } from '@/ui/utils'; -import { WALLETCONNECT_SESSION_STATUS_MAP } from '@rabby-wallet/eth-walletconnect-keyring'; +import { WALLETCONNECT_SESSION_STATUS_MAP } from '@rabby-wallet/eth-walletconnect-keyring/dist/type'; import React from 'react'; type Status = keyof typeof WALLETCONNECT_SESSION_STATUS_MAP; diff --git a/src/ui/component/WalletConnectBridgeModal.tsx b/src/ui/component/WalletConnectBridgeModal.tsx index 3d7181f7563..9447fb6d305 100644 --- a/src/ui/component/WalletConnectBridgeModal.tsx +++ b/src/ui/component/WalletConnectBridgeModal.tsx @@ -8,13 +8,11 @@ import { useMedia } from 'react-use'; const OpenApiModal = ({ value, - defaultValue, visible, onChange, onCancel, }: { value: string; - defaultValue: string; visible: boolean; onChange(val: string): void; onCancel(): void; @@ -36,9 +34,7 @@ const OpenApiModal = ({ }; const restoreInitial = () => { - form.setFieldsValue({ - host: defaultValue, - }); + form.setFieldsValue({}); }; useEffect(() => { diff --git a/src/ui/utils/WalletContext.tsx b/src/ui/utils/WalletContext.tsx index 64915ef9364..181bb470cb1 100644 --- a/src/ui/utils/WalletContext.tsx +++ b/src/ui/utils/WalletContext.tsx @@ -40,6 +40,7 @@ const useCommonPopupViewState = () => { address: string; brandName: string; realBrandName?: string; + chainId?: number; }>(); const [data, setData] = useState(); diff --git a/src/ui/views/Approval/components/FooterBar/WalletConnectAccount.tsx b/src/ui/views/Approval/components/FooterBar/WalletConnectAccount.tsx index 39b08951ce4..79c573c2fdc 100644 --- a/src/ui/views/Approval/components/FooterBar/WalletConnectAccount.tsx +++ b/src/ui/views/Approval/components/FooterBar/WalletConnectAccount.tsx @@ -117,6 +117,7 @@ export const WalletConnectAccount: React.FC = ({ account, chain }) => { address, brandName, realBrandName, + chainId: chain?.id, }); if (tipStatus === 'DISCONNECTED') { activePopup('WalletConnect'); diff --git a/src/ui/views/Approval/components/WatchAddressWaiting/Process.tsx b/src/ui/views/Approval/components/WatchAddressWaiting/Process.tsx index f57cfdb1153..7c2ba56ea68 100644 --- a/src/ui/views/Approval/components/WatchAddressWaiting/Process.tsx +++ b/src/ui/views/Approval/components/WatchAddressWaiting/Process.tsx @@ -17,9 +17,9 @@ import { ApprovalPopupContainer, Props as ApprovalPopupContainerProps, } from '../Popup/ApprovalPopupContainer'; -import { NetworkStatus } from './NetworkStatus'; type Valueof = T[keyof T]; +const INIT_SENDING_COUNTER = 10; const Process = ({ status, @@ -51,7 +51,9 @@ const Process = ({ WALLET_BRAND_CONTENT.WALLETCONNECT.icon ); }, [brandRealUrl]); - const [sendingCounter, setSendingCounter] = React.useState(5); + const [sendingCounter, setSendingCounter] = React.useState( + INIT_SENDING_COUNTER + ); const [content, setContent] = React.useState(''); const [description, setDescription] = React.useState(''); const [statusProp, setStatusProp] = React.useState< @@ -60,7 +62,7 @@ const Process = ({ const handleRetry = () => { onRetry(); - setSendingCounter(5); + setSendingCounter(INIT_SENDING_COUNTER); }; const handleCancel = () => { onCancel(); @@ -106,7 +108,7 @@ const Process = ({ break; case WALLETCONNECT_STATUS_MAP.FAILED: setContent(t('page.signFooterBar.walletConnect.requestFailedToSend')); - setDescription(''); + setDescription(error?.message || ''); setStatusProp('FAILED'); break; case WALLETCONNECT_STATUS_MAP.SUBMITTED: @@ -116,7 +118,7 @@ const Process = ({ break; case WALLETCONNECT_STATUS_MAP.REJECTED: setContent(t('page.signFooterBar.ledger.txRejected')); - setDescription(''); + setDescription(error?.message || ''); setStatusProp('REJECTED'); break; } @@ -135,6 +137,7 @@ const Process = ({ onDone={onDone} onCancel={handleCancel} description={description} + hasMoreDescription={!!description} content={ <> {content} @@ -143,12 +146,7 @@ const Process = ({ )} } - > - - + > ); }; diff --git a/src/ui/views/Approval/components/WatchAddressWaiting/Scan.tsx b/src/ui/views/Approval/components/WatchAddressWaiting/Scan.tsx index 299ccd55b94..e08ade8d3f2 100644 --- a/src/ui/views/Approval/components/WatchAddressWaiting/Scan.tsx +++ b/src/ui/views/Approval/components/WatchAddressWaiting/Scan.tsx @@ -6,17 +6,11 @@ import { useCommonPopupView } from 'ui/utils'; const Scan = ({ uri, onRefresh, - bridgeURL, - onBridgeChange, - defaultBridge, account, }: { uri: string; - bridgeURL: string; - defaultBridge: string; account: Account; onRefresh(): void; - onBridgeChange(val: string): void; }) => { const [showURL, setShowURL] = useState(false); const [brandName, setBrandName] = useState(null); @@ -41,9 +35,6 @@ const Scan = ({ changeShowURL={setShowURL} qrcodeURL={uri || ''} refreshFun={handleRefresh} - onBridgeChange={onBridgeChange} - bridgeURL={bridgeURL} - defaultBridge={defaultBridge} canChangeBridge={false} brandName={brandName!} account={account} diff --git a/src/ui/views/Approval/components/WatchAddressWaiting/index.tsx b/src/ui/views/Approval/components/WatchAddressWaiting/index.tsx index ff3ed289683..2316f1dd251 100644 --- a/src/ui/views/Approval/components/WatchAddressWaiting/index.tsx +++ b/src/ui/views/Approval/components/WatchAddressWaiting/index.tsx @@ -1,7 +1,6 @@ import React, { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { matomoRequestEvent } from '@/utils/matomo-request'; -import { DEFAULT_BRIDGE } from '@rabby-wallet/eth-walletconnect-keyring'; import { Account } from 'background/service/preference'; import { CHAINS, @@ -46,7 +45,6 @@ const WatchAddressWaiting = ({ params }: { params: ApprovalParams }) => { (item) => item.id === (params.chainId || 1) )!.enum; const isSignTextRef = useRef(false); - const [bridgeURL, setBridge] = useState(DEFAULT_BRIDGE); const [currentAccount, setCurrentAccount] = useState(null); const explainRef = useRef(null); const [signFinishedData, setSignFinishedData] = useState<{ @@ -65,9 +63,11 @@ const WatchAddressWaiting = ({ params }: { params: ApprovalParams }) => { account.address, account.brandName ); - setConnectStatus( - status === null ? WALLETCONNECT_STATUS_MAP.PENDING : status - ); + if (status) { + setConnectStatus( + status === null ? WALLETCONNECT_STATUS_MAP.PENDING : status + ); + } eventBus.addEventListener(EVENTS.WALLETCONNECT.INITED, ({ uri }) => { setQrcodeContent(uri); }); @@ -110,12 +110,8 @@ const WatchAddressWaiting = ({ params }: { params: ApprovalParams }) => { const account = params.isGnosis ? params.account! : (await wallet.syncGetCurrentAccount())!; - const bridge = await wallet.getWalletConnectBridge( - account.address, - account.brandName - ); + setCurrentAccount(account); - setBridge(bridge || DEFAULT_BRIDGE); let isSignTriggered = false; const isText = params.isGnosis @@ -256,7 +252,15 @@ const WatchAddressWaiting = ({ params }: { params: ApprovalParams }) => { case WALLETCONNECT_STATUS_MAP.FAILED: case WALLETCONNECT_STATUS_MAP.REJECTED: if (payload?.code) { - setConnectError({ code: payload.code }); + try { + const error = JSON.parse(payload.message); + setConnectError({ + code: payload.code, + message: error.message, + }); + } catch (e) { + setConnectError(payload); + } } else { setConnectError( (payload?.params && payload.params[0]) || payload @@ -272,19 +276,9 @@ const WatchAddressWaiting = ({ params }: { params: ApprovalParams }) => { initWalletConnect(); }; - const handleBridgeChange = async (val: string) => { - const account = params.isGnosis - ? params.account! - : (await wallet.syncGetCurrentAccount())!; - setBridge(val); - eventBus.removeAllEventListeners(EVENTS.WALLETCONNECT.INITED); - initWalletConnect(); - wallet.setWalletConnectBridge(account.address, account.brandName, val); - }; - useEffect(() => { init(); - setHeight(340); + setHeight(360); }, []); useEffect(() => { @@ -314,10 +308,7 @@ const WatchAddressWaiting = ({ params }: { params: ApprovalParams }) => { currentAccount ? ( ) : ( diff --git a/src/ui/views/ImportWatchAddress.tsx b/src/ui/views/ImportWatchAddress.tsx index 8188accccdb..379054d3acd 100644 --- a/src/ui/views/ImportWatchAddress.tsx +++ b/src/ui/views/ImportWatchAddress.tsx @@ -1,17 +1,14 @@ -import React, { useState, useRef, useMemo, useEffect } from 'react'; +import React, { useState, useMemo, useEffect, useCallback } from 'react'; import { Input, Form } from 'antd'; import { useHistory } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import QRCode from 'qrcode.react'; import QRCodeReader from 'ui/component/QRCodeReader'; import { isValidAddress } from 'ethereumjs-util'; -import WalletConnect from '@rabby-wallet/wc-client'; -import { DEFAULT_BRIDGE } from '@rabby-wallet/eth-walletconnect-keyring'; import { Popup, StrayPageWithButton } from 'ui/component'; import { useWallet, useWalletRequest } from 'ui/utils'; import { openInternalPageInTab } from 'ui/utils/webapi'; -import { KEYRING_CLASS } from 'consts'; - +import { EVENTS, KEYRING_CLASS } from 'consts'; import WatchLogo from 'ui/assets/waitcup.svg'; import IconWalletconnect from 'ui/assets/walletconnect.svg'; import IconScan from 'ui/assets/scan.svg'; @@ -21,6 +18,7 @@ import { useMedia } from 'react-use'; import clsx from 'clsx'; import { Modal } from 'ui/component'; import IconBack from 'ui/assets/icon-back.svg'; +import eventBus from '@/eventBus'; const ImportWatchAddress = () => { const { t } = useTranslation(); @@ -32,7 +30,6 @@ const ImportWatchAddress = () => { false ); const [QRScanModalVisible, setQRScanModalVisible] = useState(false); - const connector = useRef(); const [walletconnectUri, setWalletconnectUri] = useState(''); const [ensResult, setEnsResult] = useState { const [tags, setTags] = useState([]); const [importedAccounts, setImportedAccounts] = useState([]); const isWide = useMedia('(min-width: 401px)'); - const [isValidAddr, setIsValidAddr] = useState(false); - const ModalComponent = isWide ? Modal : Popup; - const [run, loading] = useWalletRequest(wallet.importWatchAddress, { onSuccess(accounts) { setDisableKeydown(false); @@ -75,7 +69,6 @@ const ImportWatchAddress = () => { ]); }, }); - const handleConfirmENS = (result: string) => { form.setFieldsValue({ address: result, @@ -84,7 +77,6 @@ const ImportWatchAddress = () => { setTags([`ENS: ${ensResult!.name}`]); setEnsResult(null); }; - const handleKeyDown = useMemo(() => { const handler = (e: KeyboardEvent) => { if (e.key.toLowerCase() === 'enter') { @@ -96,56 +88,39 @@ const ImportWatchAddress = () => { }; return handler; }, [ensResult]); - + const handleScanAccount = useCallback((data) => { + const address = data.address; + form.setFieldsValue({ + address, + }); + if (isValidAddress(address)) { + setIsValidAddr(true); + } + setWalletconnectModalVisible(false); + }, []); useEffect(() => { document.addEventListener('keydown', handleKeyDown); + eventBus.addEventListener( + EVENTS.WALLETCONNECT.SCAN_ACCOUNT, + handleScanAccount + ); return () => { document.removeEventListener('keydown', handleKeyDown); + eventBus.removeEventListener( + EVENTS.WALLETCONNECT.SCAN_ACCOUNT, + handleScanAccount + ); }; }, [handleKeyDown]); - const handleImportByWalletconnect = async () => { - localStorage.removeItem('walletconnect'); - connector.current = new WalletConnect({ - bridge: DEFAULT_BRIDGE, - clientMeta: { - description: t('global.appDescription'), - url: 'https://rabby.io', - icons: ['https://rabby.io/assets/images/logo.png'], - name: t('global.appName'), - }, - }); - connector.current.on('connect', async (error, payload) => { - if (error) { - handleImportByWalletconnect(); - } else { - const { accounts } = payload.params[0]; - form.setFieldsValue({ - address: accounts[0], - }); - if (isValidAddress(accounts[0])) { - setIsValidAddr(true); - } - await connector.current?.killSession(); - setWalletconnectModalVisible(false); - setWalletconnectUri(''); - } - }); - connector.current.on('disconnect', () => { - setWalletconnectModalVisible(false); - }); - await connector.current.createSession(); - setWalletconnectUri(connector.current.uri); + const uri = await wallet.walletConnectScanAccount(); + + setWalletconnectUri(uri!); setWalletconnectModalVisible(true); }; - const handleWalletconnectModalCancel = () => { - if (connector.current && connector.current.connected) { - connector.current.killSession(); - } setWalletconnectModalVisible(false); }; - const handleScanQRCodeSuccess = (data) => { form.setFieldsValue({ address: data, @@ -156,11 +131,9 @@ const ImportWatchAddress = () => { setQRScanModalVisible(false); wallet.clearPageStateCache(); }; - const handleQRScanModalCancel = () => { setQRScanModalVisible(false); }; - const handleScanQRCodeError = async () => { await wallet.setPageStateCache({ path: history.location.pathname, @@ -169,18 +142,15 @@ const ImportWatchAddress = () => { }); openInternalPageInTab('request-permission?type=camera'); }; - const handleLoadCache = async () => { const cache = await wallet.getPageStateCache(); if (cache && cache.path === history.location.pathname) { form.setFieldsValue(cache.states); } }; - const handleImportByQrcode = () => { setQRScanModalVisible(true); }; - const handleValuesChange = async ({ address }: { address: string }) => { setTags([]); if (!isValidAddress(address)) { @@ -199,12 +169,10 @@ const ImportWatchAddress = () => { setEnsResult(null); } }; - const handleNextClick = () => { const address = form.getFieldValue('address'); run(address); }; - const handleClickBack = () => { if (history.length > 1) { history.goBack(); @@ -225,7 +193,6 @@ const ImportWatchAddress = () => { wallet.clearPageStateCache(); }; }, []); - return ( { const [result, setResult] = useState(''); const [walletconnectUri, setWalletconnectUri] = useState(''); const [showURL, setShowURL] = useState(false); - const [bridgeURL, setBridgeURL] = useState(DEFAULT_BRIDGE); + const [bridgeURL, setBridgeURL] = useState(''); const [brand, setBrand] = useState(location.state?.brand || {}); const [ready, setReady] = useState(false); const { status: sessionStatus, currAccount } = useSessionStatus(); @@ -37,6 +39,15 @@ const WalletConnectTemplate = () => { Parameters | undefined >(); const [curStashId, setCurStashId] = useState(); + const siteRef = React.useRef(null); + + const getCurrentSite = useCallback(async () => { + const tab = await getCurrentTab(); + if (!tab.id || !tab.url) return; + const domain = getOriginFromUrl(tab.url); + const current = await wallet.getCurrentSite(tab.id, domain); + siteRef.current = current; + }, []); const [run, loading] = useWalletRequest(wallet.importWalletConnect, { onSuccess(accounts) { @@ -62,48 +73,43 @@ const WalletConnectTemplate = () => { }); const handleRun = async (options: Parameters) => { - const [payload, brandName] = options; - const { account, peerMeta } = payload as any; + const [payload, brandName, account] = options as any; + const { + peer: { metadata }, + } = payload as any; - options[0] = account; + options[0] = account.address; if (brandName === WALLET_BRAND_CONTENT['WALLETCONNECT'].brand) { - if (peerMeta?.name) { + if (metadata?.name) { options[1] = currAccount!.brandName; - options[4] = peerMeta.name; - options[5] = peerMeta.icons?.[0]; + options[4] = metadata.name; + options[5] = metadata.icons?.[0]; } } run(...options); }; const handleImportByWalletconnect = async () => { + const chain = findChainByEnum(siteRef.current?.chain); const { uri, stashId } = await wallet.initWalletConnect( brand.brand, - curStashId + curStashId, + chain?.id ); setCurStashId(stashId); - setWalletconnectUri(uri); - // await wallet.setPageStateCache({ - // path: '/import/wallet-connect', - // params: {}, - // states: { - // uri, - // stashId, - // brand, - // bridgeURL, - // }, - // }); + setWalletconnectUri(uri!); + eventBus.removeAllEventListeners(EVENTS.WALLETCONNECT.STATUS_CHANGED); eventBus.addEventListener( EVENTS.WALLETCONNECT.STATUS_CHANGED, - ({ status, payload }) => { + ({ status, account, payload }) => { switch (status) { case WALLETCONNECT_STATUS_MAP.CONNECTED: - setResult(payload.account); + setResult(account.address); setRunParams([ payload, brand.brand, - bridgeURL, + account, stashId === null ? undefined : stashId, ]); break; @@ -175,28 +181,7 @@ const WalletConnectTemplate = () => { }, [sessionStatus]); const init = async () => { - // const cache = await wallet.getPageStateCache(); - // if (cache && cache.path === history.location.pathname) { - // const { states } = cache; - // if (states.uri) setWalletconnectUri(states.uri); - // if (states.brand) { - // setBrand(states.brand); - // } - // if (states.data) { - // setRunParams([ - // states.data.payload, - // states.brand.brand, - // states.bridgeURL, - // states.stashId, - // ]); - // } - // if (states.bridgeURL && states.bridgeURL !== bridgeURL) { - // setBridgeURL(states.bridgeURL); - // } - // } else { - // handleImportByWalletconnect(); - // } - + await getCurrentSite(); handleImportByWalletconnect(); setReady(true); }; @@ -242,9 +227,6 @@ const WalletConnectTemplate = () => { changeShowURL={setShowURL} qrcodeURL={walletconnectUri} refreshFun={handleRefresh} - bridgeURL={bridgeURL} - onBridgeChange={handleBridgeChange} - defaultBridge={DEFAULT_BRIDGE} canChangeBridge={false} brandName={brandName} /> diff --git a/src/utils/walletconnect.ts b/src/utils/walletconnect.ts new file mode 100644 index 00000000000..20994459687 --- /dev/null +++ b/src/utils/walletconnect.ts @@ -0,0 +1,15 @@ +import { t } from 'i18next'; + +export const GET_WALLETCONNECT_CONFIG = () => { + return { + // 1h + maxDuration: 3600000, + clientMeta: { + description: t('global.appDescription'), + url: 'https://rabby.io', + icons: ['https://rabby.io/assets/images/logo.png'], + name: 'Rabby', + }, + projectId: 'ed21a1293590bdc995404dff7e033f04', + }; +}; diff --git a/yarn.lock b/yarn.lock index 13265c58e8c..f5bdfdfeaec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3466,13 +3466,14 @@ ethereumjs-util "^7.1.5" hdkey "0.8.0" -"@rabby-wallet/eth-walletconnect-keyring@^1.7.21": - version "1.7.21" - resolved "https://registry.yarnpkg.com/@rabby-wallet/eth-walletconnect-keyring/-/eth-walletconnect-keyring-1.7.21.tgz#c96c9fb91ece81ec41d3e354ac77529188d30fd3" - integrity sha512-pWOLOMH+3I3rkMQWLJN5byeQOxTv8gwPSqj+sV6LikNgZGl51p6qosz1HBfE+GQMiCcL+ksTlCozPKqKqPi1ig== +"@rabby-wallet/eth-walletconnect-keyring@2.0.0-beta.5": + version "2.0.0-beta.5" + resolved "https://registry.yarnpkg.com/@rabby-wallet/eth-walletconnect-keyring/-/eth-walletconnect-keyring-2.0.0-beta.5.tgz#f3be1f022451bac36b2fa3da9752b161d9d32696" + integrity sha512-1sPflriDw7WjwnR9bvUDOnhM0Oj/1a7uidJ7t+ekJ+VVS3n8doYGScXkqo50awZbMydU8PGeQTzJhjoYIpkR7Q== dependencies: "@ethereumjs/tx" "^3.5.2" - "@rabby-wallet/wc-client" "^1.8.10" + "@walletconnect/sign-client" "^2.10.1" + "@walletconnect/types" "^2.10.1" ethereumjs-util "^7.1.3" events "^3.3.0" web3-utils "^1.6.0" @@ -3578,73 +3579,6 @@ bignumber.js "^9.1.1" web3-eth-abi "^1.8.1" -"@rabby-wallet/wc-browser-utils@^1.8.10": - version "1.8.10" - resolved "https://registry.yarnpkg.com/@rabby-wallet/wc-browser-utils/-/wc-browser-utils-1.8.10.tgz#2af526a814211c1f38f98ba88a13a916774c7219" - integrity sha512-/g+v1MYcRxCFQMtG0Rdnkis37ShQguBIZAQGILFK/km9m4FKtbNUMoJQ4ZNQsxjY0xFdQZf7WXaJqfLrR+aVyg== - dependencies: - "@rabby-wallet/wc-types" "^1.8.10" - "@walletconnect/safe-json" "1.0.0" - "@walletconnect/window-getters" "1.0.0" - "@walletconnect/window-metadata" "1.0.0" - detect-browser "5.2.0" - -"@rabby-wallet/wc-client@^1.8.10": - version "1.8.10" - resolved "https://registry.yarnpkg.com/@rabby-wallet/wc-client/-/wc-client-1.8.10.tgz#87f0b7e037b673c329ed8b12b8f356b6bbda26b6" - integrity sha512-SihfK2pImTGfsm21IB13Iz35sJKfqv6RAtknkBB3Ed3FTN2qWasYfmgjrtKrKc3pYWMe+Y7ux0jTRl3/a+JGww== - dependencies: - "@rabby-wallet/wc-core" "^1.8.10" - "@rabby-wallet/wc-iso-crypto" "^1.8.10" - "@rabby-wallet/wc-types" "^1.8.10" - "@rabby-wallet/wc-utils" "^1.8.10" - -"@rabby-wallet/wc-core@^1.8.10": - version "1.8.10" - resolved "https://registry.yarnpkg.com/@rabby-wallet/wc-core/-/wc-core-1.8.10.tgz#ab1820884a96b757175a45b28dfca855d7010524" - integrity sha512-e6E9NJMe8JISQtMHRr23hjTRUZ5fRVHx7xj9xcGrOrPlhxEK7afJJh/6nScEC8QzHaCEyyyNi4tA9qxeKBR19g== - dependencies: - "@rabby-wallet/wc-socket-transport" "^1.8.10" - "@rabby-wallet/wc-types" "^1.8.10" - "@rabby-wallet/wc-utils" "^1.8.10" - -"@rabby-wallet/wc-iso-crypto@^1.8.10": - version "1.8.10" - resolved "https://registry.yarnpkg.com/@rabby-wallet/wc-iso-crypto/-/wc-iso-crypto-1.8.10.tgz#42879873e275a627d9aeab498c920a1f0b72dd58" - integrity sha512-1EucKl7IOG4OrQJ0m/VGYsh+X6UeBs71hpkrLc38ZZddzDIWs04eHWTUExCeW+oCAo0UQaN8ZBv8zmMzltgOOQ== - dependencies: - "@rabby-wallet/wc-types" "^1.8.10" - "@rabby-wallet/wc-utils" "^1.8.10" - "@walletconnect/crypto" "^1.0.2" - "@walletconnect/encoding" "^1.0.1" - -"@rabby-wallet/wc-socket-transport@^1.8.10": - version "1.8.10" - resolved "https://registry.yarnpkg.com/@rabby-wallet/wc-socket-transport/-/wc-socket-transport-1.8.10.tgz#0bded08a473c7b8292c5a16b02e0864afbb9e4c7" - integrity sha512-tbukHQH3xZOWuGV1ovwMK2HXqnvmIhflArP+w2nfouthg1eu+HvjSXbWNVhTJjh81e6Q+Qp4/1q98H1I7T65ww== - dependencies: - "@rabby-wallet/wc-types" "^1.8.10" - "@rabby-wallet/wc-utils" "^1.8.10" - ws "7.5.3" - -"@rabby-wallet/wc-types@^1.8.10": - version "1.8.10" - resolved "https://registry.yarnpkg.com/@rabby-wallet/wc-types/-/wc-types-1.8.10.tgz#57e52bffe83fbe557f8a22e3f8b7799c84287544" - integrity sha512-wfCzZscdG92iN7n2eNloOTeJQcmo6QHazGwWAGSv/+Txc1lY471nBeYEFcnS4vFInAC7dvfK2dpjGBxm4M0hcw== - -"@rabby-wallet/wc-utils@^1.8.10": - version "1.8.10" - resolved "https://registry.yarnpkg.com/@rabby-wallet/wc-utils/-/wc-utils-1.8.10.tgz#8166f14307022e2757a6dd17fff04bc79028a521" - integrity sha512-/efy0D+JbNYQKb5Y53D481WS/OvT1ZA+qkabq9DqfCCrTKJt+PMCeRDaE/myn8rFJZPvEY7J7iyCV/ofPmwAlw== - dependencies: - "@rabby-wallet/wc-browser-utils" "^1.8.10" - "@rabby-wallet/wc-types" "^1.8.10" - "@walletconnect/encoding" "^1.0.1" - "@walletconnect/jsonrpc-utils" "^1.0.3" - bn.js "4.11.8" - js-sha3 "0.8.0" - query-string "6.13.5" - "@rabby-wallet/widgets@^1.0.9": version "1.0.9" resolved "https://registry.yarnpkg.com/@rabby-wallet/widgets/-/widgets-1.0.9.tgz#91d55bb4488f847636174783e3da73433d5fd298" @@ -3865,6 +3799,140 @@ uri-js "^4.4.1" valid-url "^1.0.9" +"@stablelib/aead@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/aead/-/aead-1.0.1.tgz#c4b1106df9c23d1b867eb9b276d8f42d5fc4c0c3" + integrity sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg== + +"@stablelib/binary@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/binary/-/binary-1.0.1.tgz#c5900b94368baf00f811da5bdb1610963dfddf7f" + integrity sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q== + dependencies: + "@stablelib/int" "^1.0.1" + +"@stablelib/bytes@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/bytes/-/bytes-1.0.1.tgz#0f4aa7b03df3080b878c7dea927d01f42d6a20d8" + integrity sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ== + +"@stablelib/chacha20poly1305@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz#de6b18e283a9cb9b7530d8767f99cde1fec4c2ee" + integrity sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA== + dependencies: + "@stablelib/aead" "^1.0.1" + "@stablelib/binary" "^1.0.1" + "@stablelib/chacha" "^1.0.1" + "@stablelib/constant-time" "^1.0.1" + "@stablelib/poly1305" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/chacha@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha/-/chacha-1.0.1.tgz#deccfac95083e30600c3f92803a3a1a4fa761371" + integrity sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/constant-time@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/constant-time/-/constant-time-1.0.1.tgz#bde361465e1cf7b9753061b77e376b0ca4c77e35" + integrity sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg== + +"@stablelib/ed25519@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stablelib/ed25519/-/ed25519-1.0.3.tgz#f8fdeb6f77114897c887bb6a3138d659d3f35996" + integrity sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg== + dependencies: + "@stablelib/random" "^1.0.2" + "@stablelib/sha512" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hash@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hash/-/hash-1.0.1.tgz#3c944403ff2239fad8ebb9015e33e98444058bc5" + integrity sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg== + +"@stablelib/hkdf@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hkdf/-/hkdf-1.0.1.tgz#b4efd47fd56fb43c6a13e8775a54b354f028d98d" + integrity sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g== + dependencies: + "@stablelib/hash" "^1.0.1" + "@stablelib/hmac" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hmac@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hmac/-/hmac-1.0.1.tgz#3d4c1b8cf194cb05d28155f0eed8a299620a07ec" + integrity sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/int@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/int/-/int-1.0.1.tgz#75928cc25d59d73d75ae361f02128588c15fd008" + integrity sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w== + +"@stablelib/keyagreement@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz#4612efb0a30989deb437cd352cee637ca41fc50f" + integrity sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg== + dependencies: + "@stablelib/bytes" "^1.0.1" + +"@stablelib/poly1305@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/poly1305/-/poly1305-1.0.1.tgz#93bfb836c9384685d33d70080718deae4ddef1dc" + integrity sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.2.tgz#2dece393636489bf7e19c51229dd7900eddf742c" + integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha256@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/sha256/-/sha256-1.0.1.tgz#77b6675b67f9b0ea081d2e31bda4866297a3ae4f" + integrity sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha512@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/sha512/-/sha512-1.0.1.tgz#6da700c901c2c0ceacbd3ae122a38ac57c72145f" + integrity sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/wipe@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" + integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== + +"@stablelib/x25519@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd" + integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== + dependencies: + "@stablelib/keyagreement" "^1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/wipe" "^1.0.1" + "@svgr/babel-plugin-add-jsx-attribute@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" @@ -4842,32 +4910,67 @@ "@typescript-eslint/types" "5.13.0" eslint-visitor-keys "^3.0.0" -"@walletconnect/crypto@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.3.tgz#7b8dd4d7e2884fe3543c7c07aea425eef5ef9dd4" - integrity sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g== +"@walletconnect/core@2.10.1": + version "2.10.1" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.10.1.tgz#d1fb442bd77424666bacdb0f5a07f7708fb3d984" + integrity sha512-WAoXfmj+Zy5q48TnrKUjmHXJCBahzKwbul+noepRZf7JDtUAZ9IOWpUjg+UPRbfK5EiWZ0TF42S6SXidf7EHoQ== + dependencies: + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/jsonrpc-ws-connection" "1.0.13" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/relay-auth" "^1.0.4" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.1" + "@walletconnect/utils" "2.10.1" + events "^3.3.0" + lodash.isequal "4.5.0" + uint8arrays "^3.1.0" + +"@walletconnect/environment@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.1.tgz#1d7f82f0009ab821a2ba5ad5e5a7b8ae3b214cd7" + integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg== dependencies: - "@walletconnect/encoding" "^1.0.2" - "@walletconnect/environment" "^1.0.1" - "@walletconnect/randombytes" "^1.0.3" - aes-js "^3.1.2" - hash.js "^1.1.7" tslib "1.14.1" -"@walletconnect/encoding@^1.0.1", "@walletconnect/encoding@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.2.tgz#cb3942ad038d6a6bf01158f66773062dd25724da" - integrity sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag== +"@walletconnect/events@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/events/-/events-1.0.1.tgz#2b5f9c7202019e229d7ccae1369a9e86bda7816c" + integrity sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ== dependencies: - is-typedarray "1.0.0" + keyvaluestorage-interface "^1.0.0" tslib "1.14.1" - typedarray-to-buffer "3.1.5" -"@walletconnect/environment@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.1.tgz#1d7f82f0009ab821a2ba5ad5e5a7b8ae3b214cd7" - integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg== +"@walletconnect/heartbeat@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@walletconnect/heartbeat/-/heartbeat-1.2.1.tgz#afaa3a53232ae182d7c9cff41c1084472d8f32e9" + integrity sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q== dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/time" "^1.0.2" + tslib "1.14.1" + +"@walletconnect/jsonrpc-provider@1.0.13": + version "1.0.13" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz#9a74da648d015e1fffc745f0c7d629457f53648b" + integrity sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/safe-json" "^1.0.2" + tslib "1.14.1" + +"@walletconnect/jsonrpc-types@1.0.3", "@walletconnect/jsonrpc-types@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz#65e3b77046f1a7fa8347ae02bc1b841abe6f290c" + integrity sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw== + dependencies: + keyvaluestorage-interface "^1.0.0" tslib "1.14.1" "@walletconnect/jsonrpc-types@^1.0.2": @@ -4878,41 +4981,137 @@ keyvaluestorage-interface "^1.0.0" tslib "1.14.1" -"@walletconnect/jsonrpc-utils@^1.0.3": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.7.tgz#1812d17c784f1ec0735bf03d0884287f60bfa2ce" - integrity sha512-zJziApzUF/Il4VcwabnaU+0yo1QI4eUkYX99zmCVTHJvZOf2l0zjADf/OpKqWyeNFC3Io56Z/8uJHVtcNVvyFA== +"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz#82d0cc6a5d6ff0ecc277cb35f71402c91ad48d72" + integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw== dependencies: "@walletconnect/environment" "^1.0.1" + "@walletconnect/jsonrpc-types" "^1.0.3" + tslib "1.14.1" + +"@walletconnect/jsonrpc-ws-connection@1.0.13": + version "1.0.13" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.13.tgz#23b0cdd899801bfbb44a6556936ec2b93ef2adf4" + integrity sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.6" + "@walletconnect/safe-json" "^1.0.2" + events "^3.3.0" + tslib "1.14.1" + ws "^7.5.1" + +"@walletconnect/keyvaluestorage@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.0.2.tgz#92f5ca0f54c1a88a093778842ce0c874d86369c8" + integrity sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ== + dependencies: + safe-json-utils "^1.1.1" + tslib "1.14.1" + +"@walletconnect/logger@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.0.1.tgz#7f489b96e9a1ff6bf3e58f0fbd6d69718bf844a8" + integrity sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ== + dependencies: + pino "7.11.0" + tslib "1.14.1" + +"@walletconnect/relay-api@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.9.tgz#f8c2c3993dddaa9f33ed42197fc9bfebd790ecaf" + integrity sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg== + dependencies: "@walletconnect/jsonrpc-types" "^1.0.2" tslib "1.14.1" -"@walletconnect/randombytes@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.3.tgz#e795e4918367fd1e6a2215e075e64ab93e23985b" - integrity sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw== +"@walletconnect/relay-auth@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz#0b5c55c9aa3b0ef61f526ce679f3ff8a5c4c2c7c" + integrity sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ== dependencies: - "@walletconnect/encoding" "^1.0.2" - "@walletconnect/environment" "^1.0.1" - randombytes "^2.1.0" + "@stablelib/ed25519" "^1.0.2" + "@stablelib/random" "^1.0.1" + "@walletconnect/safe-json" "^1.0.1" + "@walletconnect/time" "^1.0.2" tslib "1.14.1" + uint8arrays "^3.0.0" -"@walletconnect/safe-json@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2" - integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg== +"@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.2.tgz#7237e5ca48046e4476154e503c6d3c914126fa77" + integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA== + dependencies: + tslib "1.14.1" -"@walletconnect/window-getters@1.0.0", "@walletconnect/window-getters@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8" - integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA== +"@walletconnect/sign-client@^2.10.1": + version "2.10.1" + resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.10.1.tgz#db60bc9400cd79f0cb2380067343512b21ee4749" + integrity sha512-iG3eJGi1yXeG3xGeVSSMf8wDFyx239B0prLQfy1uYDtYFb2ynnH/09oqAZyKn96W5nfQzUgM2Mz157PVdloH3Q== + dependencies: + "@walletconnect/core" "2.10.1" + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.1" + "@walletconnect/utils" "2.10.1" + events "^3.3.0" -"@walletconnect/window-metadata@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5" - integrity sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA== +"@walletconnect/time@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/time/-/time-1.0.2.tgz#6c5888b835750ecb4299d28eecc5e72c6d336523" + integrity sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g== dependencies: - "@walletconnect/window-getters" "^1.0.0" + tslib "1.14.1" + +"@walletconnect/types@2.10.1", "@walletconnect/types@^2.10.1": + version "2.10.1" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.10.1.tgz#1355bce236f3eef575716ea3efe4beed98a873ef" + integrity sha512-7pccAhajQdiH2kYywjE1XI64IqRI+4ioyGy0wvz8d0UFQ/DSG3MLKR8jHf5aTOafQQ/HRLz6xvlzN4a7gIVkUQ== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + events "^3.3.0" + +"@walletconnect/utils@2.10.1": + version "2.10.1" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.10.1.tgz#65b37c9800eb0e80a08385b6987471fb46e1e22e" + integrity sha512-DM0dKgm9O58l7VqJEyV2OVv16XRePhDAReI23let6WdW1dSpw/Y/A89Lp99ZJOjLm2FxyblMRF3YRaZtHwBffw== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "^1.0.3" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.1" + "@walletconnect/window-getters" "^1.0.1" + "@walletconnect/window-metadata" "^1.0.1" + detect-browser "5.3.0" + query-string "7.1.3" + uint8arrays "^3.1.0" + +"@walletconnect/window-getters@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" + integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== + dependencies: + tslib "1.14.1" + +"@walletconnect/window-metadata@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz#2124f75447b7e989e4e4e1581d55d25bc75f7be5" + integrity sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA== + dependencies: + "@walletconnect/window-getters" "^1.0.1" + tslib "1.14.1" "@webassemblyjs/ast@1.11.1": version "1.11.1" @@ -5523,6 +5722,11 @@ atob@^2.1.2: resolved "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + autoprefixer@latest: version "10.2.5" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.2.5.tgz#096a0337dbc96c0873526d7fef5de4428d05382d" @@ -5860,11 +6064,6 @@ bn.js@4.11.6: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= -bn.js@4.11.8: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== - bn.js@>4.0.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" @@ -7021,7 +7220,7 @@ decimal.js@^10.2.1: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== -decode-uri-component@^0.2.0: +decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== @@ -7146,10 +7345,10 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-browser@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97" - integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA== +detect-browser@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" + integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== detect-newline@^3.0.0: version "3.1.0" @@ -7334,6 +7533,16 @@ duplexer@^0.1.2: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +duplexify@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" + integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== + dependencies: + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -7377,6 +7586,13 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0, enhanced-resolve@^5.7.0: version "5.12.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" @@ -8256,6 +8472,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-redact@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.3.0.tgz#7c83ce3a7be4898241a46560d51de10f653f7634" + integrity sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ== + fast-safe-stringify@^2.0.6: version "2.0.7" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" @@ -8329,6 +8550,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + finalhandler@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" @@ -9405,7 +9631,7 @@ is-typed-array@^1.1.3: foreach "^2.0.5" has-symbols "^1.0.1" -is-typedarray@1.0.0, is-typedarray@^1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -10303,6 +10529,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.isequal@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -11020,6 +11251,11 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" +multiformats@^9.4.2: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + nan@^2.13.2: version "2.17.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" @@ -11323,6 +11559,11 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +on-exit-leak-free@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" + integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -11335,7 +11576,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -11682,6 +11923,36 @@ pify@^5.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== +pino-abstract-transport@v0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" + integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== + dependencies: + duplexify "^4.1.2" + split2 "^4.0.0" + +pino-std-serializers@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz#1791ccd2539c091ae49ce9993205e2cd5dbba1e2" + integrity sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q== + +pino@7.11.0: + version "7.11.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-7.11.0.tgz#0f0ea5c4683dc91388081d44bff10c83125066f6" + integrity sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.0.0" + on-exit-leak-free "^0.2.0" + pino-abstract-transport v0.5.0 + pino-std-serializers "^4.0.0" + process-warning "^1.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.1.0" + safe-stable-stringify "^2.1.0" + sonic-boom "^2.2.1" + thread-stream "^0.15.1" + pirates@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.4.tgz#07df81e61028e402735cdd49db701e4885b4e6e6" @@ -11910,6 +12181,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process-warning@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" + integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -12049,12 +12325,13 @@ qss@^2.0.3: resolved "https://registry.yarnpkg.com/qss/-/qss-2.0.3.tgz#630b38b120931b52d04704f3abfb0f861604a9ec" integrity sha512-j48ZBT5IZbSqJiSU8EX4XrN8nXiflHvmMvv2XpFc31gh7n6EpSs75bNr6+oj3FOLWyT8m09pTmqLNl34L7/uPQ== -query-string@6.13.5: - version "6.13.5" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8" - integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q== +query-string@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" + integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== dependencies: - decode-uri-component "^0.2.0" + decode-uri-component "^0.2.2" + filter-obj "^1.1.0" split-on-first "^1.0.0" strict-uri-encode "^2.0.0" @@ -12068,6 +12345,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" @@ -12681,6 +12963,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +real-require@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" + integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== + recharts-scale@^0.4.4: version "0.4.5" resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.5.tgz#0969271f14e732e642fcc5bd4ab270d6e87dd1d9" @@ -13080,6 +13367,16 @@ safe-event-emitter@^1.0.1: dependencies: events "^3.0.0" +safe-json-utils@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/safe-json-utils/-/safe-json-utils-1.1.1.tgz#0e883874467d95ab914c3f511096b89bfb3e63b1" + integrity sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ== + +safe-stable-stringify@^2.1.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -13471,6 +13768,13 @@ socks@^2.6.1: ip "^2.0.0" smart-buffer "^4.2.0" +sonic-boom@^2.2.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" + integrity sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg== + dependencies: + atomic-sleep "^1.0.0" + source-map-js@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" @@ -13581,6 +13885,11 @@ split-on-first@^1.0.0: resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -13645,6 +13954,11 @@ stream-browserify@^3.0.0: inherits "~2.0.4" readable-stream "^3.5.0" +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -14024,6 +14338,13 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +thread-stream@^0.15.1: + version "0.15.2" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-0.15.2.tgz#fb95ad87d2f1e28f07116eb23d85aba3bc0425f4" + integrity sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA== + dependencies: + real-require "^0.1.0" + throat@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" @@ -14300,7 +14621,7 @@ type@^2.5.0: resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== -typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: +typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== @@ -14339,6 +14660,13 @@ typescript@^4.5.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== +uint8arrays@^3.0.0, uint8arrays@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" + integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== + dependencies: + multiformats "^9.4.2" + unbox-primitive@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" @@ -15179,16 +15507,16 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@7.5.3: - version "7.5.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" - integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== - ws@^7.2.0, ws@^7.3.1, ws@^7.4.6: version "7.5.7" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== +ws@^7.5.1: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + ws@^8.4.2: version "8.5.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"