diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9cba34fc47..59cbe5f312 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -41,7 +41,7 @@ jobs: - name: Comment in failing tests uses: mattallty/jest-github-action@v1.0.3 - if: success() || failure() + if: failure() env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/package.json b/package.json index 480cf997ae..22447eddfb 100644 --- a/package.json +++ b/package.json @@ -170,7 +170,7 @@ "@gnosis.pm/safe-core-sdk": "^1.1.1", "@gnosis.pm/safe-deployments": "^1.5.0", "@gnosis.pm/safe-react-components": "^0.9.0", - "@gnosis.pm/safe-react-gateway-sdk": "^2.7.4", + "@gnosis.pm/safe-react-gateway-sdk": "2.7.5", "@ledgerhq/hw-transport-node-hid-singleton": "6.20.0", "@material-ui/core": "^4.12.3", "@material-ui/icons": "^4.11.0", diff --git a/src/components/DecodeTxs/index.tsx b/src/components/DecodeTxs/index.tsx index e20f049199..cb7037c940 100644 --- a/src/components/DecodeTxs/index.tsx +++ b/src/components/DecodeTxs/index.tsx @@ -1,12 +1,16 @@ import { ReactElement } from 'react' import styled from 'styled-components' import { Transaction } from '@gnosis.pm/safe-apps-sdk-v1' +import { + DecodedDataResponse, + DecodedDataBasicParameter, + DecodedDataParameterValue, +} from '@gnosis.pm/safe-react-gateway-sdk' import get from 'lodash/get' import { Text, CopyToClipboardBtn, IconText, FixedIcon } from '@gnosis.pm/safe-react-components' import { hexToBytes } from 'web3-utils' import { getExplorerInfo, getNativeCurrency } from 'src/config' -import { DecodedData, DecodedDataBasicParameter, DecodedDataParameterValue } from 'src/types/transactions/decode.d' import { DecodedTxDetail } from 'src/routes/safe/components/Apps/components/ConfirmTxModal' import PrefixedEthHashInfo from '../PrefixedEthHashInfo' @@ -156,8 +160,8 @@ const SingleTx = ({ decodedData, onTxItemClick, }: { - decodedData: DecodedData | null - onTxItemClick: (decodedTxDetails: DecodedData) => void + decodedData: DecodedDataResponse | null + onTxItemClick: (decodedTxDetails: DecodedDataResponse) => void }): ReactElement | null => { if (!decodedData) { return null @@ -181,7 +185,7 @@ const MultiSendTx = ({ decodedData, onTxItemClick, }: { - decodedData: DecodedData | null + decodedData: DecodedDataResponse | null onTxItemClick: (decodedTxDetails: DecodedDataParameterValue) => void }): ReactElement | null => { const txs: DecodedDataParameterValue[] | undefined = get(decodedData, 'parameters[0].valueDecoded') @@ -208,7 +212,7 @@ const MultiSendTx = ({ type Props = { txs: Transaction[] - decodedData: DecodedData | null + decodedData: DecodedDataResponse | null onTxItemClick: (decodedTxDetails: DecodedTxDetail) => void } diff --git a/src/config/index.ts b/src/config/index.ts index 40f7903ce3..636209521d 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -8,6 +8,7 @@ import { } from '@gnosis.pm/safe-react-gateway-sdk' import { + GATEWAY_URL, DEFAULT_CHAIN_ID, ETHERSCAN_API_KEY, INFURA_TOKEN, @@ -89,7 +90,6 @@ export const getGasPriceOracles = (): Extract { return gasPrice.type === GAS_PRICE_TYPE.ORACLE } - return getChainInfo().gasPrice.filter(isOracleType) } @@ -100,24 +100,13 @@ export const getFixedGasPrice = (): Extract { const { transactionService } = getChainInfo() // To avoid breaking changes, we define the version the web uses manually return `${transactionService}/api/v${TX_SERVICE_VERSION}` } -export const getTokensServiceUrl = (): string => { - return `${getTxServiceUrl()}/tokens` -} - -export const getMasterCopiesUrl = (): string => { - return `${getTxServiceUrl()}/about/master-copies/` -} - -export const getDataDecoderUrl = (): string => { - return `${getTxServiceUrl()}/data-decoder/` -} - export const getDisabledWallets = (): ChainInfo['disabledWallets'] => { return getChainInfo().disabledWallets } diff --git a/src/logic/collectibles/sources/Gnosis.ts b/src/logic/collectibles/sources/Gnosis.ts index bceab7a2b6..c0f957103e 100644 --- a/src/logic/collectibles/sources/Gnosis.ts +++ b/src/logic/collectibles/sources/Gnosis.ts @@ -3,10 +3,18 @@ import { SafeCollectibleResponse, TokenType } from '@gnosis.pm/safe-react-gatewa import { Collectibles, NFTAsset, NFTAssets, NFTTokens } from 'src/logic/collectibles/sources/collectibles.d' import { sameAddress } from 'src/logic/wallets/ethAddresses' import NFTIcon from 'src/routes/safe/components/Balances/assets/nft_icon.png' -import { fetchSafeCollectibles } from 'src/logic/tokens/api' -import { TokenResult } from 'src/logic/tokens/api/fetchErc20AndErc721AssetsList' +import { fetchSafeCollectibles } from 'src/logic/tokens/api/fetchSafeCollectibles' import { Errors, logError } from 'src/logic/exceptions/CodedException' +type TokenResult = { + address: string + decimals?: number + logoUri: string + name: string + symbol: string + type: TokenType +} + type FetchResult = { erc721Assets: TokenResult[] erc721Tokens: SafeCollectibleResponse[] diff --git a/src/logic/contracts/api/masterCopies.ts b/src/logic/contracts/api/masterCopies.ts index 54d0275590..93282ade5e 100644 --- a/src/logic/contracts/api/masterCopies.ts +++ b/src/logic/contracts/api/masterCopies.ts @@ -1,24 +1,19 @@ -import axios from 'axios' -import { getMasterCopiesUrl } from 'src/config' +import { MasterCopyReponse, getMasterCopies } from '@gnosis.pm/safe-react-gateway-sdk' + +import { _getChainId } from 'src/config' +import { GATEWAY_URL } from 'src/utils/constants' export enum MasterCopyDeployer { GNOSIS = 'Gnosis', CIRCLES = 'Circles', } -type MasterCopyFetch = { - address: string - version: string -} - -export type MasterCopy = { - address: string - version: string +export type MasterCopy = MasterCopyReponse[number] & { deployer: MasterCopyDeployer deployerRepoUrl: string } -const extractMasterCopyInfo = (mc: MasterCopyFetch): MasterCopy => { +const extractMasterCopyInfo = (mc: MasterCopyReponse[number]): MasterCopy => { const isCircles = mc.version.toLowerCase().includes(MasterCopyDeployer.CIRCLES.toLowerCase()) const dashIndex = mc.version.indexOf('-') @@ -35,8 +30,8 @@ const extractMasterCopyInfo = (mc: MasterCopyFetch): MasterCopy => { export const fetchMasterCopies = async (): Promise => { try { - const res = await axios.get<{ address: string; version: string }[]>(getMasterCopiesUrl()) - return res.data.map(extractMasterCopyInfo) + const res = await getMasterCopies(GATEWAY_URL, _getChainId()) + return res.map(extractMasterCopyInfo) } catch (error) { console.error('Fetching data from master-copies errored', error) } diff --git a/src/logic/safe/utils/mocks/remoteConfig.json b/src/logic/safe/utils/mocks/remoteConfig.json index b11063378e..62879dc15d 100644 --- a/src/logic/safe/utils/mocks/remoteConfig.json +++ b/src/logic/safe/utils/mocks/remoteConfig.json @@ -127,63 +127,6 @@ "SAFE_TX_GAS_OPTIONAL" ] }, - { - "transactionService": "https://safe-transaction.optimism.gnosis.io", - "chainId": "10", - "chainName": "Optimism", - "shortName": "oeth", - "l2": true, - "description": "", - "rpcUri": { - "authentication": "NO_AUTHENTICATION", - "value": "https://mainnet.optimism.io/" - }, - "safeAppsRpcUri": { - "authentication": "NO_AUTHENTICATION", - "value": "https://mainnet.optimism.io/" - }, - "publicRpcUri": { - "authentication": "NO_AUTHENTICATION", - "value": "https://mainnet.optimism.io/" - }, - "blockExplorerUriTemplate": { - "address": "https://optimistic.etherscan.io/address/{{address}}", - "txHash": "https://optimistic.etherscan.io/tx/{{txHash}}", - "api": "https://api-optimistic.etherscan.io/api?module={{module}}&action={{action}}&address={{address}}&apiKey={{apiKey}}" - }, - "nativeCurrency": { - "name": "Ether", - "symbol": "OETH", - "decimals": 18, - "logoUri": "https://safe-transaction-assets.staging.gnosisdev.com/chains/10/currency_logo.png" - }, - "theme": { - "textColor": "#ffffff", - "backgroundColor": "#EB3431" - }, - "gasPrice": [], - "disabledWallets": [ - "authereum", - "coinbase", - "fortmatic", - "keystone", - "lattice", - "ledger", - "opera", - "operaTouch", - "portis", - "torus", - "trezor", - "trust", - "walletLink" - ], - "features": [ - "CONTRACT_INTERACTION", - "ERC721", - "SAFE_APPS", - "SAFE_TX_GAS_OPTIONAL" - ] - }, { "transactionService": "https://safe-transaction.rinkeby.staging.gnosisdev.com", "chainId": "4", diff --git a/src/logic/tokens/api/fetchErc20AndErc721AssetsList.ts b/src/logic/tokens/api/fetchErc20AndErc721AssetsList.ts deleted file mode 100644 index 03a137a5f9..0000000000 --- a/src/logic/tokens/api/fetchErc20AndErc721AssetsList.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { TokenType } from '@gnosis.pm/safe-react-gateway-sdk' -import axios, { AxiosResponse } from 'axios' -import { getTokensServiceUrl } from 'src/config' - -export type TokenResult = { - address: string - decimals?: number - logoUri: string - name: string - symbol: string - type: TokenType -} - -export const fetchErc20AndErc721AssetsList = (): Promise> => { - return axios.get<{ results: TokenResult[] }, AxiosResponse<{ results: TokenResult[] }>>(getTokensServiceUrl(), { - params: { - limit: 3000, - }, - }) -} diff --git a/src/logic/tokens/api/index.ts b/src/logic/tokens/api/index.ts deleted file mode 100644 index cea3278b59..0000000000 --- a/src/logic/tokens/api/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { fetchErc20AndErc721AssetsList } from './fetchErc20AndErc721AssetsList' -export { fetchSafeCollectibles } from './fetchSafeCollectibles' diff --git a/src/logic/tokens/store/actions/addToken.ts b/src/logic/tokens/store/actions/addToken.ts deleted file mode 100644 index 3f9a237397..0000000000 --- a/src/logic/tokens/store/actions/addToken.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { createAction } from 'redux-actions' - -export const ADD_TOKEN = 'ADD_TOKEN' - -export const addToken = createAction(ADD_TOKEN, (token) => ({ - token, -})) diff --git a/src/logic/tokens/store/actions/fetchTokens.ts b/src/logic/tokens/store/actions/fetchTokens.ts index 464f8fb7f9..b59fc08352 100644 --- a/src/logic/tokens/store/actions/fetchTokens.ts +++ b/src/logic/tokens/store/actions/fetchTokens.ts @@ -1,20 +1,10 @@ import ERC20Contract from '@openzeppelin/contracts/build/contracts/ERC20.json' import ERC721Contract from '@openzeppelin/contracts/build/contracts/ERC721.json' -import { List } from 'immutable' -import { AnyAction } from 'redux' -import { ThunkDispatch } from 'redux-thunk' import { AbiItem } from 'web3-utils' import { ERC20 } from 'src/types/contracts/ERC20.d' import { ERC721 } from 'src/types/contracts/ERC721.d' -import { addTokens } from 'src/logic/tokens/store/actions/addTokens' -import { fetchErc20AndErc721AssetsList } from 'src/logic/tokens/api' -import { makeToken } from 'src/logic/tokens/store/model/token' -import { tokensSelector } from 'src/logic/tokens/store/selectors' import { getWeb3 } from 'src/logic/wallets/getWeb3' -import { AppReduxState } from 'src/store' -import { Errors, logError } from 'src/logic/exceptions/CodedException' -import { TokenResult } from '../../api/fetchErc20AndErc721AssetsList' const createERC20TokenContract = (tokenAddress: string): ERC20 => { const web3 = getWeb3() @@ -29,38 +19,3 @@ const createERC721TokenContract = (tokenAddress: string): ERC721 => { export const getERC20TokenContract = createERC20TokenContract export const getERC721TokenContract = createERC721TokenContract - -export const containsMethodByHash = async (contractAddress: string, methodHash: string): Promise => { - const web3 = getWeb3() - const byteCode = await web3.eth.getCode(contractAddress) - - return byteCode.indexOf(methodHash.replace('0x', '')) !== -1 -} - -export const fetchTokens = - () => - async ( - dispatch: ThunkDispatch, - getState: () => AppReduxState, - ): Promise => { - const currentSavedTokens = tokensSelector(getState()) - - let tokenList: TokenResult[] - try { - const resp = await fetchErc20AndErc721AssetsList() - tokenList = resp.data.results - } catch (e) { - logError(Errors._600, e.message) - return - } - - const erc20Tokens = tokenList.filter((token) => token.type.toLowerCase() === 'erc20') - - if (currentSavedTokens?.size === erc20Tokens.length) { - return - } - - const tokens = List(erc20Tokens.map((token) => makeToken(token))) - - dispatch(addTokens(tokens)) - } diff --git a/src/logic/tokens/store/reducer/tokens.ts b/src/logic/tokens/store/reducer/tokens.ts index 8c63958bb4..cf2d11866b 100644 --- a/src/logic/tokens/store/reducer/tokens.ts +++ b/src/logic/tokens/store/reducer/tokens.ts @@ -1,9 +1,8 @@ import { List, Map } from 'immutable' import { Action, handleActions } from 'redux-actions' -import { ADD_TOKEN } from 'src/logic/tokens/store/actions/addToken' import { ADD_TOKENS } from 'src/logic/tokens/store/actions/addTokens' -import { makeToken, Token } from 'src/logic/tokens/store/model/token' +import { Token } from 'src/logic/tokens/store/model/token' export const TOKEN_REDUCER_ID = 'tokens' @@ -24,12 +23,6 @@ const tokensReducer = handleActions( }) }) }, - [ADD_TOKEN]: (state, action: Action) => { - const { token } = action.payload - const { address: tokenAddress } = token - - return state.set(tokenAddress, makeToken(token)) - }, }, Map(), ) diff --git a/src/routes/safe/components/Apps/components/ConfirmTxModal/DecodedTxDetail.tsx b/src/routes/safe/components/Apps/components/ConfirmTxModal/DecodedTxDetail.tsx index cb5de7435c..f7e5e1a69e 100644 --- a/src/routes/safe/components/Apps/components/ConfirmTxModal/DecodedTxDetail.tsx +++ b/src/routes/safe/components/Apps/components/ConfirmTxModal/DecodedTxDetail.tsx @@ -1,12 +1,12 @@ import { ReactElement } from 'react' import styled from 'styled-components' +import { DecodedDataParameterValue, DecodedDataResponse } from '@gnosis.pm/safe-react-gateway-sdk' import { getNativeCurrency } from 'src/config' import { fromTokenUnit } from 'src/logic/tokens/utils/humanReadableValue' import { md, lg } from 'src/theme/variables' import ModalTitle from 'src/components/ModalTitle' import Hairline from 'src/components/layout/Hairline' -import { DecodedDataParameterValue, DecodedData } from 'src/types/transactions/decode.d' import { BasicTxInfo, getParameterElement } from 'src/components/DecodeTxs' const Container = styled.div` @@ -22,7 +22,7 @@ function isDataDecodedParameterValue(arg: any): arg is DecodedDataParameterValue type Props = { hideDecodedTxData: () => void onClose: () => void - decodedTxData: DecodedDataParameterValue | DecodedData + decodedTxData: DecodedDataParameterValue | DecodedDataResponse } export const DecodedTxDetail = ({ hideDecodedTxData, onClose, decodedTxData: tx }: Props): ReactElement => { @@ -48,7 +48,7 @@ export const DecodedTxDetail = ({ hideDecodedTxData, onClose, decodedTxData: tx return ( <> diff --git a/src/routes/safe/components/Apps/components/ConfirmTxModal/ReviewConfirm.tsx b/src/routes/safe/components/Apps/components/ConfirmTxModal/ReviewConfirm.tsx index e05a30a32e..1d53f50c2e 100644 --- a/src/routes/safe/components/Apps/components/ConfirmTxModal/ReviewConfirm.tsx +++ b/src/routes/safe/components/Apps/components/ConfirmTxModal/ReviewConfirm.tsx @@ -4,6 +4,7 @@ import { ReactElement, useEffect, useMemo, useState } from 'react' import { useDispatch, useSelector } from 'react-redux' import styled from 'styled-components' import { toBN } from 'web3-utils' +import { DecodedDataResponse } from '@gnosis.pm/safe-react-gateway-sdk' import { createTransaction } from 'src/logic/safe/store/actions/createTransaction' import { getMultisendContractAddress } from 'src/logic/contracts/safeContracts' @@ -19,7 +20,6 @@ import { useEstimationStatus } from 'src/logic/hooks/useEstimationStatus' import { TxParameters } from 'src/routes/safe/container/hooks/useTransactionParameters' import { BasicTxInfo, DecodeTxs } from 'src/components/DecodeTxs' import { fetchTxDecoder } from 'src/utils/decodeTx' -import { DecodedData } from 'src/types/transactions/decode.d' import { fromTokenUnit } from 'src/logic/tokens/utils/humanReadableValue' import Block from 'src/components/layout/Block' import Hairline from 'src/components/layout/Hairline' @@ -80,7 +80,7 @@ export const ReviewConfirm = ({ showDecodedTxData, }: Props): ReactElement => { const isMultiSend = txs.length > 1 - const [decodedData, setDecodedData] = useState(null) + const [decodedData, setDecodedData] = useState(null) const dispatch = useDispatch() const nativeCurrency = getNativeCurrency() const explorerUrl = getExplorerInfo(safeAddress) diff --git a/src/routes/safe/components/Apps/components/ConfirmTxModal/index.tsx b/src/routes/safe/components/Apps/components/ConfirmTxModal/index.tsx index 513c03480c..88b35c8358 100644 --- a/src/routes/safe/components/Apps/components/ConfirmTxModal/index.tsx +++ b/src/routes/safe/components/Apps/components/ConfirmTxModal/index.tsx @@ -1,6 +1,7 @@ import { ReactElement, useState } from 'react' import { Transaction } from '@gnosis.pm/safe-apps-sdk-v1' import { RequestId } from '@gnosis.pm/safe-apps-sdk' +import { DecodedDataParameterValue, DecodedDataResponse } from '@gnosis.pm/safe-react-gateway-sdk' import Modal from 'src/components/Modal' import { SafeApp } from 'src/routes/safe/components/Apps/types' @@ -8,7 +9,6 @@ import { TransactionParams } from 'src/routes/safe/components/Apps/components/Ap import { mustBeEthereumAddress } from 'src/components/forms/validator' import { SafeAppLoadError } from './SafeAppLoadError' import { ReviewConfirm } from './ReviewConfirm' -import { DecodedDataParameterValue, DecodedData } from 'src/types/transactions/decode' import { DecodedTxDetail } from './DecodedTxDetail' export type ConfirmTxModalProps = { @@ -38,7 +38,7 @@ const isTxValid = (t: Transaction): boolean => { return isAddressValid && !!t.data && typeof t.data === 'string' } -export type DecodedTxDetail = DecodedDataParameterValue | DecodedData | undefined +export type DecodedTxDetail = DecodedDataParameterValue | DecodedDataResponse | undefined export const ConfirmTxModal = (props: ConfirmTxModalProps): ReactElement => { const [decodedTxDetails, setDecodedTxDetails] = useState() diff --git a/src/types/transactions/decode.d.ts b/src/types/transactions/decode.d.ts deleted file mode 100644 index 8beb92e761..0000000000 --- a/src/types/transactions/decode.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -export type DecodedDataBasicParameter = { - name: string - type: string - value: string -} -export type DecodedDataParameterValue = { - operation: 0 | 1 - to: string - value: string - data: string - dataDecoded: { - method: string - parameters: DecodedDataBasicParameter[] - } | null -} - -export type DecodedDataParameter = { - valueDecoded?: DecodedDataParameterValue[] -} & DecodedDataBasicParameter - -export type DecodedData = { - method: string - parameters: DecodedDataParameter[] -} diff --git a/src/utils/decodeTx.ts b/src/utils/decodeTx.ts index b0c66fd6be..9d8b92b21e 100644 --- a/src/utils/decodeTx.ts +++ b/src/utils/decodeTx.ts @@ -1,16 +1,15 @@ -import axios from 'axios' +import { getDecodedData, DecodedDataResponse } from '@gnosis.pm/safe-react-gateway-sdk' -import { getDataDecoderUrl } from 'src/config' -import { DecodedData } from 'src/types/transactions/decode.d' +import { _getChainId } from 'src/config' +import { GATEWAY_URL } from './constants' -export const fetchTxDecoder = async (txData: string): Promise => { - if (!txData?.length || txData === '0x') { +export const fetchTxDecoder = async (encodedData: string): Promise => { + if (!encodedData?.length || encodedData === '0x') { return null } try { - const res = await axios.post(getDataDecoderUrl(), { data: txData }) - return res.data + return await getDecodedData(GATEWAY_URL, _getChainId(), encodedData) } catch (error) { return null } diff --git a/yarn.lock b/yarn.lock index 3e43b4e307..ed441446b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2163,7 +2163,14 @@ react-media "^1.10.0" web3-utils "^1.6.0" -"@gnosis.pm/safe-react-gateway-sdk@^2.5.6", "@gnosis.pm/safe-react-gateway-sdk@^2.7.4": +"@gnosis.pm/safe-react-gateway-sdk@2.7.5": + version "2.7.5" + resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-react-gateway-sdk/-/safe-react-gateway-sdk-2.7.5.tgz#5640fc8c3972397ea1135f1e552d0c3333acb8fa" + integrity sha512-kY2aOLqfm9fxZbeMa8JkyKr7S3RYdxL/B0n2rU2fRAoPULleq+a6wZ2Y+zHC+XrHpjsNi6QIA183apP+XcRYIQ== + dependencies: + isomorphic-unfetch "^3.1.0" + +"@gnosis.pm/safe-react-gateway-sdk@^2.5.6": version "2.7.4" resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-react-gateway-sdk/-/safe-react-gateway-sdk-2.7.4.tgz#3a1d96e30d10e4859579b558586fd25cd4ae3480" integrity sha512-S6Dw9/TVm5xrzjrlc5194zoXg6DbzvIhr7rqWzl5nAtPSRi8REawyysZQGESzqAKO3GpE+GEPf5y5srTprv5oA== @@ -2522,7 +2529,7 @@ rxjs "6" semver "^7.3.5" -"@ledgerhq/devices@^6.11.2", "@ledgerhq/devices@^6.20.0", "@ledgerhq/devices@^6.7.0": +"@ledgerhq/devices@^6.20.0", "@ledgerhq/devices@^6.7.0": version "6.20.0" resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-6.20.0.tgz#4280aaa5dc16f821ecab9ee8ae882299411ba5b7" integrity sha512-WehM7HGdb+nSUzyUlz1t2qJ8Tg4I+rQkOJJsx0/Dpjkx6/+1hHcX6My/apPuwh39qahqwYhjszq0H1YzGDS0Yg== @@ -6515,22 +6522,6 @@ bnc-sdk@^3.4.1: rxjs "^6.6.3" sturdy-websocket "^0.1.12" -body-parser@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - dependencies: - bytes "3.1.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - body-parser@1.19.1, body-parser@^1.16.0: version "1.19.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" @@ -6943,11 +6934,6 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - bytes@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" @@ -7777,13 +7763,6 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -7829,11 +7808,6 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - cookie@0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" @@ -11953,17 +11927,6 @@ http-deceiver@^1.2.7: resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-errors@1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" @@ -11985,17 +11948,6 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-https@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" @@ -17222,7 +17174,7 @@ protocol-buffers-schema@3.1.0: resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.1.0.tgz#d8a819549ead3e6bd189ebe9e50e96636bbc5cc7" integrity sha1-2KgZVJ6tPmvRievp5Q6WY2u8XMc= -proxy-addr@~2.0.5, proxy-addr@~2.0.7: +proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== @@ -17355,11 +17307,6 @@ qrcode@1.4.4: pngjs "^3.3.0" yargs "^13.2.4" -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.9.6: version "6.9.6" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" @@ -17490,16 +17437,6 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - raw-body@2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" @@ -19059,25 +18996,6 @@ semver@~5.4.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - send@0.17.2: version "0.17.2" resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" @@ -19142,16 +19060,6 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - serve-static@1.14.2: version "1.14.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" @@ -19208,11 +19116,6 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -20590,11 +20493,6 @@ toggle-selection@^1.0.6: resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -20815,7 +20713,7 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@~1.6.17, type-is@~1.6.18: +type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==