Pull from dev

This commit is contained in:
mmv 2019-05-29 10:34:17 +04:00
commit 7a9e9a039b
30 changed files with 651 additions and 341 deletions

View File

@ -82,9 +82,9 @@
"qrcode.react": "^0.9.3",
"react": "^16.8.6",
"react-dom": "^16.8.6",
"react-final-form": "5.1.0",
"react-final-form": "6.0.0",
"react-final-form-listeners": "^1.0.2",
"react-hot-loader": "4.8.7",
"react-hot-loader": "4.8.8",
"react-infinite-scroll-component": "^4.5.2",
"react-redux": "7.0.3",
"react-router-dom": "^4.3.1",
@ -97,7 +97,7 @@
},
"devDependencies": {
"@babel/cli": "7.4.4",
"@babel/core": "7.4.4",
"@babel/core": "7.4.5",
"@babel/plugin-proposal-class-properties": "7.4.4",
"@babel/plugin-proposal-decorators": "7.4.4",
"@babel/plugin-proposal-do-expressions": "^7.0.0",
@ -117,7 +117,7 @@
"@babel/plugin-transform-member-expression-literals": "^7.2.0",
"@babel/plugin-transform-property-literals": "^7.2.0",
"@babel/polyfill": "7.4.4",
"@babel/preset-env": "7.4.4",
"@babel/preset-env": "7.4.5",
"@babel/preset-flow": "^7.0.0-beta.40",
"@babel/preset-react": "^7.0.0-beta.40",
"@sambego/storybook-state": "^1.0.7",
@ -138,9 +138,9 @@
"detect-port": "^1.2.2",
"eslint": "^5.16.0",
"eslint-config-airbnb": "^17.1.0",
"eslint-plugin-flowtype": "3.9.0",
"eslint-plugin-import": "2.17.2",
"eslint-plugin-jest": "22.5.1",
"eslint-plugin-flowtype": "3.9.1",
"eslint-plugin-import": "2.17.3",
"eslint-plugin-jest": "22.6.4",
"eslint-plugin-jsx-a11y": "^6.0.3",
"eslint-plugin-react": "7.13.0",
"ethereumjs-abi": "^0.6.7",
@ -162,11 +162,11 @@
"storybook-host": "^5.0.3",
"storybook-router": "^0.3.3",
"style-loader": "^0.23.1",
"truffle": "5.0.18",
"truffle-contract": "4.0.16",
"truffle-solidity-loader": "0.1.17",
"truffle": "5.0.19",
"truffle-contract": "4.0.17",
"truffle-solidity-loader": "0.1.18",
"uglifyjs-webpack-plugin": "2.1.3",
"webpack": "4.32.0",
"webpack": "4.32.2",
"webpack-bundle-analyzer": "3.3.2",
"webpack-cli": "3.3.2",
"webpack-dev-server": "3.4.1",

View File

@ -55,16 +55,13 @@ class Provider extends React.Component<Props> {
<React.Fragment>
<div ref={this.myRef} className={classes.root}>
<Col end="sm" middle="xs" className={classes.provider} onClick={toggle}>
{ info }
<IconButton
disableRipple
className={classes.expand}
>
{ open ? <ExpandLess /> : <ExpandMore />}
{info}
<IconButton disableRipple className={classes.expand}>
{open ? <ExpandLess /> : <ExpandMore />}
</IconButton>
</Col>
</div>
{ children(this.myRef) }
{children(this.myRef)}
</React.Fragment>
)
}

View File

@ -12,9 +12,10 @@ import Layout from './component/Layout'
import actions, { type Actions } from './actions'
import selector, { type SelectorProps } from './selector'
type Props = Actions & SelectorProps & {
openSnackbar: (message: string, variant: Variant) => void,
}
type Props = Actions &
SelectorProps & {
openSnackbar: (message: string, variant: Variant) => void,
}
type State = {
hasError: boolean,
@ -67,13 +68,15 @@ class HeaderComponent extends React.PureComponent<Props, State> {
return <ConnectDetails onConnect={this.onConnect} />
}
return (<UserDetails
provider={provider}
network={network}
userAddress={userAddress}
connected={available}
onDisconnect={this.onDisconnect}
/>)
return (
<UserDetails
provider={provider}
network={network}
userAddress={userAddress}
connected={available}
onDisconnect={this.onDisconnect}
/>
)
}
render() {
@ -84,14 +87,13 @@ class HeaderComponent extends React.PureComponent<Props, State> {
}
}
const Header = connect(selector, actions)(HeaderComponent)
const Header = connect(
selector,
actions,
)(HeaderComponent)
const HeaderSnack = () => (
<SharedSnackbarConsumer>
{({ openSnackbar }) => (
<Header openSnackbar={openSnackbar} />
)}
</SharedSnackbarConsumer>
<SharedSnackbarConsumer>{({ openSnackbar }) => <Header openSnackbar={openSnackbar} />}</SharedSnackbarConsumer>
)
export default HeaderSnack

View File

@ -64,7 +64,7 @@ const styles = theme => ({
},
iconVariant: {
opacity: 0.9,
marginRight: theme.spacing.unit,
marginRight: theme.spacing(1),
},
message: {
display: 'flex',

View File

@ -15,7 +15,7 @@ type Props = {
padding?: number,
validation?: (values: Object) => Object | Promise<Object>,
initialValues?: Object,
formMutators: Object,
formMutators?: Object,
}
const stylesBasedOn = (padding: number): $Shape<CSSStyleDeclaration> => ({

View File

@ -1,6 +1,6 @@
// @flow
import * as React from 'react'
import classNames from 'classnames/bind'
import React from 'react'
import { Link } from 'react-router-dom'
import { capitalize } from '~/utils/css'
import styles from './index.scss'
@ -13,20 +13,35 @@ type Props = {
children: React$Node,
color?: 'regular' | 'white',
className?: string,
innerRef: React.ElementRef<any>,
}
const GnosisLink = ({
to, children, color, className, padding, ...props
to, children, color, className, padding, innerRef, ...props
}: Props) => {
const internal = /^\/(?!\/)/.test(to)
const classes = cx(styles.link, color || 'regular', padding ? capitalize(padding, 'padding') : undefined, className)
const LinkElement = internal ? Link : 'a'
const refs = {}
if (internal) {
// To avoid warning about React not recognizing the prop innerRef on native element (a) if the link is external
refs.innerRef = innerRef
}
return (
<LinkElement className={classes} href={internal ? null : to} to={internal ? to : null} {...props}>
<LinkElement
className={classes}
href={internal ? null : to}
to={internal ? to : null}
{...refs}
{...props}
>
{children}
</LinkElement>
)
}
export default GnosisLink
// https://material-ui.com/guides/composition/#caveat-with-refs
const LinkWithRef = React.forwardRef<Props, typeof GnosisLink>((props, ref) => <GnosisLink {...props} innerRef={ref} />)
export default LinkWithRef

View File

@ -1,4 +1,5 @@
// @flow
export * from './gas'
export * from './send'
export * from './safeBlockchainOperations'
export * from './safeTxSignerEIP712'

View File

@ -54,89 +54,89 @@ export const approveTransaction = async (
return txHash
}
export const executeTransaction = async (
safeAddress: string,
to: string,
valueInWei: number,
data: string,
operation: Operation,
nonce: number,
sender: string,
ownersWhoHasSigned: List<string>,
) => {
const gasPrice = await calculateGasPrice()
// export const executeTransaction = async (
// safeAddress: string,
// to: string,
// valueInWei: number,
// data: string,
// operation: Operation,
// nonce: number,
// sender: string,
// ownersWhoHasSigned: List<string>,
// ) => {
// const gasPrice = await calculateGasPrice()
if (signaturesViaMetamask()) {
const safe = await getGnosisSafeInstanceAt(safeAddress)
const txGasEstimate = await generateTxGasEstimateFrom(safe, safeAddress, data, to, valueInWei, operation)
const signature = await generateMetamaskSignature(
safe,
safeAddress,
sender,
to,
valueInWei,
nonce,
data,
operation,
txGasEstimate,
)
storeSignature(safeAddress, nonce, signature)
// if (signaturesViaMetamask()) {
// const safe = await getSafeEthereumInstance(safeAddress)
// const txGasEstimate = await generateTxGasEstimateFrom(safe, safeAddress, data, to, valueInWei, operation)
// const signature = await generateMetamaskSignature(
// safe,
// safeAddress,
// sender,
// to,
// valueInWei,
// nonce,
// data,
// operation,
// txGasEstimate,
// )
// storeSignature(safeAddress, nonce, signature)
const sigs = getSignaturesFrom(safeAddress, nonce)
const threshold = await safe.getThreshold()
const gas = await estimateDataGas(
safe,
to,
valueInWei,
data,
operation,
txGasEstimate,
0,
nonce,
Number(threshold),
0,
)
const numOwners = await safe.getOwners()
const gasIncludingRemovingStoreUpfront = gas + txGasEstimate + numOwners.length * 15000
// const sigs = getSignaturesFrom(safeAddress, nonce)
// const threshold = await safe.getThreshold()
// const gas = await estimateDataGas(
// safe,
// to,
// valueInWei,
// data,
// operation,
// txGasEstimate,
// 0,
// nonce,
// Number(threshold),
// 0,
// )
// const numOwners = await safe.getOwners()
// const gasIncludingRemovingStoreUpfront = gas + txGasEstimate + numOwners.length * 15000
const txReceipt = await safe.execTransaction(
to,
valueInWei,
data,
operation,
txGasEstimate,
0, // dataGasEstimate
0, // gasPrice
0, // txGasToken
0, // refundReceiver
sigs,
{ from: sender, gas: gasIncludingRemovingStoreUpfront, gasPrice },
)
// const txReceipt = await safe.execTransaction(
// to,
// valueInWei,
// data,
// operation,
// txGasEstimate,
// 0, // dataGasEstimate
// 0, // gasPrice
// 0, // txGasToken
// 0, // refundReceiver
// sigs,
// { from: sender, gas: gasIncludingRemovingStoreUpfront, gasPrice },
// )
const txHash = txReceipt.tx
await checkReceiptStatus(txHash)
// await submitOperation(safeAddress, to, valueInWei, data, operation, nonce, txHash, sender, 'execution')
// const txHash = txReceipt.tx
// await checkReceiptStatus(txHash)
// // await submitOperation(safeAddress, to, valueInWei, data, operation, nonce, txHash, sender, 'execution')
return txHash
}
// return txHash
// }
const gnosisSafe = await getGnosisSafeInstanceAt(safeAddress)
const signatures = buildSignaturesFrom(ownersWhoHasSigned, sender)
const txExecutionData = gnosisSafe.contract.methods
.execTransaction(to, valueInWei, data, operation, 0, 0, 0, 0, 0, signatures)
.encodeABI()
const gas = await calculateGasOf(txExecutionData, sender, safeAddress)
const numOwners = await gnosisSafe.getOwners()
const gasIncludingRemovingStoreUpfront = gas + numOwners.length * 15000
const txReceipt = await gnosisSafe.execTransaction(to, valueInWei, data, operation, 0, 0, 0, 0, 0, signatures, {
from: sender,
gas: gasIncludingRemovingStoreUpfront,
gasPrice,
})
const txHash = txReceipt.tx
await checkReceiptStatus(txHash)
// const gnosisSafe = await getSafeEthereumInstance(safeAddress)
// const signatures = buildSignaturesFrom(ownersWhoHasSigned, sender)
// const txExecutionData = gnosisSafe.contract.methods
// .execTransaction(to, valueInWei, data, operation, 0, 0, 0, 0, 0, signatures)
// .encodeABI()
// const gas = await calculateGasOf(txExecutionData, sender, safeAddress)
// const numOwners = await gnosisSafe.getOwners()
// const gasIncludingRemovingStoreUpfront = gas + numOwners.length * 15000
// const txReceipt = await gnosisSafe.execTransaction(to, valueInWei, data, operation, 0, 0, 0, 0, 0, signatures, {
// from: sender,
// gas: gasIncludingRemovingStoreUpfront,
// gasPrice,
// })
// const txHash = txReceipt.tx
// await checkReceiptStatus(txHash)
await submitOperation(safeAddress, to, valueInWei, data, operation, nonce, txHash, sender, 'execution')
// await submitOperation(safeAddress, to, valueInWei, data, operation, nonce, txHash, sender, 'execution')
return txHash
}
// return txHash
// }

View File

@ -82,7 +82,7 @@ export const generateMetamaskSignature = async (
operation,
txGasEstimate,
)
console.log({sender})
const jsonTypedData = JSON.stringify(typedData)
const signedTypedData = {
method: 'eth_signTypedData_v3',

View File

@ -0,0 +1,75 @@
// @flow
import { getWeb3 } from '~/logic/wallets/getWeb3'
import { getStandardTokenContract } from '~/logic/tokens/store/actions/fetchTokens'
import { EMPTY_DATA } from '~/logic/wallets/ethTransactions'
import { isEther } from '~/logic/tokens/utils/tokenHelpers'
import { type Token } from '~/logic/tokens/store/model/token'
import { getSafeEthereumInstance } from '../safeFrontendOperations'
export const CALL = 0
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'
export const executeTransaction = async (
safeInstance: any,
to: string,
valueInWei: number,
data: string,
operation: number | string,
nonce: string | number,
sender: string,
) => {
try {
// https://gnosis-safe.readthedocs.io/en/latest/contracts/signatures.html#pre-validated-signatures
const sigs = `0x000000000000000000000000${sender.replace(
'0x',
'',
)}000000000000000000000000000000000000000000000000000000000000000001`
const tx = await safeInstance.execTransaction(
to,
valueInWei,
data,
CALL,
0,
0,
0,
ZERO_ADDRESS,
ZERO_ADDRESS,
sigs,
{ from: sender },
)
return tx
} catch (error) {
// eslint-disable-next-line
console.log('Error calculating tx gas estimation ' + error)
return 0
}
}
export const createTransaction = async (safeAddress: string, to: string, valueInEth: string, token: Token) => {
const safeInstance = await getSafeEthereumInstance(safeAddress)
const web3 = getWeb3()
const from = web3.currentProvider.selectedAddress
const threshold = await safeInstance.getThreshold()
const nonce = await safeInstance.nonce()
const valueInWei = web3.utils.toWei(valueInEth, 'ether')
const isExecution = threshold.toNumber() === 1
let txData = EMPTY_DATA
if (!isEther(token.symbol)) {
const StandardToken = await getStandardTokenContract()
const sendToken = await StandardToken.at(token.address)
txData = sendToken.contract.transfer(to, valueInWei).encodeABI()
}
let txHash
if (isExecution) {
txHash = await executeTransaction(safeInstance, to, valueInWei, txData, CALL, nonce, from)
} else {
// txHash = await approveTransaction(safeAddress, to, valueInWei, txData, CALL, nonce)
}
return txHash
}

View File

@ -43,10 +43,7 @@ const styles = {
}
const Opening = ({
classes,
name = 'Safe creation process',
tx,
network,
classes, name = 'Safe creation process', tx, network,
}: Props) => (
<Page align="center">
<Paragraph className={classes.page} color="secondary" size="xxl" weight="bolder" align="center">
@ -68,13 +65,25 @@ const Opening = ({
</Block>
<Block margin="md">
<Paragraph size="md" align="center" weight="light" noMargin>
This process should take a couple of minutes. <br />
This process should take a couple of minutes.
{' '}
<br />
</Paragraph>
{ tx &&
{tx && (
<Paragraph className={classes.follow} size="md" align="center" weight="light" noMargin>
Follow progress on <a href={openTxInEtherScan(tx, network)} target="_blank" rel="noopener noreferrer" className={classes.etherscan}>Etherscan.io<OpenInNew className={classes.icon} /></a>
Follow progress on
{' '}
<a
href={openTxInEtherScan(tx, network)}
target="_blank"
rel="noopener noreferrer"
className={classes.etherscan}
>
Etherscan.io
<OpenInNew className={classes.icon} />
</a>
</Paragraph>
}
)}
</Block>
</Page>
)

View File

@ -94,7 +94,14 @@ const Receive = ({
</Block>
<Block align="center" className={classes.addressContainer}>
<Identicon address={safeAddress} diameter={32} />
<Paragraph onClick={copyToClipboard} className={classes.address}>{safeAddress}</Paragraph>
<Paragraph
onClick={() => {
copyToClipboard(safeAddress)
}}
className={classes.address}
>
{safeAddress}
</Paragraph>
<Link className={classes.open} to={etherScanLink} target="_blank">
<OpenInNew style={openIconStyle} />
</Link>

View File

@ -19,6 +19,7 @@ type Props = {
ethBalance: string,
tokens: List<Token>,
selectedToken: string,
createTransaction: Function,
}
type ActiveScreen = 'chooseTxType' | 'sendFunds' | 'reviewTx'
@ -47,6 +48,7 @@ const Send = ({
ethBalance,
tokens,
selectedToken,
createTransaction,
}: Props) => {
const [activeScreen, setActiveScreen] = useState<ActiveScreen>('sendFunds')
const [tx, setTx] = useState<TxStateType>({})
@ -98,6 +100,7 @@ const Send = ({
safeName={safeName}
ethBalance={ethBalance}
onClickBack={onClickBack}
createTransaction={createTransaction}
/>
)}
</React.Fragment>

View File

@ -2,6 +2,7 @@
import React from 'react'
import OpenInNew from '@material-ui/icons/OpenInNew'
import { withStyles } from '@material-ui/core/styles'
import { SharedSnackbarConsumer } from '~/components/SharedSnackBar/Context'
import Close from '@material-ui/icons/Close'
import IconButton from '@material-ui/core/IconButton'
import Paragraph from '~/components/layout/Paragraph'
@ -29,6 +30,7 @@ type Props = {
onClickBack: Function,
ethBalance: string,
tx: Object,
createTransaction: Function,
}
const openIconStyle = {
@ -37,71 +39,98 @@ const openIconStyle = {
}
const ReviewTx = ({
onClose, classes, safeAddress, etherScanLink, safeName, ethBalance, tx, onClickBack,
onClose,
classes,
safeAddress,
etherScanLink,
safeName,
ethBalance,
tx,
onClickBack,
createTransaction,
}: Props) => (
<React.Fragment>
<Row align="center" grow className={classes.heading}>
<Paragraph weight="bolder" className={classes.headingText} noMargin>
Send Funds
</Paragraph>
<Paragraph className={classes.annotation}>2 of 2</Paragraph>
<IconButton onClick={onClose} disableRipple>
<Close className={classes.closeIcon} />
</IconButton>
</Row>
<Hairline />
<Block className={classes.container}>
<SafeInfo safeAddress={safeAddress} etherScanLink={etherScanLink} safeName={safeName} ethBalance={ethBalance} />
<Row margin="md">
<Col xs={1}>
<img src={ArrowDown} alt="Arrow Down" style={{ marginLeft: '8px' }} />
</Col>
<Col xs={11} center="xs" layout="column">
<Hairline />
</Col>
</Row>
<Row margin="xs">
<Paragraph size="md" color="disabled" style={{ letterSpacing: '-0.5px' }} noMargin>
Recipient
</Paragraph>
</Row>
<Row margin="md" align="center">
<Col xs={1}>
<Identicon address={tx.recipientAddress} diameter={32} />
</Col>
<Col xs={11} layout="column">
<Paragraph weight="bolder" onClick={copyToClipboard} noMargin>
{tx.recipientAddress}
<Link to={etherScanLink} target="_blank">
<OpenInNew style={openIconStyle} />
</Link>
<SharedSnackbarConsumer>
{({ openSnackbar }) => (
<React.Fragment>
<Row align="center" grow className={classes.heading}>
<Paragraph weight="bolder" className={classes.headingText} noMargin>
Send Funds
</Paragraph>
</Col>
</Row>
<Row margin="xs">
<Paragraph size="md" color="disabled" style={{ letterSpacing: '-0.5px' }} noMargin>
Amount
</Paragraph>
</Row>
<Row margin="md" align="center">
<Img src={tx.token.logoUri} height={28} alt={tx.token.name} onError={setImageToPlaceholder} />
<Paragraph size="md" noMargin>
{tx.amount}
{' '}
{tx.token.symbol}
</Paragraph>
</Row>
</Block>
<Hairline style={{ position: 'absolute', bottom: 85 }} />
<Row align="center" className={classes.buttonRow}>
<Button className={classes.button} minWidth={140} onClick={onClickBack}>
Back
</Button>
<Button type="submit" className={classes.button} variant="contained" minWidth={140} color="primary">
Review
</Button>
</Row>
</React.Fragment>
<Paragraph className={classes.annotation}>2 of 2</Paragraph>
<IconButton onClick={onClose} disableRipple>
<Close className={classes.closeIcon} />
</IconButton>
</Row>
<Hairline />
<Block className={classes.container}>
<SafeInfo
safeAddress={safeAddress}
etherScanLink={etherScanLink}
safeName={safeName}
ethBalance={ethBalance}
/>
<Row margin="md">
<Col xs={1}>
<img src={ArrowDown} alt="Arrow Down" style={{ marginLeft: '8px' }} />
</Col>
<Col xs={11} center="xs" layout="column">
<Hairline />
</Col>
</Row>
<Row margin="xs">
<Paragraph size="md" color="disabled" style={{ letterSpacing: '-0.5px' }} noMargin>
Recipient
</Paragraph>
</Row>
<Row margin="md" align="center">
<Col xs={1}>
<Identicon address={tx.recipientAddress} diameter={32} />
</Col>
<Col xs={11} layout="column">
<Paragraph weight="bolder" onClick={copyToClipboard} noMargin>
{tx.recipientAddress}
<Link to={etherScanLink} target="_blank">
<OpenInNew style={openIconStyle} />
</Link>
</Paragraph>
</Col>
</Row>
<Row margin="xs">
<Paragraph size="md" color="disabled" style={{ letterSpacing: '-0.5px' }} noMargin>
Amount
</Paragraph>
</Row>
<Row margin="md" align="center">
<Img src={tx.token.logoUri} height={28} alt={tx.token.name} onError={setImageToPlaceholder} />
<Paragraph size="md" noMargin className={classes.amount}>
{tx.amount}
{' '}
{tx.token.symbol}
</Paragraph>
</Row>
</Block>
<Hairline style={{ position: 'absolute', bottom: 85 }} />
<Row align="center" className={classes.buttonRow}>
<Button className={classes.button} minWidth={140} onClick={onClickBack}>
Back
</Button>
<Button
type="submit"
className={classes.button}
onClick={() => {
createTransaction(safeAddress, tx.recipientAddress, tx.amount, tx.token, openSnackbar)
onClose()
}}
variant="contained"
minWidth={140}
color="primary"
>
SUBMIT
</Button>
</Row>
</React.Fragment>
)}
</SharedSnackbarConsumer>
)
export default withStyles(styles)(ReviewTx)

View File

@ -24,6 +24,9 @@ export const styles = () => ({
container: {
padding: `${md} ${lg}`,
},
amount: {
marginLeft: sm,
},
buttonRow: {
height: '84px',
justifyContent: 'center',

View File

@ -9,6 +9,8 @@ export const selectedTokenStyles = () => ({
},
tokenData: {
padding: 0,
margin: 0,
lineHeight: '14px',
},
tokenImage: {
marginRight: sm,

View File

@ -158,7 +158,7 @@ class Tokens extends React.Component<Props, State> {
return (
<ListItem key={token.address} className={classes.token}>
<ListItemIcon>
<ListItemIcon className={classes.tokenIcon}>
<Img src={token.logoUri} height={28} alt={token.name} onError={setImageToPlaceholder} />
</ListItemIcon>
<ListItemText primary={token.symbol} secondary={token.name} />

View File

@ -47,6 +47,9 @@ export const styles = () => ({
letterSpacing: '-0.5px',
},
},
tokenIcon: {
marginRight: md,
},
progressContainer: {
width: '100%',
height: '100%',

View File

@ -41,6 +41,7 @@ type Props = {
safeName: string,
etherScanLink: string,
ethBalance: string,
createTransaction: Function,
}
type Action = 'Token' | 'Send' | 'Receive'
@ -93,7 +94,15 @@ class Balances extends React.Component<Props, State> {
hideZero, showToken, showReceive, sendFunds,
} = this.state
const {
classes, granted, tokens, safeAddress, activeTokens, safeName, etherScanLink, ethBalance,
classes,
granted,
tokens,
safeAddress,
activeTokens,
safeName,
etherScanLink,
ethBalance,
createTransaction,
} = this.props
const columns = generateColumns()
@ -190,6 +199,7 @@ class Balances extends React.Component<Props, State> {
ethBalance={ethBalance}
tokens={activeTokens}
selectedToken={sendFunds.selectedToken}
createTransaction={createTransaction}
/>
<Modal
title="Receive Tokens"

View File

@ -13,7 +13,7 @@ export const styles = (theme: Object) => ({
margin: `${sm} 0`,
},
actionIcon: {
marginRight: theme.spacing.unit,
marginRight: theme.spacing(1),
},
iconSmall: {
fontSize: 16,

View File

@ -23,6 +23,7 @@ import Balances from './Balances'
type Props = SelectorProps & {
classes: Object,
granted: boolean,
createTransaction: Function,
}
type State = {
@ -88,7 +89,7 @@ class Layout extends React.Component<Props, State> {
render() {
const {
safe, provider, network, classes, granted, tokens, activeTokens,
safe, provider, network, classes, granted, tokens, activeTokens, createTransaction,
} = this.props
const { tabIndex } = this.state
@ -137,6 +138,7 @@ class Layout extends React.Component<Props, State> {
safeAddress={address}
safeName={name}
etherScanLink={etherScanLink}
createTransaction={createTransaction}
/>
)}
</React.Fragment>

View File

@ -14,7 +14,7 @@ type FormProps = {
}
type Props = {
symbol: string
symbol: string,
}
const spinnerStyle = {
@ -25,14 +25,14 @@ const ReviewTx = ({ symbol }: Props) => (controls: React$Node, { values, submitt
<OpenPaper controls={controls}>
<Heading tag="h2">Review the move token funds</Heading>
<Paragraph align="left">
<Bold>Destination: </Bold> {values[TKN_DESTINATION_PARAM]}
<Bold>Destination: </Bold>
{' '}
{values[TKN_DESTINATION_PARAM]}
</Paragraph>
<Paragraph align="left">
<Bold>{`Amount to transfer: ${values[TKN_VALUE_PARAM]} ${symbol}`}</Bold>
</Paragraph>
<Block style={spinnerStyle}>
{ submitting && <CircularProgress size={50} /> }
</Block>
<Block style={spinnerStyle}>{submitting && <CircularProgress size={50} />}</Block>
</OpenPaper>
)

View File

@ -1,13 +1,16 @@
// @flow
import fetchSafe from '~/routes/safe/store/actions/fetchSafe'
import fetchTokenBalances from '~/routes/safe/store/actions/fetchTokenBalances'
import createTransaction from '~/routes/safe/store/actions/createTransaction'
export type Actions = {
fetchSafe: typeof fetchSafe,
fetchTokenBalances: typeof fetchTokenBalances,
createTransaction: typeof createTransaction,
}
export default {
fetchSafe,
fetchTokenBalances,
createTransaction,
}

View File

@ -52,7 +52,7 @@ class SafeView extends React.Component<Props> {
render() {
const {
safe, provider, activeTokens, granted, userAddress, network, tokens,
safe, provider, activeTokens, granted, userAddress, network, tokens, createTransaction,
} = this.props
return (
@ -65,6 +65,7 @@ class SafeView extends React.Component<Props> {
userAddress={userAddress}
network={network}
granted={granted}
createTransaction={createTransaction}
/>
</Page>
)

View File

@ -31,7 +31,7 @@ const saveSafe = (
threshold: number,
ownersName: string[],
ownersAddress: string[],
) => async (dispatch: ReduxDispatch<GlobalState>) => {
) => (dispatch: ReduxDispatch<GlobalState>) => {
const owners: List<Owner> = buildOwnersFrom(ownersName, ownersAddress)
const safe: Safe = SafeRecord({

View File

@ -1,6 +0,0 @@
// @flow
import { createAction } from 'redux-actions'
export const ADD_TRANSACTIONS = 'ADD_TRANSACTIONS'
export default createAction<string, *>(ADD_TRANSACTIONS)

View File

@ -0,0 +1,60 @@
// @flow
import type { Dispatch as ReduxDispatch } from 'redux'
import { createAction } from 'redux-actions'
import { getWeb3 } from '~/logic/wallets/getWeb3'
import { EMPTY_DATA } from '~/logic/wallets/ethTransactions'
import { type Token } from '~/logic/tokens/store/model/token'
import { type GlobalState } from '~/store'
import { isEther } from '~/logic/tokens/utils/tokenHelpers'
import { getSafeEthereumInstance } from '~/logic/safe/safeFrontendOperations'
import { executeTransaction, CALL } from '~/logic/safe/transactions'
import { getStandardTokenContract } from '~/logic/tokens/store/actions/fetchTokens'
export const ADD_TRANSACTIONS = 'ADD_TRANSACTIONS'
export const addTransactions = createAction<string, *>(ADD_TRANSACTIONS)
const createTransaction = (
safeAddress: string,
to: string,
valueInEth: string,
token: Token,
openSnackbar: Function,
) => async (dispatch: ReduxDispatch<GlobalState>) => {
const isSendingETH = isEther(token.symbol)
const safeInstance = await getSafeEthereumInstance(safeAddress)
const web3 = getWeb3()
const from = web3.currentProvider.selectedAddress
const threshold = await safeInstance.getThreshold()
const nonce = await safeInstance.nonce()
const txRecipient = isSendingETH ? to : token.address
const valueInWei = web3.utils.toWei(valueInEth, 'ether')
let txAmount = valueInWei
const isExecution = threshold.toNumber() === 1
let txData = EMPTY_DATA
if (!isSendingETH) {
const StandardToken = await getStandardTokenContract()
const sendToken = await StandardToken.at(token.address)
txData = sendToken.contract.methods.transfer(to, valueInWei).encodeABI()
// txAmount should be 0 if we send tokens
// the real value is encoded in txData and will be used by the contract
// if txAmount > 0 it would send ETH from the safe
txAmount = 0
}
let txHash
if (isExecution) {
openSnackbar('Transaction has been submitted', 'success')
txHash = await executeTransaction(safeInstance, txRecipient, txAmount, txData, CALL, nonce, from)
openSnackbar('Transaction has been confirmed', 'success')
} else {
// txHash = await approveTransaction(safeAddress, to, valueInWei, txData, CALL, nonce)
}
// dispatch(addTransactions(txHash))
return txHash
}
export default createTransaction

View File

@ -1,7 +1,7 @@
// @flow
import { List, Map } from 'immutable'
import { handleActions, type ActionType } from 'redux-actions'
import addTransactions, { ADD_TRANSACTIONS } from '~/routes/safe/store/actions/addTransactions'
import { ADD_TRANSACTIONS } from '~/routes/safe/store/actions/createTransaction'
import { type Transaction } from '~/routes/safe/store/models/transaction'
export const TRANSACTIONS_REDUCER_ID = 'transactions'
@ -10,7 +10,7 @@ export type State = Map<string, List<Transaction>>
export default handleActions<State, *>(
{
[ADD_TRANSACTIONS]: (state: State, action: ActionType<typeof addTransactions>): State => action.payload,
[ADD_TRANSACTIONS]: (state: State, action: ActionType<Function>): State => action.payload,
},
Map(),
)

View File

@ -12,6 +12,7 @@ import {
bolderFont,
boldFont,
buttonLargeFontSize,
xs,
} from './variables'
export type WithStyles = {
@ -135,6 +136,7 @@ export default createMuiTheme({
padding: 0,
letterSpacing: '0.5px',
color: primary,
height: 'auto',
textOverflow: 'ellipsis',
display: 'flex',
'&::-webkit-input-placeholder': {
@ -217,6 +219,8 @@ export default createMuiTheme({
color: primary,
letterSpacing: '-0.5px',
fontWeight: 'normal',
paddingTop: xs,
paddingBottom: xs,
},
},
MuiBackdrop: {
@ -230,6 +234,11 @@ export default createMuiTheme({
fontFamily: 'Roboto Mono, monospace',
},
},
MuiListItemIcon: {
root: {
minWidth: 'auto',
},
},
MuiListItemText: {
primary: {
fontFamily: 'Roboto Mono, monospace',

347
yarn.lock
View File

@ -46,17 +46,17 @@
semver "^5.4.1"
source-map "^0.5.0"
"@babel/core@7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.4.tgz#84055750b05fcd50f9915a826b44fa347a825250"
integrity sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ==
"@babel/core@7.4.5":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a"
integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==
dependencies:
"@babel/code-frame" "^7.0.0"
"@babel/generator" "^7.4.4"
"@babel/helpers" "^7.4.4"
"@babel/parser" "^7.4.4"
"@babel/parser" "^7.4.5"
"@babel/template" "^7.4.4"
"@babel/traverse" "^7.4.4"
"@babel/traverse" "^7.4.5"
"@babel/types" "^7.4.4"
convert-source-map "^1.1.0"
debug "^4.1.0"
@ -393,6 +393,11 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6"
integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==
"@babel/parser@^7.4.5":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872"
integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==
"@babel/plugin-proposal-async-generator-functions@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e"
@ -1006,12 +1011,12 @@
dependencies:
regexp-tree "^0.1.0"
"@babel/plugin-transform-named-capturing-groups-regex@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.4.tgz#5611d96d987dfc4a3a81c4383bb173361037d68d"
integrity sha512-Ki+Y9nXBlKfhD+LXaRS7v95TtTGYRAf9Y1rTDiE75zf8YQz4GDaWRXosMfJBXxnk88mGFjWdCRIeqDbon7spYA==
"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106"
integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==
dependencies:
regexp-tree "^0.1.0"
regexp-tree "^0.1.6"
"@babel/plugin-transform-new-target@^7.0.0", "@babel/plugin-transform-new-target@^7.4.0":
version "7.4.0"
@ -1107,12 +1112,12 @@
dependencies:
regenerator-transform "^0.13.4"
"@babel/plugin-transform-regenerator@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.4.tgz#5b4da4df79391895fca9e28f99e87e22cfc02072"
integrity sha512-Zz3w+pX1SI0KMIiqshFZkwnVGUhDZzpX2vtPzfJBKQQq8WsP/Xy9DNdELWivxcKOCX/Pywge4SiEaPaLtoDT4g==
"@babel/plugin-transform-regenerator@^7.4.5":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f"
integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==
dependencies:
regenerator-transform "^0.13.4"
regenerator-transform "^0.14.0"
"@babel/plugin-transform-reserved-words@^7.2.0":
version "7.2.0"
@ -1259,10 +1264,10 @@
js-levenshtein "^1.1.3"
semver "^5.3.0"
"@babel/preset-env@7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.4.tgz#b6f6825bfb27b3e1394ca3de4f926482722c1d6f"
integrity sha512-FU1H+ACWqZZqfw1x2G1tgtSSYSfxJLkpaUQL37CenULFARDo+h4xJoVHzRoHbK+85ViLciuI7ME4WTIhFRBBlw==
"@babel/preset-env@7.4.5":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58"
integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w==
dependencies:
"@babel/helper-module-imports" "^7.0.0"
"@babel/helper-plugin-utils" "^7.0.0"
@ -1293,12 +1298,12 @@
"@babel/plugin-transform-modules-commonjs" "^7.4.4"
"@babel/plugin-transform-modules-systemjs" "^7.4.4"
"@babel/plugin-transform-modules-umd" "^7.2.0"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.4.4"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5"
"@babel/plugin-transform-new-target" "^7.4.4"
"@babel/plugin-transform-object-super" "^7.2.0"
"@babel/plugin-transform-parameters" "^7.4.4"
"@babel/plugin-transform-property-literals" "^7.2.0"
"@babel/plugin-transform-regenerator" "^7.4.4"
"@babel/plugin-transform-regenerator" "^7.4.5"
"@babel/plugin-transform-reserved-words" "^7.2.0"
"@babel/plugin-transform-shorthand-properties" "^7.2.0"
"@babel/plugin-transform-spread" "^7.2.0"
@ -1307,8 +1312,8 @@
"@babel/plugin-transform-typeof-symbol" "^7.2.0"
"@babel/plugin-transform-unicode-regex" "^7.4.4"
"@babel/types" "^7.4.4"
browserslist "^4.5.2"
core-js-compat "^3.0.0"
browserslist "^4.6.0"
core-js-compat "^3.1.1"
invariant "^2.2.2"
js-levenshtein "^1.1.3"
semver "^5.5.0"
@ -1416,13 +1421,20 @@
dependencies:
regenerator-runtime "^0.13.2"
"@babel/runtime@^7.1.5", "@babel/runtime@^7.4.4":
"@babel/runtime@^7.1.5":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.4.tgz#dc2e34982eb236803aa27a07fea6857af1b9171d"
integrity sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==
dependencies:
regenerator-runtime "^0.13.2"
"@babel/runtime@^7.4.5":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12"
integrity sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==
dependencies:
regenerator-runtime "^0.13.2"
"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.2.2", "@babel/template@^7.4.0":
version "7.4.0"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b"
@ -1471,6 +1483,21 @@
globals "^11.1.0"
lodash "^4.17.11"
"@babel/traverse@^7.4.5":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216"
integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==
dependencies:
"@babel/code-frame" "^7.0.0"
"@babel/generator" "^7.4.4"
"@babel/helper-function-name" "^7.1.0"
"@babel/helper-split-export-declaration" "^7.4.4"
"@babel/parser" "^7.4.5"
"@babel/types" "^7.4.4"
debug "^4.1.0"
globals "^11.1.0"
lodash "^4.17.11"
"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.4.0":
version "7.4.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c"
@ -1843,14 +1870,14 @@
"@babel/runtime" "^7.2.0"
"@material-ui/styles@^4.0.0":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.0.1.tgz#67e880d490f010c9f2956c572b07d218bfa255d7"
integrity sha512-SywkWzBzXvm9dUY2rtmzTc/FTlKGctVYGb8hzPZyHU3OI4X9jQH4YnR/OiqTwg4jNpFnASJX5rW1rEUJM+ZnhA==
version "4.0.0"
resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.0.0.tgz#789461e3e2b484a26206db7656c78b3248904f3b"
integrity sha512-TUpmXlyZDVOl6E2//+UzsZxgi2E+2L753QY02nNkbAC6PPx8FUBqvnjYSGqX0V/BjTJ/fD4CkoS6ZpY3lHf+Gg==
dependencies:
"@babel/runtime" "^7.2.0"
"@emotion/hash" "^0.7.1"
"@material-ui/types" "^4.0.1"
"@material-ui/utils" "^4.0.1"
"@material-ui/types" "^4.0.0"
"@material-ui/utils" "^4.0.0"
clsx "^1.0.2"
deepmerge "^3.0.0"
hoist-non-react-statics "^3.2.1"
@ -1866,24 +1893,24 @@
warning "^4.0.1"
"@material-ui/system@^4.0.0":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.0.1.tgz#d78969f3dd9eb6baf82ded0ef183368d8befb00b"
integrity sha512-NlMF4jZk1xx7taUOT+QhrJw7v7uUi9Ae+G8C8fowGgP5x04whxOuSuSmN9a8u2j7dc8XqahR0OJeA6Xch8ymog==
version "4.0.0"
resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.0.0.tgz#bb9a03aa3cf0405c2159c2408b7b8b20b959b119"
integrity sha512-SIsqIwjix98Mqw9LVAmRqTs10E4S/SP5n5mlBlhHVHI+2XG2c+MaCPzOF2Zxq0KdqOMgTb7/aevR3mG9UmODxg==
dependencies:
"@babel/runtime" "^7.2.0"
deepmerge "^3.0.0"
prop-types "^15.7.2"
warning "^4.0.1"
"@material-ui/types@^4.0.0", "@material-ui/types@^4.0.1":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-4.0.1.tgz#a05fe801a10604d99e593303df9e843868008d4f"
integrity sha512-FGhogU9l4s+ycMcC3hhOAvu5hcWa5TVSCCGUf4NOUF904ythroWSAvcCHn92NjftXZ8WZqmtPjL1K/d90Pq/3Q==
"@material-ui/types@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-4.0.0.tgz#6804123b1c5d56db232fc54fe745c5b1c3ef7306"
integrity sha512-wuiQMo8nSljZR1oWh57UQYssdtFqaU+Cbhr16uLohzzTllpCAK4LkH0slnH3n+5vCa2dgOdNlZTrmsIDDwvRJQ==
"@material-ui/utils@^4.0.0", "@material-ui/utils@^4.0.1":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.0.1.tgz#ea3ab6fe4eea9588713813cff6eca33bda3519f6"
integrity sha512-mWRcMQIrqsXGze73tx3hNfB1NUu+BL/oIQI7TImyuhsia1EQXw3bPVBjgwTzqM6MqfXw6eh1fR45Di+WN5hASA==
"@material-ui/utils@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.0.0.tgz#cfe8da2328afea8fbc5599d8e7abd64e25828bc3"
integrity sha512-gjz52hO1hkIbKPMng1diQybVgtfgCptOCrulUs4emSCHHKUoR1zfT+IUrjgOaKIpYZNOgS/CI7KDMp689+FzeQ==
dependencies:
"@babel/runtime" "^7.2.0"
prop-types "^15.7.2"
@ -4703,6 +4730,15 @@ browserslist@^4.0.0, browserslist@^4.3.4, browserslist@^4.5.2, browserslist@^4.5
electron-to-chromium "^1.3.122"
node-releases "^1.1.13"
browserslist@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.0.tgz#5274028c26f4d933d5b1323307c1d1da5084c9ff"
integrity sha512-Jk0YFwXBuMOOol8n6FhgkDzn3mY9PYLYGk29zybF05SbRTsMgPqmTNeQQhOghCxq5oFqAXE3u4sYddr4C0uRhg==
dependencies:
caniuse-lite "^1.0.30000967"
electron-to-chromium "^1.3.133"
node-releases "^1.1.19"
bs58@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.1.tgz#55908d58f1982aba2008fa1bed8f91998a29bf8d"
@ -4967,6 +5003,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000929, can
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000959.tgz#215d3455866da874179c6170202f0cc64f961cfd"
integrity sha512-6BvqmS0VLmY4sJCz6AbIJRQfcns8McDxi424y+3kmtisJeA9/5qslP+K8sqremDau7UU4WSsqdRP032JrqZY8Q==
caniuse-lite@^1.0.30000967:
version "1.0.30000971"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000971.tgz#d1000e4546486a6977756547352bc96a4cfd2b13"
integrity sha512-TQFYFhRS0O5rdsmSbF1Wn+16latXYsQJat66f7S7lizXW1PVpWJeZw9wqqVLIjuxDRz7s7xRUj13QCfd8hKn6g==
capture-exit@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4"
@ -5643,11 +5684,25 @@ core-js-compat@^3.0.0:
core-js-pure "3.0.1"
semver "^6.0.0"
core-js-compat@^3.1.1:
version "3.1.2"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.2.tgz#c29ab9722517094b98622175e2218c3b7398176d"
integrity sha512-X0Ch5f6itrHxhg5HSJucX6nNLNAGr+jq+biBh6nPGc3YAWz2a8p/ZIZY8cUkDzSRNG54omAuu3hoEF8qZbu/6Q==
dependencies:
browserslist "^4.6.0"
core-js-pure "3.1.2"
semver "^6.0.0"
core-js-pure@3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.1.tgz#37358fb0d024e6b86d443d794f4e37e949098cbe"
integrity sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g==
core-js-pure@3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.2.tgz#62fc435f35b7374b9b782013cdcb2f97e9f6dffa"
integrity sha512-5ckIdBF26B3ldK9PM177y2ZcATP2oweam9RskHSoqfZCrJ2As6wVg8zJ1zTriFsZf6clj/N1ThDFRGaomMsh9w==
core-js@3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.1.tgz#1343182634298f7f38622f95e73f54e48ddf4738"
@ -6649,6 +6704,11 @@ electron-to-chromium@^1.3.103, electron-to-chromium@^1.3.122, electron-to-chromi
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.124.tgz#861fc0148748a11b3e5ccebdf8b795ff513fa11f"
integrity sha512-glecGr/kFdfeXUHOHAWvGcXrxNU+1wSO/t5B23tT1dtlvYB26GY8aHzZSWD7HqhqC800Lr+w/hQul6C5AF542w==
electron-to-chromium@^1.3.133:
version "1.3.137"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.137.tgz#ba7c88024984c038a5c5c434529aabcea7b42944"
integrity sha512-kGi32g42a8vS/WnYE7ELJyejRT7hbr3UeOOu0WeuYuQ29gCpg9Lrf6RdcTQVXSt/v0bjCfnlb/EWOOsiKpTmkw==
elliptic@6.3.3:
version "6.3.3"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.3.tgz#5482d9646d54bcb89fd7d994fc9e2e9568876e3f"
@ -6879,17 +6939,17 @@ eslint-module-utils@^2.4.0:
debug "^2.6.8"
pkg-dir "^2.0.0"
eslint-plugin-flowtype@3.9.0:
version "3.9.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.9.0.tgz#031949e2685e9e8658a1166e1cac3163313c3e0d"
integrity sha512-g5CMBJx0dagvOOYLo0ws5Y4+Ma8BBDtgQU+AkjL3W0z8LJUsGL2avY2/bsTZS69qzEA+G7qWKleI1aZp6QNBBw==
eslint-plugin-flowtype@3.9.1:
version "3.9.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.9.1.tgz#6491d930e1f96d53c510e0393e635fddd4a4cac5"
integrity sha512-ZlV6SbIXqz2ysvG0F64ZH07dqzLrwMdM1s0UNfoxdXjr4kMKuPPoLViwK+gFC952QIf341AmP4BKtKOhcB96Ug==
dependencies:
lodash "^4.17.11"
eslint-plugin-import@2.17.2:
version "2.17.2"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz#d227d5c6dc67eca71eb590d2bb62fb38d86e9fcb"
integrity sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g==
eslint-plugin-import@2.17.3:
version "2.17.3"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.3.tgz#00548b4434c18faebaba04b24ae6198f280de189"
integrity sha512-qeVf/UwXFJbeyLbxuY8RgqDyEKCkqV7YC+E5S5uOjAp4tOc8zj01JP3ucoBM8JcEqd1qRasJSg6LLlisirfy0Q==
dependencies:
array-includes "^3.0.3"
contains-path "^0.1.0"
@ -6901,12 +6961,12 @@ eslint-plugin-import@2.17.2:
lodash "^4.17.11"
minimatch "^3.0.4"
read-pkg-up "^2.0.0"
resolve "^1.10.0"
resolve "^1.11.0"
eslint-plugin-jest@22.5.1:
version "22.5.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.5.1.tgz#a31dfe9f9513c6af7c17ece4c65535a1370f060b"
integrity sha512-c3WjZR/HBoi4GedJRwo2OGHa8Pzo1EbSVwQ2HFzJ+4t2OoYM7Alx646EH/aaxZ+9eGcPiq0FT0UGkRuFFx2FHg==
eslint-plugin-jest@22.6.4:
version "22.6.4"
resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.6.4.tgz#2895b047dd82f90f43a58a25cf136220a21c9104"
integrity sha512-36OqnZR/uMCDxXGmTsqU4RwllR0IiB/XF8GW3ODmhsjiITKuI0GpgultWFt193ipN3HARkaIcKowpE6HBvRHNg==
eslint-plugin-jsx-a11y@^6.0.3:
version "6.2.1"
@ -11969,6 +12029,13 @@ node-releases@^1.1.13, node-releases@^1.1.3:
dependencies:
semver "^5.3.0"
node-releases@^1.1.19:
version "1.1.21"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.21.tgz#46c86f9adaceae4d63c75d3c2f2e6eee618e55f3"
integrity sha512-TwnURTCjc8a+ElJUjmDqU6+12jhli1Q61xOQmdZ7ECZVBZuQpN/1UnembiIHDM1wCcfLvh5wrWXUF5H6ufX64Q==
dependencies:
semver "^5.3.0"
node-version@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d"
@ -13786,12 +13853,13 @@ react-final-form-listeners@^1.0.2:
dependencies:
"@babel/runtime" "^7.1.5"
react-final-form@5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/react-final-form/-/react-final-form-5.1.0.tgz#f9402dfdf9325e5605cd8c9c7f4ef3e9ecf0702c"
integrity sha512-Gxqp5DVklAgSe/4l57S0BrjbsTSwXBll0J0FHk9y+Fcoz3Aau43jvonYIHCesnzfd0zlh7lxdXiyOWqinjIwiQ==
react-final-form@6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/react-final-form/-/react-final-form-6.0.0.tgz#5c574f519e12a6edea96f62c84e884f565caa7b9"
integrity sha512-xrVFg7ZPGyeUjH9B2E+TjUihcFopucl7NJbaq/FeUCk0NR9hAqM1gIilHXgShm3tPFDW7SJUgL9CB3A/PH2bWg==
dependencies:
"@babel/runtime" "^7.4.4"
"@babel/runtime" "^7.4.5"
ts-essentials "^2.0.2"
react-focus-lock@^1.17.7:
version "1.18.3"
@ -13813,10 +13881,10 @@ react-helmet-async@^0.2.0:
react-fast-compare "^2.0.2"
shallowequal "^1.0.2"
react-hot-loader@4.8.7:
version "4.8.7"
resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.8.7.tgz#8bcec3105d4e0e3cba52aa59800568fc9fb3322d"
integrity sha512-ctWAu8iwp37qd4w1qhjN6neDA1e5bSmAUY46L2l5SeK+i8AfzX+7lrpaLW4TJVaiBv5MlqIzA1ClNnvlvsy5Lg==
react-hot-loader@4.8.8:
version "4.8.8"
resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.8.8.tgz#71e3c7ba301556aa24c52cef2f6ed0af82395eea"
integrity sha512-58bgeS7So8V93MhhnKogbraor8xdrTncil+b6IoIXkTIr3blJNAE7bU4tn/iJvy2J7rjxQmKFRaxKrWdKUZpqg==
dependencies:
fast-levenshtein "^2.0.6"
global "^4.3.0"
@ -14321,6 +14389,13 @@ regenerator-transform@^0.13.4:
dependencies:
private "^0.1.6"
regenerator-transform@^0.14.0:
version "0.14.0"
resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf"
integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w==
dependencies:
private "^0.1.6"
regex-cache@^0.4.2:
version "0.4.4"
resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
@ -14341,6 +14416,11 @@ regexp-tree@^0.1.0:
resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.5.tgz#7cd71fca17198d04b4176efd79713f2998009397"
integrity sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ==
regexp-tree@^0.1.6:
version "0.1.10"
resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc"
integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ==
regexp.prototype.flags@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c"
@ -14642,7 +14722,7 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1,
dependencies:
path-parse "^1.0.6"
resolve@^1.10.1:
resolve@^1.10.1, resolve@^1.11.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232"
integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==
@ -16359,10 +16439,10 @@ truffle-artifactor@^2.1.2:
truffle-contract "^2.0.3"
truffle-contract-schema "^0.0.5"
truffle-artifactor@^4.0.15:
version "4.0.15"
resolved "https://registry.yarnpkg.com/truffle-artifactor/-/truffle-artifactor-4.0.15.tgz#00a0defbb2a321cacaa5c08475a17ba3e6d29ad8"
integrity sha512-7aVIpA9LoDXAxbpq7jNwIH2UYnfs5w19PHZqGMgU+f4YPZ+1jDTbVP1KlxWy9wnLbEhTDsF0LNle9Ofxnj3f7w==
truffle-artifactor@^4.0.16:
version "4.0.16"
resolved "https://registry.yarnpkg.com/truffle-artifactor/-/truffle-artifactor-4.0.16.tgz#68ce8a552fb7d9cd7a5a67da08ea478c2d3093d7"
integrity sha512-ebz0Suj8nB86WmfY9o6s/oCJ6rqyJcPdZbr5U1kO5g2BYpDFt02zfDwvNNYBQq8ewwxPua/jguyC4zJ9O7fPWw==
dependencies:
fs-extra "6.0.1"
lodash "4.17.11"
@ -16402,21 +16482,21 @@ truffle-code-utils@^1.2.3:
resolved "https://registry.yarnpkg.com/truffle-code-utils/-/truffle-code-utils-1.2.3.tgz#85e90078c27546e0e2fbb301d91c64b0e8bf186c"
integrity sha512-3GkhmuRq38TewsZm0cgLx9xqTbA4avHXjb8xChYl46b6v86P/DmpCesVM8eh6z/y5uxWGyAak0xwxWb3GmXuiA==
truffle-compile-vyper@^1.0.15:
version "1.0.15"
resolved "https://registry.yarnpkg.com/truffle-compile-vyper/-/truffle-compile-vyper-1.0.15.tgz#15219b318a51c40600f736a0a27f3086b3b5c1e0"
integrity sha512-2fMSSk+nUUkxVLQ8yKXJ8gFrjUVsdPPeangNXF/JHgIH3Nm9OcjkNWw83FAs5iQNufxV3Um8mG49NvjXbhFWKg==
truffle-compile-vyper@^1.0.16:
version "1.0.16"
resolved "https://registry.yarnpkg.com/truffle-compile-vyper/-/truffle-compile-vyper-1.0.16.tgz#146cba5d0fa450b28bc5cfdb250bbc3a247cf923"
integrity sha512-ENYz+GkJ4S/KLO2OWHnve4cCskCKsh7rZpwj83RDnx6a+YyZtEVchC78AkZf61UvzwpQdQLK3gOpWMNbftiaag==
dependencies:
async "2.6.1"
colors "^1.1.2"
eslint "^5.5.0"
minimatch "^3.0.4"
truffle-compile "^4.0.15"
truffle-compile "^4.0.16"
truffle-compile@^4.0.15:
version "4.0.15"
resolved "https://registry.yarnpkg.com/truffle-compile/-/truffle-compile-4.0.15.tgz#f28168e3c8b771f79123f860b4c76bb693dcfe15"
integrity sha512-HXWI2tiq+Os0VN8hkHggKzEEbMSlZz86kejoRMMeaSTnw8YzxlqmarjEcaOpdm2MtjXSPfQcXiPic2FvIVN6FQ==
truffle-compile@^4.0.16:
version "4.0.16"
resolved "https://registry.yarnpkg.com/truffle-compile/-/truffle-compile-4.0.16.tgz#b524f3492545d1b5f32a03bfd0e697be72d94702"
integrity sha512-MioDkKKxUalw611mAujkPSq+16E3vKkQ2OlUcJ5T8zjdVRKSdg53bR3zy9WsP1V5p5cx4LUVA0dJvhKHwpvalA==
dependencies:
async "2.6.1"
colors "^1.1.2"
@ -16506,10 +16586,10 @@ truffle-contract@4.0.0-next.0:
web3-eth-abi "1.0.0-beta.35"
web3-utils "1.0.0-beta.35"
truffle-contract@4.0.16, truffle-contract@^4.0.16:
version "4.0.16"
resolved "https://registry.yarnpkg.com/truffle-contract/-/truffle-contract-4.0.16.tgz#5175683a2ab20f361d19ed7caaf579b7d3912b42"
integrity sha512-Ooe0GR4Wbub2Dl5tsl09dWfyZEinPPijcneFHJWPDsa1bkp/6PYpX7NWd0wZrt9pI8VJ1EceDhg4rBTo4slcxA==
truffle-contract@4.0.17, truffle-contract@^4.0.17:
version "4.0.17"
resolved "https://registry.yarnpkg.com/truffle-contract/-/truffle-contract-4.0.17.tgz#2b4dce1e140c34f3c0309c4e403927e3092b6786"
integrity sha512-LV9Ws/RaHReSf6gTmrka92I4jXRPy59t3bsiF0655gAXe7Pz4DYCTmNti2bR7/vZIU8qtLlDSUmImuyFpO8p5g==
dependencies:
bignumber.js "^7.2.1"
ethers "^4.0.0-beta.1"
@ -16532,10 +16612,10 @@ truffle-contract@^2.0.3:
truffle-contract-schema "^0.0.5"
web3 "^0.20.1"
truffle-core@^5.0.18:
version "5.0.18"
resolved "https://registry.yarnpkg.com/truffle-core/-/truffle-core-5.0.18.tgz#b47a001909f2471ebe71ddae3fd28b6bef47ce7b"
integrity sha512-JyN7cwkA6oHh1Dg3L7PTirsCjJN+DTnA3JnRVhMexxYb/omWs2kp+5QxqokZK7Y8zpz9c0U+EREP/egHoo4DoA==
truffle-core@^5.0.19:
version "5.0.19"
resolved "https://registry.yarnpkg.com/truffle-core/-/truffle-core-5.0.19.tgz#dc357d7364c12f70341e58ac9578cb087b775be1"
integrity sha512-AnKehAu4bS+MQxAMmyIhVlAmmhPROTmv8LmEqJzGcHhrcI/yOINe4iFcZiIXKzrrx/7k4DQf/UR4EsI/ZUFW9A==
dependencies:
app-module-path "^2.2.0"
async "2.6.1"
@ -16566,44 +16646,44 @@ truffle-core@^5.0.18:
source-map-support "^0.5.3"
spawn-args "^0.1.0"
temp "^0.8.3"
truffle-artifactor "^4.0.15"
truffle-artifactor "^4.0.16"
truffle-box "^1.0.26"
truffle-compile "^4.0.15"
truffle-compile "^4.0.16"
truffle-config "^1.1.12"
truffle-contract "^4.0.16"
truffle-contract "^4.0.17"
truffle-contract-sources "^0.1.3"
truffle-debug-utils "^1.0.16"
truffle-debugger "^5.0.11"
truffle-deployer "^3.0.17"
truffle-debug-utils "^1.0.17"
truffle-debugger "^5.0.12"
truffle-deployer "^3.0.18"
truffle-error "^0.0.4"
truffle-expect "^0.0.8"
truffle-init "^1.0.7"
truffle-interface-adapter "^0.1.5"
truffle-migrate "^3.0.17"
truffle-migrate "^3.0.18"
truffle-provider "^0.1.9"
truffle-provisioner "^0.1.4"
truffle-require "^2.0.12"
truffle-resolver "^5.0.13"
truffle-solidity-utils "^1.2.2"
truffle-workflow-compile "^2.0.15"
truffle-workflow-compile "^2.0.16"
universal-analytics "^0.4.17"
web3 "1.0.0-beta.37"
xregexp "^4.2.4"
yargs "^8.0.2"
truffle-debug-utils@^1.0.16:
version "1.0.16"
resolved "https://registry.yarnpkg.com/truffle-debug-utils/-/truffle-debug-utils-1.0.16.tgz#1b1b166a9a7a8f56c152cd76616ff43255ebfbdc"
integrity sha512-oBM9ljrsm25W8oG3lJ6jx/wMNLND2HkNHw2ecqZWozVYvDOdxKfZdW4Ppbj2I10MXwvNUxGw4hcTlVE5neut4w==
truffle-debug-utils@^1.0.17:
version "1.0.17"
resolved "https://registry.yarnpkg.com/truffle-debug-utils/-/truffle-debug-utils-1.0.17.tgz#d044fdd516898a6a9faa0b240707df0f8f1f9d58"
integrity sha512-M+FgovTF0HSnPqLfl8NoEM0r3H/7VI4VTGQA6EKYui0kP0TlauFXrp+FKp9250cj4qLkhyMUIsKDouv9eV4vkg==
dependencies:
async "2.6.1"
debug "^4.1.0"
node-dir "0.1.17"
truffle-debugger@^5.0.11:
version "5.0.11"
resolved "https://registry.yarnpkg.com/truffle-debugger/-/truffle-debugger-5.0.11.tgz#2778ec7220e8926853d0d8dbf76868643551fa75"
integrity sha512-4cVtVE8kVXczJdjHJvpasymsuFR8ORpfJJgN8A0QvI9yEv4TePajmh5muD7yLowJySXaho/HOGfzmQLKhDTslQ==
truffle-debugger@^5.0.12:
version "5.0.12"
resolved "https://registry.yarnpkg.com/truffle-debugger/-/truffle-debugger-5.0.12.tgz#573e4bbd8fd2afbe8d57abf2e1fe2be9598b8112"
integrity sha512-sqlAvSNCm5K/qci2eEhJyvJNbZAapVloDrmaZe1e/s3sLR8trmFVrXiuDlpMNVcPSI5Ul0G8zqiNqdqsR79PiQ==
dependencies:
bn.js "^4.11.8"
debug "^4.1.0"
@ -16648,13 +16728,13 @@ truffle-decoder@^3.0.3:
truffle-decode-utils "^1.0.12"
web3 "1.0.0-beta.37"
truffle-deployer@^3.0.17:
version "3.0.17"
resolved "https://registry.yarnpkg.com/truffle-deployer/-/truffle-deployer-3.0.17.tgz#b420b45a1549dd1bd0b0d44536c908fca95cb7c3"
integrity sha512-3dsqy1tk3yn1BK5/wbE5zWYsd92UoDuiElp2Rnpx1v4bepb5KrpVKJJsrQnbrKmdzB6Izcd1OtX5cZ+c2F3WYg==
truffle-deployer@^3.0.18:
version "3.0.18"
resolved "https://registry.yarnpkg.com/truffle-deployer/-/truffle-deployer-3.0.18.tgz#e82605895ac6eb4f413f66ce82b3d09ab1e42f6d"
integrity sha512-NWIn/Q/LF34stGqapQtTLhmhJYhmO/QAaygpD1rKJLBUNUjJoynGHf68DpovacoPpZBxfAvRDWhrsNNpY8S3+A==
dependencies:
emittery "^0.4.0"
truffle-contract "^4.0.16"
truffle-contract "^4.0.17"
truffle-expect "^0.0.8"
truffle-error@^0.0.3:
@ -16721,16 +16801,16 @@ truffle-interface-adapter@^0.1.5:
bn.js "^4.11.8"
web3 "1.0.0-beta.37"
truffle-migrate@^3.0.17:
version "3.0.17"
resolved "https://registry.yarnpkg.com/truffle-migrate/-/truffle-migrate-3.0.17.tgz#b8b5103b9879d9366e206598d90abadd9a9017f7"
integrity sha512-5lGFxYdWilJSJncK95Q1I1/EnGVSjJKNjoDxG22nY5s54cMtr8lEyK6GN5+8DYdzhbI+VKob12vB/b/Jhb2l4w==
truffle-migrate@^3.0.18:
version "3.0.18"
resolved "https://registry.yarnpkg.com/truffle-migrate/-/truffle-migrate-3.0.18.tgz#b3ee225168a726b1d757817d094e5db8de73bf67"
integrity sha512-36SiTqvKdTTCQrTAMome0jg1zDf6NNA6ssmAifubgzNHk1dFQk1V5A2FKVy/JP+jnwlFHA3kr6yfVxy0dA6LAA==
dependencies:
async "2.6.1"
emittery "^0.4.0"
node-dir "0.1.17"
truffle-config "^1.1.12"
truffle-deployer "^3.0.17"
truffle-deployer "^3.0.18"
truffle-expect "^0.0.8"
truffle-interface-adapter "^0.1.5"
truffle-reporters "^1.0.9"
@ -16791,41 +16871,41 @@ truffle-resolver@^5.0.13:
truffle-expect "^0.0.8"
truffle-provisioner "^0.1.4"
truffle-solidity-loader@0.1.17:
version "0.1.17"
resolved "https://registry.yarnpkg.com/truffle-solidity-loader/-/truffle-solidity-loader-0.1.17.tgz#ad925032d7e42045df8de969d9161343b956eddc"
integrity sha512-1pVZs1qO3hitVSHOInwXqty1e1ns7F+kHlXpt0rhFxwVrCHcp3/TH53/QWWdUgiORmPVYnT7Cb6EfVIiIKS7ow==
truffle-solidity-loader@0.1.18:
version "0.1.18"
resolved "https://registry.yarnpkg.com/truffle-solidity-loader/-/truffle-solidity-loader-0.1.18.tgz#d5ccb08892cd53e4fa0fa1b97ecfd46c8d8eb3e3"
integrity sha512-Q+M41sZfll+hfhyvac7JNkakXz8d3PKw1c3xmMOvch+8QZHxh1zxWNKYiuATJNmBs8Q9uYcP14dRMt4CIIzBXA==
dependencies:
chalk "^1.1.3"
find-up "^1.1.2"
loader-utils "^1.1.0"
schema-utils "^1.0.0"
truffle-config "^1.1.12"
truffle-core "^5.0.18"
truffle-core "^5.0.19"
truffle-solidity-utils@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/truffle-solidity-utils/-/truffle-solidity-utils-1.2.2.tgz#72100f12317a94cb8e784bc84d8f8832292e5fc0"
integrity sha512-27Eos1o33x+tdRogeR8WwWuhRXatHwbp9AHANGSCm46ZhRzSWcObW8Ctm2kKdAP0jZehDLT2e7l5oZ4NJofLMg==
truffle-workflow-compile@^2.0.15:
version "2.0.15"
resolved "https://registry.yarnpkg.com/truffle-workflow-compile/-/truffle-workflow-compile-2.0.15.tgz#68402d9573367d1718e2a589c9a0697083c2f81a"
integrity sha512-fT5johrcXgDJ4YK8QbLo/XTlfRrg3pc3bV5PNjwhKufmIS5yCNE+moyqbcndbkUxdSu89aDYc/XuCAX/hoivsQ==
truffle-workflow-compile@^2.0.16:
version "2.0.16"
resolved "https://registry.yarnpkg.com/truffle-workflow-compile/-/truffle-workflow-compile-2.0.16.tgz#8a4911d0b4a6c0a31392a12a0a009951a645ec7e"
integrity sha512-CTlMeb8P4tdTEYLMAco6TlJDAQsmmD49npIpbe6z5oAU+YIpL0h9vGmAZp9HI9LjwX8gxCjPEsEeuTNdqoy04A==
dependencies:
mkdirp "^0.5.1"
truffle-artifactor "^4.0.15"
truffle-compile "^4.0.15"
truffle-compile-vyper "^1.0.15"
truffle-artifactor "^4.0.16"
truffle-compile "^4.0.16"
truffle-compile-vyper "^1.0.16"
truffle-config "^1.1.12"
truffle-expect "^0.0.8"
truffle-external-compile "^1.0.9"
truffle-resolver "^5.0.13"
truffle@5.0.18:
version "5.0.18"
resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.0.18.tgz#2cf309dbf0671bfb5c0994ea8f59b45abb5b7636"
integrity sha512-aQPbWSskotSmylj4kiq73Di5X+tHl5ChlvlBAo5brHmsCzvMGIH29UA+t/rK8TRo7i7Kut0HxAgVR5i+bJteAQ==
truffle@5.0.19:
version "5.0.19"
resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.0.19.tgz#3187f11168ed526ffa17cfa6a0d9735208569381"
integrity sha512-d4fxChHYCjccW33IO/4KLcGqjTDn+mw7vqdGvGi307CMo+KTtns+5c91+1iOKDQcSKiv8SHYgvtyF7cn/+FPAg==
dependencies:
app-module-path "^2.2.0"
mocha "^4.1.0"
@ -16837,6 +16917,11 @@ tryer@^1.0.0:
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
ts-essentials@^2.0.2:
version "2.0.7"
resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.7.tgz#f2bcc9d747289ffa8076727a7067f673f4e6d0f2"
integrity sha512-ptWcvcbgD7geud/+OVNPklmhpdsSZa7diUJk3ly/wJH2975h1ozzbGAyxH/kj3wjyZre08QE9lSfbLOZpngjaw==
tslib@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
@ -18372,10 +18457,10 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0:
source-list-map "^2.0.0"
source-map "~0.6.1"
webpack@4.32.0:
version "4.32.0"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.32.0.tgz#d8726fe73bb362e0e48171990f362df5e747747b"
integrity sha512-ofFq9jjAn4HRzlmkcZZrjijbRZcqDw+mM9KrjKd0r6lS0qxyZ7jzICzhphGafXL62dGdjP7TgMK9mZeMLUgZgw==
webpack@4.32.2:
version "4.32.2"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.32.2.tgz#3639375364a617e84b914ddb2c770aed511e5bc8"
integrity sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg==
dependencies:
"@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/helper-module-context" "1.8.5"