diff --git a/package.json b/package.json index 0ab63ec8..7759d189 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/components/Header/component/Provider.jsx b/src/components/Header/component/Provider.jsx index 45df78d2..bdaee353 100644 --- a/src/components/Header/component/Provider.jsx +++ b/src/components/Header/component/Provider.jsx @@ -55,16 +55,13 @@ class Provider extends React.Component {
- { info } - - { open ? : } + {info} + + {open ? : }
- { children(this.myRef) } + {children(this.myRef)}
) } diff --git a/src/components/Header/index.jsx b/src/components/Header/index.jsx index 12345328..1ea89441 100644 --- a/src/components/Header/index.jsx +++ b/src/components/Header/index.jsx @@ -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 { return } - return () + return ( + + ) } render() { @@ -84,14 +87,13 @@ class HeaderComponent extends React.PureComponent { } } -const Header = connect(selector, actions)(HeaderComponent) +const Header = connect( + selector, + actions, +)(HeaderComponent) const HeaderSnack = () => ( - - {({ openSnackbar }) => ( -
- )} - + {({ openSnackbar }) =>
} ) export default HeaderSnack diff --git a/src/components/SnackbarContent/index.jsx b/src/components/SnackbarContent/index.jsx index 603e3f53..0cfe8012 100644 --- a/src/components/SnackbarContent/index.jsx +++ b/src/components/SnackbarContent/index.jsx @@ -64,7 +64,7 @@ const styles = theme => ({ }, iconVariant: { opacity: 0.9, - marginRight: theme.spacing.unit, + marginRight: theme.spacing(1), }, message: { display: 'flex', diff --git a/src/components/forms/GnoForm/index.jsx b/src/components/forms/GnoForm/index.jsx index 8cb2c8ec..9ebf3210 100644 --- a/src/components/forms/GnoForm/index.jsx +++ b/src/components/forms/GnoForm/index.jsx @@ -15,7 +15,7 @@ type Props = { padding?: number, validation?: (values: Object) => Object | Promise, initialValues?: Object, - formMutators: Object, + formMutators?: Object, } const stylesBasedOn = (padding: number): $Shape => ({ diff --git a/src/components/layout/Link/index.jsx b/src/components/layout/Link/index.jsx index 5ffed167..08809997 100644 --- a/src/components/layout/Link/index.jsx +++ b/src/components/layout/Link/index.jsx @@ -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, } 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 ( - + {children} ) } -export default GnosisLink +// https://material-ui.com/guides/composition/#caveat-with-refs +const LinkWithRef = React.forwardRef((props, ref) => ) + +export default LinkWithRef diff --git a/src/logic/safe/transactions/index.js b/src/logic/safe/transactions/index.js index 4f54b80d..21061b39 100644 --- a/src/logic/safe/transactions/index.js +++ b/src/logic/safe/transactions/index.js @@ -1,4 +1,5 @@ // @flow export * from './gas' +export * from './send' export * from './safeBlockchainOperations' export * from './safeTxSignerEIP712' diff --git a/src/logic/safe/transactions/safeBlockchainOperations.js b/src/logic/safe/transactions/safeBlockchainOperations.js index 0636f2d5..7222604d 100644 --- a/src/logic/safe/transactions/safeBlockchainOperations.js +++ b/src/logic/safe/transactions/safeBlockchainOperations.js @@ -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, -) => { - const gasPrice = await calculateGasPrice() +// export const executeTransaction = async ( +// safeAddress: string, +// to: string, +// valueInWei: number, +// data: string, +// operation: Operation, +// nonce: number, +// sender: string, +// ownersWhoHasSigned: List, +// ) => { +// 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 +// } diff --git a/src/logic/safe/transactions/safeTxSignerEIP712.js b/src/logic/safe/transactions/safeTxSignerEIP712.js index 07d78efc..ac9a79a6 100644 --- a/src/logic/safe/transactions/safeTxSignerEIP712.js +++ b/src/logic/safe/transactions/safeTxSignerEIP712.js @@ -82,7 +82,7 @@ export const generateMetamaskSignature = async ( operation, txGasEstimate, ) - console.log({sender}) + const jsonTypedData = JSON.stringify(typedData) const signedTypedData = { method: 'eth_signTypedData_v3', diff --git a/src/logic/safe/transactions/send.js b/src/logic/safe/transactions/send.js new file mode 100644 index 00000000..ee4e93cd --- /dev/null +++ b/src/logic/safe/transactions/send.js @@ -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 +} diff --git a/src/routes/opening/component/index.jsx b/src/routes/opening/component/index.jsx index 146df640..3c239471 100644 --- a/src/routes/opening/component/index.jsx +++ b/src/routes/opening/component/index.jsx @@ -43,10 +43,7 @@ const styles = { } const Opening = ({ - classes, - name = 'Safe creation process', - tx, - network, + classes, name = 'Safe creation process', tx, network, }: Props) => ( @@ -68,13 +65,25 @@ const Opening = ({ - This process should take a couple of minutes.
+ This process should take a couple of minutes. + {' '} +
- { tx && + {tx && ( - Follow progress on Etherscan.io + Follow progress on + {' '} + + Etherscan.io + + - } + )}
) diff --git a/src/routes/safe/components/Balances/Receive/index.jsx b/src/routes/safe/components/Balances/Receive/index.jsx index f167ef71..841f6f2a 100644 --- a/src/routes/safe/components/Balances/Receive/index.jsx +++ b/src/routes/safe/components/Balances/Receive/index.jsx @@ -94,7 +94,14 @@ const Receive = ({ - {safeAddress} + { + copyToClipboard(safeAddress) + }} + className={classes.address} + > + {safeAddress} + diff --git a/src/routes/safe/components/Balances/SendModal/index.jsx b/src/routes/safe/components/Balances/SendModal/index.jsx index 8282b1cd..f8e20a50 100644 --- a/src/routes/safe/components/Balances/SendModal/index.jsx +++ b/src/routes/safe/components/Balances/SendModal/index.jsx @@ -19,6 +19,7 @@ type Props = { ethBalance: string, tokens: List, selectedToken: string, + createTransaction: Function, } type ActiveScreen = 'chooseTxType' | 'sendFunds' | 'reviewTx' @@ -47,6 +48,7 @@ const Send = ({ ethBalance, tokens, selectedToken, + createTransaction, }: Props) => { const [activeScreen, setActiveScreen] = useState('sendFunds') const [tx, setTx] = useState({}) @@ -98,6 +100,7 @@ const Send = ({ safeName={safeName} ethBalance={ethBalance} onClickBack={onClickBack} + createTransaction={createTransaction} /> )} diff --git a/src/routes/safe/components/Balances/SendModal/screens/ReviewTx/index.jsx b/src/routes/safe/components/Balances/SendModal/screens/ReviewTx/index.jsx index aa5f1c55..e3779478 100644 --- a/src/routes/safe/components/Balances/SendModal/screens/ReviewTx/index.jsx +++ b/src/routes/safe/components/Balances/SendModal/screens/ReviewTx/index.jsx @@ -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) => ( - - - - Send Funds - - 2 of 2 - - - - - - - - - - Arrow Down - - - - - - - - Recipient - - - - - - - - - {tx.recipientAddress} - - - + + {({ openSnackbar }) => ( + + + + Send Funds - - - - - Amount - - - - {tx.token.name} - - {tx.amount} - {' '} - {tx.token.symbol} - - - - - - - - - + 2 of 2 + + + + + + + + + + Arrow Down + + + + + + + + Recipient + + + + + + + + + {tx.recipientAddress} + + + + + + + + + Amount + + + + {tx.token.name} + + {tx.amount} + {' '} + {tx.token.symbol} + + + + + + + + + + )} + ) export default withStyles(styles)(ReviewTx) diff --git a/src/routes/safe/components/Balances/SendModal/screens/ReviewTx/style.js b/src/routes/safe/components/Balances/SendModal/screens/ReviewTx/style.js index 343c621c..96e20c6b 100644 --- a/src/routes/safe/components/Balances/SendModal/screens/ReviewTx/style.js +++ b/src/routes/safe/components/Balances/SendModal/screens/ReviewTx/style.js @@ -24,6 +24,9 @@ export const styles = () => ({ container: { padding: `${md} ${lg}`, }, + amount: { + marginLeft: sm, + }, buttonRow: { height: '84px', justifyContent: 'center', diff --git a/src/routes/safe/components/Balances/SendModal/screens/SendFunds/TokenSelectField/style.js b/src/routes/safe/components/Balances/SendModal/screens/SendFunds/TokenSelectField/style.js index de9ac3f3..222e8214 100644 --- a/src/routes/safe/components/Balances/SendModal/screens/SendFunds/TokenSelectField/style.js +++ b/src/routes/safe/components/Balances/SendModal/screens/SendFunds/TokenSelectField/style.js @@ -9,6 +9,8 @@ export const selectedTokenStyles = () => ({ }, tokenData: { padding: 0, + margin: 0, + lineHeight: '14px', }, tokenImage: { marginRight: sm, diff --git a/src/routes/safe/components/Balances/Tokens/screens/TokenList/index.jsx b/src/routes/safe/components/Balances/Tokens/screens/TokenList/index.jsx index 70b9c33e..6ddb9170 100644 --- a/src/routes/safe/components/Balances/Tokens/screens/TokenList/index.jsx +++ b/src/routes/safe/components/Balances/Tokens/screens/TokenList/index.jsx @@ -158,7 +158,7 @@ class Tokens extends React.Component { return ( - + {token.name} diff --git a/src/routes/safe/components/Balances/Tokens/screens/TokenList/style.js b/src/routes/safe/components/Balances/Tokens/screens/TokenList/style.js index 9cd0004f..89554981 100644 --- a/src/routes/safe/components/Balances/Tokens/screens/TokenList/style.js +++ b/src/routes/safe/components/Balances/Tokens/screens/TokenList/style.js @@ -47,6 +47,9 @@ export const styles = () => ({ letterSpacing: '-0.5px', }, }, + tokenIcon: { + marginRight: md, + }, progressContainer: { width: '100%', height: '100%', diff --git a/src/routes/safe/components/Balances/index.jsx b/src/routes/safe/components/Balances/index.jsx index f89f5289..1280e801 100644 --- a/src/routes/safe/components/Balances/index.jsx +++ b/src/routes/safe/components/Balances/index.jsx @@ -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 { 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 { ethBalance={ethBalance} tokens={activeTokens} selectedToken={sendFunds.selectedToken} + createTransaction={createTransaction} /> ({ margin: `${sm} 0`, }, actionIcon: { - marginRight: theme.spacing.unit, + marginRight: theme.spacing(1), }, iconSmall: { fontSize: 16, diff --git a/src/routes/safe/components/Layout.jsx b/src/routes/safe/components/Layout.jsx index 25fa8a58..4383a63f 100644 --- a/src/routes/safe/components/Layout.jsx +++ b/src/routes/safe/components/Layout.jsx @@ -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 { 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 { safeAddress={address} safeName={name} etherScanLink={etherScanLink} + createTransaction={createTransaction} /> )} diff --git a/src/routes/safe/components/SendToken/ReviewTx/index.jsx b/src/routes/safe/components/SendToken/ReviewTx/index.jsx index 7f9ef2bd..15f3ef92 100644 --- a/src/routes/safe/components/SendToken/ReviewTx/index.jsx +++ b/src/routes/safe/components/SendToken/ReviewTx/index.jsx @@ -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 Review the move token funds - Destination: {values[TKN_DESTINATION_PARAM]} + Destination: + {' '} + {values[TKN_DESTINATION_PARAM]} {`Amount to transfer: ${values[TKN_VALUE_PARAM]} ${symbol}`} - - { submitting && } - + {submitting && } ) diff --git a/src/routes/safe/container/actions.js b/src/routes/safe/container/actions.js index cd193daa..41636c2a 100644 --- a/src/routes/safe/container/actions.js +++ b/src/routes/safe/container/actions.js @@ -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, } diff --git a/src/routes/safe/container/index.jsx b/src/routes/safe/container/index.jsx index 57a131e7..bd0a7b68 100644 --- a/src/routes/safe/container/index.jsx +++ b/src/routes/safe/container/index.jsx @@ -52,7 +52,7 @@ class SafeView extends React.Component { 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 { userAddress={userAddress} network={network} granted={granted} + createTransaction={createTransaction} /> ) diff --git a/src/routes/safe/store/actions/addSafe.js b/src/routes/safe/store/actions/addSafe.js index af89c35c..0753e14d 100644 --- a/src/routes/safe/store/actions/addSafe.js +++ b/src/routes/safe/store/actions/addSafe.js @@ -31,7 +31,7 @@ const saveSafe = ( threshold: number, ownersName: string[], ownersAddress: string[], -) => async (dispatch: ReduxDispatch) => { +) => (dispatch: ReduxDispatch) => { const owners: List = buildOwnersFrom(ownersName, ownersAddress) const safe: Safe = SafeRecord({ diff --git a/src/routes/safe/store/actions/addTransactions.js b/src/routes/safe/store/actions/addTransactions.js deleted file mode 100644 index 4d5cc734..00000000 --- a/src/routes/safe/store/actions/addTransactions.js +++ /dev/null @@ -1,6 +0,0 @@ -// @flow -import { createAction } from 'redux-actions' - -export const ADD_TRANSACTIONS = 'ADD_TRANSACTIONS' - -export default createAction(ADD_TRANSACTIONS) diff --git a/src/routes/safe/store/actions/createTransaction.js b/src/routes/safe/store/actions/createTransaction.js new file mode 100644 index 00000000..7ba8704a --- /dev/null +++ b/src/routes/safe/store/actions/createTransaction.js @@ -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(ADD_TRANSACTIONS) + +const createTransaction = ( + safeAddress: string, + to: string, + valueInEth: string, + token: Token, + openSnackbar: Function, +) => async (dispatch: ReduxDispatch) => { + 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 diff --git a/src/routes/safe/store/reducer/transactions.js b/src/routes/safe/store/reducer/transactions.js index 01dbc6bf..68e8be77 100644 --- a/src/routes/safe/store/reducer/transactions.js +++ b/src/routes/safe/store/reducer/transactions.js @@ -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> export default handleActions( { - [ADD_TRANSACTIONS]: (state: State, action: ActionType): State => action.payload, + [ADD_TRANSACTIONS]: (state: State, action: ActionType): State => action.payload, }, Map(), ) diff --git a/src/theme/mui.js b/src/theme/mui.js index fec7f53e..5db892fe 100644 --- a/src/theme/mui.js +++ b/src/theme/mui.js @@ -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', diff --git a/yarn.lock b/yarn.lock index 1669c09d..8f8cdc70 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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"