Merge branch 'development' of github.com:gnosis/safe-react into feature/address-book-suggestions
This commit is contained in:
commit
cf2fd4522c
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "safe-react",
|
"name": "safe-react",
|
||||||
"version": "2.1.1",
|
"version": "2.3.0",
|
||||||
"description": "Allowing crypto users manage funds in a safer way",
|
"description": "Allowing crypto users manage funds in a safer way",
|
||||||
"website": "https://github.com/gnosis/safe-react#readme",
|
"website": "https://github.com/gnosis/safe-react#readme",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
|
|
|
@ -58,14 +58,18 @@ export const minValue = (min: number | string) => (value: string) => {
|
||||||
return `Should be at least ${min}`
|
return `Should be at least ${min}`
|
||||||
}
|
}
|
||||||
|
|
||||||
export const maxValue = (max: number | string) => (value: string) => {
|
export const maxValueCheck = (max: number | string, value: string): string | undefined => {
|
||||||
if (Number.isNaN(Number(value)) || parseFloat(value) <= parseFloat(max.toString())) {
|
if (!max || Number.isNaN(Number(value)) || parseFloat(value) <= parseFloat(max.toString())) {
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
return `Maximum value is ${max}`
|
return `Maximum value is ${max}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const maxValue = (max: number | string) => (value: string) => {
|
||||||
|
return maxValueCheck(max, value)
|
||||||
|
}
|
||||||
|
|
||||||
export const ok = () => undefined
|
export const ok = () => undefined
|
||||||
|
|
||||||
export const mustBeEthereumAddress = simpleMemoize((address: string) => {
|
export const mustBeEthereumAddress = simpleMemoize((address: string) => {
|
||||||
|
|
|
@ -13,10 +13,14 @@ const removeLastTrailingSlash = (url) => {
|
||||||
|
|
||||||
const gnosisAppsUrl = removeLastTrailingSlash(getGnosisSafeAppsUrl())
|
const gnosisAppsUrl = removeLastTrailingSlash(getGnosisSafeAppsUrl())
|
||||||
export const staticAppsList: Array<{ url: string; disabled: boolean }> = [
|
export const staticAppsList: Array<{ url: string; disabled: boolean }> = [
|
||||||
|
// Sablier
|
||||||
|
{ url: `${process.env.REACT_APP_IPFS_GATEWAY}/QmabPEk7g4zaytFefp6fE4nz8f85QMJoWmRQQZypvJViNG`, disabled: false },
|
||||||
|
// request
|
||||||
{ url: `${process.env.REACT_APP_IPFS_GATEWAY}/QmQapdJP6zERqpDKKPECNeMDDgwmGUqbKk1PjHpYj8gfDJ`, disabled: false },
|
{ url: `${process.env.REACT_APP_IPFS_GATEWAY}/QmQapdJP6zERqpDKKPECNeMDDgwmGUqbKk1PjHpYj8gfDJ`, disabled: false },
|
||||||
|
// Aave
|
||||||
|
// { url: `${process.env.REACT_APP_IPFS_GATEWAY}/QmUfgEqdJ5kVjWTQofnDmvxdhDLBAaejiHkhQhfw6aYvBg`, disabled: false },
|
||||||
{ url: `${gnosisAppsUrl}/compound`, disabled: false },
|
{ url: `${gnosisAppsUrl}/compound`, disabled: false },
|
||||||
{ url: `${gnosisAppsUrl}/tx-builder`, disabled: false },
|
{ url: `${gnosisAppsUrl}/tx-builder`, disabled: false },
|
||||||
{ url: `${gnosisAppsUrl}/aave`, disabled: false },
|
|
||||||
{ url: `${gnosisAppsUrl}/pool-together`, disabled: false },
|
{ url: `${gnosisAppsUrl}/pool-together`, disabled: false },
|
||||||
{ url: `${gnosisAppsUrl}/open-zeppelin`, disabled: false },
|
{ url: `${gnosisAppsUrl}/open-zeppelin`, disabled: false },
|
||||||
{ url: `${gnosisAppsUrl}/synthetix`, disabled: false },
|
{ url: `${gnosisAppsUrl}/synthetix`, disabled: false },
|
||||||
|
|
|
@ -101,6 +101,9 @@ const AddressBookInput = ({
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
setADBKList(filteredADBK)
|
setADBKList(filteredADBK)
|
||||||
|
if (!isValidText) {
|
||||||
|
setSelectedEntry({ address: addressValue })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
setIsValidForm(isValidText === undefined)
|
setIsValidForm(isValidText === undefined)
|
||||||
setValidationText(isValidText)
|
setValidationText(isValidText)
|
||||||
|
|
|
@ -17,7 +17,14 @@ import { ScanQRWrapper } from 'src/components/ScanQRModal/ScanQRWrapper'
|
||||||
import Field from 'src/components/forms/Field'
|
import Field from 'src/components/forms/Field'
|
||||||
import GnoForm from 'src/components/forms/GnoForm'
|
import GnoForm from 'src/components/forms/GnoForm'
|
||||||
import TextField from 'src/components/forms/TextField'
|
import TextField from 'src/components/forms/TextField'
|
||||||
import { composeValidators, greaterThan, maxValue, mustBeFloat, required } from 'src/components/forms/validator'
|
import {
|
||||||
|
composeValidators,
|
||||||
|
greaterThan,
|
||||||
|
maxValue,
|
||||||
|
maxValueCheck,
|
||||||
|
mustBeFloat,
|
||||||
|
required,
|
||||||
|
} from 'src/components/forms/validator'
|
||||||
import Block from 'src/components/layout/Block'
|
import Block from 'src/components/layout/Block'
|
||||||
import Button from 'src/components/layout/Button'
|
import Button from 'src/components/layout/Button'
|
||||||
import ButtonLink from 'src/components/layout/ButtonLink'
|
import ButtonLink from 'src/components/layout/ButtonLink'
|
||||||
|
@ -39,7 +46,7 @@ const formMutators = {
|
||||||
utils.changeValue(state, 'amount', () => args[0])
|
utils.changeValue(state, 'amount', () => args[0])
|
||||||
},
|
},
|
||||||
onTokenChange: (args, state, utils) => {
|
onTokenChange: (args, state, utils) => {
|
||||||
utils.changeValue(state, 'amount', () => '')
|
utils.changeValue(state, 'amount', () => state.formState.values.amount)
|
||||||
},
|
},
|
||||||
setRecipient: (args, state, utils) => {
|
setRecipient: (args, state, utils) => {
|
||||||
utils.changeValue(state, 'recipientAddress', () => args[0])
|
utils.changeValue(state, 'recipientAddress', () => args[0])
|
||||||
|
@ -56,6 +63,7 @@ const SendFunds = ({ initialValues, onClose, onNext, recipientAddress, selectedT
|
||||||
address: recipientAddress || initialValues.recipientAddress,
|
address: recipientAddress || initialValues.recipientAddress,
|
||||||
name: '',
|
name: '',
|
||||||
})
|
})
|
||||||
|
|
||||||
const [pristine, setPristine] = useState(true)
|
const [pristine, setPristine] = useState(true)
|
||||||
const [isValidAddress, setIsValidAddress] = useState(true)
|
const [isValidAddress, setIsValidAddress] = useState(true)
|
||||||
|
|
||||||
|
@ -86,7 +94,18 @@ const SendFunds = ({ initialValues, onClose, onNext, recipientAddress, selectedT
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Row>
|
</Row>
|
||||||
<Hairline />
|
<Hairline />
|
||||||
<GnoForm formMutators={formMutators} initialValues={initialValues} onSubmit={handleSubmit}>
|
<GnoForm
|
||||||
|
formMutators={formMutators}
|
||||||
|
initialValues={initialValues}
|
||||||
|
onSubmit={handleSubmit}
|
||||||
|
validation={(values) => {
|
||||||
|
const selectedTokenRecord = tokens.find((token) => token.address === values?.token)
|
||||||
|
|
||||||
|
return {
|
||||||
|
amount: maxValueCheck(selectedTokenRecord?.balance, values.amount),
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
{(...args) => {
|
{(...args) => {
|
||||||
const formState = args[2]
|
const formState = args[2]
|
||||||
const mutators = args[3]
|
const mutators = args[3]
|
||||||
|
@ -224,11 +243,15 @@ const SendFunds = ({ initialValues, onClose, onNext, recipientAddress, selectedT
|
||||||
required,
|
required,
|
||||||
mustBeFloat,
|
mustBeFloat,
|
||||||
greaterThan(0),
|
greaterThan(0),
|
||||||
maxValue(selectedTokenRecord && selectedTokenRecord.balance),
|
maxValue(selectedTokenRecord?.balance),
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
<OnChange name="token">
|
<OnChange name="token">
|
||||||
{() => {
|
{() => {
|
||||||
|
setSelectedEntry({
|
||||||
|
name: selectedEntry?.name,
|
||||||
|
address: selectedEntry?.address,
|
||||||
|
})
|
||||||
mutators.onTokenChange()
|
mutators.onTokenChange()
|
||||||
}}
|
}}
|
||||||
</OnChange>
|
</OnChange>
|
||||||
|
|
23
yarn.lock
23
yarn.lock
|
@ -6854,19 +6854,6 @@ etag@~1.8.1:
|
||||||
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
|
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
|
||||||
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
|
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
|
||||||
|
|
||||||
eth-block-tracker@^3.0.0:
|
|
||||||
version "3.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1"
|
|
||||||
integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==
|
|
||||||
dependencies:
|
|
||||||
eth-query "^2.1.0"
|
|
||||||
ethereumjs-tx "^1.3.3"
|
|
||||||
ethereumjs-util "^5.1.3"
|
|
||||||
ethjs-util "^0.1.3"
|
|
||||||
json-rpc-engine "^3.6.0"
|
|
||||||
pify "^2.3.0"
|
|
||||||
tape "^4.6.3"
|
|
||||||
|
|
||||||
eth-block-tracker@^4.2.0, eth-block-tracker@^4.4.1, eth-block-tracker@^4.4.2:
|
eth-block-tracker@^4.2.0, eth-block-tracker@^4.4.1, eth-block-tracker@^4.4.2:
|
||||||
version "4.4.3"
|
version "4.4.3"
|
||||||
resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626"
|
resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626"
|
||||||
|
@ -7204,7 +7191,7 @@ ethereumjs-util@4.5.0, ethereumjs-util@^4.3.0:
|
||||||
rlp "^2.0.0"
|
rlp "^2.0.0"
|
||||||
secp256k1 "^3.0.1"
|
secp256k1 "^3.0.1"
|
||||||
|
|
||||||
ethereumjs-util@5.2.0, ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5:
|
ethereumjs-util@5.2.0, ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5:
|
||||||
version "5.2.0"
|
version "5.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642"
|
resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642"
|
||||||
integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==
|
integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==
|
||||||
|
@ -17257,16 +17244,18 @@ web3-provider-engine@^15.0.4:
|
||||||
xhr "^2.2.0"
|
xhr "^2.2.0"
|
||||||
xtend "^4.0.1"
|
xtend "^4.0.1"
|
||||||
|
|
||||||
"web3-provider-engine@git+https://github.com/trufflesuite/provider-engine.git#web3-one":
|
"web3-provider-engine@https://github.com/trufflesuite/provider-engine#web3-one":
|
||||||
version "14.0.6"
|
version "14.0.6"
|
||||||
resolved "git+https://github.com/trufflesuite/provider-engine.git#3538c60bc4836b73ccae1ac3f64c8fed8ef19c1a"
|
resolved "https://github.com/trufflesuite/provider-engine#9694f5b4e5500651bd2ff689df8529bb5cf6b96f"
|
||||||
dependencies:
|
dependencies:
|
||||||
async "^2.5.0"
|
async "^2.5.0"
|
||||||
backoff "^2.5.0"
|
backoff "^2.5.0"
|
||||||
clone "^2.0.0"
|
clone "^2.0.0"
|
||||||
cross-fetch "^2.1.0"
|
cross-fetch "^2.1.0"
|
||||||
eth-block-tracker "^3.0.0"
|
eth-block-tracker "^4.2.0"
|
||||||
|
eth-json-rpc-filters "^4.0.2"
|
||||||
eth-json-rpc-infura "^3.1.0"
|
eth-json-rpc-infura "^3.1.0"
|
||||||
|
eth-json-rpc-middleware "^4.1.1"
|
||||||
eth-sig-util "^1.4.2"
|
eth-sig-util "^1.4.2"
|
||||||
ethereumjs-block "^1.2.2"
|
ethereumjs-block "^1.2.2"
|
||||||
ethereumjs-tx "^1.2.0"
|
ethereumjs-tx "^1.2.0"
|
||||||
|
|
Loading…
Reference in New Issue