From 7a4773511c0ea0bb9d40a343781166d213c78c95 Mon Sep 17 00:00:00 2001 From: Mikhail Mikheev Date: Thu, 13 Aug 2020 15:37:34 +0400 Subject: [PATCH] Safe apps: Extract Iframe messenger to a hook (#1219) * add useLegalConsent hook in apps * useAppList hook wip * fix selecting first app * update persisting app logic * update saveToStorage type * fix crash on apps tab * add appframe comp * add handleIframeLoad func * reuse selectedApp variable in hook * remove initialAppSelected * add types for apps component * fix history types * extract useIframeMessenger hook * fix safe-react-components version * useIframeMessageHandler * update safe-apps-sdk * Fix alignment between app list and app iframe * send safe info on handshake * fix naming/types for url utils * fix types and code cleanup * remove operations * dep bump Co-authored-by: Daniel Sanchez --- package.json | 23 +- src/components/ListContentLayout/List.tsx | 4 + .../components/Apps/AddAppForm/AppUrl.tsx | 8 +- .../components/Apps/components/AppFrame.tsx | 92 ++++ .../components/Apps/confirmTransactions.tsx | 26 +- .../Apps/hooks/useIframeMessageHandler.ts | 173 ++++-- src/routes/safe/components/Apps/index.tsx | 244 ++------- src/routes/safe/components/Layout/index.tsx | 13 +- .../safe/components/Layout/interfaces.d.ts | 14 + src/utils/url.ts | 4 +- yarn.lock | 508 ++++++++++-------- 11 files changed, 613 insertions(+), 496 deletions(-) create mode 100644 src/routes/safe/components/Apps/components/AppFrame.tsx create mode 100644 src/routes/safe/components/Layout/interfaces.d.ts diff --git a/package.json b/package.json index eaa407ed..bed4a6cd 100644 --- a/package.json +++ b/package.json @@ -162,8 +162,9 @@ ] }, "dependencies": { - "@gnosis.pm/safe-contracts": "1.1.1-dev.2", - "@gnosis.pm/safe-react-components": "https://github.com/gnosis/safe-react-components.git#45c746a", + "@gnosis.pm/safe-apps-sdk": "0.3.1", + "@gnosis.pm/safe-contracts": "1.1.1-dev.2", + "@gnosis.pm/safe-react-components": "https://github.com/gnosis/safe-react-components.git#45c746a12661b9c38e839e76022b6a0a92285db7", "@gnosis.pm/util-contracts": "2.0.6", "@ledgerhq/hw-transport-node-hid": "5.19.1", "@material-ui/core": "4.11.0", @@ -173,7 +174,7 @@ "async-sema": "^3.1.0", "axios": "0.19.2", "bignumber.js": "9.0.0", - "bnc-onboard": "1.10.3", + "bnc-onboard": "1.11.0", "classnames": "^2.2.6", "concurrently": "^5.2.0", "connected-react-router": "6.8.0", @@ -229,21 +230,21 @@ }, "devDependencies": { "@testing-library/jest-dom": "5.11.2", - "@testing-library/react": "10.4.7", - "@testing-library/user-event": "12.0.17", + "@testing-library/react": "10.4.8", + "@testing-library/user-event": "12.1.0", "@typechain/web3-v1": "^1.0.0", "@types/history": "4.6.2", - "@types/jest": "^26.0.7", + "@types/jest": "^26.0.9", "@types/lodash.memoize": "^4.1.6", "@types/node": "14.0.27", - "@types/react": "^16.9.43", + "@types/react": "^16.9.44", "@types/react-dom": "^16.9.6", "@types/react-redux": "^7.1.9", "@types/react-router-dom": "^5.1.5", - "@types/styled-components": "^5.1.1", - "@typescript-eslint/eslint-plugin": "3.7.1", - "@typescript-eslint/parser": "3.7.1", - "autoprefixer": "9.8.5", + "@types/styled-components": "^5.1.2", + "@typescript-eslint/eslint-plugin": "3.8.0", + "@typescript-eslint/parser": "3.8.0", + "autoprefixer": "9.8.6", "cross-env": "^7.0.2", "dotenv": "^8.2.0", "dotenv-expand": "^5.1.0", diff --git a/src/components/ListContentLayout/List.tsx b/src/components/ListContentLayout/List.tsx index 4c5d29b0..a197693e 100644 --- a/src/components/ListContentLayout/List.tsx +++ b/src/components/ListContentLayout/List.tsx @@ -11,6 +11,10 @@ const Wrapper = styled.div`` const Item = styled.div` border-bottom: solid 2px rgb(232, 231, 230); + &:last-child { + border-bottom: none; + } + .container { display: flex; align-items: flex-end; diff --git a/src/routes/safe/components/Apps/AddAppForm/AppUrl.tsx b/src/routes/safe/components/Apps/AddAppForm/AppUrl.tsx index 763b27ea..76aa1de2 100644 --- a/src/routes/safe/components/Apps/AddAppForm/AppUrl.tsx +++ b/src/routes/safe/components/Apps/AddAppForm/AppUrl.tsx @@ -7,17 +7,17 @@ import { SafeApp } from 'src/routes/safe/components/Apps/types.d' import { getAppInfoFromUrl, getIpfsLinkFromEns, uniqueApp } from 'src/routes/safe/components/Apps/utils' import { composeValidators, required } from 'src/components/forms/validator' import Field from 'src/components/forms/Field' -import { isValid as isURLValid } from 'src/utils/url' +import { isValidURL } from 'src/utils/url' import { isValidEnsName } from 'src/logic/wallets/ethAddresses' import { useDebounce } from 'src/routes/safe/container/hooks/useDebounce' -const validateUrl = (url: string): string | undefined => (isURLValid(url) ? undefined : 'Invalid URL') +const validateUrl = (url: string): string | undefined => (isValidURL(url) ? undefined : 'Invalid URL') export const appUrlResolver = createDecorator({ field: 'appUrl', updates: { appUrl: async (appUrl: string): Promise => { - const ensContent = !isURLValid(appUrl) && isValidEnsName(appUrl) && (await getIpfsLinkFromEns(appUrl)) + const ensContent = !isValidURL(appUrl) && isValidEnsName(appUrl) && (await getIpfsLinkFromEns(appUrl)) if (ensContent) { return ensContent @@ -40,7 +40,7 @@ export const AppInfoUpdater = ({ onAppInfo }: { onAppInfo: (appInfo: SafeApp) => onAppInfo({ ...appInfo }) } - if (isURLValid(debouncedValue)) { + if (isValidURL(debouncedValue)) { updateAppInfo() } }, [debouncedValue, onAppInfo]) diff --git a/src/routes/safe/components/Apps/components/AppFrame.tsx b/src/routes/safe/components/Apps/components/AppFrame.tsx new file mode 100644 index 00000000..31ddeaef --- /dev/null +++ b/src/routes/safe/components/Apps/components/AppFrame.tsx @@ -0,0 +1,92 @@ +import React, { forwardRef } from 'react' +import styled from 'styled-components' +import { FixedIcon, Loader, Title } from '@gnosis.pm/safe-react-components' +import { useHistory } from 'react-router-dom' +import { SAFELIST_ADDRESS } from 'src/routes/routes' +import { useLegalConsent } from '../hooks/useLegalConsent' +import { SafeApp } from '../types' +import LegalDisclaimer from './LegalDisclaimer' + +const StyledIframe = styled.iframe` + padding: 15px; + box-sizing: border-box; + width: 100%; + height: 100%; +` + +const LoadingContainer = styled.div` + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; +` + +const IframeWrapper = styled.div` + position: relative; + height: 100%; + width: 100%; + overflow: hidden; +` + +const Centered = styled.div` + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +` + +type AppFrameProps = { + selectedApp: SafeApp | undefined + safeAddress: string + network: string + granted: boolean + appIsLoading: boolean + onIframeLoad: () => void +} + +const AppFrame = forwardRef(function AppFrameComponent( + { selectedApp, safeAddress, network, appIsLoading, granted, onIframeLoad }, + iframeRef, +): React.ReactElement { + const history = useHistory() + const { consentReceived, onConsentReceipt } = useLegalConsent() + const redirectToBalance = () => history.push(`${SAFELIST_ADDRESS}/${safeAddress}/balances`) + + if (!selectedApp) { + return null + } + + if (!consentReceived) { + return + } + + if (network === 'UNKNOWN' || !granted) { + return ( + + + To use apps, you must be an owner of this Safe + + ) + } + + return ( + + {appIsLoading && ( + + + + )} + + + ) +}) + +export default AppFrame diff --git a/src/routes/safe/components/Apps/confirmTransactions.tsx b/src/routes/safe/components/Apps/confirmTransactions.tsx index ce24fd77..942dbcc5 100644 --- a/src/routes/safe/components/Apps/confirmTransactions.tsx +++ b/src/routes/safe/components/Apps/confirmTransactions.tsx @@ -1,5 +1,6 @@ import { Icon, ModalFooterConfirmation, Text, Title } from '@gnosis.pm/safe-react-components' -import React, { ReactElement } from 'react' +import { Transaction } from '@gnosis.pm/safe-apps-sdk' +import React from 'react' import styled from 'styled-components' import AddressInfo from 'src/components/AddressInfo' @@ -12,22 +13,9 @@ import Bold from 'src/components/layout/Bold' import Heading from 'src/components/layout/Heading' import Img from 'src/components/layout/Img' import { getEthAsToken } from 'src/logic/tokens/utils/tokenHelpers' +import { OpenModalArgs } from 'src/routes/safe/components/Layout/interfaces' import { humanReadableValue } from 'src/logic/tokens/utils/humanReadableValue' -export type SafeAppTx = { - to: string - value: string | number - data: string -} - -// TODO: This should be exported by safe-rect-components -type GenericModalProps = { - title: ReactElement - body: ReactElement - footer: ReactElement - onClose: () => void -} - const Wrapper = styled.div` margin-bottom: 15px; ` @@ -56,7 +44,7 @@ const StyledTextBox = styled(TextBox)` max-width: 444px; ` -const isTxValid = (t: SafeAppTx): boolean => { +const isTxValid = (t: Transaction): boolean => { if (!['string', 'number'].includes(typeof t.value)) { return false } @@ -75,11 +63,11 @@ const confirmTransactions = ( ethBalance: string, nameApp: string, iconApp: string, - txs: SafeAppTx[], - openModal: (modalInfo: GenericModalProps) => void, + txs: Transaction[], + openModal: (modalInfo: OpenModalArgs) => void, closeModal: () => void, onConfirm: () => void, -): any => { +): void => { const areTxsMalformed = txs.some((t) => !isTxValid(t)) const title = diff --git a/src/routes/safe/components/Apps/hooks/useIframeMessageHandler.ts b/src/routes/safe/components/Apps/hooks/useIframeMessageHandler.ts index 03c3f5c1..6b95c0d6 100644 --- a/src/routes/safe/components/Apps/hooks/useIframeMessageHandler.ts +++ b/src/routes/safe/components/Apps/hooks/useIframeMessageHandler.ts @@ -1,52 +1,131 @@ -import { useEffect } from 'react' +import { useSnackbar } from 'notistack' +import { + InterfaceMessages, + InterfaceMessageToPayload, + SDKMessages, + SDKMessageToPayload, + SDK_MESSAGES, + INTERFACE_MESSAGES, +} from '@gnosis.pm/safe-apps-sdk' +import { useDispatch, useSelector } from 'react-redux' +import { useEffect, useCallback, MutableRefObject } from 'react' +import { OpenModalArgs } from 'src/routes/safe/components/Layout/interfaces' +import { + safeEthBalanceSelector, + safeNameSelector, + safeParamAddressFromStateSelector, +} from 'src/routes/safe/store/selectors' +import { networkSelector } from 'src/logic/wallets/store/selectors' +import { SafeApp } from 'src/routes/safe/components/Apps/types' + +import sendTransactions from '../sendTransactions' +import confirmTransactions from '../confirmTransactions' + +type ReturnType = { + sendMessageToIframe: (messageId: T, data: InterfaceMessageToPayload[T]) => void +} + +interface CustomMessageEvent extends MessageEvent { + data: { + messageId: keyof SDKMessages + data: SDKMessageToPayload[keyof SDKMessages] + } +} + +const useIframeMessageHandler = ( + selectedApp: SafeApp | undefined, + openModal: (modal: OpenModalArgs) => void, + closeModal: () => void, + iframeRef: MutableRefObject, +): ReturnType => { + const { enqueueSnackbar, closeSnackbar } = useSnackbar() + const safeName = useSelector(safeNameSelector) + const safeAddress = useSelector(safeParamAddressFromStateSelector) + const ethBalance = useSelector(safeEthBalanceSelector) + const network = useSelector(networkSelector) + const dispatch = useDispatch() + + const sendMessageToIframe = useCallback( + function (messageId: T, data: InterfaceMessageToPayload[T]) { + if (iframeRef?.current && selectedApp) { + iframeRef.current.contentWindow.postMessage({ messageId, data }, selectedApp.url) + } + }, + [iframeRef, selectedApp], + ) -const useIframeMessageHandler = (): void => { useEffect(() => { - // const handleIframeMessage = (data) => { - // if (!data || !data.messageId) { - // console.error('ThirdPartyApp: A message was received without message id.') - // return - // } - // switch (data.messageId) { - // case operations.SEND_TRANSACTIONS: { - // const onConfirm = async () => { - // closeModal() - // await sendTransactions(dispatch, safeAddress, data.data, enqueueSnackbar, closeSnackbar, selectedApp.id) - // } - // confirmTransactions( - // safeAddress, - // safeName, - // ethBalance, - // selectedApp.name, - // selectedApp.iconUrl, - // data.data, - // openModal, - // closeModal, - // onConfirm, - // ) - // break - // } - // default: { - // console.error(`ThirdPartyApp: A message was received with an unknown message id ${data.messageId}.`) - // break - // } - // } - // } - // const onIframeMessage = async ({ data, origin }) => { - // if (origin === window.origin) { - // return - // } - // if (!selectedApp.url.includes(origin)) { - // console.error(`ThirdPartyApp: A message was received from an unknown origin ${origin}`) - // return - // } - // handleIframeMessage(data) - // } - // window.addEventListener('message', onIframeMessage) - // return () => { - // window.removeEventListener('message', onIframeMessage) - // } - }, []) + const handleIframeMessage = (msg: CustomMessageEvent) => { + if (!msg?.data.messageId) { + console.error('ThirdPartyApp: A message was received without message id.') + return + } + switch (msg.data.messageId) { + case SDK_MESSAGES.SEND_TRANSACTIONS: { + const onConfirm = async () => { + closeModal() + await sendTransactions(dispatch, safeAddress, msg.data.data, enqueueSnackbar, closeSnackbar, selectedApp.id) + } + confirmTransactions( + safeAddress, + safeName, + ethBalance, + selectedApp.name, + selectedApp.iconUrl, + msg.data.data, + openModal, + closeModal, + onConfirm, + ) + break + } + + case SDK_MESSAGES.SAFE_APP_SDK_INITIALIZED: { + sendMessageToIframe(INTERFACE_MESSAGES.ON_SAFE_INFO, { + safeAddress, + network: network, + ethBalance, + }) + break + } + default: { + console.error(`ThirdPartyApp: A message was received with an unknown message id ${msg.data.messageId}.`) + break + } + } + } + const onIframeMessage = async (message: CustomMessageEvent) => { + if (message.origin === window.origin) { + return + } + if (!selectedApp.url.includes(message.origin)) { + console.error(`ThirdPartyApp: A message was received from an unknown origin ${message.origin}`) + return + } + handleIframeMessage(message) + } + + window.addEventListener('message', onIframeMessage) + return () => { + window.removeEventListener('message', onIframeMessage) + } + }, [ + closeModal, + closeSnackbar, + dispatch, + enqueueSnackbar, + ethBalance, + network, + openModal, + safeAddress, + safeName, + selectedApp, + sendMessageToIframe, + ]) + + return { + sendMessageToIframe, + } } export { useIframeMessageHandler } diff --git a/src/routes/safe/components/Apps/index.tsx b/src/routes/safe/components/Apps/index.tsx index 60e29679..c5bbb7e2 100644 --- a/src/routes/safe/components/Apps/index.tsx +++ b/src/routes/safe/components/Apps/index.tsx @@ -1,85 +1,63 @@ -import { Card, FixedIcon, IconText, Loader, Menu, Title } from '@gnosis.pm/safe-react-components' -import { withSnackbar } from 'notistack' -import React, { useCallback, useEffect, useState, useMemo } from 'react' -import { useDispatch, useSelector } from 'react-redux' -import { useHistory } from 'react-router-dom' -import styled from 'styled-components' +import React, { useCallback, useEffect, useRef, useState, useMemo } from 'react' +import { Networks, INTERFACE_MESSAGES } from '@gnosis.pm/safe-apps-sdk' +import { Card, IconText, Loader, Menu, Title } from '@gnosis.pm/safe-react-components' +import { useSelector } from 'react-redux' +import styled, { css } from 'styled-components' import ManageApps from './components/ManageApps' -import confirmTransactions from './confirmTransactions' -import sendTransactions from './sendTransactions' -import LegalDisclaimer from './components/LegalDisclaimer' -import { useLegalConsent } from './hooks/useLegalConsent' +import AppFrame from './components/AppFrame' import { useAppList } from './hooks/useAppList' +import { OpenModalArgs } from 'src/routes/safe/components/Layout/interfaces' import LCL from 'src/components/ListContentLayout' import { networkSelector } from 'src/logic/wallets/store/selectors' -import { SAFELIST_ADDRESS } from 'src/routes/routes' import { grantedSelector } from 'src/routes/safe/container/selector' -import { - safeEthBalanceSelector, - safeNameSelector, - safeParamAddressFromStateSelector, -} from 'src/routes/safe/store/selectors' -import { isSameHref } from 'src/utils/url' +import { safeEthBalanceSelector, safeParamAddressFromStateSelector } from 'src/routes/safe/store/selectors' +import { isSameURL } from 'src/utils/url' +import { useIframeMessageHandler } from './hooks/useIframeMessageHandler' -const StyledCard = styled(Card)` - margin-bottom: 24px; -` -const StyledIframe = styled.iframe` - padding: 15px; - box-sizing: border-box; - width: 100%; - height: 100%; -` -const Centered = styled.div` +const centerCSS = css` display: flex; align-items: center; justify-content: center; - flex-direction: column; ` const LoadingContainer = styled.div` width: 100%; height: 100%; - display: flex; - align-items: center; - justify-content: center; + ${centerCSS}; ` -const CenteredMT = styled(Centered)` +const StyledCard = styled(Card)` + margin-bottom: 24px; + ${centerCSS}; +` + +const CenteredMT = styled.div` + ${centerCSS}; margin-top: 5px; ` -const IframeWrapper = styled.div` - position: relative; - height: 100%; - width: 100%; - overflow: hidden; -` -const operations = { - ON_SAFE_INFO: 'ON_SAFE_INFO', - SAFE_APP_SDK_INITIALIZED: 'SAFE_APP_SDK_INITIALIZED', - SEND_TRANSACTIONS: 'SEND_TRANSACTIONS', +type AppsProps = { + closeModal: () => void + openModal: (modal: OpenModalArgs) => void } -function Apps({ closeModal, closeSnackbar, enqueueSnackbar, openModal }) { +const Apps = ({ closeModal, openModal }: AppsProps): React.ReactElement => { const { appList, loadingAppList, onAppToggle, onAppAdded } = useAppList() const [appIsLoading, setAppIsLoading] = useState(true) const [selectedAppId, setSelectedAppId] = useState() - const [iframeEl, setIframeEl] = useState(null) + const iframeRef = useRef() - const history = useHistory() const granted = useSelector(grantedSelector) - const safeName = useSelector(safeNameSelector) const safeAddress = useSelector(safeParamAddressFromStateSelector) const network = useSelector(networkSelector) const ethBalance = useSelector(safeEthBalanceSelector) - const dispatch = useDispatch() - const { consentReceived, onConsentReceipt } = useLegalConsent() const selectedApp = useMemo(() => appList.find((app) => app.id === selectedAppId), [appList, selectedAppId]) + const enabledApps = useMemo(() => appList.filter((a) => !a.disabled), [appList]) + const { sendMessageToIframe } = useIframeMessageHandler(selectedApp, openModal, closeModal, iframeRef) const onSelectApp = useCallback( (appId) => { @@ -108,151 +86,19 @@ function Apps({ closeModal, closeSnackbar, enqueueSnackbar, openModal }) { } }, [appList, selectedApp, selectedAppId]) - const iframeRef = useCallback((node) => { - if (node !== null) { - setIframeEl(node) - } - }, []) - - const redirectToBalance = () => history.push(`${SAFELIST_ADDRESS}/${safeAddress}/balances`) - - const getContent = () => { - if (!selectedApp) { - return null - } - - if (!consentReceived) { - return - } - - if (network === 'UNKNOWN' || !granted) { - return ( - - - To use apps, you must be an owner of this Safe - - ) - } - - return ( - - {appIsLoading && ( - - - - )} - - - ) - } - - const enabledApps = useMemo(() => appList.filter((a) => !a.disabled), [appList]) - - const sendMessageToIframe = useCallback( - (messageId, data) => { - if (iframeEl && selectedApp) { - iframeEl.contentWindow.postMessage({ messageId, data }, selectedApp.url) - } - }, - [iframeEl, selectedApp], - ) - - // handle messages from iframe - useEffect(() => { - const handleIframeMessage = (data) => { - if (!data || !data.messageId) { - console.error('ThirdPartyApp: A message was received without message id.') - return - } - - switch (data.messageId) { - case operations.SEND_TRANSACTIONS: { - const onConfirm = async () => { - closeModal() - - await sendTransactions(dispatch, safeAddress, data.data, enqueueSnackbar, closeSnackbar, selectedApp.id) - } - - confirmTransactions( - safeAddress, - safeName, - ethBalance, - selectedApp.name, - selectedApp.iconUrl, - data.data, - openModal, - closeModal, - onConfirm, - ) - break - } - - case operations.SAFE_APP_SDK_INITIALIZED: { - sendMessageToIframe(operations.ON_SAFE_INFO, { - safeAddress, - network, - ethBalance, - }) - break - } - - default: { - console.error(`ThirdPartyApp: A message was received with an unknown message id ${data.messageId}.`) - break - } - } - } - - const onIframeMessage = async ({ data, origin }) => { - if (origin === window.origin) { - return - } - - if (!selectedApp.url.includes(origin)) { - console.error(`ThirdPartyApp: A message was received from an unknown origin ${origin}`) - return - } - - handleIframeMessage(data) - } - - window.addEventListener('message', onIframeMessage) - - return () => { - window.removeEventListener('message', onIframeMessage) - } - }) - - // on iframe change - useEffect(() => { - const sendMessageToIframe = (messageId, data) => { - iframeEl.contentWindow.postMessage({ messageId, data }, selectedApp.url) - } - const onIframeLoaded = () => { - setAppIsLoading(false) - sendMessageToIframe(operations.ON_SAFE_INFO, { - safeAddress, - network, - ethBalance, - }) - } - - if (!iframeEl || !selectedApp || !isSameHref(iframeEl.src, selectedApp.url)) { + const handleIframeLoad = useCallback(() => { + const iframe = iframeRef.current + if (!iframe || !selectedApp || !isSameURL(iframe.src, selectedApp.url)) { return } - iframeEl.addEventListener('load', onIframeLoaded) - - return () => { - iframeEl.removeEventListener('load', onIframeLoaded) - } - }, [ethBalance, iframeEl, network, safeAddress, selectedApp]) + setAppIsLoading(false) + sendMessageToIframe(INTERFACE_MESSAGES.ON_SAFE_INFO, { + safeAddress, + network: network as Networks, + ethBalance, + }) + }, [ethBalance, network, safeAddress, selectedApp, sendMessageToIframe]) if (loadingAppList || !appList.length) { return ( @@ -272,13 +118,21 @@ function Apps({ closeModal, closeSnackbar, enqueueSnackbar, openModal }) { - {getContent()} + + + ) : ( - - No Apps Enabled - + No Apps Enabled )} @@ -294,4 +148,4 @@ function Apps({ closeModal, closeSnackbar, enqueueSnackbar, openModal }) { ) } -export default withSnackbar(Apps) +export default Apps diff --git a/src/routes/safe/components/Layout/index.tsx b/src/routes/safe/components/Layout/index.tsx index 063ead25..797a0aee 100644 --- a/src/routes/safe/components/Layout/index.tsx +++ b/src/routes/safe/components/Layout/index.tsx @@ -7,6 +7,7 @@ import { Redirect, Route, Switch, useRouteMatch } from 'react-router-dom' import Receive from '../Balances/Receive' import { styles } from './style' +import { ModalState, OpenModalArgs } from './interfaces' import Modal from 'src/components/Modal' import NoSafe from 'src/components/NoSafe' @@ -48,9 +49,9 @@ const Layout = (props: Props): React.ReactElement => { const { hideSendFunds, onHide, onShow, sendFunds, showReceive, showSendFunds } = props const match = useRouteMatch() - const [modal, setModal] = useState({ + const [modal, setModal] = useState({ isOpen: false, - title: null, + title: '', body: null, footer: null, onClose: null, @@ -62,14 +63,12 @@ const Layout = (props: Props): React.ReactElement => { return } - const openGenericModal = (modalConfig) => { + const openGenericModal = (modalConfig: OpenModalArgs): void => { setModal({ ...modalConfig, isOpen: true }) } - const closeGenericModal = () => { - if (modal.onClose) { - modal.onClose() - } + const closeGenericModal = (): void => { + modal.onClose?.() setModal({ isOpen: false, diff --git a/src/routes/safe/components/Layout/interfaces.d.ts b/src/routes/safe/components/Layout/interfaces.d.ts new file mode 100644 index 00000000..2cfda04d --- /dev/null +++ b/src/routes/safe/components/Layout/interfaces.d.ts @@ -0,0 +1,14 @@ +export interface ModalState { + isOpen: boolean + title: string | React.ReactElement + body: React.ReactNode | null + footer: React.ReactNode | null + onClose: () => unknown +} + +export interface OpenModalArgs { + title: string | React.ReactElement + body: React.ReactNode | null + footer: React.ReactNode | null + onClose: () => unknown +} diff --git a/src/utils/url.ts b/src/utils/url.ts index a9d9dd7a..a4ce1a1c 100644 --- a/src/utils/url.ts +++ b/src/utils/url.ts @@ -1,4 +1,4 @@ -export const isValid = (url, protocolsAllowed = ['https:', 'http:']) => { +export const isValidURL = (url: string, protocolsAllowed = ['https:', 'http:']): boolean => { try { const urlInfo = new URL(url) return protocolsAllowed.includes(urlInfo.protocol) @@ -7,7 +7,7 @@ export const isValid = (url, protocolsAllowed = ['https:', 'http:']) => { } } -export const isSameHref = (url1, url2) => { +export const isSameURL = (url1: string, url2: string): boolean => { try { const a = new URL(url1) const b = new URL(url2) diff --git a/yarn.lock b/yarn.lock index 99597c4d..7311142a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1075,13 +1075,6 @@ core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime@7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" - integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== - dependencies: - regenerator-runtime "^0.12.0" - "@babel/runtime@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.0.tgz#337eda67401f5b066a6f205a3113d4ac18ba495b" @@ -1096,6 +1089,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.11.0": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" + integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.10.4", "@babel/template@^7.4.0", "@babel/template@^7.8.6": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" @@ -1325,6 +1325,11 @@ "@ethersproject/rlp" "^5.0.0" "@ethersproject/signing-key" "^5.0.0" +"@gnosis.pm/safe-apps-sdk@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-sdk/-/safe-apps-sdk-0.3.1.tgz#ebec9ffecfd8a6dbe061ef85a2fc68a3b92ee398" + integrity sha512-2nsmoaPa/C3X+g6EThc4DD7ptSy9fV+RQ507Ly1y01uIzVMRCT0sFcOm0z8oNwCWc5qtY2X4hn00+oR6JdmhUw== + "@gnosis.pm/safe-contracts@1.1.1-dev.2": version "1.1.1-dev.2" resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-contracts/-/safe-contracts-1.1.1-dev.2.tgz#4a5b9a9befe66d15df87d2216237d4ea4f64118f" @@ -1337,7 +1342,7 @@ solc "0.5.14" truffle "^5.1.21" -"@gnosis.pm/safe-react-components@https://github.com/gnosis/safe-react-components.git#45c746a": +"@gnosis.pm/safe-react-components@https://github.com/gnosis/safe-react-components.git#45c746a12661b9c38e839e76022b6a0a92285db7": version "0.2.0" resolved "https://github.com/gnosis/safe-react-components.git#45c746a12661b9c38e839e76022b6a0a92285db7" dependencies: @@ -1593,18 +1598,32 @@ "@ledgerhq/logs" "^5.19.1" rxjs "^6.6.0" +"@ledgerhq/devices@^5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.21.0.tgz#b6dc274536e70513a3ae7df7a9f956ea87adcc49" + integrity sha512-65XZgD2ykK7AJkcJuNEP8WD43HDkudA7NfB34U1T6pmPC6AgWoRYDNpJ23XQ8eiAImETlxv7FaDGUXSEpIQMGQ== + dependencies: + "@ledgerhq/errors" "^5.21.0" + "@ledgerhq/logs" "^5.21.0" + rxjs "^6.6.0" + "@ledgerhq/errors@^5.19.1": version "5.19.1" resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.19.1.tgz#3d25cc0ee92feee35415236c741ef668a106e275" integrity sha512-9v4ishxc2doiR06E/87uJdT7LjnSpnWPftDaBXBm/6KEgjPGtGBCcRW3fkmQTWNE115e6TG9JYRiVRPuqs6GHg== -"@ledgerhq/hw-app-eth@^5.19.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-5.20.0.tgz#59306601c1309e15a948c9b3d06e7dc85480f48e" - integrity sha512-kL+oEJGhkd0A6GahRiDTp8RbheHYV+CQv04O+enQqIPuT++IZvSRlv03lBQNyNziX8b64/ZM+kQHWGesN7w7xg== +"@ledgerhq/errors@^5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.21.0.tgz#2a7bdea62fe7e0bd9ccc3b786d2c179f8f65bc02" + integrity sha512-sGfXoaVGfzrhnexu2TEdgL2FAjM7PUeobWdDBx3DJKE+ARje1y+i5+qg7gyvQL+9k4FV7mW2xMOcnUI3T2Zw0Q== + +"@ledgerhq/hw-app-eth@^5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-5.21.0.tgz#a6857df45cddf29b5e7623237171d7ffba42a44c" + integrity sha512-FKwwqp7IDgCq9ToL/JwO4S3HXr4LSI+Vr6KqeCtpCwRGNdvtiUHF3S9g2LtUroCcGXx9HTr2XL4hZzfrj+2jfg== dependencies: - "@ledgerhq/errors" "^5.19.1" - "@ledgerhq/hw-transport" "^5.19.1" + "@ledgerhq/errors" "^5.21.0" + "@ledgerhq/hw-transport" "^5.21.0" bignumber.js "^9.0.0" rlp "^2.2.6" @@ -1633,14 +1652,14 @@ node-hid "^1.3.0" usb "^1.6.3" -"@ledgerhq/hw-transport-u2f@^5.19.0": - version "5.19.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-5.19.1.tgz#327a98aa9a932114c3d530dabd77459e249b7091" - integrity sha512-jCDx+ZJdHhB+I/aoUZHhgE5aiZdrKkvUHfeUGScR/Ya3MfOHq7otIS+gEi4AIuxK08gXUOWAm1ygKzTCo+KPpw== +"@ledgerhq/hw-transport-u2f@^5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-5.21.0.tgz#7bb14e6a334eccff0e51c3346702561cebc99941" + integrity sha512-D9bbi0ubvNmHbqTAcaxtbgrXRRnoc6qW34m+IO/FRqdPrJTYw3o9y2f0udv8WQZkbNnBvXEksROEvADkr4dj+Q== dependencies: - "@ledgerhq/errors" "^5.19.1" - "@ledgerhq/hw-transport" "^5.19.1" - "@ledgerhq/logs" "^5.19.1" + "@ledgerhq/errors" "^5.21.0" + "@ledgerhq/hw-transport" "^5.21.0" + "@ledgerhq/logs" "^5.21.0" u2f-api "0.2.7" "@ledgerhq/hw-transport@^5.19.1": @@ -1652,11 +1671,25 @@ "@ledgerhq/errors" "^5.19.1" events "^3.1.0" +"@ledgerhq/hw-transport@^5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.21.0.tgz#c94d13397a26e0755824e05613e2257a3d2b450b" + integrity sha512-emVoy+ZEA19z+g6CsDcliVRRYDn4RzdH+zW9F37Z22uoMWslx2VNa+KdcKijmS3V3mkSLjle1cjwprPh61G8hQ== + dependencies: + "@ledgerhq/devices" "^5.21.0" + "@ledgerhq/errors" "^5.21.0" + events "^3.2.0" + "@ledgerhq/logs@^5.19.1": version "5.19.1" resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.19.1.tgz#c3df2b307331ccd373abc78b8ccea02377049256" integrity sha512-nz33IoR3dG3DtJ46AyfLfpdMjGMkwmi21H49wcqVfNAteEe74fzO4cw9fcGMb4ENspYYtmB4LWTSp4gVPRglcg== +"@ledgerhq/logs@^5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.21.0.tgz#19629222e44b4d312e232c2dfbe0d067ecc12830" + integrity sha512-eyPXrKfQ+HSLcITB5MdSWhXlImE2qKWTLT2u6l+a9wiCZl5yimSqn0uC5evxaP0McKOW0wSntgfj+gOoKv+Paw== + "@material-ui/core@4.11.0": version "4.11.0" resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.11.0.tgz#b69b26e4553c9e53f2bfaf1053e216a0af9be15a" @@ -1805,17 +1838,17 @@ xhr "^2.2.0" xtend "^4.0.1" -"@portis/web3@^2.0.0-beta.55": - version "2.0.0-beta.56" - resolved "https://registry.yarnpkg.com/@portis/web3/-/web3-2.0.0-beta.56.tgz#90ef7f0a63f68d80e10cb87aa08acbb92e433af6" - integrity sha512-likffGhd9lKMOiI657rV62NM0ewxLBOQGPoUJPIX2rCx25P9FQ+4CiqEsqCUeofaNra6q+/4EPZgSscNWHa6BQ== +"@portis/web3@^2.0.0-beta.57": + version "2.0.0-beta.57" + resolved "https://registry.yarnpkg.com/@portis/web3/-/web3-2.0.0-beta.57.tgz#45692bffc07687d50fa5204d514590d438b759de" + integrity sha512-OYmt0a171AJECYT/vTkPb4uc1x7xFASMfn+MN3EAjo7DRhY8WfTAMNoMJDhuFARRLC7an2HrRIsT7D4q9GNrnQ== dependencies: "@portis/web3-provider-engine" "1.1.0" ethereumjs-util "5.2.0" penpal "3.0.7" pocket-js-core "0.0.3" -"@restless/sanitizers@^0.2.4": +"@restless/sanitizers@^0.2.5": version "0.2.5" resolved "https://registry.yarnpkg.com/@restless/sanitizers/-/sanitizers-0.2.5.tgz#96a5cfa3edb52abd8fa14e77798738f3a067dbec" integrity sha512-utsOFwv5owNnbj8HijF7uML/AURgUl5YvY4S2gpxQsrp2D1EP/4rQU/HSyYdIQaL89BoZ/5NHveRJrcFyuHo/w== @@ -1962,27 +1995,27 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react@10.4.7": - version "10.4.7" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-10.4.7.tgz#fc14847fb70a5e93576b8f7f0d1490ead02a9061" - integrity sha512-hUYbum3X2f1ZKusKfPaooKNYqE/GtPiQ+D2HJaJ4pkxeNJQFVUEvAvEh9+3QuLdBeTWkDMNY5NSijc5+pGdM4Q== +"@testing-library/react@10.4.8": + version "10.4.8" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-10.4.8.tgz#5eb730291b8fd81cdb2d8877770d060b044ae4a4" + integrity sha512-clgpFR6QHiRRcdhFfAKDhH8UXpNASyfkkANhtCsCVBnai+O+mK1rGtMES+Apc7ql5Wyxu7j8dcLiC4pV5VblHA== dependencies: "@babel/runtime" "^7.10.3" "@testing-library/dom" "^7.17.1" -"@testing-library/user-event@12.0.17": - version "12.0.17" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-12.0.17.tgz#51f48905d62b3c6960fe5ea7a46152d8440f1586" - integrity sha512-Et22bfgnLdowY0VSP8MQuCP9wdrqWMrm9OCXSi3q3rx7ctSvEsC/jYNbgK/MJdDSpVhNVnB+fqm1VhVlDDRN6A== +"@testing-library/user-event@12.1.0": + version "12.1.0" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-12.1.0.tgz#a2597419466a93e338c91baa7bb22d4da0309d1d" + integrity sha512-aH/XuNFpPD6dA+fh754EGqKeAzpH66HpLJYkv9vOAih2yGmTM8JiZ8uisQDGWRPkc6sxE2zCqDwLR4ZskhRCxw== dependencies: "@babel/runtime" "^7.10.2" -"@toruslabs/eccrypto@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@toruslabs/eccrypto/-/eccrypto-1.1.3.tgz#6dcee86670149501efee4865d0acb25366f72237" - integrity sha512-hoLACz9Z6RP/ZH41Ba0iImJpl1f4Zx7pi/d3R7UIrOyt4IOgnWrlkzh2IqQYw4ouae4WZQYSZlyeYv81EWkoxQ== +"@toruslabs/eccrypto@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@toruslabs/eccrypto/-/eccrypto-1.1.4.tgz#2b32e0da10b28a316d08984afcda303536954cd8" + integrity sha512-AQYcd7AM6ePb+V6CZTb6Lb/iaZ/BKpZ66AFdF1YLvMnyBeRY1JgdFOnjQfhtrUAYRMdcc8pBfvjFoWWK7EcggA== dependencies: - acorn "^7.3.1" + acorn "^7.4.0" elliptic "^6.5.3" es6-promise "^4.2.8" nan "^2.14.1" @@ -1997,26 +2030,28 @@ web3-eth-contract "^1.2.9" web3-utils "^1.2.9" -"@toruslabs/http-helpers@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@toruslabs/http-helpers/-/http-helpers-1.3.3.tgz#8564665a0cb9d4f868e5eaf814bbac71926623a2" - integrity sha512-bM0NyFCA+K8DOlhciDLIUQ05/VzuM9lgdwnNSr/gociRhPWbUDc8PkSVKYT3MshXj/ZtLvN9UvcTvY1hddN5UQ== +"@toruslabs/http-helpers@^1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@toruslabs/http-helpers/-/http-helpers-1.3.4.tgz#8811cff562fb792267f79ca5cb5c1bf1bc517e34" + integrity sha512-2Hm34F3GOwg41jEaZs1rVF4b+SGwC2mPeR7WhkkkM1cQNlXyCtcgLNLqlCVrww9e6pfBCZ2h3aEQVw+p4cT4fw== dependencies: deepmerge "^4.2.2" loglevel "^1.6.8" -"@toruslabs/torus-embed@^1.3.0": - version "1.7.3" - resolved "https://registry.yarnpkg.com/@toruslabs/torus-embed/-/torus-embed-1.7.3.tgz#1be2f3404a59cb145b5dd11c82da80cec1d360eb" - integrity sha512-PMmksmG9mgRmFvliHccxV2LdDjrNKQfLojlYG3WMXB0OF3Bj3B7Y94ItSEvVf3XI+Q9xadq1cTAN+wLV3km/BA== +"@toruslabs/torus-embed@^1.8.2": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@toruslabs/torus-embed/-/torus-embed-1.8.2.tgz#6652b8f751c5f041749ccbfcaa0c08ced5f4f278" + integrity sha512-SlApK4BavoQYNenoQxjUs9/rrqrGDK5+Z9coABA6J7pLcbSL7QnBl8bKwTTYhI9Hri2GRbUM8XzNNpZfy5RiIQ== dependencies: "@chaitanyapotti/random-id" "^1.0.3" "@toruslabs/fetch-node-details" "^2.3.0" - "@toruslabs/torus.js" "^2.2.2" + "@toruslabs/http-helpers" "^1.3.4" + "@toruslabs/torus.js" "^2.2.4" create-hash "^1.2.0" deepmerge "^4.2.2" eth-json-rpc-errors "^2.0.2" fast-deep-equal "^3.1.3" + is-stream "^2.0.0" json-rpc-engine "^5.1.8" json-rpc-middleware-stream "^2.1.1" loglevel "^1.6.8" @@ -2027,19 +2062,19 @@ safe-event-emitter "^1.0.1" web3 "^0.20.7" -"@toruslabs/torus.js@^2.2.2": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@toruslabs/torus.js/-/torus.js-2.2.3.tgz#525456e01cddfecf29a7b70b640d0188ffbf819e" - integrity sha512-GryzcqY5/iumfCy0LNUIdjo9iKYRHof6UQzHYK/u2oc4XtCWVKnwk+6OZfuYeurEoW/VDYU+b1MEa7qqOKV9RQ== +"@toruslabs/torus.js@^2.2.4": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@toruslabs/torus.js/-/torus.js-2.2.5.tgz#8994ae7727d980e2c0600b1154d547260ea52ec4" + integrity sha512-fxrIQmtNo4p3uEy5KdiIrZiB32KGPtaV70PoPg/vQB4IL/gjrQSYSIcC0VyP04yBfjHLccJe/HKOhlofpKcjAg== dependencies: - "@toruslabs/eccrypto" "^1.1.3" - "@toruslabs/http-helpers" "^1.3.3" + "@toruslabs/eccrypto" "^1.1.4" + "@toruslabs/http-helpers" "^1.3.4" bn.js "^5.1.2" elliptic "^6.5.3" json-stable-stringify "^1.0.1" loglevel "^1.6.8" memory-cache "^0.2.0" - web3-utils "^1.2.9" + web3-utils "^1.2.11" "@truffle/blockchain-utils@^0.0.11": version "0.0.11" @@ -2270,10 +2305,10 @@ jest-diff "^25.2.1" pretty-format "^25.2.1" -"@types/jest@^26.0.7": - version "26.0.7" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.7.tgz#495cb1d1818c1699dbc3b8b046baf1c86ef5e324" - integrity sha512-+x0077/LoN6MjqBcVOe1y9dpryWnfDZ+Xfo3EqGeBcfPRJlQp3Lw62RvNlWxuGv7kOEwlHriAa54updi3Jvvwg== +"@types/jest@^26.0.9": + version "26.0.9" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.9.tgz#0543b57da5f0cd949c5f423a00c56c492289c989" + integrity sha512-k4qFfJ5AUKrWok5KYXp2EPm89b0P/KZpl7Vg4XuOTVVQEhLDBDBU3iBFrjjdgd8fLw96aAtmnwhXHl63bWeBQQ== dependencies: jest-diff "^25.2.1" pretty-format "^25.2.1" @@ -2422,7 +2457,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.9.43": +"@types/react@*": version "16.9.43" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.43.tgz#c287f23f6189666ee3bebc2eb8d0f84bcb6cdb6b" integrity sha512-PxshAFcnJqIWYpJbLPriClH53Z2WlJcVZE+NP2etUtWQs2s7yIMj3/LDKZT/5CHJ/F62iyjVCDu2H3jHEXIxSg== @@ -2430,6 +2465,14 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/react@^16.9.44": + version "16.9.44" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.44.tgz#da84b179c031aef67dc92c33bd3401f1da2fa3bc" + integrity sha512-BtLoJrXdW8DVZauKP+bY4Kmiq7ubcJq+H/aCpRfvPF7RAT3RwR73Sg8szdc2YasbAlWBDrQ6Q+AFM0KwtQY+WQ== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + "@types/resolve@^0.0.8": version "0.0.8" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" @@ -2456,15 +2499,15 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== -"@types/styled-components@^5.1.1": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.1.tgz#17c3b3a299aa38254189e04a72a8ee009a22e42d" - integrity sha512-fIjKvDU1LJExBZWEQilHqzfpOK4KUwBsj5zC79lxa94ekz8oDQSBNcayMACBImxIuevF+NbBGL9O/2CQ67Zhig== +"@types/styled-components@^5.1.2": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.2.tgz#652af475b4af917b355ea1c3068acae63d46455f" + integrity sha512-HNocYLfrsnNNm8NTS/W53OERSjRA8dx5Bn6wBd2rXXwt4Z3s+oqvY6/PbVt3e6sgtzI63GX//WiWiRhWur08qQ== dependencies: "@types/hoist-non-react-statics" "*" "@types/react" "*" "@types/react-native" "*" - csstype "^2.2.0" + csstype "^3.0.2" "@types/testing-library__jest-dom@^5.9.1": version "5.9.1" @@ -2492,12 +2535,12 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.7.1.tgz#d144c49a9a0ffe8dd704bb179c243df76c111bc9" - integrity sha512-3DB9JDYkMrc8Au00rGFiJLK2Ja9CoMP6Ut0sHsXp3ZtSugjNxvSSHTnKLfo4o+QmjYBJqEznDqsG1zj4F2xnsg== +"@typescript-eslint/eslint-plugin@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.8.0.tgz#f82947bcdd9a4e42be7ad80dfd61f1dc411dd1df" + integrity sha512-lFb4VCDleFSR+eo4Ew+HvrJ37ZH1Y9ZyE+qyP7EiwBpcCVxwmUc5PAqhShCQ8N8U5vqYydm74nss+a0wrrCErw== dependencies: - "@typescript-eslint/experimental-utils" "3.7.1" + "@typescript-eslint/experimental-utils" "3.8.0" debug "^4.1.1" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" @@ -2524,26 +2567,26 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/experimental-utils@3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.7.1.tgz#ab036caaed4c870d22531d41f9352f3147364d61" - integrity sha512-TqE97pv7HrqWcGJbLbZt1v59tcqsSVpWTOf1AqrWK7n8nok2sGgVtYRuGXeNeLw3wXlLEbY1MKP3saB2HsO/Ng== +"@typescript-eslint/experimental-utils@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.8.0.tgz#ac1f7c88322dcfb7635ece6f0441516dd951099a" + integrity sha512-o8T1blo1lAJE0QDsW7nSyvZHbiDzQDjINJKyB44Z3sSL39qBy5L10ScI/XwDtaiunoyKGLiY9bzRk4YjsUZl8w== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.7.1" - "@typescript-eslint/typescript-estree" "3.7.1" + "@typescript-eslint/types" "3.8.0" + "@typescript-eslint/typescript-estree" "3.8.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.7.1.tgz#5d9ccecb116d12d9c6073e9861c57c9b1aa88128" - integrity sha512-W4QV/gXvfIsccN8225784LNOorcm7ch68Fi3V4Wg7gmkWSQRKevO4RrRqWo6N/Z/myK1QAiGgeaXN57m+R/8iQ== +"@typescript-eslint/parser@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.8.0.tgz#8e1dcd404299bf79492409c81c415fa95a7c622b" + integrity sha512-u5vjOBaCsnMVQOvkKCXAmmOhyyMmFFf5dbkM3TIbg3MZ2pyv5peE4gj81UAbTHwTOXEwf7eCQTUMKrDl/+qGnA== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.7.1" - "@typescript-eslint/types" "3.7.1" - "@typescript-eslint/typescript-estree" "3.7.1" + "@typescript-eslint/experimental-utils" "3.8.0" + "@typescript-eslint/types" "3.8.0" + "@typescript-eslint/typescript-estree" "3.8.0" eslint-visitor-keys "^1.1.0" "@typescript-eslint/parser@^2.10.0": @@ -2556,10 +2599,10 @@ "@typescript-eslint/typescript-estree" "2.34.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/types@3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.7.1.tgz#90375606b2fd73c1224fe9e397ee151e28fa1e0c" - integrity sha512-PZe8twm5Z4b61jt7GAQDor6KiMhgPgf4XmUb9zdrwTbgtC/Sj29gXP1dws9yEn4+aJeyXrjsD9XN7AWFhmnUfg== +"@typescript-eslint/types@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.8.0.tgz#58581dd863f86e0cd23353d94362bb90b4bea796" + integrity sha512-8kROmEQkv6ss9kdQ44vCN1dTrgu4Qxrd2kXr10kz2NP5T8/7JnEfYNxCpPkArbLIhhkGLZV3aVMplH1RXQRF7Q== "@typescript-eslint/typescript-estree@2.34.0": version "2.34.0" @@ -2574,13 +2617,13 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/typescript-estree@3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.7.1.tgz#ce1ffbd0fa53f34d4ce851a7a364e392432f6eb3" - integrity sha512-m97vNZkI08dunYOr2lVZOHoyfpqRs0KDpd6qkGaIcLGhQ2WPtgHOd/eVbsJZ0VYCQvupKrObAGTOvk3tfpybYA== +"@typescript-eslint/typescript-estree@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.8.0.tgz#0606d19f629f813dbdd5a34c7a1e895d6191cac6" + integrity sha512-MTv9nPDhlKfclwnplRNDL44mP2SY96YmPGxmMbMy6x12I+pERcxpIUht7DXZaj4mOKKtet53wYYXU0ABaiXrLw== dependencies: - "@typescript-eslint/types" "3.7.1" - "@typescript-eslint/visitor-keys" "3.7.1" + "@typescript-eslint/types" "3.8.0" + "@typescript-eslint/visitor-keys" "3.8.0" debug "^4.1.1" glob "^7.1.6" is-glob "^4.0.1" @@ -2588,107 +2631,107 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/visitor-keys@3.7.1": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.7.1.tgz#b90191e74efdee656be8c5a30f428ed16dda46d1" - integrity sha512-xn22sQbEya+Utj2IqJHGLA3i1jDzR43RzWupxojbSWnj3nnPLavaQmWe5utw03CwYao3r00qzXfgJMGNkrzrAA== +"@typescript-eslint/visitor-keys@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.8.0.tgz#ad35110249fb3fc30a36bfcbfeea93e710cfaab1" + integrity sha512-gfqQWyVPpT9NpLREXNR820AYwgz+Kr1GuF3nf1wxpHD6hdxI62tq03ToomFnDxY0m3pUB39IF7sil7D5TQexLA== dependencies: eslint-visitor-keys "^1.1.0" -"@unilogin/provider@^0.5.21": - version "0.5.21" - resolved "https://registry.yarnpkg.com/@unilogin/provider/-/provider-0.5.21.tgz#bc3aa74750c3fcd2ddcb763279fb58d88f5bc8f5" - integrity sha512-HVMrFIKc6ysxj5F1dz0UFaSIvSMtqw5JBYEzomvtthsw/fNwbT8/I/mA4OCaAJcpuaI1d66X9bZhOrP5GWcwVg== +"@unilogin/provider@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@unilogin/provider/-/provider-0.6.1.tgz#427247f0cb0899d8b0d00c04a4b90ae2a3c2cb40" + integrity sha512-S96uBfoh+/nk8L6Yr+YgEV+FwQgtRnozWhgJpOhmRz128ri5Qv2SXLx5Sac33NGbs8g27PgKOyHX3dKJCvcP3g== dependencies: - "@restless/sanitizers" "^0.2.4" + "@restless/sanitizers" "^0.2.5" reactive-properties "^0.1.11" -"@walletconnect/client@^1.0.18": - version "1.0.18" - resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.0.18.tgz#e3316fc53c0218d69e03bcdbb3c4c9759579b151" - integrity sha512-VgxS4mdsYfp6PQ/W4jVtWGhiQb2wf8hWM+kYMHV21N9UUkOuRBBjDay1Gxq2Tv99+BOF4VI+cpmvjTvsGaT/0A== +"@walletconnect/client@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.1.0.tgz#f2454cba82da3d8c7375b2a5d9d47f34ed7348ec" + integrity sha512-pHxvUDCkD4oP3AFxYLU7yeE+qDZtcHF20b2K8/HNvyuyu3eWFX4jpHgx6FdvcIcFcAXGs5nk24zBUEO8p+axWg== dependencies: - "@walletconnect/core" "^1.0.18" - "@walletconnect/iso-crypto" "^1.0.18" - "@walletconnect/types" "^1.0.18" - "@walletconnect/utils" "^1.0.18" + "@walletconnect/core" "^1.1.0" + "@walletconnect/iso-crypto" "^1.1.0" + "@walletconnect/types" "^1.1.0" + "@walletconnect/utils" "^1.1.0" -"@walletconnect/core@^1.0.18": - version "1.0.18" - resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.0.18.tgz#3632998f8bb8280d64b40506cdbfef51df24d729" - integrity sha512-lpkD8P7l3EDLJswG0L8BrHMck70s+G/KncUnpr0r7eQ4t9Rh+waDBi4g2JBPj9LbRxFZYKiLEcW4r+Oh/85Yhw== +"@walletconnect/core@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.1.0.tgz#053f08b0ccfdfb14ccd27b7fd425d9849cedba14" + integrity sha512-Bhe4gnR6Az11u7OAOw0UDZKM6emUjIQtQ2PVdPDWke6ryC0DWMg9vTYbVPf3lDHBv5hy5eAyDst30N5E91SuYw== dependencies: - "@walletconnect/socket-transport" "^1.0.18" - "@walletconnect/types" "^1.0.18" - "@walletconnect/utils" "^1.0.18" + "@walletconnect/socket-transport" "^1.1.0" + "@walletconnect/types" "^1.1.0" + "@walletconnect/utils" "^1.1.0" -"@walletconnect/http-connection@^1.0.18": - version "1.0.18" - resolved "https://registry.yarnpkg.com/@walletconnect/http-connection/-/http-connection-1.0.18.tgz#eaad192e8262de2b23c4ac8c092d3816eefc7a83" - integrity sha512-ifGNtNglOEU/EwehEFODUuYSV8yS8IW+uzIDVRQC0gK7FIaaQEVwkwmD0ksN8wrgj4z6/8V1JHi7lct+Eo4S0w== +"@walletconnect/http-connection@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@walletconnect/http-connection/-/http-connection-1.1.0.tgz#c6650c12a07244d30f20647420cdcd8c69c6daca" + integrity sha512-ugxDW/NaSgn7rmdPZhrpJIS79gASLvzBnGHScMs8zpYDHwcFxh2DP3HTspC8o5FyMqjRlEGtNi4zSGKY6EOrkw== dependencies: - "@walletconnect/types" "^1.0.18" - "@walletconnect/utils" "^1.0.18" + "@walletconnect/types" "^1.1.0" + "@walletconnect/utils" "^1.1.0" xhr2-cookies "1.1.0" -"@walletconnect/iso-crypto@^1.0.18": - version "1.0.18" - resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.0.18.tgz#4aa5f4c9912048e9880fe945ff7ff7520a6ec347" - integrity sha512-ABpN3Hcwv7AT9N55C/whTz/lWX2RnuhQf4timzbgaawqZ0vJlFlYI9fNdag0T54S8NcWvKXTiwDxRJ8hOiR+3A== +"@walletconnect/iso-crypto@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.1.0.tgz#a8235049c1b239adcf9fc6a6c38b7e9ad13004a6" + integrity sha512-ttWLj4rTy2NGQnSAKnAar1LSrsJuCQ2JnQUl8hsgc9oTwXKgnRvtxGy2Kajoih/tNKnK959Ilj4WI2HaSJ9G1g== dependencies: - "@walletconnect/types" "^1.0.18" - "@walletconnect/utils" "^1.0.18" + "@walletconnect/types" "^1.1.0" + "@walletconnect/utils" "^1.1.0" eccrypto-js "5.2.0" -"@walletconnect/mobile-registry@^1.0.18": - version "1.0.18" - resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.0.18.tgz#6ca311c8a1ad7f803682d3135f61635a8c6f98e1" - integrity sha512-SmBg2t/ucrkXM3624Gn2/8DupsR8984JVscet1xyHTwr78hj69gpJc4yO8+gADpaHKgA2eCQCbKLupqruwqWdA== +"@walletconnect/mobile-registry@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.1.0.tgz#72173a4fcee61f4f8819f6d9fc7cfbf824ed3548" + integrity sha512-OOHQa4NeK2lbfI9WD2d+hTHGwSDzBLoTCeofdLNO2ibaTltQ6S+WNDAVuho6U8CkUTzs5cHPFgLJ6nxYZ8sr/g== -"@walletconnect/qrcode-modal@^1.0.18": - version "1.0.18" - resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.0.18.tgz#4461d31c92ba6b0ad3deb454f91d246c95c7a0c9" - integrity sha512-50XdgUiQPlx95VnBOs8afjLKvvGn4kBT9RrbsDLQ52m/Sn2/yzyoLoEEuk+Wv3t5VkZxTBZ5BeQNpCxTRfYR1Q== +"@walletconnect/qrcode-modal@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.1.0.tgz#4cd0c2c2c713be3f49ef00293a1b23a079d4c7b7" + integrity sha512-vYsu1MBE0D+kx1+xdXmaCs7JqhhWPw8orKk9Br64YIPF5pv/48i+Yi/m28/0myJm54YPlVcgzTnuf8PzAH7jgA== dependencies: - "@walletconnect/mobile-registry" "^1.0.18" - "@walletconnect/types" "^1.0.18" - "@walletconnect/utils" "^1.0.18" + "@walletconnect/mobile-registry" "^1.1.0" + "@walletconnect/types" "^1.1.0" + "@walletconnect/utils" "^1.1.0" preact "10.4.1" qrcode "1.4.4" -"@walletconnect/socket-transport@^1.0.18": - version "1.0.18" - resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.0.18.tgz#49395772b17de9f2ee42312db5cd692b0eabe16b" - integrity sha512-UQclrEM4uExqbF3snAxhZil0XMlxufmlMZUNgfFe+io9K3H/FH7kILIMqow0Y7EhxUL++bVsVGTEjurDz4sYzw== +"@walletconnect/socket-transport@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.1.0.tgz#d80b5e6b3b904f131961259ca16de816ae2b003b" + integrity sha512-plo5WHjL3RTDENH7MTgs7D/ePGHfSuc/HLzkVGvgZSOtoPlRR916nSZNeL4bStYF1ZRJCrds10x36C0DlZjpQg== dependencies: - "@walletconnect/types" "^1.0.18" + "@walletconnect/types" "^1.1.0" ws "7.3.0" -"@walletconnect/types@^1.0.18": - version "1.0.18" - resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.0.18.tgz#7b5b2bffe4451f3128f34d3c31bb99a6fd023152" - integrity sha512-gGu3rAcmdeauLxOZo5X4KYzBhxoxpGCHzd7LEcgcsLIhx/4cUqk3lirElO4WozeUkQyy28yEBTLUA6bASFsFpQ== +"@walletconnect/types@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.1.0.tgz#1e4efbf033ad89910cbb86f1f381cd5fe7e764fd" + integrity sha512-cgDEuYHZZTiaXFRwQs3Zhhar+l2T58/YjhWrfZTMKWuc77geIbF7682i9lE9bNEQqQvQ76jjKxJfSLGjCu++sA== -"@walletconnect/utils@^1.0.18": - version "1.0.18" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.0.18.tgz#730a8dbccbce9582b74761cb3faa1cc1cc4328d7" - integrity sha512-isq7brCnZJj82QEd/34TjM4qrZcTe2PjvFuvrkhtS0c3T+Qaq0sZ6HzJA2Mctu0Uv33vqI7VDgsIkuecD0KYWw== +"@walletconnect/utils@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.1.0.tgz#7b0bcf5c77e8079ac055013537a9620244db2da9" + integrity sha512-y5v8PCmd/2kASOncYaz5QJiAzwBRT5MK398PmIkImX9tNEeBh00ifeQGZKkCGi6JYXbde0UC5jsGTGkH8hdxeg== dependencies: - "@walletconnect/types" "^1.0.18" + "@walletconnect/types" "^1.1.0" detect-browser "5.1.0" enc-utils "2.1.0" js-sha3 "0.8.0" -"@walletconnect/web3-provider@^1.0.13": - version "1.0.18" - resolved "https://registry.yarnpkg.com/@walletconnect/web3-provider/-/web3-provider-1.0.18.tgz#4ca86a3841dfdb1854681bd6da7b7466cf03ae20" - integrity sha512-XvbdvMJq8P977uYpCsibt2wpZgQ5qRPBMK22jO0kmUuHdxuctqVQI+zqrnpeFzjQQi5wRvBRb3x15aSFUCo+Lg== +"@walletconnect/web3-provider@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@walletconnect/web3-provider/-/web3-provider-1.1.0.tgz#c8a30c4121d3ade159022b10d3a18ecd804c8993" + integrity sha512-1DaYG+aK2pjCBKXrB0c2JKeFk27ObUsu09LlZN1VvIi1+zvHftaubNsSGViLmrq25w72yPle/SDjhgmxvKVMQQ== dependencies: - "@walletconnect/client" "^1.0.18" - "@walletconnect/http-connection" "^1.0.18" - "@walletconnect/qrcode-modal" "^1.0.18" - "@walletconnect/types" "^1.0.18" - "@walletconnect/utils" "^1.0.18" + "@walletconnect/client" "^1.1.0" + "@walletconnect/http-connection" "^1.1.0" + "@walletconnect/qrcode-modal" "^1.1.0" + "@walletconnect/types" "^1.1.0" + "@walletconnect/utils" "^1.1.0" web3-provider-engine "15.0.12" "@webassemblyjs/ast@1.8.5": @@ -2919,11 +2962,16 @@ acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.1.1, acorn@^7.3.1: +acorn@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== +acorn@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" + integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== + address@1.1.2, address@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" @@ -3419,7 +3467,20 @@ authereum@^0.0.4-beta.157: web3-provider-engine "15.0.4" web3-utils "1.2.1" -autoprefixer@9.8.5, autoprefixer@^9.6.1: +autoprefixer@9.8.6: + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +autoprefixer@^9.6.1: version "9.8.5" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.5.tgz#2c225de229ddafe1d1424c02791d0c3e10ccccaa" integrity sha512-C2p5KkumJlsTHoNv9w31NrBRgXhf6eCMteJuHZi2xhkgC+5Vm40MEtCKPhc0qdgAOhox0YPy1SQHTAky05UoKg== @@ -4285,29 +4346,28 @@ bn.js@^5.1.1, bn.js@^5.1.2: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== -bnc-onboard@1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/bnc-onboard/-/bnc-onboard-1.10.3.tgz#c05ce2af4d5538f0be51a08eea30e2264f830fd2" - integrity sha512-4zH1CNaiyn6cYkAak4swaVa+1EpFzgJI8ZA8GL1A/SJqyig699h9gq60P+0R8Ga5xo2Pzr/WaVpy4jMUgcXPbQ== +bnc-onboard@1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/bnc-onboard/-/bnc-onboard-1.11.0.tgz#cb3d79b702a15d12114aa649beddb2ec5ea83e70" + integrity sha512-hHB+xb6SULRxQh/Bm5DBEfg/4/QLI/B9q/h3AyMf+21FMmJ66DUODDsoIwbiq1fh3IrwHpoSmNLdb2nTeN0Wog== dependencies: - "@ledgerhq/hw-app-eth" "^5.19.0" - "@ledgerhq/hw-transport-u2f" "^5.19.0" - "@portis/web3" "^2.0.0-beta.55" - "@toruslabs/torus-embed" "^1.3.0" - "@unilogin/provider" "^0.5.21" - "@walletconnect/web3-provider" "^1.0.13" + "@ledgerhq/hw-app-eth" "^5.21.0" + "@ledgerhq/hw-transport-u2f" "^5.21.0" + "@portis/web3" "^2.0.0-beta.57" + "@toruslabs/torus-embed" "^1.8.2" + "@unilogin/provider" "^0.6.1" + "@walletconnect/web3-provider" "^1.1.0" authereum "^0.0.4-beta.157" bignumber.js "^9.0.0" bnc-sdk "^2.1.4" - bowser "^2.5.2" + bowser "^2.10.0" ethereumjs-tx "^2.1.2" - ethereumjs-util "^6.2.0" - ethereumjs-wallet "^0.6.3" - fortmatic "^0.8.2" - hdkey "^1.1.1" - regenerator-runtime "^0.13.3" + ethereumjs-util "^7.0.3" + fortmatic "^2.2.1" + hdkey "^2.0.1" + regenerator-runtime "^0.13.7" squarelink "^1.1.4" - trezor-connect "^8.1.2" + trezor-connect "^8.1.9" walletlink "^2.0.2" web3-provider-engine "^15.0.4" @@ -4357,7 +4417,7 @@ boolean@^3.0.0, boolean@^3.0.1: resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.1.tgz#35ecf2b4a2ee191b0b44986f14eb5f052a5cbb4f" integrity sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA== -bowser@^2.5.2: +bowser@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.10.0.tgz#be3736f161c4bb8b10958027ab99465d2a811198" integrity sha512-OCsqTQboTEWWsUjcp5jLSw2ZHsBiv2C105iFs61bOT0Hnwi9p7/uuXdd7mu8RYcarREfdjNN+8LitmEHATsLYg== @@ -4837,6 +4897,11 @@ caniuse-lite@^1.0.30001097: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001104.tgz#4e3d5b3b1dd3c3529f10cb7f519c62ba3e579f5d" integrity sha512-pkpCg7dmI/a7WcqM2yfdOiT4Xx5tzyoHAXWsX5/HxZ3TemwDZs0QXdqbE0UPLPVy/7BeK7693YfzfRYfu1YVpg== +caniuse-lite@^1.0.30001109: + version "1.0.30001111" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001111.tgz#dd0ce822c70eb6c7c068e4a55c22e19ec1501298" + integrity sha512-xnDje2wchd/8mlJu8sXvWxOGvMgv+uT3iZ3bkIAynKOzToCssWCmkz/ZIkQBs/2pUB4uwnJKVORWQ31UkbVjOg== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -5190,7 +5255,7 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" -colorette@^1.2.0: +colorette@^1.2.0, colorette@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== @@ -5887,6 +5952,11 @@ csstype@^2.2.0, csstype@^2.5.2, csstype@^2.6.5, csstype@^2.6.7: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.11.tgz#452f4d024149ecf260a852b025e36562a253ffc5" integrity sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw== +csstype@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.2.tgz#ee5ff8f208c8cd613b389f7b222c9801ca62b3f7" + integrity sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw== + currency-flags@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/currency-flags/-/currency-flags-2.1.2.tgz#483bbc69fcc7f0de00ec3a781047767311feba9d" @@ -7529,7 +7599,7 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0: +ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== @@ -7542,6 +7612,18 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumjs-util@^6.2.0: ethjs-util "0.1.6" rlp "^2.2.3" +ethereumjs-util@^7.0.3: + version "7.0.4" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.4.tgz#f4b2022a91416bf421b35b0d5b81c21e8abd8b7f" + integrity sha512-isldtbCn9fdnhBPxedMNbFkNWVZ8ZdQvKRDSrdflame/AycAPKMer+vEpndpBxYIB3qxN6bd3Gh1YCQW9LDkCQ== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.4" + ethereumjs-vm@2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.2.2.tgz#786317d2c63e547d936c1a468607510e70b4c262" @@ -7652,7 +7734,7 @@ eventemitter3@4.0.4, eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== -events@^3.0.0, events@^3.1.0: +events@^3.0.0, events@^3.1.0, events@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== @@ -8214,12 +8296,10 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -fortmatic@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/fortmatic/-/fortmatic-0.8.2.tgz#a93fc97d1a1808faf82210d6554e1ebdcb6c5379" - integrity sha512-eIuoTpDzK0CN92yOQyEbKoFuaBgxqXjmNMmUbvTphirKPkufSyYkqgHHuAJzgFe3HC5JFuWb/IlrMvqWoe/gKQ== - dependencies: - "@babel/runtime" "7.3.4" +fortmatic@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/fortmatic/-/fortmatic-2.2.1.tgz#91ce9159c1fe539bd87e483125fca5c27a410a86" + integrity sha512-PEfPoErJSErU2A8iYD2Mab2c8eJK5dCdCr1jR/8yc49aEAlyQ4UXnZXyeO6MU5zBGkDAZmg9brnRSPzc+8MKPQ== forwarded@~0.1.2: version "0.1.2" @@ -8797,14 +8877,14 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hdkey@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-1.1.2.tgz#c60f9cf6f90fbf24a8a52ea06893f36a0108cd3e" - integrity sha512-PTQ4VKu0oRnCrYfLp04iQZ7T2Cxz0UsEXYauk2j8eh6PJXCpbXuCFhOmtIFtbET0i3PMWmHN9J11gU8LEgUljQ== +hdkey@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-2.0.1.tgz#0a211d0c510bfc44fa3ec9d44b13b634641cad74" + integrity sha512-c+tl9PHG9/XkGgG0tD7CJpRVaE0jfZizDNmnErUAKQ4EjQSOcOUcV3EN9ZEZS8pZ4usaeiiK0H7stzuzna8feA== dependencies: bs58check "^2.1.2" safe-buffer "^5.1.1" - secp256k1 "^3.0.1" + secp256k1 "^4.0.0" he@1.2.0, he@^1.2.0: version "1.2.0" @@ -14481,16 +14561,16 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.12.0: - version "0.12.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" - integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== - regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: version "0.13.6" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.6.tgz#d236043c46ffab2968c1ef651803d8acdea8ed65" integrity sha512-GmwlGiazQEbOwQWDdbbaP10i15pGtScYWLbMZuu+RKRz0cZ+g8IUONazBnaZqe7j1670IV1HgE4/8iy7CQPf4Q== +regenerator-runtime@^0.13.7: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -14846,7 +14926,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.6: +rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4, rlp@^2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== @@ -15070,7 +15150,7 @@ secp256k1@3.8.0, secp256k1@^3.0.1, secp256k1@^3.7.1, secp256k1@^3.8.0: nan "^2.14.0" safe-buffer "^5.1.2" -secp256k1@^4.0.1: +secp256k1@^4.0.0, secp256k1@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== @@ -16505,14 +16585,14 @@ tree-kill@^1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -trezor-connect@^8.1.2: - version "8.1.8" - resolved "https://registry.yarnpkg.com/trezor-connect/-/trezor-connect-8.1.8.tgz#db46f2637047fa45fef3f5a7c6f16a792cc2067a" - integrity sha512-ZTgKmSd5scbUAdHwz6DLwILVoNRe//6fQcuaVDL0tbWHvB5MNajGlLDzPG/TM7y156mzXmXF2Y4LJQqLDQhaIw== +trezor-connect@^8.1.9: + version "8.1.10" + resolved "https://registry.yarnpkg.com/trezor-connect/-/trezor-connect-8.1.10.tgz#1f80525c91684e7dc062f2e5eb6d93502e61172b" + integrity sha512-q1Hscxjyr1PtZj02yRu9rKps9VrSZ4koXgE8DM1QES2Sc7buhNqHwvRZQLQopUDXSoZh2vgObQNBrJsNHbWBpg== dependencies: - "@babel/runtime" "^7.10.2" - events "^3.1.0" - whatwg-fetch "^3.0.0" + "@babel/runtime" "^7.11.0" + events "^3.2.0" + whatwg-fetch "^3.3.1" trim-newlines@^1.0.0: version "1.0.0" @@ -18014,6 +18094,7 @@ websocket@^1.0.31: dependencies: debug "^2.2.0" es5-ext "^0.10.50" + gulp "^4.0.2" nan "^2.14.0" typedarray-to-buffer "^3.1.5" yaeti "^0.0.6" @@ -18035,6 +18116,11 @@ whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.2.0.tgz#8e134f701f0a4ab5fda82626f113e2b647fd16dc" integrity sha512-SdGPoQMMnzVYThUbSrEvqTlkvC1Ux27NehaJ/GUHBfNrh5Mjg+1/uRyFMwVnxO2MrikMWvWAqUGgQOfVU4hT7w== +whatwg-fetch@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.3.1.tgz#6c1acf37dec176b0fd6bc9a74b616bec2f612935" + integrity sha512-faXTmGDcLuEPBpJwb5LQfyxvubKiE+RlbmmweFGKjvIPFj4uHTTfdtTIkdTRhC6OSH9S9eyYbx8kZ0UEaQqYTA== + whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"