Allow to load Safe Apps with ENS names (#911)
* Remove ethereum-ens in favour of web3.eth.ens * Allow load Apps from ENS names * remove comment * review changes * replace REACT_APP_IPFS_NODE by REACT_APP_IPFS_GATEWAY * review fixes * TS Errors * fix paths * Fix validtor * Apps: Move App form to a separate file * re-build * review changes * fix iframeEl type * remove validation * fix type * update web3 version * remove type in getContentFromENS Co-authored-by: lukasschor <lukas.schor@gnosis.pm> Co-authored-by: Mati Dastugue <matias.dastugue@altoros.com> Co-authored-by: Fernando <fernando.greco@gmail.com> Co-authored-by: Mikhail Mikheev <mmvsha73@gmail.com>
This commit is contained in:
parent
7a20aaac42
commit
4065d5a007
|
@ -9,6 +9,7 @@ REACT_APP_GOOGLE_ANALYTICS_ID_MAINNET=
|
|||
|
||||
# For all environments
|
||||
REACT_APP_INFURA_TOKEN=
|
||||
REACT_APP_IPFS_GATEWAY=https://ipfs.io/ipfs
|
||||
PUBLIC_URL=/app/
|
||||
|
||||
# For production environments
|
||||
|
|
19
package.json
19
package.json
|
@ -167,10 +167,9 @@
|
|||
"electron-is-dev": "^1.1.0",
|
||||
"electron-log": "4.1.2",
|
||||
"electron-updater": "4.3.1",
|
||||
"ethereum-ens": "0.8.0",
|
||||
"express": "^4.17.1",
|
||||
"final-form-calculate": "^1.3.1",
|
||||
"final-form": "4.19.1",
|
||||
"final-form-calculate": "^1.3.1",
|
||||
"history": "4.10.1",
|
||||
"immortal-db": "^1.0.2",
|
||||
"immutable": "^4.0.0-rc.9",
|
||||
|
@ -182,9 +181,10 @@
|
|||
"polished": "3.6.3",
|
||||
"qrcode.react": "1.0.0",
|
||||
"query-string": "6.12.1",
|
||||
"react": "16.13.1",
|
||||
"react-dom": "16.13.1",
|
||||
"react-final-form-listeners": "^1.0.2",
|
||||
"react-final-form": "6.4.0",
|
||||
"react-final-form-listeners": "^1.0.2",
|
||||
"react-ga": "^2.7.0",
|
||||
"react-hot-loader": "4.12.21",
|
||||
"react-qr-reader": "^2.2.1",
|
||||
|
@ -192,16 +192,15 @@
|
|||
"react-router-dom": "5.2.0",
|
||||
"react-scripts": "^3.4.1",
|
||||
"react-window": "^1.8.5",
|
||||
"react": "16.13.1",
|
||||
"recompose": "^0.30.0",
|
||||
"redux": "4.0.5",
|
||||
"redux-actions": "^2.6.5",
|
||||
"redux-thunk": "^2.3.0",
|
||||
"redux": "4.0.5",
|
||||
"reselect": "^4.0.0",
|
||||
"semver": "7.3.2",
|
||||
"styled-components": "^5.0.1",
|
||||
"truffle-contract": "4.0.31",
|
||||
"web3": "1.2.7"
|
||||
"web3": "1.2.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@testing-library/jest-dom": "^4.2.4",
|
||||
|
@ -209,24 +208,24 @@
|
|||
"@testing-library/user-event": "^7.1.2",
|
||||
"@types/jest": "^25.2.1",
|
||||
"@types/node": "^13.11.0",
|
||||
"@types/react-dom": "^16.9.6",
|
||||
"@types/react": "^16.9.32",
|
||||
"@types/react-dom": "^16.9.6",
|
||||
"@typescript-eslint/eslint-plugin": "^2.34.0",
|
||||
"@typescript-eslint/parser": "^2.34.0",
|
||||
"autoprefixer": "9.7.6",
|
||||
"cross-env": "^7.0.2",
|
||||
"dotenv-expand": "^5.1.0",
|
||||
"dotenv": "^8.2.0",
|
||||
"dotenv-expand": "^5.1.0",
|
||||
"electron": "7.1.8",
|
||||
"electron-builder": "22.2.0",
|
||||
"electron-notarize": "^0.2.1",
|
||||
"electron": "7.1.8",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-prettier": "6.11.0",
|
||||
"eslint-plugin-import": "2.20.2",
|
||||
"eslint-plugin-jsx-a11y": "^6.2.3",
|
||||
"eslint-plugin-prettier": "^3.1.2",
|
||||
"eslint-plugin-react": "^7.18.3",
|
||||
"eslint-plugin-sort-destructure-keys": "1.3.4",
|
||||
"eslint": "^6.8.0",
|
||||
"ethereumjs-abi": "0.6.8",
|
||||
"husky": "^4.2.2",
|
||||
"lint-staged": "10.2.2",
|
||||
|
|
|
@ -13,7 +13,19 @@ export const simpleMemoize = (fn) => {
|
|||
}
|
||||
}
|
||||
|
||||
export const required = (value?: string) => (value && value.trim() !== '' ? undefined : 'Required')
|
||||
export const required = (value?: string) => {
|
||||
const required = 'Required'
|
||||
|
||||
if (!value) {
|
||||
return required
|
||||
}
|
||||
|
||||
if (typeof value === 'string' && !value.trim().length) {
|
||||
return required
|
||||
}
|
||||
|
||||
return undefined
|
||||
}
|
||||
|
||||
export const mustBeInteger = (value: string) =>
|
||||
!Number.isInteger(Number(value)) || value.includes('.') ? 'Must be an integer' : undefined
|
||||
|
|
|
@ -13,7 +13,7 @@ import { getWeb3 } from 'src/logic/wallets/getWeb3'
|
|||
*/
|
||||
const generateBatchRequests = ({ abi, address, batch, context, methods }: any): any => {
|
||||
const web3 = getWeb3()
|
||||
const contractInstance = new web3.eth.Contract(abi, address)
|
||||
const contractInstance: any = new web3.eth.Contract(abi, address)
|
||||
const localBatch = batch ? null : new web3.BatchRequest()
|
||||
|
||||
const values = methods.map((methodObject) => {
|
||||
|
|
|
@ -29,7 +29,7 @@ export const estimateTxGasCosts = async (safeAddress, to, data, tx?: any, preApp
|
|||
try {
|
||||
const web3 = getWeb3()
|
||||
const from = await getAccountFrom(web3)
|
||||
const safeInstance = new web3.eth.Contract(GnosisSafeSol.abi as any, safeAddress)
|
||||
const safeInstance: any = new web3.eth.Contract(GnosisSafeSol.abi as any, safeAddress)
|
||||
const nonce = await safeInstance.methods.nonce().call()
|
||||
const threshold = await safeInstance.methods.getThreshold().call()
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ export const getApprovalTransaction = async ({
|
|||
try {
|
||||
const web3 = getWeb3()
|
||||
|
||||
const contract = new web3.eth.Contract(GnosisSafeSol.abi as any, safeInstance.address)
|
||||
const contract: any = new web3.eth.Contract(GnosisSafeSol.abi as any, safeInstance.address)
|
||||
|
||||
return contract.methods.approveHash(txHash)
|
||||
} catch (err) {
|
||||
|
@ -64,7 +64,7 @@ export const getExecutionTransaction = async ({
|
|||
}) => {
|
||||
try {
|
||||
const web3 = getWeb3()
|
||||
const contract = new web3.eth.Contract(GnosisSafeSol.abi as any, safeInstance.address)
|
||||
const contract: any = new web3.eth.Contract(GnosisSafeSol.abi as any, safeInstance.address)
|
||||
|
||||
return contract.methods.execTransaction(
|
||||
to,
|
||||
|
|
|
@ -59,7 +59,7 @@ export const isAddressAToken = async (tokenAddress) => {
|
|||
export const hasDecimalsMethod = async (address) => {
|
||||
try {
|
||||
const web3 = getWeb3()
|
||||
const token = new web3.eth.Contract(ERC20Detailed.abi as any, address)
|
||||
const token: any = new web3.eth.Contract(ERC20Detailed.abi as any, address)
|
||||
await token.methods.decimals().call()
|
||||
return true
|
||||
} catch (e) {
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import ENS from 'ethereum-ens'
|
||||
import Web3 from 'web3'
|
||||
|
||||
import { sameAddress } from './ethAddresses'
|
||||
|
@ -116,10 +115,9 @@ export const getProviderInfo = async (web3Provider, providerName = 'Wallet') =>
|
|||
}
|
||||
}
|
||||
|
||||
export const getAddressFromENS = async (name) => {
|
||||
const ens = new ENS(web3)
|
||||
return await ens.resolver(name).addr()
|
||||
}
|
||||
export const getAddressFromENS = (name: string) => web3.eth.ens.getAddress(name)
|
||||
|
||||
export const getContentFromENS = (name: string) => web3.eth.ens.getContenthash(name)
|
||||
|
||||
export const setWeb3 = (provider) => {
|
||||
web3 = new Web3(provider)
|
||||
|
|
|
@ -0,0 +1,203 @@
|
|||
import { Checkbox, Text, TextField } from '@gnosis.pm/safe-react-components'
|
||||
import memoize from 'lodash.memoize'
|
||||
import React, { useState } from 'react'
|
||||
import { FormSpy } from 'react-final-form'
|
||||
import styled from 'styled-components'
|
||||
|
||||
import Field from 'src/components/forms/Field'
|
||||
import DebounceValidationField from 'src/components/forms/Field/DebounceValidationField'
|
||||
import GnoForm from 'src/components/forms/GnoForm'
|
||||
import { required } from 'src/components/forms/validator'
|
||||
import Img from 'src/components/layout/Img'
|
||||
import { getContentFromENS } from 'src/logic/wallets/getWeb3'
|
||||
import appsIconSvg from 'src/routes/safe/components/Transactions/TxsTable/TxType/assets/appsIcon.svg'
|
||||
import { isValid as isURLValid } from 'src/utils/url'
|
||||
|
||||
import { getAppInfoFromUrl } from './utils'
|
||||
import { SafeApp } from './types'
|
||||
|
||||
const APP_INFO: SafeApp = {
|
||||
id: undefined,
|
||||
url: '',
|
||||
name: '',
|
||||
iconUrl: appsIconSvg,
|
||||
error: false,
|
||||
}
|
||||
|
||||
const StyledText = styled(Text)`
|
||||
margin-bottom: 19px;
|
||||
`
|
||||
|
||||
const StyledTextFileAppName = styled(TextField)`
|
||||
&& {
|
||||
width: 335px;
|
||||
}
|
||||
`
|
||||
|
||||
const AppInfo = styled.div`
|
||||
margin: 36px 0 24px 0;
|
||||
|
||||
img {
|
||||
margin-right: 10px;
|
||||
}
|
||||
`
|
||||
|
||||
const StyledCheckbox = styled(Checkbox)`
|
||||
margin: 0;
|
||||
`
|
||||
|
||||
const uniqueAppValidator = memoize((appList, value) => {
|
||||
const exists = appList.some((a) => {
|
||||
try {
|
||||
const currentUrl = new URL(a.url)
|
||||
const newUrl = new URL(value)
|
||||
return currentUrl.href === newUrl.href
|
||||
} catch (error) {
|
||||
return 'There was a problem trying to validate the URL existence.'
|
||||
}
|
||||
})
|
||||
return exists ? 'This app is already registered.' : undefined
|
||||
})
|
||||
|
||||
const getIpfsLinkFromEns = memoize(async (name) => {
|
||||
try {
|
||||
const content = await getContentFromENS(name)
|
||||
if (content && content.protocolType === 'ipfs') {
|
||||
return `${process.env.REACT_APP_IPFS_GATEWAY}/${content.decoded}/`
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
return undefined
|
||||
}
|
||||
})
|
||||
|
||||
const getUrlFromFormValue = memoize(async (value: string) => {
|
||||
const isUrlValid = isURLValid(value)
|
||||
let ensContent
|
||||
if (!isUrlValid) {
|
||||
ensContent = await getIpfsLinkFromEns(value)
|
||||
}
|
||||
|
||||
if (!isUrlValid && ensContent === undefined) {
|
||||
return undefined
|
||||
}
|
||||
return isUrlValid ? value : ensContent
|
||||
})
|
||||
|
||||
const curriedSafeAppValidator = memoize((appList) => async (value: string) => {
|
||||
const url = await getUrlFromFormValue(value)
|
||||
|
||||
if (!url) {
|
||||
return 'Provide a valid url or ENS name.'
|
||||
}
|
||||
|
||||
const appExistsRes = uniqueAppValidator(appList, url)
|
||||
if (appExistsRes) {
|
||||
return appExistsRes
|
||||
}
|
||||
|
||||
const appInfo = await getAppInfoFromUrl(url)
|
||||
if (appInfo.error) {
|
||||
return 'This is not a valid Safe app.'
|
||||
}
|
||||
})
|
||||
|
||||
const composeValidatorsApps = (...validators: Function[]) => (value, values, meta) => {
|
||||
if (!meta.modified) {
|
||||
return
|
||||
}
|
||||
return validators.reduce((error, validator) => error || validator(value), undefined)
|
||||
}
|
||||
|
||||
type Props = {
|
||||
formId: string
|
||||
appList: Array<SafeApp>
|
||||
closeModal: () => void
|
||||
onAppAdded: (app: SafeApp) => void
|
||||
setIsSubmitDisabled: (status: boolean) => void
|
||||
}
|
||||
|
||||
const AddAppForm = ({ appList, formId, closeModal, onAppAdded, setIsSubmitDisabled }: Props) => {
|
||||
const [appInfo, setAppInfo] = useState<SafeApp>(APP_INFO)
|
||||
const safeAppValidator = curriedSafeAppValidator(appList)
|
||||
|
||||
const onFormStatusChange = async ({ pristine, valid, validating, values, errors }) => {
|
||||
if (!pristine) {
|
||||
setIsSubmitDisabled(validating || !valid)
|
||||
}
|
||||
|
||||
if (validating) {
|
||||
return
|
||||
}
|
||||
|
||||
if (!values.appUrl || !values.appUrl.length || errors.appUrl) {
|
||||
setAppInfo(APP_INFO)
|
||||
return
|
||||
}
|
||||
|
||||
const url = await getUrlFromFormValue(values.appUrl)
|
||||
const appInfo = await getAppInfoFromUrl(url)
|
||||
setAppInfo({ ...appInfo })
|
||||
}
|
||||
|
||||
const handleSubmit = () => {
|
||||
closeModal()
|
||||
onAppAdded(appInfo)
|
||||
}
|
||||
|
||||
return (
|
||||
<GnoForm
|
||||
initialValues={{
|
||||
appUrl: '',
|
||||
agreed: false,
|
||||
}}
|
||||
// submit is triggered from ManageApps Component
|
||||
onSubmit={handleSubmit}
|
||||
testId={formId}
|
||||
>
|
||||
{() => (
|
||||
<>
|
||||
<StyledText size="xl">Add custom app</StyledText>
|
||||
<DebounceValidationField
|
||||
component={TextField}
|
||||
label="App URL"
|
||||
name="appUrl"
|
||||
placeholder="App URL"
|
||||
type="text"
|
||||
validate={composeValidatorsApps(required, safeAppValidator)}
|
||||
/>
|
||||
|
||||
<AppInfo>
|
||||
<Img alt="Token image" height={55} src={appInfo.iconUrl} />
|
||||
<StyledTextFileAppName label="App name" readOnly value={appInfo.name} />
|
||||
</AppInfo>
|
||||
|
||||
<FormSpy
|
||||
onChange={onFormStatusChange}
|
||||
subscription={{
|
||||
values: true,
|
||||
valid: true,
|
||||
errors: true,
|
||||
pristine: true,
|
||||
validating: true,
|
||||
}}
|
||||
/>
|
||||
|
||||
<Field
|
||||
component={StyledCheckbox}
|
||||
label={
|
||||
<p>
|
||||
This app is not a Gnosis product and I agree to use this app <br /> at my own risk.
|
||||
</p>
|
||||
}
|
||||
name="agreed"
|
||||
type="checkbox"
|
||||
validate={required}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
</GnoForm>
|
||||
)
|
||||
}
|
||||
|
||||
export default AddAppForm
|
|
@ -1,166 +1,22 @@
|
|||
import { ButtonLink, Checkbox, ManageListModal, Text, TextField } from '@gnosis.pm/safe-react-components'
|
||||
import { ButtonLink, ManageListModal } from '@gnosis.pm/safe-react-components'
|
||||
import React, { useState } from 'react'
|
||||
import { FormSpy } from 'react-final-form'
|
||||
import styled from 'styled-components'
|
||||
|
||||
import { getAppInfoFromUrl } from './utils'
|
||||
|
||||
import Field from 'src/components/forms/Field'
|
||||
import DebounceValidationField from 'src/components/forms/Field/DebounceValidationField'
|
||||
import GnoForm from 'src/components/forms/GnoForm'
|
||||
import { required } from 'src/components/forms/validator'
|
||||
import Img from 'src/components/layout/Img'
|
||||
import appsIconSvg from 'src/routes/safe/components/Transactions/TxsTable/TxType/assets/appsIcon.svg'
|
||||
import { isValid as isURLValid } from 'src/utils/url'
|
||||
import AddAppFrom from './AddAppForm'
|
||||
import { SafeApp } from './types'
|
||||
|
||||
const FORM_ID = 'add-apps-form'
|
||||
|
||||
const StyledText = styled(Text)`
|
||||
margin-bottom: 19px;
|
||||
`
|
||||
|
||||
const StyledTextFileAppName = styled(TextField)`
|
||||
&& {
|
||||
width: 335px;
|
||||
}
|
||||
`
|
||||
|
||||
const AppInfo = styled.div`
|
||||
margin: 36px 0 24px 0;
|
||||
|
||||
img {
|
||||
margin-right: 10px;
|
||||
}
|
||||
`
|
||||
|
||||
const StyledCheckbox = styled(Checkbox)`
|
||||
margin: 0;
|
||||
`
|
||||
const APP_INFO = { iconUrl: appsIconSvg, name: '', error: false }
|
||||
|
||||
const urlValidator = (value) => {
|
||||
return isURLValid(value) ? undefined : 'Please, provide a valid url'
|
||||
type Props = {
|
||||
appList: Array<SafeApp>
|
||||
onAppAdded: (app: any) => void
|
||||
onAppToggle: (appId: string, enabled: boolean) => void
|
||||
}
|
||||
|
||||
const composeValidatorsApps = (...validators) => (value, values, meta) => {
|
||||
if (!meta.modified) {
|
||||
return
|
||||
}
|
||||
return validators.reduce((error, validator) => error || validator(value), undefined)
|
||||
}
|
||||
|
||||
const ManageApps = ({ appList, onAppAdded, onAppToggle }) => {
|
||||
const ManageApps = ({ appList, onAppAdded, onAppToggle }: Props) => {
|
||||
const [isOpen, setIsOpen] = useState(false)
|
||||
|
||||
const [appInfo, setAppInfo] = useState(APP_INFO)
|
||||
const [isSubmitDisabled, setIsSubmitDisabled] = useState(true)
|
||||
|
||||
const onItemToggle = (itemId, checked) => {
|
||||
onAppToggle(itemId, checked)
|
||||
}
|
||||
|
||||
const handleSubmit = () => {
|
||||
setIsOpen(false)
|
||||
onAppAdded(appInfo)
|
||||
}
|
||||
|
||||
const cleanAppInfo = () => setAppInfo(APP_INFO)
|
||||
|
||||
const safeAppValidator = async (value) => {
|
||||
const appInfo = await getAppInfoFromUrl(value)
|
||||
|
||||
if (appInfo.error) {
|
||||
setAppInfo(APP_INFO)
|
||||
return 'This is not a valid Safe app.'
|
||||
}
|
||||
|
||||
setAppInfo({ ...appInfo })
|
||||
}
|
||||
|
||||
const uniqueAppValidator = (value) => {
|
||||
const exists = appList.find((a) => {
|
||||
try {
|
||||
const currentUrl = new URL(a.url)
|
||||
const newUrl = new URL(value)
|
||||
return currentUrl.href === newUrl.href
|
||||
} catch (error) {
|
||||
return 'There was a problem trying to validate the URL existence.'
|
||||
}
|
||||
})
|
||||
return exists ? 'This app is already registered.' : undefined
|
||||
}
|
||||
|
||||
const onFormStatusChange = ({ pristine, valid, validating }) => {
|
||||
if (!pristine) {
|
||||
setIsSubmitDisabled(validating || !valid || appInfo.error)
|
||||
}
|
||||
}
|
||||
|
||||
const customRequiredValidator = (value) => {
|
||||
if (!value || !value.length) {
|
||||
setAppInfo(APP_INFO)
|
||||
return 'Required'
|
||||
}
|
||||
}
|
||||
|
||||
const getAddAppForm = () => {
|
||||
return (
|
||||
<GnoForm
|
||||
initialValues={{
|
||||
appUrl: '',
|
||||
agreed: false,
|
||||
}}
|
||||
onSubmit={handleSubmit}
|
||||
testId={FORM_ID}
|
||||
>
|
||||
{() => (
|
||||
<>
|
||||
<StyledText size="xl">Add custom app</StyledText>
|
||||
<DebounceValidationField
|
||||
component={TextField}
|
||||
label="App URL"
|
||||
name="appUrl"
|
||||
placeholder="App URL"
|
||||
type="text"
|
||||
validate={composeValidatorsApps(
|
||||
customRequiredValidator,
|
||||
urlValidator,
|
||||
uniqueAppValidator,
|
||||
safeAppValidator,
|
||||
)}
|
||||
/>
|
||||
|
||||
<AppInfo>
|
||||
<Img alt="Token image" height={55} src={appInfo.iconUrl} />
|
||||
<StyledTextFileAppName label="App name" readOnly value={appInfo.name} />
|
||||
</AppInfo>
|
||||
|
||||
<FormSpy
|
||||
onChange={onFormStatusChange}
|
||||
subscription={{
|
||||
valid: true,
|
||||
pristine: true,
|
||||
validating: true,
|
||||
}}
|
||||
/>
|
||||
|
||||
<Field
|
||||
component={StyledCheckbox}
|
||||
label={
|
||||
<p>
|
||||
This app is not a Gnosis product and I agree to use this app <br /> at my own risk.
|
||||
</p>
|
||||
}
|
||||
name="agreed"
|
||||
type="checkbox"
|
||||
validate={required}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
</GnoForm>
|
||||
)
|
||||
}
|
||||
|
||||
const onSubmitForm = () => {
|
||||
// This sucks, but it's the way the docs suggest
|
||||
// https://github.com/final-form/react-final-form/blob/master/docs/faq.md#via-documentgetelementbyid
|
||||
|
@ -169,16 +25,17 @@ const ManageApps = ({ appList, onAppAdded, onAppToggle }) => {
|
|||
|
||||
const toggleOpen = () => setIsOpen(!isOpen)
|
||||
|
||||
const closeModal = () => {
|
||||
setIsOpen(false)
|
||||
cleanAppInfo()
|
||||
}
|
||||
const closeModal = () => setIsOpen(false)
|
||||
|
||||
const getItemList = () =>
|
||||
appList.map((a) => {
|
||||
return { ...a, checked: !a.disabled }
|
||||
})
|
||||
|
||||
const onItemToggle = (itemId, checked) => {
|
||||
onAppToggle(itemId, checked)
|
||||
}
|
||||
|
||||
const ButtonLinkAux: any = ButtonLink
|
||||
|
||||
return (
|
||||
|
@ -190,7 +47,15 @@ const ManageApps = ({ appList, onAppAdded, onAppToggle }) => {
|
|||
<ManageListModal
|
||||
addButtonLabel="Add custom app"
|
||||
defaultIconUrl={appsIconSvg}
|
||||
formBody={getAddAppForm()}
|
||||
formBody={
|
||||
<AddAppFrom
|
||||
formId={FORM_ID}
|
||||
appList={appList}
|
||||
closeModal={closeModal}
|
||||
onAppAdded={onAppAdded}
|
||||
setIsSubmitDisabled={setIsSubmitDisabled}
|
||||
/>
|
||||
}
|
||||
isSubmitFormDisabled={isSubmitDisabled}
|
||||
itemList={getItemList()}
|
||||
onClose={closeModal}
|
||||
|
|
|
@ -21,6 +21,7 @@ import {
|
|||
} from 'src/routes/safe/store/selectors'
|
||||
import { loadFromStorage, saveToStorage } from 'src/utils/storage'
|
||||
import { isSameHref } from 'src/utils/url'
|
||||
import { SafeApp } from './types'
|
||||
|
||||
const APPS_STORAGE_KEY = 'APPS_STORAGE_KEY'
|
||||
const APPS_LEGAL_DISCLAIMER_STORAGE_KEY = 'APPS_LEGAL_DISCLAIMER_STORAGE_KEY'
|
||||
|
@ -43,12 +44,13 @@ const operations = {
|
|||
}
|
||||
|
||||
function Apps({ closeModal, closeSnackbar, enqueueSnackbar, openModal }) {
|
||||
const [appList, setAppList] = useState([])
|
||||
const [appList, setAppList] = useState<Array<SafeApp>>([])
|
||||
const [legalDisclaimerAccepted, setLegalDisclaimerAccepted] = useState(false)
|
||||
const [selectedApp, setSelectedApp] = useState()
|
||||
const [selectedApp, setSelectedApp] = useState<string>()
|
||||
const [loading, setLoading] = useState(true)
|
||||
const [appIsLoading, setAppIsLoading] = useState(true)
|
||||
const [iframeEl, setIframeEl] = useState(null)
|
||||
const [iframeEl, setIframeEl] = useState<HTMLIFrameElement | null>(null)
|
||||
|
||||
const history = useHistory()
|
||||
const granted = useSelector(grantedSelector)
|
||||
const safeName = useSelector(safeNameSelector)
|
||||
|
@ -145,7 +147,7 @@ function Apps({ closeModal, closeSnackbar, enqueueSnackbar, openModal }) {
|
|||
)
|
||||
}
|
||||
|
||||
const onAppAdded = (app) => {
|
||||
const onAppAdded = (app: SafeApp) => {
|
||||
const newAppList = [
|
||||
{ url: app.url, disabled: false },
|
||||
...appList.map((a) => ({
|
||||
|
|
|
@ -17,7 +17,7 @@ const multiSendAbi = [
|
|||
|
||||
const sendTransactions = (dispatch, safeAddress, txs, enqueueSnackbar, closeSnackbar, origin) => {
|
||||
const web3 = getWeb3()
|
||||
const multiSend = new web3.eth.Contract(multiSendAbi as any, multiSendAddress)
|
||||
const multiSend: any = new web3.eth.Contract(multiSendAbi as any, multiSendAddress)
|
||||
|
||||
const joinedTxs = txs
|
||||
.map((tx) =>
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
export type SafeApp = {
|
||||
id: string | undefined
|
||||
url: string
|
||||
name: string
|
||||
iconUrl: string
|
||||
disabled?: boolean
|
||||
error: boolean
|
||||
}
|
|
@ -2,6 +2,8 @@ import axios from 'axios'
|
|||
|
||||
import appsIconSvg from 'src/routes/safe/components/Transactions/TxsTable/TxType/assets/appsIcon.svg'
|
||||
|
||||
import { SafeApp } from './types'
|
||||
|
||||
const removeLastTrailingSlash = (url) => {
|
||||
if (url.substr(-1) === '/') {
|
||||
return url.substr(0, url.length - 1)
|
||||
|
@ -10,7 +12,7 @@ const removeLastTrailingSlash = (url) => {
|
|||
}
|
||||
|
||||
const gnosisAppsUrl = removeLastTrailingSlash(process.env.REACT_APP_GNOSIS_APPS_URL)
|
||||
export const staticAppsList = [
|
||||
export const staticAppsList: Array<{ url: string; disabled: boolean }> = [
|
||||
{ url: `${gnosisAppsUrl}/compound`, disabled: false },
|
||||
{ url: `${gnosisAppsUrl}/aave`, disabled: false },
|
||||
{ url: `${gnosisAppsUrl}/pool-together`, disabled: false },
|
||||
|
@ -28,10 +30,10 @@ export const getAppInfoFromOrigin = (origin) => {
|
|||
}
|
||||
}
|
||||
|
||||
export const getAppInfoFromUrl = async (appUrl) => {
|
||||
export const getAppInfoFromUrl = async (appUrl: string): Promise<SafeApp> => {
|
||||
let res = { id: undefined, url: appUrl, name: 'unknown', iconUrl: appsIconSvg, error: true }
|
||||
|
||||
if (!appUrl) {
|
||||
if (!appUrl.length) {
|
||||
return res
|
||||
}
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ export const formMutators = {
|
|||
|
||||
export const createTxObject = (method, contractAddress, values) => {
|
||||
const web3 = getWeb3()
|
||||
const contract = new web3.eth.Contract([method], contractAddress)
|
||||
const contract: any = new web3.eth.Contract([method], contractAddress)
|
||||
const { inputs, name } = method
|
||||
const args = inputs.map(({ type }, index) => values[`methodInput-${name}_${index}_${type}`])
|
||||
|
||||
|
|
284
yarn.lock
284
yarn.lock
|
@ -3918,7 +3918,7 @@ bluebird-lst@^1.0.9:
|
|||
dependencies:
|
||||
bluebird "^3.5.5"
|
||||
|
||||
bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.5:
|
||||
bluebird@^3.5.0, bluebird@^3.5.5:
|
||||
version "3.7.2"
|
||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
|
||||
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
|
||||
|
@ -6722,7 +6722,7 @@ eth-block-tracker@^4.2.0, eth-block-tracker@^4.4.1, eth-block-tracker@^4.4.2:
|
|||
pify "^3.0.0"
|
||||
safe-event-emitter "^1.0.1"
|
||||
|
||||
eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.0:
|
||||
eth-ens-namehash@2.0.8:
|
||||
version "2.0.8"
|
||||
resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf"
|
||||
integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88=
|
||||
|
@ -6907,18 +6907,6 @@ ethereum-common@0.2.0:
|
|||
resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca"
|
||||
integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==
|
||||
|
||||
ethereum-ens@0.8.0:
|
||||
version "0.8.0"
|
||||
resolved "https://registry.yarnpkg.com/ethereum-ens/-/ethereum-ens-0.8.0.tgz#6d0f79acaa61fdbc87d2821779c4e550243d4c57"
|
||||
integrity sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==
|
||||
dependencies:
|
||||
bluebird "^3.4.7"
|
||||
eth-ens-namehash "^2.0.0"
|
||||
js-sha3 "^0.5.7"
|
||||
pako "^1.0.4"
|
||||
underscore "^1.8.3"
|
||||
web3 "^1.0.0-beta.34"
|
||||
|
||||
ethereum-private-key-to-address@0.0.3:
|
||||
version "0.0.3"
|
||||
resolved "https://registry.yarnpkg.com/ethereum-private-key-to-address/-/ethereum-private-key-to-address-0.0.3.tgz#1f1dccaefd1198c2dcde55501f331a846bd0aad0"
|
||||
|
@ -11935,7 +11923,7 @@ pad@^3.2.0:
|
|||
dependencies:
|
||||
wcwidth "^1.0.1"
|
||||
|
||||
pako@^1.0.4, pako@~1.0.5:
|
||||
pako@~1.0.5:
|
||||
version "1.0.11"
|
||||
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
|
||||
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
|
||||
|
@ -16094,11 +16082,6 @@ underscore@1.9.1:
|
|||
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
|
||||
integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
|
||||
|
||||
underscore@^1.8.3:
|
||||
version "1.10.2"
|
||||
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf"
|
||||
integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==
|
||||
|
||||
unicode-canonical-property-names-ecmascript@^1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
|
||||
|
@ -16535,16 +16518,6 @@ web3-bzz@1.2.1:
|
|||
swarm-js "0.1.39"
|
||||
underscore "1.9.1"
|
||||
|
||||
web3-bzz@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.7.tgz#aa0f3d162f0777a5f35367dc5b70012dd1e129d0"
|
||||
integrity sha512-iTIWBR+Z+Bn09WprtKm46LmyNOasg2lUn++AjXkBTB8UNxlUybxtza84yl2ETTZUs0zuFzdSSAEgbjhygG+9oA==
|
||||
dependencies:
|
||||
"@types/node" "^10.12.18"
|
||||
got "9.6.0"
|
||||
swarm-js "^0.1.40"
|
||||
underscore "1.9.1"
|
||||
|
||||
web3-bzz@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.8.tgz#7ff2c2de362f82ae3825e48c70ec63b3aca2b8ef"
|
||||
|
@ -16564,15 +16537,6 @@ web3-core-helpers@1.2.1:
|
|||
web3-eth-iban "1.2.1"
|
||||
web3-utils "1.2.1"
|
||||
|
||||
web3-core-helpers@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.7.tgz#522f859775ea0d15e7e40359c46d4efc5da92aee"
|
||||
integrity sha512-bdU++9QATGeCetVrMp8pV97aQtVkN5oLBf/TWu/qumC6jK/YqrvLlBJLdwbz0QveU8zOSap6GCvJbqKvmmbV2A==
|
||||
dependencies:
|
||||
underscore "1.9.1"
|
||||
web3-eth-iban "1.2.7"
|
||||
web3-utils "1.2.7"
|
||||
|
||||
web3-core-helpers@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.8.tgz#86776d8f658b63bb630c84a314686661e599aa68"
|
||||
|
@ -16593,17 +16557,6 @@ web3-core-method@1.2.1:
|
|||
web3-core-subscriptions "1.2.1"
|
||||
web3-utils "1.2.1"
|
||||
|
||||
web3-core-method@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.7.tgz#73fd80d2bf0765ff6efc454db49ac83d1769a45e"
|
||||
integrity sha512-e1TI0QUnByDMbQ8QHwnjxfjKw0LIgVRY4TYrlPijET9ebqUJU1HCayn/BHIMpV6LKyR1fQj9EldWyT64wZQXkg==
|
||||
dependencies:
|
||||
underscore "1.9.1"
|
||||
web3-core-helpers "1.2.7"
|
||||
web3-core-promievent "1.2.7"
|
||||
web3-core-subscriptions "1.2.7"
|
||||
web3-utils "1.2.7"
|
||||
|
||||
web3-core-method@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.8.tgz#f28a79935432aebfa019e4a50f9b6ae6c9ef4297"
|
||||
|
@ -16623,13 +16576,6 @@ web3-core-promievent@1.2.1:
|
|||
any-promise "1.3.0"
|
||||
eventemitter3 "3.1.2"
|
||||
|
||||
web3-core-promievent@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.7.tgz#fc7fa489f4cf76a040800f3dfd4b45c51bd3a39f"
|
||||
integrity sha512-jNmsM/czCeMGQqKKwM9/HZVTJVIF96hdMVNN/V9TGvp+EEE7vDhB4pUocDnc/QF9Z/5QFBCVmvNWttlRgZmU0A==
|
||||
dependencies:
|
||||
eventemitter3 "3.1.2"
|
||||
|
||||
web3-core-promievent@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.8.tgz#a93ca2a19cae8b60883412619e04e69e11804eb5"
|
||||
|
@ -16648,17 +16594,6 @@ web3-core-requestmanager@1.2.1:
|
|||
web3-providers-ipc "1.2.1"
|
||||
web3-providers-ws "1.2.1"
|
||||
|
||||
web3-core-requestmanager@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.7.tgz#9da0efce898ead7004d4ac50f748f5131cfe4d79"
|
||||
integrity sha512-HJb/txjHixu1dxIebiZQKBoJCaNu4gsh7mq/uj6Z/w6tIHbybL90s/7ADyMED353yyJ2tDWtYJqeMVAR+KtdaA==
|
||||
dependencies:
|
||||
underscore "1.9.1"
|
||||
web3-core-helpers "1.2.7"
|
||||
web3-providers-http "1.2.7"
|
||||
web3-providers-ipc "1.2.7"
|
||||
web3-providers-ws "1.2.7"
|
||||
|
||||
web3-core-requestmanager@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.8.tgz#da7259e72a433858d04c59b999c5116bfb797c09"
|
||||
|
@ -16679,15 +16614,6 @@ web3-core-subscriptions@1.2.1:
|
|||
underscore "1.9.1"
|
||||
web3-core-helpers "1.2.1"
|
||||
|
||||
web3-core-subscriptions@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.7.tgz#30c64aede03182832883b17c77e21cbb0933c86e"
|
||||
integrity sha512-W/CzQYOUawdMDvkgA/fmLsnG5aMpbjrs78LZMbc0MFXLpH3ofqAgO2by4QZrrTShUUTeWS0ZuEkFFL/iFrSObw==
|
||||
dependencies:
|
||||
eventemitter3 "3.1.2"
|
||||
underscore "1.9.1"
|
||||
web3-core-helpers "1.2.7"
|
||||
|
||||
web3-core-subscriptions@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.8.tgz#50945498fb0bd655f842cbcc13873d96956aa93e"
|
||||
|
@ -16707,19 +16633,6 @@ web3-core@1.2.1:
|
|||
web3-core-requestmanager "1.2.1"
|
||||
web3-utils "1.2.1"
|
||||
|
||||
web3-core@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.7.tgz#9248b04331e458c76263d758c51b0cc612953900"
|
||||
integrity sha512-QA0MTae0gXcr3KHe3cQ4x56+Wh43ZKWfMwg1gfCc3NNxPRM1jJ8qudzyptCAUcxUGXWpDG8syLIn1APDz5J8BQ==
|
||||
dependencies:
|
||||
"@types/bn.js" "^4.11.4"
|
||||
"@types/node" "^12.6.1"
|
||||
bignumber.js "^9.0.0"
|
||||
web3-core-helpers "1.2.7"
|
||||
web3-core-method "1.2.7"
|
||||
web3-core-requestmanager "1.2.7"
|
||||
web3-utils "1.2.7"
|
||||
|
||||
web3-core@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.8.tgz#2a488bb11519b71e7738265329bddc00fc200dd3"
|
||||
|
@ -16742,15 +16655,6 @@ web3-eth-abi@1.2.1:
|
|||
underscore "1.9.1"
|
||||
web3-utils "1.2.1"
|
||||
|
||||
web3-eth-abi@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.7.tgz#6f3471b578649fddd844a14d397a3dd430fc44a5"
|
||||
integrity sha512-4FnlT1q+D0XBkxSMXlIb/eG337uQeMaUdtVQ4PZ3XzxqpcoDuMgXm4o+3NRxnWmr4AMm6QKjM+hcC7c0mBKcyg==
|
||||
dependencies:
|
||||
ethers "4.0.0-beta.3"
|
||||
underscore "1.9.1"
|
||||
web3-utils "1.2.7"
|
||||
|
||||
web3-eth-abi@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.8.tgz#7537138f3e5cd1ccf98233fa07f388aa8dc1fff1"
|
||||
|
@ -16777,23 +16681,6 @@ web3-eth-accounts@1.2.1:
|
|||
web3-core-method "1.2.1"
|
||||
web3-utils "1.2.1"
|
||||
|
||||
web3-eth-accounts@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.7.tgz#087f55d04a01b815b93151aac2fc1677436b9c59"
|
||||
integrity sha512-AE7QWi/iIQIjXwlAPtlMabm/OPFF0a1PhxT1EiTckpYNP8fYs6jW7lYxEtJPPJIKqfMjoi1xkEqTVR1YZQ88lg==
|
||||
dependencies:
|
||||
"@web3-js/scrypt-shim" "^0.1.0"
|
||||
crypto-browserify "3.12.0"
|
||||
eth-lib "^0.2.8"
|
||||
ethereumjs-common "^1.3.2"
|
||||
ethereumjs-tx "^2.1.1"
|
||||
underscore "1.9.1"
|
||||
uuid "3.3.2"
|
||||
web3-core "1.2.7"
|
||||
web3-core-helpers "1.2.7"
|
||||
web3-core-method "1.2.7"
|
||||
web3-utils "1.2.7"
|
||||
|
||||
web3-eth-accounts@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.8.tgz#e63afc6d4902f2beb0cf60e6b755c86fa5b5ccd7"
|
||||
|
@ -16825,21 +16712,6 @@ web3-eth-contract@1.2.1:
|
|||
web3-eth-abi "1.2.1"
|
||||
web3-utils "1.2.1"
|
||||
|
||||
web3-eth-contract@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.7.tgz#13d7f6003d6221f9a5fd61c2d3b5d039477c9674"
|
||||
integrity sha512-uW23Y0iL7XroRNbf9fWZ1N6OYhEYTJX8gTuYASuRnpYrISN5QGiQML6pq/NCzqypR1bl5E0fuINZQSK/xefIVw==
|
||||
dependencies:
|
||||
"@types/bn.js" "^4.11.4"
|
||||
underscore "1.9.1"
|
||||
web3-core "1.2.7"
|
||||
web3-core-helpers "1.2.7"
|
||||
web3-core-method "1.2.7"
|
||||
web3-core-promievent "1.2.7"
|
||||
web3-core-subscriptions "1.2.7"
|
||||
web3-eth-abi "1.2.7"
|
||||
web3-utils "1.2.7"
|
||||
|
||||
web3-eth-contract@1.2.8, web3-eth-contract@^1.2.7:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.8.tgz#ff75920ac698a70781edcebbf75287a6d0f14499"
|
||||
|
@ -16869,20 +16741,6 @@ web3-eth-ens@1.2.1:
|
|||
web3-eth-contract "1.2.1"
|
||||
web3-utils "1.2.1"
|
||||
|
||||
web3-eth-ens@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.7.tgz#0bfa7d4b6c7753abbb31a2eb01a364b538f4c860"
|
||||
integrity sha512-SPRnvUNWQ0CnnTDBteGIJkvFWEizJcAHlVsrFLICwcwFZu+appjX1UOaoGu2h3GXWtc/XZlu7B451Gi+Os2cTg==
|
||||
dependencies:
|
||||
eth-ens-namehash "2.0.8"
|
||||
underscore "1.9.1"
|
||||
web3-core "1.2.7"
|
||||
web3-core-helpers "1.2.7"
|
||||
web3-core-promievent "1.2.7"
|
||||
web3-eth-abi "1.2.7"
|
||||
web3-eth-contract "1.2.7"
|
||||
web3-utils "1.2.7"
|
||||
|
||||
web3-eth-ens@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.8.tgz#247daddfdbf7533adb0f45cd2f75c75e52f7e678"
|
||||
|
@ -16906,14 +16764,6 @@ web3-eth-iban@1.2.1:
|
|||
bn.js "4.11.8"
|
||||
web3-utils "1.2.1"
|
||||
|
||||
web3-eth-iban@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.7.tgz#832809c28586be3c667a713b77a2bcba11b7970f"
|
||||
integrity sha512-2NrClz1PoQ3nSJBd+91ylCOVga9qbTxjRofq/oSCoHVAEvz3WZyttx9k5DC+0rWqwJF1h69ufFvdHAAlmN/4lg==
|
||||
dependencies:
|
||||
bn.js "4.11.8"
|
||||
web3-utils "1.2.7"
|
||||
|
||||
web3-eth-iban@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.8.tgz#414e80a7fb2d1ea16490bc2c8fc29a996aec5612"
|
||||
|
@ -16933,18 +16783,6 @@ web3-eth-personal@1.2.1:
|
|||
web3-net "1.2.1"
|
||||
web3-utils "1.2.1"
|
||||
|
||||
web3-eth-personal@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.7.tgz#322cc2b14c37737b21772a53e4185686a04bf9be"
|
||||
integrity sha512-2OAa1Spz0uB29dwCM8+1y0So7E47A4gKznjBEwXIYEcUIsvwT5X7ofFhC2XxyRpqlIWZSQAxRSSJFyupRRXzyw==
|
||||
dependencies:
|
||||
"@types/node" "^12.6.1"
|
||||
web3-core "1.2.7"
|
||||
web3-core-helpers "1.2.7"
|
||||
web3-core-method "1.2.7"
|
||||
web3-net "1.2.7"
|
||||
web3-utils "1.2.7"
|
||||
|
||||
web3-eth-personal@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.8.tgz#8ebb27210b4c9c9555a30c5bb2ce8db12f84cd24"
|
||||
|
@ -16976,25 +16814,6 @@ web3-eth@1.2.1:
|
|||
web3-net "1.2.1"
|
||||
web3-utils "1.2.1"
|
||||
|
||||
web3-eth@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.7.tgz#9427daefd3641200679c2946f77fc184dbfb5b4c"
|
||||
integrity sha512-ljLd0oB4IjWkzFGVan4HkYhJXhSXgn9iaSaxdJixKGntZPgWMJfxeA+uLwTrlxrWzhvy4f+39WnT7wCh5e9TGg==
|
||||
dependencies:
|
||||
underscore "1.9.1"
|
||||
web3-core "1.2.7"
|
||||
web3-core-helpers "1.2.7"
|
||||
web3-core-method "1.2.7"
|
||||
web3-core-subscriptions "1.2.7"
|
||||
web3-eth-abi "1.2.7"
|
||||
web3-eth-accounts "1.2.7"
|
||||
web3-eth-contract "1.2.7"
|
||||
web3-eth-ens "1.2.7"
|
||||
web3-eth-iban "1.2.7"
|
||||
web3-eth-personal "1.2.7"
|
||||
web3-net "1.2.7"
|
||||
web3-utils "1.2.7"
|
||||
|
||||
web3-eth@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.8.tgz#cf6a16fae4d7c12b90cfb6ef570cb1a2acc34c1b"
|
||||
|
@ -17023,15 +16842,6 @@ web3-net@1.2.1:
|
|||
web3-core-method "1.2.1"
|
||||
web3-utils "1.2.1"
|
||||
|
||||
web3-net@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.7.tgz#c355621a8769c9c1a967c801e7db90c92a0e3808"
|
||||
integrity sha512-j9qeZrS1FNyCeA0BfdLojkxOZQz3FKa1DJI+Dw9fEVhZS68vLOFANu2RB96gR9BoPHo5+k5D3NsKOoxt1gw3Gg==
|
||||
dependencies:
|
||||
web3-core "1.2.7"
|
||||
web3-core-method "1.2.7"
|
||||
web3-utils "1.2.7"
|
||||
|
||||
web3-net@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.8.tgz#582fc2d4ba32c2e5c7761624e4be7c5434142d66"
|
||||
|
@ -17130,14 +16940,6 @@ web3-providers-http@1.2.1:
|
|||
web3-core-helpers "1.2.1"
|
||||
xhr2-cookies "1.1.0"
|
||||
|
||||
web3-providers-http@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.7.tgz#31eb15390c103169b3d7d31bdb1ccae9e3f1629d"
|
||||
integrity sha512-vazGx5onuH/zogrwkUaLFJwFcJ6CckP65VFSHoiV+GTQdkOqgoDIha7StKkslvDz4XJ2FuY/zOZHbtuOYeltXQ==
|
||||
dependencies:
|
||||
web3-core-helpers "1.2.7"
|
||||
xhr2-cookies "1.1.0"
|
||||
|
||||
web3-providers-http@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.8.tgz#cd7fc4d49df6980b5dd0fb1b5a808bc4b6a0069d"
|
||||
|
@ -17155,15 +16957,6 @@ web3-providers-ipc@1.2.1:
|
|||
underscore "1.9.1"
|
||||
web3-core-helpers "1.2.1"
|
||||
|
||||
web3-providers-ipc@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.7.tgz#4e6716e8723d431df3d6bfa1acd2f7c04e7071ad"
|
||||
integrity sha512-/zc0y724H2zbkV4UbGGMhsEiLfafjagIzfrsWZnyTZUlSB0OGRmmFm2EkLJAgtXrLiodaHHyXKM0vB8S24bxdA==
|
||||
dependencies:
|
||||
oboe "2.1.4"
|
||||
underscore "1.9.1"
|
||||
web3-core-helpers "1.2.7"
|
||||
|
||||
web3-providers-ipc@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.8.tgz#47be918ddd077999aa14703169b76c807f45d894"
|
||||
|
@ -17182,16 +16975,6 @@ web3-providers-ws@1.2.1:
|
|||
web3-core-helpers "1.2.1"
|
||||
websocket "github:web3-js/WebSocket-Node#polyfill/globalThis"
|
||||
|
||||
web3-providers-ws@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.7.tgz#95b1cc5dc25e9b9d6630d6754f9354313b62f532"
|
||||
integrity sha512-b5XzqDpRkNVe6MFs5K6iqOEyjQikHtg3KuU2/ClCDV37hm0WN4xCRVMC0LwegulbDXZej3zT9+1CYzGaGFREzA==
|
||||
dependencies:
|
||||
"@web3-js/websocket" "^1.0.29"
|
||||
eventemitter3 "^4.0.0"
|
||||
underscore "1.9.1"
|
||||
web3-core-helpers "1.2.7"
|
||||
|
||||
web3-providers-ws@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.8.tgz#9e6454edc82d753d398c8d1e044632c234434a46"
|
||||
|
@ -17212,16 +16995,6 @@ web3-shh@1.2.1:
|
|||
web3-core-subscriptions "1.2.1"
|
||||
web3-net "1.2.1"
|
||||
|
||||
web3-shh@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.7.tgz#5382c7bc2f39539eb2841c4576d23ade25720461"
|
||||
integrity sha512-f6PAgcpG0ZAo98KqCmeHoDEx5qzm3d5plet18DkT4U6WIeYowKdec8vZaLPRR7c2XreXFJ2gQf45CB7oqR7U/w==
|
||||
dependencies:
|
||||
web3-core "1.2.7"
|
||||
web3-core-method "1.2.7"
|
||||
web3-core-subscriptions "1.2.7"
|
||||
web3-net "1.2.7"
|
||||
|
||||
web3-shh@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.8.tgz#5162d9d13bc6838d390df1cd39e5f87235c1c2ae"
|
||||
|
@ -17245,20 +17018,6 @@ web3-utils@1.2.1:
|
|||
underscore "1.9.1"
|
||||
utf8 "3.0.0"
|
||||
|
||||
web3-utils@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.7.tgz#b68e232917e4376f81cf38ef79878e5903d18e93"
|
||||
integrity sha512-FBh/CPJND+eiPeUF9KVbTyTZtXNWxPWtByBaWS6e2x4ACazPX711EeNaZaChIOGSLGe6se2n7kg6wnawe/MjuQ==
|
||||
dependencies:
|
||||
bn.js "4.11.8"
|
||||
eth-lib "0.2.7"
|
||||
ethereum-bloom-filters "^1.0.6"
|
||||
ethjs-unit "0.1.6"
|
||||
number-to-bn "1.7.0"
|
||||
randombytes "^2.1.0"
|
||||
underscore "1.9.1"
|
||||
utf8 "3.0.0"
|
||||
|
||||
web3-utils@1.2.8, web3-utils@^1.2.7:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.8.tgz#5321d91715cd4c0869005705a33c4c042a532b18"
|
||||
|
@ -17286,31 +17045,7 @@ web3@1.2.1:
|
|||
web3-shh "1.2.1"
|
||||
web3-utils "1.2.1"
|
||||
|
||||
web3@1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.7.tgz#fcb83571036c1c6f475bc984785982a444e8d78e"
|
||||
integrity sha512-jAAJHMfUlTps+jH2li1ckDFEpPrEEriU/ubegSTGRl3KRdNhEqT93+3kd7FHJTn3NgjcyURo2+f7Da1YcZL8Mw==
|
||||
dependencies:
|
||||
web3-bzz "1.2.7"
|
||||
web3-core "1.2.7"
|
||||
web3-eth "1.2.7"
|
||||
web3-eth-personal "1.2.7"
|
||||
web3-net "1.2.7"
|
||||
web3-shh "1.2.7"
|
||||
web3-utils "1.2.7"
|
||||
|
||||
web3@^0.20.7:
|
||||
version "0.20.7"
|
||||
resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.7.tgz#1605e6d81399ed6f85a471a4f3da0c8be57df2f7"
|
||||
integrity sha512-VU6/DSUX93d1fCzBz7WP/SGCQizO1rKZi4Px9j/3yRyfssHyFcZamMw2/sj4E8TlfMXONvZLoforR8B4bRoyTQ==
|
||||
dependencies:
|
||||
bignumber.js "git+https://github.com/frozeman/bignumber.js-nolookahead.git"
|
||||
crypto-js "^3.1.4"
|
||||
utf8 "^2.1.1"
|
||||
xhr2-cookies "^1.1.0"
|
||||
xmlhttprequest "*"
|
||||
|
||||
web3@^1.0.0-beta.34:
|
||||
web3@1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.8.tgz#20b24baa769e0224a708ef5bf196a5b83d19540b"
|
||||
integrity sha512-rXUn16VKxn2aIe9v0KX+bSm2JXdq/Vnj3lZ0Rub2Q5YUSycHdCBaDtJRukl/jB5ygAdyr5/cUwvJzhNDJSYsGw==
|
||||
|
@ -17323,6 +17058,17 @@ web3@^1.0.0-beta.34:
|
|||
web3-shh "1.2.8"
|
||||
web3-utils "1.2.8"
|
||||
|
||||
web3@^0.20.7:
|
||||
version "0.20.7"
|
||||
resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.7.tgz#1605e6d81399ed6f85a471a4f3da0c8be57df2f7"
|
||||
integrity sha512-VU6/DSUX93d1fCzBz7WP/SGCQizO1rKZi4Px9j/3yRyfssHyFcZamMw2/sj4E8TlfMXONvZLoforR8B4bRoyTQ==
|
||||
dependencies:
|
||||
bignumber.js "git+https://github.com/frozeman/bignumber.js-nolookahead.git"
|
||||
crypto-js "^3.1.4"
|
||||
utf8 "^2.1.1"
|
||||
xhr2-cookies "^1.1.0"
|
||||
xmlhttprequest "*"
|
||||
|
||||
webidl-conversions@^4.0.2:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
|
||||
|
|
Loading…
Reference in New Issue