From d56d9c30a199e087264e3c1f8d901bdb1195b676 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Wed, 3 Jun 2020 11:29:29 -0400 Subject: [PATCH 001/106] Add react-native-payments --- ios/Podfile.lock | 6 ++++++ package.json | 1 + react-native-payments-v1.1.5.tgz | Bin 0 -> 21591 bytes yarn.lock | 23 +++++++++++++++++++++++ 4 files changed, 30 insertions(+) create mode 100644 react-native-payments-v1.1.5.tgz diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 66872575dc0..762db76e38c 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -340,6 +340,8 @@ PODS: - React-cxxreact (= 0.62.2) - React-jsi (= 0.62.2) - ReactCommon/callinvoker (= 0.62.2) + - ReactNativePayments (1.1.5): + - React - RNCAsyncStorage (1.9.0): - React - RNCClipboard (1.2.2): @@ -440,6 +442,7 @@ DEPENDENCIES: - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) - ReactCommon/callinvoker (from `../node_modules/react-native/ReactCommon`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - ReactNativePayments (from `../node_modules/react-native-payments/lib/ios`) - "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)" - "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)" - RNDeviceInfo (from `../node_modules/react-native-device-info`) @@ -549,6 +552,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/Vibration" ReactCommon: :path: "../node_modules/react-native/ReactCommon" + ReactNativePayments: + :path: "../node_modules/react-native-payments/lib/ios" RNCAsyncStorage: :path: "../node_modules/@react-native-community/async-storage" RNCClipboard: @@ -634,6 +639,7 @@ SPEC CHECKSUMS: React-RCTText: fae545b10cfdb3d247c36c56f61a94cfd6dba41d React-RCTVibration: 4356114dbcba4ce66991096e51a66e61eda51256 ReactCommon: ed4e11d27609d571e7eee8b65548efc191116eb3 + ReactNativePayments: 40a266450628c05db440fe219b631210e4358a49 RNCAsyncStorage: 453cd7c335ec9ba3b877e27d02238956b76f3268 RNCClipboard: 8148e21ac347c51fd6cd4b683389094c216bb543 RNDeviceInfo: 88099e84466f053bae3f34c307b506738b2b6946 diff --git a/package.json b/package.json index 2808d4cb6d6..697682455de 100644 --- a/package.json +++ b/package.json @@ -141,6 +141,7 @@ "react-native-level-fs": "3.0.1", "react-native-modal": "^11.5.6", "react-native-os": "^1.2.6", + "react-native-payments": "file:react-native-payments-v1.1.5.tgz", "react-native-progress": "3.5.0", "react-native-push-notification": "git+ssh://git@github.com/MetaMask/react-native-push-notification.git#androidx", "react-native-qrcode-svg": "5.1.2", diff --git a/react-native-payments-v1.1.5.tgz b/react-native-payments-v1.1.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f55462f45f84c0dbe4d33a9945c0b7d9aab6ee46 GIT binary patch literal 21591 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 literal 0 HcmV?d00001 diff --git a/yarn.lock b/yarn.lock index 8238e4d7037..7dde8e62b90 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4306,6 +4306,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-error@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -10447,6 +10452,14 @@ react-native-os@^1.2.6: resolved "https://registry.yarnpkg.com/react-native-os/-/react-native-os-1.2.6.tgz#1bb16d78ccad1143972183a04f443cf1af9fbefa" integrity sha512-OlT+xQAcvkcnf7imgXiu+myMkqDt4xw2bP5SlVo19hEn5XHBkPMLX7dk3sSGxxncH/ToMDsf1KLyrPabNVtadA== +"react-native-payments@file:react-native-payments-v1.1.5.tgz": + version "1.1.5" + resolved "file:react-native-payments-v1.1.5.tgz#4b2e57db7e1eea1b002d9968423016c6b10e7132" + dependencies: + es6-error "^4.0.2" + uuid "3.3.2" + validator "^7.0.0" + react-native-progress@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/react-native-progress/-/react-native-progress-3.5.0.tgz#d1ccc7f96dc17c609aedb43b2e6695d67deae0ec" @@ -12778,6 +12791,11 @@ uuid@2.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + uuid@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" @@ -12820,6 +12838,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validator@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-7.2.0.tgz#a63dcbaba51d4350bf8df20988e0d5a54d711791" + integrity sha512-c8NGTUYeBEcUIGeMppmNVKHE7wwfm3mYbNZxV+c5mlv9fDHI7Ad3p07qfNrn/CvpdkK2k61fOLRO2sTEhgQXmg== + varint@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.0.tgz#d826b89f7490732fabc0c0ed693ed475dcb29ebf" From 3164ffd9f0c97badd80f0fc3039d8be691184c1b Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 12 Jun 2020 20:59:21 -0400 Subject: [PATCH 002/106] Initial apple pay screen --- .gitignore | 1 + app/components/Nav/Main/index.js | 14 ++ .../FiatOrders/PaymentMethodApplePay/index.js | 190 ++++++++++++++++++ .../FiatOrders/PaymentMethodSelector/index.js | 166 +++++++++++++++ .../UI/FiatOrders/TransakWebView/index.js | 33 +++ .../UI/FiatOrders/components/AccountBar.js | 64 ++++++ .../UI/FiatOrders/components/Heading.js | 12 ++ .../UI/FiatOrders/components/InfoIcon.js | 22 ++ .../UI/FiatOrders/components/ModalHandler.js | 17 ++ .../components/PaymentMethod/Modal.js | 108 ++++++++++ .../components/PaymentMethod/index.js | 93 +++++++++ .../UI/FiatOrders/components/ScreenView.js | 19 ++ .../UI/FiatOrders/components/SubHeader.js | 6 + .../UI/FiatOrders/components/Text.js | 97 +++++++++ .../UI/FiatOrders/components/Title.js | 36 ++++ .../UI/FiatOrders/hooks/useInterval.js | 24 +++ .../UI/FiatOrders/images/ApplePayLogo.png | Bin 0 -> 606 bytes .../UI/FiatOrders/images/ApplePayLogo@2x.png | Bin 0 -> 1201 bytes .../UI/FiatOrders/images/ApplePayLogo@3x.png | Bin 0 -> 1772 bytes .../UI/FiatOrders/images/ApplePayMark.png | Bin 0 -> 944 bytes .../UI/FiatOrders/images/ApplePayMark@2x.png | Bin 0 -> 1854 bytes .../UI/FiatOrders/images/ApplePayMark@3x.png | Bin 0 -> 2652 bytes .../UI/FiatOrders/images/TransakLogo.png | Bin 0 -> 2408 bytes .../UI/FiatOrders/images/TransakLogo@2x.png | Bin 0 -> 6111 bytes .../UI/FiatOrders/images/TransakLogo@3x.png | Bin 0 -> 10691 bytes .../UI/FiatOrders/images/WyreLogo.png | Bin 0 -> 1112 bytes .../UI/FiatOrders/images/WyreLogo@2x.png | Bin 0 -> 2542 bytes .../UI/FiatOrders/images/WyreLogo@3x.png | Bin 0 -> 4186 bytes app/components/UI/FiatOrders/index.js | 96 +++++++++ .../UI/FiatOrders/orderProcessor/index.js | 19 ++ .../UI/FiatOrders/orderProcessor/transak.js | 185 +++++++++++++++++ .../FiatOrders/orderProcessor/wyreApplePay.js | 35 ++++ app/components/UI/Navbar/index.js | 68 +++++++ app/components/UI/ReceiveRequest/index.js | 16 +- app/reducers/fiatOrders/index.js | 88 ++++++++ app/reducers/index.js | 4 +- babel.config.js | 8 +- package.json | 3 + yarn.lock | 44 +++- 39 files changed, 1454 insertions(+), 14 deletions(-) create mode 100644 app/components/UI/FiatOrders/PaymentMethodApplePay/index.js create mode 100644 app/components/UI/FiatOrders/PaymentMethodSelector/index.js create mode 100644 app/components/UI/FiatOrders/TransakWebView/index.js create mode 100644 app/components/UI/FiatOrders/components/AccountBar.js create mode 100644 app/components/UI/FiatOrders/components/Heading.js create mode 100644 app/components/UI/FiatOrders/components/InfoIcon.js create mode 100644 app/components/UI/FiatOrders/components/ModalHandler.js create mode 100644 app/components/UI/FiatOrders/components/PaymentMethod/Modal.js create mode 100644 app/components/UI/FiatOrders/components/PaymentMethod/index.js create mode 100644 app/components/UI/FiatOrders/components/ScreenView.js create mode 100644 app/components/UI/FiatOrders/components/SubHeader.js create mode 100644 app/components/UI/FiatOrders/components/Text.js create mode 100644 app/components/UI/FiatOrders/components/Title.js create mode 100644 app/components/UI/FiatOrders/hooks/useInterval.js create mode 100644 app/components/UI/FiatOrders/images/ApplePayLogo.png create mode 100644 app/components/UI/FiatOrders/images/ApplePayLogo@2x.png create mode 100644 app/components/UI/FiatOrders/images/ApplePayLogo@3x.png create mode 100644 app/components/UI/FiatOrders/images/ApplePayMark.png create mode 100644 app/components/UI/FiatOrders/images/ApplePayMark@2x.png create mode 100644 app/components/UI/FiatOrders/images/ApplePayMark@3x.png create mode 100644 app/components/UI/FiatOrders/images/TransakLogo.png create mode 100644 app/components/UI/FiatOrders/images/TransakLogo@2x.png create mode 100644 app/components/UI/FiatOrders/images/TransakLogo@3x.png create mode 100644 app/components/UI/FiatOrders/images/WyreLogo.png create mode 100644 app/components/UI/FiatOrders/images/WyreLogo@2x.png create mode 100644 app/components/UI/FiatOrders/images/WyreLogo@3x.png create mode 100644 app/components/UI/FiatOrders/index.js create mode 100644 app/components/UI/FiatOrders/orderProcessor/index.js create mode 100644 app/components/UI/FiatOrders/orderProcessor/transak.js create mode 100644 app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js create mode 100644 app/reducers/fiatOrders/index.js diff --git a/.gitignore b/.gitignore index e07070a027f..fcb6dcf11e7 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,7 @@ coverage /app/core/InpageBridgeWeb3.js # environment variables +.env .js.env .ios.env .android.env diff --git a/app/components/Nav/Main/index.js b/app/components/Nav/Main/index.js index c87622c963f..aaec93b147c 100644 --- a/app/components/Nav/Main/index.js +++ b/app/components/Nav/Main/index.js @@ -98,6 +98,10 @@ import ContactForm from '../../Views/Settings/Contacts/ContactForm'; import TransactionTypes from '../../../core/TransactionTypes'; import BackupAlert from '../../UI/BackupAlert'; import Notification from '../../UI/Notification'; +import FiatOrders from '../../UI/FiatOrders'; +import PaymentMethodSelector from '../../UI/FiatOrders/PaymentMethodSelector'; +import PaymentMethodApplePay from '../../UI/FiatOrders/PaymentMethodApplePay'; +import TransakWebView from '../../UI/FiatOrders/TransakWebView'; import { showTransactionNotification, hideTransactionNotification, @@ -329,6 +333,15 @@ const MainNavigator = createStackNavigator( } ) }, + + FiatOnRamp: { + screen: createStackNavigator({ + PaymentMethodSelector: { screen: PaymentMethodSelector }, + PaymentMethodApplePay: { screen: PaymentMethodApplePay }, + TransakFlow: { screen: TransakWebView } + }) + }, + SetPasswordFlow: { screen: createStackNavigator( { @@ -1142,6 +1155,7 @@ class Main extends PureComponent { + {this.renderSigningModal()} {this.renderWalletConnectSessionRequestModal()} diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js new file mode 100644 index 00000000000..b25ea3c5f51 --- /dev/null +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -0,0 +1,190 @@ +import React, { useContext, useState } from 'react'; +import PropTypes from 'prop-types'; +import { View, StyleSheet, Image, TouchableOpacity } from 'react-native'; +import IonicIcon from 'react-native-vector-icons/Ionicons'; +import { getPaymentMethodApplePayNavbar } from '../../Navbar'; +import AccountBar from '../components/AccountBar'; +import Text from '../components/Text'; +import StyledButton from '../../StyledButton'; +import { colors, fontStyles } from '../../../../styles/common'; +import { NavigationContext } from 'react-navigation'; +import { useWyreTerms } from '../orderProcessor/wyreApplePay'; + +const styles = StyleSheet.create({ + screen: { flex: 1 }, + amountContainer: { + margin: 10, + padding: 15, + alignItems: 'center', + justifyContent: 'center' + }, + amount: { + fontFamily: 'Roboto-Light', + fontWeight: fontStyles.light.fontWeight, + color: colors.black, + fontSize: 44 + }, + content: { + flexGrow: 1, + justifyContent: 'space-around' + }, + quickAmounts: { + flexDirection: 'row' + }, + keypad: { + paddingHorizontal: 25 + }, + keypadRow: { + flexDirection: 'row', + justifyContent: 'space-around' + }, + keypadButton: { + paddingHorizontal: 20, + paddingVertical: 15, + flex: 1, + justifyContent: 'center', + alignItems: 'center' + }, + keypadButtonText: { + fontFamily: 'Roboto', + color: colors.black, + textAlign: 'center', + fontSize: 30 + }, + deleteIcon: { + fontSize: 25, + marginTop: 5 + }, + buttonContainer: { + paddingBottom: 20 + }, + applePayButton: { + backgroundColor: colors.black, + padding: 10, + margin: 10, + marginHorizontal: 25, + alignItems: 'center' + }, + applePayButtonText: { + color: colors.white + }, + applePayButtonTextDisabled: { + opacity: 0.6 + }, + applePayLogo: { + marginLeft: 4 + }, + applePayLogoDisabled: { + opacity: 0.6 + } +}); + +/* eslint-disable import/no-commonjs */ +const ApplePayLogo = require('../images/ApplePayLogo.png'); +const ApplePay = ({ disabled }) => ( + +); + +ApplePay.propTypes = { + disabled: PropTypes.bool +}; + +const Keypad = props => ; +Keypad.Row = function Row(props) { + return ; +}; +Keypad.Button = function KeypadButton({ children }) { + return ( + + {children} + + ); +}; + +Keypad.Button.propTypes = { + children: PropTypes.node +}; + +Keypad.DeleteButton = function DeleteButton(props) { + return ( + + + + ); +}; + +function PaymentMethodApplePay(props) { + const navigation = useContext(NavigationContext); + const [amount, setAmount] = useState('0'); + const handleWyreTerms = useWyreTerms(navigation); + + const disabledButton = true; + return ( + + + + + + ${amount} + + = 0 ETH + + + + + a + a + a + + + + 1 + 2 + 3 + + + 4 + 5 + 6 + + + 7 + 8 + 9 + + + . + 0 + + + + + + + + Buy with + + + + + Fee ~2.9% + $0.30 (0.35% goes to MetaMask) + + + + Wyre terms of service + + + + + + ); +} + +PaymentMethodApplePay.navigationOptions = ({ navigation }) => + getPaymentMethodApplePayNavbar('Amount to buy', navigation); + +export default PaymentMethodApplePay; diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.js new file mode 100644 index 00000000000..9be2ca6da2f --- /dev/null +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.js @@ -0,0 +1,166 @@ +import React, { useContext, useCallback } from 'react'; +import PropTypes from 'prop-types'; +import { TouchableOpacity, Image, StyleSheet } from 'react-native'; +import { NavigationContext } from 'react-navigation'; +import { connect } from 'react-redux'; + +import { useTransakFlowURL } from '../orderProcessor/transak'; +import { useWyreTerms } from '../orderProcessor/wyreApplePay'; +import { getPaymentSelectorMethodNavbar } from '../../Navbar'; + +import Title from '../components/Title'; +import Text from '../components/Text'; +import Heading from '../components/Heading'; +import SubHeader from '../components/SubHeader'; +import PaymentMethod from '../components/PaymentMethod'; +import ScreenView from '../components/ScreenView'; +import ModalHandler from '../components/ModalHandler'; + +const logosStyle = StyleSheet.create({ + applePay: { + marginVertical: 3 + }, + transak: { + marginVertical: 5 + } +}); + +/* eslint-disable import/no-commonjs */ +const ApplePayMarkIcon = require('../images/ApplePayMark.png'); +const TransakLogoIcon = require('../images/TransakLogo.png'); +const WyreLogoIcon = require('../images/WyreLogo.png'); +/* eslint-enable import/no-commonjs */ + +const ApplePayMark = () => ; +const TransakLogo = () => ; +const WyreLogo = () => ; + +function PaymentMethodSelectorView({ selectedAddress, ...props }) { + const navigation = useContext(NavigationContext); + const transakURL = useTransakFlowURL(selectedAddress); + + const handleWyreTerms = useWyreTerms(navigation); + + const onPressApplePay = useCallback(() => navigation.navigate('PaymentMethodApplePay'), [navigation]); + const onPressTransak = useCallback(() => { + navigation.navigate('TransakFlow', { + url: transakURL, + title: 'Transak' + }); + }, [navigation, transakURL]); + + return ( + + + + <Text reset>0% fee when you use</Text> + {'\n'} + <Text reset>Apple Pay.</Text> + + Valid until July 1st, 2020 + + + + Best deal + + + Apple Pay via + + 0% fee (limited time) + 1 - 2 minutes + Max $450 weekly + Requires debit card + + + + + {({ isVisible, toggleModal }) => ( + <> + + + + 🇺🇸 U.S. only + + + + + + Some states excluded + + + + + + Paying with Apple Pay, powered by Wyre is supported in the United Sates 🇺🇸 + except for CT, HI, NC, NH, NY, VA and VT.{' '} + { + toggleModal(); + handleWyreTerms(); + }} + > + Wyre terms of service apply. + + + + + )} + + + + + + + Bank transfer or debit card + Options and fees vary based on location + + + + + {({ isVisible, toggleModal }) => ( + <> + + + + 32+ countries + + + + + + + Exact payment methods and fees vary depending on location. Supported countries + are: Austria 🇦🇹, Belgium 🇧🇪, Cyprus 🇨🇾, Czechia 🇨🇿, Estonia 🇪🇪, Finland 🇫🇮, + France 🇫🇷, Germany 🇩🇪, Greece 🇬🇷, Ireland 🇮🇪, Italy 🇮🇹, Latvia 🇱🇻, Luxembourg + 🇱🇺, Malta 🇲🇹, Netherlands 🇳🇱, Portugal 🇵🇹, Romania 🇷🇴, Slovakia 🇸🇰, Slovenia 🇸🇮, + Spain 🇪🇸, United Kingdom 🇬🇧 + + + + )} + + + + + ); +} + +PaymentMethodSelectorView.propTypes = { + selectedAddress: PropTypes.string.isRequired +}; + +PaymentMethodSelectorView.navigationOptions = ({ navigation }) => + getPaymentSelectorMethodNavbar('Purchase Method', navigation); + +const mapStateToProps = state => ({ + selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress +}); + +export default connect(mapStateToProps)(PaymentMethodSelectorView); diff --git a/app/components/UI/FiatOrders/TransakWebView/index.js b/app/components/UI/FiatOrders/TransakWebView/index.js new file mode 100644 index 00000000000..650ea7b4a39 --- /dev/null +++ b/app/components/UI/FiatOrders/TransakWebView/index.js @@ -0,0 +1,33 @@ +import React, { PureComponent } from 'react'; +import PropTypes from 'prop-types'; +import { View } from 'react-native'; +import { WebView } from 'react-native-webview'; +import { getTransakWebviewNavbar } from '../../../UI/Navbar'; +import { baseStyles } from '../../../../styles/common'; +import { handleTransakRedirect, TRANSAK_REDIRECT_URL } from '../orderProcessor/transak'; + +export default class TransakWebView extends PureComponent { + static navigationOptions = ({ navigation }) => getTransakWebviewNavbar(navigation); + + static propTypes = { + navigation: PropTypes.object + }; + + handleNavigationStateChange = async navState => { + if (navState.url.indexOf(TRANSAK_REDIRECT_URL) > -1) { + handleTransakRedirect(navState.url); + this.props.navigation.dismiss(); + } + }; + + render() { + const uri = this.props.navigation.getParam('url', null); + if (uri) { + return ( + + + + ); + } + } +} diff --git a/app/components/UI/FiatOrders/components/AccountBar.js b/app/components/UI/FiatOrders/components/AccountBar.js new file mode 100644 index 00000000000..5193a8c724a --- /dev/null +++ b/app/components/UI/FiatOrders/components/AccountBar.js @@ -0,0 +1,64 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { View, TouchableOpacity, StyleSheet, Text } from 'react-native'; +import { connect } from 'react-redux'; + +import { colors, fontStyles } from '../../../../styles/common'; +import { toggleAccountsModal } from '../../../../actions/modals'; +import EthereumAddress from '../../EthereumAddress'; +import Identicon from '../../Identicon'; + +const styles = StyleSheet.create({ + container: { + backgroundColor: colors.grey000, + padding: 15, + alignItems: 'center' + }, + addressContainer: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center' + }, + depositingText: { + ...fontStyles.thin, + fontSize: 12, + textAlign: 'center' + }, + accountText: { + ...fontStyles.bold, + textAlign: 'center', + margin: 3 + } +}); +const AccountBar = ({ toggleAccountsModal, selectedAddress, identities }) => ( + + <> + Depositing to: + + + + {identities[selectedAddress].name} () + + + + +); + +AccountBar.propTypes = { + toggleAccountsModal: PropTypes.func.isRequired, + selectedAddress: PropTypes.string.isRequired, + identities: PropTypes.object.isRequired +}; + +const mapStateToProps = state => ({ + selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, + identities: state.engine.backgroundState.PreferencesController.identities +}); + +const mapDispatchToProps = dispatch => ({ + toggleAccountsModal: () => dispatch(toggleAccountsModal()) +}); +export default connect( + mapStateToProps, + mapDispatchToProps +)(AccountBar); diff --git a/app/components/UI/FiatOrders/components/Heading.js b/app/components/UI/FiatOrders/components/Heading.js new file mode 100644 index 00000000000..13a1a8dafb4 --- /dev/null +++ b/app/components/UI/FiatOrders/components/Heading.js @@ -0,0 +1,12 @@ +import React from 'react'; +import { View, StyleSheet } from 'react-native'; + +const style = StyleSheet.create({ + view: { + margin: 30 + } +}); + +const Heading = ({ ...props }) => ; + +export default Heading; diff --git a/app/components/UI/FiatOrders/components/InfoIcon.js b/app/components/UI/FiatOrders/components/InfoIcon.js new file mode 100644 index 00000000000..12f34980575 --- /dev/null +++ b/app/components/UI/FiatOrders/components/InfoIcon.js @@ -0,0 +1,22 @@ +import React from 'react'; +import { StyleSheet } from 'react-native'; +import IonicIcon from 'react-native-vector-icons/Ionicons'; +import Device from '../../../../util/Device'; +import { colors } from '../../../../styles/common'; + +const styles = StyleSheet.create({ + icon: { + color: colors.grey200 + } +}); + +const InfoIcon = props => ( + +); + +export default InfoIcon; diff --git a/app/components/UI/FiatOrders/components/ModalHandler.js b/app/components/UI/FiatOrders/components/ModalHandler.js new file mode 100644 index 00000000000..417697a090c --- /dev/null +++ b/app/components/UI/FiatOrders/components/ModalHandler.js @@ -0,0 +1,17 @@ +import { useState } from 'react'; + +function ModalHandler({ children }) { + const [isVisible, setVisible] = useState(false); + + const showModal = () => setVisible(true); + const hideModal = () => setVisible(true); + const toggleModal = () => setVisible(!isVisible); + + if (typeof children === 'function') { + return children({ isVisible, toggleModal, showModal, hideModal }); + } + + return children; +} + +export default ModalHandler; diff --git a/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js b/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js new file mode 100644 index 00000000000..d8b0e3d92b2 --- /dev/null +++ b/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js @@ -0,0 +1,108 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { StyleSheet, View, TouchableOpacity } from 'react-native'; +import Modal from 'react-native-modal'; +import IonicIcon from 'react-native-vector-icons/Ionicons'; +import Title from '../Title'; + +import { colors } from '../../../../../styles/common'; +import StyledButton from '../../../StyledButton'; + +const styles = StyleSheet.create({ + modalView: { + backgroundColor: colors.white, + justifyContent: 'center', + alignItems: 'center', + borderRadius: 10, + shadowColor: colors.black, + shadowOffset: { + width: 0, + height: 5 + }, + shadowOpacity: 0.36, + shadowRadius: 6.68, + elevation: 11 + }, + + modal: { + margin: 0, + width: '100%', + padding: 25 + }, + title: { + width: '100%', + paddingVertical: 15, + paddingHorizontal: 20, + paddingBottom: 5, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between' + }, + closeIcon: { + color: colors.black + }, + body: { + borderColor: colors.red, + borderWidth: 0, + width: '100%', + + paddingVertical: 5, + paddingHorizontal: 20 + }, + action: { + width: '100%', + alignItems: 'center', + marginTop: 15, + paddingVertical: 15, + paddingHorizontal: 20, + borderTopWidth: 1, + borderTopColor: colors.grey100 + }, + button: { + width: '50%' + } +}); + +const CloseIcon = props => ; + +const PaymentMethodModal = ({ isVisible, title, dismiss, children }) => ( + + + + {title} + + + + + {children} + + + Close + + + + +); + +PaymentMethodModal.propTypes = { + isVisible: PropTypes.bool, + title: PropTypes.string.isRequired, + dismiss: PropTypes.func, + children: PropTypes.node +}; + +PaymentMethodModal.defaultProps = { + isVisible: false, + dismiss: undefined, + children: undefined +}; + +export default PaymentMethodModal; diff --git a/app/components/UI/FiatOrders/components/PaymentMethod/index.js b/app/components/UI/FiatOrders/components/PaymentMethod/index.js new file mode 100644 index 00000000000..9eb07455b83 --- /dev/null +++ b/app/components/UI/FiatOrders/components/PaymentMethod/index.js @@ -0,0 +1,93 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { TouchableOpacity, View, StyleSheet } from 'react-native'; +import { colors, fontStyles } from '../../../../../styles/common'; + +import Text from '../Text'; +import InfoIcon from '../InfoIcon'; +import Modal from './Modal'; + +const style = StyleSheet.create({ + container: { + borderWidth: 1, + borderRadius: 8, + borderColor: colors.blue, + paddingVertical: 15, + paddingHorizontal: 20, + marginHorizontal: 25, + marginVertical: 12, + flexDirection: 'row' + }, + badgeWrapper: { + position: 'absolute', + alignItems: 'center', + top: -14, + left: 0, + right: 0 + }, + badge: { + fontSize: 12, + paddingVertical: 4, + paddingHorizontal: 8, + backgroundColor: colors.blue, + color: colors.white, + margin: 0, + borderRadius: 12, + overflow: 'hidden', + ...fontStyles.bold + }, + details: { + flex: 4 + }, + terms: { + flex: 3, + alignItems: 'flex-end', + justifyContent: 'space-between' + }, + infoIconLine: { + alignItems: 'center', + flexDirection: 'row', + justifyContent: 'flex-end' + }, + infoIcon: { + marginLeft: 2 + } +}); + +const PaymentMethod = ({ onPress, ...props }) => ( + +); + +PaymentMethod.propTypes = { + onPress: PropTypes.func, + children: PropTypes.node +}; + +PaymentMethod.defaultProps = { + onPress: undefined, + children: undefined +}; + +const Badge = props => ( + + + +); + +const Details = props => ; +const Terms = props => ; +const InfoIconLine = props => ; + +const PaymentMethodInfoIcon = props => ( + + + +); + +PaymentMethod.Badge = Badge; +PaymentMethod.Details = Details; +PaymentMethod.Terms = Terms; +PaymentMethod.InfoIconLine = InfoIconLine; +PaymentMethod.InfoIcon = PaymentMethodInfoIcon; +PaymentMethod.Modal = Modal; +export default PaymentMethod; diff --git a/app/components/UI/FiatOrders/components/ScreenView.js b/app/components/UI/FiatOrders/components/ScreenView.js new file mode 100644 index 00000000000..72adb4d8ca5 --- /dev/null +++ b/app/components/UI/FiatOrders/components/ScreenView.js @@ -0,0 +1,19 @@ +import React from 'react'; +import { SafeAreaView, StyleSheet } from 'react-native'; +import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; +import { colors } from '../../../../styles/common'; + +const styles = StyleSheet.create({ + wrapper: { + backgroundColor: colors.white, + flex: 1 + } +}); + +const ScreenView = props => ( + + + +); + +export default ScreenView; diff --git a/app/components/UI/FiatOrders/components/SubHeader.js b/app/components/UI/FiatOrders/components/SubHeader.js new file mode 100644 index 00000000000..e39e3824210 --- /dev/null +++ b/app/components/UI/FiatOrders/components/SubHeader.js @@ -0,0 +1,6 @@ +import React from 'react'; +import Text from './Text'; + +const SubHeader = props => ; + +export default SubHeader; diff --git a/app/components/UI/FiatOrders/components/Text.js b/app/components/UI/FiatOrders/components/Text.js new file mode 100644 index 00000000000..f2f3706f250 --- /dev/null +++ b/app/components/UI/FiatOrders/components/Text.js @@ -0,0 +1,97 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Text as RNText, StyleSheet } from 'react-native'; +import { fontStyles, colors } from '../../../../styles/common'; + +const style = StyleSheet.create({ + text: { + ...fontStyles.normal, + color: colors.grey500, + marginBottom: 2, + marginTop: 2, + fontSize: 14 + }, + centered: { + textAlign: 'center' + }, + right: { + textAlign: 'right' + }, + bold: fontStyles.bold, + subHeader: { + margin: 5 + }, + small: { + fontSize: 12 + }, + disclaimer: { + fontStyle: 'italic', + letterSpacing: 0.15 + }, + modal: { + color: colors.fontPrimary, + fontSize: 16, + lineHeight: 30 + }, + link: { + color: colors.blue + } +}); + +const Text = ({ + reset, + centered, + right, + subHeader, + bold, + small, + modal, + disclaimer, + link, + style: externalStyle, + ...props +}) => ( + +); + +Text.defaultProps = { + reset: false, + centered: false, + right: false, + subHeader: false, + bold: false, + disclaimer: false, + modal: false, + small: false, + link: false, + style: undefined +}; + +Text.propTypes = { + reset: PropTypes.bool, + centered: PropTypes.bool, + right: PropTypes.bool, + subHeader: PropTypes.bool, + bold: PropTypes.bool, + disclaimer: PropTypes.bool, + modal: PropTypes.bool, + small: PropTypes.bool, + link: PropTypes.bool, + style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]) +}; + +export default Text; diff --git a/app/components/UI/FiatOrders/components/Title.js b/app/components/UI/FiatOrders/components/Title.js new file mode 100644 index 00000000000..f613847cd6a --- /dev/null +++ b/app/components/UI/FiatOrders/components/Title.js @@ -0,0 +1,36 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Text, StyleSheet } from 'react-native'; +import { fontStyles } from '../../../../styles/common'; + +const style = StyleSheet.create({ + text: { + fontSize: 18, + marginTop: 3, + marginBottom: 3, + ...fontStyles.bold + }, + centered: { + textAlign: 'center' + }, + hero: { + fontSize: 22, + margin: 5 + } +}); + +const Title = ({ centered, hero, ...props }) => ( + +); + +Title.defaultProps = { + centered: false, + hero: false +}; + +Title.propTypes = { + centered: PropTypes.bool, + hero: PropTypes.bool +}; + +export default Title; diff --git a/app/components/UI/FiatOrders/hooks/useInterval.js b/app/components/UI/FiatOrders/hooks/useInterval.js new file mode 100644 index 00000000000..1f7c2cb475b --- /dev/null +++ b/app/components/UI/FiatOrders/hooks/useInterval.js @@ -0,0 +1,24 @@ +import { useRef, useEffect } from 'react'; + +function useInterval(callback, delay) { + const savedCallback = useRef(); + + // Remember the latest function. + useEffect(() => { + savedCallback.current = callback; + }, [callback]); + + // Set up the interval. + useEffect(() => { + function tick() { + savedCallback.current(); + } + if (delay !== null) { + const id = setInterval(tick, delay); + + return () => clearInterval(id); + } + }, [delay]); +} + +export default useInterval; diff --git a/app/components/UI/FiatOrders/images/ApplePayLogo.png b/app/components/UI/FiatOrders/images/ApplePayLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb4621b6398f6760e7c79605e3dbb8ecbe853e6 GIT binary patch literal 606 zcmV-k0-^nhP)jK~#7F%~tJE z!axwcI2HgE7%C7eFxY@tL81*P6_5&q3J6vJ6$l-~3J4Vl6|nA-cVs=u$Bg;Gn|Y(R zx7mBQx4VNeB_JZ7xnf4<5&?l3GIrwF7dS`^(-xekt-`WSB=)A*lV{fnSTIw2 zY500b#LP*8QArwJu}u#0Ywof&`7<`b9)CS%kD017WKT*$4!7~d9>H$Zw;^~`yrX(d zwTg=8?x^Puna}Wh$G)(KGrzHZg3nCF@!+$OwKPtXPTZH+?;W9!$V|o!_W@gSN{{D> zfGy(Pz`VwK$b1pu_+NA_tm=&FvC_(@d;}eR31bVHk|tc>oQ#T>JE*Kpk^KPcIqBwu zp$W!kM9vXd*r&h6AHy$$kXOn}V5dY12k@Ifr1)=iRsw1c-w_#`65y~D8Sx$aNu;u6 zl-KD1-<%rtitA*Jx~RjvX0TVmN5&-6(nM|_NFhoMcd;*6{`RP!l^Hb{=1xrE$ceF| zVpbj;->&lgEDI_^ZQXRRj_lg;mHLx<3rq!Ycpq^S%EywuWbF9r@(9hPfr|Ml*ig$q sQ2qs#>4b{W6q`!|MBbrZQ{B-TKU@FTYorzgX8-^I07*qoM6N<$f`t4JtpET3 literal 0 HcmV?d00001 diff --git a/app/components/UI/FiatOrders/images/ApplePayLogo@2x.png b/app/components/UI/FiatOrders/images/ApplePayLogo@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2d93bbea3b2e5c2c60692b1f35faa0cd7b91a9c7 GIT binary patch literal 1201 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 SLTU#90000O|^6Y literal 0 HcmV?d00001 diff --git a/app/components/UI/FiatOrders/images/ApplePayMark@2x.png b/app/components/UI/FiatOrders/images/ApplePayMark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0aa16c13dceb638851245f0d66bb3e517b0828 GIT binary patch literal 1854 zcmaKt`#%$k8^^ab!pyC;9ggB)C$%A>r5kpPjanGTt!XTzSi{1;aydnD8c89Sl;mEM z&T%Wt+{cc~*<7OBCR>VyLT0|5oqyo`@Oj?P=XpIpJU=|I=Sg=XIz!d;)Bpeglz?~i zP>`;WlZvt;!aB6J6i}t(eWL*YIPzZs2_7cPiXt%D!x;-;59lu_3^>%`v;zQ8cN-!P zR005$g#`zbzZlzh+|H3}-Z4D<-t@NXKH{0yK1 z;|c(}CyIFzrz7c9KB4H$pe<-$9o4y3Ix><|1oJe*kw+Q%!)2ak#RDXEE|n~;e%pFq zI8Vy^-GWRGsPSa8hr%*N{S@}usap8k%>)~^q74fOng z7HKGhVf{f=Ex(>zDpoqPK{ACsNk)Rv%KlTbs17bSd0ZX*_5BYPlz|nHSpPpzl&SJ< zZLKUOHg-fVZ&`gZcX=d)NF)x+WdAdKyzfNB?kptG)zx*DYH22biBS)Wi-VT$H%^YDcj^BR=xBy? z1&`A{DQ1geFg!Qqa`lbo=4MqF{cyy@ViSkMIVWX=hE@n5c*Mt3_9-RT7!XYqD`L-| zDLEMz7O5Mlu=PvB-t`9z>E=xJF(CvGe9+|f4sPDJS8w_L>)QhL^^(?!>FL-}j9_pz zQT+1TVEw2+x9buNE@+>bp*+9LS;NM(>V=ZE#|%HI<`s`Vt9W7m)X9%Lajgt@rxWA= z89KO{v8o@_Mt#$>Ete0+Wn)W*z7`yD!VDBpvxi>^O|AP@v$2=P63U_orK9~=ab2Bd znNs*S-RIWbwS|R+v(f0!cd35l+K(SUy4cJ~rEKv^XJ?9wYY^l~*M8^Rv2fp36vVn` z9R8#_!9-GG7b3sVn%Q+BPyh8sPmgo|r|s=+XzjdA_A(^tfy+~qHeapMo1g*kz1_QT zI>0ckb>=B!?HnywM0#LKxc&JPXRA;;wfs*P-#eAQ+joblQ`GEs^s09g9eKFPDP0xM z*i$JK3YVGhX2-|JEn@j!SeW3W17NIpP2rbqrp99K=xpkZIaFJiRe>4#SuwWU@@x4E zhLPr$y*rFq4Y`lrO;2N3hD()Ri8P}S=F+;&cvH`?<*olA3=*_LE0_%KHb?)TDY3q z*w{E@D^z*HXSJsVf*sL%aJacPCRAAzld7Zvh3@xW2Ks9s)bNCDQ#hRfqo2^bi_4GM ztE2yJxjCt+R|5veZrYMmc}0b&=am^5(6Z?Jb?ZG5xaPw&NJU^|M24Sj`qIL}LV5e& zDvOKh(8oiq1&`7PjV4W}a7H@}5GH$_v|>=s9V(=c^Nx2jca%P-d1)N7H+fsCvtm`@ zce&EACoZamx9pIKyCN#hhKF{jpt)--OhRv4+i!h3)Sr}%etqn2h4ML_9gnQqNkY8L z{H5kl0*X?_me`Xj1d9U`N^CMKr7s~dQNw^#RZ~*~-MGE$;5ZeV*|s#%^K$R!a=2T= zaYPeqNEBo=X!^XkNxL?J40ewCMnS(r5_3H}p~pqZD83Flb@nz8LOrEx6Z76rg&{I} z1)Iu~a?=Kxp&=oja1)In6ZbYjoYttdz`xlSaRt=05I_7jTVfuXin`)bBrP z#cndXtIN#lo%q$2!?eHd3UrX1q+$-_f1~|O;dIxvw49B^h13Y>y6Zv6vuf9a#hY|O z_}gY&H-jw!7COAIy1DC0sHB<39wVk|csR3FRpi7+ zqzObfmVD8;tg&{R!i~n-S0m9vJi+A$JbK9IY)Mbe#o*x7{@*u+xv88akb86r`%{B4 zB>p>$wQ=XX{o0S<3#>(#hiO(}dnMEi_n z=u2~(IzGoa*K_g1i+^CgU^b02O!{xj%+OD+CPH?e}w=5 literal 0 HcmV?d00001 diff --git a/app/components/UI/FiatOrders/images/ApplePayMark@3x.png b/app/components/UI/FiatOrders/images/ApplePayMark@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b3618ba58d8135628296cd3a2e1b7e18606efb79 GIT binary patch literal 2652 zcmb7G`8N~{7an6DiEPswlYK0SWE~nAjG0lECS}Q*A|w0Q${sPc`ZOel#+GHsZY;f% zZA|IqWnN1)h6ocGMb<)}_aFGq`F?orJ@?-8oO92)=Q+Ld6I2^__jzwcBYCE*aXOE>_aX#6jDkome^M@^n^EXo4#azt+VsNnNM*dhRcrbi|b&M6lF`9>4%yN;%h^H2@2|bZO0W~iL9&zE_ zjdptl2>>avEl!}V-M+A$j9^U$8nX-?Qt*Cd ztl`ylG_~c!EaDj6bTn{iFu##Y0q`1+b6po_UD_w^f>#oP-J5(5;7qOqtgfMfG8f_u zKQ6$FL_0yBU?yk@zh4Fg1ywv<{bJZ|bZor-9tSshlT=btVkb;^dw3XMX%I1$>v4v` zmVd8vGTZu}uV24vC~725l3}QdD)FVl+wfr9n#j+yv^a{JiDFG6C1Llw_u|j9hKCN+ zCJu=jJc}i%z(z@tJ8MgDX9s+i^%C;qw5CN^Q&W?76e-6WA-MFK%MC=L?MRo$CLu}8 zwkOja))K&CN-j_}Rd?6&1ooViy2dFGQA(8GCgUMc6=|82TUKh08FL_4+);PH>i>^% zzAJeIWWFKWj0Zv&s^(zU>?-jYFq34Fx9@kDZ$la+iWxk=2GxHFR$w(wKMzDiLS zm2~jf?9vUozih>9$_t%V4Pjo+C@g-Nuhs|E&@=t;i6{?(Xxyv#O;_}rNNI4=ywV0& z@=|Tu97z9JCW+Q z9=37C-~Gd4KL_CPV?W4^e6X2Mpst@=}DJF>-_90 z#&i-#vPHG3_y*Ev6Zdrnf-aW*!}h%u}-`Cg*9!`s2gDv|l(vM(@Oo%7rV1yV$#B6*zK#4F}Z` zrn-NDL}a^u(_$%`2hnE>&v@vKsjATO&<1!}Te9s<677wyBCp!%{1$BjcMunMOyN_w zrQmrlu3OUle#)`a=r#DQb|+7*iLy@QX2g}AgNYb`Uax9J3lA0Y018&NQm2>g7DoW- z{0fjXJZJ);{ z5ZEQf@e}oR!f)DtDs^S{Ha5c6y0R+`uXkN?do-T6u(a+@o9V#+N68Hx7+aQ2_W_Y? zE*#D<@ZH*?K5W}<9zAm5$mE8BT(JDfZ%=)5_eNmx4_0DIEQBzOdG-Px6kAhL&~vlQ zDKlD6m??@a;$IR?}m?K&zx&>&Y%5{$1-dv7^J)O1?+OFG_`0jqL zgIp*_X@`0G^S$Yac|i0SGN2lEnTMK(X?NN_YZ2k`S0O-)#h#qTJ$Os#DmbC+*_7o* z!Iq0i2@V*QLk&Cqj4 zTIx&`R*i8Pt9z}8%QQEPK3@MW_msa~jg;>~3F~p|zS7G99Zy>8={aGZC;B#cu3^EV zqaTm$M^tS|+U(K|<#8gi*eTX&t&;Wj>x22BRMmP(jS@?}sEwZT57&22*DY#Pu7p7v z<4b+E4UHoMXE;7%63@JPhGX9j!>qgCU!7u>d5@a8>4^Qzt~ z^)J5S7ZS`%0w6qpk2vnlE}R+Rta()ezg_`+35i)^TF0gJ@(@^|$W_&+{b zc}8Qc)%#c%&bieOGz&@PhOF3TU%7DXTJutl{5t?G z{=oHYg_4T2_zQQ$y}=g*1jkoWC;D(dW?b`4%6oHCHI9@1!<@SJFe%7ssIz|N@bGZ+ zNUJ}r(X*enGb~d7%zOsTbFYu6W)WJrBcPt!&iv>h#yA_b2l<;D6++E!+8l78hUd*K zHQc?s(ypWLD3egzeHq`M9X1+z-srylRmq|{6Tz;7de-ahL6ddS@%qBw&kp`HyYHqN p9XjZJ{=OWAb>YH_c?Rw9Vi{YVrqdZ}bo2}YFi1PAmlj^h{{=g>2rU2r literal 0 HcmV?d00001 diff --git a/app/components/UI/FiatOrders/images/TransakLogo.png b/app/components/UI/FiatOrders/images/TransakLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..84242afac8bf421e1be8e8fc2179708ae4e6330e GIT binary patch literal 2408 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 arT+oQbplq^uaaf}0000#pNh)z!cH)wh0C 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 literal 0 HcmV?d00001 diff --git a/app/components/UI/FiatOrders/images/TransakLogo@3x.png b/app/components/UI/FiatOrders/images/TransakLogo@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..117606fd4a6482bf79cebbc64c404acd6f02966d GIT binary patch literal 10691 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 literal 0 HcmV?d00001 diff --git a/app/components/UI/FiatOrders/images/WyreLogo.png b/app/components/UI/FiatOrders/images/WyreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..959537a4b7fb836bcbbed9acdf5d674fd29461ca GIT binary patch literal 1112 zcmV-e1gHCnP)Ss zA#*x(3`geX+#oDYvk<8TS~_`DP*Ai~Z7Z}w@A2G&RIcR@H5z_5H|Kla^Sj@79vp6h z5Mrc5gtpg-Wm|a|&(EB2Av}oc6&!?T8err&PA&)%v7I2V6e6MmR2lqq5fwp1_GC8? zO}EEwAq1;Zrk|()5!s#f?xbY=1*|D(L|Xm{XwKP1zBL6O+&jQuc+FOMd{fXyflQJWxJt%zX;oQRUkF?^IidJK0NCC-(hA+{luP2ApcYj9x_)l%Z0Q&opGFK0T8^Dk?$KzyG1N z-GI9KKk#ScF{CCxgYeK0G`F-u)24^h$>XyfWr&GZAn4&aIB@89R94sENJA4sf`cHF z`QpXww_q}vvAJ*^TD0v@t>5IDZ^ndB`4@+=G4T@i7`4FDZh|c-9>p1R+*YkjCd2jX zqu5KUNq8Re@CCSX)q?N$*Wz(y0@6|z2^$xI0sgE)A}Ik! zf2pQ%z=q8wFqy9)oqnh4$Dd)bUBgq#cxak_6<0Rcm*9&$9xulYV76HcA9D-*FErv> zv>e0n(dcW^W7lpyj<=a^k@fRoWVdcF!<%npK_L%Ex3Leu9cjecw{u-_&(R8Zb{X;I zSKlIk^$J9Ug`!Po08e-%#x9)bAA%7j?@qYZfM(KzH}y~MgS8KSVy!F*i66Qko;^g#~Ih`8WxBc!$krQS0m&3WE6d}9g#_?*z$QPri5@QG@KhFS@q-ZtaW|FbL|=8 zn|YiBCDssCYDh>DbB)YOUl1vj!b2ak@S$(JjKFnUrf eRoorX2Z0;sm({KHU-kt60000*P) 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 + order.account === selectedAddress && order.network === network && order.state === FIAT_ORDER_STATES.PENDING + ); // selectedAddress + + // console.log(pendingOrders); + + // useEffect(() => { + // console.log('cdM!'); + // console.log('orders', orders); + // console.log('pending', pendingOrders); + // return () => console.log('cWU!'); + // }, [selectedAddress, network, orders, pendingOrders]); + + useInterval( + async () => { + await Promise.all( + pendingOrders.map(async order => { + const proccesed = await processOrder(order); + // Check if status has changed + dispatch({ type: 'FIAT_UPDATE_ORDER', payload: proccesed }); + // dispatch(showTransactionNotification({})); + }) + ); + }, + pendingOrders.length ? 2000 : null + ); + + const onPressAdd = useCallback(() => createFakeOrder(selectedAddress, network), [ + createFakeOrder, + selectedAddress, + network + ]); + + return ( + + Add;Clear; + network:{network} + + ); +} + +FiatOrders.propTypes = { + orders: PropTypes.array, + selectedAddress: PropTypes.string, + network: PropTypes.string, + createFakeOrder: PropTypes.func, + clearOrders: PropTypes.func, + dispatch: PropTypes.func +}; + +const mapStateToProps = state => ({ + orders: state.fiatOrders.orders, + selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, + network: state.engine.backgroundState.NetworkController.network +}); + +const mapDispatchToProps = (dispatch, ownProps) => ({ + createFakeOrder: (address, network) => + dispatch({ + type: 'FIAT_ADD_ORDER', + payload: createPendingOrder( + Math.random(), + FIAT_ORDER_PROVIDERS.TRANSAK, + 0.3, + 1, + 'USD', + address, + network, + {} + ) + }), + clearOrders: () => dispatch({ type: 'FIAT_RESET' }), + dispatch +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(FiatOrders); diff --git a/app/components/UI/FiatOrders/orderProcessor/index.js b/app/components/UI/FiatOrders/orderProcessor/index.js new file mode 100644 index 00000000000..d5bb038e64b --- /dev/null +++ b/app/components/UI/FiatOrders/orderProcessor/index.js @@ -0,0 +1,19 @@ +import { FIAT_ORDER_PROVIDERS } from '../../../../reducers/fiatOrders'; +import { processWyreApplePayOrder } from './wyreApplePay'; +import { processTransakOrder } from './transak'; + +function processOrder(order) { + switch (order.provider) { + case FIAT_ORDER_PROVIDERS.WYRE_APPLE_PAY: { + return processWyreApplePayOrder(order); + } + case FIAT_ORDER_PROVIDERS.TRANSAK: { + return processTransakOrder(order); + } + default: { + return order; + } + } +} + +export default processOrder; diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js new file mode 100644 index 00000000000..4ee649e4196 --- /dev/null +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -0,0 +1,185 @@ +import { useMemo } from 'react'; +import axios from 'axios'; +import qs from 'query-string'; +import { + TRANSAK_URL, + TRANSAK_URL_STAGING, + TRANSAK_API_URL_STAGING, + TRANSAK_API_URL_PRODUCTION, + TRANSAK_API_KEY_STAGING, + TRANSAK_API_KEY_PRODUCTION +} from 'react-native-dotenv'; +import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; +// import Logger from '../../../../util/Logger'; + +//* typedefs + +/** + * @typedef {import('../../../../reducers/fiatOrders').FiatOrder} FiatOrder + */ + +/** + * @typedef TransakOrder + * @type {object} + * @property {} orderId + * @property {} fiatCurrency + * @property {} cryptocurrency + * @property {} fiatAmount + * @property {} cryptoAmount + * @property {} isBuyOrSell + * @property {} status + * @property {} walletAddress + * @property {} totalFee + * @property {} partnerCustomerId + * @property {} partnerOrderId + */ + +//* Constants + +const isDevelopment = process.env.NODE_ENV !== 'production'; + +export const TRANSAK_REDIRECT_URL = 'https://metamask.io/'; + +const TRANSAK_API_BASE_URL = `${isDevelopment ? TRANSAK_API_URL_STAGING : TRANSAK_API_URL_PRODUCTION}api/v1/`; +const TRANSAK_API_KEY = isDevelopment ? TRANSAK_API_KEY_STAGING : TRANSAK_API_KEY_PRODUCTION; + +/** + * @enum {string} + */ +export const TRANSAK_ORDER_STATES = { + AWAITING_PAYMENT_FROM_USER: 'AWAITING_PAYMENT_FROM_USER', + PAYMENT_DONE_MARKED_BY_USER: 'PAYMENT_DONE_MARKED_BY_USER', + PENDING_DELIVERY_FROM_TRANSAK: 'PENDING_DELIVERY_FROM_TRANSAK', + COMPLETED: 'COMPLETED', + CANCELLED: 'CANCELLED' +}; + +//* API + +const transakApi = axios.create({ + baseURL: TRANSAK_API_BASE_URL +}); + +/* eslint-disable no-unused-vars */ +const getPartnerStatus = () => transakApi.get(`partners/${TRANSAK_API_KEY}`); +const getOrderStatus = orderId => transakApi.get(`orders/${orderId}`); +/* eslint-enable no-unused-vars */ + +//* Helpers + +/** + * Transforms a Transak order state into a fiat order state + * @param {TRANSAK_ORDER_STATES} transakOrderState + */ +const transakOrderStateToFiatOrderState = transakOrderState => { + switch (transakOrderState) { + case TRANSAK_ORDER_STATES.AWAITING_PAYMENT_FROM_USER: + case TRANSAK_ORDER_STATES.PAYMENT_DONE_MARKED_BY_USER: + case TRANSAK_ORDER_STATES.PENDING_DELIVERY_FROM_TRANSAK: { + return FIAT_ORDER_STATES.PENDING; + } + case TRANSAK_ORDER_STATES.COMPLETED: { + return FIAT_ORDER_STATES.COMPLETED; + } + case TRANSAK_ORDER_STATES.CANCELLED: { + return FIAT_ORDER_STATES.CANCELLED; + } + default: { + return FIAT_ORDER_STATES.PENDING; + } + } +}; + +/** + * Transforms Transak order object into a Fiat order object used in the state. + * @param {TransakOrder} transakOrder Transak order object + * @returns {FiatOrder} Fiat order object to store in the state + */ +const transakOrderToFiatOrder = transakOrder => ({ + id: transakOrder.orderId, + provider: FIAT_ORDER_PROVIDERS.TRANSAK, + amount: transakOrder.fiatAmount, + fee: transakOrder.totalFee, + currency: transakOrder.fiatCurrency, + state: transakOrderStateToFiatOrderState(transakOrder), + account: transakOrder.walletAddress, + data: transakOrder +}); + +//* Handlers + +/** + * Function to handle Transak flow redirect after order creation + * @param {String} url Custom URL with query params transak flow redirected to. + * Query parameters are: `orderId`, `fiatCurrency`, `cryptocurrency`, `fiatAmount`, + * `cryptoAmount`, `isBuyOrSell`, `status`, `walletAddress`, + * `totalFee`, `partnerCustomerId`, `partnerOrderId`. + * @param {String} network Current network selected in the app + */ +export const handleTransakRedirect = (url, network) => { + // Order created from Transak flow, needs to be added to the polling. + const data = qs.parse(url.split(TRANSAK_REDIRECT_URL)[1]); + /* const actualOrder = { + cryptoAmount: '0.18065827', + cryptocurrency: 'ETH', + fiatAmount: '35', + fiatCurrency: 'GBP', + isBuyOrSell: 'BUY', + orderId: '11aaf266-4ee9-4cdb-8dbf-420a8f4f2193', + status: 'PENDING_DELIVERY_FROM_TRANSAK', + totalFeeInFiat: '1.37', + walletAddress: '0x33C04960375BBB2373e9Dd28C17CE125B08EC74f' + };*/ + const order = { ...transakOrderToFiatOrder(data), network }; + + // TODO: add to fiatOrder state +}; + +// handleTransakRedirect( +// 'https://metamask.io/?orderId=%22071c9aa3-e03a-4e88-afba-c108d05c3ec4%22&fiatCurrency=%22USD%22&cryptocurrency=%22ETH%22&fiatAmount=35&cryptoAmount=0.1369118&isBuyOrSell=%22BUY%22&status=%22PROCESSING%22&walletAddress=%220x33C04960375BBB2373e9Dd28C17CE125B08EC74f%22&totalFee=undefined' +// ); + +/** + * Function used to poll and update the order + * @param {FiatOrder} order Order coming from the state + * @param {TransakOrder} order.data Original Transak order + * @returns {FiatOrder} Fiat order to update in the state + */ +export async function processTransakOrder(order) { + console.log('processTransakOrder'); + // try { + // const { data } = await getOrderStatus(order.id); + // /* TODO: Check order status and update order object. */ + // console.log({ data }); + // } catch (error) { + // console.error(error); + // } + + // Return updated order + return order; +} + +//* Hooks + +export const useTransakFlowURL = address => { + const params = useMemo( + () => + qs.stringify({ + apiKey: TRANSAK_API_KEY, + // cryptoCurrencyCode: 'ETH', + themeColor: '037dd6', + // fiatCurrency: 'USD', + walletAddressesData: JSON.stringify({ + networks: { + erc20: { address } + }, + coins: { + DAI: { address } + } + }), + redirectURL: TRANSAK_REDIRECT_URL + }), + [address] + ); + return `${isDevelopment ? TRANSAK_URL_STAGING : TRANSAK_URL}?${params}`; +}; diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js new file mode 100644 index 00000000000..a7b1d75f2f5 --- /dev/null +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -0,0 +1,35 @@ +import { WYRE_API_ENDPOINT, WYRE_API_ENDPOINT_TEST } from 'react-native-dotenv'; +import { useCallback } from 'react'; + +// { +// id: // Orders are identified by (provider, id) +// provider: FIAT_PROVIDER, +// amount: 0.343 +// fee: 0.3, +// currency: "USD" +// state: FIAT_ORDER_STATE +// account: +// network: +// txHash: +// data: +// } + +export function processWyreApplePayOrder(order) { + console.log('processWyreApplePayOrder'); + + // Once the transferId is returned it means order was accepted and the transfer (blockchain transaction) is in progress. To track its progress please check the transfer tracking documentation here https://docs.sendwyre.com/v3/docs/track-wallet-order + + return order; +} + +export function useWyreTerms(navigation) { + const handleWyreTerms = useCallback( + () => + navigation.navigate('Webview', { + url: 'https://www.sendwyre.com/user-agreement/', + title: 'Wyre User Agreement' + }), + [navigation] + ); + return handleWyreTerms; +} diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 700752650f3..8b5f4f96ab8 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -812,3 +812,71 @@ export function getWebviewNavbar(navigation) { ) }; } + +export function getPaymentSelectorMethodNavbar(title, navigation) { + const rightAction = navigation.dismiss; + + return { + title, + headerTitleStyle: { + fontSize: 20, + color: colors.fontPrimary, + ...fontStyles.normal + }, + headerRight: ( + // eslint-disable-next-line react/jsx-no-bind + + Cancel + + ), + headerLeft: + }; +} + +export function getPaymentMethodApplePayNavbar(title, navigation) { + const rightAction = navigation.dismiss; + + return { + title, + headerTitleStyle: { + fontSize: 20, + color: colors.fontPrimary, + ...fontStyles.normal + }, + headerRight: ( + // eslint-disable-next-line react/jsx-no-bind + + Cancel + + ), + headerLeft: ( + // eslint-disable-next-line react/jsx-no-bind + navigation.pop()} style={styles.closeButton}> + {'Back'} + + ) + }; +} + +export function getTransakWebviewNavbar(navigation) { + const title = navigation.getParam('title', ''); + return { + title, + headerTitleStyle: { + fontSize: 20, + color: colors.fontPrimary, + ...fontStyles.normal + }, + headerLeft: Device.isAndroid() ? ( + // eslint-disable-next-line react/jsx-no-bind + navigation.pop()} style={styles.backButton}> + + + ) : ( + // eslint-disable-next-line react/jsx-no-bind + navigation.pop()} style={styles.backButton}> + + + ) + }; +} diff --git a/app/components/UI/ReceiveRequest/index.js b/app/components/UI/ReceiveRequest/index.js index 04949e32ed7..4c9f6855f5f 100644 --- a/app/components/UI/ReceiveRequest/index.js +++ b/app/components/UI/ReceiveRequest/index.js @@ -138,13 +138,15 @@ class ReceiveRequest extends PureComponent { * Shows an alert message with a coming soon message */ onBuy = () => { - InteractionManager.runAfterInteractions(() => { - this.setState({ buyModalVisible: true }); - setTimeout(() => { - this.setState({ buyModalVisible: false }); - }, 1500); - Analytics.trackEvent(ANALYTICS_EVENT_OPTS.RECEIVE_OPTIONS_BUY); - }); + this.props.toggleReceiveModal(); + this.props.navigation.navigate('PaymentMethodSelector'); + // InteractionManager.runAfterInteractions(() => { + // this.setState({ buyModalVisible: true }); + // setTimeout(() => { + // this.setState({ buyModalVisible: false }); + // }, 1500); + // Analytics.trackEvent(ANALYTICS_EVENT_OPTS.RECEIVE_OPTIONS_BUY); + // }); }; /** diff --git a/app/reducers/fiatOrders/index.js b/app/reducers/fiatOrders/index.js new file mode 100644 index 00000000000..17738267c56 --- /dev/null +++ b/app/reducers/fiatOrders/index.js @@ -0,0 +1,88 @@ +/** + * @typedef FiatOrder + * @type {object} + * @property {string} id - Original id given by Provider. Orders are identified by (provider, id) + * @property {FIAT_ORDER_PROVIDERS} provider : FIAT_PROVIDER, + * @property {string} amount : 0.343 + * @property {string} fee : 0.3 + * @property {} currency : "USD" + * @property {FIAT_ORDER_STATES} state + * @property {string} account : + * @property {string} network : + * @property {string|null} txHash : + * @property {} data : original provider data + */ + +/** + * @enum {string} + */ +export const FIAT_ORDER_PROVIDERS = { + WYRE: 'WYRE', + WYRE_APPLE_PAY: 'WYRE_APPLE_PAY', + TRANSAK: 'TRANSAK' +}; + +/** + * @enum {string} + */ +export const FIAT_ORDER_STATES = { + PENDING: 'PENDING', + FAILED: 'FAILED', + COMPLETED: 'COMPLETED', + CANCELLED: 'CANCELLED' +}; + +export const createPendingOrder = (id, provider, amount, fee, currency, account, network, data) => ({ + id, + provider, + amount, + fee, + currency, + account, + network, + data, + txHash: null, + state: FIAT_ORDER_STATES.PENDING +}); + +const initialState = { + orders: [] +}; + +const findOrderIndex = (provider, id, orders) => + orders.findIndex(order => order.id === id && order.provider === provider); + +const fiatOrderReducer = (state = initialState, action) => { + switch (action.type) { + case 'FIAT_ADD_ORDER': { + return { + ...state, + orders: [...state.orders, action.payload] + }; + } + case 'FIAT_UPDATE_ORDER': { + const orders = state.orders; + const order = action.payload; + const index = findOrderIndex(order.provider, order.id, state.orders); + return { + ...state, + orders: [ + ...orders.slice(0, index), + { + ...orders[index], + ...order + }, + ...orders.slice(index + 1) + ] + }; + } + case 'FIAT_RESET': { + return initialState; + } + default: { + return state; + } + } +}; + +export default fiatOrderReducer; diff --git a/app/reducers/index.js b/app/reducers/index.js index 6c6d64adde8..969d3ac20ea 100644 --- a/app/reducers/index.js +++ b/app/reducers/index.js @@ -10,6 +10,7 @@ import userReducer from './user'; import wizardReducer from './wizard'; import analyticsReducer from './analytics'; import onboardingReducer from './onboarding'; +import fiatOrders from './fiatOrders'; import notificationReducer from './notification'; import { combineReducers } from 'redux'; @@ -26,7 +27,8 @@ const rootReducer = combineReducers({ user: userReducer, wizard: wizardReducer, onboarding: onboardingReducer, - notification: notificationReducer + notification: notificationReducer, + fiatOrders }); export default rootReducer; diff --git a/babel.config.js b/babel.config.js index 3f3b3213790..5d102d7bcfd 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,11 +1,9 @@ module.exports = { - presets: ['module:metro-react-native-babel-preset'], - plugins: [ - "transform-inline-environment-variables" - ], + presets: ['module:metro-react-native-babel-preset', 'module:react-native-dotenv'], + plugins: ['transform-inline-environment-variables'], env: { production: { - plugins: ["transform-remove-console"] + plugins: ['transform-remove-console'] } } }; diff --git a/package.json b/package.json index 697682455de..583c949ed0e 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "@walletconnect/client": "1.0.0-rc.3", "@walletconnect/utils": "1.0.0-rc.3", "asyncstorage-down": "4.2.0", + "axios": "^0.19.2", "babel-plugin-transform-inline-environment-variables": "0.4.3", "babel-plugin-transform-remove-console": "6.9.4", "base-64": "0.1.0", @@ -117,6 +118,7 @@ "pubnub": "4.27.3", "pump": "3.0.0", "qs": "6.7.0", + "query-string": "^6.12.1", "react": "16.11.0", "react-native": "0.62.2", "react-native-actionsheet": "beefe/react-native-actionsheet#107/head", @@ -208,6 +210,7 @@ "prettier": "1.16.4", "react-dom": "16.8.4", "react-native-cli": "2.0.1", + "react-native-dotenv": "^0.2.0", "react-test-renderer": "16.11.0", "regenerator-runtime": "0.13.1", "request-promise": "4.2.4", diff --git a/yarn.lock b/yarn.lock index 7dde8e62b90..57f41281974 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2341,6 +2341,13 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== +axios@^0.19.2: + version "0.19.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== + dependencies: + follow-redirects "1.5.10" + babel-core@7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" @@ -2383,6 +2390,13 @@ babel-jest@^25.2.6, babel-jest@^25.3.0: chalk "^3.0.0" slash "^3.0.0" +babel-plugin-dotenv@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-dotenv/-/babel-plugin-dotenv-0.1.1.tgz#9c8faea67a7c034fe7e94099187ab2e7573400bc" + integrity sha1-nI+upnp8A0/n6UCZGHqy51c0ALw= + dependencies: + dotenv "^2.0.0" + babel-plugin-dynamic-import-node@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" @@ -3660,7 +3674,7 @@ debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: dependencies: ms "2.0.0" -debug@3.1.0: +debug@3.1.0, debug@=3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== @@ -4028,6 +4042,11 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" +dotenv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" + integrity sha1-vXWcNXqqcDZeAclrewvsCKbg2Uk= + drbg.js@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" @@ -5704,6 +5723,13 @@ fn-name@~2.0.1: resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + for-each@^0.3.3, for-each@~0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -10148,6 +10174,15 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +query-string@^6.12.1: + version "6.12.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.12.1.tgz#2ae4d272db4fba267141665374e49a1de09e8a7c" + integrity sha512-OHj+zzfRMyj3rmo/6G8a5Ifvw3AleL/EbcHMD27YA31Q+cO5lfmQxECkImuNVjcskLcvBRVHNAB3w6udMs1eAA== + dependencies: + decode-uri-component "^0.2.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + query-string@^6.4.2: version "6.8.3" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.8.3.tgz#fd9fb7ffb068b79062b43383685611ee47777d4b" @@ -10360,6 +10395,13 @@ react-native-device-info@3.1.4: resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-3.1.4.tgz#58a1d465ce9e2c28809132b1c68dd7ec7ce5f00f" integrity sha512-r+7APHkPO9EA/9w3e9K7yrFigaU+0/g8i3psrNUwCGFxoDewkCHOPj/1YZnAPUwPxgyG3svjZXeCtymI3xcSlA== +react-native-dotenv@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/react-native-dotenv/-/react-native-dotenv-0.2.0.tgz#311551cb6a35a3dcfede648bded55c0e3ece579d" + integrity sha1-MRVRy2o1o9z+3mSL3tVcDj7OV50= + dependencies: + babel-plugin-dotenv "0.1.1" + react-native-elevated-view@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/react-native-elevated-view/-/react-native-elevated-view-0.0.6.tgz#560cc9ab16cfd5cb5ea821521558fc711e57e231" From c68d0333729d7e9493c4d70b3ca44babb2e3ba55 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Sat, 13 Jun 2020 18:48:06 -0400 Subject: [PATCH 003/106] Add Transak order updates and notifications --- .../UI/FiatOrders/TransakWebView/index.js | 35 ++++- app/components/UI/FiatOrders/index.js | 100 ++++++++++---- .../UI/FiatOrders/orderProcessor/transak.js | 124 ++++++++++++------ app/reducers/fiatOrders/index.js | 17 ++- 4 files changed, 206 insertions(+), 70 deletions(-) diff --git a/app/components/UI/FiatOrders/TransakWebView/index.js b/app/components/UI/FiatOrders/TransakWebView/index.js index 650ea7b4a39..5e8084620ea 100644 --- a/app/components/UI/FiatOrders/TransakWebView/index.js +++ b/app/components/UI/FiatOrders/TransakWebView/index.js @@ -1,12 +1,14 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; -import { View } from 'react-native'; +import { View, InteractionManager } from 'react-native'; import { WebView } from 'react-native-webview'; import { getTransakWebviewNavbar } from '../../../UI/Navbar'; import { baseStyles } from '../../../../styles/common'; import { handleTransakRedirect, TRANSAK_REDIRECT_URL } from '../orderProcessor/transak'; +import { connect } from 'react-redux'; +import NotificationManager from '../../../../core/NotificationManager'; -export default class TransakWebView extends PureComponent { +class TransakWebView extends PureComponent { static navigationOptions = ({ navigation }) => getTransakWebviewNavbar(navigation); static propTypes = { @@ -15,8 +17,17 @@ export default class TransakWebView extends PureComponent { handleNavigationStateChange = async navState => { if (navState.url.indexOf(TRANSAK_REDIRECT_URL) > -1) { - handleTransakRedirect(navState.url); + const order = handleTransakRedirect(navState.url, this.props.network); + this.props.addOrder(order); this.props.navigation.dismiss(); + InteractionManager.runAfterInteractions(() => + NotificationManager.showSimpleNotification({ + duration: 5000, + title: `Processing purchase of ${order.currency}`, + description: 'Your deposit is in progress', + status: 'pending' + }) + ); } }; @@ -31,3 +42,21 @@ export default class TransakWebView extends PureComponent { } } } + +TransakWebView.propTypes = { + network: PropTypes.string, + addOrder: PropTypes.func +}; + +const mapStateToProps = state => ({ + network: state.engine.backgroundState.NetworkController.network +}); + +const mapDispatchToProps = dispatch => ({ + addOrder: order => dispatch({ type: 'FIAT_ADD_ORDER', payload: order }) +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(TransakWebView); diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 8a771ff11d6..0504ad8a16c 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -3,43 +3,88 @@ import React, { useCallback } from 'react'; import PropTypes from 'prop-types'; +import { View, StyleSheet, InteractionManager } from 'react-native'; import { connect } from 'react-redux'; -import { Text } from 'react-native'; -import useInterval from './hooks/useInterval'; + +import Text from './components/Text'; import { createPendingOrder, FIAT_ORDER_STATES, FIAT_ORDER_PROVIDERS } from '../../../reducers/fiatOrders'; +import useInterval from './hooks/useInterval'; import processOrder from './orderProcessor'; +import { colors } from '../../../styles/common'; +import NotificationManager from '../../../core/NotificationManager'; -function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOrders, dispatch }) { - // console.log(orders); +const POLLING_TIME = 10000; +const NOTIFICATION_DURATION = 5000; +const SHOW_DEBUG = true; + +const styles = StyleSheet.create({ + bottomView: { + padding: 10, + paddingBottom: 20, + backgroundColor: colors.grey000 + } +}); + +/** + * @typedef {import('../../../reducers/fiatOrders').FiatOrder} FiatOrder + */ +/** + * @param {FiatOrder} fiatOrder + */ +const getNotificationDetails = fiatOrder => { + switch (fiatOrder.state) { + case FIAT_ORDER_STATES.FAILED: { + return { title: 'Your purchase failed', description: 'Failed :(', status: 'error' }; + } + case FIAT_ORDER_STATES.CANCELLED: { + return { title: 'Your purchase was cancelled', description: 'Cancelled :(', status: 'cancelled' }; + } + case FIAT_ORDER_STATES.COMPLETED: { + return { + title: `Your purchase of ${fiatOrder.cryptoAmount} ${fiatOrder.cryptocurrency} successful`, + description: `Your ${fiatOrder.cryptocurrency} is now available`, + status: 'success' + }; + } + case FIAT_ORDER_STATES.PENDING: + default: { + return { + title: `Processing purchase of ${fiatOrder.currency}`, + description: 'Your deposit is in progress', + status: 'pending' + }; + } + } +}; + +function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOrders, dispatch }) { // Pending orders depend on selectedAddress and selectedNetworks const pendingOrders = orders.filter( order => order.account === selectedAddress && order.network === network && order.state === FIAT_ORDER_STATES.PENDING - ); // selectedAddress - - // console.log(pendingOrders); - - // useEffect(() => { - // console.log('cdM!'); - // console.log('orders', orders); - // console.log('pending', pendingOrders); - // return () => console.log('cWU!'); - // }, [selectedAddress, network, orders, pendingOrders]); + ); useInterval( async () => { await Promise.all( pendingOrders.map(async order => { - const proccesed = await processOrder(order); - // Check if status has changed - dispatch({ type: 'FIAT_UPDATE_ORDER', payload: proccesed }); - // dispatch(showTransactionNotification({})); + const updatedOrder = await processOrder(order); + if (updatedOrder.state !== order.state) { + // console.log(`Order updated:`, order.provider, order.id); + dispatch({ type: 'FIAT_UPDATE_ORDER', payload: updatedOrder }); + InteractionManager.runAfterInteractions(() => + NotificationManager.showSimpleNotification({ + duration: NOTIFICATION_DURATION, + ...getNotificationDetails(updatedOrder) + }) + ); + } }) ); }, - pendingOrders.length ? 2000 : null + pendingOrders.length ? POLLING_TIME : null ); const onPressAdd = useCallback(() => createFakeOrder(selectedAddress, network), [ @@ -48,11 +93,20 @@ function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOr network ]); + if (!SHOW_DEBUG) { + return null; + } + return ( - - Add;Clear; - network:{network} - + + + Pending: {pendingOrders.length} Total: {orders.length} + + + Add Clear{' '} + Network: {network} + + ); } diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index 4ee649e4196..fdfeac02adf 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -7,7 +7,9 @@ import { TRANSAK_API_URL_STAGING, TRANSAK_API_URL_PRODUCTION, TRANSAK_API_KEY_STAGING, - TRANSAK_API_KEY_PRODUCTION + TRANSAK_API_KEY_SECRET_STAGING, + TRANSAK_API_KEY_PRODUCTION, + TRANSAK_API_KEY_SECRET_PRODUCTION } from 'react-native-dotenv'; import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; // import Logger from '../../../../util/Logger'; @@ -21,6 +23,38 @@ import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fi /** * @typedef TransakOrder * @type {object} + * @property {string} id + * @property {string} createdAt + * @property {string} updatedAt + * @property {string} completedAt + * @property {string} fiatCurrency + * @property {string} cryptocurrency + * @property {number} fiatAmount + * @property {string} walletLink + * @property {string} paymentOptionId + * @property {boolean} addressAdditionalData + * @property {string} network this is NOT ethernet networks id + * @property {string} amountPaid + * @property {number} referenceCode + * @property {string} redirectURL Our redirect URL + * @property {number} conversionPrice + * @property {number} cryptoAmount + * @property {number} totalFeeInCrypto + * @property {number} totalFeeInFiat + * @property {array} paymentOption + * @property {TRANSAK_ORDER_STATES} status + * @property {string} walletAddress + * @property {string} autoExpiresAt + * @property {string} fromWalletAddress + * @property {string} transactionHash + * @property {string} transactionLink + */ + +/** + * Query params added by Transak when redirecting after completing flow + * https://integrate.transak.com/Query-Parameters-9ec523df3b874ec58cef4fa3a906f238?p=d3edbf3a682d403daceee3249e8aea49 + * @typedef TransakRedirectOrder + * @type {object} * @property {} orderId * @property {} fiatCurrency * @property {} cryptocurrency @@ -42,6 +76,7 @@ export const TRANSAK_REDIRECT_URL = 'https://metamask.io/'; const TRANSAK_API_BASE_URL = `${isDevelopment ? TRANSAK_API_URL_STAGING : TRANSAK_API_URL_PRODUCTION}api/v1/`; const TRANSAK_API_KEY = isDevelopment ? TRANSAK_API_KEY_STAGING : TRANSAK_API_KEY_PRODUCTION; +const TRANSAK_API_KEY_SECRET = isDevelopment ? TRANSAK_API_KEY_SECRET_STAGING : TRANSAK_API_KEY_SECRET_PRODUCTION; /** * @enum {string} @@ -49,8 +84,11 @@ const TRANSAK_API_KEY = isDevelopment ? TRANSAK_API_KEY_STAGING : TRANSAK_API_KE export const TRANSAK_ORDER_STATES = { AWAITING_PAYMENT_FROM_USER: 'AWAITING_PAYMENT_FROM_USER', PAYMENT_DONE_MARKED_BY_USER: 'PAYMENT_DONE_MARKED_BY_USER', + PROCESSING: 'PROCESSING', PENDING_DELIVERY_FROM_TRANSAK: 'PENDING_DELIVERY_FROM_TRANSAK', COMPLETED: 'COMPLETED', + EXPIRED: 'EXPIRED', + FAILED: 'FAILED', CANCELLED: 'CANCELLED' }; @@ -60,10 +98,10 @@ const transakApi = axios.create({ baseURL: TRANSAK_API_BASE_URL }); -/* eslint-disable no-unused-vars */ +// eslint-disable-next-line no-unused-vars const getPartnerStatus = () => transakApi.get(`partners/${TRANSAK_API_KEY}`); -const getOrderStatus = orderId => transakApi.get(`orders/${orderId}`); -/* eslint-enable no-unused-vars */ +const getOrderStatus = orderId => + transakApi.get(`partners/order/${orderId}`, { params: { partnerAPISecret: TRANSAK_API_KEY_SECRET } }); //* Helpers @@ -75,12 +113,15 @@ const transakOrderStateToFiatOrderState = transakOrderState => { switch (transakOrderState) { case TRANSAK_ORDER_STATES.AWAITING_PAYMENT_FROM_USER: case TRANSAK_ORDER_STATES.PAYMENT_DONE_MARKED_BY_USER: + case TRANSAK_ORDER_STATES.PROCESSING: case TRANSAK_ORDER_STATES.PENDING_DELIVERY_FROM_TRANSAK: { return FIAT_ORDER_STATES.PENDING; } case TRANSAK_ORDER_STATES.COMPLETED: { return FIAT_ORDER_STATES.COMPLETED; } + case TRANSAK_ORDER_STATES.EXPIRED: + case TRANSAK_ORDER_STATES.FAILED: case TRANSAK_ORDER_STATES.CANCELLED: { return FIAT_ORDER_STATES.CANCELLED; } @@ -96,16 +137,36 @@ const transakOrderStateToFiatOrderState = transakOrderState => { * @returns {FiatOrder} Fiat order object to store in the state */ const transakOrderToFiatOrder = transakOrder => ({ - id: transakOrder.orderId, + id: transakOrder.id, provider: FIAT_ORDER_PROVIDERS.TRANSAK, amount: transakOrder.fiatAmount, - fee: transakOrder.totalFee, + fee: transakOrder.totalFeeInFiat, + cryptoAmount: transakOrder.cryptoAmount, + cryptoFee: transakOrder.totalFeeInCrypto, currency: transakOrder.fiatCurrency, - state: transakOrderStateToFiatOrderState(transakOrder), + cryptocurrency: transakOrder.cryptocurrency, + state: transakOrderStateToFiatOrderState(transakOrder.status), account: transakOrder.walletAddress, + txHash: transakOrder.transactionHash || null, data: transakOrder }); +/** + * Transforms Transak rorder object into a Fiat order object used in the state. + * @param {TransakRedirectOrder} transakRedirectOrder Transak order object + * @returns {FiatOrder} Fiat order object to store in the state + */ +const transakCallbackOrderToFiatOrder = transakRedirectOrder => ({ + id: transakRedirectOrder.orderId, + provider: FIAT_ORDER_PROVIDERS.TRANSAK, + amount: transakRedirectOrder.fiatAmount, + fee: transakRedirectOrder.totalFee, + currency: transakRedirectOrder.fiatCurrency, + state: transakOrderStateToFiatOrderState(transakRedirectOrder.status), + account: transakRedirectOrder.walletAddress, + data: transakRedirectOrder +}); + //* Handlers /** @@ -115,30 +176,15 @@ const transakOrderToFiatOrder = transakOrder => ({ * `cryptoAmount`, `isBuyOrSell`, `status`, `walletAddress`, * `totalFee`, `partnerCustomerId`, `partnerOrderId`. * @param {String} network Current network selected in the app + * @returns {FiatOrder} */ export const handleTransakRedirect = (url, network) => { - // Order created from Transak flow, needs to be added to the polling. + /** @type {TransakRedirectOrder} */ const data = qs.parse(url.split(TRANSAK_REDIRECT_URL)[1]); - /* const actualOrder = { - cryptoAmount: '0.18065827', - cryptocurrency: 'ETH', - fiatAmount: '35', - fiatCurrency: 'GBP', - isBuyOrSell: 'BUY', - orderId: '11aaf266-4ee9-4cdb-8dbf-420a8f4f2193', - status: 'PENDING_DELIVERY_FROM_TRANSAK', - totalFeeInFiat: '1.37', - walletAddress: '0x33C04960375BBB2373e9Dd28C17CE125B08EC74f' - };*/ - const order = { ...transakOrderToFiatOrder(data), network }; - - // TODO: add to fiatOrder state + const order = { ...transakCallbackOrderToFiatOrder(data), network }; + return order; }; -// handleTransakRedirect( -// 'https://metamask.io/?orderId=%22071c9aa3-e03a-4e88-afba-c108d05c3ec4%22&fiatCurrency=%22USD%22&cryptocurrency=%22ETH%22&fiatAmount=35&cryptoAmount=0.1369118&isBuyOrSell=%22BUY%22&status=%22PROCESSING%22&walletAddress=%220x33C04960375BBB2373e9Dd28C17CE125B08EC74f%22&totalFee=undefined' -// ); - /** * Function used to poll and update the order * @param {FiatOrder} order Order coming from the state @@ -146,17 +192,21 @@ export const handleTransakRedirect = (url, network) => { * @returns {FiatOrder} Fiat order to update in the state */ export async function processTransakOrder(order) { - console.log('processTransakOrder'); - // try { - // const { data } = await getOrderStatus(order.id); - // /* TODO: Check order status and update order object. */ - // console.log({ data }); - // } catch (error) { - // console.error(error); - // } - - // Return updated order - return order; + try { + const { + data: { response } + } = await getOrderStatus(order.id); + if (!response) { + return order; + } + return { + ...order, + ...transakOrderToFiatOrder(response) + }; + } catch (error) { + console.error(error); + return order; + } } //* Hooks diff --git a/app/reducers/fiatOrders/index.js b/app/reducers/fiatOrders/index.js index 17738267c56..bcd98e7fe5f 100644 --- a/app/reducers/fiatOrders/index.js +++ b/app/reducers/fiatOrders/index.js @@ -2,15 +2,18 @@ * @typedef FiatOrder * @type {object} * @property {string} id - Original id given by Provider. Orders are identified by (provider, id) - * @property {FIAT_ORDER_PROVIDERS} provider : FIAT_PROVIDER, - * @property {string} amount : 0.343 - * @property {string} fee : 0.3 - * @property {} currency : "USD" - * @property {FIAT_ORDER_STATES} state + * @property {FIAT_ORDER_PROVIDERS} provider Fiat Provider + * @property {string} amount Fiat amount + * @property {string} fee Fiat fee + * @property {string} cryptoAmount Crypto currency amount + * @property {string} cryptoFee Crypto currency fee + * @property {string} currency : "USD" + * @property {string} cryptocurrency : "ETH" + * @property {FIAT_ORDER_STATES} state Order state * @property {string} account : * @property {string} network : - * @property {string|null} txHash : - * @property {} data : original provider data + * @property {?string} txHash : + * @property {TransakRedirectOrder | TransakOrder | WyreOrder } data : original provider data */ /** From 20fa41f2e947d741e7868f69bd395d81c032c239 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Sat, 13 Jun 2020 18:57:20 -0400 Subject: [PATCH 004/106] Hide debug view --- app/components/UI/FiatOrders/index.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 0504ad8a16c..9231f84bcbc 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -16,7 +16,7 @@ import NotificationManager from '../../../core/NotificationManager'; const POLLING_TIME = 10000; const NOTIFICATION_DURATION = 5000; -const SHOW_DEBUG = true; +const SHOW_DEBUG = false; const styles = StyleSheet.create({ bottomView: { @@ -36,7 +36,11 @@ const styles = StyleSheet.create({ const getNotificationDetails = fiatOrder => { switch (fiatOrder.state) { case FIAT_ORDER_STATES.FAILED: { - return { title: 'Your purchase failed', description: 'Failed :(', status: 'error' }; + return { + title: `Purchase of ${fiatOrder.cryptocurrency} failed! Please try again, sorry for the inconvenience!`, + description: 'Error :(', + status: 'error' + }; } case FIAT_ORDER_STATES.CANCELLED: { return { title: 'Your purchase was cancelled', description: 'Cancelled :(', status: 'cancelled' }; From fc9a6297954eec895fc72862534b1f6d3ac6eb28 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Mon, 15 Jun 2020 15:05:00 -0400 Subject: [PATCH 005/106] Add quick amounts and keypad behavior --- .../FiatOrders/PaymentMethodApplePay/index.js | 216 +++++++++++++++--- 1 file changed, 190 insertions(+), 26 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index b25ea3c5f51..5b1def058bc 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import React, { useContext, useState, useCallback } from 'react'; import PropTypes from 'prop-types'; import { View, StyleSheet, Image, TouchableOpacity } from 'react-native'; import IonicIcon from 'react-native-vector-icons/Ionicons'; @@ -10,6 +10,8 @@ import { colors, fontStyles } from '../../../../styles/common'; import { NavigationContext } from 'react-navigation'; import { useWyreTerms } from '../orderProcessor/wyreApplePay'; +//* styles and components */ + const styles = StyleSheet.create({ screen: { flex: 1 }, amountContainer: { @@ -22,14 +24,37 @@ const styles = StyleSheet.create({ fontFamily: 'Roboto-Light', fontWeight: fontStyles.light.fontWeight, color: colors.black, - fontSize: 44 + fontSize: 44, + height: 52 + }, + amountError: { + color: colors.red }, content: { flexGrow: 1, justifyContent: 'space-around' }, quickAmounts: { - flexDirection: 'row' + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-around', + marginHorizontal: 70 + }, + quickAmount: { + borderRadius: 18, + borderColor: colors.grey200, + borderWidth: 1, + paddingVertical: 5, + paddingHorizontal: 8, + alignItems: 'center', + minWidth: 49 + }, + quickAmountSelected: { + backgroundColor: colors.blue, + borderColor: colors.blue + }, + quickAmountSelectedText: { + color: colors.white }, keypad: { paddingHorizontal: 25 @@ -93,9 +118,9 @@ const Keypad = props => ; Keypad.Row = function Row(props) { return ; }; -Keypad.Button = function KeypadButton({ children }) { +Keypad.Button = function KeypadButton({ children, ...props }) { return ( - + {children} ); @@ -107,55 +132,194 @@ Keypad.Button.propTypes = { Keypad.DeleteButton = function DeleteButton(props) { return ( - + ); }; +const QuickAmount = ({ amount, current, ...props }) => { + const selected = amount === current; + return ( + + + ${amount} + + + ); +}; + +QuickAmount.propTypes = { + amount: PropTypes.string, + current: PropTypes.string +}; + +//* Constants */ + +const quickAmounts = ['50', '100', '250']; +const minAmount = 5; +const maxAmount = 250; + +const hasTwoDecimals = /^\d+\.\d{2}$/; +const hasZeroAsFirstDecimal = /^\d+\.0$/; +const hasZerosAsDecimals = /^\d+\.00$/; +const hasOneDigit = /^\d$/; +const hasPeriodWithoutDecimal = /^\d+\.$/; +const avoidZerosAsDecimals = false; + +//* Handlers + +const handleNewAmountInput = (currentAmount, newInput) => { + switch (newInput) { + case 'PERIOD': { + if (currentAmount === '0') { + return `${currentAmount}.`; + } + if (currentAmount.includes('.')) { + // TODO: throw error for feedback? + return currentAmount; + } + + return `${currentAmount}.`; + } + case 'BACK': { + if (currentAmount === '0') { + return currentAmount; + } + if (hasOneDigit.test(currentAmount)) { + return '0'; + } + + return currentAmount.slice(0, -1); + } + case '0': { + if (currentAmount === '0') { + return currentAmount; + } + if (hasTwoDecimals.test(currentAmount)) { + return currentAmount; + } + if (avoidZerosAsDecimals && hasZeroAsFirstDecimal.test(currentAmount)) { + return currentAmount; + } + return `${currentAmount}${newInput}`; + } + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + if (currentAmount === '0') { + return newInput; + } + if (hasTwoDecimals.test(currentAmount)) { + return currentAmount; + } + + return `${currentAmount}${newInput}`; + } + default: { + return currentAmount; + } + } +}; + function PaymentMethodApplePay(props) { const navigation = useContext(NavigationContext); const [amount, setAmount] = useState('0'); + const roundAmount = + hasZerosAsDecimals.test(amount) || hasZeroAsFirstDecimal.test(amount) || hasPeriodWithoutDecimal.test(amount) + ? amount.split('.')[0] + : amount; + const isUnderMinimum = Number(roundAmount) !== 0 && Number(roundAmount) < minAmount; + const isOverMaximum = Number(roundAmount) > maxAmount; + const disabledButton = amount === '0' || isUnderMinimum || isOverMaximum; + const handleWyreTerms = useWyreTerms(navigation); + const handleQuickAmountPress = useCallback(amount => setAmount(amount), []); + const handleKeypadPress = useCallback( + newInput => { + if (isOverMaximum && newInput !== 'BACK') { + return; + } + const newAmount = handleNewAmountInput(amount, newInput); + if (newAmount === amount) { + return; + } + + setAmount(newAmount); + }, + [amount, isOverMaximum] + ); + const handleKeypadPress1 = useCallback(() => handleKeypadPress('1'), [handleKeypadPress]); + const handleKeypadPress2 = useCallback(() => handleKeypadPress('2'), [handleKeypadPress]); + const handleKeypadPress3 = useCallback(() => handleKeypadPress('3'), [handleKeypadPress]); + const handleKeypadPress4 = useCallback(() => handleKeypadPress('4'), [handleKeypadPress]); + const handleKeypadPress5 = useCallback(() => handleKeypadPress('5'), [handleKeypadPress]); + const handleKeypadPress6 = useCallback(() => handleKeypadPress('6'), [handleKeypadPress]); + const handleKeypadPress7 = useCallback(() => handleKeypadPress('7'), [handleKeypadPress]); + const handleKeypadPress8 = useCallback(() => handleKeypadPress('8'), [handleKeypadPress]); + const handleKeypadPress9 = useCallback(() => handleKeypadPress('9'), [handleKeypadPress]); + const handleKeypadPress0 = useCallback(() => handleKeypadPress('0'), [handleKeypadPress]); + const handleKeypadPressPeriod = useCallback(() => handleKeypadPress('PERIOD'), [handleKeypadPress]); + const handleKeypadPressBack = useCallback(() => handleKeypadPress('BACK'), [handleKeypadPress]); - const disabledButton = true; return ( - + ${amount} - = 0 ETH + {!(isUnderMinimum || isOverMaximum) && = 0 ETH} + {isUnderMinimum && Minimum deposit is ${minAmount}} + {isOverMaximum && Maximum deposit is ${maxAmount}} + {quickAmounts.length > 0 && ( + + {quickAmounts.map(quickAmount => ( + handleQuickAmountPress(quickAmount)} + /> + ))} + + )} - - a - a - a - - 1 - 2 - 3 + 1 + 2 + 3 - 4 - 5 - 6 + 4 + 5 + 6 - 7 - 8 - 9 + 7 + 8 + 9 - . - 0 - + . + 0 + From 9578cea61ce828cc5e3dc12361fab6715589b11b Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Mon, 15 Jun 2020 15:15:13 -0400 Subject: [PATCH 006/106] Add 0. case to keypad --- app/components/UI/FiatOrders/PaymentMethodApplePay/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index 5b1def058bc..b93e7e04c80 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -235,7 +235,8 @@ function PaymentMethodApplePay(props) { hasZerosAsDecimals.test(amount) || hasZeroAsFirstDecimal.test(amount) || hasPeriodWithoutDecimal.test(amount) ? amount.split('.')[0] : amount; - const isUnderMinimum = Number(roundAmount) !== 0 && Number(roundAmount) < minAmount; + const isUnderMinimum = (amount !== '0' || Number(roundAmount) !== 0) && Number(roundAmount) < minAmount; + const isOverMaximum = Number(roundAmount) > maxAmount; const disabledButton = amount === '0' || isUnderMinimum || isOverMaximum; From 0445dbce421be7330a8b8ee9a5f4e790e1bf98bc Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Mon, 15 Jun 2020 16:22:37 -0400 Subject: [PATCH 007/106] Add some more details about transak --- .../UI/FiatOrders/orderProcessor/transak.js | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index fdfeac02adf..ad587e4f487 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -12,7 +12,6 @@ import { TRANSAK_API_KEY_SECRET_PRODUCTION } from 'react-native-dotenv'; import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; -// import Logger from '../../../../util/Logger'; //* typedefs @@ -31,7 +30,7 @@ import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fi * @property {string} cryptocurrency * @property {number} fiatAmount * @property {string} walletLink - * @property {string} paymentOptionId + * @property {string} paymentOptionId Paymenth method ID, see: https://integrate.transak.com/Coverage-Payment-Methods-Fees-Limits-30c0954fbdf04beca68622d9734c59f9 * @property {boolean} addressAdditionalData * @property {string} network this is NOT ethernet networks id * @property {string} amountPaid @@ -55,17 +54,17 @@ import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fi * https://integrate.transak.com/Query-Parameters-9ec523df3b874ec58cef4fa3a906f238?p=d3edbf3a682d403daceee3249e8aea49 * @typedef TransakRedirectOrder * @type {object} - * @property {} orderId - * @property {} fiatCurrency - * @property {} cryptocurrency - * @property {} fiatAmount - * @property {} cryptoAmount - * @property {} isBuyOrSell - * @property {} status - * @property {} walletAddress - * @property {} totalFee - * @property {} partnerCustomerId - * @property {} partnerOrderId + * @property {string} orderId + * @property {string} fiatCurrency + * @property {string} cryptocurrency + * @property {string} fiatAmount + * @property {string} cryptoAmount + * @property {string} isBuyOrSell + * @property {string} status + * @property {string} walletAddress + * @property {string} totalFee + * @property {string} partnerCustomerId + * @property {string} partnerOrderId */ //* Constants @@ -79,6 +78,7 @@ const TRANSAK_API_KEY = isDevelopment ? TRANSAK_API_KEY_STAGING : TRANSAK_API_KE const TRANSAK_API_KEY_SECRET = isDevelopment ? TRANSAK_API_KEY_SECRET_STAGING : TRANSAK_API_KEY_SECRET_PRODUCTION; /** + * https://integrate.transak.com/69a2474c8d8d40daa04bd5bbe804fb6d?v=48a0c9fd98854078a4eaf5ec9a0a4f65 * @enum {string} */ export const TRANSAK_ORDER_STATES = { @@ -98,8 +98,7 @@ const transakApi = axios.create({ baseURL: TRANSAK_API_BASE_URL }); -// eslint-disable-next-line no-unused-vars -const getPartnerStatus = () => transakApi.get(`partners/${TRANSAK_API_KEY}`); +// const getPartnerStatus = () => transakApi.get(`partners/${TRANSAK_API_KEY}`); const getOrderStatus = orderId => transakApi.get(`partners/order/${orderId}`, { params: { partnerAPISecret: TRANSAK_API_KEY_SECRET } }); From bff7bac848251006570cf92329a3e85232b0598f Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Tue, 16 Jun 2020 18:05:11 -0400 Subject: [PATCH 008/106] enable-apple-pay --- ios/MetaMask.xcodeproj/project.pbxproj | 4 +++- ios/MetaMask/MetaMask.entitlements | 5 +++++ ios/MetaMask/MetaMaskDebug.entitlements | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 ios/MetaMask/MetaMaskDebug.entitlements diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index ebe9ac630bd..ccf3e384d64 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -216,6 +216,7 @@ AA8ED01123E475340098CEC2 /* CircularStd-BookItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "CircularStd-BookItalic.otf"; path = "../app/fonts/CircularStd-BookItalic.otf"; sourceTree = ""; }; AA8ED01223E475340098CEC2 /* CircularStd-BoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "CircularStd-BoldItalic.otf"; path = "../app/fonts/CircularStd-BoldItalic.otf"; sourceTree = ""; }; AA8ED01323E475340098CEC2 /* CircularStd-BlackItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "CircularStd-BlackItalic.otf"; path = "../app/fonts/CircularStd-BlackItalic.otf"; sourceTree = ""; }; + AA9EDF17249955C7005D89EE /* MetaMaskDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = MetaMaskDebug.entitlements; path = MetaMask/MetaMaskDebug.entitlements; sourceTree = ""; }; B069442EBFA83EF178D30B2E /* libPods-MetaMask.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-MetaMask.a"; sourceTree = BUILT_PRODUCTS_DIR; }; B6684830E1789B9B249D040C /* Pods-MetaMask.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MetaMask.release.xcconfig"; path = "Target Support Files/Pods-MetaMask/Pods-MetaMask.release.xcconfig"; sourceTree = ""; }; BB8BA2D3C0354D6090B56A8A /* Roboto-Light.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-Light.ttf"; path = "../app/fonts/Roboto-Light.ttf"; sourceTree = ""; }; @@ -272,6 +273,7 @@ 13B07FAE1A68108700A75B9A /* MetaMask */ = { isa = PBXGroup; children = ( + AA9EDF17249955C7005D89EE /* MetaMaskDebug.entitlements */, 15F7796222A1BC1E00B1DF8C /* NativeModules */, 15205D6221596AD90049EA93 /* MetaMask.entitlements */, 158B0639211A72F500DF3C74 /* InpageBridgeWeb3.js */, @@ -834,7 +836,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_OPTIMIZATION = time; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; + CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMaskDebug.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; diff --git a/ios/MetaMask/MetaMask.entitlements b/ios/MetaMask/MetaMask.entitlements index f28c3f3a801..0ee0d28c177 100644 --- a/ios/MetaMask/MetaMask.entitlements +++ b/ios/MetaMask/MetaMask.entitlements @@ -10,5 +10,10 @@ applinks:metamask.app.link applinks:metamask-alternate.app.link + com.apple.developer.in-app-payments + + merchant.io.metamask + merchant.io.metamask-test + diff --git a/ios/MetaMask/MetaMaskDebug.entitlements b/ios/MetaMask/MetaMaskDebug.entitlements new file mode 100644 index 00000000000..0ee0d28c177 --- /dev/null +++ b/ios/MetaMask/MetaMaskDebug.entitlements @@ -0,0 +1,19 @@ + + + + + aps-environment + development + com.apple.developer.associated-domains + + applinks:metamask.io + applinks:metamask.app.link + applinks:metamask-alternate.app.link + + com.apple.developer.in-app-payments + + merchant.io.metamask + merchant.io.metamask-test + + + From 34759b89662b67aad0c0cf31c621b0dadbda52d5 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Tue, 16 Jun 2020 22:56:58 -0400 Subject: [PATCH 009/106] Add initial apple pay processing --- .../FiatOrders/PaymentMethodApplePay/index.js | 65 +++++- app/components/UI/FiatOrders/index.js | 3 +- .../UI/FiatOrders/orderProcessor/transak.js | 3 +- .../FiatOrders/orderProcessor/wyreApplePay.js | 201 +++++++++++++++++- app/reducers/fiatOrders/index.js | 14 +- 5 files changed, 270 insertions(+), 16 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index b93e7e04c80..0110c2cb21d 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -8,7 +8,9 @@ import Text from '../components/Text'; import StyledButton from '../../StyledButton'; import { colors, fontStyles } from '../../../../styles/common'; import { NavigationContext } from 'react-navigation'; -import { useWyreTerms } from '../orderProcessor/wyreApplePay'; +import { useWyreTerms, useWyreApplePay } from '../orderProcessor/wyreApplePay'; +import { connect } from 'react-redux'; +import { setLockTime } from '../../../../actions/settings'; //* styles and components */ @@ -228,7 +230,7 @@ const handleNewAmountInput = (currentAmount, newInput) => { } }; -function PaymentMethodApplePay(props) { +function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress }) { const navigation = useContext(NavigationContext); const [amount, setAmount] = useState('0'); const roundAmount = @@ -241,6 +243,21 @@ function PaymentMethodApplePay(props) { const disabledButton = amount === '0' || isUnderMinimum || isOverMaximum; const handleWyreTerms = useWyreTerms(navigation); + + const [showApplePayRequest, percentFee, flatFee, , fee] = useWyreApplePay(roundAmount, selectedAddress); + const handlePressApplePay = useCallback(async () => { + const prevLockTime = lockTime; + setLockTime(-1); + try { + const fiatOrder = await showApplePayRequest(); + // TODO: add order and show notification + } catch (error) { + // TODO: show error notification + } finally { + setLockTime(prevLockTime); + } + }, [lockTime, setLockTime, showApplePayRequest]); + const handleQuickAmountPress = useCallback(amount => setAmount(amount), []); const handleKeypadPress = useCallback( newInput => { @@ -325,7 +342,12 @@ function PaymentMethodApplePay(props) { - + - Fee ~2.9% + $0.30 (0.35% goes to MetaMask) + {percentFee === '0.00' && flatFee === '0.00' && 0% fee (limited time)} + {(percentFee !== '0.00' || flatFee !== '0.00') && ( + <> + {disabledButton ? ( + + + Fee ~{percentFee}% + ${flatFee} + + + ) : ( + + Plus a ${fee} fee + + )} + + )} @@ -349,7 +386,25 @@ function PaymentMethodApplePay(props) { ); } +PaymentMethodApplePay.propTypes = { + lockTime: PropTypes.number.isRequired, + setLockTime: PropTypes.func.isRequired, + selectedAddress: PropTypes.string.isRequired +}; + PaymentMethodApplePay.navigationOptions = ({ navigation }) => getPaymentMethodApplePayNavbar('Amount to buy', navigation); -export default PaymentMethodApplePay; +const mapStateToProps = state => ({ + lockTime: state.settings.lockTime, + selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress +}); + +const mapDispatchToProps = dispatch => ({ + setLockTime: time => dispatch(setLockTime(time)), + dispatch +}); +export default connect( + mapStateToProps, + mapDispatchToProps +)(PaymentMethodApplePay); diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 9231f84bcbc..d22984e1d6b 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -55,7 +55,7 @@ const getNotificationDetails = fiatOrder => { case FIAT_ORDER_STATES.PENDING: default: { return { - title: `Processing purchase of ${fiatOrder.currency}`, + title: `Processing purchase of ${fiatOrder.cryptocurrency}`, description: 'Your deposit is in progress', status: 'pending' }; @@ -65,6 +65,7 @@ const getNotificationDetails = fiatOrder => { function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOrders, dispatch }) { // Pending orders depend on selectedAddress and selectedNetworks + const pendingOrders = orders.filter( order => order.account === selectedAddress && order.network === network && order.state === FIAT_ORDER_STATES.PENDING diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index ad587e4f487..c66a7cd5bd6 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -203,7 +203,8 @@ export async function processTransakOrder(order) { ...transakOrderToFiatOrder(response) }; } catch (error) { - console.error(error); + // TODO: report error + // console.error(error); return order; } } diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index a7b1d75f2f5..e06176833f4 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -1,5 +1,14 @@ -import { WYRE_API_ENDPOINT, WYRE_API_ENDPOINT_TEST } from 'react-native-dotenv'; -import { useCallback } from 'react'; +import { + WYRE_API_ENDPOINT, + WYRE_API_ENDPOINT_TEST, + WYRE_ACCOUNT_ID, + WYRE_ACCOUNT_ID_TEST, + WYRE_MERCHANT_ID, + WYRE_MERCHANT_ID_TEST +} from 'react-native-dotenv'; +import { useCallback, useMemo } from 'react'; +import { PaymentRequest } from 'react-native-payments'; +import axios from 'axios'; // { // id: // Orders are identified by (provider, id) @@ -14,14 +23,200 @@ import { useCallback } from 'react'; // data: // } +//* typedefs + +/** + * @typedef {import('../../../../reducers/fiatOrders').FiatOrder} FiatOrder + */ + +//* Constants */ + +const isDevelopment = process.env.NODE_ENV !== 'production'; +const merchantIdentifier = 'test' || isDevelopment ? WYRE_MERCHANT_ID_TEST : WYRE_MERCHANT_ID; +const partnerId = isDevelopment ? WYRE_ACCOUNT_ID_TEST : WYRE_ACCOUNT_ID; + +const WYRE_IS_PROMOTION = false; +const WYRE_FEE_PERCENT = WYRE_IS_PROMOTION ? 0 : 2.9; +const WYRE_FEE_FLAT = WYRE_IS_PROMOTION ? 0 : 0.3; + +//* API */ + +const wyreAPI = axios.create({ + baseURL: isDevelopment ? WYRE_API_ENDPOINT_TEST : WYRE_API_ENDPOINT +}); + +const createFiatOrder = payload => + wyreAPI.post('v3/apple-pay/process/partner', payload, { + validateStatus: status => status >= 200 + }); +const trackFiatOrder = orderId => wyreAPI.get(`v3/orders/${orderId}`); +const trackTransfer = transferId => wyreAPI.get(`v2/transfer/${transferId}/track`); + export function processWyreApplePayOrder(order) { console.log('processWyreApplePayOrder'); - // Once the transferId is returned it means order was accepted and the transfer (blockchain transaction) is in progress. To track its progress please check the transfer tracking documentation here https://docs.sendwyre.com/v3/docs/track-wallet-order + /* TODO: Once the transferId is returned it means order was + accepted and the transfer (blockchain transaction) is in progress. + To track its progress please check the transfer tracking documentation here https://docs.sendwyre.com/v3/docs/track-wallet-order + */ return order; } +//* Payment Request */ + +const USD_CURRENCY_CODE = 'USD'; +const ETH_CURRENCY_CODE = 'ETH'; + +const PAYMENT_REQUEST_COMPLETE = { + SUCCESS: 'success', + UNKNOWN: 'unknown', + FAIL: 'fail' +}; + +const methodData = [ + { + supportedMethods: ['apple-pay'], + supportedTypes: ['debit'], + data: { + countryCode: 'US', + currencyCode: USD_CURRENCY_CODE, + supportedNetworks: ['visa', 'mastercard', 'discover'], + merchantIdentifier + } + } +]; + +const getPaymentDetails = (cryptoCurrency, amount, fee, total) => ({ + displayItems: [ + { + amount: { currency: USD_CURRENCY_CODE, value: `${amount}` }, + label: `${cryptoCurrency} Purchase` + }, + { + amount: { currency: USD_CURRENCY_CODE, value: `${fee}` }, + label: 'Fee' + } + ], + total: { + amount: { currency: USD_CURRENCY_CODE, value: `${total}` }, + label: 'MetaMask' + } +}); + +const paymentOptions = { + requestPayerPhone: true, + requestPayerEmail: true, + requestBilling: true +}; + +const createPayload = (amount, address, paymentDetails) => { + const { + billingContact: { postalAddress, name }, + paymentData, + paymentMethod, + shippingContact, + transactionIdentifier + } = paymentDetails; + const dest = `ethereum:${address}`; + + const formattedBillingContact = { + addressLines: postalAddress.street.split('\n'), + administrativeArea: postalAddress.state, + country: postalAddress.country, + countryCode: postalAddress.ISOCountryCode, + familyName: name.familyName, + givenName: name.givenName, + locality: postalAddress.city, + postalCode: postalAddress.postalCode, + subAdministrativeArea: postalAddress.subAdministrativeArea, + subLocality: postalAddress.subLocality + }; + + const formattedShippingContact = { + ...formattedBillingContact, + emailAddress: shippingContact.emailAddress, + phoneNumber: shippingContact.phoneNumber + }; + return { + partnerId, + payload: { + orderRequest: { + amount, + dest, + destCurrency: ETH_CURRENCY_CODE, + referrerAccountId: partnerId, + sourceCurrency: USD_CURRENCY_CODE + }, + paymentObject: { + billingContact: formattedBillingContact, + shippingContact: formattedShippingContact, + token: { + paymentData, + paymentMethod: { + ...paymentMethod, + type: 'debit' + }, + transactionIdentifier + } + } + } + }; +}; + +// * Hooks */ + +export function useWyreApplePay(amount, address) { + const flatFee = useMemo(() => WYRE_FEE_FLAT.toFixed(2), []); + const percentFee = useMemo(() => WYRE_FEE_PERCENT.toFixed(2), []); + const percentFeeAmount = useMemo(() => ((Number(amount) * Number(percentFee)) / 100).toFixed(2), [ + amount, + percentFee + ]); + const fee = useMemo(() => (Number(percentFeeAmount) + Number(flatFee)).toFixed(2), [flatFee, percentFeeAmount]); + const total = useMemo(() => Number(amount) + Number(fee), [amount, fee]); + const paymentDetails = useMemo(() => getPaymentDetails(ETH_CURRENCY_CODE, amount, fee, total), [ + amount, + fee, + total + ]); + + const showRequest = useCallback(async () => { + const paymentRequest = new PaymentRequest(methodData, paymentDetails, paymentOptions); + try { + const paymentResponse = await paymentRequest.show(); + if (!paymentResponse) { + throw new Error('Payment Request Failed'); + } + const payload = createPayload(total, address, paymentResponse.details); + const { data, status } = await createFiatOrder(payload); + // const order = await axios.post('https://envwmfqc4hgr.x.pipedream.net/payment', payload); + + if (status >= 200 && status < 300) { + console.log('success'); + await paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.SUCCESS); + return data; + } + paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.FAIL); + console.log(data); + + // {"compositeType": "", "exceptionId": "RBV6BR", "language": "en", "message": "No partner configuration found or AC_Q9X8G3WGTDH", "subType": "", "transient": false, "type": "ApiException"} + + throw data; + } catch (error) { + if (error.message.includes('AbortError')) { + return console.log('aborted'); + } + + paymentRequest.abort(); + + console.log('Error in payment request: ', error); + } + }, [address, paymentDetails, total]); + + return [showRequest, percentFee, flatFee, percentFeeAmount, fee, total]; +} + export function useWyreTerms(navigation) { const handleWyreTerms = useCallback( () => diff --git a/app/reducers/fiatOrders/index.js b/app/reducers/fiatOrders/index.js index bcd98e7fe5f..0073bd94085 100644 --- a/app/reducers/fiatOrders/index.js +++ b/app/reducers/fiatOrders/index.js @@ -7,13 +7,15 @@ * @property {string} fee Fiat fee * @property {string} cryptoAmount Crypto currency amount * @property {string} cryptoFee Crypto currency fee - * @property {string} currency : "USD" - * @property {string} cryptocurrency : "ETH" + * @property {string} currency "USD" + * @property {string} cryptocurrency "ETH" * @property {FIAT_ORDER_STATES} state Order state - * @property {string} account : - * @property {string} network : - * @property {?string} txHash : - * @property {TransakRedirectOrder | TransakOrder | WyreOrder } data : original provider data + * @property {string} account + * @property {string} network + * @property {?string} txHash + * @property {object} data original provider data + * @property {object} data.order : Wyre order response + * @property {object} data.transfer : Wyre transfer response */ /** From 9b771c5f296f583740064a28e0738931d91b09fe Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Wed, 3 Jun 2020 11:29:29 -0400 Subject: [PATCH 010/106] Add react-native-payments --- ios/Podfile.lock | 6 ++++++ package.json | 1 + react-native-payments-v1.1.5.tgz | Bin 0 -> 21591 bytes yarn.lock | 23 +++++++++++++++++++++++ 4 files changed, 30 insertions(+) create mode 100644 react-native-payments-v1.1.5.tgz diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 66872575dc0..762db76e38c 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -340,6 +340,8 @@ PODS: - React-cxxreact (= 0.62.2) - React-jsi (= 0.62.2) - ReactCommon/callinvoker (= 0.62.2) + - ReactNativePayments (1.1.5): + - React - RNCAsyncStorage (1.9.0): - React - RNCClipboard (1.2.2): @@ -440,6 +442,7 @@ DEPENDENCIES: - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) - ReactCommon/callinvoker (from `../node_modules/react-native/ReactCommon`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - ReactNativePayments (from `../node_modules/react-native-payments/lib/ios`) - "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)" - "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)" - RNDeviceInfo (from `../node_modules/react-native-device-info`) @@ -549,6 +552,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/Vibration" ReactCommon: :path: "../node_modules/react-native/ReactCommon" + ReactNativePayments: + :path: "../node_modules/react-native-payments/lib/ios" RNCAsyncStorage: :path: "../node_modules/@react-native-community/async-storage" RNCClipboard: @@ -634,6 +639,7 @@ SPEC CHECKSUMS: React-RCTText: fae545b10cfdb3d247c36c56f61a94cfd6dba41d React-RCTVibration: 4356114dbcba4ce66991096e51a66e61eda51256 ReactCommon: ed4e11d27609d571e7eee8b65548efc191116eb3 + ReactNativePayments: 40a266450628c05db440fe219b631210e4358a49 RNCAsyncStorage: 453cd7c335ec9ba3b877e27d02238956b76f3268 RNCClipboard: 8148e21ac347c51fd6cd4b683389094c216bb543 RNDeviceInfo: 88099e84466f053bae3f34c307b506738b2b6946 diff --git a/package.json b/package.json index cff44b41330..74e157d8a6e 100644 --- a/package.json +++ b/package.json @@ -141,6 +141,7 @@ "react-native-level-fs": "3.0.1", "react-native-modal": "^11.5.6", "react-native-os": "^1.2.6", + "react-native-payments": "file:react-native-payments-v1.1.5.tgz", "react-native-progress": "3.5.0", "react-native-push-notification": "git+ssh://git@github.com/MetaMask/react-native-push-notification.git#androidx", "react-native-qrcode-svg": "5.1.2", diff --git a/react-native-payments-v1.1.5.tgz b/react-native-payments-v1.1.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f55462f45f84c0dbe4d33a9945c0b7d9aab6ee46 GIT binary patch literal 21591 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 literal 0 HcmV?d00001 diff --git a/yarn.lock b/yarn.lock index 8238e4d7037..7dde8e62b90 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4306,6 +4306,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-error@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -10447,6 +10452,14 @@ react-native-os@^1.2.6: resolved "https://registry.yarnpkg.com/react-native-os/-/react-native-os-1.2.6.tgz#1bb16d78ccad1143972183a04f443cf1af9fbefa" integrity sha512-OlT+xQAcvkcnf7imgXiu+myMkqDt4xw2bP5SlVo19hEn5XHBkPMLX7dk3sSGxxncH/ToMDsf1KLyrPabNVtadA== +"react-native-payments@file:react-native-payments-v1.1.5.tgz": + version "1.1.5" + resolved "file:react-native-payments-v1.1.5.tgz#4b2e57db7e1eea1b002d9968423016c6b10e7132" + dependencies: + es6-error "^4.0.2" + uuid "3.3.2" + validator "^7.0.0" + react-native-progress@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/react-native-progress/-/react-native-progress-3.5.0.tgz#d1ccc7f96dc17c609aedb43b2e6695d67deae0ec" @@ -12778,6 +12791,11 @@ uuid@2.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + uuid@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" @@ -12820,6 +12838,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validator@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-7.2.0.tgz#a63dcbaba51d4350bf8df20988e0d5a54d711791" + integrity sha512-c8NGTUYeBEcUIGeMppmNVKHE7wwfm3mYbNZxV+c5mlv9fDHI7Ad3p07qfNrn/CvpdkK2k61fOLRO2sTEhgQXmg== + varint@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.0.tgz#d826b89f7490732fabc0c0ed693ed475dcb29ebf" From b8808cd0cf665a0a9f0e07bf8ec37a131ded00bf Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 12 Jun 2020 20:59:21 -0400 Subject: [PATCH 011/106] Initial apple pay screen --- .gitignore | 1 + app/components/Nav/Main/index.js | 14 ++ .../FiatOrders/PaymentMethodApplePay/index.js | 190 ++++++++++++++++++ .../FiatOrders/PaymentMethodSelector/index.js | 166 +++++++++++++++ .../UI/FiatOrders/TransakWebView/index.js | 33 +++ .../UI/FiatOrders/components/AccountBar.js | 64 ++++++ .../UI/FiatOrders/components/Heading.js | 12 ++ .../UI/FiatOrders/components/InfoIcon.js | 22 ++ .../UI/FiatOrders/components/ModalHandler.js | 17 ++ .../components/PaymentMethod/Modal.js | 108 ++++++++++ .../components/PaymentMethod/index.js | 93 +++++++++ .../UI/FiatOrders/components/ScreenView.js | 19 ++ .../UI/FiatOrders/components/SubHeader.js | 6 + .../UI/FiatOrders/components/Text.js | 97 +++++++++ .../UI/FiatOrders/components/Title.js | 36 ++++ .../UI/FiatOrders/hooks/useInterval.js | 24 +++ .../UI/FiatOrders/images/ApplePayLogo.png | Bin 0 -> 606 bytes .../UI/FiatOrders/images/ApplePayLogo@2x.png | Bin 0 -> 1201 bytes .../UI/FiatOrders/images/ApplePayLogo@3x.png | Bin 0 -> 1772 bytes .../UI/FiatOrders/images/ApplePayMark.png | Bin 0 -> 944 bytes .../UI/FiatOrders/images/ApplePayMark@2x.png | Bin 0 -> 1854 bytes .../UI/FiatOrders/images/ApplePayMark@3x.png | Bin 0 -> 2652 bytes .../UI/FiatOrders/images/TransakLogo.png | Bin 0 -> 2408 bytes .../UI/FiatOrders/images/TransakLogo@2x.png | Bin 0 -> 6111 bytes .../UI/FiatOrders/images/TransakLogo@3x.png | Bin 0 -> 10691 bytes .../UI/FiatOrders/images/WyreLogo.png | Bin 0 -> 1112 bytes .../UI/FiatOrders/images/WyreLogo@2x.png | Bin 0 -> 2542 bytes .../UI/FiatOrders/images/WyreLogo@3x.png | Bin 0 -> 4186 bytes app/components/UI/FiatOrders/index.js | 96 +++++++++ .../UI/FiatOrders/orderProcessor/index.js | 19 ++ .../UI/FiatOrders/orderProcessor/transak.js | 185 +++++++++++++++++ .../FiatOrders/orderProcessor/wyreApplePay.js | 35 ++++ app/components/UI/Navbar/index.js | 68 +++++++ app/components/UI/ReceiveRequest/index.js | 16 +- app/reducers/fiatOrders/index.js | 88 ++++++++ app/reducers/index.js | 4 +- babel.config.js | 8 +- package.json | 3 + yarn.lock | 44 +++- 39 files changed, 1454 insertions(+), 14 deletions(-) create mode 100644 app/components/UI/FiatOrders/PaymentMethodApplePay/index.js create mode 100644 app/components/UI/FiatOrders/PaymentMethodSelector/index.js create mode 100644 app/components/UI/FiatOrders/TransakWebView/index.js create mode 100644 app/components/UI/FiatOrders/components/AccountBar.js create mode 100644 app/components/UI/FiatOrders/components/Heading.js create mode 100644 app/components/UI/FiatOrders/components/InfoIcon.js create mode 100644 app/components/UI/FiatOrders/components/ModalHandler.js create mode 100644 app/components/UI/FiatOrders/components/PaymentMethod/Modal.js create mode 100644 app/components/UI/FiatOrders/components/PaymentMethod/index.js create mode 100644 app/components/UI/FiatOrders/components/ScreenView.js create mode 100644 app/components/UI/FiatOrders/components/SubHeader.js create mode 100644 app/components/UI/FiatOrders/components/Text.js create mode 100644 app/components/UI/FiatOrders/components/Title.js create mode 100644 app/components/UI/FiatOrders/hooks/useInterval.js create mode 100644 app/components/UI/FiatOrders/images/ApplePayLogo.png create mode 100644 app/components/UI/FiatOrders/images/ApplePayLogo@2x.png create mode 100644 app/components/UI/FiatOrders/images/ApplePayLogo@3x.png create mode 100644 app/components/UI/FiatOrders/images/ApplePayMark.png create mode 100644 app/components/UI/FiatOrders/images/ApplePayMark@2x.png create mode 100644 app/components/UI/FiatOrders/images/ApplePayMark@3x.png create mode 100644 app/components/UI/FiatOrders/images/TransakLogo.png create mode 100644 app/components/UI/FiatOrders/images/TransakLogo@2x.png create mode 100644 app/components/UI/FiatOrders/images/TransakLogo@3x.png create mode 100644 app/components/UI/FiatOrders/images/WyreLogo.png create mode 100644 app/components/UI/FiatOrders/images/WyreLogo@2x.png create mode 100644 app/components/UI/FiatOrders/images/WyreLogo@3x.png create mode 100644 app/components/UI/FiatOrders/index.js create mode 100644 app/components/UI/FiatOrders/orderProcessor/index.js create mode 100644 app/components/UI/FiatOrders/orderProcessor/transak.js create mode 100644 app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js create mode 100644 app/reducers/fiatOrders/index.js diff --git a/.gitignore b/.gitignore index e07070a027f..fcb6dcf11e7 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,7 @@ coverage /app/core/InpageBridgeWeb3.js # environment variables +.env .js.env .ios.env .android.env diff --git a/app/components/Nav/Main/index.js b/app/components/Nav/Main/index.js index c87622c963f..aaec93b147c 100644 --- a/app/components/Nav/Main/index.js +++ b/app/components/Nav/Main/index.js @@ -98,6 +98,10 @@ import ContactForm from '../../Views/Settings/Contacts/ContactForm'; import TransactionTypes from '../../../core/TransactionTypes'; import BackupAlert from '../../UI/BackupAlert'; import Notification from '../../UI/Notification'; +import FiatOrders from '../../UI/FiatOrders'; +import PaymentMethodSelector from '../../UI/FiatOrders/PaymentMethodSelector'; +import PaymentMethodApplePay from '../../UI/FiatOrders/PaymentMethodApplePay'; +import TransakWebView from '../../UI/FiatOrders/TransakWebView'; import { showTransactionNotification, hideTransactionNotification, @@ -329,6 +333,15 @@ const MainNavigator = createStackNavigator( } ) }, + + FiatOnRamp: { + screen: createStackNavigator({ + PaymentMethodSelector: { screen: PaymentMethodSelector }, + PaymentMethodApplePay: { screen: PaymentMethodApplePay }, + TransakFlow: { screen: TransakWebView } + }) + }, + SetPasswordFlow: { screen: createStackNavigator( { @@ -1142,6 +1155,7 @@ class Main extends PureComponent { + {this.renderSigningModal()} {this.renderWalletConnectSessionRequestModal()} diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js new file mode 100644 index 00000000000..b25ea3c5f51 --- /dev/null +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -0,0 +1,190 @@ +import React, { useContext, useState } from 'react'; +import PropTypes from 'prop-types'; +import { View, StyleSheet, Image, TouchableOpacity } from 'react-native'; +import IonicIcon from 'react-native-vector-icons/Ionicons'; +import { getPaymentMethodApplePayNavbar } from '../../Navbar'; +import AccountBar from '../components/AccountBar'; +import Text from '../components/Text'; +import StyledButton from '../../StyledButton'; +import { colors, fontStyles } from '../../../../styles/common'; +import { NavigationContext } from 'react-navigation'; +import { useWyreTerms } from '../orderProcessor/wyreApplePay'; + +const styles = StyleSheet.create({ + screen: { flex: 1 }, + amountContainer: { + margin: 10, + padding: 15, + alignItems: 'center', + justifyContent: 'center' + }, + amount: { + fontFamily: 'Roboto-Light', + fontWeight: fontStyles.light.fontWeight, + color: colors.black, + fontSize: 44 + }, + content: { + flexGrow: 1, + justifyContent: 'space-around' + }, + quickAmounts: { + flexDirection: 'row' + }, + keypad: { + paddingHorizontal: 25 + }, + keypadRow: { + flexDirection: 'row', + justifyContent: 'space-around' + }, + keypadButton: { + paddingHorizontal: 20, + paddingVertical: 15, + flex: 1, + justifyContent: 'center', + alignItems: 'center' + }, + keypadButtonText: { + fontFamily: 'Roboto', + color: colors.black, + textAlign: 'center', + fontSize: 30 + }, + deleteIcon: { + fontSize: 25, + marginTop: 5 + }, + buttonContainer: { + paddingBottom: 20 + }, + applePayButton: { + backgroundColor: colors.black, + padding: 10, + margin: 10, + marginHorizontal: 25, + alignItems: 'center' + }, + applePayButtonText: { + color: colors.white + }, + applePayButtonTextDisabled: { + opacity: 0.6 + }, + applePayLogo: { + marginLeft: 4 + }, + applePayLogoDisabled: { + opacity: 0.6 + } +}); + +/* eslint-disable import/no-commonjs */ +const ApplePayLogo = require('../images/ApplePayLogo.png'); +const ApplePay = ({ disabled }) => ( + +); + +ApplePay.propTypes = { + disabled: PropTypes.bool +}; + +const Keypad = props => ; +Keypad.Row = function Row(props) { + return ; +}; +Keypad.Button = function KeypadButton({ children }) { + return ( + + {children} + + ); +}; + +Keypad.Button.propTypes = { + children: PropTypes.node +}; + +Keypad.DeleteButton = function DeleteButton(props) { + return ( + + + + ); +}; + +function PaymentMethodApplePay(props) { + const navigation = useContext(NavigationContext); + const [amount, setAmount] = useState('0'); + const handleWyreTerms = useWyreTerms(navigation); + + const disabledButton = true; + return ( + + + + + + ${amount} + + = 0 ETH + + + + + a + a + a + + + + 1 + 2 + 3 + + + 4 + 5 + 6 + + + 7 + 8 + 9 + + + . + 0 + + + + + + + + Buy with + + + + + Fee ~2.9% + $0.30 (0.35% goes to MetaMask) + + + + Wyre terms of service + + + + + + ); +} + +PaymentMethodApplePay.navigationOptions = ({ navigation }) => + getPaymentMethodApplePayNavbar('Amount to buy', navigation); + +export default PaymentMethodApplePay; diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.js new file mode 100644 index 00000000000..9be2ca6da2f --- /dev/null +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.js @@ -0,0 +1,166 @@ +import React, { useContext, useCallback } from 'react'; +import PropTypes from 'prop-types'; +import { TouchableOpacity, Image, StyleSheet } from 'react-native'; +import { NavigationContext } from 'react-navigation'; +import { connect } from 'react-redux'; + +import { useTransakFlowURL } from '../orderProcessor/transak'; +import { useWyreTerms } from '../orderProcessor/wyreApplePay'; +import { getPaymentSelectorMethodNavbar } from '../../Navbar'; + +import Title from '../components/Title'; +import Text from '../components/Text'; +import Heading from '../components/Heading'; +import SubHeader from '../components/SubHeader'; +import PaymentMethod from '../components/PaymentMethod'; +import ScreenView from '../components/ScreenView'; +import ModalHandler from '../components/ModalHandler'; + +const logosStyle = StyleSheet.create({ + applePay: { + marginVertical: 3 + }, + transak: { + marginVertical: 5 + } +}); + +/* eslint-disable import/no-commonjs */ +const ApplePayMarkIcon = require('../images/ApplePayMark.png'); +const TransakLogoIcon = require('../images/TransakLogo.png'); +const WyreLogoIcon = require('../images/WyreLogo.png'); +/* eslint-enable import/no-commonjs */ + +const ApplePayMark = () => ; +const TransakLogo = () => ; +const WyreLogo = () => ; + +function PaymentMethodSelectorView({ selectedAddress, ...props }) { + const navigation = useContext(NavigationContext); + const transakURL = useTransakFlowURL(selectedAddress); + + const handleWyreTerms = useWyreTerms(navigation); + + const onPressApplePay = useCallback(() => navigation.navigate('PaymentMethodApplePay'), [navigation]); + const onPressTransak = useCallback(() => { + navigation.navigate('TransakFlow', { + url: transakURL, + title: 'Transak' + }); + }, [navigation, transakURL]); + + return ( + + + + <Text reset>0% fee when you use</Text> + {'\n'} + <Text reset>Apple Pay.</Text> + + Valid until July 1st, 2020 + + + + Best deal + + + Apple Pay via + + 0% fee (limited time) + 1 - 2 minutes + Max $450 weekly + Requires debit card + + + + + {({ isVisible, toggleModal }) => ( + <> + + + + 🇺🇸 U.S. only + + + + + + Some states excluded + + + + + + Paying with Apple Pay, powered by Wyre is supported in the United Sates 🇺🇸 + except for CT, HI, NC, NH, NY, VA and VT.{' '} + { + toggleModal(); + handleWyreTerms(); + }} + > + Wyre terms of service apply. + + + + + )} + + + + + + + Bank transfer or debit card + Options and fees vary based on location + + + + + {({ isVisible, toggleModal }) => ( + <> + + + + 32+ countries + + + + + + + Exact payment methods and fees vary depending on location. Supported countries + are: Austria 🇦🇹, Belgium 🇧🇪, Cyprus 🇨🇾, Czechia 🇨🇿, Estonia 🇪🇪, Finland 🇫🇮, + France 🇫🇷, Germany 🇩🇪, Greece 🇬🇷, Ireland 🇮🇪, Italy 🇮🇹, Latvia 🇱🇻, Luxembourg + 🇱🇺, Malta 🇲🇹, Netherlands 🇳🇱, Portugal 🇵🇹, Romania 🇷🇴, Slovakia 🇸🇰, Slovenia 🇸🇮, + Spain 🇪🇸, United Kingdom 🇬🇧 + + + + )} + + + + + ); +} + +PaymentMethodSelectorView.propTypes = { + selectedAddress: PropTypes.string.isRequired +}; + +PaymentMethodSelectorView.navigationOptions = ({ navigation }) => + getPaymentSelectorMethodNavbar('Purchase Method', navigation); + +const mapStateToProps = state => ({ + selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress +}); + +export default connect(mapStateToProps)(PaymentMethodSelectorView); diff --git a/app/components/UI/FiatOrders/TransakWebView/index.js b/app/components/UI/FiatOrders/TransakWebView/index.js new file mode 100644 index 00000000000..650ea7b4a39 --- /dev/null +++ b/app/components/UI/FiatOrders/TransakWebView/index.js @@ -0,0 +1,33 @@ +import React, { PureComponent } from 'react'; +import PropTypes from 'prop-types'; +import { View } from 'react-native'; +import { WebView } from 'react-native-webview'; +import { getTransakWebviewNavbar } from '../../../UI/Navbar'; +import { baseStyles } from '../../../../styles/common'; +import { handleTransakRedirect, TRANSAK_REDIRECT_URL } from '../orderProcessor/transak'; + +export default class TransakWebView extends PureComponent { + static navigationOptions = ({ navigation }) => getTransakWebviewNavbar(navigation); + + static propTypes = { + navigation: PropTypes.object + }; + + handleNavigationStateChange = async navState => { + if (navState.url.indexOf(TRANSAK_REDIRECT_URL) > -1) { + handleTransakRedirect(navState.url); + this.props.navigation.dismiss(); + } + }; + + render() { + const uri = this.props.navigation.getParam('url', null); + if (uri) { + return ( + + + + ); + } + } +} diff --git a/app/components/UI/FiatOrders/components/AccountBar.js b/app/components/UI/FiatOrders/components/AccountBar.js new file mode 100644 index 00000000000..5193a8c724a --- /dev/null +++ b/app/components/UI/FiatOrders/components/AccountBar.js @@ -0,0 +1,64 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { View, TouchableOpacity, StyleSheet, Text } from 'react-native'; +import { connect } from 'react-redux'; + +import { colors, fontStyles } from '../../../../styles/common'; +import { toggleAccountsModal } from '../../../../actions/modals'; +import EthereumAddress from '../../EthereumAddress'; +import Identicon from '../../Identicon'; + +const styles = StyleSheet.create({ + container: { + backgroundColor: colors.grey000, + padding: 15, + alignItems: 'center' + }, + addressContainer: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center' + }, + depositingText: { + ...fontStyles.thin, + fontSize: 12, + textAlign: 'center' + }, + accountText: { + ...fontStyles.bold, + textAlign: 'center', + margin: 3 + } +}); +const AccountBar = ({ toggleAccountsModal, selectedAddress, identities }) => ( + + <> + Depositing to: + + + + {identities[selectedAddress].name} () + + + + +); + +AccountBar.propTypes = { + toggleAccountsModal: PropTypes.func.isRequired, + selectedAddress: PropTypes.string.isRequired, + identities: PropTypes.object.isRequired +}; + +const mapStateToProps = state => ({ + selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, + identities: state.engine.backgroundState.PreferencesController.identities +}); + +const mapDispatchToProps = dispatch => ({ + toggleAccountsModal: () => dispatch(toggleAccountsModal()) +}); +export default connect( + mapStateToProps, + mapDispatchToProps +)(AccountBar); diff --git a/app/components/UI/FiatOrders/components/Heading.js b/app/components/UI/FiatOrders/components/Heading.js new file mode 100644 index 00000000000..13a1a8dafb4 --- /dev/null +++ b/app/components/UI/FiatOrders/components/Heading.js @@ -0,0 +1,12 @@ +import React from 'react'; +import { View, StyleSheet } from 'react-native'; + +const style = StyleSheet.create({ + view: { + margin: 30 + } +}); + +const Heading = ({ ...props }) => ; + +export default Heading; diff --git a/app/components/UI/FiatOrders/components/InfoIcon.js b/app/components/UI/FiatOrders/components/InfoIcon.js new file mode 100644 index 00000000000..12f34980575 --- /dev/null +++ b/app/components/UI/FiatOrders/components/InfoIcon.js @@ -0,0 +1,22 @@ +import React from 'react'; +import { StyleSheet } from 'react-native'; +import IonicIcon from 'react-native-vector-icons/Ionicons'; +import Device from '../../../../util/Device'; +import { colors } from '../../../../styles/common'; + +const styles = StyleSheet.create({ + icon: { + color: colors.grey200 + } +}); + +const InfoIcon = props => ( + +); + +export default InfoIcon; diff --git a/app/components/UI/FiatOrders/components/ModalHandler.js b/app/components/UI/FiatOrders/components/ModalHandler.js new file mode 100644 index 00000000000..417697a090c --- /dev/null +++ b/app/components/UI/FiatOrders/components/ModalHandler.js @@ -0,0 +1,17 @@ +import { useState } from 'react'; + +function ModalHandler({ children }) { + const [isVisible, setVisible] = useState(false); + + const showModal = () => setVisible(true); + const hideModal = () => setVisible(true); + const toggleModal = () => setVisible(!isVisible); + + if (typeof children === 'function') { + return children({ isVisible, toggleModal, showModal, hideModal }); + } + + return children; +} + +export default ModalHandler; diff --git a/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js b/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js new file mode 100644 index 00000000000..d8b0e3d92b2 --- /dev/null +++ b/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js @@ -0,0 +1,108 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { StyleSheet, View, TouchableOpacity } from 'react-native'; +import Modal from 'react-native-modal'; +import IonicIcon from 'react-native-vector-icons/Ionicons'; +import Title from '../Title'; + +import { colors } from '../../../../../styles/common'; +import StyledButton from '../../../StyledButton'; + +const styles = StyleSheet.create({ + modalView: { + backgroundColor: colors.white, + justifyContent: 'center', + alignItems: 'center', + borderRadius: 10, + shadowColor: colors.black, + shadowOffset: { + width: 0, + height: 5 + }, + shadowOpacity: 0.36, + shadowRadius: 6.68, + elevation: 11 + }, + + modal: { + margin: 0, + width: '100%', + padding: 25 + }, + title: { + width: '100%', + paddingVertical: 15, + paddingHorizontal: 20, + paddingBottom: 5, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between' + }, + closeIcon: { + color: colors.black + }, + body: { + borderColor: colors.red, + borderWidth: 0, + width: '100%', + + paddingVertical: 5, + paddingHorizontal: 20 + }, + action: { + width: '100%', + alignItems: 'center', + marginTop: 15, + paddingVertical: 15, + paddingHorizontal: 20, + borderTopWidth: 1, + borderTopColor: colors.grey100 + }, + button: { + width: '50%' + } +}); + +const CloseIcon = props => ; + +const PaymentMethodModal = ({ isVisible, title, dismiss, children }) => ( + + + + {title} + + + + + {children} + + + Close + + + + +); + +PaymentMethodModal.propTypes = { + isVisible: PropTypes.bool, + title: PropTypes.string.isRequired, + dismiss: PropTypes.func, + children: PropTypes.node +}; + +PaymentMethodModal.defaultProps = { + isVisible: false, + dismiss: undefined, + children: undefined +}; + +export default PaymentMethodModal; diff --git a/app/components/UI/FiatOrders/components/PaymentMethod/index.js b/app/components/UI/FiatOrders/components/PaymentMethod/index.js new file mode 100644 index 00000000000..9eb07455b83 --- /dev/null +++ b/app/components/UI/FiatOrders/components/PaymentMethod/index.js @@ -0,0 +1,93 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { TouchableOpacity, View, StyleSheet } from 'react-native'; +import { colors, fontStyles } from '../../../../../styles/common'; + +import Text from '../Text'; +import InfoIcon from '../InfoIcon'; +import Modal from './Modal'; + +const style = StyleSheet.create({ + container: { + borderWidth: 1, + borderRadius: 8, + borderColor: colors.blue, + paddingVertical: 15, + paddingHorizontal: 20, + marginHorizontal: 25, + marginVertical: 12, + flexDirection: 'row' + }, + badgeWrapper: { + position: 'absolute', + alignItems: 'center', + top: -14, + left: 0, + right: 0 + }, + badge: { + fontSize: 12, + paddingVertical: 4, + paddingHorizontal: 8, + backgroundColor: colors.blue, + color: colors.white, + margin: 0, + borderRadius: 12, + overflow: 'hidden', + ...fontStyles.bold + }, + details: { + flex: 4 + }, + terms: { + flex: 3, + alignItems: 'flex-end', + justifyContent: 'space-between' + }, + infoIconLine: { + alignItems: 'center', + flexDirection: 'row', + justifyContent: 'flex-end' + }, + infoIcon: { + marginLeft: 2 + } +}); + +const PaymentMethod = ({ onPress, ...props }) => ( + +); + +PaymentMethod.propTypes = { + onPress: PropTypes.func, + children: PropTypes.node +}; + +PaymentMethod.defaultProps = { + onPress: undefined, + children: undefined +}; + +const Badge = props => ( + + + +); + +const Details = props => ; +const Terms = props => ; +const InfoIconLine = props => ; + +const PaymentMethodInfoIcon = props => ( + + + +); + +PaymentMethod.Badge = Badge; +PaymentMethod.Details = Details; +PaymentMethod.Terms = Terms; +PaymentMethod.InfoIconLine = InfoIconLine; +PaymentMethod.InfoIcon = PaymentMethodInfoIcon; +PaymentMethod.Modal = Modal; +export default PaymentMethod; diff --git a/app/components/UI/FiatOrders/components/ScreenView.js b/app/components/UI/FiatOrders/components/ScreenView.js new file mode 100644 index 00000000000..72adb4d8ca5 --- /dev/null +++ b/app/components/UI/FiatOrders/components/ScreenView.js @@ -0,0 +1,19 @@ +import React from 'react'; +import { SafeAreaView, StyleSheet } from 'react-native'; +import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; +import { colors } from '../../../../styles/common'; + +const styles = StyleSheet.create({ + wrapper: { + backgroundColor: colors.white, + flex: 1 + } +}); + +const ScreenView = props => ( + + + +); + +export default ScreenView; diff --git a/app/components/UI/FiatOrders/components/SubHeader.js b/app/components/UI/FiatOrders/components/SubHeader.js new file mode 100644 index 00000000000..e39e3824210 --- /dev/null +++ b/app/components/UI/FiatOrders/components/SubHeader.js @@ -0,0 +1,6 @@ +import React from 'react'; +import Text from './Text'; + +const SubHeader = props => ; + +export default SubHeader; diff --git a/app/components/UI/FiatOrders/components/Text.js b/app/components/UI/FiatOrders/components/Text.js new file mode 100644 index 00000000000..f2f3706f250 --- /dev/null +++ b/app/components/UI/FiatOrders/components/Text.js @@ -0,0 +1,97 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Text as RNText, StyleSheet } from 'react-native'; +import { fontStyles, colors } from '../../../../styles/common'; + +const style = StyleSheet.create({ + text: { + ...fontStyles.normal, + color: colors.grey500, + marginBottom: 2, + marginTop: 2, + fontSize: 14 + }, + centered: { + textAlign: 'center' + }, + right: { + textAlign: 'right' + }, + bold: fontStyles.bold, + subHeader: { + margin: 5 + }, + small: { + fontSize: 12 + }, + disclaimer: { + fontStyle: 'italic', + letterSpacing: 0.15 + }, + modal: { + color: colors.fontPrimary, + fontSize: 16, + lineHeight: 30 + }, + link: { + color: colors.blue + } +}); + +const Text = ({ + reset, + centered, + right, + subHeader, + bold, + small, + modal, + disclaimer, + link, + style: externalStyle, + ...props +}) => ( + +); + +Text.defaultProps = { + reset: false, + centered: false, + right: false, + subHeader: false, + bold: false, + disclaimer: false, + modal: false, + small: false, + link: false, + style: undefined +}; + +Text.propTypes = { + reset: PropTypes.bool, + centered: PropTypes.bool, + right: PropTypes.bool, + subHeader: PropTypes.bool, + bold: PropTypes.bool, + disclaimer: PropTypes.bool, + modal: PropTypes.bool, + small: PropTypes.bool, + link: PropTypes.bool, + style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]) +}; + +export default Text; diff --git a/app/components/UI/FiatOrders/components/Title.js b/app/components/UI/FiatOrders/components/Title.js new file mode 100644 index 00000000000..f613847cd6a --- /dev/null +++ b/app/components/UI/FiatOrders/components/Title.js @@ -0,0 +1,36 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Text, StyleSheet } from 'react-native'; +import { fontStyles } from '../../../../styles/common'; + +const style = StyleSheet.create({ + text: { + fontSize: 18, + marginTop: 3, + marginBottom: 3, + ...fontStyles.bold + }, + centered: { + textAlign: 'center' + }, + hero: { + fontSize: 22, + margin: 5 + } +}); + +const Title = ({ centered, hero, ...props }) => ( + +); + +Title.defaultProps = { + centered: false, + hero: false +}; + +Title.propTypes = { + centered: PropTypes.bool, + hero: PropTypes.bool +}; + +export default Title; diff --git a/app/components/UI/FiatOrders/hooks/useInterval.js b/app/components/UI/FiatOrders/hooks/useInterval.js new file mode 100644 index 00000000000..1f7c2cb475b --- /dev/null +++ b/app/components/UI/FiatOrders/hooks/useInterval.js @@ -0,0 +1,24 @@ +import { useRef, useEffect } from 'react'; + +function useInterval(callback, delay) { + const savedCallback = useRef(); + + // Remember the latest function. + useEffect(() => { + savedCallback.current = callback; + }, [callback]); + + // Set up the interval. + useEffect(() => { + function tick() { + savedCallback.current(); + } + if (delay !== null) { + const id = setInterval(tick, delay); + + return () => clearInterval(id); + } + }, [delay]); +} + +export default useInterval; diff --git a/app/components/UI/FiatOrders/images/ApplePayLogo.png b/app/components/UI/FiatOrders/images/ApplePayLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb4621b6398f6760e7c79605e3dbb8ecbe853e6 GIT binary patch literal 606 zcmV-k0-^nhP)jK~#7F%~tJE z!axwcI2HgE7%C7eFxY@tL81*P6_5&q3J6vJ6$l-~3J4Vl6|nA-cVs=u$Bg;Gn|Y(R zx7mBQx4VNeB_JZ7xnf4<5&?l3GIrwF7dS`^(-xekt-`WSB=)A*lV{fnSTIw2 zY500b#LP*8QArwJu}u#0Ywof&`7<`b9)CS%kD017WKT*$4!7~d9>H$Zw;^~`yrX(d zwTg=8?x^Puna}Wh$G)(KGrzHZg3nCF@!+$OwKPtXPTZH+?;W9!$V|o!_W@gSN{{D> zfGy(Pz`VwK$b1pu_+NA_tm=&FvC_(@d;}eR31bVHk|tc>oQ#T>JE*Kpk^KPcIqBwu zp$W!kM9vXd*r&h6AHy$$kXOn}V5dY12k@Ifr1)=iRsw1c-w_#`65y~D8Sx$aNu;u6 zl-KD1-<%rtitA*Jx~RjvX0TVmN5&-6(nM|_NFhoMcd;*6{`RP!l^Hb{=1xrE$ceF| zVpbj;->&lgEDI_^ZQXRRj_lg;mHLx<3rq!Ycpq^S%EywuWbF9r@(9hPfr|Ml*ig$q sQ2qs#>4b{W6q`!|MBbrZQ{B-TKU@FTYorzgX8-^I07*qoM6N<$f`t4JtpET3 literal 0 HcmV?d00001 diff --git a/app/components/UI/FiatOrders/images/ApplePayLogo@2x.png b/app/components/UI/FiatOrders/images/ApplePayLogo@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2d93bbea3b2e5c2c60692b1f35faa0cd7b91a9c7 GIT binary patch literal 1201 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 SLTU#90000O|^6Y literal 0 HcmV?d00001 diff --git a/app/components/UI/FiatOrders/images/ApplePayMark@2x.png b/app/components/UI/FiatOrders/images/ApplePayMark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0aa16c13dceb638851245f0d66bb3e517b0828 GIT binary patch literal 1854 zcmaKt`#%$k8^^ab!pyC;9ggB)C$%A>r5kpPjanGTt!XTzSi{1;aydnD8c89Sl;mEM z&T%Wt+{cc~*<7OBCR>VyLT0|5oqyo`@Oj?P=XpIpJU=|I=Sg=XIz!d;)Bpeglz?~i zP>`;WlZvt;!aB6J6i}t(eWL*YIPzZs2_7cPiXt%D!x;-;59lu_3^>%`v;zQ8cN-!P zR005$g#`zbzZlzh+|H3}-Z4D<-t@NXKH{0yK1 z;|c(}CyIFzrz7c9KB4H$pe<-$9o4y3Ix><|1oJe*kw+Q%!)2ak#RDXEE|n~;e%pFq zI8Vy^-GWRGsPSa8hr%*N{S@}usap8k%>)~^q74fOng z7HKGhVf{f=Ex(>zDpoqPK{ACsNk)Rv%KlTbs17bSd0ZX*_5BYPlz|nHSpPpzl&SJ< zZLKUOHg-fVZ&`gZcX=d)NF)x+WdAdKyzfNB?kptG)zx*DYH22biBS)Wi-VT$H%^YDcj^BR=xBy? z1&`A{DQ1geFg!Qqa`lbo=4MqF{cyy@ViSkMIVWX=hE@n5c*Mt3_9-RT7!XYqD`L-| zDLEMz7O5Mlu=PvB-t`9z>E=xJF(CvGe9+|f4sPDJS8w_L>)QhL^^(?!>FL-}j9_pz zQT+1TVEw2+x9buNE@+>bp*+9LS;NM(>V=ZE#|%HI<`s`Vt9W7m)X9%Lajgt@rxWA= z89KO{v8o@_Mt#$>Ete0+Wn)W*z7`yD!VDBpvxi>^O|AP@v$2=P63U_orK9~=ab2Bd znNs*S-RIWbwS|R+v(f0!cd35l+K(SUy4cJ~rEKv^XJ?9wYY^l~*M8^Rv2fp36vVn` z9R8#_!9-GG7b3sVn%Q+BPyh8sPmgo|r|s=+XzjdA_A(^tfy+~qHeapMo1g*kz1_QT zI>0ckb>=B!?HnywM0#LKxc&JPXRA;;wfs*P-#eAQ+joblQ`GEs^s09g9eKFPDP0xM z*i$JK3YVGhX2-|JEn@j!SeW3W17NIpP2rbqrp99K=xpkZIaFJiRe>4#SuwWU@@x4E zhLPr$y*rFq4Y`lrO;2N3hD()Ri8P}S=F+;&cvH`?<*olA3=*_LE0_%KHb?)TDY3q z*w{E@D^z*HXSJsVf*sL%aJacPCRAAzld7Zvh3@xW2Ks9s)bNCDQ#hRfqo2^bi_4GM ztE2yJxjCt+R|5veZrYMmc}0b&=am^5(6Z?Jb?ZG5xaPw&NJU^|M24Sj`qIL}LV5e& zDvOKh(8oiq1&`7PjV4W}a7H@}5GH$_v|>=s9V(=c^Nx2jca%P-d1)N7H+fsCvtm`@ zce&EACoZamx9pIKyCN#hhKF{jpt)--OhRv4+i!h3)Sr}%etqn2h4ML_9gnQqNkY8L z{H5kl0*X?_me`Xj1d9U`N^CMKr7s~dQNw^#RZ~*~-MGE$;5ZeV*|s#%^K$R!a=2T= zaYPeqNEBo=X!^XkNxL?J40ewCMnS(r5_3H}p~pqZD83Flb@nz8LOrEx6Z76rg&{I} z1)Iu~a?=Kxp&=oja1)In6ZbYjoYttdz`xlSaRt=05I_7jTVfuXin`)bBrP z#cndXtIN#lo%q$2!?eHd3UrX1q+$-_f1~|O;dIxvw49B^h13Y>y6Zv6vuf9a#hY|O z_}gY&H-jw!7COAIy1DC0sHB<39wVk|csR3FRpi7+ zqzObfmVD8;tg&{R!i~n-S0m9vJi+A$JbK9IY)Mbe#o*x7{@*u+xv88akb86r`%{B4 zB>p>$wQ=XX{o0S<3#>(#hiO(}dnMEi_n z=u2~(IzGoa*K_g1i+^CgU^b02O!{xj%+OD+CPH?e}w=5 literal 0 HcmV?d00001 diff --git a/app/components/UI/FiatOrders/images/ApplePayMark@3x.png b/app/components/UI/FiatOrders/images/ApplePayMark@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b3618ba58d8135628296cd3a2e1b7e18606efb79 GIT binary patch literal 2652 zcmb7G`8N~{7an6DiEPswlYK0SWE~nAjG0lECS}Q*A|w0Q${sPc`ZOel#+GHsZY;f% zZA|IqWnN1)h6ocGMb<)}_aFGq`F?orJ@?-8oO92)=Q+Ld6I2^__jzwcBYCE*aXOE>_aX#6jDkome^M@^n^EXo4#azt+VsNnNM*dhRcrbi|b&M6lF`9>4%yN;%h^H2@2|bZO0W~iL9&zE_ zjdptl2>>avEl!}V-M+A$j9^U$8nX-?Qt*Cd ztl`ylG_~c!EaDj6bTn{iFu##Y0q`1+b6po_UD_w^f>#oP-J5(5;7qOqtgfMfG8f_u zKQ6$FL_0yBU?yk@zh4Fg1ywv<{bJZ|bZor-9tSshlT=btVkb;^dw3XMX%I1$>v4v` zmVd8vGTZu}uV24vC~725l3}QdD)FVl+wfr9n#j+yv^a{JiDFG6C1Llw_u|j9hKCN+ zCJu=jJc}i%z(z@tJ8MgDX9s+i^%C;qw5CN^Q&W?76e-6WA-MFK%MC=L?MRo$CLu}8 zwkOja))K&CN-j_}Rd?6&1ooViy2dFGQA(8GCgUMc6=|82TUKh08FL_4+);PH>i>^% zzAJeIWWFKWj0Zv&s^(zU>?-jYFq34Fx9@kDZ$la+iWxk=2GxHFR$w(wKMzDiLS zm2~jf?9vUozih>9$_t%V4Pjo+C@g-Nuhs|E&@=t;i6{?(Xxyv#O;_}rNNI4=ywV0& z@=|Tu97z9JCW+Q z9=37C-~Gd4KL_CPV?W4^e6X2Mpst@=}DJF>-_90 z#&i-#vPHG3_y*Ev6Zdrnf-aW*!}h%u}-`Cg*9!`s2gDv|l(vM(@Oo%7rV1yV$#B6*zK#4F}Z` zrn-NDL}a^u(_$%`2hnE>&v@vKsjATO&<1!}Te9s<677wyBCp!%{1$BjcMunMOyN_w zrQmrlu3OUle#)`a=r#DQb|+7*iLy@QX2g}AgNYb`Uax9J3lA0Y018&NQm2>g7DoW- z{0fjXJZJ);{ z5ZEQf@e}oR!f)DtDs^S{Ha5c6y0R+`uXkN?do-T6u(a+@o9V#+N68Hx7+aQ2_W_Y? zE*#D<@ZH*?K5W}<9zAm5$mE8BT(JDfZ%=)5_eNmx4_0DIEQBzOdG-Px6kAhL&~vlQ zDKlD6m??@a;$IR?}m?K&zx&>&Y%5{$1-dv7^J)O1?+OFG_`0jqL zgIp*_X@`0G^S$Yac|i0SGN2lEnTMK(X?NN_YZ2k`S0O-)#h#qTJ$Os#DmbC+*_7o* z!Iq0i2@V*QLk&Cqj4 zTIx&`R*i8Pt9z}8%QQEPK3@MW_msa~jg;>~3F~p|zS7G99Zy>8={aGZC;B#cu3^EV zqaTm$M^tS|+U(K|<#8gi*eTX&t&;Wj>x22BRMmP(jS@?}sEwZT57&22*DY#Pu7p7v z<4b+E4UHoMXE;7%63@JPhGX9j!>qgCU!7u>d5@a8>4^Qzt~ z^)J5S7ZS`%0w6qpk2vnlE}R+Rta()ezg_`+35i)^TF0gJ@(@^|$W_&+{b zc}8Qc)%#c%&bieOGz&@PhOF3TU%7DXTJutl{5t?G z{=oHYg_4T2_zQQ$y}=g*1jkoWC;D(dW?b`4%6oHCHI9@1!<@SJFe%7ssIz|N@bGZ+ zNUJ}r(X*enGb~d7%zOsTbFYu6W)WJrBcPt!&iv>h#yA_b2l<;D6++E!+8l78hUd*K zHQc?s(ypWLD3egzeHq`M9X1+z-srylRmq|{6Tz;7de-ahL6ddS@%qBw&kp`HyYHqN p9XjZJ{=OWAb>YH_c?Rw9Vi{YVrqdZ}bo2}YFi1PAmlj^h{{=g>2rU2r literal 0 HcmV?d00001 diff --git a/app/components/UI/FiatOrders/images/TransakLogo.png b/app/components/UI/FiatOrders/images/TransakLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..84242afac8bf421e1be8e8fc2179708ae4e6330e GIT binary patch literal 2408 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 arT+oQbplq^uaaf}0000#pNh)z!cH)wh0C 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 literal 0 HcmV?d00001 diff --git a/app/components/UI/FiatOrders/images/TransakLogo@3x.png b/app/components/UI/FiatOrders/images/TransakLogo@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..117606fd4a6482bf79cebbc64c404acd6f02966d GIT binary patch literal 10691 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 literal 0 HcmV?d00001 diff --git a/app/components/UI/FiatOrders/images/WyreLogo.png b/app/components/UI/FiatOrders/images/WyreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..959537a4b7fb836bcbbed9acdf5d674fd29461ca GIT binary patch literal 1112 zcmV-e1gHCnP)Ss zA#*x(3`geX+#oDYvk<8TS~_`DP*Ai~Z7Z}w@A2G&RIcR@H5z_5H|Kla^Sj@79vp6h z5Mrc5gtpg-Wm|a|&(EB2Av}oc6&!?T8err&PA&)%v7I2V6e6MmR2lqq5fwp1_GC8? zO}EEwAq1;Zrk|()5!s#f?xbY=1*|D(L|Xm{XwKP1zBL6O+&jQuc+FOMd{fXyflQJWxJt%zX;oQRUkF?^IidJK0NCC-(hA+{luP2ApcYj9x_)l%Z0Q&opGFK0T8^Dk?$KzyG1N z-GI9KKk#ScF{CCxgYeK0G`F-u)24^h$>XyfWr&GZAn4&aIB@89R94sENJA4sf`cHF z`QpXww_q}vvAJ*^TD0v@t>5IDZ^ndB`4@+=G4T@i7`4FDZh|c-9>p1R+*YkjCd2jX zqu5KUNq8Re@CCSX)q?N$*Wz(y0@6|z2^$xI0sgE)A}Ik! zf2pQ%z=q8wFqy9)oqnh4$Dd)bUBgq#cxak_6<0Rcm*9&$9xulYV76HcA9D-*FErv> zv>e0n(dcW^W7lpyj<=a^k@fRoWVdcF!<%npK_L%Ex3Leu9cjecw{u-_&(R8Zb{X;I zSKlIk^$J9Ug`!Po08e-%#x9)bAA%7j?@qYZfM(KzH}y~MgS8KSVy!F*i66Qko;^g#~Ih`8WxBc!$krQS0m&3WE6d}9g#_?*z$QPri5@QG@KhFS@q-ZtaW|FbL|=8 zn|YiBCDssCYDh>DbB)YOUl1vj!b2ak@S$(JjKFnUrf eRoorX2Z0;sm({KHU-kt60000*P) zR96-~-E`9nvTurj8=Gt*;7+-KisJ&tI7Y@eNJfccbTm%1G&7dgSe9cYF;hmJF|HVc zQOCrLiKH^d(YQn>aYMxgK^6%j8bF}gy8F+4uj$|2bknpo6_cuXx?c6$|9j`&ckg}w zOV9y=Anc*PO!K;0jTUPT2*^Dtpt{Bxok6Y8p(00shgybT7NhOKhzO%;Ye~F~pM3*e=J*g*BRp=5D0a;^t2G0RV?KKMY+x)ozM=&Zzi=kn1 zJcj{xiM?E`Lw=ECM|xy^8;NC$=ZkG09{dFNzpvu?ZZ2xP zHg7hJ0{-amQG9yr-#kA)ISE;_X5jtZxj1>|Jebi^Dx9%v%Ud8X&HJ#r)$2B*u(*Vm zQ)$c`8dF>M1lwpFLu7bAB##<_ZM$-D<$3{RPBKhSOU1<06md=8T)2p@PM~BUhWerT)J|N*T1uQhuELh zKmMUcobUS0JG_q17spTWepL@2TDEmaDQOu( z<%5U2I`U|fYMr1*&T%OmfxM{_vbK7$+~Vm8*W_qS3$gFWJlx$(V_I9q{O;VtsH->4 z*QV2=rKJ^0r2-#(^f7MUDdP1bh9n>^Hj3w?`-fW0eV4RqaAF)cXX`g^<^N1`v**l2 z@8Ce*=gN&+V*jsBokI<2un|$=AzT}4>*_FO(oEbbF5~rH9&UIwYZgk%?qffl9EMY8 zzr`D?)}bS85_{sB76oOFIW1K~iI~?r%Tb>^44JVqD5dr-uBVrWm}kV%?onD^f$i}2>+$7@Gk9E6 z!`se(d(~=xR_xKS!`3{O>sn(a+D0ffm4?OA9_xlCK<=)3`S0gQ$L711Sk5JfttzP6DU8W6O=41QQ<|d9$7Uv4+-W`EG{E388PFmUh zO8)=$d+&3y*-Bnt@Cy9>d_-c4@0E$;qas3)yK|E$D2AryX8e7}2Vyy6MjFCG`p{Y$ z$)@iYNoAP*QaaXLIcc#!EB4ObX~kz39B^7BwQe;`>H_~Y#1BAQpCF71)+5ZLYoU00 zx{G;6EL-S%+j4k0Z9)o?h9w#rnZTaZ^Ud%gZGP#(x!g1u!Rn&=hl}O>8wI#cLfLoV z2rmZ^>5Jyifl=6%52|p7%!LszOd4lFD#O+M8z}$&fmq(YXFps6BH`I94$IeU5bMW{ z9*)&3mY^f77+8O}6`rno_ z@AC2X<{coH$J^doyOKGpX0?mZG_n>aRU_#mtGRX%*wp+-OKQjXzCz0PW|Kz68+LKRIy3@1sVX~Kex&n=9AUoTJW z+&COzewNo_CD}v?r(J^D+B$6b+csXGG&B*TlZN5a)dF!toBpu}TCL&v^D{G`QYx+1 z656k~n6Id;!d`N8yuME`UQGLyMc*rI?)F7GNth`Jvzkv!PSXfR{??6uK@gG2LdswY zwZcO}AhBcZtcZ1zS}JiVDN)hHiLhle1!o#AHJJ_7?PAo`nXbSt?n+F}8iann)LRw)h6cyP> zW+#oFoFSgVr>T?1^SrxRIA+AW%$Lx+R}gF=kj#;bT8T!DX}&Q@L&?dFw&=$lS80V< z4k3+}*if1gWaHza`_qNtCLgnW)p}G^RFdr<#3P1_6ji9`)Md~44Q# zTD}OKt_OB-j9$W2H98O>kRwnR6pF<@1A8KROa#Kb1h~j;KY~fy$IFYfOwCi@-oePs zcu{Qk_4Velqp^KL%1A`pu!ZJep_&otr1^v6W3Bp>mfwd?Z*r!geS38}-{AN-e44ur zNpu+j%-`|}T#(Ubkw`~aodM$)1m;%89@gSSi468)QfY$*>I;{kzHf+Uy?VG}^3r4| zRL+PJ6_ z<=~(I$mLzV?iBdN;pVNo6vt}#sY)cFdGkvSUz6is5a`1JmJ9?I4>U=)`cWfRth+{` zN;@H1Eff@%NCZP!?dpt_?BQ@GQUl#|c1ZBDi{^ZR3eSIAs(J8TVy8TS)YbnVi_v+x&(qPgvW+g~N<#H$Z1bZNM zTz_=)a^X!wdKeb;V}cR-&m(yjk9lEADptJyd;HXRst;67!2y`|W>A;?)N%nazK%J) z{|5!P3h4&t#vP5Xwww{NC$tH zpO5DJRB%XRE9gDJ!zL*O+nrPE?;;?O(+W$K?&<0M6h%o+FGr6nu<> zfHQCE@MKdIP!I$LP?mufC|gVE#@a&Lv}uxi=R3DFy*J5Cll15O>P-LsBDv?DbMCq4 z{LlCOzwe|9$bjehCG^i?x%)Pr!=BR?ytmzo@A5RLG5Nt$1n8`|^q~z=A^vE?KMhM2 z3dIsvH`MR}7LLQOa%!<+vljIh?-z1JFAk9g&q>pU9~a(}fGohOo%L9rqoc1%cngJ+ z!`w%0P$)ELL+gOot9YZD!|%5!i2w@tg1Bf4hNZL-pf$lu67bk^#ERmZ%z*ep0v>Zm zb5JXNBTyTD9C$?ni_M1BU-0n3fC$j*Y?w7vL-g^jeH(rpc(odb@~z0dqJ^&*o^C^^ zzRe1>Hh4?|o&@2>z03;uwulM^xq^{Al!`Vh(Awbfij-7Xk+a{Yh*CiJP8JMLYZHX6 z5gxDVhJ99;%zF3)G9D4QhP4~aWD%S#Nqv|BvqnV0sPl}Id1v#nYu|U0vgCwr7&&67 zq|9ow;>4*u*f<-SEEtdYuALDc9tN>hD=95Q&XzC4Lq2&>hK6{|mT zA^^kf+jk__Ma8Aqy!9(d+0Y>akla1qex24cN!kgoK*6uHByxKt>qW3$@u)U!Xw_W}VJ8tN*k&HU^vB0z&6XVzu$Z&qT=lsWij|KD5^ zKo}mi&%acFtY==t@|A0-go7NKwFHcj@9pqCEM(B%yX2x@pt?tQ_;+iE$GWJzlAD2g zXSZabi5250?b@#o9D*xTc( ziQUh4?Zx>EmqpchBEWQXiRol7yINF2uE1o!W^?h??r(AM*a@exc8`z6)QMw-o;V`( z&lmj~>psqb_`TTp(r7L_L`UOP?pc(SmD}&LzSsQmPZ;{(0LZ~D378oyxK)q+r+p`Y zvi>&wER~WnHat^o49qmK^HOXG*Ea9B#0U-waw@Y}EHqv=ArK~O#rx}I`>d|1ZTena zgHLj{N$U1a?SY|#`%BvN>ys|@&GSuV7q1jZ+SS(8;cW*i&^;jz|G`|3qH$4poIITi zI0RZ!0yNxYO`e@S4N8?tDBJS+m)P*<&mbBCf&%n-=QqE=w26;HtJUIM{w4GuHcp~n zib*#tduI*g;C^*!5UW1tNO1VB>I3dwfkHfUggQeIst5FihR&X{61^vwE`V7AX`f6a z(SwBVr_SVJ$Cuy8w!de$1U&YBcbFC>&wh`Y-&YrAL#2|At8+{T7=nWx`l&`~dAa@i z|32N0yz>|B*K85z&&fhyfXIE(TpT!f)FnTs(?VW6u@85P&fx5kUD*DYb(lLlOAv(Y zS-)NRAGU6F&z3ud7pv~4s_N8%%?Wu*UMLnb}Wx}#!yM!>T1*dJHQ_{=1Az& zsY5hIj~wPSrm)aZQr+#~h(-dj2xQfV>qU2X^iJ!6DH9%dYI8d8yi-}vqy+rWJ4?xJ zbPytlcv{Gj!!k+THwf}Qdk^AFuC$$z#`My2*-cNRm)=U&LhOzh48cKoX68i5L3V|$ zr073AVn$(^k6|G}UztaO&}^S%j>477!9N2R!gdsosfh~sDZEcU1rV!Q(uosUn0kvv z==0*`0_@!Lt-U-YsXK-b9fXx1{Lx-^_imLirc<Sy9pF> zozK4v5x;~9AM?m?|1+me5F!OJ zm=0k0Bxfru)+X~BY6wQwq_Hla$w<&UEtSH*z4kJWo^Z9WSXkKi)^3p0AJo4u#*KN{ zsh?{lrMOdZSK2qdPrp8Ckeh2OS-HFm&f>b51mL_^-h>?3`=^qHS@!0u!ko!L_RiYf z^*DUidsm>e)j~%Wz;Nprx#%VnZK4E5t?;4^7#GhYQY+VgV-P8iu+R|6HCyPbMaB4R z$8LLBT$dP3dGc`>3{oLkN&dBn>i%`hPJ0=f{uk%Z7RdmHgkrcK+Kvt4tut3 za+)hg$gXlQDfZ=0GqL3yUltVI!@5m{q{5|xP}rz3JS+!Z{g!6wlp+*#XF~uC&&IqG}CSX~) z&D+01nSEk;sA=J*J~R%eVp2}Iwwx%I?j*ZQM|22xLMfY&woS-;Yo`1q6aE;oBXh!!s`9YR_GZV?hD-Q72C z-=?hIR{M1r5s$^^Y>ZJ65t4|End4P!KNhuCVEUvdNR)MiI~YR^v{=EY5V@fOiunsg zNh5!?AC@k9N%pv096dCGk-!~Pw0SfdX|j$j?)&e)CAbk@NQ*0ll(9Ce=w3j#19JaBS41}5w6s#p%j&@johnKEZ)QTA-oxKRi< zHq?oZY$q87J5wkvzhS@D5m{$XpM>VXCO*AK684h#68Fc81lv&5fp{evK!)u;@I~mF__La6h7*No!=p`v*ufq~k-wWp%&M(K@ zQk6qyR1RKQ0@m@i0uF_hzMmubQ;4PHIfr4>DOzeYQb#1AM?2CBDi25yAWwqvkBt<3 zVlI;2(eHJfzS;#ZU;o#x#g`B<^(a{k^f_S(C zOJL0)ceQ@gUnS}0D$+J1C(Oj~%t3+%Fi><;Q&odAq_=j`0n^k8WAMvY7os_MMFJa{ zpbt*^{=*VdlF(l%a^h`xM*{{=%Ya(RqhEW4NBsu|x+Vdeutl#qyf{73K-S4r?o5J= zUMU#y&|r9qKIuL0AO1=aMtb3?$xlF5C-E#vlrJ1SiOo`6x319oH@~SE`DT)oy!O^F4*EE-i=JLFH=oY7Cy<2f9ElVnaBD z={zG?px!kJGAZYu=peM%4mJb_x~xBo@(5b3=kMgFc3v>0Qh~Qf42BzxZd&rlqaEt# zmr|0M6=?pQnZ;VM>`g4loNt z4j*%R{j{FRlw=y`wjB#yFJ3N`lr;#=WOxcjgm;%M5{|h)+W0B4O>}mCoE!LR?qG#dbma z=t%LHTK;EfUl&_RJo&+>w>sTpAyUO1@lUwWVD{?jp`pxNz}X8>n=O+2(eXy~8r@SM z07(J#j<6IoYk0h$ibHy&@8=Xh7Rs;R#E?;wgfj|u-oS~{y)07d7!`@Nzki!jA}#po zT`PdcB=9Hk<1b^WbN+G(T%ASMpY!)ApbPd#LjTU_Gb$BIbyH`_;T%HzTi-+$TrEN& zSu$7T4AAPa`gcnaL%#Q?ju!k_pb3e?lkr4iqT4!ZjfzsjI{0as$(Oo~zR^mLa@_xH zT%coVM*=V}7et3M8`k~~V@5uN)@HqYL5oRXvhcX24n}y4Z$CkcAVC-t+#3HNg^r1f zONHM9*vPH1EM!DPI7Va+#IIg|9>Kxv?Bb_S0EQNm;D<6B%$#rCuqo`{QTjv8)&m88 z`O0&6Wx*U+>a9>y6c8AwZ^+ZPLaWshw1@;|+99WJ`aU5B4TnS{(*mt?Qkmcj44@>F zr$NY16fM|-JPImoxKZPK7u}5 + order.account === selectedAddress && order.network === network && order.state === FIAT_ORDER_STATES.PENDING + ); // selectedAddress + + // console.log(pendingOrders); + + // useEffect(() => { + // console.log('cdM!'); + // console.log('orders', orders); + // console.log('pending', pendingOrders); + // return () => console.log('cWU!'); + // }, [selectedAddress, network, orders, pendingOrders]); + + useInterval( + async () => { + await Promise.all( + pendingOrders.map(async order => { + const proccesed = await processOrder(order); + // Check if status has changed + dispatch({ type: 'FIAT_UPDATE_ORDER', payload: proccesed }); + // dispatch(showTransactionNotification({})); + }) + ); + }, + pendingOrders.length ? 2000 : null + ); + + const onPressAdd = useCallback(() => createFakeOrder(selectedAddress, network), [ + createFakeOrder, + selectedAddress, + network + ]); + + return ( + + Add;Clear; + network:{network} + + ); +} + +FiatOrders.propTypes = { + orders: PropTypes.array, + selectedAddress: PropTypes.string, + network: PropTypes.string, + createFakeOrder: PropTypes.func, + clearOrders: PropTypes.func, + dispatch: PropTypes.func +}; + +const mapStateToProps = state => ({ + orders: state.fiatOrders.orders, + selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, + network: state.engine.backgroundState.NetworkController.network +}); + +const mapDispatchToProps = (dispatch, ownProps) => ({ + createFakeOrder: (address, network) => + dispatch({ + type: 'FIAT_ADD_ORDER', + payload: createPendingOrder( + Math.random(), + FIAT_ORDER_PROVIDERS.TRANSAK, + 0.3, + 1, + 'USD', + address, + network, + {} + ) + }), + clearOrders: () => dispatch({ type: 'FIAT_RESET' }), + dispatch +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(FiatOrders); diff --git a/app/components/UI/FiatOrders/orderProcessor/index.js b/app/components/UI/FiatOrders/orderProcessor/index.js new file mode 100644 index 00000000000..d5bb038e64b --- /dev/null +++ b/app/components/UI/FiatOrders/orderProcessor/index.js @@ -0,0 +1,19 @@ +import { FIAT_ORDER_PROVIDERS } from '../../../../reducers/fiatOrders'; +import { processWyreApplePayOrder } from './wyreApplePay'; +import { processTransakOrder } from './transak'; + +function processOrder(order) { + switch (order.provider) { + case FIAT_ORDER_PROVIDERS.WYRE_APPLE_PAY: { + return processWyreApplePayOrder(order); + } + case FIAT_ORDER_PROVIDERS.TRANSAK: { + return processTransakOrder(order); + } + default: { + return order; + } + } +} + +export default processOrder; diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js new file mode 100644 index 00000000000..4ee649e4196 --- /dev/null +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -0,0 +1,185 @@ +import { useMemo } from 'react'; +import axios from 'axios'; +import qs from 'query-string'; +import { + TRANSAK_URL, + TRANSAK_URL_STAGING, + TRANSAK_API_URL_STAGING, + TRANSAK_API_URL_PRODUCTION, + TRANSAK_API_KEY_STAGING, + TRANSAK_API_KEY_PRODUCTION +} from 'react-native-dotenv'; +import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; +// import Logger from '../../../../util/Logger'; + +//* typedefs + +/** + * @typedef {import('../../../../reducers/fiatOrders').FiatOrder} FiatOrder + */ + +/** + * @typedef TransakOrder + * @type {object} + * @property {} orderId + * @property {} fiatCurrency + * @property {} cryptocurrency + * @property {} fiatAmount + * @property {} cryptoAmount + * @property {} isBuyOrSell + * @property {} status + * @property {} walletAddress + * @property {} totalFee + * @property {} partnerCustomerId + * @property {} partnerOrderId + */ + +//* Constants + +const isDevelopment = process.env.NODE_ENV !== 'production'; + +export const TRANSAK_REDIRECT_URL = 'https://metamask.io/'; + +const TRANSAK_API_BASE_URL = `${isDevelopment ? TRANSAK_API_URL_STAGING : TRANSAK_API_URL_PRODUCTION}api/v1/`; +const TRANSAK_API_KEY = isDevelopment ? TRANSAK_API_KEY_STAGING : TRANSAK_API_KEY_PRODUCTION; + +/** + * @enum {string} + */ +export const TRANSAK_ORDER_STATES = { + AWAITING_PAYMENT_FROM_USER: 'AWAITING_PAYMENT_FROM_USER', + PAYMENT_DONE_MARKED_BY_USER: 'PAYMENT_DONE_MARKED_BY_USER', + PENDING_DELIVERY_FROM_TRANSAK: 'PENDING_DELIVERY_FROM_TRANSAK', + COMPLETED: 'COMPLETED', + CANCELLED: 'CANCELLED' +}; + +//* API + +const transakApi = axios.create({ + baseURL: TRANSAK_API_BASE_URL +}); + +/* eslint-disable no-unused-vars */ +const getPartnerStatus = () => transakApi.get(`partners/${TRANSAK_API_KEY}`); +const getOrderStatus = orderId => transakApi.get(`orders/${orderId}`); +/* eslint-enable no-unused-vars */ + +//* Helpers + +/** + * Transforms a Transak order state into a fiat order state + * @param {TRANSAK_ORDER_STATES} transakOrderState + */ +const transakOrderStateToFiatOrderState = transakOrderState => { + switch (transakOrderState) { + case TRANSAK_ORDER_STATES.AWAITING_PAYMENT_FROM_USER: + case TRANSAK_ORDER_STATES.PAYMENT_DONE_MARKED_BY_USER: + case TRANSAK_ORDER_STATES.PENDING_DELIVERY_FROM_TRANSAK: { + return FIAT_ORDER_STATES.PENDING; + } + case TRANSAK_ORDER_STATES.COMPLETED: { + return FIAT_ORDER_STATES.COMPLETED; + } + case TRANSAK_ORDER_STATES.CANCELLED: { + return FIAT_ORDER_STATES.CANCELLED; + } + default: { + return FIAT_ORDER_STATES.PENDING; + } + } +}; + +/** + * Transforms Transak order object into a Fiat order object used in the state. + * @param {TransakOrder} transakOrder Transak order object + * @returns {FiatOrder} Fiat order object to store in the state + */ +const transakOrderToFiatOrder = transakOrder => ({ + id: transakOrder.orderId, + provider: FIAT_ORDER_PROVIDERS.TRANSAK, + amount: transakOrder.fiatAmount, + fee: transakOrder.totalFee, + currency: transakOrder.fiatCurrency, + state: transakOrderStateToFiatOrderState(transakOrder), + account: transakOrder.walletAddress, + data: transakOrder +}); + +//* Handlers + +/** + * Function to handle Transak flow redirect after order creation + * @param {String} url Custom URL with query params transak flow redirected to. + * Query parameters are: `orderId`, `fiatCurrency`, `cryptocurrency`, `fiatAmount`, + * `cryptoAmount`, `isBuyOrSell`, `status`, `walletAddress`, + * `totalFee`, `partnerCustomerId`, `partnerOrderId`. + * @param {String} network Current network selected in the app + */ +export const handleTransakRedirect = (url, network) => { + // Order created from Transak flow, needs to be added to the polling. + const data = qs.parse(url.split(TRANSAK_REDIRECT_URL)[1]); + /* const actualOrder = { + cryptoAmount: '0.18065827', + cryptocurrency: 'ETH', + fiatAmount: '35', + fiatCurrency: 'GBP', + isBuyOrSell: 'BUY', + orderId: '11aaf266-4ee9-4cdb-8dbf-420a8f4f2193', + status: 'PENDING_DELIVERY_FROM_TRANSAK', + totalFeeInFiat: '1.37', + walletAddress: '0x33C04960375BBB2373e9Dd28C17CE125B08EC74f' + };*/ + const order = { ...transakOrderToFiatOrder(data), network }; + + // TODO: add to fiatOrder state +}; + +// handleTransakRedirect( +// 'https://metamask.io/?orderId=%22071c9aa3-e03a-4e88-afba-c108d05c3ec4%22&fiatCurrency=%22USD%22&cryptocurrency=%22ETH%22&fiatAmount=35&cryptoAmount=0.1369118&isBuyOrSell=%22BUY%22&status=%22PROCESSING%22&walletAddress=%220x33C04960375BBB2373e9Dd28C17CE125B08EC74f%22&totalFee=undefined' +// ); + +/** + * Function used to poll and update the order + * @param {FiatOrder} order Order coming from the state + * @param {TransakOrder} order.data Original Transak order + * @returns {FiatOrder} Fiat order to update in the state + */ +export async function processTransakOrder(order) { + console.log('processTransakOrder'); + // try { + // const { data } = await getOrderStatus(order.id); + // /* TODO: Check order status and update order object. */ + // console.log({ data }); + // } catch (error) { + // console.error(error); + // } + + // Return updated order + return order; +} + +//* Hooks + +export const useTransakFlowURL = address => { + const params = useMemo( + () => + qs.stringify({ + apiKey: TRANSAK_API_KEY, + // cryptoCurrencyCode: 'ETH', + themeColor: '037dd6', + // fiatCurrency: 'USD', + walletAddressesData: JSON.stringify({ + networks: { + erc20: { address } + }, + coins: { + DAI: { address } + } + }), + redirectURL: TRANSAK_REDIRECT_URL + }), + [address] + ); + return `${isDevelopment ? TRANSAK_URL_STAGING : TRANSAK_URL}?${params}`; +}; diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js new file mode 100644 index 00000000000..a7b1d75f2f5 --- /dev/null +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -0,0 +1,35 @@ +import { WYRE_API_ENDPOINT, WYRE_API_ENDPOINT_TEST } from 'react-native-dotenv'; +import { useCallback } from 'react'; + +// { +// id: // Orders are identified by (provider, id) +// provider: FIAT_PROVIDER, +// amount: 0.343 +// fee: 0.3, +// currency: "USD" +// state: FIAT_ORDER_STATE +// account: +// network: +// txHash: +// data: +// } + +export function processWyreApplePayOrder(order) { + console.log('processWyreApplePayOrder'); + + // Once the transferId is returned it means order was accepted and the transfer (blockchain transaction) is in progress. To track its progress please check the transfer tracking documentation here https://docs.sendwyre.com/v3/docs/track-wallet-order + + return order; +} + +export function useWyreTerms(navigation) { + const handleWyreTerms = useCallback( + () => + navigation.navigate('Webview', { + url: 'https://www.sendwyre.com/user-agreement/', + title: 'Wyre User Agreement' + }), + [navigation] + ); + return handleWyreTerms; +} diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 700752650f3..8b5f4f96ab8 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -812,3 +812,71 @@ export function getWebviewNavbar(navigation) { ) }; } + +export function getPaymentSelectorMethodNavbar(title, navigation) { + const rightAction = navigation.dismiss; + + return { + title, + headerTitleStyle: { + fontSize: 20, + color: colors.fontPrimary, + ...fontStyles.normal + }, + headerRight: ( + // eslint-disable-next-line react/jsx-no-bind + + Cancel + + ), + headerLeft: + }; +} + +export function getPaymentMethodApplePayNavbar(title, navigation) { + const rightAction = navigation.dismiss; + + return { + title, + headerTitleStyle: { + fontSize: 20, + color: colors.fontPrimary, + ...fontStyles.normal + }, + headerRight: ( + // eslint-disable-next-line react/jsx-no-bind + + Cancel + + ), + headerLeft: ( + // eslint-disable-next-line react/jsx-no-bind + navigation.pop()} style={styles.closeButton}> + {'Back'} + + ) + }; +} + +export function getTransakWebviewNavbar(navigation) { + const title = navigation.getParam('title', ''); + return { + title, + headerTitleStyle: { + fontSize: 20, + color: colors.fontPrimary, + ...fontStyles.normal + }, + headerLeft: Device.isAndroid() ? ( + // eslint-disable-next-line react/jsx-no-bind + navigation.pop()} style={styles.backButton}> + + + ) : ( + // eslint-disable-next-line react/jsx-no-bind + navigation.pop()} style={styles.backButton}> + + + ) + }; +} diff --git a/app/components/UI/ReceiveRequest/index.js b/app/components/UI/ReceiveRequest/index.js index 04949e32ed7..4c9f6855f5f 100644 --- a/app/components/UI/ReceiveRequest/index.js +++ b/app/components/UI/ReceiveRequest/index.js @@ -138,13 +138,15 @@ class ReceiveRequest extends PureComponent { * Shows an alert message with a coming soon message */ onBuy = () => { - InteractionManager.runAfterInteractions(() => { - this.setState({ buyModalVisible: true }); - setTimeout(() => { - this.setState({ buyModalVisible: false }); - }, 1500); - Analytics.trackEvent(ANALYTICS_EVENT_OPTS.RECEIVE_OPTIONS_BUY); - }); + this.props.toggleReceiveModal(); + this.props.navigation.navigate('PaymentMethodSelector'); + // InteractionManager.runAfterInteractions(() => { + // this.setState({ buyModalVisible: true }); + // setTimeout(() => { + // this.setState({ buyModalVisible: false }); + // }, 1500); + // Analytics.trackEvent(ANALYTICS_EVENT_OPTS.RECEIVE_OPTIONS_BUY); + // }); }; /** diff --git a/app/reducers/fiatOrders/index.js b/app/reducers/fiatOrders/index.js new file mode 100644 index 00000000000..17738267c56 --- /dev/null +++ b/app/reducers/fiatOrders/index.js @@ -0,0 +1,88 @@ +/** + * @typedef FiatOrder + * @type {object} + * @property {string} id - Original id given by Provider. Orders are identified by (provider, id) + * @property {FIAT_ORDER_PROVIDERS} provider : FIAT_PROVIDER, + * @property {string} amount : 0.343 + * @property {string} fee : 0.3 + * @property {} currency : "USD" + * @property {FIAT_ORDER_STATES} state + * @property {string} account : + * @property {string} network : + * @property {string|null} txHash : + * @property {} data : original provider data + */ + +/** + * @enum {string} + */ +export const FIAT_ORDER_PROVIDERS = { + WYRE: 'WYRE', + WYRE_APPLE_PAY: 'WYRE_APPLE_PAY', + TRANSAK: 'TRANSAK' +}; + +/** + * @enum {string} + */ +export const FIAT_ORDER_STATES = { + PENDING: 'PENDING', + FAILED: 'FAILED', + COMPLETED: 'COMPLETED', + CANCELLED: 'CANCELLED' +}; + +export const createPendingOrder = (id, provider, amount, fee, currency, account, network, data) => ({ + id, + provider, + amount, + fee, + currency, + account, + network, + data, + txHash: null, + state: FIAT_ORDER_STATES.PENDING +}); + +const initialState = { + orders: [] +}; + +const findOrderIndex = (provider, id, orders) => + orders.findIndex(order => order.id === id && order.provider === provider); + +const fiatOrderReducer = (state = initialState, action) => { + switch (action.type) { + case 'FIAT_ADD_ORDER': { + return { + ...state, + orders: [...state.orders, action.payload] + }; + } + case 'FIAT_UPDATE_ORDER': { + const orders = state.orders; + const order = action.payload; + const index = findOrderIndex(order.provider, order.id, state.orders); + return { + ...state, + orders: [ + ...orders.slice(0, index), + { + ...orders[index], + ...order + }, + ...orders.slice(index + 1) + ] + }; + } + case 'FIAT_RESET': { + return initialState; + } + default: { + return state; + } + } +}; + +export default fiatOrderReducer; diff --git a/app/reducers/index.js b/app/reducers/index.js index 6c6d64adde8..969d3ac20ea 100644 --- a/app/reducers/index.js +++ b/app/reducers/index.js @@ -10,6 +10,7 @@ import userReducer from './user'; import wizardReducer from './wizard'; import analyticsReducer from './analytics'; import onboardingReducer from './onboarding'; +import fiatOrders from './fiatOrders'; import notificationReducer from './notification'; import { combineReducers } from 'redux'; @@ -26,7 +27,8 @@ const rootReducer = combineReducers({ user: userReducer, wizard: wizardReducer, onboarding: onboardingReducer, - notification: notificationReducer + notification: notificationReducer, + fiatOrders }); export default rootReducer; diff --git a/babel.config.js b/babel.config.js index 3f3b3213790..5d102d7bcfd 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,11 +1,9 @@ module.exports = { - presets: ['module:metro-react-native-babel-preset'], - plugins: [ - "transform-inline-environment-variables" - ], + presets: ['module:metro-react-native-babel-preset', 'module:react-native-dotenv'], + plugins: ['transform-inline-environment-variables'], env: { production: { - plugins: ["transform-remove-console"] + plugins: ['transform-remove-console'] } } }; diff --git a/package.json b/package.json index 74e157d8a6e..2052c462755 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "@walletconnect/client": "1.0.0-rc.3", "@walletconnect/utils": "1.0.0-rc.3", "asyncstorage-down": "4.2.0", + "axios": "^0.19.2", "babel-plugin-transform-inline-environment-variables": "0.4.3", "babel-plugin-transform-remove-console": "6.9.4", "base-64": "0.1.0", @@ -117,6 +118,7 @@ "pubnub": "4.27.3", "pump": "3.0.0", "qs": "6.7.0", + "query-string": "^6.12.1", "react": "16.11.0", "react-native": "0.62.2", "react-native-actionsheet": "beefe/react-native-actionsheet#107/head", @@ -208,6 +210,7 @@ "prettier": "1.16.4", "react-dom": "16.8.4", "react-native-cli": "2.0.1", + "react-native-dotenv": "^0.2.0", "react-test-renderer": "16.11.0", "regenerator-runtime": "0.13.1", "request-promise": "4.2.4", diff --git a/yarn.lock b/yarn.lock index 7dde8e62b90..57f41281974 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2341,6 +2341,13 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== +axios@^0.19.2: + version "0.19.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== + dependencies: + follow-redirects "1.5.10" + babel-core@7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" @@ -2383,6 +2390,13 @@ babel-jest@^25.2.6, babel-jest@^25.3.0: chalk "^3.0.0" slash "^3.0.0" +babel-plugin-dotenv@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-dotenv/-/babel-plugin-dotenv-0.1.1.tgz#9c8faea67a7c034fe7e94099187ab2e7573400bc" + integrity sha1-nI+upnp8A0/n6UCZGHqy51c0ALw= + dependencies: + dotenv "^2.0.0" + babel-plugin-dynamic-import-node@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" @@ -3660,7 +3674,7 @@ debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: dependencies: ms "2.0.0" -debug@3.1.0: +debug@3.1.0, debug@=3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== @@ -4028,6 +4042,11 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" +dotenv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" + integrity sha1-vXWcNXqqcDZeAclrewvsCKbg2Uk= + drbg.js@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" @@ -5704,6 +5723,13 @@ fn-name@~2.0.1: resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + for-each@^0.3.3, for-each@~0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -10148,6 +10174,15 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +query-string@^6.12.1: + version "6.12.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.12.1.tgz#2ae4d272db4fba267141665374e49a1de09e8a7c" + integrity sha512-OHj+zzfRMyj3rmo/6G8a5Ifvw3AleL/EbcHMD27YA31Q+cO5lfmQxECkImuNVjcskLcvBRVHNAB3w6udMs1eAA== + dependencies: + decode-uri-component "^0.2.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + query-string@^6.4.2: version "6.8.3" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.8.3.tgz#fd9fb7ffb068b79062b43383685611ee47777d4b" @@ -10360,6 +10395,13 @@ react-native-device-info@3.1.4: resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-3.1.4.tgz#58a1d465ce9e2c28809132b1c68dd7ec7ce5f00f" integrity sha512-r+7APHkPO9EA/9w3e9K7yrFigaU+0/g8i3psrNUwCGFxoDewkCHOPj/1YZnAPUwPxgyG3svjZXeCtymI3xcSlA== +react-native-dotenv@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/react-native-dotenv/-/react-native-dotenv-0.2.0.tgz#311551cb6a35a3dcfede648bded55c0e3ece579d" + integrity sha1-MRVRy2o1o9z+3mSL3tVcDj7OV50= + dependencies: + babel-plugin-dotenv "0.1.1" + react-native-elevated-view@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/react-native-elevated-view/-/react-native-elevated-view-0.0.6.tgz#560cc9ab16cfd5cb5ea821521558fc711e57e231" From 466dc979d4caa6b63182018fdfc9641a041a077c Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Sat, 13 Jun 2020 18:48:06 -0400 Subject: [PATCH 012/106] Add Transak order updates and notifications --- .../UI/FiatOrders/TransakWebView/index.js | 35 ++++- app/components/UI/FiatOrders/index.js | 100 ++++++++++---- .../UI/FiatOrders/orderProcessor/transak.js | 124 ++++++++++++------ app/reducers/fiatOrders/index.js | 17 ++- 4 files changed, 206 insertions(+), 70 deletions(-) diff --git a/app/components/UI/FiatOrders/TransakWebView/index.js b/app/components/UI/FiatOrders/TransakWebView/index.js index 650ea7b4a39..5e8084620ea 100644 --- a/app/components/UI/FiatOrders/TransakWebView/index.js +++ b/app/components/UI/FiatOrders/TransakWebView/index.js @@ -1,12 +1,14 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; -import { View } from 'react-native'; +import { View, InteractionManager } from 'react-native'; import { WebView } from 'react-native-webview'; import { getTransakWebviewNavbar } from '../../../UI/Navbar'; import { baseStyles } from '../../../../styles/common'; import { handleTransakRedirect, TRANSAK_REDIRECT_URL } from '../orderProcessor/transak'; +import { connect } from 'react-redux'; +import NotificationManager from '../../../../core/NotificationManager'; -export default class TransakWebView extends PureComponent { +class TransakWebView extends PureComponent { static navigationOptions = ({ navigation }) => getTransakWebviewNavbar(navigation); static propTypes = { @@ -15,8 +17,17 @@ export default class TransakWebView extends PureComponent { handleNavigationStateChange = async navState => { if (navState.url.indexOf(TRANSAK_REDIRECT_URL) > -1) { - handleTransakRedirect(navState.url); + const order = handleTransakRedirect(navState.url, this.props.network); + this.props.addOrder(order); this.props.navigation.dismiss(); + InteractionManager.runAfterInteractions(() => + NotificationManager.showSimpleNotification({ + duration: 5000, + title: `Processing purchase of ${order.currency}`, + description: 'Your deposit is in progress', + status: 'pending' + }) + ); } }; @@ -31,3 +42,21 @@ export default class TransakWebView extends PureComponent { } } } + +TransakWebView.propTypes = { + network: PropTypes.string, + addOrder: PropTypes.func +}; + +const mapStateToProps = state => ({ + network: state.engine.backgroundState.NetworkController.network +}); + +const mapDispatchToProps = dispatch => ({ + addOrder: order => dispatch({ type: 'FIAT_ADD_ORDER', payload: order }) +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(TransakWebView); diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 8a771ff11d6..0504ad8a16c 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -3,43 +3,88 @@ import React, { useCallback } from 'react'; import PropTypes from 'prop-types'; +import { View, StyleSheet, InteractionManager } from 'react-native'; import { connect } from 'react-redux'; -import { Text } from 'react-native'; -import useInterval from './hooks/useInterval'; + +import Text from './components/Text'; import { createPendingOrder, FIAT_ORDER_STATES, FIAT_ORDER_PROVIDERS } from '../../../reducers/fiatOrders'; +import useInterval from './hooks/useInterval'; import processOrder from './orderProcessor'; +import { colors } from '../../../styles/common'; +import NotificationManager from '../../../core/NotificationManager'; -function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOrders, dispatch }) { - // console.log(orders); +const POLLING_TIME = 10000; +const NOTIFICATION_DURATION = 5000; +const SHOW_DEBUG = true; + +const styles = StyleSheet.create({ + bottomView: { + padding: 10, + paddingBottom: 20, + backgroundColor: colors.grey000 + } +}); + +/** + * @typedef {import('../../../reducers/fiatOrders').FiatOrder} FiatOrder + */ +/** + * @param {FiatOrder} fiatOrder + */ +const getNotificationDetails = fiatOrder => { + switch (fiatOrder.state) { + case FIAT_ORDER_STATES.FAILED: { + return { title: 'Your purchase failed', description: 'Failed :(', status: 'error' }; + } + case FIAT_ORDER_STATES.CANCELLED: { + return { title: 'Your purchase was cancelled', description: 'Cancelled :(', status: 'cancelled' }; + } + case FIAT_ORDER_STATES.COMPLETED: { + return { + title: `Your purchase of ${fiatOrder.cryptoAmount} ${fiatOrder.cryptocurrency} successful`, + description: `Your ${fiatOrder.cryptocurrency} is now available`, + status: 'success' + }; + } + case FIAT_ORDER_STATES.PENDING: + default: { + return { + title: `Processing purchase of ${fiatOrder.currency}`, + description: 'Your deposit is in progress', + status: 'pending' + }; + } + } +}; + +function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOrders, dispatch }) { // Pending orders depend on selectedAddress and selectedNetworks const pendingOrders = orders.filter( order => order.account === selectedAddress && order.network === network && order.state === FIAT_ORDER_STATES.PENDING - ); // selectedAddress - - // console.log(pendingOrders); - - // useEffect(() => { - // console.log('cdM!'); - // console.log('orders', orders); - // console.log('pending', pendingOrders); - // return () => console.log('cWU!'); - // }, [selectedAddress, network, orders, pendingOrders]); + ); useInterval( async () => { await Promise.all( pendingOrders.map(async order => { - const proccesed = await processOrder(order); - // Check if status has changed - dispatch({ type: 'FIAT_UPDATE_ORDER', payload: proccesed }); - // dispatch(showTransactionNotification({})); + const updatedOrder = await processOrder(order); + if (updatedOrder.state !== order.state) { + // console.log(`Order updated:`, order.provider, order.id); + dispatch({ type: 'FIAT_UPDATE_ORDER', payload: updatedOrder }); + InteractionManager.runAfterInteractions(() => + NotificationManager.showSimpleNotification({ + duration: NOTIFICATION_DURATION, + ...getNotificationDetails(updatedOrder) + }) + ); + } }) ); }, - pendingOrders.length ? 2000 : null + pendingOrders.length ? POLLING_TIME : null ); const onPressAdd = useCallback(() => createFakeOrder(selectedAddress, network), [ @@ -48,11 +93,20 @@ function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOr network ]); + if (!SHOW_DEBUG) { + return null; + } + return ( - - Add;Clear; - network:{network} - + + + Pending: {pendingOrders.length} Total: {orders.length} + + + Add Clear{' '} + Network: {network} + + ); } diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index 4ee649e4196..fdfeac02adf 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -7,7 +7,9 @@ import { TRANSAK_API_URL_STAGING, TRANSAK_API_URL_PRODUCTION, TRANSAK_API_KEY_STAGING, - TRANSAK_API_KEY_PRODUCTION + TRANSAK_API_KEY_SECRET_STAGING, + TRANSAK_API_KEY_PRODUCTION, + TRANSAK_API_KEY_SECRET_PRODUCTION } from 'react-native-dotenv'; import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; // import Logger from '../../../../util/Logger'; @@ -21,6 +23,38 @@ import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fi /** * @typedef TransakOrder * @type {object} + * @property {string} id + * @property {string} createdAt + * @property {string} updatedAt + * @property {string} completedAt + * @property {string} fiatCurrency + * @property {string} cryptocurrency + * @property {number} fiatAmount + * @property {string} walletLink + * @property {string} paymentOptionId + * @property {boolean} addressAdditionalData + * @property {string} network this is NOT ethernet networks id + * @property {string} amountPaid + * @property {number} referenceCode + * @property {string} redirectURL Our redirect URL + * @property {number} conversionPrice + * @property {number} cryptoAmount + * @property {number} totalFeeInCrypto + * @property {number} totalFeeInFiat + * @property {array} paymentOption + * @property {TRANSAK_ORDER_STATES} status + * @property {string} walletAddress + * @property {string} autoExpiresAt + * @property {string} fromWalletAddress + * @property {string} transactionHash + * @property {string} transactionLink + */ + +/** + * Query params added by Transak when redirecting after completing flow + * https://integrate.transak.com/Query-Parameters-9ec523df3b874ec58cef4fa3a906f238?p=d3edbf3a682d403daceee3249e8aea49 + * @typedef TransakRedirectOrder + * @type {object} * @property {} orderId * @property {} fiatCurrency * @property {} cryptocurrency @@ -42,6 +76,7 @@ export const TRANSAK_REDIRECT_URL = 'https://metamask.io/'; const TRANSAK_API_BASE_URL = `${isDevelopment ? TRANSAK_API_URL_STAGING : TRANSAK_API_URL_PRODUCTION}api/v1/`; const TRANSAK_API_KEY = isDevelopment ? TRANSAK_API_KEY_STAGING : TRANSAK_API_KEY_PRODUCTION; +const TRANSAK_API_KEY_SECRET = isDevelopment ? TRANSAK_API_KEY_SECRET_STAGING : TRANSAK_API_KEY_SECRET_PRODUCTION; /** * @enum {string} @@ -49,8 +84,11 @@ const TRANSAK_API_KEY = isDevelopment ? TRANSAK_API_KEY_STAGING : TRANSAK_API_KE export const TRANSAK_ORDER_STATES = { AWAITING_PAYMENT_FROM_USER: 'AWAITING_PAYMENT_FROM_USER', PAYMENT_DONE_MARKED_BY_USER: 'PAYMENT_DONE_MARKED_BY_USER', + PROCESSING: 'PROCESSING', PENDING_DELIVERY_FROM_TRANSAK: 'PENDING_DELIVERY_FROM_TRANSAK', COMPLETED: 'COMPLETED', + EXPIRED: 'EXPIRED', + FAILED: 'FAILED', CANCELLED: 'CANCELLED' }; @@ -60,10 +98,10 @@ const transakApi = axios.create({ baseURL: TRANSAK_API_BASE_URL }); -/* eslint-disable no-unused-vars */ +// eslint-disable-next-line no-unused-vars const getPartnerStatus = () => transakApi.get(`partners/${TRANSAK_API_KEY}`); -const getOrderStatus = orderId => transakApi.get(`orders/${orderId}`); -/* eslint-enable no-unused-vars */ +const getOrderStatus = orderId => + transakApi.get(`partners/order/${orderId}`, { params: { partnerAPISecret: TRANSAK_API_KEY_SECRET } }); //* Helpers @@ -75,12 +113,15 @@ const transakOrderStateToFiatOrderState = transakOrderState => { switch (transakOrderState) { case TRANSAK_ORDER_STATES.AWAITING_PAYMENT_FROM_USER: case TRANSAK_ORDER_STATES.PAYMENT_DONE_MARKED_BY_USER: + case TRANSAK_ORDER_STATES.PROCESSING: case TRANSAK_ORDER_STATES.PENDING_DELIVERY_FROM_TRANSAK: { return FIAT_ORDER_STATES.PENDING; } case TRANSAK_ORDER_STATES.COMPLETED: { return FIAT_ORDER_STATES.COMPLETED; } + case TRANSAK_ORDER_STATES.EXPIRED: + case TRANSAK_ORDER_STATES.FAILED: case TRANSAK_ORDER_STATES.CANCELLED: { return FIAT_ORDER_STATES.CANCELLED; } @@ -96,16 +137,36 @@ const transakOrderStateToFiatOrderState = transakOrderState => { * @returns {FiatOrder} Fiat order object to store in the state */ const transakOrderToFiatOrder = transakOrder => ({ - id: transakOrder.orderId, + id: transakOrder.id, provider: FIAT_ORDER_PROVIDERS.TRANSAK, amount: transakOrder.fiatAmount, - fee: transakOrder.totalFee, + fee: transakOrder.totalFeeInFiat, + cryptoAmount: transakOrder.cryptoAmount, + cryptoFee: transakOrder.totalFeeInCrypto, currency: transakOrder.fiatCurrency, - state: transakOrderStateToFiatOrderState(transakOrder), + cryptocurrency: transakOrder.cryptocurrency, + state: transakOrderStateToFiatOrderState(transakOrder.status), account: transakOrder.walletAddress, + txHash: transakOrder.transactionHash || null, data: transakOrder }); +/** + * Transforms Transak rorder object into a Fiat order object used in the state. + * @param {TransakRedirectOrder} transakRedirectOrder Transak order object + * @returns {FiatOrder} Fiat order object to store in the state + */ +const transakCallbackOrderToFiatOrder = transakRedirectOrder => ({ + id: transakRedirectOrder.orderId, + provider: FIAT_ORDER_PROVIDERS.TRANSAK, + amount: transakRedirectOrder.fiatAmount, + fee: transakRedirectOrder.totalFee, + currency: transakRedirectOrder.fiatCurrency, + state: transakOrderStateToFiatOrderState(transakRedirectOrder.status), + account: transakRedirectOrder.walletAddress, + data: transakRedirectOrder +}); + //* Handlers /** @@ -115,30 +176,15 @@ const transakOrderToFiatOrder = transakOrder => ({ * `cryptoAmount`, `isBuyOrSell`, `status`, `walletAddress`, * `totalFee`, `partnerCustomerId`, `partnerOrderId`. * @param {String} network Current network selected in the app + * @returns {FiatOrder} */ export const handleTransakRedirect = (url, network) => { - // Order created from Transak flow, needs to be added to the polling. + /** @type {TransakRedirectOrder} */ const data = qs.parse(url.split(TRANSAK_REDIRECT_URL)[1]); - /* const actualOrder = { - cryptoAmount: '0.18065827', - cryptocurrency: 'ETH', - fiatAmount: '35', - fiatCurrency: 'GBP', - isBuyOrSell: 'BUY', - orderId: '11aaf266-4ee9-4cdb-8dbf-420a8f4f2193', - status: 'PENDING_DELIVERY_FROM_TRANSAK', - totalFeeInFiat: '1.37', - walletAddress: '0x33C04960375BBB2373e9Dd28C17CE125B08EC74f' - };*/ - const order = { ...transakOrderToFiatOrder(data), network }; - - // TODO: add to fiatOrder state + const order = { ...transakCallbackOrderToFiatOrder(data), network }; + return order; }; -// handleTransakRedirect( -// 'https://metamask.io/?orderId=%22071c9aa3-e03a-4e88-afba-c108d05c3ec4%22&fiatCurrency=%22USD%22&cryptocurrency=%22ETH%22&fiatAmount=35&cryptoAmount=0.1369118&isBuyOrSell=%22BUY%22&status=%22PROCESSING%22&walletAddress=%220x33C04960375BBB2373e9Dd28C17CE125B08EC74f%22&totalFee=undefined' -// ); - /** * Function used to poll and update the order * @param {FiatOrder} order Order coming from the state @@ -146,17 +192,21 @@ export const handleTransakRedirect = (url, network) => { * @returns {FiatOrder} Fiat order to update in the state */ export async function processTransakOrder(order) { - console.log('processTransakOrder'); - // try { - // const { data } = await getOrderStatus(order.id); - // /* TODO: Check order status and update order object. */ - // console.log({ data }); - // } catch (error) { - // console.error(error); - // } - - // Return updated order - return order; + try { + const { + data: { response } + } = await getOrderStatus(order.id); + if (!response) { + return order; + } + return { + ...order, + ...transakOrderToFiatOrder(response) + }; + } catch (error) { + console.error(error); + return order; + } } //* Hooks diff --git a/app/reducers/fiatOrders/index.js b/app/reducers/fiatOrders/index.js index 17738267c56..bcd98e7fe5f 100644 --- a/app/reducers/fiatOrders/index.js +++ b/app/reducers/fiatOrders/index.js @@ -2,15 +2,18 @@ * @typedef FiatOrder * @type {object} * @property {string} id - Original id given by Provider. Orders are identified by (provider, id) - * @property {FIAT_ORDER_PROVIDERS} provider : FIAT_PROVIDER, - * @property {string} amount : 0.343 - * @property {string} fee : 0.3 - * @property {} currency : "USD" - * @property {FIAT_ORDER_STATES} state + * @property {FIAT_ORDER_PROVIDERS} provider Fiat Provider + * @property {string} amount Fiat amount + * @property {string} fee Fiat fee + * @property {string} cryptoAmount Crypto currency amount + * @property {string} cryptoFee Crypto currency fee + * @property {string} currency : "USD" + * @property {string} cryptocurrency : "ETH" + * @property {FIAT_ORDER_STATES} state Order state * @property {string} account : * @property {string} network : - * @property {string|null} txHash : - * @property {} data : original provider data + * @property {?string} txHash : + * @property {TransakRedirectOrder | TransakOrder | WyreOrder } data : original provider data */ /** From fa3e24d963809ea5a3a064fe505188da22ce2d0e Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Sat, 13 Jun 2020 18:57:20 -0400 Subject: [PATCH 013/106] Hide debug view --- app/components/UI/FiatOrders/index.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 0504ad8a16c..9231f84bcbc 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -16,7 +16,7 @@ import NotificationManager from '../../../core/NotificationManager'; const POLLING_TIME = 10000; const NOTIFICATION_DURATION = 5000; -const SHOW_DEBUG = true; +const SHOW_DEBUG = false; const styles = StyleSheet.create({ bottomView: { @@ -36,7 +36,11 @@ const styles = StyleSheet.create({ const getNotificationDetails = fiatOrder => { switch (fiatOrder.state) { case FIAT_ORDER_STATES.FAILED: { - return { title: 'Your purchase failed', description: 'Failed :(', status: 'error' }; + return { + title: `Purchase of ${fiatOrder.cryptocurrency} failed! Please try again, sorry for the inconvenience!`, + description: 'Error :(', + status: 'error' + }; } case FIAT_ORDER_STATES.CANCELLED: { return { title: 'Your purchase was cancelled', description: 'Cancelled :(', status: 'cancelled' }; From c1254a43a37d934690e8ce66170d64ff9d165951 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Mon, 15 Jun 2020 15:05:00 -0400 Subject: [PATCH 014/106] Add quick amounts and keypad behavior --- .../FiatOrders/PaymentMethodApplePay/index.js | 216 +++++++++++++++--- 1 file changed, 190 insertions(+), 26 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index b25ea3c5f51..5b1def058bc 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import React, { useContext, useState, useCallback } from 'react'; import PropTypes from 'prop-types'; import { View, StyleSheet, Image, TouchableOpacity } from 'react-native'; import IonicIcon from 'react-native-vector-icons/Ionicons'; @@ -10,6 +10,8 @@ import { colors, fontStyles } from '../../../../styles/common'; import { NavigationContext } from 'react-navigation'; import { useWyreTerms } from '../orderProcessor/wyreApplePay'; +//* styles and components */ + const styles = StyleSheet.create({ screen: { flex: 1 }, amountContainer: { @@ -22,14 +24,37 @@ const styles = StyleSheet.create({ fontFamily: 'Roboto-Light', fontWeight: fontStyles.light.fontWeight, color: colors.black, - fontSize: 44 + fontSize: 44, + height: 52 + }, + amountError: { + color: colors.red }, content: { flexGrow: 1, justifyContent: 'space-around' }, quickAmounts: { - flexDirection: 'row' + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-around', + marginHorizontal: 70 + }, + quickAmount: { + borderRadius: 18, + borderColor: colors.grey200, + borderWidth: 1, + paddingVertical: 5, + paddingHorizontal: 8, + alignItems: 'center', + minWidth: 49 + }, + quickAmountSelected: { + backgroundColor: colors.blue, + borderColor: colors.blue + }, + quickAmountSelectedText: { + color: colors.white }, keypad: { paddingHorizontal: 25 @@ -93,9 +118,9 @@ const Keypad = props => ; Keypad.Row = function Row(props) { return ; }; -Keypad.Button = function KeypadButton({ children }) { +Keypad.Button = function KeypadButton({ children, ...props }) { return ( - + {children} ); @@ -107,55 +132,194 @@ Keypad.Button.propTypes = { Keypad.DeleteButton = function DeleteButton(props) { return ( - + ); }; +const QuickAmount = ({ amount, current, ...props }) => { + const selected = amount === current; + return ( + + + ${amount} + + + ); +}; + +QuickAmount.propTypes = { + amount: PropTypes.string, + current: PropTypes.string +}; + +//* Constants */ + +const quickAmounts = ['50', '100', '250']; +const minAmount = 5; +const maxAmount = 250; + +const hasTwoDecimals = /^\d+\.\d{2}$/; +const hasZeroAsFirstDecimal = /^\d+\.0$/; +const hasZerosAsDecimals = /^\d+\.00$/; +const hasOneDigit = /^\d$/; +const hasPeriodWithoutDecimal = /^\d+\.$/; +const avoidZerosAsDecimals = false; + +//* Handlers + +const handleNewAmountInput = (currentAmount, newInput) => { + switch (newInput) { + case 'PERIOD': { + if (currentAmount === '0') { + return `${currentAmount}.`; + } + if (currentAmount.includes('.')) { + // TODO: throw error for feedback? + return currentAmount; + } + + return `${currentAmount}.`; + } + case 'BACK': { + if (currentAmount === '0') { + return currentAmount; + } + if (hasOneDigit.test(currentAmount)) { + return '0'; + } + + return currentAmount.slice(0, -1); + } + case '0': { + if (currentAmount === '0') { + return currentAmount; + } + if (hasTwoDecimals.test(currentAmount)) { + return currentAmount; + } + if (avoidZerosAsDecimals && hasZeroAsFirstDecimal.test(currentAmount)) { + return currentAmount; + } + return `${currentAmount}${newInput}`; + } + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + if (currentAmount === '0') { + return newInput; + } + if (hasTwoDecimals.test(currentAmount)) { + return currentAmount; + } + + return `${currentAmount}${newInput}`; + } + default: { + return currentAmount; + } + } +}; + function PaymentMethodApplePay(props) { const navigation = useContext(NavigationContext); const [amount, setAmount] = useState('0'); + const roundAmount = + hasZerosAsDecimals.test(amount) || hasZeroAsFirstDecimal.test(amount) || hasPeriodWithoutDecimal.test(amount) + ? amount.split('.')[0] + : amount; + const isUnderMinimum = Number(roundAmount) !== 0 && Number(roundAmount) < minAmount; + const isOverMaximum = Number(roundAmount) > maxAmount; + const disabledButton = amount === '0' || isUnderMinimum || isOverMaximum; + const handleWyreTerms = useWyreTerms(navigation); + const handleQuickAmountPress = useCallback(amount => setAmount(amount), []); + const handleKeypadPress = useCallback( + newInput => { + if (isOverMaximum && newInput !== 'BACK') { + return; + } + const newAmount = handleNewAmountInput(amount, newInput); + if (newAmount === amount) { + return; + } + + setAmount(newAmount); + }, + [amount, isOverMaximum] + ); + const handleKeypadPress1 = useCallback(() => handleKeypadPress('1'), [handleKeypadPress]); + const handleKeypadPress2 = useCallback(() => handleKeypadPress('2'), [handleKeypadPress]); + const handleKeypadPress3 = useCallback(() => handleKeypadPress('3'), [handleKeypadPress]); + const handleKeypadPress4 = useCallback(() => handleKeypadPress('4'), [handleKeypadPress]); + const handleKeypadPress5 = useCallback(() => handleKeypadPress('5'), [handleKeypadPress]); + const handleKeypadPress6 = useCallback(() => handleKeypadPress('6'), [handleKeypadPress]); + const handleKeypadPress7 = useCallback(() => handleKeypadPress('7'), [handleKeypadPress]); + const handleKeypadPress8 = useCallback(() => handleKeypadPress('8'), [handleKeypadPress]); + const handleKeypadPress9 = useCallback(() => handleKeypadPress('9'), [handleKeypadPress]); + const handleKeypadPress0 = useCallback(() => handleKeypadPress('0'), [handleKeypadPress]); + const handleKeypadPressPeriod = useCallback(() => handleKeypadPress('PERIOD'), [handleKeypadPress]); + const handleKeypadPressBack = useCallback(() => handleKeypadPress('BACK'), [handleKeypadPress]); - const disabledButton = true; return ( - + ${amount} - = 0 ETH + {!(isUnderMinimum || isOverMaximum) && = 0 ETH} + {isUnderMinimum && Minimum deposit is ${minAmount}} + {isOverMaximum && Maximum deposit is ${maxAmount}} + {quickAmounts.length > 0 && ( + + {quickAmounts.map(quickAmount => ( + handleQuickAmountPress(quickAmount)} + /> + ))} + + )} - - a - a - a - - 1 - 2 - 3 + 1 + 2 + 3 - 4 - 5 - 6 + 4 + 5 + 6 - 7 - 8 - 9 + 7 + 8 + 9 - . - 0 - + . + 0 + From 26d1a0f264317885261a32aa2551530f003d249b Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Mon, 15 Jun 2020 15:15:13 -0400 Subject: [PATCH 015/106] Add 0. case to keypad --- app/components/UI/FiatOrders/PaymentMethodApplePay/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index 5b1def058bc..b93e7e04c80 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -235,7 +235,8 @@ function PaymentMethodApplePay(props) { hasZerosAsDecimals.test(amount) || hasZeroAsFirstDecimal.test(amount) || hasPeriodWithoutDecimal.test(amount) ? amount.split('.')[0] : amount; - const isUnderMinimum = Number(roundAmount) !== 0 && Number(roundAmount) < minAmount; + const isUnderMinimum = (amount !== '0' || Number(roundAmount) !== 0) && Number(roundAmount) < minAmount; + const isOverMaximum = Number(roundAmount) > maxAmount; const disabledButton = amount === '0' || isUnderMinimum || isOverMaximum; From 3b2685d454357cf80e1d976db9cde07bb810a39e Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Mon, 15 Jun 2020 16:22:37 -0400 Subject: [PATCH 016/106] Add some more details about transak --- .../UI/FiatOrders/orderProcessor/transak.js | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index fdfeac02adf..ad587e4f487 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -12,7 +12,6 @@ import { TRANSAK_API_KEY_SECRET_PRODUCTION } from 'react-native-dotenv'; import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; -// import Logger from '../../../../util/Logger'; //* typedefs @@ -31,7 +30,7 @@ import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fi * @property {string} cryptocurrency * @property {number} fiatAmount * @property {string} walletLink - * @property {string} paymentOptionId + * @property {string} paymentOptionId Paymenth method ID, see: https://integrate.transak.com/Coverage-Payment-Methods-Fees-Limits-30c0954fbdf04beca68622d9734c59f9 * @property {boolean} addressAdditionalData * @property {string} network this is NOT ethernet networks id * @property {string} amountPaid @@ -55,17 +54,17 @@ import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fi * https://integrate.transak.com/Query-Parameters-9ec523df3b874ec58cef4fa3a906f238?p=d3edbf3a682d403daceee3249e8aea49 * @typedef TransakRedirectOrder * @type {object} - * @property {} orderId - * @property {} fiatCurrency - * @property {} cryptocurrency - * @property {} fiatAmount - * @property {} cryptoAmount - * @property {} isBuyOrSell - * @property {} status - * @property {} walletAddress - * @property {} totalFee - * @property {} partnerCustomerId - * @property {} partnerOrderId + * @property {string} orderId + * @property {string} fiatCurrency + * @property {string} cryptocurrency + * @property {string} fiatAmount + * @property {string} cryptoAmount + * @property {string} isBuyOrSell + * @property {string} status + * @property {string} walletAddress + * @property {string} totalFee + * @property {string} partnerCustomerId + * @property {string} partnerOrderId */ //* Constants @@ -79,6 +78,7 @@ const TRANSAK_API_KEY = isDevelopment ? TRANSAK_API_KEY_STAGING : TRANSAK_API_KE const TRANSAK_API_KEY_SECRET = isDevelopment ? TRANSAK_API_KEY_SECRET_STAGING : TRANSAK_API_KEY_SECRET_PRODUCTION; /** + * https://integrate.transak.com/69a2474c8d8d40daa04bd5bbe804fb6d?v=48a0c9fd98854078a4eaf5ec9a0a4f65 * @enum {string} */ export const TRANSAK_ORDER_STATES = { @@ -98,8 +98,7 @@ const transakApi = axios.create({ baseURL: TRANSAK_API_BASE_URL }); -// eslint-disable-next-line no-unused-vars -const getPartnerStatus = () => transakApi.get(`partners/${TRANSAK_API_KEY}`); +// const getPartnerStatus = () => transakApi.get(`partners/${TRANSAK_API_KEY}`); const getOrderStatus = orderId => transakApi.get(`partners/order/${orderId}`, { params: { partnerAPISecret: TRANSAK_API_KEY_SECRET } }); From 82524ff763ea729a9ee927119919389c5b01552f Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Tue, 16 Jun 2020 22:56:58 -0400 Subject: [PATCH 017/106] Add initial apple pay processing --- .../FiatOrders/PaymentMethodApplePay/index.js | 65 +++++- app/components/UI/FiatOrders/index.js | 3 +- .../UI/FiatOrders/orderProcessor/transak.js | 3 +- .../FiatOrders/orderProcessor/wyreApplePay.js | 201 +++++++++++++++++- app/reducers/fiatOrders/index.js | 14 +- 5 files changed, 270 insertions(+), 16 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index b93e7e04c80..0110c2cb21d 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -8,7 +8,9 @@ import Text from '../components/Text'; import StyledButton from '../../StyledButton'; import { colors, fontStyles } from '../../../../styles/common'; import { NavigationContext } from 'react-navigation'; -import { useWyreTerms } from '../orderProcessor/wyreApplePay'; +import { useWyreTerms, useWyreApplePay } from '../orderProcessor/wyreApplePay'; +import { connect } from 'react-redux'; +import { setLockTime } from '../../../../actions/settings'; //* styles and components */ @@ -228,7 +230,7 @@ const handleNewAmountInput = (currentAmount, newInput) => { } }; -function PaymentMethodApplePay(props) { +function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress }) { const navigation = useContext(NavigationContext); const [amount, setAmount] = useState('0'); const roundAmount = @@ -241,6 +243,21 @@ function PaymentMethodApplePay(props) { const disabledButton = amount === '0' || isUnderMinimum || isOverMaximum; const handleWyreTerms = useWyreTerms(navigation); + + const [showApplePayRequest, percentFee, flatFee, , fee] = useWyreApplePay(roundAmount, selectedAddress); + const handlePressApplePay = useCallback(async () => { + const prevLockTime = lockTime; + setLockTime(-1); + try { + const fiatOrder = await showApplePayRequest(); + // TODO: add order and show notification + } catch (error) { + // TODO: show error notification + } finally { + setLockTime(prevLockTime); + } + }, [lockTime, setLockTime, showApplePayRequest]); + const handleQuickAmountPress = useCallback(amount => setAmount(amount), []); const handleKeypadPress = useCallback( newInput => { @@ -325,7 +342,12 @@ function PaymentMethodApplePay(props) { - + - Fee ~2.9% + $0.30 (0.35% goes to MetaMask) + {percentFee === '0.00' && flatFee === '0.00' && 0% fee (limited time)} + {(percentFee !== '0.00' || flatFee !== '0.00') && ( + <> + {disabledButton ? ( + + + Fee ~{percentFee}% + ${flatFee} + + + ) : ( + + Plus a ${fee} fee + + )} + + )} @@ -349,7 +386,25 @@ function PaymentMethodApplePay(props) { ); } +PaymentMethodApplePay.propTypes = { + lockTime: PropTypes.number.isRequired, + setLockTime: PropTypes.func.isRequired, + selectedAddress: PropTypes.string.isRequired +}; + PaymentMethodApplePay.navigationOptions = ({ navigation }) => getPaymentMethodApplePayNavbar('Amount to buy', navigation); -export default PaymentMethodApplePay; +const mapStateToProps = state => ({ + lockTime: state.settings.lockTime, + selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress +}); + +const mapDispatchToProps = dispatch => ({ + setLockTime: time => dispatch(setLockTime(time)), + dispatch +}); +export default connect( + mapStateToProps, + mapDispatchToProps +)(PaymentMethodApplePay); diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 9231f84bcbc..d22984e1d6b 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -55,7 +55,7 @@ const getNotificationDetails = fiatOrder => { case FIAT_ORDER_STATES.PENDING: default: { return { - title: `Processing purchase of ${fiatOrder.currency}`, + title: `Processing purchase of ${fiatOrder.cryptocurrency}`, description: 'Your deposit is in progress', status: 'pending' }; @@ -65,6 +65,7 @@ const getNotificationDetails = fiatOrder => { function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOrders, dispatch }) { // Pending orders depend on selectedAddress and selectedNetworks + const pendingOrders = orders.filter( order => order.account === selectedAddress && order.network === network && order.state === FIAT_ORDER_STATES.PENDING diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index ad587e4f487..c66a7cd5bd6 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -203,7 +203,8 @@ export async function processTransakOrder(order) { ...transakOrderToFiatOrder(response) }; } catch (error) { - console.error(error); + // TODO: report error + // console.error(error); return order; } } diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index a7b1d75f2f5..e06176833f4 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -1,5 +1,14 @@ -import { WYRE_API_ENDPOINT, WYRE_API_ENDPOINT_TEST } from 'react-native-dotenv'; -import { useCallback } from 'react'; +import { + WYRE_API_ENDPOINT, + WYRE_API_ENDPOINT_TEST, + WYRE_ACCOUNT_ID, + WYRE_ACCOUNT_ID_TEST, + WYRE_MERCHANT_ID, + WYRE_MERCHANT_ID_TEST +} from 'react-native-dotenv'; +import { useCallback, useMemo } from 'react'; +import { PaymentRequest } from 'react-native-payments'; +import axios from 'axios'; // { // id: // Orders are identified by (provider, id) @@ -14,14 +23,200 @@ import { useCallback } from 'react'; // data: // } +//* typedefs + +/** + * @typedef {import('../../../../reducers/fiatOrders').FiatOrder} FiatOrder + */ + +//* Constants */ + +const isDevelopment = process.env.NODE_ENV !== 'production'; +const merchantIdentifier = 'test' || isDevelopment ? WYRE_MERCHANT_ID_TEST : WYRE_MERCHANT_ID; +const partnerId = isDevelopment ? WYRE_ACCOUNT_ID_TEST : WYRE_ACCOUNT_ID; + +const WYRE_IS_PROMOTION = false; +const WYRE_FEE_PERCENT = WYRE_IS_PROMOTION ? 0 : 2.9; +const WYRE_FEE_FLAT = WYRE_IS_PROMOTION ? 0 : 0.3; + +//* API */ + +const wyreAPI = axios.create({ + baseURL: isDevelopment ? WYRE_API_ENDPOINT_TEST : WYRE_API_ENDPOINT +}); + +const createFiatOrder = payload => + wyreAPI.post('v3/apple-pay/process/partner', payload, { + validateStatus: status => status >= 200 + }); +const trackFiatOrder = orderId => wyreAPI.get(`v3/orders/${orderId}`); +const trackTransfer = transferId => wyreAPI.get(`v2/transfer/${transferId}/track`); + export function processWyreApplePayOrder(order) { console.log('processWyreApplePayOrder'); - // Once the transferId is returned it means order was accepted and the transfer (blockchain transaction) is in progress. To track its progress please check the transfer tracking documentation here https://docs.sendwyre.com/v3/docs/track-wallet-order + /* TODO: Once the transferId is returned it means order was + accepted and the transfer (blockchain transaction) is in progress. + To track its progress please check the transfer tracking documentation here https://docs.sendwyre.com/v3/docs/track-wallet-order + */ return order; } +//* Payment Request */ + +const USD_CURRENCY_CODE = 'USD'; +const ETH_CURRENCY_CODE = 'ETH'; + +const PAYMENT_REQUEST_COMPLETE = { + SUCCESS: 'success', + UNKNOWN: 'unknown', + FAIL: 'fail' +}; + +const methodData = [ + { + supportedMethods: ['apple-pay'], + supportedTypes: ['debit'], + data: { + countryCode: 'US', + currencyCode: USD_CURRENCY_CODE, + supportedNetworks: ['visa', 'mastercard', 'discover'], + merchantIdentifier + } + } +]; + +const getPaymentDetails = (cryptoCurrency, amount, fee, total) => ({ + displayItems: [ + { + amount: { currency: USD_CURRENCY_CODE, value: `${amount}` }, + label: `${cryptoCurrency} Purchase` + }, + { + amount: { currency: USD_CURRENCY_CODE, value: `${fee}` }, + label: 'Fee' + } + ], + total: { + amount: { currency: USD_CURRENCY_CODE, value: `${total}` }, + label: 'MetaMask' + } +}); + +const paymentOptions = { + requestPayerPhone: true, + requestPayerEmail: true, + requestBilling: true +}; + +const createPayload = (amount, address, paymentDetails) => { + const { + billingContact: { postalAddress, name }, + paymentData, + paymentMethod, + shippingContact, + transactionIdentifier + } = paymentDetails; + const dest = `ethereum:${address}`; + + const formattedBillingContact = { + addressLines: postalAddress.street.split('\n'), + administrativeArea: postalAddress.state, + country: postalAddress.country, + countryCode: postalAddress.ISOCountryCode, + familyName: name.familyName, + givenName: name.givenName, + locality: postalAddress.city, + postalCode: postalAddress.postalCode, + subAdministrativeArea: postalAddress.subAdministrativeArea, + subLocality: postalAddress.subLocality + }; + + const formattedShippingContact = { + ...formattedBillingContact, + emailAddress: shippingContact.emailAddress, + phoneNumber: shippingContact.phoneNumber + }; + return { + partnerId, + payload: { + orderRequest: { + amount, + dest, + destCurrency: ETH_CURRENCY_CODE, + referrerAccountId: partnerId, + sourceCurrency: USD_CURRENCY_CODE + }, + paymentObject: { + billingContact: formattedBillingContact, + shippingContact: formattedShippingContact, + token: { + paymentData, + paymentMethod: { + ...paymentMethod, + type: 'debit' + }, + transactionIdentifier + } + } + } + }; +}; + +// * Hooks */ + +export function useWyreApplePay(amount, address) { + const flatFee = useMemo(() => WYRE_FEE_FLAT.toFixed(2), []); + const percentFee = useMemo(() => WYRE_FEE_PERCENT.toFixed(2), []); + const percentFeeAmount = useMemo(() => ((Number(amount) * Number(percentFee)) / 100).toFixed(2), [ + amount, + percentFee + ]); + const fee = useMemo(() => (Number(percentFeeAmount) + Number(flatFee)).toFixed(2), [flatFee, percentFeeAmount]); + const total = useMemo(() => Number(amount) + Number(fee), [amount, fee]); + const paymentDetails = useMemo(() => getPaymentDetails(ETH_CURRENCY_CODE, amount, fee, total), [ + amount, + fee, + total + ]); + + const showRequest = useCallback(async () => { + const paymentRequest = new PaymentRequest(methodData, paymentDetails, paymentOptions); + try { + const paymentResponse = await paymentRequest.show(); + if (!paymentResponse) { + throw new Error('Payment Request Failed'); + } + const payload = createPayload(total, address, paymentResponse.details); + const { data, status } = await createFiatOrder(payload); + // const order = await axios.post('https://envwmfqc4hgr.x.pipedream.net/payment', payload); + + if (status >= 200 && status < 300) { + console.log('success'); + await paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.SUCCESS); + return data; + } + paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.FAIL); + console.log(data); + + // {"compositeType": "", "exceptionId": "RBV6BR", "language": "en", "message": "No partner configuration found or AC_Q9X8G3WGTDH", "subType": "", "transient": false, "type": "ApiException"} + + throw data; + } catch (error) { + if (error.message.includes('AbortError')) { + return console.log('aborted'); + } + + paymentRequest.abort(); + + console.log('Error in payment request: ', error); + } + }, [address, paymentDetails, total]); + + return [showRequest, percentFee, flatFee, percentFeeAmount, fee, total]; +} + export function useWyreTerms(navigation) { const handleWyreTerms = useCallback( () => diff --git a/app/reducers/fiatOrders/index.js b/app/reducers/fiatOrders/index.js index bcd98e7fe5f..0073bd94085 100644 --- a/app/reducers/fiatOrders/index.js +++ b/app/reducers/fiatOrders/index.js @@ -7,13 +7,15 @@ * @property {string} fee Fiat fee * @property {string} cryptoAmount Crypto currency amount * @property {string} cryptoFee Crypto currency fee - * @property {string} currency : "USD" - * @property {string} cryptocurrency : "ETH" + * @property {string} currency "USD" + * @property {string} cryptocurrency "ETH" * @property {FIAT_ORDER_STATES} state Order state - * @property {string} account : - * @property {string} network : - * @property {?string} txHash : - * @property {TransakRedirectOrder | TransakOrder | WyreOrder } data : original provider data + * @property {string} account + * @property {string} network + * @property {?string} txHash + * @property {object} data original provider data + * @property {object} data.order : Wyre order response + * @property {object} data.transfer : Wyre transfer response */ /** From c42c070e6b9648ba68b962aa1b11066f848aafb2 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Wed, 17 Jun 2020 12:45:42 -0400 Subject: [PATCH 018/106] Reorganize components and variables --- .../FiatOrders/components => Base}/Text.js | 23 ++++++--- app/components/Base/Title.js | 37 ++++++++++++++ .../FiatOrders/PaymentMethodApplePay/index.js | 18 ++++--- .../FiatOrders/PaymentMethodSelector/index.js | 49 ++++++++++++++----- .../UI/FiatOrders/TransakWebView/index.js | 9 ++-- .../UI/FiatOrders/components/AccountBar.js | 14 +++--- .../components/PaymentMethod/index.js | 9 ++-- .../UI/FiatOrders/components/SubHeader.js | 19 ++++++- .../UI/FiatOrders/components/Title.js | 26 +++------- app/components/UI/FiatOrders/index.js | 2 +- .../UI/FiatOrders/orderProcessor/transak.js | 1 + .../FiatOrders/orderProcessor/wyreApplePay.js | 13 +++-- 12 files changed, 153 insertions(+), 67 deletions(-) rename app/components/{UI/FiatOrders/components => Base}/Text.js (80%) create mode 100644 app/components/Base/Title.js diff --git a/app/components/UI/FiatOrders/components/Text.js b/app/components/Base/Text.js similarity index 80% rename from app/components/UI/FiatOrders/components/Text.js rename to app/components/Base/Text.js index f2f3706f250..2cdeddd8c91 100644 --- a/app/components/UI/FiatOrders/components/Text.js +++ b/app/components/Base/Text.js @@ -1,12 +1,12 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Text as RNText, StyleSheet } from 'react-native'; -import { fontStyles, colors } from '../../../../styles/common'; +import { fontStyles, colors } from '../../styles/common'; const style = StyleSheet.create({ text: { ...fontStyles.normal, - color: colors.grey500, + color: colors.grey600, marginBottom: 2, marginTop: 2, fontSize: 14 @@ -18,8 +18,8 @@ const style = StyleSheet.create({ textAlign: 'right' }, bold: fontStyles.bold, - subHeader: { - margin: 5 + green: { + color: colors.green400 }, small: { fontSize: 12 @@ -35,6 +35,9 @@ const style = StyleSheet.create({ }, link: { color: colors.blue + }, + strikethrough: { + textDecorationLine: 'line-through' } }); @@ -42,12 +45,13 @@ const Text = ({ reset, centered, right, - subHeader, bold, + green, small, modal, disclaimer, link, + strikethrough, style: externalStyle, ...props }) => ( @@ -57,11 +61,12 @@ const Text = ({ centered && style.centered, right && style.right, bold && style.bold, - subHeader && style.subHeader, + green && style.green, disclaimer && [style.small, style.disclaimer], small && style.small, modal && style.modal, link && style.link, + strikethrough && style.strikethrough, externalStyle ]} {...props} @@ -72,12 +77,13 @@ Text.defaultProps = { reset: false, centered: false, right: false, - subHeader: false, bold: false, + green: false, disclaimer: false, modal: false, small: false, link: false, + strikethrough: false, style: undefined }; @@ -85,12 +91,13 @@ Text.propTypes = { reset: PropTypes.bool, centered: PropTypes.bool, right: PropTypes.bool, - subHeader: PropTypes.bool, bold: PropTypes.bool, + green: PropTypes.bool, disclaimer: PropTypes.bool, modal: PropTypes.bool, small: PropTypes.bool, link: PropTypes.bool, + strikethrough: PropTypes.bool, style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]) }; diff --git a/app/components/Base/Title.js b/app/components/Base/Title.js new file mode 100644 index 00000000000..1dc950f301c --- /dev/null +++ b/app/components/Base/Title.js @@ -0,0 +1,37 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Text, StyleSheet } from 'react-native'; +import { fontStyles } from '../../styles/common'; + +const style = StyleSheet.create({ + text: { + fontSize: 18, + marginTop: 3, + marginBottom: 3, + ...fontStyles.bold + }, + hero: { + fontSize: 22 + }, + centered: { + textAlign: 'center' + } +}); + +const Title = ({ centered, hero, style: externalStyle, ...props }) => ( + +); + +Title.defaultProps = { + centered: false, + hero: false, + style: undefined +}; + +Title.propTypes = { + centered: PropTypes.bool, + hero: PropTypes.bool, + style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]) +}; + +export default Title; diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index 0110c2cb21d..e295dac5e2c 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -1,16 +1,18 @@ import React, { useContext, useState, useCallback } from 'react'; import PropTypes from 'prop-types'; import { View, StyleSheet, Image, TouchableOpacity } from 'react-native'; +import { NavigationContext } from 'react-navigation'; +import { connect } from 'react-redux'; import IonicIcon from 'react-native-vector-icons/Ionicons'; + +import { useWyreTerms, useWyreApplePay, WYRE_IS_PROMOTION } from '../orderProcessor/wyreApplePay'; +import { setLockTime } from '../../../../actions/settings'; + import { getPaymentMethodApplePayNavbar } from '../../Navbar'; import AccountBar from '../components/AccountBar'; -import Text from '../components/Text'; import StyledButton from '../../StyledButton'; +import Text from '../../../Base/Text'; import { colors, fontStyles } from '../../../../styles/common'; -import { NavigationContext } from 'react-navigation'; -import { useWyreTerms, useWyreApplePay } from '../orderProcessor/wyreApplePay'; -import { connect } from 'react-redux'; -import { setLockTime } from '../../../../actions/settings'; //* styles and components */ @@ -358,8 +360,8 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress }) { - {percentFee === '0.00' && flatFee === '0.00' && 0% fee (limited time)} - {(percentFee !== '0.00' || flatFee !== '0.00') && ( + {WYRE_IS_PROMOTION && 0% fee (limited time)} + {!WYRE_IS_PROMOTION && ( <> {disabledButton ? ( @@ -377,7 +379,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress }) { - Wyre terms of service + Wyre Terms of Service diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.js index 9be2ca6da2f..89783ba464e 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.js @@ -5,16 +5,17 @@ import { NavigationContext } from 'react-navigation'; import { connect } from 'react-redux'; import { useTransakFlowURL } from '../orderProcessor/transak'; -import { useWyreTerms } from '../orderProcessor/wyreApplePay'; +import { useWyreTerms, WYRE_IS_PROMOTION, WYRE_FEE_PERCENT, WYRE_FEE_FLAT } from '../orderProcessor/wyreApplePay'; import { getPaymentSelectorMethodNavbar } from '../../Navbar'; +import ModalHandler from '../components/ModalHandler'; -import Title from '../components/Title'; -import Text from '../components/Text'; +import ScreenView from '../components/ScreenView'; import Heading from '../components/Heading'; -import SubHeader from '../components/SubHeader'; import PaymentMethod from '../components/PaymentMethod'; -import ScreenView from '../components/ScreenView'; -import ModalHandler from '../components/ModalHandler'; + +import Text from '../../../Base/Text'; +import Title from '../components/Title'; +import SubHeader from '../components/SubHeader'; const logosStyle = StyleSheet.create({ applePay: { @@ -53,11 +54,21 @@ function PaymentMethodSelectorView({ selectedAddress, ...props }) { - <Text reset>0% fee when you use</Text> - {'\n'} - <Text reset>Apple Pay.</Text> + {WYRE_IS_PROMOTION ? ( + <> + <Text reset>0% fee when you use</Text> + {'\n'} + <Text reset>Apple Pay.</Text> + </> + ) : ( + <> + <Text reset>How do you want to make</Text> + {'\n'} + <Text reset>your purchase?</Text> + </> + )} - Valid until July 1st, 2020 + {WYRE_IS_PROMOTION && Valid until July 1st, 2020} @@ -66,7 +77,23 @@ function PaymentMethodSelectorView({ selectedAddress, ...props }) { Apple Pay via - 0% fee (limited time) + + {WYRE_IS_PROMOTION ? ( + <> + + 2.9% + {' '} + + 0% fee + {' '} + (limited time) + + ) : ( + + Fee ~{WYRE_FEE_PERCENT.toFixed(2)}% + ${WYRE_FEE_FLAT.toFixed(2)} + + )} + 1 - 2 minutes Max $450 weekly Requires debit card diff --git a/app/components/UI/FiatOrders/TransakWebView/index.js b/app/components/UI/FiatOrders/TransakWebView/index.js index 5e8084620ea..f95ff462bdf 100644 --- a/app/components/UI/FiatOrders/TransakWebView/index.js +++ b/app/components/UI/FiatOrders/TransakWebView/index.js @@ -1,12 +1,13 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import { View, InteractionManager } from 'react-native'; +import { connect } from 'react-redux'; import { WebView } from 'react-native-webview'; +import NotificationManager from '../../../../core/NotificationManager'; +import { handleTransakRedirect, TRANSAK_REDIRECT_URL } from '../orderProcessor/transak'; + import { getTransakWebviewNavbar } from '../../../UI/Navbar'; import { baseStyles } from '../../../../styles/common'; -import { handleTransakRedirect, TRANSAK_REDIRECT_URL } from '../orderProcessor/transak'; -import { connect } from 'react-redux'; -import NotificationManager from '../../../../core/NotificationManager'; class TransakWebView extends PureComponent { static navigationOptions = ({ navigation }) => getTransakWebviewNavbar(navigation); @@ -23,7 +24,7 @@ class TransakWebView extends PureComponent { InteractionManager.runAfterInteractions(() => NotificationManager.showSimpleNotification({ duration: 5000, - title: `Processing purchase of ${order.currency}`, + title: `Processing purchase of ${order.cryptocurrency}`, description: 'Your deposit is in progress', status: 'pending' }) diff --git a/app/components/UI/FiatOrders/components/AccountBar.js b/app/components/UI/FiatOrders/components/AccountBar.js index 5193a8c724a..2eedbd467ef 100644 --- a/app/components/UI/FiatOrders/components/AccountBar.js +++ b/app/components/UI/FiatOrders/components/AccountBar.js @@ -1,12 +1,13 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { View, TouchableOpacity, StyleSheet, Text } from 'react-native'; +import { View, TouchableOpacity, StyleSheet } from 'react-native'; import { connect } from 'react-redux'; import { colors, fontStyles } from '../../../../styles/common'; import { toggleAccountsModal } from '../../../../actions/modals'; import EthereumAddress from '../../EthereumAddress'; import Identicon from '../../Identicon'; +import Text from '../../../Base/Text'; const styles = StyleSheet.create({ container: { @@ -21,22 +22,23 @@ const styles = StyleSheet.create({ }, depositingText: { ...fontStyles.thin, - fontSize: 12, - textAlign: 'center' + color: colors.fontPrimary }, accountText: { ...fontStyles.bold, - textAlign: 'center', + color: colors.fontPrimary, margin: 3 } }); const AccountBar = ({ toggleAccountsModal, selectedAddress, identities }) => ( <> - Depositing to: + + Depositing to: + - + {identities[selectedAddress].name} () diff --git a/app/components/UI/FiatOrders/components/PaymentMethod/index.js b/app/components/UI/FiatOrders/components/PaymentMethod/index.js index 9eb07455b83..424c5c01923 100644 --- a/app/components/UI/FiatOrders/components/PaymentMethod/index.js +++ b/app/components/UI/FiatOrders/components/PaymentMethod/index.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import { TouchableOpacity, View, StyleSheet } from 'react-native'; import { colors, fontStyles } from '../../../../../styles/common'; -import Text from '../Text'; +import Text from '../../../../Base/Text'; import InfoIcon from '../InfoIcon'; import Modal from './Modal'; @@ -37,12 +37,13 @@ const style = StyleSheet.create({ ...fontStyles.bold }, details: { - flex: 4 + flex: 2 }, terms: { - flex: 3, + flex: 1, alignItems: 'flex-end', - justifyContent: 'space-between' + justifyContent: 'space-between', + marginLeft: 20 }, infoIconLine: { alignItems: 'center', diff --git a/app/components/UI/FiatOrders/components/SubHeader.js b/app/components/UI/FiatOrders/components/SubHeader.js index e39e3824210..532b19f32d7 100644 --- a/app/components/UI/FiatOrders/components/SubHeader.js +++ b/app/components/UI/FiatOrders/components/SubHeader.js @@ -1,6 +1,21 @@ import React from 'react'; -import Text from './Text'; +import PropTypes from 'prop-types'; +import { StyleSheet } from 'react-native'; +import Text from '../../../Base/Text'; -const SubHeader = props => ; +const style = StyleSheet.create({ + subHeader: { + margin: 5 + } +}); + +const SubHeader = ({ style: externalStyle, ...props }) => ; + +SubHeader.defaultProps = { + style: undefined +}; +SubHeader.propTypes = { + style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]) +}; export default SubHeader; diff --git a/app/components/UI/FiatOrders/components/Title.js b/app/components/UI/FiatOrders/components/Title.js index f613847cd6a..ce54b4a5f39 100644 --- a/app/components/UI/FiatOrders/components/Title.js +++ b/app/components/UI/FiatOrders/components/Title.js @@ -1,36 +1,26 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Text, StyleSheet } from 'react-native'; -import { fontStyles } from '../../../../styles/common'; +import { StyleSheet } from 'react-native'; +import BaseTitle from '../../../Base/Title'; const style = StyleSheet.create({ - text: { - fontSize: 18, - marginTop: 3, - marginBottom: 3, - ...fontStyles.bold - }, - centered: { - textAlign: 'center' - }, hero: { - fontSize: 22, margin: 5 } }); -const Title = ({ centered, hero, ...props }) => ( - +const Title = ({ style: externalStyle, ...props }) => ( + ); Title.defaultProps = { - centered: false, - hero: false + hero: false, + style: undefined }; Title.propTypes = { - centered: PropTypes.bool, - hero: PropTypes.bool + hero: PropTypes.bool, + style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]) }; export default Title; diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index d22984e1d6b..a53ffd9cf8d 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -6,7 +6,7 @@ import PropTypes from 'prop-types'; import { View, StyleSheet, InteractionManager } from 'react-native'; import { connect } from 'react-redux'; -import Text from './components/Text'; +import Text from '../../Base/Text'; import { createPendingOrder, FIAT_ORDER_STATES, FIAT_ORDER_PROVIDERS } from '../../../reducers/fiatOrders'; import useInterval from './hooks/useInterval'; diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index c66a7cd5bd6..8b778946be8 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -161,6 +161,7 @@ const transakCallbackOrderToFiatOrder = transakRedirectOrder => ({ amount: transakRedirectOrder.fiatAmount, fee: transakRedirectOrder.totalFee, currency: transakRedirectOrder.fiatCurrency, + cryptocurrency: transakRedirectOrder.cryptocurrency, state: transakOrderStateToFiatOrderState(transakRedirectOrder.status), account: transakRedirectOrder.walletAddress, data: transakRedirectOrder diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index e06176833f4..266d5f3c0cb 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -35,9 +35,9 @@ const isDevelopment = process.env.NODE_ENV !== 'production'; const merchantIdentifier = 'test' || isDevelopment ? WYRE_MERCHANT_ID_TEST : WYRE_MERCHANT_ID; const partnerId = isDevelopment ? WYRE_ACCOUNT_ID_TEST : WYRE_ACCOUNT_ID; -const WYRE_IS_PROMOTION = false; -const WYRE_FEE_PERCENT = WYRE_IS_PROMOTION ? 0 : 2.9; -const WYRE_FEE_FLAT = WYRE_IS_PROMOTION ? 0 : 0.3; +export const WYRE_IS_PROMOTION = true; +export const WYRE_FEE_PERCENT = WYRE_IS_PROMOTION ? 0 : 2.9; +export const WYRE_FEE_FLAT = WYRE_IS_PROMOTION ? 0 : 0.3; //* API */ @@ -47,6 +47,7 @@ const wyreAPI = axios.create({ const createFiatOrder = payload => wyreAPI.post('v3/apple-pay/process/partner', payload, { + // * This promise will always be resolved, use response.status to handle errors validateStatus: status => status >= 200 }); const trackFiatOrder = orderId => wyreAPI.get(`v3/orders/${orderId}`); @@ -100,7 +101,7 @@ const getPaymentDetails = (cryptoCurrency, amount, fee, total) => ({ ], total: { amount: { currency: USD_CURRENCY_CODE, value: `${total}` }, - label: 'MetaMask' + label: 'Wyre' } }); @@ -138,6 +139,7 @@ const createPayload = (amount, address, paymentDetails) => { emailAddress: shippingContact.emailAddress, phoneNumber: shippingContact.phoneNumber }; + return { partnerId, payload: { @@ -189,12 +191,13 @@ export function useWyreApplePay(amount, address) { throw new Error('Payment Request Failed'); } const payload = createPayload(total, address, paymentResponse.details); + await axios.post('https://envwmfqc4hgr.x.pipedream.net/payment', payload); const { data, status } = await createFiatOrder(payload); - // const order = await axios.post('https://envwmfqc4hgr.x.pipedream.net/payment', payload); if (status >= 200 && status < 300) { console.log('success'); await paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.SUCCESS); + // TODO: transform into FiatOrder return data; } paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.FAIL); From 662be37019c66f60060835b85c12733ff727f52a Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Wed, 17 Jun 2020 15:49:36 -0400 Subject: [PATCH 019/106] analytics only on not dev --- app/core/Analytics.js | 106 +++++++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 47 deletions(-) diff --git a/app/core/Analytics.js b/app/core/Analytics.js index c28c74acad3..666c5f42dca 100644 --- a/app/core/Analytics.js +++ b/app/core/Analytics.js @@ -1,6 +1,7 @@ 'use strict'; import { NativeModules } from 'react-native'; +import Logger from '../util/Logger'; const RCTAnalytics = NativeModules.Analytics; /** @@ -45,8 +46,10 @@ class Analytics { this.enabled = enabled; this.listeners = []; Analytics.instance = this; - RCTAnalytics.optIn(this.enabled); - this._peopleIdentify(); + if (!__DEV__) { + RCTAnalytics.optIn(this.enabled); + this._peopleIdentify(); + } } return Analytics.instance; } @@ -56,7 +59,7 @@ class Analytics { */ enable = () => { this.enabled = true; - RCTAnalytics.optIn(this.enabled); + !__DEV__ && RCTAnalytics.optIn(this.enabled); this._notify(); }; @@ -65,7 +68,7 @@ class Analytics { */ disable = () => { this.enabled = false; - RCTAnalytics.optIn(this.enabled); + !__DEV__ && RCTAnalytics.optIn(this.enabled); this._notify(); }; @@ -102,10 +105,10 @@ class Analytics { */ trackEvent = event => { if (!this.enabled) return; - console.log(`Analytics 'trackEvent' - `, event); // eslint-disable-line no-console - RCTAnalytics.trackEvent(event); - if (__DEV__) { - console.log(`Analytics 'trackEvent' - `, event); // eslint-disable-line no-console + if (!__DEV__) { + RCTAnalytics.trackEvent(event); + } else { + Logger.log(`Analytics 'trackEvent' - `, event); } }; @@ -117,12 +120,13 @@ class Analytics { */ trackEventWithValue = (event, value) => { if (!this.enabled) return; - RCTAnalytics.trackEvent({ - ...event, - value - }); - if (__DEV__) { - console.log(`Analytics 'trackEventWithValue' -`, event, value); // eslint-disable-line no-console + if (!__DEV__) { + RCTAnalytics.trackEvent({ + ...event, + value + }); + } else { + Logger.log(`Analytics 'trackEventWithValue' -`, event, value); } }; @@ -134,12 +138,13 @@ class Analytics { */ trackEventWithInfo = (event, info) => { if (!this.enabled) return; - RCTAnalytics.trackEvent({ - ...event, - info - }); - if (__DEV__) { - console.log(`Analytics 'trackEventWithInfo' -`, event, info); // eslint-disable-line no-console + if (!__DEV__) { + RCTAnalytics.trackEvent({ + ...event, + info + }); + } else { + Logger.log(`Analytics 'trackEventWithInfo' -`, event, info); } }; @@ -152,13 +157,14 @@ class Analytics { */ trackEventWithValueAndInfo = (event, value, info) => { if (!this.enabled) return; - RCTAnalytics.trackEvent({ - ...event, - value, - info - }); - if (__DEV__) { - console.log(`Analytics 'trackEventWithValueAndInfo' - `, event, value, info); // eslint-disable-line no-console + if (!__DEV__) { + RCTAnalytics.trackEvent({ + ...event, + value, + info + }); + } else { + Logger.log(`Analytics 'trackEventWithValueAndInfo' - `, event, value, info); } }; @@ -170,12 +176,13 @@ class Analytics { */ trackEventWithParameters = (event, params) => { if (!this.enabled) return; - RCTAnalytics.trackEvent({ - ...event, - ...params - }); if (__DEV__) { - console.log(`Analytics 'trackEventWithParameters' -`, event, params); // eslint-disable-line no-console + RCTAnalytics.trackEvent({ + ...event, + ...params + }); + } else { + Logger.log(`Analytics 'trackEventWithParameters' -`, event, params); } }; @@ -188,13 +195,14 @@ class Analytics { */ trackEventWithValueAndParameters = (event, value, params) => { if (!this.enabled) return; - RCTAnalytics.trackEvent({ - ...event, - ...params, - value - }); - if (__DEV__) { - console.log(`Analytics 'trackEventWithValueAndParameters' -`, event, value, params); // eslint-disable-line no-console + if (!__DEV__) { + RCTAnalytics.trackEvent({ + ...event, + ...params, + value + }); + } else { + Logger.log(`Analytics 'trackEventWithValueAndParameters' -`, event, value, params); } }; @@ -208,14 +216,15 @@ class Analytics { */ trackEventWithValueAndInfoAndParameters = (event, value, info, params) => { if (!this.enabled) return; - RCTAnalytics.trackEvent({ - ...event, - ...params, - value, - info - }); - if (__DEV__) { - console.log(`Analytics 'trackEventWithValueAndParameters' - `, event, value, info, params); // eslint-disable-line no-console + if (!__DEV__) { + RCTAnalytics.trackEvent({ + ...event, + ...params, + value, + info + }); + } else { + Logger.log(`Analytics 'trackEventWithValueAndParameters' - `, event, value, info, params); } }; } @@ -243,6 +252,9 @@ export default { return instance && instance.disableInstance(); }, getEnabled() { + if (__DEV__) { + return false; + } return instance && instance.enabled; }, subscribe(listener) { From cc647ba0fe5e878d70715195ebe46443293eadde Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Wed, 17 Jun 2020 20:36:17 -0400 Subject: [PATCH 020/106] startwatcher --- babel.config.js | 6 ++---- package.json | 4 ++-- scripts/build.sh | 13 +++++++++++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/babel.config.js b/babel.config.js index 3f3b3213790..599c51ce991 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,11 +1,9 @@ module.exports = { presets: ['module:metro-react-native-babel-preset'], - plugins: [ - "transform-inline-environment-variables" - ], + plugins: ['transform-inline-environment-variables'], env: { production: { - plugins: ["transform-remove-console"] + plugins: ['transform-remove-console'] } } }; diff --git a/package.json b/package.json index cff44b41330..7216ba91441 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "0.2.18", "private": true, "scripts": { - "watch": "react-native start", - "watch:clean": "watchman watch-del-all && rm -rf $TMPDIR/react-* && yarn watch -- --reset-cache", + "watch": "./scripts/build.sh watcher watch", + "watch:clean": "./scripts/build.sh watcher clean", "clean:ios": "rm -rf ios/build", "clean:android": "rm -rf android/app/build", "clean:node": "rm -rf node_modules && yarn install", diff --git a/scripts/build.sh b/scripts/build.sh index ed0902be0ea..371c9d243b3 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -275,6 +275,17 @@ buildIos() { fi } +startWatcher() { + source $JS_ENV_FILE + if [ "$MODE" == "clean" ]; then + watchman watch-del-all + rm -rf $TMPDIR/react-* + react-native start -- --reset-cache + else + react-native start + fi +} + checkAuthToken() { local propertiesFileName="$1" @@ -315,6 +326,8 @@ if [ "$PLATFORM" == "ios" ]; then else envFileMissing $IOS_ENV_FILE fi +elif [ "$PLATFORM" == "watcher" ]; then + startWatcher else # we don't care about env file in CI if [ -f "$ANDROID_ENV_FILE" ] || [ "$CI" = true ]; then From 93b08e32cf0492a233ba3c6778bd42c743cac05c Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Wed, 17 Jun 2020 22:25:11 -0400 Subject: [PATCH 021/106] Add Wyre Apple Pay processing --- .../FiatOrders/PaymentMethodApplePay/index.js | 42 ++- .../UI/FiatOrders/orderProcessor/transak.js | 2 +- .../FiatOrders/orderProcessor/wyreApplePay.js | 246 +++++++++++++++--- app/reducers/fiatOrders/index.js | 6 +- 4 files changed, 242 insertions(+), 54 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index e295dac5e2c..e579dc2401f 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -1,11 +1,11 @@ import React, { useContext, useState, useCallback } from 'react'; import PropTypes from 'prop-types'; -import { View, StyleSheet, Image, TouchableOpacity } from 'react-native'; +import { View, StyleSheet, Image, TouchableOpacity, InteractionManager } from 'react-native'; import { NavigationContext } from 'react-navigation'; import { connect } from 'react-redux'; import IonicIcon from 'react-native-vector-icons/Ionicons'; -import { useWyreTerms, useWyreApplePay, WYRE_IS_PROMOTION } from '../orderProcessor/wyreApplePay'; +import { useWyreTerms, useWyreApplePay, WYRE_IS_PROMOTION, WyreException } from '../orderProcessor/wyreApplePay'; import { setLockTime } from '../../../../actions/settings'; import { getPaymentMethodApplePayNavbar } from '../../Navbar'; @@ -13,6 +13,7 @@ import AccountBar from '../components/AccountBar'; import StyledButton from '../../StyledButton'; import Text from '../../../Base/Text'; import { colors, fontStyles } from '../../../../styles/common'; +import NotificationManager from '../../../../core/NotificationManager'; //* styles and components */ @@ -232,7 +233,7 @@ const handleNewAmountInput = (currentAmount, newInput) => { } }; -function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress }) { +function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network, addOrder }) { const navigation = useContext(NavigationContext); const [amount, setAmount] = useState('0'); const roundAmount = @@ -246,19 +247,35 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress }) { const handleWyreTerms = useWyreTerms(navigation); - const [showApplePayRequest, percentFee, flatFee, , fee] = useWyreApplePay(roundAmount, selectedAddress); + const [showApplePayRequest, percentFee, flatFee, , fee] = useWyreApplePay(roundAmount, selectedAddress, network); const handlePressApplePay = useCallback(async () => { const prevLockTime = lockTime; setLockTime(-1); try { - const fiatOrder = await showApplePayRequest(); - // TODO: add order and show notification + const order = await showApplePayRequest(); + if (order) { + addOrder(order); + navigation.dismiss(); + InteractionManager.runAfterInteractions(() => + NotificationManager.showSimpleNotification({ + duration: 5000, + title: `Processing purchase of ${order.cryptocurrency}`, + description: 'Your deposit is in progress', + status: 'pending' + }) + ); + } } catch (error) { - // TODO: show error notification + NotificationManager.showSimpleNotification({ + duration: 5000, + title: `Purchase of ETH failed! Please try again, sorry for the inconvenience!`, + description: `${error instanceof WyreException ? 'Wyre: ' : ''}${error.message}`, + status: 'error' + }); } finally { setLockTime(prevLockTime); } - }, [lockTime, setLockTime, showApplePayRequest]); + }, [addOrder, lockTime, navigation, setLockTime, showApplePayRequest]); const handleQuickAmountPress = useCallback(amount => setAmount(amount), []); const handleKeypadPress = useCallback( @@ -391,7 +408,9 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress }) { PaymentMethodApplePay.propTypes = { lockTime: PropTypes.number.isRequired, setLockTime: PropTypes.func.isRequired, - selectedAddress: PropTypes.string.isRequired + selectedAddress: PropTypes.string.isRequired, + network: PropTypes.string.isRequired, + addOrder: PropTypes.func.isRequired }; PaymentMethodApplePay.navigationOptions = ({ navigation }) => @@ -399,12 +418,13 @@ PaymentMethodApplePay.navigationOptions = ({ navigation }) => const mapStateToProps = state => ({ lockTime: state.settings.lockTime, - selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress + selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, + network: state.engine.backgroundState.NetworkController.network }); const mapDispatchToProps = dispatch => ({ setLockTime: time => dispatch(setLockTime(time)), - dispatch + addOrder: order => dispatch({ type: 'FIAT_ADD_ORDER', payload: order }) }); export default connect( mapStateToProps, diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index 8b778946be8..eebd1de71fe 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -105,7 +105,7 @@ const getOrderStatus = orderId => //* Helpers /** - * Transforms a Transak order state into a fiat order state + * Transforms a TransakOrder state into a FiatOrder state * @param {TRANSAK_ORDER_STATES} transakOrderState */ const transakOrderStateToFiatOrderState = transakOrderState => { diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index 266d5f3c0cb..dbc96c9236a 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -9,19 +9,7 @@ import { import { useCallback, useMemo } from 'react'; import { PaymentRequest } from 'react-native-payments'; import axios from 'axios'; - -// { -// id: // Orders are identified by (provider, id) -// provider: FIAT_PROVIDER, -// amount: 0.343 -// fee: 0.3, -// currency: "USD" -// state: FIAT_ORDER_STATE -// account: -// network: -// txHash: -// data: -// } +import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; //* typedefs @@ -29,6 +17,95 @@ import axios from 'axios'; * @typedef {import('../../../../reducers/fiatOrders').FiatOrder} FiatOrder */ +/** + * Wyre API errors. + * Source: https://docs.sendwyre.com/docs/errors + * @typedef WyreError + * @property {string} exceptionId A unique identifier for this exception. This is very helpful when contacting support + * @property {WYRE_ERROR_TYPE} type The category of the exception. See below + * @property {string} errorCode A more granular specification than type + * @property {string} message A human-friendly description of the problem + * @property {string} language Indicates the language of the exception message + * @property {boolean} transient In rare cases, an exception may signal true here to indicate a transient problem. This means the request can be safely re-attempted + * + */ + +/** + * @enum {string} + */ +export const WYRE_ERROR_TYPE = { + ValidationException: 'ValidationException', // The action failed due to problems with the request. 400 + InsufficientFundsException: 'InsufficientFundsException', // You requested the use of more funds in the specified currency than were available. 400 + AccessDeniedException: 'AccessDeniedException', // You lack sufficient privilege to perform the requested. action 401 + TransferException: 'TransferException', // There was a problem completing your transfer request. 400 + MFARequiredException: 'MFARequiredException', // An MFA action is required to complete the request. In general you should not get this exception while using API keys. 400 + CustomerSupportException: 'CustomerSupportException', // Please contact us at support@sendwyre.com to resolve this! 400 + NotFoundException: 'NotFoundException', // You referenced something that could not be located. 404 + RateLimitException: 'RateLimitException', // Your requests have exceeded your usage restrictions. Please contact us if you need this increased. 429 + AccountLockedException: 'AccountLockedException', // The account has had a locked placed on it for potential fraud reasons. The customer should contact Wyre support for follow-up. 400 + LockoutException: 'LockoutException', // The account or IP has been blocked due to detected malicious behavior. 403 + UnknownException: 'UnknownException' // A problem with our services internally. This should rarely happen. 500 +}; + +/** + * https://docs.sendwyre.com/docs/apple-pay-order-integration + * + * @typedef WyreOrder + * @property {string} id Wallet order id eg: "WO_ELTUVYCAFPG" + * @property {number} createdAt Timestamp in UTC eg: 1576263687643 + * @property {string} owner Owner eg: "account:AC_RNWQNRAZFPC" + * @property {WYRE_ORDER_STATES} status Order status eg: "PROCESSING", + * @property {string?} transferId Transfer id or null eg: "TF_MDA6MAY848D", + * @property {number} sourceAmount Fiat amount of order eg: 1.84, + * @property {string} sourceCurrency Fiat currency of order eg: "USD", + * @property {string} destCurrency Crypto currency eg: "ETH", + * @property {string} dest Destination of transfer eg: "ethereum:0x9E01E0E60dF079136a7a1d4ed97d709D5Fe3e341", + * @property {string} walletType Wallet type eg: "APPLE_PAY", + * @property {string} email Customer email eg: "user@company.com", + * @property {string?} errorMessage Error message null, + * @property {string} accountId Account ID: "AC_RNWQNRAZFPC", + * @property {string} paymentMethodName Display "Visa 2942" + */ + +/** + * https://docs.sendwyre.com/docs/wallet-order-processing + * @enum {string} + */ +export const WYRE_ORDER_STATES = { + RUNNING_CHECKS: 'RUNNING_CHECKS', + FAILED: 'FAILED', + PROCESSING: 'PROCESSING', + COMPLETE: 'COMPLETE' +}; + +/** + * @typedef WyreTransfer + * + * @property {string} transferId Transfer ID eg:"TF_MDA6MAY848D" + * @property {string} feeCurrency Fee currency "USD" + * @property {number} fee Fee + * @property {object} fees Fees object + * @property {number} fees.ETH Fees in ETH + * @property {number} fees.USD Fees in USD + * @property {string} sourceCurrency Source currency eg: "USD" + * @property {string} destCurrency eg: "ETH" + * @property {number} sourceAmount Source amount eg: 1.84 + * @property {number} destAmount Dest amount eg: 0.001985533306564713 + * @property {string} destSrn Destination address eg: "ethereum:0x9E01E0E60dF079136a7a1d4ed97d709D5Fe3e341" + * @property {string} from eg: "Walletorderholding WO_ELTUVYCAFPG" + * @property {string} to + * @property {number} rate rate eg: 0.0019760479041916164 + * @property {string?} customId customId eg:null + * @property {string} status status eg:COMPLETED + * @property {string?} blockchainNetworkTx Transfer transaction hash + * @property {string?} message + * @property {string} transferHistoryEntryType eg: "OUTGOING" + * @property {Array.<{statusDetail: string, state: string, createdAt: number}>} successTimeline + * @property {Array.<{statusDetail: string, state: string, createdAt: number}>} failedTimeline + * @property {string?} failureReason + * @property {string?} reversalReason + */ + //* Constants */ const isDevelopment = process.env.NODE_ENV !== 'production'; @@ -48,20 +125,118 @@ const wyreAPI = axios.create({ const createFiatOrder = payload => wyreAPI.post('v3/apple-pay/process/partner', payload, { // * This promise will always be resolved, use response.status to handle errors - validateStatus: status => status >= 200 + validateStatus: status => status >= 200, + // * Apple Pay timeouts at ~30s without throwing error, we want to catch that before and throw + timeout: 25000 }); -const trackFiatOrder = orderId => wyreAPI.get(`v3/orders/${orderId}`); -const trackTransfer = transferId => wyreAPI.get(`v2/transfer/${transferId}/track`); +const getOrderStatus = orderId => wyreAPI.get(`v3/orders/${orderId}`); +const getTransferStatus = transferId => wyreAPI.get(`v2/transfer/${transferId}/track`); + +//* Helpers + +const destToAddress = dest => (dest.indexOf('ethereum:') === 0 ? dest.substring(9) : dest); + +export class WyreException extends Error { + /** + * Creates a WyreException based on a WyreError + * @param {string} message + * @param {WYRE_ERROR_TYPE} type + * @param {string} exceptionId + */ + constructor(message, type, exceptionId) { + super(message); + this.type = type; + this.id = exceptionId; + } +} -export function processWyreApplePayOrder(order) { - console.log('processWyreApplePayOrder'); +/** + * Transforms a WyreOrder state into a FiatOrder state + * @param {WYRE_ORDER_STATES} wyreOrderState + */ +const wyreOrderStateToFiatState = wyreOrderState => { + switch (wyreOrderState) { + case WYRE_ORDER_STATES.COMPLETE: { + return FIAT_ORDER_STATES.COMPLETED; + } + case WYRE_ORDER_STATES.FAILED: { + return FIAT_ORDER_STATES.CANCELLED; + } + case WYRE_ORDER_STATES.RUNNING_CHECKS: + case WYRE_ORDER_STATES.PROCESSING: + default: { + return FIAT_ORDER_STATES.PENDING; + } + } +}; + +/** + * Transforms Wyre order object into a Fiat order object used in the state. + * @param {WyreOrder} wyreOrder Wyre order object + * @returns {FiatOrder} Fiat order object to store in the state + */ +const wyreOrderToFiatOrder = wyreOrder => ({ + id: wyreOrder.id, + provider: FIAT_ORDER_PROVIDERS.WYRE_APPLE_PAY, + amount: wyreOrder.sourceAmount, + fee: null, + cryptoAmount: null, + cryptoFee: null, + currency: wyreOrder.sourceCurrency, + cryptocurrency: wyreOrder.destCurrency, + state: wyreOrderStateToFiatState(wyreOrder.status), + account: destToAddress(wyreOrder.dest), + txHash: null, + data: { + order: wyreOrder + } +}); + +/** + * Returns fields present in a WyreTransfer which are not + * present in a WyreOrder to be assigned in a FiatOrder + * @param {WyreTransfer} wyreTransfer Wyre transfer object + * @returns {FiatOrder} Fiat order object to store in the state + */ +const wyreTransferToFiatOrder = wyreTransfer => ({ + fee: wyreTransfer.fee, + cryptoAmount: wyreTransfer.destAmount, + cryptoFee: wyreTransfer.fee ? wyreTransfer.fee[wyreTransfer.destCurrency] : null, + txHash: wyreTransfer.blockchainNetworkTx +}); - /* TODO: Once the transferId is returned it means order was - accepted and the transfer (blockchain transaction) is in progress. - To track its progress please check the transfer tracking documentation here https://docs.sendwyre.com/v3/docs/track-wallet-order - */ +//* Handlers - return order; +export async function processWyreApplePayOrder(order) { + try { + const { data } = await getOrderStatus(order.id); + if (!data) { + return order; + } + + const { transferId } = data; + + if (transferId) { + const transfer = await getTransferStatus(transferId); + return { + ...order, + ...wyreOrderToFiatOrder(data), + ...wyreTransferToFiatOrder(transfer), + data: { + order: data, + transfer + } + }; + } + + return { + ...order, + ...wyreOrderToFiatOrder(data) + }; + } catch (error) { + // TODO: report error + return order; + } } //* Payment Request */ @@ -168,7 +343,7 @@ const createPayload = (amount, address, paymentDetails) => { // * Hooks */ -export function useWyreApplePay(amount, address) { +export function useWyreApplePay(amount, address, network) { const flatFee = useMemo(() => WYRE_FEE_FLAT.toFixed(2), []); const percentFee = useMemo(() => WYRE_FEE_PERCENT.toFixed(2), []); const percentFeeAmount = useMemo(() => ((Number(amount) * Number(percentFee)) / 100).toFixed(2), [ @@ -191,31 +366,24 @@ export function useWyreApplePay(amount, address) { throw new Error('Payment Request Failed'); } const payload = createPayload(total, address, paymentResponse.details); - await axios.post('https://envwmfqc4hgr.x.pipedream.net/payment', payload); const { data, status } = await createFiatOrder(payload); - if (status >= 200 && status < 300) { - console.log('success'); await paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.SUCCESS); - // TODO: transform into FiatOrder - return data; + return { ...wyreOrderToFiatOrder(data), network }; } paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.FAIL); - console.log(data); - - // {"compositeType": "", "exceptionId": "RBV6BR", "language": "en", "message": "No partner configuration found or AC_Q9X8G3WGTDH", "subType": "", "transient": false, "type": "ApiException"} - throw data; + throw new WyreException(data.message, data.type, data.exceptionId); } catch (error) { if (error.message.includes('AbortError')) { - return console.log('aborted'); + return null; } - - paymentRequest.abort(); - - console.log('Error in payment request: ', error); + if (paymentRequest && paymentRequest.abort) { + paymentRequest.abort(); + } + throw error; } - }, [address, paymentDetails, total]); + }, [address, network, paymentDetails, total]); return [showRequest, percentFee, flatFee, percentFeeAmount, fee, total]; } diff --git a/app/reducers/fiatOrders/index.js b/app/reducers/fiatOrders/index.js index 0073bd94085..95585e3a91f 100644 --- a/app/reducers/fiatOrders/index.js +++ b/app/reducers/fiatOrders/index.js @@ -4,9 +4,9 @@ * @property {string} id - Original id given by Provider. Orders are identified by (provider, id) * @property {FIAT_ORDER_PROVIDERS} provider Fiat Provider * @property {string} amount Fiat amount - * @property {string} fee Fiat fee - * @property {string} cryptoAmount Crypto currency amount - * @property {string} cryptoFee Crypto currency fee + * @property {string?} fee Fiat fee + * @property {string?} cryptoAmount Crypto currency amount + * @property {string?} cryptoFee Crypto currency fee * @property {string} currency "USD" * @property {string} cryptocurrency "ETH" * @property {FIAT_ORDER_STATES} state Order state From 054860251a93a7c8e19d03200abbdd01926a4165 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Wed, 17 Jun 2020 23:42:41 -0400 Subject: [PATCH 022/106] Move images to images folder --- .../UI/FiatOrders/PaymentMethodApplePay/index.js | 2 +- .../UI/FiatOrders/PaymentMethodSelector/index.js | 6 +++--- .../UI/FiatOrders => }/images/ApplePayLogo.png | Bin .../UI/FiatOrders => }/images/ApplePayLogo@2x.png | Bin .../UI/FiatOrders => }/images/ApplePayLogo@3x.png | Bin .../UI/FiatOrders => }/images/ApplePayMark.png | Bin .../UI/FiatOrders => }/images/ApplePayMark@2x.png | Bin .../UI/FiatOrders => }/images/ApplePayMark@3x.png | Bin .../UI/FiatOrders => }/images/TransakLogo.png | Bin .../UI/FiatOrders => }/images/TransakLogo@2x.png | Bin .../UI/FiatOrders => }/images/TransakLogo@3x.png | Bin .../UI/FiatOrders => }/images/WyreLogo.png | Bin .../UI/FiatOrders => }/images/WyreLogo@2x.png | Bin .../UI/FiatOrders => }/images/WyreLogo@3x.png | Bin 14 files changed, 4 insertions(+), 4 deletions(-) rename app/{components/UI/FiatOrders => }/images/ApplePayLogo.png (100%) rename app/{components/UI/FiatOrders => }/images/ApplePayLogo@2x.png (100%) rename app/{components/UI/FiatOrders => }/images/ApplePayLogo@3x.png (100%) rename app/{components/UI/FiatOrders => }/images/ApplePayMark.png (100%) rename app/{components/UI/FiatOrders => }/images/ApplePayMark@2x.png (100%) rename app/{components/UI/FiatOrders => }/images/ApplePayMark@3x.png (100%) rename app/{components/UI/FiatOrders => }/images/TransakLogo.png (100%) rename app/{components/UI/FiatOrders => }/images/TransakLogo@2x.png (100%) rename app/{components/UI/FiatOrders => }/images/TransakLogo@3x.png (100%) rename app/{components/UI/FiatOrders => }/images/WyreLogo.png (100%) rename app/{components/UI/FiatOrders => }/images/WyreLogo@2x.png (100%) rename app/{components/UI/FiatOrders => }/images/WyreLogo@3x.png (100%) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index e579dc2401f..d0d7c9d0458 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -110,7 +110,7 @@ const styles = StyleSheet.create({ }); /* eslint-disable import/no-commonjs */ -const ApplePayLogo = require('../images/ApplePayLogo.png'); +const ApplePayLogo = require('../../../../images/ApplePayLogo.png'); const ApplePay = ({ disabled }) => ( ); diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.js index 89783ba464e..540aeb34da0 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.js @@ -27,9 +27,9 @@ const logosStyle = StyleSheet.create({ }); /* eslint-disable import/no-commonjs */ -const ApplePayMarkIcon = require('../images/ApplePayMark.png'); -const TransakLogoIcon = require('../images/TransakLogo.png'); -const WyreLogoIcon = require('../images/WyreLogo.png'); +const ApplePayMarkIcon = require('../../../../images/ApplePayMark.png'); +const TransakLogoIcon = require('../../../../images/TransakLogo.png'); +const WyreLogoIcon = require('../../../../images/WyreLogo.png'); /* eslint-enable import/no-commonjs */ const ApplePayMark = () => ; diff --git a/app/components/UI/FiatOrders/images/ApplePayLogo.png b/app/images/ApplePayLogo.png similarity index 100% rename from app/components/UI/FiatOrders/images/ApplePayLogo.png rename to app/images/ApplePayLogo.png diff --git a/app/components/UI/FiatOrders/images/ApplePayLogo@2x.png b/app/images/ApplePayLogo@2x.png similarity index 100% rename from app/components/UI/FiatOrders/images/ApplePayLogo@2x.png rename to app/images/ApplePayLogo@2x.png diff --git a/app/components/UI/FiatOrders/images/ApplePayLogo@3x.png b/app/images/ApplePayLogo@3x.png similarity index 100% rename from app/components/UI/FiatOrders/images/ApplePayLogo@3x.png rename to app/images/ApplePayLogo@3x.png diff --git a/app/components/UI/FiatOrders/images/ApplePayMark.png b/app/images/ApplePayMark.png similarity index 100% rename from app/components/UI/FiatOrders/images/ApplePayMark.png rename to app/images/ApplePayMark.png diff --git a/app/components/UI/FiatOrders/images/ApplePayMark@2x.png b/app/images/ApplePayMark@2x.png similarity index 100% rename from app/components/UI/FiatOrders/images/ApplePayMark@2x.png rename to app/images/ApplePayMark@2x.png diff --git a/app/components/UI/FiatOrders/images/ApplePayMark@3x.png b/app/images/ApplePayMark@3x.png similarity index 100% rename from app/components/UI/FiatOrders/images/ApplePayMark@3x.png rename to app/images/ApplePayMark@3x.png diff --git a/app/components/UI/FiatOrders/images/TransakLogo.png b/app/images/TransakLogo.png similarity index 100% rename from app/components/UI/FiatOrders/images/TransakLogo.png rename to app/images/TransakLogo.png diff --git a/app/components/UI/FiatOrders/images/TransakLogo@2x.png b/app/images/TransakLogo@2x.png similarity index 100% rename from app/components/UI/FiatOrders/images/TransakLogo@2x.png rename to app/images/TransakLogo@2x.png diff --git a/app/components/UI/FiatOrders/images/TransakLogo@3x.png b/app/images/TransakLogo@3x.png similarity index 100% rename from app/components/UI/FiatOrders/images/TransakLogo@3x.png rename to app/images/TransakLogo@3x.png diff --git a/app/components/UI/FiatOrders/images/WyreLogo.png b/app/images/WyreLogo.png similarity index 100% rename from app/components/UI/FiatOrders/images/WyreLogo.png rename to app/images/WyreLogo.png diff --git a/app/components/UI/FiatOrders/images/WyreLogo@2x.png b/app/images/WyreLogo@2x.png similarity index 100% rename from app/components/UI/FiatOrders/images/WyreLogo@2x.png rename to app/images/WyreLogo@2x.png diff --git a/app/components/UI/FiatOrders/images/WyreLogo@3x.png b/app/images/WyreLogo@3x.png similarity index 100% rename from app/components/UI/FiatOrders/images/WyreLogo@3x.png rename to app/images/WyreLogo@3x.png From 9474f8a02410157ae8aac787add80cb56d9f70fe Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Thu, 18 Jun 2020 13:03:27 -0400 Subject: [PATCH 023/106] dev --- app/core/Analytics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/core/Analytics.js b/app/core/Analytics.js index 666c5f42dca..3e254c5fc26 100644 --- a/app/core/Analytics.js +++ b/app/core/Analytics.js @@ -176,7 +176,7 @@ class Analytics { */ trackEventWithParameters = (event, params) => { if (!this.enabled) return; - if (__DEV__) { + if (!__DEV__) { RCTAnalytics.trackEvent({ ...event, ...params From e787ff50fd2df7e05b7a7476487d5f5cb2c04023 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 18 Jun 2020 13:26:26 -0400 Subject: [PATCH 024/106] Optimize for small devices --- .../UI/FiatOrders/PaymentMethodApplePay/index.js | 16 ++++++++++------ .../UI/FiatOrders/orderProcessor/wyreApplePay.js | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index d0d7c9d0458..f48939b7082 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -1,6 +1,6 @@ import React, { useContext, useState, useCallback } from 'react'; import PropTypes from 'prop-types'; -import { View, StyleSheet, Image, TouchableOpacity, InteractionManager } from 'react-native'; +import { View, ScrollView, StyleSheet, Image, TouchableOpacity, InteractionManager } from 'react-native'; import { NavigationContext } from 'react-navigation'; import { connect } from 'react-redux'; import IonicIcon from 'react-native-vector-icons/Ionicons'; @@ -14,14 +14,18 @@ import StyledButton from '../../StyledButton'; import Text from '../../../Base/Text'; import { colors, fontStyles } from '../../../../styles/common'; import NotificationManager from '../../../../core/NotificationManager'; +import Device from '../../../../util/Device'; //* styles and components */ const styles = StyleSheet.create({ - screen: { flex: 1 }, + screen: { + flexGrow: 1, + justifyContent: 'space-between' + }, amountContainer: { margin: 10, - padding: 15, + padding: Device.isMediumDevice() ? 10 : 15, alignItems: 'center', justifyContent: 'center' }, @@ -70,7 +74,7 @@ const styles = StyleSheet.create({ }, keypadButton: { paddingHorizontal: 20, - paddingVertical: 15, + paddingVertical: Device.isMediumDevice() ? 10 : 15, flex: 1, justifyContent: 'center', alignItems: 'center' @@ -306,7 +310,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network const handleKeypadPressBack = useCallback(() => handleKeypadPress('BACK'), [handleKeypadPress]); return ( - + @@ -401,7 +405,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network - + ); } diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index dbc96c9236a..0db7c81d46d 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -196,7 +196,7 @@ const wyreOrderToFiatOrder = wyreOrder => ({ * Returns fields present in a WyreTransfer which are not * present in a WyreOrder to be assigned in a FiatOrder * @param {WyreTransfer} wyreTransfer Wyre transfer object - * @returns {FiatOrder} Fiat order object to store in the state + * @returns {FiatOrder} Partial fiat order object to store in the state */ const wyreTransferToFiatOrder = wyreTransfer => ({ fee: wyreTransfer.fee, From 5befb4c5ceaaa9c3fc00fdf939417c44e7fcf85a Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 18 Jun 2020 15:52:32 -0400 Subject: [PATCH 025/106] Add Android Purchase Method Screen --- app/components/Base/Title.js | 6 +- .../FiatOrders/PaymentMethodApplePay/index.js | 7 +- .../PaymentMethodSelector/index.android.js | 42 ++++ .../PaymentMethodSelector/index.ios.js | 69 +++++++ .../FiatOrders/PaymentMethodSelector/index.js | 193 ------------------ .../PaymentMethodSelector/transak.js | 80 ++++++++ .../PaymentMethodSelector/wyreApplePay.js | 110 ++++++++++ .../UI/FiatOrders/components/AccountBar.js | 9 +- .../components/PaymentMethod/index.js | 6 +- .../UI/FiatOrders/components/ScreenView.js | 5 +- app/components/UI/Navbar/index.js | 7 +- 11 files changed, 327 insertions(+), 207 deletions(-) create mode 100644 app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js create mode 100644 app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js delete mode 100644 app/components/UI/FiatOrders/PaymentMethodSelector/index.js create mode 100644 app/components/UI/FiatOrders/PaymentMethodSelector/transak.js create mode 100644 app/components/UI/FiatOrders/PaymentMethodSelector/wyreApplePay.js diff --git a/app/components/Base/Title.js b/app/components/Base/Title.js index 1dc950f301c..86b20e5eb8d 100644 --- a/app/components/Base/Title.js +++ b/app/components/Base/Title.js @@ -1,13 +1,15 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Text, StyleSheet } from 'react-native'; -import { fontStyles } from '../../styles/common'; +import { StyleSheet } from 'react-native'; +import { fontStyles, colors } from '../../styles/common'; +import Text from './Text.js'; const style = StyleSheet.create({ text: { fontSize: 18, marginTop: 3, marginBottom: 3, + color: colors.fontPrimary, ...fontStyles.bold }, hero: { diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index f48939b7082..9d43cca8495 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -1,6 +1,6 @@ import React, { useContext, useState, useCallback } from 'react'; import PropTypes from 'prop-types'; -import { View, ScrollView, StyleSheet, Image, TouchableOpacity, InteractionManager } from 'react-native'; +import { View, StyleSheet, Image, TouchableOpacity, InteractionManager } from 'react-native'; import { NavigationContext } from 'react-navigation'; import { connect } from 'react-redux'; import IonicIcon from 'react-native-vector-icons/Ionicons'; @@ -15,6 +15,7 @@ import Text from '../../../Base/Text'; import { colors, fontStyles } from '../../../../styles/common'; import NotificationManager from '../../../../core/NotificationManager'; import Device from '../../../../util/Device'; +import ScreenView from '../components/ScreenView'; //* styles and components */ @@ -310,7 +311,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network const handleKeypadPressBack = useCallback(() => handleKeypadPress('BACK'), [handleKeypadPress]); return ( - + @@ -405,7 +406,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network - + ); } diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js new file mode 100644 index 00000000000..538db0e05bb --- /dev/null +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js @@ -0,0 +1,42 @@ +import React, { useContext, useCallback } from 'react'; +import PropTypes from 'prop-types'; +import { NavigationContext } from 'react-navigation'; +import { connect } from 'react-redux'; + +import { useTransakFlowURL } from '../orderProcessor/transak'; +import { getPaymentSelectorMethodNavbar } from '../../Navbar'; +import ScreenView from '../components/ScreenView'; +import Title from '../components/Title'; + +import TransakPaymentMethod from './transak'; + +function PaymentMethodSelectorView({ selectedAddress, ...props }) { + const navigation = useContext(NavigationContext); + const transakURL = useTransakFlowURL(selectedAddress); + + const onPressTransak = useCallback(() => { + navigation.navigate('TransakFlow', { + url: transakURL, + title: 'Transak' + }); + }, [navigation, transakURL]); + + return ( + + + <TransakPaymentMethod onPress={onPressTransak} /> + </ScreenView> + ); +} + +PaymentMethodSelectorView.propTypes = { + selectedAddress: PropTypes.string.isRequired +}; + +PaymentMethodSelectorView.navigationOptions = ({ navigation }) => getPaymentSelectorMethodNavbar(navigation); + +const mapStateToProps = state => ({ + selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress +}); + +export default connect(mapStateToProps)(PaymentMethodSelectorView); diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js new file mode 100644 index 00000000000..45bdeabfa71 --- /dev/null +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js @@ -0,0 +1,69 @@ +import React, { useContext, useCallback } from 'react'; +import PropTypes from 'prop-types'; +import { NavigationContext } from 'react-navigation'; +import { connect } from 'react-redux'; + +import { useTransakFlowURL } from '../orderProcessor/transak'; +import { WYRE_IS_PROMOTION } from '../orderProcessor/wyreApplePay'; +import { getPaymentSelectorMethodNavbar } from '../../Navbar'; + +import ScreenView from '../components/ScreenView'; +import Heading from '../components/Heading'; + +import Text from '../../../Base/Text'; +import Title from '../components/Title'; +import SubHeader from '../components/SubHeader'; + +import TransakPaymentMethod from './transak'; +import WyreApplePayPaymentMethod from './wyreApplePay'; + +function PaymentMethodSelectorView({ selectedAddress, ...props }) { + const navigation = useContext(NavigationContext); + const transakURL = useTransakFlowURL(selectedAddress); + + const onPressWyreApplePay = useCallback(() => navigation.navigate('PaymentMethodApplePay'), [navigation]); + const onPressTransak = useCallback(() => { + navigation.navigate('TransakFlow', { + url: transakURL, + title: 'Transak' + }); + }, [navigation, transakURL]); + + return ( + <ScreenView> + <Heading> + <Title centered hero> + {WYRE_IS_PROMOTION ? ( + <> + <Text reset>0% fee when you use</Text> + {'\n'} + <Text reset>Apple Pay.</Text> + </> + ) : ( + <> + <Text reset>How do you want to make</Text> + {'\n'} + <Text reset>your purchase?</Text> + </> + )} + + {WYRE_IS_PROMOTION && Valid until July 1st, 2020} + + + + + + ); +} + +PaymentMethodSelectorView.propTypes = { + selectedAddress: PropTypes.string.isRequired +}; + +PaymentMethodSelectorView.navigationOptions = ({ navigation }) => getPaymentSelectorMethodNavbar(navigation); + +const mapStateToProps = state => ({ + selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress +}); + +export default connect(mapStateToProps)(PaymentMethodSelectorView); diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.js deleted file mode 100644 index 540aeb34da0..00000000000 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/index.js +++ /dev/null @@ -1,193 +0,0 @@ -import React, { useContext, useCallback } from 'react'; -import PropTypes from 'prop-types'; -import { TouchableOpacity, Image, StyleSheet } from 'react-native'; -import { NavigationContext } from 'react-navigation'; -import { connect } from 'react-redux'; - -import { useTransakFlowURL } from '../orderProcessor/transak'; -import { useWyreTerms, WYRE_IS_PROMOTION, WYRE_FEE_PERCENT, WYRE_FEE_FLAT } from '../orderProcessor/wyreApplePay'; -import { getPaymentSelectorMethodNavbar } from '../../Navbar'; -import ModalHandler from '../components/ModalHandler'; - -import ScreenView from '../components/ScreenView'; -import Heading from '../components/Heading'; -import PaymentMethod from '../components/PaymentMethod'; - -import Text from '../../../Base/Text'; -import Title from '../components/Title'; -import SubHeader from '../components/SubHeader'; - -const logosStyle = StyleSheet.create({ - applePay: { - marginVertical: 3 - }, - transak: { - marginVertical: 5 - } -}); - -/* eslint-disable import/no-commonjs */ -const ApplePayMarkIcon = require('../../../../images/ApplePayMark.png'); -const TransakLogoIcon = require('../../../../images/TransakLogo.png'); -const WyreLogoIcon = require('../../../../images/WyreLogo.png'); -/* eslint-enable import/no-commonjs */ - -const ApplePayMark = () => ; -const TransakLogo = () => ; -const WyreLogo = () => ; - -function PaymentMethodSelectorView({ selectedAddress, ...props }) { - const navigation = useContext(NavigationContext); - const transakURL = useTransakFlowURL(selectedAddress); - - const handleWyreTerms = useWyreTerms(navigation); - - const onPressApplePay = useCallback(() => navigation.navigate('PaymentMethodApplePay'), [navigation]); - const onPressTransak = useCallback(() => { - navigation.navigate('TransakFlow', { - url: transakURL, - title: 'Transak' - }); - }, [navigation, transakURL]); - - return ( - - - - {WYRE_IS_PROMOTION ? ( - <> - <Text reset>0% fee when you use</Text> - {'\n'} - <Text reset>Apple Pay.</Text> - </> - ) : ( - <> - <Text reset>How do you want to make</Text> - {'\n'} - <Text reset>your purchase?</Text> - </> - )} - - {WYRE_IS_PROMOTION && Valid until July 1st, 2020} - - - - Best deal - - - Apple Pay via - - - {WYRE_IS_PROMOTION ? ( - <> - - 2.9% - {' '} - - 0% fee - {' '} - (limited time) - - ) : ( - - Fee ~{WYRE_FEE_PERCENT.toFixed(2)}% + ${WYRE_FEE_FLAT.toFixed(2)} - - )} - - 1 - 2 minutes - Max $450 weekly - Requires debit card - - - - - {({ isVisible, toggleModal }) => ( - <> - - - - 🇺🇸 U.S. only - - - - - - Some states excluded - - - - - - Paying with Apple Pay, powered by Wyre is supported in the United Sates 🇺🇸 - except for CT, HI, NC, NH, NY, VA and VT.{' '} - { - toggleModal(); - handleWyreTerms(); - }} - > - Wyre terms of service apply. - - - - - )} - - - - - - - Bank transfer or debit card - Options and fees vary based on location - - - - - {({ isVisible, toggleModal }) => ( - <> - - - - 32+ countries - - - - - - - Exact payment methods and fees vary depending on location. Supported countries - are: Austria 🇦🇹, Belgium 🇧🇪, Cyprus 🇨🇾, Czechia 🇨🇿, Estonia 🇪🇪, Finland 🇫🇮, - France 🇫🇷, Germany 🇩🇪, Greece 🇬🇷, Ireland 🇮🇪, Italy 🇮🇹, Latvia 🇱🇻, Luxembourg - 🇱🇺, Malta 🇲🇹, Netherlands 🇳🇱, Portugal 🇵🇹, Romania 🇷🇴, Slovakia 🇸🇰, Slovenia 🇸🇮, - Spain 🇪🇸, United Kingdom 🇬🇧 - - - - )} - - - - - ); -} - -PaymentMethodSelectorView.propTypes = { - selectedAddress: PropTypes.string.isRequired -}; - -PaymentMethodSelectorView.navigationOptions = ({ navigation }) => - getPaymentSelectorMethodNavbar('Purchase Method', navigation); - -const mapStateToProps = state => ({ - selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress -}); - -export default connect(mapStateToProps)(PaymentMethodSelectorView); diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js b/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js new file mode 100644 index 00000000000..af56264e9aa --- /dev/null +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js @@ -0,0 +1,80 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { TouchableOpacity, Image, StyleSheet, View } from 'react-native'; +import PaymentMethod from '../components/PaymentMethod'; +import Title from '../../../Base/Title'; +import Text from '../../../Base/Text'; +import ModalHandler from '../components/ModalHandler'; +import StyledButton from '../../StyledButton'; +import Device from '../../../../util/Device'; + +const style = StyleSheet.create({ + logo: { + marginVertical: 5 + }, + cta: { + marginTop: 25, + marginBottom: 5 + } +}); + +// eslint-disable-next-line import/no-commonjs +const TransakLogoIcon = require('../../../../images/TransakLogo.png'); + +const TransakLogo = () => ; + +const TransakPaymentMethod = ({ onPress }) => ( + + + + Bank transfer or debit card + Requires registration + Options and fees vary based on location + + + + + {({ isVisible, toggleModal }) => ( + <> + + + + 32+ countries + + + + + + + Exact payment methods and fees vary depending on location. Supported countries are: + + + Austria 🇦🇹, Belgium 🇧🇪, Cyprus 🇨🇾, Czechia 🇨🇿, Estonia 🇪🇪, Finland 🇫🇮, France 🇫🇷, + Germany 🇩🇪, Greece 🇬🇷, Ireland 🇮🇪, Italy 🇮🇹, Latvia 🇱🇻, Luxembourg 🇱🇺, Malta 🇹, + Netherlands 🇳🇱, Portugal 🇵🇹, Romania 🇷🇴, Slovakia 🇸🇰, Slovenia 🇸🇮, Spain 🇪🇸, United + Kingdom 🇬🇧 + + + + )} + + + + {Device.isAndroid() && ( + + + Buy ETH with Transak + + + )} + +); + +TransakPaymentMethod.propTypes = { + onPress: PropTypes.func +}; +TransakPaymentMethod.defaultProps = { + onPress: undefined +}; + +export default TransakPaymentMethod; diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/wyreApplePay.js b/app/components/UI/FiatOrders/PaymentMethodSelector/wyreApplePay.js new file mode 100644 index 00000000000..1a5d49993dd --- /dev/null +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/wyreApplePay.js @@ -0,0 +1,110 @@ +import React, { useContext } from 'react'; +import PropTypes from 'prop-types'; +import { StyleSheet, Image, TouchableOpacity } from 'react-native'; +import { useWyreTerms, WYRE_IS_PROMOTION, WYRE_FEE_PERCENT, WYRE_FEE_FLAT } from '../orderProcessor/wyreApplePay'; +import PaymentMethod from '../components/PaymentMethod'; + +import Text from '../../../Base/Text'; +import Title from '../components/Title'; +import { NavigationContext } from 'react-navigation'; +import ModalHandler from '../components/ModalHandler'; + +const logosStyle = StyleSheet.create({ + applePay: { + marginVertical: 3 + } +}); + +/* eslint-disable import/no-commonjs */ +const ApplePayMarkIcon = require('../../../../images/ApplePayMark.png'); +const WyreLogoIcon = require('../../../../images/WyreLogo.png'); +/* eslint-enable import/no-commonjs */ + +const ApplePayMark = () => ; +const WyreLogo = () => ; + +const WyreApplePayPaymentMethod = ({ onPress }) => { + const navigation = useContext(NavigationContext); + const handleWyreTerms = useWyreTerms(navigation); + + return ( + + Best deal + + + + Apple Pay via + + + {WYRE_IS_PROMOTION ? ( + <> + + 2.9% + $0.30 + {' '} + + 0% fee + + {'\n'} + limited time + + ) : ( + + Fee ~{WYRE_FEE_PERCENT.toFixed(2)}% + ${WYRE_FEE_FLAT.toFixed(2)} + + )} + + 1 - 2 minutes + Max $450 weekly + Requires debit card + + + + + {({ isVisible, toggleModal }) => ( + <> + + + + 🇺🇸 U.S. only + + + + + + Some states excluded + + + + + + Paying with Apple Pay, powered by Wyre is supported in the United Sates 🇺🇸 + except for CT, HI, NC, NH, NY, VA and VT.{' '} + { + toggleModal(); + handleWyreTerms(); + }} + > + Wyre terms of service apply. + + + + + )} + + + + + ); +}; + +WyreApplePayPaymentMethod.propTypes = { + onPress: PropTypes.func +}; +WyreApplePayPaymentMethod.defaultProps = { + onPress: undefined +}; +export default WyreApplePayPaymentMethod; diff --git a/app/components/UI/FiatOrders/components/AccountBar.js b/app/components/UI/FiatOrders/components/AccountBar.js index 2eedbd467ef..a3566892d6b 100644 --- a/app/components/UI/FiatOrders/components/AccountBar.js +++ b/app/components/UI/FiatOrders/components/AccountBar.js @@ -1,6 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { View, TouchableOpacity, StyleSheet } from 'react-native'; +import Icon from 'react-native-vector-icons/FontAwesome'; import { connect } from 'react-redux'; import { colors, fontStyles } from '../../../../styles/common'; @@ -27,7 +28,12 @@ const styles = StyleSheet.create({ accountText: { ...fontStyles.bold, color: colors.fontPrimary, - margin: 3 + marginVertical: 3, + marginHorizontal: 5 + }, + caretDown: { + textAlign: 'right', + color: colors.grey600 } }); const AccountBar = ({ toggleAccountsModal, selectedAddress, identities }) => ( @@ -41,6 +47,7 @@ const AccountBar = ({ toggleAccountsModal, selectedAddress, identities }) => ( {identities[selectedAddress].name} () + diff --git a/app/components/UI/FiatOrders/components/PaymentMethod/index.js b/app/components/UI/FiatOrders/components/PaymentMethod/index.js index 424c5c01923..46782c0e7b3 100644 --- a/app/components/UI/FiatOrders/components/PaymentMethod/index.js +++ b/app/components/UI/FiatOrders/components/PaymentMethod/index.js @@ -15,7 +15,9 @@ const style = StyleSheet.create({ paddingVertical: 15, paddingHorizontal: 20, marginHorizontal: 25, - marginVertical: 12, + marginVertical: 12 + }, + content: { flexDirection: 'row' }, badgeWrapper: { @@ -75,6 +77,7 @@ const Badge = props => ( ); +const Content = props => ; const Details = props => ; const Terms = props => ; const InfoIconLine = props => ; @@ -86,6 +89,7 @@ const PaymentMethodInfoIcon = props => ( ); PaymentMethod.Badge = Badge; +PaymentMethod.Content = Content; PaymentMethod.Details = Details; PaymentMethod.Terms = Terms; PaymentMethod.InfoIconLine = InfoIconLine; diff --git a/app/components/UI/FiatOrders/components/ScreenView.js b/app/components/UI/FiatOrders/components/ScreenView.js index 72adb4d8ca5..131b716ea7b 100644 --- a/app/components/UI/FiatOrders/components/ScreenView.js +++ b/app/components/UI/FiatOrders/components/ScreenView.js @@ -1,6 +1,5 @@ import React from 'react'; -import { SafeAreaView, StyleSheet } from 'react-native'; -import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; +import { SafeAreaView, StyleSheet, ScrollView } from 'react-native'; import { colors } from '../../../../styles/common'; const styles = StyleSheet.create({ @@ -12,7 +11,7 @@ const styles = StyleSheet.create({ const ScreenView = props => ( - + ); diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 8b5f4f96ab8..6563ce221bd 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -813,11 +813,11 @@ export function getWebviewNavbar(navigation) { }; } -export function getPaymentSelectorMethodNavbar(title, navigation) { +export function getPaymentSelectorMethodNavbar(navigation) { const rightAction = navigation.dismiss; return { - title, + title: 'Purchase Method', headerTitleStyle: { fontSize: 20, color: colors.fontPrimary, @@ -828,8 +828,7 @@ export function getPaymentSelectorMethodNavbar(title, navigation) { Cancel - ), - headerLeft: + ) }; } From 03a74f28219c9ce7a95bd8681ae07fe6fba96da1 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 18 Jun 2020 16:22:28 -0400 Subject: [PATCH 026/106] Make Wyre Apple Pay depend on selected network --- .../FiatOrders/PaymentMethodApplePay/index.js | 6 +-- .../FiatOrders/orderProcessor/wyreApplePay.js | 39 +++++++++++-------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index 9d43cca8495..b04bf07e79d 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -252,12 +252,12 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network const handleWyreTerms = useWyreTerms(navigation); - const [showApplePayRequest, percentFee, flatFee, , fee] = useWyreApplePay(roundAmount, selectedAddress, network); + const [pay, percentFee, flatFee, , fee] = useWyreApplePay(roundAmount, selectedAddress, network); const handlePressApplePay = useCallback(async () => { const prevLockTime = lockTime; setLockTime(-1); try { - const order = await showApplePayRequest(); + const order = await pay(); if (order) { addOrder(order); navigation.dismiss(); @@ -280,7 +280,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network } finally { setLockTime(prevLockTime); } - }, [addOrder, lockTime, navigation, setLockTime, showApplePayRequest]); + }, [addOrder, lockTime, navigation, pay, setLockTime]); const handleQuickAmountPress = useCallback(amount => setAmount(amount), []); const handleKeypadPress = useCallback( diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index 0db7c81d46d..ca7553ce789 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -108,9 +108,8 @@ export const WYRE_ORDER_STATES = { //* Constants */ -const isDevelopment = process.env.NODE_ENV !== 'production'; -const merchantIdentifier = 'test' || isDevelopment ? WYRE_MERCHANT_ID_TEST : WYRE_MERCHANT_ID; -const partnerId = isDevelopment ? WYRE_ACCOUNT_ID_TEST : WYRE_ACCOUNT_ID; +const getMerchantIdentifier = network => (network === '1' ? WYRE_MERCHANT_ID : WYRE_MERCHANT_ID_TEST); +const getPartnerId = network => (network === '1' ? WYRE_ACCOUNT_ID : WYRE_ACCOUNT_ID_TEST); export const WYRE_IS_PROMOTION = true; export const WYRE_FEE_PERCENT = WYRE_IS_PROMOTION ? 0 : 2.9; @@ -119,18 +118,23 @@ export const WYRE_FEE_FLAT = WYRE_IS_PROMOTION ? 0 : 0.3; //* API */ const wyreAPI = axios.create({ - baseURL: isDevelopment ? WYRE_API_ENDPOINT_TEST : WYRE_API_ENDPOINT + baseURL: WYRE_API_ENDPOINT }); -const createFiatOrder = payload => - wyreAPI.post('v3/apple-pay/process/partner', payload, { +const wyreTestAPI = axios.create({ + baseURL: WYRE_API_ENDPOINT_TEST +}); + +const createFiatOrder = (network, payload) => + (network === '1' ? wyreAPI : wyreTestAPI).post('v3/apple-pay/process/partner', payload, { // * This promise will always be resolved, use response.status to handle errors validateStatus: status => status >= 200, // * Apple Pay timeouts at ~30s without throwing error, we want to catch that before and throw timeout: 25000 }); -const getOrderStatus = orderId => wyreAPI.get(`v3/orders/${orderId}`); -const getTransferStatus = transferId => wyreAPI.get(`v2/transfer/${transferId}/track`); +const getOrderStatus = (network, orderId) => (network === '1' ? wyreAPI : wyreTestAPI).get(`v3/orders/${orderId}`); +const getTransferStatus = (network, transferId) => + (network === '1' ? wyreAPI : wyreTestAPI).get(`v2/transfer/${transferId}/track`); //* Helpers @@ -209,7 +213,7 @@ const wyreTransferToFiatOrder = wyreTransfer => ({ export async function processWyreApplePayOrder(order) { try { - const { data } = await getOrderStatus(order.id); + const { data } = await getOrderStatus(order.network, order.id); if (!data) { return order; } @@ -217,7 +221,7 @@ export async function processWyreApplePayOrder(order) { const { transferId } = data; if (transferId) { - const transfer = await getTransferStatus(transferId); + const transfer = await getTransferStatus(order.network, transferId); return { ...order, ...wyreOrderToFiatOrder(data), @@ -250,7 +254,7 @@ const PAYMENT_REQUEST_COMPLETE = { FAIL: 'fail' }; -const methodData = [ +const getMethodData = network => [ { supportedMethods: ['apple-pay'], supportedTypes: ['debit'], @@ -258,7 +262,7 @@ const methodData = [ countryCode: 'US', currencyCode: USD_CURRENCY_CODE, supportedNetworks: ['visa', 'mastercard', 'discover'], - merchantIdentifier + merchantIdentifier: getMerchantIdentifier(network) } } ]; @@ -286,7 +290,7 @@ const paymentOptions = { requestBilling: true }; -const createPayload = (amount, address, paymentDetails) => { +const createPayload = (network, amount, address, paymentDetails) => { const { billingContact: { postalAddress, name }, paymentData, @@ -315,6 +319,8 @@ const createPayload = (amount, address, paymentDetails) => { phoneNumber: shippingContact.phoneNumber }; + const partnerId = getPartnerId(network); + return { partnerId, payload: { @@ -352,6 +358,7 @@ export function useWyreApplePay(amount, address, network) { ]); const fee = useMemo(() => (Number(percentFeeAmount) + Number(flatFee)).toFixed(2), [flatFee, percentFeeAmount]); const total = useMemo(() => Number(amount) + Number(fee), [amount, fee]); + const methodData = useMemo(() => getMethodData(network), [network]); const paymentDetails = useMemo(() => getPaymentDetails(ETH_CURRENCY_CODE, amount, fee, total), [ amount, fee, @@ -365,8 +372,8 @@ export function useWyreApplePay(amount, address, network) { if (!paymentResponse) { throw new Error('Payment Request Failed'); } - const payload = createPayload(total, address, paymentResponse.details); - const { data, status } = await createFiatOrder(payload); + const payload = createPayload(network, total, address, paymentResponse.details); + const { data, status } = await createFiatOrder(network, payload); if (status >= 200 && status < 300) { await paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.SUCCESS); return { ...wyreOrderToFiatOrder(data), network }; @@ -383,7 +390,7 @@ export function useWyreApplePay(amount, address, network) { } throw error; } - }, [address, network, paymentDetails, total]); + }, [address, methodData, network, paymentDetails, total]); return [showRequest, percentFee, flatFee, percentFeeAmount, fee, total]; } From 0ea2e99d8dd2203d48f642124736f24dd5ef70f3 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 19 Jun 2020 11:41:40 -0400 Subject: [PATCH 027/106] Remove react-native-dotenv --- .../UI/FiatOrders/orderProcessor/transak.js | 9 ++++++--- .../FiatOrders/orderProcessor/wyreApplePay.js | 15 +++++++++------ babel.config.js | 3 ++- package.json | 3 +-- yarn.lock | 19 ------------------- 5 files changed, 18 insertions(+), 31 deletions(-) diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index eebd1de71fe..ab69c255de0 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -1,7 +1,11 @@ import { useMemo } from 'react'; import axios from 'axios'; import qs from 'query-string'; -import { +import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; + +//* env vars + +const { TRANSAK_URL, TRANSAK_URL_STAGING, TRANSAK_API_URL_STAGING, @@ -10,8 +14,7 @@ import { TRANSAK_API_KEY_SECRET_STAGING, TRANSAK_API_KEY_PRODUCTION, TRANSAK_API_KEY_SECRET_PRODUCTION -} from 'react-native-dotenv'; -import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; +} = process.env; //* typedefs diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index ca7553ce789..64f3800ef6d 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -1,15 +1,18 @@ -import { +import { useCallback, useMemo } from 'react'; +import { PaymentRequest } from 'react-native-payments'; +import axios from 'axios'; +import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; + +//* env vars + +const { WYRE_API_ENDPOINT, WYRE_API_ENDPOINT_TEST, WYRE_ACCOUNT_ID, WYRE_ACCOUNT_ID_TEST, WYRE_MERCHANT_ID, WYRE_MERCHANT_ID_TEST -} from 'react-native-dotenv'; -import { useCallback, useMemo } from 'react'; -import { PaymentRequest } from 'react-native-payments'; -import axios from 'axios'; -import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; +} = process.env; //* typedefs diff --git a/babel.config.js b/babel.config.js index 5d102d7bcfd..26781fed9ca 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,5 +1,6 @@ +// eslint-disable-next-line import/no-commonjs module.exports = { - presets: ['module:metro-react-native-babel-preset', 'module:react-native-dotenv'], + presets: ['module:metro-react-native-babel-preset'], plugins: ['transform-inline-environment-variables'], env: { production: { diff --git a/package.json b/package.json index 2052c462755..14214f673b4 100644 --- a/package.json +++ b/package.json @@ -153,8 +153,8 @@ "react-native-scrollable-tab-view": "^1.0.0", "react-native-search-api": "ombori/react-native-search-api#8/head", "react-native-sensors": "5.3.0", - "react-native-splash-screen": "git+ssh://git@github.com/MetaMask/react-native-splash-screen.git", "react-native-share": "^3.2.0", + "react-native-splash-screen": "git+ssh://git@github.com/MetaMask/react-native-splash-screen.git", "react-native-svg": "9.13.3", "react-native-swipe-gestures": "1.0.3", "react-native-tcp": "aprock/react-native-tcp#11/head", @@ -210,7 +210,6 @@ "prettier": "1.16.4", "react-dom": "16.8.4", "react-native-cli": "2.0.1", - "react-native-dotenv": "^0.2.0", "react-test-renderer": "16.11.0", "regenerator-runtime": "0.13.1", "request-promise": "4.2.4", diff --git a/yarn.lock b/yarn.lock index 57f41281974..18e07a35f6c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2390,13 +2390,6 @@ babel-jest@^25.2.6, babel-jest@^25.3.0: chalk "^3.0.0" slash "^3.0.0" -babel-plugin-dotenv@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-dotenv/-/babel-plugin-dotenv-0.1.1.tgz#9c8faea67a7c034fe7e94099187ab2e7573400bc" - integrity sha1-nI+upnp8A0/n6UCZGHqy51c0ALw= - dependencies: - dotenv "^2.0.0" - babel-plugin-dynamic-import-node@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" @@ -4042,11 +4035,6 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" -dotenv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" - integrity sha1-vXWcNXqqcDZeAclrewvsCKbg2Uk= - drbg.js@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" @@ -10395,13 +10383,6 @@ react-native-device-info@3.1.4: resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-3.1.4.tgz#58a1d465ce9e2c28809132b1c68dd7ec7ce5f00f" integrity sha512-r+7APHkPO9EA/9w3e9K7yrFigaU+0/g8i3psrNUwCGFxoDewkCHOPj/1YZnAPUwPxgyG3svjZXeCtymI3xcSlA== -react-native-dotenv@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/react-native-dotenv/-/react-native-dotenv-0.2.0.tgz#311551cb6a35a3dcfede648bded55c0e3ece579d" - integrity sha1-MRVRy2o1o9z+3mSL3tVcDj7OV50= - dependencies: - babel-plugin-dotenv "0.1.1" - react-native-elevated-view@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/react-native-elevated-view/-/react-native-elevated-view-0.0.6.tgz#560cc9ab16cfd5cb5ea821521558fc711e57e231" From 9713380ddc0b1409e41991381a814df2a895e631 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 19 Jun 2020 12:22:31 -0400 Subject: [PATCH 028/106] Fix env vars, babel plugin replaces string, is not an object lol --- .../UI/FiatOrders/orderProcessor/transak.js | 18 ++++++++---------- .../FiatOrders/orderProcessor/wyreApplePay.js | 14 ++++++-------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index ab69c255de0..9131d0f8873 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -5,16 +5,14 @@ import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fi //* env vars -const { - TRANSAK_URL, - TRANSAK_URL_STAGING, - TRANSAK_API_URL_STAGING, - TRANSAK_API_URL_PRODUCTION, - TRANSAK_API_KEY_STAGING, - TRANSAK_API_KEY_SECRET_STAGING, - TRANSAK_API_KEY_PRODUCTION, - TRANSAK_API_KEY_SECRET_PRODUCTION -} = process.env; +const TRANSAK_URL = process.env.TRANSAK_URL; +const TRANSAK_URL_STAGING = process.env.TRANSAK_URL_STAGING; +const TRANSAK_API_URL_STAGING = process.env.TRANSAK_API_URL_STAGING; +const TRANSAK_API_URL_PRODUCTION = process.env.TRANSAK_API_URL_PRODUCTION; +const TRANSAK_API_KEY_STAGING = process.env.TRANSAK_API_KEY_STAGING; +const TRANSAK_API_KEY_SECRET_STAGING = process.env.TRANSAK_API_KEY_SECRET_STAGING; +const TRANSAK_API_KEY_PRODUCTION = process.env.TRANSAK_API_KEY_PRODUCTION; +const TRANSAK_API_KEY_SECRET_PRODUCTION = process.env.TRANSAK_API_KEY_SECRET_PRODUCTION; //* typedefs diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index 64f3800ef6d..0a1292b504b 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -5,14 +5,12 @@ import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fi //* env vars -const { - WYRE_API_ENDPOINT, - WYRE_API_ENDPOINT_TEST, - WYRE_ACCOUNT_ID, - WYRE_ACCOUNT_ID_TEST, - WYRE_MERCHANT_ID, - WYRE_MERCHANT_ID_TEST -} = process.env; +const WYRE_API_ENDPOINT = process.env.WYRE_API_ENDPOINT; +const WYRE_API_ENDPOINT_TEST = process.env.WYRE_API_ENDPOINT_TEST; +const WYRE_ACCOUNT_ID = process.env.WYRE_ACCOUNT_ID; +const WYRE_ACCOUNT_ID_TEST = process.env.WYRE_ACCOUNT_ID_TEST; +const WYRE_MERCHANT_ID = process.env.WYRE_MERCHANT_ID; +const WYRE_MERCHANT_ID_TEST = process.env.WYRE_MERCHANT_ID_TEST; //* typedefs From a34c5f88ac36ced0227bb79644c54c481954d178 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 19 Jun 2020 17:58:32 -0400 Subject: [PATCH 029/106] Add i18n for fiat orders ui and notifications --- .../FiatOrders/PaymentMethodApplePay/index.js | 3 +- .../PaymentMethodSelector/index.android.js | 3 +- .../PaymentMethodSelector/index.ios.js | 15 +++--- .../FiatOrders/PaymentMethodSelector/index.js | 4 ++ .../PaymentMethodSelector/transak.js | 24 +++++---- .../PaymentMethodSelector/wyreApplePay.js | 50 +++++++++++------- .../UI/FiatOrders/TransakWebView/index.js | 8 +-- .../UI/FiatOrders/components/AccountBar.js | 3 +- .../components/PaymentMethod/Modal.js | 5 +- app/components/UI/FiatOrders/index.js | 52 ++++++++++++------- .../UI/FiatOrders/orderProcessor/transak.js | 14 ++--- .../FiatOrders/orderProcessor/wyreApplePay.js | 11 ++-- app/components/UI/Navbar/index.js | 23 ++++---- locales/en.json | 46 ++++++++++++++++ locales/es.json | 46 ++++++++++++++++ 15 files changed, 221 insertions(+), 86 deletions(-) create mode 100644 app/components/UI/FiatOrders/PaymentMethodSelector/index.js diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index b04bf07e79d..90e05c31407 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -418,8 +418,7 @@ PaymentMethodApplePay.propTypes = { addOrder: PropTypes.func.isRequired }; -PaymentMethodApplePay.navigationOptions = ({ navigation }) => - getPaymentMethodApplePayNavbar('Amount to buy', navigation); +PaymentMethodApplePay.navigationOptions = ({ navigation }) => getPaymentMethodApplePayNavbar(navigation); const mapStateToProps = state => ({ lockTime: state.settings.lockTime, diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js index 538db0e05bb..6aa1cc13a09 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js @@ -2,6 +2,7 @@ import React, { useContext, useCallback } from 'react'; import PropTypes from 'prop-types'; import { NavigationContext } from 'react-navigation'; import { connect } from 'react-redux'; +import { strings } from '../../../../../locales/i18n'; import { useTransakFlowURL } from '../orderProcessor/transak'; import { getPaymentSelectorMethodNavbar } from '../../Navbar'; @@ -17,7 +18,7 @@ function PaymentMethodSelectorView({ selectedAddress, ...props }) { const onPressTransak = useCallback(() => { navigation.navigate('TransakFlow', { url: transakURL, - title: 'Transak' + title: strings('fiat_on_ramp.transak_webview_title') }); }, [navigation, transakURL]); diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js index 45bdeabfa71..c6a12cf2d96 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js @@ -2,6 +2,7 @@ import React, { useContext, useCallback } from 'react'; import PropTypes from 'prop-types'; import { NavigationContext } from 'react-navigation'; import { connect } from 'react-redux'; +import { strings } from '../../../../../locales/i18n'; import { useTransakFlowURL } from '../orderProcessor/transak'; import { WYRE_IS_PROMOTION } from '../orderProcessor/wyreApplePay'; @@ -25,7 +26,7 @@ function PaymentMethodSelectorView({ selectedAddress, ...props }) { const onPressTransak = useCallback(() => { navigation.navigate('TransakFlow', { url: transakURL, - title: 'Transak' + title: strings('fiat_on_ramp.transak_webview_title') }); }, [navigation, transakURL]); @@ -35,19 +36,21 @@ function PaymentMethodSelectorView({ selectedAddress, ...props }) { {WYRE_IS_PROMOTION ? ( <> - <Text reset>0% fee when you use</Text> + <Text reset>{strings('fiat_on_ramp.purchase_method_title.wyre_first_line')}</Text> {'\n'} - <Text reset>Apple Pay.</Text> + <Text reset>{strings('fiat_on_ramp.purchase_method_title.wyre_second_line')}</Text> </> ) : ( <> - <Text reset>How do you want to make</Text> + <Text reset>{strings('fiat_on_ramp.purchase_method_title.first_line')}</Text> {'\n'} - <Text reset>your purchase?</Text> + <Text reset>{strings('fiat_on_ramp.purchase_method_title.second_line')}</Text> </> )} - {WYRE_IS_PROMOTION && Valid until July 1st, 2020} + {WYRE_IS_PROMOTION && ( + {strings('fiat_on_ramp.purchase_method_title.wyre_sub_header')} + )} diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.js new file mode 100644 index 00000000000..99f858cbe76 --- /dev/null +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.js @@ -0,0 +1,4 @@ +// eslint-disable-next-line import/no-unresolved +import PaymentMethodSelector from './PaymentMethodSelector'; + +export default PaymentMethodSelector; diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js b/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js index af56264e9aa..6e2df14818b 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js @@ -1,6 +1,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import { TouchableOpacity, Image, StyleSheet, View } from 'react-native'; +import { strings } from '../../../../../locales/i18n'; + import PaymentMethod from '../components/PaymentMethod'; import Title from '../../../Base/Title'; import Text from '../../../Base/Text'; @@ -27,9 +29,9 @@ const TransakPaymentMethod = ({ onPress }) => ( - Bank transfer or debit card - Requires registration - Options and fees vary based on location + {strings('fiat_on_ramp.bank_transfer_debit')} + {strings('fiat_on_ramp.requires_registration')} + {strings('fiat_on_ramp.options_fees_vary')} @@ -39,18 +41,20 @@ const TransakPaymentMethod = ({ onPress }) => ( - 32+ countries + 32+ {strings('fiat_on_ramp.countries')} - - - Exact payment methods and fees vary depending on location. Supported countries are: - + + {strings('fiat_on_ramp.transak_modal_text')} Austria 🇦🇹, Belgium 🇧🇪, Cyprus 🇨🇾, Czechia 🇨🇿, Estonia 🇪🇪, Finland 🇫🇮, France 🇫🇷, - Germany 🇩🇪, Greece 🇬🇷, Ireland 🇮🇪, Italy 🇮🇹, Latvia 🇱🇻, Luxembourg 🇱🇺, Malta 🇹, + Germany 🇩🇪, Greece 🇬🇷, Ireland 🇮🇪, Italy 🇮🇹, Latvia 🇱🇻, Luxembourg 🇱🇺, Malta 🇲🇹, Netherlands 🇳🇱, Portugal 🇵🇹, Romania 🇷🇴, Slovakia 🇸🇰, Slovenia 🇸🇮, Spain 🇪🇸, United Kingdom 🇬🇧 @@ -63,7 +67,7 @@ const TransakPaymentMethod = ({ onPress }) => ( {Device.isAndroid() && ( - Buy ETH with Transak + {strings('fiat_on_ramp.transak_cta')} )} diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/wyreApplePay.js b/app/components/UI/FiatOrders/PaymentMethodSelector/wyreApplePay.js index 1a5d49993dd..998088f10b0 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/wyreApplePay.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/wyreApplePay.js @@ -1,13 +1,22 @@ import React, { useContext } from 'react'; import PropTypes from 'prop-types'; import { StyleSheet, Image, TouchableOpacity } from 'react-native'; -import { useWyreTerms, WYRE_IS_PROMOTION, WYRE_FEE_PERCENT, WYRE_FEE_FLAT } from '../orderProcessor/wyreApplePay'; +import { NavigationContext } from 'react-navigation'; +import { strings } from '../../../../../locales/i18n'; +import { + useWyreTerms, + WYRE_IS_PROMOTION, + WYRE_FEE_PERCENT, + WYRE_FEE_FLAT, + WYRE_REGULAR_FEE_PERCENT, + WYRE_REGULAR_FEE_FLAT +} from '../orderProcessor/wyreApplePay'; + import PaymentMethod from '../components/PaymentMethod'; +import ModalHandler from '../components/ModalHandler'; import Text from '../../../Base/Text'; import Title from '../components/Title'; -import { NavigationContext } from 'react-navigation'; -import ModalHandler from '../components/ModalHandler'; const logosStyle = StyleSheet.create({ applePay: { @@ -29,33 +38,35 @@ const WyreApplePayPaymentMethod = ({ onPress }) => { return ( - Best deal + {strings('fiat_on_ramp.best_deal')} - Apple Pay via + {strings('fiat_on_ramp.apple_pay')} {strings('fiat_on_ramp.via')}{' '} + {WYRE_IS_PROMOTION ? ( <> - 2.9% + $0.30 + ${WYRE_REGULAR_FEE_PERCENT.toFixed(2)} + ${WYRE_REGULAR_FEE_FLAT.toFixed(2)} {' '} - 0% fee + {WYRE_FEE_PERCENT}% {strings('fiat_on_ramp.fee')} {'\n'} - limited time + {strings('fiat_on_ramp.limited_time')} ) : ( - Fee ~{WYRE_FEE_PERCENT.toFixed(2)}% + ${WYRE_FEE_FLAT.toFixed(2)} + {strings('fiat_on_ramp.Fee')} ~{WYRE_FEE_PERCENT.toFixed(2)}% + $ + {WYRE_FEE_FLAT.toFixed(2)} )} - 1 - 2 minutes - Max $450 weekly - Requires debit card + {strings('fiat_on_ramp.wyre_minutes')} + {strings('fiat_on_ramp.wyre_max')} + {strings('fiat_on_ramp.wyre_requires_debit_card')} @@ -65,20 +76,23 @@ const WyreApplePayPaymentMethod = ({ onPress }) => { - 🇺🇸 U.S. only + {strings('fiat_on_ramp.wyre_us_only')} - Some states excluded + {strings('fiat_on_ramp.some_states_excluded')} - + - Paying with Apple Pay, powered by Wyre is supported in the United Sates 🇺🇸 - except for CT, HI, NC, NH, NY, VA and VT.{' '} + {strings('fiat_on_ramp.wyre_modal_text')}{' '} { handleWyreTerms(); }} > - Wyre terms of service apply. + {strings('fiat_on_ramp.wyre_modal_terms_of_service_apply')} diff --git a/app/components/UI/FiatOrders/TransakWebView/index.js b/app/components/UI/FiatOrders/TransakWebView/index.js index f95ff462bdf..899e125a420 100644 --- a/app/components/UI/FiatOrders/TransakWebView/index.js +++ b/app/components/UI/FiatOrders/TransakWebView/index.js @@ -8,6 +8,7 @@ import { handleTransakRedirect, TRANSAK_REDIRECT_URL } from '../orderProcessor/t import { getTransakWebviewNavbar } from '../../../UI/Navbar'; import { baseStyles } from '../../../../styles/common'; +import { getNotificationDetails } from '..'; class TransakWebView extends PureComponent { static navigationOptions = ({ navigation }) => getTransakWebviewNavbar(navigation); @@ -22,12 +23,7 @@ class TransakWebView extends PureComponent { this.props.addOrder(order); this.props.navigation.dismiss(); InteractionManager.runAfterInteractions(() => - NotificationManager.showSimpleNotification({ - duration: 5000, - title: `Processing purchase of ${order.cryptocurrency}`, - description: 'Your deposit is in progress', - status: 'pending' - }) + NotificationManager.showSimpleNotification(getNotificationDetails(order)) ); } }; diff --git a/app/components/UI/FiatOrders/components/AccountBar.js b/app/components/UI/FiatOrders/components/AccountBar.js index a3566892d6b..82556ff0962 100644 --- a/app/components/UI/FiatOrders/components/AccountBar.js +++ b/app/components/UI/FiatOrders/components/AccountBar.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { View, TouchableOpacity, StyleSheet } from 'react-native'; import Icon from 'react-native-vector-icons/FontAwesome'; import { connect } from 'react-redux'; +import { strings } from '../../../../../locales/i18n'; import { colors, fontStyles } from '../../../../styles/common'; import { toggleAccountsModal } from '../../../../actions/modals'; @@ -40,7 +41,7 @@ const AccountBar = ({ toggleAccountsModal, selectedAddress, identities }) => ( <> - Depositing to: + {strings('account_bar.depositing_to')} diff --git a/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js b/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js index d8b0e3d92b2..588350e2fd1 100644 --- a/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js +++ b/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js @@ -3,8 +3,9 @@ import PropTypes from 'prop-types'; import { StyleSheet, View, TouchableOpacity } from 'react-native'; import Modal from 'react-native-modal'; import IonicIcon from 'react-native-vector-icons/Ionicons'; -import Title from '../Title'; +import { strings } from '../../../../../../locales/i18n'; +import Title from '../Title'; import { colors } from '../../../../../styles/common'; import StyledButton from '../../../StyledButton'; @@ -85,7 +86,7 @@ const PaymentMethodModal = ({ isVisible, title, dismiss, children }) => ( {children} - Close + {strings('fiat_on_ramp.purchase_method_modal_close')} diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index a53ffd9cf8d..53be34d6e4b 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -1,18 +1,16 @@ -import React, { - // useEffect, - useCallback -} from 'react'; +import React, { useCallback } from 'react'; import PropTypes from 'prop-types'; import { View, StyleSheet, InteractionManager } from 'react-native'; import { connect } from 'react-redux'; - -import Text from '../../Base/Text'; +import NotificationManager from '../../../core/NotificationManager'; +import { strings } from '../../../../locales/i18n'; import { createPendingOrder, FIAT_ORDER_STATES, FIAT_ORDER_PROVIDERS } from '../../../reducers/fiatOrders'; import useInterval from './hooks/useInterval'; import processOrder from './orderProcessor'; + +import Text from '../../Base/Text'; import { colors } from '../../../styles/common'; -import NotificationManager from '../../../core/NotificationManager'; const POLLING_TIME = 10000; const NOTIFICATION_DURATION = 5000; @@ -30,33 +28,52 @@ const styles = StyleSheet.create({ * @typedef {import('../../../reducers/fiatOrders').FiatOrder} FiatOrder */ +const baseNotificationDetails = { + duration: NOTIFICATION_DURATION +}; + /** * @param {FiatOrder} fiatOrder */ -const getNotificationDetails = fiatOrder => { +export const getNotificationDetails = fiatOrder => { switch (fiatOrder.state) { case FIAT_ORDER_STATES.FAILED: { return { - title: `Purchase of ${fiatOrder.cryptocurrency} failed! Please try again, sorry for the inconvenience!`, - description: 'Error :(', + ...baseNotificationDetails, + title: strings('fiat_on_ramp.notifications.purchase_failed_title', { + cryptocurrency: fiatOrder.cryptocurrency + }), status: 'error' }; } case FIAT_ORDER_STATES.CANCELLED: { - return { title: 'Your purchase was cancelled', description: 'Cancelled :(', status: 'cancelled' }; + return { + ...baseNotificationDetails, + title: strings('fiat_on_ramp.notifications.purchase_cancelled_title'), + status: 'cancelled' + }; } case FIAT_ORDER_STATES.COMPLETED: { return { - title: `Your purchase of ${fiatOrder.cryptoAmount} ${fiatOrder.cryptocurrency} successful`, - description: `Your ${fiatOrder.cryptocurrency} is now available`, + ...baseNotificationDetails, + title: strings('fiat_on_ramp.notifications.purchase_completed_title', { + amount: fiatOrder.cryptoAmount, + currency: fiatOrder.cryptocurrency + }), + description: strings('fiat_on_ramp.notifications.purchase_completed_description', { + currency: fiatOrder.cryptocurrency + }), status: 'success' }; } case FIAT_ORDER_STATES.PENDING: default: { return { - title: `Processing purchase of ${fiatOrder.cryptocurrency}`, - description: 'Your deposit is in progress', + ...baseNotificationDetails, + title: strings('fiat_on_ramp.notifications.purchase_pending_title', { + currency: fiatOrder.cryptocurrency + }), + description: strings('fiat_on_ramp.notifications.purchase_pending_description'), status: 'pending' }; } @@ -80,10 +97,7 @@ function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOr // console.log(`Order updated:`, order.provider, order.id); dispatch({ type: 'FIAT_UPDATE_ORDER', payload: updatedOrder }); InteractionManager.runAfterInteractions(() => - NotificationManager.showSimpleNotification({ - duration: NOTIFICATION_DURATION, - ...getNotificationDetails(updatedOrder) - }) + NotificationManager.showSimpleNotification(getNotificationDetails(updatedOrder)) ); } }) diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index 9131d0f8873..cf18ae0fdc7 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -111,20 +111,20 @@ const getOrderStatus = orderId => */ const transakOrderStateToFiatOrderState = transakOrderState => { switch (transakOrderState) { - case TRANSAK_ORDER_STATES.AWAITING_PAYMENT_FROM_USER: - case TRANSAK_ORDER_STATES.PAYMENT_DONE_MARKED_BY_USER: - case TRANSAK_ORDER_STATES.PROCESSING: - case TRANSAK_ORDER_STATES.PENDING_DELIVERY_FROM_TRANSAK: { - return FIAT_ORDER_STATES.PENDING; - } case TRANSAK_ORDER_STATES.COMPLETED: { return FIAT_ORDER_STATES.COMPLETED; } case TRANSAK_ORDER_STATES.EXPIRED: - case TRANSAK_ORDER_STATES.FAILED: + case TRANSAK_ORDER_STATES.FAILED: { + return FIAT_ORDER_STATES.FAILED; + } case TRANSAK_ORDER_STATES.CANCELLED: { return FIAT_ORDER_STATES.CANCELLED; } + case TRANSAK_ORDER_STATES.AWAITING_PAYMENT_FROM_USER: + case TRANSAK_ORDER_STATES.PAYMENT_DONE_MARKED_BY_USER: + case TRANSAK_ORDER_STATES.PROCESSING: + case TRANSAK_ORDER_STATES.PENDING_DELIVERY_FROM_TRANSAK: default: { return FIAT_ORDER_STATES.PENDING; } diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index 0a1292b504b..3239617ddb4 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -2,6 +2,7 @@ import { useCallback, useMemo } from 'react'; import { PaymentRequest } from 'react-native-payments'; import axios from 'axios'; import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; +import { strings } from '../../../../../locales/i18n'; //* env vars @@ -113,8 +114,10 @@ const getMerchantIdentifier = network => (network === '1' ? WYRE_MERCHANT_ID : W const getPartnerId = network => (network === '1' ? WYRE_ACCOUNT_ID : WYRE_ACCOUNT_ID_TEST); export const WYRE_IS_PROMOTION = true; -export const WYRE_FEE_PERCENT = WYRE_IS_PROMOTION ? 0 : 2.9; -export const WYRE_FEE_FLAT = WYRE_IS_PROMOTION ? 0 : 0.3; +export const WYRE_REGULAR_FEE_PERCENT = 2.9; +export const WYRE_REGULAR_FEE_FLAT = 0.3; +export const WYRE_FEE_PERCENT = WYRE_IS_PROMOTION ? 0 : WYRE_REGULAR_FEE_PERCENT; +export const WYRE_FEE_FLAT = WYRE_IS_PROMOTION ? 0 : WYRE_REGULAR_FEE_FLAT; //* API */ @@ -165,7 +168,7 @@ const wyreOrderStateToFiatState = wyreOrderState => { return FIAT_ORDER_STATES.COMPLETED; } case WYRE_ORDER_STATES.FAILED: { - return FIAT_ORDER_STATES.CANCELLED; + return FIAT_ORDER_STATES.FAILED; } case WYRE_ORDER_STATES.RUNNING_CHECKS: case WYRE_ORDER_STATES.PROCESSING: @@ -401,7 +404,7 @@ export function useWyreTerms(navigation) { () => navigation.navigate('Webview', { url: 'https://www.sendwyre.com/user-agreement/', - title: 'Wyre User Agreement' + title: strings('fiat_on_ramp.wyre_user_agreement') }), [navigation] ); diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 6563ce221bd..1cc969989c1 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -817,7 +817,7 @@ export function getPaymentSelectorMethodNavbar(navigation) { const rightAction = navigation.dismiss; return { - title: 'Purchase Method', + title: strings('fiat_on_ramp.purchase_method'), headerTitleStyle: { fontSize: 20, color: colors.fontPrimary, @@ -826,17 +826,15 @@ export function getPaymentSelectorMethodNavbar(navigation) { headerRight: ( // eslint-disable-next-line react/jsx-no-bind - Cancel + {strings('navigation.cancel')} ) }; } -export function getPaymentMethodApplePayNavbar(title, navigation) { - const rightAction = navigation.dismiss; - +export function getPaymentMethodApplePayNavbar(navigation) { return { - title, + title: strings('fiat_on_ramp.amount_to_buy'), headerTitleStyle: { fontSize: 20, color: colors.fontPrimary, @@ -844,14 +842,19 @@ export function getPaymentMethodApplePayNavbar(title, navigation) { }, headerRight: ( // eslint-disable-next-line react/jsx-no-bind - - Cancel + navigation.dismiss()} style={styles.closeButton}> + {strings('navigation.cancel')} ), - headerLeft: ( + headerLeft: Device.isAndroid() ? ( + // eslint-disable-next-line react/jsx-no-bind + navigation.pop()} style={styles.backButton}> + + + ) : ( // eslint-disable-next-line react/jsx-no-bind navigation.pop()} style={styles.closeButton}> - {'Back'} + {strings('navigation.back')} ) }; diff --git a/locales/en.json b/locales/en.json index 512e4dfc42a..7a326151976 100644 --- a/locales/en.json +++ b/locales/en.json @@ -1124,5 +1124,51 @@ "message": "It looks like you have some Dai in your account. You need to migrate this Dai to its new version or it will be deprecated.", "learn_more": "Learn More", "lets_do_it": "Let's do it!" + }, + "account_bar": { + "depositing_to": "Depositing to:" + }, + "fiat_on_ramp": { + "purchase_method": "Purchase Method", + "amount_to_buy": "Amount to buy", + "transak_webview_title": "Transak", + "wyre_user_agreement": "Wyre User Agreement", + "best_deal": "Best deal", + "purchase_method_title": { + "wyre_first_line": "0% fee when you use", + "wyre_second_line": "Apple Pay.", + "wyre_sub_header": "Valid until July 1st, 2020", + "first_line": "How do you want to make", + "second_line": "your purchase?" + }, + "bank_transfer_debit": "Bank transfer or debit card", + "requires_registration": "Requires registration", + "options_fees_vary": "Options and fees vary based on location", + "countries": "countries", + "some_states_excluded": "Some states excluded", + "purchase_method_modal_close": "Close", + "modal_transak_support": "Transak Support", + "modal_wyre_support": "Wyre Support", + "transak_cta": "But ETH with Transak", + "transak_modal_text": "Exact payment methods and fees vary depending on location. Supported countries are:", + "apple_pay": "Apple Pay", + "via": "via", + "fee": "fee", + "Fee": "Fee", + "limited_time": "limited time", + "wyre_minutes": "1 - 2 minutes", + "wyre_max": "Max $450 weekly", + "wyre_requires_debit_card": "Requires debit card", + "wyre_us_only": "🇺🇸 U.S. only", + "wyre_modal_text": "Paying with Apple Pay, powered by Wyre is supported in the United Sates 🇺🇸 except for CT, HI, NC, NH, NY, VA and VT.", + "wyre_modal_terms_of_service_apply": "Wyre terms of service apply.", + "notifications": { + "purchase_failed_title": "Purchase of {{currency}} failed! Please try again, sorry for the inconvenience!", + "purchase_cancelled_title": "Your purchase was cancelled", + "purchase_completed_title": "Your purchase of {{amount}} {{currency}} was successful!", + "purchase_completed_description": "Your {{currency}} is now available", + "purchase_pending_title": "Processing your purchase of {{currency}}", + "purchase_pending_description": "Your deposit is in progress" + } } } diff --git a/locales/es.json b/locales/es.json index bac946cfcfe..774e3b6e1e9 100644 --- a/locales/es.json +++ b/locales/es.json @@ -1055,5 +1055,51 @@ "message": "Parece que tienes Dai en una de tus cuentas. Necesitas migrarlo a su nueva version o será abandonado.", "learn_more": "Mas información", "lets_do_it": "Continuar" + }, + "account_bar": { + "depositing_to": "Depositando a:" + }, + "fiat_on_ramp": { + "purchase_method": "Método de pago", + "amount_to_buy": "Monto a comprar", + "transak_webview_title": "Transak", + "wyre_user_agreement": "Acuerdo de Usuario de Wyre", + "best_deal": "Mejor oferta", + "purchase_method_title": { + "wyre_first_line": "0% de comisión al", + "wyre_second_line": "pagar con Apple Pay.", + "wyre_sub_header": "Válido hasta 1 Jul, 2020", + "first_line": "¿Cómo quiere pagar", + "second_line": "su compra?" + }, + "bank_transfer_debit": "Transferencia bancaria o tarjeta de débito", + "requires_registration": "Requiere registro", + "options_fees_vary": "Opciones y comisiones varían según ubicación", + "countries": "países", + "some_states_excluded": "Algunos estados excluídos", + "purchase_method_modal_close": "Cerrar", + "modal_transak_support": "Disponibilidad de Transak", + "modal_wyre_support": "Disponibilidad de Wyre", + "transak_cta": "Comprar ETH con Transak", + "transak_modal_text": "Métodos de pago y comisiones varían dependiendo de la ubicación. Países disponibles:", + "apple_pay": "Apple Pay", + "via": "via", + "fee": "comisión", + "Fee": "Comisión", + "limited_time": "tiempo limitado", + "wyre_minutes": "1 - 2 minutos", + "wyre_max": "Máx. $450 semanal", + "wyre_requires_debit_card": "Requiere tarjeta de débito", + "wyre_us_only": "🇺🇸 solo EUA", + "wyre_modal_text": "El pago con Apple Pay, provisto por Wyre es aceptado en los Estados Unidos 🇺🇸 a excepción de CT, HI, NC, NH, NY, VA y VT.", + "wyre_modal_terms_of_service_apply": "Rige Acuerdo de Usuario de Wyre.", + "notifications": { + "purchase_failed_title": "'Su compra de {{currency}} ha fallado! Lo sentimos, por favor intente de nuevo", + "purchase_cancelled_title": "Su compra fue cancelada", + "purchase_completed_title": "¡Su compra de {{amount}} {{currency}} fue exitosa!", + "purchase_completed_description": "Su {{currency}} está disponible", + "purchase_pending_title": "Procesando su compra de {{currency}}", + "purchase_pending_description": "Su depósito está en progreso" + } } } From 17762564de205ccb6021a5e779e99a03f381d0b8 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 19 Jun 2020 19:39:37 -0400 Subject: [PATCH 030/106] Add missing i18n to apple pay amount screen --- .../FiatOrders/PaymentMethodApplePay/index.js | 56 ++++++++++++------- .../UI/FiatOrders/TransakWebView/index.js | 2 +- locales/en.json | 7 ++- locales/es.json | 5 ++ 4 files changed, 48 insertions(+), 22 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index 90e05c31407..bbd89f4f541 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -4,18 +4,26 @@ import { View, StyleSheet, Image, TouchableOpacity, InteractionManager } from 'r import { NavigationContext } from 'react-navigation'; import { connect } from 'react-redux'; import IonicIcon from 'react-native-vector-icons/Ionicons'; - -import { useWyreTerms, useWyreApplePay, WYRE_IS_PROMOTION, WyreException } from '../orderProcessor/wyreApplePay'; +import NotificationManager from '../../../../core/NotificationManager'; +import Device from '../../../../util/Device'; import { setLockTime } from '../../../../actions/settings'; +import { strings } from '../../../../../locales/i18n'; +import { getNotificationDetails } from '..'; +import { + useWyreTerms, + useWyreApplePay, + WyreException, + WYRE_IS_PROMOTION, + WYRE_FEE_PERCENT +} from '../orderProcessor/wyreApplePay'; + +import ScreenView from '../components/ScreenView'; import { getPaymentMethodApplePayNavbar } from '../../Navbar'; import AccountBar from '../components/AccountBar'; -import StyledButton from '../../StyledButton'; import Text from '../../../Base/Text'; +import StyledButton from '../../StyledButton'; import { colors, fontStyles } from '../../../../styles/common'; -import NotificationManager from '../../../../core/NotificationManager'; -import Device from '../../../../util/Device'; -import ScreenView from '../components/ScreenView'; //* styles and components */ @@ -262,18 +270,15 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network addOrder(order); navigation.dismiss(); InteractionManager.runAfterInteractions(() => - NotificationManager.showSimpleNotification({ - duration: 5000, - title: `Processing purchase of ${order.cryptocurrency}`, - description: 'Your deposit is in progress', - status: 'pending' - }) + NotificationManager.showSimpleNotification(getNotificationDetails(order)) ); } } catch (error) { NotificationManager.showSimpleNotification({ duration: 5000, - title: `Purchase of ETH failed! Please try again, sorry for the inconvenience!`, + title: strings('fiat_on_ramp.notifications.purchase_failed_title', { + cryptocurrency: 'ETH' + }), description: `${error instanceof WyreException ? 'Wyre: ' : ''}${error.message}`, status: 'error' }); @@ -324,8 +329,14 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network ${amount} {!(isUnderMinimum || isOverMaximum) && = 0 ETH} - {isUnderMinimum && Minimum deposit is ${minAmount}} - {isOverMaximum && Maximum deposit is ${maxAmount}} + {isUnderMinimum && ( + {strings('fiat_on_ramp.wyre_minimum_deposit', { amount: `$${minAmount}` })} + )} + {isOverMaximum && ( + + {strings('fiat_on_ramp.wyre_maximum_deposit', { amount: `$${maxAmount}` })} + + )} {quickAmounts.length > 0 && ( @@ -377,23 +388,28 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network bold style={[styles.applePayButtonText, disabledButton && styles.applePayButtonTextDisabled]} > - Buy with + {strings('fiat_on_ramp.buy_with')} - {WYRE_IS_PROMOTION && 0% fee (limited time)} + {WYRE_IS_PROMOTION && ( + + {WYRE_FEE_PERCENT}% {strings('fiat_on_ramp.fee')} ( + {strings('fiat_on_ramp.limited_time')}) + + )} {!WYRE_IS_PROMOTION && ( <> {disabledButton ? ( - Fee ~{percentFee}% + ${flatFee} + {strings('fiat_on_ramp.Fee')} ~{percentFee}% + ${flatFee} ) : ( - Plus a ${fee} fee + {strings('fiat_on_ramp.plus_fee', { fee: `$${fee}` })} )} @@ -401,7 +417,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network - Wyre Terms of Service + {strings('fiat_on_ramp.wyre_terms_of_service')} diff --git a/app/components/UI/FiatOrders/TransakWebView/index.js b/app/components/UI/FiatOrders/TransakWebView/index.js index 899e125a420..d8e1889775a 100644 --- a/app/components/UI/FiatOrders/TransakWebView/index.js +++ b/app/components/UI/FiatOrders/TransakWebView/index.js @@ -5,10 +5,10 @@ import { connect } from 'react-redux'; import { WebView } from 'react-native-webview'; import NotificationManager from '../../../../core/NotificationManager'; import { handleTransakRedirect, TRANSAK_REDIRECT_URL } from '../orderProcessor/transak'; +import { getNotificationDetails } from '..'; import { getTransakWebviewNavbar } from '../../../UI/Navbar'; import { baseStyles } from '../../../../styles/common'; -import { getNotificationDetails } from '..'; class TransakWebView extends PureComponent { static navigationOptions = ({ navigation }) => getTransakWebviewNavbar(navigation); diff --git a/locales/en.json b/locales/en.json index 7a326151976..ade4f22cd95 100644 --- a/locales/en.json +++ b/locales/en.json @@ -1133,6 +1133,7 @@ "amount_to_buy": "Amount to buy", "transak_webview_title": "Transak", "wyre_user_agreement": "Wyre User Agreement", + "wyre_terms_of_service": "Wyre Terms of Service", "best_deal": "Best deal", "purchase_method_title": { "wyre_first_line": "0% fee when you use", @@ -1162,8 +1163,12 @@ "wyre_us_only": "🇺🇸 U.S. only", "wyre_modal_text": "Paying with Apple Pay, powered by Wyre is supported in the United Sates 🇺🇸 except for CT, HI, NC, NH, NY, VA and VT.", "wyre_modal_terms_of_service_apply": "Wyre terms of service apply.", + "wyre_minimum_deposit": "Minimum deposit is {{amount}}", + "wyre_maximum_deposit": "Maximum deposit is {{amount}}", + "buy_with": "Buy with", + "plus_fee": "Plus a {{fee}} fee", "notifications": { - "purchase_failed_title": "Purchase of {{currency}} failed! Please try again, sorry for the inconvenience!", + "purchase_failed_title": "Purchase of {{currency}} has failed! Please try again, sorry for the inconvenience!", "purchase_cancelled_title": "Your purchase was cancelled", "purchase_completed_title": "Your purchase of {{amount}} {{currency}} was successful!", "purchase_completed_description": "Your {{currency}} is now available", diff --git a/locales/es.json b/locales/es.json index 774e3b6e1e9..aebfb8199d0 100644 --- a/locales/es.json +++ b/locales/es.json @@ -1064,6 +1064,7 @@ "amount_to_buy": "Monto a comprar", "transak_webview_title": "Transak", "wyre_user_agreement": "Acuerdo de Usuario de Wyre", + "wyre_terms_of_service": "Términos de Uso de Wyre", "best_deal": "Mejor oferta", "purchase_method_title": { "wyre_first_line": "0% de comisión al", @@ -1093,6 +1094,10 @@ "wyre_us_only": "🇺🇸 solo EUA", "wyre_modal_text": "El pago con Apple Pay, provisto por Wyre es aceptado en los Estados Unidos 🇺🇸 a excepción de CT, HI, NC, NH, NY, VA y VT.", "wyre_modal_terms_of_service_apply": "Rige Acuerdo de Usuario de Wyre.", + "wyre_minimum_deposit": "El monto mínimo es {{amount}}", + "wyre_maximum_deposit": "El monto máximo es {{amount}}", + "buy_with": "Comprar con", + "plus_fee": "Más {{fee}} de comisión", "notifications": { "purchase_failed_title": "'Su compra de {{currency}} ha fallado! Lo sentimos, por favor intente de nuevo", "purchase_cancelled_title": "Su compra fue cancelada", From 4a63230455dcf2a06996a4adbcf5261983991844 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 19 Jun 2020 19:42:58 -0400 Subject: [PATCH 031/106] Fix i18n argument for failed fiat order placement --- app/components/UI/FiatOrders/PaymentMethodApplePay/index.js | 2 +- app/components/UI/FiatOrders/index.js | 2 +- locales/es.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index bbd89f4f541..cf77db51dfb 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -277,7 +277,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network NotificationManager.showSimpleNotification({ duration: 5000, title: strings('fiat_on_ramp.notifications.purchase_failed_title', { - cryptocurrency: 'ETH' + currency: 'ETH' }), description: `${error instanceof WyreException ? 'Wyre: ' : ''}${error.message}`, status: 'error' diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 53be34d6e4b..9aaa933ced9 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -41,7 +41,7 @@ export const getNotificationDetails = fiatOrder => { return { ...baseNotificationDetails, title: strings('fiat_on_ramp.notifications.purchase_failed_title', { - cryptocurrency: fiatOrder.cryptocurrency + currency: fiatOrder.cryptocurrency }), status: 'error' }; diff --git a/locales/es.json b/locales/es.json index aebfb8199d0..0f7801c61c2 100644 --- a/locales/es.json +++ b/locales/es.json @@ -1099,7 +1099,7 @@ "buy_with": "Comprar con", "plus_fee": "Más {{fee}} de comisión", "notifications": { - "purchase_failed_title": "'Su compra de {{currency}} ha fallado! Lo sentimos, por favor intente de nuevo", + "purchase_failed_title": "¡Su compra de {{currency}} ha fallado! Lo sentimos, por favor intente de nuevo", "purchase_cancelled_title": "Su compra fue cancelada", "purchase_completed_title": "¡Su compra de {{amount}} {{currency}} fue exitosa!", "purchase_completed_description": "Su {{currency}} está disponible", From 773e581a080e4556aac06bfdae1bcb25a37158d2 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 19 Jun 2020 20:40:47 -0400 Subject: [PATCH 032/106] Add home graphic --- app/components/UI/Tokens/index.js | 37 ++++++++++++++++++++++++++++++ app/images/HomeGraphic.png | Bin 0 -> 21978 bytes app/images/HomeGraphic@2x.png | Bin 0 -> 55795 bytes app/images/HomeGraphic@3x.png | Bin 0 -> 102201 bytes locales/en.json | 6 +++-- locales/es.json | 4 +++- 6 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 app/images/HomeGraphic.png create mode 100644 app/images/HomeGraphic@2x.png create mode 100644 app/images/HomeGraphic@3x.png diff --git a/app/components/UI/Tokens/index.js b/app/components/UI/Tokens/index.js index a1731664e00..a40c7883e90 100644 --- a/app/components/UI/Tokens/index.js +++ b/app/components/UI/Tokens/index.js @@ -15,6 +15,7 @@ import { connect } from 'react-redux'; import { safeToChecksumAddress } from '../../../util/address'; import Analytics from '../../../core/Analytics'; import { ANALYTICS_EVENT_OPTS } from '../../../util/analytics'; +import StyledButton from '../StyledButton'; const styles = StyleSheet.create({ wrapper: { @@ -28,6 +29,22 @@ const styles = StyleSheet.create({ alignItems: 'center', marginTop: 50 }, + homeGraphic: { + justifyContent: 'center', + alignItems: 'center', + marginVertical: 20, + marginHorizontal: 50 + }, + homeGraphicText: { + ...fontStyles.normal, + margin: 15, + fontSize: 18, + color: colors.fontPrimary, + textAlign: 'center' + }, + homeGraphicButton: { + width: '100%' + }, text: { fontSize: 20, color: colors.fontTertiary, @@ -73,6 +90,7 @@ const styles = StyleSheet.create({ }); const ethLogo = require('../../../images/eth-logo.png'); // eslint-disable-line +const homeGraphic = require('../../../images/HomeGraphic.png'); // eslint-disable-line /** * View that renders a list of ERC-20 Tokens @@ -183,12 +201,31 @@ class Tokens extends PureComponent { ); }; + goToBuy = () => this.props.navigation.navigate('PaymentMethodSelector'); + + renderBuyEth(tokens) { + if (tokens.length === 0 || tokens.length > 1 || (tokens[0] && !tokens[0].isETH) || tokens[0].balance !== '0') { + return; + } + + return ( + + + {strings('wallet.ready_to_explore')} + + {strings('fiat_on_ramp.buy_eth')} + + + ); + } + renderList() { const { tokens } = this.props; return ( {tokens.map(item => this.renderItem(item))} + {this.renderBuyEth(tokens)} {this.renderFooter()} ); diff --git a/app/images/HomeGraphic.png b/app/images/HomeGraphic.png new file mode 100644 index 0000000000000000000000000000000000000000..115fae493bade512949546a28d701fb9ebb73411 GIT binary patch literal 21978 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 Y0<*=^f=3n~RR91007*qoM6N<$f_z|nVE_OC literal 0 HcmV?d00001 diff --git a/app/images/HomeGraphic@3x.png b/app/images/HomeGraphic@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4d5f4b0965d1ed1b87d092627d39d18952013ce5 GIT binary patch literal 102201 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

7lP`j8Dp=R)yBqxd!n7UUVY0zKy0WxF1 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%0An?-9?`6 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

je69i^bzmo(;wvw8wmEhYM)01xiECb(HR`Sa!II z+HJqBq)a?)f|7h-njyVhW2KVIe%}w)KX~gSD1*#B18bD*^EVlpX!P%AS$#12x#wf3 zjv2IXMjuU*Sdvg;q~x(CK_K2hSo=f-M3u&MKYi3{O3_Lts&?zxsBwS}B(mZSYLcBo zXJ=0+stLE#ZNQx$=?;a>jE5f%P=gVg2@S@)wQGGWsLfTW=AqivQDD5+t&Ykhb6mRLpU?x>z`znog8nJ+=&m zHQbRghgL;I_ICg;(=g$cX5gjv{{1?MWc;>1mbd5qvw>1?EUN7Jes6UqP}x281cf;G zLI(3HrHl+5kXaZw-W!0#qyZ`dM61|h3Go$8)6zNXeXMdv<-1UWCL0q9o1i2SWO+H{ z!#{QD-n?R}LN_Mz@FZpl4^0BtXKEQH;_OhUc0yoeXUZfAjN@eB%d9m9ob5Iry8=UP zCF=(jVt+Iet|i`55w~gA|hh@NbopOggk4K6knLE7FiENmcoH8E{Sh`AcAlH|8`uA(ZS+$Spja0<$B7>S&uFw&?|Spde%=+dusXzU}pSKn`H z+RwDLYagf214uz|ew{9uwwQXq4~}L2aDtc&PgT!`O30_C@_y^a>oGSo6S-b5k`-6Y zEMj${I3mTq+^m--F#_LoROD0O7GU~9^*kwd1R4AMZqeHp`hqzM|cG`}!69=21OcN|e#)^uV18A!TBQ1CpM9vM& z6q`BNO4?(Pn9)y0hsGT zFD$3Vay>P6BgcdvfO9C+!$PALx-2Ub?_0Q#RFgco9S+L}C0U_-V^+^9z`EjM?5$6( z)GTz*FQH}Q+O?ni<-UCnAk|PCi7i86nU!J5npOZeHx&;RH#eWi#XlXP4~CEw6|C)g zQchM8Ia!(!dsW8_*ZySDzG>4CK_(nE4>%qC89JxcwB*TnY=xMQ-+);Fam2zq#MTCE zjGO$Vm-gMDW;%L0(*2L_c=S#BzKBgyE*v&NnL;FHS765u;K2tSq0CuDZmt!XE@O@q z;$|k<2Ksb9RR-@wbP)zsDT8sV9(m-&mYtkssm=nX2!LfgMH||YLip)ZuVm_s-$1S9 zX1bP1Yr;!OG1)kKHf~+G0O_vj(Aviar^Zo|?ju4q4~LtZ5jIU4#3qZ&hs>uwX-%(D zc?qo_OSK_Edz1(Yjh7lju_S-zLZ&n3J2Hoij;~X#dbv3kMOHb*rW0}bC|Nl+5ka{u zI~Lyle10ezKU-Cq3M`tlqNb+lz*8o3lu`lOMCUMv6cm-S*?CSUSqnqye?m=>d9->R z(`DlVQPOmH$BxsbGzMegrb*0lkcOqmth#|nrLi+~x6%z$$^)Am<3FA;*z z2p4}n5}6&LXJ3QSi%{#!&J6D7{cVk=YuUGq@HC&>XkZhRDS+I5i2gR96`g6B z@GkT~{+S{5n_v>_wmS5&F-F~hMO@}(`b;l1b;B?InMmvE3%WBSG(XqRE2Cu|=4OsP1pRbEBNJ4H(}jP!<{JF- z%dg-_Yb%lkG-58MPUPZ9g%96N5|AqgLK7_P41?8}i-hhT zWFq#>&aEkIf4Ip}{jGo?xjqY7=q*db4wigoaGRh^5~PY$Xr-CTV7<}PYg|roW0rJX zOXXp;v?79%-SQk7n>x~@TG2-2qn&xs$(`uXT=c5QhX-xUjc(0}5Hw3IF=M%kEi$5J za47O(g7tlUh-rA!S%9N@woxSf2bM>=UcV`L^7Sk;QX}AKbeTZ|PGJO0_c;|5!MJHg zg^?LKclM0#G!N%okZLOjiMn3X#e-T%_n2l(L2*f6IHJ!H;F;73yEP`(Sl7+iLXuV$ zk#WT9VT`J`mlKuaI$Bpc%<5`7W8h4hhFd>@n2eQMXK@6OvY50eJ^&2rq2!?hWBPS$yH zP`Dr}B3noex$_Yoo&;rOD6Mu3(G?XT9&F?3#GI;KU_v~KP!snIg8_=CI1>okpDE-^CC z9LYzx_;-qdPmPcv_wIFsPoAvTk>*qv6LIqWYP)8NEQcf+h?}|)$YUDIq57Y}RHkRn zil{E;QX?^&Div9`W#)N*L*O*sp5HSre#^FQOZxZ(YV`BiV=v8SJi3tyb|+n@m$8X4 zi3!B>Hx0mz3+7pg{9JnKHUY|+_i8dxDIb)k-d?=d)`nz2?77KX>Bd*pwX+5&qMRa7 zd2yPlw)~EE?$S7&Eu zR%;gL^(Mo9A;bsi`qt4Co=c>~nQ)S2NGK?=2;MZ%;#^{(Wag%ho`!>DO4_}3GJ;1^ zxp#%bY;RkU$APYE3wZJ6FvM!=8Wzwgl`>`G2E7~pXJ-+Kn!~K@=zOzBxZd?czHHQ2 zzVx}hKWzQs+Rr7$OeCA2j1^M$iG26p4=V-t;aJplR94W(EjvonwVX?u4Y?xB+-sr9 zTSCxth+yz&oL~fqEcoLDrN>f2VgyCK?^fHHA}YEn=$KeAM&~gr42={VXEFV3xYlWA zQcJPFVXdoi>vkE~z7>;RFxk3wDlF4LpO9f2@UHDUbDScWA(^XC6QWo^xeat9l;Pf>E88>IY}X#N4NV14x^671-~`TByp4(1r*VEqK-^} zg}|j*v6(jKgL0ZB3xO3YWh{8NE2h{?b&$5vV#}5->WVt!%b^z@-RGA&PEjkriR#vR zs9A&kPO^ioKMYw^x7HAS`QUPt9DL-FN4m&tWKLAuY9$cG*Z9?^9N9e0aU;{T+o|nX z2hPiwii|tb&oHa+_mSqajJ|Cdo%>R1Lt#p=ykZl5%(VVyj#-E=-u>W*LG>HtPV2Ew2)b*onDoHi1HI@ zruQb})90bYtcawu=>-0SLEFeo?PoF#FLvjm=KimvlM1Ft2KJn}?G{C1)KWe4Gr41j zC*p9-L&Uj^nKDl>^vye9F5@|8BvKR47@hQRyWK3E8;fc1bqh6UAHX=Eh=(F4rRhFw znKvKvva_I58S4&(@J4+--fnC}7p<$X^r{2CY}S}&E+;h>(6wfJs9psEc=p5zi>Mf5 zBq^%AE5f!kHy5i4XIUgq;Z$cQ_BS@+a7zpEc;lS2B8LA`TqPuLnzwx2>s9aWNf{MI z8F3F$&H2UYSPYaaa+O+j{$tcsVQrLppDAPELmsJ}KL3;P;D!&a-T8;@`wwbvvxeHv zYB99_js{%?n96zdPt)Pv>>!?M6(UnUH3G>mwi0ZoPI@9?NjA;)eW3DBr(9 z#6(8uw?jmnBGjft5DVRH(0)!Dxo|RBxrs!n$D0UxR79;v0kuIJbmnp{%5*+?tNad? z08Hx>vYivphj=<}Pxf-mcY*a%7Z?gacQ}!u36ydJ^QavxNoUbT8HlV-GtKoxKAgQw zXGRLmfhY2>Mt4VqhDS{e-&y@SIyyH&Jh09#9#etk%U3uJE$cyg5{jVYV;oRP`j+P9 z;s0HKoi$yU4=I2D{`wo(Rejo0RX(s}F+P9k8q7re%d4;B<(eAQk0I-^A}3xVZvT4S z7Au18thB)?k7~NRQBhrk|8L(u^hU=v+^62?I4M_;&Cb=ntbB~hr!%VYuR;r`_4+(@ zPD;Pe7|kJ{n+JTd47hRvU6p!Cm#88Fw59^q+`$pMY=LDsisL9}Nf9gI(Dp;lZnv0k zis-MXLM@}ArjzxhAu+8wmWWryt$^2(s2IDgyEAlR^SzrxxImQ4a_l?lF4f)IM`7~6 zR|&<3?4l;<91%>uLFe&0H?%6@7Tp~#y*4)>mKlaDCZ%N=gSeE(21I8y^fX5O9y9sR zGm!JfL-Rg`>4Mz@oe$d%I~UwpxX7EH_Wsfg*BWB|#Z=((5Syjqkg3&gV*v zuuQ1v%a6wUdI4z=8F-q^(?81zibv*byAl_IEzRHcWk&*Eq33uH7%xSCWQum`quybX zJz}!xlVLbQ?tl@EXzqwF+%A_dhf#4F&U6R3FbZ7GXs-hvb_re2r|Fn$sN-5N;Aet# zncE@7gR4vZuavWLOb3$Q#G@qD`{V27Q(dvkG*@+H>s+^|>!Te@@;eu0dCNQ+&rir= ziD~dw{i1#)g+rmKOL0jh5lSoP%e_p;a?`+DCxWQhx?LVyzSVNKu|qgdAb#|tXFZvj zjy%cPN2nDpX5)+#lT97${G4no$jTa)oG4_uU06i>M2UG8$ITZr5$ay7FD|sMS4GHu z?7d^?C6mwjg1M+tq4GdhmiOC`{4kyDZM11q z{B!CD#MShD9i-MMravvy~K0+dQ|xU!CZbJ zVrG`dgM8{hJ&tn+oK>A{iAtuT%o&bph%G*aP>!=+r;`YWla!BcoapRC2PsH?GS3W0 zRCF5lmeRdBUxEmA%z_ zsuq1`)P5rsE6P=$y8i>G|0|*~x(cw_%6BGq1#AwjU(H?mtC%K&lC()TKDSrmwq25C z6{09jVu@R#1u`l0}%4d2Ry2Nx1US{^wH%otlQiA-*Z21+$WgvwRvx|B>v~=c_5F zsfJ!6Cod97`P4hWe;osMHv>%}oHw+z70*e=!r=e>H1Nd(zz?dar@LS;jO4+lJ64}E zB>Np*?HiV1e?S>xeXp@K`fQ=(+WR#wwl?oN6pxiPdRXMd)UF{_<5H+tS}_pSlU07s z|Gui-|HfFz$v`|Y_y1HP==>$ouJ57$0#w+4<>>o`d*x41J`E`)l2SoYBxGL?mPm-d zGu-Tx>haQv`XdsD_J`O?3y+BBQn5OwzgvD$y50Kv114t(~!f5u|MYAQB_&la)#bD zA{9Zc?xSa7i^An3DqWoql#rs5L)zEPSLphBq=6`Xn9eYbCPr_@kHR-yVgDa z(o=8f8rbEeJkK6#;*p8LtQB!q#Ye$6+dA7jT2Qg`)UI8P^G0Fr*}8o@k-aku1;n=? zkQ2*MsK^P9x2Nk{Hh;UbJ08bn-1zM!f2R7?|Gx9ge{H6A=_-{(k$y)Jq0Ro<*3J8k zZ!7y|C#Dcd*{bc+QOZnQOE>A}0h`_QeCI~p;)~f){-5-|8IuJ0^wUI#{GR87O`D$X z^lbY^UGCr=tN_UZ6_s7^Wd=~3@5SuAOmu3=pKNWsVA7hNwvIHwLgB}4eva>x+2`$h zcgfDO%{EaP3-qu2BZ*Ud9W_|*x82mI1};)S7G`JTp5-3gx?n!`H#Xx~dpntbI;PSW zf}31i8|AWrRFt3X*s%ktj-$Om19g)w9-A?sOg?IwvdXWc7Byohm7ViO3(k!yW;%aF z&EP-9vLMF;xFMmS$VBGjczM&m%p81mxLbQf5^D21V8_(o;87pHVP0z|bl_fb_ zVe;MyZ`KE88t#=>M5X(RQis@F=925r-WgV&O)x_#>z_Y0 z&`iFGX>1MMOD}9p3)BoBwFGE@p#r;26{tNZk^)N&si`d0FTlo(z>VA1b-nTE8^@uG z1A?)&G&&tVJ@|l@k;ZrniDdW$M^Rdq!^5LJ`%mt8q2)}agLJ9Ex)WzwDUpMf{a+&k zG*CPa-t!hF7>~~@@4U168~eD%iA2R6e>?^DXTC^Im(a1Y?LsoaCS#W z4^1{0&YlUAvlQgsy)>*Xb4I(3RCRP92=O?8y)Jq3S z18LqV4WN{i3d+tcp6d7Ql8;#K?^1qKZIjl`k}vmy|K;Z0>D^CZVj!sigzH)tX}+94 z<^uN;IVr@2AR=;`jyLBvRkwAyvOUK(tS$+qIkaUe1qx;$WXzN`mkIniH}P>7!;eJ+ z9+{noH?KS-<&G7$xo04X%9h_scVrQjhY1Tt5;UR+nzqiKI*{{dNPNdDRgGWQ@4vsz zn5uzHx2u6l-H)K*5QLaZCW8_>mlA4c%cuuhK(7PmpC?bn)v1lygrtYemmx>UtT4h{ zg_u8=lWaVxptLd|Tdxvi^Ne6BE8`%gY*3wLQR`n3pcj8!i$|M z$xlRA_M-rGC{g+DGnqZxU+VT{1|`%?v~k2&8UA9-D#>{x8xTuF6U@h8OzDh}?YqYo_XpxQ3p%~K1U<_2T+4NbRoiB z)RwxfKyo7LhTD+_6IoPubEyN(r=>XVgODG8&80?IrD2%*N-XG?o0H$CZ}aZWV)y3V zjoz^P6!j=xw}a(#VaUQmx(voM@w z6VfG?c@6E0t)}*2#zGCIACEgV{+fJp?-_(nf^FM|3xNx+I#ZY(1KVuIwQR=DVY-?m zBrQRC=2oWWbJt>mQSR?!Al~2$QNrxFR9NiHE-G=nT zAL5-k-jFBX*InXu7Q_{m8P#JmE4wG=5b4gQQ9&_X;~akve%taQ-l7jxaH@-Tn6K+P z|IxG0y1Z~~q5G6Qk@|X9I0Anp#Uo!OIaH#+x-sPU83lYAbv`n~^Q<+po(l5Ltbtu1 zz6^$>TKj#ZA%ip)m*wQC+QV!phfhg^Dvh=?dKDH?QJs_`GwL-LF{e-!I^Tx@NjoPD zMm+a!l7qzt&Y``Jy>XQ8(Oi0}ndfqnwUm<~R<^##v&@>Y>Q0ash4hF6nUVP99qap~ zGWp~{3YFNkoBn1+WN3}S!mksDcwKInEx3Tp^vmaT2j8tpiwx|cgpe*N zvSq$VqrZ%Cek~P=&l1x;XVx?-8qs)I>I*sWh>{ zm={92mA5C7I6&w`fT{zDVz``YMCsWdV%SY=OxyauBtE+`OEP(jDcJ^Ul$UaiXSJA5 zKbOCwSIrU|*U05?WxkJPhFt@LqDqJe)222b(nUj1Eaha`CiF%Fi<~+>$E5feRm$_q zRrF{&{U(%0br~)gOh+IztM^1GZ%>WZK7VD&i8;AxbJHBGkforKB9#$KqK$}2yCG#y z&_JZaU^rvIL+j~8>(uB=&7;4AuI?#nqSPGvi`0_#z-EQxBy~9c^vJvsEWB(a^NWCWnVB z#Ui;0%4o2SSs^TG*&AQZ#&+qm6d0YziXi~wYCkDkPz|p{uh}iIsdU&rss5Lw>}|v?W!89^K4k6 zP#@y28N|q#a+}0;#Pq884u{9w zJ>9-+Z`UlhGnX-p&7pvdgmkK8aj_yy2Zew^q(TOXn0E^}=)IT7w~H>46X9@2W2D1~ z#P;Dq+J~fBWj9vkB2GYT4sxMbw5U3ZZucC^Za+zg5UXtI?ZxBo9YY$ClNI@S$n|(& zWBdpi29c9myjXo2M_VQ*0kPn6m6T?dn&G9E8IPFCq82q0A6_;3q4bi0IK%R13Da5x ze%zEgS=1deHgEiVkz~*7Bs*y1*-k4lQANg&kpqq%vMRAeK-{8nwBWnnRVv-65()0F z-c!aLPL+zIZ!j;J+%Gh}Wygy0DfPymkp#seCtv%Tj)iMi($MuIBpKX74}RImN3tFP z^Pm~v4|%=e_I;h27gObP=ns|D2SNtA-A$RnNROVKmX@BG79_dQM@&H{HY+VfQ2C*9 zM2Tz&A{r_Kx+--VtvD3%P@IFvN021C?x>K_kjVsH6mK&u;-OK^iH%Y$M>d;$Oa)9Y zFVLfyC;MgVNkN!M${Tfc$oF~?B1L6!ZY~OaKDhNs{n;4@Rk=DsAuCtUQ^$_uKy%Av zMw?Z{HSd83o>GpblM-|*9`XwZ7WWPPM);k)$q z-O(Jw9egug#VY!>zFa(#ix-$QJ21tVaRkL8C;$4d9IIBPn^E!4>H&>5?gSlqN}Bv1 z)9!tLtYZAdJ5w8qT+s9A49)K94oCLr?OjVRpLev_=Um~^nUXx!l@aGaeOSn@sL28W z14bv2kCPGj=-4b8W8~1Q3IJ9dTWkW73}A+qM~y@oo1*9O)bZok-_(Q~=FP*0mM+Ge zj11Tq8Hr}Uoyf`V(`WF&JMW+)7(~>Zyumw_2`7_sjxX0!NQRG-u#xic7@3Cxj-D

>tC)t5^pFY1?nMJSbX*7E$^^Nbwjvu}q`keeBdg^-^^)L5gNWfCY%||-Jffh_L zW}bqwV}~=cc;$Q^Wxs-@ny^tC{mYM5`KB(4+oKSb1VbNlt|9kW9QvbaN+?4Pl{X{iIt8Nvgu~jJa6l z9M!;Fn+L&4r|S;Xcl*&9BxAnE4O6JLX%TG1pd7Zk!%;kayvp+9QN$!-POZBGbu$Iv zdJ$~Q2t>iWTuR5;(~PIqNp^s!qBG8OLWX{~yJW>9^u9Ck^~xdk+1j@~1-jh81wKgM zeRKbn$Os*OLg@T^m?q2^f})sc)I_~<_C#uE*!(51_OVAp2t3R@4a^G zZDT@FcBz)e4Us{%;0a3(I9?c}3>adjC)gev3{xN&o!%g>G$hWo{Kss}2$a(K7Rr8t+qe;`>je498A>Ky=^p9}KE<-F`0phb+RdU{^ z41pg#Ra!o6&f6(ZP%InXjvWX|^KO!-K1z>p{g{pysG}nFg6qR~UMz74Y)m1T87UwI zEHfDlTp=PTJ$BBXL5Psiy*oUr*_V?B>J73PNA@|!&^A&IT)7uyvOaUo^f}4KHql<3 z4iX}xCN1>kZq8a*xVM-#UPj7Y*;&r}QU%+SKPBb&k*DVU?I}znQeQ#YzTFvdr7zSX z;xFl@E*NVCmmEKqLZ5Q)WE&R;v?!k?nVC7>q+JsUH7`97iK3;~kNmVLO-h=y=%xEn zKaJ)c1*VehNtvPRU*%+pvn8$+hi=L>q)OyTHaaKSm>@mFeQMR17QK-Sek?ns-VkZL-u8r^~Au=ASStTrwL&WGZP2DT2f- zpLPYqlM{t0iJ{RAn@4wRS-Qma`4S(V4Sa-_73s>O3N|JP0y3L(HkpxuM-A0Pg{-W+ zy|593pUgXT(@#(|BCy^C3x02#c~TgvKeGBH&gX;mPip8>C>ZPaWwi(d>-(&a#0)jx z^eHW@&yOWG*h$cuA^J<=BPj>UFnv>t3xdw{G*eUNW)Dl`h?X);%ORpYKc!Rpzq%24 z)7>6w+_7TYw9Bn2tDwZg*k^=7+8Ry69d!H0YU2-5p{R4ZL?uLYdNtlDgfc{ydVwo* zf%)|6rV>!(Cc5v6rEY$fIP;kx&^4twD`zgaCeo-ON}7z-A=ALg&Q7c;oP`TQdK#Eh z#r%`gW|@#i6zB;kX$a#*Z!|)LZTfRq(qP(Y3Rfnrw!%hAV)yRdy0_P>f}5!Xu35Rt-zz8LK$^j!Nft1fXr;F4G?9|i^!Y(jR`!~X?l*Q!qtD4uq^^l46k<`oSVRiQ z2iYj{>zoC~dYIJSX1CvVQAKaebO5&%0bg4|y0Z23`>TW%AD>9d_Ii3_6O@U8DV;Pv zPMUfaBo=zSqZ1bjJ}V!*FgMl+CR)}hCMmL`3*uBQWMF*0?SfkRu22|fx~89?kg3@T zue2lTr7+|vsf%oJ8E1?J%c{-~VDl5U`$x&-BCKl31?@KTNOPhuQUZ4=2}&*372GV3f#OOTVnP-dTE@9-v`0sdV! z#sJ1NoeG2EWotlNEJ}mOcymig3=xgp}Dsg{^W2RrfR1p zg(=X+_~0sXd3luIM9kNUK;CbBNeU-fOKDX5-&0fY-4C72eK_NuJC0%+vGp~HXaLNh zQ*(0VuukJShm{RlUUn5w-e-eKL4-33H*vo}n8_WUac(yyyr@kvB#{hJz|3 zOK1$|QsM0smyVbBYiXeTiFu^zQ)zjv4fytP*cc^ECCoh0ubm#IDFCBd-I5VHU^` zV7@P=y7)BU4~@W~9@rQKm`czHmNa4hRWlVd4D4%Y#Oi`s@Ht1B31TQzz&Eu_BSEoD zI~PDuPIPpjs(nhc$DapGr;fu78!3r=cYdBJv6?D+DWd^NU({HP97z_#M3U{pghY~M z@t;l*Amo~+$i*~3_1)WE2MZeFixB)ex>u_t!yGy*HKQmB!E&h4T$1Bu%l56sS5i|! z+3`ZA$#Driu(I(PzL}qHN*miY{a(tG0=gxuGGcAFa&~Q{s|?cm)l?*}$OGnj&v}@o zqTE$P$CDMcjoSY#>VGa7;C{S18@RiK2#OL1ZF|p%NHj~y1m%0N`*bblW@L_=pvdlC zpxaLcBoosG+1{xltzkUqB=x7NtvxCHPZU%+p^ONlIk8g}|l+0Y!L{5?=a2++srj(lPnx2CA+Sk5DmI-Yxsim7o-1!_%vgh6HtZn0W zlATW6um0r0NuvA>bg!1tyK|-gP{K(*iHaXiNd<)m*&6B`^Ds^j!L21D(IL!0 z{}SNiai5WihEiBchyeY~eBi-q;FKLwPsZVuGahfPaD(ag_5FUSj{>+IJs7V(869vwqnyF21Ko%S0!nK!e$`L{?qo(mH zHk?yyk~zsv7Y^?rt8hL%)c0ON=P?>{<`pTappcz!jl}o~%1nhKBue=h3pw#q8{b5x zoc74rczK3yJqH^jLJjwm(-!uJ>S`Qr8K;nF(q*-GK~|l{R6}<5z}$Nfbt{W7vRii95+A=J%gv;*s%XfS*dtNmdLwt7*ViYBtntHO9#LF`5ZFa!zVG z$wC%$6&`xLY*3=r4xT#GV*CM3$4sL zcQje$ID3@L_CG&E>(iWLEftW=RVx-+ALw!mT6b3;LlaG5!9z8R^$>fakLGh5BacMSibK&{-Ya@bjh?>FYNg;os z9(cP;)f!lZIgONho!acr(|46o6>$&I*AzK~^G+Zd#j*BwOF2>z zWRnT1^KzK38E4{2C<@7ti)x~wuI<$)_FfH5uA%iphI2W;Dq|p%r&; zIV%RqiAP^9Ac9hifdpj|oMfkqq%5xl_O3;M`{XM`P;R4BQGNKi8yzWMNlmYD#*4@6 zAUji0Kz+k9Qc%{OC!2>V*p)Q!{28eq|8k5-MrWLySRbkw8L=2AFB5fZ8bQf$sZ z)YN0FP&1cmy1TLKbPbNTwv&32TxK^87BLKMCQjaG`1;pp-0UPpM0P)1?UtN3|v?meOzPD-^a-v`c9X}`8-~^RSV=|p&rK$~#Pq}3b0Q$ehG{B~5V@&n zhK(_R#iouX?eI}04}6czJl}X@55@)6@R71%zVs&K@oFk$lao0@R#n4%V?RXo_$;%^ z-{g(Ddi?s(VI(6Y6J~XF#rQ(vCJ7SB^5jnsKyE+8)PjF|RY%FkGUdP`QK~AzmzmN4d zDQq|w+p{()Ct2RNKWDs6gPeK|oUWx}3o}d&XP9LFO{L*2+B$S7tXh-?F6Fm>w~0NU zx}olE48pT5^i*j8yNd|KUoQq`dCvADd7%L~qlm`{-1#k1N}6r|l8FHmZWXKL}tk)yb-Y%X#GoTR4{rpnhQ{p9q<&Tc~3@cFIyt z+ zN8S0pSKZ61$12iDaCNc%jT0V8me4MtO`DPa%GZIzo3OJdzz*tetQ1UKMtY7ikx?Te z_h?caV-81^+Sev1GX!BG9Ve)X3#mCH8t{)xfSe&QxRhh8a)=#CAuMp5?SG;$oBFLK znM7blL2_)wKw~OuY}gdf!yP-6lJfkiQz%GF!>U;Y$a0M_LM%0aGDr-$wF83ISug~a zoe7rii#gDaCgQAeT2-c;ZtAc7RG2%vt?A6NsTDFb{yb*8Yie+)xdm;3;DA{c$ph-( zqUy?#ig^6-EI4!Kz+lB#;wT}L=0ZdnwLY?xuB?}X8r?6MKIpp=j;@e>>w_F) z&-z)MZE77vSU8F4j%o9EDlccWNdLaeaK>~Z#B^RyWG{mT)HHt3PrDsj^NuadIzOAB z%pkN=@oy&ra**2gKVNV*LFqMPvqMM1va}dU8H$BuM!KnpDiZY-Cpt+skH(0Rjq^Zq zH#HjLj3+;}c)hj`B^l}PICQMcFMwMg<3w^b$|DnxBqD&;cJTaM@Vsn*h>As0MuH+J zL_}muyA>r?5IMO}lhKKePW<-hdpO+EVv(?9gk&s2ol4SWk{u3m`*tTX;3I`33#KC% z(oG79v4S}GVj8rNb}LuLc09{fbTchkNO9~U5 z9)IDj-6JYwW{#_b3!_L5bdntbW7Q{_%C9bDmnRyX)+z0Zq(G&d0Zzx4VPO-LnFduy z&Y@zb>9Og=BVjo;Bbmc=sVV~PN9F*x5lQ*GcYvp8EL5Ko&Fb_)a(JlYb|y=*z>)Ce zvEx<}!J;&uMOMZIB_{_$5U1;`WxCK#rmF|`@5lbeCIpS-6)32Wi%{2*lxa8Qu3bR- zF(RBAgPMxot<55d_HsJkE!3D?P0xBwOg%`%<`@u-tZ$haQ0iO7@Aj2(@aw6N-)Sil zJg!VwCLR_OO=5d1&Eo`ZdV2l)w~R_P62iDzr9+DyJ;;S*kckJw#9HY;$;2^iu!_=u zOs`}{EBn};$&uq>1lR;+ra{#c9m7)V^*O-r&r?;D&x$hRd}`1Z$~v zvuSldW)i5}rjzpVEfQIahY2KnNk&Zl2ouSFv1RaQ>7?c_p#k&1u8NTp#|Ry&nvPtX zM1eSy7+KUtcvFO*Scq6Nds^`CufB?}Ty+)ZWMshWNR6gK1z+1;a|XY!I*z^dDbfzJ zSgt@!11z7MeGkxDJ(<@?BHbPIq0mu^Xmktp4wn%TnFkS_MJAj~G7iw_o(uB;$Bn?!|kgibJ%GL9WLx*wIoD!@o$S1Q;TG9sGQs>+q4qI_f zcAY+rgH6rW?4*>z6#8;mDoF)YIyNFFpQlzKX8}yd0yrXt;A-He&872MMyBEg)bXlz zGDb>d-=6`nqMFvwOAW1@rVaFpzl;$X)^AW2VlOE#DHrF(no?Y`+ii4aZqOX^PEtdQ zW5E~E7lJ;v-tQ!h@C0|3Q9I==?% zK#CwmO+5TPy4CAxWgf-@23mXw=HU2%Vfj@4O(M78dv{(S|*kio_vXAw*7AQ4aQ(wTG5+S@md7_D5zQ_0WL zRVL*3V;mSuEhHVKQ%3b;Ueld2rnb~H@i-$dvWR{oZ1mx}T;N(#P)bKJSwbl(D&Nk^ zaro3XhGJQa#|l-EezW}$wryL1iv?-fVKv%vj;$F zrYvNpxt1%3;{mG3L_5hcDMO_G?3XU1o^9KlGSXs75){{+cUFdf{rlJH87yW@F2-0P zS*Ora$5CiB_;qbe8ByWxXOBBeQ9oWI?tg^FNKK@eTuoB&Dk3w-x?_2GYQ{M8^Gau6 z!>Y92NW0tR`QH~#Rx-nZ43|qb2D{My=EB63vl$1jiNz8;rTkCMg+{;MS}IOeXyrPbp>284Afv(?;PYL zE73{HN(E93<>eBst#1?Aa(;+O@%OrAV38O^QieFm5(#K0qVYGLh^KnnwrwNM$~r^? zHqJXY(Se^-rkHNiK@~> zrkumg&Dd3Q#!7V95(rvJ08<&%9yukSB$Kli`XX5v@1$Q@L>-}0N__Ontqv?kKw>IM z{7h&u=(8T$_9jgBHq=A{DV6%sg^1pDE^=Zy+y3TF-}_#(iAxvNFXc>c9LxsD!HAGoh!Dj7%>Q%x?e}1eto5k%JsCmP#cZ_#df@4 zCt3RDkTgYo*p#oh?!J9;a#2hYQkI}N&{G+KXE$|dOX)$}G=@X{^xW!Xkk^d3XZaQb zUpQ0?FMdsrxtkt7*=n(xes2yHfH6j~8YeXF!zhDjR8h51C-p8_7?)(I84Vs5;BLB7SAwG-lX!}N{Y#LQe*aX#4;aG1YD4XIz*v0{|X3Gg;_$QlC?DA zI3?je(W3Tx;pNNV zb56cnS7mD}o;Y5G{Y}l*Im`$!=9K+D8xxH`B0{o^2uDVrlWSsB9qah0x1+X=DV0Q? zp!YS@*^;_U>l!T)Uc+v@Z{*oGyLao*(z5Be<$c5_R`7dZu)RnTl$V#|w%cw)OTG9b zdL}p16)d9b&<5MRWdCaHenyFK93qnOi}mlnd{oMO^~1Z}B1^xWn)WM+E&5{Q1i&OX z$39SB*anJ1|`ots~QddFQwyi6${mFe)seVTNSrK)1b74(AW+R0nQ;uAR((Zl# z=uAA{v)J%{{8i0+K*x=w+uuOHL-t!aFQ%xl$-al9CPFHb?D0U1VB9qu=p=&iQZw*u zV=Qy=&19Ub(K`bilP$+^@N5}8)nmBSY1geg?sX{KKH5DfMY7W*xhTFGwE;EGB zcQp8PKeAuNpYxIGb(g^XDE!?t{&WW$)YJCC?`8Q@kU)8g3*~Y zg-kk0ewv({C$WV7#*My1m~t$FZ8H&=S1iSZ<1MP4@3G6i+=8*9*_i=h%%%ZVVgL6d zM7?7x0=+5Yf3kM%ZQh0klscIFJl(v7RC9fORuc@Pg~mu<1DSYU)H#0|qeL)WUqdgq zQX{eKLfVH>jD1u~{+?jksHQw88&Wz@n|IqCHS(#aej5ps$wtU;@K};1RngD&+(_xd zuOy3(U2^ZPf(Q7tHR+=^o&O-2U=DWLZ(&SRT8}dGW*=ZU|bo6xzhvZuYUQ$$tON~{k+&% zA!XGRb(NdSBo`hgXQq#hjfnx(2B&hS-n@A;Dk>^4p^!|)dQzQX)}WEU<@`!&3CH8q zZ2m2xMG|X2cLDV+TngQ_qCdpF<=@gsD$INA3oE8A@5@;5^wY;xsFqTV>tCj~Yor|9 zk({M)B%EY{#|_DTf937#Ml_#n-@YAJx#!bhGW=x?%70Qgt*;rPicFl7tZbyeZ)a?~ zHRa4~3Zn>op4?!!-yU$?eaGXjNY7fTWsFtzy& z!L%QEK6+O*#*6=+*NOjH`5eBn>Q-?1J}Lwc(^8LQfi*uA_+{;2a*{xh2uR=@gHM%L z=Vc->p$Sg-%2>kpMaI_q=!zV$4H=}YY?I9V5er40ez>AK>uX>8*OV-uN+#xfn?~1n zIg=P?ym%WI6$DE^b4JX;L__o4MYZdPw01OR)`>f?#wy)H8jbuZjL2^hsb7Rg?=@9k#;F|YxxRv#=US^U^A${f3GdJKr-uug#3yscGy^l}M5Gd7TV4@eFp7O`HMxon+%Cw0`UV0O#feiD8zn z=7YM+@gPzZGbhyj?Ad`pjd{T73sv*5_BeA2Cs_u4aF~7=T1ZOW?+$w!%T8BJobe)} z9fC)E6DE6(O2iFR;I>i0@Fw%H{|s^b>fV0G+1fx%by4OZH9P022EacF>bZXkbkEJbImazbqc`kX+eQ}9_ zHS?laP&obvPO7D4KgjWkDY0Z-xj2H%xxFxOVb%B-yS=Dy=ZG3f@_eLpx!q(wKAYwy~%3r2^&Mib&gbZ^$gP5=Y+lL>W_jVdQ+A>~7k zs5s0@>>#8%lR`d}H=fYO*FZStU#if%_Tc*awnrj_9t?k zM5uGk%%}EN8(*8NNLfvjm#&+^oWk((BY{rE&6%E$Ndmj%7q#-x7dmMuauRB)v1H4s zqntyXSv)PMn&rc8pgnV;X_@Hh5qQ;8hd+F+7bCf)Ih^xok0Sc60gk@1iMG|UZ7W6& z=P*s!zJ0s4tYEoEcRFsPbNzrd75hA}D1lV>g0+*1@uCs&|9tb-&7+Ero9@?38F$=B z%E|4lFB(pCC`3dO@TFnok-+T5S)I)zk%7d(w|whBoO)k#;? zJ8`%=rBVf55CUO_S1LWpW7_Eh^9fF!{AB*ZitqW^iih^Y>G(9g`?VqvmOo1W3|cq! zz#FOZ{T-2%FC*kAz;fu4M*ru9kSocYQ`$ee2dvmBTqdn)!3vC4u)^aAU=f}6KMTlt zGT{?9>~x*J)+;20_(Mdpf7`Nci=VOcrzudsbNuNypqbj2h}7IcUoyMD$&+#I1ZVk@ z$g_S}4!FJNagtREnUrs*>*4>%udGa|m?y)*CMc7EZ>~Ip|5*M*_;D>2!h7g0AEVJq z3WvJ9FpS1YcHpZ@3$Ef^a^*NH% zRJ4LbP!jZzg4~R53)R;q9)Em)mMg$-=3p<4124c$RSNB-zuIl!3u^RaCpVBkd|81$WALjF^~%ew-Yf!%3Eb|5Cu*O>)SH%8=YH z@z&FC73vXX?q?sR;^yg-l3DEc5(8B=nnFBuLGg>0NT1qOo^CC!K`NI2VIVv2^BdO9`#BU z(9KMw)8b^Y3e~scz=PtiY)GRJug!%p2Lyjga)d(0Y@M^EOtO?9|Dg!O86qgJ9`;~f z@%S81Qw1G<4Tn#=EEOdQ;iXQhkn_tOLb!=2geJXlV3+=Pr`%Qk23+A*s-P;!F9-s3J7y*re|I-;-ZV#ah@RDnoJ3ZbBx=iuy0IsjDAH-sS0m4pu?~oaLz`ly&$yp5EudN49j4 ziE4(C<^<@n8ap(+bv!x!ZJ5dkL2BXL<$6y2v5w|&*n_D6+fuG(`5cvRmVX_}8C|kF zpdvjZ?%c0BaEVnAtPC0vmLBoncwt8kUQ_e^sDrc!3^Ip&>pRdy8@rDsU6LfjGe6(U z+1)~lTd9ur4SWVw*FnCkjL3;NP1pWE@H;BDY+Ey;)9K+y4m+8{yp%}YR;f(<=l*UC z^~f9e$+@>#$3^ICT8ZFPnVR_>L|i*FwrxpihuGm@6O<`}V%1KKqbSRR;#F=OZTF+L zwhKM2ftZ?-?69(J3ZxO~D5IrNH;}~z8E;Kw(~`lX$mB6qNL3$>SgZwZP1#FS!hUNj z8{`}oTZ_d6U{-WSY1w!zJ8he38c917U?A46U5nm`TtFtCE0972rI&=0cTQ+%Y;qw# zF9Me<(4-F_tE;N ztjZ|*M(r82{>OA5H^5;3h08AcoqX-J7PNGcN+7fPJ>iwABA$a0PAc<`n&#WpRfGsP z|C1QmEu68!f#D7kx&<5PBx`My`xudv8*aVqk&%8wwO@yK97e?9UqmCU&zq2U43<&* zO+1MKpNuQUV~ixLPIQkh*{^dwk)N|$Z%wHT#bbd@P^JPBy;LF8+;m66l(C42%KUUU z&h&)vZYwFKr`s{0F_@N<)X6L}OB2Y4flN&j84+ZjAreC5L%r(MIw|6z@(HN*gqotZ zX$cFe%I;}3RxIW#r|hKzOgAh}SgdvQZyRLd5&i3o$vRDEbw~jOL(YX{*;$ZEijM-B zq~IoD;aGzc>6uX?C}TKSJ+El;tAHmPTsT(iLT@m6nIn~XH{;rsTDIdgOff;}KMC(a zIHF%g2z%(w-_c2xP(^hlPS8?UIKB>PZbn<%FGwF&iCQybzGH}$2hQK15q;8(=2c|p z_Fzeg)NvCHvhL<;Iy8%Q_z40LYqw(S*2E?uyEU*M(_Vkj{LYGzej`p!oDrvgk-_m@ zY93c5e2-bbXDkvVg~gp;<6d|e8VGK%ldN?>n0}*9O7XTX@USM0qehrD;NY7x#@}Q( z*aT$?K*j4Am9c!L+-BnuQ=J+Wf2t{SGCXiQb%fnIjkR`n}|1uW34m&*vn9LWISu(V!%Np3WdT{n6OSbTo*|g-Y3QGie!(ox~s%>97{1 za44cdCYW@@2#O*nY4qx)R}Y<`lZ!r|5-zB5VF=L2hWc*KWP~b47m)~!DjzlTqA$=8 zvoc7lrN2@QYWmM|dL8&Wc-vV{vP`}rnb<1=ycS6gYkIMem(%J(mZbI_k4qviT_7(* zV8N^?N~p8GWVQ-*A4Tb`NQ`yLLE`erP`jH`D4(eF8;3?f^A!#R3_Q5(^pC@*;;Ce*ALu2^r_SPAYDy0y}lKN@yl>H z+VZ}wYtE}ssQfyLoEWCuK*w!`N+-a8{)DJQe{n=7*#H&s4%&W(%EB2YksA*xrg zX}5{^AqlgJrCh{SRV7U_jm$En$mDPp!`eh9Jy{>Er?Hsdh|?k;{R#-;WQ5iY+7_kt zUV0Z5Oor&Uny7L#)7J*#3S&1_pfhBx;U=>}_!lGwutZi$82B8^XBL7QF6Oo(!73pJ zOh2FYKWw)kReUxfXtdB~M8)^Pf^XilZCz4_YIeC?Y}O@#fAusDL7R{OzeyHfFHJ|wa;O>E2z;EJU|^!jyF9CG8$V=lZ`r=z)3 zgFnO&49C3?rsF4uTuU_4_Z{NOYRUz1wf7LEu|EtFkTy~mn3@Ib*L)0K8 zQh4+kFb1sl&{${0qfBg&RBCbkT1Zw69v8hmw=QdC22&u*p%|NV|zH;igfRI$9$ z=Ym|vplv0)&>)A{VcWN}on)2B9Hwomjq9Oywt-sv!%VO}T1Y%K=VR9;{orgeVH1=o zz*Ae;EAQVGJxoM}3UWMOMPE8>pg$N7kqR>REXqy8Vp?8n^rMcHlpsANoy;s*#0m

7lP`j8Dp=R)yBqxd!n7UUVY0zKy0WxF1 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%0An?-9?`6 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

je69i^bzmo(;wvw8wmEhYM)01xiECb(HR`Sa!II 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

*qc(YSDECmmEW5C2F8eo9;$W+ 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 Date: Thu, 25 Jun 2020 17:15:08 -0400 Subject: [PATCH 052/106] Fix margins --- app/components/UI/Tokens/index.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/components/UI/Tokens/index.js b/app/components/UI/Tokens/index.js index cb0dcc699f2..65c866dc320 100644 --- a/app/components/UI/Tokens/index.js +++ b/app/components/UI/Tokens/index.js @@ -32,12 +32,13 @@ const styles = StyleSheet.create({ tokensHome: { justifyContent: 'center', alignItems: 'center', - marginVertical: 20, + marginTop: 35, marginHorizontal: 50 }, tokensHomeText: { ...fontStyles.normal, - margin: 15, + marginBottom: 15, + marginHorizontal: 15, fontSize: 18, color: colors.fontPrimary, textAlign: 'center' From be1e6cb42484ba49fe95b1f12cc1042e163aa6fe Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 26 Jun 2020 09:52:43 -0400 Subject: [PATCH 053/106] Add allowedToBuy function to control by device and network --- app/components/UI/FiatOrders/index.js | 25 +++++++++++-------- app/components/UI/ReceiveRequest/index.js | 3 ++- app/components/UI/Tokens/index.js | 3 ++- app/components/Views/SendFlow/SendTo/index.js | 3 ++- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 0ea65e3713b..07a711ab978 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -2,6 +2,7 @@ import React, { useCallback } from 'react'; import PropTypes from 'prop-types'; import { View, StyleSheet, InteractionManager } from 'react-native'; import { connect } from 'react-redux'; +import Device from '../../../util/Device'; import NotificationManager from '../../../core/NotificationManager'; import { strings } from '../../../../locales/i18n'; import { renderNumber } from '../../../util/number'; @@ -13,21 +14,15 @@ import processOrder from './orderProcessor'; import Text from '../../Base/Text'; import { colors } from '../../../styles/common'; +/** + * @typedef {import('../../../reducers/fiatOrders').FiatOrder} FiatOrder + */ + const POLLING_TIME = 10000; const NOTIFICATION_DURATION = 5000; const SHOW_DEBUG = false; -const styles = StyleSheet.create({ - bottomView: { - padding: 10, - paddingBottom: 20, - backgroundColor: colors.grey000 - } -}); - -/** - * @typedef {import('../../../reducers/fiatOrders').FiatOrder} FiatOrder - */ +export const allowedToBuy = network => network === '1' || (network === '42' && Device.isIos()); const baseNotificationDetails = { duration: NOTIFICATION_DURATION @@ -81,6 +76,14 @@ export const getNotificationDetails = fiatOrder => { } }; +const styles = StyleSheet.create({ + bottomView: { + padding: 10, + paddingBottom: 20, + backgroundColor: colors.grey000 + } +}); + function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOrders, dispatch }) { // Pending orders depend on selectedAddress and selectedNetworks diff --git a/app/components/UI/ReceiveRequest/index.js b/app/components/UI/ReceiveRequest/index.js index fe1961b85ca..6d0ccd57f5c 100644 --- a/app/components/UI/ReceiveRequest/index.js +++ b/app/components/UI/ReceiveRequest/index.js @@ -19,6 +19,7 @@ import { generateUniversalLinkAddress } from '../../../util/payment-link-generat import AddressQRCode from '../../Views/AddressQRCode'; import Analytics from '../../../core/Analytics'; import { ANALYTICS_EVENT_OPTS } from '../../../util/analytics'; +import { allowedToBuy } from '../FiatOrders'; const TOTAL_PADDING = 64; const ACTION_WIDTH = (Dimensions.get('window').width - TOTAL_PADDING) / 2; @@ -143,7 +144,7 @@ class ReceiveRequest extends PureComponent { */ onBuy = async () => { const { navigation, toggleReceiveModal, network } = this.props; - if (network !== '1' && network !== '42') { + if (!allowedToBuy(network)) { Alert.alert( strings('fiat_on_ramp.network_not_supported'), strings('fiat_on_ramp.switch_network') diff --git a/app/components/UI/Tokens/index.js b/app/components/UI/Tokens/index.js index 65c866dc320..1522398ed09 100644 --- a/app/components/UI/Tokens/index.js +++ b/app/components/UI/Tokens/index.js @@ -16,6 +16,7 @@ import { safeToChecksumAddress } from '../../../util/address'; import Analytics from '../../../core/Analytics'; import { ANALYTICS_EVENT_OPTS } from '../../../util/analytics'; import StyledButton from '../StyledButton'; +import { allowedToBuy } from '../FiatOrders'; const styles = StyleSheet.create({ wrapper: { @@ -209,7 +210,7 @@ class Tokens extends PureComponent { renderBuyEth() { const { tokens, network, tokenBalances } = this.props; - if (network !== '1' && network !== '42') { + if (!allowedToBuy(network)) { return null; } const eth = tokens.find(token => token.isETH); diff --git a/app/components/Views/SendFlow/SendTo/index.js b/app/components/Views/SendFlow/SendTo/index.js index 56d9839ddf1..050c43588c0 100644 --- a/app/components/Views/SendFlow/SendTo/index.js +++ b/app/components/Views/SendFlow/SendTo/index.js @@ -23,6 +23,7 @@ import WarningMessage from '../WarningMessage'; import { util } from '@metamask/controllers'; import Analytics from '../../../../core/Analytics'; import { ANALYTICS_EVENT_OPTS } from '../../../../util/analytics'; +import { allowedToBuy } from '../../../UI/FiatOrders'; const { hexToBN } = util; const styles = StyleSheet.create({ @@ -458,7 +459,7 @@ class SendFlow extends PureComponent { renderBuyEth = () => { const { navigation, network } = this.props; - if (network !== '1' && network !== '42') { + if (!allowedToBuy(network)) { return null; } From 35e2f0334efa9e9cf389a7af1a2447ac1113bad0 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 26 Jun 2020 12:13:41 -0400 Subject: [PATCH 054/106] Improve paymentMethod Modal for small screens --- .../PaymentMethodSelector/transak.js | 43 ++++++++++++++++--- .../components/PaymentMethod/Modal.js | 12 +++--- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js b/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js index 6e2df14818b..2a72b0846c3 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { TouchableOpacity, Image, StyleSheet, View } from 'react-native'; +import { TouchableOpacity, Image, StyleSheet, ScrollView, View } from 'react-native'; import { strings } from '../../../../../locales/i18n'; import PaymentMethod from '../components/PaymentMethod'; @@ -17,6 +17,12 @@ const style = StyleSheet.create({ cta: { marginTop: 25, marginBottom: 5 + }, + countryList: { + flexDirection: 'row' + }, + countryCol: { + width: '50%' } }); @@ -52,12 +58,35 @@ const TransakPaymentMethod = ({ onPress }) => ( title={strings('fiat_on_ramp.modal_transak_support')} > {strings('fiat_on_ramp.transak_modal_text')} - - Austria 🇦🇹, Belgium 🇧🇪, Cyprus 🇨🇾, Czechia 🇨🇿, Estonia 🇪🇪, Finland 🇫🇮, France 🇫🇷, - Germany 🇩🇪, Greece 🇬🇷, Ireland 🇮🇪, Italy 🇮🇹, Latvia 🇱🇻, Luxembourg 🇱🇺, Malta 🇲🇹, - Netherlands 🇳🇱, Portugal 🇵🇹, Romania 🇷🇴, Slovakia 🇸🇰, Slovenia 🇸🇮, Spain 🇪🇸, United - Kingdom 🇬🇧 - + + + + Austria 🇦🇹 + Belgium 🇧🇪 + Cyprus 🇨🇾 + Czechia 🇨🇿 + Estonia 🇪🇪 + Finland 🇫🇮 + France 🇫🇷 + Germany 🇩🇪 + Greece 🇬🇷 + Ireland 🇮🇪 + Italy 🇮🇹 + + + Latvia 🇱🇻 + Luxembourg 🇱🇺 + Malta 🇲🇹 + Netherlands 🇳🇱 + Portugal 🇵🇹 + Romania 🇷🇴 + Slovakia 🇸🇰 + Slovenia 🇸🇮 + Spain 🇪🇸 + United Kingdom 🇬🇧 + + + )} diff --git a/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js b/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js index 588350e2fd1..375c4114ef6 100644 --- a/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js +++ b/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js @@ -8,12 +8,15 @@ import { strings } from '../../../../../../locales/i18n'; import Title from '../Title'; import { colors } from '../../../../../styles/common'; import StyledButton from '../../../StyledButton'; +import { SafeAreaView } from 'react-navigation'; +import { ScrollView } from 'react-native-gesture-handler'; const styles = StyleSheet.create({ modalView: { backgroundColor: colors.white, justifyContent: 'center', alignItems: 'center', + marginVertical: 25, borderRadius: 10, shadowColor: colors.black, shadowOffset: { @@ -43,10 +46,7 @@ const styles = StyleSheet.create({ color: colors.black }, body: { - borderColor: colors.red, - borderWidth: 0, width: '100%', - paddingVertical: 5, paddingHorizontal: 20 }, @@ -76,20 +76,20 @@ const PaymentMethodModal = ({ isVisible, title, dismiss, children }) => ( style={styles.modal} useNativeDriver > - + {title} - {children} + {children} {strings('fiat_on_ramp.purchase_method_modal_close')} - + ); From 4e8dfbe414a7aaade2a28ef830b99e4001474a93 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 26 Jun 2020 15:49:28 -0400 Subject: [PATCH 055/106] Add Analytics --- .../PaymentMethodSelector/index.android.js | 6 +++++ .../PaymentMethodSelector/index.ios.js | 14 +++++++++- app/components/UI/ReceiveRequest/index.js | 3 +++ app/components/UI/Tokens/index.js | 7 ++++- app/components/Views/SendFlow/SendTo/index.js | 12 ++++++--- app/util/analytics.js | 27 ++++++++++++++++--- 6 files changed, 61 insertions(+), 8 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js index 6aa1cc13a09..dd8e8d5d90c 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js @@ -1,8 +1,11 @@ import React, { useContext, useCallback } from 'react'; +import { InteractionManager } from 'react-native'; import PropTypes from 'prop-types'; import { NavigationContext } from 'react-navigation'; import { connect } from 'react-redux'; import { strings } from '../../../../../locales/i18n'; +import Analytics from '../../../../core/Analytics'; +import { ANALYTICS_EVENT_OPTS } from '../../../../util/analytics'; import { useTransakFlowURL } from '../orderProcessor/transak'; import { getPaymentSelectorMethodNavbar } from '../../Navbar'; @@ -20,6 +23,9 @@ function PaymentMethodSelectorView({ selectedAddress, ...props }) { url: transakURL, title: strings('fiat_on_ramp.transak_webview_title') }); + InteractionManager.runAfterInteractions(() => { + Analytics.trackEvent(ANALYTICS_EVENT_OPTS.PAYMENTS_SELECTS_DEBIT_OR_ACH); + }); }, [navigation, transakURL]); return ( diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js index 1884cf4ead5..3f2c2d98aa1 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js @@ -1,8 +1,11 @@ import React, { useContext, useCallback } from 'react'; +import { InteractionManager } from 'react-native'; import PropTypes from 'prop-types'; import { NavigationContext } from 'react-navigation'; import { connect } from 'react-redux'; import { strings } from '../../../../../locales/i18n'; +import Analytics from '../../../../core/Analytics'; +import { ANALYTICS_EVENT_OPTS } from '../../../../util/analytics'; import { useTransakFlowURL } from '../orderProcessor/transak'; import { WYRE_IS_PROMOTION } from '../orderProcessor/wyreApplePay'; @@ -22,12 +25,21 @@ function PaymentMethodSelectorView({ selectedAddress, network, ...props }) { const navigation = useContext(NavigationContext); const transakURL = useTransakFlowURL(selectedAddress); - const onPressWyreApplePay = useCallback(() => navigation.navigate('PaymentMethodApplePay'), [navigation]); + const onPressWyreApplePay = useCallback(() => { + navigation.navigate('PaymentMethodApplePay'); + + InteractionManager.runAfterInteractions(() => { + Analytics.trackEvent(ANALYTICS_EVENT_OPTS.PAYMENTS_SELECTS_APPLE_PAY); + }); + }, [navigation]); const onPressTransak = useCallback(() => { navigation.navigate('TransakFlow', { url: transakURL, title: strings('fiat_on_ramp.transak_webview_title') }); + InteractionManager.runAfterInteractions(() => { + Analytics.trackEvent(ANALYTICS_EVENT_OPTS.PAYMENTS_SELECTS_DEBIT_OR_ACH); + }); }, [navigation, transakURL]); return ( diff --git a/app/components/UI/ReceiveRequest/index.js b/app/components/UI/ReceiveRequest/index.js index 6d0ccd57f5c..8588e33ae8e 100644 --- a/app/components/UI/ReceiveRequest/index.js +++ b/app/components/UI/ReceiveRequest/index.js @@ -158,6 +158,9 @@ class ReceiveRequest extends PureComponent { } else { toggleReceiveModal(); navigation.navigate('PaymentMethodSelector'); + InteractionManager.runAfterInteractions(() => { + Analytics.trackEvent(ANALYTICS_EVENT_OPTS.WALLET_BUY_ETH); + }); } }; diff --git a/app/components/UI/Tokens/index.js b/app/components/UI/Tokens/index.js index 1522398ed09..19056318748 100644 --- a/app/components/UI/Tokens/index.js +++ b/app/components/UI/Tokens/index.js @@ -206,7 +206,12 @@ class Tokens extends PureComponent { ); }; - goToBuy = () => this.props.navigation.navigate('PaymentMethodSelector'); + goToBuy = () => { + this.props.navigation.navigate('PaymentMethodSelector'); + InteractionManager.runAfterInteractions(() => { + Analytics.trackEvent(ANALYTICS_EVENT_OPTS.WALLET_BUY_ETH); + }); + }; renderBuyEth() { const { tokens, network, tokenBalances } = this.props; diff --git a/app/components/Views/SendFlow/SendTo/index.js b/app/components/Views/SendFlow/SendTo/index.js index 050c43588c0..26961030038 100644 --- a/app/components/Views/SendFlow/SendTo/index.js +++ b/app/components/Views/SendFlow/SendTo/index.js @@ -457,16 +457,22 @@ class SendFlow extends PureComponent { this.setState({ toInputHighlighted: !toInputHighlighted }); }; + goToBuy = () => { + this.props.navigation.navigate('PaymentMethodSelector'); + InteractionManager.runAfterInteractions(() => { + Analytics.trackEvent(ANALYTICS_EVENT_OPTS.WALLET_BUY_ETH); + }); + }; + renderBuyEth = () => { - const { navigation, network } = this.props; - if (!allowedToBuy(network)) { + if (!allowedToBuy(this.props.network)) { return null; } return ( <> {'\n'} - navigation.navigate('PaymentMethodSelector')}> + {strings('fiat_on_ramp.buy_eth')} diff --git a/app/util/analytics.js b/app/util/analytics.js index 031dba4e6f1..e63d9bcacad 100644 --- a/app/util/analytics.js +++ b/app/util/analytics.js @@ -104,7 +104,11 @@ const NAMES = { DAPP_APPROVE_SCREEN_CANCEL: 'Cancel', DAPP_APPROVE_SCREEN_EDIT_PERMISSION: 'Edit permission', DAPP_APPROVE_SCREEN_EDIT_FEE: 'Edit tx fee', - DAPP_APPROVE_SCREEN_VIEW_DETAILS: 'View tx details' + DAPP_APPROVE_SCREEN_VIEW_DETAILS: 'View tx details', + // Fiat Orders + WALLET_BUY_ETH: 'Buy ETH', + PAYMENTS_SELECTS_DEBIT_OR_ACH: 'Selects debit card or bank account as payment method', + PAYMENTS_SELECTS_APPLE_PAY: 'Selects Apple Pay as payment method' }; const ACTIONS = { @@ -143,7 +147,10 @@ const ACTIONS = { // Send Flow SEND_FLOW: 'Send Flow', // Dapp Interactions - APPROVE_REQUEST: 'Approve Request' + APPROVE_REQUEST: 'Approve Request', + BUY_ETH: 'Buy ETH', + SELECTS_DEBIT_OR_ACH: 'Selects Debit or ACH', + SELECTS_APPLE_PAY: 'Selects Apple Pay' }; const CATEGORIES = { @@ -160,7 +167,9 @@ const CATEGORIES = { RECEIVE_OPTIONS: 'Receive Options', INSTAPAY_VIEW: 'InstaPay View', SEND_FLOW: 'Send Flow', - DAPP_INTERACTIONS: 'Dapp Interactions' + DAPP_INTERACTIONS: 'Dapp Interactions', + WALLET: 'Wallet', + PAYMENTS: 'Payments' }; export const ANALYTICS_EVENT_OPTS = { @@ -465,5 +474,17 @@ export const ANALYTICS_EVENT_OPTS = { CATEGORIES.DAPP_INTERACTIONS, ACTIONS.APPROVE_REQUEST, NAMES.DAPP_APPROVE_SCREEN_VIEW_DETAILS + ), + // Fiat Orders + WALLET_BUY_ETH: generateOpt(CATEGORIES.WALLET, ACTIONS.BUY_ETH, NAMES.WALLET_BUY_ETH), + PAYMENTS_SELECTS_DEBIT_OR_ACH: generateOpt( + CATEGORIES.PAYMENTS, + ACTIONS.SELECTS_DEBIT_OR_ACH, + NAMES.PAYMENTS_SELECTS_DEBIT_OR_ACH + ), + PAYMENTS_SELECTS_APPLE_PAY: generateOpt( + CATEGORIES.PAYMENTS, + ACTIONS.SELECTS_APPLE_PAY, + NAMES.PAYMENTS_SELECTS_APPLE_PAY ) }; From 7946431c2aa2e47f336d4c1e189533c4ebd07b40 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Tue, 30 Jun 2020 16:15:49 -0400 Subject: [PATCH 056/106] Add improved Receive Drawer --- .../components => Base}/ModalHandler.js | 0 .../PaymentMethodSelector/transak.js | 2 +- .../PaymentMethodSelector/wyreApplePay.js | 2 +- .../__snapshots__/index.test.js.snap | 77 ----- .../ReceiveRequestAction/index.js | 83 ------ .../ReceiveRequestAction/index.test.js | 17 -- app/components/UI/ReceiveRequest/index.js | 277 ++++++++---------- locales/en.json | 5 +- locales/es.json | 5 +- 9 files changed, 140 insertions(+), 328 deletions(-) rename app/components/{UI/FiatOrders/components => Base}/ModalHandler.js (100%) delete mode 100644 app/components/UI/ReceiveRequest/ReceiveRequestAction/__snapshots__/index.test.js.snap delete mode 100644 app/components/UI/ReceiveRequest/ReceiveRequestAction/index.js delete mode 100644 app/components/UI/ReceiveRequest/ReceiveRequestAction/index.test.js diff --git a/app/components/UI/FiatOrders/components/ModalHandler.js b/app/components/Base/ModalHandler.js similarity index 100% rename from app/components/UI/FiatOrders/components/ModalHandler.js rename to app/components/Base/ModalHandler.js diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js b/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js index 2a72b0846c3..a4f12cea625 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js @@ -6,7 +6,7 @@ import { strings } from '../../../../../locales/i18n'; import PaymentMethod from '../components/PaymentMethod'; import Title from '../../../Base/Title'; import Text from '../../../Base/Text'; -import ModalHandler from '../components/ModalHandler'; +import ModalHandler from '../../../Base/ModalHandler'; import StyledButton from '../../StyledButton'; import Device from '../../../../util/Device'; diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/wyreApplePay.js b/app/components/UI/FiatOrders/PaymentMethodSelector/wyreApplePay.js index 998088f10b0..5b8159d3cad 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/wyreApplePay.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/wyreApplePay.js @@ -13,8 +13,8 @@ import { } from '../orderProcessor/wyreApplePay'; import PaymentMethod from '../components/PaymentMethod'; -import ModalHandler from '../components/ModalHandler'; +import ModalHandler from '../../../Base/ModalHandler'; import Text from '../../../Base/Text'; import Title from '../components/Title'; diff --git a/app/components/UI/ReceiveRequest/ReceiveRequestAction/__snapshots__/index.test.js.snap b/app/components/UI/ReceiveRequest/ReceiveRequestAction/__snapshots__/index.test.js.snap deleted file mode 100644 index 43295fdae31..00000000000 --- a/app/components/UI/ReceiveRequest/ReceiveRequestAction/__snapshots__/index.test.js.snap +++ /dev/null @@ -1,77 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ReceiveRequestAction should render correctly 1`] = ` - - - - - Title - - - - - Description - - - -`; diff --git a/app/components/UI/ReceiveRequest/ReceiveRequestAction/index.js b/app/components/UI/ReceiveRequest/ReceiveRequestAction/index.js deleted file mode 100644 index b8671e4ff0c..00000000000 --- a/app/components/UI/ReceiveRequest/ReceiveRequestAction/index.js +++ /dev/null @@ -1,83 +0,0 @@ -import React, { PureComponent } from 'react'; -import PropTypes from 'prop-types'; -import { TouchableOpacity, StyleSheet, View, Text } from 'react-native'; -import { fontStyles, colors } from '../../../../styles/common'; -import { connect } from 'react-redux'; - -const styles = StyleSheet.create({ - wrapper: { - margin: 8, - borderWidth: 1, - borderColor: colors.blue, - borderRadius: 8, - padding: 10, - flexDirection: 'column', - alignItems: 'center', - justifyContent: 'center' - }, - title: { - ...fontStyles.bold, - fontSize: 14, - padding: 5 - }, - description: { - ...fontStyles.normal, - fontSize: 12, - padding: 5, - textAlign: 'center', - color: colors.grey500 - }, - row: { - alignSelf: 'center' - }, - icon: { - marginBottom: 5 - } -}); - -/** - * PureComponent that renders a receive action - */ -class ReceiveRequestAction extends PureComponent { - static propTypes = { - /** - * The navigator object - */ - icon: PropTypes.object, - /** - * Action title - */ - actionTitle: PropTypes.string, - /** - * Action description - */ - actionDescription: PropTypes.string, - /** - * Custom style - */ - style: PropTypes.object, - /** - * Callback on press action - */ - onPress: PropTypes.func - }; - - render() { - const { icon, actionTitle, actionDescription, style, onPress } = this.props; - return ( - - {icon} - - {actionTitle} - - - - {actionDescription} - - - - ); - } -} - -export default connect()(ReceiveRequestAction); diff --git a/app/components/UI/ReceiveRequest/ReceiveRequestAction/index.test.js b/app/components/UI/ReceiveRequest/ReceiveRequestAction/index.test.js deleted file mode 100644 index c26149835b8..00000000000 --- a/app/components/UI/ReceiveRequest/ReceiveRequestAction/index.test.js +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react'; -import { shallow } from 'enzyme'; -import ReceiveRequestAction from './'; -import configureMockStore from 'redux-mock-store'; - -const mockStore = configureMockStore(); - -describe('ReceiveRequestAction', () => { - it('should render correctly', () => { - const initialState = {}; - - const wrapper = shallow(, { - context: { store: mockStore(initialState) } - }); - expect(wrapper.dive()).toMatchSnapshot(); - }); -}); diff --git a/app/components/UI/ReceiveRequest/index.js b/app/components/UI/ReceiveRequest/index.js index 8588e33ae8e..c4e51946135 100644 --- a/app/components/UI/ReceiveRequest/index.js +++ b/app/components/UI/ReceiveRequest/index.js @@ -1,28 +1,30 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; -import { InteractionManager, SafeAreaView, Dimensions, StyleSheet, View, Text, Alert } from 'react-native'; -import { colors, fontStyles } from '../../../styles/common'; -import ReceiveRequestAction from './ReceiveRequestAction'; -import Logger from '../../../util/Logger'; -import Share from 'react-native-share'; // eslint-disable-line import/default -import { connect } from 'react-redux'; -import { toggleReceiveModal } from '../../../actions/modals'; +import { InteractionManager, TouchableOpacity, SafeAreaView, Dimensions, StyleSheet, View, Alert } from 'react-native'; import Modal from 'react-native-modal'; -import { strings } from '../../../../locales/i18n'; -import ElevatedView from 'react-native-elevated-view'; -import AntIcon from 'react-native-vector-icons/AntDesign'; -import SimpleLineIcons from 'react-native-vector-icons/SimpleLineIcons'; -import FontAwesome from 'react-native-vector-icons/FontAwesome'; -import FontAwesome5 from 'react-native-vector-icons/FontAwesome5'; -import Device from '../../../util/Device'; -import { generateUniversalLinkAddress } from '../../../util/payment-link-generator'; -import AddressQRCode from '../../Views/AddressQRCode'; +import Share from 'react-native-share'; +import QRCode from 'react-native-qrcode-svg'; +import Clipboard from '@react-native-community/clipboard'; +import EvilIcons from 'react-native-vector-icons/EvilIcons'; +import { connect } from 'react-redux'; + import Analytics from '../../../core/Analytics'; +import Logger from '../../../util/Logger'; +import Device from '../../../util/Device'; +import { strings } from '../../../../locales/i18n'; import { ANALYTICS_EVENT_OPTS } from '../../../util/analytics'; +import { generateUniversalLinkAddress } from '../../../util/payment-link-generator'; import { allowedToBuy } from '../FiatOrders'; +import { showAlert } from '../../../actions/alert'; +import { toggleReceiveModal } from '../../../actions/modals'; -const TOTAL_PADDING = 64; -const ACTION_WIDTH = (Dimensions.get('window').width - TOTAL_PADDING) / 2; +import { colors, fontStyles } from '../../../styles/common'; +import Text from '../../Base/Text'; +import ModalHandler from '../../Base/ModalHandler'; +import AddressQRCode from '../../Views/AddressQRCode'; +import EthereumAddress from '../EthereumAddress'; +import GlobalAlert from '../GlobalAlert'; +import StyledButton from '../StyledButton'; const styles = StyleSheet.create({ wrapper: { @@ -45,50 +47,48 @@ const styles = StyleSheet.create({ backgroundColor: colors.grey400, opacity: Device.isAndroid() ? 0.6 : 0.5 }, - actionsWrapper: { - marginHorizontal: 16, - paddingBottom: Device.isIphoneX() ? 16 : 8 + body: { + alignItems: 'center', + paddingHorizontal: 15 + }, + qrWrapper: { + margin: 15 + }, + addressWrapper: { + flexDirection: 'row', + alignItems: 'center', + margin: 15, + padding: 9, + paddingHorizontal: 15, + backgroundColor: colors.grey000, + borderRadius: 30 + }, + copyButton: { + backgroundColor: colors.grey050, + color: colors.fontPrimary, + borderRadius: 12, + overflow: 'hidden', + paddingVertical: 3, + paddingHorizontal: 6, + marginHorizontal: 6 }, - row: { + actionRow: { flexDirection: 'row', - alignItems: 'center' + marginBottom: 15 + }, + actionButton: { + flex: 1, + marginHorizontal: 8 }, title: { ...fontStyles.normal, + color: colors.fontPrimary, fontSize: 18, flexDirection: 'row', alignSelf: 'center' }, titleWrapper: { - marginVertical: 8 - }, - modal: { - margin: 0, - width: '100%' - }, - copyAlert: { - width: 180, - backgroundColor: colors.darkAlert, - padding: 20, - paddingTop: 30, - alignSelf: 'center', - alignItems: 'center', - justifyContent: 'center', - borderRadius: 8 - }, - copyAlertIcon: { - marginBottom: 20 - }, - copyAlertText: { - textAlign: 'center', - color: colors.white, - fontSize: 16, - ...fontStyles.normal - }, - receiveAction: { - flex: 1, - width: ACTION_WIDTH, - height: ACTION_WIDTH + marginTop: 10 } }); @@ -113,17 +113,16 @@ class ReceiveRequest extends PureComponent { * Action that toggles the receive modal */ toggleReceiveModal: PropTypes.func, + /** + /* Triggers global alert + */ + showAlert: PropTypes.func, /** * Network id */ network: PropTypes.string }; - state = { - qrModalVisible: false, - buyModalVisible: false - }; - /** * Share current account public address */ @@ -164,6 +163,17 @@ class ReceiveRequest extends PureComponent { } }; + copyAccountToClipboard = async () => { + const { selectedAddress } = this.props; + Clipboard.setString(selectedAddress); + this.props.showAlert({ + isVisible: true, + autodismiss: 1500, + content: 'clipboard-alert', + data: { msg: strings('account_details.account_copied_to_clipboard') } + }); + }; + /** * Closes QR code modal */ @@ -189,36 +199,7 @@ class ReceiveRequest extends PureComponent { }); }; - actions = [ - { - icon: , - title: strings('receive_request.share_title'), - description: strings('receive_request.share_description'), - onPress: this.onShare - }, - { - icon: , - title: strings('receive_request.qr_code_title'), - description: strings('receive_request.qr_code_description'), - onPress: this.openQrModal - }, - { - icon: , - title: strings('receive_request.request_title'), - description: strings('receive_request.request_description'), - onPress: this.onReceive - }, - { - icon: , - title: strings('receive_request.buy_title'), - description: strings('receive_request.buy_description'), - onPress: this.onBuy - } - ]; - render() { - const { qrModalVisible, buyModalVisible } = this.state; - return ( @@ -229,69 +210,70 @@ class ReceiveRequest extends PureComponent { {strings('receive_request.title')} + + + {({ isVisible, toggleModal }) => ( + <> + { + toggleModal(); + InteractionManager.runAfterInteractions(() => { + Analytics.trackEvent(ANALYTICS_EVENT_OPTS.RECEIVE_OPTIONS_QR_CODE); + }); + }} + > + + + + + + + )} + - - - - - - - - + {strings('receive_request.scan_address')} + + + + + + + {strings('receive_request.copy')} + + + + + + + {allowedToBuy(this.props.network) && ( + + {strings('fiat_on_ramp.buy_eth')} + + )} + + {strings('receive_request.request_payment')} + - - - - - - - - - {strings('receive_request.coming_soon')} - - + + ); } @@ -304,7 +286,8 @@ const mapStateToProps = state => ({ }); const mapDispatchToProps = dispatch => ({ - toggleReceiveModal: () => dispatch(toggleReceiveModal()) + toggleReceiveModal: () => dispatch(toggleReceiveModal()), + showAlert: config => dispatch(showAlert(config)) }); export default connect( diff --git a/locales/en.json b/locales/en.json index af21ec14cb3..dbf2f2d6cb9 100644 --- a/locales/en.json +++ b/locales/en.json @@ -1011,7 +1011,10 @@ "buy_description": "Buy crypto with debit card or bank transfer", "public_address": "Public Address", "public_address_qr_code": "Public Address", - "coming_soon": "Coming soon..." + "coming_soon": "Coming soon...", + "request_payment": "Request Payment", + "copy": "Copy", + "scan_address": "Scan address to receive payment" }, "experimental_settings": { "payment_channels": "Payment Channels", diff --git a/locales/es.json b/locales/es.json index d51b9d112f4..d08cd27b81e 100644 --- a/locales/es.json +++ b/locales/es.json @@ -941,7 +941,10 @@ "buy_description": "Compre con tarjeta de dédito o transferencia bancaria", "public_address": "Dirección Pública", "public_address_qr_code": "Dirección Pública", - "coming_soon": "Pronto..." + "coming_soon": "Pronto...", + "request_payment": "Solicitar Pago", + "copy": "Copiar", + "scan_address": "Escanee dirección para recibir pago" }, "experimental_settings": { "payment_channels": "Canales de Pago", From 08133983af0153fac393a098ca6a245eeb33c4bd Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Wed, 1 Jul 2020 15:32:25 -0400 Subject: [PATCH 057/106] Remove logger.messages and add errors to track --- app/components/UI/FiatOrders/PaymentMethodApplePay/index.js | 2 +- app/components/UI/FiatOrders/orderProcessor/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index b87c93473df..0d36258f3e0 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -277,7 +277,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network NotificationManager.showSimpleNotification(getNotificationDetails(order)) ); } else { - Logger.message('FiatOrders::WyreApplePayProcessor empty order response', order); + Logger.error('FiatOrders::WyreApplePayProcessor empty order response', order); } } } catch (error) { diff --git a/app/components/UI/FiatOrders/orderProcessor/index.js b/app/components/UI/FiatOrders/orderProcessor/index.js index b73656a3a61..86c85b7435f 100644 --- a/app/components/UI/FiatOrders/orderProcessor/index.js +++ b/app/components/UI/FiatOrders/orderProcessor/index.js @@ -12,7 +12,7 @@ function processOrder(order) { return processTransakOrder(order); } default: { - Logger.message('FiatOrders::ProcessOrder unrecognized provider', order); + Logger.error('FiatOrders::ProcessOrder unrecognized provider', order); return order; } } From 9df2107c5b9a7cdfa62a3f93f9c421cad83d4e8c Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Wed, 1 Jul 2020 17:37:10 -0400 Subject: [PATCH 058/106] Remove logger.messages and add errors to track --- app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index a5b84d2a47b..3fdf9e09683 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -219,7 +219,7 @@ export async function processWyreApplePayOrder(order) { try { const { data } = await getOrderStatus(order.network, order.id); if (!data) { - Logger.message('FiatOrders::WyreApplePayProcessor empty data', order); + Logger.error('FiatOrders::WyreApplePayProcessor empty data', order); return order; } @@ -411,9 +411,7 @@ export function useWyreApplePay(amount, address, network) { const { data, status } = await createFiatOrder(network, payload); if (status >= 200 && status < 300) { paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.SUCCESS); - const order = { ...wyreOrderToFiatOrder(data), network }; - Logger.message('FiatOrders::WyreApplePayPayment order created', order); - return order; + return { ...wyreOrderToFiatOrder(data), network }; } paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.FAIL); throw new WyreException(data.message, data.type, data.exceptionId); From b5686b21ec0217f3f0778365b33638a9d46633d3 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 2 Jul 2020 11:52:01 -0400 Subject: [PATCH 059/106] Move Fiat Orders polling frequency to AppConstants --- app/components/UI/FiatOrders/index.js | 5 +++-- app/core/AppConstants.js | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 07a711ab978..09ed0ee9e5f 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { View, StyleSheet, InteractionManager } from 'react-native'; import { connect } from 'react-redux'; import Device from '../../../util/Device'; +import AppConstants from '../../../core/AppConstants'; import NotificationManager from '../../../core/NotificationManager'; import { strings } from '../../../../locales/i18n'; import { renderNumber } from '../../../util/number'; @@ -18,7 +19,7 @@ import { colors } from '../../../styles/common'; * @typedef {import('../../../reducers/fiatOrders').FiatOrder} FiatOrder */ -const POLLING_TIME = 10000; +const POLLING_FREQUENCY = AppConstants.FIAT_ORDERS.POLLING_FREQUENCY; const NOTIFICATION_DURATION = 5000; const SHOW_DEBUG = false; @@ -106,7 +107,7 @@ function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOr }) ); }, - pendingOrders.length ? POLLING_TIME : null + pendingOrders.length ? POLLING_FREQUENCY : null ); const onPressAdd = useCallback(() => createFakeOrder(selectedAddress, network), [ diff --git a/app/core/AppConstants.js b/app/core/AppConstants.js index 5f3fcb08c2e..9158e15d7de 100644 --- a/app/core/AppConstants.js +++ b/app/core/AppConstants.js @@ -42,6 +42,7 @@ export default { WYRE_API_ENDPOINT: 'https://api.sendwyre.com/', WYRE_API_ENDPOINT_TEST: 'https://api.testwyre.com/', WYRE_MERCHANT_ID: 'merchant.io.metamask', - WYRE_MERCHANT_ID_TEST: 'merchant.io.metamask-test' + WYRE_MERCHANT_ID_TEST: 'merchant.io.metamask-test', + POLLING_FREQUENCY: 10000 } }; From 691512bc6356c7464d1c615d75c6ddd1e9b5d388 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 10 Jul 2020 12:41:23 -0400 Subject: [PATCH 060/106] Fix duplicated proptypes for transak webview --- app/components/UI/FiatOrders/TransakWebView/index.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/components/UI/FiatOrders/TransakWebView/index.js b/app/components/UI/FiatOrders/TransakWebView/index.js index 3a6f9038abb..43aaaed4ebb 100644 --- a/app/components/UI/FiatOrders/TransakWebView/index.js +++ b/app/components/UI/FiatOrders/TransakWebView/index.js @@ -15,7 +15,9 @@ class TransakWebView extends PureComponent { static navigationOptions = ({ navigation }) => getTransakWebviewNavbar(navigation); static propTypes = { - navigation: PropTypes.object + navigation: PropTypes.object, + network: PropTypes.string, + addOrder: PropTypes.func }; handleNavigationStateChange = async navState => { @@ -41,11 +43,6 @@ class TransakWebView extends PureComponent { } } -TransakWebView.propTypes = { - network: PropTypes.string, - addOrder: PropTypes.func -}; - const mapStateToProps = state => ({ network: state.engine.backgroundState.NetworkController.network }); From c0821d361e93cb64ceab3151803a5d5a36424246 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 10 Jul 2020 19:00:54 -0400 Subject: [PATCH 061/106] Remove .env from .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index fcb6dcf11e7..e07070a027f 100644 --- a/.gitignore +++ b/.gitignore @@ -60,7 +60,6 @@ coverage /app/core/InpageBridgeWeb3.js # environment variables -.env .js.env .ios.env .android.env From 690f4a1d25a026343416d73cbb26f0371bbfc4cb Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 10 Jul 2020 19:06:04 -0400 Subject: [PATCH 062/106] Add marginVertical and documentation to props in Base text component --- app/components/Base/Text.js | 38 +++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/app/components/Base/Text.js b/app/components/Base/Text.js index 2cdeddd8c91..7bac5b2595b 100644 --- a/app/components/Base/Text.js +++ b/app/components/Base/Text.js @@ -7,8 +7,7 @@ const style = StyleSheet.create({ text: { ...fontStyles.normal, color: colors.grey600, - marginBottom: 2, - marginTop: 2, + marginVertical: 2, fontSize: 14 }, centered: { @@ -88,16 +87,51 @@ Text.defaultProps = { }; Text.propTypes = { + /** + * Removes teh default style + */ reset: PropTypes.bool, + /** + * Align text to center + */ centered: PropTypes.bool, + /** + * Align text to right + */ right: PropTypes.bool, + /** + * Makes text bold + */ bold: PropTypes.bool, + /** + * Makes text green + */ green: PropTypes.bool, + /** + * Makes text italic and tight + * used in disclaimers + */ disclaimer: PropTypes.bool, + /** + * Makes text black and bigger + * Used in modals + */ modal: PropTypes.bool, + /** + * Makes text small + */ small: PropTypes.bool, + /** + * Applies a link style + */ link: PropTypes.bool, + /** + * Applies a strikethrough decoration + */ strikethrough: PropTypes.bool, + /** + * Any other external style defined in props will be applied + */ style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]) }; From c1e3eaddeeef819db883c9d22f09dab39ed3f09c Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 10 Jul 2020 19:07:33 -0400 Subject: [PATCH 063/106] Add marginVertical and documentation to props in base Title component --- app/components/Base/Title.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/components/Base/Title.js b/app/components/Base/Title.js index 86b20e5eb8d..8a015378fbf 100644 --- a/app/components/Base/Title.js +++ b/app/components/Base/Title.js @@ -7,8 +7,7 @@ import Text from './Text.js'; const style = StyleSheet.create({ text: { fontSize: 18, - marginTop: 3, - marginBottom: 3, + marginVertical: 3, color: colors.fontPrimary, ...fontStyles.bold }, @@ -31,8 +30,17 @@ Title.defaultProps = { }; Title.propTypes = { + /** + * Aligns title to center + */ centered: PropTypes.bool, + /** + * Makes title bigger + */ hero: PropTypes.bool, + /** + * Any other external style defined in props will be applied + */ style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]) }; From 89a01919bf5190492df4a830195d53ec9b0f7f7b Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 10 Jul 2020 19:10:36 -0400 Subject: [PATCH 064/106] Use same disabled style for text and logo in apple pay button --- .../UI/FiatOrders/PaymentMethodApplePay/index.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index 0d36258f3e0..12d1492b559 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -113,21 +113,18 @@ const styles = StyleSheet.create({ applePayButtonText: { color: colors.white }, - applePayButtonTextDisabled: { + applePayButtonContentDisabled: { opacity: 0.6 }, applePayLogo: { marginLeft: 4 - }, - applePayLogoDisabled: { - opacity: 0.6 } }); /* eslint-disable import/no-commonjs */ const ApplePayLogo = require('../../../../images/ApplePayLogo.png'); const ApplePay = ({ disabled }) => ( - + ); ApplePay.propTypes = { @@ -409,7 +406,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network {strings('fiat_on_ramp.buy_with')} From 43b8f2662163fe265842e806a1c2a502485cbf0b Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 10 Jul 2020 19:16:29 -0400 Subject: [PATCH 065/106] Remove code used for debugging --- app/components/UI/FiatOrders/index.js | 67 ++------------------------- app/reducers/fiatOrders/index.js | 13 ------ 2 files changed, 5 insertions(+), 75 deletions(-) diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 09ed0ee9e5f..424c7967a7f 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -1,6 +1,5 @@ -import React, { useCallback } from 'react'; import PropTypes from 'prop-types'; -import { View, StyleSheet, InteractionManager } from 'react-native'; +import { InteractionManager } from 'react-native'; import { connect } from 'react-redux'; import Device from '../../../util/Device'; import AppConstants from '../../../core/AppConstants'; @@ -8,20 +7,16 @@ import NotificationManager from '../../../core/NotificationManager'; import { strings } from '../../../../locales/i18n'; import { renderNumber } from '../../../util/number'; -import { createPendingOrder, FIAT_ORDER_STATES, FIAT_ORDER_PROVIDERS } from '../../../reducers/fiatOrders'; +import { FIAT_ORDER_STATES } from '../../../reducers/fiatOrders'; import useInterval from './hooks/useInterval'; import processOrder from './orderProcessor'; -import Text from '../../Base/Text'; -import { colors } from '../../../styles/common'; - /** * @typedef {import('../../../reducers/fiatOrders').FiatOrder} FiatOrder */ const POLLING_FREQUENCY = AppConstants.FIAT_ORDERS.POLLING_FREQUENCY; const NOTIFICATION_DURATION = 5000; -const SHOW_DEBUG = false; export const allowedToBuy = network => network === '1' || (network === '42' && Device.isIos()); @@ -77,15 +72,7 @@ export const getNotificationDetails = fiatOrder => { } }; -const styles = StyleSheet.create({ - bottomView: { - padding: 10, - paddingBottom: 20, - backgroundColor: colors.grey000 - } -}); - -function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOrders, dispatch }) { +function FiatOrders({ orders, selectedAddress, network, dispatch }) { // Pending orders depend on selectedAddress and selectedNetworks const pendingOrders = orders.filter( @@ -110,35 +97,13 @@ function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOr pendingOrders.length ? POLLING_FREQUENCY : null ); - const onPressAdd = useCallback(() => createFakeOrder(selectedAddress, network), [ - createFakeOrder, - selectedAddress, - network - ]); - - if (!SHOW_DEBUG) { - return null; - } - - return ( - - - Pending: {pendingOrders.length} Total: {orders.length} - - - Add Clear{' '} - Network: {network} - - - ); + return null; } FiatOrders.propTypes = { orders: PropTypes.array, selectedAddress: PropTypes.string, network: PropTypes.string, - createFakeOrder: PropTypes.func, - clearOrders: PropTypes.func, dispatch: PropTypes.func }; @@ -148,26 +113,4 @@ const mapStateToProps = state => ({ network: state.engine.backgroundState.NetworkController.network }); -const mapDispatchToProps = (dispatch, ownProps) => ({ - createFakeOrder: (address, network) => - dispatch({ - type: 'FIAT_ADD_ORDER', - payload: createPendingOrder( - Math.random(), - FIAT_ORDER_PROVIDERS.TRANSAK, - 0.3, - 1, - 'USD', - address, - network, - {} - ) - }), - clearOrders: () => dispatch({ type: 'FIAT_RESET' }), - dispatch -}); - -export default connect( - mapStateToProps, - mapDispatchToProps -)(FiatOrders); +export default connect(mapStateToProps)(FiatOrders); diff --git a/app/reducers/fiatOrders/index.js b/app/reducers/fiatOrders/index.js index 95585e3a91f..21cbf726b5f 100644 --- a/app/reducers/fiatOrders/index.js +++ b/app/reducers/fiatOrders/index.js @@ -37,19 +37,6 @@ export const FIAT_ORDER_STATES = { CANCELLED: 'CANCELLED' }; -export const createPendingOrder = (id, provider, amount, fee, currency, account, network, data) => ({ - id, - provider, - amount, - fee, - currency, - account, - network, - data, - txHash: null, - state: FIAT_ORDER_STATES.PENDING -}); - const initialState = { orders: [] }; From 4cc2a5e7655375231e3c3883c81486436a15431c Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 10 Jul 2020 19:21:39 -0400 Subject: [PATCH 066/106] Add apple pay UI i18n --- app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js | 4 ++-- locales/en.json | 1 + locales/es.json | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index 3fdf9e09683..3e4eefe243d 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -286,11 +286,11 @@ const getPaymentDetails = (cryptoCurrency, amount, fee, total) => ({ displayItems: [ { amount: { currency: USD_CURRENCY_CODE, value: `${amount}` }, - label: `${cryptoCurrency} Purchase` + label: strings('fiat_on_ramp.wyre_purchase', { currency: cryptoCurrency }) }, { amount: { currency: USD_CURRENCY_CODE, value: `${fee}` }, - label: 'Fee' + label: strings('fiat_on_ramp.Fee') } ], total: { diff --git a/locales/en.json b/locales/en.json index 134ec468f7e..be7821581c9 100644 --- a/locales/en.json +++ b/locales/en.json @@ -1192,6 +1192,7 @@ "wyre_modal_terms_of_service_apply": "Wyre terms of service apply.", "wyre_minimum_deposit": "Minimum deposit is {{amount}}", "wyre_maximum_deposit": "Maximum deposit is {{amount}}", + "wyre_purchase": "{{currency}} Purchase", "buy_with": "Buy with", "plus_fee": "Plus a {{fee}} fee", "notifications": { diff --git a/locales/es.json b/locales/es.json index e803b6c7439..6bf2ebfc291 100644 --- a/locales/es.json +++ b/locales/es.json @@ -1112,6 +1112,7 @@ "wyre_modal_terms_of_service_apply": "Rige Acuerdo de Usuario de Wyre.", "wyre_minimum_deposit": "El monto mínimo es {{amount}}", "wyre_maximum_deposit": "El monto máximo es {{amount}}", + "wyre_purchase": "Comprar {{currency}}", "buy_with": "Comprar con", "plus_fee": "Más {{fee}} de comisión", "notifications": { From 5160c79fc06b53cc725349bd9e6fae9db03447b6 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 10 Jul 2020 19:27:20 -0400 Subject: [PATCH 067/106] Add propTypes comments to Apple Pay Payment Method screen --- .../UI/FiatOrders/PaymentMethodApplePay/index.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index 12d1492b559..46c58113895 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -447,10 +447,25 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network } PaymentMethodApplePay.propTypes = { + /** + * Current time to lock screen set in settings + */ lockTime: PropTypes.number.isRequired, + /** + * Function to change lock screen time setting + */ setLockTime: PropTypes.func.isRequired, + /** + * Currently selected wallet address + */ selectedAddress: PropTypes.string.isRequired, + /** + * Currently selected network + */ network: PropTypes.string.isRequired, + /** + * Function to dispatch adding a new fiat order to the state + */ addOrder: PropTypes.func.isRequired }; From c8ff36b7277b87c9a0ad5c562dcd510855a85cf5 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 10 Jul 2020 19:27:53 -0400 Subject: [PATCH 068/106] Remove comments from network alert --- app/components/UI/ReceiveRequest/index.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/app/components/UI/ReceiveRequest/index.js b/app/components/UI/ReceiveRequest/index.js index c4e51946135..d61467ec63f 100644 --- a/app/components/UI/ReceiveRequest/index.js +++ b/app/components/UI/ReceiveRequest/index.js @@ -144,16 +144,7 @@ class ReceiveRequest extends PureComponent { onBuy = async () => { const { navigation, toggleReceiveModal, network } = this.props; if (!allowedToBuy(network)) { - Alert.alert( - strings('fiat_on_ramp.network_not_supported'), - strings('fiat_on_ramp.switch_network') - // [ - // { text: strings('navigation.cancel'), onPress: () => {} }, - // { text: strings('fiat_on_ramp.switch'), onPress: () => { - // // TODO: switch to mainnet - // } } - // ] - ); + Alert.alert(strings('fiat_on_ramp.network_not_supported'), strings('fiat_on_ramp.switch_network')); } else { toggleReceiveModal(); navigation.navigate('PaymentMethodSelector'); From ff770cf5cfa72b3b1d9d14d6444949333739b42b Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Tue, 14 Jul 2020 11:31:22 -0400 Subject: [PATCH 069/106] Remove Roboto font usage --- .../UI/FiatOrders/PaymentMethodApplePay/index.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index 46c58113895..d4cfd8fbc92 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -41,11 +41,10 @@ const styles = StyleSheet.create({ justifyContent: 'center' }, amount: { - fontFamily: 'Roboto-Light', - fontWeight: fontStyles.light.fontWeight, + ...fontStyles.light, color: colors.black, - fontSize: 44, - height: 52 + fontSize: 48, + height: 60 }, amountError: { color: colors.red @@ -91,7 +90,6 @@ const styles = StyleSheet.create({ alignItems: 'center' }, keypadButtonText: { - fontFamily: 'Roboto', color: colors.black, textAlign: 'center', fontSize: 30 From 62514f49cb77cf46abb8e76e0af776678df47a31 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 16 Jul 2020 08:12:01 -0400 Subject: [PATCH 070/106] Add createdAt property to FiatOrder --- app/components/UI/FiatOrders/orderProcessor/transak.js | 4 +++- app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js | 1 + app/reducers/fiatOrders/index.js | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index bb1d469fd3d..3dced959b68 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -143,6 +143,7 @@ const transakOrderStateToFiatOrderState = transakOrderState => { const transakOrderToFiatOrder = transakOrder => ({ id: transakOrder.id, provider: FIAT_ORDER_PROVIDERS.TRANSAK, + createdAt: new Date(transakOrder.createdAt).getTime(), amount: transakOrder.fiatAmount, fee: transakOrder.totalFeeInFiat, cryptoAmount: transakOrder.cryptoAmount, @@ -156,13 +157,14 @@ const transakOrderToFiatOrder = transakOrder => ({ }); /** - * Transforms Transak rorder object into a Fiat order object used in the state. + * Transforms Transak order object into a Fiat order object used in the state. * @param {TransakRedirectOrder} transakRedirectOrder Transak order object * @returns {FiatOrder} Fiat order object to store in the state */ const transakCallbackOrderToFiatOrder = transakRedirectOrder => ({ id: transakRedirectOrder.orderId, provider: FIAT_ORDER_PROVIDERS.TRANSAK, + createdAt: Date.now(), amount: transakRedirectOrder.fiatAmount, fee: transakRedirectOrder.totalFee, currency: transakRedirectOrder.fiatCurrency, diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index 3e4eefe243d..fc47aee5359 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -186,6 +186,7 @@ const wyreOrderStateToFiatState = wyreOrderState => { const wyreOrderToFiatOrder = wyreOrder => ({ id: wyreOrder.id, provider: FIAT_ORDER_PROVIDERS.WYRE_APPLE_PAY, + createdAt: wyreOrder.createdAt, amount: wyreOrder.sourceAmount, fee: null, cryptoAmount: null, diff --git a/app/reducers/fiatOrders/index.js b/app/reducers/fiatOrders/index.js index 21cbf726b5f..0916dc3eb48 100644 --- a/app/reducers/fiatOrders/index.js +++ b/app/reducers/fiatOrders/index.js @@ -3,6 +3,7 @@ * @type {object} * @property {string} id - Original id given by Provider. Orders are identified by (provider, id) * @property {FIAT_ORDER_PROVIDERS} provider Fiat Provider + * @property {number} createdAt Fiat amount * @property {string} amount Fiat amount * @property {string?} fee Fiat fee * @property {string?} cryptoAmount Crypto currency amount From 4bbd5fd4229ba7f5868ed37f505cc5aaab6a0977 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 17 Jul 2020 13:25:16 -0400 Subject: [PATCH 071/106] Add cryptoAmount to transakOrderRedirect handler --- app/components/UI/FiatOrders/orderProcessor/transak.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index 3dced959b68..4be915592fe 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -168,6 +168,7 @@ const transakCallbackOrderToFiatOrder = transakRedirectOrder => ({ amount: transakRedirectOrder.fiatAmount, fee: transakRedirectOrder.totalFee, currency: transakRedirectOrder.fiatCurrency, + cryptoAmount: transakRedirectOrder.cryptoAmount, cryptocurrency: transakRedirectOrder.cryptocurrency, state: transakOrderStateToFiatOrderState(transakRedirectOrder.status), account: transakRedirectOrder.walletAddress, From 543776fc4cb7256293e58ea684244f597cd05e16 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 17 Jul 2020 20:16:37 -0400 Subject: [PATCH 072/106] Add Fiat Orders List View --- app/actions/modals/index.js | 7 + app/components/Base/DetailsModal.js | 127 + app/components/Base/ListItem.js | 112 + app/components/Base/StatusText.js | 64 + app/components/Base/Summary.js | 77 + app/components/Base/TabBar.js | 35 + app/components/Base/Text.js | 20 + .../Nav/App/__snapshots__/index.test.js.snap | 6 - .../Nav/Main/__snapshots__/index.test.js.snap | 2 - app/components/Nav/Main/index.js | 42 +- .../components/PaymentMethod/Modal.js | 1 - app/components/UI/FiatOrders/index.js | 24 +- .../UI/FiatOrders/orderProcessor/transak.js | 4 +- .../__snapshots__/index.test.js.snap | 3 +- .../TransactionDetails/index.js | 164 +- app/components/UI/TransactionElement/index.js | 345 +- app/components/UI/TransactionElement/utils.js | 210 +- .../TransactionReviewFeeCard/index.js | 112 +- app/components/UI/Transactions/index.js | 5 +- app/components/Views/ActivityView/index.js | 64 + .../Views/ApproveView/Approve/index.js | 183 +- app/components/Views/Asset/index.js | 64 +- .../Views/FiatOrdersView/OrderDetails.js | 107 + .../Views/FiatOrdersView/OrderListItem.js | 60 + app/components/Views/FiatOrdersView/index.js | 85 + .../__snapshots__/index.test.js.snap | 12 +- .../Views/Settings/SecuritySettings/index.js | 8 +- .../Views/TransactionSummary/index.js | 139 +- .../Views/TransactionsView/index.js | 29 +- app/core/Analytics.js | 7 +- app/core/Engine.js | 5 +- .../transaction-icons/approve-failed.png | Bin 0 -> 4525 bytes app/images/transaction-icons/approve.png | Bin 0 -> 4553 bytes .../transaction-icons/interaction-failed.png | Bin 0 -> 4036 bytes app/images/transaction-icons/interaction.png | Bin 0 -> 4064 bytes .../transaction-icons/receive-failed.png | Bin 0 -> 3915 bytes .../transaction-icons/receive-inverted.png | Bin 0 -> 5172 bytes app/images/transaction-icons/receive.png | Bin 0 -> 5134 bytes app/images/transaction-icons/send-failed.png | Bin 0 -> 3861 bytes app/images/transaction-icons/send.png | Bin 0 -> 3932 bytes app/reducers/fiatOrders/index.js | 46 +- app/reducers/modals/index.js | 8 +- app/util/number.js | 24 +- app/util/transactions.js | 24 + locales/en.json | 40 +- locales/es.json | 37 +- package.json | 6 +- yarn.lock | 4367 ++++++++--------- 48 files changed, 3542 insertions(+), 3133 deletions(-) create mode 100644 app/components/Base/DetailsModal.js create mode 100644 app/components/Base/ListItem.js create mode 100644 app/components/Base/StatusText.js create mode 100644 app/components/Base/Summary.js create mode 100644 app/components/Base/TabBar.js create mode 100644 app/components/Views/ActivityView/index.js create mode 100644 app/components/Views/FiatOrdersView/OrderDetails.js create mode 100644 app/components/Views/FiatOrdersView/OrderListItem.js create mode 100644 app/components/Views/FiatOrdersView/index.js create mode 100644 app/images/transaction-icons/approve-failed.png create mode 100644 app/images/transaction-icons/approve.png create mode 100644 app/images/transaction-icons/interaction-failed.png create mode 100644 app/images/transaction-icons/interaction.png create mode 100644 app/images/transaction-icons/receive-failed.png create mode 100644 app/images/transaction-icons/receive-inverted.png create mode 100644 app/images/transaction-icons/receive.png create mode 100644 app/images/transaction-icons/send-failed.png create mode 100644 app/images/transaction-icons/send.png diff --git a/app/actions/modals/index.js b/app/actions/modals/index.js index df7fe11e981..54666a5789e 100644 --- a/app/actions/modals/index.js +++ b/app/actions/modals/index.js @@ -30,3 +30,10 @@ export function toggleDappTransactionModal(show) { show }; } + +export function toggleApproveModal(show) { + return { + type: 'TOGGLE_APPROVE_MODAL', + show + }; +} diff --git a/app/components/Base/DetailsModal.js b/app/components/Base/DetailsModal.js new file mode 100644 index 00000000000..df042dff0bf --- /dev/null +++ b/app/components/Base/DetailsModal.js @@ -0,0 +1,127 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { View, StyleSheet, TouchableOpacity } from 'react-native'; +import Ionicons from 'react-native-vector-icons/Ionicons'; +import { colors, fontStyles } from '../../styles/common'; + +import Text from './Text'; + +const styles = StyleSheet.create({ + modalContainer: { + width: '100%', + backgroundColor: colors.white, + borderRadius: 10 + }, + modalView: { + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center' + }, + header: { + borderBottomWidth: StyleSheet.hairlineWidth, + borderColor: colors.grey100, + flexDirection: 'row' + }, + title: { + flex: 1, + textAlign: 'center', + fontSize: 18, + marginVertical: 12, + marginHorizontal: 24, + color: colors.fontPrimary, + ...fontStyles.bold + }, + closeIcon: { paddingTop: 4, position: 'absolute', right: 16 }, + body: { + paddingHorizontal: 15 + }, + section: { + paddingVertical: 16, + flexDirection: 'row' + }, + sectionBorderBottom: { + borderBottomColor: colors.grey100, + borderBottomWidth: 1 + }, + column: { + flex: 1 + }, + columnEnd: { + alignItems: 'flex-end' + }, + sectionTitle: { + ...fontStyles.normal, + fontSize: 10, + color: colors.grey500, + marginBottom: 8 + } +}); +const DetailsModal = ({ children }) => ( + + {children} + +); + +const DetailsModalHeader = ({ style, ...props }) => ; +const DetailsModalTitle = ({ style, ...props }) => ; +const DetailsModalCloseIcon = ({ style, ...props }) => ( + + + +); +const DetailsModalBody = ({ style, ...props }) => ; +const DetailsModalSection = ({ style, borderBottom, ...props }) => ( + +); +const DetailsModalSectionTitle = ({ style, ...props }) => ; +const DetailsModalColumn = ({ style, end, ...props }) => ( + +); + +DetailsModal.Header = DetailsModalHeader; +DetailsModal.Title = DetailsModalTitle; +DetailsModal.CloseIcon = DetailsModalCloseIcon; +DetailsModal.Body = DetailsModalBody; +DetailsModal.Section = DetailsModalSection; +DetailsModal.SectionTitle = DetailsModalSectionTitle; +DetailsModal.Column = DetailsModalColumn; + +/** + * Any other external style defined in props will be applied + */ +const stylePropType = PropTypes.oneOfType([PropTypes.object, PropTypes.array]); + +DetailsModal.propTypes = { + children: PropTypes.node +}; + +DetailsModalHeader.propTypes = { + style: stylePropType +}; +DetailsModalTitle.propTypes = { + style: stylePropType +}; +DetailsModalCloseIcon.propTypes = { + style: stylePropType +}; +DetailsModalBody.propTypes = { + style: stylePropType +}; +DetailsModalSection.propTypes = { + style: stylePropType, + /** + * Adds a border to the bottom of the section + */ + borderBottom: PropTypes.bool +}; +DetailsModalSectionTitle.propTypes = { + style: stylePropType +}; +DetailsModalColumn.propTypes = { + style: stylePropType, + /** + * Aligns column content to flex-end + */ + end: PropTypes.bool +}; +export default DetailsModal; diff --git a/app/components/Base/ListItem.js b/app/components/Base/ListItem.js new file mode 100644 index 00000000000..a2294a45722 --- /dev/null +++ b/app/components/Base/ListItem.js @@ -0,0 +1,112 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { StyleSheet, View } from 'react-native'; +import Device from '../../util/Device'; +import { colors, fontStyles } from '../../styles/common'; +import Text from './Text'; + +const styles = StyleSheet.create({ + wrapper: { + padding: 15, + minHeight: Device.isIos() ? 95 : 100 + }, + date: { + color: colors.fontSecondary, + fontSize: 12, + marginBottom: 10, + ...fontStyles.normal + }, + content: { + flexDirection: 'row' + }, + actions: { + flexDirection: 'row', + paddingTop: 10, + paddingLeft: 40 + }, + icon: { + flexDirection: 'row', + alignItems: 'center' + }, + body: { + flex: 1, + marginLeft: 15 + }, + amounts: { + flex: 0.6, + alignItems: 'flex-end' + }, + title: { + fontSize: 15, + color: colors.fontPrimary + }, + amount: { + fontSize: 15, + color: colors.fontPrimary + }, + fiatAmount: { + fontSize: 12, + color: colors.fontSecondary, + textTransform: 'uppercase' + } +}); + +const ListItem = ({ style, ...props }) => ; + +const ListItemDate = ({ style, ...props }) => ; +const ListItemContent = ({ style, ...props }) => ; +const ListItemActions = ({ style, ...props }) => ; +const ListItemIcon = ({ style, ...props }) => ; +const ListItemBody = ({ style, ...props }) => ; +const ListItemTitle = ({ style, ...props }) => ; +const ListItemAmounts = ({ style, ...props }) => ; +const ListItemAmount = ({ style, ...props }) => ; +const ListItemFiatAmount = ({ style, ...props }) => ; + +ListItem.Date = ListItemDate; +ListItem.Content = ListItemContent; +ListItem.Actions = ListItemActions; +ListItem.Icon = ListItemIcon; +ListItem.Body = ListItemBody; +ListItem.Title = ListItemTitle; +ListItem.Amounts = ListItemAmounts; +ListItem.Amount = ListItemAmount; +ListItem.FiatAmount = ListItemFiatAmount; + +export default ListItem; + +/** + * Any other external style defined in props will be applied + */ +const stylePropType = PropTypes.oneOfType([PropTypes.object, PropTypes.array]); + +ListItem.propTypes = { + style: stylePropType +}; +ListItemDate.propTypes = { + style: stylePropType +}; +ListItemContent.propTypes = { + style: stylePropType +}; +ListItemActions.propTypes = { + style: stylePropType +}; +ListItemIcon.propTypes = { + style: stylePropType +}; +ListItemBody.propTypes = { + style: stylePropType +}; +ListItemTitle.propTypes = { + style: stylePropType +}; +ListItemAmounts.propTypes = { + style: stylePropType +}; +ListItemAmount.propTypes = { + style: stylePropType +}; +ListItemFiatAmount.propTypes = { + style: stylePropType +}; diff --git a/app/components/Base/StatusText.js b/app/components/Base/StatusText.js new file mode 100644 index 00000000000..53d2850fac8 --- /dev/null +++ b/app/components/Base/StatusText.js @@ -0,0 +1,64 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Text from './Text'; +import { colors } from '../../styles/common'; +import { StyleSheet } from 'react-native'; +import { FIAT_ORDER_STATES } from '../../reducers/fiatOrders'; +import { strings } from '../../../locales/i18n'; + +const styles = StyleSheet.create({ + status: { + marginTop: 4, + fontSize: 12, + letterSpacing: 0.5 + } +}); + +export const ConfirmedText = props => ; +export const PendingText = props => ; +export const FailedText = props => ; + +function StatusText({ status, context, ...props }) { + switch (status) { + case 'Confirmed': + case 'confirmed': + return {strings(`${context}.${status}`)}; + case 'Pending': + case 'pending': + case 'Submitted': + case 'submitted': + return {strings(`${context}.${status}`)}; + case 'Failed': + case 'Cancelled': + case 'failed': + case 'cancelled': + return {strings(`${context}.${status}`)}; + + case FIAT_ORDER_STATES.COMPLETED: + return {strings(`${context}.completed`)}; + case FIAT_ORDER_STATES.PENDING: + return {strings(`${context}.pending`)}; + case FIAT_ORDER_STATES.FAILED: + return {strings(`${context}.failed`)}; + case FIAT_ORDER_STATES.CANCELLED: + return {strings(`${context}.cancelled`)}; + + default: + return ( + + {status} + + ); + } +} + +StatusText.defaultProps = { + context: 'transaction' +}; + +StatusText.propTypes = { + status: PropTypes.string.isRequired, + context: PropTypes.string +}; + +export default StatusText; diff --git a/app/components/Base/Summary.js b/app/components/Base/Summary.js new file mode 100644 index 00000000000..9112ac081c7 --- /dev/null +++ b/app/components/Base/Summary.js @@ -0,0 +1,77 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { View, StyleSheet } from 'react-native'; +import { colors } from '../../styles/common'; + +const styles = StyleSheet.create({ + wrapper: { + borderWidth: 1, + borderColor: colors.grey050, + borderRadius: 8, + padding: 16 + }, + row: { + flexDirection: 'row', + justifyContent: 'space-between', + marginVertical: 6 + }, + rowEnd: { + justifyContent: 'flex-end' + }, + rowLast: { + marginBottom: 0, + marginTop: 6 + }, + col: { + flexDirection: 'row', + flex: 1, + flexWrap: 'wrap' + }, + separator: { + borderBottomWidth: 1, + borderBottomColor: colors.grey050, + marginVertical: 6 + } +}); + +const Summary = ({ style, ...props }) => ; +const SummaryRow = ({ style, end, last, ...props }) => ( + +); +const SummaryCol = ({ style, end, ...props }) => ; +const SummarySeparator = ({ style, ...props }) => ; + +Summary.Row = SummaryRow; +Summary.Col = SummaryCol; +Summary.Separator = SummarySeparator; +export default Summary; + +/** + * Any other external style defined in props will be applied + */ +const stylePropType = PropTypes.oneOfType([PropTypes.object, PropTypes.array]); + +Summary.propTypes = { + style: stylePropType +}; +SummaryRow.propTypes = { + style: stylePropType, + /** + * Aligns content to the end of the row + */ + end: PropTypes.bool, + /** + * Add style to the last row of the summary + */ + last: PropTypes.bool +}; +SummaryCol.propTypes = { + style: stylePropType, + /** + * Aligns content to the end of the row + */ + end: PropTypes.bool +}; +SummarySeparator.propTypes = { + style: stylePropType +}; diff --git a/app/components/Base/TabBar.js b/app/components/Base/TabBar.js new file mode 100644 index 00000000000..ef2884a379d --- /dev/null +++ b/app/components/Base/TabBar.js @@ -0,0 +1,35 @@ +import React from 'react'; +import { StyleSheet } from 'react-native'; +import DefaultTabBar from 'react-native-scrollable-tab-view/DefaultTabBar'; + +import { colors, fontStyles } from '../../styles/common'; + +const styles = StyleSheet.create({ + tabUnderlineStyle: { + height: 2, + backgroundColor: colors.blue + }, + tabStyle: { + paddingVertical: 8 + }, + textStyle: { + ...fontStyles.normal, + fontSize: 14 + } +}); + +function TabBar({ ...props }) { + return ( + + ); +} + +export default TabBar; diff --git a/app/components/Base/Text.js b/app/components/Base/Text.js index 7bac5b2595b..43f26fdd610 100644 --- a/app/components/Base/Text.js +++ b/app/components/Base/Text.js @@ -20,9 +20,15 @@ const style = StyleSheet.create({ green: { color: colors.green400 }, + primary: { + color: colors.fontPrimary + }, small: { fontSize: 12 }, + upper: { + textTransform: 'uppercase' + }, disclaimer: { fontStyle: 'italic', letterSpacing: 0.15 @@ -46,7 +52,9 @@ const Text = ({ right, bold, green, + primary, small, + upper, modal, disclaimer, link, @@ -61,8 +69,10 @@ const Text = ({ right && style.right, bold && style.bold, green && style.green, + primary && style.primary, disclaimer && [style.small, style.disclaimer], small && style.small, + upper && style.upper, modal && style.modal, link && style.link, strikethrough && style.strikethrough, @@ -78,9 +88,11 @@ Text.defaultProps = { right: false, bold: false, green: false, + primary: false, disclaimer: false, modal: false, small: false, + upper: false, link: false, strikethrough: false, style: undefined @@ -107,6 +119,10 @@ Text.propTypes = { * Makes text green */ green: PropTypes.bool, + /** + * Makes text fontPrimary color + */ + primary: PropTypes.bool, /** * Makes text italic and tight * used in disclaimers @@ -121,6 +137,10 @@ Text.propTypes = { * Makes text small */ small: PropTypes.bool, + /** + * Makes text uppercase + */ + upper: PropTypes.bool, /** * Applies a link style */ diff --git a/app/components/Nav/App/__snapshots__/index.test.js.snap b/app/components/Nav/App/__snapshots__/index.test.js.snap index e66725f0267..3e4c3873d67 100644 --- a/app/components/Nav/App/__snapshots__/index.test.js.snap +++ b/app/components/Nav/App/__snapshots__/index.test.js.snap @@ -326,7 +326,6 @@ exports[`App should render correctly 1`] = ` "setParams": [Function], "state": Object { "index": 0, - "isTransitioning": false, "routes": Array [ Object { "key": "Entry", @@ -339,7 +338,6 @@ exports[`App should render correctly 1`] = ` "index": 0, "isDrawerIdle": true, "isDrawerOpen": false, - "isTransitioning": false, "key": "HomeNav", "openId": 0, "params": undefined, @@ -354,7 +352,6 @@ exports[`App should render correctly 1`] = ` "routes": Array [ Object { "index": 0, - "isTransitioning": false, "key": "id-123-4", "routeName": "Home", "routes": Array [ @@ -780,7 +777,6 @@ exports[`App should render correctly 1`] = ` "setParams": [Function], "state": Object { "index": 0, - "isTransitioning": false, "routes": Array [ Object { "key": "Entry", @@ -793,7 +789,6 @@ exports[`App should render correctly 1`] = ` "index": 0, "isDrawerIdle": true, "isDrawerOpen": false, - "isTransitioning": false, "key": "HomeNav", "openId": 0, "params": undefined, @@ -808,7 +803,6 @@ exports[`App should render correctly 1`] = ` "routes": Array [ Object { "index": 0, - "isTransitioning": false, "key": "id-123-4", "routeName": "Home", "routes": Array [ diff --git a/app/components/Nav/Main/__snapshots__/index.test.js.snap b/app/components/Nav/Main/__snapshots__/index.test.js.snap index 84ee2a07433..ba544013e2e 100644 --- a/app/components/Nav/Main/__snapshots__/index.test.js.snap +++ b/app/components/Nav/Main/__snapshots__/index.test.js.snap @@ -275,7 +275,6 @@ exports[`Main should render correctly 1`] = ` "routes": Array [ Object { "index": 0, - "isTransitioning": false, "key": "id-123-4", "routeName": "Home", "routes": Array [ @@ -609,7 +608,6 @@ exports[`Main should render correctly 1`] = ` "routes": Array [ Object { "index": 0, - "isTransitioning": false, "key": "id-123-4", "routeName": "Home", "routes": Array [ diff --git a/app/components/Nav/Main/index.js b/app/components/Nav/Main/index.js index 24294ca0c96..17917c0921a 100644 --- a/app/components/Nav/Main/index.js +++ b/app/components/Nav/Main/index.js @@ -30,7 +30,6 @@ import NetworkSettings from '../../Views/Settings/NetworksSettings/NetworkSettin import AppInformation from '../../Views/Settings/AppInformation'; import Contacts from '../../Views/Settings/Contacts'; import Wallet from '../../Views/Wallet'; -import TransactionsView from '../../Views/TransactionsView'; import SyncWithExtension from '../../Views/SyncWithExtension'; import Asset from '../../Views/Asset'; import AddAsset from '../../Views/AddAsset'; @@ -106,8 +105,9 @@ import { hideTransactionNotification, showSimpleNotification } from '../../../actions/notification'; -import { toggleDappTransactionModal } from '../../../actions/modals'; +import { toggleDappTransactionModal, toggleApproveModal } from '../../../actions/modals'; import AccountApproval from '../../UI/AccountApproval'; +import ActivityView from '../../Views/ActivityView'; const styles = StyleSheet.create({ flex: { @@ -164,7 +164,7 @@ const MainNavigator = createStackNavigator( }), TransactionsHome: createStackNavigator({ TransactionsView: { - screen: TransactionsView + screen: ActivityView } }), PaymentChannelHome: createStackNavigator({ @@ -459,9 +459,17 @@ class Main extends PureComponent { */ toggleDappTransactionModal: PropTypes.func, /** + /* Hides or shows approve modal + */ + toggleApproveModal: PropTypes.func, + /** /* dApp transaction modal visible or not */ - dappTransactionModalVisible: PropTypes.bool + dappTransactionModalVisible: PropTypes.bool, + /** + /* Token approve modal visible or not + */ + approveModalVisible: PropTypes.bool }; state = { connected: true, @@ -493,7 +501,6 @@ class Main extends PureComponent { } }; componentDidMount = async () => { - this.props.toggleDappTransactionModal(false); InteractionManager.runAfterInteractions(() => { this.initializeWalletConnect(); AppState.addEventListener('change', this.handleAppStateChange); @@ -836,7 +843,7 @@ class Main extends PureComponent { } if (data && data.substr(0, 10) === APPROVE_FUNCTION_SIGNATURE) { - this.props.navigation.push('ApproveView'); + this.props.toggleApproveModal(); } else { this.props.toggleDappTransactionModal(); } @@ -1072,12 +1079,14 @@ class Main extends PureComponent { backupAlertPress = () => { this.props.navigation.navigate('AccountBackupStep1'); }; - renderDappTransactionModal = () => ( - - ); + + renderDappTransactionModal = () => + this.props.dappTransactionModalVisible && ( + + ); + + renderApproveModal = () => + this.props.approveModalVisible && ; render() { const { isPaymentChannelTransaction, isPaymentRequest } = this.props; @@ -1101,7 +1110,8 @@ class Main extends PureComponent { {this.renderSigningModal()} {this.renderWalletConnectSessionRequestModal()} - {this.props.dappTransactionModalVisible && this.renderDappTransactionModal()} + {this.renderDappTransactionModal()} + {this.renderApproveModal()} ); } @@ -1118,7 +1128,8 @@ const mapStateToProps = state => ({ isPaymentChannelTransaction: state.transaction.paymentChannelTransaction, isPaymentRequest: state.transaction.paymentRequest, identities: state.engine.backgroundState.PreferencesController.identities, - dappTransactionModalVisible: state.modals.dappTransactionModalVisible + dappTransactionModalVisible: state.modals.dappTransactionModalVisible, + approveModalVisible: state.modals.approveModalVisible }); const mapDispatchToProps = dispatch => ({ @@ -1127,7 +1138,8 @@ const mapDispatchToProps = dispatch => ({ showTransactionNotification: args => dispatch(showTransactionNotification(args)), showSimpleNotification: args => dispatch(showSimpleNotification(args)), hideTransactionNotification: () => dispatch(hideTransactionNotification()), - toggleDappTransactionModal: (show = null) => dispatch(toggleDappTransactionModal(show)) + toggleDappTransactionModal: (show = null) => dispatch(toggleDappTransactionModal(show)), + toggleApproveModal: show => dispatch(toggleApproveModal(show)) }); export default connect( diff --git a/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js b/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js index 375c4114ef6..fee09e451d4 100644 --- a/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js +++ b/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js @@ -74,7 +74,6 @@ const PaymentMethodModal = ({ isVisible, title, dismiss, children }) => ( onSwipeComplete={dismiss} swipeDirection="down" style={styles.modal} - useNativeDriver > diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 424c7967a7f..171f066732b 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -7,7 +7,7 @@ import NotificationManager from '../../../core/NotificationManager'; import { strings } from '../../../../locales/i18n'; import { renderNumber } from '../../../util/number'; -import { FIAT_ORDER_STATES } from '../../../reducers/fiatOrders'; +import { FIAT_ORDER_STATES, getPendingOrders } from '../../../reducers/fiatOrders'; import useInterval from './hooks/useInterval'; import processOrder from './orderProcessor'; @@ -72,14 +72,7 @@ export const getNotificationDetails = fiatOrder => { } }; -function FiatOrders({ orders, selectedAddress, network, dispatch }) { - // Pending orders depend on selectedAddress and selectedNetworks - - const pendingOrders = orders.filter( - order => - order.account === selectedAddress && order.network === network && order.state === FIAT_ORDER_STATES.PENDING - ); - +function FiatOrders({ pendingOrders, dispatch }) { useInterval( async () => { await Promise.all( @@ -107,10 +100,13 @@ FiatOrders.propTypes = { dispatch: PropTypes.func }; -const mapStateToProps = state => ({ - orders: state.fiatOrders.orders, - selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, - network: state.engine.backgroundState.NetworkController.network -}); +const mapStateToProps = state => { + const orders = state.fiatOrders.orders; + const selectedAddress = state.engine.backgroundState.PreferencesController.selectedAddress; + const network = state.engine.backgroundState.NetworkController.network; + return { + pendingOrders: getPendingOrders(orders, selectedAddress, network) + }; +}; export default connect(mapStateToProps)(FiatOrders); diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index 4be915592fe..0f3d54aad7e 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -165,8 +165,8 @@ const transakCallbackOrderToFiatOrder = transakRedirectOrder => ({ id: transakRedirectOrder.orderId, provider: FIAT_ORDER_PROVIDERS.TRANSAK, createdAt: Date.now(), - amount: transakRedirectOrder.fiatAmount, - fee: transakRedirectOrder.totalFee, + amount: Number(transakRedirectOrder.fiatAmount), + fee: Number(transakRedirectOrder.totalFee), currency: transakRedirectOrder.fiatCurrency, cryptoAmount: transakRedirectOrder.cryptoAmount, cryptocurrency: transakRedirectOrder.cryptocurrency, diff --git a/app/components/UI/TransactionElement/TransactionDetails/__snapshots__/index.test.js.snap b/app/components/UI/TransactionElement/TransactionDetails/__snapshots__/index.test.js.snap index 69ce5a159dd..32ba34be697 100644 --- a/app/components/UI/TransactionElement/TransactionDetails/__snapshots__/index.test.js.snap +++ b/app/components/UI/TransactionElement/TransactionDetails/__snapshots__/index.test.js.snap @@ -197,7 +197,8 @@ exports[`TransactionDetails should render correctly 1`] = ` "marginVertical": 8, }, Object { - "marginVertical": 24, + "marginBottom": 24, + "marginTop": 12, }, ] } diff --git a/app/components/UI/TransactionElement/TransactionDetails/index.js b/app/components/UI/TransactionElement/TransactionDetails/index.js index 64f1420fe12..080c039f87e 100644 --- a/app/components/UI/TransactionElement/TransactionDetails/index.js +++ b/app/components/UI/TransactionElement/TransactionDetails/index.js @@ -1,7 +1,7 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; -import { TouchableOpacity, StyleSheet, Text, View } from 'react-native'; -import { colors, fontStyles, baseStyles } from '../../../../styles/common'; +import { TouchableOpacity, StyleSheet, View } from 'react-native'; +import { colors, fontStyles } from '../../../../styles/common'; import { strings } from '../../../../../locales/i18n'; import NetworkList, { getNetworkTypeById, @@ -18,39 +18,11 @@ import { toDateFormat } from '../../../../util/date'; import StyledButton from '../../StyledButton'; import { safeToChecksumAddress } from '../../../../util/address'; import AppConstants from '../../../../core/AppConstants'; +import StatusText from '../../../Base/StatusText'; +import Text from '../../../Base/Text'; +import DetailsModal from '../../../Base/DetailsModal'; const styles = StyleSheet.create({ - detailRowWrapper: { - paddingHorizontal: 15 - }, - detailRowTitle: { - fontSize: 10, - color: colors.grey500, - marginBottom: 8, - ...fontStyles.normal - }, - flexRow: { - flexDirection: 'row' - }, - section: { - paddingVertical: 16 - }, - sectionBorderBottom: { - borderBottomColor: colors.grey100, - borderBottomWidth: 1 - }, - flexEnd: { - flex: 1, - alignItems: 'flex-end' - }, - textUppercase: { - textTransform: 'uppercase' - }, - detailRowText: { - fontSize: 12, - color: colors.fontPrimary, - ...fontStyles.normal - }, viewOnEtherscan: { fontSize: 16, color: colors.blue, @@ -58,15 +30,12 @@ const styles = StyleSheet.create({ textAlign: 'center' }, touchableViewOnEtherscan: { - marginVertical: 24 + marginBottom: 24, + marginTop: 12 }, summaryWrapper: { marginVertical: 8 }, - statusText: { - fontSize: 12, - ...fontStyles.normal - }, actionContainerStyle: { height: 25, width: 70, @@ -146,6 +115,7 @@ class TransactionDetails extends PureComponent { viewOnEtherscan = () => { const { + navigation, transactionObject: { networkID }, transactionDetails: { transactionHash }, network: { @@ -158,7 +128,7 @@ class TransactionDetails extends PureComponent { if (type === 'rpc') { const url = `${rpcBlockExplorer}/tx/${transactionHash}`; const title = new URL(rpcBlockExplorer).hostname; - this.props.navigation.push('Webview', { + navigation.push('Webview', { url, title }); @@ -166,7 +136,7 @@ class TransactionDetails extends PureComponent { const network = getNetworkTypeById(networkID); const url = getEtherscanTransactionUrl(network, transactionHash); const etherscan_url = getEtherscanBaseUrl(network).replace('https://', ''); - this.props.navigation.push('Webview', { + navigation.push('Webview', { url, title: etherscan_url }); @@ -178,20 +148,6 @@ class TransactionDetails extends PureComponent { } }; - renderStatusText = status => { - status = status && status.charAt(0).toUpperCase() + status.slice(1); - switch (status) { - case 'Confirmed': - return {status}; - case 'Pending': - case 'Submitted': - return {status}; - case 'Failed': - case 'Cancelled': - return {status}; - } - }; - renderSpeedUpButton = () => ( { const { + transactionDetails, transactionObject, transactionObject: { status, @@ -229,75 +186,70 @@ class TransactionDetails extends PureComponent { const renderSpeedUpAction = safeToChecksumAddress(to) !== AppConstants.CONNEXT.CONTRACTS[networkId]; const { rpcBlockExplorer } = this.state; return ( - - - - - {strings('transactions.status')} - {this.renderStatusText(status)} - {!!renderTxActions && ( - - {renderSpeedUpAction && this.renderSpeedUpButton()} - {this.renderCancelButton()} - - )} - - - {strings('transactions.date')} - {toDateFormat(time)} - - - - - - - {strings('transactions.from')} - - - - {strings('transactions.to')} - - - - - {!!nonce && ( - - - {strings('transactions.nonce')} + + + + {strings('transactions.status')} + + {!!renderTxActions && ( + + {renderSpeedUpAction && this.renderSpeedUpButton()} + {this.renderCancelButton()} + + )} + + + {strings('transactions.date')} + + {toDateFormat(time)} + + + + + + {strings('transactions.from')} + + - {`#${parseInt(nonce.replace(/^#/, ''), 16)}`} - + + + {strings('transactions.to')} + + + + + + {!!nonce && ( + + + {strings('transactions.nonce')} + {`#${parseInt(nonce.replace(/^#/, ''), 16)}`} + + )} - {this.props.transactionDetails.transactionHash && + {transactionDetails.transactionHash && transactionObject.status !== 'cancelled' && rpcBlockExplorer !== NO_RPC_BLOCK_EXPLORER && ( - + {(rpcBlockExplorer && `${strings('transactions.view_on')} ${getBlockExplorerName(rpcBlockExplorer)}`) || strings('transactions.view_on_etherscan')} )} - + ); }; } diff --git a/app/components/UI/TransactionElement/index.js b/app/components/UI/TransactionElement/index.js index ea40543050b..74f20521f2c 100644 --- a/app/components/UI/TransactionElement/index.js +++ b/app/components/UI/TransactionElement/index.js @@ -1,27 +1,21 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; -import { TouchableHighlight, StyleSheet, Text, View, Image } from 'react-native'; -import { colors, fontStyles } from '../../../styles/common'; +import { TouchableHighlight, StyleSheet, Image } from 'react-native'; +import { colors } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import { toDateFormat } from '../../../util/date'; -import Identicon from '../Identicon'; import TransactionDetails from './TransactionDetails'; import { safeToChecksumAddress } from '../../../util/address'; -import FadeIn from 'react-native-fade-in-image'; -import TokenImage from '../TokenImage'; -import contractMap from 'eth-contract-metadata'; import { connect } from 'react-redux'; import AppConstants from '../../../core/AppConstants'; -import Ionicons from 'react-native-vector-icons/Ionicons'; import StyledButton from '../StyledButton'; import Networks from '../../../util/networks'; -import Device from '../../../util/Device'; import Modal from 'react-native-modal'; import decodeTransaction from './utils'; - -const { - CONNEXT: { CONTRACTS } -} = AppConstants; +import { TRANSACTION_TYPES } from '../../../util/transactions'; +import ListItem from '../../Base/ListItem'; +import StatusText from '../../Base/StatusText'; +import DetailsModal from '../../Base/DetailsModal'; const styles = StyleSheet.create({ row: { @@ -30,99 +24,6 @@ const styles = StyleSheet.create({ borderBottomWidth: StyleSheet.hairlineWidth, borderColor: colors.grey100 }, - rowContent: { - padding: 0 - }, - rowOnly: { - padding: 15, - minHeight: Device.isIos() ? 95 : 100 - }, - date: { - color: colors.fontSecondary, - fontSize: 12, - marginBottom: 10, - ...fontStyles.normal - }, - info: { - flex: 1, - marginLeft: 15 - }, - address: { - fontSize: 15, - color: colors.fontPrimary, - ...fontStyles.normal - }, - status: { - marginTop: 5, - paddingVertical: 3, - paddingHorizontal: 5, - textAlign: 'center', - backgroundColor: colors.grey000, - color: colors.grey400, - fontSize: 9, - letterSpacing: 0.5, - width: 75, - textTransform: 'uppercase', - ...fontStyles.bold - }, - amount: { - fontSize: 15, - color: colors.fontPrimary, - ...fontStyles.normal - }, - amountFiat: { - fontSize: 12, - color: colors.fontSecondary, - textTransform: 'uppercase', - ...fontStyles.normal - }, - amounts: { - flex: 0.6, - alignItems: 'flex-end' - }, - subRow: { - flexDirection: 'row' - }, - statusConfirmed: { - backgroundColor: colors.green100, - color: colors.green500 - }, - statusSubmitted: { - backgroundColor: colors.orange000, - color: colors.orange300 - }, - statusFailed: { - backgroundColor: colors.red000, - color: colors.red - }, - ethLogo: { - width: 24, - height: 24 - }, - tokenImageStyle: { - width: 24, - height: 24, - borderRadius: 12 - }, - paymentChannelTransactionIconWrapper: { - justifyContent: 'center', - alignItems: 'center', - borderWidth: 1, - borderColor: colors.grey100, - borderRadius: 12, - width: 24, - height: 24, - backgroundColor: colors.white - }, - paymentChannelTransactionDepositIcon: { - marginTop: 2, - marginLeft: 1 - }, - paymentChannelTransactionWithdrawIcon: { - marginBottom: 2, - marginRight: 1, - transform: [{ rotate: '180deg' }] - }, actionContainerStyle: { height: 25, width: 70, @@ -136,43 +37,23 @@ const styles = StyleSheet.create({ padding: 0, paddingHorizontal: 10 }, - transactionActionsContainer: { - flexDirection: 'row', - paddingTop: 10, - paddingLeft: 40 - }, - modalContainer: { - width: '90%', - backgroundColor: colors.white, - borderRadius: 10 - }, - modal: { - margin: 0, - width: '100%' - }, - modalView: { - flexDirection: 'column', - justifyContent: 'center', - alignItems: 'center' - }, - titleWrapper: { - borderBottomWidth: StyleSheet.hairlineWidth, - borderColor: colors.grey100, - flexDirection: 'row' - }, - title: { - flex: 1, - textAlign: 'center', - fontSize: 18, - marginVertical: 12, - marginHorizontal: 24, - color: colors.fontPrimary, - ...fontStyles.bold - }, - closeIcon: { paddingTop: 4, position: 'absolute', right: 16 } + icon: { + width: 28, + height: 28 + } }); -const ethLogo = require('../../../images/eth-logo.png'); // eslint-disable-line +/* eslint-disable import/no-commonjs */ +const transactionIconApprove = require('../../../images/transaction-icons/approve.png'); +const transactionIconInteraction = require('../../../images/transaction-icons/interaction.png'); +const transactionIconSent = require('../../../images/transaction-icons/send.png'); +const transactionIconReceived = require('../../../images/transaction-icons/receive.png'); + +const transactionIconApproveFailed = require('../../../images/transaction-icons/approve-failed.png'); +const transactionIconInteractionFailed = require('../../../images/transaction-icons/interaction-failed.png'); +const transactionIconSentFailed = require('../../../images/transaction-icons/send-failed.png'); +const transactionIconReceivedFailed = require('../../../images/transaction-icons/receive-failed.png'); +/* eslint-enable import/no-commonjs */ /** * View that renders a transaction item part of transactions list @@ -275,17 +156,6 @@ class TransactionElement extends PureComponent { this.mounted = false; } - getStatusStyle(status) { - if (status === 'confirmed') { - return styles.statusConfirmed; - } else if (status === 'submitted' || status === 'approved') { - return styles.statusSubmitted; - } else if (status === 'failed') { - return styles.statusFailed; - } - return null; - } - onPressItem = () => { const { tx, i, onPressItem } = this.props; onPressItem(tx.id, i); @@ -300,75 +170,38 @@ class TransactionElement extends PureComponent { const { tx, selectedAddress } = this.props; const incoming = safeToChecksumAddress(tx.transaction.to) === selectedAddress; const selfSent = incoming && safeToChecksumAddress(tx.transaction.from) === selectedAddress; - return ( - - {(!incoming || selfSent) && tx.transaction.nonce && `#${parseInt(tx.transaction.nonce, 16)} - `} - {`${toDateFormat(tx.time)}`} - - ); + return `${ + (!incoming || selfSent) && tx.transaction.nonce ? `#${parseInt(tx.transaction.nonce, 16)} - ` : '' + }${toDateFormat(tx.time)}`; }; - renderTxElementImage = transactionElement => { - const { - renderTo, - renderFrom, - actionKey, - contractDeployment = false, - paymentChannelTransaction - } = transactionElement; - const { - tx: { networkID } - } = this.props; - let logo; - - if (contractDeployment) { - return ( - - - - ); - } else if (actionKey === strings('transactions.smart_contract_interaction')) { - if (renderTo in contractMap) { - logo = contractMap[renderTo].logo; - } - return ( - - ); - } else if (paymentChannelTransaction) { - const contract = CONTRACTS[networkID]; - const isDeposit = contract && renderTo.toLowerCase() === contract.toLowerCase(); - if (isDeposit) { - return ( - - - - ); - } - const isWithdraw = renderFrom === CONTRACTS[networkID]; - if (isWithdraw) { - return ( - - - - ); - } + renderTxElementIcon = (transactionElement, status) => { + const { transactionType } = transactionElement; + const isFailedTransaction = status === 'cancelled' || status === 'failed'; + let icon; + switch (transactionType) { + case TRANSACTION_TYPES.PAYMENT_CHANNEL_DEPOSIT: + case TRANSACTION_TYPES.PAYMENT_CHANNEL_SENT: + case TRANSACTION_TYPES.SENT_TOKEN: + case TRANSACTION_TYPES.SENT_COLLECTIBLE: + case TRANSACTION_TYPES.SENT: + icon = isFailedTransaction ? transactionIconSentFailed : transactionIconSent; + break; + case TRANSACTION_TYPES.PAYMENT_CHANNEL_WITHDRAW: + case TRANSACTION_TYPES.PAYMENT_CHANNEL_RECEIVED: + case TRANSACTION_TYPES.RECEIVED_TOKEN: + case TRANSACTION_TYPES.RECEIVED_COLLECTIBLE: + case TRANSACTION_TYPES.RECEIVED: + icon = isFailedTransaction ? transactionIconReceivedFailed : transactionIconReceived; + break; + case TRANSACTION_TYPES.SITE_INTERACTION: + icon = isFailedTransaction ? transactionIconInteractionFailed : transactionIconInteraction; + break; + case TRANSACTION_TYPES.APPROVE: + icon = isFailedTransaction ? transactionIconApproveFailed : transactionIconApprove; + break; } - return ; + return ; }; /** @@ -389,28 +222,26 @@ class TransactionElement extends PureComponent { const renderTxActions = status === 'submitted' || status === 'approved'; const renderSpeedUpAction = safeToChecksumAddress(to) !== AppConstants.CONNEXT.CONTRACTS[networkId]; return ( - - {this.renderTxTime()} - - {this.renderTxElementImage(transactionElement)} - - - {actionKey} - - {status} - - - {value} - {fiatValue} - - + + {this.renderTxTime()} + + {this.renderTxElementIcon(transactionElement, status)} + + {actionKey} + + + + {value} + {fiatValue} + + {!!renderTxActions && ( - + {renderSpeedUpAction && this.renderSpeedUpButton()} {this.renderCancelButton()} - + )} - + ); }; @@ -458,48 +289,40 @@ class TransactionElement extends PureComponent { const { tx } = this.props; const { detailsModalVisible, transactionElement, transactionDetails } = this.state; - if (!transactionElement || !transactionDetails) return ; + if (!transactionElement || !transactionDetails) return null; return ( - + <> - {this.renderTxElement(transactionElement)} + {this.renderTxElement(transactionElement)} - - - - - {transactionElement.actionKey} - - - - - - + + + + {transactionElement.actionKey} + + + + + - + ); } } diff --git a/app/components/UI/TransactionElement/utils.js b/app/components/UI/TransactionElement/utils.js index cf3daeb363c..4b2b57d98f5 100644 --- a/app/components/UI/TransactionElement/utils.js +++ b/app/components/UI/TransactionElement/utils.js @@ -15,8 +15,15 @@ import { } from '../../../util/number'; import { strings } from '../../../../locales/i18n'; import { renderFullAddress, safeToChecksumAddress } from '../../../util/address'; -import { decodeTransferData, isCollectibleAddress, getTicker, getActionKey } from '../../../util/transactions'; +import { + decodeTransferData, + isCollectibleAddress, + getTicker, + getActionKey, + TRANSACTION_TYPES +} from '../../../util/transactions'; import contractMap from 'eth-contract-metadata'; +import { toChecksumAddress } from 'ethereumjs-util'; const { CONNEXT: { CONTRACTS } @@ -44,7 +51,8 @@ function decodeTransferPaymentChannel(args) { currentCurrency, exchangeRate, actionKey, - primaryCurrency + primaryCurrency, + selectedAddress } = args; const totalSAI = hexToBN(value); const readableTotalSAI = renderFromWei(totalSAI); @@ -76,13 +84,19 @@ function decodeTransferPaymentChannel(args) { }; } + let transactionType; + if (renderFrom === selectedAddress) transactionType = TRANSACTION_TYPES.PAYMENT_CHANNEL_SENT; + else if (renderTo === selectedAddress) transactionType = TRANSACTION_TYPES.PAYMENT_CHANNEL_RECEIVED; + else transactionType = TRANSACTION_TYPES.PAYMENT_CHANNEL_WITHDRAW; + const transactionElement = { renderFrom, renderTo, actionKey, value: renderTotalSAI, fiatValue: renderTotalSAIFiat, - paymentChannelTransaction: true + paymentChannelTransaction: true, + transactionType }; return [transactionElement, transactionDetails]; @@ -91,7 +105,7 @@ function decodeTransferPaymentChannel(args) { function getTokenTransfer(args) { const { tx: { - transaction: { to, data } + transaction: { from, to, data, nonce } }, conversionRate, currentCurrency, @@ -99,7 +113,8 @@ function getTokenTransfer(args) { contractExchangeRates, totalGas, actionKey, - primaryCurrency + primaryCurrency, + selectedAddress } = args; const [, encodedAmount] = decodeTransferData('transfer', data); @@ -163,10 +178,14 @@ function getTokenTransfer(args) { }; } + const { SENT_TOKEN, RECEIVED_TOKEN } = TRANSACTION_TYPES; + const transactionType = renderFullAddress(from) === selectedAddress ? SENT_TOKEN : RECEIVED_TOKEN; const transactionElement = { actionKey: renderActionKey, value: !renderTokenAmount ? strings('transaction.value_not_available') : renderTokenAmount, - fiatValue: `- ${renderTokenFiatAmount}` + fiatValue: `- ${renderTokenFiatAmount}`, + transactionType, + nonce }; return [transactionElement, transactionDetails]; @@ -175,13 +194,14 @@ function getTokenTransfer(args) { function getCollectibleTransfer(args) { const { tx: { - transaction: { to, data } + transaction: { from, to, data } }, collectibleContracts, totalGas, conversionRate, currentCurrency, - primaryCurrency + primaryCurrency, + selectedAddress } = args; let actionKey; const [, tokenId] = decodeTransferData('transfer', data); @@ -223,10 +243,111 @@ function getCollectibleTransfer(args) { }; } + let transactionType; + if (renderFullAddress(from) === selectedAddress) transactionType = TRANSACTION_TYPES.SENT_COLLECTIBLE; + else transactionType = TRANSACTION_TYPES.RECEIVED_COLLECTIBLE; + const transactionElement = { actionKey, value: `${strings('unit.token_id')}${tokenId}`, - fiatValue: collectible ? collectible.symbol : undefined + fiatValue: collectible ? collectible.symbol : undefined, + transactionType + }; + + return [transactionElement, transactionDetails]; +} + +function decodeIncomingTransfer(args) { + const { + tx: { + transaction: { to, from, value }, + transferInformation: { symbol, decimals, contractAddress }, + transactionHash + }, + conversionRate, + currentCurrency, + contractExchangeRates, + totalGas, + actionKey, + primaryCurrency, + selectedAddress + } = args; + + const amount = toBN(value); + const token = { symbol, decimals, address: contractAddress }; + + const renderTokenAmount = token + ? `${renderFromTokenMinimalUnit(amount, token.decimals)} ${token.symbol}` + : undefined; + const exchangeRate = token ? contractExchangeRates[toChecksumAddress(token.address)] : undefined; + + let renderTokenFiatAmount, renderTokenFiatNumber; + if (exchangeRate) { + renderTokenFiatAmount = balanceToFiat( + fromTokenMinimalUnit(amount, token.decimals) || 0, + conversionRate, + exchangeRate, + currentCurrency + ); + renderTokenFiatNumber = balanceToFiatNumber( + fromTokenMinimalUnit(amount, token.decimals) || 0, + conversionRate, + exchangeRate + ); + } + + const renderToken = token + ? `${renderFromTokenMinimalUnit(amount, token.decimals)} ${token.symbol}` + : strings('transaction.value_not_available'); + const totalFiatNumber = renderTokenFiatNumber + ? weiToFiatNumber(totalGas, conversionRate) + renderTokenFiatNumber + : weiToFiatNumber(totalGas, conversionRate); + + const ticker = getTicker(args.ticker); + + const { SENT_TOKEN, RECEIVED_TOKEN } = TRANSACTION_TYPES; + const transactionType = renderFullAddress(from) === selectedAddress ? SENT_TOKEN : RECEIVED_TOKEN; + + let transactionDetails = { + renderTotalGas: `${renderFromWei(totalGas)} ${ticker}`, + renderValue: renderToken, + renderFrom: renderFullAddress(from), + renderTo: renderFullAddress(to), + transactionHash, + transactionType + }; + if (primaryCurrency === 'ETH') { + transactionDetails = { + ...transactionDetails, + summaryAmount: renderToken, + summaryFee: `${renderFromWei(totalGas)} ${ticker}`, + summaryTotalAmount: `${renderToken} ${strings('unit.divisor')} ${renderFromWei(totalGas)} ${ticker}`, + summarySecondaryTotalAmount: totalFiatNumber + ? `${addCurrencySymbol(totalFiatNumber, currentCurrency)}` + : undefined + }; + } else { + transactionDetails = { + ...transactionDetails, + summaryAmount: renderTokenFiatAmount + ? `${renderTokenFiatAmount}` + : `${addCurrencySymbol(0, currentCurrency)}`, + summaryFee: weiToFiat(totalGas, conversionRate, currentCurrency), + summaryTotalAmount: totalFiatNumber ? `${addCurrencySymbol(totalFiatNumber, currentCurrency)}` : undefined, + summarySecondaryTotalAmount: `${renderToken} ${strings('unit.divisor')} ${renderFromWei( + totalGas + )} ${ticker}` + }; + } + + const transactionElement = { + actionKey, + renderFrom: renderFullAddress(from), + renderTo: renderFullAddress(to), + value: !renderTokenAmount ? strings('transaction.value_not_available') : renderTokenAmount, + fiatValue: renderTokenFiatAmount ? `${renderTokenFiatAmount}` : renderTokenFiatAmount, + isIncomingTransfer: true, + transactionType }; return [transactionElement, transactionDetails]; @@ -242,7 +363,12 @@ async function decodeTransferTx(args) { const decodedData = decodeTransferData('transfer', data); const addressTo = decodedData[0]; - const isCollectible = await isCollectibleAddress(to, decodedData[1]); + let isCollectible = false; + try { + isCollectible = await isCollectibleAddress(to, decodedData[1]); + } catch (e) { + // + } const gasBN = hexToBN(gas); const gasPriceBN = hexToBN(gasPrice); @@ -276,7 +402,8 @@ function decodeTransferFromTx(args) { collectibleContracts, conversionRate, currentCurrency, - primaryCurrency + primaryCurrency, + selectedAddress } = args; const [addressFrom, addressTo, tokenId] = decodeTransferData('transferFrom', data); const collectible = collectibleContracts.find( @@ -298,6 +425,9 @@ function decodeTransferFromTx(args) { const renderTo = renderFullAddress(addressTo); const ticker = getTicker(args.ticker); + const { SENT_COLLECTIBLE, RECEIVED_COLLECTIBLE } = TRANSACTION_TYPES; + const transactionType = renderFrom === selectedAddress ? SENT_COLLECTIBLE : RECEIVED_COLLECTIBLE; + let transactionDetails = { renderFrom, renderTo, @@ -333,7 +463,8 @@ function decodeTransferFromTx(args) { renderFrom, actionKey, value: `${strings('unit.token_id')}${tokenId}`, - fiatValue: collectible ? collectible.symbol : undefined + fiatValue: collectible ? collectible.symbol : undefined, + transactionType }; return [transactionElement, transactionDetails]; @@ -368,7 +499,8 @@ function decodeDeploymentTx(args) { actionKey, value: renderTotalEth, fiatValue: renderTotalEthFiat, - contractDeployment: true + contractDeployment: true, + transactionType: TRANSACTION_TYPES.SITE_INTERACTION }; let transactionDetails = { renderFrom, @@ -410,7 +542,8 @@ function decodeConfirmTx(args, paymentChannelTransaction) { conversionRate, currentCurrency, actionKey, - primaryCurrency + primaryCurrency, + selectedAddress } = args; const ticker = getTicker(args.ticker); const totalEth = hexToBN(value); @@ -424,6 +557,30 @@ function decodeConfirmTx(args, paymentChannelTransaction) { const renderFrom = renderFullAddress(from); const renderTo = renderFullAddress(to); + + let symbol; + if (renderTo in contractMap) { + symbol = contractMap[renderTo].symbol; + } + let transactionType; + if (paymentChannelTransaction) transactionType = TRANSACTION_TYPES.PAYMENT_CHANNEL_DEPOSIT; + else if (actionKey === strings('transactions.approve')) transactionType = TRANSACTION_TYPES.APPROVE; + else if ( + actionKey === strings('transactions.smart_contract_interaction') || + (!actionKey.includes(strings('transactions.sent')) && !actionKey.includes(strings('transactions.received'))) + ) + transactionType = TRANSACTION_TYPES.SITE_INTERACTION; + else if (renderFrom === selectedAddress) transactionType = TRANSACTION_TYPES.SENT; + else if (renderTo === selectedAddress) transactionType = TRANSACTION_TYPES.RECEIVED; + const transactionElement = { + renderTo, + renderFrom, + actionKey: symbol ? `${symbol} ${actionKey}` : actionKey, + value: renderTotalEth, + fiatValue: renderTotalEthFiat, + paymentChannelTransaction, + transactionType + }; let transactionDetails = { renderFrom, renderTo, @@ -431,7 +588,8 @@ function decodeConfirmTx(args, paymentChannelTransaction) { renderValue: `${renderFromWei(value)} ${ticker}`, renderGas: parseInt(gas, 16).toString(), renderGasPrice: renderToGwei(gasPrice), - renderTotalGas: `${renderFromWei(totalGas)} ${ticker}` + renderTotalGas: `${renderFromWei(totalGas)} ${ticker}`, + transactionType }; if (primaryCurrency === 'ETH') { @@ -451,21 +609,6 @@ function decodeConfirmTx(args, paymentChannelTransaction) { summaryTotalAmount: weiToFiat(totalValue, conversionRate, currentCurrency) }; } - - let symbol; - if (renderTo in contractMap) { - symbol = contractMap[renderTo].symbol; - } - - const transactionElement = { - renderTo, - renderFrom, - actionKey: symbol ? `${symbol} ${actionKey}` : actionKey, - value: renderTotalEth, - fiatValue: renderTotalEthFiat, - paymentChannelTransaction - }; - return [transactionElement, transactionDetails]; } @@ -478,14 +621,17 @@ function decodeConfirmTx(args, paymentChannelTransaction) { export default async function decodeTransaction(args) { const { tx, - tx: { paymentChannelTransaction }, + tx: { paymentChannelTransaction, isTransfer }, selectedAddress, ticker } = args; - const actionKey = tx.actionKey || (await getActionKey(tx, selectedAddress, ticker, paymentChannelTransaction)); + + const actionKey = await getActionKey(tx, selectedAddress, ticker, paymentChannelTransaction); let transactionElement, transactionDetails; if (paymentChannelTransaction) { [transactionElement, transactionDetails] = decodePaymentChannelTx({ ...args, actionKey }); + } else if (isTransfer) { + [transactionElement, transactionDetails] = decodeIncomingTransfer({ ...args, actionKey }); } else { switch (actionKey) { case strings('transactions.sent_tokens'): diff --git a/app/components/UI/TransactionReview/TransactionReviewFeeCard/index.js b/app/components/UI/TransactionReview/TransactionReviewFeeCard/index.js index e7b1be6abe7..bdd1c423221 100644 --- a/app/components/UI/TransactionReview/TransactionReviewFeeCard/index.js +++ b/app/components/UI/TransactionReview/TransactionReviewFeeCard/index.js @@ -1,62 +1,15 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; -import { StyleSheet, Text, View, TouchableOpacity, ActivityIndicator } from 'react-native'; -import { colors, fontStyles } from '../../../../styles/common'; +import { StyleSheet, View, TouchableOpacity, ActivityIndicator } from 'react-native'; +import { colors } from '../../../../styles/common'; import { strings } from '../../../../../locales/i18n'; +import Summary from '../../../Base/Summary'; +import Text from '../../../Base/Text'; const styles = StyleSheet.create({ overview: { - borderWidth: 1, - borderColor: colors.grey200, - borderRadius: 10, - padding: 16, marginHorizontal: 24 }, - overviewAccent: { - color: colors.blue - }, - overviewCol: { - alignItems: 'center', - justifyContent: 'center', - flexDirection: 'column' - }, - topOverviewCol: { - borderBottomWidth: 1, - borderColor: colors.grey200, - paddingBottom: 12 - }, - bottomOverviewCol: { - paddingTop: 12 - }, - amountRow: { - width: '100%', - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center' - }, - amountRowBottomSpace: { - paddingBottom: 12 - }, - totalValueRow: { - justifyContent: 'flex-end' - }, - networkTextWrapper: { - flexDirection: 'row', - justifyContent: 'flex-start', - alignItems: 'center' - }, - overviewText: { - ...fontStyles.bold, - color: colors.fontPrimary, - fontSize: 14 - }, - networkFeeText: { - paddingRight: 5 - }, - totalValueText: { - color: colors.fontSecondary, - textTransform: 'uppercase' - }, loader: { backgroundColor: colors.white, height: 10 @@ -145,40 +98,47 @@ class TransactionReviewFeeCard extends PureComponent { equivalentTotalAmount = totalValue; } return ( - - - - {strings('transaction.amount')} - {amount} - - - - + <> +

+ + + {strings('transaction.amount')} + + + {amount} + + + + + {strings('transaction.gas_fee')} - + + {' '} {strings('transaction.edit')} - - {this.renderIfGasEstimationReady({networkFee})} - - - - - + + + {this.renderIfGasEstimationReady( + + {networkFee} + + )} + + + + {strings('transaction.total')} {strings('transaction.amount')} {!!totalFiat && this.renderIfGasEstimationReady(totalAmount)} - - - {this.renderIfGasEstimationReady( - {equivalentTotalAmount} - )} - - - + + + {this.renderIfGasEstimationReady({equivalentTotalAmount})} + + + ); } } diff --git a/app/components/UI/Transactions/index.js b/app/components/UI/Transactions/index.js index 20dac9ee4ec..34747d265b5 100644 --- a/app/components/UI/Transactions/index.js +++ b/app/components/UI/Transactions/index.js @@ -12,7 +12,7 @@ import { Dimensions, InteractionManager } from 'react-native'; -import { colors, fontStyles } from '../../../styles/common'; +import { colors, fontStyles, baseStyles } from '../../../styles/common'; import { strings } from '../../../../locales/i18n'; import TransactionElement from '../TransactionElement'; import Engine from '../../../core/Engine'; @@ -339,7 +339,6 @@ class Transactions extends PureComponent { submittedTransactions && submittedTransactions.length ? submittedTransactions.concat(confirmedTransactions) : this.props.transactions; - return ( { + navigation.setParams({ hasOrders }); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [hasOrders] + ); + + return ( + + + + {hasOrders && } + + + ); +} + +ActivityView.defaultProps = { + hasOrders: false +}; + +ActivityView.propTypes = { + hasOrders: PropTypes.bool +}; + +ActivityView.navigationOptions = ({ navigation }) => { + const title = navigation.getParam('hasOrders', false) ? 'activity_view.title' : 'transactions_view.title'; + return getNavbarOptions(title, navigation); +}; + +const mapStateToProps = state => { + const orders = state.fiatOrders.orders; + const selectedAddress = state.engine.backgroundState.PreferencesController.selectedAddress; + const network = state.engine.backgroundState.NetworkController.network; + return { + hasOrders: getHasOrders(orders, selectedAddress, network) + }; +}; + +export default connect(mapStateToProps)(ActivityView); diff --git a/app/components/Views/ApproveView/Approve/index.js b/app/components/Views/ApproveView/Approve/index.js index bf7c12933f7..3f85bb559b0 100644 --- a/app/components/Views/ApproveView/Approve/index.js +++ b/app/components/Views/ApproveView/Approve/index.js @@ -1,14 +1,5 @@ import React, { PureComponent } from 'react'; -import { - SafeAreaView, - StyleSheet, - Text, - View, - TouchableOpacity, - TextInput, - Alert, - InteractionManager -} from 'react-native'; +import { StyleSheet, Text, View, TouchableOpacity, TextInput, Alert, InteractionManager } from 'react-native'; import Clipboard from '@react-native-community/clipboard'; import PropTypes from 'prop-types'; import { getApproveNavbar } from '../../../UI/Navbar'; @@ -23,7 +14,7 @@ import ActionModal from '../../../UI/ActionModal'; import { strings } from '../../../../../locales/i18n'; import { setTransactionObject } from '../../../../actions/transaction'; import { util } from '@metamask/controllers'; -import { renderFromWei, weiToFiatNumber, isBN, isDecimal } from '../../../../util/number'; +import { renderFromWei, weiToFiatNumber, isBN, isDecimal, fromTokenMinimalUnit } from '../../../../util/number'; import { getTicker, decodeTransferData, @@ -61,10 +52,6 @@ const styles = StyleSheet.create({ paddingLeft: 20, marginTop: 2 }, - wrapper: { - backgroundColor: colors.white, - flex: 1 - }, section: { minWidth: '100%', width: '100%', @@ -236,10 +223,6 @@ class Approve extends PureComponent { * List of accounts from the AccountTrackerController */ accounts: PropTypes.object, - /** - * Object that represents the navigator - */ - navigation: PropTypes.object, /** * ETH to current currency conversion rate */ @@ -281,7 +264,15 @@ class Approve extends PureComponent { */ providerType: PropTypes.string, primaryCurrency: PropTypes.string, - activeTabUrl: PropTypes.string + activeTabUrl: PropTypes.string, + /** + * Whether the modal is visible + */ + modalVisible: PropTypes.bool, + /** + /* Token approve modal visible or not + */ + toggleApproveModal: PropTypes.func }; state = { @@ -327,14 +318,15 @@ class Approve extends PureComponent { tokenSymbol = contract.symbol; tokenDecimals = contract.decimals; } - const originalApproveAmount = decodeTransferData('transfer', data)[1]; + const originalApproveAmount = decodeTransferData('transfer', data)[2]; + const approveAmount = fromTokenMinimalUnit(hexToBN(originalApproveAmount), tokenDecimals); const totalGas = gas.mul(gasPrice); const { name: method } = await getMethodData(data); this.setState({ host, method, - originalApproveAmount, + originalApproveAmount: approveAmount, tokenDecimals, tokenSymbol, totalGas: renderFromWei(totalGas), @@ -550,7 +542,7 @@ class Approve extends PureComponent { spendLimitUnlimitedSelected ? styles.textBlue : styles.textBlack ]} > - {strings('spend_limit_edition.unlimited')} + {strings('spend_limit_edition.proposed')} {strings('spend_limit_edition.requested_by')} @@ -655,7 +647,7 @@ class Approve extends PureComponent { TransactionController.hub.once(`${transaction.id}:finished`, transactionMeta => { if (transactionMeta.status === 'submitted') { this.setState({ approved: true }); - this.props.navigation.pop(); + this.props.toggleApproveModal(); NotificationManager.watchSubmittedTransaction({ ...transactionMeta, assetType: 'ETH' @@ -678,7 +670,7 @@ class Approve extends PureComponent { onCancel = () => { this.trackApproveEvent(ANALYTICS_EVENT_OPTS.DAPP_APPROVE_SCREEN_CANCEL); - this.props.navigation.pop(); + this.props.toggleApproveModal(); }; copyContractAddress = async () => { @@ -712,83 +704,76 @@ class Approve extends PureComponent { const totalGasFiatRounded = Math.round(totalGasFiat * 100) / 100; return ( - - - - {viewDetails ? ( - this.renderTransactionReview() - ) : customGasVisible ? ( - this.renderCustomGas() - ) : editPermissionVisible ? ( - this.renderEditPermission() - ) : ( - <> - - - - {strings('spend_limit_edition.allow_to_access', { tokenSymbol })} - - - {strings('spend_limit_edition.you_trust_this_site')} + + + {viewDetails ? ( + this.renderTransactionReview() + ) : customGasVisible ? ( + this.renderCustomGas() + ) : editPermissionVisible ? ( + this.renderEditPermission() + ) : ( + <> + + + + {strings('spend_limit_edition.allow_to_access', { tokenSymbol })} + + + {strings('spend_limit_edition.you_trust_this_site')} + + + + {strings('spend_limit_edition.edit_permission')} - - - {strings('spend_limit_edition.edit_permission')} + + + + + + + {strings('transaction.transaction_fee')} + + {isFiat && currencySymbol} + {isFiat ? totalGasFiatRounded : totalGas} {!isFiat && ticker} - - - - - - - - {strings('transaction.transaction_fee')} - - - {isFiat && currencySymbol} - {isFiat ? totalGasFiatRounded : totalGas} {!isFiat && ticker} - - - - + + - - - - - {strings('spend_limit_edition.view_details')} - - - - {gasError && ( - - - - )} - - - )} - - - + +

*qc(YSDECmmEW5C2F8eo9;$W+ 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 Date: Mon, 22 Jun 2020 12:45:57 -0400 Subject: [PATCH 033/106] Add Logger to Fiat Orders creation and processing --- .../FiatOrders/PaymentMethodApplePay/index.js | 3 ++ app/components/UI/FiatOrders/index.js | 1 - .../UI/FiatOrders/orderProcessor/index.js | 2 + .../UI/FiatOrders/orderProcessor/transak.js | 6 +-- .../FiatOrders/orderProcessor/wyreApplePay.js | 42 ++++++++++++------- 5 files changed, 35 insertions(+), 19 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index cf77db51dfb..c9c20368230 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -6,6 +6,7 @@ import { connect } from 'react-redux'; import IonicIcon from 'react-native-vector-icons/Ionicons'; import NotificationManager from '../../../../core/NotificationManager'; import Device from '../../../../util/Device'; +import Logger from '../../../../util/Logger'; import { setLockTime } from '../../../../actions/settings'; import { strings } from '../../../../../locales/i18n'; import { getNotificationDetails } from '..'; @@ -272,6 +273,8 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network InteractionManager.runAfterInteractions(() => NotificationManager.showSimpleNotification(getNotificationDetails(order)) ); + } else { + Logger.log('FiatOrders::WyreApplePayProcessor empty order response', order); } } catch (error) { NotificationManager.showSimpleNotification({ diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 9aaa933ced9..85a0c12d08f 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -94,7 +94,6 @@ function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOr pendingOrders.map(async order => { const updatedOrder = await processOrder(order); if (updatedOrder.state !== order.state) { - // console.log(`Order updated:`, order.provider, order.id); dispatch({ type: 'FIAT_UPDATE_ORDER', payload: updatedOrder }); InteractionManager.runAfterInteractions(() => NotificationManager.showSimpleNotification(getNotificationDetails(updatedOrder)) diff --git a/app/components/UI/FiatOrders/orderProcessor/index.js b/app/components/UI/FiatOrders/orderProcessor/index.js index d5bb038e64b..eb9546fcb6e 100644 --- a/app/components/UI/FiatOrders/orderProcessor/index.js +++ b/app/components/UI/FiatOrders/orderProcessor/index.js @@ -1,6 +1,7 @@ import { FIAT_ORDER_PROVIDERS } from '../../../../reducers/fiatOrders'; import { processWyreApplePayOrder } from './wyreApplePay'; import { processTransakOrder } from './transak'; +import Logger from '../../../../util/Logger'; function processOrder(order) { switch (order.provider) { @@ -11,6 +12,7 @@ function processOrder(order) { return processTransakOrder(order); } default: { + Logger.log('FiatOrders::ProcessOrder unrecognized provider', order); return order; } } diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index cf18ae0fdc7..6bf81323561 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -2,6 +2,7 @@ import { useMemo } from 'react'; import axios from 'axios'; import qs from 'query-string'; import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; +import Logger from '../../../../util/Logger'; //* env vars @@ -198,15 +199,14 @@ export async function processTransakOrder(order) { data: { response } } = await getOrderStatus(order.id); if (!response) { - return order; + throw new Error('Payment Request Failed: empty transak response'); } return { ...order, ...transakOrderToFiatOrder(response) }; } catch (error) { - // TODO: report error - // console.error(error); + Logger.error(error, { message: 'FiatOrders::TransakProcessor error while processing order', order }); return order; } } diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index 3239617ddb4..257877ed1b8 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -1,8 +1,9 @@ import { useCallback, useMemo } from 'react'; import { PaymentRequest } from 'react-native-payments'; import axios from 'axios'; -import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; +import Logger from '../../../../util/Logger'; import { strings } from '../../../../../locales/i18n'; +import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; //* env vars @@ -219,22 +220,30 @@ export async function processWyreApplePayOrder(order) { try { const { data } = await getOrderStatus(order.network, order.id); if (!data) { + Logger.log('FiatOrders::WyreApplePayProcessor empty data', order); return order; } const { transferId } = data; if (transferId) { - const transfer = await getTransferStatus(order.network, transferId); - return { - ...order, - ...wyreOrderToFiatOrder(data), - ...wyreTransferToFiatOrder(transfer), - data: { - order: data, - transfer - } - }; + try { + const transferResponse = await getTransferStatus(order.network, transferId); + return { + ...order, + ...wyreOrderToFiatOrder(data), + ...wyreTransferToFiatOrder(transferResponse.data), + data: { + order: data, + transfer: transferResponse.data + } + }; + } catch (error) { + Logger.error(error, { + message: 'FiatOrders::WyreApplePayProcessor error while processing transfer', + order + }); + } } return { @@ -242,7 +251,7 @@ export async function processWyreApplePayOrder(order) { ...wyreOrderToFiatOrder(data) }; } catch (error) { - // TODO: report error + Logger.error(error, { message: 'FiatOrders::WyreApplePayProcessor error while processing order', order }); return order; } } @@ -374,16 +383,18 @@ export function useWyreApplePay(amount, address, network) { try { const paymentResponse = await paymentRequest.show(); if (!paymentResponse) { - throw new Error('Payment Request Failed'); + throw new Error('Payment Request Failed: empty apple pay response'); } const payload = createPayload(network, total, address, paymentResponse.details); const { data, status } = await createFiatOrder(network, payload); if (status >= 200 && status < 300) { await paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.SUCCESS); - return { ...wyreOrderToFiatOrder(data), network }; + const order = { ...wyreOrderToFiatOrder(data), network }; + Logger.log('FiatOrders::WyreApplePayPayment order created', order); + return order; } - paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.FAIL); + paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.FAIL); throw new WyreException(data.message, data.type, data.exceptionId); } catch (error) { if (error.message.includes('AbortError')) { @@ -392,6 +403,7 @@ export function useWyreApplePay(amount, address, network) { if (paymentRequest && paymentRequest.abort) { paymentRequest.abort(); } + Logger.error(error, { message: 'FiatOrders::WyreApplePayPayment error while creating order' }); throw error; } }, [address, methodData, network, paymentDetails, total]); From ceea6816d54a9491a41ae027c65131e44488587f Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Mon, 22 Jun 2020 14:04:10 -0400 Subject: [PATCH 034/106] Add Aborted apple pay check --- .../FiatOrders/PaymentMethodApplePay/index.js | 22 ++++++++++--------- .../FiatOrders/orderProcessor/wyreApplePay.js | 6 +++-- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index c9c20368230..bf5ef88fe0c 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -261,20 +261,22 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network const handleWyreTerms = useWyreTerms(navigation); - const [pay, percentFee, flatFee, , fee] = useWyreApplePay(roundAmount, selectedAddress, network); + const [pay, ABORTED, percentFee, flatFee, , fee] = useWyreApplePay(roundAmount, selectedAddress, network); const handlePressApplePay = useCallback(async () => { const prevLockTime = lockTime; setLockTime(-1); try { const order = await pay(); - if (order) { - addOrder(order); - navigation.dismiss(); - InteractionManager.runAfterInteractions(() => - NotificationManager.showSimpleNotification(getNotificationDetails(order)) - ); - } else { - Logger.log('FiatOrders::WyreApplePayProcessor empty order response', order); + if (order !== ABORTED) { + if (order) { + addOrder(order); + navigation.dismiss(); + InteractionManager.runAfterInteractions(() => + NotificationManager.showSimpleNotification(getNotificationDetails(order)) + ); + } else { + Logger.log('FiatOrders::WyreApplePayProcessor empty order response', order); + } } } catch (error) { NotificationManager.showSimpleNotification({ @@ -288,7 +290,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network } finally { setLockTime(prevLockTime); } - }, [addOrder, lockTime, navigation, pay, setLockTime]); + }, [ABORTED, addOrder, lockTime, navigation, pay, setLockTime]); const handleQuickAmountPress = useCallback(amount => setAmount(amount), []); const handleKeypadPress = useCallback( diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index 257877ed1b8..c9ef4baf2ae 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -261,6 +261,8 @@ export async function processWyreApplePayOrder(order) { const USD_CURRENCY_CODE = 'USD'; const ETH_CURRENCY_CODE = 'ETH'; +const ABORTED = 'ABORTED'; + const PAYMENT_REQUEST_COMPLETE = { SUCCESS: 'success', UNKNOWN: 'unknown', @@ -398,7 +400,7 @@ export function useWyreApplePay(amount, address, network) { throw new WyreException(data.message, data.type, data.exceptionId); } catch (error) { if (error.message.includes('AbortError')) { - return null; + return ABORTED; } if (paymentRequest && paymentRequest.abort) { paymentRequest.abort(); @@ -408,7 +410,7 @@ export function useWyreApplePay(amount, address, network) { } }, [address, methodData, network, paymentDetails, total]); - return [showRequest, percentFee, flatFee, percentFeeAmount, fee, total]; + return [showRequest, ABORTED, percentFee, flatFee, percentFeeAmount, fee, total]; } export function useWyreTerms(navigation) { From a5d61bb6aa9f01bbc20b63827dc079dde70bdf83 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Mon, 22 Jun 2020 16:05:59 -0400 Subject: [PATCH 035/106] env. --- app/components/Views/ImportWallet/index.js | 2 +- app/components/Views/SyncWithExtension/index.js | 2 +- app/core/Engine.js | 2 +- app/util/syncWithExtension.js | 5 ++--- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/components/Views/ImportWallet/index.js b/app/components/Views/ImportWallet/index.js index 185290863b4..076ed54b22e 100644 --- a/app/components/Views/ImportWallet/index.js +++ b/app/components/Views/ImportWallet/index.js @@ -95,7 +95,7 @@ const styles = StyleSheet.create({ } }); -const PUB_KEY = process.env['MM_PUBNUB_PUB_KEY']; // eslint-disable-line dot-notation +const PUB_KEY = process.env.MM_PUBNUB_PUB_KEY; /** * View where users can decide how to import their wallet diff --git a/app/components/Views/SyncWithExtension/index.js b/app/components/Views/SyncWithExtension/index.js index d99fb959db1..290bd4ee4c0 100644 --- a/app/components/Views/SyncWithExtension/index.js +++ b/app/components/Views/SyncWithExtension/index.js @@ -53,7 +53,7 @@ const styles = StyleSheet.create({ } }); -const PUB_KEY = process.env['MM_PUBNUB_PUB_KEY']; // eslint-disable-line dot-notation +const PUB_KEY = process.env.MM_PUBNUB_PUB_KEY; /** * diff --git a/app/core/Engine.js b/app/core/Engine.js index 5a4eaf5f2bb..6a875782d70 100644 --- a/app/core/Engine.js +++ b/app/core/Engine.js @@ -30,7 +30,7 @@ import { renderFromTokenMinimalUnit, balanceToFiatNumber, weiToFiatNumber } from import NotificationManager from './NotificationManager'; import contractMap from 'eth-contract-metadata'; -const OPENSEA_API_KEY = process.env['MM_OPENSEA_KEY']; // eslint-disable-line dot-notation +const OPENSEA_API_KEY = process.env.MM_OPENSEA_KEY; const encryptor = new Encryptor(); let refreshing = false; /** diff --git a/app/util/syncWithExtension.js b/app/util/syncWithExtension.js index 8969283b6cb..6b051c2a2dc 100644 --- a/app/util/syncWithExtension.js +++ b/app/util/syncWithExtension.js @@ -1,9 +1,8 @@ import PubNub from 'pubnub'; import Logger from './Logger'; -const PUB_KEY = process.env['MM_PUBNUB_PUB_KEY']; // eslint-disable-line dot-notation -const SUB_KEY = process.env['MM_PUBNUB_SUB_KEY']; // eslint-disable-line dot-notation - +const PUB_KEY = process.env.MM_PUBNUB_PUB_KEY; +const SUB_KEY = process.env.MM_PUBNUB_SUB_KEY; const EXPIRED_CODE_TIMEOUT = 30000; export default class PubNubWrapper { From 1a19dfaebadfdd461936e59e19d37128e10fa678 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Mon, 22 Jun 2020 17:51:31 -0400 Subject: [PATCH 036/106] Add wyre rates to apple pay amount screen --- .../FiatOrders/PaymentMethodApplePay/index.js | 22 +++++++++++++++++-- .../FiatOrders/orderProcessor/wyreApplePay.js | 22 ++++++++++++++++++- locales/en.json | 2 ++ locales/es.json | 2 ++ 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index bf5ef88fe0c..d3987380660 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -13,6 +13,7 @@ import { getNotificationDetails } from '..'; import { useWyreTerms, + useWyreRates, useWyreApplePay, WyreException, WYRE_IS_PROMOTION, @@ -260,8 +261,9 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network const disabledButton = amount === '0' || isUnderMinimum || isOverMaximum; const handleWyreTerms = useWyreTerms(navigation); - + const rates = useWyreRates(network, 'USDETH'); const [pay, ABORTED, percentFee, flatFee, , fee] = useWyreApplePay(roundAmount, selectedAddress, network); + const handlePressApplePay = useCallback(async () => { const prevLockTime = lockTime; setLockTime(-1); @@ -333,7 +335,23 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network > ${amount} - {!(isUnderMinimum || isOverMaximum) && = 0 ETH} + {!(isUnderMinimum || isOverMaximum) && + (rates ? ( + + {roundAmount === '0' ? ( + `$${rates.USD.toFixed(2)} ≈ 1 ETH` + ) : ( + <> + {strings('fiat_on_ramp.wyre_estimated', { + currency: 'ETH', + amount: (amount * rates.ETH).toFixed(5) + })} + + )} + + ) : ( + {strings('fiat_on_ramp.wyre_loading_rates')} + ))} {isUnderMinimum && ( {strings('fiat_on_ramp.wyre_minimum_deposit', { amount: `$${minAmount}` })} )} diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index c9ef4baf2ae..44c9c580a8f 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -1,4 +1,4 @@ -import { useCallback, useMemo } from 'react'; +import { useCallback, useMemo, useState, useEffect } from 'react'; import { PaymentRequest } from 'react-native-payments'; import axios from 'axios'; import Logger from '../../../../util/Logger'; @@ -130,6 +130,7 @@ const wyreTestAPI = axios.create({ baseURL: WYRE_API_ENDPOINT_TEST }); +const getRates = network => (network === '1' ? wyreAPI : wyreTestAPI).get(`v3/rates`, { params: { as: 'PRICED' } }); const createFiatOrder = (network, payload) => (network === '1' ? wyreAPI : wyreTestAPI).post('v3/apple-pay/process/partner', payload, { // * This promise will always be resolved, use response.status to handle errors @@ -364,6 +365,25 @@ const createPayload = (network, amount, address, paymentDetails) => { // * Hooks */ +export function useWyreRates(network, currencies) { + const [rates, setRates] = useState(null); + + useEffect(() => { + async function getWyreRates() { + try { + const { data } = await getRates(network); + const rates = data[currencies]; + setRates(rates); + } catch (error) { + Logger.error(error, 'FiatOrders::WyreAppleyPay error while fetching wyre rates'); + } + } + getWyreRates(); + }, [currencies, network]); + + return rates; +} + export function useWyreApplePay(amount, address, network) { const flatFee = useMemo(() => WYRE_FEE_FLAT.toFixed(2), []); const percentFee = useMemo(() => WYRE_FEE_PERCENT.toFixed(2), []); diff --git a/locales/en.json b/locales/en.json index 24afd2925c4..b47249f14ee 100644 --- a/locales/en.json +++ b/locales/en.json @@ -1159,6 +1159,8 @@ "fee": "fee", "Fee": "Fee", "limited_time": "limited time", + "wyre_loading_rates": " ", + "wyre_estimated": "Estimated {{amount}} {{currency}}", "wyre_minutes": "1 - 2 minutes", "wyre_max": "Max $450 weekly", "wyre_requires_debit_card": "Requires debit card", diff --git a/locales/es.json b/locales/es.json index 86b494c814b..9b650bdbdef 100644 --- a/locales/es.json +++ b/locales/es.json @@ -1090,6 +1090,8 @@ "fee": "comisión", "Fee": "Comisión", "limited_time": "tiempo limitado", + "wyre_loading_rates": " ", + "wyre_estimated": "Estimado {{amount}} {{currency}}", "wyre_minutes": "1 - 2 minutos", "wyre_max": "Máx. $450 semanal", "wyre_requires_debit_card": "Requiere tarjeta de débito", From 594463f85c06b108dd09bacac2f99135174d7b05 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Mon, 22 Jun 2020 18:35:03 -0400 Subject: [PATCH 037/106] add react-native-payments from fork --- .../FiatOrders/orderProcessor/wyreApplePay.js | 2 +- ios/Podfile.lock | 8 ++++---- package.json | 2 +- react-native-payments-v1.1.5.tgz | Bin 21591 -> 0 bytes yarn.lock | 16 ++++++++-------- 5 files changed, 14 insertions(+), 14 deletions(-) delete mode 100644 react-native-payments-v1.1.5.tgz diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index 44c9c580a8f..10c0457beb3 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -1,5 +1,5 @@ import { useCallback, useMemo, useState, useEffect } from 'react'; -import { PaymentRequest } from 'react-native-payments'; +import { PaymentRequest } from '@exodus/react-native-payments'; import axios from 'axios'; import Logger from '../../../../util/Logger'; import { strings } from '../../../../../locales/i18n'; diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 762db76e38c..c5b124d6e29 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -340,7 +340,7 @@ PODS: - React-cxxreact (= 0.62.2) - React-jsi (= 0.62.2) - ReactCommon/callinvoker (= 0.62.2) - - ReactNativePayments (1.1.5): + - ReactNativePayments (1.5.0): - React - RNCAsyncStorage (1.9.0): - React @@ -442,7 +442,7 @@ DEPENDENCIES: - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) - ReactCommon/callinvoker (from `../node_modules/react-native/ReactCommon`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - - ReactNativePayments (from `../node_modules/react-native-payments/lib/ios`) + - "ReactNativePayments (from `../node_modules/@exodus/react-native-payments/lib/ios`)" - "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)" - "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)" - RNDeviceInfo (from `../node_modules/react-native-device-info`) @@ -553,7 +553,7 @@ EXTERNAL SOURCES: ReactCommon: :path: "../node_modules/react-native/ReactCommon" ReactNativePayments: - :path: "../node_modules/react-native-payments/lib/ios" + :path: "../node_modules/@exodus/react-native-payments/lib/ios" RNCAsyncStorage: :path: "../node_modules/@react-native-community/async-storage" RNCClipboard: @@ -639,7 +639,7 @@ SPEC CHECKSUMS: React-RCTText: fae545b10cfdb3d247c36c56f61a94cfd6dba41d React-RCTVibration: 4356114dbcba4ce66991096e51a66e61eda51256 ReactCommon: ed4e11d27609d571e7eee8b65548efc191116eb3 - ReactNativePayments: 40a266450628c05db440fe219b631210e4358a49 + ReactNativePayments: a4e3ac915256a4e759c8a04338b558494a63a0f5 RNCAsyncStorage: 453cd7c335ec9ba3b877e27d02238956b76f3268 RNCClipboard: 8148e21ac347c51fd6cd4b683389094c216bb543 RNDeviceInfo: 88099e84466f053bae3f34c307b506738b2b6946 diff --git a/package.json b/package.json index bfa7b38b92c..dc9e5cd91f3 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "react-native-level-fs/**/bl": "^0.9.5" }, "dependencies": { + "@exodus/react-native-payments": "https://github.com/wachunei/react-native-payments.git#package-json-hack", "@metamask/controllers": "^2.0.0", "@react-native-community/async-storage": "1.9.0", "@react-native-community/clipboard": "^1.2.2", @@ -143,7 +144,6 @@ "react-native-level-fs": "3.0.1", "react-native-modal": "^11.5.6", "react-native-os": "^1.2.6", - "react-native-payments": "file:react-native-payments-v1.1.5.tgz", "react-native-progress": "3.5.0", "react-native-push-notification": "git+ssh://git@github.com/MetaMask/react-native-push-notification.git#androidx", "react-native-qrcode-svg": "5.1.2", diff --git a/react-native-payments-v1.1.5.tgz b/react-native-payments-v1.1.5.tgz deleted file mode 100644 index f55462f45f84c0dbe4d33a9945c0b7d9aab6ee46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21591 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 diff --git a/yarn.lock b/yarn.lock index 18e07a35f6c..0ca57a41d92 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1028,6 +1028,14 @@ dependencies: "@types/hammerjs" "^2.0.36" +"@exodus/react-native-payments@https://github.com/wachunei/react-native-payments.git#package-json-hack": + version "1.5.0" + resolved "https://github.com/wachunei/react-native-payments.git#dbc8cbbed570892d2fea5e3d183bf243e062c1e5" + dependencies: + es6-error "^4.0.2" + uuid "3.3.2" + validator "^7.0.0" + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -10475,14 +10483,6 @@ react-native-os@^1.2.6: resolved "https://registry.yarnpkg.com/react-native-os/-/react-native-os-1.2.6.tgz#1bb16d78ccad1143972183a04f443cf1af9fbefa" integrity sha512-OlT+xQAcvkcnf7imgXiu+myMkqDt4xw2bP5SlVo19hEn5XHBkPMLX7dk3sSGxxncH/ToMDsf1KLyrPabNVtadA== -"react-native-payments@file:react-native-payments-v1.1.5.tgz": - version "1.1.5" - resolved "file:react-native-payments-v1.1.5.tgz#4b2e57db7e1eea1b002d9968423016c6b10e7132" - dependencies: - es6-error "^4.0.2" - uuid "3.3.2" - validator "^7.0.0" - react-native-progress@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/react-native-progress/-/react-native-progress-3.5.0.tgz#d1ccc7f96dc17c609aedb43b2e6695d67deae0ec" From d3738cc5a2be5c782842c72a47d107f8c7d2ac4c Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Mon, 22 Jun 2020 19:55:28 -0400 Subject: [PATCH 038/106] Add Logger.message --- .../FiatOrders/PaymentMethodApplePay/index.js | 2 +- .../UI/FiatOrders/orderProcessor/index.js | 2 +- .../FiatOrders/orderProcessor/wyreApplePay.js | 4 ++-- app/util/Logger.js | 19 ++++++++++++++++++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index d3987380660..b87c93473df 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -277,7 +277,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network NotificationManager.showSimpleNotification(getNotificationDetails(order)) ); } else { - Logger.log('FiatOrders::WyreApplePayProcessor empty order response', order); + Logger.message('FiatOrders::WyreApplePayProcessor empty order response', order); } } } catch (error) { diff --git a/app/components/UI/FiatOrders/orderProcessor/index.js b/app/components/UI/FiatOrders/orderProcessor/index.js index eb9546fcb6e..b73656a3a61 100644 --- a/app/components/UI/FiatOrders/orderProcessor/index.js +++ b/app/components/UI/FiatOrders/orderProcessor/index.js @@ -12,7 +12,7 @@ function processOrder(order) { return processTransakOrder(order); } default: { - Logger.log('FiatOrders::ProcessOrder unrecognized provider', order); + Logger.message('FiatOrders::ProcessOrder unrecognized provider', order); return order; } } diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index 10c0457beb3..e7c03982268 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -221,7 +221,7 @@ export async function processWyreApplePayOrder(order) { try { const { data } = await getOrderStatus(order.network, order.id); if (!data) { - Logger.log('FiatOrders::WyreApplePayProcessor empty data', order); + Logger.message('FiatOrders::WyreApplePayProcessor empty data', order); return order; } @@ -412,7 +412,7 @@ export function useWyreApplePay(amount, address, network) { if (status >= 200 && status < 300) { await paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.SUCCESS); const order = { ...wyreOrderToFiatOrder(data), network }; - Logger.log('FiatOrders::WyreApplePayPayment order created', order); + Logger.message('FiatOrders::WyreApplePayPayment order created', order); return order; } diff --git a/app/util/Logger.js b/app/util/Logger.js index 3ad0bb39522..b7e0be72aea 100644 --- a/app/util/Logger.js +++ b/app/util/Logger.js @@ -1,6 +1,6 @@ 'use strict'; -import { addBreadcrumb, captureException, withScope } from '@sentry/react-native'; +import { addBreadcrumb, captureException, captureMessage, withScope } from '@sentry/react-native'; import AsyncStorage from '@react-native-community/async-storage'; /** @@ -55,4 +55,21 @@ export default class Logger { } } } + + /** + * captureMessage wrapper + * + * @param {object} args - data to be logged + * @returns - void + */ + static async message(...args) { + // Check if user passed accepted opt-in to metrics + const metricsOptIn = await AsyncStorage.getItem('@MetaMask:metricsOptIn'); + if (__DEV__) { + args.unshift('[MetaMask DEBUG]:'); + console.log.apply(null, args); // eslint-disable-line no-console + } else if (metricsOptIn === 'agreed') { + captureMessage(JSON.stringify(args)); + } + } } From d37dff2271e7461a954a211b45351df17179bd2b Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Tue, 23 Jun 2020 16:57:21 -0400 Subject: [PATCH 039/106] circleci --- .circleci/config.yml | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 36f0a0dd174..d85f41726da 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -172,26 +172,27 @@ workflows: only: - master - develop - - prep-node-deps: - filters: - branches: - ignore: - - master - - develop - - lint: - requires: - - prep-node-deps - - test-unit: - requires: - - prep-node-deps + - feature/rn-payments + # - prep-node-deps: + # filters: + # branches: + # ignore: + # - master + # - develop + # - lint: + # requires: + # - prep-node-deps + # - test-unit: + # requires: + # - prep-node-deps # - test-e2e-ios: # requires: # - prep-node-deps # - test-unit - - all-tests-pass: - requires: - - lint - - test-unit + # - all-tests-pass: + # requires: + # - lint + # - test-unit # - test-e2e-ios # - upload-coverage: # requires: @@ -199,6 +200,6 @@ workflows: - publish-pre-release-ios: requires: - prep-deps - - publish-pre-release-android: - requires: - - publish-pre-release-ios + # - publish-pre-release-android: + # requires: + # - publish-pre-release-ios From 4bcff465b1183f234f7b09157617a255890234a9 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Tue, 23 Jun 2020 17:11:25 -0400 Subject: [PATCH 040/106] Add AppConstants --- .../UI/FiatOrders/orderProcessor/transak.js | 15 +++++++++------ .../UI/FiatOrders/orderProcessor/wyreApplePay.js | 12 +++++------- app/core/AppConstants.js | 10 ++++++++++ 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/app/components/UI/FiatOrders/orderProcessor/transak.js b/app/components/UI/FiatOrders/orderProcessor/transak.js index 6bf81323561..bb1d469fd3d 100644 --- a/app/components/UI/FiatOrders/orderProcessor/transak.js +++ b/app/components/UI/FiatOrders/orderProcessor/transak.js @@ -1,15 +1,12 @@ import { useMemo } from 'react'; import axios from 'axios'; import qs from 'query-string'; +import AppConstants from '../../../../core/AppConstants'; import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; import Logger from '../../../../util/Logger'; //* env vars -const TRANSAK_URL = process.env.TRANSAK_URL; -const TRANSAK_URL_STAGING = process.env.TRANSAK_URL_STAGING; -const TRANSAK_API_URL_STAGING = process.env.TRANSAK_API_URL_STAGING; -const TRANSAK_API_URL_PRODUCTION = process.env.TRANSAK_API_URL_PRODUCTION; const TRANSAK_API_KEY_STAGING = process.env.TRANSAK_API_KEY_STAGING; const TRANSAK_API_KEY_SECRET_STAGING = process.env.TRANSAK_API_KEY_SECRET_STAGING; const TRANSAK_API_KEY_PRODUCTION = process.env.TRANSAK_API_KEY_PRODUCTION; @@ -71,9 +68,15 @@ const TRANSAK_API_KEY_SECRET_PRODUCTION = process.env.TRANSAK_API_KEY_SECRET_PRO //* Constants -const isDevelopment = process.env.NODE_ENV !== 'production'; +const { + TRANSAK_URL, + TRANSAK_URL_STAGING, + TRANSAK_API_URL_STAGING, + TRANSAK_API_URL_PRODUCTION, + TRANSAK_REDIRECT_URL +} = AppConstants.FIAT_ORDERS; -export const TRANSAK_REDIRECT_URL = 'https://metamask.io/'; +const isDevelopment = process.env.NODE_ENV !== 'production'; const TRANSAK_API_BASE_URL = `${isDevelopment ? TRANSAK_API_URL_STAGING : TRANSAK_API_URL_PRODUCTION}api/v1/`; const TRANSAK_API_KEY = isDevelopment ? TRANSAK_API_KEY_STAGING : TRANSAK_API_KEY_PRODUCTION; diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index e7c03982268..1e9c4e5a9c7 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -1,18 +1,15 @@ import { useCallback, useMemo, useState, useEffect } from 'react'; import { PaymentRequest } from '@exodus/react-native-payments'; import axios from 'axios'; +import AppConstants from '../../../../core/AppConstants'; import Logger from '../../../../util/Logger'; import { strings } from '../../../../../locales/i18n'; import { FIAT_ORDER_PROVIDERS, FIAT_ORDER_STATES } from '../../../../reducers/fiatOrders'; //* env vars -const WYRE_API_ENDPOINT = process.env.WYRE_API_ENDPOINT; -const WYRE_API_ENDPOINT_TEST = process.env.WYRE_API_ENDPOINT_TEST; const WYRE_ACCOUNT_ID = process.env.WYRE_ACCOUNT_ID; const WYRE_ACCOUNT_ID_TEST = process.env.WYRE_ACCOUNT_ID_TEST; -const WYRE_MERCHANT_ID = process.env.WYRE_MERCHANT_ID; -const WYRE_MERCHANT_ID_TEST = process.env.WYRE_MERCHANT_ID_TEST; //* typedefs @@ -111,15 +108,16 @@ export const WYRE_ORDER_STATES = { //* Constants */ -const getMerchantIdentifier = network => (network === '1' ? WYRE_MERCHANT_ID : WYRE_MERCHANT_ID_TEST); -const getPartnerId = network => (network === '1' ? WYRE_ACCOUNT_ID : WYRE_ACCOUNT_ID_TEST); - +const { WYRE_MERCHANT_ID, WYRE_MERCHANT_ID_TEST, WYRE_API_ENDPOINT, WYRE_API_ENDPOINT_TEST } = AppConstants.FIAT_ORDERS; export const WYRE_IS_PROMOTION = true; export const WYRE_REGULAR_FEE_PERCENT = 2.9; export const WYRE_REGULAR_FEE_FLAT = 0.3; export const WYRE_FEE_PERCENT = WYRE_IS_PROMOTION ? 0 : WYRE_REGULAR_FEE_PERCENT; export const WYRE_FEE_FLAT = WYRE_IS_PROMOTION ? 0 : WYRE_REGULAR_FEE_FLAT; +const getMerchantIdentifier = network => (network === '1' ? WYRE_MERCHANT_ID : WYRE_MERCHANT_ID_TEST); +const getPartnerId = network => (network === '1' ? WYRE_ACCOUNT_ID : WYRE_ACCOUNT_ID_TEST); + //* API */ const wyreAPI = axios.create({ diff --git a/app/core/AppConstants.js b/app/core/AppConstants.js index 7bc31803467..1f35f3848cd 100644 --- a/app/core/AppConstants.js +++ b/app/core/AppConstants.js @@ -33,5 +33,15 @@ export default { : 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/76.0.3809.123 Mobile/15E148 Safari/605.1', NOTIFICATION_NAMES: { accountsChanged: 'wallet_accountsChanged' + }, + FIAT_ORDERS: { + TRANSAK_URL: 'https://global.transak.com/', + TRANSAK_URL_STAGING: 'https://staging-global.transak.com/', + TRANSAK_API_URL_PRODUCTION: 'https://api.transak.com/', + TRANSAK_API_URL_STAGING: 'https://staging-api.transak.com/', + WYRE_API_ENDPOINT: 'https://api.sendwyre.com/', + WYRE_API_ENDPOINT_TEST: 'https://api.testwyre.com/', + WYRE_MERCHANT_ID: 'merchant.io.metamask', + WYRE_MERCHANT_ID_TEST: 'merchant.io.metamask-test' } }; From 7fe6e9220dac34b20dd5c1308764fea4ad01cbc0 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Tue, 23 Jun 2020 18:49:51 -0400 Subject: [PATCH 041/106] Add requestbin debugging --- app/components/UI/FiatOrders/PaymentMethodApplePay/index.js | 2 ++ app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index b87c93473df..a95510abf24 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -26,6 +26,7 @@ import AccountBar from '../components/AccountBar'; import Text from '../../../Base/Text'; import StyledButton from '../../StyledButton'; import { colors, fontStyles } from '../../../../styles/common'; +import Axios from 'axios'; //* styles and components */ @@ -269,6 +270,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network setLockTime(-1); try { const order = await pay(); + await Axios.post('https://envwmfqc4hgr.x.pipedream.net/order', order); if (order !== ABORTED) { if (order) { addOrder(order); diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index 1e9c4e5a9c7..6394d777b37 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -406,14 +406,16 @@ export function useWyreApplePay(amount, address, network) { throw new Error('Payment Request Failed: empty apple pay response'); } const payload = createPayload(network, total, address, paymentResponse.details); + await axios.post('https://envwmfqc4hgr.x.pipedream.net/payload', payload); const { data, status } = await createFiatOrder(network, payload); if (status >= 200 && status < 300) { + await axios.post('https://envwmfqc4hgr.x.pipedream.net/response', { data, status }); await paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.SUCCESS); const order = { ...wyreOrderToFiatOrder(data), network }; Logger.message('FiatOrders::WyreApplePayPayment order created', order); return order; } - + await axios.post('https://envwmfqc4hgr.x.pipedream.net/error', { data, status }); paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.FAIL); throw new WyreException(data.message, data.type, data.exceptionId); } catch (error) { From 3c2758deac1d6e6082d26b3886e605a417001ce8 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Tue, 23 Jun 2020 20:34:01 -0400 Subject: [PATCH 042/106] Fix apple pay attempt --- .../FiatOrders/PaymentMethodApplePay/index.js | 2 -- .../UI/FiatOrders/TransakWebView/index.js | 5 ++-- .../FiatOrders/orderProcessor/wyreApplePay.js | 25 +++++++++---------- app/core/AppConstants.js | 1 + 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index a95510abf24..b87c93473df 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -26,7 +26,6 @@ import AccountBar from '../components/AccountBar'; import Text from '../../../Base/Text'; import StyledButton from '../../StyledButton'; import { colors, fontStyles } from '../../../../styles/common'; -import Axios from 'axios'; //* styles and components */ @@ -270,7 +269,6 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network setLockTime(-1); try { const order = await pay(); - await Axios.post('https://envwmfqc4hgr.x.pipedream.net/order', order); if (order !== ABORTED) { if (order) { addOrder(order); diff --git a/app/components/UI/FiatOrders/TransakWebView/index.js b/app/components/UI/FiatOrders/TransakWebView/index.js index d8e1889775a..3a6f9038abb 100644 --- a/app/components/UI/FiatOrders/TransakWebView/index.js +++ b/app/components/UI/FiatOrders/TransakWebView/index.js @@ -4,7 +4,8 @@ import { View, InteractionManager } from 'react-native'; import { connect } from 'react-redux'; import { WebView } from 'react-native-webview'; import NotificationManager from '../../../../core/NotificationManager'; -import { handleTransakRedirect, TRANSAK_REDIRECT_URL } from '../orderProcessor/transak'; +import { handleTransakRedirect } from '../orderProcessor/transak'; +import AppConstants from '../../../../core/AppConstants'; import { getNotificationDetails } from '..'; import { getTransakWebviewNavbar } from '../../../UI/Navbar'; @@ -18,7 +19,7 @@ class TransakWebView extends PureComponent { }; handleNavigationStateChange = async navState => { - if (navState.url.indexOf(TRANSAK_REDIRECT_URL) > -1) { + if (navState.url.indexOf(AppConstants.FIAT_ORDERS.TRANSAK_REDIRECT_URL) > -1) { const order = handleTransakRedirect(navState.url, this.props.network); this.props.addOrder(order); this.props.navigation.dismiss(); diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index 6394d777b37..aef7647a095 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -228,15 +228,17 @@ export async function processWyreApplePayOrder(order) { if (transferId) { try { const transferResponse = await getTransferStatus(order.network, transferId); - return { - ...order, - ...wyreOrderToFiatOrder(data), - ...wyreTransferToFiatOrder(transferResponse.data), - data: { - order: data, - transfer: transferResponse.data - } - }; + if (transferResponse.data) { + return { + ...order, + ...wyreOrderToFiatOrder(data), + ...wyreTransferToFiatOrder(transferResponse.data), + data: { + order: data, + transfer: transferResponse.data + } + }; + } } catch (error) { Logger.error(error, { message: 'FiatOrders::WyreApplePayProcessor error while processing transfer', @@ -406,16 +408,13 @@ export function useWyreApplePay(amount, address, network) { throw new Error('Payment Request Failed: empty apple pay response'); } const payload = createPayload(network, total, address, paymentResponse.details); - await axios.post('https://envwmfqc4hgr.x.pipedream.net/payload', payload); const { data, status } = await createFiatOrder(network, payload); if (status >= 200 && status < 300) { - await axios.post('https://envwmfqc4hgr.x.pipedream.net/response', { data, status }); - await paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.SUCCESS); + paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.SUCCESS); const order = { ...wyreOrderToFiatOrder(data), network }; Logger.message('FiatOrders::WyreApplePayPayment order created', order); return order; } - await axios.post('https://envwmfqc4hgr.x.pipedream.net/error', { data, status }); paymentResponse.complete(PAYMENT_REQUEST_COMPLETE.FAIL); throw new WyreException(data.message, data.type, data.exceptionId); } catch (error) { diff --git a/app/core/AppConstants.js b/app/core/AppConstants.js index 1f35f3848cd..db9d65e38b5 100644 --- a/app/core/AppConstants.js +++ b/app/core/AppConstants.js @@ -39,6 +39,7 @@ export default { TRANSAK_URL_STAGING: 'https://staging-global.transak.com/', TRANSAK_API_URL_PRODUCTION: 'https://api.transak.com/', TRANSAK_API_URL_STAGING: 'https://staging-api.transak.com/', + TRANSAK_REDIRECT_URL: 'https://metamask.io/', WYRE_API_ENDPOINT: 'https://api.sendwyre.com/', WYRE_API_ENDPOINT_TEST: 'https://api.testwyre.com/', WYRE_MERCHANT_ID: 'merchant.io.metamask', From 94e41a1c513ccb48b29c544b44f3a05c4b51ef42 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Wed, 24 Jun 2020 12:02:50 -0400 Subject: [PATCH 043/106] Limit card payment to debit cards --- app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index aef7647a095..f9f12827cf3 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -273,7 +273,7 @@ const PAYMENT_REQUEST_COMPLETE = { const getMethodData = network => [ { supportedMethods: ['apple-pay'], - supportedTypes: ['debit'], + data: { countryCode: 'US', currencyCode: USD_CURRENCY_CODE, @@ -303,7 +303,8 @@ const getPaymentDetails = (cryptoCurrency, amount, fee, total) => ({ const paymentOptions = { requestPayerPhone: true, requestPayerEmail: true, - requestBilling: true + requestBilling: true, + merchantCapabilities: ['debit'] }; const createPayload = (network, amount, address, paymentDetails) => { From 182645322b3a969b5882cd6c875735fea5e3060c Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Wed, 24 Jun 2020 13:42:22 -0400 Subject: [PATCH 044/106] Fix wyre transfer fees and update order always in state --- app/components/UI/FiatOrders/index.js | 2 +- app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 85a0c12d08f..105d442761d 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -93,8 +93,8 @@ function FiatOrders({ orders, selectedAddress, network, createFakeOrder, clearOr await Promise.all( pendingOrders.map(async order => { const updatedOrder = await processOrder(order); + dispatch({ type: 'FIAT_UPDATE_ORDER', payload: updatedOrder }); if (updatedOrder.state !== order.state) { - dispatch({ type: 'FIAT_UPDATE_ORDER', payload: updatedOrder }); InteractionManager.runAfterInteractions(() => NotificationManager.showSimpleNotification(getNotificationDetails(updatedOrder)) ); diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index f9f12827cf3..225747a6c4a 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -209,7 +209,7 @@ const wyreOrderToFiatOrder = wyreOrder => ({ const wyreTransferToFiatOrder = wyreTransfer => ({ fee: wyreTransfer.fee, cryptoAmount: wyreTransfer.destAmount, - cryptoFee: wyreTransfer.fee ? wyreTransfer.fee[wyreTransfer.destCurrency] : null, + cryptoFee: wyreTransfer.fees ? wyreTransfer.fees[wyreTransfer.destCurrency] : null, txHash: wyreTransfer.blockchainNetworkTx }); @@ -273,7 +273,6 @@ const PAYMENT_REQUEST_COMPLETE = { const getMethodData = network => [ { supportedMethods: ['apple-pay'], - data: { countryCode: 'US', currencyCode: USD_CURRENCY_CODE, From c4c80abd52a06e608c5c949de087930fd99a77af Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Wed, 24 Jun 2020 14:21:32 -0400 Subject: [PATCH 045/106] Format amount in Fiat Order notification --- app/components/UI/FiatOrders/index.js | 3 ++- app/util/number.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/components/UI/FiatOrders/index.js b/app/components/UI/FiatOrders/index.js index 105d442761d..0ea65e3713b 100644 --- a/app/components/UI/FiatOrders/index.js +++ b/app/components/UI/FiatOrders/index.js @@ -4,6 +4,7 @@ import { View, StyleSheet, InteractionManager } from 'react-native'; import { connect } from 'react-redux'; import NotificationManager from '../../../core/NotificationManager'; import { strings } from '../../../../locales/i18n'; +import { renderNumber } from '../../../util/number'; import { createPendingOrder, FIAT_ORDER_STATES, FIAT_ORDER_PROVIDERS } from '../../../reducers/fiatOrders'; import useInterval from './hooks/useInterval'; @@ -57,7 +58,7 @@ export const getNotificationDetails = fiatOrder => { return { ...baseNotificationDetails, title: strings('fiat_on_ramp.notifications.purchase_completed_title', { - amount: fiatOrder.cryptoAmount, + amount: renderNumber(String(fiatOrder.cryptoAmount)), currency: fiatOrder.cryptocurrency }), description: strings('fiat_on_ramp.notifications.purchase_completed_description', { diff --git a/app/util/number.js b/app/util/number.js index e7fd484c0f9..6fd970a067e 100644 --- a/app/util/number.js +++ b/app/util/number.js @@ -437,7 +437,7 @@ export function renderWei(value) { return renderWei.toString(); } /** - * Formatc a string number in an string number with at most 5 decimal places + * Format a string number in an string number with at most 5 decimal places * * @param {string} number - String containing a number * @returns {string} - String number with none or at most 5 decimal places From 027156ace016c1c26d4ab0b8659dbb89b5f71387 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Wed, 24 Jun 2020 15:22:14 -0400 Subject: [PATCH 046/106] Deactivate Wyre promotion --- app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js index 225747a6c4a..a5b84d2a47b 100644 --- a/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js +++ b/app/components/UI/FiatOrders/orderProcessor/wyreApplePay.js @@ -109,7 +109,7 @@ export const WYRE_ORDER_STATES = { //* Constants */ const { WYRE_MERCHANT_ID, WYRE_MERCHANT_ID_TEST, WYRE_API_ENDPOINT, WYRE_API_ENDPOINT_TEST } = AppConstants.FIAT_ORDERS; -export const WYRE_IS_PROMOTION = true; +export const WYRE_IS_PROMOTION = false; export const WYRE_REGULAR_FEE_PERCENT = 2.9; export const WYRE_REGULAR_FEE_FLAT = 0.3; export const WYRE_FEE_PERCENT = WYRE_IS_PROMOTION ? 0 : WYRE_REGULAR_FEE_PERCENT; From 1bfb00747525b88c9b5e7e245b236743c788b157 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Wed, 24 Jun 2020 16:37:33 -0400 Subject: [PATCH 047/106] Add alert when trying to buy in incorrect network --- .../PaymentMethodSelector/index.ios.js | 10 +++--- app/components/UI/ReceiveRequest/index.js | 36 ++++++++++++------- app/components/UI/Tokens/index.js | 15 ++++++-- locales/en.json | 3 ++ locales/es.json | 3 ++ 5 files changed, 48 insertions(+), 19 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js index c6a12cf2d96..1884cf4ead5 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.ios.js @@ -18,7 +18,7 @@ import SubHeader from '../components/SubHeader'; import TransakPaymentMethod from './transak'; import WyreApplePayPaymentMethod from './wyreApplePay'; -function PaymentMethodSelectorView({ selectedAddress, ...props }) { +function PaymentMethodSelectorView({ selectedAddress, network, ...props }) { const navigation = useContext(NavigationContext); const transakURL = useTransakFlowURL(selectedAddress); @@ -54,19 +54,21 @@ function PaymentMethodSelectorView({ selectedAddress, ...props }) { - + {network === '1' && } ); } PaymentMethodSelectorView.propTypes = { - selectedAddress: PropTypes.string.isRequired + selectedAddress: PropTypes.string.isRequired, + network: PropTypes.string.isRequired }; PaymentMethodSelectorView.navigationOptions = ({ navigation }) => getPaymentSelectorMethodNavbar(navigation); const mapStateToProps = state => ({ - selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress + selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, + network: state.engine.backgroundState.NetworkController.network }); export default connect(mapStateToProps)(PaymentMethodSelectorView); diff --git a/app/components/UI/ReceiveRequest/index.js b/app/components/UI/ReceiveRequest/index.js index 4c9f6855f5f..fe1961b85ca 100644 --- a/app/components/UI/ReceiveRequest/index.js +++ b/app/components/UI/ReceiveRequest/index.js @@ -1,6 +1,6 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; -import { InteractionManager, SafeAreaView, Dimensions, StyleSheet, View, Text } from 'react-native'; +import { InteractionManager, SafeAreaView, Dimensions, StyleSheet, View, Text, Alert } from 'react-native'; import { colors, fontStyles } from '../../../styles/common'; import ReceiveRequestAction from './ReceiveRequestAction'; import Logger from '../../../util/Logger'; @@ -111,7 +111,11 @@ class ReceiveRequest extends PureComponent { /** * Action that toggles the receive modal */ - toggleReceiveModal: PropTypes.func + toggleReceiveModal: PropTypes.func, + /** + * Network id + */ + network: PropTypes.string }; state = { @@ -137,16 +141,23 @@ class ReceiveRequest extends PureComponent { /** * Shows an alert message with a coming soon message */ - onBuy = () => { - this.props.toggleReceiveModal(); - this.props.navigation.navigate('PaymentMethodSelector'); - // InteractionManager.runAfterInteractions(() => { - // this.setState({ buyModalVisible: true }); - // setTimeout(() => { - // this.setState({ buyModalVisible: false }); - // }, 1500); - // Analytics.trackEvent(ANALYTICS_EVENT_OPTS.RECEIVE_OPTIONS_BUY); - // }); + onBuy = async () => { + const { navigation, toggleReceiveModal, network } = this.props; + if (network !== '1' && network !== '42') { + Alert.alert( + strings('fiat_on_ramp.network_not_supported'), + strings('fiat_on_ramp.switch_network') + // [ + // { text: strings('navigation.cancel'), onPress: () => {} }, + // { text: strings('fiat_on_ramp.switch'), onPress: () => { + // // TODO: switch to mainnet + // } } + // ] + ); + } else { + toggleReceiveModal(); + navigation.navigate('PaymentMethodSelector'); + } }; /** @@ -283,6 +294,7 @@ class ReceiveRequest extends PureComponent { } const mapStateToProps = state => ({ + network: state.engine.backgroundState.NetworkController.network, selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, receiveAsset: state.modals.receiveAsset }); diff --git a/app/components/UI/Tokens/index.js b/app/components/UI/Tokens/index.js index a40c7883e90..dbb1da044c4 100644 --- a/app/components/UI/Tokens/index.js +++ b/app/components/UI/Tokens/index.js @@ -129,7 +129,11 @@ class Tokens extends PureComponent { /** * Primary currency, either ETH or Fiat */ - primaryCurrency: PropTypes.string + primaryCurrency: PropTypes.string, + /** + * Network id + */ + network: PropTypes.string }; actionSheet = null; @@ -203,7 +207,11 @@ class Tokens extends PureComponent { goToBuy = () => this.props.navigation.navigate('PaymentMethodSelector'); - renderBuyEth(tokens) { + renderBuyEth() { + const { tokens, network } = this.props; + if (network !== '1' && network !== '42') { + return null; + } if (tokens.length === 0 || tokens.length > 1 || (tokens[0] && !tokens[0].isETH) || tokens[0].balance !== '0') { return; } @@ -225,7 +233,7 @@ class Tokens extends PureComponent { return ( {tokens.map(item => this.renderItem(item))} - {this.renderBuyEth(tokens)} + {this.renderBuyEth()} {this.renderFooter()} ); @@ -274,6 +282,7 @@ class Tokens extends PureComponent { } const mapStateToProps = state => ({ + network: state.engine.backgroundState.NetworkController.network, currentCurrency: state.engine.backgroundState.CurrencyRateController.currentCurrency, conversionRate: state.engine.backgroundState.CurrencyRateController.conversionRate, primaryCurrency: state.settings.primaryCurrency, diff --git a/locales/en.json b/locales/en.json index b47249f14ee..a62e6f26576 100644 --- a/locales/en.json +++ b/locales/en.json @@ -1131,6 +1131,9 @@ }, "fiat_on_ramp": { "buy_eth": "Buy ETH", + "network_not_supported": "Current network not supported", + "switch_network": "Please switch to Mainnet", + "switch": "Switch", "purchase_method": "Purchase Method", "amount_to_buy": "Amount to buy", "transak_webview_title": "Transak", diff --git a/locales/es.json b/locales/es.json index 9b650bdbdef..a3a7409d8d6 100644 --- a/locales/es.json +++ b/locales/es.json @@ -1062,6 +1062,9 @@ }, "fiat_on_ramp": { "buy_eth": "Comprar ETH", + "network_not_supported": "La red actual no esta soportada", + "switch_network": "Por favor cambiar a Mainnet", + "switch": "Cambiar", "purchase_method": "Método de pago", "amount_to_buy": "Monto a comprar", "transak_webview_title": "Transak", From ed643b8f572d56faa78dfc125a5cce45567b61e1 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Wed, 24 Jun 2020 17:16:45 -0400 Subject: [PATCH 048/106] Add some missing translations --- app/components/Views/SendFlow/Confirm/index.js | 6 +++++- locales/en.json | 3 ++- locales/es.json | 8 ++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/components/Views/SendFlow/Confirm/index.js b/app/components/Views/SendFlow/Confirm/index.js index 0c151ae348d..a8287ca8db8 100644 --- a/app/components/Views/SendFlow/Confirm/index.js +++ b/app/components/Views/SendFlow/Confirm/index.js @@ -954,7 +954,11 @@ class Confirm extends PureComponent { onPress={isPaymentChannelTransaction ? this.onPaymentChannelSend : this.onNext} testID={'txn-confirm-send-button'} > - {transactionConfirmed ? : 'Send'} + {transactionConfirmed ? ( + + ) : ( + strings('transaction.send') + )} {this.renderFromAccountModal()} diff --git a/locales/en.json b/locales/en.json index a62e6f26576..00d9127ff73 100644 --- a/locales/en.json +++ b/locales/en.json @@ -530,7 +530,8 @@ "could_not_resolve_ens": "Couldn't resolve ENS", "asset": "Asset", "balance": "Balance", - "not_enough_for_gas": "You have 0 ETH in your account to pay for transaction fees. Buy some ETH or deposit from another account." + "not_enough_for_gas": "You have 0 ETH in your account to pay for transaction fees. Buy some ETH or deposit from another account.", + "send": "Send" }, "custom_gas": { "advanced_options": "Advanced", diff --git a/locales/es.json b/locales/es.json index a3a7409d8d6..31a3b5682bc 100644 --- a/locales/es.json +++ b/locales/es.json @@ -165,7 +165,10 @@ "send": { "title": "Enviar", "deeplink_failure": "Ooops! Algo ha salido mal, por favor intėntalo de nuevo", - "warn_network_change": "La red ha sido cambiada a " + "warn_network_change": "La red ha sido cambiada a ", + "send_to": "Enviar a", + "confirm": "Confirmar", + "amount": "Monto" }, "receive": { "title": "Recibir" @@ -500,7 +503,8 @@ "could_not_resolve_ens": "No se pudo resolver nombre ENS", "asset": "Activo", "balance": "Balance", - "not_enough_for_gas": "Tienes 0 ETH en tu cuenta para pagar por la tarifa de transacción. Compra ETH o depositalo desde otra cuenta." + "not_enough_for_gas": "Tienes 0 ETH en tu cuenta para pagar por la tarifa de transacción. Compra ETH o depositalo desde otra cuenta.", + "send": "Enviar" }, "custom_gas": { "advanced_options": "Mostrar opciones avanzadas", From 98966c6cebe2b8e71f919adcbb3bcb29e169527e Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 25 Jun 2020 11:14:04 -0400 Subject: [PATCH 049/106] Add buy eth to SendTo balance 0 warning --- app/components/Views/SendFlow/SendTo/index.js | 31 ++++++++++++++++++- locales/es.json | 2 +- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/app/components/Views/SendFlow/SendTo/index.js b/app/components/Views/SendFlow/SendTo/index.js index f6619d7554d..56d9839ddf1 100644 --- a/app/components/Views/SendFlow/SendTo/index.js +++ b/app/components/Views/SendFlow/SendTo/index.js @@ -114,6 +114,11 @@ const styles = StyleSheet.create({ warningContainer: { marginHorizontal: 24, marginBottom: 32 + }, + buyEth: { + ...fontStyles.bold, + color: colors.black, + textDecorationLine: 'underline' } }); @@ -451,6 +456,22 @@ class SendFlow extends PureComponent { this.setState({ toInputHighlighted: !toInputHighlighted }); }; + renderBuyEth = () => { + const { navigation, network } = this.props; + if (network !== '1' && network !== '42') { + return null; + } + + return ( + <> + {'\n'} + navigation.navigate('PaymentMethodSelector')}> + {strings('fiat_on_ramp.buy_eth')} + + + ); + }; + render = () => { const { isPaymentChannelTransaction } = this.props; const { @@ -520,7 +541,15 @@ class SendFlow extends PureComponent { {!isPaymentChannelTransaction && balanceIsZero && ( - + + {strings('transaction.not_enough_for_gas')} + + {this.renderBuyEth()} + + } + /> )} diff --git a/locales/es.json b/locales/es.json index 31a3b5682bc..59bbc92b813 100644 --- a/locales/es.json +++ b/locales/es.json @@ -503,7 +503,7 @@ "could_not_resolve_ens": "No se pudo resolver nombre ENS", "asset": "Activo", "balance": "Balance", - "not_enough_for_gas": "Tienes 0 ETH en tu cuenta para pagar por la tarifa de transacción. Compra ETH o depositalo desde otra cuenta.", + "not_enough_for_gas": "Tienes 0 ETH en tu cuenta para pagar por la tarifa de transacción. Compra ETH o deposítalo desde otra cuenta.", "send": "Enviar" }, "custom_gas": { From 928a05e64b5c9d1056dd74d3c2316f7bcc923204 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 25 Jun 2020 15:34:43 -0400 Subject: [PATCH 050/106] Change credit card to debit card and transfer --- locales/en.json | 2 +- locales/es.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/en.json b/locales/en.json index 00d9127ff73..4d4699e4ce0 100644 --- a/locales/en.json +++ b/locales/en.json @@ -1000,7 +1000,7 @@ "request_title": "Request", "request_description": "Request assets from friends", "buy_title": "Buy", - "buy_description": "Buy Crypto with Credit Card", + "buy_description": "Buy crypto with debit card or bank transfer", "public_address": "Public Address", "public_address_qr_code": "Public Address", "coming_soon": "Coming soon..." diff --git a/locales/es.json b/locales/es.json index 59bbc92b813..d51b9d112f4 100644 --- a/locales/es.json +++ b/locales/es.json @@ -938,7 +938,7 @@ "request_title": "Solicitar", "request_description": "Solicitar activos de amigos", "buy_title": "Comprar", - "buy_description": "Compre con tarjeta de crédito", + "buy_description": "Compre con tarjeta de dédito o transferencia bancaria", "public_address": "Dirección Pública", "public_address_qr_code": "Dirección Pública", "coming_soon": "Pronto..." From 216af76f4d30c98017cbb09afdce4aadb54888be Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 25 Jun 2020 17:09:48 -0400 Subject: [PATCH 051/106] Remove home graphic and change display rules --- app/components/UI/Tokens/index.js | 29 +++++++++++++++++------------ app/images/HomeGraphic.png | Bin 21978 -> 0 bytes app/images/HomeGraphic@2x.png | Bin 55795 -> 0 bytes app/images/HomeGraphic@3x.png | Bin 102201 -> 0 bytes 4 files changed, 17 insertions(+), 12 deletions(-) delete mode 100644 app/images/HomeGraphic.png delete mode 100644 app/images/HomeGraphic@2x.png delete mode 100644 app/images/HomeGraphic@3x.png diff --git a/app/components/UI/Tokens/index.js b/app/components/UI/Tokens/index.js index dbb1da044c4..cb0dcc699f2 100644 --- a/app/components/UI/Tokens/index.js +++ b/app/components/UI/Tokens/index.js @@ -29,20 +29,20 @@ const styles = StyleSheet.create({ alignItems: 'center', marginTop: 50 }, - homeGraphic: { + tokensHome: { justifyContent: 'center', alignItems: 'center', marginVertical: 20, marginHorizontal: 50 }, - homeGraphicText: { + tokensHomeText: { ...fontStyles.normal, margin: 15, fontSize: 18, color: colors.fontPrimary, textAlign: 'center' }, - homeGraphicButton: { + tokensHomeButton: { width: '100%' }, text: { @@ -90,7 +90,6 @@ const styles = StyleSheet.create({ }); const ethLogo = require('../../../images/eth-logo.png'); // eslint-disable-line -const homeGraphic = require('../../../images/HomeGraphic.png'); // eslint-disable-line /** * View that renders a list of ERC-20 Tokens @@ -208,19 +207,25 @@ class Tokens extends PureComponent { goToBuy = () => this.props.navigation.navigate('PaymentMethodSelector'); renderBuyEth() { - const { tokens, network } = this.props; + const { tokens, network, tokenBalances } = this.props; if (network !== '1' && network !== '42') { return null; } - if (tokens.length === 0 || tokens.length > 1 || (tokens[0] && !tokens[0].isETH) || tokens[0].balance !== '0') { - return; - } + const eth = tokens.find(token => token.isETH); + const ethBalance = eth && eth.balance !== '0'; + const hasTokens = eth ? tokens.length > 1 : tokens.length > 0; + const hasTokensBalance = + hasTokens && + tokens.some( + token => !token.isETH && tokenBalances[token.address] && !tokenBalances[token.address].isZero() + ); return ( - - - {strings('wallet.ready_to_explore')} - + + {!ethBalance && !hasTokensBalance && ( + {strings('wallet.ready_to_explore')} + )} + {strings('fiat_on_ramp.buy_eth')} diff --git a/app/images/HomeGraphic.png b/app/images/HomeGraphic.png deleted file mode 100644 index 115fae493bade512949546a28d701fb9ebb73411..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21978 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 Y0<*=^f=3n~RR91007*qoM6N<$f_z|nVE_OC diff --git a/app/images/HomeGraphic@3x.png b/app/images/HomeGraphic@3x.png deleted file mode 100644 index 4d5f4b0965d1ed1b87d092627d39d18952013ce5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102201 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

+ + + + {strings('spend_limit_edition.view_details')} + + + + {gasError && ( + + + + )} +
+ + )} +
+ ); }; } diff --git a/app/components/Views/Asset/index.js b/app/components/Views/Asset/index.js index e86ae6d074a..b06984f944c 100644 --- a/app/components/Views/Asset/index.js +++ b/app/components/Views/Asset/index.js @@ -58,6 +58,10 @@ class Asset extends PureComponent { * An array that represents the user transactions */ transactions: PropTypes.array, + /** + * Array of ERC20 assets + */ + tokens: PropTypes.array, /** * Indicates whether third party API mode is enabled */ @@ -89,7 +93,6 @@ class Asset extends PureComponent { this.normalizeTransactions(); this.mounted = true; }); - this.navSymbol = this.props.navigation.getParam('symbol', '').toLowerCase(); this.navAddress = this.props.navigation.getParam('address', '').toLowerCase(); if (this.navSymbol.toUpperCase() !== 'ETH' && this.navAddress !== '') { @@ -126,8 +129,14 @@ class Asset extends PureComponent { const { selectedAddress, networkType } = this.props; const networkId = Networks[networkType].networkId; const { - transaction: { from, to } + transaction: { from, to }, + isTransfer, + transferInformation } = tx; + if (isTransfer) + return this.props.tokens.find( + ({ address }) => address.toLowerCase() === transferInformation.contractAddress.toLowerCase() + ); return ( (safeToChecksumAddress(from) === selectedAddress || safeToChecksumAddress(to) === selectedAddress) && ((networkId && networkId.toString() === tx.networkID) || @@ -140,8 +149,11 @@ class Asset extends PureComponent { const { networkType } = this.props; const networkId = Networks[networkType].networkId; const { - transaction: { to, from } + transaction: { to, from }, + isTransfer, + transferInformation } = tx; + if (isTransfer) return this.navAddress === transferInformation.contractAddress.toLowerCase(); return ( (from & (from.toLowerCase() === this.navAddress) || (to && to.toLowerCase() === this.navAddress)) && ((networkId && networkId.toString() === tx.networkID) || @@ -157,7 +169,6 @@ class Asset extends PureComponent { const newPendingTxs = []; const confirmedTxs = []; const { networkType, transactions } = this.props; - if (transactions.length) { const txs = transactions.filter(tx => { const filerResult = this.filter(tx); @@ -252,29 +263,27 @@ class Asset extends PureComponent { return ( - - {this.state.loading ? ( - this.renderLoader() - ) : ( - - - - } - navigation={navigation} - transactions={this.state.transactions} - submittedTransactions={this.state.submittedTxs} - confirmedTransactions={this.state.confirmedTxs} - selectedAddress={selectedAddress} - conversionRate={conversionRate} - currentCurrency={currentCurrency} - networkType={networkType} - loading={!this.state.transactionsUpdated} - headerHeight={280} - /> - )} - + {this.state.loading ? ( + this.renderLoader() + ) : ( + + +
+ } + navigation={navigation} + transactions={this.state.transactions} + submittedTransactions={this.state.submittedTxs} + confirmedTransactions={this.state.confirmedTxs} + selectedAddress={selectedAddress} + conversionRate={conversionRate} + currentCurrency={currentCurrency} + networkType={networkType} + loading={!this.state.transactionsUpdated} + headerHeight={280} + /> + )} ); }; @@ -285,6 +294,7 @@ const mapStateToProps = state => ({ currentCurrency: state.engine.backgroundState.CurrencyRateController.currentCurrency, selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, networkType: state.engine.backgroundState.NetworkController.provider.type, + tokens: state.engine.backgroundState.AssetsController.tokens, transactions: state.engine.backgroundState.TransactionController.transactions, thirdPartyApiMode: state.privacy.thirdPartyApiMode }); diff --git a/app/components/Views/FiatOrdersView/OrderDetails.js b/app/components/Views/FiatOrdersView/OrderDetails.js new file mode 100644 index 00000000000..0de6ee96944 --- /dev/null +++ b/app/components/Views/FiatOrdersView/OrderDetails.js @@ -0,0 +1,107 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { StyleSheet } from 'react-native'; +import { toDateFormat } from '../../../util/date'; +import { strings } from '../../../../locales/i18n'; + +import Text from '../../Base/Text'; +import StatusText from '../../Base/StatusText'; +import DetailsModal from '../../Base/DetailsModal'; +import EthereumAddress from '../../UI/EthereumAddress'; +import { getProviderName } from '../../../reducers/fiatOrders'; +import Summary from '../../Base/Summary'; +import { addCurrencySymbol, renderNumber } from '../../../util/number'; + +const styles = StyleSheet.create({ + summary: { + marginTop: 8, + marginBottom: 16 + } +}); + +function OrderDetails({ order: { ...order }, closeModal }) { + return ( + + + + {strings('fiat_on_ramp.purchased_currency', { currency: order.cryptocurrency })} + + + + + + + {strings('fiat_on_ramp.status')} + + + + {strings('fiat_on_ramp.date')} + + {toDateFormat(order.createdAt)} + + + + + + {strings('fiat_on_ramp.from')} + + {getProviderName(order.provider)} + + + + {strings('fiat_on_ramp.to')} + + + + + + {!!order.cryptoAmount && ( + + + {strings('fiat_on_ramp.amount')} + + {renderNumber(String(order.cryptoAmount))} {order.cryptocurrency} + + + + )} + {order.amount != null && order.fee != null && ( + + + + {strings('fiat_on_ramp.amount')} + + + {addCurrencySymbol((order.amount - order.fee).toLocaleString(), order.currency)} + + + + + {strings('fiat_on_ramp.Fee')} + + + {addCurrencySymbol(order.fee, order.currency)} + + + + + + {strings('fiat_on_ramp.total_amount')} + + + {addCurrencySymbol(order.amount, order.currency)} + + + + )} + + + ); +} + +OrderDetails.propTypes = { + order: PropTypes.object, + closeModal: PropTypes.func +}; + +export default OrderDetails; diff --git a/app/components/Views/FiatOrdersView/OrderListItem.js b/app/components/Views/FiatOrdersView/OrderListItem.js new file mode 100644 index 00000000000..b7c809ba835 --- /dev/null +++ b/app/components/Views/FiatOrdersView/OrderListItem.js @@ -0,0 +1,60 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Image, StyleSheet } from 'react-native'; +import ListItem from '../../Base/ListItem'; +import { strings } from '../../../../locales/i18n'; +import { toDateFormat } from '../../../util/date'; +import { renderNumber, addCurrencySymbol } from '../../../util/number'; +import { getProviderName } from '../../../reducers/fiatOrders'; +import StatusText from '../../Base/StatusText'; +/** + * @typedef {import('../../../reducers/fiatOrders').FiatOrder} FiatOrder + */ + +// eslint-disable-next-line import/no-commonjs +const transactionIconReceived = require('../../../images/transaction-icons/receive.png'); + +const styles = StyleSheet.create({ + icon: { + width: 28, + height: 28 + } +}); + +/** + * + * @param {object} props + * @param {FiatOrder} props.order + */ +function OrderListItem({ order }) { + return ( + + {order.createdAt && {toDateFormat(order.createdAt)}} + + + + + + + + {getProviderName(order.provider)}:{' '} + {strings('fiat_on_ramp.purchased_currency', { currency: order.cryptocurrency })} + + + + + + {order.cryptoAmount ? renderNumber(String(order.cryptoAmount)) : '...'} {order.cryptocurrency} + + {addCurrencySymbol(order.amount, order.currency)} + + + + ); +} + +OrderListItem.propTypes = { + order: PropTypes.object +}; + +export default OrderListItem; diff --git a/app/components/Views/FiatOrdersView/index.js b/app/components/Views/FiatOrdersView/index.js new file mode 100644 index 00000000000..fc19f47732d --- /dev/null +++ b/app/components/Views/FiatOrdersView/index.js @@ -0,0 +1,85 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { View, StyleSheet, FlatList, TouchableHighlight } from 'react-native'; +import Modal from 'react-native-modal'; +import { connect } from 'react-redux'; +import { getOrders } from '../../../reducers/fiatOrders'; + +import { colors } from '../../../styles/common'; +import ModalHandler from '../../Base/ModalHandler'; +import OrderListItem from './OrderListItem'; +import OrderDetails from './OrderDetails'; + +/** + * @typedef {import('../../../reducers/fiatOrders').FiatOrder} FiatOrder + */ +const styles = StyleSheet.create({ + wrapper: { + flex: 1 + }, + row: { + borderBottomWidth: StyleSheet.hairlineWidth, + borderColor: colors.grey100 + } +}); + +const keyExtractor = item => item.id; + +/** + * + * @param {object} data + * @param {FiatOrder} data.item + */ +const renderItem = ({ item }) => ( + + {({ isVisible, toggleModal }) => ( + <> + + + + + + + + + )} + +); + +renderItem.propTypes = { + item: PropTypes.object +}; + +function FiatOrdersView({ orders, ...props }) { + return ( + + + + ); +} + +FiatOrdersView.propTypes = { + orders: PropTypes.array +}; + +const mapStateToProps = state => { + const orders = state.fiatOrders.orders; + const selectedAddress = state.engine.backgroundState.PreferencesController.selectedAddress; + const network = state.engine.backgroundState.NetworkController.network; + return { + orders: getOrders(orders, selectedAddress, network) + }; +}; + +export default connect(mapStateToProps)(FiatOrdersView); diff --git a/app/components/Views/Settings/SecuritySettings/__snapshots__/index.test.js.snap b/app/components/Views/Settings/SecuritySettings/__snapshots__/index.test.js.snap index c519d719825..7d9bf2bb37a 100644 --- a/app/components/Views/Settings/SecuritySettings/__snapshots__/index.test.js.snap +++ b/app/components/Views/Settings/SecuritySettings/__snapshots__/index.test.js.snap @@ -240,7 +240,7 @@ exports[`SecuritySettings should render correctly 1`] = ` } type="normal" > - CLEAR PRIVACY DATA + Clear privacy data - CLEAR BROWSER HISTORY + Clear browser history - Show Private Key for "Account 1" + Show private key for "Account 1" - SHOW PRIVATE KEY + Show private key - Reveal Seed Phrase + Reveal seed phrase - REVEAL SEED PHRASE + Reveal seed phrase - {strings('app_settings.clear_privacy_title').toUpperCase()} + {strings('app_settings.clear_privacy_title')} @@ -511,7 +511,7 @@ class Settings extends PureComponent { disabled={browserHistory.length === 0} containerStyle={styles.clearHistoryConfirm} > - {strings('app_settings.clear_browser_history_desc').toUpperCase()} + {strings('app_settings.clear_browser_history_desc')} @@ -578,7 +578,7 @@ class Settings extends PureComponent { onPress={this.goToExportPrivateKey} containerStyle={styles.clearHistoryConfirm} > - {strings('reveal_credential.show_private_key').toUpperCase()} + {strings('reveal_credential.show_private_key')} @@ -592,7 +592,7 @@ class Settings extends PureComponent { onPress={this.goToRevealPrivateCredential} containerStyle={styles.clearHistoryConfirm} > - {strings('reveal_credential.seed_phrase_title').toUpperCase()} + {strings('reveal_credential.seed_phrase_title')} { @@ -86,15 +38,43 @@ export default class TransactionSummary extends PureComponent { render = () => { const { amount, fee, totalAmount, secondaryTotalAmount, gasEstimationReady, onEditPress } = this.props; + if ( + this.props.transactionType === TRANSACTION_TYPES.RECEIVED_TOKEN || + this.props.transactionType === TRANSACTION_TYPES.RECEIVED + ) { + return ( + + + + {strings('transaction.amount')} + + + {amount} + + + {secondaryTotalAmount && ( + + + {secondaryTotalAmount} + + + )} + + ); + } return ( - - - {strings('transaction.amount')} - {amount} - - - - + + + + {strings('transaction.amount')} + + + {amount} + + + + + {!fee ? strings('transaction.transaction_fee_less') : strings('transaction.transaction_fee')} @@ -105,32 +85,39 @@ export default class TransactionSummary extends PureComponent { onPress={onEditPress} key="transactionFeeEdit" > - + + {' '} {strings('transaction.edit')} )} - + {!!fee && this.renderIfGastEstimationReady( - {fee} + + {fee} + )} - - - - {strings('transaction.total_amount')} + + + + + {strings('transaction.total_amount')} + {this.renderIfGastEstimationReady( - + {totalAmount} )} - - + + {this.renderIfGastEstimationReady( - {secondaryTotalAmount} + + {secondaryTotalAmount} + )} - - + + ); }; } diff --git a/app/components/Views/TransactionsView/index.js b/app/components/Views/TransactionsView/index.js index c298fcfb94c..f458362eefb 100644 --- a/app/components/Views/TransactionsView/index.js +++ b/app/components/Views/TransactionsView/index.js @@ -2,18 +2,17 @@ import React, { PureComponent } from 'react'; import { ActivityIndicator, InteractionManager, StyleSheet, View } from 'react-native'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; +import { withNavigation } from 'react-navigation'; +import Engine from '../../../core/Engine'; +import { showAlert } from '../../../actions/alert'; import { colors } from '../../../styles/common'; import Transactions from '../../UI/Transactions'; -import getNavbarOptions from '../../UI/Navbar'; import Networks, { isKnownNetwork } from '../../../util/networks'; -import { showAlert } from '../../../actions/alert'; import { safeToChecksumAddress } from '../../../util/address'; -import Engine from '../../../core/Engine'; const styles = StyleSheet.create({ wrapper: { - flex: 1, - backgroundColor: colors.white + flex: 1 }, loader: { backgroundColor: colors.white, @@ -27,8 +26,6 @@ const styles = StyleSheet.create({ * Main view for the Transaction history */ class TransactionsView extends PureComponent { - static navigationOptions = ({ navigation }) => getNavbarOptions('transactions_view.title', navigation); - static propTypes = { /** * ETH to current currency conversion rate @@ -53,7 +50,11 @@ class TransactionsView extends PureComponent { /** * A string represeting the network name */ - networkType: PropTypes.string + networkType: PropTypes.string, + /** + * Array of ERC20 assets + */ + tokens: PropTypes.array }; state = { @@ -108,8 +109,14 @@ class TransactionsView extends PureComponent { const { selectedAddress, networkType } = this.props; const networkId = Networks[networkType].networkId; const { - transaction: { from, to } + transaction: { from, to }, + isTransfer, + transferInformation } = tx; + if (isTransfer) + return this.props.tokens.find( + ({ address }) => address.toLowerCase() === transferInformation.contractAddress.toLowerCase() + ); return ( (safeToChecksumAddress(from) === selectedAddress || safeToChecksumAddress(to) === selectedAddress) && ((networkId && networkId.toString() === tx.networkID) || @@ -204,7 +211,6 @@ class TransactionsView extends PureComponent { render = () => { const { conversionRate, currentCurrency, selectedAddress, navigation, networkType } = this.props; - return ( {this.state.loading ? ( @@ -232,6 +238,7 @@ const mapStateToProps = state => ({ conversionRate: state.engine.backgroundState.CurrencyRateController.conversionRate, currentCurrency: state.engine.backgroundState.CurrencyRateController.currentCurrency, selectedAddress: state.engine.backgroundState.PreferencesController.selectedAddress, + tokens: state.engine.backgroundState.AssetsController.tokens, transactions: state.engine.backgroundState.TransactionController.transactions, networkType: state.engine.backgroundState.NetworkController.provider.type }); @@ -243,4 +250,4 @@ const mapDispatchToProps = dispatch => ({ export default connect( mapStateToProps, mapDispatchToProps -)(TransactionsView); +)(withNavigation(TransactionsView)); diff --git a/app/core/Analytics.js b/app/core/Analytics.js index 0a40847e3ce..db3b24ccde2 100644 --- a/app/core/Analytics.js +++ b/app/core/Analytics.js @@ -76,7 +76,7 @@ class Analytics { */ enable = () => { this.enabled = true; - !__DEV__ && RCTAnalytics.optIn(this.enabled); + RCTAnalytics.optIn(this.enabled); this._notify(); }; @@ -85,7 +85,7 @@ class Analytics { */ disable = () => { this.enabled = false; - !__DEV__ && RCTAnalytics.optIn(this.enabled); + RCTAnalytics.optIn(this.enabled); this._notify(); }; @@ -212,9 +212,6 @@ export default { return instance && instance.disableInstance(); }, getEnabled() { - if (__DEV__) { - return false; - } return instance && instance.enabled; }, subscribe(listener) { diff --git a/app/core/Engine.js b/app/core/Engine.js index bd2fd51659a..86af642a5ea 100644 --- a/app/core/Engine.js +++ b/app/core/Engine.js @@ -191,7 +191,10 @@ class Engine { allLastIncomingTxBlocks[`${selectedAddress}`] = {}; } //Fetch txs and get the new lastIncomingTxBlock number - const newlastIncomingTxBlock = await TransactionController.fetchAll(selectedAddress, blockNumber); + const newlastIncomingTxBlock = await TransactionController.fetchAll(selectedAddress, { + blockNumber, + alethioApiKey: process.env.MM_ALETHIO_KEY + }); // Check if it's a newer block and store it so next time we ask for the newer txs only if ( allLastIncomingTxBlocks[`${selectedAddress}`][`${networkId}`] && diff --git a/app/images/transaction-icons/approve-failed.png b/app/images/transaction-icons/approve-failed.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b97db0b83c15d288ccba8e92a1b6649e215e69 GIT binary patch literal 4525 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 LNkvXXu0mjfWJrPo literal 0 HcmV?d00001 diff --git a/app/images/transaction-icons/approve.png b/app/images/transaction-icons/approve.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e5c4776b90aac319d2b9909409d3004850a8fc GIT binary patch literal 4553 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 literal 0 HcmV?d00001 diff --git a/app/images/transaction-icons/interaction-failed.png b/app/images/transaction-icons/interaction-failed.png new file mode 100644 index 0000000000000000000000000000000000000000..eee051e9459ad94597a78a4f729fb10e054a344c GIT binary patch literal 4036 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 H?PLB0MW>FC literal 0 HcmV?d00001 diff --git a/app/images/transaction-icons/receive.png b/app/images/transaction-icons/receive.png new file mode 100644 index 0000000000000000000000000000000000000000..8ea0c8c463fe290919824ee141bc1209464a7e10 GIT binary patch literal 5134 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

^4Bq=@X_HfMr>5$jUh8s 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 XnzxaR?LPLQ00000NkvXXu0mjfxxzdL literal 0 HcmV?d00001 diff --git a/app/images/transaction-icons/send.png b/app/images/transaction-icons/send.png new file mode 100644 index 0000000000000000000000000000000000000000..c5ee571549fd93739ca3becf920028b63b484e4f GIT binary patch literal 3932 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 { + switch (provider) { + case FIAT_ORDER_PROVIDERS.WYRE: + case FIAT_ORDER_PROVIDERS.WYRE_APPLE_PAY: { + return 'Wyre'; + } + case FIAT_ORDER_PROVIDERS.TRANSAK: { + return 'Transak'; + } + default: { + return provider; + } + } +}; + +export const getOrders = (orders, selectedAddress, network) => + orders.filter(order => order.account === selectedAddress && order.network === network); + +export const getPendingOrders = (orders, selectedAddress, network) => + orders.filter( + order => + order.account === selectedAddress && order.network === network && order.state === FIAT_ORDER_STATES.PENDING + ); + +export const getHasOrders = (orders, selectedAddress, network) => + orders.some(order => order.account === selectedAddress && order.network === network); + const initialState = { orders: [] }; @@ -50,7 +85,7 @@ const fiatOrderReducer = (state = initialState, action) => { case 'FIAT_ADD_ORDER': { return { ...state, - orders: [...state.orders, action.payload] + orders: [action.payload, ...state.orders] }; } case 'FIAT_UPDATE_ORDER': { @@ -69,6 +104,15 @@ const fiatOrderReducer = (state = initialState, action) => { ] }; } + case 'FIAT_REMOVE_ORDER': { + const orders = state.orders; + const order = action.payload; + const index = findOrderIndex(order.provider, order.id, state.orders); + return { + ...state, + orders: [...orders.slice(0, index), ...orders.slice(index + 1)] + }; + } case 'FIAT_RESET': { return initialState; } diff --git a/app/reducers/modals/index.js b/app/reducers/modals/index.js index 1ee2b5bebea..96f98e181ed 100644 --- a/app/reducers/modals/index.js +++ b/app/reducers/modals/index.js @@ -4,7 +4,8 @@ const initialState = { collectibleContractModalVisible: false, receiveModalVisible: false, receiveAsset: undefined, - dappTransactionModalVisible: false + dappTransactionModalVisible: false, + approveModalVisible: false }; const modalsReducer = (state = initialState, action) => { @@ -36,6 +37,11 @@ const modalsReducer = (state = initialState, action) => { ...state, dappTransactionModalVisible: action.show === null ? !state.dappTransactionModalVisible : action.show }; + case 'TOGGLE_APPROVE_MODAL': + return { + ...state, + approveModalVisible: !state.approveModalVisible + }; default: return state; } diff --git a/app/util/number.js b/app/util/number.js index 6fd970a067e..8232d470b8d 100644 --- a/app/util/number.js +++ b/app/util/number.js @@ -303,17 +303,24 @@ export function weiToFiat(wei, conversionRate, currencyCode, decimalsToShow = 5) } /** - * Adds currency symbol to a value + * Renders fiat amount with currency symbol if exists * - * @param {number} wei - BN corresponding to an amount of wei - * @param {string} currencyCode - Current currency code to display + * @param {number|string} amount Number corresponding to a currency amount + * @param {string} currencyCode Current currency code to display * @returns {string} - Currency-formatted string */ -export function addCurrencySymbol(value, currencyCode) { +export function addCurrencySymbol(amount, currencyCode) { if (currencySymbols[currencyCode]) { - return `${currencySymbols[currencyCode]}${value}`; + return `${currencySymbols[currencyCode]}${amount}`; } - return `${value} ${currencyCode}`; + + const lowercaseCurrencyCode = currencyCode.toLowerCase(); + + if (currencySymbols[lowercaseCurrencyCode]) { + return `${currencySymbols[lowercaseCurrencyCode]}${amount}`; + } + + return `${amount} ${currencyCode}`; } /** @@ -377,10 +384,7 @@ export function balanceToFiat(balance, conversionRate, exchangeRate, currencyCod return undefined; } const fiatFixed = balanceToFiatNumber(balance, conversionRate, exchangeRate); - if (currencySymbols[currencyCode]) { - return `${currencySymbols[currencyCode]}${fiatFixed}`; - } - return `${fiatFixed} ${currencyCode}`; + return addCurrencySymbol(fiatFixed, currencyCode); } /** diff --git a/app/util/transactions.js b/app/util/transactions.js index 5e7e7ad5819..3836503de94 100644 --- a/app/util/transactions.js +++ b/app/util/transactions.js @@ -27,6 +27,21 @@ export const APPROVE_FUNCTION_SIGNATURE = '0x095ea7b3'; export const CONNEXT_DEPOSIT = '0xea682e37'; export const CONTRACT_CREATION_SIGNATURE = '0x60a060405260046060527f48302e31'; +export const TRANSACTION_TYPES = { + PAYMENT_CHANNEL_DEPOSIT: 'payment_channel_deposit', + PAYMENT_CHANNEL_WITHDRAW: 'payment_channel_withdraw', + PAYMENT_CHANNEL_SENT: 'payment_channel_sent', + PAYMENT_CHANNEL_RECEIVED: 'payment_channel_received', + SENT: 'transaction_sent', + SENT_TOKEN: 'transaction_sent_token', + SENT_COLLECTIBLE: 'transaction_sent_collectible', + RECEIVED: 'transaction_received', + RECEIVED_TOKEN: 'transaction_received_token', + RECEIVED_COLLECTIBLE: 'transaction_received_collectible', + SITE_INTERACTION: 'transaction_site_interaction', + APPROVE: 'transaction_approve' +}; + /** * Utility class with the single responsibility * of caching CollectibleAddresses @@ -264,7 +279,14 @@ export async function getTransactionActionKey(transaction) { * @returns {string} - Transaction type message */ export async function getActionKey(tx, selectedAddress, ticker, paymentChannelTransaction) { + if (tx.isTransfer) { + const selfSent = safeToChecksumAddress(tx.transaction.from) === selectedAddress; + const translationKey = selfSent ? 'transactions.self_sent_unit' : 'transactions.received_unit'; + return strings(translationKey, { unit: tx.transferInformation.symbol }); + } + const actionKey = await getTransactionActionKey(tx); + if (actionKey === SEND_ETHER_ACTION_KEY) { ticker = paymentChannelTransaction ? strings('unit.sai') : ticker; const incoming = safeToChecksumAddress(tx.transaction.to) === selectedAddress; @@ -282,9 +304,11 @@ export async function getActionKey(tx, selectedAddress, ticker, paymentChannelTr : strings('transactions.sent_ether'); } const transactionActionKey = actionKeys[actionKey]; + if (transactionActionKey) { return transactionActionKey; } + return actionKey; } diff --git a/locales/en.json b/locales/en.json index be7821581c9..c2a1da1bff1 100644 --- a/locales/en.json +++ b/locales/en.json @@ -158,7 +158,7 @@ "drawer": { "payment_channel": "Instant Payments", "send_button": "Send", - "receive_button": "Receive", + "receive_button": "Add funds", "coming_soon": "Coming soon...", "wallet": "Wallet", "insta_pay": "InstaPay", @@ -224,6 +224,9 @@ "logout_to_import_seed": "You need to log out first in order to import a seed phrase.", "ready_to_explore": "Ready to start exploring blockchain applications?" }, + "activity_view": { + "title": "Activity" + }, "transactions_view": { "title": "Transactions" }, @@ -418,10 +421,10 @@ "email_us": "Email Us at support@metamask.io!" }, "reveal_credential": { - "seed_phrase_title": "Reveal Seed Phrase", - "private_key_title": "Show Private Key", - "show_private_key": "Show Private Key", - "private_key_title_for_account": "Show Private Key for \"{{accountName}}\"", + "seed_phrase_title": "Reveal seed phrase", + "private_key_title": "Show private key", + "show_private_key": "Show private key", + "private_key_title_for_account": "Show private key for \"{{accountName}}\"", "cancel": "Cancel", "confirm": "Next", "seed_phrase_explanation": "If you ever change browsers or move computers, you will need this seed phrase to access your accounts. Save them somewhere safe and secret.", @@ -538,7 +541,12 @@ "asset": "Asset", "balance": "Balance", "not_enough_for_gas": "You have 0 ETH in your account to pay for transaction fees. Buy some ETH or deposit from another account.", - "send": "Send" + "send": "Send", + "confirmed": "Confirmed", + "pending": "Pending", + "submitted": "Submitted", + "failed": "Failed", + "cancelled": "Cancelled" }, "custom_gas": { "total": "Total", @@ -548,7 +556,6 @@ "gas_limit": "Gas Limit:", "gas_price": "Gas Price: (GWEI)", "save": "Save", - "total": "Total", "warning_gas_limit": "Gas limit must be greater than 20999 and less than 7920027", "cost_explanation": "Select the network fee you are willing to pay. The higher the fee, the better chances and faster your transaction will go through." }, @@ -558,7 +565,7 @@ "spend_limit": "Spend limit permission", "allow": "Allow", "allow_explanation": "to withdraw and spend up to the following amount:", - "unlimited": "Unlimited", + "proposed": "Proposed approval limit", "requested_by": "Spend limit requested by", "custom_spend_limit": "Custom spend limit", "max_spend_limit": "Enter a max spend limit", @@ -658,9 +665,10 @@ "received_unit": "Received {{unit}}", "sent_collectible": "Sent Collectible", "sent": "Sent", + "received": "Received", "contract_deploy": "Contract Deployment", "to_contract": "New Contract", - "instant_payment_deposit": "Instant Payment Deposit", + "instant_payment_deposit": "InstaPay Deposit", "instant_payment_deposit_tx": "Deposit", "instant_payment_withdraw_tx": "Withdraw", "tx_details_free": "Free", @@ -1151,9 +1159,11 @@ }, "fiat_on_ramp": { "buy_eth": "Buy ETH", + "purchased_currency": "Purchased {{currency}}", "network_not_supported": "Current network not supported", "switch_network": "Please switch to Mainnet", "switch": "Switch", + "purchases": "Purchases", "purchase_method": "Purchase Method", "amount_to_buy": "Amount to buy", "transak_webview_title": "Transak", @@ -1202,6 +1212,16 @@ "purchase_completed_description": "Your {{currency}} is now available", "purchase_pending_title": "Processing your purchase of {{currency}}", "purchase_pending_description": "Your deposit is in progress" - } + }, + "date": "Date", + "from": "From", + "to": "To", + "status": "Status", + "completed": "Completed", + "pending": "Pending", + "failed": "Failed", + "cancelled": "Canceled", + "amount": "Amount", + "total_amount": "Total amount" } } diff --git a/locales/es.json b/locales/es.json index 6bf2ebfc291..b7259cf7065 100644 --- a/locales/es.json +++ b/locales/es.json @@ -140,7 +140,7 @@ "drawer": { "payment_channel": "Pagos Instantáneos", "send_button": "Enviar", - "receive_button": "Recibir", + "receive_button": "Agregar", "coming_soon": "Disponible muy pronto...", "wallet": "Billetera", "transaction_history": "Historial de Transacciones", @@ -202,6 +202,9 @@ "logout_to_import_seed": "Primero debes cerrar la sesión para poder importar una nueva frase semilla.", "ready_to_explore": "¿Listo para explorar aplicaciones blockchain?" }, + "activity_view": { + "title": "Actividad" + }, "transactions_view": { "title": "Transacciones" }, @@ -394,7 +397,7 @@ "email_us": "¡Envíanos un correo a support@metamask.io!" }, "reveal_credential": { - "seed_phrase_title": "Revelar Frase Semilla", + "seed_phrase_title": "Revelar frase semilla", "private_key_title": "Mostrar dirección privada", "private_key_title_for_account": "Mostrar dirección privada para la cuenta \"{{accountName}}\"", "cancel": "Cancelar", @@ -506,7 +509,12 @@ "asset": "Activo", "balance": "Balance", "not_enough_for_gas": "Tienes 0 ETH en tu cuenta para pagar por la tarifa de transacción. Compra ETH o deposítalo desde otra cuenta.", - "send": "Enviar" + "send": "Enviar", + "confirmed": "Confirmada", + "pending": "Pendiente", + "submitted": "Enviada", + "failed": "Fallida", + "cancelled": "Cancelada" }, "custom_gas": { "advanced_options": "Mostrar opciones avanzadas", @@ -522,7 +530,7 @@ "spend_limit": "Editar límite de gasto", "allow": "Permitir", "allow_explanation": "para retirar y gastar hasta la siguiente cantidad:", - "unlimited": "Ilimitado", + "proposed": "Límite de gasto propuesto", "requested_by": "Límite de gasto requerido por", "custom_spend_limit": "Límite de gasto personalizado", "max_spend_limit": "Ingrese un límite de gasto máximo", @@ -613,7 +621,7 @@ "sent": "Enviado", "contract_deploy": "Despliegue de contrato", "to_contract": "Nuevo Contrato", - "instant_payment_deposit": "Depósito Instant Payment", + "instant_payment_deposit": "Depósito InstaPay", "instant_payment_deposit_tx": "Depósito", "instant_payment_withdraw_tx": "Retiro", "tx_details_free": "Gratis", @@ -634,7 +642,10 @@ "address_copied_to_clipboard": "La dirección fue copiada al portapapeles", "transaction_error": "Error de transacción", "address_to_placeholder": "Buscar, dirección pública (0x), o ENS", - "address_from_balance": "Balance:" + "address_from_balance": "Balance:", + "status": "Estado", + "date": "Fecha", + "nonce": "Nonce" }, "address_book": { "recents": "Recientes", @@ -1071,9 +1082,11 @@ }, "fiat_on_ramp": { "buy_eth": "Comprar ETH", + "purchased_currency": "Compra de {{currency}}", "network_not_supported": "La red actual no esta soportada", "switch_network": "Por favor cambiar a Mainnet", "switch": "Cambiar", + "purchases": "Compras", "purchase_method": "Método de pago", "amount_to_buy": "Monto a comprar", "transak_webview_title": "Transak", @@ -1122,6 +1135,16 @@ "purchase_completed_description": "Su {{currency}} está disponible", "purchase_pending_title": "Procesando su compra de {{currency}}", "purchase_pending_description": "Su depósito está en progreso" - } + }, + "date": "Fecha", + "from": "Desde", + "to": "Para", + "status": "Estado", + "completed": "Realizada", + "pending": "Pendiente", + "failed": "Fallida", + "cancelled": "Cancelada", + "amount": "Cantidad", + "total_amount": "Cantidad total" } } diff --git a/package.json b/package.json index b856e7c8046..f7f92b50af0 100644 --- a/package.json +++ b/package.json @@ -69,13 +69,13 @@ }, "dependencies": { "@exodus/react-native-payments": "https://github.com/wachunei/react-native-payments.git#package-json-hack", - "@metamask/controllers": "^2.0.0", + "@metamask/controllers": "2.0.2", "@react-native-community/async-storage": "1.9.0", "@react-native-community/clipboard": "^1.2.2", "@react-native-community/netinfo": "4.1.5", "@react-native-community/viewpager": "^3.3.0", - "@sentry/integrations": "^5.13.0", - "@sentry/react-native": "^1.3.3", + "@sentry/integrations": "5.13.0", + "@sentry/react-native": "1.3.3", "@tradle/react-native-http": "2.0.1", "@walletconnect/client": "1.0.0-rc.3", "@walletconnect/utils": "1.0.0-rc.3", diff --git a/yarn.lock b/yarn.lock index bf04b7ddb2e..3e896a5840b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,75 +2,26 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/code-frame@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.4.5": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.4.tgz#6ebd9fe00925f6c3e177bb726a188b5f578088ff" - integrity sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.4" - "@babel/helpers" "^7.6.2" - "@babel/parser" "^7.6.4" - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.3" - "@babel/types" "^7.6.3" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.6.2": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376" - integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.6" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.6" - "@babel/parser" "^7.9.6" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.6" - "@babel/types" "^7.9.6" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.7.5": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" + integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw== + dependencies: + "@babel/highlight" "^7.10.1" + +"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.4.5", "@babel/core@^7.6.2", "@babel/core@^7.7.5": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.1.tgz#2a0ad0ea693601820defebad2140206503d89af3" + integrity sha512-u8XiZ6sMXW/gPmoP5ijonSUln4unazG291X0XAQ5h0s8qnAFr6BRRZGUEK+jtRWdmB0NTJQt7Uga25q8GetIIg== + dependencies: + "@babel/code-frame" "^7.10.1" + "@babel/generator" "^7.10.1" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helpers" "^7.10.1" + "@babel/parser" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -80,422 +31,277 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.5.0", "@babel/generator@^7.9.0", "@babel/generator@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9" - integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ== +"@babel/generator@^7.10.1", "@babel/generator@^7.5.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.1.tgz#4d14458e539bcb04ffe34124143f5c489f2dbca9" + integrity sha512-AT0YPLQw9DI21tliuJIdplVfLHya6mcGa8ctkv7n4Qv+hYacJrKmNWIteAK1P9iyLikFIAkwqJ7HAOqIDLFfgA== dependencies: - "@babel/types" "^7.9.5" + "@babel/types" "^7.10.1" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" -"@babel/generator@^7.6.3", "@babel/generator@^7.6.4": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" - integrity sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w== - dependencies: - "@babel/types" "^7.6.3" - jsesc "^2.5.1" +"@babel/helper-annotate-as-pure@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268" + integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz#0ec7d9be8174934532661f87783eb18d72290059" + integrity sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-builder-react-jsx-experimental@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz#9a7d58ad184d3ac3bafb1a452cec2bad7e4a0bc8" + integrity sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-module-imports" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-builder-react-jsx@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz#a327f0cf983af5554701b1215de54a019f09b532" + integrity sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-create-class-features-plugin@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.1.tgz#6d8a45aafe492378d0e6fc0b33e5dea132eae21c" + integrity sha512-bwhdehBJZt84HuPUcP1HaTLuc/EywVS8rc3FgsEPDcivg+DCW+SHuLHVkYOmcBA1ZfI+Z/oZjQc/+bPmIO7uAA== + dependencies: + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-member-expression-to-functions" "^7.10.1" + "@babel/helper-optimise-call-expression" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + +"@babel/helper-create-regexp-features-plugin@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd" + integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-regex" "^7.10.1" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz#5e69ee8308648470dd7900d159c044c10285221d" + integrity sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg== + dependencies: + "@babel/helper-function-name" "^7.10.1" + "@babel/types" "^7.10.1" lodash "^4.17.13" - source-map "^0.5.0" -"@babel/generator@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43" - integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ== +"@babel/helper-explode-assignable-expression@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz#e9d76305ee1162ca467357ae25df94f179af2b7e" + integrity sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg== dependencies: - "@babel/types" "^7.9.6" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== +"@babel/helper-function-name@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4" + integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ== dependencies: - "@babel/types" "^7.0.0" + "@babel/helper-get-function-arity" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== +"@babel/helper-get-function-arity@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d" + integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/types" "^7.10.1" -"@babel/helper-builder-react-jsx@^7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" - integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== +"@babel/helper-member-expression-to-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz#432967fd7e12a4afef66c4687d4ca22bc0456f15" + integrity sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g== dependencies: - "@babel/types" "^7.3.0" - esutils "^2.0.0" + "@babel/types" "^7.10.1" -"@babel/helper-call-delegate@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" - integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== +"@babel/helper-module-imports@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876" + integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg== dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/types" "^7.10.1" -"@babel/helper-create-class-features-plugin@^7.5.5": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.6.0.tgz#769711acca889be371e9bc2eb68641d55218021f" - integrity sha512-O1QWBko4fzGju6VoVvrZg0RROCVifcLxiApnGP3OWfWzvxRZFCoBD81K5ur5e3bVY2Vf/5rIJm8cqPKn8HUJng== +"@babel/helper-module-transforms@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" + integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" - -"@babel/helper-create-class-features-plugin@^7.8.3": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.5.tgz#79753d44017806b481017f24b02fd4113c7106ea" - integrity sha512-IipaxGaQmW4TfWoXdqjY0TzoXQ1HRS0kPpEgvjosb3u7Uedcq297xFqDQiCcQtRRwzIMif+N1MLVI8C5a4/PAA== - dependencies: - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" - -"@babel/helper-define-map@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" - integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.5.5" - lodash "^4.17.13" - -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== - dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== - dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-function-name@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" - integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.9.5" - -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-hoist-variables@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" - integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== - dependencies: - "@babel/types" "^7.4.4" - -"@babel/helper-member-expression-to-functions@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" - integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== - dependencies: - "@babel/types" "^7.5.5" - -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-transforms@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" - integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/types" "^7.5.5" - lodash "^4.17.13" - -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-simple-access" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" lodash "^4.17.13" -"@babel/helper-optimise-call-expression@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== +"@babel/helper-optimise-call-expression@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz#b4a1f2561870ce1247ceddb02a3860fa96d72543" + integrity sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.10.1" -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== - -"@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.8.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127" + integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA== -"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" - integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== +"@babel/helper-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96" + integrity sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g== dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-replace-supers@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" - integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" - -"@babel/helper-replace-supers@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" - integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== - dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== - dependencies: - "@babel/types" "^7.4.4" - -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" - integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== - -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" - -"@babel/helpers@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" - integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== - dependencies: - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.2" - "@babel/types" "^7.6.0" - -"@babel/helpers@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" - integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - -"@babel/helpers@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580" - integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.6" - "@babel/types" "^7.9.6" - -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== - dependencies: +"@babel/helper-remap-async-to-generator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz#bad6aaa4ff39ce8d4b82ccaae0bfe0f7dbb5f432" + integrity sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-wrap-function" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-replace-supers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d" + integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.1" + "@babel/helper-optimise-call-expression" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-simple-access@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e" + integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw== + dependencies: + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-split-export-declaration@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f" + integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-validator-identifier@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" + integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw== + +"@babel/helper-wrap-function@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9" + integrity sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ== + dependencies: + "@babel/helper-function-name" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helpers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973" + integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw== + dependencies: + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/highlight@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0" + integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg== + dependencies: + "@babel/helper-validator-identifier" "^7.10.1" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.6.0", "@babel/parser@^7.6.3", "@babel/parser@^7.6.4": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.4.tgz#cb9b36a7482110282d5cb6dd424ec9262b473d81" - integrity sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A== - -"@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" - integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== - -"@babel/parser@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" - integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.1", "@babel/parser@^7.7.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.1.tgz#2e142c27ca58aa2c7b119d09269b702c8bbad28c" + integrity sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg== "@babel/plugin-external-helpers@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.2.0.tgz#7f4cb7dee651cd380d2034847d914288467a6be4" - integrity sha512-QFmtcCShFkyAsNtdCM3lJPmRe1iB+vPZymlB4LnDIKEBj2yKQLQKtoxXxJ8ePT5fwMl4QGg303p4mB0UsSI2/g== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.10.1.tgz#9ba69a8011a163c3c73dce162df1e6737c4e8dcf" + integrity sha512-xFXc/Ts/gsgCrkh3waZbVdkzmhtnlw1L972gx96pmj8hXvloHnPTDgZ07vTDve9ilpe9TcrIMWLU7rg6FqnAWA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-proposal-class-properties@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz#a974cfae1e37c3110e71f3c6a2e48b8e71958cd4" - integrity sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01" + integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.5.5" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-proposal-export-default-from@^7.0.0": - version "7.5.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.5.2.tgz#2c0ac2dcc36e3b2443fead2c3c5fc796fb1b5145" - integrity sha512-wr9Itk05L1/wyyZKVEmXWCdcsp/e185WUNl6AfYZeEKYaUPPvHXRDqO5K1VH7/UamYqGJowFRuCv30aDYZawsg== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.10.1.tgz#59ea2a4f09dbb0358c73dab27def3d21a27bd370" + integrity sha512-Xfc1CfHapIkwZ/+AI+j4Ha3g233ol0EEdy6SmnUuQQiZX78SfQXHd8tmntc5zqCkwPnIHoiZa6l6p0OAvxYXHw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-export-default-from" "^7.2.0" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-export-default-from" "^7.10.1" "@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.4.4.tgz#41c360d59481d88e0ce3a3f837df10121a769b39" - integrity sha512-Amph7Epui1Dh/xxUxS2+K22/MUi6+6JVTvy3P58tja3B6yKTSjwwx0/d83rF7551D6PVSSoplQb8GCwqec7HRw== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz#02dca21673842ff2fe763ac253777f235e9bbf78" + integrity sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.2.0" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" "@babel/plugin-proposal-object-rest-spread@^7.0.0": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" - integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz#cba44908ac9f142650b4a65b8aa06bf3478d5fb6" + integrity sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.10.1" "@babel/plugin-proposal-optional-catch-binding@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz#c9f86d99305f9fa531b568ff5ab8c964b8b223d2" + integrity sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-proposal-optional-chaining@^7.0.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.6.0.tgz#e9bf1f9b9ba10c77c033082da75f068389041af8" - integrity sha512-kj4gkZ6qUggkprRq3Uh5KP8XnE1MdIO0J7MhdDX8+rAbB6dJ2UrensGIS+0NPZAaaJ1Vr0PN6oLUgXMU1uMcSg== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz#15f5d6d22708629451a91be28f8facc55b0e818c" + integrity sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.2.0" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -511,40 +317,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.2.0.tgz#23b3b7b9bcdabd73672a9149f728cd3be6214812" - integrity sha512-UxYaGXYQ7rrKJS/PxIKRkv3exi05oH7rokBAsmCSsCxz1sVPZ7Fu6FzKoGgUvmY+0YgSkYHgUoCh5R5bCNBQlw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" - integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg== +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5" + integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-dynamic-import@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.2.0.tgz#edd83b7adc2e0d059e2467ca96c650ab6d2f3820" - integrity sha512-c7nqUnNST97BWPtoe+Ssi+fJukc9P9/JMZ71IOMNQWza2E+Psrd46N6AEvtw6pqK+gt7ChjXyrw4SPDO79f3Lw== +"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.10.1.tgz#634f58f36b5d6320d80f75441fdc61e1c05c33b0" + integrity sha512-+rcL4S/mN1Ss4zhSCbxzv1Wsf12eauvgTjWi0krXEeX1zd6qSxYnJoniE5Ssr5w2WPt61oUCJyXIFQIqO/29zw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" - integrity sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg== +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.10.1", "@babel/plugin-syntax-flow@^7.2.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.1.tgz#cd4bbca62fb402babacb174f64f8734310d742f0" + integrity sha512-b3pWVncLBYoPP60UOTc7NMlbtsHQ6ITim78KQejNHK6WJ2mzV5kCcg4mIWpasAfJEgwVTibwo2e+FU7UEIKQUg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -553,349 +352,321 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" - integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" - integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz#0ae371134a42b91d5418feb3c8c8d43e1565d2da" + integrity sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897" - integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.1.tgz#fffee77b4934ce77f3b427649ecdddbec1958550" + integrity sha512-XyHIFa9kdrgJS91CUH+ccPVTnJShr8nLGc5bG2IhGXv5p1Rd+8BleGE5yzIg2Nc1QZAdHDa0Qp4m6066OL96Iw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.2.0.tgz#f75083dfd5ade73e783db729bbd87e7b9efb7624" - integrity sha512-lRCEaKE+LTxDQtgbYajI04ddt6WW0WJq57xqkAZ+s11h4YgfRHhVA/Y2VhfPzzFD4qeLHWg32DMp9HooY4Kqlg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" - integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99" + integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": +"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": +"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.2.0.tgz#a59d6ae8c167e7608eaa443fda9fa8fa6bf21dff" - integrity sha512-HtGCtvp5Uq/jH/WNUPkK6b7rufnCPLLlDAFN7cmACoIjaOOiXxUt3SswU5loHqrhtqTsa/WoLQ1OQ1AGuZqaWA== +"@babel/plugin-syntax-typescript@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.1.tgz#5e82bc27bb4202b93b949b029e699db536733810" + integrity sha512-X/d8glkrAtra7CaQGMiGs/OGa6XgUzqPcBXCIGFCpCqnfGlT0Wfbzo/B89xHhnInTaItPK8LALblVXcUOEh95Q== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-typescript@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz#c1f659dda97711a569cef75275f7e15dcaa6cabc" - integrity sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-arrow-functions@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b" + integrity sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-async-to-generator@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" - integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz#e5153eb1a3e028f79194ed8a7a4bf55f862b2062" + integrity sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg== dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-remap-async-to-generator" "^7.10.1" "@babel/plugin-transform-block-scoped-functions@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz#146856e756d54b20fff14b819456b3e01820b85d" + integrity sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-block-scoping@^7.0.0": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" - integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e" + integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" lodash "^4.17.13" "@babel/plugin-transform-classes@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" - integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.5.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz#6e11dd6c4dfae70f540480a4702477ed766d733f" + integrity sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-define-map" "^7.10.1" + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-optimise-call-expression" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz#59aa399064429d64dce5cf76ef9b90b7245ebd07" + integrity sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-destructuring@^7.0.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" - integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907" + integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-exponentiation-operator@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz#279c3116756a60dd6e6f5e488ba7957db9c59eb3" + integrity sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.6.3.tgz#8110f153e7360cfd5996eee68706cfad92d85256" - integrity sha512-l0ETkyEofkqFJ9LS6HChNIKtVJw2ylKbhYMlJ5C6df+ldxxaLIyXY4yOdDQQspfFpV8/vDiaWoJlvflstlYNxg== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.1.tgz#59eafbff9ae85ec8932d4c16c068654be814ec5e" + integrity sha512-i4o0YwiJBIsIx7/liVCZ3Q2WkWr1/Yu39PksBOnh/khW2SwIFsGa5Ze+MSon5KbDfrEHP9NeyefAgvUSXzaEkw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-flow" "^7.10.1" "@babel/plugin-transform-for-of@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" - integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5" + integrity sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-function-name@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" - integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz#4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d" + integrity sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-literals@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz#5794f8da82846b22e4e6631ea1658bce708eb46a" + integrity sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-member-expression-literals@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" - integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz#90347cba31bca6f394b3f7bd95d2bbfd9fce2f39" + integrity sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-modules-commonjs@^7.0.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" - integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301" + integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg== dependencies: - "@babel/helper-module-transforms" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-simple-access" "^7.10.1" + babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-object-assign@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.2.0.tgz#6fdeea42be17040f119e38e23ea0f49f31968bde" - integrity sha512-nmE55cZBPFgUktbF2OuoZgPRadfxosLOpSgzEPYotKSls9J4pEPcembi8r78RU37Rph6UApCpNmsQA4QMWK9Ng== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.10.1.tgz#e563cb225a4812c072a415f3216f53326195b004" + integrity sha512-poBEVwzcTjv6p92ZcnWBUftzyXFCy/Zg/eCQsayu5/ot2+qwnasNvCCKPwdgprgDRzbHVUhh/fzI9rCoFOHLbg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-object-super@^7.0.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" - integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz#2e3016b0adbf262983bf0d5121d676a5ed9c4fde" + integrity sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" -"@babel/plugin-transform-parameters@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" - integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd" + integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg== dependencies: - "@babel/helper-call-delegate" "^7.4.4" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-get-function-arity" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-property-literals@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" - integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz#cffc7315219230ed81dc53e4625bf86815b6050d" + integrity sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-react-display-name@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" - integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz#e6a33f6d48dfb213dda5e007d0c7ff82b6a3d8ef" + integrity sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" - integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.1.tgz#22143e14388d72eb88649606bb9e46f421bc3821" + integrity sha512-4p+RBw9d1qV4S749J42ZooeQaBomFPrSxa9JONLHJ1TxCBo3TzJ79vtmG2S2erUT8PDDrPdw4ZbXGr2/1+dILA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-jsx" "^7.10.1" "@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz#583b10c49cf057e237085bcbd8cc960bd83bd96b" - integrity sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.1.tgz#30db3d4ee3cdebbb26a82a9703673714777a4273" + integrity sha512-neAbaKkoiL+LXYbGDvh6PjPG+YeA67OsZlE78u50xbWh2L1/C81uHiNP5d1fw+uqUIoiNdCC8ZB+G4Zh3hShJA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-jsx" "^7.10.1" "@babel/plugin-transform-react-jsx@^7.0.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" - integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.1.tgz#91f544248ba131486decb5d9806da6a6e19a2896" + integrity sha512-MBVworWiSRBap3Vs39eHt+6pJuLUAaK4oxGc8g+wY+vuSJvLiEQjW1LSTqKb8OUPtDvHCkdPhk7d6sjC19xyFw== dependencies: - "@babel/helper-builder-react-jsx" "^7.3.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/helper-builder-react-jsx" "^7.10.1" + "@babel/helper-builder-react-jsx-experimental" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-jsx" "^7.10.1" "@babel/plugin-transform-regenerator@^7.0.0": - 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== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz#10e175cbe7bdb63cc9b39f9b3f823c5c7c5c5490" + integrity sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw== dependencies: - regenerator-transform "^0.14.0" + regenerator-transform "^0.14.2" "@babel/plugin-transform-runtime@^7.0.0", "@babel/plugin-transform-runtime@^7.5.5": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.2.tgz#2669f67c1fae0ae8d8bf696e4263ad52cb98b6f8" - integrity sha512-cqULw/QB4yl73cS5Y0TZlQSjDvNkzDbu0FurTZyHlJpWE5T3PCMdnyV+xXoH1opr1ldyHODe3QAX3OMAii5NxA== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz#fd1887f749637fb2ed86dc278e79eb41df37f4b1" + integrity sha512-4w2tcglDVEwXJ5qxsY++DgWQdNJcCCsPxfT34wCUwIf2E7dI7pMpH8JczkMBbgBTNzBX62SZlNJ9H+De6Zebaw== dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" resolve "^1.8.1" semver "^5.5.1" "@babel/plugin-transform-shorthand-properties@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3" + integrity sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-spread@^7.0.0": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd" - integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz#0c6d618a0c4461a274418460a28c9ccf5239a7c8" + integrity sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-sticky-regex@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz#90fc89b7526228bed9842cff3588270a7a393b00" + integrity sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-regex" "^7.10.1" "@babel/plugin-transform-template-literals@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" - integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz#914c7b7f4752c570ea00553b4284dad8070e8628" + integrity sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-typescript@^7.5.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz#4bb4dde4f10bbf2d787fce9707fb09b483e33359" - integrity sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.1.tgz#2c54daea231f602468686d9faa76f182a94507a6" + integrity sha512-v+QWKlmCnsaimLeqq9vyCsVRMViZG1k2SZTlcZvB+TqyH570Zsij8nvVUZzOASCRiQFUxkLrn9Wg/kH0zgy5OQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-typescript" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-typescript" "^7.10.1" "@babel/plugin-transform-unicode-regex@^7.0.0": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz#b692aad888a7e8d8b1b214be6b9dc03d5031f698" - integrity sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz#6b58f2aea7b68df37ac5025d9c88752443a6b43f" + integrity sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/register@^7.0.0": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.6.2.tgz#25765a922202cb06f8bdac5a3b1e70cd6bf3dd45" - integrity sha512-xgZk2LRZvt6i2SAUWxc7ellk4+OYRgS3Zpsnr13nMS1Qo25w21Uu8o6vTOAqNaxiqrnv30KTYzh9YWY2k21CeQ== + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.10.1.tgz#b6567c5cb5049f44bbf8c35d6ff68ca3c43238ed" + integrity sha512-sl96+kB3IA2B9EzpwwBmYadOT14vw3KaXOknGDbJaZCOj52GDA4Tivudq9doCJcB+bEIKCEARZYwRgBBsCGXyg== dependencies: find-cache-dir "^2.0.0" lodash "^4.17.13" - mkdirp "^0.5.1" + make-dir "^2.1.0" pirates "^4.0.0" - source-map-support "^0.5.9" + source-map-support "^0.5.16" + +"@babel/runtime-corejs3@^7.8.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.1.tgz#ae8a85a04029d94ab8c3b5237a1031a9d631b515" + integrity sha512-/NLH0a34E/moPbqB1C/72I2gvMOmOly2JQARcRE1+PWCdHwMQ3la4sz7WnlK/EVHiBjQruH2WqE8YufL632Y8w== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" "@babel/runtime@7.0.0": version "7.0.0" @@ -904,107 +675,43 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.5.5": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.3.tgz#935122c74c73d2240cafd32ddb5fc2a6cd35cf1f" - integrity sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/runtime@^7.6.2": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f" - integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.8.4": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.1.tgz#b6eb75cac279588d3100baecd1b9894ea2840822" + integrity sha512-nQbbCbQc9u/rpg1XCxoMYQTbSMVZjCDxErQ1ClCn9Pvcmv1lGads19ep0a2VsEiIJeHqjZley6EQGEC3Yo1xMA== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" - integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.6.0" - "@babel/types" "^7.6.0" - -"@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.3.tgz#66d7dba146b086703c0fb10dd588b7364cec47f9" - integrity sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.3" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.6.3" - "@babel/types" "^7.6.3" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/traverse@^7.7.4", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2" - integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.5" - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.0" - "@babel/types" "^7.9.5" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/traverse@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442" - integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.6" - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.6" - "@babel/types" "^7.9.6" +"@babel/template@^7.0.0", "@babel/template@^7.10.1", "@babel/template@^7.3.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811" + integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig== + dependencies: + "@babel/code-frame" "^7.10.1" + "@babel/parser" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.7.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27" + integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ== + dependencies: + "@babel/code-frame" "^7.10.1" + "@babel/generator" "^7.10.1" + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/parser" "^7.10.1" + "@babel/types" "^7.10.1" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0", "@babel/types@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" - integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== +"@babel/types@^7.0.0", "@babel/types@^7.10.1", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.7.0": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.1.tgz#6886724d31c8022160a7db895e6731ca33483921" + integrity sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA== dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" - integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg== - dependencies: - "@babel/helper-validator-identifier" "^7.9.5" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" - integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== - dependencies: - "@babel/helper-validator-identifier" "^7.9.5" + "@babel/helper-validator-identifier" "^7.10.1" lodash "^4.17.13" to-fast-properties "^2.0.0" @@ -1014,9 +721,9 @@ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@cnakazawa/watch@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" - integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== dependencies: exec-sh "^0.3.2" minimist "^1.2.0" @@ -1069,12 +776,13 @@ "@hapi/hoek" "^8.3.0" "@istanbuljs/load-nyc-config@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" - integrity sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" find-up "^4.1.0" + get-package-type "^0.1.0" js-yaml "^3.13.1" resolve-from "^5.0.0" @@ -1092,43 +800,44 @@ chalk "^2.0.1" slash "^2.0.0" -"@jest/console@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.3.0.tgz#33b56b81238427bf3ebe3f7b3378d2f79cdbd409" - integrity sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ== +"@jest/console@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.5.0.tgz#770800799d510f37329c508a9edd0b7b447d9abb" + integrity sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw== dependencies: - "@jest/source-map" "^25.2.6" + "@jest/types" "^25.5.0" chalk "^3.0.0" - jest-util "^25.3.0" + jest-message-util "^25.5.0" + jest-util "^25.5.0" slash "^3.0.0" -"@jest/core@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.3.0.tgz#80f97a7a8b59dde741a24f30871cc26d0197d426" - integrity sha512-+D5a/tFf6pA/Gqft2DLBp/yeSRgXhlJ+Wpst0X/ZkfTRP54qDR3C61VfHwaex+GzZBiTcE9vQeoZ2v5T10+Mqw== - dependencies: - "@jest/console" "^25.3.0" - "@jest/reporters" "^25.3.0" - "@jest/test-result" "^25.3.0" - "@jest/transform" "^25.3.0" - "@jest/types" "^25.3.0" +"@jest/core@^25.5.4": + version "25.5.4" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.5.4.tgz#3ef7412f7339210f003cdf36646bbca786efe7b4" + integrity sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA== + dependencies: + "@jest/console" "^25.5.0" + "@jest/reporters" "^25.5.1" + "@jest/test-result" "^25.5.0" + "@jest/transform" "^25.5.1" + "@jest/types" "^25.5.0" ansi-escapes "^4.2.1" chalk "^3.0.0" exit "^0.1.2" - graceful-fs "^4.2.3" - jest-changed-files "^25.3.0" - jest-config "^25.3.0" - jest-haste-map "^25.3.0" - jest-message-util "^25.3.0" + graceful-fs "^4.2.4" + jest-changed-files "^25.5.0" + jest-config "^25.5.4" + jest-haste-map "^25.5.1" + jest-message-util "^25.5.0" jest-regex-util "^25.2.6" - jest-resolve "^25.3.0" - jest-resolve-dependencies "^25.3.0" - jest-runner "^25.3.0" - jest-runtime "^25.3.0" - jest-snapshot "^25.3.0" - jest-util "^25.3.0" - jest-validate "^25.3.0" - jest-watcher "^25.3.0" + jest-resolve "^25.5.1" + jest-resolve-dependencies "^25.5.4" + jest-runner "^25.5.4" + jest-runtime "^25.5.4" + jest-snapshot "^25.5.1" + jest-util "^25.5.0" + jest-validate "^25.5.0" + jest-watcher "^25.5.0" micromatch "^4.0.2" p-each-series "^2.1.0" realpath-native "^2.0.0" @@ -1136,14 +845,14 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.3.0.tgz#587f28ddb4b0dfe97404d3d4a4c9dbfa0245fb2e" - integrity sha512-vgooqwJTHLLak4fE+TaCGeYP7Tz1Y3CKOsNxR1sE0V3nx3KRUHn3NUnt+wbcfd5yQWKZQKAfW6wqbuwQLrXo3g== +"@jest/environment@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.5.0.tgz#aa33b0c21a716c65686638e7ef816c0e3a0c7b37" + integrity sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA== dependencies: - "@jest/fake-timers" "^25.3.0" - "@jest/types" "^25.3.0" - jest-mock "^25.3.0" + "@jest/fake-timers" "^25.5.0" + "@jest/types" "^25.5.0" + jest-mock "^25.5.0" "@jest/fake-timers@^24.9.0": version "24.9.0" @@ -1154,45 +863,55 @@ jest-message-util "^24.9.0" jest-mock "^24.9.0" -"@jest/fake-timers@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.3.0.tgz#995aad36d5c8984165ca5db12e740ab8dbf7042a" - integrity sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ== +"@jest/fake-timers@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.5.0.tgz#46352e00533c024c90c2bc2ad9f2959f7f114185" + integrity sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ== dependencies: - "@jest/types" "^25.3.0" - jest-message-util "^25.3.0" - jest-mock "^25.3.0" - jest-util "^25.3.0" + "@jest/types" "^25.5.0" + jest-message-util "^25.5.0" + jest-mock "^25.5.0" + jest-util "^25.5.0" lolex "^5.0.0" -"@jest/reporters@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.3.0.tgz#7f39f0e6911561cc5112a1b54656de18faee269b" - integrity sha512-1u0ZBygs0C9DhdYgLCrRfZfNKQa+9+J7Uo+Z9z0RWLHzgsxhoG32lrmMOtUw48yR6bLNELdvzormwUqSk4H4Vg== +"@jest/globals@^25.5.2": + version "25.5.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-25.5.2.tgz#5e45e9de8d228716af3257eeb3991cc2e162ca88" + integrity sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA== + dependencies: + "@jest/environment" "^25.5.0" + "@jest/types" "^25.5.0" + expect "^25.5.0" + +"@jest/reporters@^25.5.1": + version "25.5.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.5.1.tgz#cb686bcc680f664c2dbaf7ed873e93aa6811538b" + integrity sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^25.3.0" - "@jest/test-result" "^25.3.0" - "@jest/transform" "^25.3.0" - "@jest/types" "^25.3.0" + "@jest/console" "^25.5.0" + "@jest/test-result" "^25.5.0" + "@jest/transform" "^25.5.1" + "@jest/types" "^25.5.0" chalk "^3.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.2" + graceful-fs "^4.2.4" istanbul-lib-coverage "^3.0.0" istanbul-lib-instrument "^4.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.0.2" - jest-haste-map "^25.3.0" - jest-resolve "^25.3.0" - jest-util "^25.3.0" - jest-worker "^25.2.6" + jest-haste-map "^25.5.1" + jest-resolve "^25.5.1" + jest-util "^25.5.0" + jest-worker "^25.5.0" slash "^3.0.0" source-map "^0.6.0" string-length "^3.1.0" terminal-link "^2.0.0" - v8-to-istanbul "^4.0.1" + v8-to-istanbul "^4.1.3" optionalDependencies: node-notifier "^6.0.0" @@ -1205,13 +924,13 @@ graceful-fs "^4.1.15" source-map "^0.6.0" -"@jest/source-map@^25.2.6": - version "25.2.6" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.2.6.tgz#0ef2209514c6d445ebccea1438c55647f22abb4c" - integrity sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ== +"@jest/source-map@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.5.0.tgz#df5c20d6050aa292c2c6d3f0d2c7606af315bd1b" + integrity sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ== dependencies: callsites "^3.0.0" - graceful-fs "^4.2.3" + graceful-fs "^4.2.4" source-map "^0.6.0" "@jest/test-result@^24.9.0": @@ -1223,41 +942,42 @@ "@jest/types" "^24.9.0" "@types/istanbul-lib-coverage" "^2.0.0" -"@jest/test-result@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.3.0.tgz#137fab5e5c6fed36e5d40735d1eb029325e3bf06" - integrity sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw== +"@jest/test-result@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.5.0.tgz#139a043230cdeffe9ba2d8341b27f2efc77ce87c" + integrity sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A== dependencies: - "@jest/console" "^25.3.0" - "@jest/types" "^25.3.0" + "@jest/console" "^25.5.0" + "@jest/types" "^25.5.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.3.0.tgz#271ad5f2b8f8137d092ccedc87e16a50f8676209" - integrity sha512-Xvns3xbji7JCvVcDGvqJ/pf4IpmohPODumoPEZJ0/VgC5gI4XaNVIBET2Dq5Czu6Gk3xFcmhtthh/MBOTljdNg== +"@jest/test-sequencer@^25.5.4": + version "25.5.4" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz#9b4e685b36954c38d0f052e596d28161bdc8b737" + integrity sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA== dependencies: - "@jest/test-result" "^25.3.0" - jest-haste-map "^25.3.0" - jest-runner "^25.3.0" - jest-runtime "^25.3.0" + "@jest/test-result" "^25.5.0" + graceful-fs "^4.2.4" + jest-haste-map "^25.5.1" + jest-runner "^25.5.4" + jest-runtime "^25.5.4" -"@jest/transform@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.3.0.tgz#083c5447d5307d9b9494d6968115b647460e71f1" - integrity sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg== +"@jest/transform@^25.5.1": + version "25.5.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.5.1.tgz#0469ddc17699dd2bf985db55fa0fb9309f5c2db3" + integrity sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" babel-plugin-istanbul "^6.0.0" chalk "^3.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.3" - jest-haste-map "^25.3.0" + graceful-fs "^4.2.4" + jest-haste-map "^25.5.1" jest-regex-util "^25.2.6" - jest-util "^25.3.0" + jest-util "^25.5.0" micromatch "^4.0.2" pirates "^4.0.1" realpath-native "^2.0.0" @@ -1274,7 +994,7 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" -"@jest/types@^25.3.0": +"@jest/types@^25.5.0": version "25.5.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== @@ -1284,10 +1004,10 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" -"@metamask/controllers@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@metamask/controllers/-/controllers-2.0.1.tgz#33b0e2826fb6d4aa582acaff6b347e6abe0f54f5" - integrity sha512-xioh4h+4D2pUSJ9H2CaffxKGmlg0kUK2bbRJ8c9GXPVTo8KhRHryvNKfkVCyoSt35FLROzzwTEdVJ4dmUFuELQ== +"@metamask/controllers@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@metamask/controllers/-/controllers-2.0.2.tgz#100a5d87b6061751b39edec2288f16f07d471e2d" + integrity sha512-KKxNguTEdkzwvfv2Hl4BE2OMGULLeh7df6iAwcEG8ipXWbTWGZsLr13DBrczQxRi8TiNPaksAakv++6sMu6ngA== dependencies: await-semaphore "^0.1.3" eth-contract-metadata "^1.11.0" @@ -1324,19 +1044,19 @@ dependencies: deep-assign "^3.0.0" -"@react-native-community/cli-debugger-ui@^4.6.3": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.6.3.tgz#5e93bf170a092a011f1bb0e19886f94265a4ce97" - integrity sha512-5hnzGBP1eXmc1gOuKm9x5uyw9z5QE3C2pSz57eaV6dHjl9LKfeBXd9L+RqeG/uWi7buE4YyJwirvpufLREoyJg== +"@react-native-community/cli-debugger-ui@^4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.9.0.tgz#4177764ba69243c97aa26829d59d9501acb2bd71" + integrity sha512-fBFGamHm4VUrDqkBGnsrwQL8OC6Om7K6EBQb4xj0nWekpXt1HSa3ScylYHTTWwYcpRf9htGMRGiv4dQDY/odAw== dependencies: serve-static "^1.13.1" "@react-native-community/cli-platform-android@^4.5.1": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-4.6.3.tgz#a7377b97cb85b5714d063281eed8e4185444569d" - integrity sha512-o88nUW2mjwvYSTwW/VTPdMmTi2vHS4T4gYGObb3qgkv/6H0JG1NC0SRo1FCHRpRGo1nQ7d+aB8sfpJeEkQ3Mbw== + version "4.9.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-4.9.0.tgz#12ba32875afca81202e1dbf0005f022fa9158352" + integrity sha512-Tw2rQ84zXl5BGZT3rWmDXXUtkmHr73qa/qaP2WMemHTM28boXBdzkkVCnJMdCLZnCphOcpikYsBQALgqFKWOeQ== dependencies: - "@react-native-community/cli-tools" "^4.6.3" + "@react-native-community/cli-tools" "^4.9.0" chalk "^3.0.0" execa "^1.0.0" fs-extra "^8.1.0" @@ -1348,11 +1068,11 @@ xmldoc "^1.1.2" "@react-native-community/cli-platform-ios@^4.5.0": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.6.3.tgz#bcd317e4b6d391a872f04de80fd6e56dbf8a5ba7" - integrity sha512-blYP5DBVj3ZefmKvMsMvmOWrw3Fl6bQIvAAMt+J1nqhZKOONpunfKgKi9DmE/Pzxxdmsx/HhtV104OnBdtUPbw== + version "4.9.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.9.0.tgz#211ca9cd3976fbbb41406c0a846e445cc04c773c" + integrity sha512-8BWe3XM1vKS2/BXXDL5gbD/5rA/u34Irs0Ublrx1JSGqv83g7T9V2DlBMR5xYRbhBWnWnGXVhsN1ckxlkXh8PA== dependencies: - "@react-native-community/cli-tools" "^4.6.3" + "@react-native-community/cli-tools" "^4.9.0" chalk "^3.0.0" glob "^7.1.3" js-yaml "^3.13.1" @@ -1360,39 +1080,53 @@ plist "^3.0.1" xcode "^2.0.0" -"@react-native-community/cli-tools@^4.6.3": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-4.6.3.tgz#dab9ce5fc45ae8847caa9f6cc85b67b284777b1f" - integrity sha512-ne/A1JUA86WgS3LpdqCwdpCbzfLJusfTllv+TDafNxEdziGPwTcRmeOk3QD3X0rwSawCJhfcnROzIc4AnfSP3w== +"@react-native-community/cli-server-api@^4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-4.9.0.tgz#503f50331c6e2cc8c5fcf6b693170e3a3a669d1a" + integrity sha512-lKBIXJjFLyu4+6Vhhj/QzD41aQGkVi8xWLqTYCgi26d61kjLuuZs0Xer02DPJK3+YADKExVdWrJzVHfJ7zYlTA== + dependencies: + "@react-native-community/cli-debugger-ui" "^4.9.0" + "@react-native-community/cli-tools" "^4.9.0" + compression "^1.7.1" + connect "^3.6.5" + errorhandler "^1.5.0" + pretty-format "^25.1.0" + serve-static "^1.13.1" + ws "^1.1.0" + +"@react-native-community/cli-tools@^4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-4.9.0.tgz#d8fd0326cc2fcaeb8c920baf24b68b63c8164fa2" + integrity sha512-vCeYkJ3n/EIaW3lAfznzojMffGxYhCUzwZzwBuC3+O+gYxkymdpletqNYLLEa04DzJr174mxgbgBw8g5IP91yA== dependencies: chalk "^3.0.0" lodash "^4.17.15" mime "^2.4.1" node-fetch "^2.6.0" + open "^6.2.0" + shell-quote "1.6.1" -"@react-native-community/cli-types@^4.6.3": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-4.6.3.tgz#e431e895e4ddedd0e2c80c2f492af60dd13cc15a" - integrity sha512-76uXaqPV1m6zGmL+x/KGHfLZiVVbCvkI4KElnd1dVEsDrVVoAsJ0tvBad+GhHh/NtYU1VmtuJ/zcKnjWdVla1A== +"@react-native-community/cli-types@^4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-4.9.0.tgz#4c80b5f3789f2d3ee744e4fbb01ce839d8399ac3" + integrity sha512-Sjun3LHuuuA6G9NIiyiqolNA7NP0CBGhbQA7twslJi3VaE1kj7OdBRCzpPtIYwK8eFWv3CEc/Qh+CoAw83Jp8A== "@react-native-community/cli@^4.5.1": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-4.6.3.tgz#8b906b8af87753a6bc580358ea17116a040d7e67" - integrity sha512-MqOvUyKfspzA/uUSQELouYDkS4hbqaCWG/Nc13/k+vwQnXjq2sJlVKZCrctV4IY33oKMr/S0LwyZiiiwhQ8GMg== + version "4.9.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-4.9.0.tgz#3525d831087e084861ca484569ebfb9b1a63faac" + integrity sha512-Aai8Tan2nJWbtJIzEMe/BrbbGFAAdusgXZ5/NB1k5oFUS6iXvW18+59ssC8FR2qGPbOLBg87oDn4Pca2u4CTlQ== dependencies: "@hapi/joi" "^15.0.3" - "@react-native-community/cli-debugger-ui" "^4.6.3" - "@react-native-community/cli-tools" "^4.6.3" - "@react-native-community/cli-types" "^4.6.3" + "@react-native-community/cli-debugger-ui" "^4.9.0" + "@react-native-community/cli-server-api" "^4.9.0" + "@react-native-community/cli-tools" "^4.9.0" + "@react-native-community/cli-types" "^4.9.0" chalk "^3.0.0" command-exists "^1.2.8" commander "^2.19.0" - compression "^1.7.1" - connect "^3.6.5" cosmiconfig "^5.1.0" deepmerge "^3.2.0" envinfo "^7.1.0" - errorhandler "^1.5.0" execa "^1.0.0" find-up "^4.1.0" fs-extra "^8.1.0" @@ -1405,19 +1139,17 @@ metro-config "^0.58.0" metro-core "^0.58.0" metro-react-native-babel-transformer "^0.58.0" + metro-resolver "^0.58.0" minimist "^1.2.0" mkdirp "^0.5.1" node-stream-zip "^1.9.1" - open "^6.2.0" ora "^3.4.0" pretty-format "^25.2.0" semver "^6.3.0" serve-static "^1.13.1" - shell-quote "1.6.1" strip-ansi "^5.2.0" sudo-prompt "^9.0.0" wcwidth "^1.0.1" - ws "^1.1.0" "@react-native-community/clipboard@^1.2.2": version "1.2.2" @@ -1457,23 +1189,22 @@ integrity sha512-tyzh79l4t/hxiyS9QD3LRmWMs8KVkZzjrkQ8U8+8To1wmvVCBtp8BenvNsDLTBO7CpO/YmiThpmIdEZMr1WuVw== "@react-navigation/core@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-3.5.1.tgz#7a2339fca3496979305fb3a8ab88c2ca8d8c214d" - integrity sha512-q7NyhWVYOhVIWqL2GZKa6G78YarXaVTTtOlSDkvy4ZIggo40wZzamlnrJRvsaQX46gsgw45FAWb5SriHh8o7eA== + version "3.7.6" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-3.7.6.tgz#e0244fcdc22937825b252197f70308bbe5709c58" + integrity sha512-loYFIn0Boy7C+vYxwcqsBVRFRO1EizZJErdutE6/3Jw6dbzz3Bnzupbw5hckZNB16GckacMwGoepZNIK51IIcg== dependencies: - hoist-non-react-statics "^3.3.0" - path-to-regexp "^1.7.0" - query-string "^6.4.2" - react-is "^16.8.6" + hoist-non-react-statics "^3.3.2" + path-to-regexp "^1.8.0" + query-string "^6.11.1" + react-is "^16.13.0" "@react-navigation/native@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-3.6.2.tgz#3634697b6350cc5189657ae4551f2d52b57fbbf0" - integrity sha512-Cybeou6N82ZeRmgnGlu+wzlV3z5BZQR2dmYaNFV1TNLUGHqtvv8E7oNw9uYcz9Ox5LFbiX+FdNTn2d6ZPlK0kg== + version "3.7.13" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-3.7.13.tgz#5fdf879d5af40fb5bf751b6d932dd30656c9991e" + integrity sha512-M6v1bLz0WbQmlPKF3WKBEZDGQ3CaqmzQULGs7XWtQe+f03VEbeX+kCkr/J6hw+rsgAy9Nwr4mGCPPQhF2pa7Yw== dependencies: - hoist-non-react-statics "^3.0.1" - react-native-safe-area-view "^0.14.1" - react-native-screens "^1.0.0 || ^1.0.0-alpha" + hoist-non-react-statics "^3.3.2" + react-native-safe-area-view "^0.14.9" "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" @@ -1483,48 +1214,47 @@ any-observable "^0.3.0" "@sentry/browser@^5.12.1": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.13.0.tgz#399b0a09d6603726d787b746bcc70659010bc50c" - integrity sha512-adiW9gG/gCrl6FQAA6Fk8osXMHxP3pYltszRK0mr55O7GcTC8RQNI3mEW/YuQV9IySUL8dFWQ0v8n0lfssHf/A== + version "5.19.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.19.1.tgz#b22f36fc71f36719ad352a54e6b31722622128c0" + integrity sha512-Aon5Nc2n8sIXKg6Xbr4RM3/Xs7vFpXksL56z3yIuGrmpCM8ToQ25/tQv8h+anYi72x5bn1npzaXB/NwU1Qwfhg== dependencies: - "@sentry/core" "5.13.0" - "@sentry/types" "5.12.4" - "@sentry/utils" "5.13.0" + "@sentry/core" "5.19.1" + "@sentry/types" "5.19.1" + "@sentry/utils" "5.19.1" tslib "^1.9.3" -"@sentry/cli@^1.51.0": - version "1.51.1" - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.51.1.tgz#6ad6b0a74555a5e92e6bdc23e5814418d3287658" - integrity sha512-JKYdoE5Pz8AQaupVQW3XOFTuff1UyLtxhcFzQPwQXiZEyXabo00dosX3YkqPKUwMv7LgxTOH23SJU8HwStAmFw== - dependencies: - fs-copy-file-sync "^1.1.1" - https-proxy-agent "^4.0.0" - mkdirp "^0.5.1" - node-fetch "^2.1.2" - progress "2.0.0" - proxy-from-env "^1.0.0" - -"@sentry/core@5.13.0", "@sentry/core@^5.12.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.13.0.tgz#144beb2d48b53244774a7fd809f9b5b672920971" - integrity sha512-e0olbaHBmANO1RIBc7xynSkBZ6BsK7drycz0TawLUnx+0H3aEau3K9U2QVdbjwLNPdydcIS+UgYfTBtXfe0E+A== +"@sentry/cli@^1.52.4": + version "1.53.0" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.53.0.tgz#f675d1b0955b94b0cb809d752ff272c4a341d306" + integrity sha512-FgVR+AqPd1elj/HGTCg4FcQDVmIGwKGtaHDzHi2ipph9EOVYm6Ce0xYcHxYgKZuVyQMyg+zD5ZK3yHrB1AYlnw== dependencies: - "@sentry/hub" "5.13.0" - "@sentry/minimal" "5.13.0" - "@sentry/types" "5.12.4" - "@sentry/utils" "5.13.0" + https-proxy-agent "^5.0.0" + mkdirp "^0.5.5" + node-fetch "^2.6.0" + progress "^2.0.3" + proxy-from-env "^1.1.0" + +"@sentry/core@5.19.1", "@sentry/core@^5.12.0": + version "5.19.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.19.1.tgz#f5ff7feb1118035f75f1d0bc2a76e2b040d2aa8e" + integrity sha512-BGGxjeT95Og/hloBhQXAVcndVXPmIU6drtF3oKRT12cBpiG965xEDEUwiJVvyb5MAvojdVEZBK2LURUFY/d7Zw== + dependencies: + "@sentry/hub" "5.19.1" + "@sentry/minimal" "5.19.1" + "@sentry/types" "5.19.1" + "@sentry/utils" "5.19.1" tslib "^1.9.3" -"@sentry/hub@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.13.0.tgz#f48e3e4e273f40316391cd6190e22ea69cb20c7e" - integrity sha512-MeytooJ5g91zxq4/LU1LHj7KxpggAEn1dybEsWG31QVy67J4a40zIGfYgGGIVAFSv0WVlk5Ei5C159LhgW59/w== +"@sentry/hub@5.19.1": + version "5.19.1" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.19.1.tgz#f3bc8500680974ce43c1eedcd8e90696cc18b306" + integrity sha512-XjfbNGWVeDsP38alm5Cm08YPIw5Hu6HbPkw7a3y1piViTrg4HdtsE+ZJqq0YcURo2RTpg6Ks6coCS/zJxIPygQ== dependencies: - "@sentry/types" "5.12.4" - "@sentry/utils" "5.13.0" + "@sentry/types" "5.19.1" + "@sentry/utils" "5.19.1" tslib "^1.9.3" -"@sentry/integrations@^5.12.0", "@sentry/integrations@^5.13.0": +"@sentry/integrations@5.13.0": version "5.13.0" resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-5.13.0.tgz#358e3225ff302353ea38214daa4a5eed1eb5d4aa" integrity sha512-xfi3LyspqFxb2xaSKu5MMrA4kuN8waagbOjInAut48jrdqATLioMjCcUruU/aHILAUCCznPW9zsR42J1OmVoMw== @@ -1533,16 +1263,25 @@ "@sentry/utils" "5.13.0" tslib "^1.9.3" -"@sentry/minimal@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.13.0.tgz#ee906191e3c2a1f7d0925fbfa0a4e96261013764" - integrity sha512-6D2Mu4TrmJmGlvb+z1Pp6yI2fUmdY1RvwK0MqmBP+QJdrd0as7cpGuwFSXgUs6CLUflDzlpn3n6WcgGV8oEDYA== +"@sentry/integrations@^5.12.0": + version "5.19.1" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-5.19.1.tgz#9c6680eceff95b9fb66ad18c2cf9fa2e9f0181b5" + integrity sha512-JMiYtHh6m50eMC8BHkcZZjl6/Nx2JVivhkLx6EGsbgNTpGlsODhrRt+kgRKFhPWhEjKlcjx+l6tmq90NbfLusg== dependencies: - "@sentry/hub" "5.13.0" - "@sentry/types" "5.12.4" + "@sentry/types" "5.19.1" + "@sentry/utils" "5.19.1" tslib "^1.9.3" -"@sentry/react-native@^1.3.3": +"@sentry/minimal@5.19.1": + version "5.19.1" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.19.1.tgz#04043d93a7dc90cbed1a31d80f6bf59688ea3100" + integrity sha512-pgNfsaCroEsC8gv+NqmPTIkj4wyK6ZgYLV12IT4k2oJLkGyg45TSAKabyB7oEP5jsj8sRzm8tDomu8M4HpaCHg== + dependencies: + "@sentry/hub" "5.19.1" + "@sentry/types" "5.19.1" + tslib "^1.9.3" + +"@sentry/react-native@1.3.3": version "1.3.3" resolved "https://registry.yarnpkg.com/@sentry/react-native/-/react-native-1.3.3.tgz#a2acb53171c743d89e92eb578dde9af9e6a91422" integrity sha512-OGeq1igrYTtgPYnOZEEWFRPyDESiGCkvyShL6YJ7U7kaDq5Fw3hgOHJovo/QhsQC7qVaYjgaMPX3Ht08xbh4IQ== @@ -1554,12 +1293,17 @@ "@sentry/utils" "^5.12.0" "@sentry/wizard" "^1.1.1" -"@sentry/types@5.12.4", "@sentry/types@^5.12.0": +"@sentry/types@5.12.4": version "5.12.4" resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.12.4.tgz#6e52639bc3b4e136e9a0da5385890f8f78bb7697" integrity sha512-JoN3YIp7Z+uxUZArj2B6NcEoXFQDhd0kqO0QpfiHZyg4Dhx2/E2aHuVx0H6Fndk+60iEZSECaCBXe2MOPo4fqA== -"@sentry/utils@5.13.0", "@sentry/utils@^5.12.0": +"@sentry/types@5.19.1", "@sentry/types@^5.12.0": + version "5.19.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.19.1.tgz#8762f668d3fc2416fbde31d15d13009544caeb54" + integrity sha512-M5MhTLnjqYFwxMwcFPBpBgYQqI9hCvtVuj/A+NvcBHpe7VWOXdn/Sys+zD6C76DWGFYQdw3OWCsZimP24dL8mA== + +"@sentry/utils@5.13.0": version "5.13.0" resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.13.0.tgz#6463e53b6178dbbd3b90e671517cbca82744b055" integrity sha512-BcmNQN+IfFbVWGnEwXHku69zqJc97sjBRYVxpStKMaO/4aLVIQcOJCMWxVJtVoSVAHQaigBZmFutWH7EJMRJxg== @@ -1567,12 +1311,20 @@ "@sentry/types" "5.12.4" tslib "^1.9.3" +"@sentry/utils@5.19.1", "@sentry/utils@^5.12.0": + version "5.19.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.19.1.tgz#e1134db40e4bb9732251e515721cec7ee94d4d9c" + integrity sha512-neUiNBnZSHjWTZWy2QV02EHTx1C2L3DBPzRXlh0ca5xrI7LMBLmhkHlhebn1E5ky3PW1teqZTgmh0jZoL99TEA== + dependencies: + "@sentry/types" "5.19.1" + tslib "^1.9.3" + "@sentry/wizard@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@sentry/wizard/-/wizard-1.1.1.tgz#f673817bcf78a42ebd54e6652d6eb3c32fa12af5" - integrity sha512-P07iMkndcT865SS4WMEBlzda4MXg1tOzPe8kg9p8vQlppWZ4ZyCgs5cDyTZk3b7HLffk+YPL4S116mfwzVdP7w== + version "1.1.4" + resolved "https://registry.yarnpkg.com/@sentry/wizard/-/wizard-1.1.4.tgz#df51af4271d11f729b938dde4864514b69e4aac9" + integrity sha512-xVpL0lnQK2bbEwUKKjs3dKhy27va8HW75Q8r1vaR63iBCpB5LpP4Q4NN5G/VEWdYnH8rcazsOA207716E1cm4g== dependencies: - "@sentry/cli" "^1.51.0" + "@sentry/cli" "^1.52.4" chalk "^2.4.1" glob "^7.1.3" inquirer "^6.2.0" @@ -1584,9 +1336,9 @@ yargs "^12.0.2" "@sinonjs/commons@^1.7.0": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2" - integrity sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw== + version "1.8.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d" + integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q== dependencies: type-detect "4.0.8" @@ -1610,9 +1362,9 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.0.tgz#f1ec1c104d1bb463556ecb724018ab788d0c172a" - integrity sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw== + version "7.6.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== dependencies: "@babel/types" "^7.0.0" @@ -1625,12 +1377,19 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.7.tgz#2496e9ff56196cc1429c72034e07eab6121b6f3f" - integrity sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw== + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.11.tgz#1ae3010e8bf8851d324878b42acec71986486d18" + integrity sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q== dependencies: "@babel/types" "^7.3.0" +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" @@ -1641,27 +1400,34 @@ resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== +"@types/graceful-fs@^4.1.2": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f" + integrity sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ== + dependencies: + "@types/node" "*" + "@types/hammerjs@^2.0.36": version "2.0.36" resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.36.tgz#17ce0a235e9ffbcdcdf5095646b374c2bf615a4c" integrity sha512-7TUK/k2/QGpEAv/BCwSHlYu3NXZhQ9ZwBYpzr9tjlPIL2C5BeGhH3DmVavRx3ZNyELX5TLC91JTz/cen6AAtIQ== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz#79d7a78bad4219f4c03d6557a1c72d9ca6ba62d5" + integrity sha512-rsZg7eL+Xcxsxk2XlBt9KcG8nOp9iYdKCOikY9x2RFJCyOdNj4MKPQty0e8oZr29vVAzKXr1BmR+kZauti3o1w== "@types/istanbul-lib-report@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" - integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" @@ -1672,14 +1438,19 @@ integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== "@types/node@*": - version "12.12.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.3.tgz#ebfe83507ac506bc3486314a8aa395be66af8d23" - integrity sha512-opgSsy+cEF9N8MgaVPnWVtdJ3o4mV2aMHvDq7thkQUFt0EuOHJon4rQpJfhjmNHB+ikl0Cd6WhWIErOyQ+f7tw== + version "14.0.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.5.tgz#3d03acd3b3414cf67faf999aed11682ed121f22b" + integrity sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA== "@types/node@^10.3.2": - version "10.17.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.2.tgz#41b5afbcde1a5a805302a4da3cf399499f1bbf64" - integrity sha512-sAh60KDol+MpwOr1RTK0+HgBEYejKsxdpmrOS1Wts5bI03dLzq8F7T0sRXDKeaEK8iWDlGfdzxrzg6vx/c5pNA== + version "10.17.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.24.tgz#c57511e3a19c4b5e9692bb2995c40a3a52167944" + integrity sha512-5SCfvCxV74kzR3uWgTYiGxrd69TbT1I6+cMx1A5kEly/IVveJBimtAMlXiEyVFn5DvUFewQWxOOiJhlxeQwxgA== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== "@types/prettier@^1.19.0": version "1.19.1" @@ -1692,21 +1463,21 @@ integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== "@types/yargs-parser@*": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" - integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" + integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== "@types/yargs@^13.0.0": - version "13.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.3.tgz#76482af3981d4412d65371a318f992d33464a380" - integrity sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ== + version "13.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.9.tgz#44028e974343c7afcf3960f1a2b1099c39a7b5e1" + integrity sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg== dependencies: "@types/yargs-parser" "*" "@types/yargs@^15.0.0": - version "15.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.4.tgz#7e5d0f8ca25e9d5849f2ea443cf7c402decd8299" - integrity sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg== + version "15.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" + integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== dependencies: "@types/yargs-parser" "*" @@ -1810,14 +1581,9 @@ Base64@~0.2.0: integrity sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg= abab@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.2.tgz#a2fba1b122c69a85caa02d10f9270c7219709a9d" - integrity sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== abort-controller@^3.0.0: version "3.0.0" @@ -1875,12 +1641,7 @@ acorn-globals@^4.3.2: acorn "^6.0.1" acorn-walk "^6.0.1" -acorn-jsx@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" - integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== - -acorn-jsx@^5.2.0: +acorn-jsx@^5.0.0, acorn-jsx@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== @@ -1896,9 +1657,9 @@ acorn@^6.0.1, acorn@^6.0.7: integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== acorn@^7.1.0, acorn@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" - integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" + integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== aes-js@3.0.0: version "3.0.0" @@ -1922,10 +1683,12 @@ agent-base@4, agent-base@^4.2.0, agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" -agent-base@5: - version "5.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" - integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== +agent-base@6: + version "6.0.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.0.tgz#5d0101f19bbfaed39980b22ae866de153b93f09a" + integrity sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw== + dependencies: + debug "4" agent-base@~4.2.1: version "4.2.1" @@ -1958,11 +1721,11 @@ airbnb-prop-types@^2.15.0: react-is "^16.9.0" ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + version "6.12.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" + integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== dependencies: - fast-deep-equal "^2.0.1" + fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" @@ -2094,19 +1857,6 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2162,13 +1912,14 @@ array-filter@~0.0.0: resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= +array-includes@^3.0.3, array-includes@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" array-map@~0.0.0: version "0.0.0" @@ -2208,21 +1959,20 @@ array-unique@^0.3.2: integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= array.prototype.find@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.0.tgz#630f2eaf70a39e608ac3573e45cf8ccd0ede9ad7" - integrity sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg== + version "2.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.1.tgz#3baca26108ca7affb08db06bf0be6cb3115a969c" + integrity sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA== dependencies: define-properties "^1.1.3" - es-abstract "^1.13.0" + es-abstract "^1.17.4" array.prototype.flat@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.2.tgz#8f3c71d245ba349b6b64b4078f76f5576f1fd723" - integrity sha512-VXjh7lAL4KXKF2hY4FnEW9eRW6IhdvFW1sN/JwLbmECbCgACCnBHNyP3lFiYuttr0jxRN9Bsc5+G27dMseSWqQ== + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== dependencies: define-properties "^1.1.3" - es-abstract "^1.15.0" - function-bind "^1.1.1" + es-abstract "^1.17.0-next.1" arrify@^1.0.1: version "1.0.1" @@ -2268,9 +2018,9 @@ assign-symbols@^1.0.0: integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= ast-types@0.x.x: - version "0.13.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" - integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== + version "0.13.3" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7" + integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA== astral-regex@^1.0.0: version "1.0.0" @@ -2284,7 +2034,7 @@ async-eventemitter@^0.2.2: dependencies: async "^2.4.0" -async-limiter@^1.0.0, async-limiter@~1.0.0: +async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== @@ -2322,7 +2072,7 @@ asyncstorage-down@4.2.0: ltgt "^2.1.3" tiny-queue "0.2.0" -atob@^2.1.1: +atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== @@ -2345,9 +2095,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + version "1.10.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" + integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== axios@^0.19.2: version "0.19.2" @@ -2373,7 +2123,7 @@ babel-eslint@10.0.1: eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" -babel-eslint@10.0.3, babel-eslint@^10.0.1: +babel-eslint@10.0.3: version "10.0.3" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== @@ -2385,23 +2135,36 @@ babel-eslint@10.0.3, babel-eslint@^10.0.1: eslint-visitor-keys "^1.0.0" resolve "^1.12.0" -babel-jest@^25.2.6, babel-jest@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.3.0.tgz#999d0c19e8427f66b796bf9ea233eedf087b957c" - integrity sha512-qiXeX1Cmw4JZ5yQ4H57WpkO0MZ61Qj+YnsVUwAMnDV5ls+yHon11XjarDdgP7H8lTmiEi6biiZA8y3Tmvx6pCg== +babel-eslint@^10.0.1: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-jest@^25.2.6, babel-jest@^25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.5.1.tgz#bc2e6101f849d6f6aec09720ffc7bc5332e62853" + integrity sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ== dependencies: - "@jest/transform" "^25.3.0" - "@jest/types" "^25.3.0" + "@jest/transform" "^25.5.1" + "@jest/types" "^25.5.0" "@types/babel__core" "^7.1.7" babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^25.3.0" + babel-preset-jest "^25.5.0" chalk "^3.0.0" + graceful-fs "^4.2.4" slash "^3.0.0" -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" @@ -2416,11 +2179,13 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz#2af07632b8ac7aad7d414c1e58425d5fc8e84909" - integrity sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw== +babel-plugin-jest-hoist@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz#129c80ba5c7fc75baf3a45b93e2e372d57ca2677" + integrity sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g== dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" "@types/babel__traverse" "^7.0.6" babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: @@ -2487,12 +2252,12 @@ babel-preset-fbjs@^3.2.0, babel-preset-fbjs@^3.3.0: "@babel/plugin-transform-template-literals" "^7.0.0" babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" -babel-preset-jest@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.3.0.tgz#9ab40aee52a19bdc52b8b1ec2403d5914ac3d86b" - integrity sha512-tjdvLKNMwDI9r+QWz9sZUQGTq1dpoxjUqFUpEasAc7MOtHg9XuLT2fx0udFG+k1nvMV0WvHHVAN7VmCZ+1Zxbw== +babel-preset-jest@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz#c1d7f191829487a907764c65307faa0e66590b49" + integrity sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw== dependencies: - babel-plugin-jest-hoist "^25.2.6" + babel-plugin-jest-hoist "^25.5.0" babel-preset-current-node-syntax "^0.1.2" babel-runtime@^6.26.0: @@ -2520,22 +2285,15 @@ base-64@0.1.0, base-64@^0.1.0: resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha1-eAqZyE59YAJgNhURxId2E78k9rs= -base-x@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.4.tgz#94c1788736da065edb1d68808869e357c977fa77" - integrity sha512-UYOadoSIkEI/VrRGSG6qp93rp2WdokiAiNYDfGW5qURAY8GiAQkvMbwNNSDYiVJopqv4gCna7xqf4rrNGp+5AA== - dependencies: - safe-buffer "^5.0.1" - base-x@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/base-x/-/base-x-1.1.0.tgz#42d3d717474f9ea02207f6d1aa1f426913eeb7ac" integrity sha1-QtPXF0dPnqAiB/bRqh9CaRPut6w= -base-x@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.7.tgz#1c5a7fafe8f66b4114063e8da102799d4e7c408f" - integrity sha512-zAKJGuQPihXW22fkrfOclUUZXM2g92z5GzlSMHxhO6r6Qj+Nm0ccaGNBzDZojzwOMkpjAv4J0fOv1U4go+a4iw== +base-x@^3.0.2, base-x@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" + integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== dependencies: safe-buffer "^5.0.1" @@ -2564,10 +2322,10 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -big-integer@^1.6.7: - version "1.6.47" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.47.tgz#e1e9320e26c4cc81f64fbf4b3bb20e025bf18e2d" - integrity sha512-9t9f7X3as2XGX8b52GqG6ox0GvIdM86LyIXASJnDCFhYNgt+A+MByQZ3W2PyMRZjEvG5f8TEbSPfEotVuMJnQg== +big-integer@^1.6.44: + version "1.6.48" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" + integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== bignumber.js@8.1.1: version "8.1.1" @@ -2615,12 +2373,7 @@ bl@^0.9.5, bl@~0.8.1: dependencies: readable-stream "~1.0.26" -bluebird@^3.5.0, bluebird@^3.5.3: - version "3.7.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" - integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== - -bluebird@^3.5.4: +bluebird@^3.5.0, bluebird@^3.5.3, bluebird@^3.5.4: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -2630,11 +2383,16 @@ bn.js@4.11.6: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= -bn.js@4.11.8, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.4.0, bn.js@^4.8.0: +bn.js@4.11.8, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.4.0, bn.js@^4.8.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +bn.js@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" + integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== + boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -2653,19 +2411,19 @@ boxen@^1.2.1: term-size "^1.2.0" widest-line "^2.0.0" -bplist-creator@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.7.tgz#37df1536092824b87c42f957b01344117372ae45" - integrity sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU= +bplist-creator@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.8.tgz#56b2a6e79e9aec3fc33bf831d09347d73794e79c" + integrity sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA== dependencies: stream-buffers "~2.2.0" -bplist-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.1.1.tgz#d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6" - integrity sha1-1g1dzCDLptx+HymbNdPh+V2vuuY= +bplist-parser@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== dependencies: - big-integer "^1.6.7" + big-integer "^1.6.44" brace-expansion@^1.1.7: version "1.1.11" @@ -2710,10 +2468,10 @@ browser-passworder@^2.0.3: dependencies: browserify-unibabel "^3.0.0" -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browser-resolve@^1.11.3: version "1.11.3" @@ -2753,7 +2511,7 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0: +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= @@ -2770,17 +2528,19 @@ browserify-sha3@^0.0.4: safe-buffer "^5.1.1" browserify-sign@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + version "4.2.0" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" + integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.2" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" browserify-unibabel@^3.0.0: version "3.0.0" @@ -2823,7 +2583,7 @@ bs58check@^2.1.2: create-hash "^1.1.0" safe-buffer "^5.1.2" -bser@^2.0.0: +bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== @@ -2835,12 +2595,30 @@ btoa@^1.2.1: resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + buffer-crc32@^0.2.13: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer-from@^1.0.0: +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0, buffer-from@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== @@ -2859,23 +2637,15 @@ buffer@5.2.1: ieee754 "^1.1.4" buffer@^4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.2.1: - version "5.4.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" - integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -buffer@^5.4.3: +buffer@^5.2.1, buffer@^5.4.3, buffer@^5.5.0: version "5.6.0" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== @@ -3058,11 +2828,6 @@ child-process-promise@^2.2.0: node-version "^1.0.0" promise-polyfill "^6.0.1" -chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== - ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" @@ -3139,9 +2904,9 @@ cli-truncate@^0.2.1: string-width "^1.0.1" cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== cliui@^3.0.3: version "3.2.0" @@ -3255,9 +3020,9 @@ color-support@^1.1.3: integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== colorette@^1.0.7: - version "1.1.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz#1f943e5a357fac10b4e0f5aaef3b14cdc1af6ec7" - integrity sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.0.tgz#45306add826d196e8c87236ac05d797f25982e63" + integrity sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw== colors@0.6.x: version "0.6.2" @@ -3277,9 +3042,9 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: delayed-stream "~1.0.0" command-exists@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291" - integrity sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw== + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== commander@2.9.0: version "2.9.0" @@ -3309,11 +3074,11 @@ component-emitter@^1.2.0, component-emitter@^1.2.1: integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== compressible@~2.0.16: - version "2.0.17" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" - integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: - mime-db ">= 1.40.0 < 2" + mime-db ">= 1.43.0 < 2" compression@^1.7.1: version "1.7.4" @@ -3397,11 +3162,6 @@ connext@4.2.5: typescript-fsa-reducers "^1.1.0" ws "^7.0.0" -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" @@ -3416,14 +3176,7 @@ content-hash@2.3.2: multicodec "^0.5.1" multihashes "^0.4.14" -convert-source-map@^1.1.0, convert-source-map@^1.4.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -3440,15 +3193,20 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +core-js-pure@^3.0.0: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" + integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== + core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= core-js@^2.2.2, core-js@^2.4.0, core-js@^2.4.1: - version "2.6.10" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f" - integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA== + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -3491,7 +3249,7 @@ create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -3549,18 +3307,18 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: which "^1.2.9" cross-spawn@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" - integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" crypto-js@^3.1.4: - version "3.1.8" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.8.tgz#715f070bf6014f2ae992a98b3929258b713f08d5" - integrity sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU= + version "3.3.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" + integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== crypto-random-string@^1.0.0: version "1.0.0" @@ -3588,11 +3346,11 @@ css-select@~1.2.0: nth-check "~1.0.1" css-tree@^1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== dependencies: - mdn-data "2.0.4" + mdn-data "2.0.6" source-map "^0.6.1" css-what@2.1: @@ -3616,9 +3374,9 @@ cssom@~0.3.6: integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.2.0.tgz#e4c44debccd6b7911ed617a4395e5754bba59992" - integrity sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" @@ -3659,16 +3417,16 @@ date-fns@^1.27.2: integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== dayjs@^1.8.15: - version "1.8.24" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.24.tgz#2ef8a2ab9425eaf3318fe78825be1c571027488d" - integrity sha512-bImQZbBv86zcOWOq6fLg7r4aqMx8fScdmykA7cSh+gH1Yh8AM0Dbw0gHYrsOrza6oBBnkK+/OaR+UAa9UsMrDw== + version "1.8.27" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.27.tgz#a8ae63ee990af28c05c430f0e160ae835a0fbbf8" + integrity sha512-Jpa2acjWIeOkg8KURUHICk0EqnEFSSF5eMEscsOgyJ92ZukXwmpmRkPSUka7KHSfbj5eKH30ieosYip+ky9emQ== debounce@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== -debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -3689,7 +3447,7 @@ debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -debug@^3.1.0, debug@^3.2.6: +debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -3723,10 +3481,30 @@ deep-assign@^3.0.0: dependencies: is-obj "^1.0.0" -deep-equal@*, deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.0.tgz#3103cdf8ab6d32cf4a8df7865458f2b8d33f3745" - integrity sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw== +deep-equal@*: + version "2.0.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.3.tgz#cad1c15277ad78a5c01c49c2dee0f54de8a6a7b0" + integrity sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA== + dependencies: + es-abstract "^1.17.5" + es-get-iterator "^1.1.0" + is-arguments "^1.0.4" + is-date-object "^1.0.2" + is-regex "^1.0.5" + isarray "^2.0.5" + object-is "^1.1.2" + object-keys "^1.1.1" + object.assign "^4.1.0" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + which-boxed-primitive "^1.0.1" + which-collection "^1.0.1" + which-typed-array "^1.1.2" + +deep-equal@^1.0.0, deep-equal@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== dependencies: is-arguments "^1.0.4" is-date-object "^1.0.1" @@ -3735,11 +3513,6 @@ deep-equal@*, deep-equal@^1.0.0: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= - deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -3841,11 +3614,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - denodeify@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" @@ -3857,9 +3625,9 @@ depd@~1.1.2: integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -3874,26 +3642,22 @@ detect-browser@5.1.0: resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.1.0.tgz#0c51c66b747ad8f98a6832bf3026a5a23a7850ff" integrity sha512-WKa9p+/MNwmTiS+V2AS6eGxic+807qvnV3hC+4z2GTY+F42h1n8AynVTMMc4EJBC32qMs6yjOTpeDEQQt/AVqQ== -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== detox@^16.5.1: - version "16.5.1" - resolved "https://registry.yarnpkg.com/detox/-/detox-16.5.1.tgz#4d2472f641c3aadaeaed4967a7c3c84dca4b0f34" - integrity sha512-GtNQY20r7n0Nl0u4C3vHjv9Zsp1Nw1puOHOLylqeX3WGe8V5awutIipp2ASKc7ufSn0Z8lteRoY7HGVtzpf67w== + version "16.7.1" + resolved "https://registry.yarnpkg.com/detox/-/detox-16.7.1.tgz#f027809839b43c8a58e156dd8ea2267b8d36a744" + integrity sha512-TrxANje18ztxdqBv+YmC8H5vVab6m6v36p96ZvtBmuMkRfeoWBjVNKJH0bsA7zqoSu5C28gE77tfu/hahAkM5A== dependencies: "@babel/core" "^7.4.5" bunyan "^1.8.12" bunyan-debug-stream "^1.1.0" chalk "^2.4.2" child-process-promise "^2.2.0" + find-up "^4.1.0" fs-extra "^4.0.2" funpermaproxy "^1.0.1" get-port "^2.1.0" @@ -3976,9 +3740,9 @@ doctrine@^3.0.0: esutils "^2.0.2" dom-serializer@0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb" - integrity sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q== + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== dependencies: domelementtype "^2.0.1" entities "^2.0.0" @@ -3992,9 +3756,9 @@ dom-serializer@~0.1.1: entities "^1.1.1" dom-walk@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" - integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: version "1.3.1" @@ -4043,6 +3807,13 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" +dotignore@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" + integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== + dependencies: + minimatch "^3.0.4" + drbg.js@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" @@ -4104,20 +3875,7 @@ elliptic@6.3.3: hash.js "^1.0.0" inherits "^2.0.1" -elliptic@^6.0.0, elliptic@^6.4.0, elliptic@^6.4.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b" - integrity sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -elliptic@^6.5.2: +elliptic@6.5.2, elliptic@^6.0.0, elliptic@^6.4.0, elliptic@^6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== @@ -4174,14 +3932,14 @@ entities@^1.1.1, entities@~1.1.1: integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.2.tgz#ac74db0bba8d33808bbf36809c3a5c3683531436" + integrity sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw== envinfo@^7.1.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.5.0.tgz#91410bb6db262fb4f1409bd506e9ff57e91023f4" - integrity sha512-jDgnJaF/Btomk+m3PZDTTCb5XIIIX3zYItnCRfF73zVgvinLoRomuhi75Y4su0PtQxWz4v66XnLLckyvyJTOIQ== + version "7.5.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.5.1.tgz#93c26897225a00457c75e734d354ea9106a72236" + integrity sha512-hQBkDf2iO4Nv0CNHpCuSBeaSrveU6nThVxFGTrq/eDlV716UQk09zChaJae4mZRsos1x4YLY2TaH3LHUae3ZmQ== enzyme-adapter-react-16@1.10.0: version "1.10.0" @@ -4196,16 +3954,16 @@ enzyme-adapter-react-16@1.10.0: react-test-renderer "^16.0.0-0" enzyme-adapter-utils@^1.10.0: - version "1.12.1" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.1.tgz#e828e0d038e2b1efa4b9619ce896226f85c9dd88" - integrity sha512-KWiHzSjZaLEoDCOxY8Z1RAbUResbqKN5bZvenPbfKtWorJFVETUw754ebkuCQ3JKm0adx1kF8JaiR+PHPiP47g== + version "1.13.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.0.tgz#01c885dde2114b4690bf741f8dc94cee3060eb78" + integrity sha512-YuEtfQp76Lj5TG1NvtP2eGJnFKogk/zT70fyYHXK2j3v6CtuHqc8YmgH/vaiBfL8K1SgVVbQXtTcgQZFwzTVyQ== dependencies: airbnb-prop-types "^2.15.0" - function.prototype.name "^1.1.1" + function.prototype.name "^1.1.2" object.assign "^4.1.0" - object.fromentries "^2.0.1" + object.fromentries "^2.0.2" prop-types "^15.7.2" - semver "^5.7.0" + semver "^5.7.1" enzyme-to-json@3.3.5: version "3.3.5" @@ -4270,23 +4028,7 @@ errorhandler@^1.5.0: accepts "~1.3.7" escape-html "~1.0.3" -es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.15.0, es-abstract@^1.5.0, es-abstract@^1.7.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d" - integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg== - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.0" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-inspect "^1.6.0" - object-keys "^1.1.1" - string.prototype.trimleft "^2.1.0" - string.prototype.trimright "^2.1.0" - -es-abstract@^1.17.4, es-abstract@^1.17.5: +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, es-abstract@^1.17.5: version "1.17.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== @@ -4303,14 +4045,18 @@ es-abstract@^1.17.4, es-abstract@^1.17.5: string.prototype.trimleft "^2.1.1" string.prototype.trimright "^2.1.1" -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== +es-get-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" + integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + es-abstract "^1.17.4" + has-symbols "^1.0.1" + is-arguments "^1.0.4" + is-map "^2.0.1" + is-set "^2.0.1" + is-string "^1.0.5" + isarray "^2.0.5" es-to-primitive@^1.2.1: version "1.2.1" @@ -4348,19 +4094,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@1.x.x: - version "1.12.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" - integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -escodegen@^1.11.1: +escodegen@1.x.x, escodegen@^1.11.1: version "1.14.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== @@ -4393,19 +4127,19 @@ eslint-config-react-native@4.0.0: eslint-plugin-react-native "^3.3.0" eslint-import-resolver-node@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" - integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== + version "0.3.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" + integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== dependencies: debug "^2.6.9" - resolve "^1.5.0" + resolve "^1.13.1" -eslint-module-utils@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz#7b4675875bf96b0dbf1b21977456e5bb1f5e018c" - integrity sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw== +eslint-module-utils@^2.4.0, eslint-module-utils@^2.4.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== dependencies: - debug "^2.6.8" + debug "^2.6.9" pkg-dir "^2.0.0" eslint-plugin-babel@^5.2.1: @@ -4416,9 +4150,9 @@ eslint-plugin-babel@^5.2.1: eslint-rule-composer "^0.3.0" eslint-plugin-eslint-comments@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.2.tgz#4ef6c488dbe06aa1627fea107b3e5d059fc8a395" - integrity sha512-QexaqrNeteFfRTad96W+Vi4Zj1KFbkHHNMMaHZEYcovKav6gdomyGzaxSDSL3GoIyUOo078wRAdYlu1caiauIQ== + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== dependencies: escape-string-regexp "^1.0.5" ignore "^5.0.5" @@ -4430,7 +4164,7 @@ eslint-plugin-flowtype@2.50.3: dependencies: lodash "^4.17.10" -eslint-plugin-import@2.18.2, eslint-plugin-import@^2.14.0: +eslint-plugin-import@2.18.2: version "2.18.2" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== @@ -4447,6 +4181,24 @@ eslint-plugin-import@2.18.2, eslint-plugin-import@^2.14.0: read-pkg-up "^2.0.0" resolve "^1.11.0" +eslint-plugin-import@^2.14.0: + version "2.20.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d" + integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg== + dependencies: + array-includes "^3.0.3" + array.prototype.flat "^1.2.1" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.1" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" + read-pkg-up "^2.0.0" + resolve "^1.12.0" + eslint-plugin-jest@22.4.1: version "22.4.1" resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.4.1.tgz#a5fd6f7a2a41388d16f527073b778013c5189a9c" @@ -4504,7 +4256,7 @@ eslint-plugin-react@7.12.4: prop-types "^15.6.2" resolve "^1.9.0" -eslint-plugin-react@7.16.0, eslint-plugin-react@^7.11.1: +eslint-plugin-react@7.16.0: version "7.16.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz#9928e4f3e2122ed3ba6a5b56d0303ba3e41d8c09" integrity sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug== @@ -4519,6 +4271,23 @@ eslint-plugin-react@7.16.0, eslint-plugin-react@^7.11.1: prop-types "^15.7.2" resolve "^1.12.0" +eslint-plugin-react@^7.11.1: + version "7.20.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.0.tgz#f98712f0a5e57dfd3e5542ef0604b8739cd47be3" + integrity sha512-rqe1abd0vxMjmbPngo4NaYxTcR3Y4Hrmc/jg4T+sYz63yqlmJRknpEQfmWY+eDWPuMmix6iUIK+mv0zExjeLgA== + dependencies: + array-includes "^3.1.1" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.2.3" + object.entries "^1.1.1" + object.fromentries "^2.0.2" + object.values "^1.1.1" + prop-types "^15.7.2" + resolve "^1.15.1" + string.prototype.matchall "^4.0.2" + xregexp "^4.3.0" + eslint-plugin-relay@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/eslint-plugin-relay/-/eslint-plugin-relay-1.4.1.tgz#5af2ac13e24bd01ad17b6a4014204918d65021cd" @@ -4670,7 +4439,7 @@ espree@^6.1.2: acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" -esprima@3.x.x, esprima@^3.1.3: +esprima@3.x.x: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= @@ -4681,11 +4450,11 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" esrecurse@^4.1.0: version "4.2.1" @@ -4694,12 +4463,17 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -esutils@^2.0.0, esutils@^2.0.2: +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== + +esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== @@ -4727,9 +4501,9 @@ eth-contract-metadata@1.12.1: integrity sha512-9u2jUcdxaKIv4RvA9RtjyD4+M2yWt4yCulR5bpdQTiG3HUFnN9lHtNL5NIRDpvQVJKerFhexrgEM2WdGP3a6VA== eth-contract-metadata@^1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/eth-contract-metadata/-/eth-contract-metadata-1.11.0.tgz#4d23a8208d5d53be9d4c0696ed8492b505c6bca1" - integrity sha512-Bbvio71M+lH+qXd8XXddpTc8hhjL9m4fNPOxmZFIX8z0/VooUdwV8YmmDAbkU5WVioZi+Jp1XaoO7VwzXnDboA== + version "1.13.0" + resolved "https://registry.yarnpkg.com/eth-contract-metadata/-/eth-contract-metadata-1.13.0.tgz#9819d0e556ea2187da91d6b49ce96abc5fce2a73" + integrity sha512-9CjXHX8IdXysUEvOHdbCsjdAwM1E98jaeK2HeOqm/9S/vOZ8YryaBBt/YSiBq3MkpCwf+d1pEQ53p96rsdy52w== eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.8: version "2.0.8" @@ -4761,21 +4535,14 @@ eth-hd-keyring@^3.5.0: events "^1.1.1" xtend "^4.0.1" -eth-json-rpc-errors@^1.0.1, eth-json-rpc-errors@^1.1.0: +eth-json-rpc-errors@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-1.1.1.tgz#148377ef55155585981c21ff574a8937f9d6991f" integrity sha512-WT5shJ5KfNqHi9jOZD+ID8I1kuYWNrigtZat7GOQkvwo99f8SzAVaEcWhJUv656WiZOAg3P1RiJQANtUmDmbIg== dependencies: fast-safe-stringify "^2.0.6" -eth-json-rpc-errors@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-2.0.0.tgz#bdc19df8b80a820844709193372f0d75fb74fed8" - integrity sha512-casdSTVOxbC3ptfUdclJRvU0Sgmdm/QtezLku8l4iVR5wNFe+KF+tfnlm2I84xxpx7mkyyHeeUxmRkcB5Os6mw== - dependencies: - fast-safe-stringify "^2.0.6" - -eth-json-rpc-errors@^2.0.2: +eth-json-rpc-errors@^2.0.0, eth-json-rpc-errors@^2.0.1, eth-json-rpc-errors@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-2.0.2.tgz#c1965de0301fe941c058e928bebaba2e1285e3c4" integrity sha512-uBCRM2w2ewusRHGxN8JhcuOb2RN3ueAOYH/0BhqdFmQkZx5lj5+fLKTz0mIVOzd4FG5/kUksCzCD7eTEim6gaA== @@ -4815,10 +4582,30 @@ eth-json-rpc-infura@^4.0.1: eth-json-rpc-middleware "^4.1.4" json-rpc-engine "^5.1.3" -eth-json-rpc-middleware@4.3.0, eth-json-rpc-middleware@^4.0.0, eth-json-rpc-middleware@^4.1.4, eth-json-rpc-middleware@^4.1.5: - version "4.3.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.3.0.tgz#d3e72efb60b6f601f022ce01384481eaed552b6b" - integrity sha512-Acr+FaIHB0oIV0nWrCvepQghgA3FzYFvnMDXdTUeHQvAX/G6ioMbw1exGJs+6HirRjJ+MmkZqaArphx+PTrRNQ== +eth-json-rpc-middleware@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.3.0.tgz#d3e72efb60b6f601f022ce01384481eaed552b6b" + integrity sha512-Acr+FaIHB0oIV0nWrCvepQghgA3FzYFvnMDXdTUeHQvAX/G6ioMbw1exGJs+6HirRjJ+MmkZqaArphx+PTrRNQ== + dependencies: + btoa "^1.2.1" + clone "^2.1.1" + eth-json-rpc-errors "^1.0.1" + eth-query "^2.1.2" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.6.0" + ethereumjs-tx "^1.3.7" + ethereumjs-util "^5.1.2" + ethereumjs-vm "^2.6.0" + fetch-ponyfill "^4.0.0" + json-rpc-engine "^5.1.3" + json-stable-stringify "^1.0.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-json-rpc-middleware@^4.0.0, eth-json-rpc-middleware@^4.1.4, eth-json-rpc-middleware@^4.1.5: + version "4.4.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.1.tgz#07d3dd0724c24a8d31e4a172ee96271da71b4228" + integrity sha512-yoSuRgEYYGFdVeZg3poWOwAlRI+MoBIltmOB86MtpoZjvLbou9EB/qWMOWSmH2ryCWLW97VYY6NWsmWm3OAA7A== dependencies: btoa "^1.2.1" clone "^2.1.1" @@ -4881,9 +4668,9 @@ eth-sig-util@^1.4.0, eth-sig-util@^1.4.2: ethereumjs-util "^5.1.1" eth-sig-util@^2.3.0, eth-sig-util@^2.4.4, eth-sig-util@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.0.tgz#1018cf8bef2fe275ecbd526cf3248757b0880053" - integrity sha512-ahApxr+e1cls/GwcFSGsgRLrMqG6D6cBnK9CRHhx97O/s9ow+URIxbPvov8jfE70ZnNBdHMircoSCpi1b4QHjA== + version "2.5.3" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.3.tgz#6938308b38226e0b3085435474900b03036abcbe" + integrity sha512-KpXbCKmmBUNUTGh9MRKmNkIPietfhzBqqYqysDavLseIiMUGl95k6UcPEkALAZlj41e9E6yioYXc1PC333RKqw== dependencies: buffer "^5.2.1" elliptic "^6.4.0" @@ -4943,7 +4730,15 @@ ethereumjs-abi@0.6.6: bn.js "^4.10.0" ethereumjs-util "^5.0.0" -ethereumjs-abi@^0.6.5, "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": +ethereumjs-abi@^0.6.5: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": version "0.6.8" resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#1cfbb13862f90f0b391d8a699544d5fe4dfb8c7b" dependencies: @@ -4971,20 +4766,20 @@ ethereumjs-block@^1.2.2, ethereumjs-block@^1.6.0: merkle-patricia-tree "^2.1.2" ethereumjs-block@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.0.tgz#8c6c3ab4a5eff0a16d9785fbeedbe643f4dbcbef" - integrity sha512-Ye+uG/L2wrp364Zihdlr/GfC3ft+zG8PdHcRtsBFNNH1CkOhxOwdB8friBU85n89uRZ9eIMAywCq0F4CwT1wAw== + version "2.2.2" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" + integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== dependencies: async "^2.0.1" - ethereumjs-common "^1.1.0" - ethereumjs-tx "^1.2.2" + ethereumjs-common "^1.5.0" + ethereumjs-tx "^2.1.1" ethereumjs-util "^5.0.0" merkle-patricia-tree "^2.1.2" -ethereumjs-common@^1.1.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.3.2.tgz#5a20831e52199a31ff4b68ef361e34c05c976ed0" - integrity sha512-GkltYRIqBLzaZLmF/K3E+g9lZ4O4FL+TtpisAlD3N+UVlR+mrtoG+TvxavqVa6PwOY4nKIEMe5pl6MrTio3Lww== +ethereumjs-common@^1.1.0, ethereumjs-common@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.1.tgz#4e75042473a64daec0ed9fe84323dd9576aa5dba" + integrity sha512-aVUPRLgmXORGXXEVkFYgPhr9TGtpBY2tGhZ9Uh0A3lIUzUDr1x6kQx33SbjPUkLkX3eniPQnIL/2psjkjrOfcQ== ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.7: version "1.3.7" @@ -4994,7 +4789,15 @@ ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.7: ethereum-common "^0.0.18" ethereumjs-util "^5.0.0" -ethereumjs-util@6.1.0, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0: +ethereumjs-tx@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" + integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== + dependencies: + ethereumjs-common "^1.5.0" + ethereumjs-util "^6.0.0" + +ethereumjs-util@6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz#e9c51e5549e8ebd757a339cc00f5380507e799c8" integrity sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q== @@ -5031,6 +4834,19 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereum safe-buffer "^5.1.1" secp256k1 "^3.0.1" +ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz#23ec79b2488a7d041242f01e25f24e5ad0357960" + integrity sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + ethjs-util "0.1.6" + keccak "^2.0.0" + rlp "^2.2.3" + secp256k1 "^3.0.1" + ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" @@ -5093,14 +4909,13 @@ ethers@4.0.27: xmlhttprequest "1.8.0" ethers@^4.0.27: - version "4.0.39" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.39.tgz#5ce9dfffedb03936415743f63b37d96280886a47" - integrity sha512-QVtC8TTUgTrnlQjQvdFJ7fkSWKwp8HVTbKRmrdbVryrPzJHMTf3WSeRNvLF2enGyAFtyHJyFNnjN0fSshcEr9w== + version "4.0.47" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.47.tgz#91b9cd80473b1136dd547095ff9171bd1fc68c85" + integrity sha512-hssRYhngV4hiDNeZmVU/k5/E8xmLG8UpcNUzg6mb7lqhgpFPH/t7nuv20RjRrEf0gblzvi2XwR5Te+V3ZFc9pQ== dependencies: - "@types/node" "^10.3.2" aes-js "3.0.0" bn.js "^4.4.0" - elliptic "6.3.3" + elliptic "6.5.2" hash.js "1.1.3" js-sha3 "0.5.7" scrypt-js "2.0.4" @@ -5307,7 +5122,7 @@ eventemitter3@^3.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== -events@3.0.0, events@^3.0.0: +events@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== @@ -5317,6 +5132,11 @@ events@^1.1.1: resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -5333,9 +5153,9 @@ exception-formatter@^1.0.4: colors "^1.0.3" exec-sh@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" - integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== execa@^0.7.0: version "0.7.0" @@ -5397,16 +5217,16 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-25.3.0.tgz#5fd36e51befd05afb7184bc954f8a4792d184c71" - integrity sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg== +expect@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-25.5.0.tgz#f07f848712a2813bb59167da3fb828ca21f58bba" + integrity sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" ansi-styles "^4.0.0" jest-get-type "^25.2.6" - jest-matcher-utils "^25.3.0" - jest-message-util "^25.3.0" + jest-matcher-utils "^25.5.0" + jest-message-util "^25.5.0" jest-regex-util "^25.2.6" extend-shallow@^1.1.2: @@ -5500,10 +5320,10 @@ fancy-log@^1.3.2: parse-node-version "^1.0.0" time-stamp "^1.0.0" -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== fast-diff@^1.1.1: version "1.2.0" @@ -5511,11 +5331,11 @@ fast-diff@^1.1.1: integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -5526,11 +5346,11 @@ fast-safe-stringify@^2.0.6: integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== dependencies: - bser "^2.0.0" + bser "2.1.1" fbjs-css-vars@^1.0.0: version "1.0.2" @@ -5710,9 +5530,9 @@ flat-cache@^2.0.1: write "1.0.3" flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== fn-name@~2.0.1: version "2.0.1" @@ -5726,7 +5546,7 @@ follow-redirects@1.5.10: dependencies: debug "=3.1.0" -for-each@^0.3.3, for-each@~0.3.3: +for-each@~0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== @@ -5767,9 +5587,9 @@ form-data@~2.3.2: mime-types "^2.1.12" formidable@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" - integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg== + version "1.2.2" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" + integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== fragment-cache@^0.2.1: version "0.2.1" @@ -5783,11 +5603,6 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-copy-file-sync@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" - integrity sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ== - fs-extra@^0.22.1: version "0.22.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.22.1.tgz#5fd6f8049dc976ca19eb2355d658173cabcce056" @@ -5833,30 +5648,23 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: + bindings "^1.5.0" nan "^2.12.1" - node-pre-gyp "^0.12.0" fsevents@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" - integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== ftp@~0.3.10: version "0.3.10" @@ -5866,30 +5674,29 @@ ftp@~0.3.10: readable-stream "1.1.x" xregexp "2.0.0" -function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1: +function-bind@^1.1.1, function-bind@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.0, function.prototype.name@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.1.tgz#6d252350803085abc2ad423d4fe3be2f9cbda392" - integrity sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q== +function.prototype.name@^1.1.0, function.prototype.name@^1.1.1, function.prototype.name@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.2.tgz#5cdf79d7c05db401591dfde83e3b70c5123e9a45" + integrity sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" - functions-have-names "^1.1.1" - is-callable "^1.1.4" + es-abstract "^1.17.0-next.1" + functions-have-names "^1.2.0" functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -functions-have-names@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.0.tgz#83da7583e4ea0c9ac5ff530f73394b033e0bf77d" - integrity sha512-zKXyzksTeaCSw5wIX79iCA40YAa6CJMJgNg9wdkU/ERBrIdPSimPICYiLp65lRbSBqtiHql/HZfS2DyI/AH6tQ== +functions-have-names@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.1.tgz#a981ac397fa0c9964551402cdc5533d7a4d52f91" + integrity sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA== funpermaproxy@^1.0.1: version "1.0.1" @@ -5917,20 +5724,6 @@ g-status@^2.0.2: matcher "^1.0.0" simple-git "^1.85.0" -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" @@ -5947,9 +5740,14 @@ get-caller-file@^2.0.1: integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-own-enumerable-property-symbols@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.1.tgz#6f7764f88ea11e0b514bd9bd860a132259992ca4" - integrity sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-port@^2.1.0: version "2.1.0" @@ -6007,9 +5805,9 @@ getpass@^0.1.1: assert-plus "^1.0.0" glob-parent@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" @@ -6024,19 +5822,7 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.4: - version "7.1.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" - integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.4: +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -6103,10 +5889,10 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -6130,7 +5916,7 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.1.0, har-validator@~5.1.3: +har-validator@~5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== @@ -6155,21 +5941,11 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= - -has-symbols@^1.0.1: +has-symbols@^1.0.0, has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -6201,7 +5977,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1, has@^1.0.3, has@~1.0.3: +has@^1.0.3, has@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -6209,12 +5985,13 @@ has@^1.0.1, has@^1.0.3, has@~1.0.3: function-bind "^1.1.1" hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" hash.js@1.1.3: version "1.1.3" @@ -6241,11 +6018,11 @@ hdkey@^0.7.0: secp256k1 "^3.0.1" hdkey@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-1.1.1.tgz#c2b3bfd5883ff9529b72f2f08b28be0972a9f64a" - integrity sha512-DvHZ5OuavsfWs5yfVJZestsnc3wzPvLWNk6c2nRUfo6X+OtxypGt20vDDf7Ba+MJzjL3KS1og2nw2eBbLCOUTA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-1.1.2.tgz#c60f9cf6f90fbf24a8a52ea06893f36a0108cd3e" + integrity sha512-PTQ4VKu0oRnCrYfLp04iQZ7T2Cxz0UsEXYauk2j8eh6PJXCpbXuCFhOmtIFtbET0i3PMWmHN9J11gU8LEgUljQ== dependencies: - coinstring "^2.0.0" + bs58check "^2.1.2" safe-buffer "^5.1.1" secp256k1 "^3.0.1" @@ -6268,22 +6045,22 @@ hoist-non-react-statics@^2.3.1: resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== -hoist-non-react-statics@^3.0.1, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" - integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" hosted-git-info@^2.1.4: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== html-element-map@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.1.0.tgz#e5aab9a834caf883b421f8bd9eaedcaac887d63c" - integrity sha512-iqiG3dTZmy+uUaTmHarTL+3/A2VW9ox/9uasKEZC+R/wAtUrTcRlXPSaPqsnWPfIu8wqn09jQNwMRqzL54jSYA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.2.0.tgz#dfbb09efe882806af63d990cf6db37993f099f22" + integrity sha512-0uXq8HsuG1v2TmQ8QkIhzbrqeskE4kn52Q18QJ9iAA/SnHoEKXWiUxHQtclRsCFWEUD2So34X+0+pZZu862nnw== dependencies: array-filter "^1.0.0" @@ -6352,12 +6129,12 @@ https-proxy-agent@^3.0.0: agent-base "^4.3.0" debug "^3.1.0" -https-proxy-agent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" - integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== dependencies: - agent-base "5" + agent-base "6" debug "4" human-signals@^1.1.1: @@ -6408,7 +6185,7 @@ i@0.3.x: resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d" integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0= -iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -6434,22 +6211,15 @@ ieee754@^1.1.4: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.0.5: - version "5.1.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" - integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + version "5.1.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.6.tgz#643194ad4bf2712f37852e386b6998eff0db2106" + integrity sha512-cgXgkypZBcCnOgSihyeqbo6gjIaIyDqPQB7Ra4vhE9m6kigdGoQDMHjviFhRZo3IMlRy6yElosoviMs5YxZXUA== image-size@^0.6.0: version "0.6.3" @@ -6470,9 +6240,9 @@ import-fresh@^2.0.0: resolve-from "^3.0.0" import-fresh@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" - integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -6513,7 +6283,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6591,6 +6361,15 @@ inquirer@^7.0.0: strip-ansi "^6.0.0" through "^2.3.6" +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + invariant@2.2.4, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -6647,22 +6426,22 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-boolean-object@^1.0.0: +is-bigint@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" - integrity sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M= + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.0.tgz#73da8c33208d00f130e9b5e15d23eac9215601c4" + integrity sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g== + +is-boolean-object@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e" + integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ== is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.3, is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== - -is-callable@^1.1.5: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== @@ -6695,10 +6474,10 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= +is-date-object@^1.0.1, is-date-object@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== is-descriptor@^0.1.0: version "0.1.6" @@ -6723,6 +6502,11 @@ is-directory@^0.3.1: resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= +is-docker@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" + integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -6763,9 +6547,9 @@ is-fullwidth-code-point@^3.0.0: integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-function@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" - integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== is-generator-fn@^2.0.0: version "2.1.0" @@ -6797,15 +6581,20 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" +is-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" + integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== + is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= is-number-object@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" - integrity sha1-8mWrian0RQNO9q/xWo8AsA9VF5k= + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== is-number@^3.0.0: version "3.0.0" @@ -6863,23 +6652,16 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: isobject "^3.0.1" is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= - dependencies: - has "^1.0.1" - -is-regex@^1.0.5: +is-regex@^1.0.4, is-regex@^1.0.5, is-regex@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== @@ -6896,6 +6678,11 @@ is-retry-allowed@^1.0.0: resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== +is-set@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" + integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== + is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -6906,10 +6693,10 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== -is-string@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" - integrity sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ= +is-string@^1.0.4, is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== is-subset@^0.1.1: version "0.1.1" @@ -6917,11 +6704,11 @@ is-subset@^0.1.1: integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== dependencies: - has-symbols "^1.0.0" + has-symbols "^1.0.1" is-typed-array@^1.1.3: version "1.1.3" @@ -6938,6 +6725,16 @@ is-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakset@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83" + integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw== + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -6949,9 +6746,11 @@ is-wsl@^1.1.0: integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= is-wsl@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" - integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" is@~0.2.6: version "0.2.7" @@ -6968,7 +6767,7 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isarray@^2.0.1: +isarray@^2.0.1, isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== @@ -7014,14 +6813,11 @@ istanbul-lib-coverage@^3.0.0: integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== istanbul-lib-instrument@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz#61f13ac2c96cfefb076fe7131156cc05907874e6" - integrity sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== dependencies: "@babel/core" "^7.7.5" - "@babel/parser" "^7.7.5" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" "@istanbuljs/schema" "^0.1.2" istanbul-lib-coverage "^3.0.0" semver "^6.3.0" @@ -7057,67 +6853,69 @@ iterall@^1.2.2: resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== -jest-changed-files@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.3.0.tgz#85d8de6f4bd13dafda9d7f1e3f2565fc0e183c78" - integrity sha512-eqd5hyLbUjIVvLlJ3vQ/MoPxsxfESVXG9gvU19XXjKzxr+dXmZIqCXiY0OiYaibwlHZBJl2Vebkc0ADEMzCXew== +jest-changed-files@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.5.0.tgz#141cc23567ceb3f534526f8614ba39421383634c" + integrity sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" execa "^3.2.0" throat "^5.0.0" -jest-cli@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.3.0.tgz#d9e11f5700cc5946583cf0d01a9bdebceed448d2" - integrity sha512-XpNQPlW1tzpP7RGG8dxpkRegYDuLjzSiENu92+CYM87nEbmEPb3b4+yo8xcsHOnj0AG7DUt9b3uG8LuHI3MDzw== +jest-cli@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.5.4.tgz#b9f1a84d1301a92c5c217684cb79840831db9f0d" + integrity sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw== dependencies: - "@jest/core" "^25.3.0" - "@jest/test-result" "^25.3.0" - "@jest/types" "^25.3.0" + "@jest/core" "^25.5.4" + "@jest/test-result" "^25.5.0" + "@jest/types" "^25.5.0" chalk "^3.0.0" exit "^0.1.2" + graceful-fs "^4.2.4" import-local "^3.0.2" is-ci "^2.0.0" - jest-config "^25.3.0" - jest-util "^25.3.0" - jest-validate "^25.3.0" + jest-config "^25.5.4" + jest-util "^25.5.0" + jest-validate "^25.5.0" prompts "^2.0.1" realpath-native "^2.0.0" yargs "^15.3.1" -jest-config@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.3.0.tgz#112b5e2f2e57dec4501dd2fe979044c06fb1317e" - integrity sha512-CmF1JnNWFmoCSPC4tnU52wnVBpuxHjilA40qH/03IHxIevkjUInSMwaDeE6ACfxMPTLidBGBCO3EbxvzPbo8wA== +jest-config@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.5.4.tgz#38e2057b3f976ef7309b2b2c8dcd2a708a67f02c" + integrity sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^25.3.0" - "@jest/types" "^25.3.0" - babel-jest "^25.3.0" + "@jest/test-sequencer" "^25.5.4" + "@jest/types" "^25.5.0" + babel-jest "^25.5.1" chalk "^3.0.0" deepmerge "^4.2.2" glob "^7.1.1" - jest-environment-jsdom "^25.3.0" - jest-environment-node "^25.3.0" + graceful-fs "^4.2.4" + jest-environment-jsdom "^25.5.0" + jest-environment-node "^25.5.0" jest-get-type "^25.2.6" - jest-jasmine2 "^25.3.0" + jest-jasmine2 "^25.5.4" jest-regex-util "^25.2.6" - jest-resolve "^25.3.0" - jest-util "^25.3.0" - jest-validate "^25.3.0" + jest-resolve "^25.5.1" + jest-util "^25.5.0" + jest-validate "^25.5.0" micromatch "^4.0.2" - pretty-format "^25.3.0" + pretty-format "^25.5.0" realpath-native "^2.0.0" -jest-diff@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.3.0.tgz#0d7d6f5d6171e5dacde9e05be47b3615e147c26f" - integrity sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w== +jest-diff@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" + integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== dependencies: chalk "^3.0.0" diff-sequences "^25.2.6" jest-get-type "^25.2.6" - pretty-format "^25.3.0" + pretty-format "^25.5.0" jest-docblock@^21.0.0: version "21.2.0" @@ -7131,39 +6929,39 @@ jest-docblock@^25.3.0: dependencies: detect-newline "^3.0.0" -jest-each@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.3.0.tgz#a319eecf1f6076164ab86f99ca166a55b96c0bd4" - integrity sha512-aBfS4VOf/Qs95yUlX6d6WBv0szvOcTkTTyCIaLuQGj4bSHsT+Wd9dDngVHrCe5uytxpN8VM+NAloI6nbPjXfXw== +jest-each@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.5.0.tgz#0c3c2797e8225cb7bec7e4d249dcd96b934be516" + integrity sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" chalk "^3.0.0" jest-get-type "^25.2.6" - jest-util "^25.3.0" - pretty-format "^25.3.0" + jest-util "^25.5.0" + pretty-format "^25.5.0" -jest-environment-jsdom@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.3.0.tgz#c493ab8c41f28001520c70ef67dd88b88be6af05" - integrity sha512-jdE4bQN+k2QEZ9sWOxsqDJvMzbdFSCN/4tw8X0TQaCqyzKz58PyEf41oIr4WO7ERdp7WaJGBSUKF7imR3UW1lg== - dependencies: - "@jest/environment" "^25.3.0" - "@jest/fake-timers" "^25.3.0" - "@jest/types" "^25.3.0" - jest-mock "^25.3.0" - jest-util "^25.3.0" +jest-environment-jsdom@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz#dcbe4da2ea997707997040ecf6e2560aec4e9834" + integrity sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A== + dependencies: + "@jest/environment" "^25.5.0" + "@jest/fake-timers" "^25.5.0" + "@jest/types" "^25.5.0" + jest-mock "^25.5.0" + jest-util "^25.5.0" jsdom "^15.2.1" -jest-environment-node@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.3.0.tgz#9845f0e63991e8498448cb0ae804935689533db9" - integrity sha512-XO09S29Nx1NU7TiMPHMoDIkxoGBuKSTbE+sHp0gXbeLDXhIdhysUI25kOqFFSD9AuDgvPvxWCXrvNqiFsOH33g== - dependencies: - "@jest/environment" "^25.3.0" - "@jest/fake-timers" "^25.3.0" - "@jest/types" "^25.3.0" - jest-mock "^25.3.0" - jest-util "^25.3.0" +jest-environment-node@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.5.0.tgz#0f55270d94804902988e64adca37c6ce0f7d07a1" + integrity sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA== + dependencies: + "@jest/environment" "^25.5.0" + "@jest/fake-timers" "^25.5.0" + "@jest/types" "^25.5.0" + jest-mock "^25.5.0" + jest-util "^25.5.0" semver "^6.3.0" jest-get-type@^24.9.0: @@ -7195,18 +6993,19 @@ jest-haste-map@^24.7.1, jest-haste-map@^24.9.0: optionalDependencies: fsevents "^1.2.7" -jest-haste-map@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.3.0.tgz#b7683031c9c9ddc0521d311564108b244b11e4c6" - integrity sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A== +jest-haste-map@^25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.5.1.tgz#1df10f716c1d94e60a1ebf7798c9fb3da2620943" + integrity sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" + "@types/graceful-fs" "^4.1.2" anymatch "^3.0.3" fb-watchman "^2.0.0" - graceful-fs "^4.2.3" - jest-serializer "^25.2.6" - jest-util "^25.3.0" - jest-worker "^25.2.6" + graceful-fs "^4.2.4" + jest-serializer "^25.5.0" + jest-util "^25.5.0" + jest-worker "^25.5.0" micromatch "^4.0.2" sane "^4.0.3" walker "^1.0.7" @@ -7214,46 +7013,46 @@ jest-haste-map@^25.3.0: optionalDependencies: fsevents "^2.1.2" -jest-jasmine2@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.3.0.tgz#16ae4f68adef65fb45001b26c864bcbcbf972830" - integrity sha512-NCYOGE6+HNzYFSui52SefgpsnIzvxjn6KAgqw66BdRp37xpMD/4kujDHLNW5bS5i53os5TcMn6jYrzQRO8VPrQ== +jest-jasmine2@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz#66ca8b328fb1a3c5364816f8958f6970a8526968" + integrity sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^25.3.0" - "@jest/source-map" "^25.2.6" - "@jest/test-result" "^25.3.0" - "@jest/types" "^25.3.0" + "@jest/environment" "^25.5.0" + "@jest/source-map" "^25.5.0" + "@jest/test-result" "^25.5.0" + "@jest/types" "^25.5.0" chalk "^3.0.0" co "^4.6.0" - expect "^25.3.0" + expect "^25.5.0" is-generator-fn "^2.0.0" - jest-each "^25.3.0" - jest-matcher-utils "^25.3.0" - jest-message-util "^25.3.0" - jest-runtime "^25.3.0" - jest-snapshot "^25.3.0" - jest-util "^25.3.0" - pretty-format "^25.3.0" + jest-each "^25.5.0" + jest-matcher-utils "^25.5.0" + jest-message-util "^25.5.0" + jest-runtime "^25.5.4" + jest-snapshot "^25.5.1" + jest-util "^25.5.0" + pretty-format "^25.5.0" throat "^5.0.0" -jest-leak-detector@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.3.0.tgz#5b6bf04903b35be56038915a55f47291771f769f" - integrity sha512-jk7k24dMIfk8LUSQQGN8PyOy9+J0NAfHZWiDmUDYVMctY8FLJQ1eQ8+PjMoN8PgwhLIggUqgYJnyRFvUz3jLRw== +jest-leak-detector@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz#2291c6294b0ce404241bb56fe60e2d0c3e34f0bb" + integrity sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA== dependencies: jest-get-type "^25.2.6" - pretty-format "^25.3.0" + pretty-format "^25.5.0" -jest-matcher-utils@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.3.0.tgz#76765788a26edaa8bc5f0100aea52ae383559648" - integrity sha512-ZBUJ2fchNIZt+fyzkuCFBb8SKaU//Rln45augfUtbHaGyVxCO++ANARdBK9oPGXU3hEDgyy7UHnOP/qNOJXFUg== +jest-matcher-utils@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz#fbc98a12d730e5d2453d7f1ed4a4d948e34b7867" + integrity sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw== dependencies: chalk "^3.0.0" - jest-diff "^25.3.0" + jest-diff "^25.5.0" jest-get-type "^25.2.6" - pretty-format "^25.3.0" + pretty-format "^25.5.0" jest-message-util@^24.9.0: version "24.9.0" @@ -7269,15 +7068,16 @@ jest-message-util@^24.9.0: slash "^2.0.0" stack-utils "^1.0.1" -jest-message-util@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.3.0.tgz#e3836826fe5ca538a337b87d9bd2648190867f85" - integrity sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw== +jest-message-util@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.5.0.tgz#ea11d93204cc7ae97456e1d8716251185b8880ea" + integrity sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA== dependencies: "@babel/code-frame" "^7.0.0" - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" "@types/stack-utils" "^1.0.1" chalk "^3.0.0" + graceful-fs "^4.2.4" micromatch "^4.0.2" slash "^3.0.0" stack-utils "^1.0.1" @@ -7289,12 +7089,12 @@ jest-mock@^24.9.0: dependencies: "@jest/types" "^24.9.0" -jest-mock@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.3.0.tgz#d72644509e40987a732a9a2534a1054f4649402c" - integrity sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ== +jest-mock@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.5.0.tgz#a91a54dabd14e37ecd61665d6b6e06360a55387a" + integrity sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" jest-pnp-resolver@^1.2.1: version "1.2.1" @@ -7306,78 +7106,82 @@ jest-regex-util@^25.2.6: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== -jest-resolve-dependencies@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.3.0.tgz#b0e4ae053dd44ddacc18c6ee12b5b7c28e445a90" - integrity sha512-bDUlLYmHW+f7J7KgcY2lkq8EMRqKonRl0XoD4Wp5SJkgAxKJnsaIOlrrVNTfXYf+YOu3VCjm/Ac2hPF2nfsCIA== +jest-resolve-dependencies@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz#85501f53957c8e3be446e863a74777b5a17397a7" + integrity sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" jest-regex-util "^25.2.6" - jest-snapshot "^25.3.0" + jest-snapshot "^25.5.1" -jest-resolve@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.3.0.tgz#cb90a5bbea54a02eccdbbf4126a819595dcf91d6" - integrity sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ== +jest-resolve@^25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.5.1.tgz#0e6fbcfa7c26d2a5fe8f456088dc332a79266829" + integrity sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" browser-resolve "^1.11.3" chalk "^3.0.0" + graceful-fs "^4.2.4" jest-pnp-resolver "^1.2.1" + read-pkg-up "^7.0.1" realpath-native "^2.0.0" - resolve "^1.15.1" + resolve "^1.17.0" + slash "^3.0.0" -jest-runner@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.3.0.tgz#673ef2ac79d2810eb6b2c1a3f82398375a3d1174" - integrity sha512-csDqSC9qGHYWDrzrElzEgFbteztFeZJmKhSgY5jlCIcN0+PhActzRNku0DA1Xa1HxGOb0/AfbP1EGJlP4fGPtA== +jest-runner@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.5.4.tgz#ffec5df3875da5f5c878ae6d0a17b8e4ecd7c71d" + integrity sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg== dependencies: - "@jest/console" "^25.3.0" - "@jest/environment" "^25.3.0" - "@jest/test-result" "^25.3.0" - "@jest/types" "^25.3.0" + "@jest/console" "^25.5.0" + "@jest/environment" "^25.5.0" + "@jest/test-result" "^25.5.0" + "@jest/types" "^25.5.0" chalk "^3.0.0" exit "^0.1.2" - graceful-fs "^4.2.3" - jest-config "^25.3.0" + graceful-fs "^4.2.4" + jest-config "^25.5.4" jest-docblock "^25.3.0" - jest-haste-map "^25.3.0" - jest-jasmine2 "^25.3.0" - jest-leak-detector "^25.3.0" - jest-message-util "^25.3.0" - jest-resolve "^25.3.0" - jest-runtime "^25.3.0" - jest-util "^25.3.0" - jest-worker "^25.2.6" + jest-haste-map "^25.5.1" + jest-jasmine2 "^25.5.4" + jest-leak-detector "^25.5.0" + jest-message-util "^25.5.0" + jest-resolve "^25.5.1" + jest-runtime "^25.5.4" + jest-util "^25.5.0" + jest-worker "^25.5.0" source-map-support "^0.5.6" throat "^5.0.0" -jest-runtime@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.3.0.tgz#af4d40dbcc590fa5de9910cb6a120a13d131050b" - integrity sha512-gn5KYB1wxXRM3nfw8fVpthFu60vxQUCr+ShGq41+ZBFF3DRHZRKj3HDWVAVB4iTNBj2y04QeAo5cZ/boYaPg0w== - dependencies: - "@jest/console" "^25.3.0" - "@jest/environment" "^25.3.0" - "@jest/source-map" "^25.2.6" - "@jest/test-result" "^25.3.0" - "@jest/transform" "^25.3.0" - "@jest/types" "^25.3.0" +jest-runtime@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.5.4.tgz#dc981fe2cb2137abcd319e74ccae7f7eeffbfaab" + integrity sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ== + dependencies: + "@jest/console" "^25.5.0" + "@jest/environment" "^25.5.0" + "@jest/globals" "^25.5.2" + "@jest/source-map" "^25.5.0" + "@jest/test-result" "^25.5.0" + "@jest/transform" "^25.5.1" + "@jest/types" "^25.5.0" "@types/yargs" "^15.0.0" chalk "^3.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.3" - graceful-fs "^4.2.3" - jest-config "^25.3.0" - jest-haste-map "^25.3.0" - jest-message-util "^25.3.0" - jest-mock "^25.3.0" + graceful-fs "^4.2.4" + jest-config "^25.5.4" + jest-haste-map "^25.5.1" + jest-message-util "^25.5.0" + jest-mock "^25.5.0" jest-regex-util "^25.2.6" - jest-resolve "^25.3.0" - jest-snapshot "^25.3.0" - jest-util "^25.3.0" - jest-validate "^25.3.0" + jest-resolve "^25.5.1" + jest-snapshot "^25.5.1" + jest-util "^25.5.0" + jest-validate "^25.5.0" realpath-native "^2.0.0" slash "^3.0.0" strip-bom "^4.0.0" @@ -7393,29 +7197,32 @@ jest-serializer@^24.4.0, jest-serializer@^24.9.0: resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== -jest-serializer@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.2.6.tgz#3bb4cc14fe0d8358489dbbefbb8a4e708ce039b7" - integrity sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ== +jest-serializer@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.5.0.tgz#a993f484e769b4ed54e70e0efdb74007f503072b" + integrity sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA== + dependencies: + graceful-fs "^4.2.4" -jest-snapshot@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.3.0.tgz#d4feb457494f4aaedcc83fbbf1ca21808fc3df71" - integrity sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg== +jest-snapshot@^25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.5.1.tgz#1a2a576491f9961eb8d00c2e5fd479bc28e5ff7f" + integrity sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" "@types/prettier" "^1.19.0" chalk "^3.0.0" - expect "^25.3.0" - jest-diff "^25.3.0" + expect "^25.5.0" + graceful-fs "^4.2.4" + jest-diff "^25.5.0" jest-get-type "^25.2.6" - jest-matcher-utils "^25.3.0" - jest-message-util "^25.3.0" - jest-resolve "^25.3.0" + jest-matcher-utils "^25.5.0" + jest-message-util "^25.5.0" + jest-resolve "^25.5.1" make-dir "^3.0.0" natural-compare "^1.4.0" - pretty-format "^25.3.0" + pretty-format "^25.5.0" semver "^6.3.0" jest-util@^24.9.0: @@ -7436,13 +7243,14 @@ jest-util@^24.9.0: slash "^2.0.0" source-map "^0.6.0" -jest-util@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.3.0.tgz#e3b0064165818f10d78514696fd25efba82cf049" - integrity sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA== +jest-util@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.5.0.tgz#31c63b5d6e901274d264a4fec849230aa3fa35b0" + integrity sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" chalk "^3.0.0" + graceful-fs "^4.2.4" is-ci "^2.0.0" make-dir "^3.0.0" @@ -7458,28 +7266,28 @@ jest-validate@^24.7.0, jest-validate@^24.9.0: leven "^3.1.0" pretty-format "^24.9.0" -jest-validate@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.3.0.tgz#eb95fdee0039647bcd5d4be641b21e4a142a880c" - integrity sha512-3WuXgIZ4HXUvW6gk9twFFkT9j6zUorKnF2oEY8VEsHb7x5LGvVlN3WUsbqazVKuyXwvikO2zFJ/YTySMsMje2w== +jest-validate@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.5.0.tgz#fb4c93f332c2e4cf70151a628e58a35e459a413a" + integrity sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" camelcase "^5.3.1" chalk "^3.0.0" jest-get-type "^25.2.6" leven "^3.1.0" - pretty-format "^25.3.0" + pretty-format "^25.5.0" -jest-watcher@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.3.0.tgz#fd03fd5ca52f02bd3161ab177466bf1bfdd34e5c" - integrity sha512-dtFkfidFCS9Ucv8azOg2hkiY3sgJEHeTLtGFHS+jfBEE7eRtrO6+2r1BokyDkaG2FOD7485r/SgpC1MFAENfeA== +jest-watcher@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.5.0.tgz#d6110d101df98badebe435003956fd4a465e8456" + integrity sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q== dependencies: - "@jest/test-result" "^25.3.0" - "@jest/types" "^25.3.0" + "@jest/test-result" "^25.5.0" + "@jest/types" "^25.5.0" ansi-escapes "^4.2.1" chalk "^3.0.0" - jest-util "^25.3.0" + jest-util "^25.5.0" string-length "^3.1.0" jest-worker@^24.6.0, jest-worker@^24.9.0: @@ -7490,22 +7298,22 @@ jest-worker@^24.6.0, jest-worker@^24.9.0: merge-stream "^2.0.0" supports-color "^6.1.0" -jest-worker@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.6.tgz#d1292625326794ce187c38f51109faced3846c58" - integrity sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA== +jest-worker@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== dependencies: merge-stream "^2.0.0" supports-color "^7.0.0" jest@^25.2.7: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-25.3.0.tgz#7a5e59741d94b8662664c77a9f346246d6bf228b" - integrity sha512-iKd5ShQSHzFT5IL/6h5RZJhApgqXSoPxhp5HEi94v6OAw9QkF8T7X+liEU2eEHJ1eMFYTHmeWLrpBWulsDpaUg== + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest/-/jest-25.5.4.tgz#f21107b6489cfe32b076ce2adcadee3587acb9db" + integrity sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ== dependencies: - "@jest/core" "^25.3.0" + "@jest/core" "^25.5.4" import-local "^3.0.2" - jest-cli "^25.3.0" + jest-cli "^25.5.4" jetifier@^1.6.2: version "1.6.5" @@ -7538,9 +7346,9 @@ js-sha3@^0.6.1: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.0, js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -7613,12 +7421,12 @@ json-rpc-engine@5.1.5: safe-event-emitter "^1.0.1" json-rpc-engine@^5.0.0, json-rpc-engine@^5.1.3: - version "5.1.4" - resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.1.4.tgz#c18d1959eb175049fa7301d4866931ae2f879e47" - integrity sha512-nBFWYJ1mvlZL7gqq0M9230SxedL9CbSYO1WgrFi/C1Zo+ZrHUZWLRbr7fUdlLt9TC0G+sf/aEUeuJjR2lHsMvA== + version "5.1.8" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.1.8.tgz#5ba0147ce571899bbaa7133ffbc05317c34a3c7f" + integrity sha512-vTBSDEPJV1fPAsbm2g5sEuPjsgLdiab2f1CTn2PyRr8nxggUpA996PDlNQDsM0gnrA99F8KIBLq2nIKrOFl1Mg== dependencies: async "^2.0.1" - eth-json-rpc-errors "^1.1.0" + eth-json-rpc-errors "^2.0.1" promise-to-callback "^1.0.0" safe-event-emitter "^1.0.1" @@ -7669,13 +7477,6 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== - dependencies: - minimist "^1.2.0" - json5@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" @@ -7703,9 +7504,9 @@ jsonify@~0.0.0: integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsonschema@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.4.tgz#a46bac5d3506a254465bc548876e267c6d0d6464" - integrity sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw== + version "1.2.6" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.6.tgz#52b0a8e9dc06bbae7295249d03e4b9faee8a0c0b" + integrity sha512-SqhURKZG07JyKKeo/ir24QnS4/BV7a6gQy93bUSe4lUdNp0QNpIz2c9elWJQ9dpc5cQYY6cvCzgRwy0MQCLyqA== jsprim@^1.2.2: version "1.4.1" @@ -7717,12 +7518,12 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jsx-ast-utils@^2.0.1, jsx-ast-utils@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" - integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== +jsx-ast-utils@^2.0.1, jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.3.0.tgz#edd727794ea284d7fda575015ed1b0cde0289ab6" + integrity sha512-3HNoc7nZ1hpZIKB3hJ7BlFRkzCx2BynRtfSwbkqZdpRdvAPsGMnzclPwrvDBS7/lalHTj21NwIeaEpysHBOudg== dependencies: - array-includes "^3.0.3" + array-includes "^3.1.1" object.assign "^4.1.0" keccak@^1.0.2: @@ -7735,6 +7536,16 @@ keccak@^1.0.2: nan "^2.2.1" safe-buffer "^5.1.0" +keccak@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-2.1.0.tgz#734ea53f2edcfd0f42cdb8d5f4c358fef052752b" + integrity sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q== + dependencies: + bindings "^1.5.0" + inherits "^2.0.4" + nan "^2.14.0" + safe-buffer "^5.2.0" + keccakjs@^0.2.0: version "0.2.3" resolved "https://registry.yarnpkg.com/keccakjs/-/keccakjs-0.2.3.tgz#5e4e969ce39689a3861f445d7752ee3477f9fe72" @@ -7953,6 +7764,11 @@ lil-uuid@^0.1.1: resolved "https://registry.yarnpkg.com/lil-uuid/-/lil-uuid-0.1.1.tgz#f9edcf23f00e42bf43f0f843d98d8b53f3341f16" integrity sha1-+e3PI/AOQr9D8PhD2Y2LU/M0HxY= +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + lint-staged@8.1.5: version "8.1.5" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.1.5.tgz#372476fe1a58b8834eb562ed4c99126bd60bdd79" @@ -8144,9 +7960,9 @@ logkitty@^0.6.0: yargs "^12.0.5" loglevel@^1.5.0: - version "1.6.4" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.4.tgz#f408f4f006db8354d0577dcf6d33485b3cb90d56" - integrity sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g== + version "1.6.8" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" + integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== lolex@^5.0.0: version "5.1.2" @@ -8208,7 +8024,7 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" -make-dir@^2.0.0: +make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== @@ -8217,9 +8033,9 @@ make-dir@^2.0.0: semver "^5.6.0" make-dir@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" - integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" @@ -8265,10 +8081,10 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== mem@^4.0.0: version "4.3.0" @@ -8569,7 +8385,7 @@ metro-react-native-babel-transformer@0.58.0, metro-react-native-babel-transforme metro-react-native-babel-preset "0.58.0" metro-source-map "0.58.0" -metro-resolver@0.58.0: +metro-resolver@0.58.0, metro-resolver@^0.58.0: version "0.58.0" resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.58.0.tgz#4d03edc52e2e25d45f16688adf3b3f268ea60df9" integrity sha512-XFbAKvCHN2iWqKeiRARzEXn69eTDdJVJC7lu16S4dPQJ+Dy82dZBr5Es12iN+NmbJuFgrAuIHbpWrdnA9tOf6Q== @@ -8790,15 +8606,10 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.40.0: - version "1.40.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" - integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== - -"mime-db@>= 1.40.0 < 2": - version "1.42.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" - integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== +mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== mime-db@~1.23.0: version "1.23.0" @@ -8813,11 +8624,11 @@ mime-types@2.1.11: mime-db "~1.23.0" mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.24" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" - integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== dependencies: - mime-db "1.40.0" + mime-db "1.44.0" mime@1.6.0, mime@^1.4.1: version "1.6.0" @@ -8825,9 +8636,9 @@ mime@1.6.0, mime@^1.4.1: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.4.1: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + version "2.4.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" + integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== mimic-fn@^1.0.0: version "1.2.0" @@ -8863,26 +8674,11 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.1.2, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.0: +minimist@^1.1.1, minimist@^1.1.2, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -8891,22 +8687,22 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.x.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" - integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== +mkdirp@0.x.x, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" moment@^2.10.6: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" - integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + version "2.26.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.26.0.tgz#5e1f82c6bafca6e83e808b30c8705eed0dcbd39a" + integrity sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw== -moo@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/moo/-/moo-0.4.3.tgz#3f847a26f31cf625a956a87f2b10fbc013bfd10e" - integrity sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw== +moo@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" + integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w== ms@2.0.0: version "2.0.0" @@ -8923,17 +8719,26 @@ ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +multibase@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" + integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== + dependencies: + base-x "^3.0.8" + buffer "^5.5.0" + multibase@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.0.tgz#0216e350614c7456da5e8e5b20d3fcd4c9104f56" - integrity sha512-R9bNLQhbD7MsitPm1NeY7w9sDgu6d7cuj25snAWH7k5PSNPSwIQQBpcpj8jx1W96dLbdigZqmUWOdQRMnAmgjA== + version "0.6.1" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" + integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== dependencies: - base-x "3.0.4" + base-x "^3.0.8" + buffer "^5.5.0" multicodec@^0.5.1, multicodec@~0.5.0: - version "0.5.5" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.5.tgz#55c2535b44eca9ea40a13771420153fe075bb36d" - integrity sha512-1kOifvwAqp9IdiiTKmpK2tS+LY6GHZdKpk3S2EvW4T32vlwDyA3hJoZtGauzqdedUPVNGChnTksEotVOCVlC+Q== + version "0.5.7" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" + integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== dependencies: varint "^5.0.0" @@ -8946,11 +8751,12 @@ multihashes@0.4.14: varint "^5.0.0" multihashes@^0.4.14, multihashes@~0.4.14: - version "0.4.15" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.15.tgz#6dbc55f7f312c6782f5367c03c9783681589d8a6" - integrity sha512-G/Smj1GWqw1RQP3dRuRRPe3oyLqvPqUaEDIaoi7JF7Loxl4WAWvhJNk84oyDEodSucv0MmSW/ZT0RKUrsIFD3g== + version "0.4.19" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.19.tgz#d7493cf028e48747122f350908ea13d12d204813" + integrity sha512-ej74GAfA20imjj00RO5h34aY3pGUFyzn9FJZFWwdeUHlHTkKmv90FrNpvYT4jYf1XXCy5O/5EjVnxTaESgOM6A== dependencies: - bs58 "^4.0.1" + buffer "^5.5.0" + multibase "^0.7.0" varint "^5.0.0" mute-stream@0.0.7: @@ -8978,9 +8784,9 @@ nan@2.13.2: integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== nan@^2.0.5, nan@^2.0.8, nan@^2.12.1, nan@^2.14.0, nan@^2.2.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== nanomatch@^1.2.9: version "1.2.13" @@ -9015,25 +8821,16 @@ ncp@~2.0.0: integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= nearley@^2.7.10: - version "2.19.0" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.0.tgz#37717781d0fd0f2bfc95e233ebd75678ca4bda46" - integrity sha512-2v52FTw7RPqieZr3Gth1luAXZR7Je6q3KaDHY5bjl/paDUdMu35fZ8ICNgiYJRr3tf3NMvIQQR1r27AvEr9CRA== + version "2.19.3" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.3.tgz#ae3b040e27616b5348102c436d1719209476a5a1" + integrity sha512-FpAy1PmTsUpOtgxr23g4jRNvJHYzZEW2PixXeSzksLR/ykPfwKhAodc2+9wQhY+JneWLcvkDw6q7FJIsIdF/aQ== dependencies: commander "^2.19.0" - moo "^0.4.3" + moo "^0.5.0" railroad-diagrams "^1.0.0" randexp "0.4.6" semver "^5.4.1" -needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -9069,7 +8866,7 @@ node-fetch@^1.0.1, node-fetch@~1.7.1: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.0.0-alpha.8, node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@^2.6.0: +node-fetch@^2.0.0-alpha.8, node-fetch@^2.2.0, node-fetch@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== @@ -9095,41 +8892,17 @@ node-notifier@^6.0.0: shellwords "^0.1.1" which "^1.3.1" -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - node-stream-zip@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.9.1.tgz#66d210204da7c60e2d6d685eb21a11d016981fd0" - integrity sha512-7/Xs9gkuYF0WBimz5OrSc6UVKLDTxvBG2yLGtEK8PSx94d86o/6iQLvIe/140ATz35JDqHKWIxh3GcA3u5hB0w== + version "1.11.1" + resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.11.1.tgz#7af41e2622f1dc354db602e53f7a62e21a69308e" + integrity sha512-eiNM9UJ26OkbOLfv4VI8X94KRw28xMq2cpWapRsR/aWXGu+hNFvEY889Glm6qi43wtbjcMSU1oFxv5XZ0OKhbA== node-version@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d" integrity sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ== -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2: +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -9151,19 +8924,6 @@ normalize-path@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== - -npm-packlist@^1.1.6: - version "1.4.6" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" - integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-path@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" @@ -9194,16 +8954,6 @@ npm-which@^3.0.1: npm-path "^2.0.2" which "^1.2.10" -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - nth-check@^1.0.2, nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -9272,20 +9022,18 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.6.0, object-inspect@~1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== - -object-inspect@^1.7.0: +object-inspect@^1.6.0, object-inspect@^1.7.0, object-inspect@~1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== -object-is@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" - integrity sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY= +object-is@^1.0.1, object-is@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" + integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -9323,23 +9071,22 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.entries@^1.0.4, object.entries@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" - integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== +object.entries@^1.0.4, object.entries@^1.1.0, object.entries@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" + integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== dependencies: define-properties "^1.1.3" - es-abstract "^1.12.0" - function-bind "^1.1.1" + es-abstract "^1.17.5" has "^1.0.3" -object.fromentries@^2.0.0, object.fromentries@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.1.tgz#050f077855c7af8ae6649f45c80b16ee2d31e704" - integrity sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA== +object.fromentries@^2.0.0, object.fromentries@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" + integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== dependencies: define-properties "^1.1.3" - es-abstract "^1.15.0" + es-abstract "^1.17.0-next.1" function-bind "^1.1.1" has "^1.0.3" @@ -9350,13 +9097,13 @@ object.pick@^1.1.1, object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.0.4, object.values@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" - integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== +object.values@^1.0.4, object.values@^1.1.0, object.values@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== dependencies: define-properties "^1.1.3" - es-abstract "^1.12.0" + es-abstract "^1.17.0-next.1" function-bind "^1.1.1" has "^1.0.3" @@ -9432,19 +9179,7 @@ opn@^5.4.0: dependencies: is-wsl "^1.1.0" -optionator@^0.8.1, optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -optionator@^0.8.3: +optionator@^0.8.1, optionator@^0.8.2, optionator@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -9473,11 +9208,6 @@ ora@^3.4.0: strip-ansi "^5.2.0" wcwidth "^1.0.1" -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" @@ -9499,14 +9229,6 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -9539,14 +9261,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" - integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== - dependencies: - p-try "^2.0.0" - -p-limit@^2.2.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -9636,7 +9351,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0: +parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.5" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== @@ -9649,12 +9364,9 @@ parse-asn1@^5.0.0: safe-buffer "^5.1.1" parse-headers@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34" - integrity sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg== - dependencies: - for-each "^0.3.3" - string.prototype.trim "^1.1.2" + version "2.0.3" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" + integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== parse-json@^2.2.0: version "2.2.0" @@ -9671,6 +9383,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + parse-node-version@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" @@ -9752,10 +9474,10 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== -path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= +path-to-regexp@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== dependencies: isarray "0.0.1" @@ -9793,9 +9515,9 @@ pbkdf2@^3.0.3, pbkdf2@^3.0.9: sha.js "^2.4.8" percentile@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/percentile/-/percentile-1.2.2.tgz#8966abc4bb36aaacaee91405f17095d9c881d1cb" - integrity sha512-yb/W/Y3WNxEZ6/P75qkAvE3lu81AO1qDk95j7jPJg4Vj+wDWSDs0CMLVGoAUCOZbXOUOz3b3rWWR6Bf1hyzNJg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/percentile/-/percentile-1.3.0.tgz#137e521ddd5a6b3f766555208febe03032e8a3da" + integrity sha512-Aw2Mm/cLd0LX8VwOFHl2U5fnYlvytluq3mHlR+yb4Cnp6wJSCYqsoXohPKxPqs2lUoQpTiCXUjvdvUHONSRblw== performance-now@^2.1.0: version "2.1.0" @@ -9944,17 +9666,17 @@ pretty-format@^24.7.0, pretty-format@^24.9.0: ansi-styles "^3.2.0" react-is "^16.8.4" -pretty-format@^25.2.0, pretty-format@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.3.0.tgz#d0a4f988ff4a6cd350342fdabbb809aeb4d49ad5" - integrity sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA== +pretty-format@^25.1.0, pretty-format@^25.2.0, pretty-format@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" ansi-regex "^5.0.0" ansi-styles "^4.0.0" react-is "^16.12.0" -private@^0.1.6: +private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -9974,12 +9696,7 @@ process@~0.5.1: resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= -progress@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= - -progress@^2.0.0: +progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -10016,12 +9733,12 @@ prompt@^0.2.14: winston "0.8.x" prompts@^2.0.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.2.1.tgz#f901dd2a2dfee080359c0e20059b24188d75ad35" - integrity sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw== + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== dependencies: kleur "^3.0.3" - sisteransi "^1.0.3" + sisteransi "^1.0.4" prop-types-exact@^1.2.0: version "1.2.0" @@ -10069,10 +9786,10 @@ proxy-agent@3: proxy-from-env "^1.0.0" socks-proxy-agent "^4.0.1" -proxy-from-env@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" - integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= +proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== prr@~0.0.0: version "0.0.0" @@ -10089,10 +9806,10 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24, psl@^1.1.28: - version "1.4.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" - integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== public-encrypt@^4.0.0: version "4.0.3" @@ -10135,21 +9852,19 @@ punycode@2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qrcode@^1.2.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.2.tgz#e7c82a60140916d666541043bd2b0b72ee4e38a6" - integrity sha512-eR6RgxFYPDFH+zFLTJKtoNP/RlsHANQb52AUmQ2bGDPMuUw7jJb0F+DNEgx7qQGIElrbFxWYMc0/B91zLZPF9Q== + version "1.4.4" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" + integrity sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q== dependencies: + buffer "^5.4.3" + buffer-alloc "^1.2.0" + buffer-from "^1.1.1" dijkstrajs "^1.0.1" isarray "^2.0.1" pngjs "^3.3.0" @@ -10161,28 +9876,28 @@ qs@6.7.0: integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== qs@^6.5.1, qs@^6.5.2: - version "6.9.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.0.tgz#d1297e2a049c53119cb49cca366adbbacc80b409" - integrity sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA== + version "6.9.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" + integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -query-string@^6.12.1: - version "6.12.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.12.1.tgz#2ae4d272db4fba267141665374e49a1de09e8a7c" - integrity sha512-OHj+zzfRMyj3rmo/6G8a5Ifvw3AleL/EbcHMD27YA31Q+cO5lfmQxECkImuNVjcskLcvBRVHNAB3w6udMs1eAA== +query-string@^6.11.1: + version "6.13.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.1.tgz#d913ccfce3b4b3a713989fe6d39466d92e71ccad" + integrity sha512-RfoButmcK+yCta1+FuU8REvisx1oEzhMKwhLUNcepQTPGcNMp1sIqjnfCtfnvGSQZQEhaBHvccujtWoUV3TTbA== dependencies: decode-uri-component "^0.2.0" split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -query-string@^6.4.2: - version "6.8.3" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.8.3.tgz#fd9fb7ffb068b79062b43383685611ee47777d4b" - integrity sha512-llcxWccnyaWlODe7A9hRjkvdCKamEKTh+wH8ITdTc3OhchaqUZteiSCX/2ablWHVrkVIe04dntnaZJ7BdyW0lQ== +query-string@^6.12.1: + version "6.12.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.12.1.tgz#2ae4d272db4fba267141665374e49a1de09e8a7c" + integrity sha512-OHj+zzfRMyj3rmo/6G8a5Ifvw3AleL/EbcHMD27YA31Q+cO5lfmQxECkImuNVjcskLcvBRVHNAB3w6udMs1eAA== dependencies: decode-uri-component "^0.2.0" split-on-first "^1.0.0" @@ -10256,7 +9971,7 @@ raw-body@^2.2.0: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: +rc@^1.0.1, rc@^1.1.6: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -10272,9 +9987,9 @@ react-clone-referenced-element@^1.0.1: integrity sha512-FKOsfKbBkPxYE8576EM6uAfHC4rnMpLyH6/TJUL4WcHUEB3EUn8AxPjnnV/IiwSSzsClvHYK+sDELKN/EJ0WYg== react-devtools-core@^4.0.6: - version "4.6.0" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.6.0.tgz#2443b3c6fac78b801702af188abc6d83d56224e6" - integrity sha512-sjR3KC5VvGV7X6vzR3OTutPT5VeBcSKwoIXUwihpl1Nb4dkmweEbzCTPx2PYMVAqc+NZ5tPGhqBzXV+iGg5CNA== + version "4.7.0" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.7.0.tgz#71e89087352abe60c160dfb60a7fa700f612af7a" + integrity sha512-6w/e0nkV0gogUnfz+9Q3yiMtYYol9T+oD27UIf4XWmula1KvSTTkQ9DnzLOqSSch8d1YzNWbTxguuNJMof58ww== dependencies: shell-quote "^1.6.1" ws "^7" @@ -10289,16 +10004,11 @@ react-dom@16.8.4: prop-types "^15.6.2" scheduler "^0.13.4" -react-is@^16.12.0: +react-is@^16.12.0, react-is@^16.13.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: - version "16.11.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa" - integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw== - react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" @@ -10515,10 +10225,10 @@ react-native-reanimated@1.3.0: resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-1.3.0.tgz#581cdb0bd1ff05e7304b116af712ded0c7665ede" integrity sha512-KFno6D0q09kx71IDuPa4qeC1t1msALsCMuli3/EN3YDf8XoM2CG53yzhVHMFtmcW0IUCySugHgxQiuT5BzwOPA== -react-native-safe-area-view@^0.14.1, react-native-safe-area-view@^0.14.6: - version "0.14.8" - resolved "https://registry.yarnpkg.com/react-native-safe-area-view/-/react-native-safe-area-view-0.14.8.tgz#ef33c46ff8164ae77acad48c3039ec9c34873e5b" - integrity sha512-MtRSIcZNstxv87Jet+UsPhEd1tpGe8cVskDXlP657x6rHpSrbrc+y13ZNXrwAgGNNhqQNX7UJT68ZIq//ZRmvw== +react-native-safe-area-view@^0.14.6, react-native-safe-area-view@^0.14.9: + version "0.14.9" + resolved "https://registry.yarnpkg.com/react-native-safe-area-view/-/react-native-safe-area-view-0.14.9.tgz#90ee8383037010d9a5055a97cf97e4c1da1f0c3d" + integrity sha512-WII/ulhpVyL/qbYb7vydq7dJAfZRBcEhg4/UWt6F6nAKpLa3gAceMOxBxI914ppwSP/TdUsandFy6lkJQE0z4A== dependencies: hoist-non-react-statics "^2.3.1" @@ -10529,7 +10239,7 @@ react-native-safe-module@^1.1.0: dependencies: dedent "^0.6.0" -react-native-screens@1.0.0-alpha.23, "react-native-screens@^1.0.0 || ^1.0.0-alpha": +react-native-screens@1.0.0-alpha.23: version "1.0.0-alpha.23" resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-1.0.0-alpha.23.tgz#25d7ea4d11bda4fcde2d1da7ae50271c6aa636e0" integrity sha512-tOxHGQUN83MTmQB4ghoQkibqOdGiX4JQEmeyEv96MKWO/x8T2PJv84ECUos9hD3blPRQwVwSpAid1PPPhrVEaw== @@ -10587,9 +10297,9 @@ react-native-tab-view@^1.2.0: prop-types "^15.6.1" react-native-tab-view@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/react-native-tab-view/-/react-native-tab-view-2.10.0.tgz#5e249e5650502010013449ffd4e5edc18a95364b" - integrity sha512-qgexVz5eO4yaFjdkmn/sURXgVvaBo6pZD/q1eoca96SbPVbaH3WzVhF3bRUfeTHwZkXwznFTpS3JURqIFU8vQA== + version "2.14.2" + resolved "https://registry.yarnpkg.com/react-native-tab-view/-/react-native-tab-view-2.14.2.tgz#5f1e2063f632ec7f8ab27374ecaf72677788b445" + integrity sha512-BkQ9htmUM3iroMTgIdCSP+1On8bRHkgFHiOCAnk9OhoFlQOvwZebSU6k705QBDeuuwEVIIT4+C+nT2MvXI/FEQ== react-native-tcp@aprock/react-native-tcp#11/head: version "4.0.0" @@ -10713,11 +10423,11 @@ react-redux@5.1.1: react-lifecycles-compat "^3.0.0" react-refresh@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.2.tgz#54a277a6caaac2803d88f1d6f13c1dcfbd81e334" - integrity sha512-kv5QlFFSZWo7OlJFNYbxRtY66JImuP2LcrFgyJfQaf85gSP+byzG21UbDQEYjU7f//ny8rwiEkO6py2Y+fEgAQ== + version "0.4.3" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" + integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== -react-test-renderer@16.11.0, react-test-renderer@^16.0.0-0: +react-test-renderer@16.11.0: version "16.11.0" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.11.0.tgz#72574566496462c808ac449b0287a4c0a1a7d8f8" integrity sha512-nh9gDl8R4ut+ZNNb2EeKO5VMvTKxwzurbSMuGBoKtjpjbg8JK/u3eVPVNi1h1Ue+eYK9oSzJjb+K3lzLxyA4ag== @@ -10727,6 +10437,16 @@ react-test-renderer@16.11.0, react-test-renderer@^16.0.0-0: react-is "^16.8.6" scheduler "^0.17.0" +react-test-renderer@^16.0.0-0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.1.tgz#de25ea358d9012606de51e012d9742e7f0deabc1" + integrity sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ== + dependencies: + object-assign "^4.1.1" + prop-types "^15.6.2" + react-is "^16.8.6" + scheduler "^0.19.1" + react-timer-mixin@^0.13.3: version "0.13.4" resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz#75a00c3c94c13abe29b43d63b4c65a88fc8264d3" @@ -10756,6 +10476,15 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -10774,6 +10503,16 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + read@1.0.x: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" @@ -10801,10 +10540,10 @@ readable-stream@1.1.x, readable-stream@^1.0.26-4, readable-stream@^1.0.27-1, rea isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== +readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -10814,10 +10553,10 @@ readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stre string_decoder "~1.1.1" util-deprecate "~1.0.1" -"readable-stream@2 || 3", readable-stream@^3.1.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" - integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== +"readable-stream@2 || 3", readable-stream@^3.1.1, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -10859,9 +10598,9 @@ redux@4.0.1: symbol-observable "^1.2.0" redux@^4.0.1: - version "4.0.4" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.4.tgz#4ee1aeb164b63d6a1bcc57ae4aa0b6e6fa7a3796" - integrity sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q== + version "4.0.5" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" + integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== dependencies: loose-envify "^1.4.0" symbol-observable "^1.2.0" @@ -10871,10 +10610,10 @@ reflect.ownkeys@^0.2.0: resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA= -regenerate-unicode-properties@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== dependencies: regenerate "^1.4.0" @@ -10898,22 +10637,18 @@ regenerator-runtime@^0.12.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== -regenerator-runtime@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== - -regenerator-runtime@^0.13.4: +regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: version "0.13.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== -regenerator-transform@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" - integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== dependencies: - private "^0.1.6" + "@babel/runtime" "^7.8.4" + private "^0.1.8" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -10923,29 +10658,30 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -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" - integrity sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA== +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== dependencies: - define-properties "^1.1.2" + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpu-core@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" - integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== dependencies: regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" + unicode-match-property-value-ecmascript "^1.2.0" registry-auth-token@^3.0.1: version "3.4.0" @@ -10962,15 +10698,15 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" -regjsgen@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" - integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== dependencies: jsesc "~0.5.0" @@ -11022,33 +10758,7 @@ request-promise@4.2.4: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.72.0, request@^2.85.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -request@^2.88.0: +request@^2.72.0, request@^2.85.0, request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -11126,34 +10836,13 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" - integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.15.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.9.0: +resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0, resolve@~1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" -resolve@~1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" - integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== - dependencies: - path-parse "^1.0.6" - restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -11199,7 +10888,7 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -11233,13 +10922,12 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.0.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.3.tgz#7f94aef86cec412df87d5ea1d8cb116a47d45f0e" - integrity sha512-l6YVrI7+d2vpW6D6rS05x2Xrmq8oW7v3pieZOJKBEdjuTF4Kz/iwk55Zyh1Zaz+KOB2kC8+2jZlp2u9L4tTzCQ== +rlp@^2.0.0, rlp@^2.2.3: + version "2.2.5" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.5.tgz#b0577b763e909f21a9dea31b4b235b2393f15ef1" + integrity sha512-y1QxTQOp0OZnjn19FxBmped4p+BSKPHwGndaqrESseyd2xXZtcgR3yuTIosh8CaMaOii9SKIYerBXnV/CpJ3qw== dependencies: bn.js "^4.11.1" - safe-buffer "^5.1.1" rn-nodeify@10.0.1: version "10.0.1" @@ -11269,19 +10957,10 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" - -run-async@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" - integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== - dependencies: - is-promise "^2.1.0" +run-async@^2.2.0, run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-node@^1.0.0: version "1.0.0" @@ -11310,10 +10989,10 @@ rx-lite@*, rx-lite@^4.0.8: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= -"rxjs@>= 6", rxjs@^6.3.3, rxjs@^6.4.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== +"rxjs@>= 6", rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.3: + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== dependencies: tslib "^1.9.0" @@ -11324,22 +11003,15 @@ rxjs@^5.4.3: dependencies: symbol-observable "1.0.1" -rxjs@^6.5.3: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== - dependencies: - tslib "^1.9.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-event-emitter@^1.0.1: version "1.0.1" @@ -11387,7 +11059,7 @@ sanitize-filename@^1.6.1: dependencies: truncate-utf8-bytes "^1.0.0" -sax@^1.2.1, sax@^1.2.4: +sax@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -11415,6 +11087,14 @@ scheduler@^0.13.4: loose-envify "^1.1.0" object-assign "^4.1.1" +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scrypt-js@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" @@ -11451,7 +11131,7 @@ scryptsy@^1.2.1: dependencies: pbkdf2 "^3.0.3" -secp256k1@3.8.0: +secp256k1@3.8.0, secp256k1@^3.0.1: version "3.8.0" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== @@ -11465,20 +11145,6 @@ secp256k1@3.8.0: nan "^2.14.0" safe-buffer "^5.1.2" -secp256k1@^3.0.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.7.1.tgz#12e473e0e9a7c2f2d4d4818e722ad0e14cc1e2f1" - integrity sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g== - dependencies: - bindings "^1.5.0" - bip66 "^1.1.5" - bn.js "^4.11.8" - create-hash "^1.2.0" - drbg.js "^1.0.1" - elliptic "^6.4.1" - nan "^2.14.0" - safe-buffer "^5.1.2" - semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" @@ -11496,7 +11162,7 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -11555,7 +11221,7 @@ serve-static@^1.13.1: parseurl "~1.3.3" send "0.17.1" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -11599,9 +11265,9 @@ sha.js@^2.4.0, sha.js@^2.4.8: safe-buffer "^5.0.1" sha3@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.3.tgz#ed5958fa8331df1b1b8529ca9fdf225a340c5418" - integrity sha512-sOWDZi8cDBRkLfWOw18wvJyNblXDHzwMGnRWut8zNNeIeLnmMRO17bjpLc7OzMuj1ASUgx2IyohzUCAl+Kx5vA== + version "1.2.6" + resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.6.tgz#102aa3e47dc793e2357902c3cce8760822f9e905" + integrity sha512-KgLGmJGrmNB4JWVsAV11Yk6KbvsAiygWJc7t5IebWva/0NukNrjJqhtKhzy3Eiv2AKuGvhZZt7dt1mDo7HkoiQ== dependencies: nan "2.13.2" @@ -11656,25 +11322,33 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== simple-git@^1.85.0: - version "1.126.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.126.0.tgz#0c345372275139c8433b8277f4b3e155092aa434" - integrity sha512-47mqHxgZnN8XRa9HbpWprzUv3Ooqz9RY/LSZgvA7jCkW8jcwLahMz7LKugY91KZehfG0sCVPtgXiU72hd6b1Bw== + version "1.132.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.132.0.tgz#53ac4c5ec9e74e37c2fd461e23309f22fcdf09b1" + integrity sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg== dependencies: debug "^4.0.1" simple-plist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.0.0.tgz#bed3085633b22f371e111f45d159a1ccf94b81eb" - integrity sha512-043L2rO80LVF7zfZ+fqhsEkoJFvW8o59rt/l4ctx1TJWoTx7/jkiS1R5TatD15Z1oYnuLJytzE7gcnnBuIPL2g== + version "1.1.0" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.1.0.tgz#8354ab63eb3922a054c78ce96c209c532e907a23" + integrity sha512-2i5Tc0BYAqppM7jVzmNrI+aEUntPolIq4fDgji6WuNNn1D/qYdn2KwoLhZdzQkE04lu9L5tUoeJsjuJAvd+lFg== dependencies: - bplist-creator "0.0.7" - bplist-parser "0.1.1" + bplist-creator "0.0.8" + bplist-parser "0.2.0" plist "^3.0.1" single-call-balance-checker-abi@^1.0.0: @@ -11682,10 +11356,10 @@ single-call-balance-checker-abi@^1.0.0: resolved "https://registry.yarnpkg.com/single-call-balance-checker-abi/-/single-call-balance-checker-abi-1.0.0.tgz#b369009fd4cc6214968cdba650ad93986315d92d" integrity sha512-T5fRBJHmGEMe76JFGB36gcZnOh1ip2S7Qsp7cwmwrfMRjadxTe02zJHtXERpnQf2yvSqNWRxvae5f6e8v4rhng== -sisteransi@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.3.tgz#98168d62b79e3a5e758e27ae63c4a053d748f4eb" - integrity sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg== +sisteransi@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== sjcl@^1.0.3: version "1.0.8" @@ -11778,20 +11452,20 @@ socks@~2.3.2: smart-buffer "^4.1.0" source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: - atob "^2.1.1" + atob "^2.1.2" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.6, source-map-support@^0.5.9: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== +source-map-support@^0.5.16, source-map-support@^0.5.6: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -11822,22 +11496,22 @@ source-map@^0.7.3: integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" @@ -11903,9 +11577,9 @@ stackframe@^1.1.1: integrity sha512-0PlYhdKh6AfFxRyK/v+6/k+/mMfyiEBbTM5L94D0ZytQnJ166wuwoTYLHFWGbs2dpA8Rgq763KGWmN1EQEYHRQ== stacktrace-parser@^0.1.3: - version "0.1.7" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.7.tgz#9ed005638a5e79dcf256611da1dfb4871e6fd14d" - integrity sha512-Evm+NuZ2ZTwGazsbsZC+EV1EGsvyxgIvtNwbyFfeXaq/8L78M5Kdh0qpmQaTkUpbOAKbbPP7c7qZa7u8XFsrUA== + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== dependencies: type-fest "^0.7.1" @@ -11977,7 +11651,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -12003,23 +11677,26 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trim@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz#75a729b10cfc1be439543dae442129459ce61e3d" - integrity sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg== +string.prototype.matchall@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== dependencies: define-properties "^1.1.3" - es-abstract "^1.13.0" - function-bind "^1.1.1" + es-abstract "^1.17.0" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" -string.prototype.trim@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" - integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= +string.prototype.trim@^1.1.2, string.prototype.trim@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782" + integrity sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw== dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.0" - function-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" string.prototype.trimend@^1.0.0: version "1.0.1" @@ -12029,14 +11706,6 @@ string.prototype.trimend@^1.0.0: define-properties "^1.1.3" es-abstract "^1.17.5" -string.prototype.trimleft@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" - integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - string.prototype.trimleft@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" @@ -12046,14 +11715,6 @@ string.prototype.trimleft@^2.1.1: es-abstract "^1.17.5" string.prototype.trimstart "^1.0.0" -string.prototype.trimright@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" - integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - string.prototype.trimright@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" @@ -12160,14 +11821,14 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= strip-json-comments@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" + integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== sudo-prompt@^9.0.0: - version "9.1.1" - resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.1.1.tgz#73853d729770392caec029e2470db9c221754db0" - integrity sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA== + version "9.2.1" + resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" + integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== superagent-proxy@^2.0.0: version "2.0.0" @@ -12243,9 +11904,9 @@ symbol-tree@^3.2.2: integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== synchronous-promise@^2.0.5: - version "2.0.10" - resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.10.tgz#e64c6fd3afd25f423963353043f4a68ebd397fd8" - integrity sha512-6PC+JRGmNjiG3kJ56ZMNWDPL8hjyghF5cMXIFOKg+NiwwEZZIvxTWd0pinWKyD227odg9ygF8xVhhz7gb8Uq7A== + version "2.0.13" + resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.13.tgz#9d8c165ddee69c5a6542862b405bc50095926702" + integrity sha512-R9N6uDkVsghHePKh1TEqbnLddO2IY25OcsksyFp/qBe7XYd0PVbKEWxhcdMhpLzE1I6skj5l4aEZ3CRxcbArlA== table@^5.2.3: version "5.4.6" @@ -12263,37 +11924,26 @@ tail@^2.0.0: integrity sha512-s9NOGkLqqiDEtBttQZI7acLS8ycYK5sTlDwNjGnpXG9c8AWj0cfAtwEIzo/hVRMMiC5EYz+bXaJWC1u1u0GPpQ== tape@^4.8.0: - version "4.11.0" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.11.0.tgz#63d41accd95e45a23a874473051c57fdbc58edc1" - integrity sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA== + version "4.13.3" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.3.tgz#51b3d91c83668c7a45b1a594b607dee0a0b46278" + integrity sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw== dependencies: - deep-equal "~1.0.1" + deep-equal "~1.1.1" defined "~1.0.0" + dotignore "~0.1.2" for-each "~0.3.3" function-bind "~1.1.1" - glob "~7.1.4" + glob "~7.1.6" has "~1.0.3" inherits "~2.0.4" - minimist "~1.2.0" - object-inspect "~1.6.0" - resolve "~1.11.1" + is-regex "~1.0.5" + minimist "~1.2.5" + object-inspect "~1.7.0" + resolve "~1.17.0" resumer "~0.0.0" - string.prototype.trim "~1.1.2" + string.prototype.trim "~1.2.1" through "~2.3.8" -tar@^4: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - telnet-client@1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/telnet-client/-/telnet-client-1.2.8.tgz#946c0dadc8daa3f19bb40a3e898cb870403a4ca4" @@ -12477,14 +12127,6 @@ tough-cookie@^3.0.1: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -12504,15 +12146,10 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" -tslib@^1.8.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" - integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== - -tslib@^1.9.0, tslib@^1.9.3: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== +tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== tsutils@^3.7.0: version "3.17.1" @@ -12529,9 +12166,9 @@ tunnel-agent@^0.6.0: safe-buffer "^5.0.1" tweetnacl-util@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.0.tgz#4576c1cee5e2d63d207fee52f1ba02819480bc75" - integrity sha1-RXbBzuXi1j0gf+5S8boCgZSAvHU= + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" @@ -12539,9 +12176,9 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= tweetnacl@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.1.tgz#2594d42da73cd036bd0d2a54683dd35a6b55ca17" - integrity sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A== + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== type-check@~0.3.2: version "0.3.2" @@ -12560,6 +12197,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + type-fest@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" @@ -12593,9 +12235,9 @@ typescript-fsa@^3.0.0-beta-2: integrity sha512-xiXAib35i0QHl/+wMobzPibjAH5TJLDj+qGq5jwVLG9qR4FUswZURBw2qihBm0m06tHoyb3FzpnJs1GRhRwVag== ua-parser-js@^0.7.18: - version "0.7.20" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz#7527178b82f6a62a0f243d1f94fd30e3e3c21098" - integrity sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw== + version "0.7.21" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" + integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== uglify-es@^3.1.9: version "3.3.9" @@ -12628,15 +12270,15 @@ unicode-match-property-ecmascript@^1.0.4: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== union-value@^1.0.0: version "1.0.1" @@ -12825,9 +12467,9 @@ uuid@^2.0.1: integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= uuid@^3.0.1, uuid@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" - integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== v8-android@~8.80.1: version "8.80.1" @@ -12839,10 +12481,10 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== -v8-to-istanbul@^4.0.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz#22fe35709a64955f49a08a7c7c959f6520ad6f20" - integrity sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng== +v8-to-istanbul@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz#b97936f21c0e2d9996d4985e5c5156e9d4e49cd6" + integrity sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -12898,11 +12540,11 @@ vm-browserify@0.0.4: indexof "0.0.1" w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: - browser-process-hrtime "^0.1.2" + browser-process-hrtime "^1.0.0" w3c-xmlserializer@^1.1.2: version "1.1.2" @@ -12936,16 +12578,16 @@ weak@^1.0.0: nan "^2.0.5" web3-provider-engine@^15.0.4: - version "15.0.4" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-15.0.4.tgz#5c336bcad2274dff5218bc8db003fa4e9e464c24" - integrity sha512-Ob9oK0TUZfVC7NXkB7CQSWAiCdCD/Xnlh2zTnV8NdJR8LCrMAy2i6JedU70JHaxw59y7mM4GnsYOTTGkquFnNQ== + version "15.0.12" + resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-15.0.12.tgz#24d7f2f6fb6de856824c7306291018c4fc543ac3" + integrity sha512-/OfhQalKPND1iB5ggvGuYF0+SIb2Qj5OFTrT2VrZWP79UhMTdP7T+L2FtblmRdCeOetoAzZHdBaIwLOZsmIX+w== dependencies: async "^2.5.0" backoff "^2.5.0" clone "^2.0.0" cross-fetch "^2.1.0" eth-block-tracker "^4.4.2" - eth-json-rpc-errors "^1.0.1" + eth-json-rpc-errors "^2.0.2" eth-json-rpc-filters "^4.1.1" eth-json-rpc-infura "^4.0.1" eth-json-rpc-middleware "^4.1.5" @@ -13010,6 +12652,27 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +which-boxed-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz#cbe8f838ebe91ba2471bb69e9edbda67ab5a5ec1" + integrity sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ== + dependencies: + is-bigint "^1.0.0" + is-boolean-object "^1.0.0" + is-number-object "^1.0.3" + is-string "^1.0.4" + is-symbol "^1.0.2" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -13041,13 +12704,6 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - widest-line@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" @@ -13078,7 +12734,7 @@ word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wordwrap@^1.0.0, wordwrap@~1.0.0: +wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= @@ -13157,7 +12813,7 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@7.3.0: +ws@7.3.0, ws@^7, ws@^7.0.0: version "7.3.0" resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== @@ -13186,19 +12842,7 @@ ws@^5.1.1: dependencies: async-limiter "~1.0.0" -ws@^7: - version "7.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" - integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== - -ws@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.0.tgz#422eda8c02a4b5dba7744ba66eebbd84bcef0ec7" - integrity sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg== - dependencies: - async-limiter "^1.0.0" - -xcode@2.0.0, xcode@^2.0.0: +xcode@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.0.0.tgz#134f1f94c26fbfe8a9aaa9724bfb2772419da1a2" integrity sha512-5xF6RCjAdDEiEsbbZaS/gBRt3jZ/177otZcpoLCjGN/u1LrfgH7/Sgeeavpr/jELpyDqN2im3AKosl2G2W8hfw== @@ -13206,6 +12850,14 @@ xcode@2.0.0, xcode@^2.0.0: simple-plist "^1.0.0" uuid "^3.3.2" +xcode@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.1.0.tgz#bab64a7e954bb50ca8d19da7e09531c65a43ecfe" + integrity sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ== + dependencies: + simple-plist "^1.0.0" + uuid "^3.3.2" + xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" @@ -13256,9 +12908,9 @@ xmldoc@^1.1.2: sax "^1.2.1" xmldom@0.1.x: - version "0.1.27" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" - integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= + version "0.1.31" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== xmlhttprequest@*, xmlhttprequest@1.8.0: version "1.8.0" @@ -13275,6 +12927,13 @@ xregexp@2.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= +xregexp@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" + integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== + dependencies: + "@babel/runtime-corejs3" "^7.8.3" + xtend@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" @@ -13320,7 +12979,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -13333,10 +12992,10 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.0.0, yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== +yargs-parser@^13.0.0, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -13350,9 +13009,9 @@ yargs-parser@^15.0.1: decamelize "^1.2.0" yargs-parser@^18.1.1: - version "18.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" - integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -13376,9 +13035,9 @@ yargs@^12.0.2, yargs@^12.0.5: yargs-parser "^11.1.1" yargs@^13.0.0, yargs@^13.2.2, yargs@^13.2.4: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" find-up "^3.0.0" @@ -13389,7 +13048,7 @@ yargs@^13.0.0, yargs@^13.2.2, yargs@^13.2.4: string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.1.1" + yargs-parser "^13.1.2" yargs@^14.2.0: version "14.2.3" From a8af8cea09c4e6fbc91596e466aa5afeb7182478 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Fri, 17 Jul 2020 20:28:12 -0400 Subject: [PATCH 073/106] Remove unnecessary fragment --- .../TransactionReviewFeeCard/index.js | 68 +++++++++---------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/app/components/UI/TransactionReview/TransactionReviewFeeCard/index.js b/app/components/UI/TransactionReview/TransactionReviewFeeCard/index.js index c0936ebcb49..e37249045ed 100644 --- a/app/components/UI/TransactionReview/TransactionReviewFeeCard/index.js +++ b/app/components/UI/TransactionReview/TransactionReviewFeeCard/index.js @@ -98,47 +98,45 @@ class TransactionReviewFeeCard extends PureComponent { equivalentTotalAmount = totalValue; } return ( - <> -

- + + + + {strings('transaction.amount')} + + + {amount} + + + + - {strings('transaction.amount')} + {strings('transaction.gas_fee')} - - {amount} - - - - - - {strings('transaction.gas_fee')} + + + {' '} + {strings('transaction.edit')} - - - {' '} - {strings('transaction.edit')} - - - + + - {this.renderIfGasEstimationReady( - - {networkFee} - - )} - - - + {this.renderIfGasEstimationReady( - {strings('transaction.total')} {strings('transaction.amount')} + {networkFee} - {!!totalFiat && this.renderIfGasEstimationReady(totalAmount)} - - - {this.renderIfGasEstimationReady({equivalentTotalAmount})} - - - + )} + + + + + {strings('transaction.total')} {strings('transaction.amount')} + + {!!totalFiat && this.renderIfGasEstimationReady(totalAmount)} + + + {this.renderIfGasEstimationReady({equivalentTotalAmount})} + + ); } } From fade784b47041e375dc1e19de4adb24cc43d9c6c Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Mon, 20 Jul 2020 17:38:12 -0400 Subject: [PATCH 074/106] Add toLocaleString to Order summary --- app/components/Views/FiatOrdersView/OrderDetails.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/Views/FiatOrdersView/OrderDetails.js b/app/components/Views/FiatOrdersView/OrderDetails.js index 0de6ee96944..e2ba6d1ef60 100644 --- a/app/components/Views/FiatOrdersView/OrderDetails.js +++ b/app/components/Views/FiatOrdersView/OrderDetails.js @@ -80,7 +80,7 @@ function OrderDetails({ order: { ...order }, closeModal }) { {strings('fiat_on_ramp.Fee')} - {addCurrencySymbol(order.fee, order.currency)} + {addCurrencySymbol(order.fee.toLocaleString(), order.currency)} @@ -89,7 +89,7 @@ function OrderDetails({ order: { ...order }, closeModal }) { {strings('fiat_on_ramp.total_amount')} - {addCurrencySymbol(order.amount, order.currency)} + {addCurrencySymbol(order.amount.toLocaleString(), order.currency)} From eb87d61f4bb709ee601075a49660224ef97be3de Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Tue, 21 Jul 2020 10:46:18 -0400 Subject: [PATCH 075/106] Prevent duplicate add order --- app/reducers/fiatOrders/index.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/reducers/fiatOrders/index.js b/app/reducers/fiatOrders/index.js index 30aa6131aa5..3e29333144d 100644 --- a/app/reducers/fiatOrders/index.js +++ b/app/reducers/fiatOrders/index.js @@ -83,6 +83,12 @@ const findOrderIndex = (provider, id, orders) => const fiatOrderReducer = (state = initialState, action) => { switch (action.type) { case 'FIAT_ADD_ORDER': { + const orders = state.orders; + const order = action.payload; + const index = findOrderIndex(order.provider, order.id, orders); + if (index !== -1) { + return state; + } return { ...state, orders: [action.payload, ...state.orders] @@ -91,7 +97,7 @@ const fiatOrderReducer = (state = initialState, action) => { case 'FIAT_UPDATE_ORDER': { const orders = state.orders; const order = action.payload; - const index = findOrderIndex(order.provider, order.id, state.orders); + const index = findOrderIndex(order.provider, order.id, orders); return { ...state, orders: [ From ff8cc54f5772b0a71cd25599a893d3e818193545 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 23 Jul 2020 16:13:08 -0400 Subject: [PATCH 076/106] Fix summary displaying NaN values --- app/components/Views/FiatOrdersView/OrderDetails.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Views/FiatOrdersView/OrderDetails.js b/app/components/Views/FiatOrdersView/OrderDetails.js index e2ba6d1ef60..567054f4fff 100644 --- a/app/components/Views/FiatOrdersView/OrderDetails.js +++ b/app/components/Views/FiatOrdersView/OrderDetails.js @@ -65,7 +65,7 @@ function OrderDetails({ order: { ...order }, closeModal }) { )} - {order.amount != null && order.fee != null && ( + {Number.isFinite(order.amount) && Number.isFinite(order.fee) && ( From 9b5e30958b5486c269b02b55f210419cc5b8b079 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Thu, 6 Aug 2020 18:21:58 -0400 Subject: [PATCH 077/106] bump CURRENT_PROJECT_VERSION: : --- ios/MetaMask.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index b9c68239e68..27b5c4884be 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -847,7 +847,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMaskDebug.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 509; + CURRENT_PROJECT_VERSION = 510; DEAD_CODE_STRIPPING = NO; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -910,7 +910,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 509; + CURRENT_PROJECT_VERSION = 510; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; FRAMEWORK_SEARCH_PATHS = ( From 2ea4e2dca3bffd1bc8f8abf30ff67f64a8a3dbab Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Mon, 10 Aug 2020 08:42:32 -0400 Subject: [PATCH 078/106] Update merchant ids --- app/core/AppConstants.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/core/AppConstants.js b/app/core/AppConstants.js index b6012544303..995cf40400b 100644 --- a/app/core/AppConstants.js +++ b/app/core/AppConstants.js @@ -42,8 +42,8 @@ export default { TRANSAK_REDIRECT_URL: 'https://metamask.io/', WYRE_API_ENDPOINT: 'https://api.sendwyre.com/', WYRE_API_ENDPOINT_TEST: 'https://api.testwyre.com/', - WYRE_MERCHANT_ID: 'merchant.io.metamask', - WYRE_MERCHANT_ID_TEST: 'merchant.io.metamask-test', + WYRE_MERCHANT_ID: 'merchant.io.metamask.wyre', + WYRE_MERCHANT_ID_TEST: 'merchant.io.metamask.wyre.test', POLLING_FREQUENCY: 10000 } }; From 8129a6000370287d09c1ab07f33acfb128636a6a Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Mon, 10 Aug 2020 08:48:03 -0400 Subject: [PATCH 079/106] Add error logger when apple pay fails --- app/components/UI/FiatOrders/PaymentMethodApplePay/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index d4cfd8fbc92..bb23fa55aae 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -284,6 +284,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network description: `${error instanceof WyreException ? 'Wyre: ' : ''}${error.message}`, status: 'error' }); + Logger.error(error, 'FiatOrders::WyreApplePayProcessor Error'); } finally { setLockTime(prevLockTime); } From 60c4d76c716bfbb8627e06a81aae6a0d7312b44e Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Mon, 10 Aug 2020 12:02:40 -0400 Subject: [PATCH 080/106] merchantids --- ios/MetaMask/MetaMask.entitlements | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/MetaMask/MetaMask.entitlements b/ios/MetaMask/MetaMask.entitlements index 0ee0d28c177..70d4d8f04a3 100644 --- a/ios/MetaMask/MetaMask.entitlements +++ b/ios/MetaMask/MetaMask.entitlements @@ -12,8 +12,8 @@ com.apple.developer.in-app-payments - merchant.io.metamask - merchant.io.metamask-test + merchant.io.metamask.wyre + merchant.io.metamask.wyre.test From 60084baa41f1bd9d20c93ddc4e53497bfb21f5ae Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Wed, 12 Aug 2020 15:23:18 -0400 Subject: [PATCH 081/106] publish-pre-release-android: --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 716cd38eee2..3c0f631bb77 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -201,9 +201,9 @@ workflows: # - upload-coverage: # requires: # - test-unit - - publish-pre-release-ios: + # - publish-pre-release-ios: + # requires: + # - prep-deps + - publish-pre-release-android: requires: - prep-deps - # - publish-pre-release-android: - # requires: - # - publish-pre-release-ios From 8f852c203c2dadddaa39e0ffbaac25263273b348 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Thu, 13 Aug 2020 10:27:55 -0400 Subject: [PATCH 082/106] npx jetify --- package.json | 5 +- scripts/postinstall.sh | 9 ++- yarn.lock | 163 ++--------------------------------------- 3 files changed, 14 insertions(+), 163 deletions(-) diff --git a/package.json b/package.json index 1d9af3caebd..71a51b0d623 100644 --- a/package.json +++ b/package.json @@ -127,8 +127,8 @@ "react": "16.11.0", "react-native": "0.62.2", "react-native-actionsheet": "beefe/react-native-actionsheet#107/head", - "react-native-aes-crypto": "^1.3.9", - "react-native-aes-crypto-forked": "git+https://github.com/andrepimenta/react-native-aes-forked.git#de903003afc81e4ad14ed00e237795a696716e9e", + "react-native-aes-crypto": "^1.3.9", + "react-native-aes-crypto-forked": "git+https://github.com/andrepimenta/react-native-aes-forked.git#de903003afc81e4ad14ed00e237795a696716e9e", "react-native-animated-fox": "git+https://github.com/MetaMask/react-native-animated-fox.git#16e38d54d829709e497f196e31fa8ff00cdf2aa9", "react-native-background-timer": "2.1.1", "react-native-branch": "5.0.0-beta.1", @@ -210,6 +210,7 @@ "husky": "1.3.1", "jest": "^25.2.7", "jest-serializer": "24.4.0", + "jetifier": "^1.6.6", "lint-staged": "8.1.5", "metro": "^0.59.0", "metro-react-native-babel-preset": "^0.59.0", diff --git a/scripts/postinstall.sh b/scripts/postinstall.sh index 85d4739beda..7c1b96f0164 100755 --- a/scripts/postinstall.sh +++ b/scripts/postinstall.sh @@ -4,13 +4,16 @@ echo "PostInstall script:" echo "1. React Native nodeify..." node_modules/.bin/rn-nodeify --install 'crypto,buffer,react-native-randombytes,vm,stream,http,https,os,url,net,fs' --hack -echo "2. Patch npm packages" +echo "2. jetify" +npx jetify + +echo "3. Patch npm packages" npx patch-package -echo "2. Create xcconfig files..." +echo "4. Create xcconfig files..." echo "" > ios/debug.xcconfig echo "" > ios/release.xcconfig -echo "3. Init git submodules" +echo "5. Init git submodules" echo "This may take a while..." git submodule update --init diff --git a/yarn.lock b/yarn.lock index 8a9daa6129d..6f80425cd7c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -166,144 +166,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127" integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA== -"@babel/helper-regex@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96" - integrity sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g== - dependencies: - lodash "^4.17.13" - - dependencies: - "@babel/types" "^7.10.1" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268" - integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw== - dependencies: - "@babel/types" "^7.10.1" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz#0ec7d9be8174934532661f87783eb18d72290059" - integrity sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.10.1" - "@babel/types" "^7.10.1" - -"@babel/helper-builder-react-jsx-experimental@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz#9a7d58ad184d3ac3bafb1a452cec2bad7e4a0bc8" - integrity sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-module-imports" "^7.10.1" - "@babel/types" "^7.10.1" - -"@babel/helper-builder-react-jsx@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz#a327f0cf983af5554701b1215de54a019f09b532" - integrity sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/types" "^7.10.1" - -"@babel/helper-create-class-features-plugin@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.1.tgz#6d8a45aafe492378d0e6fc0b33e5dea132eae21c" - integrity sha512-bwhdehBJZt84HuPUcP1HaTLuc/EywVS8rc3FgsEPDcivg+DCW+SHuLHVkYOmcBA1ZfI+Z/oZjQc/+bPmIO7uAA== - dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-member-expression-to-functions" "^7.10.1" - "@babel/helper-optimise-call-expression" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" - -"@babel/helper-create-regexp-features-plugin@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd" - integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-regex" "^7.10.1" - regexpu-core "^4.7.0" - -"@babel/helper-define-map@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz#5e69ee8308648470dd7900d159c044c10285221d" - integrity sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg== - dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/types" "^7.10.1" - lodash "^4.17.13" - -"@babel/helper-explode-assignable-expression@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz#e9d76305ee1162ca467357ae25df94f179af2b7e" - integrity sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg== - dependencies: - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" - -"@babel/helper-function-name@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4" - integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ== - dependencies: - "@babel/helper-get-function-arity" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" - -"@babel/helper-get-function-arity@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d" - integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw== - dependencies: - "@babel/types" "^7.10.1" - -"@babel/helper-member-expression-to-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz#432967fd7e12a4afef66c4687d4ca22bc0456f15" - integrity sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g== - dependencies: - "@babel/types" "^7.10.1" - -"@babel/helper-module-imports@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876" - integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg== - dependencies: - "@babel/types" "^7.10.1" - -"@babel/helper-module-transforms@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" - integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg== - dependencies: - "@babel/helper-module-imports" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" - "@babel/helper-simple-access" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" - lodash "^4.17.13" - -"@babel/helper-optimise-call-expression@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz#b4a1f2561870ce1247ceddb02a3860fa96d72543" - integrity sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg== - dependencies: - "@babel/types" "^7.10.1" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.8.0": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127" - integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA== - "@babel/helper-regex@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96" @@ -4686,26 +4548,6 @@ eth-json-rpc-middleware@^4.0.0, eth-json-rpc-middleware@^4.1.4, eth-json-rpc-mid pify "^3.0.0" safe-event-emitter "^1.0.1" -eth-json-rpc-middleware@^4.0.0, eth-json-rpc-middleware@^4.1.4, eth-json-rpc-middleware@^4.1.5: - version "4.4.1" - resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.1.tgz#07d3dd0724c24a8d31e4a172ee96271da71b4228" - integrity sha512-yoSuRgEYYGFdVeZg3poWOwAlRI+MoBIltmOB86MtpoZjvLbou9EB/qWMOWSmH2ryCWLW97VYY6NWsmWm3OAA7A== - dependencies: - btoa "^1.2.1" - clone "^2.1.1" - eth-json-rpc-errors "^1.0.1" - eth-query "^2.1.2" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.6.0" - ethereumjs-tx "^1.3.7" - ethereumjs-util "^5.1.2" - ethereumjs-vm "^2.6.0" - fetch-ponyfill "^4.0.0" - json-rpc-engine "^5.1.3" - json-stable-stringify "^1.0.1" - pify "^3.0.0" - safe-event-emitter "^1.0.1" - eth-keyring-controller@^5.6.1: version "5.6.1" resolved "https://registry.yarnpkg.com/eth-keyring-controller/-/eth-keyring-controller-5.6.1.tgz#7b7268400704c8f5ce98a055910341177dd207ca" @@ -7334,6 +7176,11 @@ jetifier@^1.6.2: resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.5.tgz#ea87324a4230bef20a9651178ecab978ee54a8cb" integrity sha512-T7yzBSu9PR+DqjYt+I0KVO1XTb1QhAfHnXV5Nd3xpbXM6Xg4e3vP60Q4qkNU8Fh6PHC2PivPUNN3rY7G2MxcDQ== +jetifier@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.6.tgz#fec8bff76121444c12dc38d2dad6767c421dab68" + integrity sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ== + js-sha3@0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.5.tgz#baf0c0e8c54ad5903447df96ade7a4a1bca79a4a" From a6e28f0315624b1a5e6cf785391807dfd1be14a6 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 13 Aug 2020 13:17:46 -0400 Subject: [PATCH 083/106] Conditionally show account name Fixes QA Issue #3 --- app/components/UI/FiatOrders/components/AccountBar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/UI/FiatOrders/components/AccountBar.js b/app/components/UI/FiatOrders/components/AccountBar.js index 82556ff0962..e1f5557bd7c 100644 --- a/app/components/UI/FiatOrders/components/AccountBar.js +++ b/app/components/UI/FiatOrders/components/AccountBar.js @@ -46,7 +46,7 @@ const AccountBar = ({ toggleAccountsModal, selectedAddress, identities }) => ( - {identities[selectedAddress].name} () + {identities[selectedAddress]?.name} () From a5b94b8d2a1d99e06b30da06d327f19ea6348cfb Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 13 Aug 2020 14:11:30 -0400 Subject: [PATCH 084/106] Add ScrollView hack to modal Solves QA Issue#4 --- .../UI/FiatOrders/components/PaymentMethod/Modal.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js b/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js index fee09e451d4..558bb06414e 100644 --- a/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js +++ b/app/components/UI/FiatOrders/components/PaymentMethod/Modal.js @@ -1,6 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { StyleSheet, View, TouchableOpacity } from 'react-native'; +import { StyleSheet, View, TouchableOpacity, ScrollView } from 'react-native'; +import { SafeAreaView } from 'react-navigation'; import Modal from 'react-native-modal'; import IonicIcon from 'react-native-vector-icons/Ionicons'; import { strings } from '../../../../../../locales/i18n'; @@ -8,15 +9,13 @@ import { strings } from '../../../../../../locales/i18n'; import Title from '../Title'; import { colors } from '../../../../../styles/common'; import StyledButton from '../../../StyledButton'; -import { SafeAreaView } from 'react-navigation'; -import { ScrollView } from 'react-native-gesture-handler'; const styles = StyleSheet.create({ modalView: { backgroundColor: colors.white, justifyContent: 'center', alignItems: 'center', - marginVertical: 25, + marginVertical: 50, borderRadius: 10, shadowColor: colors.black, shadowOffset: { @@ -27,7 +26,6 @@ const styles = StyleSheet.create({ shadowRadius: 6.68, elevation: 11 }, - modal: { margin: 0, width: '100%', @@ -74,6 +72,7 @@ const PaymentMethodModal = ({ isVisible, title, dismiss, children }) => ( onSwipeComplete={dismiss} swipeDirection="down" style={styles.modal} + propagateSwipe > @@ -82,7 +81,9 @@ const PaymentMethodModal = ({ isVisible, title, dismiss, children }) => ( - {children} + + true}>{children} + {strings('fiat_on_ramp.purchase_method_modal_close')} From 78bca9edaf994c08274360f651f4278ff7a972cb Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 13 Aug 2020 14:24:46 -0400 Subject: [PATCH 085/106] Fix apple pay keypad for small device Fixes QA Issue #5 --- .../UI/FiatOrders/PaymentMethodApplePay/index.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index bb23fa55aae..9378d337925 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -35,16 +35,16 @@ const styles = StyleSheet.create({ justifyContent: 'space-between' }, amountContainer: { - margin: 10, - padding: Device.isMediumDevice() ? 10 : 15, + margin: Device.isIphone5() ? 0 : 10, + padding: Device.isMediumDevice() ? (Device.isIphone5() ? 5 : 10) : 15, alignItems: 'center', justifyContent: 'center' }, amount: { ...fontStyles.light, color: colors.black, - fontSize: 48, - height: 60 + fontSize: Device.isIphone5() ? 48 : 48, + height: Device.isIphone5() ? 50 : 60 }, amountError: { color: colors.red @@ -84,7 +84,7 @@ const styles = StyleSheet.create({ }, keypadButton: { paddingHorizontal: 20, - paddingVertical: Device.isMediumDevice() ? 10 : 15, + paddingVertical: Device.isMediumDevice() ? (Device.isIphone5() ? 5 : 10) : 15, flex: 1, justifyContent: 'center', alignItems: 'center' @@ -104,7 +104,7 @@ const styles = StyleSheet.create({ applePayButton: { backgroundColor: colors.black, padding: 10, - margin: 10, + margin: Device.isIphone5() ? 5 : 10, marginHorizontal: 25, alignItems: 'center' }, From c8da160f3066335581a009c6e9ba0a39167f983f Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 13 Aug 2020 14:34:48 -0400 Subject: [PATCH 086/106] Fix transak logo for iphone 5 Fixes QA Issue #6 --- .../UI/FiatOrders/PaymentMethodSelector/transak.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js b/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js index a4f12cea625..e4d416bc6ac 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js @@ -12,7 +12,10 @@ import Device from '../../../../util/Device'; const style = StyleSheet.create({ logo: { - marginVertical: 5 + marginVertical: 5, + aspectRatio: 95 / 25, + width: Device.isIphone5() ? 80 : 95, + height: Device.isIphone5() ? 20 : 25 }, cta: { marginTop: 25, From bf63807bfc07330a23cc9b3a6ac4cd728ca4cbe5 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Thu, 13 Aug 2020 14:54:49 -0400 Subject: [PATCH 087/106] issue 7 --- app/components/UI/CustomGas/index.js | 6 +++--- .../TransactionReview/TransactionReviewInformation/index.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/components/UI/CustomGas/index.js b/app/components/UI/CustomGas/index.js index 30884e3e5f1..24feade1904 100644 --- a/app/components/UI/CustomGas/index.js +++ b/app/components/UI/CustomGas/index.js @@ -574,7 +574,7 @@ class CustomGas extends PureComponent { renderCustomGasInput = () => { const { customGasLimitBN, customGasPriceBNWei, customGasPriceBN } = this.state; const { generateTransform } = this.props; - const totalGas = customGasLimitBN.mul(customGasPriceBNWei); + const totalGas = customGasLimitBN && customGasLimitBN.mul(customGasPriceBNWei); const ticker = getTicker(this.props.ticker); return ( @@ -608,7 +608,7 @@ class CustomGas extends PureComponent { keyboardType="numeric" style={styles.gasInput} onChangeText={this.onGasPriceChange} - value={customGasPriceBN.toString()} + value={customGasLimitBN && customGasPriceBN.toString()} /> diff --git a/app/components/UI/TransactionReview/TransactionReviewInformation/index.js b/app/components/UI/TransactionReview/TransactionReviewInformation/index.js index adfc831dce7..7c3ddcb06e3 100644 --- a/app/components/UI/TransactionReview/TransactionReviewInformation/index.js +++ b/app/components/UI/TransactionReview/TransactionReviewInformation/index.js @@ -70,8 +70,8 @@ const styles = StyleSheet.create({ maxWidth: '30%' }, viewDataWrapper: { - marginTop: 32, - marginBottom: 16 + flex: 1, + marginTop: 16 }, viewDataButton: { alignSelf: 'center' From 34b1d084e4c1e3e64a677f381736391fd4f3ba96 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 13 Aug 2020 14:55:18 -0400 Subject: [PATCH 088/106] Improve heading title in iphone5s --- app/components/UI/FiatOrders/components/Heading.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/components/UI/FiatOrders/components/Heading.js b/app/components/UI/FiatOrders/components/Heading.js index 13a1a8dafb4..393b3c765f0 100644 --- a/app/components/UI/FiatOrders/components/Heading.js +++ b/app/components/UI/FiatOrders/components/Heading.js @@ -1,9 +1,10 @@ import React from 'react'; import { View, StyleSheet } from 'react-native'; +import Device from '../../../../util/Device'; const style = StyleSheet.create({ view: { - margin: 30 + margin: Device.isIphone5() ? 20 : 30 } }); From 7831658400168364497870c824cb93966a70b488 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Thu, 13 Aug 2020 15:28:39 -0400 Subject: [PATCH 089/106] bump 514 --- .circleci/config.yml | 8 ++++---- ios/MetaMask.xcodeproj/project.pbxproj | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3c0f631bb77..d465a076e41 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -201,9 +201,9 @@ workflows: # - upload-coverage: # requires: # - test-unit - # - publish-pre-release-ios: - # requires: - # - prep-deps - - publish-pre-release-android: + - publish-pre-release-ios: requires: - prep-deps + - publish-pre-release-android: + requires: + - publish-pre-release-ios diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 0bdf8c91e46..03b4900cfa1 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -847,7 +847,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMaskDebug.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 512; + CURRENT_PROJECT_VERSION = 514; DEAD_CODE_STRIPPING = NO; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -910,7 +910,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 512; + CURRENT_PROJECT_VERSION = 514; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; FRAMEWORK_SEARCH_PATHS = ( From d50c5b447a736d6e7229160ec5b58781bee111a3 Mon Sep 17 00:00:00 2001 From: Pedro Pablo Aste Kompen Date: Thu, 13 Aug 2020 18:31:27 -0400 Subject: [PATCH 090/106] Update countries list --- .../PaymentMethodSelector/transak.js | 56 +++++++++++-------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js b/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js index e4d416bc6ac..50b96ead956 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/transak.js @@ -50,7 +50,7 @@ const TransakPaymentMethod = ({ onPress }) => ( - 32+ {strings('fiat_on_ramp.countries')} + 33 {strings('fiat_on_ramp.countries')} @@ -64,29 +64,41 @@ const TransakPaymentMethod = ({ onPress }) => ( - Austria 🇦🇹 - Belgium 🇧🇪 - Cyprus 🇨🇾 - Czechia 🇨🇿 - Estonia 🇪🇪 - Finland 🇫🇮 - France 🇫🇷 - Germany 🇩🇪 - Greece 🇬🇷 - Ireland 🇮🇪 - Italy 🇮🇹 + Austria 🇦🇹 + Australia 🇦🇺 + Belgium 🇧🇪 + Canada 🇨🇦 + Cyprus 🇨🇾 + Czechia 🇨🇿 + Denmark 🇩🇰 + Estonia 🇪🇪 + Finland 🇫🇮 + France 🇫🇷 + Germany 🇩🇪 + Greece 🇬🇷 + Hong Kong 🇭🇰 + Ireland 🇮🇪 + Italy 🇮🇹 + India 🇮🇳 + Latvia 🇱🇻 - Latvia 🇱🇻 - Luxembourg 🇱🇺 - Malta 🇲🇹 - Netherlands 🇳🇱 - Portugal 🇵🇹 - Romania 🇷🇴 - Slovakia 🇸🇰 - Slovenia 🇸🇮 - Spain 🇪🇸 - United Kingdom 🇬🇧 + Luxembourg 🇱🇺 + Malta 🇲🇹 + Mexico 🇲🇽 + Romania 🇷🇴 + Netherlands 🇳🇱 + New Zealand 🇳🇿 + Norway 🇳🇴 + Poland 🇵🇱 + Portugal 🇵🇹 + Slovakia 🇸🇰 + Slovenia 🇸🇮 + Spain 🇪🇸 + Sweden 🇸🇪 + Switzerland 🇨🇭 + United Kingdom 🇬🇧 + USA 🇺🇸 From 2cdb69c1fe929fffc3f045bdce7b771e28601f55 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Thu, 13 Aug 2020 18:45:56 -0400 Subject: [PATCH 091/106] bump 515 --- ios/MetaMask.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 03b4900cfa1..b26cf9df5df 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -847,7 +847,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMaskDebug.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 514; + CURRENT_PROJECT_VERSION = 515; DEAD_CODE_STRIPPING = NO; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -910,7 +910,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 514; + CURRENT_PROJECT_VERSION = 515; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; FRAMEWORK_SEARCH_PATHS = ( From 83dafe69e0c3582049815f0709aa54d5d400be14 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Fri, 14 Aug 2020 09:41:54 -0400 Subject: [PATCH 092/106] :protectWalletModalVisible: --- app/components/UI/ReceiveRequest/index.js | 2 +- app/components/Views/AddressQRCode/index.js | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/components/UI/ReceiveRequest/index.js b/app/components/UI/ReceiveRequest/index.js index 37e7efb8bcc..64172a4b7d2 100644 --- a/app/components/UI/ReceiveRequest/index.js +++ b/app/components/UI/ReceiveRequest/index.js @@ -122,7 +122,7 @@ class ReceiveRequest extends PureComponent { * Network id */ network: PropTypes.string, - /** + /** * Prompts protect wallet modal */ protectWalletModalVisible: PropTypes.func, diff --git a/app/components/Views/AddressQRCode/index.js b/app/components/Views/AddressQRCode/index.js index 2bbab541bde..723214cc59c 100644 --- a/app/components/Views/AddressQRCode/index.js +++ b/app/components/Views/AddressQRCode/index.js @@ -10,6 +10,7 @@ import IonicIcon from 'react-native-vector-icons/Ionicons'; import Device from '../../../util/Device'; import { showAlert } from '../../../actions/alert'; import GlobalAlert from '../../UI/GlobalAlert'; +import { protectWalletModalVisible } from '../../../actions/user'; const WIDTH = Dimensions.get('window').width - 88; @@ -76,7 +77,11 @@ class AddressQRCode extends PureComponent { /** /* Callback to close the modal */ - closeQrModal: PropTypes.func + closeQrModal: PropTypes.func, + /** + * Prompts protect wallet modal + */ + protectWalletModalVisible: PropTypes.func }; /** @@ -84,6 +89,7 @@ class AddressQRCode extends PureComponent { */ closeQrModal = () => { this.props.closeQrModal(); + this.props.protectWalletModalVisible(); }; copyAccountToClipboard = async () => { @@ -139,7 +145,8 @@ const mapStateToProps = state => ({ }); const mapDispatchToProps = dispatch => ({ - showAlert: config => dispatch(showAlert(config)) + showAlert: config => dispatch(showAlert(config)), + protectWalletModalVisible: () => dispatch(protectWalletModalVisible()) }); export default connect( From fcfcbd9c53e5b2e069f0cc971e6ee59d08331a58 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Fri, 14 Aug 2020 10:04:38 -0400 Subject: [PATCH 093/106] centeredTitle --- app/components/UI/Navbar/index.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/app/components/UI/Navbar/index.js b/app/components/UI/Navbar/index.js index 934da6631c7..ab48d9816f8 100644 --- a/app/components/UI/Navbar/index.js +++ b/app/components/UI/Navbar/index.js @@ -133,7 +133,7 @@ const styles = StyleSheet.create({ metamaskNameWrapper: { marginLeft: Device.isAndroid() ? 20 : 0 }, - webviewTitle: { + centeredTitle: { fontSize: 20, color: colors.fontPrimary, textAlign: 'center', @@ -797,7 +797,7 @@ export function getWebviewNavbar(navigation) { ''; }); return { - headerTitle: {title}, + headerTitle: {title}, headerLeft: Device.isAndroid() ? ( // eslint-disable-next-line react/jsx-no-bind navigation.pop()} style={styles.backButton}> @@ -827,12 +827,8 @@ export function getPaymentSelectorMethodNavbar(navigation) { const rightAction = navigation.dismiss; return { - title: strings('fiat_on_ramp.purchase_method'), - headerTitleStyle: { - fontSize: 20, - color: colors.fontPrimary, - ...fontStyles.normal - }, + headerTitle: {strings('fiat_on_ramp.purchase_method')}, + headerLeft: , headerRight: ( // eslint-disable-next-line react/jsx-no-bind From 8388e39dd5b1cf6ae7df46fc38914c3039896d6b Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Fri, 14 Aug 2020 10:24:25 -0400 Subject: [PATCH 094/106] more protectWalletModalVisible --- .../FiatOrders/PaymentMethodApplePay/index.js | 22 +++++++++++++++---- .../UI/FiatOrders/TransakWebView/index.js | 17 ++++++++++++-- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js index 9378d337925..96eaa15752a 100644 --- a/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js +++ b/app/components/UI/FiatOrders/PaymentMethodApplePay/index.js @@ -26,6 +26,7 @@ import AccountBar from '../components/AccountBar'; import Text from '../../../Base/Text'; import StyledButton from '../../StyledButton'; import { colors, fontStyles } from '../../../../styles/common'; +import { protectWalletModalVisible } from '../../../../actions/user'; //* styles and components */ @@ -243,7 +244,14 @@ const handleNewAmountInput = (currentAmount, newInput) => { } }; -function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network, addOrder }) { +function PaymentMethodApplePay({ + lockTime, + setLockTime, + selectedAddress, + network, + addOrder, + protectWalletModalVisible +}) { const navigation = useContext(NavigationContext); const [amount, setAmount] = useState('0'); const roundAmount = @@ -268,6 +276,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network if (order) { addOrder(order); navigation.dismiss(); + protectWalletModalVisible(); InteractionManager.runAfterInteractions(() => NotificationManager.showSimpleNotification(getNotificationDetails(order)) ); @@ -288,7 +297,7 @@ function PaymentMethodApplePay({ lockTime, setLockTime, selectedAddress, network } finally { setLockTime(prevLockTime); } - }, [ABORTED, addOrder, lockTime, navigation, pay, setLockTime]); + }, [ABORTED, addOrder, lockTime, navigation, pay, setLockTime, protectWalletModalVisible]); const handleQuickAmountPress = useCallback(amount => setAmount(amount), []); const handleKeypadPress = useCallback( @@ -465,7 +474,11 @@ PaymentMethodApplePay.propTypes = { /** * Function to dispatch adding a new fiat order to the state */ - addOrder: PropTypes.func.isRequired + addOrder: PropTypes.func.isRequired, + /** + * Prompts protect wallet modal + */ + protectWalletModalVisible: PropTypes.func }; PaymentMethodApplePay.navigationOptions = ({ navigation }) => getPaymentMethodApplePayNavbar(navigation); @@ -478,7 +491,8 @@ const mapStateToProps = state => ({ const mapDispatchToProps = dispatch => ({ setLockTime: time => dispatch(setLockTime(time)), - addOrder: order => dispatch({ type: 'FIAT_ADD_ORDER', payload: order }) + addOrder: order => dispatch({ type: 'FIAT_ADD_ORDER', payload: order }), + protectWalletModalVisible: () => dispatch(protectWalletModalVisible()) }); export default connect( mapStateToProps, diff --git a/app/components/UI/FiatOrders/TransakWebView/index.js b/app/components/UI/FiatOrders/TransakWebView/index.js index 43aaaed4ebb..74a8500c2cc 100644 --- a/app/components/UI/FiatOrders/TransakWebView/index.js +++ b/app/components/UI/FiatOrders/TransakWebView/index.js @@ -10,20 +10,32 @@ import { getNotificationDetails } from '..'; import { getTransakWebviewNavbar } from '../../../UI/Navbar'; import { baseStyles } from '../../../../styles/common'; +import { protectWalletModalVisible } from '../../../../actions/user'; class TransakWebView extends PureComponent { static navigationOptions = ({ navigation }) => getTransakWebviewNavbar(navigation); static propTypes = { navigation: PropTypes.object, + /** + * Currently selected network + */ network: PropTypes.string, - addOrder: PropTypes.func + /** + * Function to dispatch adding a new fiat order to the state + */ + addOrder: PropTypes.func, + /** + * Prompts protect wallet modal + */ + protectWalletModalVisible: PropTypes.func }; handleNavigationStateChange = async navState => { if (navState.url.indexOf(AppConstants.FIAT_ORDERS.TRANSAK_REDIRECT_URL) > -1) { const order = handleTransakRedirect(navState.url, this.props.network); this.props.addOrder(order); + this.props.protectWalletModalVisible(); this.props.navigation.dismiss(); InteractionManager.runAfterInteractions(() => NotificationManager.showSimpleNotification(getNotificationDetails(order)) @@ -48,7 +60,8 @@ const mapStateToProps = state => ({ }); const mapDispatchToProps = dispatch => ({ - addOrder: order => dispatch({ type: 'FIAT_ADD_ORDER', payload: order }) + addOrder: order => dispatch({ type: 'FIAT_ADD_ORDER', payload: order }), + protectWalletModalVisible: () => dispatch(protectWalletModalVisible()) }); export default connect( From fa2b76cb576960747c643772ac835f8728a0dbe3 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Fri, 14 Aug 2020 10:26:01 -0400 Subject: [PATCH 095/106] 516 --- ios/MetaMask.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index b26cf9df5df..d4e2aac2dcf 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -847,7 +847,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMaskDebug.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 515; + CURRENT_PROJECT_VERSION = 516; DEAD_CODE_STRIPPING = NO; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -910,7 +910,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 515; + CURRENT_PROJECT_VERSION = 516; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; FRAMEWORK_SEARCH_PATHS = ( From 7f625f0534efa3a8c4cd0bb85e385bd5c7ff097f Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Fri, 14 Aug 2020 15:40:48 -0400 Subject: [PATCH 096/106] protectWalletModalVisible --- app/components/UI/ReceiveRequest/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/components/UI/ReceiveRequest/index.js b/app/components/UI/ReceiveRequest/index.js index 64172a4b7d2..70145817902 100644 --- a/app/components/UI/ReceiveRequest/index.js +++ b/app/components/UI/ReceiveRequest/index.js @@ -182,6 +182,7 @@ class ReceiveRequest extends PureComponent { content: 'clipboard-alert', data: { msg: strings('account_details.account_copied_to_clipboard') } }); + setTimeout(() => this.props.protectWalletModalVisible(), 1500); }; /** From 6e49761fbd20499c0ca1fcdc6c82507b93fd2d79 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Mon, 17 Aug 2020 12:33:04 -0400 Subject: [PATCH 097/106] send android to browser --- .../PaymentMethodSelector/index.android.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js index dd8e8d5d90c..c9b98d947ba 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js @@ -1,9 +1,7 @@ -import React, { useContext, useCallback } from 'react'; -import { InteractionManager } from 'react-native'; +import React, { useCallback } from 'react'; +import { InteractionManager, Linking } from 'react-native'; import PropTypes from 'prop-types'; -import { NavigationContext } from 'react-navigation'; import { connect } from 'react-redux'; -import { strings } from '../../../../../locales/i18n'; import Analytics from '../../../../core/Analytics'; import { ANALYTICS_EVENT_OPTS } from '../../../../util/analytics'; @@ -13,20 +11,18 @@ import ScreenView from '../components/ScreenView'; import Title from '../components/Title'; import TransakPaymentMethod from './transak'; +import Logger from '../../../../util/Logger'; function PaymentMethodSelectorView({ selectedAddress, ...props }) { - const navigation = useContext(NavigationContext); const transakURL = useTransakFlowURL(selectedAddress); const onPressTransak = useCallback(() => { - navigation.navigate('TransakFlow', { - url: transakURL, - title: strings('fiat_on_ramp.transak_webview_title') - }); + Linking.openURL(transakURL).catch(e => Logger.console.error('PaymentMethodSelectorView::onPressTransak', e)); + InteractionManager.runAfterInteractions(() => { Analytics.trackEvent(ANALYTICS_EVENT_OPTS.PAYMENTS_SELECTS_DEBIT_OR_ACH); }); - }, [navigation, transakURL]); + }, [transakURL]); return ( From 89b348a7e9379d6f9f8f61bff8311076ccbd0952 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Mon, 17 Aug 2020 12:35:54 -0400 Subject: [PATCH 098/106] circleci --- .circleci/config.yml | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d465a076e41..74a7a82c8cc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -176,27 +176,26 @@ workflows: only: - master - develop - - feature/rn-payments - # - prep-node-deps: - # filters: - # branches: - # ignore: - # - master - # - develop - # - lint: - # requires: - # - prep-node-deps - # - test-unit: - # requires: - # - prep-node-deps + - prep-node-deps: + filters: + branches: + ignore: + - master + - develop + - lint: + requires: + - prep-node-deps + - test-unit: + requires: + - prep-node-deps # - test-e2e-ios: # requires: # - prep-node-deps # - test-unit - # - all-tests-pass: - # requires: - # - lint - # - test-unit + - all-tests-pass: + requires: + - lint + - test-unit # - test-e2e-ios # - upload-coverage: # requires: From b75c99a4bd4a01d5e7adc1f7bebf633a606390ff Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Mon, 17 Aug 2020 12:57:39 -0400 Subject: [PATCH 099/106] Revert "circleci" This reverts commit 89b348a7e9379d6f9f8f61bff8311076ccbd0952. --- .circleci/config.yml | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 74a7a82c8cc..d465a076e41 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -176,26 +176,27 @@ workflows: only: - master - develop - - prep-node-deps: - filters: - branches: - ignore: - - master - - develop - - lint: - requires: - - prep-node-deps - - test-unit: - requires: - - prep-node-deps + - feature/rn-payments + # - prep-node-deps: + # filters: + # branches: + # ignore: + # - master + # - develop + # - lint: + # requires: + # - prep-node-deps + # - test-unit: + # requires: + # - prep-node-deps # - test-e2e-ios: # requires: # - prep-node-deps # - test-unit - - all-tests-pass: - requires: - - lint - - test-unit + # - all-tests-pass: + # requires: + # - lint + # - test-unit # - test-e2e-ios # - upload-coverage: # requires: From b2c2a02140a5a1632bfa9c730589c9655f0cc2f7 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Mon, 17 Aug 2020 13:27:37 -0400 Subject: [PATCH 100/106] react-native-webview --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 16 +++++++++++----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 926aa4b5500..8ef85d3d9b2 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -278,7 +278,7 @@ PODS: - React - react-native-viewpager (3.3.0): - React - - react-native-webview (7.0.5): + - react-native-webview (10.7.0): - React - React-RCTActionSheet (0.62.2): - React-Core/RCTActionSheetHeaders (= 0.62.2) @@ -644,7 +644,7 @@ SPEC CHECKSUMS: react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865 react-native-view-shot: 4475fde003fe8a210053d1f98fb9e06c1d834e1c react-native-viewpager: a7b438ca32c57b2614ece2a123e7fe116f743131 - react-native-webview: 174e0f8f1bf547224a134215607c75c4bb0312b7 + react-native-webview: 6edf4d6f71b9161fc3e96083726a538ee395304d React-RCTActionSheet: f41ea8a811aac770e0cc6e0ad6b270c644ea8b7c React-RCTAnimation: 49ab98b1c1ff4445148b72a3d61554138565bad0 React-RCTBlob: a332773f0ebc413a0ce85942a55b064471587a71 diff --git a/package.json b/package.json index a4e028f1d67..198fb0fad7d 100644 --- a/package.json +++ b/package.json @@ -170,7 +170,7 @@ "react-native-v8": "^0.62.2-patch.1", "react-native-vector-icons": "6.4.2", "react-native-view-shot": "^3.1.2", - "react-native-webview": "git+https://github.com/MetaMask/react-native-webview.git#931ae99a0f80a650c958e9d2e39e4ed0e68d95a7", + "react-native-webview": "10.7.0", "react-navigation": "4.0.10", "react-navigation-drawer": "1.4.0", "react-navigation-stack": "1.7.3", diff --git a/yarn.lock b/yarn.lock index 094d01d12c0..a7e5bb1509a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4016,7 +4016,12 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: +escape-string-regexp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -10180,11 +10185,12 @@ react-native-view-shot@^3.1.2: resolved "https://registry.yarnpkg.com/react-native-view-shot/-/react-native-view-shot-3.1.2.tgz#8c8e84c67a4bc8b603e697dbbd59dbc9b4f84825" integrity sha512-9u9fPtp6a52UMoZ/UCPrCjKZk8tnkI9To0Eh6yYnLKFEGkRZ7Chm6DqwDJbYJHeZrheCCopaD5oEOnRqhF4L2Q== -"react-native-webview@git+https://github.com/MetaMask/react-native-webview.git#931ae99a0f80a650c958e9d2e39e4ed0e68d95a7": - version "7.0.5" - resolved "git+https://github.com/MetaMask/react-native-webview.git#931ae99a0f80a650c958e9d2e39e4ed0e68d95a7" +react-native-webview@10.7.0: + version "10.7.0" + resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-10.7.0.tgz#b96e152ffdae4eeffaa74f43671a35733885b52d" + integrity sha512-4TSYwJqMBUTKB9+xqGbPwx+eLXbp6RRD7lQ2BumT8eSTfuuqr2rXNqcrlKU1VRla7QGGYowmYmxl2aXIx5k9wA== dependencies: - escape-string-regexp "1.0.5" + escape-string-regexp "2.0.0" invariant "2.2.4" react-native@0.62.2: From 46a31a2fb1260238d8194dd6c16ee362a84912ff Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Mon, 17 Aug 2020 13:28:01 -0400 Subject: [PATCH 101/106] Revert "send android to browser" This reverts commit 6e49761fbd20499c0ca1fcdc6c82507b93fd2d79. --- .../PaymentMethodSelector/index.android.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js b/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js index c9b98d947ba..dd8e8d5d90c 100644 --- a/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js +++ b/app/components/UI/FiatOrders/PaymentMethodSelector/index.android.js @@ -1,7 +1,9 @@ -import React, { useCallback } from 'react'; -import { InteractionManager, Linking } from 'react-native'; +import React, { useContext, useCallback } from 'react'; +import { InteractionManager } from 'react-native'; import PropTypes from 'prop-types'; +import { NavigationContext } from 'react-navigation'; import { connect } from 'react-redux'; +import { strings } from '../../../../../locales/i18n'; import Analytics from '../../../../core/Analytics'; import { ANALYTICS_EVENT_OPTS } from '../../../../util/analytics'; @@ -11,18 +13,20 @@ import ScreenView from '../components/ScreenView'; import Title from '../components/Title'; import TransakPaymentMethod from './transak'; -import Logger from '../../../../util/Logger'; function PaymentMethodSelectorView({ selectedAddress, ...props }) { + const navigation = useContext(NavigationContext); const transakURL = useTransakFlowURL(selectedAddress); const onPressTransak = useCallback(() => { - Linking.openURL(transakURL).catch(e => Logger.console.error('PaymentMethodSelectorView::onPressTransak', e)); - + navigation.navigate('TransakFlow', { + url: transakURL, + title: strings('fiat_on_ramp.transak_webview_title') + }); InteractionManager.runAfterInteractions(() => { Analytics.trackEvent(ANALYTICS_EVENT_OPTS.PAYMENTS_SELECTS_DEBIT_OR_ACH); }); - }, [transakURL]); + }, [navigation, transakURL]); return ( From 01e9460b6ceaf7bbb1dcdea23487329a007a9dbc Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Mon, 17 Aug 2020 18:50:04 -0400 Subject: [PATCH 102/106] iuse react-native-webview-forked --- .../java/io/metamask/MainApplication.java | 1 + android/settings.gradle | 2 + app/components/Views/AddressQRCode/index.js | 2 +- app/components/Views/BrowserTab/index.js | 2 +- ios/MetaMask.xcodeproj/project.pbxproj | 44 +++++++++---------- ios/Podfile | 1 + ios/Podfile.lock | 8 +++- package.json | 1 + yarn.lock | 17 ++++--- 9 files changed, 48 insertions(+), 30 deletions(-) diff --git a/android/app/src/main/java/io/metamask/MainApplication.java b/android/app/src/main/java/io/metamask/MainApplication.java index 8782cc9fca1..d5bf78bdca3 100644 --- a/android/app/src/main/java/io/metamask/MainApplication.java +++ b/android/app/src/main/java/io/metamask/MainApplication.java @@ -1,6 +1,7 @@ package io.metamask; import com.facebook.react.ReactApplication; +import com.reactnativecommunity.webviewforked.RNCWebViewForkedPackage; import com.cmcewen.blurview.BlurViewPackage; import android.content.Context; import com.facebook.react.PackageList; diff --git a/android/settings.gradle b/android/settings.gradle index b5e08ef3e18..f5b78e3e1af 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,6 @@ rootProject.name = 'MetaMask' +include ':react-native-webview-forked' +project(':react-native-webview-forked').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-webview-forked/android') include ':@react-native-community_blur' project(':@react-native-community_blur').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/blur/android') include ':lottie-react-native' diff --git a/app/components/Views/AddressQRCode/index.js b/app/components/Views/AddressQRCode/index.js index 723214cc59c..c571a513a51 100644 --- a/app/components/Views/AddressQRCode/index.js +++ b/app/components/Views/AddressQRCode/index.js @@ -89,7 +89,7 @@ class AddressQRCode extends PureComponent { */ closeQrModal = () => { this.props.closeQrModal(); - this.props.protectWalletModalVisible(); + setTimeout(() => this.props.protectWalletModalVisible(), 1000); }; copyAccountToClipboard = async () => { diff --git a/app/components/Views/BrowserTab/index.js b/app/components/Views/BrowserTab/index.js index dba023bb1a3..15037ac9b13 100644 --- a/app/components/Views/BrowserTab/index.js +++ b/app/components/Views/BrowserTab/index.js @@ -15,7 +15,7 @@ import { } from 'react-native'; // eslint-disable-next-line import/named import { withNavigation } from 'react-navigation'; -import { WebView } from 'react-native-webview'; +import { WebView } from 'react-native-webview-forked'; import Icon from 'react-native-vector-icons/FontAwesome'; import MaterialIcon from 'react-native-vector-icons/MaterialIcons'; import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons'; diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index d4e2aac2dcf..cab2d0c8ed2 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -25,6 +25,7 @@ 15F7795E22A1B7B500B1DF8C /* Mixpanel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15F7795722A1B79400B1DF8C /* Mixpanel.framework */; }; 15F7795F22A1B7B500B1DF8C /* Mixpanel.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 15F7795722A1B79400B1DF8C /* Mixpanel.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 15F7796522A1BC8C00B1DF8C /* RCTAnalytics.m in Sources */ = {isa = PBXBuildFile; fileRef = 15F7796422A1BC8C00B1DF8C /* RCTAnalytics.m */; }; + 18967E5A4221746AF1C1516F /* libPods-MetaMask.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 909175ED86295C18A9811286 /* libPods-MetaMask.a */; }; 2370F9A340CF4ADFBCFB0543 /* EuclidCircularB-RegularItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 58572D81B5D54ED79A16A16D /* EuclidCircularB-RegularItalic.otf */; }; 298242C958524BB38FB44CAE /* Roboto-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C9FD3FB1258A41A5A0546C83 /* Roboto-BoldItalic.ttf */; }; 2A27FC9EEF1F4FD18E658544 /* config.json in Resources */ = {isa = PBXBuildFile; fileRef = EF1C01B7F08047F9B8ADCFBA /* config.json */; }; @@ -47,7 +48,6 @@ CD13D926E1E84D9ABFE672C0 /* Roboto-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3E2492C67CF345CABD7B8601 /* Roboto-BlackItalic.ttf */; }; D171C39A8BD44DBEB6B68480 /* EuclidCircularB-MediumItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 42CBA652072F4BE2A8B815C1 /* EuclidCircularB-MediumItalic.otf */; }; DC6A024F56DD43E1A83B47B1 /* Roboto-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D5FF0FF1DFB74B3C8BB99E09 /* Roboto-MediumItalic.ttf */; }; - E2015246FC33F4C4B8E4155C /* libPods-MetaMask.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B069442EBFA83EF178D30B2E /* libPods-MetaMask.a */; }; E34DE917F6FC4438A6E88402 /* EuclidCircularB-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 13EE4910D3BD408A8FCCA5D7 /* EuclidCircularB-BoldItalic.otf */; }; EF65C42EA15B4774B1947A12 /* Roboto-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C752564A28B44392AEE16BD5 /* Roboto-Medium.ttf */; }; FF0F3B13A5354C41913F766D /* EuclidCircularB-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 67FBD519E04742E0AF191782 /* EuclidCircularB-Bold.otf */; }; @@ -191,7 +191,6 @@ 1F06D56A2D2F41FB9345D16F /* Lottie.framework */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.framework; name = Lottie.framework; path = System/Library/Frameworks/Lottie.framework; sourceTree = SDKROOT; }; 278065D027394AD9B2906E38 /* libBVLinearGradient.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libBVLinearGradient.a; sourceTree = ""; }; 2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 2E000D1F2B3B0387309934A2 /* Pods-MetaMask.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MetaMask.debug.xcconfig"; path = "Target Support Files/Pods-MetaMask/Pods-MetaMask.debug.xcconfig"; sourceTree = ""; }; 3E2492C67CF345CABD7B8601 /* Roboto-BlackItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-BlackItalic.ttf"; path = "../app/fonts/Roboto-BlackItalic.ttf"; sourceTree = ""; }; 42C239E9FAA64BD9A34B8D8A /* MaterialCommunityIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialCommunityIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf"; sourceTree = ""; }; 42C6DDE3B80F47AFA9C9D4F5 /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; }; @@ -209,8 +208,10 @@ 654378AF243E2ADC00571B9C /* File.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = File.swift; sourceTree = ""; }; 67FBD519E04742E0AF191782 /* EuclidCircularB-Bold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "EuclidCircularB-Bold.otf"; path = "../app/fonts/EuclidCircularB-Bold.otf"; sourceTree = ""; }; 684F2C84313849199863B5FE /* Roboto-Black.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-Black.ttf"; path = "../app/fonts/Roboto-Black.ttf"; sourceTree = ""; }; + 740D82312DA04CE122022365 /* Pods-MetaMask.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MetaMask.debug.xcconfig"; path = "Target Support Files/Pods-MetaMask/Pods-MetaMask.debug.xcconfig"; sourceTree = ""; }; 7FF1597C0ACA4902B86140B2 /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = ""; }; 8E369AC13A2049B6B21E5120 /* libRCTSearchApi.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTSearchApi.a; sourceTree = ""; }; + 909175ED86295C18A9811286 /* libPods-MetaMask.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-MetaMask.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 9499B01ECAC44DA29AC44E80 /* EuclidCircularB-SemiboldItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "EuclidCircularB-SemiboldItalic.otf"; path = "../app/fonts/EuclidCircularB-SemiboldItalic.otf"; sourceTree = ""; }; A498EA4CD2F8488DB666B94C /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; }; A783D1CD7D27456796FE2E1B /* Roboto-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-Bold.ttf"; path = "../app/fonts/Roboto-Bold.ttf"; sourceTree = ""; }; @@ -218,8 +219,7 @@ A98029A3662F4C1391489A6B /* EuclidCircularB-Light.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "EuclidCircularB-Light.otf"; path = "../app/fonts/EuclidCircularB-Light.otf"; sourceTree = ""; }; A98DB430A7DA47EFB97EDF8B /* FontAwesome5_Solid.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Solid.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf"; sourceTree = ""; }; AA9EDF17249955C7005D89EE /* MetaMaskDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = MetaMaskDebug.entitlements; path = MetaMask/MetaMaskDebug.entitlements; sourceTree = ""; }; - B069442EBFA83EF178D30B2E /* libPods-MetaMask.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-MetaMask.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - B6684830E1789B9B249D040C /* Pods-MetaMask.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MetaMask.release.xcconfig"; path = "Target Support Files/Pods-MetaMask/Pods-MetaMask.release.xcconfig"; sourceTree = ""; }; + B80AE1A0D2D7B86D04BCE696 /* Pods-MetaMask.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MetaMask.release.xcconfig"; path = "Target Support Files/Pods-MetaMask/Pods-MetaMask.release.xcconfig"; sourceTree = ""; }; BB8BA2D3C0354D6090B56A8A /* Roboto-Light.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-Light.ttf"; path = "../app/fonts/Roboto-Light.ttf"; sourceTree = ""; }; BF485CDA047B4D52852B87F5 /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; }; C752564A28B44392AEE16BD5 /* Roboto-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-Medium.ttf"; path = "../app/fonts/Roboto-Medium.ttf"; sourceTree = ""; }; @@ -250,7 +250,7 @@ 15ACC9FC22655C3A0063978B /* Lottie.framework in Frameworks */, 15F7795E22A1B7B500B1DF8C /* Mixpanel.framework in Frameworks */, 153F84CA2319B8FD00C19B63 /* Branch.framework in Frameworks */, - E2015246FC33F4C4B8E4155C /* libPods-MetaMask.a in Frameworks */, + 18967E5A4221746AF1C1516F /* libPods-MetaMask.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -358,7 +358,7 @@ children = ( 153C1A742217BCDC0088EFE0 /* JavaScriptCore.framework */, 2D16E6891FA4F8E400B85C8A /* libReact.a */, - B069442EBFA83EF178D30B2E /* libPods-MetaMask.a */, + 909175ED86295C18A9811286 /* libPods-MetaMask.a */, ); name = Frameworks; sourceTree = ""; @@ -460,8 +460,8 @@ AA342D524556DBBE26F5997C /* Pods */ = { isa = PBXGroup; children = ( - 2E000D1F2B3B0387309934A2 /* Pods-MetaMask.debug.xcconfig */, - B6684830E1789B9B249D040C /* Pods-MetaMask.release.xcconfig */, + 740D82312DA04CE122022365 /* Pods-MetaMask.debug.xcconfig */, + B80AE1A0D2D7B86D04BCE696 /* Pods-MetaMask.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -473,7 +473,7 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "MetaMask" */; buildPhases = ( - 6DA7FCA07245EB28ED1BEB65 /* [CP] Check Pods Manifest.lock */, + 1EFD70C7D753BD5DBF716A3E /* [CP] Check Pods Manifest.lock */, 65E00B0A247EA25400E5AC88 /* Start Packager */, 15FDD86321B76696006B7C35 /* Override xcconfig files */, 13B07F871A680F5B00A75B9A /* Sources */, @@ -481,7 +481,7 @@ 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 15ACCA0022655C3A0063978B /* Embed Frameworks */, - AB6DBF608FE351FFD3A85A0F /* [CP] Copy Pods Resources */, + 6EDA5DD4542EEC12BF192BB6 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -703,7 +703,7 @@ shellPath = /bin/sh; shellScript = "if [ -e ../.ios.env ]\nthen\n cp -rf ../.ios.env debug.xcconfig\n cp -rf ../.ios.env release.xcconfig\nelse\n cp -rf ../.ios.env.example debug.xcconfig\n cp -rf ../.ios.env.example release.xcconfig\nfi\n\n"; }; - 65E00B0A247EA25400E5AC88 /* Start Packager */ = { + 1EFD70C7D753BD5DBF716A3E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -711,18 +711,21 @@ inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); - name = "Start Packager"; + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-MetaMask-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 6DA7FCA07245EB28ED1BEB65 /* [CP] Check Pods Manifest.lock */ = { + 65E00B0A247EA25400E5AC88 /* Start Packager */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -730,21 +733,18 @@ inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; + name = "Start Packager"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-MetaMask-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; showEnvVarsInLog = 0; }; - AB6DBF608FE351FFD3A85A0F /* [CP] Copy Pods Resources */ = { + 6EDA5DD4542EEC12BF192BB6 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -839,7 +839,7 @@ /* Begin XCBuildConfiguration section */ 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2E000D1F2B3B0387309934A2 /* Pods-MetaMask.debug.xcconfig */; + baseConfigurationReference = 740D82312DA04CE122022365 /* Pods-MetaMask.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_OPTIMIZATION = time; @@ -902,7 +902,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B6684830E1789B9B249D040C /* Pods-MetaMask.release.xcconfig */; + baseConfigurationReference = B80AE1A0D2D7B86D04BCE696 /* Pods-MetaMask.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_OPTIMIZATION = time; diff --git a/ios/Podfile b/ios/Podfile index 728a441cda1..dd039c0d771 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -104,6 +104,7 @@ target 'MetaMask' do add_flipper_pods! + post_install do |installer| flipper_post_install(installer) end diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 8ef85d3d9b2..ce4be1b4df1 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -280,6 +280,8 @@ PODS: - React - react-native-webview (10.7.0): - React + - react-native-webview-forked (7.0.5): + - React - React-RCTActionSheet (0.62.2): - React-Core/RCTActionSheetHeaders (= 0.62.2) - React-RCTAnimation (0.62.2): @@ -438,6 +440,7 @@ DEPENDENCIES: - react-native-view-shot (from `../node_modules/react-native-view-shot`) - "react-native-viewpager (from `../node_modules/@react-native-community/viewpager`)" - react-native-webview (from `../node_modules/react-native-webview`) + - react-native-webview-forked (from `../node_modules/react-native-webview-forked`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) @@ -543,6 +546,8 @@ EXTERNAL SOURCES: :path: "../node_modules/@react-native-community/viewpager" react-native-webview: :path: "../node_modules/react-native-webview" + react-native-webview-forked: + :path: "../node_modules/react-native-webview-forked" React-RCTActionSheet: :path: "../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: @@ -645,6 +650,7 @@ SPEC CHECKSUMS: react-native-view-shot: 4475fde003fe8a210053d1f98fb9e06c1d834e1c react-native-viewpager: a7b438ca32c57b2614ece2a123e7fe116f743131 react-native-webview: 6edf4d6f71b9161fc3e96083726a538ee395304d + react-native-webview-forked: 30ecda2456675d54273c274a5d659faad44b17ad React-RCTActionSheet: f41ea8a811aac770e0cc6e0ad6b270c644ea8b7c React-RCTAnimation: 49ab98b1c1ff4445148b72a3d61554138565bad0 React-RCTBlob: a332773f0ebc413a0ce85942a55b064471587a71 @@ -678,6 +684,6 @@ SPEC CHECKSUMS: Yoga: 3ebccbdd559724312790e7742142d062476b698e YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: 17c3a229d2052b61aedf2b90c073f6a3342b048f +PODFILE CHECKSUM: 038ce06ee40546e81f34f1057e015a7a12547d35 COCOAPODS: 1.9.3 diff --git a/package.json b/package.json index 198fb0fad7d..d72b6982453 100644 --- a/package.json +++ b/package.json @@ -171,6 +171,7 @@ "react-native-vector-icons": "6.4.2", "react-native-view-shot": "^3.1.2", "react-native-webview": "10.7.0", + "react-native-webview-forked": "git+https://github.com/MetaMask/react-native-webview#8c1942b4d3887a80d5d88128a5e55f3944f7fe21", "react-navigation": "4.0.10", "react-navigation-drawer": "1.4.0", "react-navigation-stack": "1.7.3", diff --git a/yarn.lock b/yarn.lock index a7e5bb1509a..96173ce13ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4016,16 +4016,16 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + escape-string-regexp@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - escodegen@1.x.x, escodegen@^1.11.1: version "1.14.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" @@ -10185,6 +10185,13 @@ react-native-view-shot@^3.1.2: resolved "https://registry.yarnpkg.com/react-native-view-shot/-/react-native-view-shot-3.1.2.tgz#8c8e84c67a4bc8b603e697dbbd59dbc9b4f84825" integrity sha512-9u9fPtp6a52UMoZ/UCPrCjKZk8tnkI9To0Eh6yYnLKFEGkRZ7Chm6DqwDJbYJHeZrheCCopaD5oEOnRqhF4L2Q== +"react-native-webview-forked@git+https://github.com/MetaMask/react-native-webview#8c1942b4d3887a80d5d88128a5e55f3944f7fe21": + version "7.0.5" + resolved "git+https://github.com/MetaMask/react-native-webview#8c1942b4d3887a80d5d88128a5e55f3944f7fe21" + dependencies: + escape-string-regexp "1.0.5" + invariant "2.2.4" + react-native-webview@10.7.0: version "10.7.0" resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-10.7.0.tgz#b96e152ffdae4eeffaa74f43671a35733885b52d" From 8c9dcf14a481886e3fd585f5aae3f26c8e830517 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Mon, 17 Aug 2020 18:50:43 -0400 Subject: [PATCH 103/106] 517 --- ios/MetaMask.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index cab2d0c8ed2..593b3c61e26 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -847,7 +847,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMaskDebug.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 516; + CURRENT_PROJECT_VERSION = 517; DEAD_CODE_STRIPPING = NO; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -910,7 +910,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 516; + CURRENT_PROJECT_VERSION = 517; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; FRAMEWORK_SEARCH_PATHS = ( From 39edafeff89f0563384f4a5373f006fd0b2e8e30 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Tue, 18 Aug 2020 12:48:26 -0400 Subject: [PATCH 104/106] circleci --- .circleci/config.yml | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d465a076e41..74a7a82c8cc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -176,27 +176,26 @@ workflows: only: - master - develop - - feature/rn-payments - # - prep-node-deps: - # filters: - # branches: - # ignore: - # - master - # - develop - # - lint: - # requires: - # - prep-node-deps - # - test-unit: - # requires: - # - prep-node-deps + - prep-node-deps: + filters: + branches: + ignore: + - master + - develop + - lint: + requires: + - prep-node-deps + - test-unit: + requires: + - prep-node-deps # - test-e2e-ios: # requires: # - prep-node-deps # - test-unit - # - all-tests-pass: - # requires: - # - lint - # - test-unit + - all-tests-pass: + requires: + - lint + - test-unit # - test-e2e-ios # - upload-coverage: # requires: From 10cefbdbe11bf060b4893f7ec605f1b013c6d6c4 Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Tue, 18 Aug 2020 12:48:46 -0400 Subject: [PATCH 105/106] 518 --- ios/MetaMask.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 593b3c61e26..28d352e7f08 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -847,7 +847,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMaskDebug.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 517; + CURRENT_PROJECT_VERSION = 518; DEAD_CODE_STRIPPING = NO; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -910,7 +910,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 517; + CURRENT_PROJECT_VERSION = 518; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; FRAMEWORK_SEARCH_PATHS = ( From fe1cedd6d2e9ba6467d7de5aaaaca7821b60fb5c Mon Sep 17 00:00:00 2001 From: Esteban Mino Date: Tue, 18 Aug 2020 16:46:35 -0400 Subject: [PATCH 106/106] mocks and snaps --- .../@exodus/react-native-payments.js | 1 + .../Nav/App/__snapshots__/index.test.js.snap | 28 ++ .../Nav/Main/__snapshots__/index.test.js.snap | 28 ++ .../__snapshots__/index.test.js.snap | 325 +++++++----------- .../UI/ReceiveRequest/index.test.js | 3 +- app/components/UI/Tokens/index.test.js | 3 + .../__snapshots__/index.test.js.snap | 256 +++++--------- .../__snapshots__/index.test.js.snap | 2 +- .../__snapshots__/index.test.js.snap | 321 +++++++---------- .../__snapshots__/index.test.js.snap | 4 +- .../__snapshots__/index.test.js.snap | 2 +- 11 files changed, 392 insertions(+), 581 deletions(-) create mode 100644 app/__mocks__/@exodus/react-native-payments.js diff --git a/app/__mocks__/@exodus/react-native-payments.js b/app/__mocks__/@exodus/react-native-payments.js new file mode 100644 index 00000000000..b69bc6d5c9f --- /dev/null +++ b/app/__mocks__/@exodus/react-native-payments.js @@ -0,0 +1 @@ +export default from '@exodus/react-native-payments/lib/js/__mocks__'; diff --git a/app/components/Nav/App/__snapshots__/index.test.js.snap b/app/components/Nav/App/__snapshots__/index.test.js.snap index 2d67e59a81b..399463fa8a0 100644 --- a/app/components/Nav/App/__snapshots__/index.test.js.snap +++ b/app/components/Nav/App/__snapshots__/index.test.js.snap @@ -61,6 +61,20 @@ exports[`App should render correctly 1`] = ` "getScreenOptions": [Function], "getStateForAction": [Function], }, + "FiatOnRamp": Object { + "childRouters": Object { + "PaymentMethodApplePay": null, + "PaymentMethodSelector": null, + "TransakFlow": null, + }, + "getActionCreators": [Function], + "getActionForPathAndParams": [Function], + "getComponentForRouteName": [Function], + "getComponentForState": [Function], + "getPathAndParamsForState": [Function], + "getScreenOptions": [Function], + "getStateForAction": [Function], + }, "Home": Object { "childRouters": Object { "BrowserTabHome": Object { @@ -516,6 +530,20 @@ exports[`App should render correctly 1`] = ` "getScreenOptions": [Function], "getStateForAction": [Function], }, + "FiatOnRamp": Object { + "childRouters": Object { + "PaymentMethodApplePay": null, + "PaymentMethodSelector": null, + "TransakFlow": null, + }, + "getActionCreators": [Function], + "getActionForPathAndParams": [Function], + "getComponentForRouteName": [Function], + "getComponentForState": [Function], + "getPathAndParamsForState": [Function], + "getScreenOptions": [Function], + "getStateForAction": [Function], + }, "Home": Object { "childRouters": Object { "BrowserTabHome": Object { diff --git a/app/components/Nav/Main/__snapshots__/index.test.js.snap b/app/components/Nav/Main/__snapshots__/index.test.js.snap index 77acb0ad3d9..eefb84996d2 100644 --- a/app/components/Nav/Main/__snapshots__/index.test.js.snap +++ b/app/components/Nav/Main/__snapshots__/index.test.js.snap @@ -69,6 +69,20 @@ exports[`Main should render correctly 1`] = ` "getScreenOptions": [Function], "getStateForAction": [Function], }, + "FiatOnRamp": Object { + "childRouters": Object { + "PaymentMethodApplePay": null, + "PaymentMethodSelector": null, + "TransakFlow": null, + }, + "getActionCreators": [Function], + "getActionForPathAndParams": [Function], + "getComponentForRouteName": [Function], + "getComponentForState": [Function], + "getPathAndParamsForState": [Function], + "getScreenOptions": [Function], + "getStateForAction": [Function], + }, "Home": Object { "childRouters": Object { "BrowserTabHome": Object { @@ -400,6 +414,20 @@ exports[`Main should render correctly 1`] = ` "getScreenOptions": [Function], "getStateForAction": [Function], }, + "FiatOnRamp": Object { + "childRouters": Object { + "PaymentMethodApplePay": null, + "PaymentMethodSelector": null, + "TransakFlow": null, + }, + "getActionCreators": [Function], + "getActionForPathAndParams": [Function], + "getComponentForRouteName": [Function], + "getComponentForState": [Function], + "getPathAndParamsForState": [Function], + "getScreenOptions": [Function], + "getStateForAction": [Function], + }, "Home": Object { "childRouters": Object { "BrowserTabHome": Object { diff --git a/app/components/UI/ReceiveRequest/__snapshots__/index.test.js.snap b/app/components/UI/ReceiveRequest/__snapshots__/index.test.js.snap index 445e3cc01a1..55478afeac0 100644 --- a/app/components/UI/ReceiveRequest/__snapshots__/index.test.js.snap +++ b/app/components/UI/ReceiveRequest/__snapshots__/index.test.js.snap @@ -37,14 +37,26 @@ exports[`ReceiveRequest should render correctly 1`] = ` Receive @@ -59,243 +72,155 @@ exports[`ReceiveRequest should render correctly 1`] = ` - + + + + Scan address to receive payment + + - - } - onPress={[Function]} + + + + - - } + upper={false} + > + Copy + + - + > + + + - - } - onPress={[Function]} - style={ + - + disabledContainerStyle={ + Object { + "opacity": 0.6, + } } onPress={[Function]} - style={ + styleDisabled={ Object { - "flex": 1, - "height": 343, - "width": 343, + "opacity": 0.6, } } - /> - - - - - - - + Buy ETH + + - - - - - Coming soon... - - - + Request Payment + + + + `; diff --git a/app/components/UI/ReceiveRequest/index.test.js b/app/components/UI/ReceiveRequest/index.test.js index 0d70c59336c..7ce372372d7 100644 --- a/app/components/UI/ReceiveRequest/index.test.js +++ b/app/components/UI/ReceiveRequest/index.test.js @@ -10,7 +10,8 @@ describe('ReceiveRequest', () => { const initialState = { engine: { backgroundState: { - PreferencesController: { selectedAddress: '0x' } + PreferencesController: { selectedAddress: '0x' }, + NetworkController: { network: '1' } } }, modals: { diff --git a/app/components/UI/Tokens/index.test.js b/app/components/UI/Tokens/index.test.js index f3cf057e636..ec7ebe31773 100644 --- a/app/components/UI/Tokens/index.test.js +++ b/app/components/UI/Tokens/index.test.js @@ -22,6 +22,9 @@ describe('Tokens', () => { }, TokenBalancesController: { contractBalance: {} + }, + NetworkController: { + network: '1' } } }, diff --git a/app/components/UI/TransactionElement/TransactionDetails/__snapshots__/index.test.js.snap b/app/components/UI/TransactionElement/TransactionDetails/__snapshots__/index.test.js.snap index 602c0e8d602..fc22c4e25c3 100644 --- a/app/components/UI/TransactionElement/TransactionDetails/__snapshots__/index.test.js.snap +++ b/app/components/UI/TransactionElement/TransactionDetails/__snapshots__/index.test.js.snap @@ -1,195 +1,97 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`TransactionDetails should render correctly 1`] = ` - - + - + + Status + + + + - - - Status - - - Confirmed - - - + Date + + - - Date - - - [missing "en.date.months.NaN" translation] NaN at NaN:NaNam - - - - - + + + - - - - From - + + + From + + - - + + + + To + + - - To - - - - + + + - + `; diff --git a/app/components/UI/TransactionElement/__snapshots__/index.test.js.snap b/app/components/UI/TransactionElement/__snapshots__/index.test.js.snap index 27335c29c4c..81355a1a054 100644 --- a/app/components/UI/TransactionElement/__snapshots__/index.test.js.snap +++ b/app/components/UI/TransactionElement/__snapshots__/index.test.js.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`TransactionElement should render correctly 1`] = ``; +exports[`TransactionElement should render correctly 1`] = `""`; diff --git a/app/components/UI/TransactionReview/TransactionReviewFeeCard/__snapshots__/index.test.js.snap b/app/components/UI/TransactionReview/TransactionReviewFeeCard/__snapshots__/index.test.js.snap index c1e77c3228c..5b0b28f90af 100644 --- a/app/components/UI/TransactionReview/TransactionReviewFeeCard/__snapshots__/index.test.js.snap +++ b/app/components/UI/TransactionReview/TransactionReviewFeeCard/__snapshots__/index.test.js.snap @@ -3,224 +3,147 @@ exports[`TransactionReviewFeeCard should render correctly 1`] = ` - - + + Amount + + + + + - Amount + Network fee - - - - - Network fee + + Edit - - - Edit - - - - - - - - - + + - - Total - - Amount - + + + + + + Total + + Amount + + + - - - + - + `; diff --git a/app/components/UI/TransactionReview/TransactionReviewInformation/__snapshots__/index.test.js.snap b/app/components/UI/TransactionReview/TransactionReviewInformation/__snapshots__/index.test.js.snap index d22a205becd..81b40efda3e 100644 --- a/app/components/UI/TransactionReview/TransactionReviewInformation/__snapshots__/index.test.js.snap +++ b/app/components/UI/TransactionReview/TransactionReviewInformation/__snapshots__/index.test.js.snap @@ -11,8 +11,8 @@ exports[`TransactionReviewInformation should render correctly 1`] = ` diff --git a/app/components/Views/TransactionsView/__snapshots__/index.test.js.snap b/app/components/Views/TransactionsView/__snapshots__/index.test.js.snap index fb108b6e544..e3064207040 100644 --- a/app/components/Views/TransactionsView/__snapshots__/index.test.js.snap +++ b/app/components/Views/TransactionsView/__snapshots__/index.test.js.snap @@ -1,7 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`TransactionsView should render correctly 1`] = ` -