From c0f8d44682902c5e11215a962c1434f8c6e28e43 Mon Sep 17 00:00:00 2001 From: gabidi Date: Fri, 26 Jun 2020 14:45:57 -0400 Subject: [PATCH] merge release 0.0.4 --- android/app/build.gradle | 1 + .../main/java/com/sifir/MainApplication.java | 1 + android/settings.gradle | 2 + babel.config.js | 1 + ios/Podfile | 2 + package-lock.json | 2389 ++++++++--------- package.json | 14 +- src/assets/images/arrowupArrow.png | Bin 0 -> 189 bytes src/assets/images/arrowupArrow@2x.png | Bin 0 -> 269 bytes src/assets/images/arrowupArrow@3x.png | Bin 0 -> 339 bytes src/assets/images/bitcoinWhiteOutlined.png | Bin 0 -> 1049 bytes src/assets/images/bitcoinWhiteOutlined@2x.png | Bin 0 -> 2104 bytes src/assets/images/bitcoinWhiteOutlined@3x.png | Bin 0 -> 3266 bytes src/assets/images/confirmed.png | Bin 0 -> 786 bytes src/assets/images/confirmed@2x.png | Bin 0 -> 1442 bytes src/assets/images/confirmed@3x.png | Bin 0 -> 2075 bytes src/assets/images/filter.png | Bin 0 -> 171 bytes src/assets/images/filter@2x.png | Bin 0 -> 185 bytes src/assets/images/filter@3x.png | Bin 0 -> 240 bytes src/assets/images/slider button@2x.png | Bin 0 -> 3479 bytes src/assets/images/slider button@3x.png | Bin 0 -> 7032 bytes src/assets/images/sliderbutton.png | Bin 0 -> 1181 bytes src/assets/images/unchecked.png | Bin 0 -> 1010 bytes src/assets/images/unchecked@2x.png | Bin 0 -> 2096 bytes src/assets/images/unchecked@3x.png | Bin 0 -> 3005 bytes src/assets/images/wasabiLogo.png | Bin 0 -> 17449 bytes src/assets/images/wasabiLogo1.png | Bin 0 -> 17841 bytes src/assets/images/wasabiLogo1@2x.png | Bin 0 -> 23359 bytes src/assets/images/wasabiLogo1@3x.png | Bin 0 -> 28977 bytes src/assets/images/wasabiLogo@2x.png | Bin 0 -> 22220 bytes src/assets/images/wasabiLogo@3x.png | Bin 0 -> 27815 bytes src/assets/svg/Back.js | 18 + src/assets/svg/index.js | 5 + src/common/AppStyle.js | 2 + src/common/constants.js | 14 + src/common/images.js | 7 + src/common/index.js | 3 +- .../elements/SifirAccountActions.js | 23 +- src/components/elements/SifirAccountChart.js | 260 ++ src/components/elements/SifirAccountHeader.js | 18 +- .../elements/SifirAccountHistory.js | 71 - .../elements/SifirAnimatedOverlay.js | 26 + .../elements/SifirAnonimitySlider.js | 142 + .../elements/SifirAutoSpendWalletCard.js | 74 + src/components/elements/SifirCard.js | 8 + .../SifirHeaders/SifirAutoSpendHeader.js | 123 + src/components/elements/SifirQRCode.js | 138 +- src/components/elements/SifirSettingModal.js | 2 - src/components/elements/SifirSlider.js | 55 + src/components/elements/SifirSwitch.js | 59 + .../elements/SifirTransactionsTab.js | 140 + src/components/elements/SifirTxnList.js | 183 -- src/components/elements/SifirWalletButton.js | 2 +- .../TxnListItems/SifirBtcTxnListItem.js | 54 + .../elements/TxnListItems/SifirInvEntry.js | 63 + .../elements/TxnListItems/SifirTxnEntry.js | 46 + .../TxnListItems/SifirUnspentCoinEntry.js | 37 + .../TxnListItems/SifirUnspentCoinListItem.js | 81 + .../TxnListItems/SifirWasabiTxnEntry.js | 26 + .../deprecated/SifirAccountHistory.js | 198 ++ .../elements/deprecated/SifirTxnList.js | 33 + .../screens/auth/UnlockORGenKeys.js | 2 +- .../screens/wallet/SifirAccountScreen.js | 613 +++-- .../screens/wallet/SifirAccountsListScreen.js | 4 + .../wallet/SifirBtcReceiveTxnScreen.js | 731 +++-- .../wallet/SifirBtcSendTxnConfirmScreen.js | 72 +- .../SifirBtcSendTxnInputAmountScreen.js | 19 +- .../wallet/SifirBtcTxnConfirmedScreen.js | 26 +- .../screens/wallet/SifirGetAddrScreen.js | 16 +- .../wallet/SifirWasabiAutoSpendScreen.js | 357 +++ src/components/screens/wallet/index.js | 2 + .../structures/SifirAccountHistoryTabs.js | 177 ++ src/containers/WalletStack.js | 7 +- src/helpers/debounce.js | 17 + src/helpers/makeUnspentCoinsChartData.js | 28 + src/helpers/validations.js | 2 +- src/store/actions/btcwallet.js | 47 +- src/store/actions/cnClient.js | 137 + src/store/actions/lnWallet.js | 21 +- src/store/actions/wasabiWallet.js | 149 + src/store/io/cnClient/index.js | 8 + src/store/io/pgp/index.js | 4 +- src/store/io/sifirClient/index.js | 3 +- src/store/io/wasabiClient/clientFactory.js | 10 + src/store/io/wasabiClient/index.js | 1 + src/store/reducers/btcWallet.js | 6 +- src/store/reducers/cn.js | 55 + src/store/reducers/index.js | 2 + src/store/reducers/lnWallet.js | 13 +- src/store/reducers/wasabiWallet.js | 86 + src/store/types/index.js | 10 + 91 files changed, 4871 insertions(+), 2075 deletions(-) create mode 100644 src/assets/images/arrowupArrow.png create mode 100644 src/assets/images/arrowupArrow@2x.png create mode 100644 src/assets/images/arrowupArrow@3x.png create mode 100644 src/assets/images/bitcoinWhiteOutlined.png create mode 100644 src/assets/images/bitcoinWhiteOutlined@2x.png create mode 100644 src/assets/images/bitcoinWhiteOutlined@3x.png create mode 100644 src/assets/images/confirmed.png create mode 100644 src/assets/images/confirmed@2x.png create mode 100644 src/assets/images/confirmed@3x.png create mode 100644 src/assets/images/filter.png create mode 100644 src/assets/images/filter@2x.png create mode 100644 src/assets/images/filter@3x.png create mode 100644 src/assets/images/slider button@2x.png create mode 100644 src/assets/images/slider button@3x.png create mode 100644 src/assets/images/sliderbutton.png create mode 100644 src/assets/images/unchecked.png create mode 100644 src/assets/images/unchecked@2x.png create mode 100644 src/assets/images/unchecked@3x.png create mode 100644 src/assets/images/wasabiLogo.png create mode 100644 src/assets/images/wasabiLogo1.png create mode 100644 src/assets/images/wasabiLogo1@2x.png create mode 100644 src/assets/images/wasabiLogo1@3x.png create mode 100644 src/assets/images/wasabiLogo@2x.png create mode 100644 src/assets/images/wasabiLogo@3x.png create mode 100644 src/assets/svg/Back.js create mode 100644 src/assets/svg/index.js create mode 100644 src/components/elements/SifirAccountChart.js delete mode 100644 src/components/elements/SifirAccountHistory.js create mode 100644 src/components/elements/SifirAnimatedOverlay.js create mode 100644 src/components/elements/SifirAnonimitySlider.js create mode 100644 src/components/elements/SifirAutoSpendWalletCard.js create mode 100644 src/components/elements/SifirCard.js create mode 100644 src/components/elements/SifirHeaders/SifirAutoSpendHeader.js create mode 100644 src/components/elements/SifirSlider.js create mode 100644 src/components/elements/SifirSwitch.js create mode 100644 src/components/elements/SifirTransactionsTab.js delete mode 100644 src/components/elements/SifirTxnList.js create mode 100644 src/components/elements/TxnListItems/SifirBtcTxnListItem.js create mode 100644 src/components/elements/TxnListItems/SifirInvEntry.js create mode 100644 src/components/elements/TxnListItems/SifirTxnEntry.js create mode 100644 src/components/elements/TxnListItems/SifirUnspentCoinEntry.js create mode 100644 src/components/elements/TxnListItems/SifirUnspentCoinListItem.js create mode 100644 src/components/elements/TxnListItems/SifirWasabiTxnEntry.js create mode 100644 src/components/elements/deprecated/SifirAccountHistory.js create mode 100644 src/components/elements/deprecated/SifirTxnList.js create mode 100644 src/components/screens/wallet/SifirWasabiAutoSpendScreen.js create mode 100644 src/components/structures/SifirAccountHistoryTabs.js create mode 100644 src/helpers/debounce.js create mode 100644 src/helpers/makeUnspentCoinsChartData.js create mode 100644 src/store/actions/cnClient.js create mode 100644 src/store/actions/wasabiWallet.js create mode 100644 src/store/io/cnClient/index.js create mode 100644 src/store/io/wasabiClient/clientFactory.js create mode 100644 src/store/io/wasabiClient/index.js create mode 100644 src/store/reducers/cn.js create mode 100644 src/store/reducers/wasabiWallet.js diff --git a/android/app/build.gradle b/android/app/build.gradle index 4acb8ed..e59996b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -200,6 +200,7 @@ android { } dependencies { + implementation project(':react-native-svg') // Add v8-android - prebuilt libv8android.so into APK implementation 'org.chromium:v8-android:+' implementation project(':react-native-randombytes') diff --git a/android/app/src/main/java/com/sifir/MainApplication.java b/android/app/src/main/java/com/sifir/MainApplication.java index 9229a63..c420573 100644 --- a/android/app/src/main/java/com/sifir/MainApplication.java +++ b/android/app/src/main/java/com/sifir/MainApplication.java @@ -4,6 +4,7 @@ import android.content.Context; import com.facebook.react.PackageList; import com.facebook.react.ReactApplication; +import com.horcrux.svg.SvgPackage; import com.bitgo.randombytes.RandomBytesPackage; import cl.json.RNSharePackage; import com.facebook.react.ReactNativeHost; diff --git a/android/settings.gradle b/android/settings.gradle index 657a105..b100672 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,6 @@ rootProject.name = 'Sifir' +include ':react-native-svg' +project(':react-native-svg').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-svg/android') include ':watermelondb' project(':watermelondb').projectDir = new File(rootProject.projectDir, '../node_modules/@nozbe/watermelondb/native/android') include ':react-native-randombytes', ':gopenpgp' diff --git a/babel.config.js b/babel.config.js index ae9d761..cdc41c5 100644 --- a/babel.config.js +++ b/babel.config.js @@ -17,6 +17,7 @@ module.exports = { '@helpers': './src/helpers', '@types': './src/store/types', '@screens': './src/components/screens', + '@structures': './src/components/structures', }, }, ], diff --git a/ios/Podfile b/ios/Podfile index e1f5841..d1f6afc 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -44,6 +44,8 @@ target 'Sifir' do pod 'react-native-randombytes', :path => '../node_modules/react-native-randombytes' + pod 'RNSVG', :path => '../node_modules/react-native-svg' + target 'SifirTests' do inherit! :search_paths # Pods for testing diff --git a/package-lock.json b/package-lock.json index 482496d..9708f3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,26 +5,26 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.1" } }, "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", - "requires": { - "@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", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", + "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.2", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helpers": "^7.10.1", + "@babel/parser": "^7.10.2", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -51,333 +51,333 @@ } }, "@babel/generator": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", - "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", "requires": { - "@babel/types": "^7.9.5", + "@babel/types": "^7.10.2", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz", + "integrity": "sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz", + "integrity": "sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-explode-assignable-expression": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-builder-react-jsx": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz", - "integrity": "sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz", + "integrity": "sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/types": "^7.9.0" + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-builder-react-jsx-experimental": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz", - "integrity": "sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz", + "integrity": "sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-module-imports": "^7.8.3", - "@babel/types": "^7.9.5" + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-module-imports": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.5.tgz", - "integrity": "sha512-IipaxGaQmW4TfWoXdqjY0TzoXQ1HRS0kPpEgvjosb3u7Uedcq297xFqDQiCcQtRRwzIMif+N1MLVI8C5a4/PAA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", + "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", "requires": { - "@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-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": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", - "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz", + "integrity": "sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-regex": "^7.8.3", + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-regex": "^7.10.1", "regexpu-core": "^4.7.0" } }, "@babel/helper-define-map": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", - "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz", + "integrity": "sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/helper-function-name": "^7.10.1", + "@babel/types": "^7.10.1", "lodash": "^4.17.13" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz", + "integrity": "sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==", "requires": { - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-function-name": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", - "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.9.5" + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-module-transforms": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", - "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", - "requires": { - "@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", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "requires": { + "@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": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" }, "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz", + "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==", "requires": { "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", - "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz", + "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-wrap-function": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@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": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", "requires": { - "@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-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": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" }, "@babel/helper-wrap-function": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", - "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz", + "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-function-name": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", + "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.1", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==" }, "@babel/plugin-external-helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.8.3.tgz", - "integrity": "sha512-mx0WXDDiIl5DwzMtzWGRSPugXi9BxROS05GQrhLNbEamhBiicgn994ibwkyiBH+6png7bm/yA7AUsvHyCXi4Vw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.10.1.tgz", + "integrity": "sha512-xFXc/Ts/gsgCrkh3waZbVdkzmhtnlw1L972gx96pmj8hXvloHnPTDgZ07vTDve9ilpe9TcrIMWLU7rg6FqnAWA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz", + "integrity": "sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-proposal-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", - "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.1.tgz", + "integrity": "sha512-xBfteh352MTke2U1NpclzMDmAmCdQ2fBZjhZQQfGTjXw6qcRYMkt528sA1U8o0ThDCSeuETXIj5bOGdxN+5gkw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-decorators": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-decorators": "^7.10.1" } }, "@babel/plugin-proposal-export-default-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.8.3.tgz", - "integrity": "sha512-PYtv2S2OdCdp7GSPDg5ndGZFm9DmWFvuLoS5nBxZCgOBggluLnhTScspJxng96alHQzPyrrHxvC9/w4bFuspeA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.10.1.tgz", + "integrity": "sha512-Xfc1CfHapIkwZ/+AI+j4Ha3g233ol0EEdy6SmnUuQQiZX78SfQXHd8tmntc5zqCkwPnIHoiZa6l6p0OAvxYXHw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-export-default-from": "^7.10.1" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz", + "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz", - "integrity": "sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz", + "integrity": "sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.9.5" + "@babel/plugin-transform-parameters": "^7.10.1" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz", + "integrity": "sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", - "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz", + "integrity": "sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz", - "integrity": "sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", + "integrity": "sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", - "integrity": "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.1.tgz", + "integrity": "sha512-a9OAbQhKOwSle1Vr0NJu/ISg1sPfdEkfRKWpgPuzhnWWzForou2gIeUIIwjAMHRekhhpJ7eulZlYs0H14Cbi+g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-dynamic-import": { @@ -389,27 +389,27 @@ } }, "@babel/plugin-syntax-export-default-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.8.3.tgz", - "integrity": "sha512-a1qnnsr73KLNIQcQlcQ4ZHxqqfBKM6iNQZW2OMTyxNbA2WC7SHWHtGVpFzWtQAuS2pspkWVzdEBXXx8Ik0Za4w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.10.1.tgz", + "integrity": "sha512-+rcL4S/mN1Ss4zhSCbxzv1Wsf12eauvgTjWi0krXEeX1zd6qSxYnJoniE5Ssr5w2WPt61oUCJyXIFQIqO/29zw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-flow": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz", - "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.1.tgz", + "integrity": "sha512-b3pWVncLBYoPP60UOTc7NMlbtsHQ6ITim78KQejNHK6WJ2mzV5kCcg4mIWpasAfJEgwVTibwo2e+FU7UEIKQUg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", - "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz", + "integrity": "sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { @@ -445,218 +445,218 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", - "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.1.tgz", + "integrity": "sha512-X/d8glkrAtra7CaQGMiGs/OGa6XgUzqPcBXCIGFCpCqnfGlT0Wfbzo/B89xHhnInTaItPK8LALblVXcUOEh95Q==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", - "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz", + "integrity": "sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", - "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz", + "integrity": "sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==", "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3" + "@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": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", - "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz", + "integrity": "sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", - "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz", + "integrity": "sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz", - "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.9.5", - "@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", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz", + "integrity": "sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==", + "requires": { + "@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": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", - "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz", + "integrity": "sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-destructuring": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz", - "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz", + "integrity": "sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", - "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz", + "integrity": "sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz", - "integrity": "sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.1.tgz", + "integrity": "sha512-i4o0YwiJBIsIx7/liVCZ3Q2WkWr1/Yu39PksBOnh/khW2SwIFsGa5Ze+MSon5KbDfrEHP9NeyefAgvUSXzaEkw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-flow": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-flow": "^7.10.1" } }, "@babel/plugin-transform-for-of": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", - "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz", + "integrity": "sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", - "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz", + "integrity": "sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", - "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz", + "integrity": "sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", - "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz", + "integrity": "sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", - "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz", + "integrity": "sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==", "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "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": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.8.3.tgz", - "integrity": "sha512-i3LuN8tPDqUCRFu3dkzF2r1Nx0jp4scxtm7JxtIqI9he9Vk20YD+/zshdzR9JLsoBMlJlNR82a62vQExNEVx/Q==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.10.1.tgz", + "integrity": "sha512-poBEVwzcTjv6p92ZcnWBUftzyXFCy/Zg/eCQsayu5/ot2+qwnasNvCCKPwdgprgDRzbHVUhh/fzI9rCoFOHLbg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-object-super": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", - "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz", + "integrity": "sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1" } }, "@babel/plugin-transform-parameters": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz", - "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz", + "integrity": "sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==", "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-property-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", - "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", + "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz", + "integrity": "sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz", - "integrity": "sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.1.tgz", + "integrity": "sha512-MBVworWiSRBap3Vs39eHt+6pJuLUAaK4oxGc8g+wY+vuSJvLiEQjW1LSTqKb8OUPtDvHCkdPhk7d6sjC19xyFw==", "requires": { - "@babel/helper-builder-react-jsx": "^7.9.0", - "@babel/helper-builder-react-jsx-experimental": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" + "@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-react-jsx-source": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz", - "integrity": "sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.1.tgz", + "integrity": "sha512-neAbaKkoiL+LXYbGDvh6PjPG+YeA67OsZlE78u50xbWh2L1/C81uHiNP5d1fw+uqUIoiNdCC8ZB+G4Zh3hShJA==", "requires": { - "@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-regenerator": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", - "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz", + "integrity": "sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-runtime": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz", - "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz", + "integrity": "sha512-4w2tcglDVEwXJ5qxsY++DgWQdNJcCCsPxfT34wCUwIf2E7dI7pMpH8JczkMBbgBTNzBX62SZlNJ9H+De6Zebaw==", "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", "resolve": "^1.8.1", "semver": "^5.5.1" }, @@ -669,62 +669,62 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", - "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz", + "integrity": "sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", - "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz", + "integrity": "sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", - "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz", + "integrity": "sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-regex": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-regex": "^7.10.1" } }, "@babel/plugin-transform-template-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", - "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz", + "integrity": "sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-typescript": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz", - "integrity": "sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.1.tgz", + "integrity": "sha512-v+QWKlmCnsaimLeqq9vyCsVRMViZG1k2SZTlcZvB+TqyH570Zsij8nvVUZzOASCRiQFUxkLrn9Wg/kH0zgy5OQ==", "requires": { - "@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": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", - "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz", + "integrity": "sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/register": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.9.0.tgz", - "integrity": "sha512-Tv8Zyi2J2VRR8g7pC5gTeIN8Ihultbmk0ocyNz8H2nEZbmhp1N6q0A1UGsQbDvGP/sNinQKUHf3SqXwqjtFv4Q==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.10.1.tgz", + "integrity": "sha512-sl96+kB3IA2B9EzpwwBmYadOT14vw3KaXOknGDbJaZCOj52GDA4Tivudq9doCJcB+bEIKCEARZYwRgBBsCGXyg==", "requires": { "find-cache-dir": "^2.0.0", "lodash": "^4.17.13", @@ -734,34 +734,34 @@ } }, "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz", + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/traverse": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", - "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", - "requires": { - "@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", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "requires": { + "@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" @@ -778,11 +778,11 @@ } }, "@babel/types": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", - "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", "requires": { - "@babel/helper-validator-identifier": "^7.9.5", + "@babel/helper-validator-identifier": "^7.10.1", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1041,9 +1041,9 @@ } }, "@nozbe/watermelondb": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@nozbe/watermelondb/-/watermelondb-0.16.0.tgz", - "integrity": "sha512-WzV7YL8iPUVZ6KLQqzY9z1g913z3laFt4ZWCejcIZMWon89kZ8K9NlniufNUBkTCKrt007U4HSJw6bmTHrDnQA==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@nozbe/watermelondb/-/watermelondb-0.16.2.tgz", + "integrity": "sha512-LLOEl13bVCiLsZf8QCHt5KUmuks7QnMtsXuhBB2rSb1vBDjc3mG2HmkH/eTzbgJnGIdFzH/XtoVUHlS/ll7Log==", "requires": { "lodash.clonedeep": "^4.5.0", "lokijs": "git+https://github.com/Nozbe/LokiJS.git#d08f660", @@ -1063,9 +1063,9 @@ } }, "@react-native-community/async-storage": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@react-native-community/async-storage/-/async-storage-1.9.0.tgz", - "integrity": "sha512-TlGMr02JcmY4huH1P7Mt7p6wJecosPpW+09+CwCFLn875IhpRqU2XiVA+BQppZOYfQdHUfUzIKyCBeXOlCEbEg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@react-native-community/async-storage/-/async-storage-1.11.0.tgz", + "integrity": "sha512-Pq9LlmvtCEKAGdkyrgTcRxNh2fnHFykEj2qnRYijOl1pDIl2MkD5IxaXu5eOL0wgOtAl4U//ff4z40Td6XR5rw==", "requires": { "deep-assign": "^3.0.0" } @@ -1169,9 +1169,9 @@ }, "dependencies": { "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" } } }, @@ -1200,36 +1200,37 @@ } }, "@react-native-community/masked-view": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@react-native-community/masked-view/-/masked-view-0.1.7.tgz", - "integrity": "sha512-9KbP7LTLFz9dx1heURJbO6nuVMdSjDez8znlrUzaB1nUwKVsTTwlKRuHxGUYIIkReLWrJQeCv9tidy+84z2eCw==" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@react-native-community/masked-view/-/masked-view-0.1.10.tgz", + "integrity": "sha512-rk4sWFsmtOw8oyx8SD3KSvawwaK7gRBSEIy2TAwURyGt+3TizssXP1r8nx3zY+R7v2vYYHXZ+k2/GULAT/bcaQ==" }, "@react-navigation/core": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-5.3.3.tgz", - "integrity": "sha512-YCrDIcvbuT++8RJA11gwv4qJTvsrwlp+4J1mWonGlHQnPMuB+uHvxqV8/VaHJ6FmzL11tSE6EzzdO0obm7JwIA==", - "requires": { - "@react-navigation/routers": "^5.3.0", - "escape-string-regexp": "^2.0.0", - "nanoid": "^3.0.2", - "query-string": "^6.12.0", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-5.10.0.tgz", + "integrity": "sha512-cVQTj5FtZHWuymjZMP50RVXYpkQUbo1zQPjxJl+UfBUh7u9nKexknajBhjYbZq61uDE4MmPE8qAqIEJHKeR4Hg==", + "requires": { + "@react-navigation/routers": "^5.4.7", + "escape-string-regexp": "^4.0.0", + "nanoid": "^3.1.5", + "query-string": "^6.12.1", "react-is": "^16.13.0", "use-subscription": "^1.4.0" }, "dependencies": { "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" } } }, "@react-navigation/native": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-5.1.5.tgz", - "integrity": "sha512-LP8Z8YIXS5HrGJM8CR683pLBSU5MilGRQRZYCmvp8f77oKJm2o1ETZPaOPLav8gMrtcJ2B9T02HQSP1Kz/iIxQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-5.5.1.tgz", + "integrity": "sha512-5pzsfvLdnvqfrWgTMCLDFaGK6Sj30p7tAMhUGneV2oGlx0OIbhgc6/04UUMpKEmAS2PaC/GZa1LQIsSVWDewvw==", "requires": { - "@react-navigation/core": "^5.3.3" + "@react-navigation/core": "^5.10.0", + "nanoid": "^3.1.9" } }, "@react-navigation/native-stack": { @@ -1238,17 +1239,17 @@ "integrity": "sha512-gzBwX0tVLUFSBudLV1BxwcyOJ8FZ0+fzWiK9BjFkamUCXE7Vi9mA5PIgoXW69X3tnATTM3+7VA3d+/UcflpJow==" }, "@react-navigation/routers": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-5.3.0.tgz", - "integrity": "sha512-hU9ize/NPHS5wWR5KVx/cgN9DH29Y9iHa+SxUd3IJmBnK8ujj0rM8xz3hihY4yfu0kOvTFOPHojoBwnpH5cs+g==", + "version": "5.4.7", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-5.4.7.tgz", + "integrity": "sha512-J+lQYDbEsyhAjcPpWY6ZJYEkGiZcPX62hNtySruShjbIEnI9gm3rC+BHdcrP/lufeWxWGFhI8CN7NSJGgP/Nmg==", "requires": { - "nanoid": "^3.0.2" + "nanoid": "^3.1.5" } }, "@react-navigation/stack": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-5.2.10.tgz", - "integrity": "sha512-QOx+ak+nLox9h4iwxL6+eJ6ndo4C43BVibN8/EWLydvcHB078eqSCKB77PS6XsohGGe0xbD/+jTOYbvPpfpjGw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-5.5.1.tgz", + "integrity": "sha512-oU2FEm+Ba6jMd5VA2WnuNfCO2HlZmGhrEX9yjBCyFj7fFCG1SB7WJdKLhZShtx3KxG/qWKphICeTLlYvkHdSpQ==", "requires": { "color": "^3.1.2", "react-native-iphone-x-helper": "^1.2.1" @@ -1264,9 +1265,9 @@ } }, "@types/babel__core": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", - "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.8.tgz", + "integrity": "sha512-KXBiQG2OXvaPWFPDS1rD8yV9vO0OuWIqAEqLsbfX0oU2REN5KuoMnZ1gClWcBhO5I3n6oTVAmrMufOvRqdmFTQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1296,9 +1297,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.10.tgz", - "integrity": "sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.12.tgz", + "integrity": "sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -1329,9 +1330,9 @@ "integrity": "sha512-7TUK/k2/QGpEAv/BCwSHlYu3NXZhQ9ZwBYpzr9tjlPIL2C5BeGhH3DmVavRx3ZNyELX5TLC91JTz/cen6AAtIQ==" }, "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" }, "@types/istanbul-lib-report": { "version": "3.0.0", @@ -1342,24 +1343,30 @@ } }, "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "requires": { "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, "@types/node": { - "version": "13.11.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.1.tgz", - "integrity": "sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g==" + "version": "14.0.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", + "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==" }, "@types/prop-types": { "version": "15.7.3", @@ -1367,18 +1374,18 @@ "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "@types/react": { - "version": "16.9.34", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.34.tgz", - "integrity": "sha512-8AJlYMOfPe1KGLKyHpflCg5z46n0b5DbRfqDksxBLBTUpB75ypDBAO9eCUcjNwE6LCUslwTz00yyG/X9gaVtow==", + "version": "16.9.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.37.tgz", + "integrity": "sha512-ZqnAXallQiZ08LTSqMfWMNvAfJEzRLOxdlbbbCIJlYGjU98BEU6bE2uBpKPGeWn+v3hIgCraHKtqUcKZBzMP/Q==", "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" } }, "@types/react-native": { - "version": "0.62.2", - "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.62.2.tgz", - "integrity": "sha512-oIUIbqZNN9vRnGKWHYbTVp/GyTqdaM5mfy1s4zsi6BYvHAaFOPZ32IrhIHno/A5XOv4wuGfE7g5fliDk/H0+/Q==", + "version": "0.62.13", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.62.13.tgz", + "integrity": "sha512-hs4/tSABhcJx+J8pZhVoXHrOQD89WFmbs8QiDLNSA9zNrD46pityAuBWuwk1aMjPk9I3vC5ewkJroVRHgRIfdg==", "requires": { "@types/react": "*" } @@ -1398,9 +1405,9 @@ "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" }, "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "version": "13.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz", + "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==", "requires": { "@types/yargs-parser": "*" } @@ -1507,9 +1514,9 @@ } }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==" }, "acorn-globals": { "version": "4.3.4", @@ -1552,9 +1559,9 @@ } }, "acorn-walk": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", - "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" }, "agent-base": { "version": "4.2.1", @@ -1565,9 +1572,9 @@ } }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1835,9 +1842,9 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" }, "axios": { "version": "0.19.2", @@ -1889,9 +1896,9 @@ } }, "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "requires": { "object.assign": "^4.1.0" } @@ -2138,9 +2145,9 @@ } }, "bech32": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.3.tgz", - "integrity": "sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "big-integer": { "version": "1.6.48", @@ -2196,9 +2203,9 @@ } }, "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" }, "body-parser": { "version": "1.19.0", @@ -2257,6 +2264,11 @@ "secp256k1": "^3.4.0" } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, "bplist-creator": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", @@ -2452,17 +2464,41 @@ } }, "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", "requires": { - "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" + }, + "dependencies": { + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "browserify-zlib": { @@ -2508,11 +2544,30 @@ "ieee754": "^1.1.4" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -2657,9 +2712,9 @@ "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==" }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "cliui": { "version": "3.2.0", @@ -2773,9 +2828,9 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, "colorette": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", - "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.0.tgz", + "integrity": "sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw==" }, "combine-source-map": { "version": "0.8.0", @@ -2804,9 +2859,9 @@ } }, "command-exists": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", - "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==" + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" }, "commander": { "version": "2.20.3", @@ -3053,6 +3108,43 @@ "randomfill": "^1.0.3" } }, + "crypto-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz", + "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==" + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-what": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", + "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==" + }, "cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", @@ -3084,8 +3176,8 @@ } }, "cyphernode-js-sdk-transports": { - "version": "git+https://github.com/gabidi/cyphernode-js-sdk-transports.git#7701da2e457db025b496c47847ee4472a433dc20", - "from": "git+https://github.com/gabidi/cyphernode-js-sdk-transports.git#feature/rn", + "version": "git+https://git@github.com/gabidi/cyphernode-js-sdk-transports.git#f5c3d67200420737f11da2837dcac1665c08587f", + "from": "git+https://git@github.com/gabidi/cyphernode-js-sdk-transports.git#feature/rn", "requires": { "async": "^3.1.0", "body-parser": "^1.19.0", @@ -3111,6 +3203,80 @@ } } }, + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-format": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.4.tgz", + "integrity": "sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-interpolate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-interpolate-path/-/d3-interpolate-path-2.0.0.tgz", + "integrity": "sha1-ywMnMU/tsU5uoXiat+CVoWwvirI=", + "requires": { + "d3-interpolate": "^1.1.1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-scale": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.1.tgz", + "integrity": "sha512-huz5byJO/6MPpz6Q8d4lg7GgSpTjIZW/l+1MQkzKfu2u8P6hjaXaStOpmyrD6ymKoW87d2QVFCKvSjLwjzx/rA==", + "requires": { + "d3-array": "1.2.0 - 2", + "d3-format": "1", + "d3-interpolate": "^1.2.0", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", + "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", + "requires": { + "d3-time": "1" + } + }, "dash-ast": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", @@ -3154,14 +3320,9 @@ } }, "dayjs": { - "version": "1.8.24", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.24.tgz", - "integrity": "sha512-bImQZbBv86zcOWOq6fLg7r4aqMx8fScdmykA7cSh+gH1Yh8AM0Dbw0gHYrsOrza6oBBnkK+/OaR+UAa9UsMrDw==" - }, - "debounce": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", - "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==" + "version": "1.8.28", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.28.tgz", + "integrity": "sha512-ccnYgKC0/hPSGXxj7Ju6AV/BP4HUkXC2u15mikXT5mX9YorEaoi1bEKOmAqdkJHN4EEkmAf97SpH66Try5Mbeg==" }, "debug": { "version": "2.6.9", @@ -3358,6 +3519,11 @@ "randombytes": "^2.0.0" } }, + "dijkstrajs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.1.tgz", + "integrity": "sha1-082BIh4+pAdCz83lVtTpnpjdxxs=" + }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -3367,11 +3533,32 @@ "esutils": "^2.0.2" } }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + } + } + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -3381,6 +3568,15 @@ "webidl-conversions": "^4.0.2" } }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, "drbg.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", @@ -3462,10 +3658,15 @@ "once": "^1.4.0" } }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + }, "envinfo": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.0.tgz", - "integrity": "sha512-jDgnJaF/Btomk+m3PZDTTCb5XIIIX3zYItnCRfF73zVgvinLoRomuhi75Y4su0PtQxWz4v66XnLLckyvyJTOIQ==" + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.1.tgz", + "integrity": "sha512-hQBkDf2iO4Nv0CNHpCuSBeaSrveU6nThVxFGTrq/eDlV716UQk09zChaJae4mZRsos1x4YLY2TaH3LHUae3ZmQ==" }, "error-ex": { "version": "1.3.2", @@ -3485,22 +3686,22 @@ } }, "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", "object-inspect": "^1.7.0", "object-keys": "^1.1.1", "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, "es-to-primitive": { @@ -3538,9 +3739,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.2.tgz", + "integrity": "sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A==", "requires": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -3690,9 +3891,9 @@ "dev": true }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -3751,9 +3952,9 @@ } }, "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.2.0.tgz", + "integrity": "sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -3875,9 +4076,9 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", "dev": true, "requires": { "debug": "^2.6.9", @@ -3955,9 +4156,9 @@ } }, "eslint-plugin-eslint-comments": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.2.tgz", - "integrity": "sha512-QexaqrNeteFfRTad96W+Vi4Zj1KFbkHHNMMaHZEYcovKav6gdomyGzaxSDSL3GoIyUOo078wRAdYlu1caiauIQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", + "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5", @@ -3974,23 +4175,24 @@ } }, "eslint-plugin-import": { - "version": "2.20.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", - "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "version": "2.21.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.21.2.tgz", + "integrity": "sha512-FEmxeGI6yaz+SnEB6YgNHlQK1Bs2DKLM+YF+vuTk5H8J9CLbJLtlPvRFgZZ2+sXiKAlN5dpdlrWOjK8ZoZJpQA==", "dev": true, "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", "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", + "eslint-import-resolver-node": "^0.3.3", + "eslint-module-utils": "^2.6.0", "has": "^1.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.0", + "object.values": "^1.1.1", "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" }, "dependencies": { "doctrine": { @@ -4077,9 +4279,9 @@ } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz", + "integrity": "sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ==", "dev": true }, "espree": { @@ -4099,18 +4301,18 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", - "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "estraverse": "^5.0.0" + "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", - "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", "dev": true } } @@ -4381,9 +4583,9 @@ } }, "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-diff": { "version": "1.2.0", @@ -4680,487 +4882,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "optional": true, "requires": { "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "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" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "optional": true, - "requires": { - "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" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "optional": true, - "requires": { - "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.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "optional": true, - "requires": { - "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" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "optional": true - } + "nan": "^2.12.1" } }, "ftp": { @@ -5283,9 +5011,9 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "growly": { "version": "1.3.0", @@ -5363,20 +5091,38 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", @@ -5526,9 +5272,9 @@ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true }, "image-size": { @@ -5682,9 +5428,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", "dev": true }, "is-ci": { @@ -5803,18 +5549,13 @@ "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", "dev": true, "requires": { - "has": "^1.0.3" + "has-symbols": "^1.0.1" } }, "is-stream": { @@ -6795,9 +6536,9 @@ } }, "jetifier": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.5.tgz", - "integrity": "sha512-T7yzBSu9PR+DqjYt+I0KVO1XTb1QhAfHnXV5Nd3xpbXM6Xg4e3vP60Q4qkNU8Fh6PHC2PivPUNN3rY7G2MxcDQ==" + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.6.tgz", + "integrity": "sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ==" }, "js-tokens": { "version": "4.0.0", @@ -6805,9 +6546,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -6951,12 +6692,12 @@ } }, "jsx-ast-utils": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", - "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", "dev": true, "requires": { - "array-includes": "^3.0.3", + "array-includes": "^3.1.1", "object.assign": "^4.1.0" } }, @@ -7217,9 +6958,9 @@ } }, "loglevel": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==" + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==" }, "lokijs": { "version": "git+https://github.com/Nozbe/LokiJS.git#d08f660794be558529f5ba049fe2868d4f243ec4", @@ -7311,6 +7052,11 @@ "safe-buffer": "^5.1.2" } }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -7674,16 +7420,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "requires": { - "mime-db": "1.43.0" + "mime-db": "1.44.0" } }, "mimic-fn": { @@ -7742,9 +7488,9 @@ } }, "mkdirp-classic": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.2.tgz", - "integrity": "sha512-ejdnDQcR75gwknmMw/tx02AuRs8jCtqFoFqDZMjiNxsu85sRIJVXDKHuLYvUUPRBUtV2FpSZa9bL1BUa3BdR2g==" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "module-deps": { "version": "6.2.2", @@ -7769,9 +7515,9 @@ } }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz", + "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==" }, "morgan": { "version": "1.10.0", @@ -7803,14 +7549,14 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" }, "nanoid": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.0.2.tgz", - "integrity": "sha512-WOjyy/xu3199NlQiQWlx7VbspSFlGtOxa1bRX9ebmXOnp1fje4bJfjPs1wLQ8jZbJUfD+yceJmw879ZSaVJkdQ==" + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.10.tgz", + "integrity": "sha512-iZFMXKeXWkxzlfmMfM91gw7YhN2sdJtixY+eZh9V6QWJWTOiurhpKhBMgr82pfzgSqglQgqYSCowEYsz8D++6w==" }, "nanomatch": { "version": "1.2.13", @@ -7862,11 +7608,12 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-libs-react-native": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/node-libs-react-native/-/node-libs-react-native-1.0.3.tgz", - "integrity": "sha512-2X/M/DMB4hij2L0tsnJOiDhYR2N0YtetIhb/eN5+5vksLxjXwaFgLbSXWT3XExnGJpISDn8dYuYz6yvdndjjkg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-libs-react-native/-/node-libs-react-native-1.2.0.tgz", + "integrity": "sha512-D+g8Mj9OfsOYYFWZoSz4bmr/8g/QWOwUgDmi3Ux0EPU9Q41OvGsdzAzr0IGJmtuSAfyOTfnKx1XRQR9id8/EEw==", "requires": { "assert": "^1.4.1", + "base-64": "^0.1.0", "browserify-zlib": "^0.2.0", "buffer": "^5.0.6", "console-browserify": "^1.1.0", @@ -7932,6 +7679,14 @@ } } }, + "node-localstorage": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-1.3.1.tgz", + "integrity": "sha512-NMWCSWWc6JbHT5PyWlNT2i8r7PgGYXVntmKawY83k/M0UJScZ5jirb61TLnqKwd815DfBQu+lR3sRw08SPzIaQ==", + "requires": { + "write-file-atomic": "^1.1.4" + } + }, "node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", @@ -7990,6 +7745,14 @@ "path-key": "^2.0.0" } }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, "nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", @@ -8248,9 +8011,32 @@ } }, "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" + }, + "openpgp": { + "version": "4.10.4", + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-4.10.4.tgz", + "integrity": "sha512-JMceIvDDE9Qko2AsMpVgf4YM7h7zPt3sZT0qnOIvwynuDuTs+wL5ht37t894hirgzSHr2d+64nEnKbBtwoYwSQ==", + "requires": { + "asn1.js": "^5.0.0", + "node-fetch": "^2.1.2", + "node-localstorage": "~1.3.0" + }, + "dependencies": { + "asn1.js": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.3.0.tgz", + "integrity": "sha512-WHnQJFcOrIWT1RLOkFFBQkFVvyt9BPOOrH+Dp152Zk4R993rSzXUGPmkybIcUFhHE2d/iHH+nCaOWVCDbO8fgA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + } + } }, "opn": { "version": "4.0.2", @@ -8555,9 +8341,9 @@ } }, "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -8754,6 +8540,11 @@ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "dev": true }, + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -8771,20 +8562,20 @@ "dev": true }, "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "requires": { - "@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" }, "dependencies": { "@jest/types": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", - "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", @@ -8793,9 +8584,9 @@ } }, "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", "requires": { "@types/yargs-parser": "*" } @@ -8997,10 +8788,136 @@ "bitcoin-ops": "^1.3.0" } }, - "qr.js": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/qr.js/-/qr.js-0.0.0.tgz", - "integrity": "sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8=" + "qrcode": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz", + "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==", + "requires": { + "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", + "yargs": "^13.2.4" + }, + "dependencies": { + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } }, "qs": { "version": "6.7.0", @@ -9008,9 +8925,9 @@ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "query-string": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.12.0.tgz", - "integrity": "sha512-aoiFW9ZU7jP8Itjqfpw80Qe7RoyCIhFrW522sdsp9LG92pat6CCG3d8qNZBaUi71FsEjIfLjx9Ky347FtVoqXA==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.1.tgz", + "integrity": "sha512-RfoButmcK+yCta1+FuU8REvisx1oEzhMKwhLUNcepQTPGcNMp1sIqjnfCtfnvGSQZQEhaBHvccujtWoUV3TTbA==", "requires": { "decode-uri-component": "^0.2.0", "split-on-first": "^1.0.0", @@ -9192,6 +9109,11 @@ } } }, + "react-native-androw": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/react-native-androw/-/react-native-androw-0.0.34.tgz", + "integrity": "sha512-YuW0GxYNzABvPPe6k+JdLUF5CAzKSW5R6IxxA/+fg5gc+4avE1tZgLmnRfNtXJCbW9r90YLYp33S9Uu2pe//fg==" + }, "react-native-animatable": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/react-native-animatable/-/react-native-animatable-1.3.3.tgz", @@ -9201,9 +9123,9 @@ } }, "react-native-camera": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.22.1.tgz", - "integrity": "sha512-KMi/pagWz9ssODghHHKXypukTFpM14T62ZNbd/UriZZSnvdQxXrddJhwQpH3cnZS2kl03Jupu52vi4AvT36Feg==", + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.30.0.tgz", + "integrity": "sha512-rZorpBHXnc4MT9N6ddV4iC7h9dSUx4umtXvAKMkdYr3ZONlZcEfWxup7YCeAZ5wu4x43SvhSiTfYd8g0q+V0wg==", "requires": { "prop-types": "^15.6.2" } @@ -9292,14 +9214,14 @@ "integrity": "sha512-t5BOIMRU5vMzMOtuUUuYxd59ipwRe8v1H7NTk8Z0elvBf8hCwYSsnRFDIYk35k/ZbbKZcODmd74P4x1zLTsDyA==" }, "react-native-permissions": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-2.0.10.tgz", - "integrity": "sha512-oQmWgm4tqUYyWmMNtYzNO7U/+6+WHyKiRd5cwNeE1FCJTGh8cJ5HapjHw3d6ZVfhSLzNwWqgJy1P4NpTANYa/g==" + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-2.1.5.tgz", + "integrity": "sha512-b9KO/4UEV9qddl+kcSybmdk8nlAifclSDBR2rSvc5KZM06vIaJWJNIzK2ZwPXqDQ5yD3CJLuKTRj7Fz+jM9qyQ==" }, "react-native-qrcode-scanner": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/react-native-qrcode-scanner/-/react-native-qrcode-scanner-1.4.0.tgz", - "integrity": "sha512-W6wLJNbPQ/SQSRaVcAaGDN919me0LQQyHx7xzx3d/bB8NBya1RJ/bn7zUdnPUhSrp5OVDkGhW9BvRZBoX7xHPw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/react-native-qrcode-scanner/-/react-native-qrcode-scanner-1.4.1.tgz", + "integrity": "sha512-QODC1bgfyx/v4OaFGMKMyhKU2SRHBosVxCi29b0T3QDWBZmzn5BN4QGKDxJvKfMo5UPyU2BNIn1KfapySfJx7g==", "requires": { "@react-native-community/async-storage": "^1.6.1", "opencollective": "^1.0.3", @@ -9308,6 +9230,15 @@ "react-native-permissions": "^2.0.2" } }, + "react-native-qrcode-svg": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/react-native-qrcode-svg/-/react-native-qrcode-svg-6.0.6.tgz", + "integrity": "sha512-b+/teD+xj17VDujJzf956U2+9mX+gKwVJss2aqmhEIyjP7+TVOuE08D3UkzfOCWXE8gppcUTTz5gkY1NXgfwyQ==", + "requires": { + "prop-types": "^15.5.10", + "qrcode": "^1.3.2" + } + }, "react-native-randombytes": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/react-native-randombytes/-/react-native-randombytes-3.5.3.tgz", @@ -9329,14 +9260,6 @@ } } }, - "react-native-range-slider": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/react-native-range-slider/-/react-native-range-slider-0.1.2.tgz", - "integrity": "sha512-EZLOtcnhOcOv4yZtPT826jZknqn+h3zbqM08tc3dFbakBFMoK4aN5GAuHP2RJ3PhMtwzl2h6HzOeFilq8cKaXQ==", - "requires": { - "prop-types": "^15.5.10" - } - }, "react-native-ratings": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/react-native-ratings/-/react-native-ratings-6.5.0.tgz", @@ -9347,9 +9270,9 @@ } }, "react-native-reanimated": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.8.0.tgz", - "integrity": "sha512-vGTt94lE5fsZmfMwERWFIsCr5LHsyllOESeNvlKryLgAg7h4cnJ5XSmVSy4L3qogdgFYCL6HEgY+s7tQmKXiiQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.9.0.tgz", + "integrity": "sha512-Aj+spgIHRiVv7ezGADxnSH1EoKrQRD2+XaSiGY0MiB/pvRNNrZPSJ+3NVpvLwWf9lZMOP7dwqqyJIzoZgBDt8w==", "requires": { "fbjs": "^1.0.0" } @@ -9360,12 +9283,9 @@ "integrity": "sha512-9Uqu1vlXPi+2cKW/CW6OnHxA76mWC4kF3wvlqzq4DY8hn37AeiXtLFs2WkxH4yXQRrnJdP6ivc65Lz+MqwRZAA==" }, "react-native-screens": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-2.4.0.tgz", - "integrity": "sha512-7GcXlaj7IIrM4l5Ub7BPTkNQJ2slHGt2bhmfWmW73NTXEv+7pjHlp+JpQO32Yn+O8UQGPFf0rsesfYUdER7ppQ==", - "requires": { - "debounce": "^1.2.0" - } + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-2.8.0.tgz", + "integrity": "sha512-fUCIQLZX+5XB0ypWX038P3zso54IFFjTsQUZJWEsjC3pp5rPItAt5SzqtJn+uVjcJaczZ+dpIuvj6IFLqkWLZQ==" }, "react-native-sensitive-info": { "version": "5.5.5", @@ -9430,6 +9350,48 @@ "resolved": "https://registry.npmjs.org/react-native-status-bar-height/-/react-native-status-bar-height-2.5.0.tgz", "integrity": "sha512-sYBCPYA/NapBSHkdm/IVL4ID3LLlIuLqINi2FBDyMkc2BU9pfSGOtkz9yfxoK39mYJuTrlTOQ7mManARUsYDSA==" }, + "react-native-svg": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-12.1.0.tgz", + "integrity": "sha512-1g9qBRci7man8QsHoXn6tP3DhCDiypGgc6+AOWq+Sy+PmP6yiyf8VmvKuoqrPam/tf5x+ZaBT2KI0gl7bptZ7w==", + "requires": { + "css-select": "^2.1.0", + "css-tree": "^1.0.0-alpha.39" + } + }, + "react-native-svg-charts": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/react-native-svg-charts/-/react-native-svg-charts-5.4.0.tgz", + "integrity": "sha512-5TaIGSihJaHCGFj32Tc07hZrqqTpvdyAx89PIrW2nLf2tijd61+3UE3jtsiHOvfeAyDgSTWjv6s9qG9d2di7Pw==", + "requires": { + "d3-array": "^1.2.0", + "d3-interpolate-path": "2.0.0", + "d3-scale": "^1.0.6", + "d3-shape": "^1.0.6", + "prop-types": "^15.6.0" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-scale": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + } + } + }, "react-native-swipe-up-down": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/react-native-swipe-up-down/-/react-native-swipe-up-down-1.0.7.tgz", @@ -9445,6 +9407,11 @@ "react-tween-state": "^0.1.5" } }, + "react-native-tab-view": { + "version": "2.14.4", + "resolved": "https://registry.npmjs.org/react-native-tab-view/-/react-native-tab-view-2.14.4.tgz", + "integrity": "sha512-oqkCflPFuZwDTbyY2WaN0377akSsmcttuYACR9LT7htZfO/tKR2Z/ynj1tbv2cz2esGuVICoga9cetN1lPimog==" + }, "react-native-v8": { "version": "0.61.5-patch.3", "resolved": "https://registry.npmjs.org/react-native-v8/-/react-native-v8-0.61.5-patch.3.tgz", @@ -9584,9 +9551,9 @@ } }, "react-refresh": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.2.tgz", - "integrity": "sha512-kv5QlFFSZWo7OlJFNYbxRtY66JImuP2LcrFgyJfQaf85gSP+byzG21UbDQEYjU7f//ny8rwiEkO6py2Y+fEgAQ==" + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", + "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==" }, "react-tween-state": { "version": "0.1.5", @@ -9692,6 +9659,11 @@ "util.promisify": "^1.0.0" } }, + "reanimated-bottom-sheet": { + "version": "1.0.0-alpha.20", + "resolved": "https://registry.npmjs.org/reanimated-bottom-sheet/-/reanimated-bottom-sheet-1.0.0-alpha.20.tgz", + "integrity": "sha512-bcXVkmJLL6SOoIPWU2dIJnT7+78a5tDi9eaE6ESsEewZ10lpfJhjfCCFrngPZKPhatQ6mjCJSYEAL+fwbXCiJw==" + }, "redux": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", @@ -9714,9 +9686,9 @@ "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" }, "regenerate-unicode-properties": { "version": "8.2.0", @@ -9769,9 +9741,9 @@ } }, "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { "version": "0.6.4", @@ -9884,9 +9856,9 @@ "dev": true }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "requires": { "path-parse": "^1.0.6" } @@ -9947,12 +9919,9 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" }, "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, "rx": { "version": "4.1.0", @@ -10191,8 +10160,14 @@ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, "sifir-js-sdk": { - "version": "git+https://github.com/Sifir-io/sifir-js-sdk.git#f860e9b2fac8dbb52606b0fadc41977f70350ce8", - "from": "git+https://github.com/Sifir-io/sifir-js-sdk.git#feature/rn" + "version": "git+https://git@github.com/Sifir-io/sifir-js-sdk.git#2037aed1594eaaf5519f03a67ccecbdcead3054d", + "from": "git+https://git@github.com/Sifir-io/sifir-js-sdk.git#master", + "requires": { + "crypto-js": "^4.0.0", + "openpgp": "^4.10.4", + "superagent": "^5.2.2", + "superagent-proxy": "^2.0.0" + } }, "signal-exit": { "version": "3.0.3", @@ -10398,9 +10373,9 @@ } }, "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -10419,23 +10394,23 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -10491,9 +10466,9 @@ "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" }, "stacktrace-parser": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.9.tgz", - "integrity": "sha512-DRy03ljj0367Ud3OAJHD6eVS/+CvMK2u/djVYuU37fHYcYHoZ8tkFyhbRf7PNG1h3bWLsw+SNTSXrPFe07A7aQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", "requires": { "type-fest": "^0.7.1" } @@ -10552,14 +10527,14 @@ } }, "stream-http": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", - "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", + "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", "requires": { "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^3.0.6", - "xtend": "^4.0.0" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" }, "dependencies": { "readable-stream": { @@ -10638,28 +10613,6 @@ "es-abstract": "^1.17.5" } }, - "string.prototype.trimleft": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", - "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" - } - }, - "string.prototype.trimright": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", - "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" - } - }, "string.prototype.trimstart": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", @@ -10718,9 +10671,9 @@ } }, "sudo-prompt": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz", - "integrity": "sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==" + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" }, "superagent": { "version": "5.2.2", @@ -10751,15 +10704,15 @@ } }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "optional": true }, "qs": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", "optional": true }, "readable-stream": { @@ -10802,6 +10755,11 @@ "has-flag": "^3.0.0" } }, + "svg-path-properties": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/svg-path-properties/-/svg-path-properties-1.0.4.tgz", + "integrity": "sha512-yoiTZOP37EFt6GetaQlN4IIqUWZSn3i+pMztDg3OtTNwoU0a+0+o7os3PK+UT2nsS115vr02VG4HIzMEVcTzFg==" + }, "symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", @@ -11106,10 +11064,33 @@ } } }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" }, "tsutils": { "version": "3.17.1", @@ -11401,9 +11382,9 @@ "integrity": "sha512-YtJEYC4cEr/EJjCAllQN1T+PX+XtcrCCBXJv+dLdzxxRtVKkHlf8kAxyriXUOtGmiMtgzlz+d8hQugVPdq8ZfA==" }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "validate-npm-package-license": { diff --git a/package.json b/package.json index 935c5e2..419aff3 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,13 @@ "base-64": "^0.1.0", "bolt11": "^1.2.7", "browserify": "^16.5.0", - "cyphernode-js-sdk-transports": "git+https://github.com/gabidi/cyphernode-js-sdk-transports.git#feature/rn", + "cyphernode-js-sdk-transports": "git+https://git@github.com/gabidi/cyphernode-js-sdk-transports.git#feature/rn", + "d3-scale": "^3.2.1", "moment": "^2.24.0", "node-libs-react-native": "^1.0.3", - "qr.js": "^0.0.0", "react": "16.9.0", "react-native": "0.61.5", + "react-native-androw": "0.0.34", "react-native-animatable": "^1.3.3", "react-native-camera": "^3.17.0", "react-native-crypto": "^2.2.0", @@ -44,7 +45,7 @@ "react-native-nav": "^2.0.2", "react-native-permissions": "^2.0.3", "react-native-qrcode-scanner": "^1.2.3", - "react-native-range-slider": "^0.1.2", + "react-native-qrcode-svg": "^6.0.6", "react-native-reanimated": "^1.7.0", "react-native-safe-area-context": "^0.7.3", "react-native-screens": "^2.0.0", @@ -52,15 +53,20 @@ "react-native-share": "^2.0.0", "react-native-slider": "^0.11.0", "react-native-sliding-up-down-panels": "^1.0.0", + "react-native-svg": "^12.1.0", + "react-native-svg-charts": "^5.4.0", "react-native-swipe-up-down": "^1.0.7", "react-native-swipeout": "^2.3.6", + "react-native-tab-view": "^2.14.0", "react-native-v8": "^0.61.5-patch.2", "react-native-vector-icons": "^6.6.0", "react-navigation-transitions": "^1.0.12", "react-redux": "^7.1.1", + "reanimated-bottom-sheet": "^1.0.0-alpha.20", "redux": "^4.0.4", "redux-thunk": "^2.3.0", - "sifir-js-sdk": "git+https://github.com/Sifir-io/sifir-js-sdk.git#feature/rn", + "sifir-js-sdk": "git+https://git@github.com/Sifir-io/sifir-js-sdk.git#master", + "svg-path-properties": "^1.0.4", "uuid": "^3.4.0", "vm-browserify": "^1.1.2" }, diff --git a/src/assets/images/arrowupArrow.png b/src/assets/images/arrowupArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..85767feb7938074e33c3b47b4ee3e3c1c25a74df GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#AWs*^kP61Pmkx3=DDW^J=(+TFdeM|u&W>Fk zTmGGKbZk+Z&!ps3T%H~LOCoO8q4siB#XT+C6_W+?R@>jX!MfCYMneeaZVB%LpPGy3 fc>Q3Scs``+;Dh)l0tUB$rZafD`njxgN@xNAPyRhY literal 0 HcmV?d00001 diff --git a/src/assets/images/arrowupArrow@2x.png b/src/assets/images/arrowupArrow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a9e058a4af6ec504815931a0298f420158da40 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?2=RS;(M3{v?36l5$8 za(7}_cTVOdki(Mh=`su|}ZwSY|d!kXOvgc0iwj(n?YhIcc1LS%JPgg&e IbxsLQ0AKoMivR!s literal 0 HcmV?d00001 diff --git a/src/assets/images/arrowupArrow@3x.png b/src/assets/images/arrowupArrow@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..358bea0814fe05879e1e5ab65d772689eb1d3965 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!oCO|{#S9FJ79h;%I?XTvD9BhG z%z? z+NrMkQ2fJ>;{GSH6>jC6X+YIbu!vL9=9uxB<)%8v6k>l|k*qtWcqv8M@9xC1V=Ij> z9keKQwUS)k=VATm%jcE)m*!b~%88xWcVuGutBw-2zCF=pOX?q;kWF>lrPOyPG;E3X z;}dgJU3Mw=-I-gy#QO1x9vkJO9m<HKyN|Ia460@LoB_F8)9%ER2tpunzg?vf(C SC2_VENX*mK&t;ucLK6T>Iea|; literal 0 HcmV?d00001 diff --git a/src/assets/images/bitcoinWhiteOutlined.png b/src/assets/images/bitcoinWhiteOutlined.png new file mode 100644 index 0000000000000000000000000000000000000000..29bbae848c64921570a3ca27e2d2fd4d97621095 GIT binary patch literal 1049 zcmV+!1m^pRP)cR$yJhFs}m5e78*@ zDuon~@0>uB=I86p{YwNbiB_xS;;-N+l?{Z*a+_3Y5M(m`Xf*N<4-cPd35YbEL89OY zv4_X1A{s~`o`doDRS7W&Cj&W|$>aj1@-iCIA1c-KJg;xNh7}=AFvO4nJB>PCAiOJxrC_xCvoWp+{jlVU7%Q1~C~ zD7;N(h{;h3aON<6d;8&V;KUyKv?5qaG}R@>Z%P5^@GIw4j!v%Z74S2PAj5iN>Jraa zrxd^(1H`ecq}Ac0^mOrc8<;iG5+H)G+<#a5yYkj^{0D(DduM-q+9Ec7pN^I#DG{@L@peIYL5E>R#r( z4@rbp;F?~T@krCKbBTBLRB?==OoQ{V389Y>caz{eEHF4YlQ)R=BFf%&Y$np-!_3K3 z9XeyMbP_WSDEF`1PUnI)1gv#>*KWT{Vc&Ubm|cxcdJ|jM>2x^cREHm=GxHdfbVOMf z<{h;@#WL;?pd%kq_$z45;B!jiK9BF( z-d-fkQ`m|wEqvC~r7jyx7`GSUwF<{S&*D19iKG!ZT#U21CrITxwDnbyA?$|akaoh$ z`yly`-@~VDD^7_KC^^|uLC}PBd;9CYu$qO?8b>3SQ(*H-kJFhgNN~}GRucXL02xcG Tzs&@+00000NkvXXu0mjf1E=XN literal 0 HcmV?d00001 diff --git a/src/assets/images/bitcoinWhiteOutlined@2x.png b/src/assets/images/bitcoinWhiteOutlined@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..aeaf1f353aa637a45dbecdf56aebd59e4819eb70 GIT binary patch literal 2104 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 A#Q*>R literal 0 HcmV?d00001 diff --git a/src/assets/images/confirmed.png b/src/assets/images/confirmed.png new file mode 100644 index 0000000000000000000000000000000000000000..0ab8fc555c1deb05e81a435fb8593afd9ce1663c GIT binary patch literal 786 zcmV+t1MU2YP)TuiVh7al;a@&Rdz70)8>?6IWB?z(2r<9-v3(^kDIdM;zEtOm*Ol-O7Qb+Z-AZ#IB z_CehjupJ*-QnKHO!U4A|EC!BRw;UxVCJ32*Arp%wQq1`8P*G@QAcWu=^3Tg4V4BoX zojdfxQZ@+|%YO`iIZU6oVewt&VHptkuH0)3J`N)#L<`G8U{ejs3MJ)jRFO?Tih_j- z=R=Q@62=oOn~`W4s`pa~%ZG*X71`iO#Vp)J%Y2UQ zTMwa$Df?CGQc~#P?n_kGEZ)|k&85{fV>m(6qquT4*d__dcggP0&(P-d^p1f9$crA| ze+}>6t8;;{Q0=<|=hqh`!BA6JJvwJ6VuSwBoIDf=?Dk*J72c?<5ahqWN1hg5<7#YlHwje`epVEqa+!Q==NSS zSo>#>9}dX)V}?X6I4Dbq9*;&zGA<=|l2JxhVnnq`Rhfuo`!imT^%lEIRzl9CUC{-O z#fkYUWzlu37^R?k1A;b_&b!7S+67h{u$xndpLj(x88!4+4sv2|LK|{bZ7O(r%p`s# zZ$PkcOV literal 0 HcmV?d00001 diff --git a/src/assets/images/confirmed@2x.png b/src/assets/images/confirmed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..69da3429621ca518a24345e01d3d73fd6542c059 GIT binary patch literal 1442 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 N@O1TaS?83{1OV3kFAo3! literal 0 HcmV?d00001 diff --git a/src/assets/images/filter@2x.png b/src/assets/images/filter@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a72dd442676ef3a65f87c78e41344cabc6ab45b0 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^dO)ns!3HD?wpINHQk(@Ik;M!QVyYm_=ozH)0Vv2= z9OUlAuDR5G$z zX@=bKOa*r1lWfrkz12c3zZn}xZr_#8$-r=6L6%+p^ozk(x?CI#3=(0Lud@|Pxt6Ej bV%o)!d4`kA;c3+#pverLu6{1-oD!M<`vW#@ literal 0 HcmV?d00001 diff --git a/src/assets/images/filter@3x.png b/src/assets/images/filter@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1b8b3aa50ae0e7f35c6277a4ed77acf49688f40d GIT binary patch literal 240 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 a>G&UkjF+Vpyzv3!q83|V=A<{7TL#eq4 z6?9v#o*f)iAY)`kG_fdB&T3qtJeQ}cE>ay``XC>)oM&sS^+7I}f~9`f@dsQ7q!a$I-#3veaCTNpVjR-1KmRqq zuFEbMmtzQ7A#jg=e){wTQY018x?-u~0IRC-ztbkoos(g~z=TA*}aAofEXW#6>G^Z!gUezU~>jc+AR5fRQvh zwFXWJ5mwFflN#$1747lP&MLZCHr=6ER}1OEEW5(EJlfhRB8bcE{{EA2mx+n?WP5v; zt*I1va-yU2##!kyT30{3gtqf0G}hIzN%xWpxDpZV$=1#b{!$E`-gx%(r!rhYiltKC zX*Ahg(zKmpPBlWf!r$-Q{nxv9zx@|RWaKf; z%W_aBz_5bFN3tji@uhz}?sQ-z(b{>$|MDT)**Rl;?;onxmZEP-<$X6TWG})1eY)PC9qLd5X05 zWNWJ!_vd4YCgYeqarZ^&=&DYflj8iV+(T-wYw=LK;?3gx>`>9{Xj)r7w{T;3(B*waldMNDT68zSG7%)X z&Nrg7v#TQZxxZ&`bmq9H+fN^Rm;L&z1C|T%XY00h374a!Re5R@Q>n#8((y zbtIZZa!qS1^s}}e(c}hR*vf3yV>&eFua)CiTaRd}@#l)QvUG^Dwx|hrk7$92(OTKm z30qqZ)LQtOfM|NVkzr+=AG`2+2FqylSR3NHtRpqA35X{9!#a<>d07Q4Q>UrGjMVea zwS|KD{f=l7fVB6CY4}E`9m`UpefOl|AEToJtGYU(NdRIlvXs5YU`dlx@>fcJ2npUYW{l13wFme!!@#~wLba}UBGVw?omY)xU^)C z*jt?}*?^7gFIKc!1KB--Wws#t7+l!nwro(6aX6Cvp9)Xhz>+=C`Nlj9SeinzqGga^ zRXh5i%!wP2wX}@V)di`}31jzzf6M~j1WV>H`{z&#Y6{HT+1S6Kfh8UEE+*4GDyOcZ zZn9ajL$1*X7*ezGsjALZK(u^#vA-oTqdECB9t>0^c(a z%u)!1xN5T_=`gG`NI)!%iAb?Zk6XqkY-Q5>pkD!={)<(OV#wZPd%FadiIGF+wf|W6J^;7e z@7lhi^^R@09=Ah-Wi+IeJ{WgbBw`#?=4#-waL)ceG!A2TXt2b`Yy284rQaT&`Z7>7 zt#)vpP#C3=jb%9D#!J#+WZ2IP-GJehXC1GRjb$)VjhEt7{~Ib=R3n=?9yD!U@?v<6 zmx3K1<2GK3wbd!y$cA5FY1Bq-mM)PE1V?DR6nlT#bFW`o#Xr`K+N7bYWn{!t^)wJ1 zp(yG|n+ls>%{>T=Z-k}CTRW>@iH+_JZiM&aG!PuQ`>q$F=KcuPA4#OW{beWIYMQCC zV7FmJM&7=w7XcBNfr%)8Y%OjuQN6)=9{d2tV65ik@814eOS((?WhUun?qi82^y!km z^0&L+eSG)!?eAdG$QZ_gbrKR66-*d;ObgS~f>J*#m7eYIU+HEHGLM~GxbemeI+74f zxUgt~2#2U%g!TrXoRhmzzJm4rWzFIo;p^bK#bg8%5)n<1H|p>k#lR{ep5-U>MrQ>{ zO?fS*14Rd_5_BZ>IV2{U;7tddHyGYgdIj92xWnAS4Y?;)Fwe_8?C@Ye(Ik7Kq6xA+ z$7!6G5n(m-LYLO+`dF8+G3vxQ4vCBA^Jr_Qh=98o`b7xgxaGF?E`xZos1#7I>nND# z_4vg}_V$v*#F?0ALO*vYR!87+`sQike}&UP|6Y6_EUAMn^YNlf zvASOIT6~jL+J4P~<%wKQ}1IrWGCn z_9iiQ^2ZHX_KN$J^msZ^ z>w6u6G(uV=T^&7MiA250lH6CaOEybAcrqoLk642Az~p&eVYme*i~JGD{`0H}Ws*tJ z!bo0Ixv(T6@)#%;Y=*hAShOR*s!aT zT{c!+p?o#nCA#zhP=W}m>mqJvXSG=nD2o3B`;mu!kw`{i00000NkvXXu0mjfFt^$P literal 0 HcmV?d00001 diff --git a/src/assets/images/wasabiLogo.png b/src/assets/images/wasabiLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..99cf0a67d85fa68568ae7cfebb0137f62b114281 GIT binary patch literal 17449 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 K(WQ;9fBXk%sBNME literal 0 HcmV?d00001 diff --git a/src/assets/images/wasabiLogo1.png b/src/assets/images/wasabiLogo1.png new file mode 100644 index 0000000000000000000000000000000000000000..7610cbe0151a6e93c71ed01f04aafa6d02a78f1a GIT binary patch literal 17841 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/wasabiLogo1@2x.png b/src/assets/images/wasabiLogo1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e86daca042f1e988bb598007c7f917b25817509e GIT binary patch literal 23359 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%0DqPR=I%^yqs>Wf<@=*T(OS9nh zt)Uv`Do1;X<wMhL~!`EpiY&Yzzpa5dbm@_Jkx1!1BWa|;A&fa!N!9LG^@_}nOi7kH1B9jXEz5B z!(md;FlU;_zHz|F#%j(hXD07cp@Lf^7p+(4)KQl7(&A?9DR=%_U&G4+po1*^W@dU} zD|1=lLoeoEMO9jVf1X-ik1l~jgmUaE*WN;xQ>h;FbY@d5s_~t#ndDP_VU~R&n-rkL ze!t8&v}vGzF2hdMWuc>MInkV?-(S~M%!x2p^)_-`S|B{}s!?EIYvqDzQJ$*~y$_zd z?OE=%^z0ygyeg%V#v#Nrj_E*8z(V9?@gb}JZw%X zKaIU)nn{2!h*y)sA_6zPjm+xbtl}qqVJw)_nb-{sb#Li}6asX^_ML$eD>n5R%P59b<@@=kIDe?C9)h{#E zpW0rqpx^4;p(GcUb5)x>r^uM}EY7gU0nO}*l6!mUNW3lXOrK|h?AJ>}n>7(L+LPis zxI;QRPp^FRwKr*JhY~lOcffZ)zerneMZ`_Tl}RQt-{abnG8*ybG8ri$2ydewCZS)^2?AB5%*3S$O(CpOE8$zaIiBgGl=lGrTop@gLJb$r!b zipJv9aU;F~7a<*717pFnkPns@M#v2GPe{i<$&F4Qe#+b8W5!eD@$hL{qs+ghKkMWIspjZx)FJSq9a?S{#;nu$?Z>@}Zz z?5C$11NqxFcR+HG3B7r|@j$Omyh?9^`n4J(mZ+PiqC9l`0L9mWRJ%8zQR&hd@E3a(d3IChH>2>UYgw%FxNy4>Y}y62%lhDXtegfwq}t&Lnmf z{y4wFoSnPjA$*}C8N8j8#s54M#Sn3pnp%p7@*2$B#JMfr ztJF^d!+Z5kc(0B3CA3`u3-I%T#-7eS9F1p*>tQ%>^Kn+TZvYpQ&$%5MC-^p+d+Nm3 z)I(^682U2kM{Hw0s^{>%!7W-N8}6f7;za3j^J*DW%3$QPftK)sW|sw#ycQv+@Bt-= ze#x5R>}dlzeI-Qb7&Y*6I<)d6j_iXdp01(4l(Qq%Jkd}m9(yp`+)|d(5U&d!kUNvi zOiOw%I?8~U1bx1$Z9uG8y7Z!yWMqc=+{?g7r}Tlq?4@|SVHvmi>05__OgsGm;1hg! zuCa8IjJ{?cH7WC<@O$iKG=KNJ3u|jh>KvF#wmwchW3x9~b*U)bSp7!CDesXl z$`)RA>}#!r?=7#1v1#?4G5-Ad!)(%h9cz9akMH`XgSQV)Qw*I- zys4|kSyY8PEj?Z6rstU?%8Gk8ce3J4Z-Vx$z;spKyJJ`s>O+kKS!LNH{iQP*eT#4E zCK+GYd>tP6famroU-G~<+<7syoy#jac33L`LVd0nhsH-9wmHcUSr3$oDNt!&@e?qwL*J_3{% Xx(X||9`qnSX$KHW8j4TluloN7NFNBw literal 0 HcmV?d00001 diff --git a/src/assets/images/wasabiLogo1@3x.png b/src/assets/images/wasabiLogo1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..763d93bca492922500193b77f4b83a662dd9a00f GIT binary patch literal 28977 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 E2dBABpa1{> literal 0 HcmV?d00001 diff --git a/src/assets/images/wasabiLogo@2x.png b/src/assets/images/wasabiLogo@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa8d3cedc40b083997ec856fa128ffa50a08467 GIT binary patch literal 22220 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 XFnva^&0+ZaUx}$GX((37n?3$tI2azF literal 0 HcmV?d00001 diff --git a/src/assets/svg/Back.js b/src/assets/svg/Back.js new file mode 100644 index 0000000..83e054d --- /dev/null +++ b/src/assets/svg/Back.js @@ -0,0 +1,18 @@ +import * as React from 'react'; +import Svg, {Path} from 'react-native-svg'; + +const Back = props => { + return ( + + + + ); +}; + +export default Back; diff --git a/src/assets/svg/index.js b/src/assets/svg/index.js new file mode 100644 index 0000000..35c7a32 --- /dev/null +++ b/src/assets/svg/index.js @@ -0,0 +1,5 @@ +import Back from './Back'; + +export default { + Back, +}; diff --git a/src/common/AppStyle.js b/src/common/AppStyle.js index 7021b76..14f1f5e 100644 --- a/src/common/AppStyle.js +++ b/src/common/AppStyle.js @@ -7,4 +7,6 @@ export default { secondaryColor: '#4B53FF', errorColor: '#D0021B', orange: 'orange', + grayColor: '#ABA8A8', + tertiaryColor: '#122C3A', }; diff --git a/src/common/constants.js b/src/common/constants.js index 256510f..4132c14 100644 --- a/src/common/constants.js +++ b/src/common/constants.js @@ -15,13 +15,16 @@ export const C = { STR_SHOP: 'SHOP', STR_SETTINGS: 'SETTINGS', STR_Cur_Balance: 'Current Balance', + STR_Wasabi_Header: 'Total Balance having minimum Anonset ', STR_Balance_Channels_n_Outputs: 'Channels & Outputs Balance', STR_Balance_Outputs: 'Balance (Outputs)', STR_Balance_Channels: 'Balance (Channels)', STR_Hops_to_route: 'hop to payee', STR_INVOICES_AND_PAYS: 'Invoices & Pays', STR_TRANSACTIONS: 'Transactions', + STR_ALL_TRANSACTIONS: 'All Transactions', STR_SEND: 'SEND', + STR_BACK: 'BACK', STR_Send: 'Send', STR_TxID: 'TxID', STR_ChannelID: 'Channel ID', @@ -106,6 +109,10 @@ export const C = { STR_WATCH_WALLET_TYPE: 'pub32Watching', STR_WATCHING: 'Watching', STR_SPEND_WALLET_TYPE: 'btcSpending', + STR_SPEND_WALLET_LABEL: 'Spending', + STR_WASABI_WALLET_TYPE: 'wasabiWallet', + STR_WASABI_WALLET_LABEL: 'Wasabi', + STR_UNSPENT_COINS: 'unspentCoins', STR_LN_WALLET_TYPE: 'ln', STR_LN_WITHDRAW: 'LNwithdraw', STR_WATCH_ONLY: 'WATCH ONLY', @@ -127,6 +134,13 @@ export const C = { STR_Segwit_Compatible: 'Segwit Compatible (P2SH)', STR_Bech32: 'Segwit Native (Bech32)', STR_Wallet_balance: 'Wallet Balance', + STR_Min_Anonset: 'Min Anonset', + STR_Anonim_Level: 'Anonimity Level', + STR_Set_Min_Anonset: 'Set Minimum Anonset', + STR_Auto_mix_account_select: + 'Funds reaching the minimum anonset specified will be sent to', + STR_Select_Account: + 'Select one account to which the Wasabi wallet will autosend funds to.', // --- ERRORS -- STR_ERROR_app: 'App Error', STR_ERROR: 'Error', diff --git a/src/common/images.js b/src/common/images.js index ed18a75..116e6c5 100644 --- a/src/common/images.js +++ b/src/common/images.js @@ -14,6 +14,7 @@ export default { icon_receive: require('./../assets/images/down_cir.png'), icon_chanel: require('./../assets/images/light_cir.png'), icon_up_arrow: require('./../assets/images/up_arrow.png'), + upArrow: require('./../assets/images/arrowupArrow.png'), icon_up_blue: require('./../assets/images/uparrow_blue.png'), icon_down_arrow: require('./../assets/images/down_arrow.png'), icon_btc_cir: require('./../assets/images/bitcoin_blue.png'), @@ -61,4 +62,10 @@ export default { icon_chatSend: require('./../assets/images/chatSend.png'), icon_yellowTxn: require('./../assets/images/yellowTxn.png'), icon_thickGreenArrowTxn: require('./../assets/images/bold_arrow.png'), + filter_icon: require('./../assets/images/filter.png'), + icon_wasabi: require('./../assets/images/wasabiLogo.png'), + icon_wasabi_clicked: require('./../assets/images/wasabiLogo1.png'), + icon_confirmed: require('./../assets/images/confirmed.png'), + icon_unconfirmed: require('./../assets/images/unchecked.png'), + icon_bitcoinWhiteOutlined: require('./../assets/images/bitcoinWhiteOutlined.png'), }; diff --git a/src/common/index.js b/src/common/index.js index 929bcfc..ef77f8f 100644 --- a/src/common/index.js +++ b/src/common/index.js @@ -1,5 +1,6 @@ import {C} from './constants'; import Images from './images'; import AppStyle from './AppStyle'; +import svg from '../assets/svg'; -export {C, Images, AppStyle}; +export {C, Images, AppStyle, svg}; diff --git a/src/components/elements/SifirAccountActions.js b/src/components/elements/SifirAccountActions.js index 7809ecd..b6fb612 100644 --- a/src/components/elements/SifirAccountActions.js +++ b/src/components/elements/SifirAccountActions.js @@ -8,12 +8,19 @@ import { } from 'react-native'; import {Images, AppStyle, C} from '@common/index'; -const SifirAccountActions = ({type, handleReceiveButton, handleSendBtn}) => { +const SifirAccountActions = ({ + type, + sendActionButtonLabel, + handleReceiveButton, + handleSendBtn, + isDisabled = false, +}) => { const [btnStatus, setButtonStatus] = useState(0); return ( {!!handleSendBtn && ( setButtonStatus(1)} onPressOut={() => { @@ -23,9 +30,13 @@ const SifirAccountActions = ({type, handleReceiveButton, handleSendBtn}) => { - {C.STR_SEND} + + {sendActionButtonLabel} + { )} {!!handleReceiveButton && ( setButtonStatus(2)} onPressOut={() => { @@ -45,7 +57,9 @@ const SifirAccountActions = ({type, handleReceiveButton, handleSendBtn}) => { style={[ styles.txnBtnView, styles.leftTxnBtnView, - btnStatus === 2 ? {backgroundColor: 'black', opacity: 0.7} : {}, + btnStatus === 2 || isDisabled + ? {backgroundColor: 'black', opacity: 0.7} + : {}, ]}> {C.STR_RECEIVE} @@ -63,7 +77,6 @@ const SifirAccountActions = ({type, handleReceiveButton, handleSendBtn}) => { const styles = StyleSheet.create({ btnAreaView: { - flex: 1, flexDirection: 'row', borderColor: AppStyle.mainColor, borderWidth: 1, diff --git a/src/components/elements/SifirAccountChart.js b/src/components/elements/SifirAccountChart.js new file mode 100644 index 0000000..3bdc9eb --- /dev/null +++ b/src/components/elements/SifirAccountChart.js @@ -0,0 +1,260 @@ +// @flow +import React, {useMemo, useEffect} from 'react'; +import {Images, AppStyle, C} from '@common/index'; +import {StyleSheet, View, Animated, TextInput, Text} from 'react-native'; +import Svg, {Path, Defs, Stop} from 'react-native-svg'; +import * as path from 'svg-path-properties'; +import * as shape from 'd3-shape'; +import {scaleLinear} from 'd3-scale'; +import LinearGradient from 'react-native-linear-gradient'; +import Androw from 'react-native-androw'; +import {log} from '@io/events'; +import makeUnspentCoinsChartData from '@helpers/makeUnspentCoinsChartData'; + +const d3 = { + shape, +}; + +const height = 60; +const width = C.SCREEN_WIDTH; +const verticalPadding = 5; +const cursorRadius = 10; +const cursor = React.createRef(); +const slider = React.createRef(); +const label = React.createRef(); +const SV = React.createRef(); +const x = new Animated.Value(0); + +const SifirAccountChart = props => { + const plotData = props.chartData; + useEffect(() => { + _init(); + }, []); + const {series, minX, maxX, minY, maxY} = useMemo( + () => makeUnspentCoinsChartData(plotData), + [plotData], + ); + const {scaleX, scaleY, line, properties, lineLength} = useMemo(() => { + const scaleX = scaleLinear() + .domain([minX, maxX]) + .range([20, width - 20]); + const scaleY = scaleLinear() + .domain([minY, maxY]) + .range([height - verticalPadding, verticalPadding]); + const line = d3.shape + .line() + .x(([anonset]) => scaleX(Number(anonset))) + .y(([, balance]) => scaleY(balance)) + .curve(d3.shape.curveStepBefore)(series); + const p = path.svgPathProperties(line); + return { + scaleX, + scaleY, + line, + properties: p, + lineLength: p.getTotalLength(), + }; + }, [series]); + const _init = () => { + try { + x.addListener(({value}) => moveCursor(value)); + log('Chart data lineLength', lineLength); + let {x: X, y} = properties.getPointAtLength(lineLength); + let top = y - cursorRadius - 2; + let left = X - (cursorRadius + 10); + cursor?.current?.setNativeProps({ + top, + left, + }); + slider.current.setNativeProps({ + left: left - 10, + }); + // Initialize with intial balance to show in account header + moveCursor(0); + } catch (err) { + console.error(err); + } + }; + + const moveCursor = value => { + let {x, y} = properties.getPointAtLength(lineLength - value); + let top = y - cursorRadius - 2; + let left = x - (cursorRadius + 10); + cursor?.current?.setNativeProps({ + top, + left, + }); + slider.current.setNativeProps({ + left: left - 10, + }); + const anonSetValue = scaleX.invert(x); + // const cumSumBalanceValue = scaleY.invert(y); + // find first anonset pair in acending array where value < array + // FIXME HERE TRELLO TICKET is why bug is breaing ? + const [, cumSumBalanceValue] = series.find( + ([anonset]) => anonSetValue <= anonset, + ); + const text = `${Math.floor(anonSetValue)}`; + label?.current?.setNativeProps({ + text, + top, + left, + }); + props.handleChartSlider({ + anonset: anonSetValue, + value: cumSumBalanceValue, + }); + }; + + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {minX} + Anonimity Level + {maxX} + + + ); +}; + +export default SifirAccountChart; + +const styles = StyleSheet.create({ + root: { + height, + }, + container: { + marginTop: 10, + paddingTop: 40, + width, + overflow: 'hidden', + }, + cursor: { + width: cursorRadius * 1.4, + height: cursorRadius * 1.4, + borderRadius: cursorRadius, + borderColor: '#fff', + borderWidth: 2, + backgroundColor: '#00EDE7', + }, + cursorContainer: { + width: cursorRadius * 2.3, + height: cursorRadius * 2.3, + borderRadius: cursorRadius + 4, + backgroundColor: 'rgba(255, 255, 255, 0.3)', + position: 'absolute', + left: 10, + justifyContent: 'center', + alignItems: 'center', + }, + label: { + position: 'absolute', + color: 'white', + }, + verticalGradient: { + height: 250, + width: 40, + backgroundColor: 'lightgray', + opacity: 0.5, + borderRadius: 10, + top: -30, + }, + sliderContainer: { + marginHorizontal: 10, + marginTop: 10, + }, + bubbleText: {color: 'white'}, + thumb: { + backgroundColor: '#00EDE7', + width: 40, + borderRadius: 5, + elevation: 3, + height: 16, + }, + sliderTrack: { + backgroundColor: '#2B2B2B', + borderRadius: 5, + }, + shadow: { + shadowColor: '#00EDE7', + shadowOffset: {width: 0, height: 0}, + shadowOpacity: 0.8, + shadowRadius: 4, + }, + cursorParent: { + width, + height: height, + position: 'absolute', + top: height - height * 0.33, + }, + sliderLabel: { + color: 'gray', + }, + sliderLabelContainer: { + width: '100%', + height: 30, + flexDirection: 'row', + justifyContent: 'space-between', + paddingHorizontal: 10, + alignItems: 'center', + }, + chartContainer: { + justifyContent: 'center', + alignItems: 'center', + }, +}); diff --git a/src/components/elements/SifirAccountHeader.js b/src/components/elements/SifirAccountHeader.js index 4fc4dac..aefd2f2 100644 --- a/src/components/elements/SifirAccountHeader.js +++ b/src/components/elements/SifirAccountHeader.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {useState} from 'react'; import { View, Text, @@ -23,6 +23,9 @@ const SifirAccountHeader = ({ accountIconOnPress, accountIcon, }) => { + const [balanceViewDimensions, setDimensions] = useState({}); + const {width} = balanceViewDimensions; + const balanceTxtFontSize = width / 5 || 25; return ( @@ -52,14 +55,20 @@ const SifirAccountHeader = ({ { + const {width, height} = event.nativeEvent.layout; + setDimensions({width, height}); + }} style={styles.balanceView}> {loading === true && ( )} {loaded === true && loading === false && ( <> - - + + @@ -73,7 +82,6 @@ const SifirAccountHeader = ({ const styles = StyleSheet.create({ headerView: { - flex: 3, marginTop: 0, marginLeft: 20, flexDirection: 'row', @@ -104,7 +112,7 @@ const styles = StyleSheet.create({ flex: 5, flexDirection: 'column-reverse', marginLeft: 25, - paddingBottom: 15, + justifyContent: 'center', }, balAmountTxt: { color: 'white', diff --git a/src/components/elements/SifirAccountHistory.js b/src/components/elements/SifirAccountHistory.js deleted file mode 100644 index a77017e..0000000 --- a/src/components/elements/SifirAccountHistory.js +++ /dev/null @@ -1,71 +0,0 @@ -import React from 'react'; -import { - View, - Image, - StyleSheet, - TouchableOpacity, - Text, - ActivityIndicator, -} from 'react-native'; -import {Images, AppStyle, C} from '@common/index'; -import SifirTxnList from '@elements/SifirTxnList'; - -const SifirAccountHistory = ({ - loading, - loaded, - txnData, - btcUnit, - type, - headerText, -}) => { - const BTN_WIDTH = C.SCREEN_WIDTH / 2; - return ( - <> - - {headerText} - - - - {loading && ( - - )} - - - - - - ); -}; - -const styles = StyleSheet.create({ - txnSetView: { - flex: 1, - flexDirection: 'row', - marginLeft: 26, - marginTop: 30, - }, - txnLblTxt: { - color: 'white', - fontSize: 23, - fontWeight: 'bold', - }, - txnListView: { - flex: 3, - height: '100%', - marginBottom: 20, - marginLeft: 25, - }, - settingIcon: {width: 20, height: 20, marginLeft: 20, marginTop: 7}, - spinner: {right: 30, position: 'absolute', alignSelf: 'center'}, -}); - -export default SifirAccountHistory; diff --git a/src/components/elements/SifirAnimatedOverlay.js b/src/components/elements/SifirAnimatedOverlay.js new file mode 100644 index 0000000..ab02fc5 --- /dev/null +++ b/src/components/elements/SifirAnimatedOverlay.js @@ -0,0 +1,26 @@ +/* eslint-disable react-native/no-inline-styles */ +import React, {useRef, useEffect, useLayoutEffect} from 'react'; +import {Animated, Text, View, StyleSheet} from 'react-native'; + +export default ({style = {}, effectDeps = [], children, ...rest}) => { + const fadeAnim = new Animated.Value(0.2); + useLayoutEffect(() => { + Animated.timing(fadeAnim, { + toValue: 0.8, + duration: 150, + userNativeDriver: true, + }).start(); + }, []); + return ( + + ); +}; diff --git a/src/components/elements/SifirAnonimitySlider.js b/src/components/elements/SifirAnonimitySlider.js new file mode 100644 index 0000000..c6c1aca --- /dev/null +++ b/src/components/elements/SifirAnonimitySlider.js @@ -0,0 +1,142 @@ +import React from 'react'; +import {C} from '@common/index'; +import {StyleSheet, View, Animated, TextInput, Text} from 'react-native'; +import LinearGradient from 'react-native-linear-gradient'; + +const height = 60; +const width = C.SCREEN_WIDTH; + +const SifirAnonimitySlider = ({ + minX, + maxX, + SV, + slider, + label, + lineLength, + cursor, + x, +}) => { + return ( + <> + + + + + + + + + + + + + + + + + + + + {minX} + {C.STR_Anonim_Level} + {maxX} + + + ); +}; + +export default SifirAnonimitySlider; +const styles = StyleSheet.create({ + root: { + height, + }, + container: { + overflow: 'hidden', + paddingTop: '20%', + width, + }, + + label: { + position: 'absolute', + color: 'white', + top: -30, + }, + verticalGradient: { + height: 130, + width: 40, + backgroundColor: 'rgba(255,255,255,0.5)', + opacity: 0.5, + borderRadius: 10, + top: -40, + }, + sliderContainer: { + marginHorizontal: 10, + marginTop: 10, + }, + bubbleText: { + color: 'white', + textAlign: 'center', + fontSize: 18, + top: -15, + }, + thumb: { + backgroundColor: '#00EDE7', + width: 40, + borderRadius: 5, + elevation: 3, + height: 16, + }, + sliderTrack: { + backgroundColor: '#2B2B2B', + borderRadius: 5, + }, + shadow: { + shadowColor: '#00EDE7', + shadowOffset: {width: 0, height: 0}, + shadowOpacity: 0.8, + shadowRadius: 4, + }, + cursorParent: { + width, + height: height, + position: 'absolute', + top: 0, + }, + sliderLabel: { + color: 'gray', + }, + sliderLabelContainer: { + width: '100%', + flexDirection: 'row', + justifyContent: 'space-between', + paddingHorizontal: 10, + alignItems: 'center', + }, + chartContainer: { + justifyContent: 'center', + alignItems: 'center', + }, +}); diff --git a/src/components/elements/SifirAutoSpendWalletCard.js b/src/components/elements/SifirAutoSpendWalletCard.js new file mode 100644 index 0000000..092292a --- /dev/null +++ b/src/components/elements/SifirAutoSpendWalletCard.js @@ -0,0 +1,74 @@ +import React from 'react'; +import {View, Text, TouchableOpacity, Image, StyleSheet} from 'react-native'; +import SifirCard from '@elements/SifirCard'; +import {AppStyle, C} from '@common'; + +const SifirAutoSpendWalletCard = ({ + item, + setSelectedWallet, + onLayoutListItem, + selectedWallet, +}) => { + const {label, desc, iconURL, meta} = item; + // const {id, leftIcon, heading, annonset} = item; + + return ( + setSelectedWallet(item)} + onLayout={event => onLayoutListItem(event, label)}> + + + {`${label} - ${desc}`} + + {0} + {C.STR_Min_Anonset} + + + + ); +}; + +const styles = StyleSheet.create({ + cardContainer: { + marginStart: 20, + marginEnd: 20, + marginBottom: 24, + backgroundColor: '#19282f', + borderWidth: 2, + borderColor: '#19282f', + borderRadius: 20, + padding: 15, + flexDirection: 'row', + alignItems: 'center', + }, + leftIcon: { + width: 40, + height: 40, + resizeMode: 'contain', + }, + listHeading: { + color: 'white', + flex: 1, + paddingLeft: 20, + }, + anonset: { + color: 'white', + fontSize: 18, + }, + anonsetLabel: { + color: 'gray', + fontSize: 12, + }, + rightContainer: { + textAlign: 'right', + alignItems: 'flex-end', + }, +}); +export default SifirAutoSpendWalletCard; diff --git a/src/components/elements/SifirCard.js b/src/components/elements/SifirCard.js new file mode 100644 index 0000000..2f18db3 --- /dev/null +++ b/src/components/elements/SifirCard.js @@ -0,0 +1,8 @@ +import React from 'react'; +import {View} from 'react-native'; + +const SifirCard = ({children, style}) => { + return {children}; +}; + +export default SifirCard; diff --git a/src/components/elements/SifirHeaders/SifirAutoSpendHeader.js b/src/components/elements/SifirHeaders/SifirAutoSpendHeader.js new file mode 100644 index 0000000..225b1f4 --- /dev/null +++ b/src/components/elements/SifirHeaders/SifirAutoSpendHeader.js @@ -0,0 +1,123 @@ +/* eslint-disable react-native/no-inline-styles */ +import React, {useState} from 'react'; +import { + View, + Text, + StyleSheet, + TouchableOpacity, + TextInput, +} from 'react-native'; +import {AppStyle, svg} from '@common'; +import SifirSwitch from '@elements/SifirSwitch'; +import SifirAnimatedOverlay from '@elements/SifirAnimatedOverlay'; + +const {Back} = svg; + +const SifirAutoSpendHeader = ({ + headerText, + setSwitchOn, + isSwitchOn, + showOverlay, + onBackPress, +}) => { + return ( + + {showOverlay && } + + + + + + {headerText} + + + setSwitchOn(active)} + /> + + ); +}; + +export default SifirAutoSpendHeader; + +const styles = StyleSheet.create({ + titleContainer: { + flexDirection: 'row', + alignItems: 'center', + paddingTop: 10, + }, + title: { + // marginLeft: 12, + fontSize: 20, + color: '#00EDE7', + fontWeight: 'bold', + fontFamily: AppStyle.mainFont, + width: '60%', + }, + menuItem: {}, + activeMenuItem: { + borderBottomColor: 'white', + borderBottomWidth: 1, + }, + tabsStyle: { + flexDirection: 'row', + flex: 3, + marginLeft: 15, + marginRight: 15, + justifyContent: 'space-between', + alignItems: 'center', + paddingLeft: 20, + paddingRight: 20, + }, + activeNavTextView: { + color: 'white', + fontSize: 13, + fontFamily: AppStyle.mainFont, + }, + navTextView: { + color: AppStyle.mainColor, + fontSize: 13, + fontFamily: AppStyle.mainFont, + }, + logocontainer: { + width: 50, + height: 50, + borderRadius: 4, + marginLeft: 15, + borderWidth: 0.5, + shadowOffset: {width: 10, height: 10}, + shadowColor: 'black', + shadowOpacity: 1.0, + }, + navbarStyle: { + flexDirection: 'row', + padding: 10, + marginTop: 0, + // marginBottom: 15, + backgroundColor: AppStyle.backgroundColor, + justifyContent: 'center', + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 12, + }, + shadowOpacity: 0.58, + shadowRadius: 16.0, + elevation: 24, + }, + badgeCont: { + position: 'absolute', + top: -9, + right: -7, + }, + badge: { + width: 12, + height: 12, + borderWidth: 0, + borderRadius: 6, + }, +}); diff --git a/src/components/elements/SifirQRCode.js b/src/components/elements/SifirQRCode.js index 12f6f3b..ed88fef 100644 --- a/src/components/elements/SifirQRCode.js +++ b/src/components/elements/SifirQRCode.js @@ -1,108 +1,34 @@ -import {Image, View} from 'react-native'; -import PropTypes from 'prop-types'; -import React from 'react'; -import qr from 'qr.js'; -import {Buffer} from 'buffer'; - -function qr2bmp(data, colors, scale) { - const header = Buffer.from( - 'Qk02GwAAAAAAADYAAAAoAAAAMAAAADAAAAABABgAAAAAAAAbAAATCwAAEwsAAAAAAAAAAAAA', - 'base64', +import {View} from 'react-native'; +import React, {useEffect, useState} from 'react'; +import QRCode from 'react-native-qrcode-svg'; +import {Images, AppStyle} from '@common/index'; +// import qr from 'qr.js'; +const SifirQRCode = props => { + const { + value = 'Sifir', + fgColor = '#000000', + bgColor = '#FFFFFF', + size = 128, + setQrCodeURI, + } = props; + const [svgRef, setSvgRef] = useState(null); + useEffect(() => { + if (!svgRef) return; + svgRef.toDataURL(d => setQrCodeURI(`data:image/bmp;base64,${d}`)); + }, [svgRef]); + return ( + + setSvgRef(c)} + onError={console.error} + logo={Images.icon_header} + logoBackgroundColor={AppStyle.backgroundColor} + /> + ); - const size = data.length; - const width = size * scale; - if (width % 4 !== 0) { - throw new Error('Image width must be multiple of 4'); - } - header.writeUInt32LE(width, 0x12); - header.writeUInt32LE(width, 0x16); - header.writeUInt32LE(width * width * 3, 0x22); - const outBuf = Buffer.alloc(width * width * 3); - - for (let rowN = 0, len = data.length; rowN < len; rowN += 1) { - const row = data[rowN]; - for (let colN = 0, lenj = row.length; colN < lenj; colN += 1) { - const color = colors[+row[colN]]; - for (let x = colN * scale; x < (colN + 1) * scale; x += 1) { - for (let y = rowN * scale; y < (rowN + 1) * scale; y += 1) { - const bo = ((width - 1 - y) * width + x) * 3; - [outBuf[bo + 2], outBuf[bo + 1], outBuf[bo + 0]] = color; - } - } - } - } - return `data:image/bmp;base64,${header.toString('base64')}${outBuf.toString( - 'base64', - )}`; -} - -const utf16to8 = str => { - /* eslint-disable no-bitwise */ - let out = ''; - for (let i = 0, len = str.length; i < len; i += 1) { - const c = str.charCodeAt(i); - if (c >= 0x0001 && c <= 0x007f) { - out += str.charAt(i); - } else if (c > 0x07ff) { - out += String.fromCharCode(0xe0 | ((c >> 12) & 0x0f)); - out += String.fromCharCode(0x80 | ((c >> 6) & 0x3f)); - out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f)); - } else { - out += String.fromCharCode(0xc0 | ((c >> 6) & 0x1f)); - out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f)); - } - } - /* eslint-enable no-bitwise */ - return out; }; - -const parseColor = hexColor => { - if (!/^#[a-f0-9]{6}$/i.test(hexColor)) { - throw new Error('Please provide the color in #FFFFFF format'); - } - return [ - parseInt(hexColor.substr(1, 2), 16), - parseInt(hexColor.substr(3, 2), 16), - parseInt(hexColor.substr(5, 2), 16), - ]; -}; - -const gcd = (a, b) => (b ? gcd(b, a % b) : a); -const lcm = (a, b) => (a * b) / gcd(a, b); - -export default class SifirQRCode extends React.Component { - static defaultProps = { - value: 'Sifir', - fgColor: '#000000', - bgColor: '#FFFFFF', - size: 128, - }; - - static propTypes = { - value: PropTypes.string, - size: PropTypes.number, - bgColor: PropTypes.string, - fgColor: PropTypes.string, - }; - - render() { - const {size, bgColor, fgColor, value} = this.props; - const QRData = qr(utf16to8(value)).modules; - const imageMultiple = lcm(4, QRData.length); - const imageSize = Math.ceil(size / imageMultiple) * imageMultiple; - const scale = imageSize / QRData.length; - const uri = qr2bmp( - QRData, - [parseColor(bgColor), parseColor(fgColor)], - scale, - ); - if (this.props.getBase64) { - this.props.getBase64(uri); - } - return ( - - - - ); - } -} +export default SifirQRCode; diff --git a/src/components/elements/SifirSettingModal.js b/src/components/elements/SifirSettingModal.js index 1f00160..e7e92d6 100644 --- a/src/components/elements/SifirSettingModal.js +++ b/src/components/elements/SifirSettingModal.js @@ -45,8 +45,6 @@ const MenuListItem = ({label, icon, onPress, hideTopBorder = false}) => { class SifirSettingModal extends Component { state = {curMenu: 0, value: 0.6}; - // FIXME - // Replace legacy shit with menuItems[] based rendering` render() { const { navigation, diff --git a/src/components/elements/SifirSlider.js b/src/components/elements/SifirSlider.js new file mode 100644 index 0000000..0008b78 --- /dev/null +++ b/src/components/elements/SifirSlider.js @@ -0,0 +1,55 @@ +import React, {Component} from 'react'; +import {View, StyleSheet} from 'react-native'; +import Slider from 'react-native-slider'; +import {Images, AppStyle, C} from '@common/index'; + +export default class SifirSlider extends Component { + state = {value: 20}; + render() { + return ( + + + this.setState({value})} + minimumValue={1} + maximumValue={90} + minimumTrackTintColor="#25b6fa" + maximumTrackTintColor="#412160" + thumbStyle={styles.thumb} + trackStyle={{ + height: 10, + borderRadius: 5, + }} + /> + + + ); + } +} + +const styles = StyleSheet.create({ + timeView: { + flex: 1, + marginTop: 15, + }, + clockImgView: { + justifyContent: 'center', + flexDirection: 'row', + }, + clockImg: {width: 25, height: 25}, + setFeeTxt: {fontSize: 18, marginLeft: 5}, + feeTxt: { + fontSize: 25, + marginVertical: 10, + marginHorizontal: 4, + }, + waitView: { + flexDirection: 'row', + width: '100%', + justifyContent: 'space-between', + }, +}); diff --git a/src/components/elements/SifirSwitch.js b/src/components/elements/SifirSwitch.js new file mode 100644 index 0000000..f45dc49 --- /dev/null +++ b/src/components/elements/SifirSwitch.js @@ -0,0 +1,59 @@ +import React from 'react'; +import {TouchableOpacity, View, Text, StyleSheet} from 'react-native'; + +const SifirSwitch = ({isActive, style, width, setSwitchOn}) => { + return ( + + setSwitchOn(!isActive)} + style={[ + styles.container, + { + ...(isActive ? styles.activeContainer : styles.inactiveContainer), + width: width, + borderRadius: 30, + }, + ]}> + + + + + + ); +}; + +SifirSwitch.defaultProps = { + width: 80, +}; + +export default SifirSwitch; + +const styles = StyleSheet.create({ + activeContainer: { + borderWidth: 1.32, + borderColor: 'rgba(83, 203, 200, 0.5)', + backgroundColor: 'rgba(83, 203, 200, 0.5)', + alignItems: 'flex-end', + }, + inactiveContainer: { + borderWidth: 1.32, + borderColor: '#74797B', + alignItems: 'flex-start', + }, +}); diff --git a/src/components/elements/SifirTransactionsTab.js b/src/components/elements/SifirTransactionsTab.js new file mode 100644 index 0000000..0f68f6d --- /dev/null +++ b/src/components/elements/SifirTransactionsTab.js @@ -0,0 +1,140 @@ +import React, {useState, useEffect, useMemo} from 'react'; +import { + View, + Text, + TouchableOpacity, + Image, + StyleSheet, + FlatList, +} from 'react-native'; +import {Images, AppStyle, C} from '@common/index'; +const SifirTransactionsTab = props => { + const [showContextMenu, setShowContextMenu] = useState(false); + const {headerText, filterMap = [], txnData, renderItem} = props; + const [tabData, setTabData] = useState([]); + const [appliedFilter, setAppliedFilter] = useState(null); + const [filteredData, setFilteredData] = useState([]); + + // fetch data on init + useEffect(() => { + setTabData(txnData); + }, [txnData]); + // auto Filter on new data refresh + useEffect(() => { + if (!tabData?.length || !filterMap?.length) { + return; + } + const {cb, title} = filterMap.find( + ({title: mapFilterTitle}) => mapFilterTitle === appliedFilter, + ) || {cb: null, title: null}; + handleOnFilter({cb, title}); + }, [tabData]); + + const handleOnFilter = ({cb, title}) => { + setAppliedFilter(title); + // TODO + if (title === null) { + setFilteredData(tabData); + return; + } + const filterMapData = cb(tabData); + setFilteredData(filterMapData); + }; + const SifirFilteredTxns = useMemo( + () => ( + + item?.bolt11 + item?.txid + index + item.tx + } + renderItem={renderItem} + /> + ), + [filteredData], + ); + return ( + + {!!filterMap?.length && ( + + {/* TODO make this toucableopacity that resets filter*/} + + {headerText} - {appliedFilter || ''} + + setShowContextMenu(!showContextMenu)}> + + + + )} + {showContextMenu && ( + + {filterMap.map(({title, cb}, index) => ( + <> + handleOnFilter({cb, title})}> + {title} + + {index < filterMap.length - 1 ? ( + + ) : ( + [] + )} + + ))} + + )} + {SifirFilteredTxns} + + ); +}; + +const styles = StyleSheet.create({ + container: { + paddingHorizontal: 20, + }, + txnLblTxt: { + color: 'white', + fontSize: 20, + fontWeight: '700', + marginTop: 10, + }, + headerRow: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginTop: 10, + marginBottom: 10, + }, + filterPopupContainer: { + width: 165, + height: 165, + backgroundColor: 'white', + borderRadius: 10, + alignItems: 'stretch', + justifyContent: 'space-between', + right: 0, + position: 'absolute', + elevation: 10, + zIndex: 10, + top: 50, + }, + popupListItem: { + backgroundColor: 'white', + flex: 1, + padding: 25, + justifyContent: 'center', + borderRadius: 10, + }, + seperator: { + width: '90%', + height: 2, + backgroundColor: '#E0E0E0', + alignSelf: 'center', + }, + listItemLabel: { + fontWeight: 'bold', + }, +}); +export default SifirTransactionsTab; diff --git a/src/components/elements/SifirTxnList.js b/src/components/elements/SifirTxnList.js deleted file mode 100644 index 45fe0b9..0000000 --- a/src/components/elements/SifirTxnList.js +++ /dev/null @@ -1,183 +0,0 @@ -import React from 'react'; -import { - View, - Image, - Text, - StyleSheet, - TouchableOpacity, - FlatList, -} from 'react-native'; -import SifirBTCAmount from '@elements/SifirBTCAmount'; -import moment from 'moment'; -import {Images, AppStyle, C} from '@common/index'; -import {useMemo, useState} from 'react'; -const makeInvoiceRenderData = ({ - decodedBolt11, - meta: {description: desc, status}, -}) => { - let amount, imgURL, description, timeStr; - const {millisatoshis, timestamp} = decodedBolt11; - amount = millisatoshis; - description = desc; - switch (status) { - case 'unpaid': - imgURL = Images.icon_yellowTxn; - break; - case 'paid': - imgURL = Images.icon_thickGreenArrowTxn; - break; - } - timeStr = moment(timestamp * 1000).fromNow(); - return {amount, description, imgURL, timeStr}; -}; - -const makePaysRenderData = ({decodedBolt11, meta: {preimage}}) => { - let amount, imgURL, description, timeStr; - const {millisatoshis, complete, timestamp} = decodedBolt11; - if (complete) { - imgURL = Images.icon_send; - // FIXME strings to constants... - description = `Paid - ${preimage.slice(0, 3)} .. ${preimage.slice(-3)}`; - amount = millisatoshis; - timeStr = moment(timestamp * 1000).fromNow(); - } - return {amount, description, imgURL, timeStr}; -}; - -const makeTxnRenderData = ({category, txid, amount, timereceived}) => { - let imgURL, timeStr, txIDStr; - txIDStr = `${txid.slice(0, 3)} .. ${txid.slice(-3)}`; - if (category) { - switch (category) { - case 'send': - txIDStr = 'Sent - #' + txIDStr; - imgURL = Images.icon_send; - break; - case 'receive': - txIDStr = 'Received - #' + txIDStr; - imgURL = Images.icon_receive; - break; - default: - txIDStr = 'Unknown - #' + txIDStr; - imgURL = Images.icon_receive; - break; - } - } else { - txIDStr = 'Received - #' + txIDStr; - imgURL = Images.icon_receive; - } - timeStr = moment(timereceived * 1000).fromNow(); - return {imgURL, txIDStr, amount, timeStr}; -}; - -// FIXME this file is starting to get conjected , move these to elements -const SifirTxnEntry = ({txn, unit}) => { - const {imgURL, txIDStr, amount, timeStr} = makeTxnRenderData(txn); - return ( - - ); -}; - -const ListItem = ({title, description, imgURL, amount, unit}) => { - return ( - - - - - {title} - {description} - - - - - - - ); -}; -const SifirInvEntry = React.memo(({inv, unit}) => { - const {type} = inv; - try { - const {amount, imgURL, timeStr, description} = - type === 'invoice' ? makeInvoiceRenderData(inv) : makePaysRenderData(inv); - return ( - - ); - } catch (err) { - return null; - } -}); - -/** - * Takes equal slices of invoices and payments decodes them and sorts them - */ -const processLnTxnList = (txnData, start = 0, length = 20) => - [...(txnData?.invoices || []), ...(txnData?.pays || [])] - .filter(txn => txn && txn?.decodedBolt11?.timestamp > 1) - .sort((a, b) => b.decodedBolt11.timestamp - a.decodedBolt11.timestamp) - .slice(start, length); - -const SifirTxnList = ({width, height, unit, txnData, type}) => { - const [txnDataCached, setTxnDataCached] = useState([]); - // FIXME proper array compare - if (txnData.length !== txnDataCached.length) { - setTxnDataCached(txnData); - } - const txnListToRender = React.useMemo(() => { - if (type === C.STR_LN_WALLET_TYPE) { - return processLnTxnList(txnData, 0, 20); - } else { - return txnData; - } - }, [txnDataCached]); - return ( - item?.bolt11 + item?.txid + index} - renderItem={({item}) => { - if (type === C.STR_LN_WALLET_TYPE) { - return ; - } else { - return ; - } - }} - /> - ); -}; - -export default SifirTxnList; - -const styles = StyleSheet.create({ - listItme: { - flex: 1, - flexDirection: 'row', - width: '100%', - height: 50, - borderBottomColor: AppStyle.listViewSep, - borderBottomWidth: 2, - alignItems: 'center', - }, - txIDstr: { - color: AppStyle.mainColor, - fontWeight: 'bold', - }, - amount: { - flex: 2, - color: AppStyle.mainColor, - }, - arrowIcon: {width: 30, height: 30}, - timeStrContainer: {flex: 5, marginLeft: 20}, -}); diff --git a/src/components/elements/SifirWalletButton.js b/src/components/elements/SifirWalletButton.js index f4fc813..c95c6be 100644 --- a/src/components/elements/SifirWalletButton.js +++ b/src/components/elements/SifirWalletButton.js @@ -22,7 +22,6 @@ export default class SifirWalletButton extends Component { pageURL, } = this.props.walletInfo; const {isClicked} = this.state; - return ( { @@ -41,6 +40,7 @@ export default class SifirWalletButton extends Component { height={height}> { + return ( + + + + + {title} + {description} + + + + + + + ); +}; + +const styles = StyleSheet.create({ + listItme: { + flex: 1, + flexDirection: 'row', + width: '100%', + paddingVertical: 5, + // height: 50, + borderBottomColor: '#6B6B6B', + borderBottomWidth: 1, + alignItems: 'center', + }, + txIDstr: { + color: AppStyle.mainColor, + fontWeight: 'bold', + }, + amount: { + flex: 2, + color: AppStyle.mainColor, + textAlign: 'right', + }, + listIcon: {width: 40, height: 40}, + timeStrContainer: {flex: 5, marginLeft: 20}, +}); +export default BtcTxnListItem; diff --git a/src/components/elements/TxnListItems/SifirInvEntry.js b/src/components/elements/TxnListItems/SifirInvEntry.js new file mode 100644 index 0000000..4898cd4 --- /dev/null +++ b/src/components/elements/TxnListItems/SifirInvEntry.js @@ -0,0 +1,63 @@ +import React from 'react'; +import BtcTxnListItem from '@elements/TxnListItems/SifirBtcTxnListItem'; +import {Images} from '@common/index'; +import moment from 'moment'; + +const SifirInvEntry = ({inv, unit}) => { + const {type} = inv; + + const makePaysRenderData = ({decodedBolt11, meta: {preimage}}) => { + let amount, imgURL, description, timeStr; + const isSentTxn = true; + const {millisatoshis, complete, timestamp} = decodedBolt11; + if (complete) { + imgURL = Images.icon_send; + // FIXME strings to constants... + description = `Paid - ${preimage.slice(0, 3)} .. ${preimage.slice(-3)}`; + amount = millisatoshis; + timeStr = moment(timestamp * 1000).fromNow(); + } + return {amount, description, imgURL, timeStr, isSentTxn}; + }; + + const makeInvoiceRenderData = ({ + decodedBolt11, + meta: {description: desc, status}, + }) => { + let amount, imgURL, description, timeStr, isSentTxn; + const {millisatoshis, timestamp} = decodedBolt11; + amount = millisatoshis; + description = desc; + switch (status) { + case 'unpaid': + imgURL = Images.icon_yellowTxn; + isSentTxn = false; + break; + case 'paid': + imgURL = Images.icon_thickGreenArrowTxn; + isSentTxn = true; + break; + } + timeStr = moment(timestamp * 1000).fromNow(); + return {amount, description, imgURL, timeStr, isSentTxn}; + }; + + try { + const {amount, imgURL, timeStr, description, isSentTxn} = + type === 'invoice' ? makeInvoiceRenderData(inv) : makePaysRenderData(inv); + return ( + + ); + } catch (err) { + return null; + } +}; + +export default SifirInvEntry; diff --git a/src/components/elements/TxnListItems/SifirTxnEntry.js b/src/components/elements/TxnListItems/SifirTxnEntry.js new file mode 100644 index 0000000..41e6d43 --- /dev/null +++ b/src/components/elements/TxnListItems/SifirTxnEntry.js @@ -0,0 +1,46 @@ +import React from 'react'; +import BtcTxnListItem from '@elements/TxnListItems/SifirBtcTxnListItem'; +import {Images} from '@common/index'; +import moment from 'moment'; + +const SifirTxnEntry = ({txn, unit}) => { + const makeTxnRenderData = ({category, txid, amount, timereceived}) => { + let imgURL, timeStr, txIDStr; + txIDStr = `${txid.slice(0, 3)} .. ${txid.slice(-3)}`; + if (category) { + switch (category) { + case 'send': + // TODO str to constants + txIDStr = 'Sent - #' + txIDStr; + imgURL = Images.icon_send; + break; + case 'receive': + txIDStr = 'Received - #' + txIDStr; + imgURL = Images.icon_receive; + break; + default: + txIDStr = 'Unknown - #' + txIDStr; + imgURL = Images.icon_receive; + break; + } + } else { + txIDStr = 'Received - #' + txIDStr; + imgURL = Images.icon_receive; + } + timeStr = moment(timereceived * 1000).fromNow(); + return {imgURL, txIDStr, amount, timeStr}; + }; + + const {imgURL, txIDStr, amount, timeStr} = makeTxnRenderData(txn); + return ( + + ); +}; + +export default SifirTxnEntry; diff --git a/src/components/elements/TxnListItems/SifirUnspentCoinEntry.js b/src/components/elements/TxnListItems/SifirUnspentCoinEntry.js new file mode 100644 index 0000000..3319fc5 --- /dev/null +++ b/src/components/elements/TxnListItems/SifirUnspentCoinEntry.js @@ -0,0 +1,37 @@ +import React, {useState} from 'react'; +import UnspentCoinListItem from '@elements/TxnListItems/SifirUnspentCoinListItem'; +import {Images} from '@common/index'; + +const SifirUnspentCoinEntry = ({utxo, unit}) => { + try { + const { + amount, + address, + confirmed, + label, + anonymitySet, + txid, + anonsetLabel = 'AnonimitySet', + } = utxo; + // TODO add multiSelect list and use following icon + const imgURL = confirmed ? Images.icon_confirmed : Images.icon_unconfirmed; + return ( + + ); + } catch (err) { + return null; + } +}; + +export default SifirUnspentCoinEntry; diff --git a/src/components/elements/TxnListItems/SifirUnspentCoinListItem.js b/src/components/elements/TxnListItems/SifirUnspentCoinListItem.js new file mode 100644 index 0000000..4586620 --- /dev/null +++ b/src/components/elements/TxnListItems/SifirUnspentCoinListItem.js @@ -0,0 +1,81 @@ +import React from 'react'; +import {View, Text, TouchableOpacity, Image, StyleSheet} from 'react-native'; +import SifirBTCAmount from '@elements/SifirBTCAmount'; +import {Images, AppStyle, C} from '@common/index'; + +const UnspentCoinListItem = ({ + amount, + anonsetLabel = 'AnonimitySet', + anonSet, + label, + txid, + confirmed, + leftIcon, + rightIcon, + unit, +}) => { + return ( + + + + + + + + + + {' '} {anonsetLabel}: {anonSet} + + + {label} + + TX ID {txid} + + + + + + ); +}; + +const styles = StyleSheet.create({ + listItem: { + flex: 1, + flexDirection: 'row', + width: '100%', + paddingVertical: 5, + // height: 50, + borderBottomColor: '#6B6B6B', + borderBottomWidth: 1, + alignItems: 'center', + }, + listIcon: {width: 40, height: 40}, + timeStrContainer: {flex: 5, marginLeft: 20}, + annonSet: { + color: '#82C9C6', + fontWeight: 'bold', + fontSize: 13, + }, + unspentAmount: { + color: '#fff', + fontWeight: 'bold', + }, + label: { + color: '#fff', + fontSize: 13, + }, + txid: { + marginTop: 5, + color: AppStyle.mainColor, + }, + bold: {fontWeight: 'bold'}, +}); + +export default UnspentCoinListItem; diff --git a/src/components/elements/TxnListItems/SifirWasabiTxnEntry.js b/src/components/elements/TxnListItems/SifirWasabiTxnEntry.js new file mode 100644 index 0000000..903f24b --- /dev/null +++ b/src/components/elements/TxnListItems/SifirWasabiTxnEntry.js @@ -0,0 +1,26 @@ +import React from 'react'; +import BtcTxnListItem from '@elements/TxnListItems/SifirBtcTxnListItem'; +import {Images, C} from '@common/index'; +import moment from 'moment'; + +const SifirWasabiTxnEntry = ({txn, unit}) => { + try { + const {amount, datetime, label} = txn; + const imgURL = amount > 0 ? Images.icon_yellowTxn : Images.icon_send; + const isSentTxn = amount > 0 ? false : true; + return ( + + ); + } catch (err) { + return null; + } +}; + +export default SifirWasabiTxnEntry; diff --git a/src/components/elements/deprecated/SifirAccountHistory.js b/src/components/elements/deprecated/SifirAccountHistory.js new file mode 100644 index 0000000..265eff3 --- /dev/null +++ b/src/components/elements/deprecated/SifirAccountHistory.js @@ -0,0 +1,198 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, {useCallback, useMemo, useState, useEffect} from 'react'; +import {View, Image, StyleSheet, Text, ActivityIndicator} from 'react-native'; +import {Images, AppStyle, C} from '@common/index'; +import SifirTransactions from '@elements/SifirTransactions'; +import BottomSheet from 'reanimated-bottom-sheet'; +import {TabView, SceneMap, TabBar} from 'react-native-tab-view'; +import {ScrollView} from 'react-native-gesture-handler'; + +export const sheetHeight = C.SCREEN_HEIGHT - 150; +const initialSnap = C.SCREEN_HEIGHT * 0.35; +const initialLayout = {width: C.SCREEN_WIDTH}; + +const renderTabBar = props => ( + ( + + {label.route.title} + + )} + /> +); + +const SifirAccountHistory = ({ + loading, + loaded, + txnData, + btcUnit, + type, + headerText, + bottomExtraSpace, +}) => { + const [index, setIndex] = useState(0); + const [filteredTxns, setFilteredTxns] = useState(txnData); + const [routes] = useState([ + {key: 'transactions', title: 'Transactions'}, + {key: 'unspentCoins', title: 'Unspent Coins'}, + {key: 'labeledAddress', title: 'Labeled Addresses'}, + ]); + useEffect(() => { + setFilteredTxns(txnData); + }, [txnData]); + + const filterWasabiTxnData = filter => { + if (type === C.STR_WASABI_WALLET_TYPE && txnData?.transactions?.length) { + const tempTxnData = {...txnData}; + if (filter === 'received') { + const receivedTxns = tempTxnData.transactions.filter(txn => { + return txn.amount > 0; + }); + tempTxnData.transactions = receivedTxns; + setFilteredTxns(tempTxnData); + } else if (filter === 'sent') { + const sentTxns = tempTxnData.transactions.filter(txn => { + return txn.amount < 0; + }); + tempTxnData.transactions = sentTxns; + setFilteredTxns(tempTxnData); + } else { + setFilteredTxns(txnData); + } + } else { + setFilteredTxns(txnData); + } + }; + + const Transactions = useCallback(() => { + return ( + + + + ); + }, [txnData, filteredTxns]); + + const UnspentCoins = useCallback( + () => ( + + + + ), + [txnData], + ); + const LabeledAddresses = useCallback( + () => ( + + ), + [txnData], + ); + const renderScene = useMemo( + () => + SceneMap({ + transactions: Transactions, + unspentCoins: UnspentCoins, + labeledAddress: LabeledAddresses, + }), + [filteredTxns], + ); + return ( + 100 ? bottomExtraSpace - 20 : initialSnap, + ]} + initialSnap={1} + enabledInnerScrolling={true} + enabledGestureInteraction={true} + renderContent={() => ( + + + {!loading && ( + // TODO change upArrow to down arrow when slider is opened. + + )} + {loading && ( + + )} + + + + )} + /> + ); +}; + +const styles = StyleSheet.create({ + settingIcon: {width: 20, height: 20, marginLeft: 20, marginTop: 7}, + spinner: {alignSelf: 'center'}, + headerContainer: { + backgroundColor: '#122C3A', + borderTopLeftRadius: 30, + borderTopRightRadius: 30, + justifyContent: 'center', + alignItems: 'center', + paddingTop: 10, + }, + tabTitleLabel: {fontWeight: 'bold'}, + sceneContainer: { + backgroundColor: AppStyle.tertiaryColor, + }, + tabIndicatorContainerStyle: { + borderBottomColor: AppStyle.grayColor, + borderBottomWidth: 3, + opacity: 0.5, + }, + tabIndicator: { + backgroundColor: AppStyle.mainColor, + bottom: -2, + }, + tabBar: { + backgroundColor: AppStyle.tertiaryColor, + }, +}); + +export default SifirAccountHistory; diff --git a/src/components/elements/deprecated/SifirTxnList.js b/src/components/elements/deprecated/SifirTxnList.js new file mode 100644 index 0000000..d801e59 --- /dev/null +++ b/src/components/elements/deprecated/SifirTxnList.js @@ -0,0 +1,33 @@ +/* @DEPRECATED + * contents moved to sifirtransacotins + * */ +import React, {useState} from 'react'; +import {StyleSheet, FlatList} from 'react-native'; + +// I think this gets moved one level up to SifirTransactions , onFilter can set the data it will render after each filter returns +const SifirTxnList = ({txnData, renderItem, processData}) => { + const [txnDataCached, setTxnDataCached] = useState([]); + // FIXME proper array compare + if (txnData.length !== txnDataCached.length) { + setTxnDataCached(txnData); + } + const txnListToRender = React.useMemo(() => { + return processData(txnData, 0, 20); + }, [txnDataCached]); + return ( + + item?.bolt11 + item?.txid + index + item.tx + } + renderItem={({item}) => { + return renderItem(item); + }} + /> + ); +}; + +export default SifirTxnList; + +const styles = StyleSheet.create({}); diff --git a/src/components/screens/auth/UnlockORGenKeys.js b/src/components/screens/auth/UnlockORGenKeys.js index e026ea6..4947dda 100644 --- a/src/components/screens/auth/UnlockORGenKeys.js +++ b/src/components/screens/auth/UnlockORGenKeys.js @@ -32,7 +32,7 @@ class UnlockORGenKeys extends Component { state = { scannedToken: this.props.route.params.scannedToken, encAuthInfo: this.props.route.params.encAuthInfo || null, - passphrase: '', + passphrase: 'oooooo', //TODO HAMZA reset before PR retryablePairingError: '', }; diff --git a/src/components/screens/wallet/SifirAccountScreen.js b/src/components/screens/wallet/SifirAccountScreen.js index 2556473..aefa712 100644 --- a/src/components/screens/wallet/SifirAccountScreen.js +++ b/src/components/screens/wallet/SifirAccountScreen.js @@ -1,201 +1,494 @@ -import React from 'react'; -import {View, Image, StyleSheet, TouchableOpacity, Text} from 'react-native'; +import React, {useState, useCallback, useEffect, useMemo} from 'react'; +import {useNavigation} from '@react-navigation/native'; +import { + View, + Image, + StyleSheet, + TouchableOpacity, + Text, + ScrollView, + Alert, +} from 'react-native'; import {connect} from 'react-redux'; import {Images, AppStyle, C} from '@common/index'; import {getWalletDetails} from '@actions/btcwallet'; import {getLnWalletDetails} from '@actions/lnWallet'; +import {getUnspentCoins, getTxns as wasabiGetTxns} from '@actions/wasabiWallet'; +import { + getWasabiAutoSpendWallet, + setWasabiAutoSpendWalletAndAnonset, + getWasabiAutoSpendMinAnonset, +} from '@actions/cnClient'; import SifirAccountHeader from '@elements/SifirAccountHeader'; +import SifirAccountChart from '@elements/SifirAccountChart'; import SifirAccountActions from '@elements/SifirAccountActions'; -import SifirAccountHistory from '@elements/SifirAccountHistory'; +import SifirAccountHistoryTabs, { + sheetHeight, +} from '@structures/SifirAccountHistoryTabs'; import SifirSettingModal from '@elements/SifirSettingModal'; import {ErrorScreen} from '@screens/error'; +import debounce from '../../../helpers/debounce'; -class SifirAccountScreen extends React.Component { - constructor(props, context) { - super(props, context); - } - state = { - balance: 0, - txnData: [], - isVisibleSettingsModal: false, - }; - stopLoading = null; +const SifirAccountScreen = props => { + const [balance, setBalance] = useState(0); + const [dataLoaded, setDataLoaded] = useState(null); + const [chartLoaded, setChartLoaded] = useState(true); + const [isVisibleSettingsModal, setIsVisibleSettingsModal] = useState(false); + const [anonset, setAnonset] = useState(0); + const [bottomExtraSpace, setBottomExtraSpace] = useState(sheetHeight); + const [showAccountHistory, setShowAccountHistory] = useState(false); + const navigation = useNavigation(); + const {walletInfo} = props.route.params; + const {navigate} = navigation; - async _loadWalletFromProps() { - const {label, type} = this.props.route.params.walletInfo; - if (type === C.STR_LN_WALLET_TYPE) { - const {balance, txnData} = await this.props.getLnWalletDetails({label}); - this.setState({balance, txnData}); - } else { - const {balance, txnData} = await this.props.getWalletDetails({ - label, - type, - }); - this.setState({balance, txnData}); + const _loadWalletFromProps = async () => { + setDataLoaded(null); + const {label, type} = walletInfo; + switch (type) { + case C.STR_LN_WALLET_TYPE: + let {balance: lnBalance} = await props.getLnWalletDetails({label}); + setBalance(lnBalance); + setDataLoaded({}); + setShowAccountHistory(true); + break; + case C.STR_SPEND_WALLET_TYPE: + case C.STR_WATCH_WALLET_TYPE: + let {balance: walletBalance} = await props.getWalletDetails({ + label, + type, + }); + setBalance(walletBalance); + setDataLoaded({}); + setShowAccountHistory(true); + break; + case C.STR_WASABI_WALLET_TYPE: + const [ + , + , + autoSpendWallet, + autoSpendWalletMinAnonset, + ] = await Promise.all([ + props.getUnspentCoins(), + props.wasabiGetTxns(), + props.getWasabiAutoSpendWallet(), + props.getWasabiAutoSpendMinAnonset(), + ]); + setDataLoaded({autoSpendWallet, autoSpendWalletMinAnonset}); + setShowAccountHistory(true); + //if (!state.showAccountHistory) { + // setTimeout(() => { + // setState({showAccountHistory: true}); + // }, 100); + //} + break; } - } + }; + useEffect(() => { + _loadWalletFromProps(); + }, []); - componentDidMount() { - const {_loadWalletFromProps} = this; - this.stopLoading = this.props.navigation.addListener( - 'focus', - _loadWalletFromProps.bind(this), - ); - } + const toggleSettingsModal = () => + setIsVisibleSettingsModal(!isVisibleSettingsModal); - componentWillUnmount() { - this.stopLoading(); - } - toggleSettingsModal() { - this.setState({isVisibleSettingsModal: !this.state.isVisibleSettingsModal}); - } - - handleReceiveButton = () => { - const {walletInfo} = this.props.route.params; - this.props.navigation.navigate('BtcReceiveTxn', {walletInfo}); + const handleReceiveButton = () => { + navigate('BtcReceiveTxn', {walletInfo}); }; - handleSendBtn = () => { - const {walletInfo} = this.props.route.params; + const handleSendBtn = () => { const {type} = walletInfo; - const {balance} = this.state; - if (type === C.STR_LN_WALLET_TYPE) { - this.props.navigation.navigate('LNPayInvoiceRoute', { - screen: 'LnScanBolt', - params: {walletInfo: {...walletInfo, balance}}, - }); - } else { - this.props.navigation.navigate('GetAddress', { - walletInfo: {...walletInfo, balance}, - }); + switch (type) { + case C.STR_LN_WALLET_TYPE: + navigate('LNPayInvoiceRoute', { + screen: 'LnScanBolt', + params: {walletInfo: {...walletInfo, balance}}, + }); + break; + case C.STR_WASABI_WALLET_TYPE: + navigate('GetAddress', { + walletInfo: {...walletInfo, balance, anonset}, + }); + break; + default: + navigate('GetAddress', { + walletInfo: {...walletInfo, balance}, + }); + break; } }; - render() { - const {balance, txnData} = this.state; - const {navigate} = this.props.navigation; - const {walletInfo} = this.props.route.params; - const {label, type} = walletInfo; - const {loading, loaded, error: errorBtc} = this.props.btcWallet; - const { - loading: loadingLN, - loaded: loadedLN, - error: errorLN, - } = this.props.lnWallet; - const btcUnit = type === C.STR_LN_WALLET_TYPE ? C.STR_MSAT : C.STR_BTC; - const isLoading = type === C.STR_LN_WALLET_TYPE ? loadingLN : loading; - const isLoaded = type === C.STR_LN_WALLET_TYPE ? loadedLN : loaded; - const hasError = type === C.STR_LN_WALLET_TYPE ? errorLN : errorBtc; - const {toggleSettingsModal} = this; - if (hasError) { - return ( - { + setAnonset(Math.floor(anonset)); + setBalance(value); + setChartLoaded(true); + }, 1), + [], + ); + const onExtraSpaceLayout = event => { + const {height} = event.nativeEvent.layout; + setBottomExtraSpace(height); + }; + + const {label, type} = walletInfo; + + // Account stuff that depends on data load, IE Function only changes on Walletinfo change but runs every update + // const walletDataCb = useCallback(() => { + const { + isLoading = true, + isLoaded = false, + hasError = null, + dataMap = [], + filterMap = [], + chartData = null, + settingModalProps = {}, + } = useMemo(() => { + if (!dataLoaded) { + return {}; + } + switch (type) { + case C.STR_LN_WALLET_TYPE: + return { + isLoading: props.lnWallet.loading, + isLoaded: props.lnWallet.loaded, + hasError: props.lnWallet.error, + settingModalProps: { + toolTipStyle: false, + showOpenChannel: true, + showTopUp: true, + showWithdraw: true, + }, + dataMap: [ { - text: C.STR_TRY_AGAIN, - onPress: () => this._loadWalletFromProps(), + key: C.STR_LN_WALLET_TYPE, + title: 'Invoices & Payments', + data: [ + ...(props.lnWallet?.invoices || []), + ...(props.lnWallet?.pays || []), + ] + .filter(txn => txn && txn?.decodedBolt11?.timestamp > 1) + .sort( + (a, b) => + b.decodedBolt11.timestamp - a.decodedBolt11.timestamp, + ), }, { - text: C.STR_GO_BACK, - onPress: () => navigate('AccountList'), + key: C.STR_UNSPENT_COINS, + title: 'Unspent Outputs', + data: (props.lnWallet?.outputs || []).map( + ({txid, value, address, status, blockheight}) => ({ + amount: value, + confirmed: status === 'confirmed', + label: address, + anonsetLabel: 'Block', + anonymitySet: blockheight, + txid, + }), + ), }, - ]} - /> - ); + ], + filterMap: [ + { + title: 'Invoices', + cb: (data, param) => data.filter(txn => txn.type === 'invoice'), + }, + { + title: 'Payments', + cb: (data, param) => data.filter(txn => txn.type === 'pay'), + }, + ], + }; + case C.STR_WASABI_WALLET_TYPE: + return { + isLoading: + props.cyphernode.loading || + (props.wasabiWallet.loading && !chartLoaded), + isLoaded: props.wasabiWallet.loaded && chartLoaded, + hasError: props.wasabiWallet.error, + chartData: props.wasabiWallet.unspentCoinsList?.unspentcoins?.length + ? props.wasabiWallet.unspentCoinsList.unspentcoins + : null, + settingModalProps: { + // isLoading: props.wasabiWallet.loading, + menuItems: [ + { + label: `Auto Send: ${ + dataLoaded?.autoSpendWallet + ? dataLoaded.autoSpendWallet + + '(' + + dataLoaded?.autoSpendWalletMinAnonset + + ')' + : 'Disabled' + }`, + onPress: () => { + toggleSettingsModal.apply(this); + navigate('WalletSelectMenu', { + onBackPress: async ({ + isSwitchOn, + selectedWallet, + anonSetValue, + }) => { + // if user toggled autospend off when it was on, then dispatch + if (!isSwitchOn && dataLoaded.autoSpendWallet) { + await props.setWasabiAutoSpendWalletAndAnonset({ + label: null, + }); + Alert.alert( + `Auto Send Disabled`, + `Auto spend has been disabled, coins will no longer be sent to your ${ + dataLoaded.autoSpendWallet + } wallet`, + ); + _loadWalletFromProps(); + } + navigation.pop(); + setIsVisibleSettingsModal(false); + }, + onConfirm: async ({ + selectedWallet, + anonset: autoSpendAnonset, + }) => { + await props.setWasabiAutoSpendWalletAndAnonset({ + label: selectedWallet.label, + anonset: autoSpendAnonset, + }); + _loadWalletFromProps(); + Alert.alert( + `Auto Send To Wallet: ${selectedWallet.label}`, + `Coins reaching An anonymity set of ${autoSpendAnonset} will be automagically sent to your wallet: ${ + selectedWallet.label + } - ${selectedWallet.desc}.`, + ); + navigation.pop(); + setIsVisibleSettingsModal(false); + }, + walletList: props.btcWallet.btcWalletList?.filter( + ({type: walletType}) => + walletType !== C.STR_WASABI_WALLET_TYPE, + ), + autoSpendWallet: dataLoaded?.autoSpendWallet, + autoSpendWalletMinAnonset: + dataLoaded?.autoSpendWalletMinAnonset, + }); + }, + }, + ], + }, + filterMap: [ + { + title: 'Recieved', + cb: (data, param) => data.filter(txn => txn.amount > 0), + }, + { + title: 'Sent', + cb: (data, param) => data.filter(txn => txn.amount < 0), + }, + ], + dataMap: [ + { + key: C.STR_WASABI_WALLET_TYPE, + title: 'Transactions', + // TODO can we make this an FN call rather than data ? So we can call it later + data: props.wasabiWallet.txnsList, + }, + { + key: C.STR_UNSPENT_COINS, + title: 'Unspent Coins', + data: props.wasabiWallet.unspentCoinsList?.unspentcoins, + }, + ], + }; + default: + return { + isLoading: props.btcWallet.loading, + isLoaded: props.btcWallet.loaded, + hasError: props.btcWallet.error, + filterMap: [ + { + title: 'Recieved', + cb: (data, param) => + data.filter(txn => { + return txn.amount > 0; + }), + }, + { + title: 'Sent', + cb: (data, parma) => + data.filter(txn => { + return txn.amount < 0; + }), + }, + ], + dataMap: [ + { + key: type, + title: 'Transactions', + data: props.btcWallet.txnData, + }, + ], + }; + } + }, [dataLoaded]); + // Aâccount data that is more static, IE values only need to be re-evaluated on walletInfo change + const { + accountIcon, + accountIconOnPress, + accountHeaderText, + accountTransactionHeaderText, + accountActionSendLabel = C.STR_SEND, + btcUnit, + } = useMemo(() => { + switch (type) { + case C.STR_LN_WALLET_TYPE: + return { + accountIcon: Images.icon_light, + accountIconOnPress: toggleSettingsModal.bind(this), + accountHeaderText: C.STR_Balance_Channels_n_Outputs, + accountTransactionHeaderText: C.STR_INVOICES_AND_PAYS, + btcUnit: C.STR_MSAT, + accountActionSendLabel: 'Pay Invoice', + }; + case C.STR_WASABI_WALLET_TYPE: + return { + accountIcon: Images.icon_wasabi, + accountIconOnPress: toggleSettingsModal.bind(this), + accountHeaderText: C.STR_Wasabi_Header + anonset, + accountTransactionHeaderText: C.STR_ALL_TRANSACTIONS, + btcUnit: C.STR_SAT, + // only show chart when more than one unspentcoin + }; + default: + return { + accountHeaderText: C.STR_Cur_Balance, + accountIcon: Images.icon_bitcoin, + accountIconOnPress: () => {}, + accountTransactionHeaderText: C.STR_TRANSACTIONS, + btcUnit: C.STR_BTC, + }; } + }, [walletInfo, anonset]); + if (hasError) { return ( - - - + _loadWalletFromProps(), + }, + { + text: C.STR_GO_BACK, + onPress: () => navigate('AccountList'), + }, + ]} + /> + ); + } + return ( + + + + + + navigate('AccountList')}> + + {C.STR_My_Wallets} + + + + {isVisibleSettingsModal && ( navigate('AccountList')}> - - {C.STR_My_Wallets} + style={styles.settingMenuContainer} + onTouchEnd={toggleSettingsModal}> + - - - {this.state.isVisibleSettingsModal && ( - - + {!!chartData && ( + - + )} + + + {/* TODO fix this hack to Calculate initial snap position to HistoryTabs - Load it when nochartdata or when chart and is loaded */} + {(!chartData || (!!chartData && chartLoaded)) && ( + )} - {} - } - loading={isLoading} - loaded={isLoaded} - type={type} - label={label} - balance={balance} - btcUnit={btcUnit} - headerText={ - type === C.STR_LN_WALLET_TYPE - ? C.STR_Balance_Channels_n_Outputs - : C.STR_Cur_Balance - } - /> - - + {showAccountHistory && ( + - - ); - } -} + )} + + ); +}; const mapStateToProps = state => { return { btcWallet: state.btcWallet, lnWallet: state.lnWallet, + wasabiWallet: state.wasabiWallet, + cyphernode: state.cyphernode, }; }; const mapDispatchToProps = { getWalletDetails, getLnWalletDetails, + getUnspentCoins, + wasabiGetTxns, + getWasabiAutoSpendWallet, + getWasabiAutoSpendMinAnonset, + setWasabiAutoSpendWalletAndAnonset, }; export default connect( @@ -204,11 +497,21 @@ export default connect( )(SifirAccountScreen); const styles = StyleSheet.create({ - navBtn: {flex: 0.7}, + navBtn: { + marginBottom: 10, + }, + extraSpace: { + flexGrow: 1, + }, + SVcontainer: { + backgroundColor: AppStyle.backgroundColor, + flexGrow: 1, + }, mainView: { flex: 1, - backgroundColor: AppStyle.backgroundColor, + backgroundColor: '#091110', paddingTop: 10, + justifyContent: 'space-between', }, backNavView: { display: 'flex', diff --git a/src/components/screens/wallet/SifirAccountsListScreen.js b/src/components/screens/wallet/SifirAccountsListScreen.js index dfb2d7d..e94ee2d 100644 --- a/src/components/screens/wallet/SifirAccountsListScreen.js +++ b/src/components/screens/wallet/SifirAccountsListScreen.js @@ -11,6 +11,7 @@ import {connect} from 'react-redux'; import SifirWalletButton from '@elements/SifirWalletButton'; import {getBtcWalletList, getBlockChainInfo} from '@actions/btcwallet'; import {getLnNodesList} from '@actions/lnWallet'; +import {getConfigProps} from '@actions/cnClient'; import {Images, AppStyle, C} from '@common/index'; import {ErrorScreen} from '@screens/error'; import SifirSettingModal from '@elements/SifirSettingModal'; @@ -26,6 +27,8 @@ class SifirAccountsListScreen extends React.Component { _init = () => { this.props.getBtcWalletList(); this.props.getLnNodesList(); + // TODO walletlists should be a config prop when settings are moved there + this.props.getConfigProps(); }; componentDidMount() { @@ -211,6 +214,7 @@ const mapDispatchToProps = { getBtcWalletList, getLnNodesList, getBlockChainInfo, + getConfigProps, }; export default connect( diff --git a/src/components/screens/wallet/SifirBtcReceiveTxnScreen.js b/src/components/screens/wallet/SifirBtcReceiveTxnScreen.js index cc7af33..f8705fb 100644 --- a/src/components/screens/wallet/SifirBtcReceiveTxnScreen.js +++ b/src/components/screens/wallet/SifirBtcReceiveTxnScreen.js @@ -1,4 +1,4 @@ -import React, {Component} from 'react'; +import React, {useEffect, useRef, useState} from 'react'; import { View, Image, @@ -7,6 +7,8 @@ import { Text, FlatList, ActivityIndicator, + TextInput, + Clipboard, } from 'react-native'; import {connect} from 'react-redux'; import Overlay from 'react-native-modal-overlay'; @@ -14,332 +16,457 @@ import SifirQRCode from '@elements/SifirQRCode'; import Share from 'react-native-share'; import {getWalletAddress} from '@actions/btcwallet'; -import {getNewAddress} from '@actions/lnWallet'; +import {getNewAddress as getNewLnAddress} from '@actions/lnWallet'; +import {getNewAddress as getNewWasabiAddress} from '@actions/wasabiWallet'; import {Images, AppStyle, C} from '@common/index'; import {log} from '@io/events/'; import {ErrorScreen} from '@screens/error'; +const SifirBtcReceiveTxnScreen = props => { + const {label, type, meta: cfg} = props.route.params.walletInfo; + const spendingAddressTypes = [ + {title: C.STR_LEGACY, value: 'legacy'}, + {title: C.STR_Segwit_Compatible, value: 'p2sh-segwit'}, + {title: C.STR_Bech32, value: 'bech32'}, + ]; + // const [getBtnStatus, setBtnStatus] = useState(0); + const [enableLabelInput, setEnableLabelInput] = useState( + cfg?.enableAddressLabelInput || false, + ); + const [enableAddressTypeSelection, setEnableAddressTypeSelection] = useState( + cfg?.enableAddressTypeSelection || false, + ); + const [enableAddressWatchSelection, setAddressWatchSelection] = useState( + false, + ); + const [showAddressTypeSelector, setShowAddressTypeSelector] = useState( + cfg?.showAddressTypeSelector || false, + ); + const [showQRCode, setShowQRCode] = useState(true); + const [addAddressToWatch, setAddAddressToWatch] = useState(false); + const [showShareSelector, setShowShareSelector] = useState(false); + const [addrType, setAddrType] = useState(null); + const [labelInput, setLabelInput] = useState(''); + const [labelInputDone, setLabelInputDone] = useState(false); + const [address, setAddress] = useState(''); + const [loading, setLoading] = useState(false); + const [loaded, setLoaded] = useState(false); + const [error, setError] = useState(null); + const [qrCodeURI, setQrCodeURI] = useState(null); + const [refresh, setRefresh] = useState(0); + const [addressMessage, setAddressMessage] = useState(null); + const prevRefreshValue = useRef(); -class SifirBtcReceiveTxnScreen extends Component { - constructor(props) { - super(props); - this.qrCode = ''; - } - - state = { - btnStatus: 0, - modalVisible: false, - checkStatus: true, - addrType: C.STR_SELECT_ADDRTYPE, - showQRCode: false, - showSelector: false, - enableWatchSelection: false, - }; - - async _bootStrap() { - const {label, type} = this.props.route.params.walletInfo; - if (type === C.STR_WATCH_WALLET_TYPE) { - await this.props.getWalletAddress({label, type}); - this.setState({showQRCode: true}); - } else if (type === C.STR_LN_WALLET_TYPE) { - await this.props.getNewAddress(); - this.setState({showQRCode: true}); + useEffect(() => { + loadWalletAddress(); + }, []); + // }, [labelInputDone, addrType]); + // load new address + useEffect(() => { + let loadNew = false; + if (refresh > 0 && refresh > prevRefreshValue.current) { + loadNew = true; } - } - componentDidMount() { - this._bootStrap(); - } + loadWalletAddress({loadNew}); + prevRefreshValue.current = refresh; + }, [refresh]); - onClose = () => this.setState({modalVisible: false, showSelector: false}); + const onClose = () => { + setShowAddressTypeSelector(false); + setShowShareSelector(false); + }; - onShare = (address, isQRCode) => { - this.setState({showSelector: false}); - if (this.qrCode) { + const onShare = (sharedAddress, isQRCode) => { + setShowShareSelector(false); + if (qrCodeURI) { let shareOptions; if (isQRCode) { shareOptions = { - type: 'image/jpg', + type: 'image/png', title: C.STR_ADDR_QR_SHARE, - url: this.qrCode, + url: qrCodeURI, }; } else { shareOptions = { title: C.STR_ADDR_SHARE, - message: address, + message: sharedAddress, }; } Share.open(shareOptions).catch(err => log(err)); } }; - getSpendWalletAddr = async addrType => { - const {label, type} = this.props.route.params.walletInfo; - await this.props.getWalletAddress({label, type, addrType}); - this.setState({showQRCode: true}); + const handleBackBtn = () => { + props.navigation.goBack(); }; - - handleBackBtn = () => { - const {walletInfo} = this.props.route.params; - const {type} = walletInfo; - const {navigation} = this.props; - // if (type === C.STR_WATCH_WALLET_TYPE) { - // navigation.navigate('Account', {walletInfo}); - // } else { - navigation.goBack(); - // } + const inputLabel = input => { + setLabelInput(input); + setLabelInputDone(false); }; - - render() { - const {walletInfo} = this.props.route.params; - const {label, type} = walletInfo; - const {showQRCode, enableWatchSelection} = this.state; - let loaded, loading, address, error; - if (type === C.STR_LN_WALLET_TYPE) { - ({loaded, loading, address, error} = this.props.lnWallet); - } else { - ({loaded, loading, address, error} = this.props.btcWallet); + const loadWalletAddress = async ({loadNew = false} = {}) => { + let hasAllReqs = true; + // Check if we're ready based on reqs + if (enableAddressTypeSelection) { + hasAllReqs = + hasAllReqs && + addrType && + addrType?.value?.length && + addrType.value !== C.STR_SELECT_ADDRTYPE; } - if (error) { - return ( - this._bootStrap(), - }, - { - text: C.GO_BACK, - onPress: () => this.navigation.navigate('Account', {label, type}), - }, - ]} - /> - ); + if (enableLabelInput) { + hasAllReqs = hasAllReqs && labelInput?.length && labelInputDone; } + if (hasAllReqs !== true) { + return; + } + if (!!address?.length && !loadNew) { + return; + } + let walletAddress; + let addressError; + setLoading(true); + switch (type) { + case C.STR_LN_WALLET_TYPE: + walletAddress = props.getNewLnAddress(); + addressError = props.lnWallet.error; + break; + case C.STR_WASABI_WALLET_TYPE: + walletAddress = props + .getNewWasabiAddress({ + label: labelInput, + }) + .then(({address}) => address); + addressError = props.wasabiWallet.error; + break; + default: + walletAddress = props.getWalletAddress({ + label, + type, + addrType: addrType?.value, + }); + addressError = props.btcWallet.error; + break; + } + const addressText = await walletAddress; + log('assa', addressText, addressError); + if (addressText?.length) { + setAddress(addressText); + setLoaded(true); + } else { + setError(addressError); + setLoaded(false); + } + setLoading(false); + }; + if (error) { return ( - - - this.handleBackBtn()}> - - - - {label} Wallet - - - - - - - - {type === C.STR_SPEND_WALLET_TYPE && ( - - this.setState({modalVisible: true})}> - - {this.state.addrType} - - - - { - this.setState({modalVisible: !this.state.modalVisible}); - }}> - - - - - + setError(null), + }, + { + text: C.STR_GO_BACK, + onPress: () => props.navigation.navigate('Account', {label, type}), + }, + ]} + /> + ); + } + return ( + + + handleBackBtn()}> + + + + {label} Wallet - )} - - {address !== null && loaded === true && showQRCode === true && ( - <> - - { - this.qrCode = base64; - }} - value={address} - size={C.SCREEN_HEIGHT * 0.25} - bgColor="#FFFFFF" - fgColor="#000000" + + + + + + {!loading && enableLabelInput === true && ( + <> + {!labelInputDone && ( + + inputLabel(input)} /> - {address} - - )} - - {loading === true && ( - - - - )} - - {address != null && loaded === true && ( - <> - {enableWatchSelection === true && ( - - {C.STR_WATCH_ADDR} - - this.setState({checkStatus: !this.state.checkStatus}) - }> - - - {this.state.checkStatus === true && ( - - )} - - - - )} + )} + {!labelInputDone && ( { - this.setState({showSelector: true}); + if (labelInputDone) { + setAddress(null); + setLabelInput(''); + setLabelInputDone(false); + } else { + setLabelInputDone(true); + setRefresh(refresh + 1); + } }} - style={styles.shareBtnOpa}> + style={styles.labelButtonCTA}> - {C.STR_SHARE} - + + {labelInputDone ? 'Generate another' : 'Save and Generate'} + - - )} + )} + + )} + {enableAddressTypeSelection === true && ( + + setShowAddressTypeSelector(true)}> + + {addrType?.title || C.STR_SELECT_ADDRTYPE} + + + + { + setShowAddressTypeSelector(!showAddressTypeSelector); + }}> + + + + + + + )} + {loading === true && ( + + + + )} - {/* Select share type */} - - {() => ( + {!loading && !!address && showQRCode && ( + <> + + + + { + await Clipboard.setString(address); + setAddressMessage('Address Copied to Clipboard!'); + setTimeout(() => setAddressMessage(null), 1500); + }} + onLongPress={() => setRefresh(refresh + 1)}> + {address} + + {addressMessage?.length && ( - - - { - this.onShare(address, true); - }}> - - {C.STR_ADDR_QR_SHARE} - - - { - this.onShare(address, false); - }}> - - {C.STR_ADDR_SHARE} - - - - - - + {addressMessage} + + )} + {labelInputDone && ( + <> + + {`Label: ${labelInput}`} + { + setAddress(null); + setLabelInput(''); + setLabelInputDone(false); + }}> + + )} + + )} + {!loading && !!address && ( + <> + {enableAddressWatchSelection === true && ( + + {C.STR_WATCH_ADDR} + setAddAddressToWatch(!addAddressToWatch)}> + + + {addAddressToWatch === true && ( + + )} + + )} - - - {/* Select the Address type in the Spending Wallet */} - - {hideModal => ( - item.title} - renderItem={({item}) => ( + { + setShowShareSelector(true); + }} + style={styles.shareBtnOpa}> + + {C.STR_SHARE} + + + + + )} + {/* Select share type */} + + {() => ( + + + { - this.setState({addrType: item.title}); - this.getSpendWalletAddr(item.addrType); - hideModal(); + onShare(address, true); }}> - {item.title} + + {C.STR_ADDR_QR_SHARE} + - )} - /> - )} - - - ); - } -} + { + onShare(address, false); + }}> + + {C.STR_ADDR_SHARE} + + + + + + + + + + + )} + + + {/* Select the Address type in the Spending Wallet */} + + {hideModal => ( + item.value} + renderItem={({item}) => ( + { + setAddrType(item); + setRefresh(refresh + 1); + hideModal(); + }}> + {item.title} + + )} + /> + )} + + + ); +}; const mapStateToProps = state => { return { btcWallet: state.btcWallet, lnWallet: state.lnWallet, + wasabiWallet: state.wasabiWallet, }; }; -const mapDispatchToProps = {getWalletAddress, getNewAddress}; +const mapDispatchToProps = { + getWalletAddress, + getNewLnAddress, + getNewWasabiAddress, +}; export default connect( mapStateToProps, @@ -397,6 +524,25 @@ const styles = StyleSheet.create({ marginTop: 4 * C.vh, justifyContent: 'space-between', }, + inputView: { + flexDirection: 'row', + alignItems: 'center', + marginTop: 10, + marginBottom: 10, + width: C.SCREEN_WIDTH * 0.8, + height: 70, + borderRadius: 10, + borderColor: AppStyle.mainColor, + borderWidth: 2, + }, + inputTxtStyle: { + flex: 1, + marginLeft: 10, + color: 'white', + textAlign: 'left', + alignItems: 'flex-start', + justifyContent: 'flex-start', + }, selectBtnView: { flexDirection: 'row', marginRight: 15, @@ -474,6 +620,10 @@ const styles = StyleSheet.create({ width: 27 * C.vh, backgroundColor: 'white', }, + labelButtonCTA: { + marginTop: C.vh, + alignItems: 'center', + }, shareBtnOpa: { marginTop: 2 * C.vh, alignItems: 'center', @@ -496,8 +646,51 @@ const styles = StyleSheet.create({ marginTop: 40 * C.vh, backgroundColor: 'transparent', }, + addMsgTxt: { + fontFamily: AppStyle.mainFont, + fontSize: 12, + marginTop: 5, + color: AppStyle.grayColor, + }, addrTxt: { + fontFamily: AppStyle.mainFontBold, fontSize: 16, + marginTop: 10, + color: AppStyle.mainColor, + }, + /* Label input */ + inputWrapperDone: { + flexDirection: 'row', + borderColor: AppStyle.mainColor, + borderRadius: 0, + borderWidth: 0, + padding: 10, + alignItems: 'center', + justifyContent: 'center', + overflow: 'visible', + }, + inputWrapper: { + flexDirection: 'row', + borderColor: AppStyle.mainColor, + borderRadius: 10, + borderWidth: 1, + padding: 10, + alignItems: 'center', + justifyContent: 'center', + overflow: 'visible', + }, + input: { + width: '70%', color: 'white', + // height: Platform.OS === 'android' ? u30 : 25, + fontSize: 16, + }, + space_around: { + flexDirection: 'row', + flex: 1, + justifyContent: 'space-around', + marginLeft: 10, + marginTop: 10, }, + burger_icon: {width: 25, height: 20}, }); diff --git a/src/components/screens/wallet/SifirBtcSendTxnConfirmScreen.js b/src/components/screens/wallet/SifirBtcSendTxnConfirmScreen.js index 2562426..c0dd8be 100644 --- a/src/components/screens/wallet/SifirBtcSendTxnConfirmScreen.js +++ b/src/components/screens/wallet/SifirBtcSendTxnConfirmScreen.js @@ -12,6 +12,7 @@ import { import {Images, AppStyle, C} from '@common/index'; import {sendBitcoin} from '@actions/btcwallet'; import {withdrawFunds} from '@actions/lnWallet'; +import {spend as wasabiSpend} from '@actions/wasabiWallet'; import Overlay from 'react-native-modal-overlay'; import SifirSettingModal from '@elements/SifirSettingModal'; import {ErrorScreen} from '@screens/error'; @@ -34,8 +35,8 @@ class SifirBtcSendTxnConfirmScreen extends Component { walletInfo: {type}, } = this.props.route.params; const {address, amount} = txnInfo; - const withdrawDetails = await this.props.withdrawFunds(address, amount); - if (withdrawDetails?.tx) { + const sendResult = await this.props.withdrawFunds(address, amount); + if (sendResult?.tx) { this.props.navigation.navigate('BtcTxnConfirmed', { txnInfo: { ...txnInfo, @@ -43,6 +44,7 @@ class SifirBtcSendTxnConfirmScreen extends Component { amount, address, }, + sendResult, walletInfo, displayUnit: C.STR_MSAT, type, @@ -53,21 +55,47 @@ class SifirBtcSendTxnConfirmScreen extends Component { sendBitcoin = async () => { const {txnInfo, walletInfo} = this.props.route.params; const {address, amount} = txnInfo; - await this.props.sendBitcoin({address, amount}); - this.props.navigation.navigate('BtcTxnConfirmed', { - txnInfo: {...txnInfo, isSendTxn: true}, - walletInfo, + const btcSendResult = await this.props.sendBitcoin({address, amount}); + if (btcSendResult?.status === 'accepted') { + this.props.navigation.navigate('BtcTxnConfirmed', { + txnInfo: {...txnInfo, isSendTxn: true}, + sendResult: btcSendResult, + walletInfo, + }); + } + }; + sendWasabi = async () => { + const {txnInfo, walletInfo, anonset} = this.props.route.params; + const {address, amount} = txnInfo; + const sendResult = await this.props.wasabiSpend({ + address, + amount, + minanonset: anonset, }); + if (sendResult?.result?.txid) { + this.props.navigation.navigate('BtcTxnConfirmed', { + txnInfo: {...txnInfo, isSendTxn: true}, + sendResult, + walletInfo, + }); + } }; handleSendBtn = () => { const { walletInfo: {type}, } = this.props.route.params; - if (type === C.STR_LN_WITHDRAW) { - this.withdrawFunds(); - } else { - this.sendBitcoin(); + switch (type) { + case C.STR_LN_WITHDRAW: + this.withdrawFunds(); + break; + case C.STR_WASABI_WALLET_TYPE: + this.sendWasabi(); + break; + + default: + this.sendBitcoin(); + break; } }; @@ -79,15 +107,25 @@ class SifirBtcSendTxnConfirmScreen extends Component { const amountFontSize = (C.vw * 80) / (amount.length < 3 ? 5 : amount.length); const recTxtFontSize = (C.vw * 120) / address.length; - const {loading: btcLoading, error: btcError} = this.props.lnWallet; - const {loading: lnLoading, error: lnError} = this.props.btcWallet; + let isLoading, hasError; + switch (type) { + case C.STR_LN_WITHDRAW: + ({loading: isLoading, error: hasError} = this.props.lnWallet); + break; + case C.STR_WASABI_WALLET_TYPE: + ({loading: isLoading, error: hasError} = this.props.wasabiWallet); + break; + default: + ({loading: isLoading, error: hasError} = this.props.btcWallet); + break; + } - if (btcError || lnError) { + if (hasError) { return ( [4 Hour Wait] )} - {(btcLoading || lnLoading) && } + {isLoading && } @@ -167,10 +206,11 @@ const mapStateToProps = state => { return { btcWallet: state.btcWallet, lnWallet: state.lnWallet, + wasabiWallet: state.wasabiWallet, }; }; -const mapDispatchToProps = {sendBitcoin, withdrawFunds}; +const mapDispatchToProps = {sendBitcoin, withdrawFunds, wasabiSpend}; export default connect( mapStateToProps, diff --git a/src/components/screens/wallet/SifirBtcSendTxnInputAmountScreen.js b/src/components/screens/wallet/SifirBtcSendTxnInputAmountScreen.js index a6982ac..e6c97f1 100644 --- a/src/components/screens/wallet/SifirBtcSendTxnInputAmountScreen.js +++ b/src/components/screens/wallet/SifirBtcSendTxnInputAmountScreen.js @@ -57,9 +57,20 @@ export default class SifirBtcSendTxnInputAmountScreen extends Component { const {validAmount} = this.state; const { txnInfo: {address}, - walletInfo: {balance, type}, + walletInfo: {balance, type, anonset}, } = this.props.route.params; - const unit = type === C.STR_LN_WITHDRAW ? C.STR_SAT : C.STR_BTC; + let unit; + switch (type) { + case C.STR_LN_WITHDRAW: + unit = C.STR_SAT; + break; + case C.STR_WASABI_WALLET_TYPE: + unit = C.STR_SAT; + break; + default: + unit = C.STR_BTC; + break; + } return ( @@ -69,7 +80,9 @@ export default class SifirBtcSendTxnInputAmountScreen extends Component { {address} {C.STR_PAYMENT_AMOUNT} - {`${C.STR_Wallet_balance}: `} + {anonset + ? `${C.STR_Wasabi_Header} ${anonset} : ` + : `${C.STR_Wallet_balance}: `} diff --git a/src/components/screens/wallet/SifirBtcTxnConfirmedScreen.js b/src/components/screens/wallet/SifirBtcTxnConfirmedScreen.js index 498cdc3..7377f6e 100644 --- a/src/components/screens/wallet/SifirBtcTxnConfirmedScreen.js +++ b/src/components/screens/wallet/SifirBtcTxnConfirmedScreen.js @@ -25,21 +25,19 @@ class SifirBtcTxnConfirmedScreen extends Component { render() { const {type} = this.props.route.params; const addrTxtFontSize = (C.vw * 250) / address?.length || 25; - const {amount, address, isSendTxn, unit} = this.props.route.params.txnInfo; - const payTitleText = - type === C.STR_LN_WALLET_TYPE - ? C.STR_PAID - : isSendTxn - ? C.STR_SENT - : C.STR_RECEIVED; - const payDataTitleText = `${C.STR_PAYMENT} ${ - type === C.STR_LN_WALLET_TYPE - ? C.STR_PRE_IMAGE - : isSendTxn - ? C.STR_RECEIPIENT - : C.STR_SENDER - }`; + let payTitleText, payDataTitleText; + switch (type) { + case C.STR_LN_WALLET_TYPE: + payTitleText = C.STR_PAID; + payDataTitleText = `${C.STR_PAYMENT} ${C.STR_PRE_IMAGE}`; + break; + default: + payTitleText = isSendTxn ? C.STR_SENT : C.STR_RECEIVED; + payDataTitleText = `${C.STR_PAYMENT} ${ + isSendTxn ? C.STR_RECEIPIENT : C.STR_SENDER + }`; + } return ( diff --git a/src/components/screens/wallet/SifirGetAddrScreen.js b/src/components/screens/wallet/SifirGetAddrScreen.js index 2cbea13..1a244a3 100644 --- a/src/components/screens/wallet/SifirGetAddrScreen.js +++ b/src/components/screens/wallet/SifirGetAddrScreen.js @@ -38,8 +38,11 @@ class SifirGetAddrScreen extends Component { scannedQRdata: data, showModal: false, }, + // FIXME this nonsense can be replaced by useEffect on scannedQrData + // Also removes need for handle continue button repeat of code, just sett the qrdata + // () => { - if (type === C.STR_LN_WITHDRAW) { + if (type !== C.STR_LN_WALLET_TYPE) { this.handleAddressScanned(); } else { this.handleBoltScanned(); @@ -113,7 +116,7 @@ class SifirGetAddrScreen extends Component { const {showModal, scannedQRdata} = this.state; const {loading, error} = this.props.lnWallet; const { - walletInfo: {type, label}, + walletInfo: {type, label, backIcon}, } = this.props.route.params; const placeHolder = type === C.STR_LN_WALLET_TYPE ? C.STR_Enter_bolt : C.STR_Enter_addr; @@ -139,14 +142,7 @@ class SifirGetAddrScreen extends Component { style={styles.backNavView} onPress={() => this.handleBackButton()}> - + {label} diff --git a/src/components/screens/wallet/SifirWasabiAutoSpendScreen.js b/src/components/screens/wallet/SifirWasabiAutoSpendScreen.js new file mode 100644 index 0000000..fd9d9d6 --- /dev/null +++ b/src/components/screens/wallet/SifirWasabiAutoSpendScreen.js @@ -0,0 +1,357 @@ +/* eslint-disable react-native/no-inline-styles */ +import React, {useCallback, useMemo, useState, useEffect} from 'react'; +import { + View, + Text, + StyleSheet, + TouchableOpacity, + StatusBar, + Image, + Animated, + ActivityIndicator, +} from 'react-native'; +import SifirAutoSpendHeader from '@elements/SifirHeaders/SifirAutoSpendHeader'; +import SifirAnonimitySlider from '@elements/SifirAnonimitySlider'; +import {AppStyle, C, Images} from '@common'; +import SifirCard from '@elements/SifirCard'; +import SifirAnimatedOverlay from '@elements/SifirAnimatedOverlay'; +import {ScrollView} from 'react-native-gesture-handler'; +import Androw from 'react-native-androw'; +import {scaleLinear} from 'd3-scale'; +import {log, error} from '@io/events'; +import * as path from 'svg-path-properties'; +import * as shape from 'd3-shape'; +import SifirAutoSpendWalletCard from '@elements/SifirAutoSpendWalletCard'; +import {useSelector} from 'react-redux'; + +const d3 = { + shape, +}; + +const slider = React.createRef(); +const label = React.createRef(); +const SV = React.createRef(); +const x = new Animated.Value(0); +const width = C.SCREEN_WIDTH - 20; +const cursor = React.createRef(); + +const SifirWasabiAutoSpendScreen = props => { + const [isSwitchOn, setSwitchOn] = useState(null); + const [headerHeight, setHeaderHeight] = useState(0); + const [selectedWallet, setSelectedWallet] = useState(null); + const [listItemPositions, setListItemPositions] = useState({}); + const [listContainerPosition, setListContainerPosition] = useState(0); + const [topTextPosition, setTopTextPosition] = useState(0); + const [SVoffset, setSVoffset] = useState(0); + const {minX = 2, maxX = 120} = props; + // FIXME this is an antipattern, isLoading should be purely ppassed here but because of memo in AccounScreen we use this hack. Fix this on next iteration. + const defaultLoading = useSelector(({cyphernode}) => cyphernode.loading); + + const { + onBackPress, + onConfirm, + walletList, + autoSpendWalletMinAnonset, + autoSpendWallet, + isLoading = defaultLoading, + } = props.route.params; + useEffect(() => { + StatusBar.setBackgroundColor(AppStyle.backgroundColor); + const autoSpendWalletObj = walletList.find( + ({label: l}) => l === autoSpendWallet, + ); + if (!autoSpendWalletObj) { + error('Selected auto spend wallet is not part of walletList ignoring'); + return; + } + setSelectedWallet({ + ...autoSpendWalletObj, + annonset: autoSpendWalletMinAnonset, + }); + setSwitchOn(true); + }, []); + + useEffect(() => { + if (selectedWallet?.label) { + _init(); + } + }, [selectedWallet]); + + const handleSwitch = value => { + if (!value) { + setSelectedWallet(null); + } + setSwitchOn(value); + }; + + const onLayoutListItem = (event, itemLabel) => { + const {width: itemWidth, height, x: itemX, y} = event.nativeEvent.layout; + // atomic setState + setListItemPositions(prevState => ({ + ...prevState, + [itemLabel]: {width: itemWidth, height, x: itemX, y}, + })); + }; + + const {scaleX, properties, lineLength} = useMemo(() => { + const scaleX = scaleLinear() + .domain([minX, maxX]) + .range([20, width - 20]); + const line = d3.shape + .line() + .x(anonset => scaleX(Number(anonset))) + .y(() => 0) + .curve(d3.shape.curveStepBefore)([minX, maxX]); + const p = path.svgPathProperties(line); + return { + scaleX, + properties: p, + lineLength: p.getTotalLength(), + }; + }, [minX, maxX]); + + const _init = () => { + try { + x.addListener(({value}) => moveCursor(value)); + let {x: X} = properties.getPointAtLength(lineLength); + let left = X - 10; + cursor?.current?.setNativeProps({ + left, + }); + slider?.current.setNativeProps({ + left: left - 10, + }); + // TODO intial cursor position to match passed min anon + moveCursor(lineLength / 2); + } catch (err) { + error(err); + } + }; + let anonSetValue; + + const moveCursor = value => { + let {x} = properties.getPointAtLength(lineLength - value); + let left = x - +10; + cursor?.current?.setNativeProps({ + left, + }); + slider?.current.setNativeProps({ + left: left - 10, + }); + anonSetValue = Math.floor(scaleX.invert(x)); + const text = `${anonSetValue}`; + label?.current?.setNativeProps({ + text, + left: left + 3.5, + }); + // setAnonset(anonSetValue); + }; + + const WalletList = useMemo( + () => + walletList.map(item => { + return ( + + ); + }), + [walletList, selectedWallet], + ); + + const WalletAnonSlider = useMemo(() => { + return ( + + + + + + {isLoading && ( + + )} + {!isLoading && ( + + onConfirm({selectedWallet, anonset: anonSetValue}) + }> + {C.STR_CONFIRM} + + )} + + + ); + }, [minX, maxX, selectedWallet, label, isLoading]); + + const DarkOverLay = useMemo( + () => ( + setSelectedWallet({}) : undefined + } + effectDeps={[isSwitchOn, selectedWallet]} + /> + ), + [headerHeight, selectedWallet, isSwitchOn], + ); + return ( + + setHeaderHeight(event.nativeEvent.layout.height)}> + { + onBackPress({isSwitchOn, selectedWallet, anonSetValue}); + }} + headerText={'Auto Send'} + isSwitchOn={isSwitchOn} + setSwitchOn={handleSwitch} + showOverlay={!isSwitchOn || selectedWallet?.label} + /> + + setTopTextPosition(event.nativeEvent.layout.y)}> + {C.STR_Select_Account} + + + setSVoffset(event.nativeEvent.contentOffset.y)} + onLayout={event => + setListContainerPosition(event.nativeEvent.layout.y) + }> + {WalletList} + + {(!isSwitchOn || selectedWallet?.label) && DarkOverLay} + {/* TODO this should reus SifirAutoSpendCard */} + {selectedWallet?.label && listItemPositions[selectedWallet.label] && ( + + + {`${selectedWallet?.label} ${ + selectedWallet.desc + }`} + + {selectedWallet?.annonset} + {C.STR_Min_Anonset} + + + )} + {selectedWallet?.label && ( + + {`${C.STR_Auto_mix_account_select} ${selectedWallet.label}`} + + )} + {selectedWallet?.label && WalletAnonSlider} + + ); +}; + +const styles = StyleSheet.create({ + container: {flex: 1, backgroundColor: AppStyle.backgroundColor}, + description: {color: 'white', textAlign: 'center', marginTop: 20}, + seperator: { + backgroundColor: 'lightgray', + height: 2, + opacity: 0.1, + marginHorizontal: 20, + marginVertical: 30, + }, + cardContainer: { + marginStart: 20, + marginEnd: 20, + marginBottom: 24, + backgroundColor: '#19282f', + borderWidth: 2, + borderColor: '#19282f', + borderRadius: 20, + padding: 15, + flexDirection: 'row', + alignItems: 'center', + }, + leftIcon: { + width: 40, + height: 40, + resizeMode: 'contain', + }, + listHeading: { + color: 'white', + flex: 1, + paddingLeft: 20, + }, + anonset: { + color: 'white', + fontSize: 18, + }, + anonsetLabel: { + color: 'gray', + fontSize: 12, + }, + rightContainer: { + textAlign: 'right', + alignItems: 'flex-end', + }, + stickyContainer: { + backgroundColor: '#091110', + borderTopStartRadius: 30, + borderTopEndRadius: 30, + }, + confirmBtn: { + backgroundColor: AppStyle.mainColor, + padding: 20, + alignItems: 'center', + margin: 20, + borderRadius: 25, + }, + confirmLabel: { + fontWeight: 'bold', + fontSize: 16, + }, + shadow: { + shadowColor: '#00EDE7', + shadowOffset: {width: 0, height: -10}, + shadowOpacity: 0.4, + shadowRadius: 5, + backgroundColor: '#091110', + position: 'absolute', + bottom: 0, + left: 0, + right: 0, + + overflow: 'hidden', + }, +}); +export default SifirWasabiAutoSpendScreen; diff --git a/src/components/screens/wallet/index.js b/src/components/screens/wallet/index.js index 7cfd9b4..7796b61 100644 --- a/src/components/screens/wallet/index.js +++ b/src/components/screens/wallet/index.js @@ -6,6 +6,7 @@ import SifirAccountScreen from './SifirAccountScreen'; import SifirBtcReceiveTxnScreen from './SifirBtcReceiveTxnScreen'; import SifirBtcTxnConfirmedScreen from './SifirBtcTxnConfirmedScreen'; import SifirAddWalletScreen from './SifirAddWalletScreen'; +import SifirWasabiAutoSpendScreen from './SifirWasabiAutoSpendScreen'; export { SifirGetAddrScreen, SifirBtcSendTxnInputAmountScreen, @@ -15,4 +16,5 @@ export { SifirBtcReceiveTxnScreen, SifirBtcTxnConfirmedScreen, SifirAddWalletScreen, + SifirWasabiAutoSpendScreen, }; diff --git a/src/components/structures/SifirAccountHistoryTabs.js b/src/components/structures/SifirAccountHistoryTabs.js new file mode 100644 index 0000000..a9c2df8 --- /dev/null +++ b/src/components/structures/SifirAccountHistoryTabs.js @@ -0,0 +1,177 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, {useMemo, useState} from 'react'; +import {View, Image, StyleSheet, Text, ActivityIndicator} from 'react-native'; +import {Images, AppStyle, C} from '@common/index'; +import SifirTransactionsTab from '@elements/SifirTransactionsTab'; +import BottomSheet from 'reanimated-bottom-sheet'; +import {TabView, SceneMap, TabBar} from 'react-native-tab-view'; +import {ScrollView} from 'react-native-gesture-handler'; +import SifirInvEntry from '@elements/TxnListItems/SifirInvEntry'; +import SifirTxnEntry from '@elements/TxnListItems/SifirTxnEntry'; +import SifirUnspentCoinEntry from '@elements/TxnListItems/SifirUnspentCoinEntry'; +import SifirWasabiTxnEntry from '@elements/TxnListItems/SifirWasabiTxnEntry'; + +export const sheetHeight = C.SCREEN_HEIGHT - 150; +const initialSnap = C.SCREEN_HEIGHT * 0.35; +const initialLayout = {width: C.SCREEN_WIDTH}; + +const renderTabBar = props => ( + ( + + {label.route.title} + + )} + /> +); + +const SifirAccountHistoryTabs = ({ + loading, + loaded, + dataMap, + filterMap, + btcUnit, + type, + headerText, + bottomExtraSpace, +}) => { + const [index, setIndex] = useState(0); + const onTabIndexChange = tabIndex => setIndex(tabIndex); + const TransctionTabFactory = ({title, key, data}) => { + let renderItem; + switch (key) { + case C.STR_WASABI_WALLET_TYPE: + renderItem = ({item: txn}) => ( + + ); + break; + case C.STR_UNSPENT_COINS: + // TODO rename to UTXO ? + renderItem = ({item: txn}) => ( + + ); + break; + case C.STR_LN_WALLET_TYPE: + renderItem = ({item: txn}) => ( + + ); + break; + case C.STR_SPEND_WALLET_TYPE: + renderItem = ({item: txn}) => ( + + ); + break; + case C.STR_WATCH_WALLET_TYPE: + renderItem = ({item: txn}) => ( + + ); + break; + } + return param => ( + + + + ); + }; + const renderScene = useMemo(() => { + return SceneMap( + dataMap.reduce((sceneDict, {key, title, data}) => { + sceneDict[key] = TransctionTabFactory({key, title, data}); + return sceneDict; + }, {}), + ); + }, [dataMap]); + return ( + 100 ? bottomExtraSpace - 20 : initialSnap, + ]} + initialSnap={1} + enabledInnerScrolling={true} + enabledGestureInteraction={true} + renderContent={() => ( + + + {!loading && ( + // TODO change upArrow to down arrow when slider is opened. + + )} + {loading && ( + + )} + + ({key, title})), + }} + renderScene={renderScene} + onIndexChange={onTabIndexChange} + initialLayout={initialLayout} + renderTabBar={renderTabBar} + lazy={false} + sceneContainerStyle={styles.sceneContainer} + /> + + )} + /> + ); +}; + +const styles = StyleSheet.create({ + settingIcon: {width: 20, height: 20, marginLeft: 20, marginTop: 7}, + spinner: {alignSelf: 'center'}, + headerContainer: { + backgroundColor: '#122C3A', + borderTopLeftRadius: 30, + borderTopRightRadius: 30, + justifyContent: 'center', + alignItems: 'center', + paddingTop: 10, + }, + tabTitleLabel: {fontWeight: 'bold'}, + sceneContainer: { + backgroundColor: AppStyle.tertiaryColor, + }, + tabIndicatorContainerStyle: { + borderBottomColor: AppStyle.grayColor, + borderBottomWidth: 3, + opacity: 0.5, + }, + tabIndicator: { + backgroundColor: AppStyle.mainColor, + bottom: -2, + }, + tabBar: { + backgroundColor: AppStyle.tertiaryColor, + }, +}); + +export default SifirAccountHistoryTabs; diff --git a/src/containers/WalletStack.js b/src/containers/WalletStack.js index 47f9034..435697a 100644 --- a/src/containers/WalletStack.js +++ b/src/containers/WalletStack.js @@ -11,6 +11,7 @@ import { SifirBtcReceiveTxnScreen, SifirBtcTxnConfirmedScreen, SifirAddWalletScreen, + SifirWasabiAutoSpendScreen, } from '@screens/wallet/index'; import {LNChannelRoute, LNPayInvoiceRoute} from './LnStack'; @@ -33,7 +34,6 @@ export default function WalletTab() { component={SifirAccountsListScreen} /> - - + ); } diff --git a/src/helpers/debounce.js b/src/helpers/debounce.js new file mode 100644 index 0000000..df03115 --- /dev/null +++ b/src/helpers/debounce.js @@ -0,0 +1,17 @@ +function debounce(func, wait, immediate) { + let timeout; + return function() { + const args = arguments; + let callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(function() { + timeout = null; + if (!immediate) { + func.apply(this, args); + } + }, wait); + + if (callNow) func.apply(this, args); + }; +} +export default debounce; diff --git a/src/helpers/makeUnspentCoinsChartData.js b/src/helpers/makeUnspentCoinsChartData.js new file mode 100644 index 0000000..3315f18 --- /dev/null +++ b/src/helpers/makeUnspentCoinsChartData.js @@ -0,0 +1,28 @@ +export default chartData => { + const data = chartData.reduce((g, t) => { + g[Math.floor(t.anonymitySet)] = + (g[Math.floor(t.anonymitySet)] || 0) + t.amount; + return g; + }, {}); + const sortedAnonsetTotalPairs = Object.entries(data).sort( + ([anonset1], [anonset2]) => anonset1 - anonset2, + ); + if (sortedAnonsetTotalPairs.length < 2) { + sortedAnonsetTotalPairs.unshift(sortedAnonsetTotalPairs[0]); + } + const chartStats = sortedAnonsetTotalPairs.reduce( + (stats, [anonset, total], i) => { + const cumTotal = sortedAnonsetTotalPairs + .slice(i) + .reduce((totalToIndex, [, t1]) => totalToIndex + t1, 0); + stats.series.push([Number(anonset), cumTotal]); + stats.maxY = Math.max(cumTotal, stats.maxY); + stats.maxX = Math.max(anonset, stats.maxX); + stats.minY = Math.min(cumTotal, stats.minY); + stats.minX = Math.min(anonset, stats.minX); + return stats; + }, + {series: [], minX: 99999, maxX: null, minY: null, maxY: null}, + ); + return chartStats; +}; diff --git a/src/helpers/validations.js b/src/helpers/validations.js index f34a931..3870c65 100644 --- a/src/helpers/validations.js +++ b/src/helpers/validations.js @@ -15,8 +15,8 @@ const validatedTokenHash = tokenHash => { } }; +const nodeRegx = new RegExp(/^([A-Za-z0-9]{66})/); const isValidLnNodeId = node => { - const nodeRegx = new RegExp(/^([A-Za-z0-9]{66})/); return nodeRegx.test(node); }; diff --git a/src/store/actions/btcwallet.js b/src/store/actions/btcwallet.js index 33da28a..07fd069 100644 --- a/src/store/actions/btcwallet.js +++ b/src/store/actions/btcwallet.js @@ -48,13 +48,13 @@ const getBtcWalletList = () => async dispatch => { dispatch({type: types.BTC_WALLET_LIST_DATA_SHOW + PENDING}); let btcWalletList = [ - { - label: 'ADD', - desc: C.STR_WALLET, - iconURL: Images.icon_add, - iconClickedURL: Images.icon_add_clicked, - pageURL: 'AddWallet', - }, + // { + // label: 'ADD', + // desc: C.STR_WALLET, + // iconURL: Images.icon_add, + // iconClickedURL: Images.icon_add_clicked, + // pageURL: 'AddWallet', + // }, ]; try { @@ -69,17 +69,38 @@ const getBtcWalletList = () => async dispatch => { iconURL: Images.icon_btcBtn, iconClickedURL: Images.icon_btcBtn_clicked, pageURL: 'Account', + meta: { + enableAddressTypeSelection: false, + }, }), ); // Add spending wallet btcWalletList.push({ - label: 'Spending', + label: C.STR_SPEND_WALLET_LABEL, desc: C.STR_WALLET, type: C.STR_SPEND_WALLET_TYPE, iconURL: Images.icon_btcBtn, iconClickedURL: Images.icon_btcBtn_clicked, + backIcon: Images.icon_btc_cir, pageURL: 'Account', + meta: { + enableAddressTypeSelection: true, + showAddressTypeSelector: true, + }, + }); + + btcWalletList.push({ + label: C.STR_WASABI_WALLET_LABEL, + desc: C.STR_WALLET, + type: C.STR_WASABI_WALLET_TYPE, + iconURL: Images.icon_wasabi, + iconClickedURL: Images.icon_wasabi_clicked, + backIcon: Images.icon_wasabi, + pageURL: 'Account', + meta: { + enableAddressLabelInput: true, + }, }); dispatch({ @@ -97,7 +118,6 @@ const getBtcWalletList = () => async dispatch => { const getWalletDetails = ({label, type}) => async dispatch => { dispatch({type: types.BTC_WALLET_DETAILS + PENDING}); - let balance = 0, txnData = []; try { @@ -118,13 +138,14 @@ const getWalletDetails = ({label, type}) => async dispatch => { default: break; } - dispatch({ - type: types.BTC_WALLET_DETAILS + FULFILLED, - }); // TODO move this to component txnData.sort((a, b) => { return b.timereceived - a.timereceived; }); + dispatch({ + type: types.BTC_WALLET_DETAILS + FULFILLED, + payload: {balance, txnData}, + }); return {balance, txnData}; } catch (err) { error(err); @@ -138,7 +159,6 @@ const getWalletDetails = ({label, type}) => async dispatch => { const getWalletAddress = ({label, type, addrType = null}) => async dispatch => { dispatch({type: types.BTC_WALLET_ADDRESS + PENDING}); let address = null; - try { await dispatch(initBtcClient()); switch (type) { @@ -156,6 +176,7 @@ const getWalletAddress = ({label, type, addrType = null}) => async dispatch => { type: types.BTC_WALLET_ADDRESS + FULFILLED, payload: {address}, }); + return address; } catch (err) { error(err); dispatch({ diff --git a/src/store/actions/cnClient.js b/src/store/actions/cnClient.js new file mode 100644 index 0000000..af58113 --- /dev/null +++ b/src/store/actions/cnClient.js @@ -0,0 +1,137 @@ +import {C} from '@common'; +import * as types from '@types/'; +import {FULFILLED, PENDING, REJECTED} from '@utils/constants'; +import _cn from '@io/cnClient'; +import {getTransportFromToken} from '@io/transports'; +import {log, error} from '@io/events'; + +const properties = { + CN_AUTOSPEND_WALLET_LABEL: 'wasabi_batchprivatetospender_cfg', + CN_AUTOSPEND_ANONSET_LEVEL: 'wasabi_batchprivatetospender_minanonset', +}; +let cnClient; + +const initCnClient = () => async (dispatch, getState) => { + if (!cnClient) { + log('cnClient:starting cyphernode client'); + const { + auth: {token, key, nodePubkey, devicePgpKey}, + } = getState(); + + if (!token || !key || !nodePubkey) { + throw 'Unable to init wasabi client'; + } + const transport = await getTransportFromToken({ + token, + nodePubkey, + devicePgpKey, + }); + cnClient = await _cn({transport}); + } + return cnClient; +}; + +const getWasabiAutoSpendWallet = () => async (dispatch, getState) => { + const { + cyphernode: {cfgProps}, + } = getState(); + const prop = cfgProps.find( + ({property, value}) => property === properties.CN_AUTOSPEND_WALLET_LABEL, + ); + if (!prop) { + return null; + } + const {value: spendingWalletLabel} = prop; + // some translations to do here + switch (spendingWalletLabel) { + case '_spender': + return C.STR_SPEND_WALLET_LABEL; + case '_disabled': + return null; + default: + return spendingWalletLabel; + } +}; +const getWasabiAutoSpendMinAnonset = () => async (dispatch, getState) => { + const { + cyphernode: {cfgProps}, + } = getState(); + const prop = cfgProps.find( + ({property, value}) => property === properties.CN_AUTOSPEND_ANONSET_LEVEL, + ); + if (!prop) { + return null; + } + return prop.value; +}; +const setWasabiAutoSpendWalletAndAnonset = ({ + label = undefined, + anonset = undefined, +}) => async (dispatch, getState) => { + if (label !== undefined) { + let value; + // some translations to do here + switch (label) { + case C.STR_SPEND_WALLET_LABEL: + value = '_spender'; + break; + case null: + value = '_disabled'; + break; + default: + value = label; + break; + } + await dispatch(setConfigProp(properties.CN_AUTOSPEND_WALLET_LABEL, value)); + } + if (anonset) { + await dispatch( + setConfigProp(properties.CN_AUTOSPEND_ANONSET_LEVEL, anonset), + ); + } +}; +const getConfigProps = () => async dispatch => { + dispatch({type: types.CN_CLIENT_GET_CFG_PROPS + PENDING}); + try { + await dispatch(initCnClient()); + const cfgProps = await cnClient.getConfigProps(); + dispatch({ + type: types.CN_CLIENT_GET_CFG_PROPS + FULFILLED, + payload: {cfgProps}, + }); + return cfgProps; + } catch (err) { + error(err); + dispatch({ + type: types.CN_CLIENT_GET_CFG_PROPS + REJECTED, + payload: {error: err}, + }); + } +}; +const setConfigProp = (property, value) => async dispatch => { + dispatch({type: types.CN_CLIENT_SET_CFG_PROPS + PENDING}); + try { + await dispatch(initCnClient()); + console.log('sending', property, value); + const result = await cnClient.setConfigProp(property, value); + console.log('sending result', result); + dispatch({ + type: types.CN_CLIENT_SET_CFG_PROPS + FULFILLED, + }); + return result; + } catch (err) { + error(err); + dispatch({ + type: types.CN_CLIENT_SET_CFG_PROPS + REJECTED, + payload: {error: err}, + }); + } +}; + +export { + getConfigProps, + setConfigProp, + getWasabiAutoSpendWallet, + getWasabiAutoSpendMinAnonset, + setWasabiAutoSpendWalletAndAnonset, +}; diff --git a/src/store/actions/lnWallet.js b/src/store/actions/lnWallet.js index 617c7ed..3b28eca 100644 --- a/src/store/actions/lnWallet.js +++ b/src/store/actions/lnWallet.js @@ -56,7 +56,7 @@ const getLnNodesList = () => async dispatch => { await dispatch(initLnClient()); const lnNodes = await lnStore.getLnNodes(); if (!lnNodes?.length) { - // FIXME cold boot hack + // TODO cold boot hack // mainly to stay backward compatible with old archittecture // Either go to observable or fix this shit const nodeInfo = await lnClient.getNodeInfo(); @@ -87,6 +87,7 @@ const getLnNodeInfo = label => async dispatch => { nodeInfo.label = nodeInfo.alias; nodeInfo.iconURL = Images.icon_light; nodeInfo.iconClickedURL = Images.icon_light_clicked; + nodeInfo.backIcon = Images.icon_bolt_cir; // nodeInfo.balance = balance; dispatch({ type: types.LN_WALLET_NODEINFO + FULFILLED, @@ -104,6 +105,11 @@ const getLnNodeInfo = label => async dispatch => { const getLnWalletDetails = ({label}) => async dispatch => { dispatch({type: types.LN_WALLET_DETAILS + PENDING}); try { + // TODO + // const init = dispatch(initSifirClient()); + // and make sifirClient call not blocking so we can dispatch what's in the DB and then do the update + // with a LN_WALLET_DETAILS + UPDATE event ? + // await dispatch(initSifirClient()); const { funds: {channels, outputs}, @@ -145,10 +151,11 @@ const getLnWalletDetails = ({label}) => async dispatch => { type: cachedBolt.type, meta: cachedBolt.meta, }; - log('cached bolt', payload); + // log('cached bolt', payload); } else { // decode and insert it - const decodedBolt11 = bolt11Lib.decode(inv.bolt11); + const [x, y] = inv.bolt11.split(':'); + const decodedBolt11 = bolt11Lib.decode(x || y); payload = { decodedBolt11, bolt11: inv.bolt11, @@ -171,6 +178,12 @@ const getLnWalletDetails = ({label}) => async dispatch => { } dispatch({ type: types.LN_WALLET_DETAILS + FULFILLED, + payload: { + outputs, + channels, + pays: processedPays, + invoices: processedInvoices, + }, }); return { balance, @@ -201,7 +214,7 @@ const getFunds = () => async dispatch => { const balance = inChannelBalance + outputBalance; dispatch({ type: types.LN_WALLET_GET_FUNDS + FULFILLED, - payload: {balance}, + payload: {balance, outputs, channels}, }); } catch (err) { error(err); diff --git a/src/store/actions/wasabiWallet.js b/src/store/actions/wasabiWallet.js new file mode 100644 index 0000000..734118a --- /dev/null +++ b/src/store/actions/wasabiWallet.js @@ -0,0 +1,149 @@ +import * as types from '@types/'; +import {FULFILLED, PENDING, REJECTED} from '@utils/constants'; +import {wasabiClient as _wasabi} from '@io/wasabiClient'; +import {C} from '@common/index'; +import {getTransportFromToken} from '@io/transports'; +import moment from 'moment'; +import {log, error} from '@io/events'; +let wasabiClient; + +const initWasabiClient = () => async (dispatch, getState) => { + if (!wasabiClient) { + log('wasabi:starting wasabi client'); + const { + auth: {token, key, nodePubkey, devicePgpKey}, + } = getState(); + + if (!token || !key || !nodePubkey) { + throw 'Unable to init wasabi client'; + } + const transport = await getTransportFromToken({ + token, + nodePubkey, + devicePgpKey, + }); + wasabiClient = await _wasabi({transport}); + } + return wasabiClient; +}; + +const getNewAddress = ({label}) => async dispatch => { + dispatch({type: types.WASABI_WALLET_ADDRESS + PENDING}); + try { + await dispatch(initWasabiClient()); + const address = await wasabiClient.getNewAddress(label); + // TODO store address + dispatch({ + type: types.WASABI_WALLET_ADDRESS + FULFILLED, + }); + /** + * { + * address: Address; + * keyPath: string; //"84'/0'/0'/0/23"; + * label: string; //'["unknown"]'; + * } + * + */ + return address; + } catch (err) { + error(err); + dispatch({ + type: types.WASABI_WALLET_ADDRESS + REJECTED, + payload: {error: err}, + }); + } +}; + +const spend = ({ + address, + amount, + minanonset, + instanceId = 0, + privateOnly = true, +}) => async dispatch => { + dispatch({type: types.WASABI_WALLET_SPEND + PENDING}); + try { + await dispatch(initWasabiClient()); + if (isNaN(amount)) { + throw C.STR_AMOUNT_BENUMBER; + } + const spendResult = await wasabiClient.spend({ + address, + amount: Number(amount), + instanceId, + private: privateOnly, + minanonset, + }); + if ( + spendResult?.result === 'error' || + spendResult?.error || + // sometimes spend timesout on CN bridge side, so make sure we actaully got the spend + !spendResult?.result === 'success' + ) { + throw new Error( + spendResult?.message || + spendResult?.error?.message || + 'Error while attempting Wasabi spend (probably timedout)', + ); + } + dispatch({ + type: types.WASABI_WALLET_SPEND + FULFILLED, + payload: {spendResult}, + }); + return spendResult; + } catch (err) { + error(err); + dispatch({ + type: types.WASABI_WALLET_SPEND + REJECTED, + payload: {error: err}, + }); + } +}; +const getUnspentCoins = ({instanceId = 0} = {}) => async dispatch => { + dispatch({type: types.WASABI_WALLET_GET_UNSPENTCOINS + PENDING}); + try { + await dispatch(initWasabiClient()); + const unspentCoinsList = await wasabiClient.getUnspentCoins(instanceId); + // TODO cache it ? + dispatch({ + type: types.WASABI_WALLET_GET_UNSPENTCOINS + FULFILLED, + payload: {unspentCoinsList}, + }); + return unspentCoinsList; + } catch (err) { + error(err); + dispatch({ + type: types.WASABI_WALLET_GET_UNSPENTCOINS + REJECTED, + payload: {error: err}, + }); + } +}; +const getTxns = ({ + instanceId = 0, + txnFilterInternal = true, +} = {}) => async dispatch => { + dispatch({type: types.WASABI_WALLET_GET_TXNS + PENDING}); + try { + await dispatch(initWasabiClient()); + const txnsList = await wasabiClient.getTxns({ + instanceId, + txnFilterInternal, + }); + dispatch({ + type: types.WASABI_WALLET_GET_TXNS + FULFILLED, + payload: { + txnsList: txnsList?.transactions.sort((a, b) => + moment(b.datetime).diff(moment(a.datetime)), + ), + }, + }); + return txnsList; + } catch (err) { + error(err); + dispatch({ + type: types.WASABI_WALLET_GET_TXNS + REJECTED, + payload: {error: err}, + }); + } +}; +export {getTxns, getUnspentCoins, getNewAddress, spend, initWasabiClient}; diff --git a/src/store/io/cnClient/index.js b/src/store/io/cnClient/index.js new file mode 100644 index 0000000..9bfa973 --- /dev/null +++ b/src/store/io/cnClient/index.js @@ -0,0 +1,8 @@ +import {cnClient} from 'sifir-js-sdk'; +let client = null; +export default async ({transport}) => { + if (!client) { + client = cnClient({transport}); + } + return client; +}; diff --git a/src/store/io/pgp/index.js b/src/store/io/pgp/index.js index 36699f1..3c1ee93 100644 --- a/src/store/io/pgp/index.js +++ b/src/store/io/pgp/index.js @@ -19,15 +19,17 @@ const initAndUnlockKeys = async ({privatekeyArmored, passphrase}) => { return {pubkeyArmored, fingerprint, hexkeyId}; }; +// FIXME schema of return check interface /** * @param email * @param passphrase - * @returns {Promise<{pubkeyArmored:string,fingerprint:string,hexkeyId:string}>} + * @returns {Promise<{privkeyArmored:string,pubkeyArmored:string,fingerprint:string,hexkeyId:string}>} */ const makeNewPgpKey = async ({passphrase, email, user}) => { const key = await PgpBridge.genNewKey(passphrase, email, user); return key; }; + const signMessageWithArmoredKey = async ({msg, privKey, passphrase}) => { const {armoredSignature, message} = await PgpBridge.signMessageWithArmoredKey( msg, diff --git a/src/store/io/sifirClient/index.js b/src/store/io/sifirClient/index.js index 0f7ab95..051a849 100644 --- a/src/store/io/sifirClient/index.js +++ b/src/store/io/sifirClient/index.js @@ -2,8 +2,7 @@ import {sifirClient} from 'sifir-js-sdk'; let client = null; export default async ({transport}) => { if (!client) { - // FIXME sifir to {transport} - client = sifirClient(transport); + client = sifirClient({transport}); } return client; }; diff --git a/src/store/io/wasabiClient/clientFactory.js b/src/store/io/wasabiClient/clientFactory.js new file mode 100644 index 0000000..d04a8c2 --- /dev/null +++ b/src/store/io/wasabiClient/clientFactory.js @@ -0,0 +1,10 @@ +import {wasabiClient} from 'sifir-js-sdk'; +let _wasabi = null; +export default async ({transport}) => { + if (!_wasabi) { + _wasabi = wasabiClient({ + transport, + }); + } + return _wasabi; +}; diff --git a/src/store/io/wasabiClient/index.js b/src/store/io/wasabiClient/index.js new file mode 100644 index 0000000..92f9ff5 --- /dev/null +++ b/src/store/io/wasabiClient/index.js @@ -0,0 +1 @@ +export wasabiClient from './clientFactory'; diff --git a/src/store/reducers/btcWallet.js b/src/store/reducers/btcWallet.js index 53c79a6..151e789 100644 --- a/src/store/reducers/btcWallet.js +++ b/src/store/reducers/btcWallet.js @@ -11,6 +11,8 @@ const initialState = { btcSendResult: null, feeSettingEnabled: false, chainInfo: null, + balance: null, + txnData: [], }; const btcWallet = createReducer(initialState)({ @@ -75,9 +77,11 @@ const btcWallet = createReducer(initialState)({ }), [types.BTC_WALLET_DETAILS + FULFILLED]: ( state, - // {payload: {btcWalletDetails}}, + {payload: {balance, txnData}}, ) => ({ ...state, + balance, + txnData, loading: false, loaded: true, error: null, diff --git a/src/store/reducers/cn.js b/src/store/reducers/cn.js new file mode 100644 index 0000000..9f434a2 --- /dev/null +++ b/src/store/reducers/cn.js @@ -0,0 +1,55 @@ +import * as types from '@types/'; +import {createReducer} from '@utils/'; +import {FULFILLED, PENDING, REJECTED} from '@utils/constants'; + +const initialState = { + loading: false, + error: null, + loaded: false, + cfgProps: [], +}; + +const cyphernode = createReducer(initialState)({ + [types.CN_CLIENT_GET_CFG_PROPS + PENDING]: state => ({ + ...state, + error: null, + loading: true, + loaded: false, + }), + [types.CN_CLIENT_GET_CFG_PROPS + FULFILLED]: ( + state, + {payload: {cfgProps}}, + ) => ({ + ...state, + loading: false, + loaded: true, + error: null, + cfgProps, + }), + [types.CN_CLIENT_GET_CFG_PROPS + REJECTED]: (state, {payload: {error}}) => ({ + ...state, + error, + loading: false, + loaded: false, + }), + [types.CN_CLIENT_SET_CFG_PROPS + PENDING]: state => ({ + ...state, + error: null, + loading: true, + loaded: false, + }), + [types.CN_CLIENT_SET_CFG_PROPS + FULFILLED]: state => ({ + ...state, + loading: false, + loaded: true, + error: null, + }), + [types.CN_CLIENT_SET_CFG_PROPS + REJECTED]: (state, {payload: {error}}) => ({ + ...state, + error, + loading: false, + loaded: false, + }), +}); + +export default cyphernode; diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js index 2bf2e30..5f1fc0d 100644 --- a/src/store/reducers/index.js +++ b/src/store/reducers/index.js @@ -1,3 +1,5 @@ export btcWallet from './btcWallet'; export lnWallet from './lnWallet'; +export wasabiWallet from './wasabiWallet'; export auth from './auth'; +export cyphernode from './cn'; diff --git a/src/store/reducers/lnWallet.js b/src/store/reducers/lnWallet.js index 7a52ed5..3b249e1 100644 --- a/src/store/reducers/lnWallet.js +++ b/src/store/reducers/lnWallet.js @@ -9,6 +9,10 @@ const initialState = { funds: [], peers: [], nodeInfo: [], + pays: [], + invoices: [], + outputs: [], + channels: [], }; const lnWallet = createReducer(initialState)({ @@ -56,8 +60,15 @@ const lnWallet = createReducer(initialState)({ loading: true, loaded: false, }), - [types.LN_WALLET_DETAILS + FULFILLED]: state => ({ + [types.LN_WALLET_DETAILS + FULFILLED]: ( + state, + {payload: {pays, invoices, outputs, funds}}, + ) => ({ ...state, + pays, + invoices, + outputs, + funds, loading: false, loaded: true, error: null, diff --git a/src/store/reducers/wasabiWallet.js b/src/store/reducers/wasabiWallet.js new file mode 100644 index 0000000..4bdb33b --- /dev/null +++ b/src/store/reducers/wasabiWallet.js @@ -0,0 +1,86 @@ +import * as types from '@types/'; +import {createReducer} from '@utils/'; +import {FULFILLED, PENDING, REJECTED} from '@utils/constants'; + +const initialState = { + loading: false, + error: null, + loaded: false, + unspentCoinsList: [], + txnsList: [], + spendResult: [], +}; + +const wasabiWallet = createReducer(initialState)({ + [types.WASABI_WALLET_GET_UNSPENTCOINS + PENDING]: state => ({ + ...state, + error: null, + loading: true, + loaded: false, + }), + [types.WASABI_WALLET_GET_UNSPENTCOINS + FULFILLED]: ( + state, + {payload: {unspentCoinsList}}, + ) => ({ + ...state, + loading: false, + loaded: true, + error: null, + unspentCoinsList, + }), + [types.WASABI_WALLET_GET_UNSPENTCOINS + REJECTED]: ( + state, + {payload: {error}}, + ) => ({ + ...state, + error, + loading: false, + loaded: false, + }), + [types.WASABI_WALLET_GET_TXNS + PENDING]: state => ({ + ...state, + error: null, + loading: true, + loaded: false, + }), + [types.WASABI_WALLET_GET_TXNS + FULFILLED]: ( + state, + {payload: {txnsList}}, + ) => ({ + ...state, + loading: false, + loaded: true, + error: null, + txnsList, + }), + [types.WASABI_WALLET_GET_TXNS + REJECTED]: (state, {payload: {error}}) => ({ + ...state, + error, + loading: false, + loaded: false, + }), + [types.WASABI_WALLET_SPEND + PENDING]: state => ({ + ...state, + error: null, + loading: true, + loaded: false, + }), + [types.WASABI_WALLET_SPEND + FULFILLED]: ( + state, + {payload: {spendResult}}, + ) => ({ + ...state, + loading: false, + loaded: true, + error: null, + spendResult, + }), + [types.WASABI_WALLET_SPEND + REJECTED]: (state, {payload: {error}}) => ({ + ...state, + error, + loading: false, + loaded: false, + }), +}); + +export default wasabiWallet; diff --git a/src/store/types/index.js b/src/store/types/index.js index 24d72f9..3f062a0 100644 --- a/src/store/types/index.js +++ b/src/store/types/index.js @@ -19,6 +19,16 @@ export const LN_WALLET_OPEN_FUND_PEER_CHANNEL = export const LN_WALLET_GET_NEW_ADDRESS = 'LN_WALLET_GET_NEW_ADDRESS'; export const LN_WALLET_WITHDRAW_FUNDS = 'LN_WALLET_WITHDRAW_FUNDS'; +// Wasabi +export const WASABI_WALLET_GET_UNSPENTCOINS = 'WASABI_WALLET_GET_UNSPENTCOINS'; +export const WASABI_WALLET_GET_TXNS = 'WASABI_WALLET_GET_TXNS'; +export const WASABI_WALLET_SPEND = 'WASABI_WALLET_SPEND'; +export const WASABI_WALLET_ADDRESS = 'WASABI_WALLET_ADDRESS'; + +// Cn client +export const CN_CLIENT_GET_CFG_PROPS = 'CN_CLIENT_GET_CFG_PROPS'; +export const CN_CLIENT_SET_CFG_PROPS = 'CN_CLIENT_SET_CFG_PROPS'; + // Auth export const REQUEST_PAIR = 'REQUEST_PAIR'; export const GET_AUTH_STATUS = 'GET_AUTH_STATUS';