From 171528d4182a64bf1aa9951088456e1479308d2e Mon Sep 17 00:00:00 2001 From: Mikhail Mikheev Date: Thu, 23 Apr 2020 17:48:09 +0400 Subject: [PATCH 01/34] refactor transaction confirmation owner property --- .../addressBook/store/selectors/index.js | 24 +++++++++---------- src/logic/addressBook/utils/index.js | 11 --------- .../IncomingTxDescription/index.jsx | 5 ++-- .../OwnersColumn/OwnerComponent.jsx | 16 ++++++------- .../ExpandedTx/OwnersColumn/OwnersList.jsx | 4 ++-- .../ExpandedTx/OwnersColumn/index.jsx | 22 +++++++++-------- .../ExpandedTx/TxDescription/index.jsx | 11 +++++---- src/routes/safe/container/selector.js | 16 +++++++++++-- .../safe/store/actions/fetchTransactions.js | 24 ++++--------------- src/routes/safe/store/models/confirmation.js | 5 ++-- src/routes/safe/store/selectors/index.js | 23 ------------------ 11 files changed, 64 insertions(+), 97 deletions(-) diff --git a/src/logic/addressBook/store/selectors/index.js b/src/logic/addressBook/store/selectors/index.js index edef7837..19a5c213 100644 --- a/src/logic/addressBook/store/selectors/index.js +++ b/src/logic/addressBook/store/selectors/index.js @@ -1,7 +1,6 @@ /* eslint-disable import/named */ // @flow import { List, Map } from 'immutable' -import { useSelector } from 'react-redux' import { Selector, createSelector } from 'reselect' import type { AddressBook } from '~/logic/addressBook/model/addressBook' @@ -36,14 +35,15 @@ export const getAddressBookListSelector: Selector { - if (!userAddress) { - return null - } - const addressBook = useSelector(getAddressBook) - const result = addressBook.filter((addressBookItem) => addressBookItem.address === userAddress) - if (result.size > 0) { - return result.get(0).name - } - return null -} +export const getNameFromAddressBook = (userAddress: string): string | null => + createSelector(getAddressBook, (addressBook: AddressBook, address: string) => { + if (!address) { + return 'UNKNOWN' + } + + const adbkEntry = addressBook.find((addressBookItem) => addressBookItem.address === userAddress) + if (adbkEntry) { + return adbkEntry.name + } + return 'UNKNOWN' + }) diff --git a/src/logic/addressBook/utils/index.js b/src/logic/addressBook/utils/index.js index 52d98617..dbb77c82 100644 --- a/src/logic/addressBook/utils/index.js +++ b/src/logic/addressBook/utils/index.js @@ -1,8 +1,5 @@ // @flow -import { useSelector } from 'react-redux' - import type { AddressBook, AddressBookProps } from '~/logic/addressBook/model/addressBook' -import { getAddressBook } from '~/logic/addressBook/store/selectors' import type { Owner } from '~/routes/safe/store/models/owner' import { loadFromStorage, saveToStorage } from '~/utils/storage' @@ -33,14 +30,6 @@ const getNameFromAdbk = (addressBook: AddressBook, userAddress: string): string return null } -export const getNameFromAddressBook = (userAddress: string): string | null => { - if (!userAddress) { - return null - } - const addressBook = useSelector(getAddressBook) - return getNameFromAdbk(addressBook, userAddress) -} - export const getOwnersWithNameFromAddressBook = (addressBook: AddressBook, ownerList: List) => { if (!ownerList) { return [] diff --git a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/IncomingTxDescription/index.jsx b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/IncomingTxDescription/index.jsx index a7107233..a15bf48f 100644 --- a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/IncomingTxDescription/index.jsx +++ b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/IncomingTxDescription/index.jsx @@ -1,11 +1,12 @@ // @flow import { makeStyles } from '@material-ui/core/styles' import React from 'react' +import { useSelector } from 'react-redux' import EtherscanLink from '~/components/EtherscanLink' import Block from '~/components/layout/Block' import Bold from '~/components/layout/Bold' -import { getNameFromAddressBook } from '~/logic/addressBook/utils' +import { getNameFromAddressBook } from '~/logic/addressBook/store/selectors' import OwnerAddressTableCell from '~/routes/safe/components/Settings/ManageOwners/OwnerAddressTableCell' import { getIncomingTxAmount } from '~/routes/safe/components/Transactions/TxsTable/columns' import type { IncomingTransaction } from '~/routes/safe/store/models/incomingTransaction' @@ -46,7 +47,7 @@ const TransferDescription = ({ from, txFromName, value = '' }: TransferDescProps const IncomingTxDescription = ({ tx }: Props) => { const classes = useStyles() - const txFromName = getNameFromAddressBook(tx.from) + const txFromName = useSelector(getNameFromAddressBook(tx.from)) return ( diff --git a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnerComponent.jsx b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnerComponent.jsx index 6a882b30..d97bf860 100644 --- a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnerComponent.jsx +++ b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnerComponent.jsx @@ -2,6 +2,7 @@ import { withStyles } from '@material-ui/core/styles' import cn from 'classnames' import React from 'react' +import { useSelector } from 'react-redux' import CancelSmallFilledCircle from './assets/cancel-small-filled.svg' import ConfirmSmallFilledCircle from './assets/confirm-small-filled.svg' @@ -16,8 +17,7 @@ import Block from '~/components/layout/Block' import Button from '~/components/layout/Button' import Img from '~/components/layout/Img' import Paragraph from '~/components/layout/Paragraph' -import { getNameFromAddressBook } from '~/logic/addressBook/utils' -import { type Owner } from '~/routes/safe/store/models/owner' +import { getNameFromAddressBook } from '~/logic/addressBook/store/selectors' export const CONFIRM_TX_BTN_TEST_ID = 'confirm-btn' export const EXECUTE_TX_BTN_TEST_ID = 'execute-btn' @@ -32,7 +32,7 @@ type OwnerProps = { onTxReject?: Function, onTxConfirm: Function, onTxExecute: Function, - owner: Owner, + owner: string, showRejectBtn: boolean, showExecuteRejectBtn: boolean, showConfirmBtn: boolean, @@ -57,8 +57,8 @@ const OwnerComponent = ({ thresholdReached, userAddress, }: OwnerProps) => { - const nameInAdbk = getNameFromAddressBook(owner.address) - const ownerName = nameInAdbk || owner.name + const nameInAdbk = useSelector(getNameFromAddressBook(owner)) + const ownerName = nameInAdbk || 'UNKNOWN' const [imgCircle, setImgCircle] = React.useState(ConfirmSmallGreyCircle) React.useMemo(() => { @@ -77,15 +77,15 @@ const OwnerComponent = ({
- + {ownerName} - + - {owner.address === userAddress && ( + {owner === userAddress && ( {isCancelTx ? ( <> diff --git a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnersList.jsx b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnersList.jsx index 55f2856f..4389fc0e 100644 --- a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnersList.jsx +++ b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnersList.jsx @@ -48,7 +48,7 @@ const OwnersList = ({ confirmed executor={executor} isCancelTx={isCancelTx} - key={owner.address} + key={owner} onTxExecute={onTxExecute} onTxReject={onTxReject} owner={owner} @@ -64,7 +64,7 @@ const OwnersList = ({ classes={classes} executor={executor} isCancelTx={isCancelTx} - key={owner.address} + key={owner} onTxConfirm={onTxConfirm} onTxExecute={onTxExecute} onTxReject={onTxReject} diff --git a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/index.jsx b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/index.jsx index 054e8234..70ad08bf 100644 --- a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/index.jsx +++ b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/index.jsx @@ -41,7 +41,7 @@ function getOwnersConfirmations(tx, userAddress) { let currentUserAlreadyConfirmed = false tx.confirmations.forEach((conf) => { - if (conf.owner.address === userAddress) { + if (conf.owner === userAddress) { currentUserAlreadyConfirmed = true } @@ -54,18 +54,20 @@ function getOwnersConfirmations(tx, userAddress) { } function getPendingOwnersConfirmations(owners, tx, userAddress) { - const ownersUnconfirmed = owners.filter( - (owner) => tx.confirmations.findIndex((conf) => conf.owner.address === owner.address) === -1, - ) + const ownersNotConfirmed = [] + let currentUserNotConfirmed = true - let userIsUnconfirmedOwner = false - - ownersUnconfirmed.some((owner) => { - userIsUnconfirmedOwner = owner.address === userAddress - return userIsUnconfirmedOwner + owners.forEach((owner) => { + const confirmationsEntry = tx.confirmations.find((conf) => conf.owner === owner.address) + if (!confirmationsEntry) { + ownersNotConfirmed.push(owner.address) + } + if (confirmationsEntry && confirmationsEntry.owner === userAddress) { + currentUserNotConfirmed = false + } }) - return [ownersUnconfirmed, userIsUnconfirmedOwner] + return [ownersNotConfirmed, currentUserNotConfirmed] } const OwnersColumn = ({ diff --git a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/index.jsx b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/index.jsx index dd09fcec..184091e8 100644 --- a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/index.jsx +++ b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/index.jsx @@ -1,6 +1,7 @@ // @flow import { withStyles } from '@material-ui/core/styles' import React, { useState } from 'react' +import { useSelector } from 'react-redux' import { getTxData } from './utils' @@ -9,7 +10,7 @@ import Block from '~/components/layout/Block' import Bold from '~/components/layout/Bold' import LinkWithRef from '~/components/layout/Link' import Paragraph from '~/components/layout/Paragraph' -import { getNameFromAddressBook } from '~/logic/addressBook/utils' +import { getNameFromAddressBook } from '~/logic/addressBook/store/selectors' import { SAFE_METHODS_NAMES } from '~/logic/contracts/methodIds' import { shortVersionOf } from '~/logic/wallets/ethAddresses' import OwnerAddressTableCell from '~/routes/safe/components/Settings/ManageOwners/OwnerAddressTableCell' @@ -68,7 +69,7 @@ type CustomDescProps = { } const TransferDescription = ({ amount = '', recipient }: TransferDescProps) => { - const recipientName = getNameFromAddressBook(recipient) + const recipientName = useSelector(getNameFromAddressBook(recipient)) return ( Send {amount} to: @@ -82,7 +83,7 @@ const TransferDescription = ({ amount = '', recipient }: TransferDescProps) => { } const RemovedOwner = ({ removedOwner }: { removedOwner: string }) => { - const ownerChangedName = getNameFromAddressBook(removedOwner) + const ownerChangedName = useSelector(getNameFromAddressBook(removedOwner)) return ( @@ -97,7 +98,7 @@ const RemovedOwner = ({ removedOwner }: { removedOwner: string }) => { } const AddedOwner = ({ addedOwner }: { addedOwner: string }) => { - const ownerChangedName = getNameFromAddressBook(addedOwner) + const ownerChangedName = useSelector(getNameFromAddressBook(addedOwner)) return ( @@ -161,7 +162,7 @@ const SettingsDescription = ({ action, addedOwner, newThreshold, removedOwner }: const CustomDescription = ({ amount = 0, classes, data, recipient }: CustomDescProps) => { const [showTxData, setShowTxData] = useState(false) - const recipientName = getNameFromAddressBook(recipient) + const recipientName = useSelector(getNameFromAddressBook(recipient)) return ( <> diff --git a/src/routes/safe/container/selector.js b/src/routes/safe/container/selector.js index cfb16f39..7d6e3c09 100644 --- a/src/routes/safe/container/selector.js +++ b/src/routes/safe/container/selector.js @@ -58,7 +58,7 @@ const getTxStatus = (tx: Transaction, userAddress: string, safe: Safe): Transact } else if (!tx.confirmations.size) { txStatus = 'pending' } else { - const userConfirmed = tx.confirmations.filter((conf) => conf.owner.address === userAddress).size === 1 + const userConfirmed = tx.confirmations.filter((conf) => conf.owner === userAddress).size === 1 const userIsSafeOwner = safe.owners.filter((owner) => owner.address === userAddress).size === 1 txStatus = !userConfirmed && userIsSafeOwner ? 'awaiting_your_confirmation' : 'awaiting_confirmations' } @@ -122,11 +122,23 @@ const extendedTransactionsSelector: Selector< safeTransactionsSelector, safeCancellationTransactionsSelector, safeIncomingTransactionsSelector, - (safe, userAddress, transactions, cancellationTransactions, incomingTransactions) => { + getAddressBook, + (safe, userAddress, transactions, cancellationTransactions, incomingTransactions, addressBook) => { const cancellationTransactionsByNonce = cancellationTransactions.reduce((acc, tx) => acc.set(tx.nonce, tx), Map()) const extendedTransactions = transactions.map((tx: Transaction) => { let extendedTx = tx + // add owner names to confirmations + const txConfirmations = tx.get('confirmations').map((confirmation) => { + const confirmationOwnerAdbkEntry = addressBook.find((adbkEntry) => adbkEntry.address === confirmation.owner) + + return confirmation.set( + 'ownerName', + (confirmationOwnerAdbkEntry && confirmationOwnerAdbkEntry.name) || 'UNKNOWN', + ) + }) + extendedTx = tx.set('confirmations', txConfirmations) + if (!tx.isExecuted) { if ( (cancellationTransactionsByNonce.get(tx.nonce) && diff --git a/src/routes/safe/store/actions/fetchTransactions.js b/src/routes/safe/store/actions/fetchTransactions.js index dd6413df..e96f61fc 100644 --- a/src/routes/safe/store/actions/fetchTransactions.js +++ b/src/routes/safe/store/actions/fetchTransactions.js @@ -11,7 +11,6 @@ import { addTransactions } from './addTransactions' import { decodeParamsFromSafeMethod } from '~/logic/contracts/methodIds' import { buildIncomingTxServiceUrl } from '~/logic/safe/transactions/incomingTxHistory' import { type TxServiceType, buildTxServiceUrl } from '~/logic/safe/transactions/txHistory' -import { getLocalSafe } from '~/logic/safe/utils' import { getTokenInfos } from '~/logic/tokens/store/actions/fetchTokens' import { ALTERNATIVE_TOKEN_ABI } from '~/logic/tokens/utils/alternativeAbi' import { @@ -27,7 +26,6 @@ import { getWeb3 } from '~/logic/wallets/getWeb3' import { addCancellationTransactions } from '~/routes/safe/store/actions/addCancellationTransactions' import { makeConfirmation } from '~/routes/safe/store/models/confirmation' import { type IncomingTransaction, makeIncomingTransaction } from '~/routes/safe/store/models/incomingTransaction' -import { makeOwner } from '~/routes/safe/store/models/owner' import type { TransactionProps } from '~/routes/safe/store/models/transaction' import { type Transaction, makeTransaction } from '~/routes/safe/store/models/transaction' import { type GlobalState } from '~/store' @@ -74,27 +72,15 @@ type IncomingTxServiceModel = { } export const buildTransactionFrom = async (safeAddress: string, tx: TxServiceModel): Promise => { - const localSafe = await getLocalSafe(safeAddress) - const confirmations = List( - tx.confirmations.map((conf: ConfirmationServiceModel) => { - let ownerName = 'UNKNOWN' - - if (localSafe && localSafe.owners) { - const storedOwner = localSafe.owners.find((owner) => sameAddress(conf.owner, owner.address)) - - if (storedOwner) { - ownerName = storedOwner.name - } - } - - return makeConfirmation({ - owner: makeOwner({ address: conf.owner, name: ownerName }), + tx.confirmations.map((conf: ConfirmationServiceModel) => + makeConfirmation({ + owner: conf.owner, type: ((conf.confirmationType.toLowerCase(): any): TxServiceType), hash: conf.transactionHash, signature: conf.signature, - }) - }), + }), + ), ) const modifySettingsTx = sameAddress(tx.to, safeAddress) && Number(tx.value) === 0 && !!tx.data const cancellationTx = sameAddress(tx.to, safeAddress) && Number(tx.value) === 0 && !tx.data diff --git a/src/routes/safe/store/models/confirmation.js b/src/routes/safe/store/models/confirmation.js index f37d51f8..90d47a89 100644 --- a/src/routes/safe/store/models/confirmation.js +++ b/src/routes/safe/store/models/confirmation.js @@ -3,17 +3,16 @@ import { Record } from 'immutable' import type { RecordFactory, RecordOf } from 'immutable' import { type TxServiceType } from '~/logic/safe/transactions/txHistory' -import { type Owner, makeOwner } from '~/routes/safe/store/models/owner' export type ConfirmationProps = { - owner: Owner, + owner: string, type: TxServiceType, hash: string, signature?: string, } export const makeConfirmation: RecordFactory = Record({ - owner: makeOwner(), + owner: '', type: 'initialised', hash: '', signature: null, diff --git a/src/routes/safe/store/selectors/index.js b/src/routes/safe/store/selectors/index.js index ff6c677d..a7a6652e 100644 --- a/src/routes/safe/store/selectors/index.js +++ b/src/routes/safe/store/selectors/index.js @@ -5,7 +5,6 @@ import { type OutputSelector, createSelector, createStructuredSelector } from 'r import { getWeb3 } from '~/logic/wallets/getWeb3' import { SAFELIST_ADDRESS, SAFE_PARAM_ADDRESS } from '~/routes/routes' -import { type Confirmation } from '~/routes/safe/store/models/confirmation' import type { IncomingTransaction } from '~/routes/safe/store/models/incomingTransaction' import { type Safe } from '~/routes/safe/store/models/safe' import { type Transaction } from '~/routes/safe/store/models/transaction' @@ -29,10 +28,6 @@ export type SafeProps = { safeAddress: string, } -type TransactionProps = { - transaction: Transaction, -} - const safesStateSelector = (state: GlobalState): Map => state[SAFE_REDUCER_ID] export const safesMapSelector = (state: GlobalState): Map => state[SAFE_REDUCER_ID].get('safes') @@ -68,8 +63,6 @@ const cancellationTransactionsSelector = (state: GlobalState): CancelTransaction const incomingTransactionsSelector = (state: GlobalState): IncomingTransactionsState => state[INCOMING_TRANSACTIONS_REDUCER_ID] -const oneTransactionSelector = (state: GlobalState, props: TransactionProps) => props.transaction - export const safeParamAddressSelector = (state: GlobalState, props: RouterProps) => { const urlAdd = props.match.params[SAFE_PARAM_ADDRESS] return urlAdd ? getWeb3().utils.toChecksumAddress(urlAdd) : '' @@ -148,22 +141,6 @@ export const safeIncomingTransactionsSelector: IncomingTxSelectorType = createSe }, ) -export const confirmationsTransactionSelector: OutputSelector = createSelector( - oneTransactionSelector, - (tx: Transaction) => { - if (!tx) { - return 0 - } - - const confirmations: List = tx.get('confirmations') - if (!confirmations) { - return 0 - } - - return confirmations.filter((confirmation: Confirmation) => confirmation.get('type') === 'confirmation').count() - }, -) - export type SafeSelectorProps = Safe | typeof undefined export const safeSelector: OutputSelector = createSelector( From 0e9b6d2cc1a7a2aee65ca80dd2e650d9f02e6977 Mon Sep 17 00:00:00 2001 From: Mikhail Mikheev Date: Thu, 23 Apr 2020 18:14:49 +0400 Subject: [PATCH 02/34] fix getNameFromAddressBook selector & selector calls --- src/logic/addressBook/store/selectors/index.js | 11 +++++++---- .../ExpandedTx/IncomingTxDescription/index.jsx | 2 +- .../ExpandedTx/OwnersColumn/OwnerComponent.jsx | 7 +++---- .../TxsTable/ExpandedTx/TxDescription/index.jsx | 8 ++++---- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/logic/addressBook/store/selectors/index.js b/src/logic/addressBook/store/selectors/index.js index 19a5c213..41857384 100644 --- a/src/logic/addressBook/store/selectors/index.js +++ b/src/logic/addressBook/store/selectors/index.js @@ -35,15 +35,18 @@ export const getAddressBookListSelector: Selector - createSelector(getAddressBook, (addressBook: AddressBook, address: string) => { +export const getNameFromAddressBook = createSelector( + getAddressBookListSelector, + (_, address) => address, + (addressBook: Map, address: string) => { if (!address) { return 'UNKNOWN' } - const adbkEntry = addressBook.find((addressBookItem) => addressBookItem.address === userAddress) + const adbkEntry = addressBook.find((addressBookItem) => addressBookItem.address === address) if (adbkEntry) { return adbkEntry.name } return 'UNKNOWN' - }) + }, +) diff --git a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/IncomingTxDescription/index.jsx b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/IncomingTxDescription/index.jsx index a15bf48f..25b58f74 100644 --- a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/IncomingTxDescription/index.jsx +++ b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/IncomingTxDescription/index.jsx @@ -47,7 +47,7 @@ const TransferDescription = ({ from, txFromName, value = '' }: TransferDescProps const IncomingTxDescription = ({ tx }: Props) => { const classes = useStyles() - const txFromName = useSelector(getNameFromAddressBook(tx.from)) + const txFromName = useSelector((state) => getNameFromAddressBook(state, tx.from)) return ( diff --git a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnerComponent.jsx b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnerComponent.jsx index d97bf860..49623be6 100644 --- a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnerComponent.jsx +++ b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnerComponent.jsx @@ -57,8 +57,7 @@ const OwnerComponent = ({ thresholdReached, userAddress, }: OwnerProps) => { - const nameInAdbk = useSelector(getNameFromAddressBook(owner)) - const ownerName = nameInAdbk || 'UNKNOWN' + const nameInAdbk = useSelector((state) => getNameFromAddressBook(state, owner)) const [imgCircle, setImgCircle] = React.useState(ConfirmSmallGreyCircle) React.useMemo(() => { @@ -80,7 +79,7 @@ const OwnerComponent = ({ - {ownerName} + {nameInAdbk} @@ -140,7 +139,7 @@ const OwnerComponent = ({ )} )} - {owner.address === executor && Executor} + {owner === executor && Executor} ) } diff --git a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/index.jsx b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/index.jsx index 184091e8..b5e0be78 100644 --- a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/index.jsx +++ b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/index.jsx @@ -69,7 +69,7 @@ type CustomDescProps = { } const TransferDescription = ({ amount = '', recipient }: TransferDescProps) => { - const recipientName = useSelector(getNameFromAddressBook(recipient)) + const recipientName = useSelector((state) => getNameFromAddressBook(state, recipient)) return ( Send {amount} to: @@ -83,7 +83,7 @@ const TransferDescription = ({ amount = '', recipient }: TransferDescProps) => { } const RemovedOwner = ({ removedOwner }: { removedOwner: string }) => { - const ownerChangedName = useSelector(getNameFromAddressBook(removedOwner)) + const ownerChangedName = useSelector((state) => getNameFromAddressBook(state, removedOwner)) return ( @@ -98,7 +98,7 @@ const RemovedOwner = ({ removedOwner }: { removedOwner: string }) => { } const AddedOwner = ({ addedOwner }: { addedOwner: string }) => { - const ownerChangedName = useSelector(getNameFromAddressBook(addedOwner)) + const ownerChangedName = useSelector((state) => getNameFromAddressBook(state, addedOwner)) return ( @@ -162,7 +162,7 @@ const SettingsDescription = ({ action, addedOwner, newThreshold, removedOwner }: const CustomDescription = ({ amount = 0, classes, data, recipient }: CustomDescProps) => { const [showTxData, setShowTxData] = useState(false) - const recipientName = useSelector(getNameFromAddressBook(recipient)) + const recipientName = useSelector((state) => getNameFromAddressBook(state, recipient)) return ( <> From cff53e76c9b0a3f0bd7eb3a3a99a2e1dd67c54bf Mon Sep 17 00:00:00 2001 From: Mikhail Mikheev Date: Thu, 23 Apr 2020 18:16:10 +0400 Subject: [PATCH 03/34] fix selector --- src/logic/addressBook/store/selectors/index.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/logic/addressBook/store/selectors/index.js b/src/logic/addressBook/store/selectors/index.js index 41857384..b840d5fb 100644 --- a/src/logic/addressBook/store/selectors/index.js +++ b/src/logic/addressBook/store/selectors/index.js @@ -39,14 +39,11 @@ export const getNameFromAddressBook = createSelector( getAddressBookListSelector, (_, address) => address, (addressBook: Map, address: string) => { - if (!address) { - return 'UNKNOWN' - } - const adbkEntry = addressBook.find((addressBookItem) => addressBookItem.address === address) if (adbkEntry) { return adbkEntry.name } + return 'UNKNOWN' }, ) From 2acef6993c7738cd0a0d48bc519bada1204a5058 Mon Sep 17 00:00:00 2001 From: Mikhail Mikheev Date: Thu, 23 Apr 2020 18:22:30 +0400 Subject: [PATCH 04/34] remove extending transaction model with ownerName in extendedTransactionsSelector --- src/routes/safe/container/selector.js | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/routes/safe/container/selector.js b/src/routes/safe/container/selector.js index 7d6e3c09..71027511 100644 --- a/src/routes/safe/container/selector.js +++ b/src/routes/safe/container/selector.js @@ -122,23 +122,11 @@ const extendedTransactionsSelector: Selector< safeTransactionsSelector, safeCancellationTransactionsSelector, safeIncomingTransactionsSelector, - getAddressBook, - (safe, userAddress, transactions, cancellationTransactions, incomingTransactions, addressBook) => { + (safe, userAddress, transactions, cancellationTransactions, incomingTransactions) => { const cancellationTransactionsByNonce = cancellationTransactions.reduce((acc, tx) => acc.set(tx.nonce, tx), Map()) const extendedTransactions = transactions.map((tx: Transaction) => { let extendedTx = tx - // add owner names to confirmations - const txConfirmations = tx.get('confirmations').map((confirmation) => { - const confirmationOwnerAdbkEntry = addressBook.find((adbkEntry) => adbkEntry.address === confirmation.owner) - - return confirmation.set( - 'ownerName', - (confirmationOwnerAdbkEntry && confirmationOwnerAdbkEntry.name) || 'UNKNOWN', - ) - }) - extendedTx = tx.set('confirmations', txConfirmations) - if (!tx.isExecuted) { if ( (cancellationTransactionsByNonce.get(tx.nonce) && From c887c71b05df409213e6b3825e320a0e88f2d15c Mon Sep 17 00:00:00 2001 From: fernandomg Date: Thu, 23 Apr 2020 12:45:37 -0300 Subject: [PATCH 05/34] fix: batchRequest params order --- src/routes/safe/store/actions/fetchTransactions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/safe/store/actions/fetchTransactions.js b/src/routes/safe/store/actions/fetchTransactions.js index df08296f..d8808b4e 100644 --- a/src/routes/safe/store/actions/fetchTransactions.js +++ b/src/routes/safe/store/actions/fetchTransactions.js @@ -339,7 +339,7 @@ export const loadSafeTransactions = async (safeAddress: string, getState: GetSta const txsWithData = await batchRequestTxsData(transactions) // In case that the etags don't match, we parse the new transactions and save them to the cache const txsRecord: Array> = await Promise.all( - txsWithData.map(([tx: TxServiceModel, decimals, symbol, name, code]) => + txsWithData.map(([tx: TxServiceModel, decimals, code, symbol, name]) => buildTransactionFrom(safeAddress, tx, knownTokens, decimals, symbol, name, code), ), ) From cdcdd07b234d1af472f97220bc96652bedfbb2ec Mon Sep 17 00:00:00 2001 From: fernandomg Date: Thu, 23 Apr 2020 12:47:19 -0300 Subject: [PATCH 06/34] fix: execute decodeParams for all sendTokenTxs --- .../safe/store/actions/fetchTransactions.js | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/routes/safe/store/actions/fetchTransactions.js b/src/routes/safe/store/actions/fetchTransactions.js index d8808b4e..c9ef0d11 100644 --- a/src/routes/safe/store/actions/fetchTransactions.js +++ b/src/routes/safe/store/actions/fetchTransactions.js @@ -133,24 +133,26 @@ export const buildTransactionFrom = async ( let symbol = txTokenSymbol || 'ETH' let decimals = txTokenDecimals || 18 let decodedParams - if (isSendTokenTx && (txTokenSymbol === null || txTokenDecimals === null)) { - try { - const [tokenSymbol, tokenDecimals] = await Promise.all( - generateBatchRequests({ - abi: ALTERNATIVE_TOKEN_ABI, - address: tx.to, - methods: ['symbol', 'decimals'], - }), - ) + if (isSendTokenTx) { + if (txTokenSymbol === null || txTokenDecimals === null) { + try { + const [tokenSymbol, tokenDecimals] = await Promise.all( + generateBatchRequests({ + abi: ALTERNATIVE_TOKEN_ABI, + address: tx.to, + methods: ['symbol', 'decimals'], + }), + ) - symbol = tokenSymbol - decimals = tokenDecimals - } catch (e) { - // some contracts may implement the same methods as in ERC20 standard - // we may falsely treat them as tokens, so in case we get any errors when getting token info - // we fallback to displaying custom transaction - isSendTokenTx = false - customTx = true + symbol = tokenSymbol + decimals = tokenDecimals + } catch (e) { + // some contracts may implement the same methods as in ERC20 standard + // we may falsely treat them as tokens, so in case we get any errors when getting token info + // we fallback to displaying custom transaction + isSendTokenTx = false + customTx = true + } } const params = web3.eth.abi.decodeParameters(['address', 'uint256'], tx.data.slice(10)) From 55eee73ea735c11a445f3d717797bfd10ca9f94e Mon Sep 17 00:00:00 2001 From: fernandomg Date: Thu, 23 Apr 2020 12:48:19 -0300 Subject: [PATCH 07/34] fix: proper amount display for tx in TxTable --- src/routes/safe/components/Transactions/TxsTable/columns.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/safe/components/Transactions/TxsTable/columns.js b/src/routes/safe/components/Transactions/TxsTable/columns.js index 80b576ad..b0741c5c 100644 --- a/src/routes/safe/components/Transactions/TxsTable/columns.js +++ b/src/routes/safe/components/Transactions/TxsTable/columns.js @@ -46,7 +46,7 @@ export const getTxAmount = (tx: Transaction) => { if (tx.isTokenTransfer && tx.decodedParams) { const tokenDecimals = tx.decimals.toNumber ? tx.decimals.toNumber() : tx.decimals - txAmount = `${new BigNumber(tx.decodedParams.value).div(10 ** tokenDecimals).toString()} ${tx.symbol}` + txAmount = `${new BigNumber(tx.decodedParams.value).div(10 ** tokenDecimals).toFixed()} ${tx.symbol}` } else if (Number(tx.value) > 0) { txAmount = `${fromWei(toBN(tx.value), 'ether')} ${tx.symbol}` } From 97800ffcea0208ef42036bb2acf14e0dbce7a808 Mon Sep 17 00:00:00 2001 From: Mati Dastugue Date: Thu, 23 Apr 2020 15:09:39 -0300 Subject: [PATCH 08/34] Added support for wallets dashboard --- .../ProviderDetails/UserDetails.jsx | 21 ++++++++++++++++++- src/components/Header/index.jsx | 5 +++++ src/logic/wallets/utils/walletList.js | 1 - 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/components/Header/components/ProviderDetails/UserDetails.jsx b/src/components/Header/components/ProviderDetails/UserDetails.jsx index 03933adc..bc8a78ac 100644 --- a/src/components/Header/components/ProviderDetails/UserDetails.jsx +++ b/src/components/Header/components/ProviderDetails/UserDetails.jsx @@ -29,6 +29,7 @@ type Props = { userAddress: string, classes: Object, onDisconnect: Function, + openDashboard?: Function, } const styles = () => ({ @@ -72,6 +73,15 @@ const styles = () => ({ }, disconnect: { padding: `${md} ${lg}`, + '& button': { + background: '#f02525', + }, + }, + dashboard: { + padding: `${md} ${lg} ${xs}`, + }, + dashboardText: { + letterSpacing: '1px', }, disconnectText: { letterSpacing: '1px', @@ -92,7 +102,7 @@ const styles = () => ({ }, }) -const UserDetails = ({ classes, connected, network, onDisconnect, provider, userAddress }: Props) => { +const UserDetails = ({ classes, connected, network, onDisconnect, openDashboard, provider, userAddress }: Props) => { const status = connected ? 'Connected' : 'Connection error' const address = userAddress ? shortVersionOf(userAddress, 4) : 'Address not available' const identiconAddress = userAddress || 'random' @@ -154,6 +164,15 @@ const UserDetails = ({ classes, connected, network, onDisconnect, provider, user + {openDashboard && ( + + + + )} { /> - {currencyName === currencyValueSelected ? ( + {currencyName === selectedCurrency ? ( checked diff --git a/src/store/index.js b/src/store/index.js index 51ed1f28..4c75b999 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -15,6 +15,7 @@ import { nftTokensReducer, } from '~/logic/collectibles/store/reducer/collectibles' import cookies, { COOKIES_REDUCER_ID } from '~/logic/cookies/store/reducer/cookies' +import currencyValuesStorageMiddleware from '~/logic/currencyValues/store/middleware' import currencyValues, { CURRENCY_VALUES_KEY } from '~/logic/currencyValues/store/reducer/currencyValues' import currentSession, { CURRENT_SESSION_REDUCER_ID, @@ -55,6 +56,7 @@ const finalCreateStore = composeEnhancers( providerWatcher, notificationsMiddleware, addressBookMiddleware, + currencyValuesStorageMiddleware, ), ) From 051080c239fdf833018c1139272328afeb7ad882 Mon Sep 17 00:00:00 2001 From: Richard Meissner Date: Thu, 7 May 2020 13:47:51 +0200 Subject: [PATCH 23/34] Fix #834: Do not remove trailing slash from Safe app url (#839) * Fix #834: Do not remove trailing slash from Safe app url * Use correct url in id * prevent adding existing App * Limiting App name length persisted in origin field Co-authored-by: Richard Meissner Co-authored-by: nicosampler --- src/routes/safe/components/Apps/ManageApps.js | 15 ++++++++--- src/routes/safe/components/Apps/utils.js | 27 +++++++++++-------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/routes/safe/components/Apps/ManageApps.js b/src/routes/safe/components/Apps/ManageApps.js index 972477ab..acec7f35 100644 --- a/src/routes/safe/components/Apps/ManageApps.js +++ b/src/routes/safe/components/Apps/ManageApps.js @@ -13,6 +13,7 @@ import GnoForm from '~/components/forms/GnoForm' import { required } from '~/components/forms/validator' import Img from '~/components/layout/Img' import appsIconSvg from '~/routes/safe/components/Transactions/TxsTable/TxType/assets/appsIcon.svg' +import { isValid as isURLValid } from '~/utils/url' const FORM_ID = 'add-apps-form' @@ -51,9 +52,7 @@ type Props = { } const urlValidator = (value: string) => { - return /(?:^|[ \t])((https?:\/\/)?(?:localhost|[\w-]+(?:\.[\w-]+)+)(:\d+)?(\/\S*)?)/gm.test(value) - ? undefined - : 'Please, provide a valid url' + return isURLValid(value) ? undefined : 'Please, provide a valid url' } const composeValidatorsApps = (...validators: Function[]): FieldValidator => (value: Field, values, meta) => { @@ -92,7 +91,15 @@ const ManageApps = ({ appList, onAppAdded, onAppToggle }: Props) => { } const uniqueAppValidator = (value) => { - const exists = appList.find((a) => a.url === value.trim()) + const exists = appList.find((a) => { + try { + const currentUrl = new URL(a.url) + const newUrl = new URL(value) + return currentUrl.href === newUrl.href + } catch (error) { + return 'There was a problem trying to validate the URL existence.' + } + }) return exists ? 'This app is already registered.' : undefined } diff --git a/src/routes/safe/components/Apps/utils.js b/src/routes/safe/components/Apps/utils.js index 70965b29..defed2fc 100644 --- a/src/routes/safe/components/Apps/utils.js +++ b/src/routes/safe/components/Apps/utils.js @@ -29,40 +29,45 @@ export const getAppInfoFromUrl = async (appUrl: string) => { return res } - let cleanedUpAppUrl = appUrl.trim() - if (cleanedUpAppUrl.substr(-1) === '/') { - cleanedUpAppUrl = cleanedUpAppUrl.substr(0, cleanedUpAppUrl.length - 1) - res.url = cleanedUpAppUrl + res.url = appUrl.trim() + let noTrailingSlashUrl = res.url + if (noTrailingSlashUrl.substr(-1) === '/') { + noTrailingSlashUrl = noTrailingSlashUrl.substr(0, noTrailingSlashUrl.length - 1) } try { - const appInfo = await axios.get(`${cleanedUpAppUrl}/manifest.json`) + const appInfo = await axios.get(`${noTrailingSlashUrl}/manifest.json`) // verify imported app fulfil safe requirements if (!appInfo || !appInfo.data || !appInfo.data.name || !appInfo.data.description) { throw Error('The app does not fulfil the structure required.') } + // the DB origin field has a limit of 100 characters + const originFieldSize = 100 + const jsonDataLength = 20 + const remainingSpace = originFieldSize - res.url.length - jsonDataLength + res = { ...res, ...appInfo.data, - id: JSON.stringify({ url: cleanedUpAppUrl, name: appInfo.data.name }), + id: JSON.stringify({ url: res.url, name: appInfo.data.name.substring(0, remainingSpace) }), error: false, } + if (appInfo.data.iconPath) { try { - const iconInfo = await axios.get(`${cleanedUpAppUrl}/${appInfo.data.iconPath}`) + const iconInfo = await axios.get(`${noTrailingSlashUrl}/${appInfo.data.iconPath}`, { timeout: 1000 * 10 }) if (/image\/\w/gm.test(iconInfo.headers['content-type'])) { - res.iconUrl = `${cleanedUpAppUrl}/${appInfo.data.iconPath}` + res.iconUrl = `${noTrailingSlashUrl}/${appInfo.data.iconPath}` } } catch (error) { - console.error(`It was not possible to fetch icon from app ${cleanedUpAppUrl}`) + console.error(`It was not possible to fetch icon from app ${res.url}`) } } - return res } catch (error) { - console.error(`It was not possible to fetch app from ${cleanedUpAppUrl}: ${error.message}`) + console.error(`It was not possible to fetch app from ${res.url}: ${error.message}`) return res } } From e63cd145afac15a7fee138cc1f519bb4bdda3947 Mon Sep 17 00:00:00 2001 From: Mati Dastugue Date: Thu, 7 May 2020 14:03:54 -0300 Subject: [PATCH 24/34] Upload artifacts when building desktop --- .github/workflows/release.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6e0566de..84dac610 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,6 +6,7 @@ on: branches: # this will run on the specified branch - master + - development env: REACT_APP_BLOCKNATIVE_KEY: ${{ secrets.REACT_APP_BLOCKNATIVE_KEY }} @@ -34,14 +35,12 @@ jobs: shell: powershell run: | yarn global add --production windows-build-tools --vs2015 --msvs_version=2015 - - name: Install node-gyp if: startsWith(matrix.os, 'windows') shell: powershell run: | yarn global add node-gyp yarn config set node_gyp "$_\node_modules\node-gyp\bin\node-gyp.js" - - name: Install Node.js, NPM and Yarn uses: actions/setup-node@v1 with: @@ -70,3 +69,10 @@ jobs: # If the commit is tagged with a version (e.g. "v1.0.0"), # release the app after building release: ${{ startsWith(github.ref, 'refs/tags/v') }} + + - name: 'Upload Artifacts' + if: contains(github.ref, "development") + uses: actions/upload-artifact@v2 + with: + name: desktop-artifacts + path: ./dist/Safe[ ]Multisig*.* From 9fe11e69af656fd3c890349a934b73b20b2dfe37 Mon Sep 17 00:00:00 2001 From: Mati Dastugue Date: Thu, 7 May 2020 16:19:28 -0300 Subject: [PATCH 25/34] Update build script --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 84dac610..4cece43a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -71,7 +71,7 @@ jobs: release: ${{ startsWith(github.ref, 'refs/tags/v') }} - name: 'Upload Artifacts' - if: contains(github.ref, "development") + if: contains(github.ref, 'development') uses: actions/upload-artifact@v2 with: name: desktop-artifacts From abb600d837b2977b919194eb4c1ae60eafc1007b Mon Sep 17 00:00:00 2001 From: nicolas Date: Thu, 7 May 2020 17:21:55 -0300 Subject: [PATCH 26/34] improve calculation of TX mined (#886) --- src/routes/opening/index.jsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/routes/opening/index.jsx b/src/routes/opening/index.jsx index 791ade76..56809ea7 100644 --- a/src/routes/opening/index.jsx +++ b/src/routes/opening/index.jsx @@ -252,12 +252,17 @@ const SafeDeployment = ({ creationTxHash, onCancel, onRetry, onSuccess, provider const isTxMined = async (txHash) => { const web3 = getWeb3() + const txResult = await web3.eth.getTransaction(txHash) + if (txResult.blockNumber === null) { + return false + } + const receipt = await web3.eth.getTransactionReceipt(txHash) if (!receipt.status) { throw Error('TX status reverted') } - const txResult = await web3.eth.getTransaction(txHash) - return txResult.blockNumber !== null + + return true } let interval = setInterval(async () => { From 8bc5de3246b4d8f3025c7989bffa7229b1c8fbb1 Mon Sep 17 00:00:00 2001 From: Mati Dastugue Date: Thu, 7 May 2020 18:37:46 -0300 Subject: [PATCH 27/34] Upload files separately (#890) --- .github/workflows/release.yml | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4cece43a..64ab87f5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -70,9 +70,24 @@ jobs: # release the app after building release: ${{ startsWith(github.ref, 'refs/tags/v') }} - - name: 'Upload Artifacts' - if: contains(github.ref, 'development') + - name: 'Upload Artifacts OSX' + if: contains(github.ref, 'development') && startsWith(matrix.os, 'macos') uses: actions/upload-artifact@v2 with: - name: desktop-artifacts - path: ./dist/Safe[ ]Multisig*.* + name: Desktop OSX + path: ./dist/Safe[ ]Multisig*.dmg + + - name: 'Upload Artifacts Linux' + if: contains(github.ref, 'development') && startsWith(matrix.os, 'ubuntu') + uses: actions/upload-artifact@v2 + with: + name: Desktop Linux + path: ./dist/Safe[ ]Multisig*.AppImage + + - name: 'Upload Artifacts Windows' + if: contains(github.ref, 'development') && startsWith(matrix.os, 'windows') + uses: actions/upload-artifact@v2 + with: + name: Desktop Windows + path: ./dist/Safe[ ]Multisig*.exe + From 4098a8b9cf727802e0fc472a07dba0e7506dee2f Mon Sep 17 00:00:00 2001 From: Agustin Pane Date: Fri, 8 May 2020 17:09:49 -0300 Subject: [PATCH 28/34] (Fix) #511 - QR scan button (#873) * Creates ScanQRWrapper to avoid duplicated logic Refactors components that uses ScanQRWrapper * Adds closeQrModal to props.handleScan callback * Fixs mutators usage on components with qrScanWrapper * Exports getNameFromAdbk Fixs displaying address on send funds, also displays the name * Fixs sendCustomTx qrCode Fixs sendCollectible qrCode Fixs loadAddress qrCode --- .../ScanQRModal/ScanQRWrapper/index.jsx | 51 +++++++ src/logic/addressBook/utils/index.js | 2 +- .../load/components/DetailsForm/index.jsx | 131 ++++++++++-------- .../CreateEditEntryModal/index.jsx | 65 ++++++--- .../screens/SendCollectible/index.jsx | 37 ++--- .../SendModal/screens/SendCustomTx/index.jsx | 37 ++--- .../SendModal/screens/SendFunds/index.jsx | 37 ++--- .../AddOwnerModal/screens/OwnerForm/index.jsx | 14 ++ .../screens/OwnerForm/index.jsx | 15 ++ 9 files changed, 233 insertions(+), 156 deletions(-) create mode 100644 src/components/ScanQRModal/ScanQRWrapper/index.jsx diff --git a/src/components/ScanQRModal/ScanQRWrapper/index.jsx b/src/components/ScanQRModal/ScanQRWrapper/index.jsx new file mode 100644 index 00000000..e4ea32f3 --- /dev/null +++ b/src/components/ScanQRModal/ScanQRWrapper/index.jsx @@ -0,0 +1,51 @@ +// @flow +import { makeStyles } from '@material-ui/core/styles' +import { useState } from 'react' +import * as React from 'react' + +import QRIcon from '~/assets/icons/qrcode.svg' +import ScanQRModal from '~/components/ScanQRModal' +import Img from '~/components/layout/Img' + +type Props = { + handleScan: Function, +} + +const useStyles = makeStyles({ + qrCodeBtn: { + cursor: 'pointer', + }, +}) + +export const ScanQRWrapper = (props: Props) => { + const classes = useStyles() + const [qrModalOpen, setQrModalOpen] = useState(false) + + const openQrModal = () => { + setQrModalOpen(true) + } + + const closeQrModal = () => { + setQrModalOpen(false) + } + + const onScanFinished = (value) => { + props.handleScan(value, closeQrModal) + } + + return ( + <> + Scan QR { + openQrModal() + }} + role="button" + src={QRIcon} + /> + {qrModalOpen && } + + ) +} diff --git a/src/logic/addressBook/utils/index.js b/src/logic/addressBook/utils/index.js index cfd3b864..e9723340 100644 --- a/src/logic/addressBook/utils/index.js +++ b/src/logic/addressBook/utils/index.js @@ -25,7 +25,7 @@ export const saveAddressBook = async (addressBook: AddressBook) => { export const getAddressesListFromAdbk = (addressBook: AddressBook) => Array.from(addressBook).map((entry) => entry.address) -const getNameFromAdbk = (addressBook: AddressBook, userAddress: string): string | null => { +export const getNameFromAdbk = (addressBook: AddressBook, userAddress: string): string | null => { const entry = addressBook.find((addressBookItem) => addressBookItem.address === userAddress) if (entry) { return entry.name diff --git a/src/routes/load/components/DetailsForm/index.jsx b/src/routes/load/components/DetailsForm/index.jsx index 266f131e..75a2d3f4 100644 --- a/src/routes/load/components/DetailsForm/index.jsx +++ b/src/routes/load/components/DetailsForm/index.jsx @@ -4,12 +4,14 @@ import { withStyles } from '@material-ui/core/styles' import CheckCircle from '@material-ui/icons/CheckCircle' import * as React from 'react' +import { ScanQRWrapper } from '~/components/ScanQRModal/ScanQRWrapper' import OpenPaper from '~/components/Stepper/OpenPaper' import AddressInput from '~/components/forms/AddressInput' import Field from '~/components/forms/Field' import TextField from '~/components/forms/TextField' import { mustBeEthereumAddress, noErrorsOn, required } from '~/components/forms/validator' import Block from '~/components/layout/Block' +import Col from '~/components/layout/Col' import Paragraph from '~/components/layout/Paragraph' import { SAFE_MASTER_COPY_ADDRESS_V10, getSafeMasterContract, validateProxy } from '~/logic/contracts/safeContracts' import { getWeb3 } from '~/logic/wallets/getWeb3' @@ -80,64 +82,77 @@ export const safeFieldsValidation = async (values: Object) => { return errors } -const Details = ({ classes, errors, form }: Props) => ( - <> - - - You are about to load an existing Gnosis Safe. First, choose a name and enter the Safe address. The name is only - stored locally and will never be shared with Gnosis or any third parties. -
- Your connected wallet does not have to be the owner of this Safe. In this case, the interface will provide you a - read-only view. -
-
- - - - - { - form.mutators.setValue(FIELD_LOAD_ADDRESS, val) - }} - inputAdornment={ - noErrorsOn(FIELD_LOAD_ADDRESS, errors) && { - endAdornment: ( - - - - ), - } - } - name={FIELD_LOAD_ADDRESS} - placeholder="Safe Address*" - text="Safe Address" - type="text" - /> - - - - By continuing you consent with the{' '} - - terms of use - {' '} - and{' '} - - privacy policy - - . Most importantly, you confirm that your funds are held securely in the Gnosis Safe, a smart contract on the - Ethereum blockchain. These funds cannot be accessed by Gnosis at any point. - - - -) +const Details = ({ classes, errors, form }: Props) => { + const handleScan = (value, closeQrModal) => { + form.mutators.setValue(FIELD_LOAD_ADDRESS, value) + closeQrModal() + } + return ( + <> + + + You are about to load an existing Gnosis Safe. First, choose a name and enter the Safe address. The name is + only stored locally and will never be shared with Gnosis or any third parties. +
+ Your connected wallet does not have to be the owner of this Safe. In this case, the interface will provide you + a read-only view. +
+
+ + + + + + + + { + form.mutators.setValue(FIELD_LOAD_ADDRESS, val) + }} + inputAdornment={ + noErrorsOn(FIELD_LOAD_ADDRESS, errors) && { + endAdornment: ( + + + + ), + } + } + name={FIELD_LOAD_ADDRESS} + placeholder="Safe Address*" + text="Safe Address" + type="text" + /> + + + + + + + + By continuing you consent with the{' '} + + terms of use + {' '} + and{' '} + + privacy policy + + . Most importantly, you confirm that your funds are held securely in the Gnosis Safe, a smart contract on the + Ethereum blockchain. These funds cannot be accessed by Gnosis at any point. + + + + ) +} const DetailsForm = withStyles(styles)(Details) diff --git a/src/routes/safe/components/AddressBook/CreateEditEntryModal/index.jsx b/src/routes/safe/components/AddressBook/CreateEditEntryModal/index.jsx index d43bf19f..06685ff0 100644 --- a/src/routes/safe/components/AddressBook/CreateEditEntryModal/index.jsx +++ b/src/routes/safe/components/AddressBook/CreateEditEntryModal/index.jsx @@ -8,6 +8,7 @@ import { useSelector } from 'react-redux' import { styles } from './style' import Modal from '~/components/Modal' +import { ScanQRWrapper } from '~/components/ScanQRModal/ScanQRWrapper' import AddressInput from '~/components/forms/AddressInput' import Field from '~/components/forms/Field' import GnoForm from '~/components/forms/GnoForm' @@ -15,6 +16,7 @@ import TextField from '~/components/forms/TextField' import { composeValidators, minMaxLength, required, uniqueAddress } from '~/components/forms/validator' import Block from '~/components/layout/Block' import Button from '~/components/layout/Button' +import Col from '~/components/layout/Col' import Hairline from '~/components/layout/Hairline' import Paragraph from '~/components/layout/Paragraph' import Row from '~/components/layout/Row' @@ -81,34 +83,53 @@ const CreateEditEntryModalComponent = ({ {(...args) => { const mutators = args[3] + const handleScan = (value, closeQrModal) => { + let scannedAddress = value + + if (scannedAddress.startsWith('ethereum:')) { + scannedAddress = scannedAddress.replace('ethereum:', '') + } + + mutators.setOwnerAddress(scannedAddress) + closeQrModal() + } return ( <> - + + + - + + + + {!entryToEdit ? ( + + + + ) : null} diff --git a/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/index.jsx b/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/index.jsx index 80b07e40..92efe240 100644 --- a/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/index.jsx +++ b/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/index.jsx @@ -9,20 +9,21 @@ import ArrowDown from '../assets/arrow-down.svg' import { styles } from './style' -import QRIcon from '~/assets/icons/qrcode.svg' import CopyBtn from '~/components/CopyBtn' import EtherscanBtn from '~/components/EtherscanBtn' import Identicon from '~/components/Identicon' -import ScanQRModal from '~/components/ScanQRModal' +import { ScanQRWrapper } from '~/components/ScanQRModal/ScanQRWrapper' import WhenFieldChanges from '~/components/WhenFieldChanges' import GnoForm from '~/components/forms/GnoForm' import Block from '~/components/layout/Block' import Button from '~/components/layout/Button' import Col from '~/components/layout/Col' import Hairline from '~/components/layout/Hairline' -import Img from '~/components/layout/Img' import Paragraph from '~/components/layout/Paragraph' import Row from '~/components/layout/Row' +import type { AddressBook } from '~/logic/addressBook/model/addressBook' +import { getAddressBook } from '~/logic/addressBook/store/selectors' +import { getNameFromAdbk } from '~/logic/addressBook/utils' import type { NFTAssetsState, NFTTokensState } from '~/logic/collectibles/store/reducer/collectibles' import { nftTokensSelector, safeActiveSelectorMap } from '~/logic/collectibles/store/selectors' import type { NFTToken } from '~/routes/safe/components/Balances/Collectibles/types' @@ -60,7 +61,7 @@ const SendCollectible = ({ initialValues, onClose, onNext, recipientAddress, sel const { address: safeAddress, ethBalance, name: safeName } = useSelector(safeSelector) const nftAssets: NFTAssetsState = useSelector(safeActiveSelectorMap) const nftTokens: NFTTokensState = useSelector(nftTokensSelector) - const [qrModalOpen, setQrModalOpen] = useState(false) + const addressBook: AddressBook = useSelector(getAddressBook) const [selectedEntry, setSelectedEntry] = useState({ address: recipientAddress || initialValues.recipientAddress, name: '', @@ -85,14 +86,6 @@ const SendCollectible = ({ initialValues, onClose, onNext, recipientAddress, sel onNext(values) } - const openQrModal = () => { - setQrModalOpen(true) - } - - const closeQrModal = () => { - setQrModalOpen(false) - } - return ( <> @@ -112,14 +105,18 @@ const SendCollectible = ({ initialValues, onClose, onNext, recipientAddress, sel const { assetAddress } = formState.values const selectedNFTTokens = nftTokens.filter((nftToken) => nftToken.assetAddress === assetAddress) - const handleScan = (value) => { + const handleScan = (value, closeQrModal) => { let scannedAddress = value if (scannedAddress.startsWith('ethereum:')) { scannedAddress = scannedAddress.replace('ethereum:', '') } - + const scannedName = addressBook ? getNameFromAdbk(addressBook, scannedAddress) : '' mutators.setRecipient(scannedAddress) + setSelectedEntry({ + name: scannedName, + address: scannedAddress, + }) closeQrModal() } @@ -200,16 +197,7 @@ const SendCollectible = ({ initialValues, onClose, onNext, recipientAddress, sel /> - Scan QR { - openQrModal() - }} - role="button" - src={QRIcon} - /> + @@ -256,7 +244,6 @@ const SendCollectible = ({ initialValues, onClose, onNext, recipientAddress, sel Review - {qrModalOpen && } ) }} diff --git a/src/routes/safe/components/Balances/SendModal/screens/SendCustomTx/index.jsx b/src/routes/safe/components/Balances/SendModal/screens/SendCustomTx/index.jsx index 2039cfc3..c8b9e2fb 100644 --- a/src/routes/safe/components/Balances/SendModal/screens/SendCustomTx/index.jsx +++ b/src/routes/safe/components/Balances/SendModal/screens/SendCustomTx/index.jsx @@ -10,11 +10,10 @@ import ArrowDown from '../assets/arrow-down.svg' import { styles } from './style' -import QRIcon from '~/assets/icons/qrcode.svg' import CopyBtn from '~/components/CopyBtn' import EtherscanBtn from '~/components/EtherscanBtn' import Identicon from '~/components/Identicon' -import ScanQRModal from '~/components/ScanQRModal' +import { ScanQRWrapper } from '~/components/ScanQRModal/ScanQRWrapper' import Field from '~/components/forms/Field' import GnoForm from '~/components/forms/GnoForm' import TextField from '~/components/forms/TextField' @@ -25,9 +24,11 @@ import Button from '~/components/layout/Button' import ButtonLink from '~/components/layout/ButtonLink' import Col from '~/components/layout/Col' import Hairline from '~/components/layout/Hairline' -import Img from '~/components/layout/Img' import Paragraph from '~/components/layout/Paragraph' import Row from '~/components/layout/Row' +import type { AddressBook } from '~/logic/addressBook/model/addressBook' +import { getAddressBook } from '~/logic/addressBook/store/selectors' +import { getNameFromAdbk } from '~/logic/addressBook/utils' import SafeInfo from '~/routes/safe/components/Balances/SendModal/SafeInfo' import AddressBookInput from '~/routes/safe/components/Balances/SendModal/screens/AddressBookInput' import { safeSelector } from '~/routes/safe/store/selectors' @@ -45,13 +46,13 @@ const useStyles = makeStyles(styles) const SendCustomTx = ({ initialValues, onClose, onNext, recipientAddress }: Props) => { const classes = useStyles() const { address: safeAddress, ethBalance, name: safeName } = useSelector(safeSelector) - const [qrModalOpen, setQrModalOpen] = useState(false) const [selectedEntry, setSelectedEntry] = useState({ address: recipientAddress || initialValues.recipientAddress, name: '', }) const [pristine, setPristine] = useState(true) const [isValidAddress, setIsValidAddress] = useState(true) + const addressBook: AddressBook = useSelector(getAddressBook) React.useMemo(() => { if (selectedEntry === null && pristine) { @@ -65,14 +66,6 @@ const SendCustomTx = ({ initialValues, onClose, onNext, recipientAddress }: Prop } } - const openQrModal = () => { - setQrModalOpen(true) - } - - const closeQrModal = () => { - setQrModalOpen(false) - } - const formMutators = { setMax: (args, state, utils) => { utils.changeValue(state, 'value', () => ethBalance) @@ -103,14 +96,18 @@ const SendCustomTx = ({ initialValues, onClose, onNext, recipientAddress }: Prop shouldDisableSubmitButton = !selectedEntry.address } - const handleScan = (value) => { + const handleScan = (value, closeQrModal) => { let scannedAddress = value if (scannedAddress.startsWith('ethereum:')) { scannedAddress = scannedAddress.replace('ethereum:', '') } - + const scannedName = addressBook ? getNameFromAdbk(addressBook, scannedAddress) : '' mutators.setRecipient(scannedAddress) + setSelectedEntry({ + name: scannedName, + address: scannedAddress, + }) closeQrModal() } @@ -184,16 +181,7 @@ const SendCustomTx = ({ initialValues, onClose, onNext, recipientAddress }: Prop /> - Scan QR { - openQrModal() - }} - role="button" - src={QRIcon} - /> + @@ -252,7 +240,6 @@ const SendCustomTx = ({ initialValues, onClose, onNext, recipientAddress }: Prop Review - {qrModalOpen && } ) }} diff --git a/src/routes/safe/components/Balances/SendModal/screens/SendFunds/index.jsx b/src/routes/safe/components/Balances/SendModal/screens/SendFunds/index.jsx index 92c5c273..21e34d94 100644 --- a/src/routes/safe/components/Balances/SendModal/screens/SendFunds/index.jsx +++ b/src/routes/safe/components/Balances/SendModal/screens/SendFunds/index.jsx @@ -11,11 +11,10 @@ import ArrowDown from '../assets/arrow-down.svg' import { styles } from './style' -import QRIcon from '~/assets/icons/qrcode.svg' import CopyBtn from '~/components/CopyBtn' import EtherscanBtn from '~/components/EtherscanBtn' import Identicon from '~/components/Identicon' -import ScanQRModal from '~/components/ScanQRModal' +import { ScanQRWrapper } from '~/components/ScanQRModal/ScanQRWrapper' import Field from '~/components/forms/Field' import GnoForm from '~/components/forms/GnoForm' import TextField from '~/components/forms/TextField' @@ -25,9 +24,11 @@ import Button from '~/components/layout/Button' import ButtonLink from '~/components/layout/ButtonLink' import Col from '~/components/layout/Col' import Hairline from '~/components/layout/Hairline' -import Img from '~/components/layout/Img' import Paragraph from '~/components/layout/Paragraph' import Row from '~/components/layout/Row' +import type { AddressBook } from '~/logic/addressBook/model/addressBook' +import { getAddressBook } from '~/logic/addressBook/store/selectors' +import { getNameFromAdbk } from '~/logic/addressBook/utils' import { type Token } from '~/logic/tokens/store/model/token' import SafeInfo from '~/routes/safe/components/Balances/SendModal/SafeInfo' import AddressBookInput from '~/routes/safe/components/Balances/SendModal/screens/AddressBookInput' @@ -62,7 +63,7 @@ const SendFunds = ({ initialValues, onClose, onNext, recipientAddress, selectedT const classes = useStyles() const { address: safeAddress, ethBalance, name: safeName } = useSelector(safeSelector) const tokens: Token = useSelector(extendedSafeTokensSelector) - const [qrModalOpen, setQrModalOpen] = useState(false) + const addressBook: AddressBook = useSelector(getAddressBook) const [selectedEntry, setSelectedEntry] = useState({ address: recipientAddress || initialValues.recipientAddress, name: '', @@ -85,14 +86,6 @@ const SendFunds = ({ initialValues, onClose, onNext, recipientAddress, selectedT onNext(submitValues) } - const openQrModal = () => { - setQrModalOpen(true) - } - - const closeQrModal = () => { - setQrModalOpen(false) - } - return ( <> @@ -112,14 +105,18 @@ const SendFunds = ({ initialValues, onClose, onNext, recipientAddress, selectedT const { token: tokenAddress } = formState.values const selectedTokenRecord = tokens.find((token) => token.address === tokenAddress) - const handleScan = (value) => { + const handleScan = (value, closeQrModal) => { let scannedAddress = value if (scannedAddress.startsWith('ethereum:')) { scannedAddress = scannedAddress.replace('ethereum:', '') } - + const scannedName = addressBook ? getNameFromAdbk(addressBook, scannedAddress) : '' mutators.setRecipient(scannedAddress) + setSelectedEntry({ + name: scannedName, + address: scannedAddress, + }) closeQrModal() } @@ -198,16 +195,7 @@ const SendFunds = ({ initialValues, onClose, onNext, recipientAddress, selectedT /> - Scan QR { - openQrModal() - }} - role="button" - src={QRIcon} - /> + @@ -276,7 +264,6 @@ const SendFunds = ({ initialValues, onClose, onNext, recipientAddress, selectedT Review - {qrModalOpen && } ) }} diff --git a/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/screens/OwnerForm/index.jsx b/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/screens/OwnerForm/index.jsx index 106692fd..71bd43a8 100644 --- a/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/screens/OwnerForm/index.jsx +++ b/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/screens/OwnerForm/index.jsx @@ -7,6 +7,7 @@ import { useSelector } from 'react-redux' import { styles } from './style' +import { ScanQRWrapper } from '~/components/ScanQRModal/ScanQRWrapper' import AddressInput from '~/components/forms/AddressInput' import Field from '~/components/forms/Field' import GnoForm from '~/components/forms/GnoForm' @@ -59,6 +60,16 @@ const OwnerForm = ({ classes, onClose, onSubmit }: Props) => { {(...args) => { const mutators = args[3] + const handleScan = (value, closeQrModal) => { + let scannedAddress = value + + if (scannedAddress.startsWith('ethereum:')) { + scannedAddress = scannedAddress.replace('ethereum:', '') + } + mutators.setOwnerAddress(scannedAddress) + closeQrModal() + } + return ( <> @@ -91,6 +102,9 @@ const OwnerForm = ({ classes, onClose, onSubmit }: Props) => { validators={[ownerDoesntExist]} /> + + + diff --git a/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/screens/OwnerForm/index.jsx b/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/screens/OwnerForm/index.jsx index 34344b16..e70883e7 100644 --- a/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/screens/OwnerForm/index.jsx +++ b/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/screens/OwnerForm/index.jsx @@ -11,6 +11,7 @@ import { styles } from './style' import CopyBtn from '~/components/CopyBtn' import EtherscanBtn from '~/components/EtherscanBtn' import Identicon from '~/components/Identicon' +import { ScanQRWrapper } from '~/components/ScanQRModal/ScanQRWrapper' import AddressInput from '~/components/forms/AddressInput' import Field from '~/components/forms/Field' import GnoForm from '~/components/forms/GnoForm' @@ -65,6 +66,17 @@ const OwnerForm = ({ classes, onClose, onSubmit, ownerAddress, ownerName }: Prop {(...args) => { const mutators = args[3] + const handleScan = (value, closeQrModal) => { + let scannedAddress = value + + if (scannedAddress.startsWith('ethereum:')) { + scannedAddress = scannedAddress.replace('ethereum:', '') + } + + mutators.setOwnerAddress(scannedAddress) + closeQrModal() + } + return ( <> @@ -126,6 +138,9 @@ const OwnerForm = ({ classes, onClose, onSubmit, ownerAddress, ownerName }: Prop validators={[ownerDoesntExist]} /> + + + From 7bc9cd7a945af3f987bb07d2bafe9397a6c26d7f Mon Sep 17 00:00:00 2001 From: nicolas Date: Fri, 8 May 2020 18:58:06 -0300 Subject: [PATCH 29/34] remove trailing slash for Apps env var (#891) --- src/routes/safe/components/Apps/utils.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/routes/safe/components/Apps/utils.js b/src/routes/safe/components/Apps/utils.js index defed2fc..a5689e83 100644 --- a/src/routes/safe/components/Apps/utils.js +++ b/src/routes/safe/components/Apps/utils.js @@ -3,7 +3,14 @@ import axios from 'axios' import appsIconSvg from '~/routes/safe/components/Transactions/TxsTable/TxType/assets/appsIcon.svg' -const gnosisAppsUrl = process.env.REACT_APP_GNOSIS_APPS_URL +const removeLastTrailingSlash = (url: string) => { + if (url.substr(-1) === '/') { + return url.substr(0, url.length - 1) + } + return url +} + +const gnosisAppsUrl = removeLastTrailingSlash(process.env.REACT_APP_GNOSIS_APPS_URL) export const staticAppsList = [ { url: `${gnosisAppsUrl}/compound`, disabled: false }, { url: `${gnosisAppsUrl}/aave`, disabled: false }, @@ -30,10 +37,7 @@ export const getAppInfoFromUrl = async (appUrl: string) => { } res.url = appUrl.trim() - let noTrailingSlashUrl = res.url - if (noTrailingSlashUrl.substr(-1) === '/') { - noTrailingSlashUrl = noTrailingSlashUrl.substr(0, noTrailingSlashUrl.length - 1) - } + let noTrailingSlashUrl = removeLastTrailingSlash(res.url) try { const appInfo = await axios.get(`${noTrailingSlashUrl}/manifest.json`) From 21181400c8a501eef02ff580862bc3e6e04d8d4e Mon Sep 17 00:00:00 2001 From: fernandomg Date: Sun, 10 May 2020 17:26:39 -0300 Subject: [PATCH 30/34] fix: owner address lookup from tx.confirmation list --- src/logic/safe/safeTxSigner.js | 2 +- src/logic/safe/transactions/awaitingTransactions.js | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/logic/safe/safeTxSigner.js b/src/logic/safe/safeTxSigner.js index fc46af26..4fd85cbe 100644 --- a/src/logic/safe/safeTxSigner.js +++ b/src/logic/safe/safeTxSigner.js @@ -12,7 +12,7 @@ export const generateSignaturesFromTxConfirmations = ( // The constant parts need to be sorted so that the recovered signers are sorted ascending // (natural order) by address (not checksummed). const confirmationsMap = confirmations.reduce((map, obj) => { - map[obj.owner.address.toLowerCase()] = obj // eslint-disable-line no-param-reassign + map[obj.owner.toLowerCase()] = obj // eslint-disable-line no-param-reassign return map }, {}) diff --git a/src/logic/safe/transactions/awaitingTransactions.js b/src/logic/safe/transactions/awaitingTransactions.js index 1320b38d..a3d05421 100644 --- a/src/logic/safe/transactions/awaitingTransactions.js +++ b/src/logic/safe/transactions/awaitingTransactions.js @@ -27,9 +27,7 @@ export const getAwaitingTransactions = ( if (!transaction.executionTxHash && !isTransactionCancelled) { // Then we check if the waiting confirmations are not from the current user, otherwise, filters this // transaction - const transactionWaitingUser = transaction.confirmations.filter( - (confirmation) => confirmation.owner && confirmation.owner.address !== userAccount, - ) + const transactionWaitingUser = transaction.confirmations.filter(({ owner }) => owner !== userAccount) return transactionWaitingUser.size > 0 } From 8efbbad0a303b15ab4c89794efbfae6997bd161c Mon Sep 17 00:00:00 2001 From: Mikhail Mikheev Date: Tue, 12 May 2020 12:55:51 +0400 Subject: [PATCH 31/34] Dep bump --- package.json | 36 +- yarn.lock | 949 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 652 insertions(+), 333 deletions(-) diff --git a/package.json b/package.json index 9065711e..2dba5d6b 100644 --- a/package.json +++ b/package.json @@ -136,27 +136,27 @@ }, "dependencies": { "@gnosis.pm/safe-contracts": "1.1.1-dev.2", - "@gnosis.pm/util-contracts": "2.0.6", "@gnosis.pm/safe-react-components": "https://github.com/gnosis/safe-react-components.git#a057248", - "@ledgerhq/hw-transport-node-hid": "5.12.0", - "@material-ui/core": "4.9.10", + "@gnosis.pm/util-contracts": "2.0.6", + "@ledgerhq/hw-transport-node-hid": "5.15.0", + "@material-ui/core": "4.9.14", "@material-ui/icons": "4.9.1", "@material-ui/lab": "4.0.0-alpha.39", - "@openzeppelin/contracts": "3.0.0", - "@testing-library/jest-dom": "5.5.0", - "@welldone-software/why-did-you-render": "4.1.2", + "@openzeppelin/contracts": "3.0.1", + "@testing-library/jest-dom": "5.7.0", + "@welldone-software/why-did-you-render": "4.2.1", "async-sema": "^3.1.0", "axios": "0.19.2", "bignumber.js": "9.0.0", - "bnc-onboard": "1.7.7", + "bnc-onboard": "1.9.0", "connected-react-router": "6.8.0", "cross-env": "^7.0.2", - "currency-flags": "^2.1.1", - "date-fns": "2.12.0", + "currency-flags": "2.1.2", + "date-fns": "2.13.0", "dotenv": "^8.2.0", "electron-is-dev": "^1.1.0", - "electron-log": "^4.1.1", - "electron-updater": "4.2.0", + "electron-log": "4.1.2", + "electron-updater": "4.3.1", "ethereum-ens": "0.8.0", "express": "^4.17.1", "final-form": "4.19.1", @@ -165,13 +165,13 @@ "immutable": "^4.0.0-rc.9", "install": "^0.13.0", "js-cookie": "^2.2.1", - "lint-staged": "10.1.7", + "lint-staged": "10.2.2", "material-ui-search-bar": "^1.0.0-beta.13", "notistack": "https://github.com/gnosis/notistack.git#v0.9.4", - "npm": "^6.14.4", + "npm": "6.14.5", "open": "^7.0.3", "optimize-css-assets-webpack-plugin": "5.0.3", - "polished": "3.5.2", + "polished": "3.6.3", "qrcode.react": "1.0.0", "query-string": "6.12.1", "react": "16.13.1", @@ -180,10 +180,10 @@ "react-final-form": "6.4.0", "react-final-form-listeners": "^1.0.2", "react-ga": "^2.7.0", - "react-hot-loader": "4.12.20", + "react-hot-loader": "4.12.21", "react-qr-reader": "^2.2.1", "react-redux": "7.2.0", - "react-router-dom": "5.1.2", + "react-router-dom": "5.2.0", "react-window": "^1.8.5", "recompose": "^0.30.0", "redux": "4.0.5", @@ -192,8 +192,8 @@ "reselect": "^4.0.0", "semver": "7.3.2", "styled-components": "^5.0.1", - "wait-on": "^4.0.1", - "web3": "1.2.6" + "wait-on": "5.0.0", + "web3": "1.2.7" }, "devDependencies": { "@babel/cli": "7.8.4", diff --git a/yarn.lock b/yarn.lock index 42dedd0a..6039f7bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1036,7 +1036,7 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.1.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.4", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.1.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.4", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== @@ -1668,15 +1668,6 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" -"@ledgerhq/devices@^5.12.0", "@ledgerhq/devices@^5.13.1": - version "5.13.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.13.1.tgz#1d65fcbcc470874968e2e74f7e87e3f350c4b332" - integrity sha512-E3zgmA51+esMkczM9xLddVz0myXTauJaT5g4bbwGxxeHQyHyvaJNyOhMmcuxZN/aa/lfRmxYGthcN2JBUPju5A== - dependencies: - "@ledgerhq/errors" "^5.13.1" - "@ledgerhq/logs" "^5.13.1" - rxjs "^6.5.5" - "@ledgerhq/devices@^5.13.0": version "5.13.0" resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.13.0.tgz#94666aff933d5bc5a98a6c190ff1749b37a65dba" @@ -1686,16 +1677,25 @@ "@ledgerhq/logs" "^5.13.0" rxjs "^6.5.5" -"@ledgerhq/errors@^5.12.0", "@ledgerhq/errors@^5.13.1": - version "5.13.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.13.1.tgz#1df73a8084609888fabcefbdb9edfd4c11ab3a22" - integrity sha512-IuEw9a70K3C3AZV4yVGk75HlwmKmJaR6EjMIxBAupiCw0G6rBP0d62MA1Vx4dg082LKKNXKafWcDstLG4ySpBA== +"@ledgerhq/devices@^5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.15.0.tgz#ca8d1d2b5074257019b7b838f53d0337b451e57c" + integrity sha512-b/Mm/+fY8DY3C/i9E7I5NP43dW6Un3GKkHHHI4yLEX8B6TKugR3m/a23UhEaWo5ZaucAU+yA4p4in9l6lyDr1g== + dependencies: + "@ledgerhq/errors" "^5.15.0" + "@ledgerhq/logs" "^5.15.0" + rxjs "^6.5.5" "@ledgerhq/errors@^5.13.0": version "5.13.0" resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.13.0.tgz#8e9aa9d2326dfaceee7d00d3411e49505837f8aa" integrity sha512-I+13snTaDZQbhnbxe3Hwud3bkmDqDSe/s8z0dzkhbchFdXvmtp77IbQrbJZ2m4L5W2bOBHAhv6Dz2SZv5Ll/VA== +"@ledgerhq/errors@^5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.15.0.tgz#e5d5b5ad48fc07f6308b78b065242e158bc044a2" + integrity sha512-ZlLhR7qaChPgEbvcqOptRepWGm8VhhwOM6kC1gx3WErutbtaOjUX8lLA4ButWFU2f+xTl2rS/5c86wC7qGqGXQ== + "@ledgerhq/hw-app-eth@^5.7.0": version "5.13.0" resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-5.13.0.tgz#8cae32cc4550015b144ef062a7cd4da77c64a177" @@ -1705,30 +1705,30 @@ "@ledgerhq/hw-transport" "^5.13.0" bignumber.js "^9.0.0" -"@ledgerhq/hw-transport-node-hid-noevents@^5.12.0": - version "5.13.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-5.13.1.tgz#9e7758bca7f9b7c46523b77575270a10b04029f0" - integrity sha512-C0o8gCJueupRlULKo06p/x2ExKrLkCunHoMVOCkqJE/jRxRWSyljDmtd3hqUQZKoBlC4JntsKvXPMN/hfGRqRw== +"@ledgerhq/hw-transport-node-hid-noevents@^5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-5.15.0.tgz#b67c88e1b2ca8de71c9c0dc42041bee116eb8065" + integrity sha512-YI82E116gMUJihBD+rDrJX23k5CKWAAEkj175R/ssmVxBCTf3gyAEtaiF4DrdaIVubRK1XFiPbfs/47RHAKrqA== dependencies: - "@ledgerhq/devices" "^5.13.1" - "@ledgerhq/errors" "^5.13.1" - "@ledgerhq/hw-transport" "^5.13.1" - "@ledgerhq/logs" "^5.13.1" + "@ledgerhq/devices" "^5.15.0" + "@ledgerhq/errors" "^5.15.0" + "@ledgerhq/hw-transport" "^5.15.0" + "@ledgerhq/logs" "^5.15.0" node-hid "^1.2.0" -"@ledgerhq/hw-transport-node-hid@5.12.0": - version "5.12.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-5.12.0.tgz#5c85a59c96e7a3f52856b6fa5ca7b8da6f16ba7d" - integrity sha512-rQPNzGPmLDgfEtedDeEKAskmRJ1dqee40UZR3cGhJO0fnW7csLXDIF/Ebl/bYXcl7MgqoznPfkdAfN79VEVzbg== +"@ledgerhq/hw-transport-node-hid@5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-5.15.0.tgz#8121b8b59980de9f6a8a42565fa30f3042c4bc43" + integrity sha512-JX/QnV4hYQESqfyjGwkU0TNHtGEHQ1PHS7ISMqv7bZKvj2hhO3G45xM7fPoLlBa3tZrbDLnNLWkqcFxo60w/jA== dependencies: - "@ledgerhq/devices" "^5.12.0" - "@ledgerhq/errors" "^5.12.0" - "@ledgerhq/hw-transport" "^5.12.0" - "@ledgerhq/hw-transport-node-hid-noevents" "^5.12.0" - "@ledgerhq/logs" "^5.11.0" + "@ledgerhq/devices" "^5.15.0" + "@ledgerhq/errors" "^5.15.0" + "@ledgerhq/hw-transport" "^5.15.0" + "@ledgerhq/hw-transport-node-hid-noevents" "^5.15.0" + "@ledgerhq/logs" "^5.15.0" lodash "^4.17.15" node-hid "^1.2.0" - usb "^1.6.0" + usb "^1.6.3" "@ledgerhq/hw-transport-u2f@^5.7.0": version "5.13.0" @@ -1740,15 +1740,6 @@ "@ledgerhq/logs" "^5.13.0" u2f-api "0.2.7" -"@ledgerhq/hw-transport@^5.12.0", "@ledgerhq/hw-transport@^5.13.1": - version "5.13.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.13.1.tgz#b0fb8208b0fb383f3984c1af26a9b9e7a3ad3d75" - integrity sha512-TQJJY10ZoToYjaGK+u9wud0W2dK+6TBA753FGlHgptydSaRmep0uc4A2TxOLPexdVlbHXmkMa1skd3w4ZrKKdA== - dependencies: - "@ledgerhq/devices" "^5.13.1" - "@ledgerhq/errors" "^5.13.1" - events "^3.1.0" - "@ledgerhq/hw-transport@^5.13.0": version "5.13.0" resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.13.0.tgz#dac69b9cd17d9260fe9bad5594cd88370cdb5933" @@ -1758,33 +1749,42 @@ "@ledgerhq/errors" "^5.13.0" events "^3.1.0" -"@ledgerhq/logs@^5.11.0", "@ledgerhq/logs@^5.13.1": - version "5.13.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.13.1.tgz#80a13031c9e0a9b874b96b6636f3f6df603ec1b2" - integrity sha512-ag2wX5VcAqPMKooCn/S6kKblVlsn74ixtagpwR+6GdFqYa/bspH8mWw+zwcdzSwa/wbOQRuY75zH52qBonfXBA== +"@ledgerhq/hw-transport@^5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.15.0.tgz#01dc22adb156061728dbb937df2f310c761d06b9" + integrity sha512-WIHqxEMGa1+MH5xTLLZcjPainFhCihzWVDw3zo1mzUqTzVEgYXFhnn2j6Lboov0Elpit+KiPOA1XuSofslajhg== + dependencies: + "@ledgerhq/devices" "^5.15.0" + "@ledgerhq/errors" "^5.15.0" + events "^3.1.0" "@ledgerhq/logs@^5.13.0": version "5.13.0" resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.13.0.tgz#42e848f7c6f662387dfc5f3e86e3e5b4e07a5fae" integrity sha512-yMvzQiMjWDMRma3HPxQQibhvEqMaEdXXkNBk1+eaW+N47Y3neYSSyCJlyihzzMBeeoin4ChlP/5uKQaABwBeTg== -"@material-ui/core@4.9.10": - version "4.9.10" - resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.9.10.tgz#53f1d18bd274c258698b6cfdab3c4bee0edf7892" - integrity sha512-CQuZU9Y10RkwSdxjn785kw2EPcXhv5GKauuVQufR9LlD37kjfn21Im1yvr6wsUzn81oLhEvVPz727UWC0gbqxg== +"@ledgerhq/logs@^5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.15.0.tgz#870524ade408b50ce74971509aa170e9d85c0575" + integrity sha512-QuAva3K3YFDtQidi8xAfOQcb+aExJus3p0GhPNscOE+r152klBdiZUHLp818zEeQZT7PRSm83gEknmeUYjGU9A== + +"@material-ui/core@4.9.14": + version "4.9.14" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.9.14.tgz#4388f82cf94554cd3a935774fc12820f3c607a8a" + integrity sha512-71oYrOpInx5honJ9GzZlygPjmsFhn7Bui61/SWLJsPTkMnfvuZfU3qVqlEHjXyDsnZ+uKmLAIdsrOYnphJxxXw== dependencies: "@babel/runtime" "^7.4.4" - "@material-ui/styles" "^4.9.10" - "@material-ui/system" "^4.9.10" - "@material-ui/types" "^5.0.1" - "@material-ui/utils" "^4.9.6" + "@material-ui/styles" "^4.9.14" + "@material-ui/system" "^4.9.14" + "@material-ui/types" "^5.1.0" + "@material-ui/utils" "^4.9.12" "@types/react-transition-group" "^4.2.0" clsx "^1.0.4" hoist-non-react-statics "^3.3.2" popper.js "^1.16.1-lts" prop-types "^15.7.2" react-is "^16.8.0" - react-transition-group "^4.3.0" + react-transition-group "^4.4.0" "@material-ui/icons@4.9.1": version "4.9.1" @@ -1804,16 +1804,16 @@ prop-types "^15.7.2" react-is "^16.8.0" -"@material-ui/styles@^4.9.10": - version "4.9.10" - resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.9.10.tgz#182ccdd0bc8525a459486499bbaebcd92b0db3ab" - integrity sha512-EXIXlqVyFDnjXF6tj72y6ZxiSy+mHtrsCo3Srkm3XUeu3Z01aftDBy7ZSr3TQ02gXHTvDSBvegp3Le6p/tl7eA== +"@material-ui/styles@^4.9.14": + version "4.9.14" + resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.9.14.tgz#0a9e93a2bf24e8daa0811411a6f3dabdafbe9a07" + integrity sha512-zecwWKgRU2VzdmutNovPB4s5LKI0TWyZKc/AHfPu9iY8tg4UoLjpa4Rn9roYrRfuTbBZHI6b0BXcQ8zkis0nzQ== dependencies: "@babel/runtime" "^7.4.4" "@emotion/hash" "^0.8.0" - "@material-ui/types" "^5.0.1" + "@material-ui/types" "^5.1.0" "@material-ui/utils" "^4.9.6" - clsx "^1.0.2" + clsx "^1.0.4" csstype "^2.5.2" hoist-non-react-statics "^3.3.2" jss "^10.0.3" @@ -1826,19 +1826,20 @@ jss-plugin-vendor-prefixer "^10.0.3" prop-types "^15.7.2" -"@material-ui/system@^4.9.10": - version "4.9.10" - resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.9.10.tgz#5de6ec7bea0f222b10b45e5bd5bb8b9a7b938926" - integrity sha512-E+t0baX2TBZk6ALm8twG6objpsxLdMM4MDm1++LMt2m7CetCAEc3aIAfDaprk4+tm5hFT1Cah5dRWk8EeIFQYw== +"@material-ui/system@^4.9.14": + version "4.9.14" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.9.14.tgz#4b00c48b569340cefb2036d0596b93ac6c587a5f" + integrity sha512-oQbaqfSnNlEkXEziDcJDDIy8pbvwUmZXWNqlmIwDqr/ZdCK8FuV3f4nxikUh7hvClKV2gnQ9djh5CZFTHkZj3w== dependencies: "@babel/runtime" "^7.4.4" "@material-ui/utils" "^4.9.6" + csstype "^2.5.2" prop-types "^15.7.2" -"@material-ui/types@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.0.1.tgz#c4954063cdc196eb327ee62c041368b1aebb6d61" - integrity sha512-wURPSY7/3+MAtng3i26g+WKwwNE3HEeqa/trDBR5+zWKmcjO+u9t7Npu/J1r+3dmIa/OeziN9D/18IrBKvKffw== +"@material-ui/types@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" + integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== "@material-ui/utils@^4.7.1", "@material-ui/utils@^4.9.6": version "4.9.6" @@ -1849,6 +1850,15 @@ prop-types "^15.7.2" react-is "^16.8.0" +"@material-ui/utils@^4.9.12": + version "4.9.12" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.9.12.tgz#0d639f1c1ed83fffb2ae10c21d15a938795d9e65" + integrity sha512-/0rgZPEOcZq5CFA4+4n6Q6zk7fi8skHhH2Bcra8R3epoJEYy5PL55LuMazPtPH1oKeRausDV/Omz4BbgFsn1HQ== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -1862,10 +1872,10 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@openzeppelin/contracts@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.0.0.tgz#89bc0d32fc9eb257cf6499f2497a1b4a6715f186" - integrity sha512-u7oATjUK6jffDOoIjVQ7vJ2fnFKlfDS1CJzrMpp+YtGQ2fhdSk0kXjZTxk8Pj1SPVZRNES3yo0r144v8BsuRhQ== +"@openzeppelin/contracts@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.0.1.tgz#2f327f77d16b43f14674086b2b634bda38cb0838" + integrity sha512-uSrD7hZ0ViuHGqHZbeHawZBi/uy7aBiNramXAt2dFFuSuoU4u9insS3V3zdVfOnYSPreUo636xSOuQIFN4//HA== "@portis/eth-json-rpc-middleware@^4.1.2": version "4.1.2" @@ -2011,10 +2021,10 @@ dom-accessibility-api "^0.4.2" pretty-format "^25.1.0" -"@testing-library/jest-dom@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.5.0.tgz#4707023e8f572021e8a84f65721303ff60828d88" - integrity sha512-7sWHrpxG4Yd8TmryI7Rtbx8Ff4mbs3ASye3oshQIuHvsCR+QHgr7rTR/PfeXvOmwUwR36wSTTAvrLKsPmr6VEQ== +"@testing-library/jest-dom@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.7.0.tgz#b2e2acb4c088a293d52ba2cd1674b526282a2f87" + integrity sha512-ZV0OtBXmTDEDxrIbqJXiOcXCZ6aIMpmDlmfHj0hGNsSuQ/nX0qPAs9HWmCzXvPfTrhufTiH2nJLvDJu/LgHzwQ== dependencies: "@babel/runtime" "^7.9.2" "@types/testing-library__jest-dom" "^5.0.2" @@ -2546,10 +2556,12 @@ "@types/prop-types" "*" csstype "^2.2.0" -"@types/semver@^6.0.2": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.1.tgz#a236185670a7860f1597cf73bea2e16d001461ba" - integrity sha512-+beqKQOh9PYxuHvijhVl+tIHvT6tuwOrE9m14zd+MT2A38KoKZhh7pYJ0SNleLtwDsiIxHDsIk9bv01oOxvSvA== +"@types/semver@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.1.0.tgz#c8c630d4c18cd326beff77404887596f96408408" + integrity sha512-pOKLaubrAEMUItGNpgwl0HMFPrSAFic8oSVIvfu1UwcgGNmNyK9gyhBHKmBnUTwwVvpZfkzUC0GaMgnL6P86uA== + dependencies: + "@types/node" "*" "@types/source-list-map@*": version "0.1.2" @@ -2853,10 +2865,10 @@ "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" -"@welldone-software/why-did-you-render@4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@welldone-software/why-did-you-render/-/why-did-you-render-4.1.2.tgz#d88f55b6d7eed11271a24ec949fd156b5789db8a" - integrity sha512-bYFOe9zPTNpr10XpP48xID93eiw3TrVyWEFKt4dnG35RghhtxetKfTSmt/bx+ZLV9NuSJQUxiig6VUGxWpUP4Q== +"@welldone-software/why-did-you-render@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@welldone-software/why-did-you-render/-/why-did-you-render-4.2.1.tgz#ea407028ac0ae105864b50c3fc202391d864d09d" + integrity sha512-Q1jH++Sx0F09bU2eTEzAPuBxPiv/uxzgFfWMX1G8LqT4xzdGOrr287DD3lsfPpGLDLx9sqL8jMc0RoxorRewUg== dependencies: lodash "^4" @@ -3079,17 +3091,17 @@ ansi-align@^3.0.0: dependencies: string-width "^3.0.0" -ansi-colors@^3.0.0: +ansi-colors@^3.0.0, ansi-colors@^3.2.1: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: +ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^4.2.1: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== @@ -3434,6 +3446,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -3507,17 +3524,17 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -authereum@^0.0.4-beta.131: - version "0.0.4-beta.133" - resolved "https://registry.yarnpkg.com/authereum/-/authereum-0.0.4-beta.133.tgz#05e04a58700519773d31401d58ee93ef52cdccc7" - integrity sha512-QXCOFDm4XYAicjL0eNaKTdW2NTc7Pc9YVJEi1aXSiJ0Q7KMketej+J7fbLWgChLP1lEa4CT33bjfKbdsHUIQOw== +authereum@^0.0.4-beta.141: + version "0.0.4-beta.141" + resolved "https://registry.yarnpkg.com/authereum/-/authereum-0.0.4-beta.141.tgz#81880e1451c23aa5ae98827735ff888bd673196c" + integrity sha512-cTFTYf88QuL08WS4mWG32hohfcHsNp+OCXZ8B58qlVTcaPXSXawY7KRH4jEqn4yni5aZE60iT65tkuFGK4q2RQ== dependencies: async "^3.1.0" ethereum-private-key-to-address "0.0.3" ethers "^4.0.36" eventemitter3 "^4.0.0" is-buffer "^2.0.4" - moment "^2.24.0" + moment "2.24.0" penpal "^4.1.1" pify "^4.0.1" querystring "^0.2.0" @@ -3556,7 +3573,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== -axios@0.19.2: +axios@0.19.2, axios@^0.19.2: version "0.19.2" resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== @@ -4358,6 +4375,11 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== +bind-decorator@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/bind-decorator/-/bind-decorator-1.0.11.tgz#e41bc06a1f65dd9cec476c91c5daf3978488252f" + integrity sha1-5BvAah9l3ZzsR2yRxdrzl4SIJS8= + bindings@^1.2.1, bindings@^1.4.0, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -4438,10 +4460,10 @@ bn.js@^5.1.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.1.tgz#48efc4031a9c4041b9c99c6941d903463ab62eb5" integrity sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA== -bnc-onboard@1.7.7: - version "1.7.7" - resolved "https://registry.yarnpkg.com/bnc-onboard/-/bnc-onboard-1.7.7.tgz#62f35717e2edce188598886d3bb6574a53465d81" - integrity sha512-tMK6qIUvgSGVz+88k4Za3d9cZqQ3L+GjZ1CAO0Gmxs2nmD6BRszjUs58uTrizgyNKRjcHjkUSdRZXw8acCq2hA== +bnc-onboard@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/bnc-onboard/-/bnc-onboard-1.9.0.tgz#cd6fc0e8448b27571061811235cc958612cd8525" + integrity sha512-5TfuNdqwocfgXYH37IhP8nf+u7FSvB6EZoJGrZRDeF8ncrOhIvs9xgS4CZpnAQlFKgl2SOWEfSvSTizpQPeg9A== dependencies: "@ledgerhq/hw-app-eth" "^5.7.0" "@ledgerhq/hw-transport-u2f" "^5.7.0" @@ -4449,9 +4471,9 @@ bnc-onboard@1.7.7: "@toruslabs/torus-embed" "^1.3.0" "@unilogin/provider" "^0.5.21" "@walletconnect/web3-provider" "^1.0.0-beta.47" - authereum "^0.0.4-beta.131" + authereum "^0.0.4-beta.141" bignumber.js "^9.0.0" - bnc-sdk "2.0.0" + bnc-sdk "^2.1.3" bowser "^2.5.2" ethereumjs-tx "^2.1.2" ethereumjs-util "^6.2.0" @@ -4460,13 +4482,14 @@ bnc-onboard@1.7.7: hdkey "^1.1.1" regenerator-runtime "^0.13.3" squarelink "^1.1.4" - trezor-connect "7.0.1" + trezor-connect "^8.1.2" + walletlink "^2.0.2" web3-provider-engine "^15.0.4" -bnc-sdk@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bnc-sdk/-/bnc-sdk-2.0.0.tgz#90b5926a758b9c9050bcbd2854cf3502a5899aff" - integrity sha512-IPOtIR0qZ4MtnGlMXVsjxbShANbaIfxksVZOXh/4hjpcSRKI3Gc3N+hq+P0CqeN0nhTuDARkCavDrlq/oPKyUQ== +bnc-sdk@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/bnc-sdk/-/bnc-sdk-2.1.3.tgz#62cc865455186bae1dc5ce41b5e0f8b609ea306c" + integrity sha512-SkvnM9IAXqHozlllJk5QO82RuptWrRyTwncSxm150ziUVqTSYYa0XDn/5AGfJrQgrxR1iGT47QQs+ZP7RaCf7Q== dependencies: crypto-es "^1.2.2" sturdy-websocket "^0.1.12" @@ -4804,14 +4827,6 @@ builder-util-runtime@8.3.0: debug "^4.1.1" sax "^1.2.4" -builder-util-runtime@8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.4.0.tgz#3163fffc078e6b8f3dd5b6eb12a8345573590682" - integrity sha512-CJB/eKfPf2vHrkmirF5eicVnbDCkMBbwd5tRYlTlgud16zFeqD7QmrVUAOEXdnsrcNkiLg9dbuUsQKtl/AwsYQ== - dependencies: - debug "^4.1.1" - sax "^1.2.4" - builder-util-runtime@8.5.0: version "8.5.0" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.5.0.tgz#0c9faa782307867cc2ec70f25e63829ef1ea49c4" @@ -4820,6 +4835,14 @@ builder-util-runtime@8.5.0: debug "^4.1.1" sax "^1.2.4" +builder-util-runtime@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.0.tgz#e48ad004835c8284662e8eaf47a53468c66e8e8d" + integrity sha512-G1AqqVM2vYTrSFR982c1NNzwXKrGLQjVjaZaWQdn4O6Z3YKjdMDofw88aD9jpyK9ZXkrCxR0tI3Qe9wNbyTlXg== + dependencies: + debug "^4.1.1" + sax "^1.2.4" + builder-util@21.2.0, builder-util@~21.2.0: version "21.2.0" resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-21.2.0.tgz#aba721190e4e841009d9fb4b88f1130ed616522f" @@ -5119,7 +5142,7 @@ chai@4.2.0: pathval "^1.1.0" type-detect "^4.0.5" -chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.3: +chalk@1.1.3, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -5328,7 +5351,7 @@ cli-columns@^3.1.2: string-width "^2.0.0" strip-ansi "^3.0.1" -cli-cursor@^2.0.0, cli-cursor@^2.1.0: +cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= @@ -5357,13 +5380,13 @@ cli-table3@^0.5.0, cli-table3@^0.5.1: optionalDependencies: colors "^1.1.2" -cli-truncate@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" - integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: - slice-ansi "0.0.4" - string-width "^1.0.1" + slice-ansi "^3.0.0" + string-width "^4.2.0" cli-width@^2.0.0: version "2.2.1" @@ -5433,7 +5456,7 @@ clone@^1.0.0, clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -clsx@^1.0.2, clsx@^1.0.4: +clsx@^1.0.4, clsx@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.0.tgz#62937c6adfea771247c34b54d320fb99624f5702" integrity sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA== @@ -6203,10 +6226,10 @@ 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.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== -currency-flags@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/currency-flags/-/currency-flags-2.1.1.tgz#3f6ac283fb8db34dd1d17eb3705e2634f4d5e047" - integrity sha512-BR6wcXBpl3a8gH5AjgtvAHNkAAXlGErocnoc5LE6E3GPA+qHFas4/CCe4KNnSfgWubHIciKveSeLFnHtdsM/pA== +currency-flags@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/currency-flags/-/currency-flags-2.1.2.tgz#483bbc69fcc7f0de00ec3a781047767311feba9d" + integrity sha512-AZJd+8cq3Ikxfrp14bU8EDzdyogEOBhSJE7xqkYVYE1QYPq+EGs8sXKxXU9ik5AG18L0VEBRd6I+wl9tzefbFQ== currently-unhandled@^0.4.1: version "0.4.1" @@ -6249,12 +6272,12 @@ data-urls@^1.1.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -date-fns@2.12.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.12.0.tgz#01754c8a2f3368fc1119cf4625c3dad8c1845ee6" - integrity sha512-qJgn99xxKnFgB1qL4jpxU7Q2t0LOn1p8KMIveef3UZD7kqjT3tpFNNdXJelEHhE+rUgffriXriw/sOSU+cS1Hw== +date-fns@2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.13.0.tgz#d7b8a0a2d392e8d88a8024d0a46b980bbfdbd708" + integrity sha512-xm0c61mevGF7f0XpCGtDTGpzEFC/1fpLXHbmFpxZZQJuvByIK2ozm6cSYuU+nxFYOPh2EuCfzUwlTEFwKG+h5w== -date-fns@^1.27.2, date-fns@^1.30.1: +date-fns@^1.30.1: version "1.30.1" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== @@ -6296,7 +6319,7 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -debuglog@^1.0.1: +debuglog@*, debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= @@ -6949,10 +6972,10 @@ electron-is-dev@^1.1.0: resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-1.2.0.tgz#2e5cea0a1b3ccf1c86f577cee77363ef55deb05e" integrity sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw== -electron-log@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-4.1.1.tgz#c57e3d833f723742eb430dc2cdaa6f97d8dbcaff" - integrity sha512-vkK3rNBOciRiinxrsdgg8hyUia+ct8ZMjBblvKjgNk4uHEDjjSyn313NOwv75xOMVIKlfmYzxaN8kR/oGC33aQ== +electron-log@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-4.1.2.tgz#da1fdf1950965ec0cf3a04803054e4202083251d" + integrity sha512-MGPjGBEj6p0JdJmbqxbGud7kkHdV+T+D7gq1U+mfsnUM+o0bd4nPsQjVdgqQPsj0epoKdGbNIZ4FPpTQKhRfZA== electron-notarize@^0.2.1: version "0.2.1" @@ -7003,19 +7026,18 @@ electron-to-chromium@^1.3.413: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.414.tgz#9d0a92defefda7cc1cf8895058b892795ddd6b41" integrity sha512-UfxhIvED++qLwWrAq9uYVcqF8FdeV9sU2S7qhiHYFODxzXRrd1GZRl/PjITHsTEejgibcWDraD8TQqoHb1aCBQ== -electron-updater@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.2.0.tgz#f9ecfc657f65ead737d42b9efecf628d3756b550" - integrity sha512-GuS3g7HDh17x/SaFjxjswlWUaKHczksYkV2Xc5CKj/bZH0YCvTSHtOmnBAdAmCk99u/71p3zP8f0jIqDfGcjww== +electron-updater@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.1.tgz#9d485b6262bc56fcf7ee62b1dc1b3b105a3e96a7" + integrity sha512-UDC5AHCgeiHJYDYWZG/rsl1vdAFKqI/Lm7whN57LKAk8EfhTewhcEHzheRcncLgikMcQL8gFo1KeX51tf5a5Wg== dependencies: - "@types/semver" "^6.0.2" - builder-util-runtime "8.4.0" - fs-extra "^8.1.0" + "@types/semver" "^7.1.0" + builder-util-runtime "8.7.0" + fs-extra "^9.0.0" js-yaml "^3.13.1" lazy-val "^1.0.4" lodash.isequal "^4.5.0" - pako "^1.0.10" - semver "^6.3.0" + semver "^7.1.3" electron@7.1.8: version "7.1.8" @@ -7026,10 +7048,10 @@ electron@7.1.8: "@types/node" "^12.0.12" extract-zip "^1.0.3" -elegant-spinner@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" - integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= +elegant-spinner@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-2.0.0.tgz#f236378985ecd16da75488d166be4b688fd5af94" + integrity sha512-5YRYHhvhYzV/FC4AiMdeSIg3jAYGq9xFvbhZMpPlJoBsfYgrw2DSCYeXfat6tYBu45PWiyRr3+flaCPPmviPaA== elliptic@6.3.3: version "6.3.3" @@ -7140,6 +7162,13 @@ enhanced-resolve@^4.1.0: memory-fs "^0.5.0" tapable "^1.0.0" +enquirer@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.5.tgz#3ab2b838df0a9d8ab9e7dff235b0e8712ef92381" + integrity sha512-BNT1C08P9XD0vNg3J475yIUG+mVdp9T6towYFHUv897X0KoHBjB1shyrNmhmtHWKP17iSWgo7Gqh7BBuzLZMSA== + dependencies: + ansi-colors "^3.2.1" + entities@1.0: version "1.0.0" resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" @@ -8565,14 +8594,6 @@ figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== -figures@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -8580,7 +8601,7 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.0.0: +figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -8921,7 +8942,7 @@ fs-extra@6.0.1, fs-extra@^6.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@9.0.0: +fs-extra@9.0.0, fs-extra@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== @@ -9539,11 +9560,6 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -gud@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" - integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== - gulp-sourcemaps@^1.5.2: version "1.12.1" resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz#b437d1f3d980cf26e81184823718ce15ae6597b6" @@ -10192,7 +10208,7 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" -imurmurhash@^0.1.4: +imurmurhash@*, imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -10694,13 +10710,6 @@ is-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= -is-observable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== - dependencies: - symbol-observable "^1.1.0" - is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -12482,10 +12491,10 @@ linked-list@0.1.0: resolved "https://registry.yarnpkg.com/linked-list/-/linked-list-0.1.0.tgz#798b0ff97d1b92a4fd08480f55aea4e9d49d37bf" integrity sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78= -lint-staged@10.1.7: - version "10.1.7" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.1.7.tgz#b628f8b010083fe4e116d0af7949a32f1ea6b3a7" - integrity sha512-ZkK8t9Ep/AHuJQKV95izSa+DqotftGnSsNeEmCSqbQ6j4C4H0jDYhEZqVOGD1Q2Oe227igbqjMWycWyYbQtpoA== +lint-staged@10.2.2: + version "10.2.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.2.tgz#901403c120eb5d9443a0358b55038b04c8a7db9b" + integrity sha512-78kNqNdDeKrnqWsexAmkOU3Z5wi+1CsQmUmfCuYgMTE8E4rAIX8RHW7xgxwAZ+LAayb7Cca4uYX4P3LlevzjVg== dependencies: chalk "^4.0.0" commander "^5.0.0" @@ -12493,7 +12502,7 @@ lint-staged@10.1.7: debug "^4.1.1" dedent "^0.7.0" execa "^4.0.0" - listr "^0.14.3" + listr2 "1.3.8" log-symbols "^3.0.0" micromatch "^4.0.2" normalize-path "^3.0.0" @@ -12501,49 +12510,25 @@ lint-staged@10.1.7: string-argv "0.3.1" stringify-object "^3.3.0" -listr-silent-renderer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" - integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= - -listr-update-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" - integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - elegant-spinner "^1.0.1" - figures "^1.7.0" - indent-string "^3.0.0" - log-symbols "^1.0.2" - log-update "^2.3.0" - strip-ansi "^3.0.1" - -listr-verbose-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" - integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== - dependencies: - chalk "^2.4.1" - cli-cursor "^2.1.0" - date-fns "^1.27.2" - figures "^2.0.0" - -listr@^0.14.3: - version "0.14.3" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" - integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== +listr2@1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-1.3.8.tgz#30924d79de1e936d8c40af54b6465cb814a9c828" + integrity sha512-iRDRVTgSDz44tBeBBg/35TQz4W+EZBWsDUq7hPpqeUHm7yLPNll0rkwW3lIX9cPAK7l+x95mGWLpxjqxftNfZA== dependencies: "@samverschueren/stream-to-observable" "^0.3.0" - is-observable "^1.1.0" - is-promise "^2.1.0" - is-stream "^1.1.0" - listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.5.0" - listr-verbose-renderer "^0.5.0" - p-map "^2.0.0" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-truncate "^2.1.0" + elegant-spinner "^2.0.0" + enquirer "^2.3.4" + figures "^3.2.0" + indent-string "^4.0.0" + log-update "^4.0.0" + p-map "^4.0.0" + pad "^3.2.0" rxjs "^6.3.3" + through "^2.3.8" + uuid "^7.0.2" load-json-file@^1.0.0, load-json-file@^1.1.0: version "1.1.0" @@ -12652,6 +12637,11 @@ lodash-es@^4.2.1: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== +lodash._baseindexof@*: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" + integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= + lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -12660,11 +12650,33 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" +lodash._bindcallback@*: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= + +lodash._cacheindexof@*: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" + integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= + +lodash._createcache@*: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" + integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= + dependencies: + lodash._getnative "^3.0.0" + lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= +lodash._getnative@*, lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -12740,6 +12752,11 @@ lodash.rest@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.rest/-/lodash.rest-4.0.5.tgz#954ef75049262038c96d1fc98b28fdaf9f0772aa" integrity sha1-lU73UEkmIDjJbR/Jiyj9r58Hcqo= +lodash.restparam@*: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -12804,13 +12821,6 @@ lodash@4.17.14: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= - dependencies: - chalk "^1.0.0" - log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -12825,14 +12835,15 @@ log-symbols@^3.0.0: dependencies: chalk "^2.4.2" -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" loglevel@^1.6.6, loglevel@^1.6.7: version "1.6.8" @@ -13296,14 +13307,13 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= -mini-create-react-context@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz#79fc598f283dd623da8e088b05db8cddab250189" - integrity sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw== +mini-create-react-context@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040" + integrity sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA== dependencies: - "@babel/runtime" "^7.4.0" - gud "^1.0.0" - tiny-warning "^1.0.2" + "@babel/runtime" "^7.5.5" + tiny-warning "^1.0.3" mini-css-extract-plugin@0.9.0: version "0.9.0" @@ -13451,7 +13461,7 @@ mkdirp@0.5.1: dependencies: minimist "0.0.8" -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -13501,7 +13511,7 @@ mold-source-map@~0.4.0: convert-source-map "^1.1.0" through "~2.2.7" -moment@^2.24.0: +moment@2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== @@ -13791,7 +13801,7 @@ noop-logger@^0.1.1: resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= -nopt@^4.0.1, nopt@~4.0.1: +nopt@^4.0.1, nopt@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== @@ -13965,7 +13975,7 @@ npm-programmatic@0.0.6: dependencies: bluebird "^3.4.1" -npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.3: +npm-registry-fetch@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.3.tgz#3c2179e39e04f9348b1c2979545951d36bee8766" integrity sha512-WGvUx0lkKFhu9MbiGFuT9nG2NpfQ+4dCJwRwwtK2HK5izJEvwDxMeUyqbuMS7N/OkpVCqDorV6rO5E4V9F8lJw== @@ -13978,6 +13988,19 @@ npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.3: npm-package-arg "^6.1.0" safe-buffer "^5.2.0" +npm-registry-fetch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.4.tgz#2da1ecf3f43d419d96abf313664291a4623d3ea5" + integrity sha512-6jb34hX/iYNQebqWUHtU8YF6Cjb1H6ouTFPClYsyiW6lpFkljTpdeftm53rRojtja1rKAvKNIIiTS5Sjpw4wsA== + dependencies: + JSONStream "^1.3.4" + bluebird "^3.5.1" + figgy-pudding "^3.4.1" + lru-cache "^5.1.1" + make-fetch-happen "^5.0.0" + npm-package-arg "^6.1.0" + safe-buffer "^5.2.0" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -13997,10 +14020,10 @@ npm-user-validate@~1.0.0: resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" integrity sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE= -npm@^6.14.4: - version "6.14.4" - resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.4.tgz#50a1c6274fb451ca18f6ff472d2a73f006adbd66" - integrity sha512-B8UDDbWvdkW6RgXFn8/h2cHJP/u/FPa4HWeGzW23aNEBARN3QPrRaHqPIZW2NSN3fW649gtgUDNZpaRs0zTMPw== +npm@6.14.5: + version "6.14.5" + resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.5.tgz#2cc59a3158cdd8461b486d0584c74ab554567219" + integrity sha512-CDwa3FJd0XJpKDbWCST484H+mCNjF26dPrU+xnREW+upR0UODjMEfXPl3bxWuAwZIX6c2ASg1plLO7jP8ehWeA== dependencies: JSONStream "^1.3.5" abbrev "~1.1.1" @@ -14030,7 +14053,7 @@ npm@^6.14.4: fs-write-stream-atomic "~1.0.10" gentle-fs "^2.3.0" glob "^7.1.6" - graceful-fs "^4.2.3" + graceful-fs "^4.2.4" has-unicode "~2.0.1" hosted-git-info "^2.8.8" iferr "^1.0.2" @@ -14060,10 +14083,10 @@ npm@^6.14.4: lru-cache "^5.1.1" meant "~1.0.1" mississippi "^3.0.0" - mkdirp "^0.5.4" + mkdirp "^0.5.5" move-concurrently "^1.0.1" node-gyp "^5.1.0" - nopt "~4.0.1" + nopt "^4.0.3" normalize-package-data "^2.5.0" npm-audit-report "^1.3.2" npm-cache-filename "~1.0.2" @@ -14073,7 +14096,7 @@ npm@^6.14.4: npm-packlist "^1.4.8" npm-pick-manifest "^3.0.2" npm-profile "^4.0.4" - npm-registry-fetch "^4.0.3" + npm-registry-fetch "^4.0.4" npm-user-validate "~1.0.0" npmlog "~4.1.2" once "~1.4.0" @@ -14556,6 +14579,13 @@ p-map@^3.0.0: dependencies: aggregate-error "^3.0.0" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + p-retry@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" @@ -14636,7 +14666,14 @@ pacote@^9.1.0, pacote@^9.5.12, pacote@^9.5.3: unique-filename "^1.1.1" which "^1.3.1" -pako@^1.0.10, pako@^1.0.4, pako@~1.0.5: +pad@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/pad/-/pad-3.2.0.tgz#be7a1d1cb6757049b4ad5b70e71977158fea95d1" + integrity sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg== + dependencies: + wcwidth "^1.0.1" + +pako@^1.0.4, pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== @@ -14993,7 +15030,14 @@ pocket-js-core@0.0.3: dependencies: axios "^0.18.0" -polished@3.5.2, polished@^3.5.1: +polished@3.6.3: + version "3.6.3" + resolved "https://registry.yarnpkg.com/polished/-/polished-3.6.3.tgz#68f4fe7ffad46530733029b939dd12978200cb59" + integrity sha512-QJ0q0b6gX1+0OJtPMfgVJxV0vg5XTa4im+Rca989dAtmsd/fEky3X+0A+V+OUXq1nyiDGplJwqD853dTS0gkPg== + dependencies: + "@babel/runtime" "^7.9.2" + +polished@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/polished/-/polished-3.5.2.tgz#ca132b8cd68f7ffa95ae9d423f03e7a14fda1062" integrity sha512-vWoRDg3gY5RQBtUfcj9MRN10VCIf4EkdUikGxyXItg2Hnwk+eIVtdBiLajN0ldFeT3Vq4r/QNbjrQdhqBKrTug== @@ -15387,6 +15431,11 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.1 source-map "^0.6.1" supports-color "^6.1.0" +preact@^10.3.3: + version "10.4.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431" + integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== + prebuild-install@^5.3.3: version "5.3.3" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.3.tgz#ef4052baac60d465f5ba6bf003c9c1de79b9da8e" @@ -15914,10 +15963,10 @@ react-ga@^2.7.0: resolved "https://registry.yarnpkg.com/react-ga/-/react-ga-2.7.0.tgz#24328f157f31e8cffbf4de74a3396536679d8d7c" integrity sha512-AjC7UOZMvygrWTc2hKxTDvlMXEtbmA0IgJjmkhgmQQ3RkXrWR11xEagLGFGaNyaPnmg24oaIiaNPnEoftUhfXA== -react-hot-loader@4.12.20: - version "4.12.20" - resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.12.20.tgz#c2c42362a7578e5c30357a5ff7afa680aa0bef8a" - integrity sha512-lPlv1HVizi0lsi+UFACBJaydtRYILWkfHAC/lyCs6ZlAxlOZRQIfYHDqiGaRvL/GF7zyti+Qn9XpnDAUvdFA4A== +react-hot-loader@4.12.21: + version "4.12.21" + resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.12.21.tgz#332e830801fb33024b5a147d6b13417f491eb975" + integrity sha512-Ynxa6ROfWUeKWsTHxsrL2KMzujxJVPjs385lmB2t5cHUxdoRPGind9F00tOkdc1l5WBleOF4XEAMILY1KPIIDA== dependencies: fast-levenshtein "^2.0.6" global "^4.3.0" @@ -15958,39 +16007,39 @@ react-redux@7.2.0: prop-types "^15.7.2" react-is "^16.9.0" -react-router-dom@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.1.2.tgz#06701b834352f44d37fbb6311f870f84c76b9c18" - integrity sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew== +react-router-dom@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== dependencies: "@babel/runtime" "^7.1.2" history "^4.9.0" loose-envify "^1.3.1" prop-types "^15.6.2" - react-router "5.1.2" + react-router "5.2.0" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418" - integrity sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A== +react-router@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== dependencies: "@babel/runtime" "^7.1.2" history "^4.9.0" hoist-non-react-statics "^3.1.0" loose-envify "^1.3.1" - mini-create-react-context "^0.3.0" + mini-create-react-context "^0.4.0" path-to-regexp "^1.7.0" prop-types "^15.6.2" react-is "^16.6.0" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-transition-group@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.3.0.tgz#fea832e386cf8796c58b61874a3319704f5ce683" - integrity sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw== +react-transition-group@^4.4.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" + integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== dependencies: "@babel/runtime" "^7.5.5" dom-helpers "^5.0.1" @@ -16600,7 +16649,7 @@ request-promise-core@1.1.3: dependencies: lodash "^4.17.15" -request-promise-native@^1.0.7, request-promise-native@^1.0.8: +request-promise-native@^1.0.7: version "1.0.8" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== @@ -16619,7 +16668,7 @@ request-promise@^4.2.2: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.12.0, request@^2.55.0, request@^2.79.0, request@^2.85.0, request@^2.88.0, request@^2.88.2: +request@^2.12.0, request@^2.55.0, request@^2.79.0, request@^2.85.0, request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -16924,7 +16973,7 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.2, rxjs@^6.5.3, rxjs@^6.5.5: +rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.2, rxjs@^6.5.3, rxjs@^6.5.4, rxjs@^6.5.5: version "6.5.5" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== @@ -17181,7 +17230,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.2, semver@^7.1.2: +semver@7.3.2, semver@^7.1.2, semver@^7.1.3: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== @@ -17434,11 +17483,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= - slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -17448,6 +17492,24 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + slide@^1.1.6, slide@~1.1.3, slide@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -18288,7 +18350,24 @@ swarm-js@0.1.39: tar "^4.0.2" xhr-request-promise "^0.1.2" -symbol-observable@^1.0.2, symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.1.0, symbol-observable@^1.2.0: +swarm-js@^0.1.40: + version "0.1.40" + resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" + integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA== + dependencies: + bluebird "^3.5.0" + buffer "^5.0.5" + eth-lib "^0.1.26" + fs-extra "^4.0.2" + got "^7.1.0" + mime-types "^2.1.16" + mkdirp-promise "^5.0.1" + mock-fs "^4.1.0" + setimmediate "^1.0.5" + tar "^4.0.2" + xhr-request "^1.0.1" + +symbol-observable@^1.0.2, symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== @@ -18560,7 +18639,7 @@ tiny-relative-date@^1.3.0: resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== -tiny-warning@^1.0.0, tiny-warning@^1.0.2: +tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== @@ -18713,13 +18792,13 @@ tree-kill@^1.2.1: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -trezor-connect@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/trezor-connect/-/trezor-connect-7.0.1.tgz#e57103729026177a92bfdefb64dd0d38f921ab1f" - integrity sha512-cMPwSGMfBpp4z5AZvpRwbYNOJU/X+WaxPm+O1Bl1qsdtpl1P4mX81KDtImY6GBk0xC8aKyOd/ZIqYWXZF9tCRQ== +trezor-connect@^8.1.2: + version "8.1.3" + resolved "https://registry.yarnpkg.com/trezor-connect/-/trezor-connect-8.1.3.tgz#79a2b221977abd8f1a2469dc7f30e7edd17a74d6" + integrity sha512-mVDd7UhJc4twP+BRAurSafB/zsBG/SzmDFF12bEf0Ot/r7yM14/mFEv0OT1oadqvSKx/xz9vHhAK0zeePjdHmg== dependencies: - "@babel/runtime" "^7.3.1" - events "^3.0.0" + "@babel/runtime" "^7.9.2" + events "^3.1.0" whatwg-fetch "^3.0.0" trim-newlines@^2.0.0: @@ -19467,7 +19546,7 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -usb@^1.6.0: +usb@^1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/usb/-/usb-1.6.3.tgz#c0bc14994e8f9cb16f9602ec0dbadaa57cb919f5" integrity sha512-23KYMjaWydACd8wgGKMQ4MNwFspAT6Xeim4/9Onqe5Rz/nMb4TM/WHL+qPT0KNFxzNKzAs63n1xQWGEtgaQ2uw== @@ -19575,7 +19654,7 @@ uuid@3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== -uuid@7.0.3: +uuid@7.0.3, uuid@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== @@ -19713,16 +19792,15 @@ w3c-xmlserializer@^1.1.2: webidl-conversions "^4.0.2" xml-name-validator "^3.0.0" -wait-on@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-4.0.2.tgz#6ee9b5751b4e0329630abbb5fdba787802b32914" - integrity sha512-Qpmgm3Hw/sXm7xK68FBsYy5r+Uid94/QymwnEjn9GTpfiWTUVYm0bccivVwY/BXGYO2r+5Cd8S/DzrRZqHK/9w== +wait-on@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-5.0.0.tgz#72e554b338490bbc7131362755ca1af04f46d029" + integrity sha512-6v9lttmGGRT7Lr16E/0rISTBIV1DN72n9+77Bpt1iBfzmhBI+75RDlacFe0Q+JizkmwWXmgHUcFG5cgx3Bwqzw== dependencies: "@hapi/joi" "^17.1.1" + axios "^0.19.2" lodash "^4.17.15" minimist "^1.2.5" - request "^2.88.2" - request-promise-native "^1.0.8" rxjs "^6.5.5" walker@^1.0.7, walker@~1.0.5: @@ -19732,6 +19810,17 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" +walletlink@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/walletlink/-/walletlink-2.0.2.tgz#8640e42d3df49b4661019287ab9789e94b72db98" + integrity sha512-4MIctCHAjcPHSQUHpHuU9leUAvYqRF+/4kCq7x9AngZQ2Jd74dbpC8dfZ55uOwW8TXc7z9XYeSyzRrGHbv5ZXg== + dependencies: + bind-decorator "^1.0.11" + bn.js "^5.1.1" + clsx "^1.1.0" + preact "^10.3.3" + rxjs "^6.5.4" + watchpack@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2" @@ -19774,6 +19863,16 @@ web3-bzz@1.2.6: swarm-js "0.1.39" underscore "1.9.1" +web3-bzz@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.7.tgz#aa0f3d162f0777a5f35367dc5b70012dd1e129d0" + integrity sha512-iTIWBR+Z+Bn09WprtKm46LmyNOasg2lUn++AjXkBTB8UNxlUybxtza84yl2ETTZUs0zuFzdSSAEgbjhygG+9oA== + dependencies: + "@types/node" "^10.12.18" + got "9.6.0" + swarm-js "^0.1.40" + underscore "1.9.1" + web3-core-helpers@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz#f5f32d71c60a4a3bd14786118e633ce7ca6d5d0d" @@ -19792,6 +19891,15 @@ web3-core-helpers@1.2.6: web3-eth-iban "1.2.6" web3-utils "1.2.6" +web3-core-helpers@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.7.tgz#522f859775ea0d15e7e40359c46d4efc5da92aee" + integrity sha512-bdU++9QATGeCetVrMp8pV97aQtVkN5oLBf/TWu/qumC6jK/YqrvLlBJLdwbz0QveU8zOSap6GCvJbqKvmmbV2A== + dependencies: + underscore "1.9.1" + web3-eth-iban "1.2.7" + web3-utils "1.2.7" + web3-core-method@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.1.tgz#9df1bafa2cd8be9d9937e01c6a47fc768d15d90a" @@ -19814,6 +19922,17 @@ web3-core-method@1.2.6: web3-core-subscriptions "1.2.6" web3-utils "1.2.6" +web3-core-method@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.7.tgz#73fd80d2bf0765ff6efc454db49ac83d1769a45e" + integrity sha512-e1TI0QUnByDMbQ8QHwnjxfjKw0LIgVRY4TYrlPijET9ebqUJU1HCayn/BHIMpV6LKyR1fQj9EldWyT64wZQXkg== + dependencies: + underscore "1.9.1" + web3-core-helpers "1.2.7" + web3-core-promievent "1.2.7" + web3-core-subscriptions "1.2.7" + web3-utils "1.2.7" + web3-core-promievent@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz#003e8a3eb82fb27b6164a6d5b9cad04acf733838" @@ -19830,6 +19949,13 @@ web3-core-promievent@1.2.6: any-promise "1.3.0" eventemitter3 "3.1.2" +web3-core-promievent@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.7.tgz#fc7fa489f4cf76a040800f3dfd4b45c51bd3a39f" + integrity sha512-jNmsM/czCeMGQqKKwM9/HZVTJVIF96hdMVNN/V9TGvp+EEE7vDhB4pUocDnc/QF9Z/5QFBCVmvNWttlRgZmU0A== + dependencies: + eventemitter3 "3.1.2" + web3-core-requestmanager@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz#fa2e2206c3d738db38db7c8fe9c107006f5c6e3d" @@ -19852,6 +19978,17 @@ web3-core-requestmanager@1.2.6: web3-providers-ipc "1.2.6" web3-providers-ws "1.2.6" +web3-core-requestmanager@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.7.tgz#9da0efce898ead7004d4ac50f748f5131cfe4d79" + integrity sha512-HJb/txjHixu1dxIebiZQKBoJCaNu4gsh7mq/uj6Z/w6tIHbybL90s/7ADyMED353yyJ2tDWtYJqeMVAR+KtdaA== + dependencies: + underscore "1.9.1" + web3-core-helpers "1.2.7" + web3-providers-http "1.2.7" + web3-providers-ipc "1.2.7" + web3-providers-ws "1.2.7" + web3-core-subscriptions@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz#8c2368a839d4eec1c01a4b5650bbeb82d0e4a099" @@ -19870,6 +20007,15 @@ web3-core-subscriptions@1.2.6: underscore "1.9.1" web3-core-helpers "1.2.6" +web3-core-subscriptions@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.7.tgz#30c64aede03182832883b17c77e21cbb0933c86e" + integrity sha512-W/CzQYOUawdMDvkgA/fmLsnG5aMpbjrs78LZMbc0MFXLpH3ofqAgO2by4QZrrTShUUTeWS0ZuEkFFL/iFrSObw== + dependencies: + eventemitter3 "3.1.2" + underscore "1.9.1" + web3-core-helpers "1.2.7" + web3-core@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.1.tgz#7278b58fb6495065e73a77efbbce781a7fddf1a9" @@ -19892,6 +20038,19 @@ web3-core@1.2.6: web3-core-requestmanager "1.2.6" web3-utils "1.2.6" +web3-core@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.7.tgz#9248b04331e458c76263d758c51b0cc612953900" + integrity sha512-QA0MTae0gXcr3KHe3cQ4x56+Wh43ZKWfMwg1gfCc3NNxPRM1jJ8qudzyptCAUcxUGXWpDG8syLIn1APDz5J8BQ== + dependencies: + "@types/bn.js" "^4.11.4" + "@types/node" "^12.6.1" + bignumber.js "^9.0.0" + web3-core-helpers "1.2.7" + web3-core-method "1.2.7" + web3-core-requestmanager "1.2.7" + web3-utils "1.2.7" + web3-eth-abi@1.0.0-beta.52: version "1.0.0-beta.52" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.52.tgz#88dc2d36e2f99dfe255f8f64b6f613bad82779d8" @@ -19920,6 +20079,15 @@ web3-eth-abi@1.2.6: underscore "1.9.1" web3-utils "1.2.6" +web3-eth-abi@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.7.tgz#6f3471b578649fddd844a14d397a3dd430fc44a5" + integrity sha512-4FnlT1q+D0XBkxSMXlIb/eG337uQeMaUdtVQ4PZ3XzxqpcoDuMgXm4o+3NRxnWmr4AMm6QKjM+hcC7c0mBKcyg== + dependencies: + ethers "4.0.0-beta.3" + underscore "1.9.1" + web3-utils "1.2.7" + web3-eth-accounts@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz#2741a8ef337a7219d57959ac8bd118b9d68d63cf" @@ -19955,6 +20123,23 @@ web3-eth-accounts@1.2.6: web3-core-method "1.2.6" web3-utils "1.2.6" +web3-eth-accounts@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.7.tgz#087f55d04a01b815b93151aac2fc1677436b9c59" + integrity sha512-AE7QWi/iIQIjXwlAPtlMabm/OPFF0a1PhxT1EiTckpYNP8fYs6jW7lYxEtJPPJIKqfMjoi1xkEqTVR1YZQ88lg== + dependencies: + "@web3-js/scrypt-shim" "^0.1.0" + crypto-browserify "3.12.0" + eth-lib "^0.2.8" + ethereumjs-common "^1.3.2" + ethereumjs-tx "^2.1.1" + underscore "1.9.1" + uuid "3.3.2" + web3-core "1.2.7" + web3-core-helpers "1.2.7" + web3-core-method "1.2.7" + web3-utils "1.2.7" + web3-eth-contract@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz#3542424f3d341386fd9ff65e78060b85ac0ea8c4" @@ -19984,6 +20169,21 @@ web3-eth-contract@1.2.6, web3-eth-contract@^1.2.6: web3-eth-abi "1.2.6" web3-utils "1.2.6" +web3-eth-contract@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.7.tgz#13d7f6003d6221f9a5fd61c2d3b5d039477c9674" + integrity sha512-uW23Y0iL7XroRNbf9fWZ1N6OYhEYTJX8gTuYASuRnpYrISN5QGiQML6pq/NCzqypR1bl5E0fuINZQSK/xefIVw== + dependencies: + "@types/bn.js" "^4.11.4" + underscore "1.9.1" + web3-core "1.2.7" + web3-core-helpers "1.2.7" + web3-core-method "1.2.7" + web3-core-promievent "1.2.7" + web3-core-subscriptions "1.2.7" + web3-eth-abi "1.2.7" + web3-utils "1.2.7" + web3-eth-ens@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz#a0e52eee68c42a8b9865ceb04e5fb022c2d971d5" @@ -20012,6 +20212,20 @@ web3-eth-ens@1.2.6: web3-eth-contract "1.2.6" web3-utils "1.2.6" +web3-eth-ens@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.7.tgz#0bfa7d4b6c7753abbb31a2eb01a364b538f4c860" + integrity sha512-SPRnvUNWQ0CnnTDBteGIJkvFWEizJcAHlVsrFLICwcwFZu+appjX1UOaoGu2h3GXWtc/XZlu7B451Gi+Os2cTg== + dependencies: + eth-ens-namehash "2.0.8" + underscore "1.9.1" + web3-core "1.2.7" + web3-core-helpers "1.2.7" + web3-core-promievent "1.2.7" + web3-eth-abi "1.2.7" + web3-eth-contract "1.2.7" + web3-utils "1.2.7" + web3-eth-iban@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz#2c3801718946bea24e9296993a975c80b5acf880" @@ -20028,6 +20242,14 @@ web3-eth-iban@1.2.6: bn.js "4.11.8" web3-utils "1.2.6" +web3-eth-iban@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.7.tgz#832809c28586be3c667a713b77a2bcba11b7970f" + integrity sha512-2NrClz1PoQ3nSJBd+91ylCOVga9qbTxjRofq/oSCoHVAEvz3WZyttx9k5DC+0rWqwJF1h69ufFvdHAAlmN/4lg== + dependencies: + bn.js "4.11.8" + web3-utils "1.2.7" + web3-eth-personal@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz#244e9911b7b482dc17c02f23a061a627c6e47faf" @@ -20051,6 +20273,18 @@ web3-eth-personal@1.2.6: web3-net "1.2.6" web3-utils "1.2.6" +web3-eth-personal@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.7.tgz#322cc2b14c37737b21772a53e4185686a04bf9be" + integrity sha512-2OAa1Spz0uB29dwCM8+1y0So7E47A4gKznjBEwXIYEcUIsvwT5X7ofFhC2XxyRpqlIWZSQAxRSSJFyupRRXzyw== + dependencies: + "@types/node" "^12.6.1" + web3-core "1.2.7" + web3-core-helpers "1.2.7" + web3-core-method "1.2.7" + web3-net "1.2.7" + web3-utils "1.2.7" + web3-eth@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.1.tgz#b9989e2557c73a9e8ffdc107c6dafbe72c79c1b0" @@ -20089,6 +20323,25 @@ web3-eth@1.2.6: web3-net "1.2.6" web3-utils "1.2.6" +web3-eth@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.7.tgz#9427daefd3641200679c2946f77fc184dbfb5b4c" + integrity sha512-ljLd0oB4IjWkzFGVan4HkYhJXhSXgn9iaSaxdJixKGntZPgWMJfxeA+uLwTrlxrWzhvy4f+39WnT7wCh5e9TGg== + dependencies: + underscore "1.9.1" + web3-core "1.2.7" + web3-core-helpers "1.2.7" + web3-core-method "1.2.7" + web3-core-subscriptions "1.2.7" + web3-eth-abi "1.2.7" + web3-eth-accounts "1.2.7" + web3-eth-contract "1.2.7" + web3-eth-ens "1.2.7" + web3-eth-iban "1.2.7" + web3-eth-personal "1.2.7" + web3-net "1.2.7" + web3-utils "1.2.7" + web3-net@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.1.tgz#edd249503315dd5ab4fa00220f6509d95bb7ab10" @@ -20107,6 +20360,15 @@ web3-net@1.2.6: web3-core-method "1.2.6" web3-utils "1.2.6" +web3-net@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.7.tgz#c355621a8769c9c1a967c801e7db90c92a0e3808" + integrity sha512-j9qeZrS1FNyCeA0BfdLojkxOZQz3FKa1DJI+Dw9fEVhZS68vLOFANu2RB96gR9BoPHo5+k5D3NsKOoxt1gw3Gg== + dependencies: + web3-core "1.2.7" + web3-core-method "1.2.7" + web3-utils "1.2.7" + web3-provider-engine@14.2.0: version "14.2.0" resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.0.tgz#2efec157b2c429c5c674c079aea96b0a06de8b3d" @@ -20230,6 +20492,14 @@ web3-providers-http@1.2.6: web3-core-helpers "1.2.6" xhr2-cookies "1.1.0" +web3-providers-http@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.7.tgz#31eb15390c103169b3d7d31bdb1ccae9e3f1629d" + integrity sha512-vazGx5onuH/zogrwkUaLFJwFcJ6CckP65VFSHoiV+GTQdkOqgoDIha7StKkslvDz4XJ2FuY/zOZHbtuOYeltXQ== + dependencies: + web3-core-helpers "1.2.7" + xhr2-cookies "1.1.0" + web3-providers-ipc@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz#017bfc687a8fc5398df2241eb98f135e3edd672c" @@ -20248,6 +20518,15 @@ web3-providers-ipc@1.2.6: underscore "1.9.1" web3-core-helpers "1.2.6" +web3-providers-ipc@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.7.tgz#4e6716e8723d431df3d6bfa1acd2f7c04e7071ad" + integrity sha512-/zc0y724H2zbkV4UbGGMhsEiLfafjagIzfrsWZnyTZUlSB0OGRmmFm2EkLJAgtXrLiodaHHyXKM0vB8S24bxdA== + dependencies: + oboe "2.1.4" + underscore "1.9.1" + web3-core-helpers "1.2.7" + web3-providers-ws@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz#2d941eaf3d5a8caa3214eff8dc16d96252b842cb" @@ -20266,6 +20545,16 @@ web3-providers-ws@1.2.6: underscore "1.9.1" web3-core-helpers "1.2.6" +web3-providers-ws@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.7.tgz#95b1cc5dc25e9b9d6630d6754f9354313b62f532" + integrity sha512-b5XzqDpRkNVe6MFs5K6iqOEyjQikHtg3KuU2/ClCDV37hm0WN4xCRVMC0LwegulbDXZej3zT9+1CYzGaGFREzA== + dependencies: + "@web3-js/websocket" "^1.0.29" + eventemitter3 "^4.0.0" + underscore "1.9.1" + web3-core-helpers "1.2.7" + web3-shh@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.1.tgz#4460e3c1e07faf73ddec24ccd00da46f89152b0c" @@ -20286,6 +20575,16 @@ web3-shh@1.2.6: web3-core-subscriptions "1.2.6" web3-net "1.2.6" +web3-shh@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.7.tgz#5382c7bc2f39539eb2841c4576d23ade25720461" + integrity sha512-f6PAgcpG0ZAo98KqCmeHoDEx5qzm3d5plet18DkT4U6WIeYowKdec8vZaLPRR7c2XreXFJ2gQf45CB7oqR7U/w== + dependencies: + web3-core "1.2.7" + web3-core-method "1.2.7" + web3-core-subscriptions "1.2.7" + web3-net "1.2.7" + web3-utils@1.0.0-beta.52: version "1.0.0-beta.52" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.52.tgz#27f9beeac3e1ea981eba9824d79e2971f156eebc" @@ -20329,6 +20628,20 @@ web3-utils@1.2.6, web3-utils@^1.2.1, web3-utils@^1.2.6: underscore "1.9.1" utf8 "3.0.0" +web3-utils@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.7.tgz#b68e232917e4376f81cf38ef79878e5903d18e93" + integrity sha512-FBh/CPJND+eiPeUF9KVbTyTZtXNWxPWtByBaWS6e2x4ACazPX711EeNaZaChIOGSLGe6se2n7kg6wnawe/MjuQ== + dependencies: + bn.js "4.11.8" + eth-lib "0.2.7" + ethereum-bloom-filters "^1.0.6" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + underscore "1.9.1" + utf8 "3.0.0" + web3@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.1.tgz#5d8158bcca47838ab8c2b784a2dee4c3ceb4179b" @@ -20342,19 +20655,18 @@ web3@1.2.1: web3-shh "1.2.1" web3-utils "1.2.1" -web3@1.2.6, web3@^1.0.0-beta.34: - version "1.2.6" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.6.tgz#c497dcb14cdd8d6d9fb6b445b3b68ff83f8ccf68" - integrity sha512-tpu9fLIComgxGrFsD8LUtA4s4aCZk7px8UfcdEy6kS2uDi/ZfR07KJqpXZMij7Jvlq+cQrTAhsPSiBVvoMaivA== +web3@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.7.tgz#fcb83571036c1c6f475bc984785982a444e8d78e" + integrity sha512-jAAJHMfUlTps+jH2li1ckDFEpPrEEriU/ubegSTGRl3KRdNhEqT93+3kd7FHJTn3NgjcyURo2+f7Da1YcZL8Mw== dependencies: - "@types/node" "^12.6.1" - web3-bzz "1.2.6" - web3-core "1.2.6" - web3-eth "1.2.6" - web3-eth-personal "1.2.6" - web3-net "1.2.6" - web3-shh "1.2.6" - web3-utils "1.2.6" + web3-bzz "1.2.7" + web3-core "1.2.7" + web3-eth "1.2.7" + web3-eth-personal "1.2.7" + web3-net "1.2.7" + web3-shh "1.2.7" + web3-utils "1.2.7" web3@^0.18.4: version "0.18.4" @@ -20378,6 +20690,20 @@ web3@^0.20.7: xhr2-cookies "^1.1.0" xmlhttprequest "*" +web3@^1.0.0-beta.34: + version "1.2.6" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.6.tgz#c497dcb14cdd8d6d9fb6b445b3b68ff83f8ccf68" + integrity sha512-tpu9fLIComgxGrFsD8LUtA4s4aCZk7px8UfcdEy6kS2uDi/ZfR07KJqpXZMij7Jvlq+cQrTAhsPSiBVvoMaivA== + dependencies: + "@types/node" "^12.6.1" + web3-bzz "1.2.6" + web3-core "1.2.6" + web3-eth "1.2.6" + web3-eth-personal "1.2.6" + web3-net "1.2.6" + web3-shh "1.2.6" + web3-utils "1.2.6" + webidl-conversions@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" @@ -20557,6 +20883,7 @@ websocket@1.0.29, "websocket@github:web3-js/WebSocket-Node#polyfill/globalThis": 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" @@ -20677,14 +21004,6 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" -wrap-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -20781,7 +21100,7 @@ xhr-request-promise@^0.1.2: dependencies: xhr-request "^1.1.0" -xhr-request@^1.1.0: +xhr-request@^1.0.1, xhr-request@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== From 30105ecda0758ea9fcecf6d5df07b2ac45eae544 Mon Sep 17 00:00:00 2001 From: Mati Dastugue Date: Tue, 12 May 2020 11:40:19 -0300 Subject: [PATCH 32/34] Disable trezor fot the first release --- src/components/Root/OnboardCustom.scss | 8 ++++++-- src/logic/wallets/utils/walletList.js | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/Root/OnboardCustom.scss b/src/components/Root/OnboardCustom.scss index 610ee97e..50f4e1f1 100644 --- a/src/components/Root/OnboardCustom.scss +++ b/src/components/Root/OnboardCustom.scss @@ -1,6 +1,10 @@ /* Onboard.js custom styles */ :global(.bn-onboard-custom.bn-onboard-modal) { - font-family: "Averta"; + font-family: 'Averta'; z-index: 2001; -} \ No newline at end of file +} + +:global(.torusIframe) { + z-index: 9999; +} diff --git a/src/logic/wallets/utils/walletList.js b/src/logic/wallets/utils/walletList.js index ca1ee8d5..04268b2c 100644 --- a/src/logic/wallets/utils/walletList.js +++ b/src/logic/wallets/utils/walletList.js @@ -23,7 +23,7 @@ const wallets = [ appUrl: 'gnosis-safe.io', preferred: true, email: 'safe@gnosis.io', - desktop: true, + desktop: false, rpcUrl: infuraUrl, }, { From 30ab99c79c0212b571a7c475836a8e80bbc819fe Mon Sep 17 00:00:00 2001 From: Agustin Pane Date: Tue, 12 May 2020 15:33:39 -0300 Subject: [PATCH 33/34] (Fix) #876 - Checksummed addresses (#884) * Checksum addresses when build address book from localStorage Checksum owner's addresses when build safe from localStorage * ChecksumAddresses when add new addressBook entry ChecksumAddresses when add new owner ChecksumAddresses when replaces owner * Adds checksumAddress function Replaces old web3 usage with checksumAddress * Refactors all web3.utils.toChecksumAddress with checksumAddress() * Fix duplicating var name --- .../addressBook/store/reducer/addressBook.js | 3 ++- .../safe/transactions/incomingTxHistory.js | 4 ++-- src/logic/safe/transactions/txHistory.js | 8 ++++---- .../safe/components/AddressBook/index.jsx | 20 ++++++++++++++----- .../Tokens/screens/AddCustomToken/index.jsx | 4 ++-- .../ManageOwners/AddOwnerModal/index.jsx | 3 ++- .../ManageOwners/ReplaceOwnerModal/index.jsx | 7 +++++-- src/routes/safe/store/actions/fetchSafe.js | 18 +++++++++-------- .../safe/store/actions/loadDefaultSafe.js | 5 ++--- src/routes/safe/store/reducer/safe.js | 4 ++-- src/routes/safe/store/selectors/index.js | 5 +++-- src/utils/checksumAddress.js | 7 +++++++ 12 files changed, 56 insertions(+), 32 deletions(-) create mode 100644 src/utils/checksumAddress.js diff --git a/src/logic/addressBook/store/reducer/addressBook.js b/src/logic/addressBook/store/reducer/addressBook.js index 93f4ebf7..2f8e5bfb 100644 --- a/src/logic/addressBook/store/reducer/addressBook.js +++ b/src/logic/addressBook/store/reducer/addressBook.js @@ -12,6 +12,7 @@ import { REMOVE_ENTRY } from '~/logic/addressBook/store/actions/removeAddressBoo import { UPDATE_ENTRY } from '~/logic/addressBook/store/actions/updateAddressBookEntry' import { getAddressesListFromAdbk } from '~/logic/addressBook/utils' import { sameAddress } from '~/logic/wallets/ethAddresses' +import { checksumAddress } from '~/utils/checksumAddress' export const ADDRESS_BOOK_REDUCER_ID = 'addressBook' @@ -20,7 +21,7 @@ export type State = Map> export const buildAddressBook = (storedAdbk: AddressBook): AddressBookProps => { let addressBookBuilt = Map([]) Object.entries(storedAdbk).forEach((adbkProps: Array) => { - const safeAddress = adbkProps[0] + const safeAddress = checksumAddress(adbkProps[0]) const adbkRecords = adbkProps[1].map(makeAddressBookEntry) const adbkSafeEntries = List(adbkRecords) addressBookBuilt = addressBookBuilt.set(safeAddress, adbkSafeEntries) diff --git a/src/logic/safe/transactions/incomingTxHistory.js b/src/logic/safe/transactions/incomingTxHistory.js index b716c9c6..36d69a54 100644 --- a/src/logic/safe/transactions/incomingTxHistory.js +++ b/src/logic/safe/transactions/incomingTxHistory.js @@ -1,10 +1,10 @@ // @flow import { getIncomingTxServiceUriTo, getTxServiceHost } from '~/config' -import { getWeb3 } from '~/logic/wallets/getWeb3' +import { checksumAddress } from '~/utils/checksumAddress' export const buildIncomingTxServiceUrl = (safeAddress: string) => { const host = getTxServiceHost() - const address = getWeb3().utils.toChecksumAddress(safeAddress) + const address = checksumAddress(safeAddress) const base = getIncomingTxServiceUriTo(address) return `${host}${base}` diff --git a/src/logic/safe/transactions/txHistory.js b/src/logic/safe/transactions/txHistory.js index e597e8d9..08dcee27 100644 --- a/src/logic/safe/transactions/txHistory.js +++ b/src/logic/safe/transactions/txHistory.js @@ -2,7 +2,7 @@ import axios from 'axios' import { getTxServiceHost, getTxServiceUriFrom } from '~/config' -import { getWeb3 } from '~/logic/wallets/getWeb3' +import { checksumAddress } from '~/utils/checksumAddress' export type TxServiceType = 'confirmation' | 'execution' | 'initialised' export type Operation = 0 | 1 | 2 @@ -38,7 +38,7 @@ const calculateBodyFrom = async ( ) return { - to: getWeb3().utils.toChecksumAddress(to), + to: checksumAddress(to), value: valueInWei, data, operation, @@ -50,7 +50,7 @@ const calculateBodyFrom = async ( refundReceiver, contractTransactionHash, transactionHash, - sender: getWeb3().utils.toChecksumAddress(sender), + sender: checksumAddress(sender), origin, signature, } @@ -58,7 +58,7 @@ const calculateBodyFrom = async ( export const buildTxServiceUrl = (safeAddress: string) => { const host = getTxServiceHost() - const address = getWeb3().utils.toChecksumAddress(safeAddress) + const address = checksumAddress(safeAddress) const base = getTxServiceUriFrom(address) return `${host}${base}` } diff --git a/src/routes/safe/components/AddressBook/index.jsx b/src/routes/safe/components/AddressBook/index.jsx index 1b776314..e9af8066 100644 --- a/src/routes/safe/components/AddressBook/index.jsx +++ b/src/routes/safe/components/AddressBook/index.jsx @@ -44,6 +44,7 @@ import type { OwnerRow } from '~/routes/safe/components/Settings/ManageOwners/da import RemoveOwnerIcon from '~/routes/safe/components/Settings/assets/icons/bin.svg' import RemoveOwnerIconDisabled from '~/routes/safe/components/Settings/assets/icons/disabled-bin.svg' import { addressBookQueryParamsSelector, safesListSelector } from '~/routes/safe/store/selectors' +import { checksumAddress } from '~/utils/checksumAddress' type Props = { classes: Object, @@ -69,7 +70,8 @@ const AddressBookTable = ({ classes }: Props) => { useEffect(() => { if (entryAddressToEditOrCreateNew) { - const key = addressBook.findKey((entry) => entry.address === entryAddressToEditOrCreateNew) + const checksumEntryAdd = checksumAddress(entryAddressToEditOrCreateNew) + const key = addressBook.findKey((entry) => entry.address === checksumEntryAdd) if (key >= 0) { // Edit old entry const value = addressBook.get(key) @@ -79,7 +81,7 @@ const AddressBookTable = ({ classes }: Props) => { setSelectedEntry({ entry: { name: '', - address: entryAddressToEditOrCreateNew, + address: checksumEntryAdd, isNew: true, }, }) @@ -89,17 +91,25 @@ const AddressBookTable = ({ classes }: Props) => { const newEntryModalHandler = (entry: AddressBookEntry) => { setEditCreateEntryModalOpen(false) - dispatch(addAddressBookEntry(makeAddressBookEntry(entry))) + const checksumEntries = { + ...entry, + address: checksumAddress(entry.address), + } + dispatch(addAddressBookEntry(makeAddressBookEntry(checksumEntries))) } const editEntryModalHandler = (entry: AddressBookEntry) => { setSelectedEntry(null) setEditCreateEntryModalOpen(false) - dispatch(updateAddressBookEntry(makeAddressBookEntry(entry))) + const checksumEntries = { + ...entry, + address: checksumAddress(entry.address), + } + dispatch(updateAddressBookEntry(makeAddressBookEntry(checksumEntries))) } const deleteEntryModalHandler = () => { - const entryAddress = selectedEntry.entry.address + const entryAddress = checksumAddress(selectedEntry.entry.address) setSelectedEntry(null) setDeleteEntryModalOpen(false) dispatch(removeAddressBookEntry(entryAddress)) diff --git a/src/routes/safe/components/Balances/Tokens/screens/AddCustomToken/index.jsx b/src/routes/safe/components/Balances/Tokens/screens/AddCustomToken/index.jsx index 085c4c5a..a27be2bb 100644 --- a/src/routes/safe/components/Balances/Tokens/screens/AddCustomToken/index.jsx +++ b/src/routes/safe/components/Balances/Tokens/screens/AddCustomToken/index.jsx @@ -21,8 +21,8 @@ import Img from '~/components/layout/Img' import Paragraph from '~/components/layout/Paragraph' import Row from '~/components/layout/Row' import { type Token, type TokenProps } from '~/logic/tokens/store/model/token' -import { getWeb3 } from '~/logic/wallets/getWeb3' import TokenPlaceholder from '~/routes/safe/components/Balances/assets/token_placeholder.svg' +import { checksumAddress } from '~/utils/checksumAddress' export const ADD_CUSTOM_TOKEN_ADDRESS_INPUT_TEST_ID = 'add-custom-token-address-input' export const ADD_CUSTOM_TOKEN_SYMBOLS_INPUT_TEST_ID = 'add-custom-token-symbols-input' @@ -65,7 +65,7 @@ const AddCustomToken = (props: Props) => { const [formValues, setFormValues] = useState(INITIAL_FORM_STATE) const handleSubmit = (values) => { - const address = getWeb3().utils.toChecksumAddress(values.address) + const address = checksumAddress(values.address) const token = { address, decimals: values.decimals, diff --git a/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/index.jsx b/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/index.jsx index e76e1a4d..29be4886 100644 --- a/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/index.jsx +++ b/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/index.jsx @@ -17,6 +17,7 @@ import addSafeOwner from '~/routes/safe/store/actions/addSafeOwner' import createTransaction from '~/routes/safe/store/actions/createTransaction' import { type Owner } from '~/routes/safe/store/models/owner' import { safeOwnersSelector, safeParamAddressFromStateSelector } from '~/routes/safe/store/selectors' +import { checksumAddress } from '~/utils/checksumAddress' const styles = () => ({ biggerModalWindow: { @@ -91,7 +92,7 @@ const AddOwner = ({ classes, closeSnackbar, enqueueSnackbar, isOpen, onClose }: setValues((stateValues) => ({ ...stateValues, ownerName: newValues.ownerName, - ownerAddress: newValues.ownerAddress, + ownerAddress: checksumAddress(newValues.ownerAddress), })) setActiveScreen('selectThreshold') } diff --git a/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/index.jsx b/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/index.jsx index fdcdb5f1..16258d80 100644 --- a/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/index.jsx +++ b/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/index.jsx @@ -14,6 +14,7 @@ import { TX_NOTIFICATION_TYPES } from '~/logic/safe/transactions' import createTransaction from '~/routes/safe/store/actions/createTransaction' import replaceSafeOwner from '~/routes/safe/store/actions/replaceSafeOwner' import { safeParamAddressFromStateSelector, safeThresholdSelector } from '~/routes/safe/store/selectors' +import { checksumAddress } from '~/utils/checksumAddress' const styles = () => ({ biggerModalWindow: { @@ -96,8 +97,10 @@ const ReplaceOwner = ({ classes, closeSnackbar, enqueueSnackbar, isOpen, onClose const onClickBack = () => setActiveScreen('checkOwner') const ownerSubmitted = (newValues: Object) => { - values.ownerName = newValues.ownerName - values.ownerAddress = newValues.ownerAddress + const { ownerAddress, ownerName } = newValues + const checksumAddr = checksumAddress(ownerAddress) + values.ownerName = ownerName + values.ownerAddress = checksumAddr setValues(values) setActiveScreen('reviewReplaceOwner') } diff --git a/src/routes/safe/store/actions/fetchSafe.js b/src/routes/safe/store/actions/fetchSafe.js index df9b29f3..a85dac77 100644 --- a/src/routes/safe/store/actions/fetchSafe.js +++ b/src/routes/safe/store/actions/fetchSafe.js @@ -7,7 +7,7 @@ import generateBatchRequests from '~/logic/contracts/generateBatchRequests' import { getLocalSafe, getSafeName } from '~/logic/safe/utils' import { enabledFeatures, safeNeedsUpdate } from '~/logic/safe/utils/safeVersion' import { sameAddress } from '~/logic/wallets/ethAddresses' -import { getBalanceInEtherOf, getWeb3 } from '~/logic/wallets/getWeb3' +import { getBalanceInEtherOf } from '~/logic/wallets/getWeb3' import addSafe from '~/routes/safe/store/actions/addSafe' import addSafeOwner from '~/routes/safe/store/actions/addSafeOwner' import removeSafeOwner from '~/routes/safe/store/actions/removeSafeOwner' @@ -15,29 +15,31 @@ import updateSafe from '~/routes/safe/store/actions/updateSafe' import { makeOwner } from '~/routes/safe/store/models/owner' import type { SafeProps } from '~/routes/safe/store/models/safe' import { type GlobalState } from '~/store' +import { checksumAddress } from '~/utils/checksumAddress' const buildOwnersFrom = ( safeOwners: string[], localSafe: SafeProps | {}, // eslint-disable-next-line ) => safeOwners.map((ownerAddress: string) => { + const convertedAdd = checksumAddress(ownerAddress) if (!localSafe) { - return makeOwner({ name: 'UNKNOWN', address: ownerAddress }) + return makeOwner({ name: 'UNKNOWN', address: convertedAdd }) } - const storedOwner = localSafe.owners.find(({ address }) => sameAddress(address, ownerAddress)) + const storedOwner = localSafe.owners.find(({ address }) => sameAddress(address, convertedAdd)) if (!storedOwner) { - return makeOwner({ name: 'UNKNOWN', address: ownerAddress }) + return makeOwner({ name: 'UNKNOWN', address: convertedAdd }) } return makeOwner({ name: storedOwner.name || 'UNKNOWN', - address: ownerAddress, + address: convertedAdd, }) }) export const buildSafe = async (safeAdd: string, safeName: string, latestMasterContractVersion: string) => { - const safeAddress = getWeb3().utils.toChecksumAddress(safeAdd) + const safeAddress = checksumAddress(safeAdd) const safeParams = ['getThreshold', 'nonce', 'VERSION', 'getOwners'] const [[thresholdStr, nonceStr, currentVersion, remoteOwners], localSafe, ethBalance] = await Promise.all([ @@ -72,7 +74,7 @@ export const buildSafe = async (safeAdd: string, safeName: string, latestMasterC } export const checkAndUpdateSafe = (safeAdd: string) => async (dispatch: ReduxDispatch<*>) => { - const safeAddress = getWeb3().utils.toChecksumAddress(safeAdd) + const safeAddress = checksumAddress(safeAdd) // Check if the owner's safe did change and update them const safeParams = ['getThreshold', 'nonce', 'getOwners'] const [[remoteThreshold, remoteNonce, remoteOwners], localSafe] = await Promise.all([ @@ -125,7 +127,7 @@ export const checkAndUpdateSafe = (safeAdd: string) => async (dispatch: ReduxDis // eslint-disable-next-line consistent-return export default (safeAdd: string) => async (dispatch: ReduxDispatch, getState: () => GlobalState) => { try { - const safeAddress = getWeb3().utils.toChecksumAddress(safeAdd) + const safeAddress = checksumAddress(safeAdd) const safeName = (await getSafeName(safeAddress)) || 'LOADED SAFE' const latestMasterContractVersion = getState().safes.get('latestMasterContractVersion') const safeProps: SafeProps = await buildSafe(safeAddress, safeName, latestMasterContractVersion) diff --git a/src/routes/safe/store/actions/loadDefaultSafe.js b/src/routes/safe/store/actions/loadDefaultSafe.js index eec7ce80..1f689102 100644 --- a/src/routes/safe/store/actions/loadDefaultSafe.js +++ b/src/routes/safe/store/actions/loadDefaultSafe.js @@ -4,14 +4,13 @@ import type { Dispatch as ReduxDispatch } from 'redux' import setDefaultSafe from './setDefaultSafe' import { getDefaultSafe } from '~/logic/safe/utils' -import { getWeb3 } from '~/logic/wallets/getWeb3' import { type GlobalState } from '~/store/index' +import { checksumAddress } from '~/utils/checksumAddress' const loadDefaultSafe = () => async (dispatch: ReduxDispatch) => { try { const defaultSafe: string = await getDefaultSafe() - const checksumed = - defaultSafe && defaultSafe.length > 0 ? getWeb3().utils.toChecksumAddress(defaultSafe) : defaultSafe + const checksumed = defaultSafe && defaultSafe.length > 0 ? checksumAddress(defaultSafe) : defaultSafe dispatch(setDefaultSafe(checksumed)) } catch (err) { // eslint-disable-next-line diff --git a/src/routes/safe/store/reducer/safe.js b/src/routes/safe/store/reducer/safe.js index 879d81dd..a8b11db8 100644 --- a/src/routes/safe/store/reducer/safe.js +++ b/src/routes/safe/store/reducer/safe.js @@ -2,7 +2,6 @@ import { Map, Set } from 'immutable' import { type ActionType, handleActions } from 'redux-actions' -import { getWeb3 } from '~/logic/wallets/getWeb3' import { ACTIVATE_TOKEN_FOR_ALL_SAFES } from '~/routes/safe/store/actions/activateTokenForAllSafes' import { ADD_SAFE, buildOwnersFrom } from '~/routes/safe/store/actions/addSafe' import { ADD_SAFE_OWNER } from '~/routes/safe/store/actions/addSafeOwner' @@ -15,6 +14,7 @@ import { SET_LATEST_MASTER_CONTRACT_VERSION } from '~/routes/safe/store/actions/ import { UPDATE_SAFE } from '~/routes/safe/store/actions/updateSafe' import { makeOwner } from '~/routes/safe/store/models/owner' import SafeRecord, { type SafeProps } from '~/routes/safe/store/models/safe' +import { checksumAddress } from '~/utils/checksumAddress' export const SAFE_REDUCER_ID = 'safes' @@ -22,7 +22,7 @@ export type SafeReducerState = Map export const buildSafe = (storedSafe: SafeProps) => { const names = storedSafe.owners.map((owner) => owner.name) - const addresses = storedSafe.owners.map((owner) => getWeb3().utils.toChecksumAddress(owner.address)) + const addresses = storedSafe.owners.map((owner) => checksumAddress(owner.address)) const owners = buildOwnersFrom(Array.from(names), Array.from(addresses)) const activeTokens = Set(storedSafe.activeTokens) const activeAssets = Set(storedSafe.activeAssets) diff --git a/src/routes/safe/store/selectors/index.js b/src/routes/safe/store/selectors/index.js index e346eae2..d38e4ee4 100644 --- a/src/routes/safe/store/selectors/index.js +++ b/src/routes/safe/store/selectors/index.js @@ -19,6 +19,7 @@ import { import { SAFE_REDUCER_ID } from '~/routes/safe/store/reducer/safe' import { TRANSACTIONS_REDUCER_ID, type State as TransactionsState } from '~/routes/safe/store/reducer/transactions' import { type GlobalState } from '~/store/index' +import { checksumAddress } from '~/utils/checksumAddress' export type RouterProps = { match: Match, @@ -76,7 +77,7 @@ export const safeParamAddressFromStateSelector = (state: GlobalState): string | export const safeParamAddressSelector = (state: GlobalState, props: RouterProps) => { const urlAdd = props.match.params[SAFE_PARAM_ADDRESS] - return urlAdd ? getWeb3().utils.toChecksumAddress(urlAdd) : '' + return urlAdd ? checksumAddress(urlAdd) : '' } type TxSelectorType = OutputSelector> @@ -150,7 +151,7 @@ export const safeSelector: OutputSelector { + if (!address) return null + return getWeb3().utils.toChecksumAddress(address) +} From b3b639ae34f351eace68931728efb8b9d94b6426 Mon Sep 17 00:00:00 2001 From: Mati Dastugue Date: Tue, 12 May 2020 16:36:06 -0300 Subject: [PATCH 34/34] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2dba5d6b..ca2de4f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "safe-react", - "version": "2.0.0", + "version": "2.1.0", "description": "Allowing crypto users manage funds in a safer way", "homepage": "https://github.com/gnosis/safe-react#readme", "bugs": {