From cce2dda8e417078892862a3e5a4e74c761a1993e Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Wed, 17 Nov 2021 15:03:36 -0330 Subject: [PATCH 001/129] Remove unused background API methods (#12731) These background API methods were not used anywhere in the UI. One of them was called in `actions.js` by a function that itself was never called, so it have been removed. Additionally, one unused `actions.js` function was found and removed as well. `setAdvancedGasFee` is the only unused background method that remains. It was recently added and will be used in the near future. --- app/scripts/metamask-controller.js | 9 --------- ui/store/actions.js | 19 ------------------- 2 files changed, 28 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 5e1014726..4f4fb7e13 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -1008,9 +1008,7 @@ export default class MetamaskController extends EventEmitter { ), createCancelTransaction: nodeify(this.createCancelTransaction, this), createSpeedUpTransaction: nodeify(this.createSpeedUpTransaction, this), - isNonceTaken: nodeify(txController.isNonceTaken, txController), estimateGas: nodeify(this.estimateGas, this), - getPendingNonce: nodeify(this.getPendingNonce, this), getNextNonce: nodeify(this.getNextNonce, this), addUnapprovedTransaction: nodeify( txController.addUnapprovedTransaction, @@ -1094,13 +1092,6 @@ export default class MetamaskController extends EventEmitter { permissionsController.approvePermissionsRequest, permissionsController, ), - clearPermissions: permissionsController.clearPermissions.bind( - permissionsController, - ), - getApprovedAccounts: nodeify( - permissionsController.getAccounts, - permissionsController, - ), rejectPermissionsRequest: nodeify( permissionsController.rejectPermissionsRequest, permissionsController, diff --git a/ui/store/actions.js b/ui/store/actions.js index b19ae3e9d..e90eb8f6f 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -1356,12 +1356,6 @@ export function acceptWatchAsset(suggestedAssetID) { }; } -export function addKnownMethodData(fourBytePrefix, methodData) { - return () => { - background.addKnownMethodData(fourBytePrefix, methodData); - }; -} - export function clearPendingTokens() { return { type: actionConstants.CLEAR_PENDING_TOKENS, @@ -2403,19 +2397,6 @@ export function removePermissionsFor(domains) { }; } -/** - * Clears all permissions for all domains. - */ -export function clearPermissions() { - return (dispatch) => { - background.clearPermissions((err) => { - if (err) { - dispatch(displayWarning(err.message)); - } - }); - }; -} - // Pending Approvals /** From 0daefe9ea0485c4053e12c5a8141492b42e61551 Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Thu, 18 Nov 2021 23:24:58 +0530 Subject: [PATCH 002/129] Adding edit gas fee modal (#12624) Edit transaction screen changes for EIP-1559 V2 --- app/_locales/en/messages.json | 21 +++++ ui/components/app/app-components.scss | 2 + .../confirm-page-container.component.js | 9 +- .../edit-gas-fee-popover.js | 49 ++++++++++ .../edit-gas-fee-popover.test.js | 93 +++++++++++++++++++ .../edit-gas-item/edit-gas-item.js | 84 +++++++++++++++++ .../edit-gas-item/edit-gas-item.test.js | 93 +++++++++++++++++++ .../edit-gas-item/index.js | 1 + .../edit-gas-item/index.scss | 56 +++++++++++ .../app/edit-gas-fee-popover/index.js | 1 + .../app/edit-gas-fee-popover/index.scss | 35 +++++++ .../app/gas-timing/gas-timing.component.js | 4 +- .../transaction-detail.component.js | 23 ++--- ui/helpers/constants/gas.js | 8 ++ ui/helpers/utils/util.js | 16 ++++ ui/helpers/utils/util.test.js | 39 ++++++++ ui/hooks/gasFeeInput/useGasFeeInputs.js | 34 +++++-- ui/hooks/gasFeeInput/useGasFeeInputs.test.js | 1 + .../gasFeeInput/useTransactionFunctions.js | 49 ++++++++++ .../gas-details-item/gas-details-item.js | 6 +- .../low-priority-message.js | 4 +- 21 files changed, 593 insertions(+), 35 deletions(-) create mode 100644 ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js create mode 100644 ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js create mode 100644 ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js create mode 100644 ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js create mode 100644 ui/components/app/edit-gas-fee-popover/edit-gas-item/index.js create mode 100644 ui/components/app/edit-gas-fee-popover/edit-gas-item/index.scss create mode 100644 ui/components/app/edit-gas-fee-popover/index.js create mode 100644 ui/components/app/edit-gas-fee-popover/index.scss create mode 100644 ui/hooks/gasFeeInput/useTransactionFunctions.js diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index b3cbda168..f4ad0c777 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -710,6 +710,9 @@ "editGasEducationModalTitle": { "message": "How to choose?" }, + "editGasFeeModalTitle": { + "message": "Edit gas fee" + }, "editGasHigh": { "message": "High" }, @@ -1011,6 +1014,9 @@ "message": "Gas limit must be at least $1", "description": "$1 is the custom gas limit, in decimal." }, + "gasOption": { + "message": "Gas option" + }, "gasPrice": { "message": "Gas Price (GWEI)" }, @@ -1032,10 +1038,18 @@ "gasPriceLabel": { "message": "Gas price" }, + "gasTimingHoursShort": { + "message": "$1 hrs", + "description": "$1 represents a number of hours" + }, "gasTimingMinutes": { "message": "$1 minutes", "description": "$1 represents a number of minutes" }, + "gasTimingMinutesShort": { + "message": "$1 min", + "description": "$1 represents a number of minutes" + }, "gasTimingNegative": { "message": "Maybe in $1", "description": "$1 represents an amount of time" @@ -1048,6 +1062,10 @@ "message": "$1 seconds", "description": "$1 represents a number of seconds" }, + "gasTimingSecondsShort": { + "message": "$1 sec", + "description": "$1 represents a number of seconds" + }, "gasTimingVeryPositive": { "message": "Very likely in < $1", "description": "$1 represents an amount of time" @@ -2793,6 +2811,9 @@ "thisWillCreate": { "message": "This will create a new wallet and Secret Recovery Phrase" }, + "time": { + "message": "Time" + }, "tips": { "message": "Tips" }, diff --git a/ui/components/app/app-components.scss b/ui/components/app/app-components.scss index d76c2998f..e5a5a1882 100644 --- a/ui/components/app/app-components.scss +++ b/ui/components/app/app-components.scss @@ -13,6 +13,8 @@ @import 'connected-status-indicator/index'; @import 'edit-gas-display/index'; @import 'edit-gas-display-education/index'; +@import 'edit-gas-fee-popover/index'; +@import 'edit-gas-fee-popover/edit-gas-item/index'; @import 'gas-customization/gas-modal-page-container/index'; @import 'gas-customization/gas-price-button-group/index'; @import 'gas-customization/index'; diff --git a/ui/components/app/confirm-page-container/confirm-page-container.component.js b/ui/components/app/confirm-page-container/confirm-page-container.component.js index 117318e3d..33c07d56a 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container.component.js @@ -8,12 +8,16 @@ import { GasFeeContextProvider } from '../../../contexts/gasFee'; import ErrorMessage from '../../ui/error-message'; import { TRANSACTION_TYPES } from '../../../../shared/constants/transaction'; import Dialog from '../../ui/dialog'; +import EditGasFeePopover from '../edit-gas-fee-popover/edit-gas-fee-popover'; import { ConfirmPageContainerHeader, ConfirmPageContainerContent, ConfirmPageContainerNavigation, } from '.'; +// eslint-disable-next-line prefer-destructuring +const EIP_1559_V2 = process.env.EIP_1559_V2; + export default class ConfirmPageContainer extends Component { static contextTypes = { t: PropTypes.func, @@ -225,13 +229,16 @@ export default class ConfirmPageContainer extends Component { )} )} - {editingGas && ( + {editingGas && !EIP_1559_V2 && ( )} + {editingGas && EIP_1559_V2 && ( + + )} ); diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js new file mode 100644 index 000000000..84f31a256 --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js @@ -0,0 +1,49 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import { useI18nContext } from '../../../hooks/useI18nContext'; +import Popover from '../../ui/popover'; +import I18nValue from '../../ui/i18n-value'; +import LoadingHeartBeat from '../../ui/loading-heartbeat'; + +import EditGasItem from './edit-gas-item'; + +const EditGasFeePopover = ({ onClose }) => { + const t = useI18nContext(); + + return ( + + <> + {process.env.IN_TEST === 'true' ? null : } +
+
+
+ + + + + + + + + +
+ + + +
+
+ +
+ ); +}; + +EditGasFeePopover.propTypes = { + onClose: PropTypes.func, +}; + +export default EditGasFeePopover; diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js new file mode 100644 index 000000000..cd4f772dc --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js @@ -0,0 +1,93 @@ +import React from 'react'; +import { screen } from '@testing-library/react'; + +import { renderWithProvider } from '../../../../test/lib/render-helpers'; +import { ETH } from '../../../helpers/constants/common'; +import configureStore from '../../../store/store'; +import { GasFeeContextProvider } from '../../../contexts/gasFee'; + +import EditGasFeePopover from './edit-gas-fee-popover'; + +jest.mock('../../../store/actions', () => ({ + disconnectGasFeeEstimatePoller: jest.fn(), + getGasFeeEstimatesAndStartPolling: jest + .fn() + .mockImplementation(() => Promise.resolve()), + addPollingTokenToAppState: jest.fn(), +})); + +const MOCK_FEE_ESTIMATE = { + low: { + minWaitTimeEstimate: 360000, + maxWaitTimeEstimate: 300000, + suggestedMaxPriorityFeePerGas: '3', + suggestedMaxFeePerGas: '53', + }, + medium: { + minWaitTimeEstimate: 30000, + maxWaitTimeEstimate: 60000, + suggestedMaxPriorityFeePerGas: '7', + suggestedMaxFeePerGas: '70', + }, + high: { + minWaitTimeEstimate: 15000, + maxWaitTimeEstimate: 15000, + suggestedMaxPriorityFeePerGas: '10', + suggestedMaxFeePerGas: '100', + }, + estimatedBaseFee: '50', +}; + +const renderComponent = () => { + const store = configureStore({ + metamask: { + nativeCurrency: ETH, + provider: {}, + cachedBalances: {}, + accounts: { + '0xAddress': { + address: '0xAddress', + balance: '0x176e5b6f173ebe66', + }, + }, + selectedAddress: '0xAddress', + featureFlags: { advancedInlineGas: true }, + gasFeeEstimates: MOCK_FEE_ESTIMATE, + }, + }); + + return renderWithProvider( + + + , + store, + ); +}; + +describe('EditGasFeePopover', () => { + it('should renders low / medium / high options', () => { + renderComponent(); + + expect(screen.queryByText('🐢')).toBeInTheDocument(); + expect(screen.queryByText('🦊')).toBeInTheDocument(); + expect(screen.queryByText('🦍')).toBeInTheDocument(); + expect(screen.queryByText('Low')).toBeInTheDocument(); + expect(screen.queryByText('Market')).toBeInTheDocument(); + expect(screen.queryByText('Aggressive')).toBeInTheDocument(); + }); + + it('should show time estimates', () => { + renderComponent(); + console.log(document.body.innerHTML); + expect(screen.queryByText('6 min')).toBeInTheDocument(); + expect(screen.queryByText('30 sec')).toBeInTheDocument(); + expect(screen.queryByText('15 sec')).toBeInTheDocument(); + }); + + it('should show gas fee estimates', () => { + renderComponent(); + expect(screen.queryByTitle('0.001113 ETH')).toBeInTheDocument(); + expect(screen.queryByTitle('0.00147 ETH')).toBeInTheDocument(); + expect(screen.queryByTitle('0.0021 ETH')).toBeInTheDocument(); + }); +}); diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js new file mode 100644 index 000000000..59cf3ac01 --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js @@ -0,0 +1,84 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; + +import { getMaximumGasTotalInHexWei } from '../../../../../shared/modules/gas.utils'; +import { PRIORITY_LEVEL_ICON_MAP } from '../../../../helpers/constants/gas'; +import { PRIMARY } from '../../../../helpers/constants/common'; +import { + decGWEIToHexWEI, + decimalToHex, +} from '../../../../helpers/utils/conversions.util'; +import { toHumanReadableTime } from '../../../../helpers/utils/util'; +import { useGasFeeContext } from '../../../../contexts/gasFee'; +import { useI18nContext } from '../../../../hooks/useI18nContext'; +import I18nValue from '../../../ui/i18n-value'; +import InfoTooltip from '../../../ui/info-tooltip'; +import UserPreferencedCurrencyDisplay from '../../user-preferenced-currency-display'; + +const EditGasItem = ({ estimateType, onClose }) => { + const { + estimateUsed, + gasFeeEstimates, + gasLimit, + setEstimateToUse, + updateTransaction, + } = useGasFeeContext(); + const t = useI18nContext(); + + const { minWaitTimeEstimate, suggestedMaxFeePerGas } = + gasFeeEstimates[estimateType] || {}; + const hexMaximumTransactionFee = suggestedMaxFeePerGas + ? getMaximumGasTotalInHexWei({ + gasLimit: decimalToHex(gasLimit), + maxFeePerGas: decGWEIToHexWEI(suggestedMaxFeePerGas), + }) + : null; + + const onOptionSelect = () => { + setEstimateToUse(estimateType); + updateTransaction(estimateType); + onClose(); + }; + + return ( +
+ + + {PRIORITY_LEVEL_ICON_MAP[estimateType]} + + + + + {minWaitTimeEstimate && toHumanReadableTime(t, minWaitTimeEstimate)} + + + + + + + +
+ ); +}; + +EditGasItem.propTypes = { + estimateType: PropTypes.string, + onClose: PropTypes.func, +}; + +export default EditGasItem; diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js new file mode 100644 index 000000000..4d8a40f88 --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js @@ -0,0 +1,93 @@ +import React from 'react'; +import { screen } from '@testing-library/react'; + +import { renderWithProvider } from '../../../../../test/lib/render-helpers'; +import { ETH } from '../../../../helpers/constants/common'; +import configureStore from '../../../../store/store'; +import { GasFeeContextProvider } from '../../../../contexts/gasFee'; + +import EditGasItem from './edit-gas-item'; + +jest.mock('../../../../store/actions', () => ({ + disconnectGasFeeEstimatePoller: jest.fn(), + getGasFeeEstimatesAndStartPolling: jest + .fn() + .mockImplementation(() => Promise.resolve()), + addPollingTokenToAppState: jest.fn(), +})); + +const MOCK_FEE_ESTIMATE = { + low: { + minWaitTimeEstimate: 360000, + maxWaitTimeEstimate: 300000, + suggestedMaxPriorityFeePerGas: '3', + suggestedMaxFeePerGas: '53', + }, + medium: { + minWaitTimeEstimate: 30000, + maxWaitTimeEstimate: 60000, + suggestedMaxPriorityFeePerGas: '7', + suggestedMaxFeePerGas: '70', + }, + high: { + minWaitTimeEstimate: 15000, + maxWaitTimeEstimate: 15000, + suggestedMaxPriorityFeePerGas: '10', + suggestedMaxFeePerGas: '100', + }, + estimatedBaseFee: '50', +}; + +const renderComponent = (props) => { + const store = configureStore({ + metamask: { + nativeCurrency: ETH, + provider: {}, + cachedBalances: {}, + accounts: { + '0xAddress': { + address: '0xAddress', + balance: '0x176e5b6f173ebe66', + }, + }, + selectedAddress: '0xAddress', + featureFlags: { advancedInlineGas: true }, + gasFeeEstimates: MOCK_FEE_ESTIMATE, + }, + }); + + return renderWithProvider( + + + , + store, + ); +}; + +describe('EditGasItem', () => { + it('should renders low gas estimate options for estimateType low', () => { + renderComponent({ estimateType: 'low' }); + + expect(screen.queryByText('🐢')).toBeInTheDocument(); + expect(screen.queryByText('Low')).toBeInTheDocument(); + expect(screen.queryByText('6 min')).toBeInTheDocument(); + expect(screen.queryByTitle('0.001113 ETH')).toBeInTheDocument(); + }); + + it('should renders market gas estimate options for estimateType medium', () => { + renderComponent({ estimateType: 'medium' }); + + expect(screen.queryByText('🦊')).toBeInTheDocument(); + expect(screen.queryByText('Market')).toBeInTheDocument(); + expect(screen.queryByText('30 sec')).toBeInTheDocument(); + expect(screen.queryByTitle('0.00147 ETH')).toBeInTheDocument(); + }); + + it('should renders aggressive gas estimate options for estimateType high', () => { + renderComponent({ estimateType: 'high' }); + + expect(screen.queryByText('🦍')).toBeInTheDocument(); + expect(screen.queryByText('15 sec')).toBeInTheDocument(); + expect(screen.queryByTitle('0.0021 ETH')).toBeInTheDocument(); + }); +}); diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.js new file mode 100644 index 000000000..3ba916857 --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.js @@ -0,0 +1 @@ +export { default } from './edit-gas-item'; diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.scss b/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.scss new file mode 100644 index 000000000..17072a813 --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.scss @@ -0,0 +1,56 @@ +.edit-gas-item { + border-radius: 24px; + color: $ui-4; + cursor: pointer; + font-size: 12px; + margin: 12px 0; + padding: 4px 12px; + height: 32px; + + &--selected { + background-color: $ui-1; + } + + &__name { + display: inline-block; + color: $ui-black; + font-size: 12px; + font-weight: bold; + width: 40%; + } + + &__icon { + margin-right: 4px; + } + + &__time-estimate { + display: inline-block; + width: 20%; + } + + &__fee-estimate { + display: inline-block; + width: 30%; + white-space: nowrap; + } + + &__tooltip { + display: inline-block; + text-align: right; + width: 10%; + + .info-tooltip { + display: inline-block; + } + } + + &__time-estimate-low, + &__fee-estimate-high { + color: $secondary-1; + } + + &__time-estimate-medium, + &__time-estimate-high { + color: $success-3; + } +} diff --git a/ui/components/app/edit-gas-fee-popover/index.js b/ui/components/app/edit-gas-fee-popover/index.js new file mode 100644 index 000000000..d2e6862b9 --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/index.js @@ -0,0 +1 @@ +export { default } from './edit-gas-fee-popover'; diff --git a/ui/components/app/edit-gas-fee-popover/index.scss b/ui/components/app/edit-gas-fee-popover/index.scss new file mode 100644 index 000000000..0e149efbc --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/index.scss @@ -0,0 +1,35 @@ +.edit-gas-fee-popover { + @media screen and (min-width: $break-large) { + max-height: 84vh; + } + + &__wrapper { + border-top: 1px solid $ui-grey; + } + + &__content { + padding: 16px 12px; + + &__header { + color: $ui-4; + font-size: 10px; + font-weight: 700; + margin: 0 12px; + + &-option { + display: inline-block; + width: 40%; + } + + &-time { + display: inline-block; + width: 20%; + } + + &-max-fee { + display: inline-block; + width: 30%; + } + } + } +} diff --git a/ui/components/app/gas-timing/gas-timing.component.js b/ui/components/app/gas-timing/gas-timing.component.js index 41fc6bed5..1da1c6a43 100644 --- a/ui/components/app/gas-timing/gas-timing.component.js +++ b/ui/components/app/gas-timing/gas-timing.component.js @@ -50,7 +50,7 @@ export default function GasTiming({ const [customEstimatedTime, setCustomEstimatedTime] = useState(null); const t = useContext(I18nContext); - const { estimateToUse } = useGasFeeContext(); + const { estimateUsed } = useGasFeeContext(); // If the user has chosen a value lower than the low gas fee estimate, // We'll need to use the useEffect hook below to make a call to calculate @@ -155,7 +155,7 @@ export default function GasTiming({ ]); } } else { - if (!EIP_1559_V2 || estimateToUse === 'low') { + if (!EIP_1559_V2 || estimateUsed === 'low') { attitude = 'negative'; } // If the user has chosen a value less than our low estimate, diff --git a/ui/components/app/transaction-detail/transaction-detail.component.js b/ui/components/app/transaction-detail/transaction-detail.component.js index b06d43af8..64677883a 100644 --- a/ui/components/app/transaction-detail/transaction-detail.component.js +++ b/ui/components/app/transaction-detail/transaction-detail.component.js @@ -1,40 +1,29 @@ -import React, { useContext } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; -import { I18nContext } from '../../../contexts/i18n'; import { useGasFeeContext } from '../../../contexts/gasFee'; import InfoTooltip from '../../ui/info-tooltip/info-tooltip'; import Typography from '../../ui/typography/typography'; import TransactionDetailItem from '../transaction-detail-item/transaction-detail-item.component'; import { COLORS } from '../../../helpers/constants/design-system'; - -const GasLevelIconMap = { - low: '🐢', - medium: '🦊', - high: '🦍', - dappSuggested: '🌐', - custom: '⚙', -}; +import { PRIORITY_LEVEL_ICON_MAP } from '../../../helpers/constants/gas'; +import { useI18nContext } from '../../../hooks/useI18nContext'; export default function TransactionDetail({ rows = [], onEdit }) { // eslint-disable-next-line prefer-destructuring const EIP_1559_V2 = process.env.EIP_1559_V2; - const t = useContext(I18nContext); + const t = useI18nContext(); const { - estimateToUse, gasLimit, gasPrice, - isUsingDappSuggestedGasFees, + estimateUsed, maxFeePerGas, maxPriorityFeePerGas, transaction, supportsEIP1559, } = useGasFeeContext(); - const estimateUsed = isUsingDappSuggestedGasFees - ? 'dappSuggested' - : estimateToUse; if (EIP_1559_V2 && estimateUsed) { return ( @@ -42,7 +31,7 @@ export default function TransactionDetail({ rows = [], onEdit }) {
diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js index cd4f772dc..2131e0205 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js @@ -71,16 +71,18 @@ describe('EditGasFeePopover', () => { expect(screen.queryByText('🐢')).toBeInTheDocument(); expect(screen.queryByText('🦊')).toBeInTheDocument(); expect(screen.queryByText('🦍')).toBeInTheDocument(); + expect(screen.queryByText('🌐')).toBeInTheDocument(); + expect(screen.queryByText('⚙')).toBeInTheDocument(); expect(screen.queryByText('Low')).toBeInTheDocument(); expect(screen.queryByText('Market')).toBeInTheDocument(); expect(screen.queryByText('Aggressive')).toBeInTheDocument(); + expect(screen.queryByText('Site')).toBeInTheDocument(); + expect(screen.queryByText('Advanced')).toBeInTheDocument(); }); it('should show time estimates', () => { renderComponent(); - console.log(document.body.innerHTML); - expect(screen.queryByText('6 min')).toBeInTheDocument(); - expect(screen.queryByText('30 sec')).toBeInTheDocument(); + expect(screen.queryAllByText('5 min')).toHaveLength(2); expect(screen.queryByText('15 sec')).toBeInTheDocument(); }); diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js index 59cf3ac01..9fe5d5889 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js @@ -1,14 +1,18 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; +import { useSelector } from 'react-redux'; import { getMaximumGasTotalInHexWei } from '../../../../../shared/modules/gas.utils'; +import { PRIORITY_LEVELS } from '../../../../../shared/constants/gas'; import { PRIORITY_LEVEL_ICON_MAP } from '../../../../helpers/constants/gas'; import { PRIMARY } from '../../../../helpers/constants/common'; import { decGWEIToHexWEI, decimalToHex, + hexWEIToDecGWEI, } from '../../../../helpers/utils/conversions.util'; +import { getAdvancedGasFeeValues } from '../../../../selectors'; import { toHumanReadableTime } from '../../../../helpers/utils/util'; import { useGasFeeContext } from '../../../../contexts/gasFee'; import { useI18nContext } from '../../../../hooks/useI18nContext'; @@ -16,58 +20,120 @@ import I18nValue from '../../../ui/i18n-value'; import InfoTooltip from '../../../ui/info-tooltip'; import UserPreferencedCurrencyDisplay from '../../user-preferenced-currency-display'; -const EditGasItem = ({ estimateType, onClose }) => { +import { useCustomTimeEstimate } from './useCustomTimeEstimate'; + +const EditGasItem = ({ priorityLevel, onClose }) => { const { estimateUsed, gasFeeEstimates, gasLimit, - setEstimateToUse, - updateTransaction, + maxFeePerGas: maxFeePerGasValue, + maxPriorityFeePerGas: maxPriorityFeePerGasValue, + updateTransactionUsingGasFeeEstimates, + transaction: { dappSuggestedGasFees }, } = useGasFeeContext(); const t = useI18nContext(); + const advancedGasFeeValues = useSelector(getAdvancedGasFeeValues); + let maxFeePerGas; + let maxPriorityFeePerGas; + let minWaitTime; + + if (gasFeeEstimates[priorityLevel]) { + maxFeePerGas = gasFeeEstimates[priorityLevel].suggestedMaxFeePerGas; + } else if ( + priorityLevel === PRIORITY_LEVELS.DAPP_SUGGESTED && + dappSuggestedGasFees + ) { + maxFeePerGas = hexWEIToDecGWEI(dappSuggestedGasFees.maxFeePerGas); + maxPriorityFeePerGas = hexWEIToDecGWEI( + dappSuggestedGasFees.maxPriorityFeePerGas, + ); + } else if (priorityLevel === PRIORITY_LEVELS.CUSTOM) { + if (estimateUsed === PRIORITY_LEVELS.CUSTOM) { + maxFeePerGas = maxFeePerGasValue; + maxPriorityFeePerGas = maxPriorityFeePerGasValue; + } else if (advancedGasFeeValues) { + maxFeePerGas = + gasFeeEstimates.estimatedBaseFee * + parseFloat(advancedGasFeeValues.maxBaseFee); + maxPriorityFeePerGas = advancedGasFeeValues.priorityFee; + } + } + + const { waitTimeEstimate } = useCustomTimeEstimate({ + gasFeeEstimates, + maxFeePerGas, + maxPriorityFeePerGas, + }); - const { minWaitTimeEstimate, suggestedMaxFeePerGas } = - gasFeeEstimates[estimateType] || {}; - const hexMaximumTransactionFee = suggestedMaxFeePerGas + if (gasFeeEstimates[priorityLevel]) { + minWaitTime = + priorityLevel === PRIORITY_LEVELS.HIGH + ? gasFeeEstimates?.high.minWaitTimeEstimate + : gasFeeEstimates?.low.maxWaitTimeEstimate; + } else { + minWaitTime = waitTimeEstimate; + } + + const hexMaximumTransactionFee = maxFeePerGas ? getMaximumGasTotalInHexWei({ gasLimit: decimalToHex(gasLimit), - maxFeePerGas: decGWEIToHexWEI(suggestedMaxFeePerGas), + maxFeePerGas: decGWEIToHexWEI(maxFeePerGas), }) : null; const onOptionSelect = () => { - setEstimateToUse(estimateType); - updateTransaction(estimateType); + if (priorityLevel !== PRIORITY_LEVELS.CUSTOM) { + updateTransactionUsingGasFeeEstimates(priorityLevel); + } + // todo: open advance modal if priorityLevel is custom onClose(); }; return (
- - {PRIORITY_LEVEL_ICON_MAP[estimateType]} + + {PRIORITY_LEVEL_ICON_MAP[priorityLevel]} - + - {minWaitTimeEstimate && toHumanReadableTime(t, minWaitTimeEstimate)} + {minWaitTime + ? minWaitTime && toHumanReadableTime(t, minWaitTime) + : '--'} - + {hexMaximumTransactionFee ? ( + + ) : ( + '--' + )} @@ -77,7 +143,7 @@ const EditGasItem = ({ estimateType, onClose }) => { }; EditGasItem.propTypes = { - estimateType: PropTypes.string, + priorityLevel: PropTypes.string, onClose: PropTypes.func, }; diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js index 4d8a40f88..30280fe11 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js @@ -14,6 +14,9 @@ jest.mock('../../../../store/actions', () => ({ .fn() .mockImplementation(() => Promise.resolve()), addPollingTokenToAppState: jest.fn(), + getGasFeeTimeEstimate: jest + .fn() + .mockImplementation(() => Promise.resolve('unknown')), })); const MOCK_FEE_ESTIMATE = { @@ -38,7 +41,12 @@ const MOCK_FEE_ESTIMATE = { estimatedBaseFee: '50', }; -const renderComponent = (props) => { +const DAPP_SUGGESTED_ESTIMATE = { + maxFeePerGas: '0x59682f10', + maxPriorityFeePerGas: '0x59682f00', +}; + +const renderComponent = (props, transactionProps, gasFeeContextProps) => { const store = configureStore({ metamask: { nativeCurrency: ETH, @@ -53,41 +61,78 @@ const renderComponent = (props) => { selectedAddress: '0xAddress', featureFlags: { advancedInlineGas: true }, gasFeeEstimates: MOCK_FEE_ESTIMATE, + advancedGasFee: { + maxBaseFee: '1.5', + priorityFee: '2', + }, }, }); return renderWithProvider( - - + + , store, ); }; describe('EditGasItem', () => { - it('should renders low gas estimate options for estimateType low', () => { - renderComponent({ estimateType: 'low' }); - + it('should renders low gas estimate option for priorityLevel low', () => { + renderComponent({ priorityLevel: 'low' }); expect(screen.queryByText('🐢')).toBeInTheDocument(); expect(screen.queryByText('Low')).toBeInTheDocument(); - expect(screen.queryByText('6 min')).toBeInTheDocument(); + expect(screen.queryByText('5 min')).toBeInTheDocument(); expect(screen.queryByTitle('0.001113 ETH')).toBeInTheDocument(); }); - it('should renders market gas estimate options for estimateType medium', () => { - renderComponent({ estimateType: 'medium' }); - + it('should renders market gas estimate option for priorityLevel medium', () => { + renderComponent({ priorityLevel: 'medium' }); expect(screen.queryByText('🦊')).toBeInTheDocument(); expect(screen.queryByText('Market')).toBeInTheDocument(); - expect(screen.queryByText('30 sec')).toBeInTheDocument(); + expect(screen.queryByText('5 min')).toBeInTheDocument(); expect(screen.queryByTitle('0.00147 ETH')).toBeInTheDocument(); }); - it('should renders aggressive gas estimate options for estimateType high', () => { - renderComponent({ estimateType: 'high' }); - + it('should renders aggressive gas estimate option for priorityLevel high', () => { + renderComponent({ priorityLevel: 'high' }); expect(screen.queryByText('🦍')).toBeInTheDocument(); + expect(screen.queryByText('Aggressive')).toBeInTheDocument(); expect(screen.queryByText('15 sec')).toBeInTheDocument(); expect(screen.queryByTitle('0.0021 ETH')).toBeInTheDocument(); }); + + it('should highlight option is priorityLevel is currently selected', () => { + renderComponent({ priorityLevel: 'high' }, { userFeeLevel: 'high' }); + expect( + document.getElementsByClassName('edit-gas-item-selected'), + ).toHaveLength(1); + }); + + it('should renders site gas estimate option for priorityLevel dappSuggested', () => { + renderComponent( + { priorityLevel: 'dappSuggested' }, + { dappSuggestedGasFees: DAPP_SUGGESTED_ESTIMATE }, + ); + expect(screen.queryByText('🌐')).toBeInTheDocument(); + expect(screen.queryByText('Site')).toBeInTheDocument(); + expect(screen.queryByTitle('0.0000315 ETH')).toBeInTheDocument(); + }); + + it('should disable site gas estimate option for is transaction does not have dappSuggestedGasFees', async () => { + renderComponent({ priorityLevel: 'dappSuggested' }); + expect( + document.getElementsByClassName('edit-gas-item-disabled'), + ).toHaveLength(1); + }); + + it('should renders advance gas estimate option for priorityLevel custom', () => { + renderComponent({ priorityLevel: 'custom' }); + expect(screen.queryByText('⚙')).toBeInTheDocument(); + expect(screen.queryByText('Advanced')).toBeInTheDocument(); + // below value of custom gas fee estimate is default obtained from state.metamask.advancedGasFee + expect(screen.queryByTitle('0.001575 ETH')).toBeInTheDocument(); + }); }); diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.scss b/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.scss index 17072a813..95061e43a 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.scss +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.scss @@ -3,6 +3,8 @@ color: $ui-4; cursor: pointer; font-size: 12px; + display: flex; + align-items: center; margin: 12px 0; padding: 4px 12px; height: 32px; @@ -11,8 +13,13 @@ background-color: $ui-1; } + &-disabled { + cursor: default; + } + &__name { - display: inline-block; + display: inline-flex; + align-items: center; color: $ui-black; font-size: 12px; font-weight: bold; @@ -21,6 +28,11 @@ &__icon { margin-right: 4px; + + &-custom { + font-size: 20px; + line-height: 0; + } } &__time-estimate { diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/useCustomTimeEstimate.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/useCustomTimeEstimate.js new file mode 100644 index 000000000..41d6c59ed --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/useCustomTimeEstimate.js @@ -0,0 +1,83 @@ +import { useEffect, useState } from 'react'; +import { useSelector } from 'react-redux'; +import BigNumber from 'bignumber.js'; + +import { GAS_ESTIMATE_TYPES } from '../../../../../shared/constants/gas'; +import { + getGasEstimateType, + getIsGasEstimatesLoading, +} from '../../../../ducks/metamask/metamask'; +import { getGasFeeTimeEstimate } from '../../../../store/actions'; + +export const useCustomTimeEstimate = ({ + gasFeeEstimates, + maxFeePerGas, + maxPriorityFeePerGas, +}) => { + const gasEstimateType = useSelector(getGasEstimateType); + const isGasEstimatesLoading = useSelector(getIsGasEstimatesLoading); + + const [customEstimatedTime, setCustomEstimatedTime] = useState(null); + + const returnNoEstimates = + isGasEstimatesLoading || + gasEstimateType !== GAS_ESTIMATE_TYPES.FEE_MARKET || + !maxPriorityFeePerGas; + + // If the user has chosen a value lower than the low gas fee estimate, + // We'll need to use the useEffect hook below to make a call to calculate + // the time to show + const isUnknownLow = + gasFeeEstimates?.low && + Number(maxPriorityFeePerGas) < + Number(gasFeeEstimates.low.suggestedMaxPriorityFeePerGas); + + useEffect(() => { + if ( + isGasEstimatesLoading || + gasEstimateType !== GAS_ESTIMATE_TYPES.FEE_MARKET || + !maxPriorityFeePerGas + ) + return; + if (isUnknownLow) { + // getGasFeeTimeEstimate requires parameters in string format + getGasFeeTimeEstimate( + new BigNumber(maxPriorityFeePerGas, 10).toString(10), + new BigNumber(maxFeePerGas, 10).toString(10), + ).then((result) => { + setCustomEstimatedTime(result); + }); + } + }, [ + gasEstimateType, + isUnknownLow, + isGasEstimatesLoading, + maxFeePerGas, + maxPriorityFeePerGas, + returnNoEstimates, + ]); + + if (returnNoEstimates) { + return {}; + } + + const { low = {}, medium = {}, high = {} } = gasFeeEstimates; + let waitTimeEstimate = ''; + + if ( + isUnknownLow && + customEstimatedTime && + customEstimatedTime !== 'unknown' && + customEstimatedTime?.upperTimeBound !== 'unknown' + ) { + waitTimeEstimate = Number(customEstimatedTime?.upperTimeBound); + } else if ( + Number(maxPriorityFeePerGas) >= Number(medium.suggestedMaxPriorityFeePerGas) + ) { + waitTimeEstimate = high.minWaitTimeEstimate; + } else { + waitTimeEstimate = low.maxWaitTimeEstimate; + } + + return { waitTimeEstimate }; +}; diff --git a/ui/components/app/edit-gas-fee-popover/index.scss b/ui/components/app/edit-gas-fee-popover/index.scss index 0e149efbc..f892e8a71 100644 --- a/ui/components/app/edit-gas-fee-popover/index.scss +++ b/ui/components/app/edit-gas-fee-popover/index.scss @@ -31,5 +31,10 @@ width: 30%; } } + + &__separator { + border-top: 1px solid $ui-grey; + margin: 8px 12px; + } } } diff --git a/ui/components/app/transaction-detail/transaction-detail.component.js b/ui/components/app/transaction-detail/transaction-detail.component.js index 64677883a..2f000e59e 100644 --- a/ui/components/app/transaction-detail/transaction-detail.component.js +++ b/ui/components/app/transaction-detail/transaction-detail.component.js @@ -17,12 +17,10 @@ export default function TransactionDetail({ rows = [], onEdit }) { const t = useI18nContext(); const { gasLimit, - gasPrice, estimateUsed, maxFeePerGas, maxPriorityFeePerGas, transaction, - supportsEIP1559, } = useGasFeeContext(); if (EIP_1559_V2 && estimateUsed) { @@ -48,23 +46,14 @@ export default function TransactionDetail({ rows = [], onEdit }) { {t('dappSuggestedTooltip', [transaction.origin])} - {supportsEIP1559 ? ( - <> - - {t('maxBaseFee')} - {maxFeePerGas} - - - {t('maxPriorityFee')} - {maxPriorityFeePerGas} - - - ) : ( - - {t('gasPriceLabel')} - {gasPrice} - - )} + + {t('maxBaseFee')} + {maxFeePerGas} + + + {t('maxPriorityFee')} + {maxPriorityFeePerGas} + {t('gasLimit')} {gasLimit} diff --git a/ui/contexts/gasFee.js b/ui/contexts/gasFee.js index c7fe7f092..65242fe94 100644 --- a/ui/contexts/gasFee.js +++ b/ui/contexts/gasFee.js @@ -31,7 +31,7 @@ export function useGasFeeContext() { GasFeeContextProvider.propTypes = { children: PropTypes.node.isRequired, defaultEstimateToUse: PropTypes.string, - transaction: PropTypes.object.isRequired, + transaction: PropTypes.object, minimumGasLimit: PropTypes.string, editGasMode: PropTypes.string, }; diff --git a/ui/hooks/gasFeeInput/useGasFeeInputs.js b/ui/hooks/gasFeeInput/useGasFeeInputs.js index b7d457aa7..f65897c71 100644 --- a/ui/hooks/gasFeeInput/useGasFeeInputs.js +++ b/ui/hooks/gasFeeInput/useGasFeeInputs.js @@ -1,4 +1,4 @@ -import { useCallback, useState } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import { useSelector } from 'react-redux'; import { @@ -108,6 +108,19 @@ export function useGasFeeInputs( return estimateToUse; }); + /** + * In EIP-1559 V2 designs change to gas estimate is always updated to transaction + * Thus callback setEstimateToUse can be deprecate in favour of this useEffect + * so that transaction is source of truth whenever possible. + */ + useEffect(() => { + if (areDappSuggestedAndTxParamGasFeesTheSame(transaction)) { + setEstimateUsed('dappSuggested'); + } else if (transaction?.userFeeLevel) { + setEstimateUsed(transaction?.userFeeLevel); + } + }, [setEstimateUsed, transaction]); + const [gasLimit, setGasLimit] = useState(() => Number(hexToDecimal(transaction?.txParams?.gas ?? '0x0')), ); @@ -198,7 +211,7 @@ export function useGasFeeInputs( } }, [minimumGasLimit, gasErrors.gasLimit, transaction]); - const { updateTransaction } = useTransactionFunctions({ + const { updateTransactionUsingGasFeeEstimates } = useTransactionFunctions({ defaultEstimateToUse, gasLimit, gasPrice, @@ -289,6 +302,6 @@ export function useGasFeeInputs( gasWarnings, hasGasErrors, supportsEIP1559, - updateTransaction, + updateTransactionUsingGasFeeEstimates, }; } diff --git a/ui/hooks/gasFeeInput/useTransactionFunctions.js b/ui/hooks/gasFeeInput/useTransactionFunctions.js index bc9068b9b..ea891869a 100644 --- a/ui/hooks/gasFeeInput/useTransactionFunctions.js +++ b/ui/hooks/gasFeeInput/useTransactionFunctions.js @@ -1,6 +1,7 @@ import { useCallback } from 'react'; import { useDispatch } from 'react-redux'; +import { PRIORITY_LEVELS } from '../../../shared/constants/gas'; import { decGWEIToHexWEI, decimalToHex, @@ -16,24 +17,19 @@ export const useTransactionFunctions = ({ const dispatch = useDispatch(); const updateTransaction = useCallback( - (estimateType) => { + (estimateUsed, maxFeePerGas, maxPriorityFeePerGas) => { const newGasSettings = { gas: decimalToHex(gasLimit), gasLimit: decimalToHex(gasLimit), estimateSuggested: defaultEstimateToUse, - estimateUsed: estimateType, + estimateUsed, + maxFeePerGas, + maxPriorityFeePerGas, }; - newGasSettings.maxFeePerGas = decGWEIToHexWEI( - gasFeeEstimates[estimateType].suggestedMaxFeePerGas, - ); - newGasSettings.maxPriorityFeePerGas = decGWEIToHexWEI( - gasFeeEstimates[estimateType].suggestedMaxPriorityFeePerGas, - ); - const updatedTxMeta = { ...transaction, - userFeeLevel: estimateType || 'custom', + userFeeLevel: estimateUsed || 'custom', txParams: { ...transaction.txParams, ...newGasSettings, @@ -42,8 +38,35 @@ export const useTransactionFunctions = ({ dispatch(updateTransactionFn(updatedTxMeta)); }, - [defaultEstimateToUse, dispatch, gasLimit, gasFeeEstimates, transaction], + [defaultEstimateToUse, dispatch, gasLimit, transaction], + ); + + const updateTransactionUsingGasFeeEstimates = useCallback( + (gasFeeEstimateToUse) => { + if (gasFeeEstimateToUse === PRIORITY_LEVELS.DAPP_SUGGESTED) { + const { + maxFeePerGas, + maxPriorityFeePerGas, + } = transaction?.dappSuggestedGasFees; + updateTransaction( + PRIORITY_LEVELS.CUSTOM, + maxFeePerGas, + maxPriorityFeePerGas, + ); + } else { + const { + suggestedMaxFeePerGas, + suggestedMaxPriorityFeePerGas, + } = gasFeeEstimates[gasFeeEstimateToUse]; + updateTransaction( + gasFeeEstimateToUse, + decGWEIToHexWEI(suggestedMaxFeePerGas), + decGWEIToHexWEI(suggestedMaxPriorityFeePerGas), + ); + } + }, + [gasFeeEstimates, transaction?.dappSuggestedGasFees, updateTransaction], ); - return { updateTransaction }; + return { updateTransactionUsingGasFeeEstimates }; }; diff --git a/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.js b/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.js index 6db82e185..86fa32f4c 100644 --- a/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.js +++ b/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.js @@ -26,7 +26,6 @@ const GasDetailsItem = ({ isMainnet, maxFeePerGas, maxPriorityFeePerGas, - supportsEIP1559, txData, useNativeCurrencyAsPrimaryCurrency, }) => { @@ -120,16 +119,14 @@ const GasDetailsItem = ({ , ])} subTitle={ - supportsEIP1559 && ( - - ) + } /> ); @@ -141,7 +138,6 @@ GasDetailsItem.propTypes = { isMainnet: PropTypes.bool, maxFeePerGas: PropTypes.string, maxPriorityFeePerGas: PropTypes.string, - supportsEIP1559: PropTypes.bool, txData: PropTypes.object, useNativeCurrencyAsPrimaryCurrency: PropTypes.bool, }; diff --git a/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.test.js b/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.test.js index 2d8c97fab..2287db844 100644 --- a/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.test.js +++ b/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.test.js @@ -1,5 +1,5 @@ import React from 'react'; -import { screen } from '@testing-library/react'; +import { screen, waitFor } from '@testing-library/react'; import { ETH } from '../../../helpers/constants/common'; import { GasFeeContextProvider } from '../../../contexts/gasFee'; @@ -14,6 +14,7 @@ jest.mock('../../../store/actions', () => ({ .fn() .mockImplementation(() => Promise.resolve()), addPollingTokenToAppState: jest.fn(), + getGasFeeTimeEstimate: jest.fn().mockImplementation(() => Promise.resolve()), })); const render = (props) => { @@ -37,28 +38,34 @@ const render = (props) => { return renderWithProvider( - + , store, ); }; describe('GasDetailsItem', () => { - it('should render label', () => { + it('should render label', async () => { render(); - expect(screen.queryByText('Gas')).toBeInTheDocument(); - expect(screen.queryByText('(estimated)')).toBeInTheDocument(); - expect(screen.queryByText('Max fee:')).toBeInTheDocument(); - expect(screen.queryByText('ETH')).toBeInTheDocument(); + await waitFor(() => { + expect(screen.queryByText('Gas')).toBeInTheDocument(); + expect(screen.queryByText('(estimated)')).toBeInTheDocument(); + expect(screen.queryByText('Max fee:')).toBeInTheDocument(); + expect(screen.queryByText('ETH')).toBeInTheDocument(); + }); }); - it('should show warning icon if estimates are high', () => { + it('should show warning icon if estimates are high', async () => { render({ defaultEstimateToUse: 'high' }); - expect(screen.queryByText('⚠ Max fee:')).toBeInTheDocument(); + await waitFor(() => { + expect(screen.queryByText('⚠ Max fee:')).toBeInTheDocument(); + }); }); - it('should not show warning icon if estimates are not high', () => { + it('should not show warning icon if estimates are not high', async () => { render({ defaultEstimateToUse: 'low' }); - expect(screen.queryByText('Max fee:')).toBeInTheDocument(); + await waitFor(() => { + expect(screen.queryByText('Max fee:')).toBeInTheDocument(); + }); }); }); From f5f2f38ea5be45157b3d1c6ec5dc5990b256dc75 Mon Sep 17 00:00:00 2001 From: kumavis Date: Thu, 18 Nov 2021 10:57:47 -1000 Subject: [PATCH 005/129] ci - fix yarn-audit (#12738) * ci/yarn-audit - ensure error propagation * ci/yarn-audit - ensure dependencies are installed first --- .circleci/config.yml | 4 +++- .circleci/scripts/yarn-audit.sh | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 207593689..779d76a42 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -25,7 +25,9 @@ workflows: only: - /^Version-v(\d+)[.](\d+)[.](\d+)/ - prep-deps - - test-deps-audit + - test-deps-audit: + requires: + - prep-deps - test-deps-depcheck: requires: - prep-deps diff --git a/.circleci/scripts/yarn-audit.sh b/.circleci/scripts/yarn-audit.sh index 717b5f456..f24c86a07 100755 --- a/.circleci/scripts/yarn-audit.sh +++ b/.circleci/scripts/yarn-audit.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash +set -e set -u +set -x set -o pipefail # use `improved-yarn-audit` since that allows for exclude From fa25eb18b4869cd16defc8bafe0473153830cc08 Mon Sep 17 00:00:00 2001 From: ryanml Date: Thu, 18 Nov 2021 14:14:03 -0700 Subject: [PATCH 006/129] Don't dispatch hideTestNetMessage (#12748) --- ui/components/app/dropdowns/network-dropdown.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/components/app/dropdowns/network-dropdown.js b/ui/components/app/dropdowns/network-dropdown.js index b446036e6..2e2528e47 100644 --- a/ui/components/app/dropdowns/network-dropdown.js +++ b/ui/components/app/dropdowns/network-dropdown.js @@ -68,7 +68,7 @@ function mapDispatchToProps(dispatch) { }), ); }, - hideTestNetMessage: () => dispatch(actions.hideTestNetMessage()), + hideTestNetMessage: () => actions.hideTestNetMessage(), }; } From d2617e9bf56ea7c529be30cd7e8d2d8eeaa644f0 Mon Sep 17 00:00:00 2001 From: kumavis Date: Thu, 18 Nov 2021 14:56:23 -1000 Subject: [PATCH 007/129] deps - bump @lavamoat/lavapack for bug fix (#12751) --- package.json | 4 ++-- yarn.lock | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 843a3f645..fd02b1371 100644 --- a/package.json +++ b/package.json @@ -139,8 +139,8 @@ "eth-json-rpc-infura": "^5.1.0", "eth-json-rpc-middleware": "^8.0.0", "eth-keyring-controller": "^6.2.0", - "eth-method-registry": "^2.0.0", "eth-lattice-keyring": "^0.4.0", + "eth-method-registry": "^2.0.0", "eth-query": "^2.1.2", "eth-rpc-errors": "^4.0.2", "eth-sig-util": "^3.0.0", @@ -223,7 +223,7 @@ "@babel/preset-react": "^7.0.0", "@babel/register": "^7.5.5", "@lavamoat/allow-scripts": "^1.0.6", - "@lavamoat/lavapack": "^2.0.3", + "@lavamoat/lavapack": "^2.0.4", "@metamask/auto-changelog": "^2.1.0", "@metamask/eslint-config": "^6.0.0", "@metamask/eslint-config-jest": "^6.0.0", diff --git a/yarn.lock b/yarn.lock index ec0324c22..e4478ef77 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3956,16 +3956,16 @@ semver "^7.3.4" yargs "^16.2.0" -"@lavamoat/lavapack@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@lavamoat/lavapack/-/lavapack-2.0.3.tgz#d535e23b4e98d21ac7aad57ef5019e64f1701117" - integrity sha512-7gpFnNaB4P15YsLf9/6Rn5EGAAg8s5CyVUZWy8bFHT+KaLzcRnjsbr1H5VehZkpU2xT0jWYHo1Rii7WmGdLQxg== +"@lavamoat/lavapack@^2.0.3", "@lavamoat/lavapack@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@lavamoat/lavapack/-/lavapack-2.0.4.tgz#504d942837c0141a385141220917d81d9f9f4c95" + integrity sha512-ttaEWUiROG12fGwzFcBlXNr39dzpU4W6Es7rFmS5ihT7j//eT1NrV73S357Lw8cmfZezvz1/ca1fqnZcZvarPw== dependencies: JSONStream "^1.3.5" combine-source-map "^0.8.0" convert-source-map "^1.7.0" json-stable-stringify "^1.0.1" - lavamoat-core "^11.0.0" + lavamoat-core "^11.0.1" through2 "^4.0.2" umd "^3.0.3" @@ -19400,10 +19400,10 @@ lavamoat-core@^10.0.1: merge-deep "^3.0.2" resolve "^1.15.1" -lavamoat-core@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/lavamoat-core/-/lavamoat-core-11.0.0.tgz#d1decbabae0429149fb7bbeb7f8a74fa054dbdf9" - integrity sha512-D/ULw8cbQ+0Rr/2IT38XedH8CWZsfIy0WThJHLjPbxwdPuHasFw9GHs88vjYv7a6UJ1uac8x5mhyOlbGoOJcIw== +lavamoat-core@^11.0.0, lavamoat-core@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/lavamoat-core/-/lavamoat-core-11.0.1.tgz#7560fdd8442e2ea4956f4b7636fd615b806afc93" + integrity sha512-Mz41jirTV1fiwkPfzkM73uW1bdQYGBUxLcHStERsD4/1XZYo6j3q88vJQvUJGV0yzB2IV/NMesuT/aoW2QxABA== dependencies: fromentries "^1.2.0" json-stable-stringify "^1.0.1" From 1ec2af03376f3403d9fd93a9353f604158eae5da Mon Sep 17 00:00:00 2001 From: kumavis Date: Thu, 18 Nov 2021 14:58:31 -1000 Subject: [PATCH 008/129] ci - update shellcheck (#12739) --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 779d76a42..8cef4b332 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,7 +12,7 @@ executors: NODE_OPTIONS: --max_old_space_size=2048 shellcheck: docker: - - image: koalaman/shellcheck-alpine@sha256:35882cba254810c7de458528011e935ba2c4f3ebcb224275dfa7ebfa930ef294 + - image: koalaman/shellcheck-alpine@sha256:dfaf08fab58c158549d3be64fb101c626abc5f16f341b569092577ae207db199 workflows: test_and_release: From fb6375472ee94713f277d8309ccd7c63f9155091 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Fri, 19 Nov 2021 11:53:19 -0330 Subject: [PATCH 009/129] Update `improved-yarn-audit` and ignore 2 advisories (#12765) `improved-yarn-audit` has been updated so that it supports GitHub advisories. Two new GitHub advisories have been ignored, as they are both moderate RegExp DoS vulnerabilities that don't affect us, and they are embedded deep within our dependency graph and are difficult to update. --- .circleci/scripts/yarn-audit.sh | 2 +- package.json | 2 +- yarn.lock | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.circleci/scripts/yarn-audit.sh b/.circleci/scripts/yarn-audit.sh index f24c86a07..0f2de7123 100755 --- a/.circleci/scripts/yarn-audit.sh +++ b/.circleci/scripts/yarn-audit.sh @@ -7,7 +7,7 @@ set -o pipefail # use `improved-yarn-audit` since that allows for exclude # exclude 1002401 until we remove use of 3Box, 1002581 until we can find a better solution -yarn run improved-yarn-audit --ignore-dev-deps --min-severity moderate --exclude 1002401,1002581 +yarn run improved-yarn-audit --ignore-dev-deps --min-severity moderate --exclude 1002401,1002581,GHSA-93q8-gq69-wqmw,GHSA-257v-vj4p-3w2h audit_status="$?" # Use a bitmask to ignore INFO and LOW severity audit results diff --git a/package.json b/package.json index fd02b1371..da44e1790 100644 --- a/package.json +++ b/package.json @@ -294,7 +294,7 @@ "gulp-watch": "^5.0.1", "gulp-zip": "^4.0.0", "history": "^5.0.0", - "improved-yarn-audit": "^2.3.3", + "improved-yarn-audit": "^3.0.0", "jest": "^26.6.3", "jsdom": "^11.2.0", "koa": "^2.7.0", diff --git a/yarn.lock b/yarn.lock index e4478ef77..6d133b3a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6825,9 +6825,9 @@ ansi-regex@^4.1.0: integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^2.2.1: version "2.2.1" @@ -16580,10 +16580,10 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" -improved-yarn-audit@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/improved-yarn-audit/-/improved-yarn-audit-2.3.3.tgz#da0be78be4b678c73733066c9ccd21e1958fae8c" - integrity sha512-chZ7zPKGsA+CZeMExNPf9WZhETJLkC+u8cQlkQC9XyPZqQPctn3FavefTjXBXmX3Azin8WcoAbaok1FvjkLf6A== +improved-yarn-audit@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/improved-yarn-audit/-/improved-yarn-audit-3.0.0.tgz#dfb09cea1a3a92c790ea2b4056431f6fb1b99bfa" + integrity sha512-b7CrBYYwMidtPciCBkW62C7vqGjAV10bxcAWHeJvGrltrcMSEnG5I9CQgi14nmAlUKUQiSvpz47Lo3d7Z3Vjcg== imurmurhash@^0.1.4: version "0.1.4" From 3f3479bf6ea7bdfc8b58498f29c38c123aee9eed Mon Sep 17 00:00:00 2001 From: Olaf Tomalka Date: Fri, 19 Nov 2021 17:05:24 +0100 Subject: [PATCH 010/129] Fix: eth_sign does not validate input (#12679) * Fix #5039 * Converted function into async * Added more explicit explanation of why the number of bits for EcSign * eth_sign and eth_personalSign now report errors correctly back to the user * Added leeway to unsigned message byte check * Fix lint --- app/scripts/lib/message-manager.js | 25 +++++- app/scripts/lib/personal-message-manager.js | 16 ++++ app/scripts/metamask-controller.js | 88 ++++++++++++--------- app/scripts/metamask-controller.test.js | 16 +++- 4 files changed, 102 insertions(+), 43 deletions(-) diff --git a/app/scripts/lib/message-manager.js b/app/scripts/lib/message-manager.js index 0a83a2214..ba349da67 100644 --- a/app/scripts/lib/message-manager.js +++ b/app/scripts/lib/message-manager.js @@ -79,9 +79,9 @@ export default class MessageManager extends EventEmitter { * @returns {promise} after signature has been * */ - addUnapprovedMessageAsync(msgParams, req) { - return new Promise((resolve, reject) => { - const msgId = this.addUnapprovedMessage(msgParams, req); + async addUnapprovedMessageAsync(msgParams, req) { + const msgId = this.addUnapprovedMessage(msgParams, req); + return await new Promise((resolve, reject) => { // await finished this.once(`${msgId}:finished`, (data) => { switch (data.status) { @@ -93,6 +93,10 @@ export default class MessageManager extends EventEmitter { 'MetaMask Message Signature: User denied message signature.', ), ); + case 'errored': + return reject( + new Error(`MetaMask Message Signature: ${data.error}`), + ); default: return reject( new Error( @@ -233,6 +237,19 @@ export default class MessageManager extends EventEmitter { this._setMsgStatus(msgId, 'rejected'); } + /** + * Sets a Message status to 'errored' via a call to this._setMsgStatus. + * + * @param {number} msgId - The id of the Message to error + * + */ + errorMessage(msgId, error) { + const msg = this.getMsg(msgId); + msg.error = error; + this._updateMsg(msg); + this._setMsgStatus(msgId, 'errored'); + } + /** * Clears all unapproved messages from memory. */ @@ -304,7 +321,7 @@ export default class MessageManager extends EventEmitter { * @returns {string} A hex string conversion of the buffer data * */ -function normalizeMsgData(data) { +export function normalizeMsgData(data) { if (data.slice(0, 2) === '0x') { // data is already hex return data; diff --git a/app/scripts/lib/personal-message-manager.js b/app/scripts/lib/personal-message-manager.js index 907f3ee5a..e1f94a156 100644 --- a/app/scripts/lib/personal-message-manager.js +++ b/app/scripts/lib/personal-message-manager.js @@ -107,6 +107,9 @@ export default class PersonalMessageManager extends EventEmitter { ), ); return; + case 'errored': + reject(new Error(`MetaMask Message Signature: ${data.error}`)); + return; default: reject( new Error( @@ -254,6 +257,19 @@ export default class PersonalMessageManager extends EventEmitter { this._setMsgStatus(msgId, 'rejected'); } + /** + * Sets a Message status to 'errored' via a call to this._setMsgStatus. + * + * @param {number} msgId - The id of the Message to error + * + */ + errorMessage(msgId, error) { + const msg = this.getMsg(msgId); + msg.error = error; + this._updateMsg(msg); + this._setMsgStatus(msgId, 'errored'); + } + /** * Clears all unapproved messages from memory. */ diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 4f4fb7e13..6f419cb8e 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -17,6 +17,7 @@ import LedgerBridgeKeyring from '@metamask/eth-ledger-bridge-keyring'; import LatticeKeyring from 'eth-lattice-keyring'; import EthQuery from 'eth-query'; import nanoid from 'nanoid'; +import { ethErrors } from 'eth-rpc-errors'; import { captureException } from '@sentry/browser'; import { AddressBookController, @@ -61,7 +62,7 @@ import AlertController from './controllers/alert'; import OnboardingController from './controllers/onboarding'; import ThreeBoxController from './controllers/threebox'; import IncomingTransactionsController from './controllers/incoming-transactions'; -import MessageManager from './lib/message-manager'; +import MessageManager, { normalizeMsgData } from './lib/message-manager'; import DecryptMessageManager from './lib/decrypt-message-manager'; import EncryptionPublicKeyManager from './lib/encryption-public-key-manager'; import PersonalMessageManager from './lib/personal-message-manager'; @@ -1843,14 +1844,22 @@ export default class MetamaskController extends EventEmitter { * @param {Object} msgParams - The params passed to eth_sign. * @param {Function} cb - The callback function called with the signature. */ - newUnsignedMessage(msgParams, req) { - const promise = this.messageManager.addUnapprovedMessageAsync( - msgParams, - req, - ); - this.sendUpdate(); - this.opts.showUserConfirmation(); - return promise; + async newUnsignedMessage(msgParams, req) { + const data = normalizeMsgData(msgParams.data); + let promise; + // 64 hex + "0x" at the beginning + // This is needed because Ethereum's EcSign works only on 32 byte numbers + // For 67 length see: https://github.com/MetaMask/metamask-extension/pull/12679/files#r749479607 + if (data.length === 66 || data.length === 67) { + promise = this.messageManager.addUnapprovedMessageAsync(msgParams, req); + this.sendUpdate(); + this.opts.showUserConfirmation(); + } else { + throw ethErrors.rpc.invalidParams( + 'eth_sign requires 32 byte message hash', + ); + } + return await promise; } /** @@ -1859,24 +1868,23 @@ export default class MetamaskController extends EventEmitter { * @param {Object} msgParams - The params passed to eth_call. * @returns {Promise} Full state update. */ - signMessage(msgParams) { + async signMessage(msgParams) { log.info('MetaMaskController - signMessage'); const msgId = msgParams.metamaskId; - - // sets the status op the message to 'approved' - // and removes the metamaskId for signing - return this.messageManager - .approveMessage(msgParams) - .then((cleanMsgParams) => { - // signs the message - return this.keyringController.signMessage(cleanMsgParams); - }) - .then((rawSig) => { - // tells the listener that the message has been signed - // and can be returned to the dapp - this.messageManager.setMsgStatusSigned(msgId, rawSig); - return this.getState(); - }); + try { + // sets the status op the message to 'approved' + // and removes the metamaskId for signing + const cleanMsgParams = await this.messageManager.approveMessage( + msgParams, + ); + const rawSig = await this.keyringController.signMessage(cleanMsgParams); + this.messageManager.setMsgStatusSigned(msgId, rawSig); + return this.getState(); + } catch (error) { + log.info('MetaMaskController - eth_sign failed', error); + this.messageManager.errorMessage(msgId, error); + throw error; + } } /** @@ -1923,23 +1931,27 @@ export default class MetamaskController extends EventEmitter { * @param {Object} msgParams - The params of the message to sign & return to the Dapp. * @returns {Promise} A full state update. */ - signPersonalMessage(msgParams) { + async signPersonalMessage(msgParams) { log.info('MetaMaskController - signPersonalMessage'); const msgId = msgParams.metamaskId; // sets the status op the message to 'approved' // and removes the metamaskId for signing - return this.personalMessageManager - .approveMessage(msgParams) - .then((cleanMsgParams) => { - // signs the message - return this.keyringController.signPersonalMessage(cleanMsgParams); - }) - .then((rawSig) => { - // tells the listener that the message has been signed - // and can be returned to the dapp - this.personalMessageManager.setMsgStatusSigned(msgId, rawSig); - return this.getState(); - }); + try { + const cleanMsgParams = await this.personalMessageManager.approveMessage( + msgParams, + ); + const rawSig = await this.keyringController.signPersonalMessage( + cleanMsgParams, + ); + // tells the listener that the message has been signed + // and can be returned to the dapp + this.personalMessageManager.setMsgStatusSigned(msgId, rawSig); + return this.getState(); + } catch (error) { + log.info('MetaMaskController - eth_personalSign failed', error); + this.personalMessageManager.errorMessage(msgId, error); + throw error; + } } /** diff --git a/app/scripts/metamask-controller.test.js b/app/scripts/metamask-controller.test.js index f91176858..31a60aabb 100644 --- a/app/scripts/metamask-controller.test.js +++ b/app/scripts/metamask-controller.test.js @@ -835,7 +835,8 @@ describe('MetaMaskController', function () { let msgParams, metamaskMsgs, messages, msgId; const address = '0xc42edfcc21ed14dda456aa0756c153f7985d8813'; - const data = '0x43727970746f6b697474696573'; + const data = + '0x0000000000000000000000000000000000000043727970746f6b697474696573'; beforeEach(async function () { sandbox.stub(metamaskController, 'getBalance'); @@ -885,6 +886,19 @@ describe('MetaMaskController', function () { assert.equal(messages[0].status, TRANSACTION_STATUSES.REJECTED); }); + it('checks message length', async function () { + msgParams = { + from: address, + data: '0xDEADBEEF', + }; + + try { + await metamaskController.newUnsignedMessage(msgParams); + } catch (error) { + assert.equal(error.message, 'eth_sign requires 32 byte message hash'); + } + }); + it('errors when signing a message', async function () { try { await metamaskController.signMessage(messages[0].msgParams); From b119b7744dc23b33ea8d6ad9dbdf9900d4bacb25 Mon Sep 17 00:00:00 2001 From: Alex Donesky Date: Fri, 19 Nov 2021 10:16:41 -0600 Subject: [PATCH 011/129] Add CollectiblesController & CollectibleDetectionController (#12443) * Add CollectiblesController * bump controllers version * add CollectibleDetectionController * adapt to ERC1155 support changes in CollectiblesController * update @metamask/controllers to v20.0.0 * update lavamoat policy files * put collectibleDetectionController instantiation behind feature flag --- app/scripts/metamask-controller.js | 81 +++++++++++++++++++++++++++ lavamoat/browserify/beta/policy.json | 1 + lavamoat/browserify/flask/policy.json | 1 + lavamoat/browserify/main/policy.json | 1 + package.json | 2 +- ui/store/actions.js | 73 ++++++++++++++++++++++++ yarn.lock | 18 ++++-- 7 files changed, 170 insertions(+), 7 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 6f419cb8e..4178da464 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -30,6 +30,9 @@ import { TokenListController, TokensController, TokenRatesController, + CollectiblesController, + AssetsContractController, + CollectibleDetectionController, } from '@metamask/controllers'; import { TRANSACTION_STATUSES } from '../../shared/constants/transaction'; import { @@ -176,6 +179,57 @@ export default class MetamaskController extends EventEmitter { state: initState.TokensController, }); + this.assetsContractController = new AssetsContractController(); + + this.collectiblesController = new CollectiblesController({ + onPreferencesStateChange: this.preferencesController.store.subscribe.bind( + this.preferencesController.store, + ), + onNetworkStateChange: this.networkController.store.subscribe.bind( + this.networkController.store, + ), + getAssetName: this.assetsContractController.getAssetName.bind( + this.assetsContractController, + ), + getAssetSymbol: this.assetsContractController.getAssetSymbol.bind( + this.assetsContractController, + ), + getCollectibleTokenURI: this.assetsContractController.getCollectibleTokenURI.bind( + this.assetsContractController, + ), + getOwnerOf: this.assetsContractController.getOwnerOf.bind( + this.assetsContractController, + ), + balanceOfERC1155Collectible: this.assetsContractController.balanceOfERC1155Collectible.bind( + this.assetsContractController, + ), + uriERC1155Collectible: this.assetsContractController.uriERC1155Collectible.bind( + this.assetsContractController, + ), + }); + + process.env.COLLECTIBLES_V1 && + (this.collectibleDetectionController = new CollectibleDetectionController( + { + onCollectiblesStateChange: (listener) => + this.collectiblesController.subscribe(listener), + onPreferencesStateChange: this.preferencesController.store.subscribe.bind( + this.preferencesController.store, + ), + onNetworkStateChange: this.networkController.store.subscribe.bind( + this.networkController.store, + ), + getOpenSeaApiKey: () => this.collectiblesController.openSeaApiKey, + getBalancesInSingleCall: this.assetsContractController.getBalancesInSingleCall.bind( + this.assetsContractController, + ), + addCollectible: this.collectiblesController.addCollectible.bind( + this.collectiblesController, + ), + getCollectiblesState: () => this.collectiblesController.state, + }, + )); + this.metaMetricsController = new MetaMetricsController({ segment, preferencesStore: this.preferencesController.store, @@ -612,6 +666,7 @@ export default class MetamaskController extends EventEmitter { GasFeeController: this.gasFeeController, TokenListController: this.tokenListController, TokensController: this.tokensController, + CollectiblesController: this.collectiblesController, }); this.memStore = new ComposableObservableStore({ @@ -646,6 +701,7 @@ export default class MetamaskController extends EventEmitter { GasFeeController: this.gasFeeController, TokenListController: this.tokenListController, TokensController: this.tokensController, + CollectiblesController: this.collectiblesController, }, controllerMessenger: this.controllerMessenger, }); @@ -827,6 +883,7 @@ export default class MetamaskController extends EventEmitter { threeBoxController, txController, tokensController, + collectiblesController, } = this; return { @@ -949,6 +1006,22 @@ export default class MetamaskController extends EventEmitter { preferencesController, ), + // CollectiblesController + addCollectible: nodeify( + collectiblesController.addCollectible, + collectiblesController, + ), + + removeAndIgnoreCollectible: nodeify( + collectiblesController.removeAndIgnoreCollectible, + collectiblesController, + ), + + removeCollectible: nodeify( + collectiblesController.removeCollectible, + collectiblesController, + ), + // AddressController setAddressBook: nodeify( this.addressBookController.set, @@ -1247,6 +1320,14 @@ export default class MetamaskController extends EventEmitter { this.detectTokensController.detectNewTokens, this.detectTokensController, ), + + // DetectCollectibleController + detectCollectibles: process.env.COLLECTIBLES_V1 + ? nodeify( + this.collectibleDetectionController.detectCollectibles, + this.collectibleDetectionController, + ) + : null, }; } diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index 3cfd712fa..c8a541438 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -526,6 +526,7 @@ "ethjs-util": true, "events": true, "human-standard-collectible-abi": true, + "human-standard-multi-collectible-abi": true, "human-standard-token-abi": true, "immer": true, "isomorphic-fetch": true, diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index 3cfd712fa..c8a541438 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -526,6 +526,7 @@ "ethjs-util": true, "events": true, "human-standard-collectible-abi": true, + "human-standard-multi-collectible-abi": true, "human-standard-token-abi": true, "immer": true, "isomorphic-fetch": true, diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index 3cfd712fa..c8a541438 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -526,6 +526,7 @@ "ethjs-util": true, "events": true, "human-standard-collectible-abi": true, + "human-standard-multi-collectible-abi": true, "human-standard-token-abi": true, "immer": true, "isomorphic-fetch": true, diff --git a/package.json b/package.json index da44e1790..820a0ee95 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "@fortawesome/fontawesome-free": "^5.13.0", "@material-ui/core": "^4.11.0", "@metamask/contract-metadata": "^1.28.0", - "@metamask/controllers": "^17.0.0", + "@metamask/controllers": "^20.0.0", "@metamask/eth-ledger-bridge-keyring": "^0.10.0", "@metamask/eth-token-tracker": "^3.0.1", "@metamask/etherscan-link": "^2.1.0", diff --git a/ui/store/actions.js b/ui/store/actions.js index e90eb8f6f..1e43ac103 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -1292,6 +1292,79 @@ export function addToken( }; } +export function addCollectible(address, tokenID, dontShowLoadingIndicator) { + return async (dispatch) => { + if (!address) { + throw new Error('MetaMask - Cannot add collectible without address'); + } + if (!tokenID) { + throw new Error('MetaMask - Cannot add collectible without tokenID'); + } + if (!dontShowLoadingIndicator) { + dispatch(showLoadingIndication()); + } + try { + await promisifiedBackground.addCollectible(address, tokenID); + } catch (error) { + log.error(error); + dispatch(displayWarning(error.message)); + } finally { + await forceUpdateMetamaskState(dispatch); + dispatch(hideLoadingIndication()); + } + }; +} + +export function removeAndIgnoreCollectible( + address, + tokenID, + dontShowLoadingIndicator, +) { + return async (dispatch) => { + if (!address) { + throw new Error('MetaMask - Cannot ignore collectible without address'); + } + if (!tokenID) { + throw new Error('MetaMask - Cannot ignore collectible without tokenID'); + } + if (!dontShowLoadingIndicator) { + dispatch(showLoadingIndication()); + } + try { + await promisifiedBackground.removeAndIgnoreCollectible(address, tokenID); + } catch (error) { + log.error(error); + dispatch(displayWarning(error.message)); + } finally { + await forceUpdateMetamaskState(dispatch); + dispatch(hideLoadingIndication()); + } + }; +} + +export function removeCollectible(address, tokenID, dontShowLoadingIndicator) { + return async (dispatch) => { + if (!address) { + throw new Error('MetaMask - Cannot remove collectible without address'); + } + if (!tokenID) { + throw new Error('MetaMask - Cannot remove collectible without tokenID'); + } + if (!dontShowLoadingIndicator) { + dispatch(showLoadingIndication()); + } + try { + await promisifiedBackground.removeCollectible(address, tokenID); + } catch (error) { + log.error(error); + dispatch(displayWarning(error.message)); + } finally { + await forceUpdateMetamaskState(dispatch); + dispatch(hideLoadingIndication()); + } + }; +} + export function removeToken(address) { return async (dispatch) => { dispatch(showLoadingIndication()); diff --git a/yarn.lock b/yarn.lock index 6d133b3a8..f27c87709 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4183,19 +4183,19 @@ semver "^7.3.5" yargs "^17.0.1" -"@metamask/contract-metadata@^1.19.0", "@metamask/contract-metadata@^1.28.0", "@metamask/contract-metadata@^1.29.0": +"@metamask/contract-metadata@^1.19.0", "@metamask/contract-metadata@^1.28.0", "@metamask/contract-metadata@^1.30.0": version "1.30.0" resolved "https://registry.yarnpkg.com/@metamask/contract-metadata/-/contract-metadata-1.30.0.tgz#fa8e1b0c3e7aaa963986088f691fb553ffbe3904" integrity sha512-b2usYW/ptQYnE6zhUmr4T+nvOAQJK5ABcpKudyQANpy4K099elpv4aN0WcrcOcwV99NHOdMzFP3ZuG0HoAyOBQ== -"@metamask/controllers@^17.0.0": - version "17.0.0" - resolved "https://registry.yarnpkg.com/@metamask/controllers/-/controllers-17.0.0.tgz#7ef00b4f7583d8075115e8a2f074d7b66646bbe8" - integrity sha512-myPlAk8SpNm5SwHHKGgm2XDLP4bxNR2UsKoQlYtV7bJq3l8FV1agSFwHBwDhg61/52Xvqdqy+1YDVdV3kOwPgg== +"@metamask/controllers@^20.0.0": + version "20.0.0" + resolved "https://registry.yarnpkg.com/@metamask/controllers/-/controllers-20.0.0.tgz#5c3fd293e1c8d3de964bbbfadbd73d637d83a1a8" + integrity sha512-H7ql719730+KCFRvAxWVKe3PvEabKgA9b+0+k4/nRA2Xvb7Pe3BlQ4lgt44wOFKDqdWyvwvH7mgNTAhDzBu4OA== dependencies: "@ethereumjs/common" "^2.3.1" "@ethereumjs/tx" "^3.2.1" - "@metamask/contract-metadata" "^1.29.0" + "@metamask/contract-metadata" "^1.30.0" "@types/uuid" "^8.3.0" abort-controller "^3.0.0" async-mutex "^0.2.6" @@ -4214,6 +4214,7 @@ ethjs-unit "^0.1.6" ethjs-util "^0.1.6" human-standard-collectible-abi "^1.0.2" + human-standard-multi-collectible-abi "^1.0.2" human-standard-token-abi "^2.0.0" immer "^9.0.6" isomorphic-fetch "^3.0.0" @@ -16415,6 +16416,11 @@ human-standard-collectible-abi@^1.0.2: resolved "https://registry.yarnpkg.com/human-standard-collectible-abi/-/human-standard-collectible-abi-1.0.2.tgz#077bae9ed1b0b0b82bc46932104b4b499c941aa0" integrity sha512-nD3ITUuSAIBgkaCm9J2BGwlHL8iEzFjJfTleDAC5Wi8RBJEXXhxV0JeJjd95o+rTwf98uTE5MW+VoBKOIYQh0g== +human-standard-multi-collectible-abi@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/human-standard-multi-collectible-abi/-/human-standard-multi-collectible-abi-1.0.3.tgz#be5896b13f8622289cff70040e478366931bf3d7" + integrity sha512-1VXqats7JQqDZozLKhpmFG0S33hVePrkLNRJNKfJTxewR0heYKjSoz72kqs+6O/Tywi0zW4fWe7dfTaPX4j7gQ== + human-standard-token-abi@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/human-standard-token-abi/-/human-standard-token-abi-1.0.2.tgz#207d7846796ee5bb85fdd336e769cb38045b2ae0" From d89e5336a61e3b4a8838025311c37ba7c003f60e Mon Sep 17 00:00:00 2001 From: Erik Marks <25517051+rekmarks@users.noreply.github.com> Date: Fri, 19 Nov 2021 08:35:04 -0800 Subject: [PATCH 012/129] Improve code fence transform error handling (#12742) This PR improves the error handling of the code fence removal transform stream by catching errors thrown by the `removeFencedCode` function and passing them to the `end` callback. This appears to resolve a problem where watched builds would blow up whenever a file with fences was reloaded. --- .../build/transforms/remove-fenced-code.js | 20 ++++++++++------- .../transforms/remove-fenced-code.test.js | 22 +++++++++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/development/build/transforms/remove-fenced-code.js b/development/build/transforms/remove-fenced-code.js index 200233fe8..632660ec2 100644 --- a/development/build/transforms/remove-fenced-code.js +++ b/development/build/transforms/remove-fenced-code.js @@ -41,11 +41,16 @@ class RemoveFencedCodeTransform extends Transform { // stream, immediately before the "end" event is emitted. // It applies the transform to the concatenated file contents. _flush(end) { - const [fileContent, didModify] = removeFencedCode( - this.filePath, - this.buildType, - Buffer.concat(this._fileBuffers).toString('utf8'), - ); + let fileContent, didModify; + try { + [fileContent, didModify] = removeFencedCode( + this.filePath, + this.buildType, + Buffer.concat(this._fileBuffers).toString('utf8'), + ); + } catch (error) { + return end(error); + } const pushAndEnd = () => { this.push(fileContent); @@ -53,12 +58,11 @@ class RemoveFencedCodeTransform extends Transform { }; if (this.shouldLintTransformedFiles && didModify) { - lintTransformedFile(fileContent, this.filePath) + return lintTransformedFile(fileContent, this.filePath) .then(pushAndEnd) .catch((error) => end(error)); - } else { - pushAndEnd(); } + return pushAndEnd(); } } diff --git a/development/build/transforms/remove-fenced-code.test.js b/development/build/transforms/remove-fenced-code.test.js index 5eebc1135..4397b4bf6 100644 --- a/development/build/transforms/remove-fenced-code.test.js +++ b/development/build/transforms/remove-fenced-code.test.js @@ -161,6 +161,28 @@ describe('build/transforms/remove-fenced-code', () => { }); }); + it('handles error during code fence removal or parsing', async () => { + const fileContent = getMinimalFencedCode().concat( + '///: END:ONLY_INCLUDE_IN', + ); + + const stream = createRemoveFencedCodeTransform('main')(mockJsFileName); + + await new Promise((resolve) => { + stream.on('error', (error) => { + expect(error.message).toStrictEqual( + expect.stringContaining( + 'A valid fence consists of two fence lines, but the file contains an uneven number, "3", of fence lines.', + ), + ); + expect(lintTransformedFileMock).toHaveBeenCalledTimes(0); + resolve(); + }); + + stream.end(fileContent); + }); + }); + it('handles transformed file lint failure', async () => { lintTransformedFileMock.mockImplementationOnce(() => Promise.reject(new Error('lint failure')), From c9baf39c4da063a7f1722fc11ca009ec67fcbf73 Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Fri, 19 Nov 2021 14:07:50 -0330 Subject: [PATCH 013/129] Ensure that metametrics error related to anonymousId is not sent to sentry (#12763) --- app/scripts/controllers/metametrics.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/scripts/controllers/metametrics.js b/app/scripts/controllers/metametrics.js index 28e84d7b0..9e6ecfff7 100644 --- a/app/scripts/controllers/metametrics.js +++ b/app/scripts/controllers/metametrics.js @@ -15,6 +15,10 @@ const defaultCaptureException = (err) => { }); }; +const exceptionsToFilter = { + [`You must pass either an "anonymousId" or a "userId".`]: true, +}; + /** * @typedef {import('../../../shared/constants/metametrics').MetaMetricsContext} MetaMetricsContext * @typedef {import('../../../shared/constants/metametrics').MetaMetricsEventPayload} MetaMetricsEventPayload @@ -61,7 +65,13 @@ export default class MetaMetricsController { initState, captureException = defaultCaptureException, }) { - this._captureException = captureException; + this._captureException = (err) => { + // This is a temporary measure. Currently there are errors flooding sentry due to a problem in how we are tracking anonymousId + // We intend on removing this as soon as we understand how to correctly solve that problem. + if (!exceptionsToFilter[err.message]) { + captureException(err); + } + }; const prefState = preferencesStore.getState(); this.chainId = getCurrentChainId(); this.network = getNetworkIdentifier(); From 6838a3d074c4e15dec3c615f4721eeca077784ba Mon Sep 17 00:00:00 2001 From: Alex Donesky Date: Mon, 22 Nov 2021 06:04:31 -0600 Subject: [PATCH 014/129] fix issue where contractExchangeRates are not available in swaps controller, make token address matching case insensitive (#12770) --- app/scripts/controllers/swaps.js | 28 ++++++++++++++++++++++----- app/scripts/controllers/swaps.test.js | 17 ++++++++-------- app/scripts/metamask-controller.js | 2 +- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/app/scripts/controllers/swaps.js b/app/scripts/controllers/swaps.js index 57cd11b9c..06945e4e6 100644 --- a/app/scripts/controllers/swaps.js +++ b/app/scripts/controllers/swaps.js @@ -28,6 +28,7 @@ import { } from '../../../ui/pages/swaps/swaps.util'; import fetchWithCache from '../../../ui/helpers/utils/fetch-with-cache'; import { MINUTE, SECOND } from '../../../shared/constants/time'; +import { isEqualCaseInsensitive } from '../../../ui/helpers/utils/util'; import { NETWORK_EVENTS } from './network'; // The MAX_GAS_LIMIT is a number that is higher than the maximum gas costs we have observed on any aggregator @@ -91,7 +92,7 @@ export default class SwapsController { networkController, provider, getProviderConfig, - tokenRatesStore, + getTokenRatesState, fetchTradesInfo = defaultFetchTradesInfo, getCurrentChainId, getEIP1559GasFeeEstimates, @@ -105,7 +106,7 @@ export default class SwapsController { this._getEIP1559GasFeeEstimates = getEIP1559GasFeeEstimates; this.getBufferedGasLimit = getBufferedGasLimit; - this.tokenRatesStore = tokenRatesStore; + this.getTokenRatesState = getTokenRatesState; this.pollCount = 0; this.getProviderConfig = getProviderConfig; @@ -610,7 +611,9 @@ export default class SwapsController { } async _findTopQuoteAndCalculateSavings(quotes = {}) { - const tokenConversionRates = this.tokenRatesStore.contractExchangeRates; + const { + contractExchangeRates: tokenConversionRates, + } = this.getTokenRatesState(); const { swapsState: { customGasPrice, customMaxPriorityFeePerGas }, } = this.store.getState(); @@ -734,7 +737,12 @@ export default class SwapsController { decimalAdjustedDestinationAmount, ); - const tokenConversionRate = tokenConversionRates[destinationToken]; + const tokenConversionRate = + tokenConversionRates[ + Object.keys(tokenConversionRates).find((tokenAddress) => + isEqualCaseInsensitive(tokenAddress, destinationToken), + ) + ]; const conversionRateForSorting = tokenConversionRate || 1; const ethValueOfTokens = decimalAdjustedDestinationAmount.times( @@ -777,7 +785,17 @@ export default class SwapsController { isSwapsDefaultTokenAddress( newQuotes[topAggId].destinationToken, chainId, - ) || Boolean(tokenConversionRates[newQuotes[topAggId]?.destinationToken]); + ) || + Boolean( + tokenConversionRates[ + Object.keys(tokenConversionRates).find((tokenAddress) => + isEqualCaseInsensitive( + tokenAddress, + newQuotes[topAggId]?.destinationToken, + ), + ) + ], + ); let savings = null; diff --git a/app/scripts/controllers/swaps.test.js b/app/scripts/controllers/swaps.test.js index 7bc26a5aa..d0f4556ab 100644 --- a/app/scripts/controllers/swaps.test.js +++ b/app/scripts/controllers/swaps.test.js @@ -82,12 +82,12 @@ const MOCK_FETCH_METADATA = { chainId: MAINNET_CHAIN_ID, }; -const MOCK_TOKEN_RATES_STORE = { +const MOCK_TOKEN_RATES_STORE = () => ({ contractExchangeRates: { '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48': 2, '0x1111111111111111111111111111111111111111': 0.1, }, -}; +}); const MOCK_GET_PROVIDER_CONFIG = () => ({ type: 'FAKE_NETWORK' }); @@ -161,7 +161,7 @@ describe('SwapsController', function () { networkController: getMockNetworkController(), provider, getProviderConfig: MOCK_GET_PROVIDER_CONFIG, - tokenRatesStore: MOCK_TOKEN_RATES_STORE, + getTokenRatesState: MOCK_TOKEN_RATES_STORE, fetchTradesInfo: fetchTradesInfoStub, getCurrentChainId: getCurrentChainIdStub, getEIP1559GasFeeEstimates: getEIP1559GasFeeEstimatesStub, @@ -211,7 +211,7 @@ describe('SwapsController', function () { networkController, provider, getProviderConfig: MOCK_GET_PROVIDER_CONFIG, - tokenRatesStore: MOCK_TOKEN_RATES_STORE, + getTokenRatesState: MOCK_TOKEN_RATES_STORE, fetchTradesInfo: fetchTradesInfoStub, getCurrentChainId: getCurrentChainIdStub, }); @@ -235,7 +235,7 @@ describe('SwapsController', function () { networkController, provider, getProviderConfig: MOCK_GET_PROVIDER_CONFIG, - tokenRatesStore: MOCK_TOKEN_RATES_STORE, + getTokenRatesState: MOCK_TOKEN_RATES_STORE, fetchTradesInfo: fetchTradesInfoStub, getCurrentChainId: getCurrentChainIdStub, }); @@ -259,7 +259,7 @@ describe('SwapsController', function () { networkController, provider, getProviderConfig: MOCK_GET_PROVIDER_CONFIG, - tokenRatesStore: MOCK_TOKEN_RATES_STORE, + getTokenRatesState: MOCK_TOKEN_RATES_STORE, fetchTradesInfo: fetchTradesInfoStub, getCurrentChainId: getCurrentChainIdStub, }); @@ -816,9 +816,10 @@ describe('SwapsController', function () { .stub(swapsController, '_getERC20Allowance') .resolves(ethers.BigNumber.from(1)); - swapsController.tokenRatesStore = { + swapsController.getTokenRatesState = () => ({ contractExchangeRates: {}, - }; + }); + const [newQuotes, topAggId] = await swapsController.fetchAndSetQuotes( MOCK_FETCH_PARAMS, MOCK_FETCH_METADATA, diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 4178da464..004879828 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -619,7 +619,7 @@ export default class MetamaskController extends EventEmitter { getProviderConfig: this.networkController.getProviderConfig.bind( this.networkController, ), - tokenRatesStore: this.tokenRatesController.state, + getTokenRatesState: () => this.tokenRatesController.state, getCurrentChainId: this.networkController.getCurrentChainId.bind( this.networkController, ), From 143a5c4a53127a7783c97417a4c746e6d9afd8cd Mon Sep 17 00:00:00 2001 From: Olusegun Akintayo Date: Mon, 22 Nov 2021 16:13:30 +0400 Subject: [PATCH 015/129] Increase friction to bypass estimated revert (#12576) * If a transaction would revert/fail, 1. hide the gas estimate info. 2. Disable the confirm button. 3. All user to enable the confirm button anyways. 4. Do not show the default Transaction error message Signed-off-by: Akintayo A. Olusegun * Always return a value for hasSimulationError Signed-off-by: Akintayo A. Olusegun * Use primary button of action message Signed-off-by: Akintayo A. Olusegun * Remove hasSimulationError from getErrorKey Signed-off-by: Akintayo A. Olusegun * Lint fixes. Signed-off-by: Akintayo A. Olusegun * Move confirm anyways logic to base component. Change message Signed-off-by: Akintayo A. Olusegun * Disable edit if there's simulation error Signed-off-by: Akintayo A. Olusegun * hide confirm anyways button once clicked. Signed-off-by: Akintayo A. Olusegun * Move Actionable Primary Action to flex-end Signed-off-by: Akintayo A. Olusegun * Fix unit tests Signed-off-by: Akintayo A. Olusegun * Fix nested ternary lint issues Signed-off-by: Akintayo A. Olusegun * add !confirmAnyways to conditions to show GasDetails. Signed-off-by: Akintayo A. Olusegun * ConfirmAnyways should be read from state Signed-off-by: Akintayo A. Olusegun * Rename tryAnywayOption Signed-off-by: Akintayo A. Olusegun * Lint fixes Signed-off-by: Akintayo A. Olusegun * Remove await tick Signed-off-by: Akintayo A. Olusegun * Lint issue fix Signed-off-by: Akintayo A. Olusegun * Lint fixes after rebase Signed-off-by: Akintayo A. Olusegun * description should show that it's content being tested. Signed-off-by: Akintayo A. Olusegun * If a transaction would revert/fail, 1. hide the gas estimate info. 2. Disable the confirm button. 3. All user to enable the confirm button anyways. 4. Do not show the default Transaction error message Signed-off-by: Akintayo A. Olusegun * Always return a value for hasSimulationError Signed-off-by: Akintayo A. Olusegun * Use primary button of action message Signed-off-by: Akintayo A. Olusegun * Remove hasSimulationError from getErrorKey Signed-off-by: Akintayo A. Olusegun * Lint fixes. Signed-off-by: Akintayo A. Olusegun * Move confirm anyways logic to base component. Change message Signed-off-by: Akintayo A. Olusegun * Disable edit if there's simulation error Signed-off-by: Akintayo A. Olusegun * hide confirm anyways button once clicked. Signed-off-by: Akintayo A. Olusegun * Move Actionable Primary Action to flex-end Signed-off-by: Akintayo A. Olusegun * Fix unit tests Signed-off-by: Akintayo A. Olusegun * Fix nested ternary lint issues Signed-off-by: Akintayo A. Olusegun * add !confirmAnyways to conditions to show GasDetails. Signed-off-by: Akintayo A. Olusegun * ConfirmAnyways should be read from state Signed-off-by: Akintayo A. Olusegun * Rename tryAnywayOption Signed-off-by: Akintayo A. Olusegun * Lint fixes Signed-off-by: Akintayo A. Olusegun * Remove await tick Signed-off-by: Akintayo A. Olusegun * Lint issue fix Signed-off-by: Akintayo A. Olusegun * Lint fixes after rebase Signed-off-by: Akintayo A. Olusegun * description should show that it's content being tested. Signed-off-by: Akintayo A. Olusegun * Move simulation fails message inline with gas details component (#12705) * Move simulation fails message inline with gas details component * Remove old unit tests Co-authored-by: Dan Miller * lint fix * use an XOR operation. Signed-off-by: Akintayo A. Olusegun * The changes in this file are no longer needed because we hide the edit button now Signed-off-by: Akintayo A. Olusegun Co-authored-by: Dan Miller --- app/_locales/en/messages.json | 6 + ...onfirm-page-container-content.component.js | 25 +- ...m-page-container-content.component.test.js | 124 +++++++ .../actionable-message/actionable-message.js | 17 +- .../ui/actionable-message/index.scss | 10 +- .../confirm-transaction-base.component.js | 331 ++++++++++-------- 6 files changed, 363 insertions(+), 150 deletions(-) create mode 100644 ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.test.js diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 36654de69..adcc8298f 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -2314,6 +2314,9 @@ "signed": { "message": "Signed" }, + "simulationErrorMessage": { + "message": "This transaction is expected to fail. Trying to execute it is expected to be expensive but fail, and is not recommended." + }, "skip": { "message": "Skip" }, @@ -2977,6 +2980,9 @@ "tryAgain": { "message": "Try again" }, + "tryAnywayOption": { + "message": "I will try anyway" + }, "turnOnTokenDetection": { "message": "Turn on enhanced token detection" }, diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js index 574967420..42fe0c744 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import classnames from 'classnames'; import { Tabs, Tab } from '../../../ui/tabs'; import ErrorMessage from '../../../ui/error-message'; +import ActionableMessage from '../../../ui/actionable-message/actionable-message'; import { PageContainerFooter } from '../../../ui/page-container'; import { ConfirmPageContainerSummary, ConfirmPageContainerWarning } from '.'; @@ -17,6 +18,7 @@ export default class ConfirmPageContainerContent extends Component { detailsComponent: PropTypes.node, errorKey: PropTypes.string, errorMessage: PropTypes.string, + hasSimulationError: PropTypes.bool, hideSubtitle: PropTypes.bool, identiconAddress: PropTypes.string, nonce: PropTypes.string, @@ -31,8 +33,10 @@ export default class ConfirmPageContainerContent extends Component { onCancel: PropTypes.func, cancelText: PropTypes.string, onSubmit: PropTypes.func, + onConfirmAnyways: PropTypes.func, submitText: PropTypes.string, disabled: PropTypes.bool, + hideConfirmAnyways: PropTypes.bool, unapprovedTxCount: PropTypes.number, rejectNText: PropTypes.string, hideTitle: PropTypes.boolean, @@ -71,6 +75,7 @@ export default class ConfirmPageContainerContent extends Component { action, errorKey, errorMessage, + hasSimulationError, title, titleComponent, subtitleComponent, @@ -91,14 +96,32 @@ export default class ConfirmPageContainerContent extends Component { origin, ethGasPriceWarning, hideTitle, + onConfirmAnyways, + hideConfirmAnyways, } = this.props; + const primaryAction = hideConfirmAnyways + ? null + : { + label: this.context.t('tryAnywayOption'), + onClick: onConfirmAnyways, + }; + return (
{warning ? : null} {ethGasPriceWarning && ( )} + {hasSimulationError && ( +
+ +
+ )} {this.renderContent()} - {(errorKey || errorMessage) && ( + {(errorKey || errorMessage) && !hasSimulationError && (
diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.test.js b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.test.js new file mode 100644 index 000000000..edd7f7bd5 --- /dev/null +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.test.js @@ -0,0 +1,124 @@ +import { fireEvent } from '@testing-library/react'; +import React from 'react'; +import configureMockStore from 'redux-mock-store'; +import { renderWithProvider } from '../../../../../test/lib/render-helpers'; +import { TRANSACTION_ERROR_KEY } from '../../../../helpers/constants/error-keys'; +import ConfirmPageContainerContent from './confirm-page-container-content.component'; + +describe('Confirm Page Container Content', () => { + const mockStore = { + metamask: { + provider: { + type: 'test', + }, + }, + }; + + const store = configureMockStore()(mockStore); + + let props = {}; + + beforeEach(() => { + const mockOnCancel = jest.fn(); + const mockOnCancelAll = jest.fn(); + const mockOnSubmit = jest.fn(); + const mockOnConfirmAnyways = jest.fn(); + props = { + action: ' Withdraw Stake', + errorMessage: null, + errorKey: null, + hasSimulationError: true, + onCancelAll: mockOnCancelAll, + onCancel: mockOnCancel, + cancelText: 'Reject', + onSubmit: mockOnSubmit, + onConfirmAnyways: mockOnConfirmAnyways, + submitText: 'Confirm', + disabled: true, + origin: 'http://localhost:4200', + hideTitle: false, + }; + }); + + it('render ConfirmPageContainer component with simulation error', async () => { + const { queryByText, getByText } = renderWithProvider( + , + store, + ); + + expect( + queryByText('Transaction Error. Exception thrown in contract code.'), + ).not.toBeInTheDocument(); + expect( + queryByText( + 'This transaction is expected to fail. Trying to execute it is expected to be expensive but fail, and is not recommended.', + ), + ).toBeInTheDocument(); + expect(queryByText('I will try anyway')).toBeInTheDocument(); + + const confirmButton = getByText('Confirm'); + expect(getByText('Confirm').closest('button')).toBeDisabled(); + fireEvent.click(confirmButton); + expect(props.onSubmit).toHaveBeenCalledTimes(0); + + const iWillTryButton = getByText('I will try anyway'); + fireEvent.click(iWillTryButton); + expect(props.onConfirmAnyways).toHaveBeenCalledTimes(1); + + const cancelButton = getByText('Reject'); + fireEvent.click(cancelButton); + expect(props.onCancel).toHaveBeenCalledTimes(1); + }); + + it('render ConfirmPageContainer component with another error', async () => { + props.hasSimulationError = false; + props.disabled = true; + props.errorKey = TRANSACTION_ERROR_KEY; + const { queryByText, getByText } = renderWithProvider( + , + store, + ); + + expect( + queryByText( + 'This transaction is expected to fail. Trying to execute it is expected to be expensive but fail, and is not recommended.', + ), + ).not.toBeInTheDocument(); + expect(queryByText('I will try anyway')).not.toBeInTheDocument(); + expect(getByText('Confirm').closest('button')).toBeDisabled(); + expect( + getByText('Transaction Error. Exception thrown in contract code.'), + ).toBeInTheDocument(); + + const cancelButton = getByText('Reject'); + fireEvent.click(cancelButton); + expect(props.onCancel).toHaveBeenCalledTimes(1); + }); + + it('render ConfirmPageContainer component with no errors', async () => { + props.hasSimulationError = false; + props.disabled = false; + const { queryByText, getByText } = renderWithProvider( + , + store, + ); + + expect( + queryByText( + 'This transaction is expected to fail. Trying to execute it is expected to be expensive but fail, and is not recommended.', + ), + ).not.toBeInTheDocument(); + expect( + queryByText('Transaction Error. Exception thrown in contract code.'), + ).not.toBeInTheDocument(); + expect(queryByText('I will try anyway')).not.toBeInTheDocument(); + + const confirmButton = getByText('Confirm'); + fireEvent.click(confirmButton); + expect(props.onSubmit).toHaveBeenCalledTimes(1); + + const cancelButton = getByText('Reject'); + fireEvent.click(cancelButton); + expect(props.onCancel).toHaveBeenCalledTimes(1); + }); +}); diff --git a/ui/components/ui/actionable-message/actionable-message.js b/ui/components/ui/actionable-message/actionable-message.js index 8af6646c7..9e4f4728c 100644 --- a/ui/components/ui/actionable-message/actionable-message.js +++ b/ui/components/ui/actionable-message/actionable-message.js @@ -26,6 +26,7 @@ export default function ActionableMessage({ type = 'default', useIcon = false, iconFillColor = '', + roundedButtons, }) { const actionableMessageClassName = classnames( 'actionable-message', @@ -35,6 +36,9 @@ export default function ActionableMessage({ { 'actionable-message--with-icon': useIcon }, ); + const onlyOneAction = + (primaryAction && !secondaryAction) || (secondaryAction && !primaryAction); + return (
{useIcon ? : null} @@ -47,12 +51,19 @@ export default function ActionableMessage({ )}
{message}
{(primaryAction || secondaryAction) && ( -
+
{primaryAction && (
) : null; + const renderGasDetailsItem = () => { + return EIP_1559_V2 ? ( + + ) : ( + + {isMultiLayerFeeNetwork + ? t('transactionDetailLayer2GasHeading') + : t('transactionDetailGasHeading')} + + + + + ) : ( + <> + {isMultiLayerFeeNetwork + ? t('transactionDetailLayer2GasHeading') + : t('transactionDetailGasHeading')} + +

+ {t('transactionDetailGasTooltipIntro', [ + isMainnet ? t('networkNameEthereum') : '', + ])} +

+

{t('transactionDetailGasTooltipExplanation')}

+

+ + {t('transactionDetailGasTooltipConversion')} + +

+ + } + position="top" + > + +
+ + ) + } + detailTitleColor={COLORS.BLACK} + detailText={ + !isMultiLayerFeeNetwork && ( +
+ {renderHeartBeatIfNotInTest()} + +
+ ) + } + detailTotal={ +
+ {renderHeartBeatIfNotInTest()} + +
+ } + subText={ + !isMultiLayerFeeNetwork && + t('editGasSubTextFee', [ + {t('editGasSubTextFeeLabel')}, +
+ {renderHeartBeatIfNotInTest()} + +
, + ]) + } + subTitle={ + <> + {txData.dappSuggestedGasFees ? ( + + {t('transactionDetailDappGasMoreInfo')} + + ) : ( + '' + )} + {supportsEIP1559 && ( + + )} + + } + /> + ); + }; + + const simulationFailureWarning = () => ( +
+ this.handleConfirmAnyways(), + }} + message={this.context.t('simulationErrorMessage')} + roundedButtons + /> +
+ ); + return (
{EIP_1559_V2 && } this.handleEditGas()} + disabled={isDisabled()} + onEdit={ + renderSimulationFailureWarning ? null : () => this.handleEditGas() + } rows={[ - EIP_1559_V2 ? ( - - ) : ( - - {isMultiLayerFeeNetwork - ? t('transactionDetailLayer2GasHeading') - : t('transactionDetailGasHeading')} - - - - - ) : ( - <> - {isMultiLayerFeeNetwork - ? t('transactionDetailLayer2GasHeading') - : t('transactionDetailGasHeading')} - -

- {t('transactionDetailGasTooltipIntro', [ - isMainnet ? t('networkNameEthereum') : '', - ])} -

-

{t('transactionDetailGasTooltipExplanation')}

-

- - {t('transactionDetailGasTooltipConversion')} - -

- - } - position="top" - > - -
- - ) - } - detailTitleColor={COLORS.BLACK} - detailText={ - !isMultiLayerFeeNetwork && ( -
- {renderHeartBeatIfNotInTest()} - -
- ) - } - detailTotal={ -
- {renderHeartBeatIfNotInTest()} - -
- } - subText={ - !isMultiLayerFeeNetwork && - t('editGasSubTextFee', [ - - {t('editGasSubTextFeeLabel')} - , -
- {renderHeartBeatIfNotInTest()} - -
, - ]) - } - subTitle={ - <> - {txData.dappSuggestedGasFees ? ( - - {t('transactionDetailDappGasMoreInfo')} - - ) : ( - '' - )} - {supportsEIP1559 && ( - - )} - - } - /> - ), - isMultiLayerFeeNetwork && ( + renderSimulationFailureWarning && simulationFailureWarning(), + !renderSimulationFailureWarning && renderGasDetailsItem(), + !renderSimulationFailureWarning && isMultiLayerFeeNetwork && ( { + return confirmAnyways ? false : !valid; + }; + let functionType = getMethodName(name); if (!functionType) { if (type) { @@ -965,6 +998,7 @@ export default class ConfirmTransactionBase extends Component { identiconAddress={identiconAddress} errorMessage={submitError} errorKey={errorKey} + hasSimulationError={hasSimulationError} warning={submitWarning} totalTx={totalTx} positionOfCurrentTx={positionOfCurrentTx} @@ -976,7 +1010,9 @@ export default class ConfirmTransactionBase extends Component { lastTx={lastTx} ofText={ofText} requestsWaitingText={requestsWaitingText} + hideConfirmAnyways={!isDisabled()} disabled={ + renderSimulationFailureWarning || !valid || submitting || hardwareWalletRequiresConnection || @@ -986,6 +1022,7 @@ export default class ConfirmTransactionBase extends Component { onCancelAll={() => this.handleCancelAll()} onCancel={() => this.handleCancel()} onSubmit={() => this.handleSubmit()} + onConfirmAnyways={() => this.handleConfirmAnyways()} hideSenderToRecipient={hideSenderToRecipient} origin={txData.origin} ethGasPriceWarning={ethGasPriceWarning} From 367492a0affdc01705053bf9796e2c212b5eaa17 Mon Sep 17 00:00:00 2001 From: dragana8 <92531782+dragana8@users.noreply.github.com> Date: Mon, 22 Nov 2021 13:26:09 +0100 Subject: [PATCH 016/129] Create an "Add a Nickname" popover (also support edit) #12528 (#12644) * added update nickname popover * fixed style errors * styling changes * fixed prettier error * added header * updates --- app/_locales/en/messages.json | 12 ++ ui/components/ui/ui-components.scss | 1 + .../ui/update-nickname-popover/index.js | 1 + .../ui/update-nickname-popover/index.scss | 56 +++++++++ .../update-nickname-popover.js | 119 ++++++++++++++++++ .../update-nickname-popover.stories.js | 45 +++++++ 6 files changed, 234 insertions(+) create mode 100644 ui/components/ui/update-nickname-popover/index.js create mode 100644 ui/components/ui/update-nickname-popover/index.scss create mode 100644 ui/components/ui/update-nickname-popover/update-nickname-popover.js create mode 100644 ui/components/ui/update-nickname-popover/update-nickname-popover.stories.js diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index adcc8298f..072577a8b 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -49,6 +49,9 @@ "addANetwork": { "message": "Add a network" }, + "addANickname": { + "message": "Add a nickname" + }, "addAcquiredTokens": { "message": "Add the tokens you've acquired using MetaMask" }, @@ -85,6 +88,9 @@ "addFriendsAndAddresses": { "message": "Add friends and addresses you trust" }, + "addMemo": { + "message": "Add memo" + }, "addNFT": { "message": "Add NFT" }, @@ -692,6 +698,9 @@ "edit": { "message": "Edit" }, + "editAddressNickname": { + "message": "Edit address nickname" + }, "editContact": { "message": "Edit Contact" }, @@ -1638,6 +1647,9 @@ "nfts": { "message": "NFTs" }, + "nickname": { + "message": "Nickname" + }, "noAccountsFound": { "message": "No accounts found for the given search query" }, diff --git a/ui/components/ui/ui-components.scss b/ui/components/ui/ui-components.scss index 6200bb21f..cc7f8bac8 100644 --- a/ui/components/ui/ui-components.scss +++ b/ui/components/ui/ui-components.scss @@ -53,3 +53,4 @@ @import 'typography/typography'; @import 'unit-input/index'; @import 'url-icon/index'; +@import 'update-nickname-popover/index'; diff --git a/ui/components/ui/update-nickname-popover/index.js b/ui/components/ui/update-nickname-popover/index.js new file mode 100644 index 000000000..010441206 --- /dev/null +++ b/ui/components/ui/update-nickname-popover/index.js @@ -0,0 +1 @@ +export { default } from './update-nickname-popover'; diff --git a/ui/components/ui/update-nickname-popover/index.scss b/ui/components/ui/update-nickname-popover/index.scss new file mode 100644 index 000000000..845cff195 --- /dev/null +++ b/ui/components/ui/update-nickname-popover/index.scss @@ -0,0 +1,56 @@ + +.update-nickname { + &__wrapper { + height: 620px; + width: 360px; + border-radius: 0; + + .popover-header { + border-bottom: 1px solid #d2d8dd; + margin-bottom: 16px; + border-radius: 0; + } + } + + &__cancel { + margin-right: 16px; + } + + &__content { + padding: 0 20px 20px 20px; + position: relative; + + &__indenticon { + margin-bottom: 16px; + } + + &__text-area-wrapper { + height: 96px !important; + } + + &__text-area { + line-height: initial !important; + } + + &__address { + margin-top: 8px; + font-size: 13px; + color: #bbc0c5; + margin-bottom: 16px; + } + + &__label, + &__label--capitalized { + text-transform: capitalize; + margin-top: 16px; + color: #24292e; + font-size: 14px; + } + + &__nickname-label { + margin-bottom: 8px; + color: #24292e; + font-size: 14px; + } + } +} diff --git a/ui/components/ui/update-nickname-popover/update-nickname-popover.js b/ui/components/ui/update-nickname-popover/update-nickname-popover.js new file mode 100644 index 000000000..8f81ffe7d --- /dev/null +++ b/ui/components/ui/update-nickname-popover/update-nickname-popover.js @@ -0,0 +1,119 @@ +import React, { useCallback, useContext, useState } from 'react'; +import PropTypes from 'prop-types'; + +import Popover from '../popover'; +import Button from '../button'; +import TextField from '../text-field'; + +import { I18nContext } from '../../../contexts/i18n'; + +import Identicon from '../identicon/identicon.component'; + +export default function UpdateNicknamePopover({ + nickname, + address, + onAdd, + memo, + onClose, +}) { + const t = useContext(I18nContext); + + const [nicknameInput, setNicknameInput] = useState(nickname); + const [memoInput, setMemoInput] = useState(memo); + + const handleNicknameChange = (event) => { + setNicknameInput(event.target.value); + }; + + const handleMemoChange = (event) => { + setMemoInput(event.target.value); + }; + + const closePopover = useCallback(() => { + onClose(); + }, [onClose]); + + const onCancel = () => { + onClose(); + }; + + const onSubmit = () => { + onAdd(address, nicknameInput, memoInput); + onClose(); + }; + + let title = t('addANickname'); + if (nickname) { + title = t('editAddressNickname'); + } + + return ( + + + + + } + > +
+ + +
{address}
+
+ {t('nickname')} +
+ +
+ {t('memo')} +
+ +
+
+ ); +} + +UpdateNicknamePopover.propTypes = { + nickname: PropTypes.string, + address: PropTypes.string, + memo: PropTypes.string, + onAdd: PropTypes.func, + onClose: PropTypes.func, +}; diff --git a/ui/components/ui/update-nickname-popover/update-nickname-popover.stories.js b/ui/components/ui/update-nickname-popover/update-nickname-popover.stories.js new file mode 100644 index 000000000..ce9c34aca --- /dev/null +++ b/ui/components/ui/update-nickname-popover/update-nickname-popover.stories.js @@ -0,0 +1,45 @@ +import React, { useState } from 'react'; +import { action } from '@storybook/addon-actions'; +import { text } from '@storybook/addon-knobs'; +import Button from '../button'; +import UpdateNicknamePopover from '.'; + +export default { + title: 'UpdateNickname', + id: __filename, +}; + +export const AddNickname = () => { + const [showPopover, setShowPopover] = useState(false); + return ( +
+ + {showPopover && ( + action(`Close Update Nickname Popover`)()} + /> + )} +
+ ); +}; + +export const UpdateNickname = () => { + const [showPopover, setShowPopover] = useState(false); + return ( +
+ + {showPopover && ( + action(`Close Update Nickname Popover`)()} + /> + )} +
+ ); +}; From 994a7d5458101f73f96bc7d660fc6d80d8676836 Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Mon, 22 Nov 2021 12:05:05 -0330 Subject: [PATCH 017/129] Add fixed json-schema to resolutions file to resolve security issue (#12787) --- package.json | 3 ++- yarn.lock | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 820a0ee95..9ca87bdfb 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,8 @@ "netmask": "^2.0.1", "pubnub/superagent-proxy": "^3.0.0", "pull-ws": "^3.3.2", - "ws": "^7.4.6" + "ws": "^7.4.6", + "json-schema": "^0.4.0" }, "dependencies": { "3box": "^1.10.2", diff --git a/yarn.lock b/yarn.lock index f27c87709..91c307eb1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18907,10 +18907,10 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-schema@0.2.3, json-schema@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" From 2647be96626d41e750dc0c5d7aedda930cfa8eba Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Mon, 22 Nov 2021 12:54:42 -0330 Subject: [PATCH 018/129] Ensure one and only one localhost option appears in network list (#12786) * Ensure one and only one localhost option appears in network list * Fix unit tests --- app/scripts/first-time-state.js | 10 +++++- .../app/dropdowns/network-dropdown.js | 36 +++++++++++++++---- .../app/dropdowns/network-dropdown.test.js | 2 ++ 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/app/scripts/first-time-state.js b/app/scripts/first-time-state.js index 34969b58f..857921889 100644 --- a/app/scripts/first-time-state.js +++ b/app/scripts/first-time-state.js @@ -10,7 +10,15 @@ const initialState = { config: {}, PreferencesController: { - frequentRpcListDetail: [], + frequentRpcListDetail: [ + { + rpcUrl: 'http://localhost:8545', + chainId: '0x539', + ticker: 'ETH', + nickname: 'Localhost 8545', + rpcPrefs: {}, + }, + ], }, }; diff --git a/ui/components/app/dropdowns/network-dropdown.js b/ui/components/app/dropdowns/network-dropdown.js index 2e2528e47..889ba9fa9 100644 --- a/ui/components/app/dropdowns/network-dropdown.js +++ b/ui/components/app/dropdowns/network-dropdown.js @@ -7,7 +7,10 @@ import classnames from 'classnames'; import Button from '../../ui/button'; import * as actions from '../../../store/actions'; import { openAlert as displayInvalidCustomNetworkAlert } from '../../../ducks/alerts/invalid-custom-network'; -import { NETWORK_TYPE_RPC } from '../../../../shared/constants/network'; +import { + NETWORK_TYPE_RPC, + LOCALHOST_RPC_URL, +} from '../../../../shared/constants/network'; import { isPrefixedFormattedHexString } from '../../../../shared/modules/network.utils'; import ColorIndicator from '../../ui/color-indicator'; @@ -149,7 +152,7 @@ class NetworkDropdown extends Component { ); } - renderCustomRpcList(rpcListDetail, provider) { + renderCustomRpcList(rpcListDetail, provider, opts = {}) { const reversedRpcListDetail = rpcListDetail.slice().reverse(); return reversedRpcListDetail.map((entry) => { @@ -157,6 +160,14 @@ class NetworkDropdown extends Component { const isCurrentRpcTarget = provider.type === NETWORK_TYPE_RPC && rpcUrl === provider.rpcUrl; + let borderColor = COLORS.UI2; + if (isCurrentRpcTarget) { + borderColor = COLORS.WHITE; + } + if (opts.isLocalHost) { + borderColor = 'localhost'; + } + return (
)} rpc.rpcUrl !== LOCALHOST_RPC_URL, + ); + const rpcListDetailForLocalHost = rpcListDetail.filter( + (rpc) => rpc.rpcUrl === LOCALHOST_RPC_URL, + ); const isOpen = this.props.networkDropdownOpen; const { t } = this.context; @@ -340,7 +357,10 @@ class NetworkDropdown extends Component {
{this.renderNetworkEntry('mainnet')} - {this.renderCustomRpcList(rpcListDetail, this.props.provider)} + {this.renderCustomRpcList( + rpcListDetailWithoutLocalHost, + this.props.provider, + )}
diff --git a/ui/components/app/dropdowns/network-dropdown.test.js b/ui/components/app/dropdowns/network-dropdown.test.js index 263460b85..f8546f8b6 100644 --- a/ui/components/app/dropdowns/network-dropdown.test.js +++ b/ui/components/app/dropdowns/network-dropdown.test.js @@ -4,6 +4,7 @@ import thunk from 'redux-thunk'; import Button from '../../ui/button'; import { mountWithRouter } from '../../../../test/lib/render-helpers'; import ColorIndicator from '../../ui/color-indicator'; +import { LOCALHOST_RPC_URL } from '../../../../shared/constants/network'; import NetworkDropdown from './network-dropdown'; import { DropdownMenuItem } from './dropdown'; @@ -55,6 +56,7 @@ describe('Network Dropdown', () => { frequentRpcListDetail: [ { chainId: '0x1a', rpcUrl: 'http://localhost:7545' }, { rpcUrl: 'http://localhost:7546' }, + { rpcUrl: LOCALHOST_RPC_URL, nickname: 'localhost' }, ], }, appState: { From 42fea3d32329f55004d9038c93db51e130a4f4da Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Mon, 22 Nov 2021 22:49:29 +0530 Subject: [PATCH 019/129] Confirm transaction screen - wrap lengthier values (#12733) --- test/e2e/tests/send-edit.spec.js | 2 +- .../app/transaction-detail-item/index.scss | 22 +++-------- .../transaction-detail-item.component.js | 39 +++++++------------ 3 files changed, 21 insertions(+), 42 deletions(-) diff --git a/test/e2e/tests/send-edit.spec.js b/test/e2e/tests/send-edit.spec.js index 81772df7b..94000b4a8 100644 --- a/test/e2e/tests/send-edit.spec.js +++ b/test/e2e/tests/send-edit.spec.js @@ -62,7 +62,7 @@ describe('Editing Confirm Transaction', function () { // has correct updated value on the confirm screen the transaction const editedTransactionAmounts = await driver.findElements( - '.transaction-detail-item__row .transaction-detail-item__detail-text .currency-display-component__text', + '.transaction-detail-item__row .transaction-detail-item__detail-values .currency-display-component__text:last-of-type', ); const editedTransactionAmount = editedTransactionAmounts[0]; assert.equal(await editedTransactionAmount.getText(), '0.0008'); diff --git a/ui/components/app/transaction-detail-item/index.scss b/ui/components/app/transaction-detail-item/index.scss index 8d6c1bcd7..45c6e4f9b 100644 --- a/ui/components/app/transaction-detail-item/index.scss +++ b/ui/components/app/transaction-detail-item/index.scss @@ -5,12 +5,15 @@ &__row { display: flex; + justify-content: space-between; grid-gap: 5px; } - &__title { - flex-grow: 1; - word-break: break-word; + &__detail-values { + display: flex; + flex-wrap: wrap; + justify-content: end; + width: 65%; } .info-tooltip { @@ -22,19 +25,6 @@ } } - &__total { - font-weight: bold; - color: $ui-black; - } - - &__subtitle { - flex-grow: 1; - } - - &__subtext { - text-align: end; - } - .currency-display-component { display: inline; } diff --git a/ui/components/app/transaction-detail-item/transaction-detail-item.component.js b/ui/components/app/transaction-detail-item/transaction-detail-item.component.js index 80a3e2fef..9780402ff 100644 --- a/ui/components/app/transaction-detail-item/transaction-detail-item.component.js +++ b/ui/components/app/transaction-detail-item/transaction-detail-item.component.js @@ -23,46 +23,35 @@ export default function TransactionDetailItem({ color={detailTitleColor} fontWeight={FONT_WEIGHT.BOLD} variant={TYPOGRAPHY.H6} - className="transaction-detail-item__title" > {detailTitle} - {detailText && ( +
+ {detailText && ( + + {detailText} + + )} - {detailText} + {detailTotal} - )} - - {detailTotal} - +
{React.isValidElement(subTitle) ? ( -
{subTitle}
+
{subTitle}
) : ( - + {subTitle} )} - + {subText}
From d296c517db5bc14d1b4133d12a599e7a30985a59 Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Mon, 22 Nov 2021 19:02:03 -0330 Subject: [PATCH 020/129] Remove localhost from default network list (#12790) * Remove localhost from default network list * Update e2e fixtures --- test/e2e/tests/custom-rpc-history.spec.js | 5 +++-- .../settings/networks-tab/networks-tab.constants.js | 12 ------------ 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/test/e2e/tests/custom-rpc-history.spec.js b/test/e2e/tests/custom-rpc-history.spec.js index 687b64f96..6868808ac 100644 --- a/test/e2e/tests/custom-rpc-history.spec.js +++ b/test/e2e/tests/custom-rpc-history.spec.js @@ -84,7 +84,7 @@ describe('Stores custom RPC history', function () { await rpcUrlInput.clear(); await rpcUrlInput.sendKeys(duplicateRpcUrl); await driver.findElement({ - text: 'This URL is currently used by the localhost network.', + text: 'This URL is currently used by the Localhost 8545 network.', tag: 'h6', }); }, @@ -123,7 +123,8 @@ describe('Stores custom RPC history', function () { await chainIdInput.clear(); await chainIdInput.sendKeys(duplicateChainId); await driver.findElement({ - text: 'This Chain ID is currently used by the localhost network.', + text: + 'This Chain ID is currently used by the Localhost 8545 network.', tag: 'h6', }); }, diff --git a/ui/pages/settings/networks-tab/networks-tab.constants.js b/ui/pages/settings/networks-tab/networks-tab.constants.js index d5ad83541..26a57c7bd 100644 --- a/ui/pages/settings/networks-tab/networks-tab.constants.js +++ b/ui/pages/settings/networks-tab/networks-tab.constants.js @@ -5,9 +5,6 @@ import { KOVAN, KOVAN_CHAIN_ID, KOVAN_RPC_URL, - LOCALHOST, - LOCALHOST_CHAIN_ID, - LOCALHOST_RPC_URL, MAINNET, MAINNET_CHAIN_ID, MAINNET_RPC_URL, @@ -65,15 +62,6 @@ const defaultNetworksData = [ ticker: 'ETH', blockExplorerUrl: 'https://kovan.etherscan.io', }, - { - labelKey: LOCALHOST, - iconColor: '#29B6AF', - providerType: LOCALHOST, - rpcUrl: LOCALHOST_RPC_URL, - chainId: LOCALHOST_CHAIN_ID, - ticker: 'ETH', - blockExplorerUrl: '', - }, ]; export { defaultNetworksData }; From 8ce0eff047324f1ff0d2b29e9143ad243a77204d Mon Sep 17 00:00:00 2001 From: Etienne Dusseault Date: Mon, 22 Nov 2021 19:40:33 -0600 Subject: [PATCH 021/129] alert-circle-icon (#12651) --- ui/components/ui/alert-circle-icon/README.mdx | 25 +++++++++++++++++++ .../alert-circle-icon.component.js | 3 +++ .../alert-circle-icon.stories.js | 24 +++++++++++++++--- 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 ui/components/ui/alert-circle-icon/README.mdx diff --git a/ui/components/ui/alert-circle-icon/README.mdx b/ui/components/ui/alert-circle-icon/README.mdx new file mode 100644 index 000000000..c7d05782f --- /dev/null +++ b/ui/components/ui/alert-circle-icon/README.mdx @@ -0,0 +1,25 @@ +import { Story, Canvas, ArgsTable } from '@storybook/addon-docs'; + +import AlertCircleIcon from '.'; + +# Alert Circle Icon + + + + + +## Component API + + + +## Usage + +The following describes the props and example usage for this component. + +### Warning + +Render warning alert icon + + + + diff --git a/ui/components/ui/alert-circle-icon/alert-circle-icon.component.js b/ui/components/ui/alert-circle-icon/alert-circle-icon.component.js index 71eca7783..689447810 100644 --- a/ui/components/ui/alert-circle-icon/alert-circle-icon.component.js +++ b/ui/components/ui/alert-circle-icon/alert-circle-icon.component.js @@ -15,6 +15,9 @@ const typeConfig = { export default class AlertCircleIcon extends Component { static propTypes = { + /** + * giving different alert icon for the component + */ type: PropTypes.oneOf(Object.keys(typeConfig)).isRequired, }; diff --git a/ui/components/ui/alert-circle-icon/alert-circle-icon.stories.js b/ui/components/ui/alert-circle-icon/alert-circle-icon.stories.js index 4053d9661..fe34a15a8 100644 --- a/ui/components/ui/alert-circle-icon/alert-circle-icon.stories.js +++ b/ui/components/ui/alert-circle-icon/alert-circle-icon.stories.js @@ -1,11 +1,29 @@ import React from 'react'; +import README from './README.mdx'; import AlertCircleIcon from './alert-circle-icon.component'; export default { - title: 'AlertCircleIcon', + title: 'Components/UI/Alert Circle Icon', id: __filename, + component: AlertCircleIcon, + parameters: { + docs: { + page: README, + }, + }, + argTypes: { + type: { options: ['warning', 'danger'], control: { type: 'select' } }, + }, }; -export const dangerCircleIcon = () => ; +export const DefaultStory = (args) => ; +DefaultStory.storyName = 'Default'; -export const warningCircleIcon = () => ; +DefaultStory.args = { + type: 'danger', +}; + +export const Warning = (args) => ; +Warning.args = { + type: 'warning', +}; From 49ae325d522245cf7b1ad3be6ed8d9307a6c82eb Mon Sep 17 00:00:00 2001 From: Etienne Dusseault Date: Mon, 22 Nov 2021 19:41:16 -0600 Subject: [PATCH 022/129] circle-icon (#12650) --- ui/components/ui/circle-icon/README.mdx | 16 +++++++++++ .../ui/circle-icon/circle-icon.component.js | 12 ++++++++ .../ui/circle-icon/circle-icon.stories.js | 28 ++++++++++++++++--- 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 ui/components/ui/circle-icon/README.mdx diff --git a/ui/components/ui/circle-icon/README.mdx b/ui/components/ui/circle-icon/README.mdx new file mode 100644 index 000000000..ee4a95b7d --- /dev/null +++ b/ui/components/ui/circle-icon/README.mdx @@ -0,0 +1,16 @@ +import { Story, Canvas, ArgsTable } from '@storybook/addon-docs'; + +import CircleIcon from '.'; + +# Circle Icon + +Add circle border to the image component + + + + + +## Component API + + + diff --git a/ui/components/ui/circle-icon/circle-icon.component.js b/ui/components/ui/circle-icon/circle-icon.component.js index 522953286..c772941c4 100644 --- a/ui/components/ui/circle-icon/circle-icon.component.js +++ b/ui/components/ui/circle-icon/circle-icon.component.js @@ -3,9 +3,21 @@ import PropTypes from 'prop-types'; export default class CircleIcon extends PureComponent { static propTypes = { + /** + * add size (px) for the image container + */ size: PropTypes.string, + /** + * add css classname for the component based on the parent css + */ circleClass: PropTypes.string, + /** + * image source path + */ iconSource: PropTypes.string.isRequired, + /** + * add size (px) for the image + */ iconSize: PropTypes.string, }; diff --git a/ui/components/ui/circle-icon/circle-icon.stories.js b/ui/components/ui/circle-icon/circle-icon.stories.js index 786efaa1a..5fb969737 100644 --- a/ui/components/ui/circle-icon/circle-icon.stories.js +++ b/ui/components/ui/circle-icon/circle-icon.stories.js @@ -1,17 +1,37 @@ import React from 'react'; +import README from './README.mdx'; import CircleIcon from './circle-icon.component'; export default { - title: 'CircleIcon', + title: 'Components/UI/Circle Icon', id: __filename, + component: CircleIcon, + parameters: { + docs: { + page: README, + }, + }, + argTypes: { + size: { control: 'text' }, + circleClass: { control: 'text' }, + iconSource: { control: 'text' }, + iconSize: { control: 'text' }, + }, }; -export const basicCircleIcon = () => ( +export const DefaultStory = (args) => ( ); + +DefaultStory.storyName = 'Default'; + +DefaultStory.args = { + iconSize: '42px', + iconSource: 'images/eth_logo.svg', +}; From bf0602561519e8873abff65075dcfb3a4ea79ce8 Mon Sep 17 00:00:00 2001 From: Daniel <80175477+dan437@users.noreply.github.com> Date: Tue, 23 Nov 2021 17:33:32 +0100 Subject: [PATCH 023/129] Fix "BigNumber Error: times() number type has more than 15 significant digits:" (#12802) --- app/scripts/controllers/swaps.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/scripts/controllers/swaps.js b/app/scripts/controllers/swaps.js index 06945e4e6..397883b72 100644 --- a/app/scripts/controllers/swaps.js +++ b/app/scripts/controllers/swaps.js @@ -746,7 +746,7 @@ export default class SwapsController { const conversionRateForSorting = tokenConversionRate || 1; const ethValueOfTokens = decimalAdjustedDestinationAmount.times( - conversionRateForSorting, + conversionRateForSorting.toString(10), 10, ); @@ -768,7 +768,7 @@ export default class SwapsController { quote.ethValueOfTokens = ethValueOfTokens.toString(10); quote.overallValueOfQuote = overallValueOfQuoteForSorting.toString(10); quote.metaMaskFeeInEth = metaMaskFeeInTokens - .times(conversionRateForCalculations) + .times(conversionRateForCalculations.toString(10)) .toString(10); } From fbc6f4e603c6f5f4054a52f17c792bf4ef54c462 Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Tue, 23 Nov 2021 22:22:50 +0530 Subject: [PATCH 024/129] Adding network status section on edit gas fee modal (#12704) --- app/_locales/en/messages.json | 17 +++- ui/components/app/app-components.scss | 2 + .../edit-gas-fee-popover.js | 26 ++++++- .../app/edit-gas-fee-popover/index.scss | 12 ++- .../network-status/index.js | 1 + .../network-status/index.scss | 41 ++++++++++ .../network-status/network-status.js | 59 ++++++++++++++ .../network-status/network-status.test.js | 77 +++++++++++++++++++ .../network-status/status-slider/index.js | 1 + .../network-status/status-slider/index.scss | 42 ++++++++++ .../status-slider/status-slider.js | 53 +++++++++++++ .../status-slider/status-slider.test.js | 51 ++++++++++++ ui/css/design-system/attributes.scss | 2 +- 13 files changed, 378 insertions(+), 6 deletions(-) create mode 100644 ui/components/app/edit-gas-fee-popover/network-status/index.js create mode 100644 ui/components/app/edit-gas-fee-popover/network-status/index.scss create mode 100644 ui/components/app/edit-gas-fee-popover/network-status/network-status.js create mode 100644 ui/components/app/edit-gas-fee-popover/network-status/network-status.test.js create mode 100644 ui/components/app/edit-gas-fee-popover/network-status/status-slider/index.js create mode 100644 ui/components/app/edit-gas-fee-popover/network-status/status-slider/index.scss create mode 100644 ui/components/app/edit-gas-fee-popover/network-status/status-slider/status-slider.js create mode 100644 ui/components/app/edit-gas-fee-popover/network-status/status-slider/status-slider.test.js diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 072577a8b..3a3d89906 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -323,6 +323,9 @@ "builtAroundTheWorld": { "message": "MetaMask is designed and built around the world." }, + "busy": { + "message": "Busy" + }, "buy": { "message": "Buy" }, @@ -1318,8 +1321,11 @@ "layer1Fees": { "message": "Layer 1 fees" }, + "learmMoreAboutGas": { + "message": "Want to $1 about gas?" + }, "learnMore": { - "message": "Learn more" + "message": "learn more" }, "learnScamRisk": { "message": "scams and security risks." @@ -1585,6 +1591,9 @@ "networkSettingsDescription": { "message": "Add and edit custom RPC networks" }, + "networkStatus": { + "message": "Network status" + }, "networkURL": { "message": "Network URL" }, @@ -1689,6 +1698,9 @@ "nonceFieldHeading": { "message": "Custom Nonce" }, + "notBusy": { + "message": "Not busy" + }, "notCurrentAccount": { "message": "Is this the correct account? It's different from the currently selected account in your wallet" }, @@ -2381,6 +2393,9 @@ "spendLimitTooLarge": { "message": "Spend limit too large" }, + "stable": { + "message": "Stable" + }, "stateLogError": { "message": "Error in retrieving state logs." }, diff --git a/ui/components/app/app-components.scss b/ui/components/app/app-components.scss index e5a5a1882..e5e245d87 100644 --- a/ui/components/app/app-components.scss +++ b/ui/components/app/app-components.scss @@ -15,6 +15,8 @@ @import 'edit-gas-display-education/index'; @import 'edit-gas-fee-popover/index'; @import 'edit-gas-fee-popover/edit-gas-item/index'; +@import 'edit-gas-fee-popover/network-status/index'; +@import 'edit-gas-fee-popover/network-status/status-slider/index'; @import 'gas-customization/gas-modal-page-container/index'; @import 'gas-customization/gas-price-button-group/index'; @import 'gas-customization/index'; diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js index afbaefc53..abfdbca98 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js @@ -3,11 +3,14 @@ import PropTypes from 'prop-types'; import { PRIORITY_LEVELS } from '../../../../shared/constants/gas'; import { useI18nContext } from '../../../hooks/useI18nContext'; -import Popover from '../../ui/popover'; import I18nValue from '../../ui/i18n-value'; import LoadingHeartBeat from '../../ui/loading-heartbeat'; +import Popover from '../../ui/popover'; +import Typography from '../../ui/typography/typography'; +import { COLORS } from '../../../helpers/constants/design-system'; import EditGasItem from './edit-gas-item'; +import NetworkStatus from './network-status'; const EditGasFeePopover = ({ onClose }) => { const t = useI18nContext(); @@ -54,6 +57,27 @@ const EditGasFeePopover = ({ onClose }) => { priorityLevel={PRIORITY_LEVELS.CUSTOM} onClose={onClose} /> + + + + + , + ]} + /> +
diff --git a/ui/components/app/edit-gas-fee-popover/index.scss b/ui/components/app/edit-gas-fee-popover/index.scss index f892e8a71..e701d7137 100644 --- a/ui/components/app/edit-gas-fee-popover/index.scss +++ b/ui/components/app/edit-gas-fee-popover/index.scss @@ -1,7 +1,5 @@ .edit-gas-fee-popover { - @media screen and (min-width: $break-large) { - max-height: 84vh; - } + height: 500px; &__wrapper { border-top: 1px solid $ui-grey; @@ -37,4 +35,12 @@ margin: 8px 12px; } } + + &__network-status { + margin-top: 36px; + } + + &__know-more a { + color: $primary-1; + } } diff --git a/ui/components/app/edit-gas-fee-popover/network-status/index.js b/ui/components/app/edit-gas-fee-popover/network-status/index.js new file mode 100644 index 000000000..0ba1f18f3 --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/network-status/index.js @@ -0,0 +1 @@ +export { default } from './network-status'; diff --git a/ui/components/app/edit-gas-fee-popover/network-status/index.scss b/ui/components/app/edit-gas-fee-popover/network-status/index.scss new file mode 100644 index 000000000..db6d37299 --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/network-status/index.scss @@ -0,0 +1,41 @@ +.network-status { + margin: 24px 0 12px; + + &__info { + border-top: 1px solid $ui-2; + border-bottom: 1px solid $ui-2; + height: 56px; + display: flex; + align-items: center; + + &__separator { + border-left: 1px solid $ui-2; + height: 65%; + } + + &__field { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 30%; + + &--priority-fee { + width: 40%; + } + + &-data { + color: $ui-4; + font-size: 12px; + text-align: center; + } + + &-label { + color: $Black-100; + font-size: 10px; + font-weight: bold; + margin-top: 4px; + } + } + } +} diff --git a/ui/components/app/edit-gas-fee-popover/network-status/network-status.js b/ui/components/app/edit-gas-fee-popover/network-status/network-status.js new file mode 100644 index 000000000..ca6a3ccff --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/network-status/network-status.js @@ -0,0 +1,59 @@ +import React from 'react'; + +import { toBigNumber } from '../../../../../shared/modules/conversion.utils'; +import { COLORS } from '../../../../helpers/constants/design-system'; +import { useGasFeeContext } from '../../../../contexts/gasFee'; +import I18nValue from '../../../ui/i18n-value'; +import Typography from '../../../ui/typography/typography'; + +import StatusSlider from './status-slider'; + +const NetworkStatus = () => { + const { gasFeeEstimates } = useGasFeeContext(); + let estBaseFee = null; + if (gasFeeEstimates?.estimatedBaseFee) { + // estimatedBaseFee is not likely to be below 1, value .01 is used as test networks sometimes + // show have small values for it and more decimal places may cause UI to look broken. + estBaseFee = toBigNumber.dec(gasFeeEstimates?.estimatedBaseFee); + estBaseFee = estBaseFee.lessThan(0.01) ? 0.01 : estBaseFee.toFixed(2); + } + + return ( +
+ + + +
+
+ + {estBaseFee !== null && `${estBaseFee} GWEI`} + + Base fee +
+
+
+ + 0.5 - 22 GWEI + + + Priority fee + +
+
+
+ +
+
+
+ ); +}; + +NetworkStatus.propTypes = {}; + +export default NetworkStatus; diff --git a/ui/components/app/edit-gas-fee-popover/network-status/network-status.test.js b/ui/components/app/edit-gas-fee-popover/network-status/network-status.test.js new file mode 100644 index 000000000..df5e30411 --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/network-status/network-status.test.js @@ -0,0 +1,77 @@ +import React from 'react'; +import { screen } from '@testing-library/react'; + +import { renderWithProvider } from '../../../../../test/jest'; +import { ETH } from '../../../../helpers/constants/common'; +import { GasFeeContextProvider } from '../../../../contexts/gasFee'; +import configureStore from '../../../../store/store'; + +import NetworkStatus from './network-status'; + +jest.mock('../../../../store/actions', () => ({ + disconnectGasFeeEstimatePoller: jest.fn(), + getGasFeeEstimatesAndStartPolling: jest + .fn() + .mockImplementation(() => Promise.resolve()), + addPollingTokenToAppState: jest.fn(), + getGasFeeTimeEstimate: jest + .fn() + .mockImplementation(() => Promise.resolve('unknown')), +})); + +const MOCK_FEE_ESTIMATE = { + estimatedBaseFee: '50.0112', +}; + +const renderComponent = (props) => { + const store = configureStore({ + metamask: { + nativeCurrency: ETH, + provider: {}, + cachedBalances: {}, + accounts: { + '0xAddress': { + address: '0xAddress', + balance: '0x176e5b6f173ebe66', + }, + }, + selectedAddress: '0xAddress', + featureFlags: { advancedInlineGas: true }, + gasFeeEstimates: MOCK_FEE_ESTIMATE, + ...props, + }, + }); + + return renderWithProvider( + + + , + store, + ); +}; + +describe('NetworkStatus', () => { + it('should renders labels', () => { + renderComponent(); + expect(screen.queryByText('Base fee')).toBeInTheDocument(); + expect(screen.queryByText('Priority fee')).toBeInTheDocument(); + }); + + it('should renders current base fee value rounded to 2 decimal places', () => { + renderComponent(); + expect( + screen.queryByText( + `${parseFloat(MOCK_FEE_ESTIMATE.estimatedBaseFee).toFixed(2)} GWEI`, + ), + ).toBeInTheDocument(); + }); + + it('should .01 as estimates base fee if estimated base fee is < .01', () => { + renderComponent({ + gasFeeEstimates: { + estimatedBaseFee: '0.0012', + }, + }); + expect(screen.queryByText('0.01 GWEI')).toBeInTheDocument(); + }); +}); diff --git a/ui/components/app/edit-gas-fee-popover/network-status/status-slider/index.js b/ui/components/app/edit-gas-fee-popover/network-status/status-slider/index.js new file mode 100644 index 000000000..a9105f5f7 --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/network-status/status-slider/index.js @@ -0,0 +1 @@ +export { default } from './status-slider'; diff --git a/ui/components/app/edit-gas-fee-popover/network-status/status-slider/index.scss b/ui/components/app/edit-gas-fee-popover/network-status/status-slider/index.scss new file mode 100644 index 000000000..d8274d3d3 --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/network-status/status-slider/index.scss @@ -0,0 +1,42 @@ +.status-slider { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 65%; + + &__line { + background-image: linear-gradient(to right, #037dd6, #d73a49); + height: 4px; + width: 100%; + border-radius: 100px; + display: block; + } + + &__label { + font-size: 10px; + font-weight: bold; + margin-top: 4px; + } + + &__arrow-border { + width: 0; + height: 0; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + border-top: 10px solid white; + position: relative; + margin-bottom: -2px; + } + + &__arrow { + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid black; + position: absolute; + bottom: 3px; + left: -5px; + } +} diff --git a/ui/components/app/edit-gas-fee-popover/network-status/status-slider/status-slider.js b/ui/components/app/edit-gas-fee-popover/network-status/status-slider/status-slider.js new file mode 100644 index 000000000..8271cac6a --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/network-status/status-slider/status-slider.js @@ -0,0 +1,53 @@ +import React from 'react'; + +import I18nValue from '../../../../ui/i18n-value'; + +const GRADIENT_COLORS = [ + '#037DD6', + '#1876C8', + '#2D70BA', + '#4369AB', + '#57629E', + '#6A5D92', + '#805683', + '#9A4D71', + '#B44561', + '#C54055', +]; + +const StatusSlider = () => { + // todo: value below to be replaced with dynamic values from api once it is available + // corresponding test cases also to be added + const statusValue = 0.5; + const sliderValueNumeric = Math.round(statusValue * 10); + + let statusLabel = 'stable'; + if (statusValue <= 0.33) { + statusLabel = 'notBusy'; + } else if (statusValue > 0.66) { + statusLabel = 'busy'; + } + + return ( +
+
+
+
+
+
+ +
+
+ ); +}; + +export default StatusSlider; diff --git a/ui/components/app/edit-gas-fee-popover/network-status/status-slider/status-slider.test.js b/ui/components/app/edit-gas-fee-popover/network-status/status-slider/status-slider.test.js new file mode 100644 index 000000000..a10ed82bb --- /dev/null +++ b/ui/components/app/edit-gas-fee-popover/network-status/status-slider/status-slider.test.js @@ -0,0 +1,51 @@ +import React from 'react'; +import { screen } from '@testing-library/react'; + +import { renderWithProvider } from '../../../../../../test/jest'; +import { ETH } from '../../../../../helpers/constants/common'; +import { GasFeeContextProvider } from '../../../../../contexts/gasFee'; +import configureStore from '../../../../../store/store'; + +import StatusSlider from './status-slider'; + +jest.mock('../../../../../store/actions', () => ({ + disconnectGasFeeEstimatePoller: jest.fn(), + getGasFeeEstimatesAndStartPolling: jest + .fn() + .mockImplementation(() => Promise.resolve()), + addPollingTokenToAppState: jest.fn(), + getGasFeeTimeEstimate: jest + .fn() + .mockImplementation(() => Promise.resolve('unknown')), +})); + +const renderComponent = () => { + const store = configureStore({ + metamask: { + nativeCurrency: ETH, + provider: {}, + cachedBalances: {}, + accounts: { + '0xAddress': { + address: '0xAddress', + balance: '0x176e5b6f173ebe66', + }, + }, + selectedAddress: '0xAddress', + }, + }); + + return renderWithProvider( + + + , + store, + ); +}; + +describe('NetworkStatus', () => { + it('should renders stable for statusValue > 0.33 and <= 0.66', () => { + renderComponent(); + expect(screen.queryByText('Stable')).toBeInTheDocument(); + }); +}); diff --git a/ui/css/design-system/attributes.scss b/ui/css/design-system/attributes.scss index 8b920b7eb..4a187a949 100644 --- a/ui/css/design-system/attributes.scss +++ b/ui/css/design-system/attributes.scss @@ -82,4 +82,4 @@ $display: block, grid, flex, inline-block, inline-grid, inline-flex, list-item; $text-align: left, right, center, justify, end; $font-weight: bold, normal, 100, 200, 300, 400, 500, 600, 700, 800, 900; $font-style: normal, italic, oblique; -$font-size: 12px; +$font-size: 10px, 12px; From a931316a5317b1fe6443a419f5ca856f8058692f Mon Sep 17 00:00:00 2001 From: Aaron Chen Date: Wed, 24 Nov 2021 01:28:39 +0800 Subject: [PATCH 025/129] Introduce QR based signer into MetaMask (#12065) * support qr based signer * add CSP for fire fox * get QR Hardware wallet name from device * fix qrHardware state missing in runtime * support qr based signer sign transaction * refine Request Signature modal ui * remove feature toggle * refine ui * fix notification is closing even there is a pending qr hardware transaction * add chinese translation, refine ui, fix qr process was breaking in some case * support import accounts by pubkeys * refine qr-based wallet ui and fix bugs * update @keystonehq/metamask-airgapped-keyring to fix that the signing hd path was inconsistent in some edge case * fix: avoid unnecessay navigation, fix ci * refactor qr-hardware-popover with @zxing/browser * update lavamoat policy, remove firefox CSP * refine qr reader ui, ignore unnecessary warning display * code refactor, use async functions insteads promise Co-authored-by: Soralit --- app/_locales/en/messages.json | 51 ++++ app/_locales/zh_CN/messages.json | 48 ++++ app/images/qrcode-wallet-demo.svg | 56 +++++ app/images/qrcode-wallet-logo.svg | 11 + app/scripts/controllers/app-state.js | 6 + app/scripts/metamask-controller.js | 71 +++++- app/scripts/platforms/extension.js | 7 +- lavamoat/browserify/beta/policy.json | 103 +++++++++ lavamoat/browserify/flask/policy.json | 103 +++++++++ lavamoat/browserify/main/policy.json | 103 +++++++++ package.json | 8 +- shared/constants/hardware-wallets.js | 10 +- .../account-menu/account-menu.component.js | 1 + .../app/qr-hardware-popover/base-reader.js | 217 ++++++++++++++++++ .../qr-hardware-popover/enhanced-reader.js | 67 ++++++ .../app/qr-hardware-popover/index.js | 3 + .../qr-hardware-popover.js | 102 ++++++++ .../qr-hardware-sign-request/index.js | 3 + .../qr-hardware-sign-request/player.js | 71 ++++++ .../qr-hardware-sign-request.component.js | 45 ++++ .../qr-hardware-sign-request/reader.js | 52 +++++ .../qr-hardware-wallet-importer/index.js | 3 + .../qr-hardware-wallet-importer.component.js | 37 +++ .../create-account/connect-hardware/index.js | 26 ++- .../connect-hardware/index.scss | 2 +- .../connect-hardware/select-hardware.js | 102 +++++++- ui/pages/home/home.component.js | 29 ++- ui/pages/home/home.container.js | 7 + ui/pages/routes/routes.component.js | 2 + ui/selectors/selectors.js | 43 ++++ ui/store/actions.js | 33 ++- yarn.lock | 192 +++++++++++++++- 32 files changed, 1567 insertions(+), 47 deletions(-) create mode 100644 app/images/qrcode-wallet-demo.svg create mode 100644 app/images/qrcode-wallet-logo.svg create mode 100644 ui/components/app/qr-hardware-popover/base-reader.js create mode 100644 ui/components/app/qr-hardware-popover/enhanced-reader.js create mode 100644 ui/components/app/qr-hardware-popover/index.js create mode 100644 ui/components/app/qr-hardware-popover/qr-hardware-popover.js create mode 100644 ui/components/app/qr-hardware-popover/qr-hardware-sign-request/index.js create mode 100644 ui/components/app/qr-hardware-popover/qr-hardware-sign-request/player.js create mode 100644 ui/components/app/qr-hardware-popover/qr-hardware-sign-request/qr-hardware-sign-request.component.js create mode 100644 ui/components/app/qr-hardware-popover/qr-hardware-sign-request/reader.js create mode 100644 ui/components/app/qr-hardware-popover/qr-hardware-wallet-importer/index.js create mode 100644 ui/components/app/qr-hardware-popover/qr-hardware-wallet-importer/qr-hardware-wallet-importer.component.js diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 3a3d89906..2878872a9 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1,4 +1,49 @@ { + "QRHardwareInvalidTransactionTitle": { + "message": "Error" + }, + "QRHardwareMismatchedSignId": { + "message": "Incongruent transaction data. Please check the transaction details." + }, + "QRHardwarePubkeyAccountOutOfRange": { + "message": "No more accounts. If you would like to access another account unlisted below, please reconnect your hardware wallet and select it." + }, + "QRHardwareScanInstructions": { + "message": "Place the QR code in front of your camera. The screen is blurred, but it will not affect the reading." + }, + "QRHardwareSignRequestCancel": { + "message": "Reject" + }, + "QRHardwareSignRequestDescription": { + "message": "After you’ve signed with your wallet, click on 'Get Signature' to receive the signature" + }, + "QRHardwareSignRequestGetSignature": { + "message": "Get Signature" + }, + "QRHardwareSignRequestSubtitle": { + "message": "Scan the QR code with your wallet" + }, + "QRHardwareSignRequestTitle": { + "message": "Request Signature" + }, + "QRHardwareUnknownQRCodeTitle": { + "message": "Error" + }, + "QRHardwareUnknownWalletQRCode": { + "message": "Invalid QR code. Please scan the sync QR code of the hardware wallet." + }, + "QRHardwareWalletImporterTitle": { + "message": "Scan QR Code" + }, + "QRHardwareWalletSteps1Description": { + "message": "Connect an airgapped hardware wallet that communicates through QR-codes. Officially supported airgapped hardware wallets include:" + }, + "QRHardwareWalletSteps1Title": { + "message": "QR-based HW Wallet" + }, + "QRHardwareWalletSteps2Description": { + "message": "AirGap Vault & Ngrave (Coming Soon)" + }, "about": { "message": "About" }, @@ -1306,6 +1351,12 @@ "message": "JSON File", "description": "format for importing an account" }, + "keystone": { + "message": "Keystone" + }, + "keystoneTutorial": { + "message": " (Tutorials)" + }, "knownAddressRecipient": { "message": "Known contract address." }, diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index 8555b89a4..c65164366 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -1,4 +1,46 @@ { + "QRHardwareInvalidTransactionTitle": { + "message": "非法交易" + }, + "QRHardwareMismatchedSignId": { + "message": "扫描的签名二维码不属于当前交易,请检查交易详情后重试。" + }, + "QRHardwarePubkeyAccountOutOfRange": { + "message": "暂无更多账户,若想切换到其他账户,请在硬件钱包中选择想要的账户重新同步。" + }, + "QRHardwareScanInstructions": { + "message": "为了保护您的隐私,屏幕是模糊的,但不影响对二维码的读取。" + }, + "QRHardwareSignRequestCancel": { + "message": "拒绝该交易" + }, + "QRHardwareSignRequestDescription": { + "message": "硬件钱包扫描上方二维码完成签名后,点击“获取签名”按钮扫描已签名的二维码" + }, + "QRHardwareSignRequestGetSignature": { + "message": "获取签名" + }, + "QRHardwareSignRequestSubtitle": { + "message": "用硬件钱包扫描二维码" + }, + "QRHardwareSignRequestTitle": { + "message": "获取签名" + }, + "QRHardwareUnknownQRCodeTitle": { + "message": "非法二维码" + }, + "QRHardwareUnknownWalletQRCode": { + "message": "请扫描硬件钱包的同步二维码。" + }, + "QRHardwareWalletImporterTitle": { + "message": "扫描二维码" + }, + "QRHardwareWalletSteps1Description": { + "message": "该类硬件钱包通过二维码实现通讯交互,做到完全脱网。官方支持的钱包有:" + }, + "QRHardwareWalletSteps2Description": { + "message": "AirGap Vault & Ngrave (即将上线)" + }, "about": { "message": "关于" }, @@ -835,6 +877,12 @@ "message": "JSON 文件", "description": "format for importing an account" }, + "keystone": { + "message": "铠石钱包" + }, + "keystoneTutorial": { + "message": " (使用教程)" + }, "knownAddressRecipient": { "message": "已知接收方地址。" }, diff --git a/app/images/qrcode-wallet-demo.svg b/app/images/qrcode-wallet-demo.svg new file mode 100644 index 000000000..61ed69eee --- /dev/null +++ b/app/images/qrcode-wallet-demo.svg @@ -0,0 +1,56 @@ + + + png-chahua + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/images/qrcode-wallet-logo.svg b/app/images/qrcode-wallet-logo.svg new file mode 100644 index 000000000..a88a7635e --- /dev/null +++ b/app/images/qrcode-wallet-logo.svg @@ -0,0 +1,11 @@ + + + qr-logo的副本2 + + + + + + + + \ No newline at end of file diff --git a/app/scripts/controllers/app-state.js b/app/scripts/controllers/app-state.js index f68579bad..3f1881786 100644 --- a/app/scripts/controllers/app-state.js +++ b/app/scripts/controllers/app-state.js @@ -16,6 +16,7 @@ export default class AppStateController extends EventEmitter { onInactiveTimeout, showUnlockRequest, preferencesStore, + qrHardwareStore, } = opts; super(); @@ -32,6 +33,7 @@ export default class AppStateController extends EventEmitter { recoveryPhraseReminderLastShown: new Date().getTime(), showTestnetMessageInDropdown: true, ...initState, + qrHardware: {}, }); this.timer = null; @@ -48,6 +50,10 @@ export default class AppStateController extends EventEmitter { } }); + qrHardwareStore.subscribe((state) => { + this.store.updateState({ qrHardware: state }); + }); + const { preferences } = preferencesStore.getState(); this._setInactiveTimeout(preferences.autoLockTimeLimit); } diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 004879828..5eec84f24 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -15,6 +15,7 @@ import log from 'loglevel'; import TrezorKeyring from 'eth-trezor-keyring'; import LedgerBridgeKeyring from '@metamask/eth-ledger-bridge-keyring'; import LatticeKeyring from 'eth-lattice-keyring'; +import { MetaMaskKeyring as QRHardwareKeyring } from '@keystonehq/metamask-airgapped-keyring'; import EthQuery from 'eth-query'; import nanoid from 'nanoid'; import { ethErrors } from 'eth-rpc-errors'; @@ -41,7 +42,10 @@ import { SWAPS_CLIENT_ID, } from '../../shared/constants/swaps'; import { MAINNET_CHAIN_ID } from '../../shared/constants/network'; -import { KEYRING_TYPES } from '../../shared/constants/hardware-wallets'; +import { + DEVICE_NAMES, + KEYRING_TYPES, +} from '../../shared/constants/hardware-wallets'; import { UI_NOTIFICATIONS } from '../../shared/notifications'; import { toChecksumHexAddress } from '../../shared/modules/hexstring-utils'; import { MILLISECOND } from '../../shared/constants/time'; @@ -286,6 +290,8 @@ export default class MetamaskController extends EventEmitter { }, }); + this.qrHardwareKeyring = new QRHardwareKeyring(); + this.appStateController = new AppStateController({ addUnlockListener: this.on.bind(this, 'unlock'), isUnlocked: this.isUnlocked.bind(this), @@ -293,6 +299,7 @@ export default class MetamaskController extends EventEmitter { onInactiveTimeout: () => this.setLocked(), showUnlockRequest: opts.showUserConfirmation, preferencesStore: this.preferencesController.store, + qrHardwareStore: this.qrHardwareKeyring.getMemStore(), }); const currencyRateMessenger = this.controllerMessenger.getRestricted({ @@ -432,6 +439,7 @@ export default class MetamaskController extends EventEmitter { TrezorKeyring, LedgerBridgeKeyring, LatticeKeyring, + QRHardwareKeyring, ]; this.keyringController = new KeyringController({ keyringTypes: additionalKeyrings, @@ -938,6 +946,28 @@ export default class MetamaskController extends EventEmitter { this, ), + // qr hardware devices + submitQRHardwareCryptoHDKey: nodeify( + this.qrHardwareKeyring.submitCryptoHDKey, + this.qrHardwareKeyring, + ), + submitQRHardwareCryptoAccount: nodeify( + this.qrHardwareKeyring.submitCryptoAccount, + this.qrHardwareKeyring, + ), + cancelSyncQRHardware: nodeify( + this.qrHardwareKeyring.cancelSync, + this.qrHardwareKeyring, + ), + submitQRHardwareSignature: nodeify( + this.qrHardwareKeyring.submitSignature, + this.qrHardwareKeyring, + ), + cancelQRHardwareSignRequest: nodeify( + this.qrHardwareKeyring.cancelSignRequest, + this.qrHardwareKeyring, + ), + // mobile fetchInfoToSync: nodeify(this.fetchInfoToSync, this), @@ -1647,13 +1677,16 @@ export default class MetamaskController extends EventEmitter { async getKeyringForDevice(deviceName, hdPath = null) { let keyringName = null; switch (deviceName) { - case 'trezor': + case DEVICE_NAMES.TREZOR: keyringName = TrezorKeyring.type; break; - case 'ledger': + case DEVICE_NAMES.LEDGER: keyringName = LedgerBridgeKeyring.type; break; - case 'lattice': + case DEVICE_NAMES.QR: + keyringName = QRHardwareKeyring.type; + break; + case DEVICE_NAMES.LATTICE: keyringName = LatticeKeyring.type; break; default: @@ -1670,7 +1703,7 @@ export default class MetamaskController extends EventEmitter { if (hdPath && keyring.setHdPath) { keyring.setHdPath(hdPath); } - if (deviceName === 'lattice') { + if (deviceName === DEVICE_NAMES.LATTICE) { keyring.appName = 'MetaMask'; } keyring.network = this.networkController.getProviderConfig().type; @@ -1740,6 +1773,18 @@ export default class MetamaskController extends EventEmitter { return true; } + /** + * get hardware account label + * + * @return string label + * */ + + getAccountLabel(name, index, hdPathDescription) { + return `${name[0].toUpperCase()}${name.slice(1)} ${ + parseInt(index, 10) + 1 + } ${hdPathDescription || ''}`.trim(); + } + /** * Imports an account from a Trezor or Ledger device. * @@ -1760,10 +1805,12 @@ export default class MetamaskController extends EventEmitter { this.preferencesController.setAddresses(newAccounts); newAccounts.forEach((address) => { if (!oldAccounts.includes(address)) { - const label = `${deviceName[0].toUpperCase()}${deviceName.slice(1)} ${ - parseInt(index, 10) + 1 - } ${hdPathDescription || ''}`.trim(); - // Set the account label to Trezor 1 / Ledger 1, etc + const label = this.getAccountLabel( + deviceName === DEVICE_NAMES.QR ? keyring.getName() : deviceName, + index, + hdPathDescription, + ); + // Set the account label to Trezor 1 / Ledger 1 / QR Hardware 1, etc this.preferencesController.setAccountLabel(address, label); // Select the account this.preferencesController.setSelectedAddress(address); @@ -2179,6 +2226,12 @@ export default class MetamaskController extends EventEmitter { }); } + case KEYRING_TYPES.QR: { + return Promise.reject( + new Error('QR hardware does not support eth_getEncryptionPublicKey.'), + ); + } + default: { const promise = this.encryptionPublicKeyManager.addUnapprovedMessageAsync( msgParams, diff --git a/app/scripts/platforms/extension.js b/app/scripts/platforms/extension.js index c2f931b49..722d96625 100644 --- a/app/scripts/platforms/extension.js +++ b/app/scripts/platforms/extension.js @@ -118,13 +118,14 @@ export default class ExtensionPlatform { ) { let extensionURL = extension.runtime.getURL('home.html'); + if (route) { + extensionURL += `#${route}`; + } + if (queryString) { extensionURL += `?${queryString}`; } - if (route) { - extensionURL += `#${route}`; - } this.openTab({ url: extensionURL }); if ( getEnvironmentType() !== ENVIRONMENT_TYPE_BACKGROUND && diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index c8a541438..024601e10 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -412,6 +412,47 @@ "Intl.getCanonicalLocales": true } }, + "@keystonehq/base-eth-keyring": { + "packages": { + "@ethereumjs/tx": true, + "@keystonehq/bc-ur-registry-eth": true, + "buffer": true, + "ethereumjs-util": true, + "hdkey": true, + "uuid": true + } + }, + "@keystonehq/bc-ur-registry": { + "globals": { + "define": true + }, + "packages": { + "@ngraveio/bc-ur": true, + "bs58check": true, + "buffer": true + } + }, + "@keystonehq/bc-ur-registry-eth": { + "packages": { + "@keystonehq/bc-ur-registry": true, + "buffer": true, + "ethereumjs-util": true, + "hdkey": true, + "uuid": true + } + }, + "@keystonehq/metamask-airgapped-keyring": { + "packages": { + "@ethereumjs/tx": true, + "@keystonehq/base-eth-keyring": true, + "@keystonehq/bc-ur-registry-eth": true, + "@metamask/obs-store": true, + "buffer": true, + "events": true, + "rlp": true, + "uuid": true + } + }, "@material-ui/core": { "globals": { "Image": true, @@ -619,6 +660,18 @@ "events": true } }, + "@ngraveio/bc-ur": { + "packages": { + "@apocentre/alias-sampling": true, + "assert": true, + "bignumber.js": true, + "buffer": true, + "cbor-sync": true, + "crc": true, + "jsbi": true, + "sha.js": true + } + }, "@popperjs/core": { "globals": { "Element": true, @@ -738,6 +791,23 @@ "util": true } }, + "@zxing/browser": { + "globals": { + "HTMLElement": true, + "HTMLImageElement": true, + "HTMLVideoElement": true, + "URL.createObjectURL": true, + "clearTimeout": true, + "console.error": true, + "console.warn": true, + "document": true, + "navigator": true, + "setTimeout": true + }, + "packages": { + "@zxing/library": true + } + }, "@zxing/library": { "globals": { "TextDecoder": true, @@ -975,6 +1045,9 @@ } }, "bn.js": { + "globals": { + "Buffer": true + }, "packages": { "browser-resolve": true } @@ -1099,6 +1172,14 @@ "buffer": true } }, + "cbor-sync": { + "globals": { + "define": true + }, + "packages": { + "buffer": true + } + }, "cids": { "packages": { "buffer": true, @@ -1191,6 +1272,11 @@ "is-buffer": true } }, + "crc": { + "packages": { + "buffer": true + } + }, "crc-32": { "globals": { "DO_NOT_EXPORT_CRC": true, @@ -2007,6 +2093,7 @@ "hdkey": { "packages": { "assert": true, + "bs58check": true, "coinstring": true, "crypto-browserify": true, "safe-buffer": true, @@ -2559,6 +2646,11 @@ "console.warn": true } }, + "jsbi": { + "globals": { + "define": true + } + }, "json-rpc-engine": { "packages": { "@metamask/safe-event-emitter": true, @@ -3769,6 +3861,17 @@ "define": true } }, + "qrcode.react": { + "globals": { + "Path2D": true, + "devicePixelRatio": true + }, + "packages": { + "prop-types": true, + "qr.js": true, + "react": true + } + }, "rabin-wasm": { "globals": { "Blob": true, diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index c8a541438..024601e10 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -412,6 +412,47 @@ "Intl.getCanonicalLocales": true } }, + "@keystonehq/base-eth-keyring": { + "packages": { + "@ethereumjs/tx": true, + "@keystonehq/bc-ur-registry-eth": true, + "buffer": true, + "ethereumjs-util": true, + "hdkey": true, + "uuid": true + } + }, + "@keystonehq/bc-ur-registry": { + "globals": { + "define": true + }, + "packages": { + "@ngraveio/bc-ur": true, + "bs58check": true, + "buffer": true + } + }, + "@keystonehq/bc-ur-registry-eth": { + "packages": { + "@keystonehq/bc-ur-registry": true, + "buffer": true, + "ethereumjs-util": true, + "hdkey": true, + "uuid": true + } + }, + "@keystonehq/metamask-airgapped-keyring": { + "packages": { + "@ethereumjs/tx": true, + "@keystonehq/base-eth-keyring": true, + "@keystonehq/bc-ur-registry-eth": true, + "@metamask/obs-store": true, + "buffer": true, + "events": true, + "rlp": true, + "uuid": true + } + }, "@material-ui/core": { "globals": { "Image": true, @@ -619,6 +660,18 @@ "events": true } }, + "@ngraveio/bc-ur": { + "packages": { + "@apocentre/alias-sampling": true, + "assert": true, + "bignumber.js": true, + "buffer": true, + "cbor-sync": true, + "crc": true, + "jsbi": true, + "sha.js": true + } + }, "@popperjs/core": { "globals": { "Element": true, @@ -738,6 +791,23 @@ "util": true } }, + "@zxing/browser": { + "globals": { + "HTMLElement": true, + "HTMLImageElement": true, + "HTMLVideoElement": true, + "URL.createObjectURL": true, + "clearTimeout": true, + "console.error": true, + "console.warn": true, + "document": true, + "navigator": true, + "setTimeout": true + }, + "packages": { + "@zxing/library": true + } + }, "@zxing/library": { "globals": { "TextDecoder": true, @@ -975,6 +1045,9 @@ } }, "bn.js": { + "globals": { + "Buffer": true + }, "packages": { "browser-resolve": true } @@ -1099,6 +1172,14 @@ "buffer": true } }, + "cbor-sync": { + "globals": { + "define": true + }, + "packages": { + "buffer": true + } + }, "cids": { "packages": { "buffer": true, @@ -1191,6 +1272,11 @@ "is-buffer": true } }, + "crc": { + "packages": { + "buffer": true + } + }, "crc-32": { "globals": { "DO_NOT_EXPORT_CRC": true, @@ -2007,6 +2093,7 @@ "hdkey": { "packages": { "assert": true, + "bs58check": true, "coinstring": true, "crypto-browserify": true, "safe-buffer": true, @@ -2559,6 +2646,11 @@ "console.warn": true } }, + "jsbi": { + "globals": { + "define": true + } + }, "json-rpc-engine": { "packages": { "@metamask/safe-event-emitter": true, @@ -3769,6 +3861,17 @@ "define": true } }, + "qrcode.react": { + "globals": { + "Path2D": true, + "devicePixelRatio": true + }, + "packages": { + "prop-types": true, + "qr.js": true, + "react": true + } + }, "rabin-wasm": { "globals": { "Blob": true, diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index c8a541438..024601e10 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -412,6 +412,47 @@ "Intl.getCanonicalLocales": true } }, + "@keystonehq/base-eth-keyring": { + "packages": { + "@ethereumjs/tx": true, + "@keystonehq/bc-ur-registry-eth": true, + "buffer": true, + "ethereumjs-util": true, + "hdkey": true, + "uuid": true + } + }, + "@keystonehq/bc-ur-registry": { + "globals": { + "define": true + }, + "packages": { + "@ngraveio/bc-ur": true, + "bs58check": true, + "buffer": true + } + }, + "@keystonehq/bc-ur-registry-eth": { + "packages": { + "@keystonehq/bc-ur-registry": true, + "buffer": true, + "ethereumjs-util": true, + "hdkey": true, + "uuid": true + } + }, + "@keystonehq/metamask-airgapped-keyring": { + "packages": { + "@ethereumjs/tx": true, + "@keystonehq/base-eth-keyring": true, + "@keystonehq/bc-ur-registry-eth": true, + "@metamask/obs-store": true, + "buffer": true, + "events": true, + "rlp": true, + "uuid": true + } + }, "@material-ui/core": { "globals": { "Image": true, @@ -619,6 +660,18 @@ "events": true } }, + "@ngraveio/bc-ur": { + "packages": { + "@apocentre/alias-sampling": true, + "assert": true, + "bignumber.js": true, + "buffer": true, + "cbor-sync": true, + "crc": true, + "jsbi": true, + "sha.js": true + } + }, "@popperjs/core": { "globals": { "Element": true, @@ -738,6 +791,23 @@ "util": true } }, + "@zxing/browser": { + "globals": { + "HTMLElement": true, + "HTMLImageElement": true, + "HTMLVideoElement": true, + "URL.createObjectURL": true, + "clearTimeout": true, + "console.error": true, + "console.warn": true, + "document": true, + "navigator": true, + "setTimeout": true + }, + "packages": { + "@zxing/library": true + } + }, "@zxing/library": { "globals": { "TextDecoder": true, @@ -975,6 +1045,9 @@ } }, "bn.js": { + "globals": { + "Buffer": true + }, "packages": { "browser-resolve": true } @@ -1099,6 +1172,14 @@ "buffer": true } }, + "cbor-sync": { + "globals": { + "define": true + }, + "packages": { + "buffer": true + } + }, "cids": { "packages": { "buffer": true, @@ -1191,6 +1272,11 @@ "is-buffer": true } }, + "crc": { + "packages": { + "buffer": true + } + }, "crc-32": { "globals": { "DO_NOT_EXPORT_CRC": true, @@ -2007,6 +2093,7 @@ "hdkey": { "packages": { "assert": true, + "bs58check": true, "coinstring": true, "crypto-browserify": true, "safe-buffer": true, @@ -2559,6 +2646,11 @@ "console.warn": true } }, + "jsbi": { + "globals": { + "define": true + } + }, "json-rpc-engine": { "packages": { "@metamask/safe-event-emitter": true, @@ -3769,6 +3861,17 @@ "define": true } }, + "qrcode.react": { + "globals": { + "Path2D": true, + "devicePixelRatio": true + }, + "packages": { + "prop-types": true, + "qr.js": true, + "react": true + } + }, "rabin-wasm": { "globals": { "Blob": true, diff --git a/package.json b/package.json index 98c2bec28..3a63336b7 100644 --- a/package.json +++ b/package.json @@ -106,6 +106,8 @@ "@ethereumjs/tx": "^3.2.1", "@formatjs/intl-relativetimeformat": "^5.2.6", "@fortawesome/fontawesome-free": "^5.13.0", + "@keystonehq/bc-ur-registry-eth": "^0.6.8", + "@keystonehq/metamask-airgapped-keyring": "0.2.1", "@material-ui/core": "^4.11.0", "@metamask/contract-metadata": "^1.28.0", "@metamask/controllers": "^20.0.0", @@ -117,11 +119,13 @@ "@metamask/obs-store": "^5.0.0", "@metamask/post-message-stream": "^4.0.0", "@metamask/providers": "^8.1.1", + "@ngraveio/bc-ur": "^1.1.6", "@popperjs/core": "^2.4.0", "@reduxjs/toolkit": "^1.6.2", "@sentry/browser": "^6.0.0", "@sentry/integrations": "^6.0.0", - "@zxing/library": "^0.8.0", + "@zxing/browser": "^0.0.10", + "@zxing/library": "0.8.0", "analytics-node": "^3.4.0-beta.3", "await-semaphore": "^0.1.1", "base32-encode": "^1.2.0", @@ -181,6 +185,7 @@ "pump": "^3.0.0", "punycode": "^2.1.1", "qrcode-generator": "1.4.1", + "qrcode.react": "^1.0.1", "react": "^16.12.0", "react-dnd": "^3.0.2", "react-dnd-html5-backend": "^7.4.4", @@ -206,6 +211,7 @@ "swappable-obj-proxy": "^1.1.0", "textarea-caret": "^3.0.1", "unicode-confusables": "^0.1.1", + "uuid": "^8.3.2", "valid-url": "^1.0.9", "web3": "^0.20.7", "web3-stream-provider": "^4.0.0" diff --git a/shared/constants/hardware-wallets.js b/shared/constants/hardware-wallets.js index f32306472..105287800 100644 --- a/shared/constants/hardware-wallets.js +++ b/shared/constants/hardware-wallets.js @@ -1,5 +1,5 @@ /** - * Accounts can be instantiated from simple, HD or the two hardware wallet + * Accounts can be instantiated from simple, HD or the multiple hardware wallet * keyring types. Both simple and HD are treated as default but we do special * case accounts managed by a hardware wallet. */ @@ -7,6 +7,14 @@ export const KEYRING_TYPES = { LEDGER: 'Ledger Hardware', TREZOR: 'Trezor Hardware', LATTICE: 'Lattice Hardware', + QR: 'QR Hardware Wallet Device', +}; + +export const DEVICE_NAMES = { + LEDGER: 'ledger', + TREZOR: 'trezor', + QR: 'QR Hardware', + LATTICE: 'lattice', }; /** diff --git a/ui/components/app/account-menu/account-menu.component.js b/ui/components/app/account-menu/account-menu.component.js index f72077777..131d63336 100644 --- a/ui/components/app/account-menu/account-menu.component.js +++ b/ui/components/app/account-menu/account-menu.component.js @@ -239,6 +239,7 @@ export default class AccountMenu extends Component { case KEYRING_TYPES.TREZOR: case KEYRING_TYPES.LEDGER: case KEYRING_TYPES.LATTICE: + case KEYRING_TYPES.QR: label = t('hardware'); break; case 'Simple Key Pair': diff --git a/ui/components/app/qr-hardware-popover/base-reader.js b/ui/components/app/qr-hardware-popover/base-reader.js new file mode 100644 index 000000000..5743dc3c4 --- /dev/null +++ b/ui/components/app/qr-hardware-popover/base-reader.js @@ -0,0 +1,217 @@ +import React, { useEffect, useRef, useState } from 'react'; +import log from 'loglevel'; +import { URDecoder } from '@ngraveio/bc-ur'; +import PropTypes from 'prop-types'; +import { getEnvironmentType } from '../../../../app/scripts/lib/util'; +import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../shared/constants/app'; +import WebcamUtils from '../../../helpers/utils/webcam-utils'; +import PageContainerFooter from '../../ui/page-container/page-container-footer/page-container-footer.component'; +import { useI18nContext } from '../../../hooks/useI18nContext'; +import { SECOND } from '../../../../shared/constants/time'; +import EnhancedReader from './enhanced-reader'; + +const READY_STATE = { + ACCESSING_CAMERA: 'ACCESSING_CAMERA', + NEED_TO_ALLOW_ACCESS: 'NEED_TO_ALLOW_ACCESS', + READY: 'READY', +}; + +const BaseReader = ({ + isReadingWallet, + handleCancel, + handleSuccess, + setErrorTitle, +}) => { + const t = useI18nContext(); + const [ready, setReady] = useState(READY_STATE.ACCESSING_CAMERA); + const [error, setError] = useState(null); + const [urDecoder, setURDecoder] = useState(new URDecoder()); + + let permissionChecker = null; + const mounted = useRef(false); + + const reset = () => { + setReady(READY_STATE.ACCESSING_CAMERA); + setError(null); + setURDecoder(new URDecoder()); + }; + + const checkEnvironment = async () => { + try { + const { environmentReady } = await WebcamUtils.checkStatus(); + if ( + !environmentReady && + getEnvironmentType() !== ENVIRONMENT_TYPE_FULLSCREEN + ) { + const currentUrl = new URL(window.location.href); + const currentHash = currentUrl.hash; + const currentRoute = currentHash ? currentHash.substring(1) : null; + global.platform.openExtensionInBrowser(currentRoute); + } + } catch (e) { + if (mounted.current) { + setError(e); + } + } + // initial attempt is required to trigger permission prompt + // eslint-disable-next-line no-use-before-define + return initCamera(); + }; + + const checkPermissions = async () => { + try { + const { permissions } = await WebcamUtils.checkStatus(); + if (permissions) { + // Let the video stream load first... + await new Promise((resolve) => setTimeout(resolve, SECOND * 2)); + if (!mounted.current) { + return; + } + setReady(READY_STATE.READY); + } else if (mounted.current) { + // Keep checking for permissions + permissionChecker = setTimeout(checkPermissions, SECOND); + setReady(READY_STATE.NEED_TO_ALLOW_ACCESS); + } + } catch (e) { + if (mounted.current) { + setError(e); + } + } + }; + + const handleScan = (data) => { + try { + if (!data) { + return; + } + urDecoder.receivePart(data); + if (urDecoder.isComplete()) { + const result = urDecoder.resultUR(); + handleSuccess(result).catch(setError); + } + } catch (e) { + if (isReadingWallet) { + setErrorTitle(t('QRHardwareUnknownQRCodeTitle')); + } else { + setErrorTitle(t('QRHardwareInvalidTransactionTitle')); + } + setError(new Error(t('unknownQrCode'))); + } + }; + + const initCamera = () => { + try { + checkPermissions(); + } catch (e) { + if (!mounted.current) { + return; + } + if (e.name === 'NotAllowedError') { + log.info(`Permission denied: '${e}'`); + setReady(READY_STATE.NEED_TO_ALLOW_ACCESS); + } else { + setError(e); + } + } + }; + + useEffect(() => { + mounted.current = true; + checkEnvironment(); + return () => { + mounted.current = false; + clearTimeout(permissionChecker); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + if (ready === READY_STATE.READY) { + initCamera(); + } else if (ready === READY_STATE.NEED_TO_ALLOW_ACCESS) { + checkPermissions(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ready]); + + const tryAgain = () => { + clearTimeout(permissionChecker); + reset(); + checkEnvironment(); + }; + + const renderError = () => { + let title, msg; + if (error.type === 'NO_WEBCAM_FOUND') { + title = t('noWebcamFoundTitle'); + msg = t('noWebcamFound'); + } else if (error.message === t('unknownQrCode')) { + if (isReadingWallet) { + msg = t('QRHardwareUnknownWalletQRCode'); + } else { + msg = t('unknownQrCode'); + } + } else if (error.message === t('QRHardwareMismatchedSignId')) { + msg = t('QRHardwareMismatchedSignId'); + } else { + title = t('unknownCameraErrorTitle'); + msg = t('unknownCameraError'); + } + + return ( + <> +
+ +
+ {title ?
{title}
: null} +
{msg}
+ { + setErrorTitle(''); + handleCancel(); + }} + onSubmit={() => { + setErrorTitle(''); + tryAgain(); + }} + cancelText={t('cancel')} + submitText={t('tryAgain')} + submitButtonType="confirm" + /> + + ); + }; + + const renderVideo = () => { + let message; + if (ready === READY_STATE.ACCESSING_CAMERA) { + message = t('accessingYourCamera'); + } else if (ready === READY_STATE.READY) { + message = t('QRHardwareScanInstructions'); + } else if (ready === READY_STATE.NEED_TO_ALLOW_ACCESS) { + message = t('youNeedToAllowCameraAccess'); + } + return ( + <> +
+ +
+ {message &&
{message}
} + + ); + }; + + return ( +
{error ? renderError() : renderVideo()}
+ ); +}; + +BaseReader.propTypes = { + isReadingWallet: PropTypes.bool.isRequired, + handleCancel: PropTypes.func.isRequired, + handleSuccess: PropTypes.func.isRequired, + setErrorTitle: PropTypes.func.isRequired, +}; + +export default BaseReader; diff --git a/ui/components/app/qr-hardware-popover/enhanced-reader.js b/ui/components/app/qr-hardware-popover/enhanced-reader.js new file mode 100644 index 000000000..d1d696717 --- /dev/null +++ b/ui/components/app/qr-hardware-popover/enhanced-reader.js @@ -0,0 +1,67 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import { BarcodeFormat, DecodeHintType } from '@zxing/library'; +import { BrowserQRCodeReader } from '@zxing/browser'; +import log from 'loglevel'; +import PropTypes from 'prop-types'; +import { MILLISECOND } from '../../../../shared/constants/time'; +import Spinner from '../../ui/spinner'; + +const EnhancedReader = ({ handleScan }) => { + const [canplay, setCanplay] = useState(false); + const codeReader = useMemo(() => { + const hint = new Map(); + hint.set(DecodeHintType.POSSIBLE_FORMATS, [BarcodeFormat.QR_CODE]); + return new BrowserQRCodeReader(hint, { + delayBetweenScanAttempts: MILLISECOND * 100, + delayBetweenScanSuccess: MILLISECOND * 100, + }); + }, []); + + useEffect(() => { + const videoElem = document.getElementById('video'); + const canplayListener = () => { + setCanplay(true); + }; + videoElem.addEventListener('canplay', canplayListener); + const promise = codeReader.decodeFromVideoDevice( + undefined, + 'video', + (result) => { + if (result) { + handleScan(result.getText()); + } + }, + ); + return () => { + videoElem.removeEventListener('canplay', canplayListener); + promise + .then((controls) => { + if (controls) { + controls.stop(); + } + }) + .catch(log.info); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( +
+
+ ); +}; + +EnhancedReader.propTypes = { + handleScan: PropTypes.func.isRequired, +}; + +export default EnhancedReader; diff --git a/ui/components/app/qr-hardware-popover/index.js b/ui/components/app/qr-hardware-popover/index.js new file mode 100644 index 000000000..2ccbb2100 --- /dev/null +++ b/ui/components/app/qr-hardware-popover/index.js @@ -0,0 +1,3 @@ +import QRHardwarePopover from './qr-hardware-popover'; + +export default QRHardwarePopover; diff --git a/ui/components/app/qr-hardware-popover/qr-hardware-popover.js b/ui/components/app/qr-hardware-popover/qr-hardware-popover.js new file mode 100644 index 000000000..c3875c4e8 --- /dev/null +++ b/ui/components/app/qr-hardware-popover/qr-hardware-popover.js @@ -0,0 +1,102 @@ +import React, { useCallback, useMemo, useState } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { getCurrentQRHardwareState } from '../../../selectors'; +import Popover from '../../ui/popover'; +import { useI18nContext } from '../../../hooks/useI18nContext'; +import { + cancelSyncQRHardware as cancelSyncQRHardwareAction, + cancelQRHardwareSignRequest as cancelQRHardwareSignRequestAction, + cancelTx, + cancelPersonalMsg, + cancelMsg, + cancelTypedMsg, +} from '../../../store/actions'; +import { MESSAGE_TYPE } from '../../../../shared/constants/app'; +import QRHardwareWalletImporter from './qr-hardware-wallet-importer'; +import QRHardwareSignRequest from './qr-hardware-sign-request'; + +const QRHardwarePopover = () => { + const t = useI18nContext(); + + const qrHardware = useSelector(getCurrentQRHardwareState); + const { sync, sign } = qrHardware; + const showWalletImporter = sync?.reading; + const showSignRequest = sign?.request; + const showPopover = showWalletImporter || showSignRequest; + const [errorTitle, setErrorTitle] = useState(''); + + const { txData } = useSelector((state) => { + return state.confirmTransaction; + }); + // the confirmTransaction's life cycle is not consistent with QR hardware wallet; + // the confirmTransaction will change after the previous tx is confirmed or cancel, + // we want to block the changing by sign request id; + const _txData = useMemo(() => { + return txData; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [sign?.request?.requestId]); + + const dispatch = useDispatch(); + const walletImporterCancel = useCallback( + () => dispatch(cancelSyncQRHardwareAction()), + [dispatch], + ); + + const signRequestCancel = useCallback(() => { + let action = cancelTx; + switch (_txData.type) { + case MESSAGE_TYPE.PERSONAL_SIGN: { + action = cancelPersonalMsg; + break; + } + case MESSAGE_TYPE.ETH_SIGN: { + action = cancelMsg; + break; + } + case MESSAGE_TYPE.ETH_SIGN_TYPED_DATA: { + action = cancelTypedMsg; + break; + } + default: { + action = cancelTx; + } + } + dispatch(action(_txData)); + dispatch(cancelQRHardwareSignRequestAction()); + }, [dispatch, _txData]); + + const title = useMemo(() => { + let _title = ''; + if (showSignRequest) { + _title = t('QRHardwareSignRequestTitle'); + } else if (showWalletImporter) { + _title = t('QRHardwareWalletImporterTitle'); + } + if (errorTitle !== '') { + _title = errorTitle; + } + return _title; + }, [showSignRequest, showWalletImporter, t, errorTitle]); + return showPopover ? ( + + {showWalletImporter && ( + + )} + {showSignRequest && ( + + )} + + ) : null; +}; + +export default QRHardwarePopover; diff --git a/ui/components/app/qr-hardware-popover/qr-hardware-sign-request/index.js b/ui/components/app/qr-hardware-popover/qr-hardware-sign-request/index.js new file mode 100644 index 000000000..9a59357a1 --- /dev/null +++ b/ui/components/app/qr-hardware-popover/qr-hardware-sign-request/index.js @@ -0,0 +1,3 @@ +import QRHardwareSignRequest from './qr-hardware-sign-request.component'; + +export default QRHardwareSignRequest; diff --git a/ui/components/app/qr-hardware-popover/qr-hardware-sign-request/player.js b/ui/components/app/qr-hardware-popover/qr-hardware-sign-request/player.js new file mode 100644 index 000000000..c79dec547 --- /dev/null +++ b/ui/components/app/qr-hardware-popover/qr-hardware-sign-request/player.js @@ -0,0 +1,71 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import QRCode from 'qrcode.react'; +import { UR, UREncoder } from '@ngraveio/bc-ur'; +import PropTypes from 'prop-types'; +import Typography from '../../../ui/typography'; +import Box from '../../../ui/box'; +import { useI18nContext } from '../../../../hooks/useI18nContext'; +import { + ALIGN_ITEMS, + DISPLAY, + FLEX_DIRECTION, + TEXT_ALIGN, +} from '../../../../helpers/constants/design-system'; +import { PageContainerFooter } from '../../../ui/page-container'; + +const Player = ({ type, cbor, cancelQRHardwareSignRequest, toRead }) => { + const t = useI18nContext(); + const urEncoder = useMemo( + () => new UREncoder(new UR(Buffer.from(cbor, 'hex'), type), 400), + [cbor, type], + ); + const [currentQRCode, setCurrentQRCode] = useState(urEncoder.nextPart()); + useEffect(() => { + const id = setInterval(() => { + setCurrentQRCode(urEncoder.nextPart()); + }, 100); + return () => { + clearInterval(id); + }; + }, [urEncoder]); + + return ( + <> + + + {t('QRHardwareSignRequestSubtitle')} + + + + + + + + {t('QRHardwareSignRequestDescription')} + + + + + ); +}; + +Player.propTypes = { + type: PropTypes.string.isRequired, + cbor: PropTypes.string.isRequired, + cancelQRHardwareSignRequest: PropTypes.func.isRequired, + toRead: PropTypes.func.isRequired, +}; + +export default Player; diff --git a/ui/components/app/qr-hardware-popover/qr-hardware-sign-request/qr-hardware-sign-request.component.js b/ui/components/app/qr-hardware-popover/qr-hardware-sign-request/qr-hardware-sign-request.component.js new file mode 100644 index 000000000..efbc40729 --- /dev/null +++ b/ui/components/app/qr-hardware-popover/qr-hardware-sign-request/qr-hardware-sign-request.component.js @@ -0,0 +1,45 @@ +import React, { useCallback, useState } from 'react'; +import PropTypes from 'prop-types'; +import { submitQRHardwareSignature } from '../../../../store/actions'; +import Player from './player'; +import Reader from './reader'; + +const QRHardwareSignRequest = ({ request, handleCancel, setErrorTitle }) => { + const [status, setStatus] = useState('play'); + + const toRead = useCallback(() => setStatus('read'), []); + + const renderPlayer = () => { + const { payload } = request; + return ( + + ); + }; + + const renderReader = () => { + return ( + + ); + }; + + if (status === 'play') return renderPlayer(); + return renderReader(); +}; + +QRHardwareSignRequest.propTypes = { + request: PropTypes.object.isRequired, + handleCancel: PropTypes.func.isRequired, + setErrorTitle: PropTypes.func.isRequired, +}; + +export default QRHardwareSignRequest; diff --git a/ui/components/app/qr-hardware-popover/qr-hardware-sign-request/reader.js b/ui/components/app/qr-hardware-popover/qr-hardware-sign-request/reader.js new file mode 100644 index 000000000..2a5804a71 --- /dev/null +++ b/ui/components/app/qr-hardware-popover/qr-hardware-sign-request/reader.js @@ -0,0 +1,52 @@ +import React from 'react'; +import { ETHSignature } from '@keystonehq/bc-ur-registry-eth'; +import * as uuid from 'uuid'; +import PropTypes from 'prop-types'; +import BaseReader from '../base-reader'; +import { useI18nContext } from '../../../../hooks/useI18nContext'; + +const Reader = ({ + submitQRHardwareSignature, + cancelQRHardwareSignRequest, + requestId, + setErrorTitle, +}) => { + const t = useI18nContext(); + const cancel = () => { + cancelQRHardwareSignRequest(); + }; + + const handleSuccess = async (ur) => { + if (ur.type === 'eth-signature') { + const ethSignature = ETHSignature.fromCBOR(ur.cbor); + const buffer = ethSignature.getRequestId(); + const signId = uuid.stringify(buffer); + if (signId === requestId) { + return await submitQRHardwareSignature(signId, ur.cbor.toString('hex')); + } + setErrorTitle(t('QRHardwareInvalidTransactionTitle')); + throw new Error(t('QRHardwareMismatchedSignId')); + } else { + setErrorTitle(t('QRHardwareInvalidTransactionTitle')); + throw new Error(t('unknownQrCode')); + } + }; + + return ( + + ); +}; + +Reader.propTypes = { + submitQRHardwareSignature: PropTypes.func.isRequired, + cancelQRHardwareSignRequest: PropTypes.func.isRequired, + requestId: PropTypes.string.isRequired, + setErrorTitle: PropTypes.func.isRequired, +}; + +export default Reader; diff --git a/ui/components/app/qr-hardware-popover/qr-hardware-wallet-importer/index.js b/ui/components/app/qr-hardware-popover/qr-hardware-wallet-importer/index.js new file mode 100644 index 000000000..55c7b34e2 --- /dev/null +++ b/ui/components/app/qr-hardware-popover/qr-hardware-wallet-importer/index.js @@ -0,0 +1,3 @@ +import QRHardwareWalletImporter from './qr-hardware-wallet-importer.component'; + +export default QRHardwareWalletImporter; diff --git a/ui/components/app/qr-hardware-popover/qr-hardware-wallet-importer/qr-hardware-wallet-importer.component.js b/ui/components/app/qr-hardware-popover/qr-hardware-wallet-importer/qr-hardware-wallet-importer.component.js new file mode 100644 index 000000000..0c5a6355b --- /dev/null +++ b/ui/components/app/qr-hardware-popover/qr-hardware-wallet-importer/qr-hardware-wallet-importer.component.js @@ -0,0 +1,37 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { + submitQRHardwareCryptoAccount, + submitQRHardwareCryptoHDKey, +} from '../../../../store/actions'; +import BaseReader from '../base-reader'; +import { useI18nContext } from '../../../../hooks/useI18nContext'; + +const QRHardwareWalletImporter = ({ handleCancel, setErrorTitle }) => { + const t = useI18nContext(); + const handleSuccess = async (ur) => { + if (ur.type === 'crypto-hdkey') { + return await submitQRHardwareCryptoHDKey(ur.cbor.toString('hex')); + } else if (ur.type === 'crypto-account') { + return await submitQRHardwareCryptoAccount(ur.cbor.toString('hex')); + } + setErrorTitle(t('QRHardwareUnknownQRCodeTitle')); + throw new Error(t('unknownQrCode')); + }; + + return ( + + ); +}; + +QRHardwareWalletImporter.propTypes = { + handleCancel: PropTypes.func.isRequired, + setErrorTitle: PropTypes.func.isRequired, +}; + +export default QRHardwareWalletImporter; diff --git a/ui/pages/create-account/connect-hardware/index.js b/ui/pages/create-account/connect-hardware/index.js index 6b6c3bab5..f95243b67 100644 --- a/ui/pages/create-account/connect-hardware/index.js +++ b/ui/pages/create-account/connect-hardware/index.js @@ -11,7 +11,10 @@ import { import { formatBalance } from '../../../helpers/utils/util'; import { getMostRecentOverviewPage } from '../../../ducks/history/history'; import { SECOND } from '../../../../shared/constants/time'; -import { LEDGER_TRANSPORT_TYPES } from '../../../../shared/constants/hardware-wallets'; +import { + DEVICE_NAMES, + LEDGER_TRANSPORT_TYPES, +} from '../../../../shared/constants/hardware-wallets'; import SelectHardware from './select-hardware'; import AccountList from './account-list'; @@ -76,7 +79,11 @@ class ConnectHardwareForm extends Component { } async checkIfUnlocked() { - for (const device of ['trezor', 'ledger', 'lattice']) { + for (const device of [ + DEVICE_NAMES.TREZOR, + DEVICE_NAMES.LEDGER, + DEVICE_NAMES.LATTICE, + ]) { const path = this.props.defaultHdPaths[device]; const unlocked = await this.props.checkHardwareStatus(device, path); if (unlocked) { @@ -176,9 +183,22 @@ class ConnectHardwareForm extends Component { this.setState({ error: this.context.t('ledgerTimeout'), }); + } else if ( + errorMessage + .toLowerCase() + .includes( + 'KeystoneError#pubkey_account.no_expected_account'.toLowerCase(), + ) + ) { + this.setState({ + error: this.context.t('QRHardwarePubkeyAccountOutOfRange'), + }); } else if ( errorMessage !== 'Window closed' && - errorMessage !== 'Popup closed' + errorMessage !== 'Popup closed' && + errorMessage + .toLowerCase() + .includes('KeystoneError#sync_cancel'.toLowerCase()) === false ) { this.setState({ error: errorMessage, diff --git a/ui/pages/create-account/connect-hardware/index.scss b/ui/pages/create-account/connect-hardware/index.scss index b796812cf..977b4af96 100644 --- a/ui/pages/create-account/connect-hardware/index.scss +++ b/ui/pages/create-account/connect-hardware/index.scss @@ -52,6 +52,7 @@ justify-content: center; border-radius: 5px; padding: 0; + margin-right: 15px; &__img { width: 95px; @@ -64,7 +65,6 @@ } &__btn:first-child { - margin-right: 15px; margin-left: 20px; } diff --git a/ui/pages/create-account/connect-hardware/select-hardware.js b/ui/pages/create-account/connect-hardware/select-hardware.js index 3f7e6cbe8..375b33f23 100644 --- a/ui/pages/create-account/connect-hardware/select-hardware.js +++ b/ui/pages/create-account/connect-hardware/select-hardware.js @@ -2,7 +2,10 @@ import classnames from 'classnames'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; import Button from '../../../components/ui/button'; -import { LEDGER_TRANSPORT_TYPES } from '../../../../shared/constants/hardware-wallets'; +import { + DEVICE_NAMES, + LEDGER_TRANSPORT_TYPES, +} from '../../../../shared/constants/hardware-wallets'; export default class SelectHardware extends Component { static contextTypes = { @@ -30,9 +33,9 @@ export default class SelectHardware extends Component { return ( + ); + } + renderButtons() { return ( <> @@ -89,6 +109,7 @@ export default class SelectHardware extends Component { style={{ margin: '10px 0 0 0' }} > {this.renderConnectToLatticeButton()} + {this.renderConnectToQRButton()}
); @@ -149,12 +170,14 @@ export default class SelectHardware extends Component { renderTutorialsteps() { switch (this.state.selectedDevice) { - case 'ledger': + case DEVICE_NAMES.LEDGER: return this.renderLedgerTutorialSteps(); - case 'trezor': + case DEVICE_NAMES.TREZOR: return this.renderTrezorTutorialSteps(); - case 'lattice': + case DEVICE_NAMES.LATTICE: return this.renderLatticeTutorialSteps(); + case DEVICE_NAMES.QR: + return this.renderQRHardwareWalletSteps(); default: return ''; } @@ -296,6 +319,65 @@ export default class SelectHardware extends Component { ); } + renderQRHardwareWalletSteps() { + const steps = []; + steps.push( + { + title: this.context.t('QRHardwareWalletSteps1Title'), + message: this.context.t('QRHardwareWalletSteps1Description'), + }, + { + message: ( + <> + + {this.context.t('keystone')} + + + {this.context.t('keystoneTutorial')} + + + ), + }, + { + message: this.context.t('QRHardwareWalletSteps2Description'), + }, + { + asset: 'qrcode-wallet-demo', + dimensions: { width: '225px', height: '75px' }, + }, + ); + return ( +
+ {steps.map((step, index) => ( +
+ {step.title &&

{step.title}

} +

{step.message}

+ {step.asset && ( + + )} +
+ ))} +
+ ); + } + renderConnectScreen() { return (
diff --git a/ui/pages/home/home.component.js b/ui/pages/home/home.component.js index ba99b1035..dc0f9b74b 100644 --- a/ui/pages/home/home.component.js +++ b/ui/pages/home/home.component.js @@ -91,6 +91,7 @@ export default class Home extends PureComponent { seedPhraseBackedUp: PropTypes.bool.isRequired, newNetworkAdded: PropTypes.string, setNewNetworkAdded: PropTypes.func.isRequired, + isSigningQRHardwareTransaction: PropTypes.bool.isRequired, }; state = { @@ -99,7 +100,7 @@ export default class Home extends PureComponent { canShowBlockageNotification: true, }; - componentDidMount() { + checkStatusAndNavigate() { const { firstPermissionsRequestId, history, @@ -111,11 +112,13 @@ export default class Home extends PureComponent { showAwaitingSwapScreen, swapsFetchParams, pendingConfirmations, + isSigningQRHardwareTransaction, } = this.props; - - // eslint-disable-next-line react/no-unused-state - this.setState({ mounted: true }); - if (isNotification && totalUnapprovedCount === 0) { + if ( + isNotification && + totalUnapprovedCount === 0 && + !isSigningQRHardwareTransaction + ) { global.platform.closeCurrentWindow(); } else if (!isNotification && showAwaitingSwapScreen) { history.push(AWAITING_SWAP_ROUTE); @@ -134,6 +137,12 @@ export default class Home extends PureComponent { } } + componentDidMount() { + // eslint-disable-next-line react/no-unused-state + this.setState({ mounted: true }); + this.checkStatusAndNavigate(); + } + static getDerivedStateFromProps( { firstPermissionsRequestId, @@ -144,11 +153,16 @@ export default class Home extends PureComponent { haveSwapsQuotes, showAwaitingSwapScreen, swapsFetchParams, + isSigningQRHardwareTransaction, }, { mounted }, ) { if (!mounted) { - if (isNotification && totalUnapprovedCount === 0) { + if ( + isNotification && + totalUnapprovedCount === 0 && + !isSigningQRHardwareTransaction + ) { return { closing: true }; } else if ( firstPermissionsRequestId || @@ -169,12 +183,15 @@ export default class Home extends PureComponent { showRestorePrompt, threeBoxLastUpdated, threeBoxSynced, + isNotification, } = this.props; if (!prevState.closing && this.state.closing) { global.platform.closeCurrentWindow(); } + isNotification && this.checkStatusAndNavigate(); + if (threeBoxSynced && showRestorePrompt && threeBoxLastUpdated === null) { setupThreeBox(); } diff --git a/ui/pages/home/home.container.js b/ui/pages/home/home.container.js index 7fad95d83..7eb03edd9 100644 --- a/ui/pages/home/home.container.js +++ b/ui/pages/home/home.container.js @@ -16,6 +16,8 @@ import { getSortedNotificationsToShow, getShowRecoveryPhraseReminder, getNewNetworkAdded, + hasUnsignedQRHardwareTransaction, + hasUnsignedQRHardwareMessage, } from '../../selectors'; import { @@ -83,6 +85,10 @@ const mapStateToProps = (state) => { getWeb3ShimUsageStateForOrigin(state, originOfCurrentTab) === WEB3_SHIM_USAGE_ALERT_STATES.RECORDED; + const isSigningQRHardwareTransaction = + hasUnsignedQRHardwareTransaction(state) || + hasUnsignedQRHardwareMessage(state); + return { forgottenPassword, suggestedAssets, @@ -115,6 +121,7 @@ const mapStateToProps = (state) => { showRecoveryPhraseReminder: getShowRecoveryPhraseReminder(state), seedPhraseBackedUp, newNetworkAdded: getNewNetworkAdded(state), + isSigningQRHardwareTransaction, }; }; diff --git a/ui/pages/routes/routes.component.js b/ui/pages/routes/routes.component.js index 8e4ca834f..7e205f654 100644 --- a/ui/pages/routes/routes.component.js +++ b/ui/pages/routes/routes.component.js @@ -66,6 +66,7 @@ import { import { getEnvironmentType } from '../../../app/scripts/lib/util'; import ConfirmationPage from '../confirmation'; import OnboardingFlow from '../onboarding-flow/onboarding-flow'; +import QRHardwarePopover from '../../components/app/qr-hardware-popover'; export default class Routes extends Component { static propTypes = { @@ -321,6 +322,7 @@ export default class Routes extends Component { } }} > + {!this.hideAppHeader() && ( diff --git a/ui/selectors/selectors.js b/ui/selectors/selectors.js index cc8283262..200aff842 100644 --- a/ui/selectors/selectors.js +++ b/ui/selectors/selectors.js @@ -49,6 +49,7 @@ import { getLedgerWebHidConnectedStatus, getLedgerTransportStatus, } from '../ducks/app/app'; +import { MESSAGE_TYPE } from '../../shared/constants/app'; /** * One of the only remaining valid uses of selecting the network subkey of the @@ -82,6 +83,48 @@ export function getCurrentChainId(state) { return chainId; } +export function getCurrentQRHardwareState(state) { + const { qrHardware } = state.metamask; + return qrHardware || {}; +} + +export function hasUnsignedQRHardwareTransaction(state) { + const { txParams } = state.confirmTransaction.txData; + if (!txParams) return false; + const { from } = txParams; + const { keyrings } = state.metamask; + const qrKeyring = keyrings.find((kr) => kr.type === KEYRING_TYPES.QR); + if (!qrKeyring) return false; + return Boolean( + qrKeyring.accounts.find( + (account) => account.toLowerCase() === from.toLowerCase(), + ), + ); +} + +export function hasUnsignedQRHardwareMessage(state) { + const { type, msgParams } = state.confirmTransaction.txData; + if (!type || !msgParams) { + return false; + } + const { from } = msgParams; + const { keyrings } = state.metamask; + const qrKeyring = keyrings.find((kr) => kr.type === KEYRING_TYPES.QR); + if (!qrKeyring) return false; + switch (type) { + case MESSAGE_TYPE.ETH_SIGN_TYPED_DATA: + case MESSAGE_TYPE.ETH_SIGN: + case MESSAGE_TYPE.PERSONAL_SIGN: + return Boolean( + qrKeyring.accounts.find( + (account) => account.toLowerCase() === from.toLowerCase(), + ), + ); + default: + return false; + } +} + export function getCurrentKeyring(state) { const identity = getSelectedIdentity(state); diff --git a/ui/store/actions.js b/ui/store/actions.js index 1e43ac103..d9f8f7931 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -29,6 +29,7 @@ import { switchedToUnconnectedAccount } from '../ducks/alerts/unconnected-accoun import { getUnconnectedAccountAlertEnabledness } from '../ducks/metamask/metamask'; import { toChecksumHexAddress } from '../../shared/modules/hexstring-utils'; import { + DEVICE_NAMES, LEDGER_TRANSPORT_TYPES, LEDGER_USB_VENDOR_ID, } from '../../shared/constants/hardware-wallets'; @@ -414,7 +415,7 @@ export function connectHardware(deviceName, page, hdPath, t) { await promisifiedBackground.establishLedgerTransportPreference(); } if ( - deviceName === 'ledger' && + deviceName === DEVICE_NAMES.LEDGER && ledgerTransportType === LEDGER_TRANSPORT_TYPES.WEBHID ) { const connectedDevices = await window.navigator.hid.requestDevice({ @@ -443,7 +444,8 @@ export function connectHardware(deviceName, page, hdPath, t) { dispatch(displayWarning(t('ledgerDeviceOpenFailureMessage'))); throw new Error(t('ledgerDeviceOpenFailureMessage')); } else { - dispatch(displayWarning(error.message)); + if (deviceName !== DEVICE_NAMES.QR) + dispatch(displayWarning(error.message)); throw error; } } finally { @@ -2989,3 +2991,30 @@ export async function detectNewTokens() { export function hideTestNetMessage() { return promisifiedBackground.setShowTestnetMessageInDropdown(false); } + +// QR Hardware Wallets +export async function submitQRHardwareCryptoHDKey(cbor) { + await promisifiedBackground.submitQRHardwareCryptoHDKey(cbor); +} + +export async function submitQRHardwareCryptoAccount(cbor) { + await promisifiedBackground.submitQRHardwareCryptoAccount(cbor); +} + +export function cancelSyncQRHardware() { + return async (dispatch) => { + dispatch(hideLoadingIndication()); + await promisifiedBackground.cancelSyncQRHardware(); + }; +} + +export async function submitQRHardwareSignature(requestId, cbor) { + await promisifiedBackground.submitQRHardwareSignature(requestId, cbor); +} + +export function cancelQRHardwareSignRequest() { + return async (dispatch) => { + dispatch(hideLoadingIndication()); + await promisifiedBackground.cancelQRHardwareSignRequest(); + }; +} diff --git a/yarn.lock b/yarn.lock index 91c307eb1..737fb8b61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -62,6 +62,11 @@ resolved "https://registry.yarnpkg.com/@agoric/transform-module/-/transform-module-0.4.1.tgz#9fb152364faf372e1bda535cb4ef89717724f57c" integrity sha512-4TJJHXeXAWu1FCA7yXCAZmhBNoGTB/BEAe2pv+J2X8W/mJTr9b395OkDCSRMpzvmSshLfBx6wT0D7dqWIWEC1w== +"@apocentre/alias-sampling@^0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@apocentre/alias-sampling/-/alias-sampling-0.5.3.tgz#897ff181b48ad7b2bcb4ecf29400214888244f08" + integrity sha512-7UDWIIF9hIeJqfKXkNIzkVandlwLf1FWTSdrb9iXvOP8oF544JRXQjCbiTmCv2c9n44n/FIWtehhBfNuAx2CZA== + "@babel/code-frame@7.10.4", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" @@ -2423,7 +2428,7 @@ ethers "^5.4.5" lodash "^4.17.21" -"@ethereumjs/common@^2.3.1", "@ethereumjs/common@^2.4.0": +"@ethereumjs/common@^2.0.0", "@ethereumjs/common@^2.3.1", "@ethereumjs/common@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.4.0.tgz#2d67f6e6ba22246c5c89104e6b9a119fb3039766" integrity sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w== @@ -2431,6 +2436,14 @@ crc-32 "^1.2.0" ethereumjs-util "^7.1.0" +"@ethereumjs/tx@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.0.0.tgz#8dfd91ed6e91e63996e37b3ddc340821ebd48c81" + integrity sha512-H9tfy6qgYxPXvt1TSObfVmVjlF43OoQqoPQ3PJsG2JiuqaMHj5ettV1pGFEC3FamENDBkl6vD6niQEvIlXv/VQ== + dependencies: + "@ethereumjs/common" "^2.0.0" + ethereumjs-util "^7.0.7" + "@ethereumjs/tx@^3.1.1", "@ethereumjs/tx@^3.1.4", "@ethereumjs/tx@^3.2.0", "@ethereumjs/tx@^3.2.1", "@ethereumjs/tx@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.0.tgz#14ed1b7fa0f28e1cd61e3ecbdab824205f6a4378" @@ -3943,6 +3956,58 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@keystonehq/base-eth-keyring@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@keystonehq/base-eth-keyring/-/base-eth-keyring-0.3.1.tgz#c985803f7083f0a2e6ea55846905099c46573142" + integrity sha512-lbVLCMD3R4Ki8CThctZOjafKvJn0p2u19csuMrJHBlFllqu88vYoyfv3I/BPtOpnWqeC90Kta23w68FFUnV8Zg== + dependencies: + "@ethereumjs/tx" "3.0.0" + "@keystonehq/bc-ur-registry-eth" "^0.7.5" + ethereumjs-util "^7.0.8" + hdkey "^2.0.1" + uuid "^8.3.2" + +"@keystonehq/bc-ur-registry-eth@^0.6.8": + version "0.6.13" + resolved "https://registry.yarnpkg.com/@keystonehq/bc-ur-registry-eth/-/bc-ur-registry-eth-0.6.13.tgz#c1680930b1d3fed14857336bd4fb47a484dfac32" + integrity sha512-sQQMMiKlacxMOIGeH8l/m/j3sL2VaM7Zid/xvf6cogZ5EZ5pa8Jow8cgY/t7krTOOBp81/GglCbwCGC8RIOLqA== + dependencies: + "@keystonehq/bc-ur-registry" "^0.4.4" + ethereumjs-util "^7.0.8" + hdkey "^2.0.1" + uuid "^8.3.2" + +"@keystonehq/bc-ur-registry-eth@^0.7.5": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@keystonehq/bc-ur-registry-eth/-/bc-ur-registry-eth-0.7.5.tgz#30a146e2b6ba01f73380530bbb6bd6a62d540a8b" + integrity sha512-9WcIe4WcqJxf/HKxKhnOBgEfre8/BB5Zi68iHFdw/pyfdYBfzU/nAn2/NB/ggqIHNGWO4zsRnBk85vbJ3QwQsQ== + dependencies: + "@keystonehq/bc-ur-registry" "^0.4.4" + ethereumjs-util "^7.0.8" + hdkey "^2.0.1" + uuid "^8.3.2" + +"@keystonehq/bc-ur-registry@^0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@keystonehq/bc-ur-registry/-/bc-ur-registry-0.4.4.tgz#3073fdd4b33cdcbd04526a313a7685891a4b4583" + integrity sha512-SBdKdAZfp3y14GTGrKjfJJHf4iXObjcm4/qKUZ92lj8HVR8mxHHGmHksjE328bJPTAsJPloLix4rTnWg+qgS2w== + dependencies: + "@ngraveio/bc-ur" "^1.1.5" + base58check "^2.0.0" + tslib "^2.3.0" + +"@keystonehq/metamask-airgapped-keyring@0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@keystonehq/metamask-airgapped-keyring/-/metamask-airgapped-keyring-0.2.1.tgz#d6a8dd75d97cf7911faa8c2a8b19a0168b74891e" + integrity sha512-LTBGLR8KaJycZLG9igOoIi1tdM2CDN07+dXVGHYnls6DWDN8v3DPzOeAuu1+7H+NDIZYUhGmaa1RcbBT3lY+Uw== + dependencies: + "@ethereumjs/tx" "^3.3.0" + "@keystonehq/base-eth-keyring" "^0.3.1" + "@keystonehq/bc-ur-registry-eth" "^0.7.5" + "@metamask/obs-store" "^7.0.0" + rlp "^2.2.6" + uuid "^8.3.2" + "@lavamoat/allow-scripts@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@lavamoat/allow-scripts/-/allow-scripts-1.0.6.tgz#fbdf7c35a5c2c2cff05ba002b7bc8f3355bda22c" @@ -4341,6 +4406,14 @@ readable-stream "^2.2.2" through2 "^2.0.3" +"@metamask/obs-store@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@metamask/obs-store/-/obs-store-7.0.0.tgz#6cae5f28306bb3e83a381bc9ae22682316095bd3" + integrity sha512-Tr61Uu9CGXkCg5CZwOYRMQERd+y6fbtrtLd/PzDTPHO5UJpmSbU+7MPcQK7d1DwZCOCeCIvhmZSUCvYliC8uGw== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + through2 "^2.0.3" + "@metamask/post-message-stream@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@metamask/post-message-stream/-/post-message-stream-4.0.0.tgz#72f120e562346ca86ccc9b3684023ad44265f0df" @@ -4389,6 +4462,19 @@ resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== +"@ngraveio/bc-ur@^1.1.5", "@ngraveio/bc-ur@^1.1.6": + version "1.1.6" + resolved "https://registry.yarnpkg.com/@ngraveio/bc-ur/-/bc-ur-1.1.6.tgz#8f8c75fff22f6a5e4dfbc5a6b540d7fe8f42cd39" + integrity sha512-G+2XgjXde2IOcEQeCwR250aS43/Swi7gw0FuETgJy2c3HqF8f88SXDMsIGgJlZ8jXd0GeHR4aX0MfjXf523UZg== + dependencies: + "@apocentre/alias-sampling" "^0.5.3" + assert "^2.0.0" + bignumber.js "^9.0.1" + cbor-sync "^1.0.4" + crc "^3.8.0" + jsbi "^3.1.5" + sha.js "^2.4.11" + "@nodelib/fs.scandir@2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" @@ -6303,7 +6389,14 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -"@zxing/library@^0.8.0": +"@zxing/browser@^0.0.10": + version "0.0.10" + resolved "https://registry.yarnpkg.com/@zxing/browser/-/browser-0.0.10.tgz#63c0a762fc2fd4ee946a20953ef24fab225698a9" + integrity sha512-P2wQc5fs+cjSc39zFS4UDhejWqdikf4FjuWIlFrzXD8fOsZ4ASfmLDKGeg7mRgmJq11oMKcVXvFFI6kcIKtxuQ== + optionalDependencies: + "@zxing/text-encoding" "^0.9.0" + +"@zxing/library@0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@zxing/library/-/library-0.8.0.tgz#accd9f3cd5c06fa40a95c2c1f61398c41548a9e3" integrity sha512-D7oopukr7cJ0Va01Er2zXiSPXvmvc6D1PpOq/THRvd/57yEsBs+setRsiDo7tSRnYHcw7FrRZSZ7rwyzNSLJeA== @@ -6312,7 +6405,7 @@ optionalDependencies: text-encoding "^0.6.4" -"@zxing/text-encoding@0.9.0": +"@zxing/text-encoding@0.9.0", "@zxing/text-encoding@^0.9.0": version "0.9.0" resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== @@ -7268,6 +7361,16 @@ assert@^1.1.1, assert@^1.4.0, assert@^1.4.1: object-assign "^4.1.1" util "0.10.3" +assert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + dependencies: + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" + assertion-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" @@ -8265,6 +8368,11 @@ base-x@3.0.8, base-x@^3.0.2, base-x@^3.0.8: dependencies: safe-buffer "^5.0.1" +base-x@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-1.1.0.tgz#42d3d717474f9ea02207f6d1aa1f426913eeb7ac" + integrity sha1-QtPXF0dPnqAiB/bRqh9CaRPut6w= + base32-encode@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/base32-encode/-/base32-encode-1.1.1.tgz#d022d86aca0002a751bbe1bf20eb4a9b1cef4e95" @@ -8282,6 +8390,13 @@ base32.js@~0.1.0: resolved "https://registry.yarnpkg.com/base32.js/-/base32.js-0.1.0.tgz#b582dec693c2f11e893cf064ee6ac5b6131a2202" integrity sha1-tYLexpPC8R6JPPBk7mrFthMaIgI= +base58check@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base58check/-/base58check-2.0.0.tgz#8046652d14bc87f063bd16be94a39134d3b61173" + integrity sha1-gEZlLRS8h/BjvRa+lKORNNO2EXM= + dependencies: + bs58 "^3.0.0" + base64-arraybuffer@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" @@ -9055,6 +9170,13 @@ bs58@^2.0.1: resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.1.tgz#55908d58f1982aba2008fa1bed8f91998a29bf8d" integrity sha1-VZCNWPGYKrogCPob7Y+RmYopv40= +bs58@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-3.1.0.tgz#d4c26388bf4804cac714141b1945aa47e5eb248e" + integrity sha1-1MJjiL9IBMrHFBQbGUWqR+XrJI4= + dependencies: + base-x "^1.1.0" + bs58check@2.1.2, bs58check@<3.0.0, bs58check@^2.0.0, bs58check@^2.1.1, bs58check@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" @@ -9154,7 +9276,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.0.5, buffer@^5.2.1, buffer@^5.4.2, buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.0.5, buffer@^5.1.0, buffer@^5.2.1, buffer@^5.4.2, buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -10548,6 +10670,13 @@ crc-32@^1.2.0: exit-on-epipe "~1.0.1" printj "~1.1.0" +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + crdts@~0.1.2: version "0.1.5" resolved "https://registry.yarnpkg.com/crdts/-/crdts-0.1.5.tgz#89413e8adfc3ab943300a890ee6392db5ba60c06" @@ -12346,6 +12475,11 @@ es6-map@^0.1.3, es6-map@^0.1.5: es6-symbol "~3.1.1" event-emitter "~0.3.5" +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= + es6-promise@^4.2.8: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -13327,7 +13461,7 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum safe-buffer "^5.1.1" secp256k1 "^3.0.1" -ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.9, ethereumjs-util@^7.1.0: +ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.7, ethereumjs-util@^7.0.8, ethereumjs-util@^7.0.9, ethereumjs-util@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.0.tgz#e2b43a30bfcdbcb432a4eb42bd5f2393209b3fd5" integrity sha512-kR+vhu++mUDARrsMMhsjjzPduRVAeundLGXucGRHF3B4oEltOUspfgCVco4kckucj3FMlLaZHUl9n7/kdmr6Tw== @@ -16146,6 +16280,15 @@ hdkey@0.8.0: safe-buffer "^5.1.1" secp256k1 "^3.0.1" +hdkey@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-2.0.1.tgz#0a211d0c510bfc44fa3ec9d44b13b634641cad74" + integrity sha512-c+tl9PHG9/XkGgG0tD7CJpRVaE0jfZizDNmnErUAKQ4EjQSOcOUcV3EN9ZEZS8pZ4usaeiiK0H7stzuzna8feA== + dependencies: + bs58check "^2.1.2" + safe-buffer "^5.1.1" + secp256k1 "^4.0.0" + he@1.2.0, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -17746,6 +17889,14 @@ is-my-json-valid@^2.10.0: jsonpointer "^4.0.0" xtend "^4.0.0" +is-nan@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + is-negated-glob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" @@ -18731,6 +18882,11 @@ jsan@^3.1.13: resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.13.tgz#4de8c7bf8d1cfcd020c313d438f930cec4b91d86" integrity sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g== +jsbi@^3.1.5: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.2.0.tgz#3500a08fb3e8e56cf0439964fc774a8762b151ed" + integrity sha512-nL7F2gCfPTXLRoS1ZABhzyYCib6L4bAjX9F6qutL4L2o0r+gDndWVlQ7A6bMa80RTN53R82hXTm6FRsdRxbLgQ== + jsbn@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" @@ -24851,11 +25007,25 @@ pushdata-bitcoin@^1.0.1: dependencies: bitcoin-ops "^1.3.0" +qr.js@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/qr.js/-/qr.js-0.0.0.tgz#cace86386f59a0db8050fa90d9b6b0e88a1e364f" + integrity sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8= + qrcode-generator@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/qrcode-generator/-/qrcode-generator-1.4.1.tgz#bfb6760e05d12c39df8acd60a0d459bdb2fa0756" integrity sha512-KOdSAyFBPf0/5Z3mra4JfSbjrDlUn2J3YH8Rm33tRGbptxP4vhogLWysvkQp8mp5ix9u80Wfr4vxHXTeR9o0Ug== +qrcode.react@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/qrcode.react/-/qrcode.react-1.0.1.tgz#2834bb50e5e275ffe5af6906eff15391fe9e38a5" + integrity sha512-8d3Tackk8IRLXTo67Y+c1rpaiXjoz/Dd2HpcMdW//62/x8J1Nbho14Kh8x974t9prsLHN6XqVgcnRiBGFptQmg== + dependencies: + loose-envify "^1.4.0" + prop-types "^15.6.0" + qr.js "0.0.0" + qs@6.7.0, qs@^6.4.0, qs@^6.5.1, qs@^6.5.2: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" @@ -26859,7 +27029,7 @@ scss-parser@^1.0.4: dependencies: invariant "2.2.4" -secp256k1@4.0.2, secp256k1@^4.0.1: +secp256k1@4.0.2, secp256k1@^4.0.0, secp256k1@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== @@ -27096,7 +27266,7 @@ setprototypeof@1.1.1: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== -sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: +sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8, sha.js@~2.4.4: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== @@ -29161,9 +29331,9 @@ truncate-utf8-bytes@^1.0.0: utf8-byte-length "^1.0.1" ts-custom-error@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ts-custom-error/-/ts-custom-error-2.2.1.tgz#47086fbc34df5c7c2d4fba8c92d8767662066951" - integrity sha512-lHKZtU+PXkVuap6nlFZybIAFLUO8B3jbCs1VynBL8AUSAHfeG6HpztcBTDRp5I+fN5820N9kGg+eTIvr+le2yg== + version "2.2.2" + resolved "https://registry.yarnpkg.com/ts-custom-error/-/ts-custom-error-2.2.2.tgz#ee769cd6a9cf35dc2e9fedefbb3842f3a2fbceae" + integrity sha512-I0FEdfdatDjeigRqh1JFj67bcIKyRNm12UVGheBjs2pXgyELg2xeiQLVaWu1pVmNGXZVnz/fvycSU41moBIpOg== ts-dedent@^2.0.0: version "2.0.0" @@ -29905,7 +30075,7 @@ util@^0.11.0: dependencies: inherits "2.0.3" -util@^0.12.3, util@~0.12.0: +util@^0.12.0, util@^0.12.3, util@~0.12.0: version "0.12.4" resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== From 582882b3ed284d8b825750aff252dc883d623cff Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Tue, 23 Nov 2021 12:46:33 -0500 Subject: [PATCH 026/129] Adding the AdvancedGasFeePopover template (#12780) --- app/_locales/en/messages.json | 3 + .../advanced-gas-fee-popover.js | 35 +++++ .../app/advanced-gas-fee-popover/index.js | 1 + .../app/advanced-gas-fee-popover/index.scss | 8 ++ ui/components/app/app-components.scss | 3 +- .../confirm-page-container.component.js | 8 +- .../edit-gas-fee-popover.js | 39 ++---- .../edit-gas-fee-popover.test.js | 7 + .../edit-gas-item/edit-gas-item.js | 13 +- .../app/transaction-detail-item/index.scss | 2 +- .../transaction-detail.component.js | 8 +- ui/contexts/metametrics.js | 5 + ui/contexts/transaction-modal.js | 75 +++++++++++ ui/helpers/utils/metric.test.js | 13 ++ ui/helpers/utils/metrics.js | 10 ++ .../confirm-transaction-base.component.js | 127 +++++++++--------- ...confirm-transaction-base.component.test.js | 15 --- 17 files changed, 252 insertions(+), 120 deletions(-) create mode 100644 ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-popover.js create mode 100644 ui/components/app/advanced-gas-fee-popover/index.js create mode 100644 ui/components/app/advanced-gas-fee-popover/index.scss create mode 100644 ui/contexts/transaction-modal.js create mode 100644 ui/helpers/utils/metric.test.js create mode 100644 ui/helpers/utils/metrics.js delete mode 100644 ui/pages/confirm-transaction-base/confirm-transaction-base.component.test.js diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 2878872a9..08f6039bf 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -163,6 +163,9 @@ "advanced": { "message": "Advanced" }, + "advancedGasFeeModalTitle": { + "message": "Advanced gas fee" + }, "advancedGasPriceTitle": { "message": "Gas price" }, diff --git a/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-popover.js b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-popover.js new file mode 100644 index 000000000..41bfced9a --- /dev/null +++ b/ui/components/app/advanced-gas-fee-popover/advanced-gas-fee-popover.js @@ -0,0 +1,35 @@ +import React from 'react'; + +import { useI18nContext } from '../../../hooks/useI18nContext'; +import { useTransactionModalContext } from '../../../contexts/transaction-modal'; + +import Box from '../../ui/box'; +import Button from '../../ui/button'; +import I18nValue from '../../ui/i18n-value'; +import Popover from '../../ui/popover'; + +const AdvancedGasFeePopover = () => { + const t = useI18nContext(); + const { closeModal, currentModal } = useTransactionModalContext(); + + if (currentModal !== 'advancedGasFee') return null; + + // todo: align styles to edit gas fee modal + return ( + closeModal('advancedGasFee')} + onClose={() => closeModal('advancedGasFee')} + footer={ + + } + > + + + ); +}; + +export default AdvancedGasFeePopover; diff --git a/ui/components/app/advanced-gas-fee-popover/index.js b/ui/components/app/advanced-gas-fee-popover/index.js new file mode 100644 index 000000000..224b2237e --- /dev/null +++ b/ui/components/app/advanced-gas-fee-popover/index.js @@ -0,0 +1 @@ +export { default } from './advanced-gas-fee-popover'; diff --git a/ui/components/app/advanced-gas-fee-popover/index.scss b/ui/components/app/advanced-gas-fee-popover/index.scss new file mode 100644 index 000000000..1e4959be6 --- /dev/null +++ b/ui/components/app/advanced-gas-fee-popover/index.scss @@ -0,0 +1,8 @@ +.advanced-gas-fee-popover { + .popover-header { + border-radius: 0; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + border-bottom: 1px solid $Grey-200; + } +} diff --git a/ui/components/app/app-components.scss b/ui/components/app/app-components.scss index e5e245d87..da57af878 100644 --- a/ui/components/app/app-components.scss +++ b/ui/components/app/app-components.scss @@ -50,4 +50,5 @@ @import 'transaction-total-banner/index'; @import 'wallet-overview/index'; @import 'whats-new-popup/index'; -@import 'loading-network-screen/index' +@import 'loading-network-screen/index'; +@import 'advanced-gas-fee-popover/index'; diff --git a/ui/components/app/confirm-page-container/confirm-page-container.component.js b/ui/components/app/confirm-page-container/confirm-page-container.component.js index 33c07d56a..90e755b1d 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container.component.js @@ -8,7 +8,8 @@ import { GasFeeContextProvider } from '../../../contexts/gasFee'; import ErrorMessage from '../../ui/error-message'; import { TRANSACTION_TYPES } from '../../../../shared/constants/transaction'; import Dialog from '../../ui/dialog'; -import EditGasFeePopover from '../edit-gas-fee-popover/edit-gas-fee-popover'; +import AdvancedGasFeePopover from '../advanced-gas-fee-popover'; +import EditGasFeePopover from '../edit-gas-fee-popover'; import { ConfirmPageContainerHeader, ConfirmPageContainerContent, @@ -236,9 +237,8 @@ export default class ConfirmPageContainer extends Component { transaction={currentTransaction} /> )} - {editingGas && EIP_1559_V2 && ( - - )} + +
); diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js index abfdbca98..e738e7a8e 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js @@ -1,8 +1,9 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { PRIORITY_LEVELS } from '../../../../shared/constants/gas'; import { useI18nContext } from '../../../hooks/useI18nContext'; +import { useTransactionModalContext } from '../../../contexts/transaction-modal'; + import I18nValue from '../../ui/i18n-value'; import LoadingHeartBeat from '../../ui/loading-heartbeat'; import Popover from '../../ui/popover'; @@ -12,13 +13,16 @@ import { COLORS } from '../../../helpers/constants/design-system'; import EditGasItem from './edit-gas-item'; import NetworkStatus from './network-status'; -const EditGasFeePopover = ({ onClose }) => { +const EditGasFeePopover = () => { const t = useI18nContext(); + const { closeModal, currentModal } = useTransactionModalContext(); + + if (currentModal !== 'editGasFee') return null; return ( closeModal('editGasFee')} className="edit-gas-fee-popover" > <> @@ -36,27 +40,12 @@ const EditGasFeePopover = ({ onClose }) => {
- - - + + +
- - + + { ); }; -EditGasFeePopover.propTypes = { - onClose: PropTypes.func, -}; - export default EditGasFeePopover; diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js index 2131e0205..de48fd0be 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js @@ -16,6 +16,13 @@ jest.mock('../../../store/actions', () => ({ addPollingTokenToAppState: jest.fn(), })); +jest.mock('../../../contexts/transaction-modal', () => ({ + useTransactionModalContext: () => ({ + closeModal: () => undefined, + currentModal: 'editGasFee', + }), +})); + const MOCK_FEE_ESTIMATE = { low: { minWaitTimeEstimate: 360000, diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js index 9fe5d5889..bdef6d77d 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js @@ -16,13 +16,14 @@ import { getAdvancedGasFeeValues } from '../../../../selectors'; import { toHumanReadableTime } from '../../../../helpers/utils/util'; import { useGasFeeContext } from '../../../../contexts/gasFee'; import { useI18nContext } from '../../../../hooks/useI18nContext'; +import { useTransactionModalContext } from '../../../../contexts/transaction-modal'; import I18nValue from '../../../ui/i18n-value'; import InfoTooltip from '../../../ui/info-tooltip'; import UserPreferencedCurrencyDisplay from '../../user-preferenced-currency-display'; import { useCustomTimeEstimate } from './useCustomTimeEstimate'; -const EditGasItem = ({ priorityLevel, onClose }) => { +const EditGasItem = ({ priorityLevel }) => { const { estimateUsed, gasFeeEstimates, @@ -34,6 +35,8 @@ const EditGasItem = ({ priorityLevel, onClose }) => { } = useGasFeeContext(); const t = useI18nContext(); const advancedGasFeeValues = useSelector(getAdvancedGasFeeValues); + const { closeModal, openModal } = useTransactionModalContext(); + let maxFeePerGas; let maxPriorityFeePerGas; let minWaitTime; @@ -83,11 +86,12 @@ const EditGasItem = ({ priorityLevel, onClose }) => { : null; const onOptionSelect = () => { - if (priorityLevel !== PRIORITY_LEVELS.CUSTOM) { + if (priorityLevel === PRIORITY_LEVELS.CUSTOM) { + openModal('advancedGasFee'); + } else { updateTransactionUsingGasFeeEstimates(priorityLevel); + closeModal('editGasFee'); } - // todo: open advance modal if priorityLevel is custom - onClose(); }; return ( @@ -144,7 +148,6 @@ const EditGasItem = ({ priorityLevel, onClose }) => { EditGasItem.propTypes = { priorityLevel: PropTypes.string, - onClose: PropTypes.func, }; export default EditGasItem; diff --git a/ui/components/app/transaction-detail-item/index.scss b/ui/components/app/transaction-detail-item/index.scss index 45c6e4f9b..5732e92c5 100644 --- a/ui/components/app/transaction-detail-item/index.scss +++ b/ui/components/app/transaction-detail-item/index.scss @@ -13,7 +13,7 @@ display: flex; flex-wrap: wrap; justify-content: end; - width: 65%; + width: 55%; } .info-tooltip { diff --git a/ui/components/app/transaction-detail/transaction-detail.component.js b/ui/components/app/transaction-detail/transaction-detail.component.js index 2f000e59e..815861228 100644 --- a/ui/components/app/transaction-detail/transaction-detail.component.js +++ b/ui/components/app/transaction-detail/transaction-detail.component.js @@ -2,6 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { useGasFeeContext } from '../../../contexts/gasFee'; +import { useTransactionModalContext } from '../../../contexts/transaction-modal'; import InfoTooltip from '../../ui/info-tooltip/info-tooltip'; import Typography from '../../ui/typography/typography'; @@ -22,12 +23,13 @@ export default function TransactionDetail({ rows = [], onEdit }) { maxPriorityFeePerGas, transaction, } = useGasFeeContext(); + const { openModal } = useTransactionModalContext(); if (EIP_1559_V2 && estimateUsed) { return (
- {estimateUsed === 'custom' && onEdit && ( - + )} {estimateUsed === 'dappSuggested' && ( { + const [openModals, setOpenModals] = useState([]); + const metricsEvent = useMetaMetricsContext(); + const { transaction: { origin } = {} } = useGasFeeContext(); + + const captureEvent = () => { + metricsEvent({ + eventOpts: { + category: 'Transactions', + action: 'Confirm Screen', + name: 'User clicks "Edit" on gas', + }, + customVariables: { + recipientKnown: null, + functionType: + actionKey || + getMethodName(methodData.name) || + TRANSACTION_TYPES.CONTRACT_INTERACTION, + origin, + }, + }); + }; + + const closeModal = (modalName) => { + const index = openModals.indexOf(modalName); + if (openModals < 0) return; + const modals = [...openModals]; + modals.splice(index, 1); + setOpenModals(modals); + }; + + const openModal = (modalName) => { + if (openModals.includes(modalName)) return; + captureEvent(); + const modals = [...openModals]; + modals.push(modalName); + setOpenModals(modals); + }; + + return ( + + {children} + + ); +}; + +export function useTransactionModalContext() { + return useContext(TransactionModalContext); +} + +TransactionModalContextProvider.propTypes = { + actionKey: PropTypes.string, + children: PropTypes.node.isRequired, + methodData: PropTypes.object, +}; diff --git a/ui/helpers/utils/metric.test.js b/ui/helpers/utils/metric.test.js new file mode 100644 index 000000000..b3a4981d5 --- /dev/null +++ b/ui/helpers/utils/metric.test.js @@ -0,0 +1,13 @@ +import { getMethodName } from './metrics'; + +describe('getMethodName', () => { + it('should get correct method names', () => { + expect(getMethodName(undefined)).toStrictEqual(''); + expect(getMethodName({})).toStrictEqual(''); + expect(getMethodName('confirm')).toStrictEqual('confirm'); + expect(getMethodName('balanceOf')).toStrictEqual('balance Of'); + expect(getMethodName('ethToTokenSwapInput')).toStrictEqual( + 'eth To Token Swap Input', + ); + }); +}); diff --git a/ui/helpers/utils/metrics.js b/ui/helpers/utils/metrics.js new file mode 100644 index 000000000..c085545f2 --- /dev/null +++ b/ui/helpers/utils/metrics.js @@ -0,0 +1,10 @@ +export function getMethodName(camelCase) { + if (!camelCase || typeof camelCase !== 'string') { + return ''; + } + + return camelCase + .replace(/([a-z])([A-Z])/gu, '$1 $2') + .replace(/([A-Z])([a-z])/gu, ' $1$2') + .replace(/ +/gu, ' '); +} diff --git a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js index 92d9d2cb3..62ff262b5 100644 --- a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js +++ b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js @@ -25,9 +25,11 @@ import { TRANSACTION_TYPES, TRANSACTION_STATUSES, } from '../../../shared/constants/transaction'; +import { getMethodName } from '../../helpers/utils/metrics'; import { getTransactionTypeTitle } from '../../helpers/utils/transactions.util'; import { toBuffer } from '../../../shared/modules/buffer-utils'; +import { TransactionModalContextProvider } from '../../contexts/transaction-modal'; import TransactionDetail from '../../components/app/transaction-detail/transaction-detail.component'; import TransactionDetailItem from '../../components/app/transaction-detail-item/transaction-detail-item.component'; import InfoTooltip from '../../components/ui/info-tooltip/info-tooltip'; @@ -913,6 +915,7 @@ export default class ConfirmTransactionBase extends Component { render() { const { t } = this.context; const { + actionKey, fromName, fromAddress, toName, @@ -976,71 +979,65 @@ export default class ConfirmTransactionBase extends Component { } } return ( - this.handleNextTx(txId)} - firstTx={firstTx} - lastTx={lastTx} - ofText={ofText} - requestsWaitingText={requestsWaitingText} - hideConfirmAnyways={!isDisabled()} - disabled={ - renderSimulationFailureWarning || - !valid || - submitting || - hardwareWalletRequiresConnection || - (gasIsLoading && !gasFeeIsCustom) - } - onEdit={() => this.handleEdit()} - onCancelAll={() => this.handleCancelAll()} - onCancel={() => this.handleCancel()} - onSubmit={() => this.handleSubmit()} - onConfirmAnyways={() => this.handleConfirmAnyways()} - hideSenderToRecipient={hideSenderToRecipient} - origin={txData.origin} - ethGasPriceWarning={ethGasPriceWarning} - editingGas={editingGas} - handleCloseEditGas={() => this.handleCloseEditGas()} - currentTransaction={txData} - /> + + this.handleNextTx(txId)} + firstTx={firstTx} + lastTx={lastTx} + ofText={ofText} + requestsWaitingText={requestsWaitingText} + hideConfirmAnyways={!isDisabled()} + disabled={ + renderSimulationFailureWarning || + !valid || + submitting || + hardwareWalletRequiresConnection || + (gasIsLoading && !gasFeeIsCustom) + } + onEdit={() => this.handleEdit()} + onCancelAll={() => this.handleCancelAll()} + onCancel={() => this.handleCancel()} + onSubmit={() => this.handleSubmit()} + onConfirmAnyways={() => this.handleConfirmAnyways()} + hideSenderToRecipient={hideSenderToRecipient} + origin={txData.origin} + ethGasPriceWarning={ethGasPriceWarning} + editingGas={editingGas} + handleCloseEditGas={() => this.handleCloseEditGas()} + currentTransaction={txData} + /> + ); } } - -export function getMethodName(camelCase) { - if (!camelCase || typeof camelCase !== 'string') { - return ''; - } - - return camelCase - .replace(/([a-z])([A-Z])/gu, '$1 $2') - .replace(/([A-Z])([a-z])/gu, ' $1$2') - .replace(/ +/gu, ' '); -} diff --git a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.test.js b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.test.js deleted file mode 100644 index b4d9caa37..000000000 --- a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.test.js +++ /dev/null @@ -1,15 +0,0 @@ -import { getMethodName } from './confirm-transaction-base.component'; - -describe('ConfirmTransactionBase Component', () => { - describe('getMethodName', () => { - it('should get correct method names', () => { - expect(getMethodName(undefined)).toStrictEqual(''); - expect(getMethodName({})).toStrictEqual(''); - expect(getMethodName('confirm')).toStrictEqual('confirm'); - expect(getMethodName('balanceOf')).toStrictEqual('balance Of'); - expect(getMethodName('ethToTokenSwapInput')).toStrictEqual( - 'eth To Token Swap Input', - ); - }); - }); -}); From f65063ac6ca41bc7ddef78ceda1f6751bc291d3b Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Tue, 23 Nov 2021 23:48:44 +0530 Subject: [PATCH 027/129] Eip1559 v2 12593 (#12719) --- app/_locales/en/messages.json | 12 +++ ...onfirm-page-container-content.component.js | 5 +- ...onfirm-page-container-summary.component.js | 5 +- .../edit-gas-fee-popover.js | 8 +- .../edit-gas-fee-popover.test.js | 24 +++-- .../edit-gas-item/edit-gas-item.js | 13 ++- .../edit-gas-item/edit-gas-item.test.js | 11 ++ .../edit-gas-item/index.scss | 2 + .../app/edit-gas-fee-popover/index.scss | 7 +- .../network-status/status-slider/index.scss | 2 +- .../confirm-transaction-base.component.js | 4 +- .../low-priority-message/index.js | 1 - .../low-priority-message.js | 24 ----- .../low-priority-message.scss | 3 - .../low-priority-message.test.js | 59 ---------- .../transaction-alerts/index.js | 1 + .../transaction-alerts/transaction-alerts.js | 73 +++++++++++++ .../transaction-alerts.scss | 17 +++ .../transaction-alerts.test.js | 101 ++++++++++++++++++ ui/pages/pages.scss | 2 +- 20 files changed, 269 insertions(+), 105 deletions(-) delete mode 100644 ui/pages/confirm-transaction-base/low-priority-message/index.js delete mode 100644 ui/pages/confirm-transaction-base/low-priority-message/low-priority-message.js delete mode 100644 ui/pages/confirm-transaction-base/low-priority-message/low-priority-message.scss delete mode 100644 ui/pages/confirm-transaction-base/low-priority-message/low-priority-message.test.js create mode 100644 ui/pages/confirm-transaction-base/transaction-alerts/index.js create mode 100644 ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.js create mode 100644 ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.scss create mode 100644 ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.test.js diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 08f6039bf..af0f3b190 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -404,6 +404,9 @@ "cancelPopoverTitle": { "message": "Cancel transaction" }, + "cancelSpeedUp": { + "message": "cancel or speed up a tranaction." + }, "cancellationGasFee": { "message": "Cancellation Gas Fee" }, @@ -1378,6 +1381,9 @@ "learmMoreAboutGas": { "message": "Want to $1 about gas?" }, + "learnCancelSpeeedup": { + "message": "Learn how to $1" + }, "learnMore": { "message": "learn more" }, @@ -1963,6 +1969,12 @@ "pending": { "message": "Pending" }, + "pendingTransaction": { + "message": "You have ($1) pending transaction(s)." + }, + "pendingTransactionInfo": { + "message": "This transaction will not process until that one is complete." + }, "permissionCheckedIconDescription": { "message": "You have approved this permission" }, diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js index 42fe0c744..6a9737b14 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js @@ -7,6 +7,9 @@ import ActionableMessage from '../../../ui/actionable-message/actionable-message import { PageContainerFooter } from '../../../ui/page-container'; import { ConfirmPageContainerSummary, ConfirmPageContainerWarning } from '.'; +// eslint-disable-next-line prefer-destructuring +const EIP_1559_V2 = process.env.EIP_1559_V2; + export default class ConfirmPageContainerContent extends Component { static contextTypes = { t: PropTypes.func.isRequired, @@ -138,7 +141,7 @@ export default class ConfirmPageContainerContent extends Component { hideTitle={hideTitle} /> {this.renderContent()} - {(errorKey || errorMessage) && !hasSimulationError && ( + {!EIP_1559_V2 && !hasSimulationError && (errorKey || errorMessage) && (
diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js index 1ae028115..58ee67d0c 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js @@ -4,6 +4,9 @@ import PropTypes from 'prop-types'; import classnames from 'classnames'; import Identicon from '../../../../ui/identicon'; +// eslint-disable-next-line prefer-destructuring +const EIP_1559_V2 = process.env.EIP_1559_V2; + const ConfirmPageContainerSummary = (props) => { const { action, @@ -45,7 +48,7 @@ const ConfirmPageContainerSummary = (props) => {
) : null}
- {hideSubtitle || ( + {!hideSubtitle && !EIP_1559_V2 && (
{subtitleComponent}
diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js index e738e7a8e..1f6037c26 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.js @@ -3,17 +3,20 @@ import React from 'react'; import { PRIORITY_LEVELS } from '../../../../shared/constants/gas'; import { useI18nContext } from '../../../hooks/useI18nContext'; import { useTransactionModalContext } from '../../../contexts/transaction-modal'; - +import ErrorMessage from '../../ui/error-message'; import I18nValue from '../../ui/i18n-value'; import LoadingHeartBeat from '../../ui/loading-heartbeat'; import Popover from '../../ui/popover'; import Typography from '../../ui/typography/typography'; import { COLORS } from '../../../helpers/constants/design-system'; +import { INSUFFICIENT_FUNDS_ERROR_KEY } from '../../../helpers/constants/error-keys'; +import { useGasFeeContext } from '../../../contexts/gasFee'; import EditGasItem from './edit-gas-item'; import NetworkStatus from './network-status'; const EditGasFeePopover = () => { + const { balanceError } = useGasFeeContext(); const t = useI18nContext(); const { closeModal, currentModal } = useTransactionModalContext(); @@ -29,6 +32,9 @@ const EditGasFeePopover = () => { {process.env.IN_TEST === 'true' ? null : }
+ {balanceError && ( + + )}
diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js index de48fd0be..df06ae62c 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-fee-popover.test.js @@ -45,7 +45,7 @@ const MOCK_FEE_ESTIMATE = { estimatedBaseFee: '50', }; -const renderComponent = () => { +const render = (txProps) => { const store = configureStore({ metamask: { nativeCurrency: ETH, @@ -54,7 +54,7 @@ const renderComponent = () => { accounts: { '0xAddress': { address: '0xAddress', - balance: '0x176e5b6f173ebe66', + balance: '0x1F4', }, }, selectedAddress: '0xAddress', @@ -64,7 +64,9 @@ const renderComponent = () => { }); return renderWithProvider( - + , store, @@ -73,7 +75,7 @@ const renderComponent = () => { describe('EditGasFeePopover', () => { it('should renders low / medium / high options', () => { - renderComponent(); + render(); expect(screen.queryByText('🐢')).toBeInTheDocument(); expect(screen.queryByText('🦊')).toBeInTheDocument(); @@ -88,15 +90,25 @@ describe('EditGasFeePopover', () => { }); it('should show time estimates', () => { - renderComponent(); + render(); expect(screen.queryAllByText('5 min')).toHaveLength(2); expect(screen.queryByText('15 sec')).toBeInTheDocument(); }); it('should show gas fee estimates', () => { - renderComponent(); + render(); expect(screen.queryByTitle('0.001113 ETH')).toBeInTheDocument(); expect(screen.queryByTitle('0.00147 ETH')).toBeInTheDocument(); expect(screen.queryByTitle('0.0021 ETH')).toBeInTheDocument(); }); + + it('should not show insufficient balance message if transaction value is less than balance', () => { + render({ userFeeLevel: 'high', txParams: { value: '0x64' } }); + expect(screen.queryByText('Insufficient funds.')).not.toBeInTheDocument(); + }); + + it('should show insufficient balance message if transaction value is more than balance', () => { + render({ userFeeLevel: 'high', txParams: { value: '0x5208' } }); + expect(screen.queryByText('Insufficient funds.')).toBeInTheDocument(); + }); }); diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js index bdef6d77d..7cd7aa281 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.js @@ -41,7 +41,7 @@ const EditGasItem = ({ priorityLevel }) => { let maxPriorityFeePerGas; let minWaitTime; - if (gasFeeEstimates[priorityLevel]) { + if (gasFeeEstimates?.[priorityLevel]) { maxFeePerGas = gasFeeEstimates[priorityLevel].suggestedMaxFeePerGas; } else if ( priorityLevel === PRIORITY_LEVELS.DAPP_SUGGESTED && @@ -95,15 +95,20 @@ const EditGasItem = ({ priorityLevel }) => { }; return ( -
{ -
+ ); }; diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js index 30280fe11..3a1b541b3 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/edit-gas-item.test.js @@ -82,6 +82,7 @@ const renderComponent = (props, transactionProps, gasFeeContextProps) => { describe('EditGasItem', () => { it('should renders low gas estimate option for priorityLevel low', () => { renderComponent({ priorityLevel: 'low' }); + expect(screen.queryByRole('button', { name: 'low' })).toBeInTheDocument(); expect(screen.queryByText('🐢')).toBeInTheDocument(); expect(screen.queryByText('Low')).toBeInTheDocument(); expect(screen.queryByText('5 min')).toBeInTheDocument(); @@ -90,6 +91,9 @@ describe('EditGasItem', () => { it('should renders market gas estimate option for priorityLevel medium', () => { renderComponent({ priorityLevel: 'medium' }); + expect( + screen.queryByRole('button', { name: 'medium' }), + ).toBeInTheDocument(); expect(screen.queryByText('🦊')).toBeInTheDocument(); expect(screen.queryByText('Market')).toBeInTheDocument(); expect(screen.queryByText('5 min')).toBeInTheDocument(); @@ -98,6 +102,7 @@ describe('EditGasItem', () => { it('should renders aggressive gas estimate option for priorityLevel high', () => { renderComponent({ priorityLevel: 'high' }); + expect(screen.queryByRole('button', { name: 'high' })).toBeInTheDocument(); expect(screen.queryByText('🦍')).toBeInTheDocument(); expect(screen.queryByText('Aggressive')).toBeInTheDocument(); expect(screen.queryByText('15 sec')).toBeInTheDocument(); @@ -116,6 +121,9 @@ describe('EditGasItem', () => { { priorityLevel: 'dappSuggested' }, { dappSuggestedGasFees: DAPP_SUGGESTED_ESTIMATE }, ); + expect( + screen.queryByRole('button', { name: 'dappSuggested' }), + ).toBeInTheDocument(); expect(screen.queryByText('🌐')).toBeInTheDocument(); expect(screen.queryByText('Site')).toBeInTheDocument(); expect(screen.queryByTitle('0.0000315 ETH')).toBeInTheDocument(); @@ -130,6 +138,9 @@ describe('EditGasItem', () => { it('should renders advance gas estimate option for priorityLevel custom', () => { renderComponent({ priorityLevel: 'custom' }); + expect( + screen.queryByRole('button', { name: 'custom' }), + ).toBeInTheDocument(); expect(screen.queryByText('⚙')).toBeInTheDocument(); expect(screen.queryByText('Advanced')).toBeInTheDocument(); // below value of custom gas fee estimate is default obtained from state.metamask.advancedGasFee diff --git a/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.scss b/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.scss index 95061e43a..1d7ed379c 100644 --- a/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.scss +++ b/ui/components/app/edit-gas-fee-popover/edit-gas-item/index.scss @@ -1,5 +1,6 @@ .edit-gas-item { border-radius: 24px; + background: white; color: $ui-4; cursor: pointer; font-size: 12px; @@ -8,6 +9,7 @@ margin: 12px 0; padding: 4px 12px; height: 32px; + width: 100%; &--selected { background-color: $ui-1; diff --git a/ui/components/app/edit-gas-fee-popover/index.scss b/ui/components/app/edit-gas-fee-popover/index.scss index e701d7137..df7e2a4e9 100644 --- a/ui/components/app/edit-gas-fee-popover/index.scss +++ b/ui/components/app/edit-gas-fee-popover/index.scss @@ -1,5 +1,5 @@ .edit-gas-fee-popover { - height: 500px; + height: 540px; &__wrapper { border-top: 1px solid $ui-grey; @@ -8,6 +8,11 @@ &__content { padding: 16px 12px; + & .error-message { + margin-top: 0; + margin-bottom: 12px; + } + &__header { color: $ui-4; font-size: 10px; diff --git a/ui/components/app/edit-gas-fee-popover/network-status/status-slider/index.scss b/ui/components/app/edit-gas-fee-popover/network-status/status-slider/index.scss index d8274d3d3..2ae4daf0c 100644 --- a/ui/components/app/edit-gas-fee-popover/network-status/status-slider/index.scss +++ b/ui/components/app/edit-gas-fee-popover/network-status/status-slider/index.scss @@ -3,7 +3,7 @@ flex-direction: column; align-items: center; justify-content: center; - width: 65%; + width: 55%; &__line { background-image: linear-gradient(to right, #037dd6, #d73a49); diff --git a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js index 62ff262b5..5c54ffad9 100644 --- a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js +++ b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js @@ -54,7 +54,7 @@ import Typography from '../../components/ui/typography/typography'; import { MIN_GAS_LIMIT_DEC } from '../send/send.constants'; import GasDetailsItem from './gas-details-item'; -import LowPriorityMessage from './low-priority-message'; +import TransactionAlerts from './transaction-alerts'; // eslint-disable-next-line prefer-destructuring const EIP_1559_V2 = process.env.EIP_1559_V2; @@ -569,7 +569,7 @@ export default class ConfirmTransactionBase extends Component { return (
- {EIP_1559_V2 && } + {EIP_1559_V2 && } { - const { estimateUsed } = useGasFeeContext(); - const t = useI18nContext(); - - if (estimateUsed !== 'low') return null; - return ( -
- -
- ); -}; - -export default LowPriorityMessage; diff --git a/ui/pages/confirm-transaction-base/low-priority-message/low-priority-message.scss b/ui/pages/confirm-transaction-base/low-priority-message/low-priority-message.scss deleted file mode 100644 index 1a99a03af..000000000 --- a/ui/pages/confirm-transaction-base/low-priority-message/low-priority-message.scss +++ /dev/null @@ -1,3 +0,0 @@ -.low-priority-message { - margin-top: 20px; -} diff --git a/ui/pages/confirm-transaction-base/low-priority-message/low-priority-message.test.js b/ui/pages/confirm-transaction-base/low-priority-message/low-priority-message.test.js deleted file mode 100644 index 9d8e233f3..000000000 --- a/ui/pages/confirm-transaction-base/low-priority-message/low-priority-message.test.js +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react'; - -import { renderWithProvider } from '../../../../test/lib/render-helpers'; -import { ETH } from '../../../helpers/constants/common'; -import { GasFeeContextProvider } from '../../../contexts/gasFee'; -import configureStore from '../../../store/store'; - -import LowPriorityMessage from './low-priority-message'; - -jest.mock('../../../store/actions', () => ({ - disconnectGasFeeEstimatePoller: jest.fn(), - getGasFeeEstimatesAndStartPolling: jest - .fn() - .mockImplementation(() => Promise.resolve()), - addPollingTokenToAppState: jest.fn(), -})); - -const render = (props) => { - const store = configureStore({ - metamask: { - nativeCurrency: ETH, - preferences: { - useNativeCurrencyAsPrimaryCurrency: true, - }, - provider: {}, - cachedBalances: {}, - accounts: { - '0xAddress': { - address: '0xAddress', - balance: '0x176e5b6f173ebe66', - }, - }, - selectedAddress: '0xAddress', - }, - }); - - return renderWithProvider( - - - , - store, - ); -}; - -describe('LowPriorityMessage', () => { - it('should returning warning message for low gas estimate', () => { - render({ transaction: { userFeeLevel: 'low' } }); - expect( - document.getElementsByClassName('actionable-message--warning'), - ).toHaveLength(1); - }); - - it('should return null for gas estimate other than low', () => { - render({ transaction: { userFeeLevel: 'high' } }); - expect( - document.getElementsByClassName('actionable-message--warning'), - ).toHaveLength(0); - }); -}); diff --git a/ui/pages/confirm-transaction-base/transaction-alerts/index.js b/ui/pages/confirm-transaction-base/transaction-alerts/index.js new file mode 100644 index 000000000..48b2d29af --- /dev/null +++ b/ui/pages/confirm-transaction-base/transaction-alerts/index.js @@ -0,0 +1 @@ +export { default } from './transaction-alerts'; diff --git a/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.js b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.js new file mode 100644 index 000000000..7fe861e1e --- /dev/null +++ b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.js @@ -0,0 +1,73 @@ +import React from 'react'; +import { useSelector } from 'react-redux'; + +import { INSUFFICIENT_FUNDS_ERROR_KEY } from '../../../helpers/constants/error-keys'; +import { submittedPendingTransactionsSelector } from '../../../selectors/transactions'; +import { useGasFeeContext } from '../../../contexts/gasFee'; +import ActionableMessage from '../../../components/ui/actionable-message/actionable-message'; +import ErrorMessage from '../../../components/ui/error-message'; +import I18nValue from '../../../components/ui/i18n-value'; + +const TransactionAlerts = () => { + const { balanceError, estimateUsed } = useGasFeeContext(); + const pendingTransactions = useSelector(submittedPendingTransactionsSelector); + + return ( +
+ {pendingTransactions?.length > 0 && ( + + + + {' '} + {' '} + + + , + ]} + /> +
+ } + useIcon + iconFillColor="#f8c000" + type="warning" + /> + )} + {balanceError && ( + <> + {pendingTransactions?.length > 0 && ( +
+ )} + + + )} + {estimateUsed === 'low' && ( + <> + {balanceError && ( +
+ )} + } + useIcon + iconFillColor="#f8c000" + type="warning" + /> + + )} +
+ ); +}; + +export default TransactionAlerts; diff --git a/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.scss b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.scss new file mode 100644 index 000000000..074a0cc83 --- /dev/null +++ b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.scss @@ -0,0 +1,17 @@ +.transaction-alerts { + margin-top: 20px; + + &--separator { + margin-top: 12px; + } + + & strong { + font-weight: bold; + } + + &__pending-transactions { + & a { + color: $primary-1; + } + } +} diff --git a/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.test.js b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.test.js new file mode 100644 index 000000000..25fad1301 --- /dev/null +++ b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.test.js @@ -0,0 +1,101 @@ +import React from 'react'; +import { screen } from '@testing-library/react'; + +import { ETH } from '../../../helpers/constants/common'; +import { TRANSACTION_STATUSES } from '../../../../shared/constants/transaction'; +import { renderWithProvider } from '../../../../test/lib/render-helpers'; +import { GasFeeContextProvider } from '../../../contexts/gasFee'; +import configureStore from '../../../store/store'; + +import TransactionAlerts from './transaction-alerts'; + +jest.mock('../../../store/actions', () => ({ + disconnectGasFeeEstimatePoller: jest.fn(), + getGasFeeEstimatesAndStartPolling: jest + .fn() + .mockImplementation(() => Promise.resolve()), + addPollingTokenToAppState: jest.fn(), +})); + +const render = ({ props, state }) => { + const store = configureStore({ + metamask: { + nativeCurrency: ETH, + preferences: { + useNativeCurrencyAsPrimaryCurrency: true, + }, + provider: {}, + cachedBalances: {}, + accounts: { + '0xAddress': { + address: '0xAddress', + balance: '0x1F4', + }, + }, + selectedAddress: '0xAddress', + ...state, + }, + }); + + return renderWithProvider( + + + , + store, + ); +}; + +describe('TransactionAlerts', () => { + it('should returning warning message for low gas estimate', () => { + render({ props: { transaction: { userFeeLevel: 'low' } } }); + expect( + document.getElementsByClassName('actionable-message--warning'), + ).toHaveLength(1); + }); + + it('should return null for gas estimate other than low', () => { + render({ props: { transaction: { userFeeLevel: 'high' } } }); + expect( + document.getElementsByClassName('actionable-message--warning'), + ).toHaveLength(0); + }); + + it('should not show insufficient balance message if transaction value is less than balance', () => { + render({ + props: { + transaction: { userFeeLevel: 'high', txParams: { value: '0x64' } }, + }, + }); + expect(screen.queryByText('Insufficient funds.')).not.toBeInTheDocument(); + }); + + it('should show insufficient balance message if transaction value is more than balance', () => { + render({ + props: { + transaction: { userFeeLevel: 'high', txParams: { value: '0x5208' } }, + }, + }); + expect(screen.queryByText('Insufficient funds.')).toBeInTheDocument(); + }); + + it('should show pending transaction message if there are >= 1 pending transactions', () => { + render({ + state: { + currentNetworkTxList: [ + { + id: 0, + time: 0, + txParams: { + from: '0xAddress', + to: '0xRecipient', + }, + status: TRANSACTION_STATUSES.SUBMITTED, + }, + ], + }, + }); + expect( + screen.queryByText('You have (1) pending transaction(s).'), + ).toBeInTheDocument(); + }); +}); diff --git a/ui/pages/pages.scss b/ui/pages/pages.scss index 878344063..756a92df2 100644 --- a/ui/pages/pages.scss +++ b/ui/pages/pages.scss @@ -6,7 +6,7 @@ @import 'confirm-decrypt-message/confirm-decrypt-message'; @import 'confirm-encryption-public-key/confirm-encryption-public-key'; @import 'confirm-transaction-base/gas-details-item/gas-details-item'; -@import 'confirm-transaction-base/low-priority-message/low-priority-message'; +@import 'confirm-transaction-base/transaction-alerts/transaction-alerts'; @import 'confirmation/confirmation'; @import 'connected-sites/index'; @import 'connected-accounts/index'; From d9d1a831a6878f033bdd37e293cfce0a0353964e Mon Sep 17 00:00:00 2001 From: kumavis Date: Tue, 23 Nov 2021 09:17:27 -1000 Subject: [PATCH 028/129] ci - enforce yarn lock deduplications (#12737) * ci - test for yarn lock deduplications * deps - update yarn.lock and patches * lavamoat - update policy * test - ui/helpers/utils/optimism/buildUnserializedTransaction - test against json obj * lint fix * patch-package - patch @babel/runtime for lavamoat support * patch-package - fix additional @babel/runtime lockdown incompats * patch-package - cleanup sass patch --- .circleci/config.yml | 13 + lavamoat/browserify/beta/policy.json | 39 +- lavamoat/browserify/flask/policy.json | 39 +- lavamoat/browserify/main/policy.json | 39 +- lavamoat/build-system/policy.json | 215 +- patches/@babel+runtime+7.15.4.patch | 62 + ...+1.1.1.patch => object.values+1.1.3.patch} | 7 +- .../{sass+1.32.4.patch => sass+1.35.2.patch} | 14 +- .../buildUnserializedTransaction.test.js | 17 +- yarn.lock | 3107 ++--------------- 10 files changed, 536 insertions(+), 3016 deletions(-) create mode 100644 patches/@babel+runtime+7.15.4.patch rename patches/{object.values+1.1.1.patch => object.values+1.1.3.patch} (79%) rename patches/{sass+1.32.4.patch => sass+1.35.2.patch} (57%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8cef4b332..3c1fcb727 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -31,6 +31,9 @@ workflows: - test-deps-depcheck: requires: - prep-deps + - test-yarn-dedupe: + requires: + - prep-deps - validate-lavamoat-config: filters: branches: @@ -333,6 +336,16 @@ jobs: paths: - storybook-build + test-yarn-dedupe: + executor: node-browsers + steps: + - checkout + - attach_workspace: + at: . + - run: + name: Detect yarn lock deduplications + command: yarn yarn-deduplicate && git diff --exit-code yarn.lock + test-lint: executor: node-browsers steps: diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index 024601e10..0a9aa6447 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -1172,6 +1172,12 @@ "buffer": true } }, + "call-bind": { + "packages": { + "function-bind": true, + "get-intrinsic": true + } + }, "cbor-sync": { "globals": { "define": true @@ -1241,7 +1247,7 @@ }, "copy-to-clipboard": { "globals": { - "clipboardData.setData": true, + "clipboardData": true, "console.error": true, "console.warn": true, "document.body.appendChild": true, @@ -1576,12 +1582,6 @@ "prr": true } }, - "es-abstract": { - "packages": { - "function-bind": true, - "has-symbols": true - } - }, "eth-block-tracker": { "globals": { "clearTimeout": true, @@ -2020,6 +2020,18 @@ "webkitRTCSessionDescription": true } }, + "get-intrinsic": { + "globals": { + "AggregateError": true, + "FinalizationRegistry": true, + "WeakRef": true + }, + "packages": { + "function-bind": true, + "has": true, + "has-symbols": true + } + }, "get-params": { "globals": { "GetParams": "write" @@ -2062,6 +2074,11 @@ "sparse-array": true } }, + "has": { + "packages": { + "function-bind": true + } + }, "has-binary2": { "globals": { "Blob": true, @@ -2585,6 +2602,7 @@ }, "is-regex": { "packages": { + "call-bind": true, "has-symbols": true } }, @@ -4178,8 +4196,7 @@ "console": true }, "packages": { - "@babel/runtime": true, - "symbol-observable": true + "@babel/runtime": true } }, "redux-devtools-core": { @@ -4218,8 +4235,8 @@ }, "regexp.prototype.flags": { "packages": { - "define-properties": true, - "es-abstract": true + "call-bind": true, + "define-properties": true } }, "relative-url": { diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index 024601e10..0a9aa6447 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -1172,6 +1172,12 @@ "buffer": true } }, + "call-bind": { + "packages": { + "function-bind": true, + "get-intrinsic": true + } + }, "cbor-sync": { "globals": { "define": true @@ -1241,7 +1247,7 @@ }, "copy-to-clipboard": { "globals": { - "clipboardData.setData": true, + "clipboardData": true, "console.error": true, "console.warn": true, "document.body.appendChild": true, @@ -1576,12 +1582,6 @@ "prr": true } }, - "es-abstract": { - "packages": { - "function-bind": true, - "has-symbols": true - } - }, "eth-block-tracker": { "globals": { "clearTimeout": true, @@ -2020,6 +2020,18 @@ "webkitRTCSessionDescription": true } }, + "get-intrinsic": { + "globals": { + "AggregateError": true, + "FinalizationRegistry": true, + "WeakRef": true + }, + "packages": { + "function-bind": true, + "has": true, + "has-symbols": true + } + }, "get-params": { "globals": { "GetParams": "write" @@ -2062,6 +2074,11 @@ "sparse-array": true } }, + "has": { + "packages": { + "function-bind": true + } + }, "has-binary2": { "globals": { "Blob": true, @@ -2585,6 +2602,7 @@ }, "is-regex": { "packages": { + "call-bind": true, "has-symbols": true } }, @@ -4178,8 +4196,7 @@ "console": true }, "packages": { - "@babel/runtime": true, - "symbol-observable": true + "@babel/runtime": true } }, "redux-devtools-core": { @@ -4218,8 +4235,8 @@ }, "regexp.prototype.flags": { "packages": { - "define-properties": true, - "es-abstract": true + "call-bind": true, + "define-properties": true } }, "relative-url": { diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index 024601e10..0a9aa6447 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -1172,6 +1172,12 @@ "buffer": true } }, + "call-bind": { + "packages": { + "function-bind": true, + "get-intrinsic": true + } + }, "cbor-sync": { "globals": { "define": true @@ -1241,7 +1247,7 @@ }, "copy-to-clipboard": { "globals": { - "clipboardData.setData": true, + "clipboardData": true, "console.error": true, "console.warn": true, "document.body.appendChild": true, @@ -1576,12 +1582,6 @@ "prr": true } }, - "es-abstract": { - "packages": { - "function-bind": true, - "has-symbols": true - } - }, "eth-block-tracker": { "globals": { "clearTimeout": true, @@ -2020,6 +2020,18 @@ "webkitRTCSessionDescription": true } }, + "get-intrinsic": { + "globals": { + "AggregateError": true, + "FinalizationRegistry": true, + "WeakRef": true + }, + "packages": { + "function-bind": true, + "has": true, + "has-symbols": true + } + }, "get-params": { "globals": { "GetParams": "write" @@ -2062,6 +2074,11 @@ "sparse-array": true } }, + "has": { + "packages": { + "function-bind": true + } + }, "has-binary2": { "globals": { "Blob": true, @@ -2585,6 +2602,7 @@ }, "is-regex": { "packages": { + "call-bind": true, "has-symbols": true } }, @@ -4178,8 +4196,7 @@ "console": true }, "packages": { - "@babel/runtime": true, - "symbol-observable": true + "@babel/runtime": true } }, "redux-devtools-core": { @@ -4218,8 +4235,8 @@ }, "regexp.prototype.flags": { "packages": { - "define-properties": true, - "es-abstract": true + "call-bind": true, + "define-properties": true } }, "relative-url": { diff --git a/lavamoat/build-system/policy.json b/lavamoat/build-system/policy.json index a9073f4cd..e7cf27f5e 100644 --- a/lavamoat/build-system/policy.json +++ b/lavamoat/build-system/policy.json @@ -12,19 +12,23 @@ "@babel/core": { "builtin": { "fs": true, + "module": true, "path": true, - "url": true + "url": true, + "v8": true }, "globals": { "console.log": true, "process.cwd": true, "process.env.BABEL_ENV": true, "process.env.BABEL_SHOW_CONFIG_FOR": true, - "process.env.NODE_ENV": true + "process.env.NODE_ENV": true, + "process.versions.node": true }, "packages": { "@babel/code-frame": true, "@babel/generator": true, + "@babel/helper-compilation-targets": true, "@babel/helper-module-transforms": true, "@babel/helpers": true, "@babel/parser": true, @@ -35,8 +39,6 @@ "debug": true, "gensync": true, "json5": true, - "lodash": true, - "resolve": true, "semver": true, "source-map": true } @@ -76,22 +78,9 @@ "@babel/types": true } }, - "@babel/helper-builder-react-jsx": { - "packages": { - "@babel/helper-annotate-as-pure": true, - "@babel/types": true - } - }, - "@babel/helper-builder-react-jsx-experimental": { - "packages": { - "@babel/helper-annotate-as-pure": true, - "@babel/helper-module-imports": true, - "@babel/types": true - } - }, "@babel/helper-compilation-targets": { "globals": { - "console.log": true, + "console.warn": true, "process.versions.node": true }, "packages": { @@ -107,6 +96,7 @@ }, "packages": { "@babel/core": true, + "@babel/helper-annotate-as-pure": true, "@babel/helper-function-name": true, "@babel/helper-member-expression-to-functions": true, "@babel/helper-optimise-call-expression": true, @@ -121,11 +111,22 @@ "regexpu-core": true } }, - "@babel/helper-define-map": { + "@babel/helper-define-polyfill-provider": { + "builtin": { + "path": true + }, + "globals": { + "console.log": true, + "console.warn": true, + "process.exitCode": "write", + "process.versions.node": true + }, "packages": { - "@babel/helper-function-name": true, - "@babel/types": true, - "lodash": true + "@babel/core": true, + "@babel/helper-compilation-targets": true, + "@babel/helper-plugin-utils": true, + "lodash.debounce": true, + "resolve": true } }, "@babel/helper-explode-assignable-expression": { @@ -177,8 +178,7 @@ "@babel/helper-validator-identifier": true, "@babel/template": true, "@babel/traverse": true, - "@babel/types": true, - "lodash": true + "@babel/types": true } }, "@babel/helper-optimise-call-expression": { @@ -237,6 +237,14 @@ "js-tokens": true } }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "packages": { + "@babel/core": true, + "@babel/helper-plugin-utils": true, + "@babel/helper-skip-transparent-expression-wrappers": true, + "@babel/plugin-proposal-optional-chaining": true + } + }, "@babel/plugin-proposal-async-generator-functions": { "packages": { "@babel/core": true, @@ -251,6 +259,13 @@ "@babel/helper-plugin-utils": true } }, + "@babel/plugin-proposal-class-static-block": { + "packages": { + "@babel/helper-create-class-features-plugin": true, + "@babel/helper-plugin-utils": true, + "@babel/plugin-syntax-class-static-block": true + } + }, "@babel/plugin-proposal-dynamic-import": { "packages": { "@babel/helper-plugin-utils": true, @@ -292,7 +307,9 @@ }, "@babel/plugin-proposal-object-rest-spread": { "packages": { + "@babel/compat-data": true, "@babel/core": true, + "@babel/helper-compilation-targets": true, "@babel/helper-plugin-utils": true, "@babel/plugin-syntax-object-rest-spread": true, "@babel/plugin-transform-parameters": true @@ -318,6 +335,14 @@ "@babel/helper-plugin-utils": true } }, + "@babel/plugin-proposal-private-property-in-object": { + "packages": { + "@babel/helper-annotate-as-pure": true, + "@babel/helper-create-class-features-plugin": true, + "@babel/helper-plugin-utils": true, + "@babel/plugin-syntax-private-property-in-object": true + } + }, "@babel/plugin-proposal-unicode-property-regex": { "packages": { "@babel/helper-create-regexp-features-plugin": true, @@ -334,6 +359,11 @@ "@babel/helper-plugin-utils": true } }, + "@babel/plugin-syntax-class-static-block": { + "packages": { + "@babel/helper-plugin-utils": true + } + }, "@babel/plugin-syntax-dynamic-import": { "packages": { "@babel/helper-plugin-utils": true @@ -384,6 +414,11 @@ "@babel/helper-plugin-utils": true } }, + "@babel/plugin-syntax-private-property-in-object": { + "packages": { + "@babel/helper-plugin-utils": true + } + }, "@babel/plugin-syntax-top-level-await": { "packages": { "@babel/helper-plugin-utils": true @@ -418,7 +453,6 @@ "packages": { "@babel/core": true, "@babel/helper-annotate-as-pure": true, - "@babel/helper-define-map": true, "@babel/helper-function-name": true, "@babel/helper-optimise-call-expression": true, "@babel/helper-plugin-utils": true, @@ -554,7 +588,9 @@ }, "@babel/plugin-transform-react-display-name": { "builtin": { - "path": true + "path.basename": true, + "path.dirname": true, + "path.extname": true }, "packages": { "@babel/core": true, @@ -564,30 +600,15 @@ "@babel/plugin-transform-react-jsx": { "packages": { "@babel/core": true, - "@babel/helper-builder-react-jsx": true, - "@babel/helper-builder-react-jsx-experimental": true, + "@babel/helper-annotate-as-pure": true, + "@babel/helper-module-imports": true, "@babel/helper-plugin-utils": true, "@babel/plugin-syntax-jsx": true } }, "@babel/plugin-transform-react-jsx-development": { "packages": { - "@babel/core": true, - "@babel/helper-builder-react-jsx-experimental": true, - "@babel/helper-plugin-utils": true, - "@babel/plugin-syntax-jsx": true - } - }, - "@babel/plugin-transform-react-jsx-self": { - "packages": { - "@babel/core": true, - "@babel/helper-plugin-utils": true - } - }, - "@babel/plugin-transform-react-jsx-source": { - "packages": { - "@babel/core": true, - "@babel/helper-plugin-utils": true + "@babel/plugin-transform-react-jsx": true } }, "@babel/plugin-transform-react-pure-annotations": { @@ -673,11 +694,12 @@ "packages": { "@babel/compat-data": true, "@babel/helper-compilation-targets": true, - "@babel/helper-module-imports": true, "@babel/helper-plugin-utils": true, "@babel/helper-validator-option": true, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": true, "@babel/plugin-proposal-async-generator-functions": true, "@babel/plugin-proposal-class-properties": true, + "@babel/plugin-proposal-class-static-block": true, "@babel/plugin-proposal-dynamic-import": true, "@babel/plugin-proposal-export-namespace-from": true, "@babel/plugin-proposal-json-strings": true, @@ -688,9 +710,11 @@ "@babel/plugin-proposal-optional-catch-binding": true, "@babel/plugin-proposal-optional-chaining": true, "@babel/plugin-proposal-private-methods": true, + "@babel/plugin-proposal-private-property-in-object": true, "@babel/plugin-proposal-unicode-property-regex": true, "@babel/plugin-syntax-async-generators": true, "@babel/plugin-syntax-class-properties": true, + "@babel/plugin-syntax-class-static-block": true, "@babel/plugin-syntax-dynamic-import": true, "@babel/plugin-syntax-export-namespace-from": true, "@babel/plugin-syntax-json-strings": true, @@ -700,6 +724,7 @@ "@babel/plugin-syntax-object-rest-spread": true, "@babel/plugin-syntax-optional-catch-binding": true, "@babel/plugin-syntax-optional-chaining": true, + "@babel/plugin-syntax-private-property-in-object": true, "@babel/plugin-syntax-top-level-await": true, "@babel/plugin-transform-arrow-functions": true, "@babel/plugin-transform-async-to-generator": true, @@ -735,6 +760,9 @@ "@babel/plugin-transform-unicode-regex": true, "@babel/preset-modules": true, "@babel/types": true, + "babel-plugin-polyfill-corejs2": true, + "babel-plugin-polyfill-corejs3": true, + "babel-plugin-polyfill-regenerator": true, "core-js-compat": true, "semver": true } @@ -742,11 +770,10 @@ "@babel/preset-react": { "packages": { "@babel/helper-plugin-utils": true, + "@babel/helper-validator-option": true, "@babel/plugin-transform-react-display-name": true, "@babel/plugin-transform-react-jsx": true, "@babel/plugin-transform-react-jsx-development": true, - "@babel/plugin-transform-react-jsx-self": true, - "@babel/plugin-transform-react-jsx-source": true, "@babel/plugin-transform-react-pure-annotations": true } }, @@ -760,13 +787,13 @@ "@babel/traverse": { "globals": { "console.log": true, - "console.trace": true, - "process.env.NODE_ENV": true + "console.trace": true }, "packages": { "@babel/code-frame": true, "@babel/generator": true, "@babel/helper-function-name": true, + "@babel/helper-hoist-variables": true, "@babel/helper-split-export-declaration": true, "@babel/parser": true, "@babel/types": true, @@ -781,7 +808,6 @@ }, "packages": { "@babel/helper-validator-identifier": true, - "lodash": true, "to-fast-properties": true } }, @@ -945,11 +971,6 @@ "define": true } }, - "acorn-dynamic-import": { - "packages": { - "acorn": true - } - }, "acorn-jsx": { "packages": { "acorn": true @@ -958,7 +979,6 @@ "acorn-node": { "packages": { "acorn": true, - "acorn-dynamic-import": true, "acorn-walk": true, "xtend": true } @@ -1117,13 +1137,33 @@ "packages": { "browserslist": true, "caniuse-lite": true, - "colorette": true, "normalize-range": true, "num2fraction": true, + "picocolors": true, "postcss": true, "postcss-value-parser": true } }, + "babel-plugin-polyfill-corejs2": { + "packages": { + "@babel/compat-data": true, + "@babel/core": true, + "@babel/helper-define-polyfill-provider": true, + "semver": true + } + }, + "babel-plugin-polyfill-corejs3": { + "packages": { + "@babel/core": true, + "@babel/helper-define-polyfill-provider": true, + "core-js-compat": true + } + }, + "babel-plugin-polyfill-regenerator": { + "packages": { + "@babel/helper-define-polyfill-provider": true + } + }, "babelify": { "builtin": { "path.extname": true, @@ -1675,7 +1715,7 @@ }, "deps-sort": { "packages": { - "shasum": true, + "shasum-object": true, "through2": true } }, @@ -1773,15 +1813,9 @@ } }, "es-abstract": { - "globals": { - "AggregateError": true, - "FinalizationRegistry": true, - "WeakRef": true - }, "packages": { "call-bind": true, "es-to-primitive": true, - "function-bind": true, "get-intrinsic": true, "has": true, "has-symbols": true, @@ -3069,7 +3103,6 @@ "labeled-stream-splicer": { "packages": { "inherits": true, - "isarray": true, "stream-splicer": true } }, @@ -3196,6 +3229,12 @@ "define": true } }, + "lodash.debounce": { + "globals": { + "clearTimeout": true, + "setTimeout": true + } + }, "log-symbols": { "globals": { "process.env.CI": true, @@ -3489,7 +3528,6 @@ "packages": { "call-bind": true, "define-properties": true, - "es-abstract": true, "has-symbols": true, "object-keys": true } @@ -3534,14 +3572,6 @@ "make-iterator": true } }, - "object.values": { - "packages": { - "call-bind": true, - "define-properties": true, - "es-abstract": true, - "has": true - } - }, "once": { "packages": { "wrappy": true @@ -3670,6 +3700,16 @@ "through": true } }, + "picocolors": { + "builtin": { + "tty.isatty": true + }, + "globals": { + "process.argv.includes": true, + "process.env": true, + "process.platform": true + } + }, "picomatch": { "builtin": { "path.basename": true, @@ -3727,6 +3767,7 @@ }, "packages": { "chalk": true, + "picocolors": true, "source-map": true, "supports-color": true } @@ -3767,13 +3808,9 @@ } }, "postcss-selector-parser": { - "builtin": { - "util.deprecate": true - }, "packages": { "cssesc": true, - "indexes-of": true, - "uniq": true + "util-deprecate": true } }, "postcss-syntax": { @@ -3861,6 +3898,11 @@ "pump": true } }, + "qs": { + "packages": { + "side-channel": true + } + }, "quote-stream": { "globals": { "Buffer": true @@ -4272,6 +4314,17 @@ "json-stable-stringify": true } }, + "shasum-object": { + "builtin": { + "crypto.createHash": true + }, + "globals": { + "Buffer.isBuffer": true + }, + "packages": { + "fast-safe-stringify": true + } + }, "shebang-command": { "packages": { "shebang-regex": true @@ -5200,8 +5253,8 @@ "yaml": { "globals": { "Buffer": true, - "_YAML_SILENCE_DEPRECATION_WARNINGS": true, - "_YAML_SILENCE_WARNINGS": true, + "YAML_SILENCE_DEPRECATION_WARNINGS": true, + "YAML_SILENCE_WARNINGS": true, "atob": true, "btoa": true, "console.warn": true, diff --git a/patches/@babel+runtime+7.15.4.patch b/patches/@babel+runtime+7.15.4.patch new file mode 100644 index 000000000..2213f4cb0 --- /dev/null +++ b/patches/@babel+runtime+7.15.4.patch @@ -0,0 +1,62 @@ +diff --git a/node_modules/@babel/runtime/helpers/extends.js b/node_modules/@babel/runtime/helpers/extends.js +index eaf9547..d0474f5 100644 +--- a/node_modules/@babel/runtime/helpers/extends.js ++++ b/node_modules/@babel/runtime/helpers/extends.js +@@ -1,20 +1,5 @@ + function _extends() { +- module.exports = _extends = Object.assign || function (target) { +- for (var i = 1; i < arguments.length; i++) { +- var source = arguments[i]; +- +- for (var key in source) { +- if (Object.prototype.hasOwnProperty.call(source, key)) { +- target[key] = source[key]; +- } +- } +- } +- +- return target; +- }; +- +- module.exports["default"] = module.exports, module.exports.__esModule = true; +- return _extends.apply(this, arguments); ++ return Object.assign(...arguments) + } + + module.exports = _extends; +diff --git a/node_modules/@babel/runtime/helpers/getPrototypeOf.js b/node_modules/@babel/runtime/helpers/getPrototypeOf.js +index a6916eb..e01b2d6 100644 +--- a/node_modules/@babel/runtime/helpers/getPrototypeOf.js ++++ b/node_modules/@babel/runtime/helpers/getPrototypeOf.js +@@ -1,9 +1,5 @@ + function _getPrototypeOf(o) { +- module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { +- return o.__proto__ || Object.getPrototypeOf(o); +- }; +- module.exports["default"] = module.exports, module.exports.__esModule = true; +- return _getPrototypeOf(o); ++ return Object.getPrototypeOf(o); + } + + module.exports = _getPrototypeOf; +diff --git a/node_modules/@babel/runtime/helpers/setPrototypeOf.js b/node_modules/@babel/runtime/helpers/setPrototypeOf.js +index 415797b..63312f2 100644 +--- a/node_modules/@babel/runtime/helpers/setPrototypeOf.js ++++ b/node_modules/@babel/runtime/helpers/setPrototypeOf.js +@@ -1,12 +1,7 @@ + function _setPrototypeOf(o, p) { +- module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { +- o.__proto__ = p; +- return o; +- }; +- +- module.exports["default"] = module.exports, module.exports.__esModule = true; +- return _setPrototypeOf(o, p); +-} ++ o.__proto__ = p; ++ return o; ++}; + + module.exports = _setPrototypeOf; + module.exports["default"] = module.exports, module.exports.__esModule = true; +\ No newline at end of file diff --git a/patches/object.values+1.1.1.patch b/patches/object.values+1.1.3.patch similarity index 79% rename from patches/object.values+1.1.1.patch rename to patches/object.values+1.1.3.patch index f0323c184..2664d97c6 100644 --- a/patches/object.values+1.1.1.patch +++ b/patches/object.values+1.1.3.patch @@ -1,17 +1,18 @@ diff --git a/node_modules/object.values/index.js b/node_modules/object.values/index.js -index b8ba091..2dc8083 100644 +index abf0449..2dc8083 100644 --- a/node_modules/object.values/index.js +++ b/node_modules/object.values/index.js -@@ -1,17 +1,3 @@ +@@ -1,18 +1,3 @@ 'use strict'; -var define = require('define-properties'); +-var callBind = require('call-bind'); - -var implementation = require('./implementation'); -var getPolyfill = require('./polyfill'); -var shim = require('./shim'); - --var polyfill = getPolyfill(); +-var polyfill = callBind(getPolyfill(), Object); - -define(polyfill, { - getPolyfill: getPolyfill, diff --git a/patches/sass+1.32.4.patch b/patches/sass+1.35.2.patch similarity index 57% rename from patches/sass+1.32.4.patch rename to patches/sass+1.35.2.patch index 6939fd235..b4cc16cc1 100644 --- a/patches/sass+1.32.4.patch +++ b/patches/sass+1.35.2.patch @@ -1,25 +1,29 @@ diff --git a/node_modules/sass/sass.dart.js b/node_modules/sass/sass.dart.js -index fedd867..fef6a8f 100644 +index 512d612..1374f5e 100644 --- a/node_modules/sass/sass.dart.js +++ b/node_modules/sass/sass.dart.js -@@ -16,6 +16,9 @@ self.scheduleImmediate = self.setImmediate +@@ -16,6 +16,10 @@ self.scheduleImmediate = typeof setImmediate !== "undefined" // CommonJS globals. self.exports = exports; ++// realm bridge utility functions +exports.bridgeJson = (target) => JSON.parse(JSON.stringify(target)) +exports.bridgeFn = (target) => ((...args) => target(...args)) + // Node.js specific exports, check to see if they exist & or polyfilled if (typeof process !== "undefined") { -@@ -3616,10 +3619,6 @@ self.fs = require("fs"); +@@ -3700,13 +3704,6 @@ self.fs = require("fs"); return C.PlainJavaScriptObject_methods; if (proto === Object.prototype) return C.PlainJavaScriptObject_methods; - if (typeof $constructor == "function") { -- Object.defineProperty($constructor, J.JS_INTEROP_INTERCEPTOR_TAG(), {value: C.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true}); +- t1 = $._JS_INTEROP_INTERCEPTOR_TAG; +- if (t1 == null) +- t1 = $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js"); +- Object.defineProperty($constructor, t1, {value: C.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true}); - return C.UnknownJavaScriptObject_methods; - } return C.UnknownJavaScriptObject_methods; }, - JS_INTEROP_INTERCEPTOR_TAG: function() { + JSArray_JSArray$fixed: function($length, $E) { diff --git a/ui/helpers/utils/optimism/buildUnserializedTransaction.test.js b/ui/helpers/utils/optimism/buildUnserializedTransaction.test.js index 1beaac13c..5789e0f17 100644 --- a/ui/helpers/utils/optimism/buildUnserializedTransaction.test.js +++ b/ui/helpers/utils/optimism/buildUnserializedTransaction.test.js @@ -1,5 +1,4 @@ import { BN } from 'ethereumjs-util'; -import { times } from 'lodash'; import buildUnserializedTransaction from './buildUnserializedTransaction'; describe('buildUnserializedTransaction', () => { @@ -14,15 +13,13 @@ describe('buildUnserializedTransaction', () => { data: '0x0', }, }); - expect(unserializedTransaction).toMatchObject({ - nonce: new BN('00', 16), - gasPrice: new BN('64', 16), - gasLimit: new BN('5208', 16), - to: expect.objectContaining({ - buf: Buffer.from(times(20, 0)), - }), - value: new BN('09184e72a000', 16), - data: Buffer.from([0]), + expect(unserializedTransaction.toJSON()).toMatchObject({ + nonce: '0x0', + gasPrice: '0x64', + gasLimit: '0x5208', + to: '0x0000000000000000000000000000000000000000', + value: '0x9184e72a000', + data: '0x00', }); }); }); diff --git a/yarn.lock b/yarn.lock index 737fb8b61..6206bd7f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -67,7 +67,7 @@ resolved "https://registry.yarnpkg.com/@apocentre/alias-sampling/-/alias-sampling-0.5.3.tgz#897ff181b48ad7b2bcb4ecf29400214888244f08" integrity sha512-7UDWIIF9hIeJqfKXkNIzkVandlwLf1FWTSdrb9iXvOP8oF544JRXQjCbiTmCv2c9n44n/FIWtehhBfNuAx2CZA== -"@babel/code-frame@7.10.4", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5": +"@babel/code-frame@7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== @@ -81,36 +81,19 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" - integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== - dependencies: - "@babel/highlight" "^7.12.13" - -"@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== dependencies: "@babel/highlight" "^7.14.5" -"@babel/compat-data@^7.12.5", "@babel/compat-data@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" - integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw== - "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== -"@babel/compat-data@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.12.tgz#a8a5ccac19c200f9dd49624cac6e19d7be1236a1" - integrity sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ== - -"@babel/core@7.12.9", "@babel/core@>=7.9.0", "@babel/core@^7.12.1", "@babel/core@^7.7.5": +"@babel/core@7.12.9": version "7.12.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== @@ -132,28 +115,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0": - version "7.13.14" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.14.tgz#8e46ebbaca460a63497c797e574038ab04ae6d06" - integrity sha512-wZso/vyF4ki0l0znlgM4inxbdrUvCb+cVz8grxDq+6C9k6qbqoIJteQOKicaKjCipU3ISV+XedCqpL2RJJVehA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.9" - "@babel/helper-compilation-targets" "^7.13.13" - "@babel/helper-module-transforms" "^7.13.14" - "@babel/helpers" "^7.13.10" - "@babel/parser" "^7.13.13" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.13" - "@babel/types" "^7.13.14" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/core@^7.12.10": +"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.12.1", "@babel/core@^7.12.10", "@babel/core@^7.7.5": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== @@ -190,7 +152,7 @@ dependencies: eslint-rule-composer "^0.3.0" -"@babel/generator@^7.12.11", "@babel/generator@^7.15.4", "@babel/generator@^7.15.8": +"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.15.4", "@babel/generator@^7.15.8": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== @@ -199,31 +161,6 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" - integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== - dependencies: - "@babel/types" "^7.12.5" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.13.9": - version "7.13.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" - integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== - dependencies: - "@babel/types" "^7.13.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" - integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== - dependencies: - "@babel/types" "^7.10.4" - "@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" @@ -231,14 +168,6 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" - integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.10.4" - "@babel/types" "^7.10.4" - "@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" @@ -247,33 +176,6 @@ "@babel/helper-explode-assignable-expression" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helper-builder-react-jsx-experimental@^7.12.4": - version "7.12.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz#55fc1ead5242caa0ca2875dcb8eed6d311e50f48" - integrity sha512-AjEa0jrQqNk7eDQOo0pTfUOwQBMF+xVqrausQwT9/rTKy0g04ggFNaJpaE09IQMn9yExluigWMJcj0WC7bq+Og== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-module-imports" "^7.12.1" - "@babel/types" "^7.12.1" - -"@babel/helper-builder-react-jsx@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d" - integrity sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-compilation-targets@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831" - integrity sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw== - dependencies: - "@babel/compat-data" "^7.12.5" - "@babel/helper-validator-option" "^7.12.1" - browserslist "^4.14.5" - semver "^5.5.0" - "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" @@ -284,27 +186,6 @@ browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.13.13": - version "7.13.13" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz#2b2972a0926474853f41e4adbc69338f520600e5" - integrity sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ== - dependencies: - "@babel/compat-data" "^7.13.12" - "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" - integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-member-expression-to-functions" "^7.12.1" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.10.4" - "@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" @@ -317,14 +198,6 @@ "@babel/helper-replace-supers" "^7.15.4" "@babel/helper-split-export-declaration" "^7.15.4" -"@babel/helper-create-regexp-features-plugin@^7.12.1": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz#2084172e95443fa0a09214ba1bb328f9aea1278f" - integrity sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - regexpu-core "^4.7.1" - "@babel/helper-create-regexp-features-plugin@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" @@ -333,15 +206,6 @@ "@babel/helper-annotate-as-pure" "^7.14.5" regexpu-core "^4.7.1" -"@babel/helper-define-map@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" - integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/types" "^7.10.5" - lodash "^4.17.19" - "@babel/helper-define-polyfill-provider@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e" @@ -370,13 +234,6 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.10.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633" - integrity sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA== - dependencies: - "@babel/types" "^7.12.1" - "@babel/helper-explode-assignable-expression@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" @@ -384,24 +241,6 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== - dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" - integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== - dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.12.13" - "@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" @@ -411,20 +250,6 @@ "@babel/template" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== - dependencies: - "@babel/types" "^7.12.13" - "@babel/helper-get-function-arity@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" @@ -432,13 +257,6 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-hoist-variables@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" - integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== - dependencies: - "@babel/types" "^7.10.4" - "@babel/helper-hoist-variables@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" @@ -446,20 +264,6 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-member-expression-to-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c" - integrity sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ== - dependencies: - "@babel/types" "^7.12.1" - -"@babel/helper-member-expression-to-functions@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" - integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== - dependencies: - "@babel/types" "^7.13.12" - "@babel/helper-member-expression-to-functions@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" @@ -467,57 +271,14 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" - integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== - dependencies: - "@babel/types" "^7.12.5" - -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== dependencies: "@babel/types" "^7.15.4" -"@babel/helper-module-imports@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" - integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-module-transforms@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" - integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== - dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-simple-access" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/helper-validator-identifier" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" - lodash "^4.17.19" - -"@babel/helper-module-transforms@^7.13.14": - version "7.13.14" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef" - integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g== - dependencies: - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-replace-supers" "^7.13.12" - "@babel/helper-simple-access" "^7.13.12" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.13" - "@babel/types" "^7.13.14" - -"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4", "@babel/helper-module-transforms@^7.15.8": +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4", "@babel/helper-module-transforms@^7.15.8": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== @@ -531,20 +292,6 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.6" -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== - dependencies: - "@babel/types" "^7.12.13" - "@babel/helper-optimise-call-expression@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" @@ -552,30 +299,16 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-plugin-utils@7.10.4", "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== -"@babel/helper-plugin-utils@^7.12.13": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" - integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== - -"@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== -"@babel/helper-remap-async-to-generator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" - integrity sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-wrap-function" "^7.10.4" - "@babel/types" "^7.12.1" - "@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" @@ -585,26 +318,6 @@ "@babel/helper-wrap-function" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helper-replace-supers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz#f15c9cc897439281891e11d5ce12562ac0cf3fa9" - integrity sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.12.1" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" - -"@babel/helper-replace-supers@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" - integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.12" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.12" - "@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" @@ -615,20 +328,6 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helper-simple-access@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" - integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== - dependencies: - "@babel/types" "^7.12.1" - -"@babel/helper-simple-access@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" - integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== - dependencies: - "@babel/types" "^7.13.12" - "@babel/helper-simple-access@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" @@ -636,13 +335,6 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" - integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== - dependencies: - "@babel/types" "^7.12.1" - "@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" @@ -650,20 +342,6 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== - dependencies: - "@babel/types" "^7.12.13" - "@babel/helper-split-export-declaration@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" @@ -671,51 +349,16 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== - -"@babel/helper-validator-identifier@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" - integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== - -"@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": version "7.15.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== -"@babel/helper-validator-option@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" - integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== - -"@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== - "@babel/helper-validator-option@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== -"@babel/helper-wrap-function@^7.10.4": - version "7.12.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" - integrity sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - "@babel/helper-wrap-function@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" @@ -726,25 +369,7 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helpers@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" - integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== - dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.5" - "@babel/types" "^7.12.5" - -"@babel/helpers@^7.13.10": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.10.tgz#fd8e2ba7488533cdeac45cc158e9ebca5e3c7df8" - integrity sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ== - dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - -"@babel/helpers@^7.15.4": +"@babel/helpers@^7.12.5", "@babel/helpers@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== @@ -753,25 +378,7 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.12.13": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" - integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== - dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.14.5": +"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== @@ -780,36 +387,11 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.0.0": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.6.tgz#043b9aa3c303c0722e5377fef9197f4cf1796549" - integrity sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q== - -"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.13.13": - version "7.13.13" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.13.tgz#42f03862f4aed50461e543270916b47dd501f0df" - integrity sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw== - -"@babel/parser@^7.10.1", "@babel/parser@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056" - integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg== - -"@babel/parser@^7.12.0", "@babel/parser@^7.12.5", "@babel/parser@^7.13.9": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" - integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== - -"@babel/parser@^7.12.11", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8": +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.1", "@babel/parser@^7.12.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.5", "@babel/parser@^7.12.7", "@babel/parser@^7.13.9", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== -"@babel/parser@^7.7.5": - version "7.12.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd" - integrity sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw== - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" @@ -819,15 +401,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" "@babel/plugin-proposal-optional-chaining" "^7.14.5" -"@babel/plugin-proposal-async-generator-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz#dc6c1170e27d8aca99ff65f4925bd06b1c90550e" - integrity sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.12.1" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-proposal-async-generator-functions@^7.15.8": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz#a3100f785fab4357987c4223ab1b02b599048403" @@ -837,15 +410,7 @@ "@babel/helper-remap-async-to-generator" "^7.15.4" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.5.5": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" - integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-proposal-class-properties@^7.14.5": +"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.14.5", "@babel/plugin-proposal-class-properties@^7.5.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== @@ -871,14 +436,6 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-decorators" "^7.14.5" -"@babel/plugin-proposal-dynamic-import@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" - integrity sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-proposal-dynamic-import@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" @@ -895,14 +452,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-export-default-from" "^7.12.1" -"@babel/plugin-proposal-export-namespace-from@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" - integrity sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-proposal-export-namespace-from@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" @@ -911,14 +460,6 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" - integrity sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-proposal-json-strings@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" @@ -927,14 +468,6 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" - integrity sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-proposal-logical-assignment-operators@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" @@ -943,15 +476,7 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4", "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" - integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4", "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== @@ -959,14 +484,6 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz#8bf253de8139099fea193b297d23a9d406ef056b" - integrity sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-proposal-numeric-separator@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" @@ -975,7 +492,7 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.5.5": +"@babel/plugin-proposal-object-rest-spread@7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== @@ -984,7 +501,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.12.1" -"@babel/plugin-proposal-object-rest-spread@^7.15.6": +"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.15.6", "@babel/plugin-proposal-object-rest-spread@^7.5.5": version "7.15.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg== @@ -995,14 +512,6 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.15.4" -"@babel/plugin-proposal-optional-catch-binding@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" - integrity sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-proposal-optional-catch-binding@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" @@ -1011,16 +520,7 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.8.3": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz#e02f0ea1b5dc59d401ec16fb824679f683d3303c" - integrity sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - -"@babel/plugin-proposal-optional-chaining@^7.14.5": +"@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.14.5", "@babel/plugin-proposal-optional-chaining@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== @@ -1029,15 +529,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389" - integrity sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-proposal-private-methods@^7.14.5": +"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== @@ -1055,15 +547,7 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" - integrity sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-proposal-unicode-property-regex@^7.14.5": +"@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== @@ -1071,7 +555,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": +"@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== @@ -1085,13 +569,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" - integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" @@ -1113,7 +590,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": +"@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -1148,14 +625,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": +"@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@7.12.1", "@babel/plugin-syntax-jsx@^7.12.1": +"@babel/plugin-syntax-jsx@7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== @@ -1176,7 +653,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== @@ -1197,14 +674,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": +"@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== @@ -1218,27 +695,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-top-level-await@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" - integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-top-level-await@^7.14.5": +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" - integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-typescript@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" @@ -1246,29 +709,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" - integrity sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-arrow-functions@^7.14.5": +"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-async-to-generator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" - integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A== - dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.12.1" - "@babel/plugin-transform-async-to-generator@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" @@ -1278,13 +725,6 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-remap-async-to-generator" "^7.14.5" -"@babel/plugin-transform-block-scoped-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" - integrity sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-block-scoped-functions@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" @@ -1292,13 +732,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-block-scoping@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" - integrity sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.15.3": version "7.15.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" @@ -1306,21 +739,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-classes@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" - integrity sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-define-map" "^7.10.4" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.10.4" - globals "^11.1.0" - -"@babel/plugin-transform-classes@^7.15.4": +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg== @@ -1333,13 +752,6 @@ "@babel/helper-split-export-declaration" "^7.15.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" - integrity sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-computed-properties@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" @@ -1347,29 +759,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-destructuring@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" - integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-destructuring@^7.14.7": +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.14.7": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" - integrity sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-dotall-regex@^7.14.5": +"@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== @@ -1377,13 +774,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-duplicate-keys@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" - integrity sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-duplicate-keys@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" @@ -1391,14 +781,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-exponentiation-operator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" - integrity sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-exponentiation-operator@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" @@ -1415,28 +797,13 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-flow" "^7.12.1" -"@babel/plugin-transform-for-of@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" - integrity sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-for-of@^7.15.4": +"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-function-name@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" - integrity sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-function-name@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" @@ -1445,13 +812,6 @@ "@babel/helper-function-name" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" - integrity sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-literals@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" @@ -1459,13 +819,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-member-expression-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" - integrity sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-member-expression-literals@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" @@ -1473,15 +826,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-modules-amd@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" - integrity sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ== - dependencies: - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-amd@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" @@ -1491,16 +835,6 @@ "@babel/helper-plugin-utils" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" - integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag== - dependencies: - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-simple-access" "^7.12.1" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-commonjs@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" @@ -1511,17 +845,6 @@ "@babel/helper-simple-access" "^7.15.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" - integrity sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q== - dependencies: - "@babel/helper-hoist-variables" "^7.10.4" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-validator-identifier" "^7.10.4" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-systemjs@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" @@ -1533,14 +856,6 @@ "@babel/helper-validator-identifier" "^7.14.9" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" - integrity sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q== - dependencies: - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-modules-umd@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" @@ -1549,13 +864,6 @@ "@babel/helper-module-transforms" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" - integrity sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" - "@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": version "7.14.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" @@ -1563,13 +871,6 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.14.5" -"@babel/plugin-transform-new-target@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" - integrity sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-new-target@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" @@ -1577,14 +878,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-object-super@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" - integrity sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/plugin-transform-object-super@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" @@ -1593,27 +886,13 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-replace-supers" "^7.14.5" -"@babel/plugin-transform-parameters@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" - integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-parameters@^7.15.4": +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" - integrity sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-property-literals@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" @@ -1621,13 +900,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-display-name@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" - integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-react-display-name@^7.14.5": version "7.15.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz#6aaac6099f1fcf6589d35ae6be1b6e10c8c602b9" @@ -1635,15 +907,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-jsx-development@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.7.tgz#4c2a647de79c7e2b16bfe4540677ba3121e82a08" - integrity sha512-Rs3ETtMtR3VLXFeYRChle5SsP/P9Jp/6dsewBQfokDSzKJThlsuFcnzLTDRALiUmTC48ej19YD9uN1mupEeEDg== - dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.12.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.12.1" - "@babel/plugin-transform-react-jsx-development@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz#1a6c73e2f7ed2c42eebc3d2ad60b0c7494fcb9af" @@ -1651,20 +914,6 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.14.5" -"@babel/plugin-transform-react-jsx-self@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.1.tgz#ef43cbca2a14f1bd17807dbe4376ff89d714cf28" - integrity sha512-FbpL0ieNWiiBB5tCldX17EtXgmzeEZjFrix72rQYeq9X6nUK38HCaxexzVQrZWXanxKJPKVVIU37gFjEQYkPkA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-react-jsx-source@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz#d07de6863f468da0809edcf79a1aa8ce2a82a26b" - integrity sha512-keQ5kBfjJNRc6zZN1/nVHCd6LLIHq4aUKcVnvE/2l+ZZROSbqoiGFRtT5t3Is89XJxBQaP7NLZX2jgGHdZvvFQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.14.5": version "7.14.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz#3314b2163033abac5200a869c4de242cd50a914c" @@ -1676,24 +925,6 @@ "@babel/plugin-syntax-jsx" "^7.14.5" "@babel/types" "^7.14.9" -"@babel/plugin-transform-react-jsx@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.7.tgz#8b14d45f6eccd41b7f924bcb65c021e9f0a06f7f" - integrity sha512-YFlTi6MEsclFAPIDNZYiCRbneg1MFGao9pPG9uD5htwE0vDbPaMUMeYd6itWjw7K4kro4UbdQf3ljmFl9y48dQ== - dependencies: - "@babel/helper-builder-react-jsx" "^7.10.4" - "@babel/helper-builder-react-jsx-experimental" "^7.12.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.12.1" - -"@babel/plugin-transform-react-pure-annotations@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" - integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-react-pure-annotations@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz#18de612b84021e3a9802cbc212c9d9f46d0d11fc" @@ -1702,13 +933,6 @@ "@babel/helper-annotate-as-pure" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-regenerator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" - integrity sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng== - dependencies: - regenerator-transform "^0.14.2" - "@babel/plugin-transform-regenerator@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" @@ -1716,13 +940,6 @@ dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" - integrity sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-reserved-words@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" @@ -1740,29 +957,14 @@ resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" - integrity sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-shorthand-properties@^7.14.5": +"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-spread@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" - integrity sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - -"@babel/plugin-transform-spread@^7.15.8": +"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.15.8": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz#79d5aa27f68d700449b2da07691dfa32d2f6d468" integrity sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ== @@ -1770,13 +972,6 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" -"@babel/plugin-transform-sticky-regex@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz#560224613ab23987453948ed21d0b0b193fa7fad" - integrity sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-sticky-regex@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" @@ -1784,27 +979,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-template-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843" - integrity sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-template-literals@^7.14.5": +"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typeof-symbol@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz#9ca6be343d42512fbc2e68236a82ae64bc7af78a" - integrity sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-typeof-symbol@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" @@ -1821,13 +1002,6 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript" "^7.14.5" -"@babel/plugin-transform-unicode-escapes@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709" - integrity sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-unicode-escapes@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" @@ -1835,14 +1009,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-unicode-regex@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" - integrity sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-unicode-regex@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" @@ -1851,7 +1017,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/preset-env@^7.12.11": +"@babel/preset-env@^7.12.11", "@babel/preset-env@^7.5.5": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.8.tgz#f527ce5bcb121cd199f6b502bf23e420b3ff8dba" integrity sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA== @@ -1920,87 +1086,15 @@ "@babel/plugin-transform-sticky-regex" "^7.14.5" "@babel/plugin-transform-template-literals" "^7.14.5" "@babel/plugin-transform-typeof-symbol" "^7.14.5" - "@babel/plugin-transform-unicode-escapes" "^7.14.5" - "@babel/plugin-transform-unicode-regex" "^7.14.5" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.15.6" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.5" - babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.16.0" - semver "^6.3.0" - -"@babel/preset-env@^7.5.5": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.7.tgz#54ea21dbe92caf6f10cb1a0a576adc4ebf094b55" - integrity sha512-OnNdfAr1FUQg7ksb7bmbKoby4qFOHw6DKWWUNB9KqnnCldxhxJlP+21dpyaWFmf2h0rTbOkXJtAGevY3XW1eew== - dependencies: - "@babel/compat-data" "^7.12.7" - "@babel/helper-compilation-targets" "^7.12.5" - "@babel/helper-module-imports" "^7.12.5" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-validator-option" "^7.12.1" - "@babel/plugin-proposal-async-generator-functions" "^7.12.1" - "@babel/plugin-proposal-class-properties" "^7.12.1" - "@babel/plugin-proposal-dynamic-import" "^7.12.1" - "@babel/plugin-proposal-export-namespace-from" "^7.12.1" - "@babel/plugin-proposal-json-strings" "^7.12.1" - "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" - "@babel/plugin-proposal-numeric-separator" "^7.12.7" - "@babel/plugin-proposal-object-rest-spread" "^7.12.1" - "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.12.7" - "@babel/plugin-proposal-private-methods" "^7.12.1" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.12.1" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.12.1" - "@babel/plugin-transform-arrow-functions" "^7.12.1" - "@babel/plugin-transform-async-to-generator" "^7.12.1" - "@babel/plugin-transform-block-scoped-functions" "^7.12.1" - "@babel/plugin-transform-block-scoping" "^7.12.1" - "@babel/plugin-transform-classes" "^7.12.1" - "@babel/plugin-transform-computed-properties" "^7.12.1" - "@babel/plugin-transform-destructuring" "^7.12.1" - "@babel/plugin-transform-dotall-regex" "^7.12.1" - "@babel/plugin-transform-duplicate-keys" "^7.12.1" - "@babel/plugin-transform-exponentiation-operator" "^7.12.1" - "@babel/plugin-transform-for-of" "^7.12.1" - "@babel/plugin-transform-function-name" "^7.12.1" - "@babel/plugin-transform-literals" "^7.12.1" - "@babel/plugin-transform-member-expression-literals" "^7.12.1" - "@babel/plugin-transform-modules-amd" "^7.12.1" - "@babel/plugin-transform-modules-commonjs" "^7.12.1" - "@babel/plugin-transform-modules-systemjs" "^7.12.1" - "@babel/plugin-transform-modules-umd" "^7.12.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" - "@babel/plugin-transform-new-target" "^7.12.1" - "@babel/plugin-transform-object-super" "^7.12.1" - "@babel/plugin-transform-parameters" "^7.12.1" - "@babel/plugin-transform-property-literals" "^7.12.1" - "@babel/plugin-transform-regenerator" "^7.12.1" - "@babel/plugin-transform-reserved-words" "^7.12.1" - "@babel/plugin-transform-shorthand-properties" "^7.12.1" - "@babel/plugin-transform-spread" "^7.12.1" - "@babel/plugin-transform-sticky-regex" "^7.12.7" - "@babel/plugin-transform-template-literals" "^7.12.1" - "@babel/plugin-transform-typeof-symbol" "^7.12.1" - "@babel/plugin-transform-unicode-escapes" "^7.12.1" - "@babel/plugin-transform-unicode-regex" "^7.12.1" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.12.7" - core-js-compat "^3.7.0" - semver "^5.5.0" + "@babel/plugin-transform-unicode-escapes" "^7.14.5" + "@babel/plugin-transform-unicode-regex" "^7.14.5" + "@babel/preset-modules" "^0.1.4" + "@babel/types" "^7.15.6" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.5" + babel-plugin-polyfill-regenerator "^0.2.2" + core-js-compat "^3.16.0" + semver "^6.3.0" "@babel/preset-flow@^7.12.1": version "7.12.1" @@ -2010,7 +1104,7 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-flow-strip-types" "^7.12.1" -"@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.4": +"@babel/preset-modules@^0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== @@ -2021,20 +1115,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.0.0": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.7.tgz#36d61d83223b07b6ac4ec55cf016abb0f70be83b" - integrity sha512-wKeTdnGUP5AEYCYQIMeXMMwU7j+2opxrG0WzuZfxuuW9nhKvvALBjl67653CWamZJVefuJGI219G591RSldrqQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-react-display-name" "^7.12.1" - "@babel/plugin-transform-react-jsx" "^7.12.7" - "@babel/plugin-transform-react-jsx-development" "^7.12.7" - "@babel/plugin-transform-react-jsx-self" "^7.12.1" - "@babel/plugin-transform-react-jsx-source" "^7.12.1" - "@babel/plugin-transform-react-pure-annotations" "^7.12.1" - -"@babel/preset-react@^7.12.10": +"@babel/preset-react@^7.0.0", "@babel/preset-react@^7.12.10": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.14.5.tgz#0fbb769513f899c2c56f3a882fa79673c2d4ab3c" integrity sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ== @@ -2074,46 +1155,14 @@ core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.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.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" - integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.14.0": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.6.tgz#535203bc0892efc7dec60bdc27b2ecf6e409062d" - integrity sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.14.8": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.8", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.7.4": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" - integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" - -"@babel/template@^7.12.13", "@babel/template@^7.3.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/template@^7.15.4": +"@babel/template@^7.12.7", "@babel/template@^7.15.4", "@babel/template@^7.3.3": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== @@ -2122,51 +1171,7 @@ "@babel/parser" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13": - version "7.13.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.13.tgz#39aa9c21aab69f74d948a486dd28a2dbdbf5114d" - integrity sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.9" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.13.13" - "@babel/types" "^7.13.13" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.10.1": - version "7.12.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.8.tgz#c1c2983bf9ba0f4f0eaa11dff7e77fa63307b2a4" - integrity sha512-EIRQXPTwFEGRZyu6gXbjfpNORN1oZvwuzJbxcXjAgWV0iqXYDszN1Hx3FVm6YgZfu1ZQbCVAk3l+nIw95Xll9Q== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - -"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9", "@babel/traverse@^7.7.4": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.9.tgz#fad26c972eabbc11350e0b695978de6cc8e8596f" - integrity sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - -"@babel/traverse@^7.12.11", "@babel/traverse@^7.15.4": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== @@ -2181,33 +1186,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.13", "@babel/types@^7.13.14", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.13.14" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.14.tgz#c35a4abb15c7cd45a2746d78ab328e362cbace0d" - integrity sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ== - dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.4.4": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13" - integrity sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" - integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.11", "@babel/types@^7.14.9", "@babel/types@^7.15.4", "@babel/types@^7.15.6": +"@babel/types@^7.0.0", "@babel/types@^7.11.5", "@babel/types@^7.12.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.13.0", "@babel/types@^7.14.9", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.15.6" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== @@ -2467,36 +1446,6 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" -"@ethersproject/abi@5.4.0", "@ethersproject/abi@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.0.tgz#a6d63bdb3672f738398846d4279fa6b6c9818242" - integrity sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw== - dependencies: - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/abi@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.1.tgz#6ac28fafc9ef6f5a7a37e30356a2eb31fa05d39b" - integrity sha512-9mhbjUk76BiSluiiW4BaYyI58KSbDMMQpCLdsAR+RsT2GyATiNYxVv+pGWRrekmsIdY3I+hOqsYQSTkc8L/mcg== - dependencies: - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/abi@5.5.0", "@ethersproject/abi@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.5.0.tgz#fb52820e22e50b854ff15ce1647cc508d6660613" @@ -2512,33 +1461,7 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@ethersproject/abstract-provider@5.4.0", "@ethersproject/abstract-provider@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz#415331031b0f678388971e1987305244edc04e1d" - integrity sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" - -"@ethersproject/abstract-provider@5.4.1", "@ethersproject/abstract-provider@^5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e" - integrity sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" - -"@ethersproject/abstract-provider@5.5.1", "@ethersproject/abstract-provider@^5.5.0": +"@ethersproject/abstract-provider@5.5.1", "@ethersproject/abstract-provider@^5.4.1", "@ethersproject/abstract-provider@^5.5.0": version "5.5.1" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz#2f1f6e8a3ab7d378d8ad0b5718460f85649710c5" integrity sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg== @@ -2551,42 +1474,7 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/web" "^5.5.0" -"@ethersproject/abstract-provider@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.5.tgz#797a32a8707830af1ad8f833e9c228994d5572b9" - integrity sha512-i/CjElAkzV7vQBAeoz+IpjGfcFYEP9eD7j3fzZ0fzTq03DO7PPnR+xkEZ1IoDXGwDS+55aLM1xvLDwB/Lx6IOQ== - dependencies: - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/networks" "^5.0.3" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/transactions" "^5.0.5" - "@ethersproject/web" "^5.0.6" - -"@ethersproject/abstract-signer@5.4.0", "@ethersproject/abstract-signer@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz#cd5f50b93141ee9f9f49feb4075a0b3eafb57d65" - integrity sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - -"@ethersproject/abstract-signer@5.4.1", "@ethersproject/abstract-signer@^5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81" - integrity sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - -"@ethersproject/abstract-signer@5.5.0", "@ethersproject/abstract-signer@^5.5.0": +"@ethersproject/abstract-signer@5.5.0", "@ethersproject/abstract-signer@^5.4.1", "@ethersproject/abstract-signer@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz#590ff6693370c60ae376bf1c7ada59eb2a8dd08d" integrity sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA== @@ -2597,29 +1485,7 @@ "@ethersproject/logger" "^5.5.0" "@ethersproject/properties" "^5.5.0" -"@ethersproject/abstract-signer@^5.0.6": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.7.tgz#cdbd3bd479edf77c71b7f6a6156b0275b1176ded" - integrity sha512-8W8gy/QutEL60EoMEpvxZ8MFAEWs/JvH5nmZ6xeLXoZvmBCasGmxqHdYjo2cxg0nevkPkq9SeenSsBBZSCx+SQ== - dependencies: - "@ethersproject/abstract-provider" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - -"@ethersproject/address@5.4.0", "@ethersproject/address@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" - integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - -"@ethersproject/address@5.5.0", "@ethersproject/address@^5.5.0": +"@ethersproject/address@5.5.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== @@ -2630,25 +1496,6 @@ "@ethersproject/logger" "^5.5.0" "@ethersproject/rlp" "^5.5.0" -"@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.5.tgz#2caa65f6b7125015395b1b54c985ee0b27059cc7" - integrity sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA== - dependencies: - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/rlp" "^5.0.3" - bn.js "^4.4.0" - -"@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a" - integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/base64@5.5.0", "@ethersproject/base64@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.5.0.tgz#881e8544e47ed976930836986e5eb8fab259c090" @@ -2656,21 +1503,6 @@ dependencies: "@ethersproject/bytes" "^5.5.0" -"@ethersproject/base64@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.4.tgz#b0d8fdbf3dda977cf546dcd35725a7b1d5256caa" - integrity sha512-4KRykQ7BQMeOXfvio1YITwHjxwBzh92UoXIdzxDE1p53CK28bbHPdsPNYo0wl0El7lJAMpT2SOdL0hhbWRnyIA== - dependencies: - "@ethersproject/bytes" "^5.0.4" - -"@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6" - integrity sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/basex@5.5.0", "@ethersproject/basex@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.5.0.tgz#e40a53ae6d6b09ab4d977bd037010d4bed21b4d3" @@ -2679,25 +1511,7 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/properties" "^5.5.0" -"@ethersproject/bignumber@5.4.1", "@ethersproject/bignumber@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.1.tgz#64399d3b9ae80aa83d483e550ba57ea062c1042d" - integrity sha512-fJhdxqoQNuDOk6epfM7yD6J8Pol4NUCy1vkaGAkuujZm0+lNow//MKu1hLhRiYV4BsOHyBv5/lsTjF+7hWwhJg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - bn.js "^4.11.9" - -"@ethersproject/bignumber@5.4.2": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.2.tgz#44232e015ae4ce82ac034de549eb3583c71283d8" - integrity sha512-oIBDhsKy5bs7j36JlaTzFgNPaZjiNDOXsdSgSpXRucUl+UA6L/1YLlFeI3cPAoodcenzF4nxNPV13pcy7XbWjA== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - bn.js "^4.11.9" - -"@ethersproject/bignumber@5.5.0", "@ethersproject/bignumber@^5.5.0": +"@ethersproject/bignumber@5.5.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== @@ -2706,97 +1520,21 @@ "@ethersproject/logger" "^5.5.0" bn.js "^4.11.9" -"@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.8.tgz#cee33bd8eb0266176def0d371b45274b1d2c4ec0" - integrity sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA== - dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - bn.js "^4.4.0" - -"@ethersproject/bytes@5.4.0", "@ethersproject/bytes@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" - integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/bytes@5.5.0", "@ethersproject/bytes@^5.5.0": +"@ethersproject/bytes@5.5.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== dependencies: "@ethersproject/logger" "^5.5.0" -"@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.5.tgz#688b70000e550de0c97a151a21f15b87d7f97d7c" - integrity sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ== - dependencies: - "@ethersproject/logger" "^5.0.5" - -"@ethersproject/bytes@^5.0.9": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.11.tgz#21118e75b1d00db068984c15530e316021101276" - integrity sha512-D51plLYY5qF05AsoVQwIZVLqlBkaTPVHVP/1WmmBIWyHB0cRW0C9kh0kx5Exo51rB63Hk8PfHxc7SmpoaQFEyg== - dependencies: - "@ethersproject/logger" "^5.0.8" - -"@ethersproject/constants@5.4.0", "@ethersproject/constants@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" - integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - -"@ethersproject/constants@5.5.0", "@ethersproject/constants@^5.5.0": +"@ethersproject/constants@5.5.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== dependencies: "@ethersproject/bignumber" "^5.5.0" -"@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.5.tgz#0ed19b002e8404bdf6d135234dc86a7d9bcf9b71" - integrity sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA== - dependencies: - "@ethersproject/bignumber" "^5.0.7" - -"@ethersproject/contracts@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.0.tgz#e05fe6bd33acc98741e27d553889ec5920078abb" - integrity sha512-hkO3L3IhS1Z3ZtHtaAG/T87nQ7KiPV+/qnvutag35I0IkiQ8G3ZpCQ9NNOpSCzn4pWSW4CfzmtE02FcqnLI+hw== - dependencies: - "@ethersproject/abi" "^5.4.0" - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - -"@ethersproject/contracts@5.4.1", "@ethersproject/contracts@^5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.1.tgz#3eb4f35b7fe60a962a75804ada2746494df3e470" - integrity sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w== - dependencies: - "@ethersproject/abi" "^5.4.0" - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - -"@ethersproject/contracts@5.5.0": +"@ethersproject/contracts@5.5.0", "@ethersproject/contracts@^5.4.1": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.5.0.tgz#b735260d4bd61283a670a82d5275e2a38892c197" integrity sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg== @@ -2824,21 +1562,7 @@ optionalDependencies: "@ledgerhq/hw-transport-node-hid" "5.26.0" -"@ethersproject/hash@5.4.0", "@ethersproject/hash@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0" - integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/hash@5.5.0", "@ethersproject/hash@^5.5.0": +"@ethersproject/hash@5.5.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg== @@ -2852,38 +1576,6 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@ethersproject/hash@>=5.0.0-beta.128": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.6.tgz#2a2e8a1470685421217e9e86e9971ca636e609ce" - integrity sha512-Gvh57v6BWhwnud6l7tMfQm32PRQ2DYx2WaAAQmAxAfYvmzUkpQCBstnGeNMXIL8/2wdkvcB2u+WZRWaZtsFuUQ== - dependencies: - "@ethersproject/abstract-signer" "^5.0.6" - "@ethersproject/address" "^5.0.5" - "@ethersproject/bignumber" "^5.0.8" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.4" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac" - integrity sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/basex" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/pbkdf2" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wordlists" "^5.4.0" - "@ethersproject/hdnode@5.5.0", "@ethersproject/hdnode@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.5.0.tgz#4a04e28f41c546f7c978528ea1575206a200ddf6" @@ -2902,25 +1594,6 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/wordlists" "^5.5.0" -"@ethersproject/json-wallets@5.4.0", "@ethersproject/json-wallets@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95" - integrity sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hdnode" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/pbkdf2" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - "@ethersproject/json-wallets@5.5.0", "@ethersproject/json-wallets@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz#dd522d4297e15bccc8e1427d247ec8376b60e325" @@ -2940,15 +1613,7 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.4.0", "@ethersproject/keccak256@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" - integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A== - dependencies: - "@ethersproject/bytes" "^5.4.0" - js-sha3 "0.5.7" - -"@ethersproject/keccak256@5.5.0", "@ethersproject/keccak256@^5.5.0": +"@ethersproject/keccak256@5.5.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== @@ -2956,53 +1621,11 @@ "@ethersproject/bytes" "^5.5.0" js-sha3 "0.8.0" -"@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.4.tgz#36ca0a7d1ae2a272da5654cb886776d0c680ef3a" - integrity sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ== - dependencies: - "@ethersproject/bytes" "^5.0.4" - js-sha3 "0.5.7" - -"@ethersproject/logger@5.4.0", "@ethersproject/logger@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9" - integrity sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ== - -"@ethersproject/logger@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.1.tgz#503bd33683538b923c578c07d1c2c0dd18672054" - integrity sha512-DZ+bRinnYLPw1yAC64oRl0QyVZj43QeHIhVKfD/+YwSz4wsv1pfwb5SOFjz+r710YEWzU6LrhuSjpSO+6PeE4A== - -"@ethersproject/logger@5.5.0", "@ethersproject/logger@^5.5.0": +"@ethersproject/logger@5.5.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== -"@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.6.tgz#faa484203e86e08be9e07fef826afeef7183fe88" - integrity sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ== - -"@ethersproject/logger@^5.0.8": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.10.tgz#fd884688b3143253e0356ef92d5f22d109d2e026" - integrity sha512-0y2T2NqykDrbPM3Zw9RSbPkDOxwChAL8detXaom76CfYoGxsOnRP/zTX8OUAV+x9LdwzgbWvWmeXrc0M7SuDZw== - -"@ethersproject/networks@5.4.1", "@ethersproject/networks@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.1.tgz#2ce83b8e42aa85216e5d277a7952d97b6ce8d852" - integrity sha512-8SvowCKz9Uf4xC5DTKI8+il8lWqOr78kmiqAVLYT9lzB8aSmJHQMD1GSuJI0CW4hMAnzocpGpZLgiMdzsNSPig== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/networks@5.4.2": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35" - integrity sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw== - dependencies: - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks@5.5.0", "@ethersproject/networks@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.5.0.tgz#babec47cab892c51f8dd652ce7f2e3e14283981a" @@ -3010,21 +1633,6 @@ dependencies: "@ethersproject/logger" "^5.5.0" -"@ethersproject/networks@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.4.tgz#6d320a5e15a0cda804f5da88be0ba846156f6eec" - integrity sha512-/wHDTRms5mpJ09BoDrbNdFWINzONe05wZRgohCXvEv39rrH/Gd/yAnct8wC0RsW3tmFOgjgQxuBvypIxuUynTw== - dependencies: - "@ethersproject/logger" "^5.0.5" - -"@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c" - integrity sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/pbkdf2@5.5.0", "@ethersproject/pbkdf2@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz#e25032cdf02f31505d47afbf9c3e000d95c4a050" @@ -3033,92 +1641,14 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/sha2" "^5.5.0" -"@ethersproject/properties@5.4.0", "@ethersproject/properties@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.0.tgz#38ba20539b44dcc5d5f80c45ad902017dcdbefe7" - integrity sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/properties@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.1.tgz#9f051f976ce790142c6261ccb7b826eaae1f2f36" - integrity sha512-cyCGlF8wWlIZyizsj2PpbJ9I7rIlUAfnHYwy/T90pdkSn/NFTa5YWZx2wTJBe9V7dD65dcrrEMisCRUJiq6n3w== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/properties@5.5.0", "@ethersproject/properties@^5.5.0": +"@ethersproject/properties@5.5.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== dependencies: "@ethersproject/logger" "^5.5.0" -"@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.4.tgz#a67a1f5a52c30850b5062c861631e73d131f666e" - integrity sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A== - dependencies: - "@ethersproject/logger" "^5.0.5" - -"@ethersproject/properties@^5.0.7": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.9.tgz#d7aae634680760136ea522e25c3ef043ec15b5c2" - integrity sha512-ZCjzbHYTw+rF1Pn8FDCEmx3gQttwIHcm/6Xee8g/M3Ga3SfW4tccNMbs5zqnBH0E4RoOPaeNgyg1O68TaF0tlg== - dependencies: - "@ethersproject/logger" "^5.0.8" - -"@ethersproject/providers@5.4.2": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.2.tgz#73df9767869a31bd88d9e27e78cff96364b8fbed" - integrity sha512-Qr8Am8hlj2gL9HwNymhFlYd52MQVVEBLoDwPxhv4ASeyNpaoRiUAQnNEuE6SnEQtiwYkpLrQtSALNLUSeyuvjA== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/basex" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/providers@5.4.5", "@ethersproject/providers@^5.4.5": - version "5.4.5" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.5.tgz#eb2ea2a743a8115f79604a8157233a3a2c832928" - integrity sha512-1GkrvkiAw3Fj28cwi1Sqm8ED1RtERtpdXmRfwIBGmqBSN5MoeRUHuwHPppMtbPayPgpFcvD7/Gdc9doO5fGYgw== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/basex" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/providers@5.5.0": +"@ethersproject/providers@5.5.0", "@ethersproject/providers@^5.4.5": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.5.0.tgz#bc2876a8fe5e0053ed9828b1f3767ae46e43758b" integrity sha512-xqMbDnS/FPy+J/9mBLKddzyLLAQFjrVff5g00efqxPzcAwXiR+SiCGVy6eJ5iAIirBOATjx7QLhDNPGV+AEQsw== @@ -3143,14 +1673,6 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.4.0", "@ethersproject/random@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16" - integrity sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/random@5.5.0", "@ethersproject/random@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.5.0.tgz#305ed9e033ca537735365ac12eed88580b0f81f9" @@ -3159,14 +1681,6 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/logger" "^5.5.0" -"@ethersproject/rlp@5.4.0", "@ethersproject/rlp@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931" - integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/rlp@5.5.0", "@ethersproject/rlp@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.5.0.tgz#530f4f608f9ca9d4f89c24ab95db58ab56ab99a0" @@ -3175,23 +1689,6 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/logger" "^5.5.0" -"@ethersproject/rlp@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.4.tgz#0090a0271e84ea803016a112a79f5cfd80271a77" - integrity sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ== - dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - -"@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371" - integrity sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - hash.js "1.1.7" - "@ethersproject/sha2@5.5.0", "@ethersproject/sha2@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" @@ -3201,18 +1698,6 @@ "@ethersproject/logger" "^5.5.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.4.0", "@ethersproject/signing-key@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec" - integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.7" - "@ethersproject/signing-key@5.5.0", "@ethersproject/signing-key@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.5.0.tgz#2aa37169ce7e01e3e80f2c14325f624c29cedbe0" @@ -3225,27 +1710,6 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/signing-key@^5.0.4": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.11.tgz#19fc5c4597e18ad0a5efc6417ba5b74069fdd2af" - integrity sha512-Jfcru/BGwdkXhLxT+8WCZtFy7LL0TPFZw05FAb5asxB/MyVsEfNdNxGDtjVE9zXfmRSPe/EusXYY4K7wcygOyQ== - dependencies: - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" - elliptic "6.5.4" - -"@ethersproject/solidity@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec" - integrity sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/solidity@5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.5.0.tgz#2662eb3e5da471b85a20531e420054278362f93f" @@ -3258,16 +1722,7 @@ "@ethersproject/sha2" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@ethersproject/strings@5.4.0", "@ethersproject/strings@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a" - integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/strings@5.5.0", "@ethersproject/strings@^5.5.0": +"@ethersproject/strings@5.5.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== @@ -3276,31 +1731,7 @@ "@ethersproject/constants" "^5.5.0" "@ethersproject/logger" "^5.5.0" -"@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.5.tgz#ed7e99a282a02f40757691b04a24cd83f3752195" - integrity sha512-JED6WaIV00xM/gvj8vSnd+0VWtDYdidTmavFRCTQakqfz+4tDo6Jz5LHgG+dd45h7ah7ykCHW0C7ZXWEDROCXQ== - dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - -"@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" - integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ== - dependencies: - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - -"@ethersproject/transactions@5.5.0", "@ethersproject/transactions@^5.5.0": +"@ethersproject/transactions@5.5.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908" integrity sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA== @@ -3315,30 +1746,6 @@ "@ethersproject/rlp" "^5.5.0" "@ethersproject/signing-key" "^5.5.0" -"@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.0.5": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.6.tgz#b8b27938be6e9ed671dbdd35fe98af8b14d0df7c" - integrity sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/rlp" "^5.0.3" - "@ethersproject/signing-key" "^5.0.4" - -"@ethersproject/units@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe" - integrity sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/units@5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.5.0.tgz#104d02db5b5dc42cc672cc4587bafb87a95ee45e" @@ -3348,27 +1755,6 @@ "@ethersproject/constants" "^5.5.0" "@ethersproject/logger" "^5.5.0" -"@ethersproject/wallet@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353" - integrity sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/hdnode" "^5.4.0" - "@ethersproject/json-wallets" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wordlists" "^5.4.0" - "@ethersproject/wallet@5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.5.0.tgz#322a10527a440ece593980dca6182f17d54eae75" @@ -3390,17 +1776,6 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/wordlists" "^5.5.0" -"@ethersproject/web@5.4.0", "@ethersproject/web@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f" - integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og== - dependencies: - "@ethersproject/base64" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/web@5.5.0", "@ethersproject/web@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.5.0.tgz#0e5bb21a2b58fb4960a705bfc6522a6acf461e28" @@ -3412,28 +1787,6 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@ethersproject/web@^5.0.6": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.9.tgz#b08f8295f4bfd4777c8723fe9572f5453b9f03cb" - integrity sha512-//QNlv1MSkOII1hv3+HQwWoiVFS+BMVGI0KYeUww4cyrEktnx1QIez5bTSab9s9fWTFaWKNmQNBwMbxAqPuYDw== - dependencies: - "@ethersproject/base64" "^5.0.3" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7" - integrity sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/wordlists@5.5.0", "@ethersproject/wordlists@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.5.0.tgz#aac74963aa43e643638e5172353d931b347d584f" @@ -4544,12 +2897,7 @@ schema-utils "^2.6.5" source-map "^0.7.3" -"@popperjs/core@^2.4.0", "@popperjs/core@^2.5.4": - version "2.5.4" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.5.4.tgz#de25b5da9f727985a3757fd59b5d028aba75841a" - integrity sha512-ZpKr+WTb8zsajqgDkvCEWgp6d5eJT6Q63Ng2neTbzBO76Lbe91vX/iVIW9dikq+Fs3yEo+ls4cxeXABD2LtcbQ== - -"@popperjs/core@^2.6.0": +"@popperjs/core@^2.4.0", "@popperjs/core@^2.5.4", "@popperjs/core@^2.6.0": version "2.9.2" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.2.tgz#adea7b6953cbb34651766b0548468e743c6a2353" integrity sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q== @@ -4677,14 +3025,7 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.0.tgz#b64b0faadfdd01a6dcf0c4dcdb78438d86fa7dbf" - integrity sha512-atR1J/jRXvQAb47gfzSK8zavXy7BcpnYq21ALon0U99etu99vsir0trzIO3wpeLtW+LLVY6X7EkfVTbjGSH8Ww== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/fake-timers@^6.0.1": +"@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== @@ -5604,11 +3945,6 @@ optionalDependencies: secp256k1 "^3.5.2" -"@types/anymatch@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" - integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== - "@types/aria-query@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0" @@ -5785,21 +4121,11 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/json-schema@^7.0.3": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== - -"@types/json-schema@^7.0.4": +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== -"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" - integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== - "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -5831,12 +4157,7 @@ dependencies: "@types/braces" "*" -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/minimatch@^3.0.3": +"@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== @@ -5854,20 +4175,20 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@^12.0.12", "@types/node@^12.12.6": - version "12.19.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.15.tgz#0de7e978fb43db62da369db18ea088a63673c182" - integrity sha512-lowukE3GUI+VSYSu6VcBXl14d61Rp5hA1D+61r16qnwC0lYNSqdxcvRh0pswejorHfS+HgwBasM8jLXz0/aOsw== +"@types/node@*", "@types/node@^14.0.10": + version "14.17.27" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.27.tgz#5054610d37bb5f6e21342d0e6d24c494231f3b85" + integrity sha512-94+Ahf9IcaDuJTle/2b+wzvjmutxXAEXU6O81JHblYXUg2BDG+dnBy7VxIPHKAyEEDHzCMQydTJuWvrE+Aanzw== "@types/node@10.12.18": version "10.12.18" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== -"@types/node@^14.0.10": - version "14.17.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.27.tgz#5054610d37bb5f6e21342d0e6d24c494231f3b85" - integrity sha512-94+Ahf9IcaDuJTle/2b+wzvjmutxXAEXU6O81JHblYXUg2BDG+dnBy7VxIPHKAyEEDHzCMQydTJuWvrE+Aanzw== +"@types/node@^12.0.12", "@types/node@^12.12.6": + version "12.19.15" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.15.tgz#0de7e978fb43db62da369db18ea088a63673c182" + integrity sha512-lowukE3GUI+VSYSu6VcBXl14d61Rp5hA1D+61r16qnwC0lYNSqdxcvRh0pswejorHfS+HgwBasM8jLXz0/aOsw== "@types/node@^8.10.11": version "8.10.48" @@ -5906,16 +4227,11 @@ dependencies: "@types/node" "*" -"@types/prettier@^2.0.0": +"@types/prettier@^2.0.0", "@types/prettier@^2.1.0": version "2.2.3" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== -"@types/prettier@^2.1.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.1.tgz#be148756d5480a84cde100324c03a86ae5739fb5" - integrity sha512-2zs+O+UkDsJ1Vcp667pd3f8xearMdopz/z54i99wtRDI5KLmngk7vlrYZD0ZjKHaROR03EznlBbVY9PfAEyJIQ== - "@types/pretty-hrtime@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz#72a26101dc567b0d68fd956cf42314556e42d601" @@ -5991,12 +4307,7 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== -"@types/tapable@*", "@types/tapable@^1.0.5": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" - integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== - -"@types/tapable@^1": +"@types/tapable@^1", "@types/tapable@^1.0.5": version "1.0.8" resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== @@ -6023,12 +4334,7 @@ dependencies: source-map "^0.6.1" -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" - integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== - -"@types/unist@^2.0.3": +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== @@ -6052,7 +4358,7 @@ "@types/source-list-map" "*" source-map "^0.7.3" -"@types/webpack@^4.41.26": +"@types/webpack@^4.41.26", "@types/webpack@^4.41.8": version "4.41.31" resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.31.tgz#c35f252a3559ddf9c85c0d8b0b42019025e581aa" integrity sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ== @@ -6064,18 +4370,6 @@ anymatch "^3.0.0" source-map "^0.6.0" -"@types/webpack@^4.41.8": - version "4.41.25" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.25.tgz#4d3b5aecc4e44117b376280fbfd2dc36697968c4" - integrity sha512-cr6kZ+4m9lp86ytQc1jPOJXgINQyz3kLLunZ57jznW+WIAL0JqZbGubQk4GlD42MuQL5JGOABrxdpqqWeovlVQ== - dependencies: - "@types/anymatch" "*" - "@types/node" "*" - "@types/tapable" "*" - "@types/uglify-js" "*" - "@types/webpack-sources" "*" - source-map "^0.6.0" - "@types/ws@^7.2.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.0.tgz#499690ea08736e05a8186113dac37769ab251a0e" @@ -6508,11 +4802,6 @@ accounting@^0.4.1: resolved "https://registry.yarnpkg.com/accounting/-/accounting-0.4.1.tgz#87dd4103eff7f4460f1e186f5c677ed6cf566883" integrity sha1-h91BA+/39EYPHhhvXGd+1s9WaIM= -acorn-dynamic-import@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" - integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== - acorn-globals@^4.0.0: version "4.3.4" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" @@ -6536,27 +4825,12 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" -acorn-jsx@^5.0.0, acorn-jsx@^5.0.2, acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== - -acorn-jsx@^5.3.1: +acorn-jsx@^5.0.0, acorn-jsx@^5.0.2, acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== -acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.6.2.tgz#b7d7ceca6f22e6417af933a62cad4de01048d5d2" - integrity sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg== - dependencies: - acorn "^6.0.2" - acorn-dynamic-import "^4.0.0" - acorn-walk "^6.1.0" - xtend "^4.0.1" - -acorn-node@^1.6.1: +acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: version "1.8.2" resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== @@ -6565,7 +4839,7 @@ acorn-node@^1.6.1: acorn-walk "^7.0.0" xtend "^4.0.2" -acorn-walk@^6.0.1, acorn-walk@^6.1.0: +acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== @@ -6585,7 +4859,7 @@ acorn@^5.1.2, acorn@^5.2.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== -acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7, acorn@^6.4.1: +acorn@^6.0.1, acorn@^6.0.7, acorn@^6.4.1: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== @@ -6673,17 +4947,10 @@ aes-js@^3.1.1: after@0.8.2: version "0.8.2" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= - -agent-base@6: - version "6.0.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4" - integrity sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg== - dependencies: - debug "4" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= -agent-base@^6.0.0, agent-base@^6.0.2: +agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== @@ -6981,7 +5248,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.0, anymatch@^3.0.3, anymatch@^3.1.0, anymatch@~3.1.2: +anymatch@^3.0.0, anymatch@^3.0.3, anymatch@^3.1.0, anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -6989,14 +5256,6 @@ anymatch@^3.0.0, anymatch@^3.0.3, anymatch@^3.1.0, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - app-module-path@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" @@ -7153,16 +5412,7 @@ array-from@^2.1.1: resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= -array-includes@^3.0.3, array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - is-string "^1.0.5" - -array-includes@^3.1.2, array-includes@^3.1.3: +array-includes@^3.0.3, array-includes@^3.1.1, array-includes@^3.1.2, array-includes@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== @@ -7250,16 +5500,7 @@ array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" -array.prototype.flatmap@^1.2.1: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" - integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - -array.prototype.flatmap@^1.2.4: +array.prototype.flatmap@^1.2.1, array.prototype.flatmap@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== @@ -7371,12 +5612,7 @@ assert@^2.0.0: object-is "^1.0.1" util "^0.12.0" -assertion-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" - integrity sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw= - -assertion-error@^1.1.0: +assertion-error@^1.0.1, assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== @@ -7523,12 +5759,7 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" - integrity sha1-ri1acpR38onWDdf5amMUoi3Wwio= - -atob@^2.1.2: +atob@^2.0.0, atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== @@ -7545,20 +5776,7 @@ autoprefixer@^8.0.0: postcss "^6.0.19" postcss-value-parser "^3.2.3" -autoprefixer@^9.8.0: - version "9.8.5" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.5.tgz#2c225de229ddafe1d1424c02791d0c3e10ccccaa" - integrity sha512-C2p5KkumJlsTHoNv9w31NrBRgXhf6eCMteJuHZi2xhkgC+5Vm40MEtCKPhc0qdgAOhox0YPy1SQHTAky05UoKg== - dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001097" - colorette "^1.2.0" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" - -autoprefixer@^9.8.6: +autoprefixer@^9.8.0, autoprefixer@^9.8.6: version "9.8.8" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== @@ -8373,12 +6591,7 @@ base-x@^1.1.0: resolved "https://registry.yarnpkg.com/base-x/-/base-x-1.1.0.tgz#42d3d717474f9ea02207f6d1aa1f426913eeb7ac" integrity sha1-QtPXF0dPnqAiB/bRqh9CaRPut6w= -base32-encode@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/base32-encode/-/base32-encode-1.1.1.tgz#d022d86aca0002a751bbe1bf20eb4a9b1cef4e95" - integrity sha512-eqa0BeGghj3guezlasdHJhr3+J5ZbbQvxeprkcDMbRQrjlqOT832IUDT4Al4ofAwekFYMqkkM9KMUHs9Cu0HKA== - -base32-encode@^1.2.0: +base32-encode@^1.1.0, base32-encode@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/base32-encode/-/base32-encode-1.2.0.tgz#e150573a5e431af0a998e32bdfde7045725ca453" integrity sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A== @@ -8457,16 +6670,11 @@ bech32@0.0.3: resolved "https://registry.yarnpkg.com/bech32/-/bech32-0.0.3.tgz#736747c4a6531c5d8937d0400498de30e93b2f9c" integrity sha512-O+K1w8P/aAOLcYwwQ4sbiPYZ51ZIW95lnS4/6nE8Aib/z+OOddQIIPdu2qi94qGDp4HhYy/wJotttXKkak1lXg== -bech32@1.1.4: +bech32@1.1.4, bech32@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -bech32@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.3.tgz#bd47a8986bbb3eec34a56a097a84b8d3e9a2dfcd" - integrity sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg== - bech32@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" @@ -8698,17 +6906,12 @@ bn.js@^1.0.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-1.3.0.tgz#0db4cbf96f8f23b742f5bcb9d1aa7a9994a05e83" integrity sha1-DbTL+W+PI7dC9by50ap6mZSgXoM= -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.7, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.7, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0: version "4.11.9" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== -bn.js@^5.1.1, bn.js@^5.1.2: - version "5.1.3" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" - integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== - -bn.js@^5.2.0: +bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== @@ -8761,18 +6964,7 @@ boom@^7.2.0: dependencies: hoek "6.x.x" -borc@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.1.tgz#df1a4ec063b9913f2fff5e07c9377eeeff47914a" - integrity sha512-vPLLC2/gS0QN4O3cnPh+8jLshkMMD4qIfs+B1TPGPh30WrtcfItaO6j4k9alsqu/hIgKi8dVdmMvTcbq4tIF7A== - dependencies: - bignumber.js "^9.0.0" - commander "^2.15.0" - ieee754 "^1.1.8" - iso-url "~0.4.4" - json-text-sequence "~0.1.0" - -borc@^2.1.2: +borc@^2.1.0, borc@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19" integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w== @@ -8915,7 +7107,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browser-resolve@^1.11.0, browser-resolve@^1.7.0: +browser-resolve@^1.11.0: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== @@ -9131,18 +7323,7 @@ browserslist@^3.1.1, browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.14.7: - version "4.14.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.7.tgz#c071c1b3622c1c2e790799a37bb09473a4351cb6" - integrity sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ== - dependencies: - caniuse-lite "^1.0.30001157" - colorette "^1.2.1" - electron-to-chromium "^1.3.591" - escalade "^3.1.1" - node-releases "^1.1.66" - -browserslist@^4.16.6, browserslist@^4.17.3: +browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.17.3: version "4.17.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.4.tgz#72e2508af2a403aec0a49847ef31bd823c57ead4" integrity sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ== @@ -9540,17 +7721,12 @@ camelcase@^4.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -camelcase@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" - integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== - -camelcase@^6.2.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-lite@1.0.30001265, caniuse-lite@^1.0.30000810, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001097, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001157, caniuse-lite@^1.0.30001265: +caniuse-lite@1.0.30001265, caniuse-lite@^1.0.30000810, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001265: version "1.0.30001265" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz#0613c9e6c922e422792e6fcefdf9a3afeee4f8c3" integrity sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw== @@ -9749,22 +7925,7 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" -"chokidar@>=2.0.0 <4.0.0", chokidar@^3.4.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.0, chokidar@^3.4.2: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.4.2: version "3.5.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== @@ -10182,11 +8343,6 @@ color@^0.11.3: color-convert "^1.3.0" color-string "^0.3.0" -colorette@^1.2.0, colorette@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" - integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== - colorette@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" @@ -10453,7 +8609,7 @@ continuable-cache@^0.3.1: resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= -convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -10465,7 +8621,7 @@ convert-source-map@^0.3.3: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= -convert-source-map@^1.0.0, convert-source-map@^1.8.0: +convert-source-map@^1.0.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0, convert-source-map@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== @@ -10530,14 +8686,7 @@ copy-props@^2.0.1: each-props "^1.3.0" is-plain-object "^2.0.1" -copy-to-clipboard@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.0.8.tgz#f4e82f4a8830dce4666b7eb8ded0c9bcc313aba9" - integrity sha512-c3GdeY8qxCHGezVb1EFQfHYK/8NZRemgcTIzPq7PuxjHAf/raKibn2QdhHPb/y6q74PMgH6yizaDZlRmw6QyKw== - dependencies: - toggle-selection "^1.0.3" - -copy-to-clipboard@^3.3.1: +copy-to-clipboard@^3.0.8, copy-to-clipboard@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== @@ -10569,20 +8718,7 @@ core-js-compat@^3.16.0, core-js-compat@^3.16.2, core-js-compat@^3.8.1: browserslist "^4.17.3" semver "7.0.0" -core-js-compat@^3.7.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.0.tgz#3248c6826f4006793bd637db608bca6e4cd688b1" - integrity sha512-o9QKelQSxQMYWHXc/Gc4L8bx/4F7TTraE5rhuN8I7mKBt5dBIUpXpIR3omv70ebr8ST5R3PqbDQr+ZI3+Tt1FQ== - dependencies: - browserslist "^4.14.7" - semver "7.0.0" - -core-js-pure@^3.0.0, core-js-pure@^3.0.1: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" - integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== - -core-js-pure@^3.8.2: +core-js-pure@^3.0.0, core-js-pure@^3.0.1, core-js-pure@^3.8.2: version "3.18.3" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.18.3.tgz#7eed77dcce1445ab68fd68715856633e2fb3b90c" integrity sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw== @@ -10592,12 +8728,7 @@ core-js@^2.4.0, core-js@^2.5.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== -core-js@^3.0.4, core-js@^3.6.5: - version "3.8.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.3.tgz#c21906e1f14f3689f93abcc6e26883550dd92dd0" - integrity sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q== - -core-js@^3.8.2: +core-js@^3.0.4, core-js@^3.6.5, core-js@^3.8.2: version "3.15.2" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.15.2.tgz#740660d2ff55ef34ce664d7e2455119c5bdd3d61" integrity sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q== @@ -10908,21 +9039,16 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" - integrity sha1-uANhcMefB6kP8vFuIihAJ6JDhIs= +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - "cssstyle@>= 0.2.37 < 0.3.0": version "0.2.37" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" @@ -11104,10 +9230,10 @@ debug@3.2.6, debug@3.X, debug@^3.0.0, debug@^3.1.0, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== +debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== dependencies: ms "2.1.2" @@ -11118,13 +9244,6 @@ debug@4.1.0: dependencies: ms "^2.1.1" -debug@^4.0.0, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -11207,7 +9326,7 @@ deep-eql@^3.0.1: dependencies: type-detect "^4.0.0" -deep-equal@^1.0.0, deep-equal@^1.0.1, deep-equal@^1.1.0: +deep-equal@^1.0.0, deep-equal@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== @@ -11244,12 +9363,12 @@ deep-object-diff@^1.1.0: resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.0.tgz#d6fabf476c2ed1751fc94d5ca693d2ed8c18bc5a" integrity sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw== -deepmerge@4.0.0, deepmerge@^4.0.0: +deepmerge@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.0.0.tgz#3e3110ca29205f120d7cb064960a39c3d2087c09" integrity sha512-YZ1rOP5+kHor4hMAH+HRQnBQHg+wvS1un1hAOuIcxcBy0hzcUf6Jg2a1w65kpoOUnurOfZbERwjI1TfZxNjcww== -deepmerge@^4.2.2: +deepmerge@^4.0.0, deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== @@ -11466,17 +9585,7 @@ deps-regex@^0.1.4: resolved "https://registry.yarnpkg.com/deps-regex/-/deps-regex-0.1.4.tgz#518667b7691460a5e7e0a341be76eb7ce8090184" integrity sha1-UYZnt2kUYKXn4KNBvnbrfOgJAYQ= -deps-sort@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" - integrity sha1-CRckkC6EZYJg65EHSMzNGvbiH7U= - dependencies: - JSONStream "^1.0.3" - shasum "^1.0.0" - subarg "^1.0.0" - through2 "^2.0.0" - -deps-sort@^2.0.1: +deps-sort@^2.0.0, deps-sort@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw== @@ -11636,15 +9745,6 @@ detective-typescript@^7.0.0: node-source-walk "^4.2.0" typescript "^3.9.7" -detective@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/detective/-/detective-5.1.0.tgz#7a20d89236d7b331ccea65832e7123b5551bb7cb" - integrity sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ== - dependencies: - acorn-node "^1.3.0" - defined "^1.0.0" - minimist "^1.1.1" - detective@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" @@ -12056,12 +10156,7 @@ ejs@^3.0.2: dependencies: jake "^10.6.1" -electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.591: - version "1.3.610" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.610.tgz#1254eb394acd220a836ea1f203f8cded4e487052" - integrity sha512-eFDC+yVQpEhtlapk4CYDPfV9ajF9cEof5TBcO49L1ETO+aYogrKWDmYpZyxBScMNe8Bo/gJamH4amQ4yyvXg4g== - -electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.867: +electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.867: version "1.3.871" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.871.tgz#6e87365fd72037a6c898fb46050ad4be3ac9ef62" integrity sha512-qcLvDUPf8DSIMWarHT2ptgcqrYg62n3vPA7vhrOF24d8UNzbUBaHu2CySiENR3nEDzYgaN60071t0F6KLYMQ7Q== @@ -12218,15 +10313,6 @@ engine.io@~3.5.0: engine.io-parser "~2.2.0" ws "~7.4.2" -enhanced-resolve@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" - integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - enhanced-resolve@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" @@ -12369,42 +10455,7 @@ error@^7.0.0: string-template "~0.2.1" xtend "~4.0.0" -es-abstract@^1.13.0, es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5, es-abstract@^1.4.3, es-abstract@^1.5.0, es-abstract@^1.9.0: - version "1.17.7" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" - integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.0: - version "1.18.0-next.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" - integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-negative-zero "^2.0.0" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: +es-abstract@^1.13.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.4.3, es-abstract@^1.5.0, es-abstract@^1.9.0: version "1.18.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== @@ -12902,16 +10953,7 @@ espree@^5.0.1: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -espree@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" - integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.3.0" - -espree@^7.3.1: +espree@^7.3.0, espree@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== @@ -12925,14 +10967,7 @@ esprima@4.0.1, esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.0, esquery@^1.0.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== - dependencies: - estraverse "^5.1.0" - -esquery@^1.4.0: +esquery@^1.0.0, esquery@^1.0.1, esquery@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== @@ -13205,14 +11240,7 @@ eth-rpc-errors@^3.0.0: dependencies: fast-safe-stringify "^2.0.6" -eth-rpc-errors@^4.0.0, eth-rpc-errors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.2.tgz#11bc164e25237a679061ac05b7da7537b673d3b7" - integrity sha512-n+Re6Gu8XGyfFy1it0AwbD1x0MUzspQs0D5UiPs1fFPCr6WAwZM+vbIhXheBFrpgosqN9bs5PqlB4Q61U/QytQ== - dependencies: - fast-safe-stringify "^2.0.6" - -eth-rpc-errors@^4.0.3: +eth-rpc-errors@^4.0.0, eth-rpc-errors@^4.0.2, eth-rpc-errors@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== @@ -13573,79 +11601,7 @@ ethers@^4.0.20, ethers@^4.0.28: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.8, ethers@^5.4.1: - version "5.4.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.2.tgz#91368e4d9c39f1111157de1c2aa1d8c1616c0f7b" - integrity sha512-JcFcNWjULzhm4tMp5cZKnU45zqN/c7rqabIITiUiQzZuP7LcYSD4WAbADo4Ja6G2orU4d/PbhAWGHGtAKYrB4Q== - dependencies: - "@ethersproject/abi" "5.4.0" - "@ethersproject/abstract-provider" "5.4.0" - "@ethersproject/abstract-signer" "5.4.0" - "@ethersproject/address" "5.4.0" - "@ethersproject/base64" "5.4.0" - "@ethersproject/basex" "5.4.0" - "@ethersproject/bignumber" "5.4.1" - "@ethersproject/bytes" "5.4.0" - "@ethersproject/constants" "5.4.0" - "@ethersproject/contracts" "5.4.0" - "@ethersproject/hash" "5.4.0" - "@ethersproject/hdnode" "5.4.0" - "@ethersproject/json-wallets" "5.4.0" - "@ethersproject/keccak256" "5.4.0" - "@ethersproject/logger" "5.4.0" - "@ethersproject/networks" "5.4.1" - "@ethersproject/pbkdf2" "5.4.0" - "@ethersproject/properties" "5.4.0" - "@ethersproject/providers" "5.4.2" - "@ethersproject/random" "5.4.0" - "@ethersproject/rlp" "5.4.0" - "@ethersproject/sha2" "5.4.0" - "@ethersproject/signing-key" "5.4.0" - "@ethersproject/solidity" "5.4.0" - "@ethersproject/strings" "5.4.0" - "@ethersproject/transactions" "5.4.0" - "@ethersproject/units" "5.4.0" - "@ethersproject/wallet" "5.4.0" - "@ethersproject/web" "5.4.0" - "@ethersproject/wordlists" "5.4.0" - -ethers@^5.4.0, ethers@^5.4.5: - version "5.4.7" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.7.tgz#0fd491a5da7c9793de2d6058d76b41b1e7efba8f" - integrity sha512-iZc5p2nqfWK1sj8RabwsPM28cr37Bpq7ehTQ5rWExBr2Y09Sn1lDKZOED26n+TsZMye7Y6mIgQ/1cwpSD8XZew== - dependencies: - "@ethersproject/abi" "5.4.1" - "@ethersproject/abstract-provider" "5.4.1" - "@ethersproject/abstract-signer" "5.4.1" - "@ethersproject/address" "5.4.0" - "@ethersproject/base64" "5.4.0" - "@ethersproject/basex" "5.4.0" - "@ethersproject/bignumber" "5.4.2" - "@ethersproject/bytes" "5.4.0" - "@ethersproject/constants" "5.4.0" - "@ethersproject/contracts" "5.4.1" - "@ethersproject/hash" "5.4.0" - "@ethersproject/hdnode" "5.4.0" - "@ethersproject/json-wallets" "5.4.0" - "@ethersproject/keccak256" "5.4.0" - "@ethersproject/logger" "5.4.1" - "@ethersproject/networks" "5.4.2" - "@ethersproject/pbkdf2" "5.4.0" - "@ethersproject/properties" "5.4.1" - "@ethersproject/providers" "5.4.5" - "@ethersproject/random" "5.4.0" - "@ethersproject/rlp" "5.4.0" - "@ethersproject/sha2" "5.4.0" - "@ethersproject/signing-key" "5.4.0" - "@ethersproject/solidity" "5.4.0" - "@ethersproject/strings" "5.4.0" - "@ethersproject/transactions" "5.4.0" - "@ethersproject/units" "5.4.0" - "@ethersproject/wallet" "5.4.0" - "@ethersproject/web" "5.4.0" - "@ethersproject/wordlists" "5.4.0" - -ethers@^5.4.2: +ethers@^5.0.8, ethers@^5.4.0, ethers@^5.4.1, ethers@^5.4.2, ethers@^5.4.5: version "5.5.1" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.5.1.tgz#d3259a95a42557844aa543906c537106c0406fbf" integrity sha512-RodEvUFZI+EmFcE6bwkuJqpCYHazdzeR1nMzg+YWQSmQEsNtfl1KHGfp/FWZYl48bI/g7cgBeP2IlPthjiVngw== @@ -13932,12 +11888,7 @@ events@^2.0.0: resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== -events@^3.0.0, events@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== - -events@^3.3.0: +events@^3.0.0, events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -14152,12 +12103,7 @@ extend@3.0.2, extend@^3.0.0, extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -extension-port-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/extension-port-stream/-/extension-port-stream-2.0.0.tgz#c52da241eef4643171b7c6d696baa4a3453c5a9a" - integrity sha512-7ju8jisPXY8w8UiUczF61hRN6bpx/YTZYU9J901GnEqu7vQnweMAwS30k+SgXCcY9S38Zno+fhuu1iaxd+0swg== - -extension-port-stream@^2.0.1: +extension-port-stream@^2.0.0, extension-port-stream@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extension-port-stream/-/extension-port-stream-2.0.1.tgz#d374820c581418c2275d3c4439ade0b82c4cfac6" integrity sha512-ltrv4Dh/979I04+D4Te6TFygfRSOc5EBzzlHRldWMS8v73V80qWluxH88hqF0qyUsBXTb8NmzlmSipcre6a+rg== @@ -14305,14 +12251,7 @@ fast-json-parse@^1.0.3: resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== -fast-json-patch@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-2.0.6.tgz#86fff8f8662391aa819722864d632e603e6ee605" - integrity sha1-hv/4+GYjkaqBlyKGTWMuYD5u5gU= - dependencies: - deep-equal "^1.0.1" - -fast-json-patch@^2.2.1: +fast-json-patch@^2.0.6, fast-json-patch@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-2.2.1.tgz#18150d36c9ab65c7209e7d4eb113f4f8eaabe6d9" integrity sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig== @@ -14974,17 +12913,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" - integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - -fs-extra@^9.0.1: +fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -15059,11 +12988,6 @@ fsevents@~2.1.1: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== -fsevents@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f" - integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw== - fsm-event@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fsm-event/-/fsm-event-2.1.0.tgz#d385716ed38f9c92feab2ba601e2aac6c0ba5a92" @@ -15221,12 +13145,7 @@ generic-names@^2.0.1: dependencies: loader-utils "^1.1.0" -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== - -gensync@^1.0.0-beta.2: +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -15414,14 +13333,7 @@ glob-parent@^3.0.1, glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== - dependencies: - is-glob "^4.0.1" - -glob-parent@~5.1.2: +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -15617,7 +13529,7 @@ globalthis@^1.0.0, globalthis@^1.0.1: dependencies: define-properties "^1.1.3" -globby@11.0.1, globby@^11.0.1: +globby@11.0.1: version "11.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== @@ -15629,7 +13541,7 @@ globby@11.0.1, globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" -globby@^11.0.2, globby@^11.0.3, globby@^11.0.4: +globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.0.4: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== @@ -15780,12 +13692,7 @@ got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" -graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -graceful-fs@^4.2.4: +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== @@ -16085,12 +13992,7 @@ has-symbol-support-x@^1.4.1: resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has-symbols@^1.0.2: +has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== @@ -16601,11 +14503,6 @@ hyphenate-style-name@^1.0.3: resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48" integrity sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ== -iconv-lite@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== - iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -16651,7 +14548,7 @@ idna-uts46@^1.0.1: dependencies: punycode "^2.1.0" -ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.1.8, ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -16837,23 +14734,7 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -insert-module-globals@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.0.tgz#ec87e5b42728479e327bd5c5c71611ddfb4752ba" - integrity sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw== - dependencies: - JSONStream "^1.0.3" - acorn-node "^1.5.2" - combine-source-map "^0.8.0" - concat-stream "^1.6.1" - is-buffer "^1.1.0" - path-is-absolute "^1.0.1" - process "~0.11.0" - through2 "^2.0.0" - undeclared-identifiers "^1.1.2" - xtend "^4.0.0" - -insert-module-globals@^7.2.1: +insert-module-globals@^7.0.0, insert-module-globals@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz#d5e33185181a4e1f33b15f7bf100ee91890d5cb3" integrity sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg== @@ -16893,15 +14774,6 @@ interface-datastore@~0.6.0: pull-stream "^3.6.9" uuid "^3.2.2" -internal-slot@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" - integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== - dependencies: - es-abstract "^1.17.0-next.1" - has "^1.0.3" - side-channel "^1.0.2" - internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -17526,16 +15398,11 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-alphabetical@1.0.4: +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== -is-alphabetical@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.1.tgz#c77079cc91d4efac775be1034bf2d243f95e6f08" - integrity sha1-x3B5zJHU76x3W+EDS/LSQ/lebwg= - is-alphanumeric@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" @@ -17578,12 +15445,7 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" - integrity sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M= - -is-boolean-object@^1.1.0: +is-boolean-object@^1.0.0, is-boolean-object@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== @@ -17600,12 +15462,7 @@ is-buffer@^2.0.0, is-buffer@^2.0.3, is-buffer@~2.0.3: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" - integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== - -is-callable@^1.2.3: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== @@ -17629,28 +15486,7 @@ is-circular@^1.0.2: resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c" integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA== -is-core-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" - integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== - dependencies: - has "^1.0.3" - -is-core-module@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" - integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== - dependencies: - has "^1.0.3" - -is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== - dependencies: - has "^1.0.3" - -is-core-module@^2.4.0: +is-core-module@^2.2.0, is-core-module@^2.4.0: version "2.5.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== @@ -17902,11 +15738,6 @@ is-negated-glob@^1.0.0: resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= -is-negative-zero@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" - integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= - is-negative-zero@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" @@ -17922,12 +15753,7 @@ is-npm@^3.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-3.0.0.tgz#ec9147bfb629c43f494cf67936a961edec7e8053" integrity sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA== -is-number-object@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" - integrity sha1-8mWrian0RQNO9q/xWo8AsA9VF5k= - -is-number-object@^1.0.4: +is-number-object@^1.0.3, is-number-object@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== @@ -18069,14 +15895,7 @@ is-redirect@^1.0.0: resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= -is-regex@^1.0.4, is-regex@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== - dependencies: - has-symbols "^1.0.1" - -is-regex@^1.1.2: +is-regex@^1.0.4, is-regex@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== @@ -18254,11 +16073,6 @@ isarray@2.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= -isarray@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7" - integrity sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -18278,12 +16092,7 @@ iso-stream-http@~0.1.2: inherits "^2.0.1" readable-stream "^3.1.1" -iso-url@~0.4.4, iso-url@~0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.6.tgz#45005c4af4984cad4f8753da411b41b74cf0a8a6" - integrity sha512-YQO7+aIe6l1aSJUKOx+Vrv08DlhZeLFIVfehG2L29KLSEb9RszqPXilxJRVpp57px36BddKR5ZsebacO5qG0tg== - -iso-url@~0.4.7: +iso-url@~0.4.6, iso-url@~0.4.7: version "0.4.7" resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== @@ -18330,20 +16139,7 @@ istanbul-lib-hook@^3.0.0: dependencies: append-transform "^2.0.0" -istanbul-lib-instrument@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz#61f13ac2c96cfefb076fe7131156cc05907874e6" - integrity sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg== - dependencies: - "@babel/core" "^7.7.5" - "@babel/parser" "^7.7.5" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-instrument@^4.0.3: +istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== @@ -18384,15 +16180,7 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.0.tgz#d4d16d035db99581b6194e119bbf36c963c5eb70" - integrity sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -istanbul-reports@^3.0.2: +istanbul-reports@^3.0.0, istanbul-reports@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== @@ -18861,7 +16649,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@3.13.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.5.1: +js-yaml@3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -18869,7 +16657,7 @@ js-yaml@3.13.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.5.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^3.14.0: +js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.14.0, js-yaml@^3.5.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -19116,14 +16904,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== - dependencies: - minimist "^1.2.5" - -json5@^2.1.3: +json5@^2.1.2, json5@^2.1.3: version "2.2.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== @@ -19483,16 +17264,7 @@ koa@^2.7.0: type-is "^1.6.16" vary "^1.1.2" -labeled-stream-splicer@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz#9cffa32fd99e1612fd1d86a8db962416d5292926" - integrity sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg== - dependencies: - inherits "^2.0.1" - isarray "^2.0.4" - stream-splicer "^2.0.0" - -labeled-stream-splicer@^2.0.2: +labeled-stream-splicer@^2.0.0, labeled-stream-splicer@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== @@ -20389,7 +18161,7 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@1.2.3, loader-utils@^1.1.0, loader-utils@^1.2.3: +loader-utils@1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -20407,7 +18179,7 @@ loader-utils@2.0.0, loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -loader-utils@^1.4.0: +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== @@ -20421,20 +18193,13 @@ locale-currency@0.0.1: resolved "https://registry.yarnpkg.com/locale-currency/-/locale-currency-0.0.1.tgz#c9e15a22ff575b4b4bb947a4bf92ac236bd1fe9b" integrity sha1-yeFaIv9XW0tLuUekv5KsI2vR/ps= -localforage@^1.8.1: +localforage@^1.8.1, localforage@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== dependencies: lie "3.1.1" -localforage@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.9.0.tgz#f3e4d32a8300b362b4634cc4e066d9d00d2f09d1" - integrity sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g== - dependencies: - lie "3.1.1" - localstorage-down@^0.6.7: version "0.6.7" resolved "https://registry.yarnpkg.com/localstorage-down/-/localstorage-down-0.6.7.tgz#d0799a93b31e6c5fa5188ec06242eb1cce9d6d15" @@ -21251,12 +19016,12 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.45.0, mime-db@1.x.x: +mime-db@1.45.0: version "1.45.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== -"mime-db@>= 1.43.0 < 2": +mime-db@1.x.x, "mime-db@>= 1.43.0 < 2": version "1.50.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== @@ -21500,40 +19265,19 @@ mocha@^7.2.0: yargs-unparser "1.6.0" mock-fs@^4.1.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.10.1.tgz#50a07a20114a6cdb119f35762f61f46266a1e323" - integrity sha512-w22rOL5ZYu6HbUehB5deurghGM0hS/xBVyHMGKOuQctkk93J9z9VEOhDsiWrXOprVNQpP9uzGKdl8v9mFspKuw== - -module-definition@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-3.3.1.tgz#fedef71667713e36988b93d0626a4fe7b35aebfc" - integrity sha512-kLidGPwQ2yq484nSD+D3JoJp4Etc0Ox9P0L34Pu/cU4X4HcG7k7p62XI5BBuvURWMRX3RPyuhOcBHbKus+UH4A== - dependencies: - ast-module-types "^2.7.1" - node-source-walk "^4.0.0" - -module-deps@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.0.tgz#d41a2e790245ce319171e4e7c4d8c73993ba3cd5" - integrity sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA== - dependencies: - JSONStream "^1.0.3" - browser-resolve "^1.7.0" - cached-path-relative "^1.0.0" - concat-stream "~1.6.0" - defined "^1.0.0" - detective "^5.0.2" - duplexer2 "^0.1.2" - inherits "^2.0.1" - parents "^1.0.0" - readable-stream "^2.0.2" - resolve "^1.4.0" - stream-combiner2 "^1.1.1" - subarg "^1.0.0" - through2 "^2.0.0" - xtend "^4.0.0" + version "4.10.1" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.10.1.tgz#50a07a20114a6cdb119f35762f61f46266a1e323" + integrity sha512-w22rOL5ZYu6HbUehB5deurghGM0hS/xBVyHMGKOuQctkk93J9z9VEOhDsiWrXOprVNQpP9uzGKdl8v9mFspKuw== + +module-definition@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-3.3.1.tgz#fedef71667713e36988b93d0626a4fe7b35aebfc" + integrity sha512-kLidGPwQ2yq484nSD+D3JoJp4Etc0Ox9P0L34Pu/cU4X4HcG7k7p62XI5BBuvURWMRX3RPyuhOcBHbKus+UH4A== + dependencies: + ast-module-types "^2.7.1" + node-source-walk "^4.0.0" -module-deps@^6.2.3: +module-deps@^6.0.0, module-deps@^6.2.3: version "6.2.3" resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.3.tgz#15490bc02af4b56cf62299c7c17cba32d71a96ee" integrity sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA== @@ -22108,12 +19852,7 @@ node-forge@^0.10.0, node-forge@^0.7.1, node-forge@^0.7.5, node-forge@~0.7.6: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== -node-gyp-build@^4.2.0, node-gyp-build@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" - integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== - -node-gyp-build@^4.3.0: +node-gyp-build@^4.2.0, node-gyp-build@^4.2.3, node-gyp-build@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== @@ -22263,11 +20002,6 @@ node-releases@^1.1.61: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== -node-releases@^1.1.66: - version "1.1.67" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" - integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== - node-releases@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.0.tgz#67dc74903100a7deb044037b8a2e5f453bb05400" @@ -22549,12 +20283,7 @@ object-hash@^2.0.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== -object-inspect@^1.6.0, object-inspect@^1.7.0, object-inspect@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== - -object-inspect@^1.9.0: +object-inspect@^1.6.0, object-inspect@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== @@ -22596,17 +20325,7 @@ object.assign@4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.assign@^4.0.4, object.assign@^4.1.0, object.assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" - integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.18.0-next.0" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.assign@^4.1.2: +object.assign@^4.0.4, object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -22626,16 +20345,7 @@ object.defaults@^1.0.0, object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" -object.entries@^1.0.4, object.entries@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" - integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - has "^1.0.3" - -object.entries@^1.1.3: +object.entries@^1.0.4, object.entries@^1.1.0, object.entries@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== @@ -22645,17 +20355,7 @@ object.entries@^1.1.3: es-abstract "^1.18.0-next.1" has "^1.0.3" -"object.fromentries@^2.0.0 || ^1.0.0", object.fromentries@^2.0.1, object.fromentries@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" - integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - -object.fromentries@^2.0.4: +"object.fromentries@^2.0.0 || ^1.0.0", object.fromentries@^2.0.1, object.fromentries@^2.0.2, object.fromentries@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== @@ -22704,17 +20404,7 @@ object.reduce@^1.0.0: for-own "^1.0.0" make-iterator "^1.0.0" -object.values@^1.0.4, object.values@^1.1.0, object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - -object.values@^1.1.2, object.values@^1.1.3: +object.values@^1.0.4, object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.2, object.values@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== @@ -22789,14 +20479,7 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - -onetime@^5.1.2: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -22808,15 +20491,7 @@ only@~0.0.2: resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= -open@^7.0.2, open@^7.0.3: - version "7.3.0" - resolved "https://registry.yarnpkg.com/open/-/open-7.3.0.tgz#45461fdee46444f3645b6e14eb3ca94b82e1be69" - integrity sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -open@^7.4.2: +open@^7.0.2, open@^7.0.3, open@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== @@ -24157,16 +21832,7 @@ postcss-scss@^2.1.1: dependencies: postcss "^7.0.6" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" - integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== - dependencies: - cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^6.0.4: +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: version "6.0.6" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== @@ -24225,16 +21891,7 @@ postcss@^6.0.1, postcss@^6.0.19, postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: - version "7.0.32" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" - integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^7.0.36: +postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: version "7.0.39" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== @@ -24242,16 +21899,7 @@ postcss@^7.0.36: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.1.10: - version "8.3.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.5.tgz#982216b113412bc20a86289e91eb994952a5b709" - integrity sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA== - dependencies: - colorette "^1.2.2" - nanoid "^3.1.23" - source-map-js "^0.6.2" - -postcss@^8.1.7: +postcss@^8.1.10, postcss@^8.1.7: version "8.3.6" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.6.tgz#2730dd76a97969f37f53b9a6096197be311cc4ea" integrity sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A== @@ -24377,12 +22025,7 @@ prettier-plugin-sort-json@^0.0.1: "@types/prettier" "^2.1.0" prettier "^2.1.1" -prettier@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.1.tgz#d9485dd5e499daa6cb547023b87a6cf51bee37d6" - integrity sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw== - -prettier@^2.2.1, prettier@~2.2.1: +prettier@^2.1.1, prettier@^2.2.1, prettier@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== @@ -24569,15 +22212,7 @@ prompts@2.4.0: kleur "^3.0.3" sisteransi "^1.0.5" -prompts@^2.0.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" - integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prompts@^2.4.0: +prompts@^2.0.1, prompts@^2.4.0: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -24617,14 +22252,7 @@ proper-lockfile@^4.0.0: retry "^0.12.0" signal-exit "^3.0.2" -property-information@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.1.0.tgz#e4755eee5319f03f7f6f5a9bc1a6a7fea6609e2c" - integrity sha512-tODH6R3+SwTkAQckSp2S9xyYX8dEKYkeXw+4TmJzTxnNzd6mQPu1OD4f9zPrvw/Rm4wpPgI+Zp63mNSGNzUgHg== - dependencies: - xtend "^4.0.1" - -property-information@^5.3.0: +property-information@^5.0.0, property-information@^5.3.0: version "5.6.0" resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== @@ -25026,12 +22654,12 @@ qrcode.react@^1.0.1: prop-types "^15.6.0" qr.js "0.0.0" -qs@6.7.0, qs@^6.4.0, qs@^6.5.1, qs@^6.5.2: +qs@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -qs@^6.10.0: +qs@^6.10.0, qs@^6.4.0, qs@^6.5.1, qs@^6.5.2: version "6.10.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== @@ -25344,12 +22972,7 @@ react-error-overlay@^6.0.9: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== -react-fast-compare@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.1.1.tgz#0becf31e3812fa70dc231e259f40d892d4767900" - integrity sha512-SCsAORWK59BvauR2L1BTdjQbJcSGJJz03U0awektk2hshLKrITDDFTlgGCqIZpTDlPC/NFlZee6xTMzXPVLiHw== - -react-fast-compare@^3.2.0: +react-fast-compare@^3.0.1, react-fast-compare@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== @@ -25576,7 +23199,7 @@ react-transition-group@^1.2.1: prop-types "^15.5.6" warning "^3.0.0" -react-transition-group@^4.3.0: +react-transition-group@^4.3.0, react-transition-group@^4.4.0: version "4.4.2" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== @@ -25586,16 +23209,6 @@ react-transition-group@^4.3.0: loose-envify "^1.4.0" prop-types "^15.6.2" -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" - loose-envify "^1.4.0" - prop-types "^15.6.2" - react@^16.12.0: version "16.14.0" resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" @@ -25804,13 +23417,6 @@ readdirp@~3.2.0: dependencies: picomatch "^2.0.4" -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - readline2@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" @@ -25880,15 +23486,7 @@ redux-thunk@^2.3.0: resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== -redux@*, redux@^4.0.0, redux@^4.0.1, redux@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" - integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== - dependencies: - loose-envify "^1.4.0" - symbol-observable "^1.2.0" - -redux@^4.1.0: +redux@*, redux@^4.0.0, redux@^4.0.1, redux@^4.0.5, redux@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.1.tgz#76f1c439bb42043f985fbd9bf21990e60bd67f47" integrity sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw== @@ -25962,15 +23560,7 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -regexp.prototype.flags@^1.3.1: +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== @@ -26118,7 +23708,7 @@ remark-mdx@1.6.22: remark-parse "8.0.3" unified "9.2.0" -remark-parse@8.0.3: +remark-parse@8.0.3, remark-parse@^8.0.0: version "8.0.3" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== @@ -26140,28 +23730,6 @@ remark-parse@8.0.3: vfile-location "^3.0.0" xtend "^4.0.1" -remark-parse@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.2.tgz#5999bc0b9c2e3edc038800a64ff103d0890b318b" - integrity sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - remark-slug@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-6.1.0.tgz#0503268d5f0c4ecb1f33315c00465ccdd97923ce" @@ -26479,15 +24047,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.4, resolve@^1.1.5, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" - integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== - dependencies: - is-core-module "^2.0.0" - path-parse "^1.0.6" - -resolve@^1.14.2, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0: +resolve@^1.1.4, resolve@^1.1.5, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -26495,14 +24055,6 @@ resolve@^1.14.2, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0: is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@^1.15.1: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== - dependencies: - is-core-module "^2.1.0" - path-parse "^1.0.6" - resolve@^2.0.0-next.3: version "2.0.0-next.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" @@ -26675,14 +24227,7 @@ rlp-browser@^1.0.1: dependencies: buffer "^5.4.2" -rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4: - version "2.2.6" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" - integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== - dependencies: - bn.js "^4.11.1" - -rlp@^2.2.6: +rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4, rlp@^2.2.6: version "2.2.7" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== @@ -26797,20 +24342,13 @@ rx-lite@^3.1.2: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI= -rxjs@6: +rxjs@6, rxjs@^6.4.0, rxjs@^6.5.2: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" -rxjs@^6.4.0, rxjs@^6.5.2: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== - dependencies: - tslib "^1.9.0" - safe-buffer@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -26890,27 +24428,13 @@ sass-lookup@^3.0.0: dependencies: commander "^2.16.0" -sass@^1.26.3: - version "1.32.8" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.8.tgz#f16a9abd8dc530add8834e506878a2808c037bdc" - integrity sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ== - dependencies: - chokidar ">=2.0.0 <4.0.0" - -sass@^1.29.0: +sass@^1.26.3, sass@^1.29.0, sass@^1.32.4: version "1.35.2" resolved "https://registry.yarnpkg.com/sass/-/sass-1.35.2.tgz#b732314fcdaf7ef8d0f1698698adc378043cb821" integrity sha512-jhO5KAR+AMxCEwIH3v+4zbB2WB0z67V1X0jbapfVwQQdjHZUGUyukpnoM6+iCMfsIUC016w9OPKQ5jrNOS9uXw== dependencies: chokidar ">=3.0.0 <4.0.0" -sass@^1.32.4: - version "1.32.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.4.tgz#308bf29dd7f53d44ae4f06580e9a910ad9aa411e" - integrity sha512-N0BT0PI/t3+gD8jKa83zJJUb7ssfQnRRfqN+GIErokW6U4guBpfYl8qYB+OFLEho+QvnV5ZH1R9qhUC/Z2Ch9w== - dependencies: - chokidar ">=2.0.0 <4.0.0" - sax@^1.2.1, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -27173,21 +24697,7 @@ serve-favicon@^2.5.0: parseurl "~1.3.2" safe-buffer "5.1.1" -serve-handler@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.2.tgz#f05b0421a313fff2d257838cba00cbcc512cd2b6" - integrity sha512-RFh49wX7zJmmOVDcIjiDSJnMH+ItQEvyuYLYuDBVoA/xmQSCuj+uRmk1cmBB5QQlI3qOiWKp6p4DUGY+Z5AB2A== - dependencies: - bytes "3.0.0" - content-disposition "0.5.2" - fast-url-parser "1.1.3" - mime-types "2.1.18" - minimatch "3.0.4" - path-is-inside "1.0.2" - path-to-regexp "2.2.1" - range-parser "1.2.0" - -serve-handler@^6.1.3: +serve-handler@^6.1.2, serve-handler@^6.1.3: version "6.1.3" resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8" integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w== @@ -27384,14 +24894,6 @@ shortid@^2.2.8: dependencies: nanoid "^2.0.0" -side-channel@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" - integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== - dependencies: - es-abstract "^1.17.0-next.1" - object-inspect "^1.7.0" - side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -27401,12 +24903,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -signal-exit@^3.0.3: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== @@ -27518,12 +25015,7 @@ slide@~1.1.3: resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= -smart-buffer@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" - integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== - -smart-buffer@^4.1.0: +smart-buffer@^4.0.2, smart-buffer@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== @@ -27737,15 +25229,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.11, source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19, source-map-support@~0.5.4: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.20: +source-map-support@^0.5.11, source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.20, source-map-support@~0.5.4: version "0.5.20" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== @@ -28165,19 +25649,7 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -"string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" - integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - has-symbols "^1.0.1" - internal-slot "^1.0.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.2" - -string.prototype.matchall@^4.0.4: +"string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.2, string.prototype.matchall@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" integrity sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== @@ -28226,14 +25698,6 @@ string.prototype.trim@~1.1.2: es-abstract "^1.5.0" function-bind "^1.0.2" -string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" @@ -28242,14 +25706,6 @@ string.prototype.trimend@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" -string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimstart@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" @@ -28652,12 +26108,7 @@ symbol-observable@^1.2.0, symbol-observable@^2.0.3: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== -symbol-tree@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" - integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= - -symbol-tree@^3.2.4: +symbol-tree@^3.2.1, symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== @@ -28752,18 +26203,7 @@ tar-fs@^2.0.0: pump "^3.0.0" tar-stream "^2.1.4" -tar-stream@^2.0.0, tar-stream@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3" - integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw== - dependencies: - bl "^3.0.0" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tar-stream@^2.1.4: +tar-stream@^2.0.0, tar-stream@^2.0.1, tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== @@ -28906,7 +26346,7 @@ terser@^4.1.2, terser@^4.6.3: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.3.4: +terser@^5.3.4, terser@^5.7.0: version "5.9.0" resolved "https://registry.yarnpkg.com/terser/-/terser-5.9.0.tgz#47d6e629a522963240f2b55fcaa3c99083d2c351" integrity sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ== @@ -28915,15 +26355,6 @@ terser@^5.3.4: source-map "~0.7.2" source-map-support "~0.5.20" -terser@^5.7.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" - integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.19" - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -29205,7 +26636,7 @@ to-through@^2.0.0: dependencies: through2 "^2.0.3" -toggle-selection@^1.0.3, toggle-selection@^1.0.6: +toggle-selection@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= @@ -29220,15 +26651,7 @@ tosource@1.0.0: resolved "https://registry.yarnpkg.com/tosource/-/tosource-1.0.0.tgz#42d88dd116618bcf00d6106dd5446f3427902ff1" integrity sha1-QtiN0RZhi88A1hBt1URvNCeQL/E= -tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tough-cookie@^4.0.0: +tough-cookie@>=2.3.3, tough-cookie@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== @@ -29237,6 +26660,14 @@ tough-cookie@^4.0.0: punycode "^2.1.1" universalify "^0.1.2" +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + tr46@^1.0.0, tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -29335,12 +26766,7 @@ ts-custom-error@^2.2.1: resolved "https://registry.yarnpkg.com/ts-custom-error/-/ts-custom-error-2.2.2.tgz#ee769cd6a9cf35dc2e9fedefbb3842f3a2fbceae" integrity sha512-I0FEdfdatDjeigRqh1JFj67bcIKyRNm12UVGheBjs2pXgyELg2xeiQLVaWu1pVmNGXZVnz/fvycSU41moBIpOg== -ts-dedent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.0.0.tgz#47c5eb23d9096f3237cc413bc82d387d36dbe690" - integrity sha512-DfxKjSFQfw9+uf7N9Cy8Ebx9fv5fquK4hZ6SD3Rzr+1jKP6AVA6H8+B5457ZpUs0JKsGpGqIevbpZ9DMQJDp1A== - -ts-dedent@^2.1.1: +ts-dedent@^2.0.0, ts-dedent@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== @@ -29370,12 +26796,7 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" - integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== - -tslib@^2.3.0: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== @@ -29669,7 +27090,7 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== -unified@9.2.0: +unified@9.2.0, unified@^9.0.0: version "9.2.0" resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== @@ -29681,18 +27102,6 @@ unified@9.2.0: trough "^1.0.0" vfile "^4.0.0" -unified@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.0.0.tgz#12b099f97ee8b36792dbad13d278ee2f696eed1d" - integrity sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -29812,11 +27221,6 @@ universalify@^0.1.0, universalify@^0.1.2: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -30178,12 +27582,7 @@ varint-decoder@~0.1.1: dependencies: varint "^5.0.0" -varint@^5.0.0, varint@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.0.tgz#d826b89f7490732fabc0c0ed693ed475dcb29ebf" - integrity sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8= - -varint@^5.0.2: +varint@^5.0.0, varint@^5.0.2, varint@~5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== @@ -30214,12 +27613,7 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vfile-location@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.0.1.tgz#d78677c3546de0f7cd977544c367266764d31bb3" - integrity sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ== - -vfile-location@^3.2.0: +vfile-location@^3.0.0, vfile-location@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== @@ -30323,19 +27717,7 @@ vinyl@^1.1.0: clone-stats "^0.0.1" replace-ext "0.0.1" -vinyl@^2.0.0, vinyl@^2.1.0, vinyl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" - integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== - dependencies: - clone "^2.1.1" - clone-buffer "^1.0.0" - clone-stats "^1.0.0" - cloneable-readable "^1.0.0" - remove-trailing-separator "^1.0.1" - replace-ext "^1.0.0" - -vinyl@^2.2.1: +vinyl@^2.0.0, vinyl@^2.1.0, vinyl@^2.2.0, vinyl@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== @@ -30843,7 +28225,7 @@ webpack-virtual-modules@^0.2.2: dependencies: debug "^3.0.0" -webpack@4: +webpack@4, webpack@^4.41.6: version "4.46.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== @@ -30872,35 +28254,6 @@ webpack@4: watchpack "^1.7.4" webpack-sources "^1.4.1" -webpack@^4.41.6: - version "4.44.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" - integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.3.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.7.4" - webpack-sources "^1.4.1" - "webrtcsupport@github:ipfs/webrtcsupport": version "2.2.0" resolved "https://codeload.github.com/ipfs/webrtcsupport/tar.gz/0669f576582c53a3a42aa5ac014fcc5966809615" @@ -30930,14 +28283,7 @@ websocket@1.0.32, websocket@^1.0.31: utf-8-validate "^5.0.2" yaeti "^0.0.6" -whatwg-encoding@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" - integrity sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw== - dependencies: - iconv-lite "0.4.19" - -whatwg-encoding@^1.0.5: +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== @@ -31313,18 +28659,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0: +yaml@^1.10.0, yaml@^1.7.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yaml@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" - integrity sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw== - dependencies: - "@babel/runtime" "^7.6.3" - yargs-parser@13.1.2, yargs-parser@^13.1.0, yargs-parser@^13.1.1, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" From dd77700e65f8ea8ae757ed8d152406014ab564a7 Mon Sep 17 00:00:00 2001 From: George Marshall Date: Tue, 23 Nov 2021 15:32:59 -0800 Subject: [PATCH 029/129] Updating tags in Typography component (#12682) --- ui/components/ui/typography/typography.js | 4 +- .../ui/typography/typography.test.js | 59 +++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 ui/components/ui/typography/typography.test.js diff --git a/ui/components/ui/typography/typography.js b/ui/components/ui/typography/typography.js index 0af48e699..2d11ca3cc 100644 --- a/ui/components/ui/typography/typography.js +++ b/ui/components/ui/typography/typography.js @@ -79,9 +79,11 @@ Typography.propTypes = { 'h5', 'h6', 'span', + 'strong', + 'em', + 'li', 'div', 'dt', 'dd', - 'i', ]), }; diff --git a/ui/components/ui/typography/typography.test.js b/ui/components/ui/typography/typography.test.js new file mode 100644 index 000000000..c162f69dd --- /dev/null +++ b/ui/components/ui/typography/typography.test.js @@ -0,0 +1,59 @@ +import * as React from 'react'; +import { render } from '@testing-library/react'; +import Typography from '.'; + +describe('Typography', () => { + it('should render the Typography without crashing', () => { + const { getByText } = render(Test type); + expect(getByText('Test type')).toBeDefined(); + }); + it('should render the Typography with correct html tags', () => { + const { getByText, container } = render( + <> + p tag + h1 tag + h2 tag + h3 tag + h4 tag + h5 tag + h6 tag + span tag + strong tag + em tag + li tag + div tag + dt tag + dd tag + i tag + , + ); + expect(container.querySelector('p')).toBeDefined(); + expect(getByText('p tag')).toBeDefined(); + expect(container.querySelector('h1')).toBeDefined(); + expect(getByText('h1 tag')).toBeDefined(); + expect(container.querySelector('h2')).toBeDefined(); + expect(getByText('h2 tag')).toBeDefined(); + expect(container.querySelector('h3')).toBeDefined(); + expect(getByText('h3 tag')).toBeDefined(); + expect(container.querySelector('h4')).toBeDefined(); + expect(getByText('h4 tag')).toBeDefined(); + expect(container.querySelector('h5')).toBeDefined(); + expect(getByText('h5 tag')).toBeDefined(); + expect(container.querySelector('h6')).toBeDefined(); + expect(getByText('h6 tag')).toBeDefined(); + expect(container.querySelector('span')).toBeDefined(); + expect(getByText('span tag')).toBeDefined(); + expect(container.querySelector('strong')).toBeDefined(); + expect(getByText('strong tag')).toBeDefined(); + expect(container.querySelector('em')).toBeDefined(); + expect(getByText('em tag')).toBeDefined(); + expect(container.querySelector('li')).toBeDefined(); + expect(getByText('li tag')).toBeDefined(); + expect(container.querySelector('div')).toBeDefined(); + expect(getByText('div tag')).toBeDefined(); + expect(container.querySelector('dt')).toBeDefined(); + expect(getByText('dt tag')).toBeDefined(); + expect(container.querySelector('dd')).toBeDefined(); + expect(getByText('dd tag')).toBeDefined(); + }); +}); From 5a14a1a54a46f8b526f5463363ff8e09383e7e23 Mon Sep 17 00:00:00 2001 From: Etienne Dusseault Date: Wed, 24 Nov 2021 07:41:30 +0700 Subject: [PATCH 030/129] Add storybook render tests with CI integration (#12477) * add storybook unit tests with CI integration * fix command and fix casing for test * change ci ordering for storybook tasks * fix syntax error * fix jest * lint * Add transaction-total-banner render test to Storybook (#12517) * transaction-total-banner * lint * confirm to spec * lint * fix jest ocnfig for snapshot test failure --- .circleci/config.yml | 15 ++++++++++- jest.config.js | 4 +++ jest.stories.config.js | 26 +++++++++++++++++++ package.json | 1 + .../transaction-total-banner.stories.js | 4 ++- .../transaction-total-banner.stories.test.js | 11 ++++++++ .../ui/button/button.stories.test.js | 12 +++++++++ 7 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 jest.stories.config.js create mode 100644 ui/components/app/transaction-total-banner/transaction-total-banner.stories.test.js create mode 100644 ui/components/ui/button/button.stories.test.js diff --git a/.circleci/config.yml b/.circleci/config.yml index 3c1fcb727..44eec2cc8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -56,9 +56,12 @@ workflows: - prep-build-test-metrics: requires: - prep-deps - - prep-build-storybook: + - test-storybook: requires: - prep-deps + - prep-build-storybook: + requires: + - test-storybook - test-lint: requires: - prep-deps @@ -335,6 +338,16 @@ jobs: root: . paths: - storybook-build + + test-storybook: + executor: node-browsers + steps: + - checkout + - attach_workspace: + at: . + - run: + name: Test Storybook + command: yarn storybook:test test-yarn-dedupe: executor: node-browsers diff --git a/jest.config.js b/jest.config.js index 9f87eb4d9..3ca5957ee 100644 --- a/jest.config.js +++ b/jest.config.js @@ -23,4 +23,8 @@ module.exports = { '/app/scripts/platforms/*.test.js', ], testTimeout: 2500, + transform: { + '^.+\\.[tj]sx?$': 'babel-jest', + '^.+\\.mdx$': '@storybook/addon-docs/jest-transform-mdx', + }, }; diff --git a/jest.stories.config.js b/jest.stories.config.js new file mode 100644 index 000000000..5dae4af3f --- /dev/null +++ b/jest.stories.config.js @@ -0,0 +1,26 @@ +/* eslint-disable import/unambiguous */ +module.exports = { + collectCoverageFrom: ['/ui/**/*.js'], + coverageDirectory: './jest-coverage/main', + coveragePathIgnorePatterns: ['.stories.js', '.snap'], + coverageReporters: ['json', 'lcov', 'text', 'clover'], + coverageThreshold: { + global: { + branches: 35, + functions: 37, + lines: 43, + statements: 43, + }, + }, + // TODO: enable resetMocks + // resetMocks: true, + restoreMocks: true, + setupFiles: ['/test/setup.js', '/test/env.js'], + setupFilesAfterEnv: ['/test/jest/setup.js'], + testMatch: ['/ui/**/*stories.test.js'], + testTimeout: 2500, + transform: { + '^.+\\.[tj]sx?$': 'babel-jest', + '^.+\\.mdx$': '@storybook/addon-docs/jest-transform-mdx', + }, +}; diff --git a/package.json b/package.json index 3a63336b7..169762279 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "start:dev": "concurrently -k -n build,react,redux yarn:start yarn:devtools:react yarn:devtools:redux", "announce": "node development/announcer.js", "storybook": "start-storybook -p 6006 -c .storybook -s ./app,./.storybook/images", + "storybook:test": "jest --config=./jest.stories.config.js", "storybook:build": "build-storybook -c .storybook -o storybook-build -s ./app,./.storybook/images", "storybook:deploy": "storybook-to-ghpages --existing-output-dir storybook-build --remote storybook --branch master", "update-changelog": "auto-changelog update", diff --git a/ui/components/app/transaction-total-banner/transaction-total-banner.stories.js b/ui/components/app/transaction-total-banner/transaction-total-banner.stories.js index c8849c8cf..576a6a742 100644 --- a/ui/components/app/transaction-total-banner/transaction-total-banner.stories.js +++ b/ui/components/app/transaction-total-banner/transaction-total-banner.stories.js @@ -6,7 +6,7 @@ export default { id: __filename, }; -export const basic = () => { +export const DefaultStory = () => { return ( { /> ); }; + +DefaultStory.storyName = 'Default'; diff --git a/ui/components/app/transaction-total-banner/transaction-total-banner.stories.test.js b/ui/components/app/transaction-total-banner/transaction-total-banner.stories.test.js new file mode 100644 index 000000000..dbf59496a --- /dev/null +++ b/ui/components/app/transaction-total-banner/transaction-total-banner.stories.test.js @@ -0,0 +1,11 @@ +/* eslint-disable jest/require-top-level-describe */ +import React from 'react'; +import { render, screen } from '@testing-library/react'; + +import '@testing-library/jest-dom/extend-expect'; +import { DefaultStory } from './transaction-total-banner.stories'; + +it('renders transaction total banner stories with Base state', () => { + render(); + expect(screen.findByTestId('#popover-content')).toBeDefined(); +}); diff --git a/ui/components/ui/button/button.stories.test.js b/ui/components/ui/button/button.stories.test.js new file mode 100644 index 000000000..391285270 --- /dev/null +++ b/ui/components/ui/button/button.stories.test.js @@ -0,0 +1,12 @@ +/* eslint-disable jest/require-top-level-describe */ +import React from 'react'; + +import { render, screen } from '@testing-library/react'; + +import '@testing-library/jest-dom/extend-expect'; +import { DefaultStory } from './button.stories'; + +it('renders the button in the primary state', () => { + render(); + expect(screen.getByRole('button')).toHaveTextContent('Default'); +}); From fb27e170accd2519727fe48aa56400be646a2917 Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Wed, 24 Nov 2021 12:46:01 -0330 Subject: [PATCH 031/129] Bump @metmamask/logo to v3.1.1 (#12822) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 169762279..ab8514860 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ "@metamask/eth-token-tracker": "^3.0.1", "@metamask/etherscan-link": "^2.1.0", "@metamask/jazzicon": "^2.0.0", - "@metamask/logo": "^3.1.0", + "@metamask/logo": "^3.1.1", "@metamask/obs-store": "^5.0.0", "@metamask/post-message-stream": "^4.0.0", "@metamask/providers": "^8.1.1", diff --git a/yarn.lock b/yarn.lock index 6206bd7f6..36c6e0674 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2733,10 +2733,10 @@ color "^0.11.3" mersenne-twister "^1.1.0" -"@metamask/logo@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@metamask/logo/-/logo-3.1.0.tgz#6b7b9b90b6d846583558de855511d34796735855" - integrity sha512-W0FBwIaG1pC4Vk/ZdUJYv7PDjnAbQJro3yhEXN7WXEdz8kyVcxFb6dj0Dpe6ytaveYiqIL6+iDDWMevzU2MpVw== +"@metamask/logo@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@metamask/logo/-/logo-3.1.1.tgz#0a40bcfc462a70aa2110efc737767ca7ba188fa3" + integrity sha512-8/ObOWyBtwbe3/r9QbXMs+aKK2EgcYp2NiF4fm1xIO/c3aBMN5wBc2zUnl1lpHU71l70/OH5cxHbyDYoEgdMoA== dependencies: gl-mat4 "1.1.4" gl-vec3 "1.0.3" From 76098419024db119e3bd2c99e5feaa245de4e8f8 Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Wed, 24 Nov 2021 22:32:53 +0530 Subject: [PATCH 032/129] Confirm transaction page - onchain failure handling (#12743) --- app/_locales/en/messages.json | 19 ++++- ...onfirm-page-container-content.component.js | 12 +-- ...m-page-container-content.component.test.js | 6 +- .../app/edit-gas-fee-popover/index.scss | 2 +- .../network-status/network-status.js | 11 +-- .../network-status/network-status.test.js | 15 +--- .../transaction-detail-item.component.js | 2 +- .../app/transaction-detail/index.scss | 5 +- .../transaction-detail.component.js | 11 ++- .../transaction-detail.component.test.js | 58 +++++++++++--- .../actionable-message/actionable-message.js | 15 ++++ .../actionable-message.test.js | 25 ++++++ .../ui/actionable-message/index.scss | 20 +++-- ui/hooks/gasFeeInput/useGasFeeErrors.js | 1 + ui/hooks/gasFeeInput/useGasFeeErrors.test.js | 15 ++++ ui/hooks/gasFeeInput/useGasFeeInputs.js | 2 + .../confirm-transaction-base.component.js | 34 +++++--- .../gas-details-item/gas-details-item.js | 6 +- .../gas-details-item/gas-details-item.test.js | 45 +++++++++-- .../transaction-alerts/transaction-alerts.js | 80 +++++++++++++------ .../transaction-alerts.scss | 8 +- .../transaction-alerts.test.js | 4 +- 22 files changed, 295 insertions(+), 101 deletions(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index af0f3b190..85ac17bf0 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1382,7 +1382,8 @@ "message": "Want to $1 about gas?" }, "learnCancelSpeeedup": { - "message": "Learn how to $1" + "message": "Learn how to $1", + "description": "$1 is link to cancel or speed up transactions" }, "learnMore": { "message": "learn more" @@ -1969,12 +1970,16 @@ "pending": { "message": "Pending" }, - "pendingTransaction": { - "message": "You have ($1) pending transaction(s)." - }, "pendingTransactionInfo": { "message": "This transaction will not process until that one is complete." }, + "pendingTransactionMultiple": { + "message": "You have ($1) pending transactions." + }, + "pendingTransactionSingle": { + "message": "You have (1) pending transaction.", + "description": "$1 is count of pending transactions" + }, "permissionCheckedIconDescription": { "message": "You have approved this permission" }, @@ -2020,6 +2025,9 @@ "privateNetwork": { "message": "Private Network" }, + "proceedWithTransaction": { + "message": "I want to proceed anyway" + }, "proposedApprovalLimit": { "message": "Proposed Approval Limit" }, @@ -2407,6 +2415,9 @@ "simulationErrorMessage": { "message": "This transaction is expected to fail. Trying to execute it is expected to be expensive but fail, and is not recommended." }, + "simulationErrorMessageV2": { + "message": "We were not able to estimate gas. There might be an error in the contract and this transaction may fail." + }, "skip": { "message": "Skip" }, diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js index 6a9737b14..8e4da74b9 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js @@ -36,10 +36,10 @@ export default class ConfirmPageContainerContent extends Component { onCancel: PropTypes.func, cancelText: PropTypes.string, onSubmit: PropTypes.func, - onConfirmAnyways: PropTypes.func, + setUserAcknowledgedGasMissing: PropTypes.func, submitText: PropTypes.string, disabled: PropTypes.bool, - hideConfirmAnyways: PropTypes.bool, + hideUserAcknowledgedGasMissing: PropTypes.bool, unapprovedTxCount: PropTypes.number, rejectNText: PropTypes.string, hideTitle: PropTypes.boolean, @@ -99,15 +99,15 @@ export default class ConfirmPageContainerContent extends Component { origin, ethGasPriceWarning, hideTitle, - onConfirmAnyways, - hideConfirmAnyways, + setUserAcknowledgedGasMissing, + hideUserAcknowledgedGasMissing, } = this.props; - const primaryAction = hideConfirmAnyways + const primaryAction = hideUserAcknowledgedGasMissing ? null : { label: this.context.t('tryAnywayOption'), - onClick: onConfirmAnyways, + onClick: setUserAcknowledgedGasMissing, }; return ( diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.test.js b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.test.js index edd7f7bd5..1665490f0 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.test.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.test.js @@ -22,7 +22,7 @@ describe('Confirm Page Container Content', () => { const mockOnCancel = jest.fn(); const mockOnCancelAll = jest.fn(); const mockOnSubmit = jest.fn(); - const mockOnConfirmAnyways = jest.fn(); + const mockSetUserAcknowledgedGasMissing = jest.fn(); props = { action: ' Withdraw Stake', errorMessage: null, @@ -32,7 +32,7 @@ describe('Confirm Page Container Content', () => { onCancel: mockOnCancel, cancelText: 'Reject', onSubmit: mockOnSubmit, - onConfirmAnyways: mockOnConfirmAnyways, + setUserAcknowledgedGasMissing: mockSetUserAcknowledgedGasMissing, submitText: 'Confirm', disabled: true, origin: 'http://localhost:4200', @@ -63,7 +63,7 @@ describe('Confirm Page Container Content', () => { const iWillTryButton = getByText('I will try anyway'); fireEvent.click(iWillTryButton); - expect(props.onConfirmAnyways).toHaveBeenCalledTimes(1); + expect(props.setUserAcknowledgedGasMissing).toHaveBeenCalledTimes(1); const cancelButton = getByText('Reject'); fireEvent.click(cancelButton); diff --git a/ui/components/app/edit-gas-fee-popover/index.scss b/ui/components/app/edit-gas-fee-popover/index.scss index df7e2a4e9..581cb5f6b 100644 --- a/ui/components/app/edit-gas-fee-popover/index.scss +++ b/ui/components/app/edit-gas-fee-popover/index.scss @@ -1,5 +1,5 @@ .edit-gas-fee-popover { - height: 540px; + height: 500px; &__wrapper { border-top: 1px solid $ui-grey; diff --git a/ui/components/app/edit-gas-fee-popover/network-status/network-status.js b/ui/components/app/edit-gas-fee-popover/network-status/network-status.js index ca6a3ccff..bd102f81e 100644 --- a/ui/components/app/edit-gas-fee-popover/network-status/network-status.js +++ b/ui/components/app/edit-gas-fee-popover/network-status/network-status.js @@ -1,6 +1,5 @@ import React from 'react'; -import { toBigNumber } from '../../../../../shared/modules/conversion.utils'; import { COLORS } from '../../../../helpers/constants/design-system'; import { useGasFeeContext } from '../../../../contexts/gasFee'; import I18nValue from '../../../ui/i18n-value'; @@ -10,13 +9,6 @@ import StatusSlider from './status-slider'; const NetworkStatus = () => { const { gasFeeEstimates } = useGasFeeContext(); - let estBaseFee = null; - if (gasFeeEstimates?.estimatedBaseFee) { - // estimatedBaseFee is not likely to be below 1, value .01 is used as test networks sometimes - // show have small values for it and more decimal places may cause UI to look broken. - estBaseFee = toBigNumber.dec(gasFeeEstimates?.estimatedBaseFee); - estBaseFee = estBaseFee.lessThan(0.01) ? 0.01 : estBaseFee.toFixed(2); - } return (
@@ -32,7 +24,8 @@ const NetworkStatus = () => {
- {estBaseFee !== null && `${estBaseFee} GWEI`} + {gasFeeEstimates?.estimatedBaseFee && + `${gasFeeEstimates?.estimatedBaseFee} GWEI`} Base fee
diff --git a/ui/components/app/edit-gas-fee-popover/network-status/network-status.test.js b/ui/components/app/edit-gas-fee-popover/network-status/network-status.test.js index df5e30411..7981b5a72 100644 --- a/ui/components/app/edit-gas-fee-popover/network-status/network-status.test.js +++ b/ui/components/app/edit-gas-fee-popover/network-status/network-status.test.js @@ -57,21 +57,10 @@ describe('NetworkStatus', () => { expect(screen.queryByText('Priority fee')).toBeInTheDocument(); }); - it('should renders current base fee value rounded to 2 decimal places', () => { + it('should renders current base fee value', () => { renderComponent(); expect( - screen.queryByText( - `${parseFloat(MOCK_FEE_ESTIMATE.estimatedBaseFee).toFixed(2)} GWEI`, - ), + screen.queryByText(`${MOCK_FEE_ESTIMATE.estimatedBaseFee} GWEI`), ).toBeInTheDocument(); }); - - it('should .01 as estimates base fee if estimated base fee is < .01', () => { - renderComponent({ - gasFeeEstimates: { - estimatedBaseFee: '0.0012', - }, - }); - expect(screen.queryByText('0.01 GWEI')).toBeInTheDocument(); - }); }); diff --git a/ui/components/app/transaction-detail-item/transaction-detail-item.component.js b/ui/components/app/transaction-detail-item/transaction-detail-item.component.js index 9780402ff..463f52ade 100644 --- a/ui/components/app/transaction-detail-item/transaction-detail-item.component.js +++ b/ui/components/app/transaction-detail-item/transaction-detail-item.component.js @@ -36,7 +36,7 @@ export default function TransactionDetailItem({ color={COLORS.BLACK} fontWeight={FONT_WEIGHT.BOLD} variant={TYPOGRAPHY.H6} - margin={[1, 1]} + margin={[1, 0, 1, 1]} > {detailTotal} diff --git a/ui/components/app/transaction-detail/index.scss b/ui/components/app/transaction-detail/index.scss index 35bcf27c9..a24bd4ede 100644 --- a/ui/components/app/transaction-detail/index.scss +++ b/ui/components/app/transaction-detail/index.scss @@ -17,7 +17,6 @@ } &-edit-V2 { - margin-bottom: 10px; display: flex; align-items: baseline; justify-content: flex-end; @@ -66,4 +65,8 @@ } } } + + &-rows { + margin-top: 10px; + } } diff --git a/ui/components/app/transaction-detail/transaction-detail.component.js b/ui/components/app/transaction-detail/transaction-detail.component.js index 815861228..e03d3f50f 100644 --- a/ui/components/app/transaction-detail/transaction-detail.component.js +++ b/ui/components/app/transaction-detail/transaction-detail.component.js @@ -11,13 +11,18 @@ import { COLORS } from '../../../helpers/constants/design-system'; import { PRIORITY_LEVEL_ICON_MAP } from '../../../helpers/constants/gas'; import { useI18nContext } from '../../../hooks/useI18nContext'; -export default function TransactionDetail({ rows = [], onEdit }) { +export default function TransactionDetail({ + rows = [], + onEdit, + userAcknowledgedGasMissing, +}) { // eslint-disable-next-line prefer-destructuring const EIP_1559_V2 = process.env.EIP_1559_V2; const t = useI18nContext(); const { gasLimit, + hasSimulationError, estimateUsed, maxFeePerGas, maxPriorityFeePerGas, @@ -26,6 +31,9 @@ export default function TransactionDetail({ rows = [], onEdit }) { const { openModal } = useTransactionModalContext(); if (EIP_1559_V2 && estimateUsed) { + const editEnabled = !hasSimulationError || userAcknowledgedGasMissing; + if (!editEnabled) return null; + return (
@@ -88,4 +96,5 @@ export default function TransactionDetail({ rows = [], onEdit }) { TransactionDetail.propTypes = { rows: PropTypes.arrayOf(TransactionDetailItem).isRequired, onEdit: PropTypes.func, + userAcknowledgedGasMissing: PropTypes.bool.isRequired, }; diff --git a/ui/components/app/transaction-detail/transaction-detail.component.test.js b/ui/components/app/transaction-detail/transaction-detail.component.test.js index a95cf1565..635ba7133 100644 --- a/ui/components/app/transaction-detail/transaction-detail.component.test.js +++ b/ui/components/app/transaction-detail/transaction-detail.component.test.js @@ -16,7 +16,7 @@ jest.mock('../../../store/actions', () => ({ addPollingTokenToAppState: jest.fn(), })); -const render = (props) => { +const render = ({ componentProps, contextProps } = {}) => { const store = configureStore({ metamask: { nativeCurrency: ETH, @@ -37,13 +37,13 @@ const render = (props) => { }); return renderWithProvider( - + { console.log('on edit'); }} rows={[]} - {...props} + {...componentProps} /> , store, @@ -54,41 +54,79 @@ describe('TransactionDetail', () => { beforeEach(() => { process.env.EIP_1559_V2 = true; }); + afterEach(() => { process.env.EIP_1559_V2 = false; }); + it('should render edit link with text low if low gas estimates are selected', () => { - render({ transaction: { userFeeLevel: 'low' } }); + render({ contextProps: { transaction: { userFeeLevel: 'low' } } }); expect(screen.queryByText('🐢')).toBeInTheDocument(); expect(screen.queryByText('Low')).toBeInTheDocument(); }); + it('should render edit link with text markey if medium gas estimates are selected', () => { - render({ transaction: { userFeeLevel: 'medium' } }); + render({ contextProps: { transaction: { userFeeLevel: 'medium' } } }); expect(screen.queryByText('🦊')).toBeInTheDocument(); expect(screen.queryByText('Market')).toBeInTheDocument(); }); + it('should render edit link with text agressive if high gas estimates are selected', () => { - render({ transaction: { userFeeLevel: 'high' } }); + render({ contextProps: { transaction: { userFeeLevel: 'high' } } }); expect(screen.queryByText('🦍')).toBeInTheDocument(); expect(screen.queryByText('Aggressive')).toBeInTheDocument(); }); + it('should render edit link with text Site suggested if site suggested estimated are used', () => { render({ - transaction: { - dappSuggestedGasFees: { maxFeePerGas: 1, maxPriorityFeePerGas: 1 }, - txParams: { maxFeePerGas: 1, maxPriorityFeePerGas: 1 }, + contextProps: { + transaction: { + dappSuggestedGasFees: { maxFeePerGas: 1, maxPriorityFeePerGas: 1 }, + txParams: { maxFeePerGas: 1, maxPriorityFeePerGas: 1 }, + }, }, }); expect(screen.queryByText('🌐')).toBeInTheDocument(); expect(screen.queryByText('Site suggested')).toBeInTheDocument(); expect(document.getElementsByClassName('info-tooltip')).toHaveLength(1); }); + it('should render edit link with text advance if custom gas estimates are used', () => { render({ - defaultEstimateToUse: 'custom', + contextProps: { + defaultEstimateToUse: 'custom', + }, }); expect(screen.queryByText('⚙')).toBeInTheDocument(); expect(screen.queryByText('Advanced')).toBeInTheDocument(); expect(screen.queryByText('Edit')).toBeInTheDocument(); }); + + it('should not render edit link if transaction has simulation error and prop userAcknowledgedGasMissing is false', () => { + render({ + contextProps: { + transaction: { + simulationFails: true, + userFeeLevel: 'low', + }, + }, + componentProps: { userAcknowledgedGasMissing: false }, + }); + expect(screen.queryByRole('button')).not.toBeInTheDocument(); + expect(screen.queryByText('Low')).not.toBeInTheDocument(); + }); + + it('should render edit link if userAcknowledgedGasMissing is true even if transaction has simulation error', () => { + render({ + contextProps: { + transaction: { + simulationFails: true, + userFeeLevel: 'low', + }, + }, + componentProps: { userAcknowledgedGasMissing: true }, + }); + expect(screen.queryByRole('button')).toBeInTheDocument(); + expect(screen.queryByText('Low')).toBeInTheDocument(); + }); }); diff --git a/ui/components/ui/actionable-message/actionable-message.js b/ui/components/ui/actionable-message/actionable-message.js index 9e4f4728c..ccae2b676 100644 --- a/ui/components/ui/actionable-message/actionable-message.js +++ b/ui/components/ui/actionable-message/actionable-message.js @@ -19,6 +19,7 @@ const typeHash = { export default function ActionableMessage({ message = '', primaryAction = null, + primaryActionV2 = null, secondaryAction = null, className = '', infoTooltipText = '', @@ -50,6 +51,14 @@ export default function ActionableMessage({ /> )}
{message}
+ {primaryActionV2 && ( + + )} {(primaryAction || secondaryAction) && (
{ expect(getByText(props.message)).toBeInTheDocument(); expect(container).toMatchSnapshot(); }); + + it('renders button for primaryActionV2 prop', () => { + const props = createProps(); + const { getByRole } = renderWithProvider( + , + ); + expect(getByRole('button')).toBeInTheDocument(); + }); + + it('renders primaryActionV2.onClick is callen when primaryActionV2 button is clicked', () => { + const props = createProps(); + const onClick = jest.fn(); + const { getByRole } = renderWithProvider( + , + ); + fireEvent.click(getByRole('button')); + expect(onClick).toHaveBeenCalledTimes(1); + }); }); diff --git a/ui/components/ui/actionable-message/index.scss b/ui/components/ui/actionable-message/index.scss index 30a18c33d..217a8be90 100644 --- a/ui/components/ui/actionable-message/index.scss +++ b/ui/components/ui/actionable-message/index.scss @@ -54,6 +54,21 @@ &--rounded { border-radius: 8px; } + + &-danger { + background: $Red-500; + color: #fff; + } + } + + &__action-v2 { + color: $primary-1; + background: none; + border: none; + font-size: 12px; + align-self: baseline; + padding: 0; + margin-top: 12px; } &__info-tooltip-wrapper { @@ -86,11 +101,6 @@ color: $Black-100; text-align: left; } - - button { - background: $Red-500; - color: #fff; - } } &--info { diff --git a/ui/hooks/gasFeeInput/useGasFeeErrors.js b/ui/hooks/gasFeeInput/useGasFeeErrors.js index 0300feec0..213b66b2d 100644 --- a/ui/hooks/gasFeeInput/useGasFeeErrors.js +++ b/ui/hooks/gasFeeInput/useGasFeeErrors.js @@ -262,5 +262,6 @@ export function useGasFeeErrors({ gasWarnings, balanceError, estimatesUnavailableWarning, + hasSimulationError: Boolean(transaction?.simulationFails), }; } diff --git a/ui/hooks/gasFeeInput/useGasFeeErrors.test.js b/ui/hooks/gasFeeInput/useGasFeeErrors.test.js index 44573dd9f..b40ebc918 100644 --- a/ui/hooks/gasFeeInput/useGasFeeErrors.test.js +++ b/ui/hooks/gasFeeInput/useGasFeeErrors.test.js @@ -280,6 +280,21 @@ describe('useGasFeeErrors', () => { }); }); + describe('Simulation Error', () => { + it('is false if transaction has falsy values for simulationFails', () => { + configureEIP1559(); + const { result } = renderUseGasFeeErrorsHook(); + expect(result.current.hasSimulationError).toBe(false); + }); + it('is true if transaction.simulationFails is true', () => { + configureEIP1559(); + const { result } = renderUseGasFeeErrorsHook({ + transaction: { simulationFails: true }, + }); + expect(result.current.hasSimulationError).toBe(true); + }); + }); + describe('estimatesUnavailableWarning', () => { it('is false if supportsEIP1559 and gasEstimateType is fee-market', () => { configureEIP1559(); diff --git a/ui/hooks/gasFeeInput/useGasFeeInputs.js b/ui/hooks/gasFeeInput/useGasFeeInputs.js index f65897c71..2d3a4747d 100644 --- a/ui/hooks/gasFeeInput/useGasFeeInputs.js +++ b/ui/hooks/gasFeeInput/useGasFeeInputs.js @@ -186,6 +186,7 @@ export function useGasFeeInputs( gasErrors, gasWarnings, hasGasErrors, + hasSimulationError, } = useGasFeeErrors({ gasEstimateType, gasFeeEstimates, @@ -301,6 +302,7 @@ export function useGasFeeInputs( gasErrors, gasWarnings, hasGasErrors, + hasSimulationError, supportsEIP1559, updateTransactionUsingGasFeeEstimates, }; diff --git a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js index 5c54ffad9..8ac11d31f 100644 --- a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js +++ b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js @@ -145,7 +145,7 @@ export default class ConfirmTransactionBase extends Component { submitWarning: '', ethGasPriceWarning: '', editingGas: false, - confirmAnyways: false, + userAcknowledgedGasMissing: false, }; componentDidUpdate(prevProps) { @@ -290,8 +290,8 @@ export default class ConfirmTransactionBase extends Component { this.setState({ editingGas: false }); } - handleConfirmAnyways() { - this.setState({ confirmAnyways: true }); + setUserAcknowledgedGasMissing() { + this.setState({ userAcknowledgedGasMissing: true }); } renderDetails() { @@ -318,15 +318,16 @@ export default class ConfirmTransactionBase extends Component { nativeCurrency, } = this.props; const { t } = this.context; + const { userAcknowledgedGasMissing } = this.state; const { valid } = this.getErrorKey(); const isDisabled = () => { - return this.state.confirmAnyways ? false : !valid; + return userAcknowledgedGasMissing ? false : !valid; }; const hasSimulationError = Boolean(txData.simulationFails); const renderSimulationFailureWarning = - hasSimulationError && !this.state.confirmAnyways; + hasSimulationError && !userAcknowledgedGasMissing; const renderTotalMaxAmount = () => { if ( @@ -432,6 +433,7 @@ export default class ConfirmTransactionBase extends Component { useNativeCurrencyAsPrimaryCurrency={ useNativeCurrencyAsPrimaryCurrency } + userAcknowledgedGasMissing={userAcknowledgedGasMissing} /> ) : ( this.handleConfirmAnyways(), + onClick: () => this.setUserAcknowledgedGasMissing(), }} message={this.context.t('simulationErrorMessage')} roundedButtons @@ -569,9 +571,17 @@ export default class ConfirmTransactionBase extends Component { return (
- {EIP_1559_V2 && } + {EIP_1559_V2 && ( + + this.setUserAcknowledgedGasMissing() + } + userAcknowledgedGasMissing={userAcknowledgedGasMissing} + /> + )} this.handleEditGas() } @@ -946,14 +956,14 @@ export default class ConfirmTransactionBase extends Component { submitWarning, ethGasPriceWarning, editingGas, - confirmAnyways, + userAcknowledgedGasMissing, } = this.state; const { name } = methodData; const { valid, errorKey } = this.getErrorKey(); const hasSimulationError = Boolean(txData.simulationFails); const renderSimulationFailureWarning = - hasSimulationError && !confirmAnyways; + hasSimulationError && !userAcknowledgedGasMissing; const { totalTx, positionOfCurrentTx, @@ -967,7 +977,7 @@ export default class ConfirmTransactionBase extends Component { } = this.getNavigateTxData(); const isDisabled = () => { - return confirmAnyways ? false : !valid; + return userAcknowledgedGasMissing ? false : !valid; }; let functionType = getMethodName(name); @@ -1017,7 +1027,7 @@ export default class ConfirmTransactionBase extends Component { lastTx={lastTx} ofText={ofText} requestsWaitingText={requestsWaitingText} - hideConfirmAnyways={!isDisabled()} + hideUserAcknowledgedGasMissing={!isDisabled()} disabled={ renderSimulationFailureWarning || !valid || @@ -1029,7 +1039,7 @@ export default class ConfirmTransactionBase extends Component { onCancelAll={() => this.handleCancelAll()} onCancel={() => this.handleCancel()} onSubmit={() => this.handleSubmit()} - onConfirmAnyways={() => this.handleConfirmAnyways()} + setUserAcknowledgedGasMissing={this.setUserAcknowledgedGasMissing} hideSenderToRecipient={hideSenderToRecipient} origin={txData.origin} ethGasPriceWarning={ethGasPriceWarning} diff --git a/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.js b/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.js index 86fa32f4c..d220cf683 100644 --- a/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.js +++ b/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.js @@ -26,11 +26,14 @@ const GasDetailsItem = ({ isMainnet, maxFeePerGas, maxPriorityFeePerGas, + userAcknowledgedGasMissing, txData, useNativeCurrencyAsPrimaryCurrency, }) => { const t = useI18nContext(); - const { estimateUsed } = useGasFeeContext(); + const { estimateUsed, hasSimulationError } = useGasFeeContext(); + + if (hasSimulationError && !userAcknowledgedGasMissing) return null; return ( ({ getGasFeeTimeEstimate: jest.fn().mockImplementation(() => Promise.resolve()), })); -const render = (props) => { +const render = ({ componentProps, contextProps } = {}) => { const store = configureStore({ metamask: { nativeCurrency: ETH, @@ -37,8 +37,12 @@ const render = (props) => { }); return renderWithProvider( - - + + , store, ); @@ -56,16 +60,47 @@ describe('GasDetailsItem', () => { }); it('should show warning icon if estimates are high', async () => { - render({ defaultEstimateToUse: 'high' }); + render({ contextProps: { defaultEstimateToUse: 'high' } }); await waitFor(() => { expect(screen.queryByText('⚠ Max fee:')).toBeInTheDocument(); }); }); it('should not show warning icon if estimates are not high', async () => { - render({ defaultEstimateToUse: 'low' }); + render({ contextProps: { defaultEstimateToUse: 'low' } }); await waitFor(() => { expect(screen.queryByText('Max fee:')).toBeInTheDocument(); }); }); + + it('should return null if there is simulationError and user has not acknowledged gasMissing warning', () => { + const { container } = render({ + contextProps: { + defaultEstimateToUse: 'low', + transaction: { simulationFails: true }, + }, + }); + expect(container.innerHTML).toHaveLength(0); + }); + + it('should not return null even if there is simulationError if user acknowledged gasMissing warning', async () => { + render(); + await waitFor(() => { + expect(screen.queryByText('Gas')).toBeInTheDocument(); + }); + }); + + it('should should render gas fee details', async () => { + render({ + componentProps: { + hexMinimumTransactionFee: '0x1ca62a4f7800', + hexMaximumTransactionFee: '0x290ee75e3d900', + }, + }); + await waitFor(() => { + expect(screen.queryByTitle('0.0000315 ETH')).toBeInTheDocument(); + expect(screen.queryByText('ETH')).toBeInTheDocument(); + expect(screen.queryByTitle('0.0007223')).toBeInTheDocument(); + }); + }); }); diff --git a/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.js b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.js index 7fe861e1e..30061deaf 100644 --- a/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.js +++ b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.js @@ -1,26 +1,59 @@ import React from 'react'; +import PropTypes from 'prop-types'; import { useSelector } from 'react-redux'; +import { PRIORITY_LEVELS } from '../../../../shared/constants/gas'; import { INSUFFICIENT_FUNDS_ERROR_KEY } from '../../../helpers/constants/error-keys'; import { submittedPendingTransactionsSelector } from '../../../selectors/transactions'; import { useGasFeeContext } from '../../../contexts/gasFee'; +import { useI18nContext } from '../../../hooks/useI18nContext'; import ActionableMessage from '../../../components/ui/actionable-message/actionable-message'; import ErrorMessage from '../../../components/ui/error-message'; import I18nValue from '../../../components/ui/i18n-value'; +import Typography from '../../../components/ui/typography'; -const TransactionAlerts = () => { - const { balanceError, estimateUsed } = useGasFeeContext(); +const TransactionAlerts = ({ + userAcknowledgedGasMissing, + setUserAcknowledgedGasMissing, +}) => { + const { balanceError, estimateUsed, hasSimulationError } = useGasFeeContext(); const pendingTransactions = useSelector(submittedPendingTransactionsSelector); + const t = useI18nContext(); return (
+ {hasSimulationError && ( + } + useIcon + iconFillColor="#d73a49" + type="danger" + primaryActionV2={ + userAcknowledgedGasMissing === true + ? undefined + : { + label: t('proceedWithTransaction'), + onClick: setUserAcknowledgedGasMissing, + } + } + /> + )} {pendingTransactions?.length > 0 && ( + {' '} @@ -38,36 +71,33 @@ const TransactionAlerts = () => { , ]} /> -
+ } useIcon iconFillColor="#f8c000" type="warning" /> )} - {balanceError && ( - <> - {pendingTransactions?.length > 0 && ( -
- )} - - - )} - {estimateUsed === 'low' && ( - <> - {balanceError && ( -
- )} - } - useIcon - iconFillColor="#f8c000" - type="warning" - /> - + {balanceError && } + {estimateUsed === PRIORITY_LEVELS.LOW && ( + + + + } + useIcon + iconFillColor="#f8c000" + type="warning" + /> )}
); }; +TransactionAlerts.propTypes = { + userAcknowledgedGasMissing: PropTypes.bool, + setUserAcknowledgedGasMissing: PropTypes.func, +}; + export default TransactionAlerts; diff --git a/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.scss b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.scss index 074a0cc83..df6974e99 100644 --- a/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.scss +++ b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.scss @@ -1,7 +1,11 @@ .transaction-alerts { - margin-top: 20px; + text-align: left; - &--separator { + & > *:first-of-type { + margin-top: 20px; + } + + & > *:not(:first-of-type) { margin-top: 12px; } diff --git a/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.test.js b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.test.js index 25fad1301..f9aa69d95 100644 --- a/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.test.js +++ b/ui/pages/confirm-transaction-base/transaction-alerts/transaction-alerts.test.js @@ -17,7 +17,7 @@ jest.mock('../../../store/actions', () => ({ addPollingTokenToAppState: jest.fn(), })); -const render = ({ props, state }) => { +const render = ({ props, state } = {}) => { const store = configureStore({ metamask: { nativeCurrency: ETH, @@ -95,7 +95,7 @@ describe('TransactionAlerts', () => { }, }); expect( - screen.queryByText('You have (1) pending transaction(s).'), + screen.queryByText('You have (1) pending transaction.'), ).toBeInTheDocument(); }); }); From 7929a92c6696a2b970c4cf1610b1804f7466587c Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Wed, 24 Nov 2021 13:39:12 -0330 Subject: [PATCH 033/129] Clear the clipboard after the seed phrase is pasted (#12828) * Clear the clipboard after the seed phrase is pasted On the "Import" page of the import onboarding flow, we now clear the clipboard after the secret recovery phrase is pasted. This ensures that the SRP isn't accidentally pasted somewhere else by the user, which can be an easy and disastrous mistake to make. * Clear clipboard during new onboarding flow as well --- ui/components/ui/text-field/text-field.component.js | 12 ++++++++++++ ui/helpers/utils/util.js | 4 ++++ .../import-with-seed-phrase.component.js | 3 +++ ui/pages/onboarding-flow/import-srp/import-srp.js | 2 ++ 4 files changed, 21 insertions(+) diff --git a/ui/components/ui/text-field/text-field.component.js b/ui/components/ui/text-field/text-field.component.js index a9a212d16..ba9fa28b0 100644 --- a/ui/components/ui/text-field/text-field.component.js +++ b/ui/components/ui/text-field/text-field.component.js @@ -203,6 +203,7 @@ const TextField = ({ min, max, autoComplete, + onPaste, ...textFieldProps }) => { const inputProps = themeToInputProps[theme]({ @@ -215,6 +216,16 @@ const TextField = ({ autoComplete, }); + if (onPaste) { + if (!inputProps.InputProps) { + inputProps.InputProps = {}; + } + if (!inputProps.InputProps.inputProps) { + inputProps.InputProps.inputProps = {}; + } + inputProps.InputProps.inputProps.onPaste = onPaste; + } + return ( { } return t('gasTimingHoursShort', [Math.ceil(seconds / 3600)]); }; + +export function clearClipboard() { + window.navigator.clipboard.writeText(''); +} diff --git a/ui/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js b/ui/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js index 7522899c6..a7259bf9b 100644 --- a/ui/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js +++ b/ui/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js @@ -7,6 +7,7 @@ import { INITIALIZE_SELECT_ACTION_ROUTE, INITIALIZE_END_OF_FLOW_ROUTE, } from '../../../../helpers/constants/routes'; +import { clearClipboard } from '../../../../helpers/utils/util'; const { isValidMnemonic } = ethers.utils; @@ -244,6 +245,7 @@ export default class ImportWithSeedPhrase extends PureComponent { + + ); +}; + +DefaultStory.storyName = 'Default'; + +DefaultStory.args = { + value: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod temporld, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod temporld, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod temporld', + resize: RESIZE.BOTH, + scrollable: false, + boxProps: { + borderColor: COLORS.UI3, + borderRadius: SIZES.SM, + borderStyle: BORDER_STYLE.SOLID, + padding: [2, 4], + }, + height: 'auto', +}; + +export const Scrollable = (args) => { + const [{ value }, updateArgs] = useArgs(); + + const handleOnChange = (e) => { + updateArgs({ + value: e.target.value, + }); + }; + return ( +
+ +
+ ); +}; + +Scrollable.args = { + value: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod temporld, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod temporld, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod temporld. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod temporld, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod temporld, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod temporld', + resize: RESIZE.NONE, + scrollable: true, + height: 170, + boxProps: { + borderColor: COLORS.TRANSPARENT, + borderRadius: SIZES.NONE, + borderStyle: BORDER_STYLE.NONE, + padding: [2, 4], + width: BLOCK_SIZES.FULL, + }, +}; diff --git a/ui/components/ui/textarea/textarea.test.js b/ui/components/ui/textarea/textarea.test.js new file mode 100644 index 000000000..e1e5b61d5 --- /dev/null +++ b/ui/components/ui/textarea/textarea.test.js @@ -0,0 +1,105 @@ +import * as React from 'react'; +import { render, fireEvent } from '@testing-library/react'; +import { + COLORS, + RESIZE, + SIZES, + BORDER_STYLE, +} from '../../../helpers/constants/design-system'; +import TextArea from '.'; + +describe('TextArea', () => { + const text = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod temporld, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod temporld, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod temporld'; + const onChange = jest.fn(); + let args; + beforeEach(() => { + args = { + name: 'Text area', + value: text, + resize: RESIZE.BOTH, + scrollable: false, + boxProps: { + borderColor: COLORS.UI3, + borderRadius: SIZES.SM, + borderStyle: BORDER_STYLE.SOLID, + padding: [2, 4], + }, + height: '100px', + onChange, + }; + }); + it('should render the TextArea component without crashing', () => { + const { getByText } = render(