diff --git a/package.json b/package.json
index 83c1d90b..65d19bf0 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,7 @@
"email": "safe@gnosis.io"
},
"main": "public/electron.js",
- "postinstall": "electron-builder install-app-deps",
+ "postinstall": "patch-package electron-builder install-app-deps",
"scripts": {
"analyze": "source-map-explorer 'build/static/js/*.js'",
"build-desktop": "cross-env REACT_APP_BUILD_FOR_DESKTOP=true REACT_APP_ENV=production yarn build-mainnet",
@@ -30,7 +30,7 @@
"generate-types:contracts": "cross-env typechain --target=web3-v1 --outDir './src/types/contracts' './node_modules/@gnosis.pm/safe-contracts/build/contracts/*.json'",
"lint:check": "eslint './src/**/*.{js,jsx,ts,tsx}'",
"lint:fix": "yarn lint:check --fix",
- "postinstall": "electron-builder install-app-deps && yarn generate-types",
+ "postinstall": "patch-package && electron-builder install-app-deps && yarn generate-types",
"preelectron-pack": "yarn build",
"prettier:check": "yarn prettier --check",
"prettier:fix": "yarn prettier --write",
@@ -170,18 +170,18 @@
"@gnosis.pm/safe-contracts": "1.1.1-dev.2",
"@gnosis.pm/safe-react-components": "https://github.com/gnosis/safe-react-components.git#03ff672d6f73366297986d58631f9582fe2ed4a3",
"@gnosis.pm/util-contracts": "2.0.6",
- "@ledgerhq/hw-transport-node-hid-singleton": "5.29.0",
+ "@ledgerhq/hw-transport-node-hid-singleton": "5.30.0",
"@material-ui/core": "4.11.0",
"@material-ui/icons": "4.9.1",
"@material-ui/lab": "4.0.0-alpha.56",
"@openzeppelin/contracts": "3.1.0",
- "@sentry/react": "^5.27.3",
- "@sentry/tracing": "^5.27.3",
- "@truffle/contract": "4.2.28",
+ "@sentry/react": "^5.27.0",
+ "@sentry/tracing": "^5.27.0",
+ "@truffle/contract": "4.2.30",
"async-sema": "^3.1.0",
"axios": "0.21.0",
"bignumber.js": "9.0.1",
- "bnc-onboard": "1.14.0",
+ "bnc-onboard": "1.15.0",
"classnames": "^2.2.6",
"concurrently": "^5.3.0",
"connected-react-router": "6.8.0",
@@ -209,25 +209,25 @@
"material-ui-search-bar": "^1.0.0",
"notistack": "https://github.com/gnosis/notistack.git#v0.9.4",
"qrcode.react": "1.0.0",
- "query-string": "6.13.6",
+ "query-string": "6.13.7",
"react": "16.13.1",
"react-dom": "16.13.1",
"react-final-form": "^6.5.2",
"react-final-form-listeners": "^1.0.2",
- "react-ga": "3.2.0",
+ "react-ga": "3.2.1",
"react-hot-loader": "4.13.0",
"react-qr-reader": "^2.2.1",
- "react-redux": "7.2.1",
+ "react-redux": "7.2.2",
"react-router-dom": "5.2.0",
"react-scripts": "^3.4.3",
- "react-window": "^1.8.5",
+ "react-window": "^1.8.6",
"recompose": "^0.30.0",
"redux": "4.0.5",
"redux-actions": "^2.6.5",
"redux-thunk": "^2.3.0",
"reselect": "^4.0.0",
"semver": "7.3.2",
- "styled-components": "^5.2.0",
+ "styled-components": "^5.2.1",
"web3": "1.2.11",
"web3-core": "^1.2.11",
"web3-eth-contract": "^1.2.11",
@@ -238,7 +238,7 @@
"@storybook/addon-actions": "^5.3.19",
"@storybook/addon-links": "^5.3.19",
"@storybook/addons": "^5.3.19",
- "@storybook/preset-create-react-app": "^3.1.4",
+ "@storybook/preset-create-react-app": "^3.1.5",
"@storybook/react": "^5.3.19",
"@testing-library/jest-dom": "5.11.5",
"@testing-library/react": "10.4.9",
@@ -258,24 +258,25 @@
"cross-env": "^7.0.2",
"dotenv": "^8.2.0",
"dotenv-expand": "^5.1.0",
- "electron": "9.3.3",
+ "electron": "^9.3.3",
"electron-builder": "22.9.1",
"electron-notarize": "1.0.0",
"eslint": "6.8.0",
- "eslint-config-prettier": "6.14.0",
- "eslint-plugin-import": "2.22.1",
+ "eslint-config-prettier": "^6.14.0",
+ "eslint-plugin-import": "^2.22.1",
"eslint-plugin-jsx-a11y": "^6.3.1",
"eslint-plugin-prettier": "^3.1.4",
"eslint-plugin-react": "^7.21.5",
- "eslint-plugin-sort-destructure-keys": "1.3.5",
+ "eslint-plugin-sort-destructure-keys": "^1.3.5",
"ethereumjs-abi": "0.6.8",
"husky": "^4.3.0",
"lint-staged": "^10.5.1",
"node-sass": "^4.14.1",
- "prettier": "2.1.2",
+ "patch-package": "^6.2.2",
+ "postinstall-postinstall": "^2.1.0",
+ "prettier": "^2.1.2",
"react-app-rewired": "^2.1.6",
- "react-docgen-typescript-loader": "^3.7.2",
- "typechain": "^2.0.0",
+ "typechain": "^4.0.0",
"typescript": "4.0.5",
"wait-on": "5.2.0"
}
diff --git a/patches/web3-eth+1.2.11.patch b/patches/web3-eth+1.2.11.patch
new file mode 100644
index 00000000..9de3c1ca
--- /dev/null
+++ b/patches/web3-eth+1.2.11.patch
@@ -0,0 +1,19 @@
+diff --git a/node_modules/web3-eth/src/getNetworkType.js b/node_modules/web3-eth/src/getNetworkType.js
+index 3be3a20..88edbd9 100644
+--- a/node_modules/web3-eth/src/getNetworkType.js
++++ b/node_modules/web3-eth/src/getNetworkType.js
+@@ -63,6 +63,14 @@ var getNetworkType = function (callback) {
+ id === 42) {
+ returnValue = 'kovan';
+ }
++ if (genesis.hash === '0x0b6d3e680af2fc525392c720666cce58e3d8e6fe75ba4b48cb36bcc69039229b' &&
++ id === 246) {
++ returnValue = 'energyWebChain';
++ }
++ if (genesis.hash === '0xebd8b413ca7b7f84a8dd20d17519ce2b01954c74d94a0a739a3e416abe0e43e5' &&
++ id === 73799) {
++ returnValue = 'volta';
++ }
+
+ if (_.isFunction(callback)) {
+ callback(null, returnValue);
diff --git a/patches/web3-eth-ens+1.2.11.patch b/patches/web3-eth-ens+1.2.11.patch
new file mode 100644
index 00000000..ea9249fb
--- /dev/null
+++ b/patches/web3-eth-ens+1.2.11.patch
@@ -0,0 +1,15 @@
+diff --git a/node_modules/web3-eth-ens/src/config.js b/node_modules/web3-eth-ens/src/config.js
+index b12e5f5..e0abf2d 100644
+--- a/node_modules/web3-eth-ens/src/config.js
++++ b/node_modules/web3-eth-ens/src/config.js
+@@ -30,7 +30,9 @@ var config = {
+ main: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
+ ropsten: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
+ rinkeby: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
+- goerli: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"
++ goerli: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
++ energyWebChain: "0x0A6d64413c07E10E890220BBE1c49170080C6Ca0",
++ volta: "0xd7CeF70Ba7efc2035256d828d5287e2D285CD1ac",
+ },
+ // These ids obtained at ensdomains docs:
+ // https://docs.ens.domains/contract-developer-guide/writing-a-resolver
diff --git a/src/components/AppLayout/Sidebar/SafeHeader/index.tsx b/src/components/AppLayout/Sidebar/SafeHeader/index.tsx
index 16a0268d..ee1503d4 100644
--- a/src/components/AppLayout/Sidebar/SafeHeader/index.tsx
+++ b/src/components/AppLayout/Sidebar/SafeHeader/index.tsx
@@ -130,10 +130,13 @@ const SafeHeader = ({
return (
<>
+ {/* Network */}
{networkInfo.label}
+
+ {/* Identicon */}
@@ -142,6 +145,7 @@ const SafeHeader = ({
+ {/* SafeInfo */}
{safeName}
diff --git a/src/components/AppLayout/Sidebar/index.tsx b/src/components/AppLayout/Sidebar/index.tsx
index 673b994d..ff2b29d3 100644
--- a/src/components/AppLayout/Sidebar/index.tsx
+++ b/src/components/AppLayout/Sidebar/index.tsx
@@ -16,7 +16,7 @@ const HelpContainer = styled.div`
const HelpCenterLink = styled.a`
height: 30px;
width: 166px;
- padding: 6px 0 0 16px;
+ padding: 8px 0 8px 16px;
margin: 14px 0px;
text-decoration: none;
display: block;
diff --git a/src/components/AppLayout/index.tsx b/src/components/AppLayout/index.tsx
index 4ac72c9e..63c2c1ba 100644
--- a/src/components/AppLayout/index.tsx
+++ b/src/components/AppLayout/index.tsx
@@ -6,53 +6,62 @@ import Header from './Header'
import Footer from './Footer'
import Sidebar from './Sidebar'
-const Grid = styled.div`
- height: 100%;
- overflow: auto;
+const Container = styled.div`
+ height: 100vh;
+ width: 100vw;
+ display: flex;
+ flex-direction: column;
+
background-color: ${({ theme }) => theme.colors.background};
- display: grid;
- grid-template-columns: 200px 1fr;
- grid-template-rows: 54px 1fr;
- grid-template-areas:
- 'topbar topbar'
- 'sidebar body';
`
-const GridTopbarWrapper = styled.nav`
+const HeaderWrapper = styled.nav`
+ height: 54px;
+ width: 100%;
+ z-index: 1;
+
background-color: white;
- box-shadow: 0 2px 4px 0 rgba(212, 212, 211, 0.59);
- border-bottom: 2px solid ${({ theme }) => theme.colors.separator};
- z-index: 999;
- grid-area: topbar;
+ box-shadow: 0 0 4px 0 rgba(212, 212, 211, 0.59);
`
-const GridSidebarWrapper = styled.aside`
- width: 200px;
- padding: 62px 8px 0 8px;
+const BodyWrapper = styled.div`
+ height: calc(100% - 54px);
+ width: 100%;
+ display: flex;
+ flex-direction: row;
+`
+
+const SidebarWrapper = styled.aside`
height: 100%;
+ width: 200px;
+ display: flex;
+ flex-direction: column;
+ z-index: 1;
+
+ padding: 8px;
background-color: ${({ theme }) => theme.colors.white};
border-right: 2px solid ${({ theme }) => theme.colors.separator};
+`
+
+const ContentWrapper = styled.section`
+ width: 100%;
display: flex;
flex-direction: column;
- box-sizing: border-box;
- position: fixed;
- grid-area: sidebar;
-`
+ overflow-x: auto;
-const GridBodyWrapper = styled.section`
- margin: 0 16px 0 16px;
- grid-area: body;
- display: flex;
- flex-direction: column;
- align-content: stretch;
-`
+ padding: 0 16px;
-export const BodyWrapper = styled.div`
- flex: 1 100%;
-`
+ > :nth-child(1) {
+ flex-grow: 1;
+ width: 100%;
+ align-items: center;
+ justify-content: center;
+ }
-export const FooterWrapper = styled.footer`
- margin: 0 16px;
+ > :nth-child(2) {
+ width: 100%;
+ height: 59px;
+ }
`
type Props = {
@@ -77,29 +86,29 @@ const Layout: React.FC = ({
children,
sidebarItems,
}): React.ReactElement => (
-
-
+
+
-
-
-
-
-
- {children}
-
+
+
+
+
+
+
+ {children}
-
-
-
+
+
+
)
export default Layout
diff --git a/src/components/Modal/index.tsx b/src/components/Modal/index.tsx
index 9a7f23e9..cae28d5b 100644
--- a/src/components/Modal/index.tsx
+++ b/src/components/Modal/index.tsx
@@ -16,7 +16,7 @@ const styles = () => ({
position: 'absolute',
top: '120px',
width: '500px',
- height: '530px',
+ height: '540px',
borderRadius: sm,
backgroundColor: '#ffffff',
boxShadow: '0 0 5px 0 rgba(74, 85, 121, 0.5)',
diff --git a/src/components/ScanQRModal/ScanQRWrapper/index.tsx b/src/components/ScanQRModal/ScanQRWrapper/index.tsx
index 9982e6c4..948c98be 100644
--- a/src/components/ScanQRModal/ScanQRWrapper/index.tsx
+++ b/src/components/ScanQRModal/ScanQRWrapper/index.tsx
@@ -3,7 +3,7 @@ import { useState } from 'react'
import * as React from 'react'
import QRIcon from 'src/assets/icons/qrcode.svg'
-import ScanQRModal from 'src/components/ScanQRModal'
+import { ScanQRModal } from 'src/components/ScanQRModal'
import Img from 'src/components/layout/Img'
const useStyles = makeStyles({
@@ -12,7 +12,11 @@ const useStyles = makeStyles({
},
})
-export const ScanQRWrapper = (props) => {
+type Props = {
+ handleScan: (dataResult: string, closeQrModal: () => void) => void
+}
+
+export const ScanQRWrapper = ({ handleScan }: Props): React.ReactElement => {
const classes = useStyles()
const [qrModalOpen, setQrModalOpen] = useState(false)
@@ -25,7 +29,7 @@ export const ScanQRWrapper = (props) => {
}
const onScanFinished = (value) => {
- props.handleScan(value, closeQrModal)
+ handleScan(value, closeQrModal)
}
return (
@@ -34,9 +38,7 @@ export const ScanQRWrapper = (props) => {
alt="Scan QR"
className={classes.qrCodeBtn}
height={20}
- onClick={() => {
- openQrModal()
- }}
+ onClick={() => openQrModal()}
role="button"
src={QRIcon}
testId="qr-icon"
diff --git a/src/components/ScanQRModal/index.tsx b/src/components/ScanQRModal/index.tsx
index c4a12798..737ea4e2 100644
--- a/src/components/ScanQRModal/index.tsx
+++ b/src/components/ScanQRModal/index.tsx
@@ -1,6 +1,6 @@
import CircularProgress from '@material-ui/core/CircularProgress'
import IconButton from '@material-ui/core/IconButton'
-import { withStyles } from '@material-ui/core/styles'
+import { makeStyles } from '@material-ui/core/styles'
import Close from '@material-ui/icons/Close'
import * as React from 'react'
import QrReader from 'react-qr-reader'
@@ -15,11 +15,21 @@ import Col from 'src/components/layout/Col'
import Hairline from 'src/components/layout/Hairline'
import Paragraph from 'src/components/layout/Paragraph'
import Row from 'src/components/layout/Row'
+import { useEffect, useState } from 'react'
-const { useEffect, useState } = React
+const useStyles = makeStyles(styles)
-const ScanQRModal = ({ classes, isOpen, onClose, onScan }) => {
- const [hasWebcam, setHasWebcam] = useState(null)
+type Props = {
+ isOpen: boolean
+ onClose: () => void
+ onScan: (value: string) => void
+}
+
+export const ScanQRModal = ({ isOpen, onClose, onScan }: Props): React.ReactElement => {
+ const classes = useStyles()
+ const [useWebcam, setUseWebcam] = useState(null)
+ const [fileUploadModalOpen, setFileUploadModalOpen] = useState(false)
+ const [error, setError] = useState(null)
const scannerRef: any = React.createRef()
const openImageDialog = React.useCallback(() => {
scannerRef.current.openImageDialog()
@@ -28,22 +38,35 @@ const ScanQRModal = ({ classes, isOpen, onClose, onScan }) => {
useEffect(() => {
checkWebcam(
() => {
- setHasWebcam(true)
+ setUseWebcam(true)
},
() => {
- setHasWebcam(false)
+ setUseWebcam(false)
},
)
}, [])
useEffect(() => {
- // this fires only when the hasWebcam changes to false (null > false (user doesn't have webcam)
- // , true > false (user switched from webcam to file upload))
- // Doesn't fire on re-render
- if (hasWebcam === false) {
+ if (useWebcam === false && !fileUploadModalOpen && !error) {
+ setFileUploadModalOpen(true)
openImageDialog()
}
- }, [hasWebcam, openImageDialog])
+ }, [useWebcam, openImageDialog, fileUploadModalOpen, setFileUploadModalOpen, error])
+
+ const onFileScannedResolve = (error: string | null, successData: string | null) => {
+ if (successData) {
+ onScan(successData)
+ }
+ if (error) {
+ console.error('Error uploading file', error)
+ setError(`The QR could not be read`)
+ }
+ if (!useWebcam) {
+ setError(`The QR could not be read`)
+ }
+
+ setFileUploadModalOpen(false)
+ }
return (
@@ -57,19 +80,16 @@ const ScanQRModal = ({ classes, isOpen, onClose, onScan }) => {
- {hasWebcam === null ? (
+ {error}
+ {useWebcam === null ? (
) : (
{
- console.error(err)
- }}
- onScan={(data) => {
- if (data) onScan(data)
- }}
+ legacyMode={!useWebcam}
+ onError={(err) => onFileScannedResolve(err, null)}
+ onScan={(data) => onFileScannedResolve(null, data)}
ref={scannerRef}
style={{ width: '400px', height: '400px' }}
/>
@@ -85,11 +105,9 @@ const ScanQRModal = ({ classes, isOpen, onClose, onScan }) => {
color="primary"
minWidth={154}
onClick={() => {
- if (hasWebcam) {
- setHasWebcam(false)
- } else {
- openImageDialog()
- }
+ setUseWebcam(false)
+ setError(null)
+ setFileUploadModalOpen(false)
}}
variant="contained"
>
@@ -99,5 +117,3 @@ const ScanQRModal = ({ classes, isOpen, onClose, onScan }) => {
)
}
-
-export default withStyles(styles as any)(ScanQRModal)
diff --git a/src/components/ScanQRModal/style.ts b/src/components/ScanQRModal/style.ts
index 78cf9ef1..9181360a 100644
--- a/src/components/ScanQRModal/style.ts
+++ b/src/components/ScanQRModal/style.ts
@@ -1,6 +1,7 @@
import { background, lg, secondaryText, sm } from 'src/theme/variables'
+import { createStyles } from '@material-ui/core'
-export const styles = () => ({
+export const styles = createStyles({
heading: {
padding: lg,
justifyContent: 'space-between',
diff --git a/src/components/forms/validator.test.ts b/src/components/forms/validator.test.ts
index 0eff1983..3f5d45ef 100644
--- a/src/components/forms/validator.test.ts
+++ b/src/components/forms/validator.test.ts
@@ -169,13 +169,19 @@ describe('Forms > Validators', () => {
it('Returns undefined for an address not contained in the passed array', async () => {
const addresses = ['0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe']
- expect(uniqueAddress(addresses)('0xe7e3272a84cf3fe180345b9f7234ba705eB5E2CA')).toBeUndefined()
+ expect(uniqueAddress(addresses)()).toBeUndefined()
})
- it('Returns an error message for an address already contained in the array', async () => {
- const addresses = ['0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe']
+ it('Returns an error message for an array with duplicated values', async () => {
+ const addresses = ['0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe']
- expect(uniqueAddress(addresses)(addresses[0])).toEqual(ADDRESS_REPEATED_ERROR)
+ expect(uniqueAddress(addresses)()).toEqual(ADDRESS_REPEATED_ERROR)
+ })
+
+ it('Returns an error message for an array with duplicated checksum and not checksum values', async () => {
+ const addresses = ['0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae']
+
+ expect(uniqueAddress(addresses)()).toEqual(ADDRESS_REPEATED_ERROR)
})
})
diff --git a/src/components/forms/validator.ts b/src/components/forms/validator.ts
index e6f2d9d5..1f01b4d0 100644
--- a/src/components/forms/validator.ts
+++ b/src/components/forms/validator.ts
@@ -1,13 +1,11 @@
-import { List } from 'immutable'
+import { getWeb3 } from 'src/logic/wallets/getWeb3'
import memoize from 'lodash.memoize'
import { isFeatureEnabled } from 'src/config'
import { FEATURES } from 'src/config/networks/network.d'
-
-import { sameAddress } from 'src/logic/wallets/ethAddresses'
-import { getWeb3 } from 'src/logic/wallets/getWeb3'
+import { List } from 'immutable'
type ValidatorReturnType = string | undefined
-type GenericValidatorType = (...args: unknown[]) => ValidatorReturnType
+export type GenericValidatorType = (...args: unknown[]) => ValidatorReturnType
type AsyncValidator = (...args: unknown[]) => Promise
export type Validator = GenericValidatorType | AsyncValidator
@@ -89,13 +87,18 @@ export const minMaxLength = (minLen: number, maxLen: number) => (value: string):
export const ADDRESS_REPEATED_ERROR = 'Address already introduced'
-export const uniqueAddress = (addresses: string[] | List): GenericValidatorType =>
- memoize(
- (value: string): ValidatorReturnType => {
- const addressAlreadyExists = addresses.some((address) => sameAddress(value, address))
- return addressAlreadyExists ? ADDRESS_REPEATED_ERROR : undefined
- },
- )
+export const uniqueAddress = (addresses: string[] | List): GenericValidatorType => (): ValidatorReturnType => {
+ // @ts-expect-error both list and array have signatures for map but TS thinks they're not compatible
+ const lowercaseAddresses = addresses.map((address) => address.toLowerCase())
+ const uniqueAddresses = new Set(lowercaseAddresses)
+ const lengthPropName = 'size' in addresses ? 'size' : 'length'
+
+ if (uniqueAddresses.size !== addresses?.[lengthPropName]) {
+ return ADDRESS_REPEATED_ERROR
+ }
+
+ return undefined
+}
export const composeValidators = (...validators: Validator[]) => (value: unknown): ValidatorReturnType =>
validators.reduce(
diff --git a/src/config/networks/energy_web_chain.ts b/src/config/networks/energy_web_chain.ts
index ececc4bf..7253be5b 100644
--- a/src/config/networks/energy_web_chain.ts
+++ b/src/config/networks/energy_web_chain.ts
@@ -1,5 +1,5 @@
import EwcLogo from 'src/config/assets/token_ewc.svg'
-import { EnvironmentSettings, ETHEREUM_NETWORK, FEATURES, NetworkConfig, WALLETS } from 'src/config/networks/network.d'
+import { EnvironmentSettings, ETHEREUM_NETWORK, NetworkConfig, WALLETS } from 'src/config/networks/network.d'
// @todo (agustin) we need to use fixed gasPrice because the oracle is not working right now and it's returning 0
// once the oracle is fixed we need to remove the fixed value
@@ -60,10 +60,7 @@ const mainnet: NetworkConfig = {
WALLETS.WALLET_LINK,
WALLETS.AUTHEREUM,
WALLETS.LATTICE,
- ],
- disabledFeatures: [
- FEATURES.ENS_LOOKUP,
- ],
+ ]
}
export default mainnet
diff --git a/src/config/networks/volta.ts b/src/config/networks/volta.ts
index 350ad99a..3d96e6f8 100644
--- a/src/config/networks/volta.ts
+++ b/src/config/networks/volta.ts
@@ -1,5 +1,5 @@
import EwcLogo from 'src/config/assets/token_ewc.svg'
-import { EnvironmentSettings, ETHEREUM_NETWORK, FEATURES, NetworkConfig, WALLETS } from 'src/config/networks/network.d'
+import { EnvironmentSettings, ETHEREUM_NETWORK, NetworkConfig, WALLETS } from 'src/config/networks/network.d'
const baseConfig: EnvironmentSettings = {
txServiceUrl: 'https://safe-transaction.volta.gnosis.io/api/v1',
@@ -58,9 +58,6 @@ const mainnet: NetworkConfig = {
WALLETS.AUTHEREUM,
WALLETS.LATTICE,
],
- disabledFeatures: [
- FEATURES.ENS_LOOKUP,
- ],
}
export default mainnet
diff --git a/src/logic/addressBook/store/selectors/index.ts b/src/logic/addressBook/store/selectors/index.ts
index 7460909f..128b9aa7 100644
--- a/src/logic/addressBook/store/selectors/index.ts
+++ b/src/logic/addressBook/store/selectors/index.ts
@@ -8,6 +8,10 @@ import { AddressBookState } from 'src/logic/addressBook/model/addressBook'
export const addressBookSelector = (state: AppReduxState): AddressBookState => state[ADDRESS_BOOK_REDUCER_ID]
+export const addressBookAddressesListSelector = createSelector(addressBookSelector, (addressBook): string[] => {
+ return addressBook.map((entry) => entry.address)
+})
+
export const getNameFromAddressBookSelector = createSelector(
addressBookSelector,
(_, address) => address,
diff --git a/src/logic/addressBook/utils/__tests__/addressBookUtils.test.ts b/src/logic/addressBook/utils/__tests__/addressBookUtils.test.ts
index 4541c2f7..8ff40278 100644
--- a/src/logic/addressBook/utils/__tests__/addressBookUtils.test.ts
+++ b/src/logic/addressBook/utils/__tests__/addressBookUtils.test.ts
@@ -2,7 +2,6 @@ import { List } from 'immutable'
import {
checkIfEntryWasDeletedFromAddressBook,
getAddressBookFromStorage,
- getAddressesListFromAddressBook,
getNameFromAddressBook,
getOwnersWithNameFromAddressBook,
isValidAddressBookName,
@@ -28,24 +27,6 @@ const getMockOldAddressBookEntry = ({ address = '', name = '', isOwner = false }
}
}
-describe('getAddressesListFromAdbk', () => {
- const entry1 = getMockAddressBookEntry('123456', 'test1')
- const entry2 = getMockAddressBookEntry('78910', 'test2')
- const entry3 = getMockAddressBookEntry('4781321', 'test3')
-
- it('It should returns the list of addresses within the addressBook given a safeAddressBook', () => {
- // given
- const safeAddressBook = [entry1, entry2, entry3]
- const expectedResult = [entry1.address, entry2.address, entry3.address]
-
- // when
- const result = getAddressesListFromAddressBook(safeAddressBook)
-
- // then
- expect(result).toStrictEqual(expectedResult)
- })
-})
-
describe('getNameFromSafeAddressBook', () => {
const entry1 = getMockAddressBookEntry('123456', 'test1')
const entry2 = getMockAddressBookEntry('78910', 'test2')
diff --git a/src/logic/addressBook/utils/index.ts b/src/logic/addressBook/utils/index.ts
index 11656a8b..f4e835de 100644
--- a/src/logic/addressBook/utils/index.ts
+++ b/src/logic/addressBook/utils/index.ts
@@ -56,9 +56,6 @@ export const saveAddressBook = async (addressBook: AddressBookState): Promise
- addressBook.map((entry) => entry.address)
-
type GetNameFromAddressBookOptions = {
filterOnlyValidName: boolean
}
diff --git a/src/logic/collectibles/utils/index.ts b/src/logic/collectibles/utils/index.ts
index c117aead..8f7b346b 100644
--- a/src/logic/collectibles/utils/index.ts
+++ b/src/logic/collectibles/utils/index.ts
@@ -1,4 +1,4 @@
-import { getNetworkId } from 'src/config'
+import { getNetworkId, getNetworkInfo } from 'src/config'
import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
import { nftAssetsListAddressesSelector } from 'src/logic/collectibles/store/selectors'
import { TxServiceModel } from 'src/logic/safe/store/actions/transactions/fetchTransactions/loadOutgoingTransactions'
@@ -18,6 +18,14 @@ export const CK_ADDRESS = {
[ETHEREUM_NETWORK.RINKEBY]: '0x16baf0de678e52367adc69fd067e5edd1d33e3bf',
}
+// Note: xDAI ENS is missing, once we have it we need to add it here
+const ENS_CONTRACT_ADDRESS = {
+ [ETHEREUM_NETWORK.MAINNET]: '0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85',
+ [ETHEREUM_NETWORK.RINKEBY]: '0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85',
+ [ETHEREUM_NETWORK.ENERGY_WEB_CHAIN]: '0x0A6d64413c07E10E890220BBE1c49170080C6Ca0',
+ [ETHEREUM_NETWORK.VOLTA]: '0xd7CeF70Ba7efc2035256d828d5287e2D285CD1ac',
+}
+
// safeTransferFrom(address,address,uint256)
export const SAFE_TRANSFER_FROM_WITHOUT_DATA_HASH = '42842e0e'
@@ -50,12 +58,11 @@ export const getERC721Symbol = async (contractAddress: string): Promise
try {
const ERC721token = await getERC721TokenContract()
const tokenInstance = await ERC721token.at(contractAddress)
- tokenSymbol = tokenInstance.symbol()
+ tokenSymbol = await tokenInstance.symbol()
} catch (err) {
// If the contract address is an ENS token contract, we know that the ERC721 standard is not proper implemented
// The method symbol() is missing
- const ENS_TOKEN_CONTRACT = '0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85'
- if (sameAddress(contractAddress, ENS_TOKEN_CONTRACT)) {
+ if (isENSContract(contractAddress)) {
return 'ENS'
}
console.error(`Failed to retrieve token symbol for ERC721 token ${contractAddress}`)
@@ -64,6 +71,11 @@ export const getERC721Symbol = async (contractAddress: string): Promise
return tokenSymbol
}
+export const isENSContract = (contractAddress: string): boolean => {
+ const { id } = getNetworkInfo()
+ return sameAddress(contractAddress, ENS_CONTRACT_ADDRESS[id])
+}
+
/**
* Verifies if the provided contract is a valid ERC721
* @param {string} contractAddress
diff --git a/src/logic/contracts/safeContracts.ts b/src/logic/contracts/safeContracts.ts
index b9673cf9..cc85b846 100644
--- a/src/logic/contracts/safeContracts.ts
+++ b/src/logic/contracts/safeContracts.ts
@@ -74,24 +74,25 @@ export const getSafeMasterContract = async () => {
return safeMaster
}
-export const getSafeDeploymentTransaction = (safeAccounts, numConfirmations) => {
+export const getSafeDeploymentTransaction = (safeAccounts: string[], numConfirmations: number, safeCreationSalt: number) => {
const gnosisSafeData = safeMaster.methods
.setup(safeAccounts, numConfirmations, ZERO_ADDRESS, '0x', DEFAULT_FALLBACK_HANDLER_ADDRESS, ZERO_ADDRESS, 0, ZERO_ADDRESS)
.encodeABI()
- return proxyFactoryMaster.methods.createProxy(safeMaster.options.address, gnosisSafeData)
+ return proxyFactoryMaster.methods.createProxyWithNonce(safeMaster.options.address, gnosisSafeData, safeCreationSalt)
}
export const estimateGasForDeployingSafe = async (
- safeAccounts,
- numConfirmations,
- userAccount,
+ safeAccounts: string[],
+ numConfirmations: number,
+ userAccount: string,
+ safeCreationSalt: number
) => {
const gnosisSafeData = await safeMaster.methods
.setup(safeAccounts, numConfirmations, ZERO_ADDRESS, '0x', DEFAULT_FALLBACK_HANDLER_ADDRESS, ZERO_ADDRESS, 0, ZERO_ADDRESS)
.encodeABI()
const proxyFactoryData = proxyFactoryMaster.methods
- .createProxy(safeMaster.options.address, gnosisSafeData)
+ .createProxyWithNonce(safeMaster.options.address, gnosisSafeData, safeCreationSalt)
.encodeABI()
const gas = await calculateGasOf(proxyFactoryData, userAccount, proxyFactoryMaster.options.address)
const gasPrice = await calculateGasPrice()
diff --git a/src/logic/safe/store/actions/transactions/fetchTransactions/loadIncomingTransactions.ts b/src/logic/safe/store/actions/transactions/fetchTransactions/loadIncomingTransactions.ts
index d52130a9..2a8d8bab 100644
--- a/src/logic/safe/store/actions/transactions/fetchTransactions/loadIncomingTransactions.ts
+++ b/src/logic/safe/store/actions/transactions/fetchTransactions/loadIncomingTransactions.ts
@@ -10,6 +10,7 @@ import { web3ReadOnly } from 'src/logic/wallets/getWeb3'
import { makeIncomingTransaction } from 'src/logic/safe/store/models/incomingTransaction'
import fetchTransactions from 'src/logic/safe/store/actions/transactions/fetchTransactions/fetchTransactions'
import { TransactionTypes } from 'src/logic/safe/store/models/types/transaction'
+import { isENSContract } from 'src/logic/collectibles/utils'
export type IncomingTxServiceModel = {
blockNumber: number
@@ -76,12 +77,18 @@ const batchIncomingTxsTokenDataRequest = (txs: IncomingTxServiceModel[]) => {
batch.execute()
return Promise.all(whenTxsValues).then((txsValues) =>
- txsValues.map(([tx, symbol, decimals, ethTx, ethTxReceipt]) => [
- tx,
- symbol ? symbol : nativeCoin.symbol,
- decimals ? decimals : nativeCoin.decimals,
- new bn(ethTx?.gasPrice ?? 0).times(ethTxReceipt?.gasUsed ?? 0),
- ]),
+ txsValues.map(([tx, symbolFetched, decimals, ethTx, ethTxReceipt]) => {
+ let symbol = symbolFetched
+ if (!symbolFetched) {
+ symbol = isENSContract(tx.tokenAddress) ? 'ENS' : nativeCoin.symbol
+ }
+ return [
+ tx,
+ symbol,
+ decimals ? decimals : nativeCoin.decimals,
+ new bn(ethTx?.gasPrice ?? 0).times(ethTxReceipt?.gasUsed ?? 0),
+ ]
+ }),
)
}
diff --git a/src/logic/safe/store/selectors/index.ts b/src/logic/safe/store/selectors/index.ts
index df9d6de6..63449c96 100644
--- a/src/logic/safe/store/selectors/index.ts
+++ b/src/logic/safe/store/selectors/index.ts
@@ -208,6 +208,17 @@ export const safeModulesSelector = createSelector(safeSelector, safeFieldSelecto
export const safeFeaturesEnabledSelector = createSelector(safeSelector, safeFieldSelector('featuresEnabled'))
+export const safeOwnersAddressesListSelector = createSelector(
+ safeOwnersSelector,
+ (owners): List => {
+ if (!owners) {
+ return List([])
+ }
+
+ return owners?.map(({ address }) => address)
+ },
+)
+
export const getActiveTokensAddressesForAllSafes = createSelector(safesListSelector, (safes) => {
const addresses = Set().withMutations((set) => {
safes.forEach((safe) => {
diff --git a/src/logic/tokens/utils/tokenHelpers.ts b/src/logic/tokens/utils/tokenHelpers.ts
index fbf6dfe1..c490819d 100644
--- a/src/logic/tokens/utils/tokenHelpers.ts
+++ b/src/logic/tokens/utils/tokenHelpers.ts
@@ -9,6 +9,7 @@ import { ALTERNATIVE_TOKEN_ABI } from 'src/logic/tokens/utils/alternativeAbi'
import { web3ReadOnly as web3 } from 'src/logic/wallets/getWeb3'
import { isEmptyData } from 'src/logic/safe/store/actions/transactions/utils/transactionHelpers'
import { TxServiceModel } from 'src/logic/safe/store/actions/transactions/fetchTransactions/loadOutgoingTransactions'
+import { CALL } from 'src/logic/safe/transactions'
export const getEthAsToken = (balance: string | number): Token => {
const { nativeCoin } = getNetworkInfo()
@@ -33,7 +34,13 @@ export const isAddressAToken = async (tokenAddress: string): Promise =>
}
export const isTokenTransfer = (tx: TxServiceModel): boolean => {
- return !isEmptyData(tx.data) && tx.data?.substring(0, 10) === '0xa9059cbb' && Number(tx.value) === 0
+ return (
+ !isEmptyData(tx.data) &&
+ // Check if contains 'transfer' method code
+ tx.data?.substring(0, 10) === '0xa9059cbb' &&
+ Number(tx.value) === 0 &&
+ tx.operation === CALL
+ )
}
export const getERC20DecimalsAndSymbol = async (
diff --git a/src/logic/wallets/ethAddresses.ts b/src/logic/wallets/ethAddresses.ts
index d45d0fea..834e6654 100644
--- a/src/logic/wallets/ethAddresses.ts
+++ b/src/logic/wallets/ethAddresses.ts
@@ -40,4 +40,4 @@ export const isUserAnOwner = (safe: SafeRecord, userAccount: string): boolean =>
export const isUserAnOwnerOfAnySafe = (safes: List | SafeRecord[], userAccount: string): boolean =>
safes.some((safe: SafeRecord) => isUserAnOwner(safe, userAccount))
-export const isValidEnsName = (name: string): boolean => /^([\w-]+\.)+(eth|test|xyz|luxe)$/.test(name)
+export const isValidEnsName = (name: string): boolean => /^([\w-]+\.)+(eth|test|xyz|luxe|ewc)$/.test(name)
diff --git a/src/routes/open/components/Layout.tsx b/src/routes/open/components/Layout.tsx
index 0aef861f..728276ad 100644
--- a/src/routes/open/components/Layout.tsx
+++ b/src/routes/open/components/Layout.tsx
@@ -7,11 +7,12 @@ import Block from 'src/components/layout/Block'
import Heading from 'src/components/layout/Heading'
import Row from 'src/components/layout/Row'
import { initContracts } from 'src/logic/contracts/safeContracts'
-import Review from 'src/routes/open/components/ReviewInformation'
+import { Review } from 'src/routes/open/components/ReviewInformation'
import SafeNameField from 'src/routes/open/components/SafeNameForm'
-import SafeOwnersFields from 'src/routes/open/components/SafeOwnersConfirmationsForm'
+import { SafeOwnersPage } from 'src/routes/open/components/SafeOwnersConfirmationsForm'
import {
FIELD_CONFIRMATIONS,
+ FIELD_CREATION_PROXY_SALT,
FIELD_SAFE_NAME,
getOwnerAddressBy,
getOwnerNameBy,
@@ -40,6 +41,7 @@ type InitialValuesForm = {
owner0Name?: string
confirmations: string
safeName?: string
+ safeCreationSalt: number
}
const useInitialValuesFrom = (userAccount: string, safeProps?: SafeProps): InitialValuesForm => {
@@ -51,6 +53,7 @@ const useInitialValuesFrom = (userAccount: string, safeProps?: SafeProps): Initi
[getOwnerNameBy(0)]: ownerName || 'My Wallet',
[getOwnerAddressBy(0)]: userAccount,
[FIELD_CONFIRMATIONS]: '1',
+ [FIELD_CREATION_PROXY_SALT]: Date.now(),
}
}
let obj = {}
@@ -68,6 +71,7 @@ const useInitialValuesFrom = (userAccount: string, safeProps?: SafeProps): Initi
...obj,
[FIELD_CONFIRMATIONS]: threshold || '1',
[FIELD_SAFE_NAME]: name,
+ [FIELD_CREATION_PROXY_SALT]: Date.now(),
}
}
@@ -92,7 +96,7 @@ type LayoutProps = {
safeProps?: SafeProps
}
-const Layout = (props: LayoutProps): React.ReactElement => {
+export const Layout = (props: LayoutProps): React.ReactElement => {
const { onCallSafeContractSubmit, safeProps } = props
const provider = useSelector(providerNameSelector)
@@ -129,7 +133,7 @@ const Layout = (props: LayoutProps): React.ReactElement => {
testId="create-safe-form"
>
-
+
@@ -139,5 +143,3 @@ const Layout = (props: LayoutProps): React.ReactElement => {
>
)
}
-
-export default Layout
diff --git a/src/routes/open/components/ReviewInformation/index.tsx b/src/routes/open/components/ReviewInformation/index.tsx
index 1efc0057..4f08ff61 100644
--- a/src/routes/open/components/ReviewInformation/index.tsx
+++ b/src/routes/open/components/ReviewInformation/index.tsx
@@ -13,7 +13,7 @@ import Row from 'src/components/layout/Row'
import OpenPaper from 'src/components/Stepper/OpenPaper'
import { estimateGasForDeployingSafe } from 'src/logic/contracts/safeContracts'
import { formatAmount } from 'src/logic/tokens/utils/formatAmount'
-import { getAccountsFrom, getNamesFrom } from 'src/routes/open/utils/safeDataExtractor'
+import { getAccountsFrom, getNamesFrom, getSafeCreationSaltFrom } from 'src/routes/open/utils/safeDataExtractor'
import { FIELD_CONFIRMATIONS, FIELD_NAME, getNumOwnersFrom } from '../fields'
import { useStyles } from './styles'
@@ -33,20 +33,23 @@ const ReviewComponent = ({ userAccount, values }: ReviewComponentProps) => {
const names = getNamesFrom(values)
const addresses = getAccountsFrom(values)
const numOwners = getNumOwnersFrom(values)
+ const safeCreationSalt = getSafeCreationSaltFrom(values)
useEffect(() => {
const estimateGas = async () => {
if (!addresses.length || !numOwners || !userAccount) {
return
}
- const estimatedGasCosts = (await estimateGasForDeployingSafe(addresses, numOwners, userAccount)).toString()
+ const estimatedGasCosts = (
+ await estimateGasForDeployingSafe(addresses, numOwners, userAccount, safeCreationSalt)
+ ).toString()
const gasCosts = fromTokenUnit(estimatedGasCosts, nativeCoin.decimals)
const formattedGasCosts = formatAmount(gasCosts)
setGasCosts(formattedGasCosts)
}
estimateGas()
- }, [addresses, numOwners, userAccount])
+ }, [addresses, numOwners, safeCreationSalt, userAccount])
return (
<>
@@ -140,7 +143,7 @@ const ReviewComponent = ({ userAccount, values }: ReviewComponentProps) => {
)
}
-const Review = () =>
+export const Review = () =>
function ReviewPage(controls, props): React.ReactElement {
return (
<>
@@ -150,5 +153,3 @@ const Review = () =>
>
)
}
-
-export default Review
diff --git a/src/routes/open/components/SafeOwnersConfirmationsForm/index.tsx b/src/routes/open/components/SafeOwnersConfirmationsForm/index.tsx
index 6951f19a..76494f54 100644
--- a/src/routes/open/components/SafeOwnersConfirmationsForm/index.tsx
+++ b/src/routes/open/components/SafeOwnersConfirmationsForm/index.tsx
@@ -8,7 +8,7 @@ import { getAddressValidator } from './validators'
import QRIcon from 'src/assets/icons/qrcode.svg'
import trash from 'src/assets/icons/trash.svg'
-import ScanQRModal from 'src/components/ScanQRModal'
+import { ScanQRModal } from 'src/components/ScanQRModal'
import OpenPaper from 'src/components/Stepper/OpenPaper'
import AddressInput from 'src/components/forms/AddressInput'
import Field from 'src/components/forms/Field'
@@ -97,10 +97,10 @@ const SafeOwnersForm = (props): React.ReactElement => {
setNumOwners(numOwners + 1)
}
- const handleScan = (value) => {
+ const handleScan = (value: string | null) => {
let scannedAddress = value
- if (scannedAddress.startsWith('ethereum:')) {
+ if (scannedAddress?.startsWith('ethereum:')) {
scannedAddress = scannedAddress.replace('ethereum:', '')
}
@@ -236,21 +236,13 @@ const SafeOwnersForm = (props): React.ReactElement => {
)
}
-const SafeOwnersPage = ({ updateInitialProps }) =>
+export const SafeOwnersPage = () =>
function OpenSafeOwnersPage(controls, { errors, form, values }) {
return (
<>
-
+
>
)
}
-
-export default SafeOwnersPage
diff --git a/src/routes/open/components/SafeOwnersConfirmationsForm/validators.ts b/src/routes/open/components/SafeOwnersConfirmationsForm/validators.ts
index f37cb4b3..b528a0f5 100644
--- a/src/routes/open/components/SafeOwnersConfirmationsForm/validators.ts
+++ b/src/routes/open/components/SafeOwnersConfirmationsForm/validators.ts
@@ -1,6 +1,6 @@
-import { uniqueAddress } from 'src/components/forms/validator'
+import { GenericValidatorType, uniqueAddress } from 'src/components/forms/validator'
-export const getAddressValidator = (addresses, position) => {
+export const getAddressValidator = (addresses: string[], position: number): GenericValidatorType => {
// thanks Rich Harris
// https://twitter.com/Rich_Harris/status/1125850391155965952
const copy = addresses.slice()
diff --git a/src/routes/open/components/fields.ts b/src/routes/open/components/fields.ts
index 38162977..4df7b36e 100644
--- a/src/routes/open/components/fields.ts
+++ b/src/routes/open/components/fields.ts
@@ -2,6 +2,7 @@ export const FIELD_NAME = 'name'
export const FIELD_CONFIRMATIONS = 'confirmations'
export const FIELD_OWNERS = 'owners'
export const FIELD_SAFE_NAME = 'safeName'
+export const FIELD_CREATION_PROXY_SALT = 'safeCreationSalt'
export const getOwnerNameBy = (index) => `owner${index}Name`
export const getOwnerAddressBy = (index) => `owner${index}Address`
diff --git a/src/routes/open/container/Open.tsx b/src/routes/open/container/Open.tsx
index d6f043a3..7161c4e7 100644
--- a/src/routes/open/container/Open.tsx
+++ b/src/routes/open/container/Open.tsx
@@ -4,7 +4,7 @@ import React, { useEffect, useState } from 'react'
import ReactGA from 'react-ga'
import { useDispatch, useSelector } from 'react-redux'
import Opening from 'src/routes/opening'
-import Layout from 'src/routes/open/components/Layout'
+import { Layout } from 'src/routes/open/components/Layout'
import Page from 'src/components/layout/Page'
import { getSafeDeploymentTransaction } from 'src/logic/contracts/safeContracts'
import { checkReceiptStatus } from 'src/logic/wallets/ethTransactions'
@@ -12,6 +12,7 @@ import {
getAccountsFrom,
getNamesFrom,
getOwnersFrom,
+ getSafeCreationSaltFrom,
getSafeNameFrom,
getThresholdFrom,
} from 'src/routes/open/utils/safeDataExtractor'
@@ -58,8 +59,9 @@ export const createSafe = (values, userAccount) => {
const name = getSafeNameFrom(values)
const ownersNames = getNamesFrom(values)
const ownerAddresses = getAccountsFrom(values)
+ const safeCreationSalt = getSafeCreationSaltFrom(values)
- const deploymentTx = getSafeDeploymentTransaction(ownerAddresses, confirmations)
+ const deploymentTx = getSafeDeploymentTransaction(ownerAddresses, confirmations, safeCreationSalt)
const promiEvent = deploymentTx.send({ from: userAccount })
diff --git a/src/routes/open/utils/safeDataExtractor.ts b/src/routes/open/utils/safeDataExtractor.ts
index f7a85b04..fd380228 100644
--- a/src/routes/open/utils/safeDataExtractor.ts
+++ b/src/routes/open/utils/safeDataExtractor.ts
@@ -1,7 +1,7 @@
import { List } from 'immutable'
import { makeOwner } from 'src/logic/safe/store/models/owner'
-import { SafeOwner } from '../../../logic/safe/store/models/safe'
+import { SafeOwner } from 'src/logic/safe/store/models/safe'
export const getAccountsFrom = (values) => {
const accounts = Object.keys(values)
@@ -28,3 +28,5 @@ export const getOwnersFrom = (names, addresses): List => {
export const getThresholdFrom = (values) => Number(values.confirmations)
export const getSafeNameFrom = (values) => values.name
+
+export const getSafeCreationSaltFrom = (values) => values.safeCreationSalt
diff --git a/src/routes/safe/components/AddressBook/CreateEditEntryModal/index.tsx b/src/routes/safe/components/AddressBook/CreateEditEntryModal/index.tsx
index c8c5073a..d77d11e0 100644
--- a/src/routes/safe/components/AddressBook/CreateEditEntryModal/index.tsx
+++ b/src/routes/safe/components/AddressBook/CreateEditEntryModal/index.tsx
@@ -19,8 +19,7 @@ import Col from 'src/components/layout/Col'
import Hairline from 'src/components/layout/Hairline'
import Paragraph from 'src/components/layout/Paragraph'
import Row from 'src/components/layout/Row'
-import { addressBookSelector } from 'src/logic/addressBook/store/selectors'
-import { getAddressesListFromAddressBook } from 'src/logic/addressBook/utils'
+import { addressBookAddressesListSelector } from 'src/logic/addressBook/store/selectors'
export const CREATE_ENTRY_INPUT_NAME_ID = 'create-entry-input-name'
export const CREATE_ENTRY_INPUT_ADDRESS_ID = 'create-entry-input-address'
@@ -42,8 +41,7 @@ const CreateEditEntryModalComponent = ({
}
}
- const addressBook = useSelector(addressBookSelector)
- const addressBookAddressesList = getAddressesListFromAddressBook(addressBook)
+ const addressBookAddressesList = useSelector(addressBookAddressesListSelector)
const entryDoesntExist = uniqueAddress(addressBookAddressesList)
const formMutators = {
diff --git a/src/routes/safe/components/Apps/index.tsx b/src/routes/safe/components/Apps/index.tsx
index 64cd9b74..b4c75d03 100644
--- a/src/routes/safe/components/Apps/index.tsx
+++ b/src/routes/safe/components/Apps/index.tsx
@@ -211,7 +211,10 @@ const Apps = (): React.ReactElement => {
color="secondary"
iconSize="sm"
iconType="info"
- text="These are third-party apps, which means they are not owned, controlled, maintained or audited by Gnosis. Interacting with the apps is at your own risk."
+ text="
+ These are third-party apps, which means they are not owned, controlled, maintained or audited by Gnosis.
+ Interacting with the apps is at your own risk.
+ Any communication within the Apps is for informational purposes only and must not be construed as investment advice to engage in any transaction."
textSize="sm"
/>
diff --git a/src/routes/safe/components/Balances/SendModal/index.tsx b/src/routes/safe/components/Balances/SendModal/index.tsx
index a10b046f..71e6823e 100644
--- a/src/routes/safe/components/Balances/SendModal/index.tsx
+++ b/src/routes/safe/components/Balances/SendModal/index.tsx
@@ -9,7 +9,7 @@ import { CustomTx } from './screens/ContractInteraction/ReviewCustomTx'
import { ContractInteractionTx } from './screens/ContractInteraction'
import { CustomTxProps } from './screens/ContractInteraction/SendCustomTx'
import { ReviewTxProp } from './screens/ReviewTx'
-import { NFTToken } from 'src/logic/collectibles/sources/collectibles'
+import { NFTToken } from 'src/logic/collectibles/sources/collectibles.d'
import { SendCollectibleTxInfo } from './screens/SendCollectible'
const ChooseTxType = React.lazy(() => import('./screens/ChooseTxType'))
diff --git a/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/EthAddressInput/index.tsx b/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/EthAddressInput/index.tsx
index de80622b..1b348ef5 100644
--- a/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/EthAddressInput/index.tsx
+++ b/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/EthAddressInput/index.tsx
@@ -27,7 +27,7 @@ export interface EthAddressInputProps {
text: string
}
-const EthAddressInput = ({
+export const EthAddressInput = ({
isContract = true,
isRequired = true,
name,
@@ -57,6 +57,7 @@ const EthAddressInput = ({
scannedAddress = scannedAddress.replace('ethereum:', '')
}
+ setSelectedEntry({ address: scannedAddress })
onScannedValue(scannedAddress)
closeQrModal()
}
@@ -97,5 +98,3 @@ const EthAddressInput = ({
>
)
}
-
-export default EthAddressInput
diff --git a/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/SendCustomTx/index.tsx b/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/SendCustomTx/index.tsx
index a7e1ff24..837808a1 100644
--- a/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/SendCustomTx/index.tsx
+++ b/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/SendCustomTx/index.tsx
@@ -22,7 +22,7 @@ import Hairline from 'src/components/layout/Hairline'
import Img from 'src/components/layout/Img'
import Paragraph from 'src/components/layout/Paragraph'
import Row from 'src/components/layout/Row'
-import ScanQRModal from 'src/components/ScanQRModal'
+import { ScanQRModal } from 'src/components/ScanQRModal'
import { safeSelector } from 'src/logic/safe/store/selectors'
import SafeInfo from 'src/routes/safe/components/Balances/SendModal/SafeInfo'
import { ContractsAddressBookInput } from 'src/routes/safe/components/Balances/SendModal/screens/AddressBookInput'
diff --git a/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/index.tsx b/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/index.tsx
index bf44d55c..d6428bef 100644
--- a/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/index.tsx
+++ b/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/index.tsx
@@ -11,7 +11,7 @@ import { safeSelector } from 'src/logic/safe/store/selectors'
import Paragraph from 'src/components/layout/Paragraph'
import Buttons from './Buttons'
import ContractABI from './ContractABI'
-import EthAddressInput from './EthAddressInput'
+import { EthAddressInput } from './EthAddressInput'
import FormDivisor from './FormDivisor'
import FormErrorMessage from './FormErrorMessage'
import Header from './Header'
diff --git a/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/CollectibleSelectField/index.tsx b/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/CollectibleSelectField/index.tsx
index 9bb111e9..ddb24d1f 100644
--- a/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/CollectibleSelectField/index.tsx
+++ b/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/CollectibleSelectField/index.tsx
@@ -13,7 +13,7 @@ import Img from 'src/components/layout/Img'
import Paragraph from 'src/components/layout/Paragraph'
import { setImageToPlaceholder } from 'src/routes/safe/components/Balances/utils'
import { textShortener } from 'src/utils/strings'
-import { NFTToken } from 'src/logic/collectibles/sources/collectibles'
+import { NFTToken } from 'src/logic/collectibles/sources/collectibles.d'
const useSelectedCollectibleStyles = makeStyles(selectedTokenStyles)
diff --git a/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/TokenSelectField/index.tsx b/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/TokenSelectField/index.tsx
index d276caca..dab0e19c 100644
--- a/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/TokenSelectField/index.tsx
+++ b/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/TokenSelectField/index.tsx
@@ -14,7 +14,7 @@ import Paragraph from 'src/components/layout/Paragraph'
import { formatAmount } from 'src/logic/tokens/utils/formatAmount'
import { setImageToPlaceholder } from 'src/routes/safe/components/Balances/utils'
import { textShortener } from 'src/utils/strings'
-import { NFTAssets } from 'src/logic/collectibles/sources/collectibles'
+import { NFTAssets } from 'src/logic/collectibles/sources/collectibles.d'
const useSelectedTokenStyles = makeStyles(selectedTokenStyles)
diff --git a/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/index.tsx b/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/index.tsx
index 671a9b70..e56bf7e4 100644
--- a/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/index.tsx
+++ b/src/routes/safe/components/Balances/SendModal/screens/SendCollectible/index.tsx
@@ -21,7 +21,7 @@ import { getNameFromAddressBook } from 'src/logic/addressBook/utils'
import { nftTokensSelector, safeActiveSelectorMap } from 'src/logic/collectibles/store/selectors'
import SafeInfo from 'src/routes/safe/components/Balances/SendModal/SafeInfo'
import { AddressBookInput } from 'src/routes/safe/components/Balances/SendModal/screens/AddressBookInput'
-import { NFTToken } from 'src/logic/collectibles/sources/collectibles'
+import { NFTToken } from 'src/logic/collectibles/sources/collectibles.d'
import { getExplorerInfo } from 'src/config'
import { sameAddress } from 'src/logic/wallets/ethAddresses'
import { sm } from 'src/theme/variables'
diff --git a/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/index.tsx b/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/index.tsx
index 88a170fa..a4e73801 100644
--- a/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/index.tsx
+++ b/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/index.tsx
@@ -2,7 +2,7 @@ import { createStyles, makeStyles } from '@material-ui/core/styles'
import React, { useEffect, useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
-import OwnerForm from './screens/OwnerForm'
+import { OwnerForm } from './screens/OwnerForm'
import ReviewAddOwner from './screens/Review'
import ThresholdForm from './screens/ThresholdForm'
@@ -16,7 +16,7 @@ import createTransaction from 'src/logic/safe/store/actions/createTransaction'
import { safeParamAddressFromStateSelector } from 'src/logic/safe/store/selectors'
import { checksumAddress } from 'src/utils/checksumAddress'
import { makeAddressBookEntry } from 'src/logic/addressBook/model/addressBook'
-import { Dispatch } from 'src/logic/safe/store/actions/types'
+import { Dispatch } from 'src/logic/safe/store/actions/types.d'
const styles = createStyles({
biggerModalWindow: {
diff --git a/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/screens/OwnerForm/index.tsx b/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/screens/OwnerForm/index.tsx
index 85d304e3..73083d62 100644
--- a/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/screens/OwnerForm/index.tsx
+++ b/src/routes/safe/components/Settings/ManageOwners/AddOwnerModal/screens/OwnerForm/index.tsx
@@ -1,5 +1,5 @@
import IconButton from '@material-ui/core/IconButton'
-import { withStyles } from '@material-ui/core/styles'
+import { makeStyles } from '@material-ui/core/styles'
import Close from '@material-ui/icons/Close'
import React from 'react'
import { useSelector } from 'react-redux'
@@ -18,7 +18,7 @@ import Col from 'src/components/layout/Col'
import Hairline from 'src/components/layout/Hairline'
import Paragraph from 'src/components/layout/Paragraph'
import Row from 'src/components/layout/Row'
-import { safeOwnersSelector } from 'src/logic/safe/store/selectors'
+import { safeOwnersAddressesListSelector } from 'src/logic/safe/store/selectors'
export const ADD_OWNER_NAME_INPUT_TEST_ID = 'add-owner-name-input'
export const ADD_OWNER_ADDRESS_INPUT_TEST_ID = 'add-owner-address-testid'
@@ -30,12 +30,20 @@ const formMutators = {
},
}
-const OwnerForm = ({ classes, onClose, onSubmit }) => {
+const useStyles = makeStyles(styles)
+
+type OwnerFormProps = {
+ onClose: () => void
+ onSubmit: (values) => void
+}
+
+export const OwnerForm = ({ onClose, onSubmit }: OwnerFormProps): React.ReactElement => {
+ const classes = useStyles()
const handleSubmit = (values) => {
onSubmit(values)
}
- const owners = useSelector(safeOwnersSelector)
- const ownerDoesntExist = uniqueAddress(owners?.map((o) => o.address) || [])
+ const owners = useSelector(safeOwnersAddressesListSelector)
+ const ownerDoesntExist = uniqueAddress(owners)
return (
<>
@@ -72,7 +80,6 @@ const OwnerForm = ({ classes, onClose, onSubmit }) => {
{
{
-
- {owners?.map(
+ {ownersWithAddressBookName?.map(
(owner) =>
owner.address !== ownerAddress && (
diff --git a/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/index.tsx b/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/index.tsx
index 122a20a0..1968fcc4 100644
--- a/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/index.tsx
+++ b/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/index.tsx
@@ -15,7 +15,7 @@ import { safeParamAddressFromStateSelector, safeThresholdSelector } from 'src/lo
import { checksumAddress } from 'src/utils/checksumAddress'
import { makeAddressBookEntry } from 'src/logic/addressBook/model/addressBook'
import { sameAddress } from 'src/logic/wallets/ethAddresses'
-import { Dispatch } from 'src/logic/safe/store/actions/types'
+import { Dispatch } from 'src/logic/safe/store/actions/types.d'
const styles = createStyles({
biggerModalWindow: {
diff --git a/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/screens/OwnerForm/index.tsx b/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/screens/OwnerForm/index.tsx
index 932da2c5..035a5e8f 100644
--- a/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/screens/OwnerForm/index.tsx
+++ b/src/routes/safe/components/Settings/ManageOwners/ReplaceOwnerModal/screens/OwnerForm/index.tsx
@@ -19,7 +19,7 @@ import Hairline from 'src/components/layout/Hairline'
import Paragraph from 'src/components/layout/Paragraph'
import Row from 'src/components/layout/Row'
import { ScanQRWrapper } from 'src/components/ScanQRModal/ScanQRWrapper'
-import { safeOwnersSelector } from 'src/logic/safe/store/selectors'
+import { safeOwnersAddressesListSelector } from 'src/logic/safe/store/selectors'
import { styles } from './style'
import { getExplorerInfo } from 'src/config'
@@ -39,8 +39,8 @@ const OwnerForm = ({ classes, onClose, onSubmit, ownerAddress, ownerName }) => {
const handleSubmit = (values) => {
onSubmit(values)
}
- const owners = useSelector(safeOwnersSelector)
- const ownerDoesntExist = uniqueAddress(owners?.map((o) => o.address) || [])
+ const owners = useSelector(safeOwnersAddressesListSelector)
+ const ownerDoesntExist = uniqueAddress(owners)
return (
<>
diff --git a/src/test/safe.dom.create.tsx b/src/test/safe.dom.create.tsx
index 032ebbf3..d686009f 100644
--- a/src/test/safe.dom.create.tsx
+++ b/src/test/safe.dom.create.tsx
@@ -1,4 +1,4 @@
-//
+//
import * as React from 'react'
import { } from 'redux'
import { render, fireEvent, act } from '@testing-library/react'
diff --git a/yarn.lock b/yarn.lock
index cc3f7533..d09cb003 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1777,20 +1777,25 @@
"@ledgerhq/logs" "^5.28.0"
rxjs "^6.6.3"
-"@ledgerhq/devices@^5.29.0":
- version "5.29.0"
- resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.29.0.tgz#c808e65c9d3b96c29903980790a3cf0fb43f79ac"
- integrity sha512-Ln2f2n6A/JyFLQbKRMIGCKjgJFSAVaJbwO1W+LOSiQLNL1oLXypWRxrcbeyehQjxSMT2rTkeISOK9BaweWnJFg==
+"@ledgerhq/devices@^5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.30.0.tgz#0e81970988a033316fc936517d4191fe75cde589"
+ integrity sha512-2ubefpOcw7SpU/6E1MM7JNLihOuwvQ73dCSPmxLloxPf1T4S6gOBh4RgB9mal/gwoOwWGVNaR3wGHvqJI8z1Gg==
dependencies:
- "@ledgerhq/errors" "^5.29.0"
- "@ledgerhq/logs" "^5.29.0"
+ "@ledgerhq/errors" "^5.30.0"
+ "@ledgerhq/logs" "^5.30.0"
rxjs "^6.6.3"
-"@ledgerhq/errors@^5.28.0", "@ledgerhq/errors@^5.29.0":
+"@ledgerhq/errors@^5.28.0":
version "5.29.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.29.0.tgz#2e2c5b953e45d9b9f90563d67218549be84eaaed"
integrity sha512-gYit3aWS8BHtE7tt4gMy2FzOl+azKDR4C6CISmeAZrT2euDHB8YOKZcqsrYqeQRUxABXXT81ZIkYx/3hSYeHfQ==
+"@ledgerhq/errors@^5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.30.0.tgz#f8baaf9d0a326abc567f66bbdb0b740674143182"
+ integrity sha512-pSX50OEQqK56WiZG2lIxGijy5QUwiWNDFXzAoPCh2BOGGWhBq6LaYSKQyQaRIpUXzAubt0s1lUj3sHNYTOA9vg==
+
"@ledgerhq/hw-app-eth@^5.21.0":
version "5.28.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-5.28.0.tgz#77bb550fd5fed7c249d4bfec7d4141f474366d35"
@@ -1802,27 +1807,27 @@
bignumber.js "^9.0.1"
rlp "^2.2.6"
-"@ledgerhq/hw-transport-node-hid-noevents@^5.29.0":
- version "5.29.0"
- resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-5.29.0.tgz#fe6d71ea5182cd5fb8efc62889e83aa823cc1d52"
- integrity sha512-rBtAgLoiMvqpxCQZ6VkMCiM4TFcYlQ9o9HPY0PY4RGOFTefWMbpt67CgsIzU+1T7+gbToajlJrSFR/W7ws6Hqw==
+"@ledgerhq/hw-transport-node-hid-noevents@^5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-5.30.0.tgz#b8eb2a6f9e2b00e826252acdf4be16f601160ed0"
+ integrity sha512-pvApZQnIEJxHtOituz9ehbpTzDYwqUXRmqbUe757inkhQ3EhvmZzWmg2zJAt1yKLRcTs5Si/t7PTvK/UW4p20A==
dependencies:
- "@ledgerhq/devices" "^5.29.0"
- "@ledgerhq/errors" "^5.29.0"
- "@ledgerhq/hw-transport" "^5.29.0"
- "@ledgerhq/logs" "^5.29.0"
+ "@ledgerhq/devices" "^5.30.0"
+ "@ledgerhq/errors" "^5.30.0"
+ "@ledgerhq/hw-transport" "^5.30.0"
+ "@ledgerhq/logs" "^5.30.0"
node-hid "1.3.0"
-"@ledgerhq/hw-transport-node-hid-singleton@5.29.0":
- version "5.29.0"
- resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-singleton/-/hw-transport-node-hid-singleton-5.29.0.tgz#a450bddede78982f16aa15917eb434839f27542f"
- integrity sha512-gbNCi+0oaDg9P+Jk59bAl0u5BVglRrouLKpw8TOmwnV9w+WIYVn+yMguwpZ5bidTmbxoM4ypEWbIFRhk8SdZew==
+"@ledgerhq/hw-transport-node-hid-singleton@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-singleton/-/hw-transport-node-hid-singleton-5.30.0.tgz#3242ca2df98abc0ad16d25ee03f620d3b987caca"
+ integrity sha512-V12eblyV0upjkDJiPWFe4bJeogWY9vBAG2p1Kl7dIPOIc4CUn7q+OxtT1EW4hNIsWPr4ONW6Uf2BPYKfLi12cg==
dependencies:
- "@ledgerhq/devices" "^5.29.0"
- "@ledgerhq/errors" "^5.29.0"
- "@ledgerhq/hw-transport" "^5.29.0"
- "@ledgerhq/hw-transport-node-hid-noevents" "^5.29.0"
- "@ledgerhq/logs" "^5.29.0"
+ "@ledgerhq/devices" "^5.30.0"
+ "@ledgerhq/errors" "^5.30.0"
+ "@ledgerhq/hw-transport" "^5.30.0"
+ "@ledgerhq/hw-transport-node-hid-noevents" "^5.30.0"
+ "@ledgerhq/logs" "^5.30.0"
lodash "^4.17.20"
node-hid "1.3.0"
usb-detection "^4.10.0"
@@ -1846,20 +1851,25 @@
"@ledgerhq/errors" "^5.28.0"
events "^3.2.0"
-"@ledgerhq/hw-transport@^5.29.0":
- version "5.29.0"
- resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.29.0.tgz#9830f0c921cda8530169e3710273480b0c1f7532"
- integrity sha512-sONhoZ6rvVnnMtwzc2u+k0uTGyr9OLjFemoQzYrXWRdm1w1D7UbKCl+13o1VYz2LBanh7JaYRUj0uWOahAGorQ==
+"@ledgerhq/hw-transport@^5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.30.0.tgz#6c98c00a5594dc38f4046e2ebdd342f6b14e57b7"
+ integrity sha512-86cKX9yIHP9C/wnVRhm5QnaBPqTWaSxb0Z2BlMLT0xWqQf0RVb9e4pUtfAsGNDhTyN2exQF54+G4IkspsplnKg==
dependencies:
- "@ledgerhq/devices" "^5.29.0"
- "@ledgerhq/errors" "^5.29.0"
+ "@ledgerhq/devices" "^5.30.0"
+ "@ledgerhq/errors" "^5.30.0"
events "^3.2.0"
-"@ledgerhq/logs@^5.28.0", "@ledgerhq/logs@^5.29.0":
+"@ledgerhq/logs@^5.28.0":
version "5.29.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.29.0.tgz#92e0ac8856ac59f9e7e2c286cb4531b724f837bd"
integrity sha512-bYWLCO/Wnwfd47kD5JRiCdBVMAAArFEbisqnZY3J5ZyxUE0va8Ta3z8RO6ClsBEbrtEut+7Xv3R0ejxmPXXYiQ==
+"@ledgerhq/logs@^5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.30.0.tgz#76e8d7e5a06a73c9b99da51fa5befd5cfd5309d4"
+ integrity sha512-wUhg2VTfUrWihjdGqKkH/s7TBzdIM1yyd2LiscYsfTX2I0xYDMnpE+NkMReeGU8PN3QhCPgnlg9/P9V6UWoJBA==
+
"@material-ui/core@4.11.0":
version "4.11.0"
resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.11.0.tgz#b69b26e4553c9e53f2bfaf1053e216a0af9be15a"
@@ -2034,14 +2044,14 @@
resolved "https://registry.yarnpkg.com/@restless/sanitizers/-/sanitizers-0.2.5.tgz#96a5cfa3edb52abd8fa14e77798738f3a067dbec"
integrity sha512-utsOFwv5owNnbj8HijF7uML/AURgUl5YvY4S2gpxQsrp2D1EP/4rQU/HSyYdIQaL89BoZ/5NHveRJrcFyuHo/w==
-"@sentry/browser@5.27.3":
- version "5.27.3"
- resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.27.3.tgz#02e78a4502ee99988d3cbb0075a11ec44b503871"
- integrity sha512-vczS+XTW4Nk2A7TIpAw8IVFHpp+NK6mV9euBG2I61Bs2QbQY9yKLfbjiln/yH2Q8X4THX6MKa0GuiPoCEeq3uw==
+"@sentry/browser@5.27.4":
+ version "5.27.4"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.27.4.tgz#241dedc7d82d3ed2769bfc8e4fb193d10e6a1d4d"
+ integrity sha512-L8Fsnkl3PIak4zJ1pcGDmV92XTQjS2/H6EBgp1rhuOF4OE3L59K8RR73C9w+wVtsIi7nyfYg/FIe8lvG++3Mow==
dependencies:
- "@sentry/core" "5.27.3"
- "@sentry/types" "5.27.3"
- "@sentry/utils" "5.27.3"
+ "@sentry/core" "5.27.4"
+ "@sentry/types" "5.27.4"
+ "@sentry/utils" "5.27.4"
tslib "^1.9.3"
"@sentry/cli@^1.59.0":
@@ -2055,69 +2065,69 @@
progress "^2.0.3"
proxy-from-env "^1.1.0"
-"@sentry/core@5.27.3":
- version "5.27.3"
- resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.27.3.tgz#d7a175b71596b7eb4b2e8b4cd1858a60d95813bb"
- integrity sha512-yqepQO88jSt5hy0awpk61AxI4oHB09LjVbUEk4nJDg+1YXuND23cuZvH+Sp2jCZX2vrsw2tefwflToYfA8/U2w==
+"@sentry/core@5.27.4":
+ version "5.27.4"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.27.4.tgz#4155ee09ee4deed7364918094bf81654dcf681c0"
+ integrity sha512-IbI37cIZU/qBQouuUXaLbGF/9xYFp5STqmj1Gv64l0IZe4JnEp06V3yD5GxQ/mJ78vSfOqfwLooVCUw9FA61sQ==
dependencies:
- "@sentry/hub" "5.27.3"
- "@sentry/minimal" "5.27.3"
- "@sentry/types" "5.27.3"
- "@sentry/utils" "5.27.3"
+ "@sentry/hub" "5.27.4"
+ "@sentry/minimal" "5.27.4"
+ "@sentry/types" "5.27.4"
+ "@sentry/utils" "5.27.4"
tslib "^1.9.3"
-"@sentry/hub@5.27.3":
- version "5.27.3"
- resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.27.3.tgz#f509c2fd38f500afef6030504e82510dbd0649d6"
- integrity sha512-icEH3hr6NVQkpowXZcPOs9IgJZP5lMKtvud4mVioSpkd+NxtRdKrGEX4eF2TCviOJc9Md0mV4K+aL5Au7hxggQ==
+"@sentry/hub@5.27.4":
+ version "5.27.4"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.27.4.tgz#15db6f504672edd70b793e4b3d370dca9cb2fef6"
+ integrity sha512-Ba1AqcjvSd2S+fpdXtXCrVXdrzq9E2Etb2eHUOkEYwSsq7StMOw7E8YHDPAo+to8zUbpMPz/Z9XGhFkyAbImGQ==
dependencies:
- "@sentry/types" "5.27.3"
- "@sentry/utils" "5.27.3"
+ "@sentry/types" "5.27.4"
+ "@sentry/utils" "5.27.4"
tslib "^1.9.3"
-"@sentry/minimal@5.27.3":
- version "5.27.3"
- resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.27.3.tgz#c9263bdd6270bfeae64137177448911dff568e53"
- integrity sha512-ng01cM0rsE1RMjqVTpPLN0ZVkTo0I675usM1krkpQe8ddW6tfQ6EJWpt02/BrpQZRQzTtfWp6/RyB1KFXg6icg==
+"@sentry/minimal@5.27.4":
+ version "5.27.4"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.27.4.tgz#2b331ed43d5f8999606fe9f8bf26a85155e8286c"
+ integrity sha512-biw5YfIQwvDoaRhLarfeRQ6MJ9UJOoDTmu8Kgg18prJy4rtfDowNJP0OBs5XAsTk6SWAXiE3g7vqUJBXgs7BWA==
dependencies:
- "@sentry/hub" "5.27.3"
- "@sentry/types" "5.27.3"
+ "@sentry/hub" "5.27.4"
+ "@sentry/types" "5.27.4"
tslib "^1.9.3"
-"@sentry/react@^5.27.3":
- version "5.27.3"
- resolved "https://registry.yarnpkg.com/@sentry/react/-/react-5.27.3.tgz#aefff1cb2249a4e7f123c7467d1da205d5c02e92"
- integrity sha512-p7E+djSUVKz02HoRVDX+zamjV8+RL4bqoPnS9JQESweB0sRTYlpvi+CqWLYWNWnamWQWOl97hOw/lLDpo4kUSA==
+"@sentry/react@^5.27.0":
+ version "5.27.4"
+ resolved "https://registry.yarnpkg.com/@sentry/react/-/react-5.27.4.tgz#757983dda2b2c8782d4c3a73c85806bb21ec93ed"
+ integrity sha512-nRv/u2nP4cQMWu1Gybv7izIl2VwcM6s6P2hco9RlxrCJUpQIUuHRo4yWqDn+G1Xxdr511yY8p4JR+ESBaRGJFg==
dependencies:
- "@sentry/browser" "5.27.3"
- "@sentry/minimal" "5.27.3"
- "@sentry/types" "5.27.3"
- "@sentry/utils" "5.27.3"
+ "@sentry/browser" "5.27.4"
+ "@sentry/minimal" "5.27.4"
+ "@sentry/types" "5.27.4"
+ "@sentry/utils" "5.27.4"
hoist-non-react-statics "^3.3.2"
tslib "^1.9.3"
-"@sentry/tracing@^5.27.3":
- version "5.27.3"
- resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.27.3.tgz#787e57a2f7071e375f4fad0f3c3a5ff3381928e7"
- integrity sha512-UWrHMdGxPfx1u558CWm1tptc2z0BuqCHVe2+BNN7POahq5BkpbGqaotyPQTBHbfmcs6QGfsMG57ou8HQFrBxyA==
+"@sentry/tracing@^5.27.0":
+ version "5.27.4"
+ resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.27.4.tgz#0f6b0ebfa90b9f5bf5bac1fcf0f196010dbdddac"
+ integrity sha512-f3nG8ozCdcbFOzsnBCZ8w+/WfoNiAd0Ctr643L0rsFbaSzPWxbPMe3LNVrWwFVo6mHacG3/2HYmJ3CYMiWyTKQ==
dependencies:
- "@sentry/hub" "5.27.3"
- "@sentry/minimal" "5.27.3"
- "@sentry/types" "5.27.3"
- "@sentry/utils" "5.27.3"
+ "@sentry/hub" "5.27.4"
+ "@sentry/minimal" "5.27.4"
+ "@sentry/types" "5.27.4"
+ "@sentry/utils" "5.27.4"
tslib "^1.9.3"
-"@sentry/types@5.27.3":
- version "5.27.3"
- resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.27.3.tgz#d377508769bc658d672c287166c7f6c5db45660c"
- integrity sha512-PkWhMArFMxBb1g3HtMEL8Ea9PYae2MU0z9CMIWiqzerFy2ZpKG98IU3pt8ic4JkmKQdwB8hDiZpRPMHhW0WYwQ==
+"@sentry/types@5.27.4":
+ version "5.27.4"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.27.4.tgz#ba7cefae6f77bb39a0ac59aeba1bb23ce4ad5216"
+ integrity sha512-41h3c7tgtSS8UBmfvEckSr+7V7/IVOjt/EiydyOd6s0N18zSFfGY5HdA6g+eFtIJK3DhWkUHCHZNanD5IY5YCQ==
-"@sentry/utils@5.27.3":
- version "5.27.3"
- resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.27.3.tgz#1fc45dfad1f1e4398bee58684d8947666d8d3003"
- integrity sha512-R9WvFrRBALZvCzu/9BsuXBCfkNxz4MwdBNSXaBsJo4afQw1ljkjIc9DpHzlL9S9goIwXo81Buwmr5gGDO6aH+Q==
+"@sentry/utils@5.27.4":
+ version "5.27.4"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.27.4.tgz#d57ccd72a56e2f97e109d632957f6cd11806e992"
+ integrity sha512-shV1I/q+Tob3hUxRj11DfMhe9PNDiv85hUUoRloZGGwu275dMwpswb2uwgSmjc2Ao4pnMKVx8TL1hC3kGLVHTQ==
dependencies:
- "@sentry/types" "5.27.3"
+ "@sentry/types" "5.27.4"
tslib "^1.9.3"
"@sideway/address@^4.1.0":
@@ -2397,16 +2407,16 @@
pretty-hrtime "^1.0.3"
regenerator-runtime "^0.13.3"
-"@storybook/preset-create-react-app@^3.1.4":
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/@storybook/preset-create-react-app/-/preset-create-react-app-3.1.4.tgz#64bb674f69fe860ef1a4909e686775adf6c05fdd"
- integrity sha512-VwzGCvv+HnEDXxSwF6ITRIZ4EaMhiMu1Mxrwm+nb49XTT2VME8VTzmbDjrdpZXPXUJrwLYmvqzaBT/qGZoMlgA==
+"@storybook/preset-create-react-app@^3.1.5":
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/@storybook/preset-create-react-app/-/preset-create-react-app-3.1.5.tgz#af46c9d64c384980d458fe99c10dcbaa623f93fd"
+ integrity sha512-tzYcCRD5j22/HoDZ1tvsKaVnzyd4qqTE9sn3cx56Reb0XHcm4XkvG87jx0NvBGPCZrsThyBAtB3+XNxoFbI+9Q==
dependencies:
"@types/babel__core" "^7.1.7"
"@types/webpack" "^4.41.13"
babel-plugin-react-docgen "^4.1.0"
pnp-webpack-plugin "^1.6.4"
- react-docgen-typescript-plugin "^0.5.0"
+ react-docgen-typescript-plugin "^0.6.2"
semver "^7.3.2"
"@storybook/react@^5.3.19":
@@ -2728,10 +2738,10 @@
dependencies:
source-map-support "^0.5.19"
-"@truffle/codec@^0.7.1":
- version "0.7.1"
- resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.7.1.tgz#2ef0fa40109040796afbebb8812c872122100ae4"
- integrity sha512-mNd6KnW6J0UB1zafGBXDlTEbCMvWpmPAJmzv7aF/nAIaN/F8UePSCiQ1OTQP39Rprj6GFiCCaWVnBAwum6UGSg==
+"@truffle/codec@^0.8.1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.8.1.tgz#1f7b62a9d4063ed1b91ecb81d2d83be4ff97389d"
+ integrity sha512-X6BcpS97zpmLWRoAg9zJJIPoEiAJ3MRRJd5zf+qTmLbYXVhek9frreDMhs4WoaQSe3/DOYjVxtPmwmY4+alVvw==
dependencies:
big.js "^5.2.2"
bn.js "^4.11.8"
@@ -2746,23 +2756,23 @@
utf8 "^3.0.0"
web3-utils "1.2.9"
-"@truffle/contract-schema@^3.3.1":
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.3.1.tgz#66385613d54d76df68a7a2c431fa9d352145a74b"
- integrity sha512-xGBiYiCCW8hKuD/G8xb9w0WUuhdJDmQuz18A2Ens3Y8MO+jWA+Zw7xxZjCtiXAu9440Fj2V/BCXWcV6RxGKgBQ==
+"@truffle/contract-schema@^3.3.2":
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.3.2.tgz#6450738c35859ed087760d826031a8247f7bc907"
+ integrity sha512-PFNUHlcMFh6CDLDXTYCpm1G5rM5EJlneA9ml5y1TbkLgjLMICI2XLilimFZ/DC0THQekHpoQC+W/QMD/OTiTiw==
dependencies:
ajv "^6.10.0"
crypto-js "^3.1.9-1"
debug "^4.1.0"
-"@truffle/contract@4.2.28":
- version "4.2.28"
- resolved "https://registry.yarnpkg.com/@truffle/contract/-/contract-4.2.28.tgz#1cde9706b41b77ac9070de1aa0f1bd7663705ddc"
- integrity sha512-fjHcrVx/ZsAJD2ICNbn2dytwAqzcQUjHBB2k9/laCnk0S59TOK2md/NPGdapzXrbmlRzqWoWBNJXvbPHPbuACA==
+"@truffle/contract@4.2.30":
+ version "4.2.30"
+ resolved "https://registry.yarnpkg.com/@truffle/contract/-/contract-4.2.30.tgz#44a2a20e4baa6b40cbb0748a6bce997c22865bcd"
+ integrity sha512-BXQC+ddH18W9cVoRTlKH7hqnyrOo0HN7/Hyv7UiAgPh4JNpkZVUxFSd+/MLaE5r8NEG2hykDusOVJ3OaR9wvmw==
dependencies:
"@truffle/blockchain-utils" "^0.0.25"
- "@truffle/contract-schema" "^3.3.1"
- "@truffle/debug-utils" "^4.2.14"
+ "@truffle/contract-schema" "^3.3.2"
+ "@truffle/debug-utils" "^5.0.1"
"@truffle/error" "^0.0.11"
"@truffle/interface-adapter" "^0.4.18"
bignumber.js "^7.2.1"
@@ -2775,12 +2785,12 @@
web3-eth-abi "1.2.9"
web3-utils "1.2.9"
-"@truffle/debug-utils@^4.2.14":
- version "4.2.14"
- resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-4.2.14.tgz#28431691bc3a96bad19e31733d957ac79059d4e7"
- integrity sha512-g5UTX2DPTzrjRjBJkviGI2IrQRTTSvqjmNWCNZNXP+vgQKNxL9maLZhQ6oA3BuuByVW/kusgYeXt8+W1zynC8g==
+"@truffle/debug-utils@^5.0.1":
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-5.0.1.tgz#7650f273ddba704377f3a25bd4a10ffb338da8e0"
+ integrity sha512-CDt92c6YmCE72TMxmXMcbK3MPXHPRzhrYshFKY0jlo0T3IhLn3xBMqdqXi7SL9y0gV5U386R2l2lK5a+TGE6vw==
dependencies:
- "@truffle/codec" "^0.7.1"
+ "@truffle/codec" "^0.8.1"
"@trufflesuite/chromafi" "^2.2.1"
chalk "^2.4.2"
debug "^4.1.0"
@@ -3096,7 +3106,7 @@
dependencies:
"@types/node" "*"
-"@types/node@*", "@types/node@^14.14.6":
+"@types/node@*":
version "14.14.6"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.6.tgz#146d3da57b3c636cc0d1769396ce1cfa8991147f"
integrity sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==
@@ -3111,6 +3121,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.67.tgz#4f86badb292e822e3b13730a1f9713ed2377f789"
integrity sha512-R48tgL2izApf+9rYNH+3RBMbRpPeW3N8f0I9HMhggeq4UXwBDqumJ14SDs4ctTMhG11pIOduZ4z3QWGOiMc9Vg==
+"@types/node@^14.14.6":
+ version "14.14.8"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.8.tgz#2127bd81949a95c8b7d3240f3254352d72563aec"
+ integrity sha512-z/5Yd59dCKI5kbxauAJgw6dLPzW+TNOItNE00PkpzNwUIEwdj/Lsqwq94H5DdYBX7C13aRA0CY32BK76+neEUA==
+
"@types/npmlog@^4.1.2":
version "4.1.2"
resolved "https://registry.yarnpkg.com/@types/npmlog/-/npmlog-4.1.2.tgz#d070fe6a6b78755d1092a3dc492d34c3d8f871c4"
@@ -3128,10 +3143,10 @@
dependencies:
"@types/node" "*"
-"@types/prettier@^1.13.2":
- version "1.19.1"
- resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f"
- integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==
+"@types/prettier@^2.1.1":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.5.tgz#b6ab3bba29e16b821d84e09ecfaded462b816b00"
+ integrity sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==
"@types/prop-types@*":
version "15.7.3"
@@ -3222,9 +3237,9 @@
csstype "^3.0.2"
"@types/react@^16.9.55":
- version "16.9.55"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.55.tgz#47078587f5bfe028a23b6b46c7b94ac0d436acff"
- integrity sha512-6KLe6lkILeRwyyy7yG9rULKJ0sXplUsl98MGoCfpteXf9sPWFWWMknDcsvubcpaTdBuxtsLF6HDUwdApZL/xIg==
+ version "16.9.56"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.56.tgz#ea25847b53c5bec064933095fc366b1462e2adf0"
+ integrity sha512-gIkl4J44G/qxbuC6r2Xh+D3CGZpJ+NdWTItAPmZbR5mUS+JQ8Zvzpl0ea5qT/ZT3ZNTUcDKUVqV3xBE8wv/DyQ==
dependencies:
"@types/prop-types" "*"
csstype "^3.0.2"
@@ -3893,6 +3908,11 @@
resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+"@yarnpkg/lockfile@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
+ integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
+
abab@^2.0.0:
version "2.0.5"
resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
@@ -5612,10 +5632,10 @@ bn.js@^5.1.1, bn.js@^5.1.2:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b"
integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==
-bnc-onboard@1.14.0:
- version "1.14.0"
- resolved "https://registry.yarnpkg.com/bnc-onboard/-/bnc-onboard-1.14.0.tgz#7ab5000a4541be5ff6545edb86c8dc76d5f1f054"
- integrity sha512-++wK33BMWLvogo+k4BaHOn25LC7RBT0qsECQh8llv1jHd8r53OKF19PzanZ1J9MH+tB7EQkb8/mInbGKJSlU3w==
+bnc-onboard@1.15.0:
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/bnc-onboard/-/bnc-onboard-1.15.0.tgz#5de6b30160024f2889e8463ef72b9004bc56800f"
+ integrity sha512-gy4STqY9G3qNR/TZgUF6wwmEWWo4bOC1x+aawF7fVCFVJz9/nmhwCVj+NCjaTNZYOwepfOnJWsiADDHxiuAaoQ==
dependencies:
"@ledgerhq/hw-app-eth" "^5.21.0"
"@ledgerhq/hw-transport-u2f" "^5.21.0"
@@ -7336,9 +7356,9 @@ csstype@^2.5.2, csstype@^2.5.7:
integrity sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A==
csstype@^3.0.2:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.4.tgz#b156d7be03b84ff425c9a0a4b1e5f4da9c5ca888"
- integrity sha512-xc8DUsCLmjvCfoD7LTGE0ou2MIWLx0K9RCZwSHMOdynqRsP4MtUcLeqh1HcQ2dInwDTqn+3CE0/FZh1et+p4jA==
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.5.tgz#7fdec6a28a67ae18647c51668a9ff95bb2fa7bb8"
+ integrity sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==
currency-flags@2.1.2:
version "2.1.2"
@@ -8048,10 +8068,10 @@ electron-updater@4.3.5:
lodash.isequal "^4.5.0"
semver "^7.3.2"
-electron@9.3.3:
- version "9.3.3"
- resolved "https://registry.yarnpkg.com/electron/-/electron-9.3.3.tgz#99a6619d5df68f97697a5d1d82ef3a8a63fcdf36"
- integrity sha512-xghKeUY1qgnEcJ5w2rXo/toH+8NT2Dktx2aAxBNPV7CIJr3mejJJAPwLbycwtddzr37tgKxHeHlc8ivfKtMkJQ==
+electron@^9.3.3:
+ version "9.3.4"
+ resolved "https://registry.yarnpkg.com/electron/-/electron-9.3.4.tgz#d62dd9f8abc93c009878714de9e60db030361a05"
+ integrity sha512-OHP8qMKgW8D8GtH+altB22WJw/lBOyyVdoz5e8D0/iPBmJU3Jm93vO4z4Eh/9DvdSXlH8bMHUCMLL9PVW6f+tw==
dependencies:
"@electron/get" "^1.0.1"
"@types/node" "^12.0.12"
@@ -8356,10 +8376,10 @@ escodegen@^1.11.0, escodegen@^1.9.1:
optionalDependencies:
source-map "~0.6.1"
-eslint-config-prettier@6.14.0:
- version "6.14.0"
- resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.14.0.tgz#390e7863a8ae99970981933826476169285b3a27"
- integrity sha512-DbVwh0qZhAC7CNDWcq8cBdK6FcVHiMTKmCypOPWeZkp9hJ8xYwTaWSa6bb6cjfi8KOeJy0e9a8Izxyx+O4+gCQ==
+eslint-config-prettier@^6.14.0:
+ version "6.15.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9"
+ integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==
dependencies:
get-stdin "^6.0.0"
@@ -8422,7 +8442,7 @@ eslint-plugin-import@2.20.1:
read-pkg-up "^2.0.0"
resolve "^1.12.0"
-eslint-plugin-import@2.22.1:
+eslint-plugin-import@^2.22.1:
version "2.22.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702"
integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==
@@ -8520,7 +8540,7 @@ eslint-plugin-react@^7.21.5:
resolve "^1.18.1"
string.prototype.matchall "^4.0.2"
-eslint-plugin-sort-destructure-keys@1.3.5:
+eslint-plugin-sort-destructure-keys@^1.3.5:
version "1.3.5"
resolved "https://registry.yarnpkg.com/eslint-plugin-sort-destructure-keys/-/eslint-plugin-sort-destructure-keys-1.3.5.tgz#c6f45c3e58d4435564025a6ca5f4a838010800fd"
integrity sha512-JmVpidhDsLwZsmRDV7Tf/vZgOAOEQGkLtwToSvX5mD8fuWYS/xkgMRBsalW1fGlc8CgJJwnzropt4oMQ7YCHLg==
@@ -9749,6 +9769,14 @@ find-versions@^3.2.0:
dependencies:
semver-regex "^2.0.0"
+find-yarn-workspace-root@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db"
+ integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==
+ dependencies:
+ fs-extra "^4.0.3"
+ micromatch "^3.1.4"
+
flat-cache@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
@@ -9931,7 +9959,7 @@ fs-extra@^0.30.0:
path-is-absolute "^1.0.0"
rimraf "^2.2.8"
-fs-extra@^4.0.2:
+fs-extra@^4.0.2, fs-extra@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
@@ -9940,7 +9968,7 @@ fs-extra@^4.0.2:
jsonfile "^4.0.0"
universalify "^0.1.0"
-fs-extra@^7.0.0:
+fs-extra@^7.0.0, fs-extra@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
@@ -12607,6 +12635,13 @@ kind-of@^6.0.0, kind-of@^6.0.2:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+klaw-sync@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c"
+ integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+
klaw@^1.0.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
@@ -14619,6 +14654,24 @@ pascalcase@^0.1.1:
resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+patch-package@^6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39"
+ integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^1.2.1"
+ fs-extra "^7.0.1"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.0"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+
path-browserify@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
@@ -15573,6 +15626,11 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po
source-map "^0.6.1"
supports-color "^6.1.0"
+postinstall-postinstall@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3"
+ integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==
+
preact@10.4.1:
version "10.4.1"
resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431"
@@ -15652,16 +15710,11 @@ prettier-linter-helpers@^1.0.0:
dependencies:
fast-diff "^1.1.2"
-prettier@2.1.2:
+prettier@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5"
integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==
-prettier@^1.14.2:
- version "1.19.1"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
- integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
-
pretty-bytes@^5.1.0:
version "5.4.1"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.4.1.tgz#cd89f79bbcef21e3d21eb0da68ffe93f803e884b"
@@ -15988,10 +16041,10 @@ query-string@6.13.5:
split-on-first "^1.0.0"
strict-uri-encode "^2.0.0"
-query-string@6.13.6:
- version "6.13.6"
- resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.6.tgz#e5ac7c74f2a5da43fbca0b883b4f0bafba439966"
- integrity sha512-/WWZ7d9na6s2wMEGdVCVgKWE9Rt7nYyNIf7k8xmHXcesPMlEzicWo3lbYwHyA4wBktI2KrXxxZeACLbE84hvSQ==
+query-string@6.13.7:
+ version "6.13.7"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.7.tgz#af53802ff6ed56f3345f92d40a056f93681026ee"
+ integrity sha512-CsGs8ZYb39zu0WLkeOhe0NMePqgYdAuCqxOYKDR5LVCytDZYMGx3Bb+xypvQvPHVPijRXB0HZNFllCzHRe4gEA==
dependencies:
decode-uri-component "^0.2.0"
split-on-first "^1.0.0"
@@ -16195,10 +16248,10 @@ react-docgen-typescript-loader@^3.7.2:
loader-utils "^1.2.3"
react-docgen-typescript "^1.15.0"
-react-docgen-typescript-plugin@^0.5.0:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-0.5.2.tgz#2b294d75ef3145c36303da82be5d447cb67dc0dc"
- integrity sha512-NQfWyWLmzUnedkiN2nPDb6Nkm68ik6fqbC3UvgjqYSeZsbKijXUA4bmV6aU7qICOXdop9PevPdjEgJuAN0nNVQ==
+react-docgen-typescript-plugin@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-0.6.2.tgz#c83305206c61d5c7e004eaf2dc4661367ddc105d"
+ integrity sha512-Orw0WKdJGAg5eMZGbEMw/rKonoxbi8epU6RJWTW3ukWuTarxckFXTltGvm8XADAWlBHak30KD71XThtJruxfTg==
dependencies:
debug "^4.1.1"
endent "^2.0.1"
@@ -16290,10 +16343,10 @@ react-focus-lock@^2.1.0:
use-callback-ref "^1.2.1"
use-sidecar "^1.0.1"
-react-ga@3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/react-ga/-/react-ga-3.2.0.tgz#a8ea91e8e681f49d30afcee72d71fc5c71b67d57"
- integrity sha512-YHHG5QIzRdDToB9ST1/BrGQhLZPzkrNjoeTu3SZLgwdqzeA9F2XOStuOGXAp1ak/SAo9pyR1Uo/hY0C5wZwfqA==
+react-ga@3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/react-ga/-/react-ga-3.2.1.tgz#ad2a6f848cc9555d63c188d37d6e11798393e4ed"
+ integrity sha512-uRwNVd7seL2I2lZBE7et8Ul0r/xNDIQkZ43QmnMrcZwY8dNB5UgPjPJA6E18xFtArLgDK/dy/O0TzYqWCsMHDg==
react-helmet-async@^1.0.2:
version "1.0.7"
@@ -16336,7 +16389,7 @@ react-inspector@^4.0.0:
is-dom "^1.0.9"
prop-types "^15.6.1"
-react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.9.0:
+react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.9.0:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -16391,16 +16444,16 @@ react-qr-reader@^2.2.1:
prop-types "^15.7.2"
webrtc-adapter "^7.2.1"
-react-redux@7.2.1:
- version "7.2.1"
- resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.1.tgz#8dedf784901014db2feca1ab633864dee68ad985"
- integrity sha512-T+VfD/bvgGTUA74iW9d2i5THrDQWbweXP0AVNI8tNd1Rk5ch1rnMiJkDD67ejw7YBKM4+REvcvqRuWJb7BLuEg==
+react-redux@7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.2.tgz#03862e803a30b6b9ef8582dadcc810947f74b736"
+ integrity sha512-8+CQ1EvIVFkYL/vu6Olo7JFLWop1qRUeb46sGtIMDCSpgwPQq8fPLpirIB0iTqFe9XYEFPHssdX8/UwN6pAkEA==
dependencies:
- "@babel/runtime" "^7.5.5"
- hoist-non-react-statics "^3.3.0"
+ "@babel/runtime" "^7.12.1"
+ hoist-non-react-statics "^3.3.2"
loose-envify "^1.4.0"
prop-types "^15.7.2"
- react-is "^16.9.0"
+ react-is "^16.13.1"
react-router-dom@5.2.0:
version "5.2.0"
@@ -16530,10 +16583,10 @@ react-transition-group@^4.4.0:
loose-envify "^1.4.0"
prop-types "^15.6.2"
-react-window@^1.8.5:
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.5.tgz#a56b39307e79979721021f5d06a67742ecca52d1"
- integrity sha512-HeTwlNa37AFa8MDZFZOKcNEkuF2YflA0hpGPiTT9vR7OawEt+GZbfM6wqkBahD3D3pUjIabQYzsnY/BSJbgq6Q==
+react-window@^1.8.6:
+ version "1.8.6"
+ resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.6.tgz#d011950ac643a994118632665aad0c6382e2a112"
+ integrity sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==
dependencies:
"@babel/runtime" "^7.0.0"
memoize-one ">=3.1.1 <6"
@@ -18470,10 +18523,10 @@ style-loader@^1.0.0:
loader-utils "^2.0.0"
schema-utils "^2.7.0"
-styled-components@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.2.0.tgz#6dcb5aa8a629c84b8d5ab34b7167e3e0c6f7ed74"
- integrity sha512-9qE8Vgp8C5cpGAIdFaQVAl89Zgx1TDM4Yf4tlHbO9cPijtpSXTMLHy9lmP0lb+yImhgPFb1AmZ1qMUubmg3HLg==
+styled-components@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.2.1.tgz#6ed7fad2dc233825f64c719ffbdedd84ad79101a"
+ integrity sha512-sBdgLWrCFTKtmZm/9x7jkIabjFNVzCUeKfoQsM6R3saImkUnjx0QYdLwJHBjY9ifEcmjDamJDVfknWm1yxZPxQ==
dependencies:
"@babel/helper-module-imports" "^7.0.0"
"@babel/traverse" "^7.4.5"
@@ -19028,18 +19081,18 @@ ts-essentials@^6.0.3:
resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.7.tgz#5f4880911b7581a873783740ce8b94da163d18a6"
integrity sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==
-ts-generator@^0.0.8:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.0.8.tgz#7bd48ca064db026d9520bcb682b69efc20971d6a"
- integrity sha512-Gi+aZCELpVL7Mqb+GuMgM+n8JZ/arZZib1iD/R9Ok8JDjOCOCrqS9b1lr72ku7J45WeDCFZxyJoRsiQvhokCnw==
+ts-generator@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab"
+ integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==
dependencies:
"@types/mkdirp" "^0.5.2"
- "@types/prettier" "^1.13.2"
+ "@types/prettier" "^2.1.1"
"@types/resolve" "^0.0.8"
chalk "^2.4.1"
glob "^7.1.2"
mkdirp "^0.5.1"
- prettier "^1.14.2"
+ prettier "^2.1.2"
resolve "^1.8.1"
ts-essentials "^1.0.0"
@@ -19152,10 +19205,10 @@ type@^2.0.0:
resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f"
integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==
-typechain@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/typechain/-/typechain-2.0.1.tgz#4fa91006d871e5805d41f265880603d0817b74d6"
- integrity sha512-GVigpARnr2tV9L+8WecF5huK+qEonNgh+Vp9UR/EayoTV4+3G8Yabhvf+p/QJVOz3JLM4Eo3ERxYmjjJMRXc/A==
+typechain@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/typechain/-/typechain-4.0.0.tgz#8a81fe40c4020b370f0c4671b7f966134d20c58c"
+ integrity sha512-XQUojf02bXyxXNGI0WeCphnh++5eWr9wYH8jm0XqHNv8yENpFrRyX8ffVlkhCnDOOB/jEJJVQytLAOU+Qn0N9Q==
dependencies:
command-line-args "^4.0.7"
debug "^4.1.1"
@@ -19163,7 +19216,7 @@ typechain@^2.0.0:
js-sha3 "^0.8.0"
lodash "^4.17.15"
ts-essentials "^6.0.3"
- ts-generator "^0.0.8"
+ ts-generator "^0.1.1"
typed-styles@^0.0.7:
version "0.0.7"