From 1bf6b9c548e3abea1d5a46c918e0c67f0da27104 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Wed, 5 May 2021 17:36:01 +0100 Subject: [PATCH 001/327] OPS: remove npx (closes #3078) --- package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 5918f1b10..b17661842 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,6 @@ "eslint-plugin-react": "^7.20.3", "flow-bin": "^0.134.0", "jest": "^26.1.0", - "jetifier": "^1.6.3", "react-test-renderer": "16.13.1" }, "engines": { @@ -40,14 +39,14 @@ "android": "react-native run-android", "android:clean": "cd android; ./gradlew clean ; cd .. ; npm run android", "ios": "react-native run-ios", - "postinstall": "rn-nodeify --install buffer,events,process,stream,util,inherits,fs,path,assert,crypto --hack; npm run releasenotes2json; npm run podinstall; npx jetify", + "postinstall": "rn-nodeify --install buffer,events,process,stream,util,inherits,fs,path,assert,crypto --hack; npm run releasenotes2json; npm run podinstall", "test": "npm run lint && npm run unit && npm run jest", "jest": "jest -b -w 1 tests/integration/*", "maccatalystpatches": "./scripts/maccatalystpatches/applypatchesformaccatalyst.sh", "e2e:debug-build": "detox build -c android.emu.debug", "e2e:debug-test": "detox test -c android.emu.debug", "e2e:debug": "(test -f android/app/build/outputs/apk/debug/app-debug.apk && test -f android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk) || npm run e2e:debug-build; npm run e2e:debug-test", - "e2e:release-build": "npx detox build -c android.emu.release", + "e2e:release-build": "detox build -c android.emu.release", "e2e:release-test": "detox test -c android.emu.release --record-videos all --take-screenshots all --headless --loglevel trace", "lint": "eslint *.js screen/**/*.js blue_modules/*.js class/**/*.js models/ loc/ tests/**/*.js components/**/*.js", "lint:fix": "npm run lint -- --fix", From 5456d38bb6a18756a344a11a9f370ad8608ff081 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 6 May 2021 03:51:46 +0000 Subject: [PATCH 002/327] fix: upgrade eslint-plugin-prettier from 3.1.4 to 3.4.0 Snyk has created this PR to upgrade eslint-plugin-prettier from 3.1.4 to 3.4.0. See this package in npm: https://www.npmjs.com/package/eslint-plugin-prettier See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9bc626583..3a91e06c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9938,9 +9938,9 @@ } }, "eslint-plugin-prettier": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", - "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", "requires": { "prettier-linter-helpers": "^1.0.0" } diff --git a/package.json b/package.json index b17661842..06392a057 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "eslint-config-prettier": "6.14.0", "eslint-config-standard": "14.1.1", "eslint-config-standard-react": "9.2.0", - "eslint-plugin-prettier": "3.1.4", + "eslint-plugin-prettier": "3.4.0", "eslint-plugin-standard": "4.0.2", "events": "1.1.1", "frisbee": "3.1.4", From fdd88faf80b2674113248ed85639bfc72da975b1 Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Thu, 6 May 2021 11:57:25 +0300 Subject: [PATCH 003/327] ADD: show zpub for electrum seed segwit wallets --- .../hd-segwit-electrum-seed-p2wpkh-wallet.js | 20 ++++++++++++++----- ...segwit-electrum-seed-p2wpkh-wallet.test.js | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/class/wallets/hd-segwit-electrum-seed-p2wpkh-wallet.js b/class/wallets/hd-segwit-electrum-seed-p2wpkh-wallet.js index 3621ed0f1..0cd15e340 100644 --- a/class/wallets/hd-segwit-electrum-seed-p2wpkh-wallet.js +++ b/class/wallets/hd-segwit-electrum-seed-p2wpkh-wallet.js @@ -1,3 +1,4 @@ +import b58 from 'bs58check'; import { HDSegwitBech32Wallet } from './hd-segwit-bech32-wallet'; const bitcoin = require('bitcoinjs-lib'); @@ -33,7 +34,14 @@ export class HDSegwitElectrumSeedP2WPKHWallet extends HDSegwitBech32Wallet { return this._xpub; // cache hit } const root = bitcoin.bip32.fromSeed(mn.mnemonicToSeedSync(this.secret, MNEMONIC_TO_SEED_OPTS)); - this._xpub = root.derivePath("m/0'").neutered().toBase58(); + const xpub = root.derivePath("m/0'").neutered().toBase58(); + + // bitcoinjs does not support zpub yet, so we just convert it from xpub + let data = b58.decode(xpub); + data = data.slice(4); + data = Buffer.concat([Buffer.from('04b24746', 'hex'), data]); + this._xpub = b58.encode(data); + return this._xpub; } @@ -41,7 +49,8 @@ export class HDSegwitElectrumSeedP2WPKHWallet extends HDSegwitBech32Wallet { index = index * 1; // cast to int if (this.internal_addresses_cache[index]) return this.internal_addresses_cache[index]; // cache hit - const node = bitcoin.bip32.fromBase58(this.getXpub()); + const xpub = this.constructor._zpubToXpub(this.getXpub()); + const node = bitcoin.bip32.fromBase58(xpub); const address = bitcoin.payments.p2wpkh({ pubkey: node.derive(1).derive(index).publicKey, }).address; @@ -53,7 +62,8 @@ export class HDSegwitElectrumSeedP2WPKHWallet extends HDSegwitBech32Wallet { index = index * 1; // cast to int if (this.external_addresses_cache[index]) return this.external_addresses_cache[index]; // cache hit - const node = bitcoin.bip32.fromBase58(this.getXpub()); + const xpub = this.constructor._zpubToXpub(this.getXpub()); + const node = bitcoin.bip32.fromBase58(xpub); const address = bitcoin.payments.p2wpkh({ pubkey: node.derive(0).derive(index).publicKey, }).address; @@ -74,13 +84,13 @@ export class HDSegwitElectrumSeedP2WPKHWallet extends HDSegwitBech32Wallet { index = index * 1; // cast to int if (node === 0 && !this._node0) { - const xpub = this.getXpub(); + const xpub = this.constructor._zpubToXpub(this.getXpub()); const hdNode = HDNode.fromBase58(xpub); this._node0 = hdNode.derive(node); } if (node === 1 && !this._node1) { - const xpub = this.getXpub(); + const xpub = this.constructor._zpubToXpub(this.getXpub()); const hdNode = HDNode.fromBase58(xpub); this._node1 = hdNode.derive(node); } diff --git a/tests/unit/hd-segwit-electrum-seed-p2wpkh-wallet.test.js b/tests/unit/hd-segwit-electrum-seed-p2wpkh-wallet.test.js index 09bb7277d..1629f55d4 100644 --- a/tests/unit/hd-segwit-electrum-seed-p2wpkh-wallet.test.js +++ b/tests/unit/hd-segwit-electrum-seed-p2wpkh-wallet.test.js @@ -20,7 +20,7 @@ describe('HDSegwitElectrumSeedP2WPKHWallet', () => { assert.ok(hd.validateMnemonic()); assert.strictEqual( hd.getXpub(), - 'xpub68RzTumZwSbVWwETioxTSk2PhBvBRDGNRHepHUC5x2gptbSVWhkezF3NKbq9sCJhnNKcPx2McNWJtFFdXLx97cknHhuDTDQsFg5cG7MSMY7', + 'zpub6n6X5F7QEogTDXchPXXhrvDQ38D5JTFNFWhFrFyri3Sazo4x225nENMeN1kKs1cYbeZDtuDUXhDQepUkxjnAi67z2PJ4d33qo8Cu3HLw74c', ); let address = hd._getExternalAddressByIndex(0); From 89f4b0e12b64f7c6890bb179535489c852f8f4ac Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 6 May 2021 03:51:49 +0000 Subject: [PATCH 004/327] fix: upgrade detox from 18.11.0 to 18.12.0 Snyk has created this PR to upgrade detox from 18.11.0 to 18.12.0. See this package in npm: https://www.npmjs.com/package/detox See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9bc626583..9b5cc1865 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8914,9 +8914,9 @@ "dev": true }, "detox": { - "version": "18.11.0", - "resolved": "https://registry.npmjs.org/detox/-/detox-18.11.0.tgz", - "integrity": "sha512-DcEdXPIeQbxtw3fzHyM1TNvIuWlvwfCr4NnRQ8hLpy/uEUG+e0sYtQka+YJ6BoJM8OqAxZhHVwA++kaaiv3iHQ==", + "version": "18.12.0", + "resolved": "https://registry.npmjs.org/detox/-/detox-18.12.0.tgz", + "integrity": "sha512-AZLbI1TInfK1/aQjqIDDGYtgdlaocexnC40wN9NIa3rEwUjh21UyasYeYjG9RmHGVz3QQjVdmp2cDx+rKduDfg==", "requires": { "bunyan": "^1.8.12", "bunyan-debug-stream": "^1.1.0", @@ -8939,7 +8939,7 @@ "telnet-client": "1.2.8", "tempfile": "^2.0.0", "which": "^1.3.1", - "ws": "^7.4.3", + "ws": "^7.0.0", "yargs": "^16.0.3", "yargs-unparser": "^2.0.0" }, diff --git a/package.json b/package.json index b17661842..a4affa245 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "coinselect": "3.1.12", "crypto-js": "3.1.9-1", "dayjs": "1.10.4", - "detox": "18.11.0", + "detox": "18.12.0", "ecurve": "1.0.6", "electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4", "electrum-mnemonic": "2.0.0", From 2b979bfd0a6f9f838904cfe76539844bf866f5f3 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Thu, 6 May 2021 16:55:44 +0100 Subject: [PATCH 005/327] OPS: regenerate package-lock (rel #3059) --- package-lock.json | 10226 +++++++++++++++++++------------------------- 1 file changed, 4393 insertions(+), 5833 deletions(-) diff --git a/package-lock.json b/package-lock.json index 627470da7..bf1aa15d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@amplitude/types": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@amplitude/types/-/types-1.5.3.tgz", - "integrity": "sha512-1XOkNilMoehnriKU7zg+L+Ya1QA9kv3e7FL3bJJlt/NVXoV+jV/8OeRpQBPZzbKSwLpg+JBmUsP5VQHBx3O3Dw==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@amplitude/types/-/types-1.5.4.tgz", + "integrity": "sha512-+e+wqlO5E4lNTM19lATf+lJldV+VD2RGzrDEy45cPEtfpXxHJUHwhfOKZkKg/zlx+YAubcpNhWLm2NSPpHUs9A==" }, "@amplitude/ua-parser-js": { "version": "0.7.24", @@ -15,629 +15,251 @@ "integrity": "sha512-VbQuJymJ20WEw0HtI2np7EdC3NJGUWi8+Xdbc7uk8WfMIF308T0howpzkQ3JFMN7ejnrcSM/OyNGveeE3TP3TA==" }, "@amplitude/utils": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@amplitude/utils/-/utils-1.5.3.tgz", - "integrity": "sha512-FISxU0/UPWntMLkGWnXgKvPnd+MLdhQNV+5Rc633zhYdxqqu459cLCPd8K7tc1z+ZK1Q09besGohodnIndo5sw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@amplitude/utils/-/utils-1.5.4.tgz", + "integrity": "sha512-VAd/ibhwBBeL8pKqCz8tjCnSx8epOvUa+Je6sA3AB4R8855xl+bdrDjYwMmOWOILvEH3Pltq2jVJCE2thBoFdQ==", "requires": { - "@amplitude/types": "^1.5.3", + "@amplitude/types": "^1.5.4", "tslib": "^1.9.3" } }, "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.12.13" } }, "@babel/compat-data": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.5.tgz", - "integrity": "sha512-DTsS7cxrsH3by8nqQSpFSyjSfSYl57D6Cf4q8dW3LK83tBKBDCkfcay1nYkXq1nIHXnpX8WMMb/O25HOy3h1zg==" + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", + "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==" }, "@babel/core": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", - "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.0.tgz", + "integrity": "sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.5", - "@babel/types": "^7.10.5", + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.0", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helpers": "^7.14.0", + "@babel/parser": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", + "semver": "^6.3.0", "source-map": "^0.5.0" }, "dependencies": { - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" - } - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/generator": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", - "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.1.tgz", + "integrity": "sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ==", "requires": { - "@babel/types": "^7.10.5", + "@babel/types": "^7.14.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.12.13" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", - "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-react-jsx-experimental": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz", - "integrity": "sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/types": "^7.10.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-compilation-targets": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", - "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", + "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", "requires": { - "@babel/compat-data": "^7.12.5", - "@babel/helper-validator-option": "^7.12.1", + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", "browserslist": "^4.14.5", - "semver": "^5.5.0" + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.1.tgz", + "integrity": "sha512-r8rsUahG4ywm0QpGcCrLaUSOuNAISR3IZCg4Fx05Ozq31aCUrQsTLH6KPxy0N5ULoQ4Sn9qjNdGNtbPWAC6hYg==", "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" } }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "@babel/helper-define-polyfill-provider": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", + "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" }, "dependencies": { - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/helper-explode-assignable-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", - "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", "requires": { - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.13.0" } }, "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.12.13" } }, "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz", + "integrity": "sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==", "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/traverse": "^7.13.15", + "@babel/types": "^7.13.16" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz", - "integrity": "sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", "requires": { - "@babel/types": "^7.10.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.13.12" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.13.12" } }, "@babel/helper-module-transforms": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz", - "integrity": "sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz", + "integrity": "sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw==", "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.12.13" } }, "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "requires": { - "lodash": "^4.17.19" - } + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz", - "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.13.12" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -646,477 +268,199 @@ "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "requires": { "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.12.13" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==" }, "@babel/helper-validator-option": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", - "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==" + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" }, "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" - } - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", + "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" - } - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" } }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.14.0", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", - "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==" + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.1.tgz", + "integrity": "sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q==" }, "@babel/plugin-external-helpers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.12.1.tgz", - "integrity": "sha512-5VBqan0daXhDSRjrq2miABuELRwWJWFdM42Jvs/CDuhp+Es+fW+ISA5l+co8d+9oN3WLz/N3VvzyeseL3AvjxA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.12.13.tgz", + "integrity": "sha512-ClvAsk4RqpE6iacYUjdU9PtvIwC9yAefZENsPfGeG5FckX3jFZLDlWPuyv5gi9/9C2VgwX6H8q1ukBifC0ha+Q==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", - "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", + "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" - }, - "dependencies": { - "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" - } - }, - "@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", - "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-default-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.10.4.tgz", - "integrity": "sha512-G1l00VvDZ7Yk2yRlC5D8Ybvu3gmeHS3rCHoUYdjrqGYUtdeOBoRypnvDZ5KQqxyaiiGHWnVDeSEzA5F9ozItig==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.12.13.tgz", + "integrity": "sha512-idIsBT+DGXdOHL82U+8bwX4goHm/z10g8sGGrQroh+HCRcm7mDv/luaGdWJQMTuCX2FsdXS7X0Nyyzp4znAPJA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-export-default-from": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-default-from": "^7.12.13" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.5.tgz", - "integrity": "sha512-UiAnkKuOrCyjZ3sYNHlRlfuZJbBHknMQ9VMwVeX97Ofwx7RpD6gS2HfqTCh8KNUQgcOm8IKt103oR4KIjh7Q8g==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", - "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz", - "integrity": "sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", - "requires": { - "@babel/types": "^7.12.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - } - }, - "@babel/parser": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", - "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==" - }, - "@babel/traverse": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", - "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.5", - "@babel/types": "^7.12.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - } - } - }, - "@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", - "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.1" - } - }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - } + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-async-generators": { @@ -1137,11 +481,11 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-dynamic-import": { @@ -1153,11 +497,11 @@ } }, "@babel/plugin-syntax-export-default-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.10.4.tgz", - "integrity": "sha512-79V6r6Pgudz0RnuMGp5xidu6Z+bPFugh8/Q9eDHonmLp4wKFAZDwygJwYgCzuDu8lFA/sYyT+mc5y2wkd7bTXA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.12.13.tgz", + "integrity": "sha512-gVry0zqoums0hA+EniCYK3gABhjYSLX1dVuwYpPw9DrLNA4/GovXySHVg4FGRsZht09ON/5C2NVx3keq+qqVGQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-export-namespace-from": { @@ -1169,11 +513,11 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz", - "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", + "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-import-meta": { @@ -1194,11 +538,11 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -1250,875 +594,382 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-typescript": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", - "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", + "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", - "requires": { - "@babel/types": "^7.12.5" - } - }, - "@babel/types": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz", - "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz", - "integrity": "sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.1.tgz", + "integrity": "sha512-2mQXd0zBrwfp0O1moWIhPpEeTKDvxyHcnma3JATVP1l+CctWBuot6OJG8LQ4DnBj4ZZPSmlb/fm4mu47EOAnVA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz", + "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", - "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.1" - } - }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - } + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz", - "integrity": "sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz", + "integrity": "sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-flow": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-flow": "^7.12.13" } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.0.tgz", + "integrity": "sha512-CF4c5LX4LQ03LebQxJ5JZes2OYjzBuk1TdiF7cG7d5dK4lAdw9NZmaxq5K/mouUdNeqwz3TNjnW6v01UqUNgpQ==", "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", - "requires": { - "@babel/types": "^7.12.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", - "requires": { - "@babel/types": "^7.12.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" - } - }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/parser": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", - "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", - "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.5", - "@babel/types": "^7.12.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", - "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", + "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@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.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.13.12", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", - "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", - "requires": { - "@babel/types": "^7.12.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", - "requires": { - "@babel/types": "^7.12.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" - } - }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/parser": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", - "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", - "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.5", - "@babel/types": "^7.12.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", - "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz", + "integrity": "sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw==", "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", - "requires": { - "@babel/types": "^7.12.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", - "requires": { - "@babel/types": "^7.12.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" - } - }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/parser": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", - "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", - "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.5", - "@babel/types": "^7.12.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", - "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1" - }, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", - "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.1" - } - }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - } + "@babel/helper-create-regexp-features-plugin": "^7.12.13" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", - "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-object-assign": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.10.4.tgz", - "integrity": "sha512-6zccDhYEICfMeQqIjuY5G09/yhKzG30DKHJeYBQUHIsJH7c2jXSGvgwRalufLAXAq432OSlsEfAOLlzEsQzxVw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.13.tgz", + "integrity": "sha512-4QxDMc0lAOkIBSfCrnSGbAJ+4epDBF2XXwcLXuBcG1xl9u7LrktNVD4+LwhL47XuKVPQ7R25e/WdcV+h97HyZA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-object-super": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", - "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1" - }, - "dependencies": { - "@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", - "requires": { - "@babel/types": "^7.12.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", - "requires": { - "@babel/types": "^7.12.7" - } - }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/parser": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.7.tgz", - "integrity": "sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg==" - }, - "@babel/traverse": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.9.tgz", - "integrity": "sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz", - "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" } }, "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", - "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", - "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", + "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", - "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", + "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", "requires": { - "@babel/helper-builder-react-jsx": "^7.10.4", - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/types": "^7.13.12" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", - "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", + "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - } + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", - "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz", + "integrity": "sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", + "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", - "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-runtime": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.5.tgz", - "integrity": "sha512-tV4V/FjElJ9lQtyjr5xD2IFFbgY46r7EeVu5a8CpEKT5laheHKSlFeHjpkPppW3PqzGLAuv5k2qZX5LgVZIX5w==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz", + "integrity": "sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA==", "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-spread": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz", - "integrity": "sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", - "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-typescript": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.5.tgz", - "integrity": "sha512-YCyYsFrrRMZ3qR7wRwtSSJovPG5vGyG4ZdcSAivGwTfoasMp3VOB/AKhohu3dFtmB4cCDcsndCSxGtrdliCsZQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", + "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-typescript": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-typescript": "^7.12.13" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", - "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/preset-env": { @@ -2192,424 +1043,6 @@ "@babel/types": "^7.12.1", "core-js-compat": "^3.6.2", "semver": "^5.5.0" - }, - "dependencies": { - "@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", - "requires": { - "@babel/types": "^7.12.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", - "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", - "requires": { - "@babel/types": "^7.12.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - } - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/parser": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", - "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==" - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", - "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", - "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", - "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", - "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", - "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", - "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", - "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", - "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", - "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", - "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", - "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", - "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.5", - "@babel/types": "^7.12.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - } - } - }, - "@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - } } }, "@babel/preset-modules": { @@ -2625,58 +1058,56 @@ } }, "@babel/register": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.12.1.tgz", - "integrity": "sha512-XWcmseMIncOjoydKZnWvWi0/5CUCD+ZYKhRwgYlWOrA8fGZ/FjuLRpqtIhLOVD/fvR1b9DQHtZPn68VvhpYf+Q==", + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.13.16.tgz", + "integrity": "sha512-dh2t11ysujTwByQjXNgJ48QZ2zcXKQVdV8s0TbeMI0flmtGWCdTwK9tJiACHXPLmncm5+ktNn/diojA45JE4jg==", "requires": { + "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", - "lodash": "^4.17.19", "make-dir": "^2.1.0", "pirates": "^4.0.0", "source-map-support": "^0.5.16" } }, "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", + "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.0.tgz", + "integrity": "sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA==", "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", + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.0", + "@babel/types": "^7.14.0", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.1.tgz", + "integrity": "sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.14.0", "to-fast-properties": "^2.0.0" } }, @@ -2703,6 +1134,68 @@ "@types/hammerjs": "^2.0.36" } }, + "@eslint/eslintrc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", + "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -2789,19 +1282,13 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true } } }, "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, "@jest/console": { @@ -2822,34 +1309,34 @@ } }, "@jest/core": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.4.2.tgz", - "integrity": "sha512-sDva7YkeNprxJfepOctzS8cAk9TOekldh+5FhVuXS40+94SHbiicRO1VV2tSoRtgIo+POs/Cdyf8p76vPTd6dg==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/reporters": "^26.4.1", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.3.0", - "jest-config": "^26.4.2", - "jest-haste-map": "^26.3.0", - "jest-message-util": "^26.3.0", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-resolve-dependencies": "^26.4.2", - "jest-runner": "^26.4.2", - "jest-runtime": "^26.4.2", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "jest-watcher": "^26.3.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -2858,152 +1345,35 @@ }, "dependencies": { "@jest/console": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.3.0.tgz", - "integrity": "sha512-/5Pn6sJev0nPUcAdpJHMVIsA8sKizL2ZkcKPE5+dJrCccks7tcM7c9wbgHudBJbxXLoTbqsHkG1Dofoem4F09w==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.3.0", - "jest-util": "^26.3.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", "slash": "^3.0.0" } }, - "@jest/environment": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz", - "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "jest-mock": "^26.3.0" - } - }, - "@jest/fake-timers": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz", - "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" - } - }, - "@jest/globals": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.4.2.tgz", - "integrity": "sha512-Ot5ouAlehhHLRhc+sDz2/9bmNv9p5ZWZ9LE1pXGGTCXBasmi5jnYjlgYcYt03FBwLmZXCZ7GrL29c33/XRQiow==", - "dev": true, - "requires": { - "@jest/environment": "^26.3.0", - "@jest/types": "^26.3.0", - "expect": "^26.4.2" - } - }, - "@jest/reporters": { - "version": "26.4.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.4.1.tgz", - "integrity": "sha512-aROTkCLU8++yiRGVxLsuDmZsQEKO6LprlrxtAuzvtpbIFl3eIjgIf3EUxDKgomkS25R9ZzwGEdB5weCcBZlrpQ==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.3.0", - "jest-resolve": "^26.4.0", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^5.0.1" - } - }, - "@jest/source-map": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.3.0.tgz", - "integrity": "sha512-hWX5IHmMDWe1kyrKl7IhFwqOuAreIwHhbe44+XH2ZRHjrKIh0LO5eLQ/vxHFeAfRwJapmxuqlGAEYLadDq6ZGQ==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, "@jest/test-result": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", - "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, - "@jest/test-sequencer": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.4.2.tgz", - "integrity": "sha512-83DRD8N3M0tOhz9h0bn6Kl6dSp+US6DazuVF8J9m21WAp5x7CqSMaNycMP0aemC/SH/pDQQddbsfHRTBXVUgog==", - "dev": true, - "requires": { - "@jest/test-result": "^26.3.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.3.0", - "jest-runner": "^26.4.2", - "jest-runtime": "^26.4.2" - } - }, - "@jest/transform": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.3.0.tgz", - "integrity": "sha512-Isj6NB68QorGoFWvcOjlUhpkT56PqNIsXKR7XfvoDlCANn/IANlh8DrKAA2l2JKC3yWSMH5wS0GwuQM20w3b2A==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.3.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.3.0", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.3.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -3022,21 +1392,19 @@ "@types/istanbul-lib-report": "*" } }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } + "type-fest": "^0.21.3" } }, "ansi-regex": { @@ -3046,63 +1414,24 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, - "babel-jest": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.3.0.tgz", - "integrity": "sha512-sxPnQGEyHAOPF8NcUsD0g7hDCnvLL2XyblRBcgrzTWBB/mAIpWow3n1bEL+VghnnZfreLhFSBsFluRoK2tRK4g==", - "dev": true, - "requires": { - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.3.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "26.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz", - "integrity": "sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-jest": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.3.0.tgz", - "integrity": "sha512-5WPdf7nyYi2/eRxCbVrE1kKCWxgWY4RsPEbdJWFm7QsesFGqjdkyLeu1zRkwM1cxK6EPIlNd6d2AxLk7J+t4pw==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.2.0", - "babel-preset-current-node-syntax": "^0.1.3" - } - }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -3112,39 +1441,22 @@ "fill-range": "^7.0.1" } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3160,72 +1472,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "diff-sequences": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.3.0.tgz", - "integrity": "sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "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==", "dev": true }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "expect": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.2.tgz", - "integrity": "sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-regex-util": "^26.0.0" - } - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -3235,163 +1487,25 @@ "to-regex-range": "^5.0.1" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, - "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==", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "jest-changed-files": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.3.0.tgz", - "integrity": "sha512-1C4R4nijgPltX6fugKxM4oQ18zimS7LqQ+zTTY8lMCMFPrxqBFb7KJH0Z2fRQJvw2Slbaipsqq7s1mgX5Iot+g==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "execa": "^4.0.0", - "throat": "^5.0.0" - } - }, - "jest-config": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.4.2.tgz", - "integrity": "sha512-QBf7YGLuToiM8PmTnJEdRxyYy3mHWLh24LJZKVdXZ2PNdizSe1B/E8bVm+HYcjbEzGuVXDv/di+EzdO/6Gq80A==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.4.2", - "@jest/types": "^26.3.0", - "babel-jest": "^26.3.0", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.3.0", - "jest-environment-node": "^26.3.0", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.4.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.4.2" - } - }, - "jest-diff": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.4.2.tgz", - "integrity": "sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.3.0", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" - } - }, - "jest-each": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.4.2.tgz", - "integrity": "sha512-p15rt8r8cUcRY0Mvo1fpkOGYm7iI8S6ySxgIdfh3oOIv+gHwrHTy5VWCGOecWUhDsit4Nz8avJWdT07WLpbwDA==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.3.0", - "pretty-format": "^26.4.2" - } - }, - "jest-environment-jsdom": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.3.0.tgz", - "integrity": "sha512-zra8He2btIMJkAzvLaiZ9QwEPGEetbxqmjEBQwhH3CA+Hhhu0jSiEJxnJMbX28TGUvPLxBt/zyaTLrOPF4yMJA==", - "dev": true, - "requires": { - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0", - "jsdom": "^16.2.2" - } - }, - "jest-environment-node": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.3.0.tgz", - "integrity": "sha512-c9BvYoo+FGcMj5FunbBgtBnbR5qk3uky8PKyRVpSfe2/8+LrNQMiXX53z6q2kY+j15SkjQCOSL/6LHnCPLVHNw==", - "dev": true, - "requires": { - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" - } - }, "jest-get-type": { "version": "26.3.0", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", @@ -3399,12 +1513,12 @@ "dev": true }, "jest-haste-map": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.3.0.tgz", - "integrity": "sha512-DHWBpTJgJhLLGwE5Z1ZaqLTYqeODQIZpby0zMBsCU9iRFHYyhklYqP4EiG73j5dkbaAdSZhgB938mL51Q5LeZA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", @@ -3412,217 +1526,48 @@ "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.3.0", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" } }, - "jest-jasmine2": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.4.2.tgz", - "integrity": "sha512-z7H4EpCldHN1J8fNgsja58QftxBSL+JcwZmaXIvV9WKIM+x49F4GLHu/+BQh2kzRKHAgaN/E82od+8rTOBPyPA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.3.0", - "@jest/source-map": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.4.2", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-runtime": "^26.4.2", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "pretty-format": "^26.4.2", - "throat": "^5.0.0" - } - }, - "jest-leak-detector": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.4.2.tgz", - "integrity": "sha512-akzGcxwxtE+9ZJZRW+M2o+nTNnmQZxrHJxX/HjgDaU5+PLmY1qnQPnMjgADPGCRPhB+Yawe1iij0REe+k/aHoA==", - "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" - } - }, - "jest-matcher-utils": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.4.2.tgz", - "integrity": "sha512-KcbNqWfWUG24R7tu9WcAOKKdiXiXCbMvQYT6iodZ9k1f7065k0keUOW6XpJMMvah+hTfqkhJhRXmA3r3zMAg0Q==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.4.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" - } - }, "jest-message-util": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.3.0.tgz", - "integrity": "sha512-xIavRYqr4/otGOiLxLZGj3ieMmjcNE73Ui+LdSW/Y790j5acqCsAdDiLIbzHCZMpN07JOENRWX5DcU+OQ+TjTA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.3.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, - "jest-mock": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.3.0.tgz", - "integrity": "sha512-PeaRrg8Dc6mnS35gOo/CbZovoDPKAeB1FICZiuagAgGvbWdNNyjQjkOaGUa/3N3JtpQ/Mh9P4A2D4Fv51NnP8Q==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "@types/node": "*" - } - }, - "jest-resolve": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.4.0.tgz", - "integrity": "sha512-bn/JoZTEXRSlEx3+SfgZcJAVuTMOksYq9xe9O6s4Ekg84aKBObEaVXKOEilULRqviSLAYJldnoWV9c07kwtiCg==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.3.0", - "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.2.tgz", - "integrity": "sha512-ADHaOwqEcVc71uTfySzSowA/RdxUpCxhxa2FNLiin9vWLB1uLPad3we+JSSROq5+SrL9iYPdZZF8bdKM7XABTQ==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.4.2" - } - }, - "jest-runner": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.4.2.tgz", - "integrity": "sha512-FgjDHeVknDjw1gRAYaoUoShe1K3XUuFMkIaXbdhEys+1O4bEJS8Avmn4lBwoMfL8O5oFTdWYKcf3tEJyyYyk8g==", - "dev": true, - "requires": { - "@jest/console": "^26.3.0", - "@jest/environment": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.4.2", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.3.0", - "jest-leak-detector": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-resolve": "^26.4.0", - "jest-runtime": "^26.4.2", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - } - }, - "jest-runtime": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.4.2.tgz", - "integrity": "sha512-4Pe7Uk5a80FnbHwSOk7ojNCJvz3Ks2CNQWT5Z7MJo4tX0jb3V/LThKvD9tKPNVNyeMH98J/nzGlcwc00R2dSHQ==", - "dev": true, - "requires": { - "@jest/console": "^26.3.0", - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/globals": "^26.4.2", - "@jest/source-map": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.4.2", - "jest-haste-map": "^26.3.0", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.3.1" - } - }, "jest-serializer": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.3.0.tgz", - "integrity": "sha512-IDRBQBLPlKa4flg77fqg0n/pH87tcRKwe8zxOVTWISxGpPHYkRZ1dXKyh04JOja7gppc60+soKVZ791mruVdow==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { "@types/node": "*", "graceful-fs": "^4.2.4" } }, - "jest-snapshot": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.4.2.tgz", - "integrity": "sha512-N6Uub8FccKlf5SBFnL2Ri/xofbaA68Cc3MGjP/NuwgnsvWh+9hLIR/DhrxbSiKXMY9vUW5dI6EW1eHaDHqe9sg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.3.0", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.4.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.4.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.3.0", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-resolve": "^26.4.0", - "natural-compare": "^1.4.0", - "pretty-format": "^26.4.2", - "semver": "^7.3.2" - } - }, "jest-util": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.3.0.tgz", - "integrity": "sha512-4zpn6bwV0+AMFN0IYhH/wnzIQzRaYVrz1A8sYnRnj4UXDXbOVtWmlaZkO9mipFqZ13okIfN87aDoJWB7VH6hcw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -3631,38 +1576,23 @@ } }, "jest-validate": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.4.2.tgz", - "integrity": "sha512-blft+xDX7XXghfhY0mrsBCYhX365n8K5wNDC4XAcNKqqjEzsRUSXP44m6PL0QJEW2crxQFLLztVnJ4j7oPlQrQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "camelcase": "^6.0.0", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^26.4.2" - } - }, - "jest-watcher": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.3.0.tgz", - "integrity": "sha512-XnLdKmyCGJ3VoF6G/p5ohbJ04q/vv5aH9ENI+i6BL0uu9WWB6Z7Z2lhQQk0d2AVZcRGp1yW+/TsoToMhBFPRdQ==", - "dev": true, - "requires": { - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.3.0", - "string-length": "^4.0.1" + "pretty-format": "^26.6.2" } }, "jest-worker": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", - "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { "@types/node": "*", @@ -3670,15 +1600,6 @@ "supports-color": "^7.0.0" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -3686,34 +1607,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "node-notifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", - "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" + "picomatch": "^2.2.3" } }, "normalize-path": { @@ -3722,104 +1622,22 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, "pretty-format": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", - "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" } }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "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==", + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "rimraf": { @@ -3831,59 +1649,15 @@ "glob": "^7.1.3" } }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" } }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -3893,12 +1667,6 @@ "ansi-regex": "^5.0.0" } }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3908,12 +1676,6 @@ "has-flag": "^4.0.0" } }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3924,151 +1686,79 @@ } }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true - }, - "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", - "dev": true, - "optional": true - }, - "v8-to-istanbul": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz", - "integrity": "sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.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": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } } } }, "@jest/environment": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.1.0.tgz", - "integrity": "sha512-86+DNcGongbX7ai/KE/S3/NcUVZfrwvFzOOWX/W+OOTvTds7j07LtC+MgGydH5c8Ri3uIrvdmVgd1xFD5zt/xA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "requires": { - "@jest/fake-timers": "^26.1.0", - "@jest/types": "^26.1.0", - "jest-mock": "^26.1.0" + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" }, "dependencies": { "@jest/fake-timers": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.1.0.tgz", - "integrity": "sha512-Y5F3kBVWxhau3TJ825iuWy++BAuQzK/xEa+wD9vDH3RytW9f2DbMVodfUQC54rZDX3POqdxCgcKdgcOL0rYUpA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", - "jest-message-util": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-util": "^26.1.0" + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -4082,9 +1772,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4134,37 +1824,40 @@ "dev": true }, "jest-message-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz", - "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.1.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, "jest-mock": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.1.0.tgz", - "integrity": "sha512-1Rm8EIJ3ZFA8yCIie92UbxZWj9SuVmUGcyhLHyAhY6WI3NIct38nVcfOPWhJteqSn8V8e3xOMha9Ojfazfpovw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dev": true, "requires": { - "@jest/types": "^26.1.0" + "@jest/types": "^26.6.2", + "@types/node": "*" } }, "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", @@ -4172,34 +1865,46 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -4247,42 +1952,51 @@ } }, "@jest/globals": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.1.0.tgz", - "integrity": "sha512-MKiHPNaT+ZoG85oMaYUmGHEqu98y3WO2yeIDJrs2sJqHhYOy3Z6F7F/luzFomRQ8SQ1wEkmahFAz2291Iv8EAw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", "dev": true, "requires": { - "@jest/environment": "^26.1.0", - "@jest/types": "^26.1.0", - "expect": "^26.1.0" + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" }, "dependencies": { "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4311,9 +2025,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -4322,16 +2036,16 @@ } }, "@jest/reporters": { - "version": "26.4.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.4.1.tgz", - "integrity": "sha512-aROTkCLU8++yiRGVxLsuDmZsQEKO6LprlrxtAuzvtpbIFl3eIjgIf3EUxDKgomkS25R9ZzwGEdB5weCcBZlrpQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -4342,71 +2056,48 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.3.0", - "jest-resolve": "^26.4.0", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "node-notifier": "^8.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^5.0.1" + "v8-to-istanbul": "^7.0.0" }, "dependencies": { "@jest/console": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.3.0.tgz", - "integrity": "sha512-/5Pn6sJev0nPUcAdpJHMVIsA8sKizL2ZkcKPE5+dJrCccks7tcM7c9wbgHudBJbxXLoTbqsHkG1Dofoem4F09w==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.3.0", - "jest-util": "^26.3.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", "slash": "^3.0.0" } }, "@jest/test-result": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", - "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, - "@jest/transform": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.3.0.tgz", - "integrity": "sha512-Isj6NB68QorGoFWvcOjlUhpkT56PqNIsXKR7XfvoDlCANn/IANlh8DrKAA2l2JKC3yWSMH5wS0GwuQM20w3b2A==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.3.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.3.0", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.3.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -4425,20 +2116,31 @@ "@types/istanbul-lib-report": "*" } }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -4455,9 +2157,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4494,20 +2196,10 @@ "to-regex-range": "^5.0.1" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -4524,12 +2216,12 @@ "dev": true }, "jest-haste-map": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.3.0.tgz", - "integrity": "sha512-DHWBpTJgJhLLGwE5Z1ZaqLTYqeODQIZpby0zMBsCU9iRFHYyhklYqP4EiG73j5dkbaAdSZhgB938mL51Q5LeZA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", @@ -4537,50 +2229,35 @@ "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.3.0", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-message-util": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.3.0.tgz", - "integrity": "sha512-xIavRYqr4/otGOiLxLZGj3ieMmjcNE73Ui+LdSW/Y790j5acqCsAdDiLIbzHCZMpN07JOENRWX5DcU+OQ+TjTA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.3.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, - "jest-resolve": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.4.0.tgz", - "integrity": "sha512-bn/JoZTEXRSlEx3+SfgZcJAVuTMOksYq9xe9O6s4Ekg84aKBObEaVXKOEilULRqviSLAYJldnoWV9c07kwtiCg==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.3.0", - "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", - "slash": "^3.0.0" - } - }, "jest-serializer": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.3.0.tgz", - "integrity": "sha512-IDRBQBLPlKa4flg77fqg0n/pH87tcRKwe8zxOVTWISxGpPHYkRZ1dXKyh04JOja7gppc60+soKVZ791mruVdow==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { "@types/node": "*", @@ -4588,12 +2265,12 @@ } }, "jest-util": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.3.0.tgz", - "integrity": "sha512-4zpn6bwV0+AMFN0IYhH/wnzIQzRaYVrz1A8sYnRnj4UXDXbOVtWmlaZkO9mipFqZ13okIfN87aDoJWB7VH6hcw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -4602,9 +2279,9 @@ } }, "jest-worker": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", - "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { "@types/node": "*", @@ -4612,15 +2289,6 @@ "supports-color": "^7.0.0" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4628,13 +2296,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "normalize-path": { @@ -4643,64 +2311,24 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" } }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -4708,9 +2336,9 @@ "dev": true }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -4733,24 +2361,6 @@ "requires": { "is-number": "^7.0.0" } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } } } }, @@ -4807,69 +2417,91 @@ } }, "@jest/test-sequencer": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.1.0.tgz", - "integrity": "sha512-Z/hcK+rTq56E6sBwMoQhSRDVjqrGtj1y14e2bIgcowARaIE1SgOanwx6gvY4Q9gTKMoZQXbXvptji+q5GYxa6Q==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", "dev": true, "requires": { - "@jest/test-result": "^26.1.0", + "@jest/test-result": "^26.6.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.1.0", - "jest-runner": "^26.1.0", - "jest-runtime": "^26.1.0" + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" }, "dependencies": { "@jest/console": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.1.0.tgz", - "integrity": "sha512-+0lpTHMd/8pJp+Nd4lyip+/Iyf2dZJvcCqrlkeZQoQid+JlThA4M9vxHtheyrQ99jJTMQam+es4BcvZ5W5cC3A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.1.0", - "jest-util": "^26.1.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", "slash": "^3.0.0" } }, "@jest/test-result": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.1.0.tgz", - "integrity": "sha512-Xz44mhXph93EYMA8aYDz+75mFbarTV/d/x0yMdI3tfSRs/vh4CqSxgzVmCps1fPkHDCtn0tU8IH9iCKgGeGpfw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.1.0", - "@jest/types": "^26.1.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -4886,9 +2518,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4926,9 +2558,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -4945,58 +2577,62 @@ "dev": true }, "jest-haste-map": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.1.0.tgz", - "integrity": "sha512-WeBS54xCIz9twzkEdm6+vJBXgRBQfdbbXD0dk8lJh7gLihopABlJmIQFdWSDDtuDe4PRiObsjZSUjbJ1uhWEpA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", + "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", - "jest-serializer": "^26.1.0", - "jest-util": "^26.1.0", - "jest-worker": "^26.1.0", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "micromatch": "^4.0.2", "sane": "^4.0.3", - "walker": "^1.0.7", - "which": "^2.0.2" + "walker": "^1.0.7" } }, "jest-message-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz", - "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.1.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, "jest-serializer": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.1.0.tgz", - "integrity": "sha512-eqZOQG/0+MHmr25b2Z86g7+Kzd5dG9dhCiUoyUNJPgiqi38DqbDEOlHcNijyfZoj74soGBohKBZuJFS18YTJ5w==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { + "@types/node": "*", "graceful-fs": "^4.2.4" } }, "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", @@ -5004,11 +2640,12 @@ } }, "jest-worker": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.1.0.tgz", - "integrity": "sha512-Z9P5pZ6UC+kakMbNJn+tA2RdVdNX5WH1x+5UCBZ9MxIK24pjYtFt96fK+UwBTrjLYm232g1xz0L3eTh51OW+yQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" } @@ -5020,13 +2657,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "normalize-path": { @@ -5035,25 +2672,37 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -5067,34 +2716,25 @@ "requires": { "is-number": "^7.0.0" } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, "@jest/transform": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.1.0.tgz", - "integrity": "sha512-ICPm6sUXmZJieq45ix28k0s+d/z2E8CHDsq+WwtWI6kW8m7I8kPqarSEcUN86entHQ570ZBRci5OWaKL0wlAWw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.1.0", + "jest-haste-map": "^26.6.2", "jest-regex-util": "^26.0.0", - "jest-util": "^26.1.0", + "jest-util": "^26.6.2", "micromatch": "^4.0.2", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -5103,31 +2743,40 @@ }, "dependencies": { "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -5144,9 +2793,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -5178,9 +2827,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -5197,30 +2846,31 @@ "dev": true }, "jest-haste-map": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.1.0.tgz", - "integrity": "sha512-WeBS54xCIz9twzkEdm6+vJBXgRBQfdbbXD0dk8lJh7gLihopABlJmIQFdWSDDtuDe4PRiObsjZSUjbJ1uhWEpA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", + "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", - "jest-serializer": "^26.1.0", - "jest-util": "^26.1.0", - "jest-worker": "^26.1.0", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "micromatch": "^4.0.2", "sane": "^4.0.3", - "walker": "^1.0.7", - "which": "^2.0.2" + "walker": "^1.0.7" } }, "jest-serializer": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.3.0.tgz", - "integrity": "sha512-IDRBQBLPlKa4flg77fqg0n/pH87tcRKwe8zxOVTWISxGpPHYkRZ1dXKyh04JOja7gppc60+soKVZ791mruVdow==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { "@types/node": "*", @@ -5228,47 +2878,23 @@ } }, "jest-util": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.3.0.tgz", - "integrity": "sha512-4zpn6bwV0+AMFN0IYhH/wnzIQzRaYVrz1A8sYnRnj4UXDXbOVtWmlaZkO9mipFqZ13okIfN87aDoJWB7VH6hcw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "micromatch": "^4.0.2" - }, - "dependencies": { - "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - } } }, "jest-worker": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", - "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { "@types/node": "*", @@ -5283,13 +2909,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "normalize-path": { @@ -5298,12 +2924,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5311,9 +2931,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -5327,27 +2947,6 @@ "requires": { "is-number": "^7.0.0" } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } } } }, @@ -5677,11 +3276,6 @@ "react-is": "^16.12.0" } }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" - }, "ws": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", @@ -5742,9 +3336,20 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } }, "supports-color": { "version": "7.2.0", @@ -5838,26 +3443,6 @@ "requires": { "color": "^3.1.3", "react-native-iphone-x-helper": "^1.3.0" - }, - "dependencies": { - "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, - "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - } } }, "@react-navigation/native": { @@ -5892,31 +3477,11 @@ "requires": { "color": "^3.1.3", "react-native-iphone-x-helper": "^1.3.0" - }, - "dependencies": { - "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, - "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - } } }, "@remobile/react-native-qrcode-local-image": { - "version": "git+ssh://git@github.com/BlueWallet/react-native-qrcode-local-image.git#b8baa79ba3b3859c9353c9dee7f01392b989a530", - "from": "@remobile/react-native-qrcode-local-image@git+https://github.com/BlueWallet/react-native-qrcode-local-image.git" + "version": "git+https://github.com/BlueWallet/react-native-qrcode-local-image.git#b8baa79ba3b3859c9353c9dee7f01392b989a530", + "from": "git+https://github.com/BlueWallet/react-native-qrcode-local-image.git" }, "@sentry/browser": { "version": "6.2.1", @@ -5930,9 +3495,9 @@ } }, "@sentry/cli": { - "version": "1.64.0", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-1.64.0.tgz", - "integrity": "sha512-MHWHiYVBJaE0y/JVSziZIclBYhINiI4VsJ10r7rcJYAwDah3JYBPMrv0iwmuxBVWRFMSuAmSpivkzn67JS6sPg==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-1.64.1.tgz", + "integrity": "sha512-G+TzOSG+58fG3f5uYvPXweK65f1sP/8MWSEuRmJE4P0JJTTXQI6WErvrqrhfR5F7UVvGzltEbpc8rvO7N3+88A==", "requires": { "https-proxy-agent": "^5.0.0", "mkdirp": "^0.5.5", @@ -6041,9 +3606,9 @@ } }, "@sentry/wizard": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@sentry/wizard/-/wizard-1.2.4.tgz", - "integrity": "sha512-FbS20ZBMK9fSdzkUHUPAh/SmIKK/EYsixoe3jp4PIVzdooCJ7mywdo4NcNnr9Hmg6VnL5SfLATMwXO+FZCzZZg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@sentry/wizard/-/wizard-1.2.7.tgz", + "integrity": "sha512-1R23M4nvJg9MkrnEoj2pYH7VTTqS3BueEkCmdI4F+7TJG9BOLGLK3LJoVH44J/tmcZnAxUeTdPP46eH5VhoFMg==", "requires": { "@sentry/cli": "^1.52.4", "chalk": "^2.4.1", @@ -6058,9 +3623,9 @@ } }, "@sinonjs/commons": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", - "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -6081,9 +3646,9 @@ "integrity": "sha512-ZkrXnZLC1mc4b9QLKaSrsxV4oxTRs10OI2kgSApT8G0v1jrmqppSHUVQ15kLorzsFBTjvf7OKF4kAibuuNQ+xA==" }, "@types/babel__core": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", - "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -6094,18 +3659,18 @@ } }, "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -6113,9 +3678,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", - "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -6129,12 +3694,6 @@ "@types/node": "*" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -6142,9 +3701,9 @@ "dev": true }, "@types/graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, "requires": { "@types/node": "*" @@ -6178,9 +3737,9 @@ } }, "@types/json-schema": { - "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==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, "@types/json5": { @@ -6201,9 +3760,9 @@ "dev": true }, "@types/prettier": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.2.tgz", - "integrity": "sha512-IkVfat549ggtkZUthUzEX49562eGikhSYeVGX97SkMFn+sTZrgRewXjQ4tPKFPCykZHkX1Zfd9OoELGqKU2jJA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", + "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", "dev": true }, "@types/prop-types": { @@ -6212,18 +3771,19 @@ "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "@types/react": { - "version": "16.9.53", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.53.tgz", - "integrity": "sha512-4nW60Sd4L7+WMXH1D6jCdVftuW7j4Za6zdp6tJ33Rqv0nk1ZAmQKML9ZLD4H0dehA3FZxXR/GM8gXplf82oNGw==", + "version": "17.0.5", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.5.tgz", + "integrity": "sha512-bj4biDB9ZJmGAYTWSKJly6bMr4BLUiBrx9ujiJEoP9XIDY9CTaPGxE5QWN/1WjpPLzYF7/jRNnV2nNxNe970sw==", "requires": { "@types/prop-types": "*", + "@types/scheduler": "*", "csstype": "^3.0.2" } }, "@types/react-native": { - "version": "0.63.30", - "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.63.30.tgz", - "integrity": "sha512-8/PrOjuUaPTCfMeW12ubseZPUGdbRhxYDa/aT+0D0KWVTe60b4H/gJrcfJmBXC6EcCFcimuTzQCv8/S03slYqA==", + "version": "0.64.4", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.64.4.tgz", + "integrity": "sha512-VqnlmadGkD5usREvnuyVpWDS1W8f6cCz6MP5fZdgONsaZ9/Ijfb9Iq9MZ5O3bnW1OyJixDX9HtSp3COsFSLD8Q==", "requires": { "@types/react": "*" } @@ -6237,31 +3797,36 @@ "@types/react-native": "*" } }, + "@types/scheduler": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" }, "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" }, "@typescript-eslint/eslint-plugin": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.6.1.tgz", - "integrity": "sha512-06lfjo76naNeOMDl+mWG9Fh/a0UHKLGhin+mGaIw72FUMbMGBkdi/FEJmgEDzh4eE73KIYzHWvOCYJ0ak7nrJQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz", + "integrity": "sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "3.6.1", + "@typescript-eslint/experimental-utils": "3.10.1", "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", @@ -6269,54 +3834,72 @@ "tsutils": "^3.17.1" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@typescript-eslint/experimental-utils": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.6.1.tgz", - "integrity": "sha512-oS+hihzQE5M84ewXrTlVx7eTgc52eu+sVmG7ayLfOhyZmJ8Unvf3osyFQNADHP26yoThFfbxcibbO0d2FjnYhg==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/types": "3.6.1", - "@typescript-eslint/typescript-estree": "3.6.1", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.6.1.tgz", - "integrity": "sha512-SLihQU8RMe77YJ/jGTqOt0lMq7k3hlPVfp7v/cxMnXA9T0bQYoMDfTsNgHXpwSJM1Iq2aAJ8WqekxUwGv5F67Q==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", + "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "3.6.1", - "@typescript-eslint/types": "3.6.1", - "@typescript-eslint/typescript-estree": "3.6.1", + "@typescript-eslint/experimental-utils": "3.10.1", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/types": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.6.1.tgz", - "integrity": "sha512-NPxd5yXG63gx57WDTW1rp0cF3XlNuuFFB5G+Kc48zZ+51ZnQn9yjDEsjTPQ+aWM+V+Z0I4kuTFKjKvgcT1F7xQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.6.1.tgz", - "integrity": "sha512-G4XRe/ZbCZkL1fy09DPN3U0mR6SayIv1zSeBNquRFRk7CnVLgkC2ZPj8llEMJg5Y8dJ3T76SvTGtceytniaztQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", "dev": true, "requires": { - "@typescript-eslint/types": "3.6.1", - "@typescript-eslint/visitor-keys": "3.6.1", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", "debug": "^4.1.1", "glob": "^7.1.6", "is-glob": "^4.0.1", @@ -6325,18 +3908,36 @@ "tsutils": "^3.17.1" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@typescript-eslint/visitor-keys": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.6.1.tgz", - "integrity": "sha512-qC8Olwz5ZyMTZrh4Wl3K4U6tfms0R/mzU4/5W3XeUZptVraGVmbptJbn6h2Ey6Rb3hOs3zWoAUebZk8t47KGiQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" @@ -6348,9 +3949,9 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" }, "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, "abbrev": { @@ -6367,9 +3968,9 @@ } }, "abortcontroller-polyfill": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.5.0.tgz", - "integrity": "sha512-O6Xk757Jb4o0LMzMOMdWvxpHWrQzruYBaUruFaIOfAQRnWFxfdXYobw12jrVHGtoXk6WiiyYzc0QWN9aL62HQA==" + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.1.tgz", + "integrity": "sha512-yml9NiDEH4M4p0G4AcPkg8AAa4mF3nfYF28VQxaokpO67j9H7gWgmsVWJ/f1Rn+PzsnDYvzJzWIQzCqDKRvWlA==" }, "absolute-path": { "version": "0.0.0", @@ -6401,9 +4002,9 @@ } }, "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-globals": { @@ -6417,9 +4018,9 @@ } }, "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true }, "acorn-walk": { @@ -6446,9 +4047,9 @@ } }, "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6518,6 +4119,21 @@ "colorette": "^1.0.7", "slice-ansi": "^2.0.0", "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "ansi-gray": { @@ -6537,9 +4153,9 @@ } }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "3.2.1", @@ -6590,19 +4206,6 @@ "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } } } }, @@ -6643,13 +4246,15 @@ "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" }, "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", "is-string": "^1.0.5" } }, @@ -6674,23 +4279,25 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "es-abstract": "^1.18.0-next.1" } }, "array.prototype.flatmap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", - "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", + "es-abstract": "^1.18.0-next.1", "function-bind": "^1.1.1" } }, @@ -6803,9 +4410,9 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "babel-cli": { "version": "6.26.0", @@ -6849,12 +4456,6 @@ "js-tokens": "^3.0.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -6880,15 +4481,6 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -7002,47 +4594,56 @@ } }, "babel-jest": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.1.0.tgz", - "integrity": "sha512-Nkqgtfe7j6PxLO6TnCQQlkMm8wdTdnIF8xrdpooHCuD5hXRzVEPbPneTJKknH5Dsv3L8ip9unHDAp48YQ54Dkg==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", "dev": true, "requires": { - "@jest/transform": "^26.1.0", - "@jest/types": "^26.1.0", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.1.0", + "babel-preset-jest": "^26.6.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" }, "dependencies": { "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7070,16 +4671,10 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -7118,9 +4713,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.1.0.tgz", - "integrity": "sha512-qhqLVkkSlqmC83bdMhM8WW4Z9tB+JkjqAqlbbohS9sJLT5Ha2vfzuKqg5yenXrAjOPG2YC0WiXdH3a9PvB+YYw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -7129,6 +4724,40 @@ "@types/babel__traverse": "^7.0.6" } }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", + "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.0", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", + "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.0", + "core-js-compat": "^3.9.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", + "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.0" + } + }, "babel-plugin-syntax-flow": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", @@ -7170,9 +4799,9 @@ } }, "babel-preset-current-node-syntax": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", - "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -7185,7 +4814,8 @@ "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" } }, "babel-preset-fbjs": { @@ -7232,13 +4862,13 @@ } }, "babel-preset-jest": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.1.0.tgz", - "integrity": "sha512-na9qCqFksknlEj5iSdw1ehMVR06LCCTkZLGKeEtxDDdhg8xpUF09m29Kvh1pRbZ07h7AQ5ttLYUwpXL4tO6w7w==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^26.1.0", - "babel-preset-current-node-syntax": "^0.1.2" + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" } }, "babel-register": { @@ -7365,9 +4995,9 @@ "dev": true }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", @@ -7433,9 +5063,9 @@ } }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bc-bech32": { "version": "file:blue_modules/bc-bech32", @@ -7488,6 +5118,11 @@ "file-uri-to-path": "1.0.0" } }, + "bip174": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.0.1.tgz", + "integrity": "sha512-i3X26uKJOkDTAalYAp0Er+qGMDhrbbh2o93/xiPyAN2s25KrClSpe3VXo/7mNJoqA5qfko8rLS2l3RWZgYmjKQ==" + }, "bip21": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/bip21/-/bip21-2.0.3.tgz", @@ -7555,13 +5190,6 @@ "typeforce": "^1.11.3", "varuint-bitcoin": "^1.0.4", "wif": "^2.0.1" - }, - "dependencies": { - "bip174": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.0.1.tgz", - "integrity": "sha512-i3X26uKJOkDTAalYAp0Er+qGMDhrbbh2o93/xiPyAN2s25KrClSpe3VXo/7mNJoqA5qfko8rLS2l3RWZgYmjKQ==" - } } }, "bitcoinjs-message": { @@ -7624,9 +5252,9 @@ "integrity": "sha512-vE52okJvzsVWhcgUHOv+69OG3Mdg151xyn41aVQN/5W5S+S43qZhxECtYLAEHMSFWX6Mv5IZrzj3T5+JqXfj5Q==" }, "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "bolt11": { "version": "1.3.1", @@ -7673,9 +5301,9 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "boolean": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz", - "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.3.tgz", + "integrity": "sha512-EqrTKXQX6Z3A2nRmMEIlAIfjQOgFnVO2nqZGpbcsPnYGWBwpFqzlrozU1dy+S2iqfYDLh26ef4KrgTxu9xQrxA==" }, "bplist-creator": { "version": "0.0.8", @@ -7810,18 +5438,24 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "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==" } } }, "browserslist": { - "version": "4.14.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.6.tgz", - "integrity": "sha512-zeFYcUo85ENhc/zxHbiIp0LGzzTrE2Pv2JhxvS7kpUb9Q9D38kUX6Bie7pGutJ/5iF5rOxE7CepAuWD56xJ33A==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "requires": { - "caniuse-lite": "^1.0.30001154", - "electron-to-chromium": "^1.3.585", + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", "escalade": "^3.1.1", - "node-releases": "^1.1.65" + "node-releases": "^1.1.71" } }, "bs58": { @@ -7851,9 +5485,9 @@ } }, "bson": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.2.2.tgz", - "integrity": "sha512-9fX257PVHAUpiRGmY3356RVWKQxLA73BgjA/x5MGuJkTEMeG7yzjuBrsiFB67EXRJnFVKrbJY9t/M+oElKYktQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.3.0.tgz", + "integrity": "sha512-LkKKeFJx5D6RRCRvLE+fDs40M2ZQNuk7W7tFXmKd7OOcQQ+BHdzCgRdL4XEGjc1UEGtiYuMvIVk91Bv8qsI50A==", "requires": { "buffer": "^5.6.0" }, @@ -7876,13 +5510,6 @@ "requires": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" - }, - "dependencies": { - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - } } }, "buffer-alloc": { @@ -7970,6 +5597,15 @@ "unset-value": "^1.0.0" } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -7997,9 +5633,9 @@ "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" }, "caniuse-lite": { - "version": "1.0.30001156", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001156.tgz", - "integrity": "sha512-z7qztybA2eFZTB6Z3yvaQBIoJpQtsewRD74adw2UbRWwsRq3jIPvgrQGawBMbfafekQaD21FWuXNcywtTDGGCw==" + "version": "1.0.30001223", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001223.tgz", + "integrity": "sha512-k/RYs6zc/fjbxTjaWZemeSmOjO0JJV+KguOBA3NwPup8uzxM1cMhR2BD9XmO86GuqaqTCO8CgkgH9Rz//vdDiA==" }, "capture-exit": { "version": "2.0.0", @@ -8204,6 +5840,12 @@ "safe-buffer": "^5.0.1" } }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -8234,9 +5876,9 @@ } }, "cli-spinners": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", - "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==" }, "cli-width": { "version": "2.2.1", @@ -8253,6 +5895,25 @@ "wrap-ansi": "^2.0.0" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -8268,6 +5929,16 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -8300,12 +5971,12 @@ } }, "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "requires": { "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-string": "^1.5.4" } }, "color-convert": { @@ -8322,9 +5993,9 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -8336,9 +6007,9 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" }, "colors": { "version": "1.4.0", @@ -8422,11 +6093,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, @@ -8459,19 +6125,6 @@ "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } } } }, @@ -8518,13 +6171,6 @@ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } } }, "copy-descriptor": { @@ -8533,16 +6179,16 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.12.0.tgz", + "integrity": "sha512-vvaN8EOvYBEjrr+MN3vCKrMNc/xdYZI+Rt/uPMROi4T5Hj8Fz6TiPQm2mrB9aZoQVW1lCFHYmMrv99aUct9mkg==", "requires": { - "browserslist": "^4.8.5", + "browserslist": "^4.16.6", "semver": "7.0.0" }, "dependencies": { @@ -8613,11 +6259,11 @@ } }, "cross-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.5.tgz", - "integrity": "sha512-FFLcLtraisj5eteosnX1gf01qYDCOc4fDy0+euOt8Kn9YBY2NtXL/pCoYPavw24NIQkQqm5ZOLsGD5Zzj0gyew==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", "requires": { - "node-fetch": "2.6.0" + "node-fetch": "2.6.1" } }, "cross-spawn": { @@ -8649,11 +6295,11 @@ } }, "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==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "requires": { - "mdn-data": "2.0.6", + "mdn-data": "2.0.14", "source-map": "^0.6.1" }, "dependencies": { @@ -8665,9 +6311,9 @@ } }, "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==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" }, "cssom": { "version": "0.4.4", @@ -8693,9 +6339,9 @@ } }, "csstype": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.4.tgz", - "integrity": "sha512-xc8DUsCLmjvCfoD7LTGE0ou2MIWLx0K9RCZwSHMOdynqRsP4MtUcLeqh1HcQ2dInwDTqn+3CE0/FZh1et+p4jA==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" }, "dashdash": { "version": "1.14.1", @@ -8722,11 +6368,11 @@ "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==" }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { @@ -8735,9 +6381,9 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decimal.js": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", - "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", "dev": true }, "decode-uri-component": { @@ -8980,11 +6626,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -9025,24 +6666,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "serialize-error": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", - "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", - "requires": { - "type-fest": "^0.20.2" - } - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" - }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -9061,11 +6684,6 @@ "ansi-regex": "^5.0.0" } }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -9103,15 +6721,15 @@ } }, "detox-recorder": { - "version": "1.0.149", - "resolved": "https://registry.npmjs.org/detox-recorder/-/detox-recorder-1.0.149.tgz", - "integrity": "sha512-ycVtfSyXtG2PQOqhH57yHMXeVLZHM6dIK6hgL6UDOcD79zAuwKt4prdyzsPC7oaS6Zr4sXSZcd2DLQcbtm92KA==", + "version": "1.0.151", + "resolved": "https://registry.npmjs.org/detox-recorder/-/detox-recorder-1.0.151.tgz", + "integrity": "sha512-a4ZPo7AR5XJJiLy8Xqml8YXxrIz6R7RKfiGmG9u5MBxG2I+w+yGJTj7ZhYDfoi5StpUD+dKHTCdvycZTOQ84Cw==", "dev": true }, "diff-sequences": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.0.0.tgz", - "integrity": "sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", "dev": true }, "diffie-hellman": { @@ -9148,9 +6766,9 @@ }, "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==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" } } }, @@ -9228,9 +6846,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.589", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.589.tgz", - "integrity": "sha512-rQItBTFnol20HaaLm26UgSUduX7iGerwW7pEYX17MB1tI6LzFajiLV7iZ7LVcUcsN/7HrZUoCLrBauChy/IqEg==" + "version": "1.3.727", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz", + "integrity": "sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg==" }, "electrum-client": { "version": "git+https://github.com/BlueWallet/rn-electrum-client.git#99ebcc649d91a8dc39bea7964b02dd9ead464aa4", @@ -9247,29 +6865,29 @@ } }, "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, "emittery": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz", - "integrity": "sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", "dev": true }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encodeurl": { "version": "1.0.2", @@ -9320,19 +6938,19 @@ } }, "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, "envinfo": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", - "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==" + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==" }, "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "requires": { "prr": "~1.0.1" } @@ -9352,6 +6970,14 @@ } } }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "requires": { + "stackframe": "^1.1.1" + } + }, "errorhandler": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", @@ -9362,21 +6988,26 @@ } }, "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", "requires": { + "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" } }, "es-to-primitive": { @@ -9418,18 +7049,24 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "requires": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" }, "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -9479,28 +7116,29 @@ } }, "eslint": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.5.0.tgz", - "integrity": "sha512-vlUP10xse9sWt9SGRtcr1LAC67BENcQMFeV+w5EvLEoFe3xJ8cF1Skd0msziRx/VMC+72B4DxreCE+OR12OA6Q==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.25.0.tgz", + "integrity": "sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", + "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^1.3.0", - "espree": "^7.2.0", - "esquery": "^1.2.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -9508,7 +7146,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", + "lodash": "^4.17.21", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -9517,11 +7155,20 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^5.2.3", + "table": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -9529,19 +7176,18 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -9583,22 +7229,28 @@ "esutils": "^2.0.2" } }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", + "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" } }, "has-flag": { @@ -9614,15 +7266,24 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -9636,10 +7297,13 @@ "dev": true }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "shebang-command": { "version": "2.0.0", @@ -9665,21 +7329,21 @@ "ansi-regex": "^5.0.0" } }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9688,6 +7352,12 @@ "requires": { "isexe": "^2.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -9862,9 +7532,9 @@ } }, "eslint-plugin-import": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", - "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", "dev": true, "requires": { "array-includes": "^3.1.1", @@ -9872,7 +7542,7 @@ "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.3", + "eslint-import-resolver-node": "^0.3.4", "eslint-module-utils": "^2.6.0", "has": "^1.0.3", "minimatch": "^3.0.4", @@ -9901,11 +7571,75 @@ "isarray": "^1.0.0" } }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } } } }, @@ -9946,42 +7680,56 @@ } }, "eslint-plugin-promise": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", - "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", + "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", "dev": true }, "eslint-plugin-react": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.3.tgz", - "integrity": "sha512-txbo090buDeyV0ugF3YMWrzLIUqpYTsWSDZV9xLSmExE1P/Kmgg9++PD931r+KEWS66O1c9R4srLVVHmeHpoAg==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.23.2.tgz", + "integrity": "sha512-AfjgFQB+nYszudkxRkTFu0UR1zEQig0ArVMPloKhxwlwkzaw/fBiH0QWcBBhZONlXqQC51+nfqFrkn4EzHcGBw==", "dev": true, "requires": { - "array-includes": "^3.1.1", - "array.prototype.flatmap": "^1.2.3", + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1", - "object.entries": "^1.1.2", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.3", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.3", "prop-types": "^15.7.2", - "resolve": "^1.17.0", - "string.prototype.matchall": "^4.0.2" + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.4" + }, + "dependencies": { + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } } }, "eslint-plugin-react-hooks": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.8.tgz", - "integrity": "sha512-6SSb5AiMCPd8FDJrzah+Z4F44P2CdOaK026cXFV+o/xSRzfOiV1FNFeLl2z6xm3yqWOQEZ5OfVgiec90qV2xrQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", "dev": true }, "eslint-plugin-react-native": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-3.8.1.tgz", - "integrity": "sha512-6Z4s4nvgFRdda/1s1+uu4a6EMZwEjjJ9Bk/1yBImv0fd9U2CsGu2cUakAtV83cZKhizbWhSouXoaK4JtlScdFg==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-3.10.0.tgz", + "integrity": "sha512-4f5+hHYYq5wFhB5eptkPEAR7FfvqbS7AzScUOANfAMZtYw5qgnCxRq45bpfBaQF+iyPMim5Q8pubcpvLv75NAg==", "dev": true, "requires": { + "@babel/traverse": "^7.7.4", "eslint-plugin-react-native-globals": "^0.1.1" } }, @@ -10003,12 +7751,12 @@ "dev": true }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -10028,13 +7776,13 @@ "dev": true }, "espree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", - "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { - "acorn": "^7.3.1", - "acorn-jsx": "^5.2.0", + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" } }, @@ -10044,29 +7792,37 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true } } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "estraverse": { @@ -10118,9 +7874,9 @@ } }, "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" }, "execa": { "version": "1.0.0", @@ -10249,38 +8005,59 @@ } }, "expect": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.1.0.tgz", - "integrity": "sha512-QbH4LZXDsno9AACrN9eM0zfnby9G+OsdNgZUohjg/P0mLy1O+/bzTAJGT6VSIjVCe8yKM6SzEl/ckEOFBT7Vnw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "ansi-styles": "^4.0.0", - "jest-get-type": "^26.0.0", - "jest-matcher-utils": "^26.1.0", - "jest-message-util": "^26.1.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0" }, "dependencies": { "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -10294,9 +8071,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -10352,65 +8129,54 @@ "dev": true }, "jest-message-util": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.3.0.tgz", - "integrity": "sha512-xIavRYqr4/otGOiLxLZGj3ieMmjcNE73Ui+LdSW/Y790j5acqCsAdDiLIbzHCZMpN07JOENRWX5DcU+OQ+TjTA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.3.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" - }, - "dependencies": { - "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - } } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -10642,12 +8408,12 @@ } }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "file-uri-to-path": { @@ -10765,20 +8531,19 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "dependencies": { "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -10787,9 +8552,9 @@ } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, "flow-bin": { @@ -10861,6 +8626,13 @@ "qs": "6.9.4", "url-join": "^4.0.1", "url-parse": "^1.4.7" + }, + "dependencies": { + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + } } }, "fs-extra": { @@ -10962,51 +8734,28 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } } }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -11125,9 +8874,9 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" }, "growly": { "version": "1.3.0", @@ -11142,11 +8891,11 @@ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, @@ -11165,25 +8914,22 @@ "dev": true, "requires": { "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, "has-unicode": { "version": "2.0.1", @@ -11227,6 +8973,13 @@ "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" + }, + "dependencies": { + "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.js": { @@ -11287,9 +9040,9 @@ } }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "html-encoding-sniffer": { @@ -11375,9 +9128,9 @@ } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "5.1.8", @@ -11415,6 +9168,13 @@ "requires": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } } }, "import-local": { @@ -11475,7 +9235,8 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "indexof": { "version": "0.0.1", @@ -11497,9 +9258,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "inquirer": { "version": "6.5.2", @@ -11519,17 +9280,63 @@ "string-width": "^2.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + } } }, "internal-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", - "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", "dev": true, "requires": { - "es-abstract": "^1.17.0-next.1", + "get-intrinsic": "^1.1.0", "has": "^1.0.3", - "side-channel": "^1.0.2" + "side-channel": "^1.0.4" } }, "invariant": { @@ -11550,12 +9357,6 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, "is": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", @@ -11580,15 +9381,23 @@ } }, "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } }, "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -11599,15 +9408,23 @@ "binary-extensions": "^1.0.0" } }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "requires": { + "call-bind": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" }, "is-ci": { "version": "2.0.0", @@ -11617,6 +9434,14 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz", + "integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==", + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -11636,9 +9461,9 @@ } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.3.tgz", + "integrity": "sha512-tDpEUInNcy2Yw3lNSepK3Wdw1RnXLcIVienz6Ou631Acl15cJyRWK4dgA1vCmOEgIbtOV0W7MHg+AR2Gdg1NXQ==" }, "is-descriptor": { "version": "0.1.6", @@ -11663,9 +9488,9 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "optional": true }, @@ -11704,9 +9529,12 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } }, "is-generator-fn": { "version": "2.1.0", @@ -11715,9 +9543,9 @@ "dev": true }, "is-generator-function": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", - "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz", + "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==" }, "is-glob": { "version": "4.0.1", @@ -11728,6 +9556,11 @@ "is-extglob": "^2.1.1" } }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -11746,6 +9579,11 @@ } } }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" + }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -11777,9 +9615,9 @@ "optional": true }, "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, "is-primitive": { @@ -11790,10 +9628,11 @@ "optional": true }, "is-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", "requires": { + "call-bind": "^1.0.2", "has-symbols": "^1.0.1" } }, @@ -11805,8 +9644,7 @@ "is-string": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" }, "is-symbol": { "version": "1.0.3", @@ -11817,12 +9655,13 @@ } }, "is-typed-array": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz", - "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", "requires": { - "available-typed-arrays": "^1.0.0", - "es-abstract": "^1.17.4", + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", "foreach": "^2.0.5", "has-symbols": "^1.0.1" } @@ -11941,9 +9780,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -11981,53 +9820,70 @@ } }, "jest": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.1.0.tgz", - "integrity": "sha512-LIti8jppw5BcQvmNJe4w2g1N/3V68HUfAv9zDVm7v+VAtQulGhH0LnmmiVkbNE4M4I43Bj2fXPiBGKt26k9tHw==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", "dev": true, "requires": { - "@jest/core": "^26.1.0", + "@jest/core": "^26.6.3", "import-local": "^3.0.2", - "jest-cli": "^26.1.0" + "jest-cli": "^26.6.3" }, "dependencies": { "@jest/console": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.1.0.tgz", - "integrity": "sha512-+0lpTHMd/8pJp+Nd4lyip+/Iyf2dZJvcCqrlkeZQoQid+JlThA4M9vxHtheyrQ99jJTMQam+es4BcvZ5W5cC3A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.1.0", - "jest-util": "^26.1.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", "slash": "^3.0.0" } }, "@jest/test-result": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.1.0.tgz", - "integrity": "sha512-Xz44mhXph93EYMA8aYDz+75mFbarTV/d/x0yMdI3tfSRs/vh4CqSxgzVmCps1fPkHDCtn0tU8IH9iCKgGeGpfw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.1.0", - "@jest/types": "^26.1.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -12035,12 +9891,11 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -12054,15 +9909,15 @@ } }, "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -12095,12 +9950,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", @@ -12151,55 +10000,57 @@ "dev": true }, "jest-cli": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.1.0.tgz", - "integrity": "sha512-Imumvjgi3rU7stq6SJ1JUEMaV5aAgJYXIs0jPqdUnF47N/Tk83EXfmtvNKQ+SnFVI6t6mDOvfM3aA9Sg6kQPSw==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", "dev": true, "requires": { - "@jest/core": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/types": "^26.1.0", + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^26.1.0", - "jest-util": "^26.1.0", - "jest-validate": "^26.1.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", "prompts": "^2.0.1", - "yargs": "^15.3.1" + "yargs": "^15.4.1" } }, "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, "jest-message-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz", - "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.1.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", @@ -12207,17 +10058,17 @@ } }, "jest-validate": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.1.0.tgz", - "integrity": "sha512-WPApOOnXsiwhZtmkDsxnpye+XLb/tUISP+H6cHjfUIXvlG+eKwP+isnivsxlHCPaO9Q5wvbhloIBkdF3qUn+Nw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "camelcase": "^6.0.0", "chalk": "^4.0.0", - "jest-get-type": "^26.0.0", + "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^26.1.0" + "pretty-format": "^26.6.2" } }, "locate-path": { @@ -12230,13 +10081,13 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "p-locate": { @@ -12255,42 +10106,42 @@ "dev": true }, "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" } }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, "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==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" } }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -12308,9 +10159,9 @@ } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -12375,44 +10226,247 @@ } } }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "jest-config": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.1.0.tgz", - "integrity": "sha512-ONTGeoMbAwGCdq4WuKkMcdMoyfs5CLzHEkzFOlVvcDXufZSaIWh/OXMLa2fwKXiOaFcqEw8qFr4VOKJQfn4CVw==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.1.0", - "@jest/types": "^26.1.0", - "babel-jest": "^26.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.1.0", - "jest-environment-node": "^26.1.0", - "jest-get-type": "^26.0.0", - "jest-jasmine2": "^26.1.0", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.1.0", - "jest-util": "^26.1.0", - "jest-validate": "^26.1.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", "micromatch": "^4.0.2", - "pretty-format": "^26.1.0" + "pretty-format": "^26.6.2" }, "dependencies": { "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -12420,12 +10474,11 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -12439,15 +10492,15 @@ } }, "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -12497,18 +10550,19 @@ "dev": true }, "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", @@ -12516,45 +10570,51 @@ } }, "jest-validate": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.1.0.tgz", - "integrity": "sha512-WPApOOnXsiwhZtmkDsxnpye+XLb/tUISP+H6cHjfUIXvlG+eKwP+isnivsxlHCPaO9Q5wvbhloIBkdF3qUn+Nw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "camelcase": "^6.0.0", "chalk": "^4.0.0", - "jest-get-type": "^26.0.0", + "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^26.1.0" + "pretty-format": "^26.6.2" } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" } }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -12572,29 +10632,39 @@ } }, "jest-diff": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.1.0.tgz", - "integrity": "sha512-GZpIcom339y0OXznsEKjtkfKxNdg7bVbEofK8Q6MnevTIiR1jNhDWKhRX6X0SDXJlwn3dy59nZ1z55fLkAqPWg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^26.0.0", - "jest-get-type": "^26.0.0", - "pretty-format": "^26.1.0" + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "dependencies": { "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -12602,19 +10672,18 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -12643,27 +10712,33 @@ "dev": true }, "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" } }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -12681,30 +10756,40 @@ } }, "jest-each": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.1.0.tgz", - "integrity": "sha512-lYiSo4Igr81q6QRsVQq9LIkJW0hZcKxkIkHzNeTMPENYYDw/W/Raq28iJ0sLlNFYz2qxxeLnc5K2gQoFYlu2bA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", - "jest-get-type": "^26.0.0", - "jest-util": "^26.1.0", - "pretty-format": "^26.1.0" + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" }, "dependencies": { "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -12712,12 +10797,11 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -12731,9 +10815,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -12777,18 +10861,19 @@ "dev": true }, "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", @@ -12796,31 +10881,37 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" } }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -12838,51 +10929,74 @@ } }, "jest-environment-jsdom": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.1.0.tgz", - "integrity": "sha512-dWfiJ+spunVAwzXbdVqPH1LbuJW/kDL+FyqgA5YzquisHqTi0g9hquKif9xKm7c1bKBj6wbmJuDkeMCnxZEpUw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", "dev": true, "requires": { - "@jest/environment": "^26.1.0", - "@jest/fake-timers": "^26.1.0", - "@jest/types": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-util": "^26.1.0", - "jsdom": "^16.2.2" + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" }, "dependencies": { "@jest/fake-timers": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.1.0.tgz", - "integrity": "sha512-Y5F3kBVWxhau3TJ825iuWy++BAuQzK/xEa+wD9vDH3RytW9f2DbMVodfUQC54rZDX3POqdxCgcKdgcOL0rYUpA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", - "jest-message-util": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-util": "^26.1.0" + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -12896,9 +11010,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -12948,37 +11062,40 @@ "dev": true }, "jest-message-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz", - "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.1.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, "jest-mock": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.1.0.tgz", - "integrity": "sha512-1Rm8EIJ3ZFA8yCIie92UbxZWj9SuVmUGcyhLHyAhY6WI3NIct38nVcfOPWhJteqSn8V8e3xOMha9Ojfazfpovw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dev": true, "requires": { - "@jest/types": "^26.1.0" + "@jest/types": "^26.6.2", + "@types/node": "*" } }, "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", @@ -12986,34 +11103,46 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -13031,50 +11160,73 @@ } }, "jest-environment-node": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.1.0.tgz", - "integrity": "sha512-DNm5x1aQH0iRAe9UYAkZenuzuJ69VKzDCAYISFHQ5i9e+2Tbeu2ONGY7YStubCLH8a1wdKBgqScYw85+ySxqxg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "dev": true, "requires": { - "@jest/environment": "^26.1.0", - "@jest/fake-timers": "^26.1.0", - "@jest/types": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-util": "^26.1.0" + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" }, "dependencies": { "@jest/fake-timers": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.1.0.tgz", - "integrity": "sha512-Y5F3kBVWxhau3TJ825iuWy++BAuQzK/xEa+wD9vDH3RytW9f2DbMVodfUQC54rZDX3POqdxCgcKdgcOL0rYUpA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", - "jest-message-util": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-util": "^26.1.0" + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -13088,9 +11240,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -13140,37 +11292,40 @@ "dev": true }, "jest-message-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz", - "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.1.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, "jest-mock": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.1.0.tgz", - "integrity": "sha512-1Rm8EIJ3ZFA8yCIie92UbxZWj9SuVmUGcyhLHyAhY6WI3NIct38nVcfOPWhJteqSn8V8e3xOMha9Ojfazfpovw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dev": true, "requires": { - "@jest/types": "^26.1.0" + "@jest/types": "^26.6.2", + "@types/node": "*" } }, "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", @@ -13178,34 +11333,46 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -13267,47 +11434,49 @@ } }, "jest-jasmine2": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.1.0.tgz", - "integrity": "sha512-1IPtoDKOAG+MeBrKvvuxxGPJb35MTTRSDglNdWWCndCB3TIVzbLThRBkwH9P081vXLgiJHZY8Bz3yzFS803xqQ==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.1.0", - "@jest/source-map": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/types": "^26.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^26.1.0", + "expect": "^26.6.2", "is-generator-fn": "^2.0.0", - "jest-each": "^26.1.0", - "jest-matcher-utils": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-runtime": "^26.1.0", - "jest-snapshot": "^26.1.0", - "jest-util": "^26.1.0", - "pretty-format": "^26.1.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", "throat": "^5.0.0" }, "dependencies": { "@jest/console": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.1.0.tgz", - "integrity": "sha512-+0lpTHMd/8pJp+Nd4lyip+/Iyf2dZJvcCqrlkeZQoQid+JlThA4M9vxHtheyrQ99jJTMQam+es4BcvZ5W5cC3A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.1.0", - "jest-util": "^26.1.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", "slash": "^3.0.0" } }, "@jest/source-map": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.1.0.tgz", - "integrity": "sha512-XYRPYx4eEVX15cMT9mstnO7hkHP3krNtKfxUYd8L7gbtia8JvZZ6bMzSwa6IQJENbudTwKMw5R1BePRD+bkEmA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -13316,29 +11485,45 @@ } }, "@jest/test-result": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.1.0.tgz", - "integrity": "sha512-Xz44mhXph93EYMA8aYDz+75mFbarTV/d/x0yMdI3tfSRs/vh4CqSxgzVmCps1fPkHDCtn0tU8IH9iCKgGeGpfw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.1.0", - "@jest/types": "^26.1.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -13346,12 +11531,11 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -13371,9 +11555,9 @@ "dev": true }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -13423,28 +11607,30 @@ "dev": true }, "jest-message-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz", - "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.1.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", @@ -13452,31 +11638,31 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "source-map": { @@ -13486,18 +11672,18 @@ "dev": true }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -13521,27 +11707,37 @@ } }, "jest-leak-detector": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.1.0.tgz", - "integrity": "sha512-dsMnKF+4BVOZwvQDlgn3MG+Ns4JuLv8jNvXH56bgqrrboyCbI1rQg6EI5rs+8IYagVcfVP2yZFKfWNZy0rK0Hw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", "dev": true, "requires": { - "jest-get-type": "^26.0.0", - "pretty-format": "^26.1.0" + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "dependencies": { "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -13549,19 +11745,18 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -13590,27 +11785,33 @@ "dev": true }, "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" } }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -13619,29 +11820,39 @@ } }, "jest-matcher-utils": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.1.0.tgz", - "integrity": "sha512-PW9JtItbYvES/xLn5mYxjMd+Rk+/kIt88EfH3N7w9KeOrHWaHrdYPnVHndGbsFGRJ2d5gKtwggCvkqbFDoouQA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^26.1.0", - "jest-get-type": "^26.0.0", - "pretty-format": "^26.1.0" + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "dependencies": { "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -13649,19 +11860,18 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -13690,27 +11900,33 @@ "dev": true }, "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" } }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -13799,40 +12015,49 @@ "dev": true }, "jest-resolve": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.1.0.tgz", - "integrity": "sha512-KsY1JV9FeVgEmwIISbZZN83RNGJ1CC+XUCikf/ZWJBX/tO4a4NvA21YixokhdR9UnmPKKAC4LafVixJBrwlmfg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.1", - "jest-util": "^26.1.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", + "resolve": "^1.18.1", "slash": "^3.0.0" }, "dependencies": { "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -13846,9 +12071,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -13879,16 +12104,6 @@ "to-regex-range": "^5.0.1" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -13902,105 +12117,33 @@ "dev": true }, "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "micromatch": "^4.0.2" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -14014,93 +12157,194 @@ "requires": { "is-number": "^7.0.0" } + } + } + }, + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, "jest-runner": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.1.0.tgz", - "integrity": "sha512-elvP7y0fVDREnfqit0zAxiXkDRSw6dgCkzPCf1XvIMnSDZ8yogmSKJf192dpOgnUVykmQXwYYJnCx641uLTgcw==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", "dev": true, "requires": { - "@jest/console": "^26.1.0", - "@jest/environment": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/types": "^26.1.0", + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", + "emittery": "^0.7.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.1.0", + "jest-config": "^26.6.3", "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.1.0", - "jest-jasmine2": "^26.1.0", - "jest-leak-detector": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-resolve": "^26.1.0", - "jest-runtime": "^26.1.0", - "jest-util": "^26.1.0", - "jest-worker": "^26.1.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "source-map-support": "^0.5.6", "throat": "^5.0.0" }, "dependencies": { "@jest/console": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.1.0.tgz", - "integrity": "sha512-+0lpTHMd/8pJp+Nd4lyip+/Iyf2dZJvcCqrlkeZQoQid+JlThA4M9vxHtheyrQ99jJTMQam+es4BcvZ5W5cC3A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.1.0", - "jest-util": "^26.1.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", "slash": "^3.0.0" } }, "@jest/test-result": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.1.0.tgz", - "integrity": "sha512-Xz44mhXph93EYMA8aYDz+75mFbarTV/d/x0yMdI3tfSRs/vh4CqSxgzVmCps1fPkHDCtn0tU8IH9iCKgGeGpfw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.1.0", - "@jest/types": "^26.1.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -14117,9 +12361,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -14157,9 +12401,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -14176,58 +12420,62 @@ "dev": true }, "jest-haste-map": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.1.0.tgz", - "integrity": "sha512-WeBS54xCIz9twzkEdm6+vJBXgRBQfdbbXD0dk8lJh7gLihopABlJmIQFdWSDDtuDe4PRiObsjZSUjbJ1uhWEpA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", + "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", - "jest-serializer": "^26.1.0", - "jest-util": "^26.1.0", - "jest-worker": "^26.1.0", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "micromatch": "^4.0.2", "sane": "^4.0.3", - "walker": "^1.0.7", - "which": "^2.0.2" + "walker": "^1.0.7" } }, "jest-message-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz", - "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.1.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, "jest-serializer": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.1.0.tgz", - "integrity": "sha512-eqZOQG/0+MHmr25b2Z86g7+Kzd5dG9dhCiUoyUNJPgiqi38DqbDEOlHcNijyfZoj74soGBohKBZuJFS18YTJ5w==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { + "@types/node": "*", "graceful-fs": "^4.2.4" } }, "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", @@ -14235,11 +12483,12 @@ } }, "jest-worker": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.1.0.tgz", - "integrity": "sha512-Z9P5pZ6UC+kakMbNJn+tA2RdVdNX5WH1x+5UCBZ9MxIK24pjYtFt96fK+UwBTrjLYm232g1xz0L3eTh51OW+yQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" } @@ -14251,13 +12500,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "normalize-path": { @@ -14266,25 +12515,37 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -14304,82 +12565,76 @@ "requires": { "is-number": "^7.0.0" } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, "jest-runtime": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.1.0.tgz", - "integrity": "sha512-1qiYN+EZLmG1QV2wdEBRf+Ci8i3VSfIYLF02U18PiUDrMbhfpN/EAMMkJtT02jgJUoaEOpHAIXG6zS3QRMzRmA==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", "dev": true, "requires": { - "@jest/console": "^26.1.0", - "@jest/environment": "^26.1.0", - "@jest/fake-timers": "^26.1.0", - "@jest/globals": "^26.1.0", - "@jest/source-map": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/transform": "^26.1.0", - "@jest/types": "^26.1.0", + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "@types/yargs": "^15.0.0", "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.1.0", - "jest-haste-map": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-mock": "^26.1.0", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.1.0", - "jest-snapshot": "^26.1.0", - "jest-util": "^26.1.0", - "jest-validate": "^26.1.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", "slash": "^3.0.0", "strip-bom": "^4.0.0", - "yargs": "^15.3.1" + "yargs": "^15.4.1" }, "dependencies": { "@jest/console": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.1.0.tgz", - "integrity": "sha512-+0lpTHMd/8pJp+Nd4lyip+/Iyf2dZJvcCqrlkeZQoQid+JlThA4M9vxHtheyrQ99jJTMQam+es4BcvZ5W5cC3A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.1.0", - "jest-util": "^26.1.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", "slash": "^3.0.0" } }, "@jest/fake-timers": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.1.0.tgz", - "integrity": "sha512-Y5F3kBVWxhau3TJ825iuWy++BAuQzK/xEa+wD9vDH3RytW9f2DbMVodfUQC54rZDX3POqdxCgcKdgcOL0rYUpA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", - "jest-message-util": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-util": "^26.1.0" + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "@jest/source-map": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.1.0.tgz", - "integrity": "sha512-XYRPYx4eEVX15cMT9mstnO7hkHP3krNtKfxUYd8L7gbtia8JvZZ6bMzSwa6IQJENbudTwKMw5R1BePRD+bkEmA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -14388,29 +12643,45 @@ } }, "@jest/test-result": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.1.0.tgz", - "integrity": "sha512-Xz44mhXph93EYMA8aYDz+75mFbarTV/d/x0yMdI3tfSRs/vh4CqSxgzVmCps1fPkHDCtn0tU8IH9iCKgGeGpfw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@jest/console": "^26.1.0", - "@jest/types": "^26.1.0", + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -14418,19 +12689,18 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -14453,15 +12723,15 @@ "dev": true }, "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -14494,12 +12764,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", @@ -14526,9 +12790,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -14557,73 +12821,78 @@ "dev": true }, "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, "jest-haste-map": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.1.0.tgz", - "integrity": "sha512-WeBS54xCIz9twzkEdm6+vJBXgRBQfdbbXD0dk8lJh7gLihopABlJmIQFdWSDDtuDe4PRiObsjZSUjbJ1uhWEpA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", + "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", - "jest-serializer": "^26.1.0", - "jest-util": "^26.1.0", - "jest-worker": "^26.1.0", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "micromatch": "^4.0.2", "sane": "^4.0.3", - "walker": "^1.0.7", - "which": "^2.0.2" + "walker": "^1.0.7" } }, "jest-message-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz", - "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.1.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, "jest-mock": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.1.0.tgz", - "integrity": "sha512-1Rm8EIJ3ZFA8yCIie92UbxZWj9SuVmUGcyhLHyAhY6WI3NIct38nVcfOPWhJteqSn8V8e3xOMha9Ojfazfpovw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dev": true, "requires": { - "@jest/types": "^26.1.0" + "@jest/types": "^26.6.2", + "@types/node": "*" } }, "jest-serializer": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.1.0.tgz", - "integrity": "sha512-eqZOQG/0+MHmr25b2Z86g7+Kzd5dG9dhCiUoyUNJPgiqi38DqbDEOlHcNijyfZoj74soGBohKBZuJFS18YTJ5w==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { + "@types/node": "*", "graceful-fs": "^4.2.4" } }, "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", @@ -14631,25 +12900,26 @@ } }, "jest-validate": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.1.0.tgz", - "integrity": "sha512-WPApOOnXsiwhZtmkDsxnpye+XLb/tUISP+H6cHjfUIXvlG+eKwP+isnivsxlHCPaO9Q5wvbhloIBkdF3qUn+Nw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "camelcase": "^6.0.0", "chalk": "^4.0.0", - "jest-get-type": "^26.0.0", + "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^26.1.0" + "pretty-format": "^26.6.2" } }, "jest-worker": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.1.0.tgz", - "integrity": "sha512-Z9P5pZ6UC+kakMbNJn+tA2RdVdNX5WH1x+5UCBZ9MxIK24pjYtFt96fK+UwBTrjLYm232g1xz0L3eTh51OW+yQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" } @@ -14670,13 +12940,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "normalize-path": { @@ -14701,29 +12971,29 @@ "dev": true }, "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" } }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, "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==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -14731,18 +13001,18 @@ "dev": true }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" } }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -14766,9 +13036,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -14783,15 +13053,6 @@ "is-number": "^7.0.0" } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -14848,40 +13109,57 @@ "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" }, "jest-snapshot": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.1.0.tgz", - "integrity": "sha512-YhSbU7eMTVQO/iRbNs8j0mKRxGp4plo7sJ3GzOQ0IYjvsBiwg0T1o0zGQAYepza7lYHuPTrG5J2yDd0CE2YxSw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.0.0", "chalk": "^4.0.0", - "expect": "^26.1.0", + "expect": "^26.6.2", "graceful-fs": "^4.2.4", - "jest-diff": "^26.1.0", - "jest-get-type": "^26.0.0", - "jest-haste-map": "^26.1.0", - "jest-matcher-utils": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-resolve": "^26.1.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", "natural-compare": "^1.4.0", - "pretty-format": "^26.1.0", + "pretty-format": "^26.6.2", "semver": "^7.3.2" }, "dependencies": { "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", "chalk": "^4.0.0" } }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -14889,19 +13167,18 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -14918,9 +13195,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -14958,9 +13235,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -14977,64 +13254,68 @@ "dev": true }, "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, "jest-haste-map": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.1.0.tgz", - "integrity": "sha512-WeBS54xCIz9twzkEdm6+vJBXgRBQfdbbXD0dk8lJh7gLihopABlJmIQFdWSDDtuDe4PRiObsjZSUjbJ1uhWEpA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", + "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", - "jest-serializer": "^26.1.0", - "jest-util": "^26.1.0", - "jest-worker": "^26.1.0", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "micromatch": "^4.0.2", "sane": "^4.0.3", - "walker": "^1.0.7", - "which": "^2.0.2" + "walker": "^1.0.7" } }, "jest-message-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz", - "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.1.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" } }, "jest-serializer": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.1.0.tgz", - "integrity": "sha512-eqZOQG/0+MHmr25b2Z86g7+Kzd5dG9dhCiUoyUNJPgiqi38DqbDEOlHcNijyfZoj74soGBohKBZuJFS18YTJ5w==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { + "@types/node": "*", "graceful-fs": "^4.2.4" } }, "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", @@ -15042,15 +13323,25 @@ } }, "jest-worker": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.1.0.tgz", - "integrity": "sha512-Z9P5pZ6UC+kakMbNJn+tA2RdVdNX5WH1x+5UCBZ9MxIK24pjYtFt96fK+UwBTrjLYm232g1xz0L3eTh51OW+yQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -15058,13 +13349,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "normalize-path": { @@ -15074,42 +13365,45 @@ "dev": true }, "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^26.1.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" } }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -15124,14 +13418,11 @@ "is-number": "^7.0.0" } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -15227,6 +13518,254 @@ } } }, + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "dependencies": { + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + } + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, "jest-worker": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", @@ -15252,9 +13791,9 @@ } }, "jetifier": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.6.tgz", - "integrity": "sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ==" + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.8.tgz", + "integrity": "sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw==" }, "js-tokens": { "version": "4.0.0", @@ -15262,9 +13801,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -15286,55 +13825,55 @@ "integrity": "sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==" }, "jsdom": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.3.0.tgz", - "integrity": "sha512-zggeX5UuEknpdZzv15+MS1dPYG0J/TftiiNunOeNxSl3qr8Z6cIlQpN0IdJa44z9aFxZRIVqRncvEhQ7X5DtZg==", + "version": "16.5.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.3.tgz", + "integrity": "sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA==", "dev": true, "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", + "abab": "^2.0.5", + "acorn": "^8.1.0", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", - "cssstyle": "^2.2.0", + "cssstyle": "^2.3.0", "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", + "decimal.js": "^10.2.1", "domexception": "^2.0.1", - "escodegen": "^1.14.1", + "escodegen": "^2.0.0", "html-encoding-sniffer": "^2.0.1", "is-potential-custom-element-name": "^1.0.0", "nwsapi": "^2.2.0", - "parse5": "5.1.1", + "parse5": "6.0.1", "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", + "request-promise-native": "^1.0.9", + "saxes": "^5.0.1", "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", + "tough-cookie": "^4.0.0", "w3c-hr-time": "^1.0.2", "w3c-xmlserializer": "^2.0.0", "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", + "whatwg-url": "^8.5.0", + "ws": "^7.4.4", "xml-name-validator": "^3.0.0" }, "dependencies": { + "acorn": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.2.4.tgz", + "integrity": "sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg==", + "dev": true + }, "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" } - }, - "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", - "dev": true } } }, @@ -15384,9 +13923,9 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "requires": { "minimist": "^1.2.5" } @@ -15416,13 +13955,13 @@ } }, "jsx-ast-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", "dev": true, "requires": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" } }, "junderw-crc32c": { @@ -15716,15 +14255,32 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, "lodash.frompairs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.frompairs/-/lodash.frompairs-4.0.1.tgz", @@ -15777,6 +14333,12 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -15831,11 +14393,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -15882,9 +14439,9 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16026,9 +14583,9 @@ } }, "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, "mem": { "version": "4.3.0", @@ -16068,19 +14625,6 @@ "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } } } }, @@ -16090,9 +14634,9 @@ "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=" }, "metro": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.58.0.tgz", - "integrity": "sha512-yi/REXX+/s4r7RjzXht+E+qE6nzvFIrEXO5Q61h+70Q7RODMU8EnlpXx04JYk7DevHuMhFaX+NWhCtRINzR4zA==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.59.0.tgz", + "integrity": "sha512-OpVgYXyuTvouusFZQJ/UYKEbwfLmialrSCUUTGTFaBor6UMUHZgXPYtK86LzesgMqRc8aiuTQVO78iKW2Iz3wg==", "requires": { "@babel/code-frame": "^7.0.0", "@babel/core": "^7.0.0", @@ -16112,28 +14656,29 @@ "connect": "^3.6.5", "debug": "^2.2.0", "denodeify": "^1.2.1", + "error-stack-parser": "^2.0.6", "eventemitter3": "^3.0.0", "fbjs": "^1.0.0", "fs-extra": "^1.0.0", "graceful-fs": "^4.1.3", "image-size": "^0.6.0", "invariant": "^2.2.4", - "jest-haste-map": "^24.7.1", - "jest-worker": "^24.6.0", + "jest-haste-map": "^24.9.0", + "jest-worker": "^24.9.0", "json-stable-stringify": "^1.0.1", "lodash.throttle": "^4.1.1", "merge-stream": "^1.0.1", - "metro-babel-register": "0.58.0", - "metro-babel-transformer": "0.58.0", - "metro-cache": "0.58.0", - "metro-config": "0.58.0", - "metro-core": "0.58.0", - "metro-inspector-proxy": "0.58.0", - "metro-minify-uglify": "0.58.0", - "metro-react-native-babel-preset": "0.58.0", - "metro-resolver": "0.58.0", - "metro-source-map": "0.58.0", - "metro-symbolicate": "0.58.0", + "metro-babel-register": "0.59.0", + "metro-babel-transformer": "0.59.0", + "metro-cache": "0.59.0", + "metro-config": "0.59.0", + "metro-core": "0.59.0", + "metro-inspector-proxy": "0.59.0", + "metro-minify-uglify": "0.59.0", + "metro-react-native-babel-preset": "0.59.0", + "metro-resolver": "0.59.0", + "metro-source-map": "0.59.0", + "metro-symbolicate": "0.59.0", "mime-types": "2.1.11", "mkdirp": "^0.5.1", "node-fetch": "^2.2.0", @@ -16146,12 +14691,16 @@ "temp": "0.8.3", "throat": "^4.1.0", "wordwrap": "^1.0.0", - "write-file-atomic": "^1.2.0", "ws": "^1.1.5", "xpipe": "^1.0.5", "yargs": "^14.2.0" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -16185,6 +14734,11 @@ "ms": "2.0.0" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, "fs-extra": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", @@ -16200,6 +14754,11 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", @@ -16208,29 +14767,10 @@ "graceful-fs": "^4.1.6" } }, - "metro-babel-register": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.58.0.tgz", - "integrity": "sha512-P5+G3ufhSYL6cA3a7xkbSJzzFBvtivj/PhWvGXFXnuFssDlMAX1CTktff+0gpka5Cd6B6QLt0UAMWulUAAE4Eg==", - "requires": { - "@babel/core": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/register": "^7.0.0", - "core-js": "^2.2.2", - "escape-string-regexp": "^1.0.5" - } - }, "metro-react-native-babel-preset": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.58.0.tgz", - "integrity": "sha512-MRriNW+fF6jxABsgPphocUY6mIhmCm8idcrQZ58fT3Iti2vCdtkaK32TyCGUNUptzhUe2/cbE57j4aC+eaodAA==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.59.0.tgz", + "integrity": "sha512-BoO6ncPfceIDReIH8pQ5tQptcGo5yRWQXJGVXfANbiKLq4tfgdZB1C1e2rMUJ6iypmeJU9dzl+EhPmIFKtgREg==", "requires": { "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-export-default-from": "^7.0.0", @@ -16241,6 +14781,8 @@ "@babel/plugin-syntax-dynamic-import": "^7.0.0", "@babel/plugin-syntax-export-default-from": "^7.0.0", "@babel/plugin-syntax-flow": "^7.2.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", "@babel/plugin-transform-arrow-functions": "^7.0.0", "@babel/plugin-transform-block-scoping": "^7.0.0", "@babel/plugin-transform-classes": "^7.0.0", @@ -16256,6 +14798,7 @@ "@babel/plugin-transform-parameters": "^7.0.0", "@babel/plugin-transform-react-display-name": "^7.0.0", "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", "@babel/plugin-transform-react-jsx-source": "^7.0.0", "@babel/plugin-transform-regenerator": "^7.0.0", "@babel/plugin-transform-runtime": "^7.0.0", @@ -16269,20 +14812,6 @@ "react-refresh": "^0.4.0" } }, - "metro-source-map": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", - "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", - "requires": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.58.0", - "ob1": "0.58.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - } - }, "mime-db": { "version": "1.23.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", @@ -16314,6 +14843,11 @@ "glob": "^7.1.3" } }, + "serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=" + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -16347,11 +14881,6 @@ "ansi-regex": "^3.0.0" } }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" - }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -16431,37 +14960,21 @@ } }, "metro-babel-transformer": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.58.0.tgz", - "integrity": "sha512-yBX3BkRhw2TCNPhe+pmLSgsAEA3huMvnX08UwjFqSXXI1aiqzRQobn92uKd1U5MM1Vx8EtXVomlJb95ZHNAv6A==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.59.0.tgz", + "integrity": "sha512-fdZJl8rs54GVFXokxRdD7ZrQ1TJjxWzOi/xSP25VR3E8tbm3nBZqS+/ylu643qSr/IueABR+jrlqAyACwGEf6w==", "requires": { "@babel/core": "^7.0.0", - "metro-source-map": "0.58.0" - }, - "dependencies": { - "metro-source-map": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", - "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", - "requires": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.58.0", - "ob1": "0.58.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - } - } + "metro-source-map": "0.59.0" } }, "metro-cache": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.58.0.tgz", - "integrity": "sha512-jjW9zCTKxhgKcVkyQ6LHyna9Zdf4TK/45vvT1fPyyTk1RY82ZYjU1qs+84ycKEd08Ka4YcK9xcUew9SIDJYI8Q==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.59.0.tgz", + "integrity": "sha512-ryWNkSnpyADfRpHGb8BRhQ3+k8bdT/bsxMH2O0ntlZYZ188d8nnYWmxbRvFmEzToJxe/ol4uDw0tJFAaQsN8KA==", "requires": { - "jest-serializer": "^24.4.0", - "metro-core": "0.58.0", + "jest-serializer": "^24.9.0", + "metro-core": "0.59.0", "mkdirp": "^0.5.1", "rimraf": "^2.5.4" }, @@ -16477,41 +14990,44 @@ } }, "metro-config": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.58.0.tgz", - "integrity": "sha512-4vgBliXwL56vjUlYplvGMVSNrJJpkHuLcD+O20trV3FvPxKg4ZsvuOcNSxqDSMU26FCtIEJ15ojcuCbRL7KY0w==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.59.0.tgz", + "integrity": "sha512-MDsknFG9vZ4Nb5VR6OUDmGHaWz6oZg/FtE3up1zVBKPVRTXE1Z+k7zypnPtMXjMh3WHs/Sy4+wU1xnceE/zdnA==", "requires": { "cosmiconfig": "^5.0.5", - "jest-validate": "^24.7.0", - "metro": "0.58.0", - "metro-cache": "0.58.0", - "metro-core": "0.58.0", - "pretty-format": "^24.7.0" + "jest-validate": "^24.9.0", + "metro": "0.59.0", + "metro-cache": "0.59.0", + "metro-core": "0.59.0" } }, "metro-core": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.58.0.tgz", - "integrity": "sha512-RzXUjGFmCLOyzUqcKDvr91AldGtIOxnzNZrWUIiG8uC3kerVLo0mQp4YH3+XVm6fMNiLMg6iER7HLqD+MbpUjQ==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.59.0.tgz", + "integrity": "sha512-kb5LKvV5r2pqMEzGyTid8ai2mIjW13NMduQ8oBmfha7/EPTATcTQ//s+bkhAs1toQD8vqVvjAb0cPNjWQEmcmQ==", "requires": { - "jest-haste-map": "^24.7.1", + "jest-haste-map": "^24.9.0", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.58.0", + "metro-resolver": "0.59.0", "wordwrap": "^1.0.0" } }, "metro-inspector-proxy": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.58.0.tgz", - "integrity": "sha512-oFqTyNTJdCdvcw1Ha6SKE7ITbSaoTbO4xpYownIoJR+WZ0ZfxbWpp225JkHuBJm9UcBAnG9c0CME924m3uBbaw==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.59.0.tgz", + "integrity": "sha512-hPeAuQcofTOH0F+2GEZqWkvkVY1/skezSSlMocDQDaqds+Kw6JgdA7FlZXxnKmQ/jYrWUzff/pl8SUCDwuYthQ==", "requires": { "connect": "^3.6.5", "debug": "^2.2.0", - "rxjs": "^5.4.3", "ws": "^1.1.5", "yargs": "^14.2.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -16530,11 +15046,21 @@ "ms": "2.0.0" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, "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==" }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -16545,14 +15071,6 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "requires": { - "symbol-observable": "1.0.1" - } - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -16563,10 +15081,13 @@ "strip-ansi": "^5.1.0" } }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } }, "wrap-ansi": { "version": "5.1.0", @@ -16617,9 +15138,9 @@ } }, "metro-minify-uglify": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.58.0.tgz", - "integrity": "sha512-vRHsA7bCi7eCn3LXLm20EfY2NoWDyYOnmWaq/N8LB0OxL2L5DXRqMYAQK+prWGJ5S1yvVnDuuNVP+peQ9851TA==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.59.0.tgz", + "integrity": "sha512-7IzVgCVWZMymgZ/quieg/9v5EQ8QmZWAgDc86Zp9j0Vy6tQTjUn6jlU+YAKW3mfMEjMr6iIUzCD8YklX78tFAw==", "requires": { "uglify-es": "^3.1.9" } @@ -16683,15 +15204,6 @@ "metro-source-map": "0.59.0" }, "dependencies": { - "metro-babel-transformer": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.59.0.tgz", - "integrity": "sha512-fdZJl8rs54GVFXokxRdD7ZrQ1TJjxWzOi/xSP25VR3E8tbm3nBZqS+/ylu643qSr/IueABR+jrlqAyACwGEf6w==", - "requires": { - "@babel/core": "^7.0.0", - "metro-source-map": "0.59.0" - } - }, "metro-react-native-babel-preset": { "version": "0.59.0", "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.59.0.tgz", @@ -16740,9 +15252,9 @@ } }, "metro-resolver": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.58.0.tgz", - "integrity": "sha512-XFbAKvCHN2iWqKeiRARzEXn69eTDdJVJC7lu16S4dPQJ+Dy82dZBr5Es12iN+NmbJuFgrAuIHbpWrdnA9tOf6Q==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.59.0.tgz", + "integrity": "sha512-lbgiumnwoVosffEI96z0FGuq1ejTorHAj3QYUPmp5dFMfitRxLP7Wm/WP9l4ZZjIptxTExsJwuEff1SLRCPD9w==", "requires": { "absolute-path": "^0.0.0" } @@ -16759,53 +15271,18 @@ "ob1": "0.59.0", "source-map": "^0.5.6", "vlq": "^1.0.0" - }, - "dependencies": { - "metro-symbolicate": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz", - "integrity": "sha512-asLaF2A7rndrToGFIknL13aiohwPJ95RKHf0NM3hP/nipiLDoMzXT6ZnQvBqDxkUKyP+51AI75DMtb+Wcyw4Bw==", - "requires": { - "invariant": "^2.2.4", - "metro-source-map": "0.59.0", - "source-map": "^0.5.6", - "through2": "^2.0.1", - "vlq": "^1.0.0" - } - }, - "ob1": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.59.0.tgz", - "integrity": "sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ==" - } } }, "metro-symbolicate": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.58.0.tgz", - "integrity": "sha512-uIVxUQC1E26qOMj13dKROhwAa2FmZk5eR0NcBqej/aXmQhpr8LjJg2sondkoLKUp827Tf/Fm9+pS4icb5XiqCw==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz", + "integrity": "sha512-asLaF2A7rndrToGFIknL13aiohwPJ95RKHf0NM3hP/nipiLDoMzXT6ZnQvBqDxkUKyP+51AI75DMtb+Wcyw4Bw==", "requires": { "invariant": "^2.2.4", - "metro-source-map": "0.58.0", + "metro-source-map": "0.59.0", "source-map": "^0.5.6", "through2": "^2.0.1", "vlq": "^1.0.0" - }, - "dependencies": { - "metro-source-map": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", - "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", - "requires": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.58.0", - "ob1": "0.58.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - } - } } }, "micromatch": { @@ -16843,16 +15320,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", "requires": { - "mime-db": "1.44.0" + "mime-db": "1.47.0" } }, "mimic-fn": { @@ -16967,9 +15444,9 @@ } }, "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" }, "nanoid": { "version": "3.1.22", @@ -17047,9 +15524,9 @@ "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==" }, "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, "node-int64": { "version": "0.4.0", @@ -17067,9 +15544,9 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" }, "node-notifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", - "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", "dev": true, "optional": true, "requires": { @@ -17091,17 +15568,30 @@ "is-docker": "^2.0.0" } }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "optional": true + "optional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "optional": true }, @@ -17114,6 +15604,13 @@ "requires": { "isexe": "^2.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "optional": true } } }, @@ -17164,14 +15661,14 @@ } }, "node-releases": { - "version": "1.1.65", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.65.tgz", - "integrity": "sha512-YpzJOe2WFIW0V4ZkJQd/DGR/zdVwc/pI4Nl1CZrBO19FdRcSTmsuhdttw9rsTzzJLrNcSloLiBbEYx1C4f6gpA==" + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" }, "node-stream-zip": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.12.0.tgz", - "integrity": "sha512-HZ3XehqShTFj9gHauRJ3Bri9eiCTOII7/crtXzURtT14NdnOFs9Ia5E82W7z3izVBNx760tqwddxrBJVG52Y1Q==" + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.13.4.tgz", + "integrity": "sha512-M2nPvnSWFFH+fgLIRZDqmhshmuzXcr+ce9BsHQX/30pXR+cEz/USMYmx9ZAFYy837W2QoDoNzhFtbZhfzaMk9A==" }, "node-version": { "version": "1.2.0", @@ -17208,9 +15705,9 @@ } }, "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "requires": { "npm-normalize-package-bin": "^1.0.1" } @@ -17279,9 +15776,9 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "ob1": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.58.0.tgz", - "integrity": "sha512-uZP44cbowAfHafP1k4skpWItk5iHCoRevMfrnUvYCfyNNPPJd3rfDCyj0exklWi2gDXvjlj2ObsfiqP/bs/J7Q==" + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.59.0.tgz", + "integrity": "sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ==" }, "object-assign": { "version": "4.1.1", @@ -17317,17 +15814,17 @@ } }, "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==" }, "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "object-keys": { @@ -17344,36 +15841,37 @@ } }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, "object.entries": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", - "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", + "es-abstract": "^1.18.0-next.1", "has": "^1.0.3" } }, "object.fromentries": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", - "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.18.0-next.2", "has": "^1.0.3" } }, @@ -17397,14 +15895,14 @@ } }, "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.18.0-next.2", "has": "^1.0.3" } }, @@ -17493,6 +15991,21 @@ "log-symbols": "^2.2.0", "strip-ansi": "^5.2.0", "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "os-homedir": { @@ -17541,9 +16054,9 @@ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" }, "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "dev": true }, "p-finally": { @@ -17653,9 +16166,9 @@ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" }, "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, "parseurl": { @@ -17736,9 +16249,9 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", "dev": true }, "pify": { @@ -17776,13 +16289,13 @@ } }, "plist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", - "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.2.tgz", + "integrity": "sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ==", "requires": { - "base64-js": "^1.2.3", + "base64-js": "^1.5.1", "xmlbuilder": "^9.0.7", - "xmldom": "0.1.x" + "xmldom": "^0.5.0" } }, "plugin-error": { @@ -17938,13 +16451,13 @@ "integrity": "sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc=" }, "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", "dev": true, "requires": { "kleur": "^3.0.3", - "sisteransi": "^1.0.4" + "sisteransi": "^1.0.5" } }, "prop-types": { @@ -18036,6 +16549,11 @@ "yargs": "^13.2.4" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, "buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -18055,11 +16573,21 @@ "wrap-ansi": "^5.1.0" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, "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==" }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -18080,6 +16608,14 @@ "strip-ansi": "^5.1.0" } }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -18119,9 +16655,12 @@ } }, "qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } }, "query-string": { "version": "6.14.1", @@ -18140,9 +16679,14 @@ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "r2": { "version": "2.0.1", @@ -18206,13 +16750,6 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - } } }, "react": { @@ -18269,19 +16806,12 @@ "integrity": "sha512-FKOsfKbBkPxYE8576EM6uAfHC4rnMpLyH6/TJUL4WcHUEB3EUn8AxPjnnV/IiwSSzsClvHYK+sDELKN/EJ0WYg==" }, "react-devtools-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.10.0.tgz", - "integrity": "sha512-5m5VBtpjuHI7odyk3GAR3BJq3/IHQ0fVZ0+h8zUvoHulSj7Z9hp9d9n4Y1HmSZZxv7NUKfBtsnH+NfLNFDtfog==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.13.1.tgz", + "integrity": "sha512-+N7vZgjQWqkPe/q7yltXOi20U3Zy4WdXax9IcLCNB4nWsUxLrkVF0Mqbsr3h4m/j0dA4046QpJOnlwdWVQuiFw==", "requires": { "shell-quote": "^1.6.1", "ws": "^7" - }, - "dependencies": { - "ws": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.0.tgz", - "integrity": "sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==" - } } }, "react-is": { @@ -18332,9 +16862,9 @@ }, "dependencies": { "@react-native-community/cli": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-4.13.1.tgz", - "integrity": "sha512-+/TeRVToADpQPSprsPkwi9KY8x64YcuJpjzMBVISwWP+aWzsIDuWJmyMXTADlCg2EBMJqJR7bn1W/IkfzVRCWA==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-4.14.0.tgz", + "integrity": "sha512-EYJKBuxFxAu/iwNUfwDq41FjORpvSh1wvQ3qsHjzcR5uaGlWEOJrd3uNJDuKBAS0TVvbEesLF9NEXipjyRVr4Q==", "requires": { "@hapi/joi": "^15.0.3", "@react-native-community/cli-debugger-ui": "^4.13.1", @@ -18356,11 +16886,11 @@ "inquirer": "^3.0.6", "leven": "^3.1.0", "lodash": "^4.17.15", - "metro": "^0.58.0", - "metro-config": "^0.58.0", - "metro-core": "^0.58.0", - "metro-react-native-babel-transformer": "^0.58.0", - "metro-resolver": "^0.58.0", + "metro": "^0.59.0", + "metro-config": "^0.59.0", + "metro-core": "^0.59.0", + "metro-react-native-babel-transformer": "^0.59.0", + "metro-resolver": "^0.59.0", "minimist": "^1.2.0", "mkdirp": "^0.5.1", "node-stream-zip": "^1.9.1", @@ -18378,32 +16908,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, - "metro-react-native-babel-transformer": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.58.0.tgz", - "integrity": "sha512-3A73+cRq1eUPQ8g+hPNGgMUMCGmtQjwqHfoG1DwinAoJ/kr4WOXWWbGZo0xHJNBe/zdHGl0uHcDCp2knPglTdQ==", - "requires": { - "@babel/core": "^7.0.0", - "babel-preset-fbjs": "^3.3.0", - "metro-babel-transformer": "0.58.0", - "metro-react-native-babel-preset": "0.58.0", - "metro-source-map": "0.58.0" - } - }, - "metro-source-map": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", - "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", - "requires": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.58.0", - "ob1": "0.58.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - } - }, "pretty-format": { "version": "25.5.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", @@ -18417,6 +16921,11 @@ } } }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -18561,6 +17070,11 @@ } } }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -18569,48 +17083,6 @@ "p-locate": "^4.1.0" } }, - "metro-react-native-babel-preset": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.58.0.tgz", - "integrity": "sha512-MRriNW+fF6jxABsgPphocUY6mIhmCm8idcrQZ58fT3Iti2vCdtkaK32TyCGUNUptzhUe2/cbE57j4aC+eaodAA==", - "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-exponentiation-operator": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-assign": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "react-refresh": "^0.4.0" - } - }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -18629,6 +17101,40 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -18697,8 +17203,8 @@ "integrity": "sha512-CSGosqvESXWKTfYa+6gYd3HRQOkJm6C+TSXfaipat4Q0BzUHWWNaS5M5z7x72hg6FRk25rJ4zxSmSCQvizHzzQ==" }, "react-native-document-picker": { - "version": "git+ssh://git@github.com/BlueWallet/react-native-document-picker.git#3684d4fcc2bc0b47c32be39024e4796004c3e428", - "from": "react-native-document-picker@git+https://github.com/BlueWallet/react-native-document-picker.git#3684d4fcc2bc0b47c32be39024e4796004c3e428" + "version": "git+https://github.com/BlueWallet/react-native-document-picker.git#3684d4fcc2bc0b47c32be39024e4796004c3e428", + "from": "git+https://github.com/BlueWallet/react-native-document-picker.git#3684d4fcc2bc0b47c32be39024e4796004c3e428" }, "react-native-elements": { "version": "2.3.2", @@ -18724,8 +17230,8 @@ } }, "react-native-fingerprint-scanner": { - "version": "git+ssh://git@github.com/BlueWallet/react-native-fingerprint-scanner.git#ce644673681716335d786727bab998f7e632ab5e", - "from": "react-native-fingerprint-scanner@git+https://github.com/BlueWallet/react-native-fingerprint-scanner.git#ce644673681716335d786727bab998f7e632ab5e" + "version": "git+https://github.com/BlueWallet/react-native-fingerprint-scanner.git#ce644673681716335d786727bab998f7e632ab5e", + "from": "git+https://github.com/BlueWallet/react-native-fingerprint-scanner.git#ce644673681716335d786727bab998f7e632ab5e" }, "react-native-fs": { "version": "2.16.6", @@ -18773,8 +17279,8 @@ } }, "react-native-handoff": { - "version": "git+ssh://git@github.com/marcosrdz/react-native-handoff.git#f5becc63f3e36bf2da1ed1fc60fc690323e73602", - "from": "react-native-handoff@git+https://github.com/marcosrdz/react-native-handoff.git#f5becc63f3e36bf2da1ed1fc60fc690323e73602" + "version": "git+https://github.com/marcosrdz/react-native-handoff.git#f5becc63f3e36bf2da1ed1fc60fc690323e73602", + "from": "git+https://github.com/marcosrdz/react-native-handoff.git#f5becc63f3e36bf2da1ed1fc60fc690323e73602" }, "react-native-haptic-feedback": { "version": "1.11.0", @@ -18782,8 +17288,8 @@ "integrity": "sha512-KTIy7lExwMtB6pOpCARyUzFj5EzYTh+A1GN/FB5Eb0LrW5C6hbb1kdj9K2/RHyZC+wyAJD1M823ZaDCU6n6cLA==" }, "react-native-idle-timer": { - "version": "git+ssh://git@github.com/BlueWallet/react-native-idle-timer.git#8587876d68ab5920e79619726aeca9e672beaf2b", - "from": "react-native-idle-timer@git+https://github.com/BlueWallet/react-native-idle-timer.git#8587876d68ab5920e79619726aeca9e672beaf2b" + "version": "git+https://github.com/BlueWallet/react-native-idle-timer.git#8587876d68ab5920e79619726aeca9e672beaf2b", + "from": "git+https://github.com/BlueWallet/react-native-idle-timer.git#8587876d68ab5920e79619726aeca9e672beaf2b" }, "react-native-image-picker": { "version": "3.3.2", @@ -18791,8 +17297,8 @@ "integrity": "sha512-7z902J7a7j2rUM6zzyLSGpBSDfXy/V9ssSDKV0QyoQpr7COZs3zsJye2PU1Z4TRqmuNtREIeG5m1NdwtpcXBkg==" }, "react-native-inappbrowser-reborn": { - "version": "git+ssh://git@github.com/BlueWallet/react-native-inappbrowser.git#fa2d8e1763e46dd12a7e53081e97a0f908049103", - "from": "react-native-inappbrowser-reborn@git+https://github.com/BlueWallet/react-native-inappbrowser.git#fa2d8e1763e46dd12a7e53081e97a0f908049103", + "version": "git+https://github.com/BlueWallet/react-native-inappbrowser.git#fa2d8e1763e46dd12a7e53081e97a0f908049103", + "from": "git+https://github.com/BlueWallet/react-native-inappbrowser.git#fa2d8e1763e46dd12a7e53081e97a0f908049103", "requires": { "invariant": "^2.2.4", "opencollective-postinstall": "^2.0.2" @@ -18804,8 +17310,8 @@ "integrity": "sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg==" }, "react-native-is-catalyst": { - "version": "git+ssh://git@github.com/BlueWallet/react-native-is-catalyst.git#a665155424ae5b865971f71ba2625b2c53983364", - "from": "react-native-is-catalyst@git+https://github.com/BlueWallet/react-native-is-catalyst.git#v1.0.0" + "version": "git+https://github.com/BlueWallet/react-native-is-catalyst.git#a665155424ae5b865971f71ba2625b2c53983364", + "from": "git+https://github.com/BlueWallet/react-native-is-catalyst.git#v1.0.0" }, "react-native-level-fs": { "version": "3.0.1", @@ -18836,8 +17342,8 @@ } }, "react-native-navigation-bar-color": { - "version": "git+ssh://git@github.com/BlueWallet/react-native-navigation-bar-color.git#34e44b8f44e442133de9d35c35f2679d40982804", - "from": "react-native-navigation-bar-color@git+https://github.com/BlueWallet/react-native-navigation-bar-color.git#34e44b8f44e442133de9d35c35f2679d40982804" + "version": "git+https://github.com/BlueWallet/react-native-navigation-bar-color.git#34e44b8f44e442133de9d35c35f2679d40982804", + "from": "git+https://github.com/BlueWallet/react-native-navigation-bar-color.git#34e44b8f44e442133de9d35c35f2679d40982804" }, "react-native-obscure": { "version": "1.2.1", @@ -18845,8 +17351,8 @@ "integrity": "sha512-zepY31U2HAWrxPP+uGhDFFa1yGdbIa06iviCYRQJcEN2K4gtcEYBCtsk+PdClaiwIREZOQ7YKscxCIlZyR1m6w==" }, "react-native-passcode-auth": { - "version": "git+ssh://git@github.com/BlueWallet/react-native-passcode-auth.git#a2ff977ba92b36f8d0a5567f59c05cc608e8bd12", - "from": "react-native-passcode-auth@git+https://github.com/BlueWallet/react-native-passcode-auth.git#a2ff977ba92b36f8d0a5567f59c05cc608e8bd12" + "version": "git+https://github.com/BlueWallet/react-native-passcode-auth.git#a2ff977ba92b36f8d0a5567f59c05cc608e8bd12", + "from": "git+https://github.com/BlueWallet/react-native-passcode-auth.git#a2ff977ba92b36f8d0a5567f59c05cc608e8bd12" }, "react-native-popup-menu-android": { "version": "1.0.3", @@ -18854,12 +17360,12 @@ "integrity": "sha512-DzEU0Ejl/kMZz6FJ7Mks8se4jceJZk9QINHILNU9GQFrjP4mxodZ9HiqVbs9F+xUE4NCOE8Ib36MxxdfLRw1OQ==" }, "react-native-privacy-snapshot": { - "version": "git+ssh://git@github.com/BlueWallet/react-native-privacy-snapshot.git#529e4627d93f67752a27e82a040ff7b64dca0783", - "from": "react-native-privacy-snapshot@git+https://github.com/BlueWallet/react-native-privacy-snapshot.git#529e4627d93f67752a27e82a040ff7b64dca0783" + "version": "git+https://github.com/BlueWallet/react-native-privacy-snapshot.git#529e4627d93f67752a27e82a040ff7b64dca0783", + "from": "git+https://github.com/BlueWallet/react-native-privacy-snapshot.git#529e4627d93f67752a27e82a040ff7b64dca0783" }, "react-native-prompt-android": { - "version": "git+ssh://git@github.com/BlueWallet/react-native-prompt-android.git#2073b07f64bf5dc95807f64d79f37bdb111e6951", - "from": "react-native-prompt-android@git+https://github.com/BlueWallet/react-native-prompt-android.git#2073b07f64bf5dc95807f64d79f37bdb111e6951" + "version": "git+https://github.com/BlueWallet/react-native-prompt-android.git#2073b07f64bf5dc95807f64d79f37bdb111e6951", + "from": "git+https://github.com/BlueWallet/react-native-prompt-android.git#2073b07f64bf5dc95807f64d79f37bdb111e6951" }, "react-native-push-notification": { "version": "5.1.1", @@ -18910,9 +17416,9 @@ "integrity": "sha512-lvmxu4UJ7/OfpNwww3AmTzAkKdD8z65VNguoKanRyBhrSm/IeNYLe482Vku9YodgWNkjZfl2AtJ51Sv9rhUu3A==" }, "react-native-ratings": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/react-native-ratings/-/react-native-ratings-7.3.0.tgz", - "integrity": "sha512-NCDIkmrVPnxPzP9zKdlcNpa2rPs3Hiv2qXsojUr3FpwbANWfgYE+jjGSSCBcS3vpXndTjhoaTGFDnybnUSFPFA==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/react-native-ratings/-/react-native-ratings-7.6.1.tgz", + "integrity": "sha512-V3y19iIifwemMr87KfovFIIzy/Rotqcds9k+ECaayQvrlucm/mXFC69R8xl/NivEdnxX7K87iurigByhpE37EQ==", "requires": { "lodash": "^4.17.15", "prop-types": "^15.7.2" @@ -18972,8 +17478,8 @@ "integrity": "sha512-r5WZLpmx2hHjC1RgMdPq5YpSU9tEhBpUaZ5M1SUtNIONyiLqQVxabhRCINdebIk4depJiIl7yw2Q85zJyeX6fw==" }, "react-native-secure-key-store": { - "version": "git+ssh://git@github.com/BlueWallet/react-native-secure-key-store.git#4828fd1a67d12e4c0e21eee0bee673fde75e6f9a", - "from": "react-native-secure-key-store@git+https://github.com/BlueWallet/react-native-secure-key-store.git#4828fd1a67d12e4c0e21eee0bee673fde75e6f9a" + "version": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#4828fd1a67d12e4c0e21eee0bee673fde75e6f9a", + "from": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#4828fd1a67d12e4c0e21eee0bee673fde75e6f9a" }, "react-native-share": { "version": "5.2.2", @@ -18998,9 +17504,9 @@ } }, "react-native-status-bar-height": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-native-status-bar-height/-/react-native-status-bar-height-2.5.0.tgz", - "integrity": "sha512-sYBCPYA/NapBSHkdm/IVL4ID3LLlIuLqINi2FBDyMkc2BU9pfSGOtkz9yfxoK39mYJuTrlTOQ7mManARUsYDSA==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-native-status-bar-height/-/react-native-status-bar-height-2.6.0.tgz", + "integrity": "sha512-z3SGLF0mHT+OlJDq7B7h/jXPjWcdBT3V14Le5L2PjntjjWM3+EJzq2BcXDwV+v67KFNJic5pgA26cCmseYek6w==" }, "react-native-svg": { "version": "12.1.0", @@ -19031,8 +17537,8 @@ } }, "react-native-tooltip": { - "version": "git+ssh://git@github.com/BlueWallet/react-native-tooltip.git#d369e7ece09e4dec73873f1cfeac83e9d35294a6", - "from": "react-native-tooltip@git+https://github.com/BlueWallet/react-native-tooltip.git#d369e7ece09e4dec73873f1cfeac83e9d35294a6" + "version": "git+https://github.com/BlueWallet/react-native-tooltip.git#d369e7ece09e4dec73873f1cfeac83e9d35294a6", + "from": "git+https://github.com/BlueWallet/react-native-tooltip.git#d369e7ece09e4dec73873f1cfeac83e9d35294a6" }, "react-native-tor": { "version": "0.1.7", @@ -19101,11 +17607,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -19152,9 +17653,9 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -19233,8 +17734,8 @@ } }, "react-native-widget-center": { - "version": "git+ssh://git@github.com/BlueWallet/react-native-widget-center.git#e2e9a9038b76d096bf929a87105a97a0a7095001", - "from": "react-native-widget-center@git+https://github.com/BlueWallet/react-native-widget-center.git#e2e9a9038b76d096bf929a87105a97a0a7095001" + "version": "git+https://github.com/BlueWallet/react-native-widget-center.git#e2e9a9038b76d096bf929a87105a97a0a7095001", + "from": "git+https://github.com/BlueWallet/react-native-widget-center.git#e2e9a9038b76d096bf929a87105a97a0a7095001" }, "react-refresh": { "version": "0.4.3", @@ -19277,67 +17778,86 @@ } }, "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } } }, "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "dependencies": { "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" + "p-locate": "^4.1.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "p-limit": "^2.2.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true } } @@ -19379,23 +17899,6 @@ "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } } } }, @@ -19454,16 +17957,6 @@ "agent-base": "^4.3.0", "debug": "^3.1.0" } - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" } } }, @@ -19477,9 +17970,9 @@ } }, "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { "version": "8.2.0", @@ -19490,9 +17983,9 @@ } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, "regenerator-transform": { "version": "0.14.5", @@ -19522,12 +18015,12 @@ } }, "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "regexpp": { @@ -19537,9 +18030,9 @@ "dev": true }, "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "requires": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^8.2.0", @@ -19555,9 +18048,9 @@ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "requires": { "jsesc": "~0.5.0" }, @@ -19575,9 +18068,9 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" }, "repeat-string": { "version": "1.6.1", @@ -19628,21 +18121,21 @@ } }, "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dev": true, "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "dev": true, "requires": { - "request-promise-core": "1.1.3", + "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" } @@ -19652,6 +18145,12 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", @@ -19663,10 +18162,11 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "requires": { + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, @@ -19677,20 +18177,12 @@ "dev": true, "requires": { "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" }, "resolve-url": { "version": "0.2.1", @@ -19794,9 +18286,12 @@ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } }, "rx-lite": { "version": "4.0.8", @@ -19820,9 +18315,9 @@ } }, "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==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-json-stringify": { "version": "1.2.0", @@ -19962,9 +18457,12 @@ } }, "serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=" + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "requires": { + "type-fest": "^0.20.2" + } }, "serve-static": { "version": "1.14.1", @@ -20022,6 +18520,14 @@ "safe-buffer": "^5.0.1" } }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -20036,15 +18542,9 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" }, "shellwords": { "version": "0.1.1", @@ -20054,13 +18554,13 @@ "optional": true }, "side-channel": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", - "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", - "dev": true, + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "requires": { - "es-abstract": "^1.17.0-next.1", - "object-inspect": "^1.7.0" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" } }, "signal-exit": { @@ -20069,9 +18569,9 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "simple-plist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.0.tgz", - "integrity": "sha512-2i5Tc0BYAqppM7jVzmNrI+aEUntPolIq4fDgji6WuNNn1D/qYdn2KwoLhZdzQkE04lu9L5tUoeJsjuJAvd+lFg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.1.tgz", + "integrity": "sha512-pKMCVKvZbZTsqYR6RKgLfBHkh2cV89GXcA/0CVPje3sOiNOnXA8+rp/ciAMZ7JRaUdLzlEM6JFfUn+fS6Nt3hg==", "requires": { "bplist-creator": "0.0.8", "bplist-parser": "0.2.0", @@ -20110,13 +18610,15 @@ "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + } } }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" - }, "slip39": { "version": "file:blue_modules/slip39", "requires": { @@ -20270,9 +18772,9 @@ } }, "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" }, "spdx-correct": { "version": "3.1.1", @@ -20301,9 +18803,9 @@ } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, "split-on-first": { @@ -20341,9 +18843,9 @@ } }, "stack-utils": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.4.tgz", - "integrity": "sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", "requires": { "escape-string-regexp": "^2.0.0" }, @@ -20355,12 +18857,24 @@ } } }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + }, "stacktrace-parser": { "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" + }, + "dependencies": { + "type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" + } } }, "static-extend": { @@ -20415,19 +18929,6 @@ "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } } } }, @@ -20452,9 +18953,9 @@ "integrity": "sha512-D5OKWKvDhyVWWn2x5Y9b+37NUllks34q1dCDhk/vYcso9fmhs+Tl3KR/gE4v5UNj2UA35cnX4KdVVGkG1deKqw==" }, "string-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "requires": { "char-regex": "^1.0.2", @@ -20484,77 +18985,62 @@ "integrity": "sha1-qJPtNH5yKZvIO++78qaSqNI51d0=" }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string.prototype.matchall": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", - "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz", + "integrity": "sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", + "es-abstract": "^1.18.0-next.2", "has-symbols": "^1.0.1", - "internal-slot": "^1.0.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.2" + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - } + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -20575,10 +19061,9 @@ "dev": true }, "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "sudo-prompt": { "version": "9.2.1", @@ -20594,9 +19079,9 @@ } }, "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", "dev": true, "requires": { "has-flag": "^4.0.0", @@ -20610,9 +19095,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -20620,11 +19105,6 @@ } } }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" - }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -20642,26 +19122,109 @@ } }, "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.6.0.tgz", + "integrity": "sha512-iZMtp5tUvcnAdtHpZTWLPF0M7AgiQsURR2DwmxnJwSy8I3+cY+ozzVvYha3BOLG2TB+L0CqjIz+91htuj6yCXg==", "dev": true, "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "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==", + "ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" } } } @@ -20775,18 +19338,18 @@ }, "dependencies": { "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" } }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true } } @@ -20887,19 +19450,6 @@ "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } } } }, @@ -20909,9 +19459,9 @@ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" }, "tiny-secp256k1": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.5.tgz", - "integrity": "sha512-duE2hSLSQIpHGzmK48OgRrGTi+4OTkXLC6aa86uOYQ6LLCYZSarVKIAvEtY7MoXjoL6bOXMSerEGMzrvW4SkDw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", + "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", "requires": { "bindings": "^1.3.0", "bn.js": "^4.11.8", @@ -21037,14 +19587,14 @@ } }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -21079,9 +19629,9 @@ "dev": true }, "type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" }, "typedarray": { "version": "0.0.6", @@ -21107,9 +19657,9 @@ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" }, "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" }, "uglify-es": { "version": "3.3.9", @@ -21132,6 +19682,22 @@ } } }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -21219,9 +19785,9 @@ } }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { "punycode": "^2.1.0" } @@ -21253,9 +19819,9 @@ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" }, "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -21319,15 +19885,15 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "v8-compile-cache": { - "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==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "v8-to-istanbul": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz", - "integrity": "sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -21440,9 +20006,9 @@ } }, "whatwg-fetch": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.2.0.tgz", - "integrity": "sha512-SdGPoQMMnzVYThUbSrEvqTlkvC1Ux27NehaJ/GUHBfNrh5Mjg+1/uRyFMwVnxO2MrikMWvWAqUGgQOfVU4hT7w==" + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" }, "whatwg-mimetype": { "version": "2.3.0", @@ -21451,22 +20017,14 @@ "dev": true }, "whatwg-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz", - "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", + "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", "dev": true, "requires": { - "lodash.sortby": "^4.7.0", + "lodash": "^4.7.0", "tr46": "^2.0.2", - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } + "webidl-conversions": "^6.1.0" } }, "which": { @@ -21477,18 +20035,31 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "which-typed-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz", - "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", "requires": { "available-typed-arrays": "^1.0.2", - "es-abstract": "^1.17.5", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", "foreach": "^2.0.5", "function-bind": "^1.1.1", "has-symbols": "^1.0.1", @@ -21529,39 +20100,6 @@ "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } } }, "wrappy": { @@ -21569,23 +20107,16 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "slide": "^1.1.5" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "ws": { @@ -21628,9 +20159,9 @@ } }, "xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", + "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==" }, "xpipe": { "version": "1.0.5", @@ -21643,9 +20174,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "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==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yallist": { "version": "2.1.2", @@ -21669,6 +20200,35 @@ "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "yargs-parser": { From a84c16e4fc2b5bc2752fcdfed509e56678408b69 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Thu, 6 May 2021 17:03:52 +0100 Subject: [PATCH 006/327] OPS: android scoped storage usage (closes #3089) --- android/app/src/main/AndroidManifest.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 1f2c164b8..598fdbb52 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -5,7 +5,8 @@ - + From 72cb50c8934ab8ae6855ee9e55ddf32c657d20b2 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 7 May 2021 03:51:48 +0000 Subject: [PATCH 007/327] fix: upgrade react-native-device-info from 8.0.7 to 8.1.0 Snyk has created this PR to upgrade react-native-device-info from 8.0.7 to 8.1.0. See this package in npm: https://www.npmjs.com/package/react-native-device-info See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 627470da7..865b4e1b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18692,9 +18692,9 @@ "integrity": "sha512-sQDYwGEdxwKwXKP/8Intc81FyH33Rv8ZvOxdmPX4NM75RAIVeBc13pdabEqycAimNZoY5IDvGp4o1cTTa5gNrA==" }, "react-native-device-info": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-8.0.7.tgz", - "integrity": "sha512-CSGosqvESXWKTfYa+6gYd3HRQOkJm6C+TSXfaipat4Q0BzUHWWNaS5M5z7x72hg6FRk25rJ4zxSmSCQvizHzzQ==" + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-8.1.0.tgz", + "integrity": "sha512-szEbRRFQ1NYPOjGWyIMsZGk5W2eU4JTiFLaNVXTbK4u/BS/Z5moVJKcoJgYR6Fxiu6qPAY/ofJySJoSdhSeOnw==" }, "react-native-document-picker": { "version": "git+ssh://git@github.com/BlueWallet/react-native-document-picker.git#3684d4fcc2bc0b47c32be39024e4796004c3e428", diff --git a/package.json b/package.json index e28248db3..8f95a3458 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "react-native-camera": "3.43.5", "react-native-crypto": "2.2.0", "react-native-default-preference": "1.4.3", - "react-native-device-info": "8.0.7", + "react-native-device-info": "8.1.0", "react-native-document-picker": "https://github.com/BlueWallet/react-native-document-picker#3684d4fcc2bc0b47c32be39024e4796004c3e428", "react-native-elements": "2.3.2", "react-native-fingerprint-scanner": "https://github.com/BlueWallet/react-native-fingerprint-scanner#ce644673681716335d786727bab998f7e632ab5e", From d7911fcfe2ccfdc666846b911b6a7d0a28eead55 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Fri, 7 May 2021 16:55:17 +0100 Subject: [PATCH 008/327] ADD: opt-out of analytics tracking in settings/privacy (rel #3084) --- blue_modules/WidgetCommunication.android.js | 2 +- blue_modules/analytics.js | 11 ++++++++ blue_modules/storage-context.js | 4 +++ class/app-storage.js | 12 +++++++++ loc/en.json | 2 ++ package-lock.json | 6 ++--- package.json | 2 +- screen/settings/SettingsPrivacy.js | 29 ++++++++++++++++++++- 8 files changed, 62 insertions(+), 6 deletions(-) diff --git a/blue_modules/WidgetCommunication.android.js b/blue_modules/WidgetCommunication.android.js index 437788d12..2ffa05e2d 100644 --- a/blue_modules/WidgetCommunication.android.js +++ b/blue_modules/WidgetCommunication.android.js @@ -1,5 +1,5 @@ function WidgetCommunication(props) { - WidgetCommunication.isBalanceDisplayAllowed = false; + WidgetCommunication.isBalanceDisplayAllowed = () => {}; WidgetCommunication.setBalanceDisplayAllowed = () => {}; return null; } diff --git a/blue_modules/analytics.js b/blue_modules/analytics.js index 7fd0af86f..9a8fd3417 100644 --- a/blue_modules/analytics.js +++ b/blue_modules/analytics.js @@ -1,6 +1,8 @@ +import * as Sentry from '@sentry/react-native'; import amplitude from 'amplitude-js'; import { getVersion, getSystemName } from 'react-native-device-info'; import { Platform } from 'react-native'; +const BlueApp = require('../BlueApp'); amplitude.getInstance().init('8b7cf19e8eea3cdcf16340f5fbf16330', null, { useNativeDeviceInfo: true, @@ -8,6 +10,10 @@ amplitude.getInstance().init('8b7cf19e8eea3cdcf16340f5fbf16330', null, { }); amplitude.getInstance().setVersionName(getVersion()); amplitude.getInstance().options.apiEndpoint = 'api2.amplitude.com'; +BlueApp.isDoNotTrackEnabled().then(value => { + if (value) Sentry.close(); + amplitude.getInstance().setOptOut(value); +}); const A = async event => { console.log('posting analytics...', event); @@ -28,4 +34,9 @@ A.ENUM = { NAVIGATED_TO_WALLETS_HODLHODL: 'NAVIGATED_TO_WALLETS_HODLHODL', }; +A.setOptOut = value => { + if (value) Sentry.close(); + return amplitude.getInstance().setOptOut(value); +}; + module.exports = A; diff --git a/blue_modules/storage-context.js b/blue_modules/storage-context.js index 30c80de12..08ab08522 100644 --- a/blue_modules/storage-context.js +++ b/blue_modules/storage-context.js @@ -175,6 +175,8 @@ export const BlueStorageProvider = ({ children }) => { const getHodlHodlSignatureKey = BlueApp.getHodlHodlSignatureKey; const addHodlHodlContract = BlueApp.addHodlHodlContract; const getHodlHodlContracts = BlueApp.getHodlHodlContracts; + const setDoNotTrack = BlueApp.setDoNotTrack; + const isDoNotTrackEnabled = BlueApp.isDoNotTrackEnabled; const getItem = BlueApp.getItem; const setItem = BlueApp.setItem; @@ -227,6 +229,8 @@ export const BlueStorageProvider = ({ children }) => { setWalletTransactionUpdateStatus, isDrawerListBlurred, setIsDrawerListBlurred, + setDoNotTrack, + isDoNotTrackEnabled, }} > {children} diff --git a/class/app-storage.js b/class/app-storage.js index 1c2f482d5..205a13cac 100644 --- a/class/app-storage.js +++ b/class/app-storage.js @@ -36,6 +36,7 @@ export class AppStorage { static ELECTRUM_SERVER_HISTORY = 'electrum_server_history'; static PREFERRED_CURRENCY = 'preferredCurrency'; static ADVANCED_MODE_ENABLED = 'advancedmodeenabled'; + static DO_NOT_TRACK = 'donottrack'; static HODL_HODL_API_KEY = 'HODL_HODL_API_KEY'; static HODL_HODL_SIGNATURE_KEY = 'HODL_HODL_SIGNATURE_KEY'; static HODL_HODL_CONTRACTS = 'HODL_HODL_CONTRACTS'; @@ -653,6 +654,17 @@ export class AppStorage { await this.setItem(AppStorage.ADVANCED_MODE_ENABLED, value ? '1' : ''); }; + isDoNotTrackEnabled = async () => { + try { + return !!(await this.getItem(AppStorage.DO_NOT_TRACK)); + } catch (_) {} + return false; + }; + + setDoNotTrack = async value => { + await this.setItem(AppStorage.DO_NOT_TRACK, value ? '1' : ''); + }; + /** * Simple async sleeper function * diff --git a/loc/en.json b/loc/en.json index 9b3f9359a..02afea61f 100644 --- a/loc/en.json +++ b/loc/en.json @@ -316,6 +316,8 @@ "privacy_quickactions": "Wallet Shortcuts", "privacy_quickactions_explanation": "Touch and hold the BlueWallet app icon on your Home Screen to quickly view your wallet’s balance.", "privacy_clipboard_explanation": "Provide shortcuts if an address or invoice is found in your clipboard.", + "privacy_do_not_track": "Do Not Track", + "privacy_do_not_track_explanation": "Some anonymized analytics and debug data won't be sent to analytics service.", "push_notifications": "Push Notifications", "retype_password": "Re-type password", "selfTest": "Self-Test", diff --git a/package-lock.json b/package-lock.json index 973259d11..ea8a0d968 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3564,9 +3564,9 @@ } }, "@sentry/react-native": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@sentry/react-native/-/react-native-2.4.0.tgz", - "integrity": "sha512-yRUN36tKRSsGEtNHihEzl0KqGh7pmWfNV0h3jf5Q1VKXNHA9iO2ABcmr47wScrbrK2MDL1umO1AQNq2+6z24QA==", + "version": "2.5.0-beta.1", + "resolved": "https://registry.npmjs.org/@sentry/react-native/-/react-native-2.5.0-beta.1.tgz", + "integrity": "sha512-q+WQwFRBl/3uKIdB+NExfPMoDzQzdHuA+W3p9ZPfBdsNX3t3iHa3JHT6t0EYRf46NlAmFmnHaQNqHxP7u9I6LQ==", "requires": { "@sentry/browser": "6.2.1", "@sentry/core": "6.2.1", diff --git a/package.json b/package.json index 8f95a3458..087fa695d 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "@react-navigation/drawer": "5.12.5", "@react-navigation/stack": "5.14.3", "@remobile/react-native-qrcode-local-image": "https://github.com/BlueWallet/react-native-qrcode-local-image", - "@sentry/react-native": "2.4.0", + "@sentry/react-native": "2.5.0-beta.1", "aez": "1.0.1", "amplitude-js": "7.4.4", "assert": "1.5.0", diff --git a/screen/settings/SettingsPrivacy.js b/screen/settings/SettingsPrivacy.js index 1193d0a86..e2373736f 100644 --- a/screen/settings/SettingsPrivacy.js +++ b/screen/settings/SettingsPrivacy.js @@ -10,12 +10,15 @@ import BlueClipboard from '../../blue_modules/clipboard'; import { BlueStorageContext } from '../../blue_modules/storage-context'; import WidgetCommunication from '../../blue_modules/WidgetCommunication'; +const A = require('../../blue_modules/analytics'); + const SettingsPrivacy = () => { const { colors } = useTheme(); - const { isStorageEncrypted } = useContext(BlueStorageContext); + const { isStorageEncrypted, setDoNotTrack, isDoNotTrackEnabled } = useContext(BlueStorageContext); const sections = Object.freeze({ ALL: 0, CLIPBOARDREAD: 1, QUICKACTION: 2, WIDGETS: 3 }); const [isLoading, setIsLoading] = useState(sections.ALL); const [isReadClipboardAllowed, setIsReadClipboardAllowed] = useState(false); + const [doNotTrackSwitchValue, setDoNotTrackSwitchValue] = useState(false); const [isDisplayWidgetBalanceAllowed, setIsDisplayWidgetBalanceAllowed] = useState(false); const [isQuickActionsEnabled, setIsQuickActionsEnabled] = useState(false); @@ -24,6 +27,7 @@ const SettingsPrivacy = () => { useEffect(() => { (async () => { try { + setDoNotTrackSwitchValue(await isDoNotTrackEnabled()); setIsReadClipboardAllowed(await BlueClipboard.isReadClipboardAllowed()); setStorageIsEncrypted(await isStorageEncrypted()); setIsQuickActionsEnabled(await DeviceQuickActions.getEnabled()); @@ -47,6 +51,18 @@ const SettingsPrivacy = () => { setIsLoading(false); }; + const onDoNotTrackValueChange = async value => { + setIsLoading(sections.ALL); + try { + setDoNotTrackSwitchValue(value); + A.setOptOut(value); + await setDoNotTrack(value); + } catch (e) { + console.log(e); + } + setIsLoading(false); + }; + const onQuickActionsValueChange = async value => { setIsLoading(sections.QUICKACTION); try { @@ -129,6 +145,17 @@ const SettingsPrivacy = () => { )} + + + + {loc.settings.privacy_do_not_track_explanation} + + From 004bfe3baa0571688a89b1750546376bd035a60c Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Fri, 7 May 2021 18:50:27 -0400 Subject: [PATCH 009/327] Update Podfile.lock --- ios/Podfile.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 3ed206acf..fe40efee4 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -260,13 +260,13 @@ PODS: - React - react-native-blur (0.8.0): - React - - react-native-camera (3.43.2): + - react-native-camera (3.43.5): - React-Core - - react-native-camera/RCT (= 3.43.2) - - react-native-camera/RN (= 3.43.2) - - react-native-camera/RCT (3.43.2): + - react-native-camera/RCT (= 3.43.5) + - react-native-camera/RN (= 3.43.5) + - react-native-camera/RCT (3.43.5): - React-Core - - react-native-camera/RN (3.43.2): + - react-native-camera/RN (3.43.5): - React-Core - react-native-document-picker (3.5.4): - React @@ -366,7 +366,7 @@ PODS: - React-Core - RNDefaultPreference (1.4.3): - React - - RNDeviceInfo (8.0.7): + - RNDeviceInfo (8.1.0): - React-Core - RNFS (2.16.6): - React @@ -419,9 +419,9 @@ PODS: - React-Core - RNSecureKeyStore (1.0.0): - React - - RNSentry (2.4.0): + - RNSentry (2.5.0-beta.1): - React-Core - - Sentry (= 6.1.4) + - Sentry (= 7.0.0) - RNShare (5.2.2): - React-Core - RNSVG (12.1.0): @@ -430,9 +430,9 @@ PODS: - React - RNWatch (1.0.3): - React - - Sentry (6.1.4): - - Sentry/Core (= 6.1.4) - - Sentry/Core (6.1.4) + - Sentry (7.0.0): + - Sentry/Core (= 7.0.0) + - Sentry/Core (7.0.0) - SwiftSocket (2.0.2) - ToolTipMenu (5.2.0): - React @@ -735,7 +735,7 @@ SPEC CHECKSUMS: React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a react-native-blue-crypto: 23f1558ad3d38d7a2edb7e2f6ed1bc520ed93e56 react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c - react-native-camera: 3333256bb222adc7592b4a8f153ee392b5b0ddf1 + react-native-camera: 8a79f048c146e08e416c542bcf57984cbc7ed404 react-native-document-picker: c5752781fbc0c126c627c1549b037c139444a4cf react-native-fingerprint-scanner: c68136ca57e3704d7bdf5faa554ea535ce15b1d0 react-native-idle-timer: 97b8283237d45146a7a5c25bdebe9e1e85f3687b @@ -764,7 +764,7 @@ SPEC CHECKSUMS: RNCMaskedView: f5c7d14d6847b7b44853f7acb6284c1da30a3459 RNCPushNotificationIOS: 5b1cf9ad2aaa107ecb92d5d2d7005ba521b2b97a RNDefaultPreference: 21816c0a6f61a2829ccc0cef034392e9b509ee5f - RNDeviceInfo: 0550f15928f92d062238ea412b645d00548fd809 + RNDeviceInfo: 77944ee74f4464aa4672b62e3239e4fa69ab534f RNFS: 2bd9eb49dc82fa9676382f0585b992c424cd59df RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211 RNHandoff: d3b0754cca3a6bcd9b25f544f733f7f033ccf5fa @@ -777,12 +777,12 @@ SPEC CHECKSUMS: RNReanimated: c5e9d841d33ed7f83861462756cec7146e73afaa RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 - RNSentry: b0d55027200c96f52e26b9bfb20296d47fc5051d + RNSentry: 1868bcfe8c69b2c3b2451439a38b3ebea0a7510f RNShare: 5cfe16bfd42cd2c4869a7692462181ac8cc15a6d RNSVG: ce9d996113475209013317e48b05c21ee988d42e RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 RNWatch: e4c5d19506c94506860032fb68aedd5991beb985 - Sentry: 9d055e2de30a77685e86b219acf02e59b82091fc + Sentry: 89d26e036063b9cb9caa59b6951dd2f8277aa13b SwiftSocket: c8d482e867ae4d3eb4c769e9382e123c1f1f833b ToolTipMenu: 4d89d95ddffd7539230bdbe02ee51bbde362e37e Yoga: 4bd86afe9883422a7c4028c00e34790f560923d6 From 333f2bbf9a88154a2f8eef6efff150c446b5bd2a Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Fri, 7 May 2021 19:09:24 -0400 Subject: [PATCH 010/327] Update scanLndInvoice.js --- screen/lnd/scanLndInvoice.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/screen/lnd/scanLndInvoice.js b/screen/lnd/scanLndInvoice.js index e4ce61f1e..05354d633 100644 --- a/screen/lnd/scanLndInvoice.js +++ b/screen/lnd/scanLndInvoice.js @@ -288,7 +288,7 @@ const ScanLndInvoice = () => { - + { onAmountUnitChange={setUnit} onChangeText={setAmount} disabled={!decoded || isLoading || decoded.num_satoshis > 0} - unit={BitcoinUnit.SATS} + unit={unit} inputAccessoryViewID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID} /> From 10e86c72d434155ca9ec6cae8c66dc5b809baf3e Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 8 May 2021 03:52:06 +0000 Subject: [PATCH 011/327] fix: upgrade react-native-svg from 12.1.0 to 12.1.1 Snyk has created this PR to upgrade react-native-svg from 12.1.0 to 12.1.1. See this package in npm: https://www.npmjs.com/package/react-native-svg See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 973259d11..24a36c9d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17509,9 +17509,9 @@ "integrity": "sha512-z3SGLF0mHT+OlJDq7B7h/jXPjWcdBT3V14Le5L2PjntjjWM3+EJzq2BcXDwV+v67KFNJic5pgA26cCmseYek6w==" }, "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==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-12.1.1.tgz", + "integrity": "sha512-NIAJ8jCnXGCqGWXkkJ1GTzO4a3Md5at5sagYV8Vh4MXYnL4z5Rh428Wahjhh+LIjx40EE5xM5YtwyJBqOIba2Q==", "requires": { "css-select": "^2.1.0", "css-tree": "^1.0.0-alpha.39" diff --git a/package.json b/package.json index 8f95a3458..7bfb97dbb 100644 --- a/package.json +++ b/package.json @@ -161,7 +161,7 @@ "react-native-share": "5.2.2", "react-native-snap-carousel": "3.9.1", "react-native-sortable-list": "0.0.24", - "react-native-svg": "12.1.0", + "react-native-svg": "12.1.1", "react-native-tcp-socket": "3.7.1", "react-native-tooltip": "https://github.com/BlueWallet/react-native-tooltip#d369e7ece09e4dec73873f1cfeac83e9d35294a6", "react-native-tor": "0.1.7", From 967736f98735038bd6817c6e60cc92217102c32b Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 8 May 2021 03:52:11 +0000 Subject: [PATCH 012/327] fix: upgrade react-native-webview from 11.3.1 to 11.4.0 Snyk has created this PR to upgrade react-native-webview from 11.3.1 to 11.4.0. See this package in npm: https://www.npmjs.com/package/react-native-webview See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 973259d11..d612d0922 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17718,9 +17718,9 @@ } }, "react-native-webview": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.3.1.tgz", - "integrity": "sha512-qHvD2DVbUVSuRLU33RU4LbfISoJ3q5PWj4fuDcMgEYaEnlvOiOQqR/x5t9z4kdVZ83T+WG8ktp19F2uTCaOKRg==", + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.4.0.tgz", + "integrity": "sha512-il4OOJxBJgFXk8rtVgYQJIGRqYD5wJXc4By6nvnkHlH3hbyw1Mx5HKfP9Qmsy8xdCwHYgCBjUuCfHoGXJ9hMSA==", "requires": { "escape-string-regexp": "2.0.0", "invariant": "2.2.4" diff --git a/package.json b/package.json index 8f95a3458..0f43cebab 100644 --- a/package.json +++ b/package.json @@ -167,7 +167,7 @@ "react-native-tor": "0.1.7", "react-native-vector-icons": "7.1.0", "react-native-watch-connectivity": "1.0.3", - "react-native-webview": "11.3.1", + "react-native-webview": "11.4.0", "react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#e2e9a9038b76d096bf929a87105a97a0a7095001", "react-test-render": "1.1.2", "readable-stream": "3.6.0", From cb6c48eaf8b90a3b0fe1110ad65cc655bb57d679 Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Sat, 8 May 2021 09:41:45 +0300 Subject: [PATCH 013/327] REF: upgrade eslint, prettier, move them to dev deps, fix new lint errors --- .eslintrc | 9 +- BlueComponents.js | 8 +- class/wallets/multisig-hd-wallet.js | 2 +- package-lock.json | 416 +++++++++++++++++++++++++--- package.json | 23 +- screen/lnd/browser.js | 4 +- screen/send/confirm.js | 52 ++-- screen/send/details.js | 2 +- screen/settings/electrumSettings.js | 2 +- shim.js | 2 +- tests/e2e/bluewallet.spec.js | 2 +- tests/integration/App.test.js | 2 +- tests/unit/currency.test.js | 2 +- 13 files changed, 435 insertions(+), 91 deletions(-) diff --git a/.eslintrc b/.eslintrc index 689b2ff8b..ba32bc667 100644 --- a/.eslintrc +++ b/.eslintrc @@ -6,14 +6,15 @@ "extends": [ "standard", "standard-react", + "standard-jsx", "plugin:react-hooks/recommended", - // "@react-native-community", - "plugin:prettier/recommended", - "prettier/react", - "prettier/standard", + "plugin:react/recommended", + // "@react-native-community", // TODO: try to enable + "plugin:prettier/recommended", // removes all eslint rules that can mess up with prettier ], "rules": { "react/jsx-handler-names": "off", // activated by standard-react config + "react/display-name": "off", "react-native/no-inline-styles": "error", "prettier/prettier": [ "warn", diff --git a/BlueComponents.js b/BlueComponents.js index 620ce51bd..ed99458d0 100644 --- a/BlueComponents.js +++ b/BlueComponents.js @@ -1349,13 +1349,7 @@ export const BlueTransactionListItem = React.memo(({ item, itemPriceUnit = Bitco if (item.hash) { navigate('TransactionStatus', { hash: item.hash }); } else if (item.type === 'user_invoice' || item.type === 'payment_request' || item.type === 'paid_invoice') { - const lightningWallet = wallets.filter(wallet => { - if (typeof wallet === 'object') { - if ('secret' in wallet) { - return wallet.getSecret() === item.fromWallet; - } - } - }); + const lightningWallet = wallets.filter(wallet => wallet?.getSecret() === item.fromWallet); if (lightningWallet.length === 1) { try { // is it a successful lnurl-pay? diff --git a/class/wallets/multisig-hd-wallet.js b/class/wallets/multisig-hd-wallet.js index dbaffc6cc..bf337a444 100644 --- a/class/wallets/multisig-hd-wallet.js +++ b/class/wallets/multisig-hd-wallet.js @@ -593,8 +593,8 @@ export class MultisigHDWallet extends AbstractHDElectrumWallet { case MultisigHDWallet.FORMAT_P2SH_P2WSH_ALT: this.setWrappedSegwit(); break; - default: case MultisigHDWallet.FORMAT_P2WSH: + default: this.setNativeSegwit(); break; } diff --git a/package-lock.json b/package-lock.json index ea8a0d968..0b1d54b26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1151,6 +1151,18 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -3387,6 +3399,15 @@ "prettier": "^2.0.2" }, "dependencies": { + "eslint-config-prettier": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, "eslint-plugin-prettier": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", @@ -4256,6 +4277,92 @@ "es-abstract": "^1.18.0-next.2", "get-intrinsic": "^1.1.1", "is-string": "^1.0.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + } } }, "array-map": { @@ -4287,6 +4394,92 @@ "call-bind": "^1.0.0", "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + } } }, "array.prototype.flatmap": { @@ -7229,12 +7422,39 @@ "esutils": "^2.0.2" } }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -7275,6 +7495,12 @@ "resolve-from": "^4.0.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7344,6 +7570,12 @@ "has-flag": "^4.0.0" } }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7362,30 +7594,28 @@ } }, "eslint-config-prettier": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.14.0.tgz", - "integrity": "sha512-DbVwh0qZhAC7CNDWcq8cBdK6FcVHiMTKmCypOPWeZkp9hJ8xYwTaWSa6bb6cjfi8KOeJy0e9a8Izxyx+O4+gCQ==", - "requires": { - "get-stdin": "^6.0.0" - } + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true }, "eslint-config-standard": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz", - "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==" + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.2.tgz", + "integrity": "sha512-fx3f1rJDsl9bY7qzyX8SAtP8GBSk6MfXFaTfaGgk12aAYW4gJSyRm7dM790L6cbXv63fvjY4XeSzXnb4WM+SKw==", + "dev": true }, "eslint-config-standard-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-8.1.0.tgz", - "integrity": "sha512-ULVC8qH8qCqbU792ZOO6DaiaZyHNS/5CZt3hKqHkEhVlhPEPN3nfBqqxJCyp59XrjIBZPu1chMYe9T2DXZ7TMw==" + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-10.0.0.tgz", + "integrity": "sha512-hLeA2f5e06W1xyr/93/QJulN/rLbUVUmqTlexv9PRKHFwEC9ffJcH2LvJhMoEqYQBEYafedgGZXH2W8NUpt5lA==", + "dev": true }, "eslint-config-standard-react": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-react/-/eslint-config-standard-react-9.2.0.tgz", - "integrity": "sha512-u+KRP2uCtthZ/W4DlLWCC59GZNV/y9k9yicWWammgTs/Omh8ZUUPF3EnYm81MAcbkYQq2Wg0oxutAhi/FQ8mIw==", - "requires": { - "eslint-config-standard-jsx": "^8.0.0" - } + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard-react/-/eslint-config-standard-react-11.0.1.tgz", + "integrity": "sha512-4WlBynOqBZJRaX81CBcIGDHqUiqxvw4j/DbEIICz8QkMs3xEncoPgAoysiqCSsg71X92uhaBc8sgqB96smaMmg==", + "dev": true }, "eslint-import-resolver-node": { "version": "0.3.4", @@ -7675,14 +7905,15 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-plugin-promise": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", - "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz", + "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==", "dev": true }, "eslint-plugin-react": { @@ -7740,9 +7971,10 @@ "dev": true }, "eslint-plugin-standard": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.2.tgz", - "integrity": "sha512-nKptN8l7jksXkwFk++PhJB3cCDTcXOEyhISIN86Ue2feJ1LFyY3PrY3/xT2keXlJSY5bpmbiTG0f885/YKAvTA==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz", + "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", + "dev": true }, "eslint-rule-composer": { "version": "0.3.0", @@ -7784,6 +8016,14 @@ "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } } }, "esprima": { @@ -8319,7 +8559,8 @@ "fast-diff": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true }, "fast-json-stable-stringify": { "version": "2.1.0", @@ -8558,9 +8799,9 @@ "dev": true }, "flow-bin": { - "version": "0.134.0", - "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.134.0.tgz", - "integrity": "sha512-j5aCugO3jmwDsUKc+7KReArgnL6aVjHLo6DlozKhxKYN+TaP8BY+mintPSISjSQtKZFJyvoNAc1oXA79X5WjIA==", + "version": "0.150.0", + "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.150.0.tgz", + "integrity": "sha512-s+0dcKJnZZO6mkS92YtJzBZ6vq7i1o77+NggEiiefPpCVsehwPlyRLmEnb6XN9OI5OfXp+kFnZt4q8a3zLNuUg==", "dev": true }, "for-in": { @@ -8773,7 +9014,8 @@ "get-stdin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true }, "get-stream": { "version": "4.1.0", @@ -15904,6 +16146,92 @@ "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.2", "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + } } }, "octal": { @@ -16363,14 +16691,16 @@ "optional": true }, "prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true }, "prettier-linter-helpers": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, "requires": { "fast-diff": "^1.1.2" } @@ -18386,7 +18716,7 @@ } }, "scryptsy": { - "version": "file:blue_modules/scryptsy", + "version": "file:https:/registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" }, "secp256k1": { @@ -18561,6 +18891,13 @@ "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" + }, + "dependencies": { + "object-inspect": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==" + } } }, "signal-exit": { @@ -19184,6 +19521,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -19696,6 +20039,13 @@ "has-bigints": "^1.0.1", "has-symbols": "^1.0.2", "which-boxed-primitive": "^1.0.2" + }, + "dependencies": { + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + } } }, "unicode-canonical-property-names-ecmascript": { diff --git a/package.json b/package.json index 087fa695d..23c6ea400 100644 --- a/package.json +++ b/package.json @@ -16,14 +16,21 @@ "babel-jest": "^26.1.0", "babel-preset-flow": "^6.23.0", "detox-recorder": "^1.0.149", - "eslint": "^7.5.0", + "eslint": "^7.25.0", + "eslint-config-prettier": "^8.3.0", + "eslint-config-standard": "^16.0.2", + "eslint-config-standard-jsx": "^10.0.0", + "eslint-config-standard-react": "^11.0.1", "eslint-plugin-babel": "^5.3.1", - "eslint-plugin-import": "^2.22.0", + "eslint-plugin-import": "^2.22.1", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-react": "^7.20.3", - "flow-bin": "^0.134.0", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-react": "^7.23.2", + "eslint-plugin-standard": "^4.1.0", + "flow-bin": "^0.150.0", "jest": "^26.1.0", + "prettier": "^2.2.1", "react-test-renderer": "16.13.1" }, "engines": { @@ -103,11 +110,6 @@ "ecurve": "1.0.6", "electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4", "electrum-mnemonic": "2.0.0", - "eslint-config-prettier": "6.14.0", - "eslint-config-standard": "14.1.1", - "eslint-config-standard-react": "9.2.0", - "eslint-plugin-prettier": "3.4.0", - "eslint-plugin-standard": "4.0.2", "events": "1.1.1", "frisbee": "3.1.4", "junderw-crc32c": "1.2.0", @@ -117,7 +119,6 @@ "path-browserify": "1.0.1", "payjoin-client": "1.0.0", "pbkdf2": "3.1.1", - "prettier": "2.1.2", "process": "0.11.10", "prop-types": "15.7.2", "react": "16.13.1", diff --git a/screen/lnd/browser.js b/screen/lnd/browser.js index 599757e41..f7e4e2972 100644 --- a/screen/lnd/browser.js +++ b/screen/lnd/browser.js @@ -52,10 +52,10 @@ var webln = { }); }, makeInvoice: function (RequestInvoiceArgs) { - var id = Math.random(); + var id = Math.random(); // eslint-disable-line window.ReactNativeWebView.postMessage(JSON.stringify({ makeInvoice: RequestInvoiceArgs, id: id })); return new Promise(function (resolve, reject) { - var interval = setInterval(function () { + var interval = setInterval(function () { // eslint-disable-line if (bluewalletResponses[id]) { clearInterval(interval); resolve(bluewalletResponses[id]); diff --git a/screen/send/confirm.js b/screen/send/confirm.js index 397ebfb84..1b01dc86e 100644 --- a/screen/send/confirm.js +++ b/screen/send/confirm.js @@ -57,9 +57,7 @@ export default class Confirm extends Component { * @return {string} */ getPaymentScript() { - for (const recipient of this.state.recipients) { - return bitcoin.address.toOutputScript(recipient.address); - } + return bitcoin.address.toOutputScript(this.state.recipients[0].address); } send() { @@ -221,28 +219,28 @@ export default class Confirm extends Component { {loc.send.create_fee}: {formatBalance(this.state.feeSatoshi, BitcoinUnit.BTC)} ( {currency.satoshiToLocalCurrency(this.state.feeSatoshi)}) - {this.state.isLoading ? : this.send()} title={loc.send.confirm_sendNow} />} - { - if (this.isBiometricUseCapableAndEnabled) { - if (!(await Biometric.unlockWithBiometrics())) { - return; - } + {this.state.isLoading ? : this.send()} title={loc.send.confirm_sendNow} />} + { + if (this.isBiometricUseCapableAndEnabled) { + if (!(await Biometric.unlockWithBiometrics())) { + return; } + } - this.props.navigation.navigate('CreateTransaction', { - fee: this.state.fee, - recipients: this.state.recipients, - memo: this.state.memo, - tx: this.state.tx, - satoshiPerByte: this.state.satoshiPerByte, - wallet: this.state.fromWallet, - feeSatoshi: this.state.feeSatoshi, - }); - }} - > + this.props.navigation.navigate('CreateTransaction', { + fee: this.state.fee, + recipients: this.state.recipients, + memo: this.state.memo, + tx: this.state.tx, + satoshiPerByte: this.state.satoshiPerByte, + wallet: this.state.fromWallet, + feeSatoshi: this.state.feeSatoshi, + }); + }} + > {loc.transactions.details_transaction_details} @@ -312,7 +310,7 @@ const styles = StyleSheet.create({ cardBottom: { flexGrow: 2, justifyContent: 'flex-end', - alignItems: 'center', + alignItems: 'center', }, cardContainer: { flexGrow: 1, @@ -346,10 +344,10 @@ const styles = StyleSheet.create({ justifyContent: 'space-between', backgroundColor: BlueCurrentTheme.colors.buttonDisabledBackgroundColor, }, - payjoinText: { - color: '#81868e', + payjoinText: { + color: '#81868e', fontSize: 15, - fontWeight: 'bold', + fontWeight: 'bold', }, }); diff --git a/screen/send/details.js b/screen/send/details.js index d0815c2ae..0d3806b7d 100644 --- a/screen/send/details.js +++ b/screen/send/details.js @@ -1159,8 +1159,8 @@ const SendDetails = () => { case BitcoinUnit.LOCAL_CURRENCY: item.amountSats = currency.btcToSatoshi(currency.fiatToBTC(item.amount)); break; - default: case BitcoinUnit.SATS: + default: item.amountSats = parseInt(text); break; } diff --git a/screen/settings/electrumSettings.js b/screen/settings/electrumSettings.js index ed61f1f71..55b18da92 100644 --- a/screen/settings/electrumSettings.js +++ b/screen/settings/electrumSettings.js @@ -214,7 +214,7 @@ export default class ElectrumSettings extends Component { // in case user scans a QR with a deeplink like `bluewallet:setelectrumserver?server=electrum1.bluewallet.io%3A443%3As` value = DeeplinkSchemaMatch.getServerFromSetElectrumServerAction(value); } - var [host, port, type] = value.split(':'); + const [host, port, type] = value.split(':'); this.setState({ host: host }); type === 's' ? this.setState({ sslPort: port }) : this.setState({ port: port }); }; diff --git a/shim.js b/shim.js index e7959b548..402f71a79 100644 --- a/shim.js +++ b/shim.js @@ -6,7 +6,7 @@ if (typeof process === 'undefined') { global.process = require('process'); } else { const bProcess = require('process'); - for (var p in bProcess) { + for (const p in bProcess) { if (!(p in process)) { process[p] = bProcess[p]; } diff --git a/tests/e2e/bluewallet.spec.js b/tests/e2e/bluewallet.spec.js index b93c294b1..af01b78ab 100644 --- a/tests/e2e/bluewallet.spec.js +++ b/tests/e2e/bluewallet.spec.js @@ -1251,7 +1251,7 @@ async function extractTextFromElementById(id) { const [, restMessage] = errorMessage.split(start); const [label] = restMessage.split(end); const value = label.split(','); - var combineText = value.find(i => i.includes('text=')).trim(); + const combineText = value.find(i => i.includes('text=')).trim(); const [, elementText] = combineText.split('='); return elementText; } diff --git a/tests/integration/App.test.js b/tests/integration/App.test.js index 6c6331287..e75664ea5 100644 --- a/tests/integration/App.test.js +++ b/tests/integration/App.test.js @@ -35,7 +35,7 @@ it('Selftest work', () => { let okFound = false; const allTests = []; - for (var v of root.findAllByType('Text')) { + for (const v of root.findAllByType('Text')) { let text = v.props.children; if (text.join) { text = text.join(''); diff --git a/tests/unit/currency.test.js b/tests/unit/currency.test.js index 14c38d4a7..0e8176f18 100644 --- a/tests/unit/currency.test.js +++ b/tests/unit/currency.test.js @@ -23,7 +23,7 @@ describe('currency', () => { assert.strictEqual(currency.satoshiToBTC(1), '0.00000001'); assert.strictEqual(currency.satoshiToBTC(-1), '-0.00000001'); assert.strictEqual(currency.satoshiToBTC(100000000), '1'); - assert.strictEqual(currency.satoshiToBTC(123456789123456789), '1234567891.2345678'); + assert.strictEqual(currency.satoshiToBTC(123456789123456789), '1234567891.2345678'); // eslint-disable-line no-loss-of-precision currency._setPreferredFiatCurrency(FiatUnit.JPY); currency._setExchangeRate('BTC_JPY', 1043740.8614); From e21f352733204d3b46286050046b7b3d3eba35b7 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Sat, 8 May 2021 13:33:09 +0100 Subject: [PATCH 014/327] OPS: up and lock android deps (closes #3050) --- android/build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 9b0285b12..c112a3741 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -4,10 +4,11 @@ buildscript { ext { minSdkVersion = 28 supportLibVersion = "28.0.0" - buildToolsVersion = "29.0.2" + buildToolsVersion = "29.0.3" compileSdkVersion = 29 targetSdkVersion = 29 - googlePlayServicesVersion = "16.+" + googlePlayServicesVersion = "16.2.0" + googlePlayServicesIidVersion = "16.0.1" firebaseVersion = "17.3.4" firebaseMessagingVersion = "20.2.1" } @@ -15,11 +16,11 @@ buildscript { google() jcenter() } - ext.kotlinVersion = '1.3.+' + ext.kotlinVersion = '1.4.32' dependencies { classpath('com.android.tools.build:gradle:4.0.1') classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" - classpath 'com.google.gms:google-services:4.3.3' // Google Services plugin + classpath 'com.google.gms:google-services:4.3.5' // Google Services plugin // NOTE: Do not place your application dependencies here; they belong @@ -53,7 +54,6 @@ subprojects { if (project.hasProperty("android")) { android { compileSdkVersion 29 - buildToolsVersion '28.0.0' } } } From 0475646b2499e768b03376c882b29c63b687edae Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 8 May 2021 14:36:10 +0000 Subject: [PATCH 015/327] Translate /loc/en.json in ar review completed for the source file '/loc/en.json' on the 'ar' language. --- loc/ar.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/loc/ar.json b/loc/ar.json index 6b92ded76..4db86ee4f 100644 --- a/loc/ar.json +++ b/loc/ar.json @@ -16,7 +16,7 @@ "seed": "عبارة الاسترداد", "success": "نجاح", "wallet_key": "مفتاح المحفظة", - "invalid_animated_qr_code_fragment": "قطعة من رمز الـ QRcode المتحرك غير صحيحة، حاول مرة اخرى.", + "invalid_animated_qr_code_fragment" : "قطعة من رمز الـ QRcode المتحرك غير صحيحة، حاول مرة اخرى.", "file_saved": "تم حفظ الملف ({filePath}) في مجلد التنزيلات.", "discard_changes": "تجاهل التغييرات؟", "discard_changes_detail": "يوجد تغييرات غير محفوظة. هل أنت متأكد من الخروج من الشاشة وتجاهلها؟" @@ -304,7 +304,7 @@ "network_electrum": "خادم Electrum", "not_a_valid_uri": "معرِّف URI غير صالح", "notifications": "الإشعارات", - "open_link_in_explorer": "فتح الرابط في المتصفح", + "open_link_in_explorer" : "فتح الرابط في المتصفح", "password": "كلمه المرور", "password_explain": "أنشئ كلمة المرور التي ستستخدمها لفك تشفير وحدة التخزين", "passwords_do_not_match": "كلمتا المرور لا تتطابقان", @@ -316,12 +316,14 @@ "privacy_quickactions": "اختصارات المحفظة", "privacy_quickactions_explanation": "المس مع الاستمرار ايقونة تطبيق BlueWallet على شاشتك الرئيسية للمشاهدة عرض سريع لرصيد محفظتك.", "privacy_clipboard_explanation": "عرض اختصار إذا تم العثور على عنوان أو فاتورة في الحافظة الخاصة بك.", + "privacy_do_not_track": "عدم التتبع", + "privacy_do_not_track_explanation": "لن يتم إرسال بيانات معرفة اخطاء التطبيق وبعض التحليلات المجهولة الهوية إلى خدمة التحليلات.", "push_notifications": "الإشعارات الفورية", "retype_password": "إعادة إدخال كلمة المرور", "selfTest": "اختبار ذاتي", "save": "الحفظ", "saved": "تم الحفظ", - "success_transaction_broadcasted": "تمت بنجاح! لقد تم نشر معاملتك!", + "success_transaction_broadcasted" : "تمت بنجاح! لقد تم نشر معاملتك!", "total_balance": "الرصيد الاجمالي", "total_balance_explanation": "اعرض الرصيد الإجمالي لجميع محافظك على ويدجيت الشاشة الرئيسية الخاصة بك.", "widgets": "ويدجيت", From fbaf9aa85563ff62d8e8def6c5882b5913c49c09 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 8 May 2021 13:55:40 -0400 Subject: [PATCH 016/327] REF: Analytics Text --- ios/Podfile.lock | 8 ++++---- loc/en.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index fe40efee4..a3c363e67 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -287,7 +287,7 @@ PODS: - React - react-native-tor (0.1.7): - React - - react-native-webview (11.3.1): + - react-native-webview (11.4.0): - React-Core - react-native-widget-center (0.0.4): - React @@ -424,7 +424,7 @@ PODS: - Sentry (= 7.0.0) - RNShare (5.2.2): - React-Core - - RNSVG (12.1.0): + - RNSVG (12.1.1): - React - RNVectorIcons (7.1.0): - React @@ -745,7 +745,7 @@ SPEC CHECKSUMS: react-native-safe-area-context: e471852c5ed67eea4b10c5d9d43c1cebae3b231d react-native-tcp-socket: 96a4f104cdcc9c6621aafe92937f163d88447c5b react-native-tor: 4f389f5719dad633542b57ea32744e954730e7ef - react-native-webview: 30f048378c6cee522ed9bbbedbc34acb21e58188 + react-native-webview: fdd3c7c2ad173e8ca8c82729ed05f3fda2491a82 react-native-widget-center: 0f81d17beb163e7fb5848b06754d7d277fe7d99a React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336 React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b @@ -779,7 +779,7 @@ SPEC CHECKSUMS: RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 RNSentry: 1868bcfe8c69b2c3b2451439a38b3ebea0a7510f RNShare: 5cfe16bfd42cd2c4869a7692462181ac8cc15a6d - RNSVG: ce9d996113475209013317e48b05c21ee988d42e + RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 RNWatch: e4c5d19506c94506860032fb68aedd5991beb985 Sentry: 89d26e036063b9cb9caa59b6951dd2f8277aa13b diff --git a/loc/en.json b/loc/en.json index 02afea61f..431b48359 100644 --- a/loc/en.json +++ b/loc/en.json @@ -316,8 +316,8 @@ "privacy_quickactions": "Wallet Shortcuts", "privacy_quickactions_explanation": "Touch and hold the BlueWallet app icon on your Home Screen to quickly view your wallet’s balance.", "privacy_clipboard_explanation": "Provide shortcuts if an address or invoice is found in your clipboard.", - "privacy_do_not_track": "Do Not Track", - "privacy_do_not_track_explanation": "Some anonymized analytics and debug data won't be sent to analytics service.", + "privacy_do_not_track": "Disable Analytics", + "privacy_do_not_track_explanation": "Performance and reliability information will not be submitted for analysis.", "push_notifications": "Push Notifications", "retype_password": "Re-type password", "selfTest": "Self-Test", From 438413ce7dc567c9dfe137a64d46ffe6505f83b8 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 8 May 2021 20:37:26 +0000 Subject: [PATCH 017/327] Translate /loc/en.json in de_DE review completed for the source file '/loc/en.json' on the 'de_DE' language. --- loc/de_de.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/loc/de_de.json b/loc/de_de.json index 436f46b29..ca4d82134 100644 --- a/loc/de_de.json +++ b/loc/de_de.json @@ -316,6 +316,8 @@ "privacy_quickactions": "Walletverknüpfungen", "privacy_quickactions_explanation": "Halte auf dem Startbildschirm das BlueWallet App-Symbol gedrückt, um rasch deinen Saldo zu sehen.", "privacy_clipboard_explanation": "Nutzt Rechnungen und Adressen in der Zwischenablage zum Senden.", + "privacy_do_not_track": "Diagnosedaten ausschalten", + "privacy_do_not_track_explanation": "Leistungs- und Zuverlässigkeitsinformationen nicht zur Analyse einreichen.", "push_notifications": "Push-Meldungen", "retype_password": "Passwort wiederholen", "selfTest": "Selbsttest", From b6b82a773d4b4d58533ea2da64b7750666880a77 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 9 May 2021 03:51:44 +0000 Subject: [PATCH 018/327] fix: upgrade @react-native-async-storage/async-storage from 1.15.1 to 1.15.2 Snyk has created this PR to upgrade @react-native-async-storage/async-storage from 1.15.1 to 1.15.2. See this package in npm: https://www.npmjs.com/package/@react-native-async-storage/async-storage See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 10 +++------- package.json | 2 +- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff3e8ff13..2882b329a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3019,9 +3019,9 @@ } }, "@react-native-async-storage/async-storage": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.15.1.tgz", - "integrity": "sha512-rRQ3Zsz1DIzxVlRVsE4nRNLWyv4hXmt/Ecwan+ypKwp16+SUTsfdX7F/W0xu4FpUwQDFCjl7MAS9pKV2VEPwDg==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.15.2.tgz", + "integrity": "sha512-E1SajKtyeLwi6JVfMZQx+I01z3ZvA0/O2e09EVFzU75YK0696S5N2CqeKlxAZQFVSvzh+Jfq0q412Kdkuh+l6A==", "requires": { "deep-assign": "^3.0.0" } @@ -18715,10 +18715,6 @@ "object-assign": "^4.1.1" } }, - "scryptsy": { - "version": "file:https:/registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", - "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" - }, "secp256k1": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", diff --git a/package.json b/package.json index b361f18fd..64899089b 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ }, "dependencies": { "@babel/preset-env": "7.12.1", - "@react-native-async-storage/async-storage": "1.15.1", + "@react-native-async-storage/async-storage": "1.15.2", "@react-native-clipboard/clipboard": "1.7.0", "@react-native-community/blur": "3.6.0", "@react-native-community/masked-view": "0.1.10", From 1a6bd6f32813894b077fa9ddc6cdb7a3ee59a77e Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 9 May 2021 03:51:55 +0000 Subject: [PATCH 019/327] fix: upgrade @react-navigation/stack from 5.14.3 to 5.14.4 Snyk has created this PR to upgrade @react-navigation/stack from 5.14.3 to 5.14.4. See this package in npm: https://www.npmjs.com/package/@react-navigation/stack See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 10 +++------- package.json | 2 +- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff3e8ff13..28d04de92 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3492,9 +3492,9 @@ } }, "@react-navigation/stack": { - "version": "5.14.3", - "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-5.14.3.tgz", - "integrity": "sha512-7rHc13DHsYP7l7GcgBcLEyX2/IAuCcRZ1Iu3MtOZSayjvFXxBBYKFKw0OyY9NxOfZUdLl3Q3mLiUHVFZkHMcuA==", + "version": "5.14.4", + "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-5.14.4.tgz", + "integrity": "sha512-gQjWK8JHtVkD1p7wzjtSPuScJI0mSAk/N/gzgjQZo+rDUwgM8rOTDcVNRbtEOqCEgLQcZrZQHwhOjkrJirehjQ==", "requires": { "color": "^3.1.3", "react-native-iphone-x-helper": "^1.3.0" @@ -18715,10 +18715,6 @@ "object-assign": "^4.1.1" } }, - "scryptsy": { - "version": "file:https:/registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", - "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" - }, "secp256k1": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", diff --git a/package.json b/package.json index b361f18fd..236f4eb41 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "@react-native-community/push-notification-ios": "1.8.0", "@react-navigation/native": "5.9.4", "@react-navigation/drawer": "5.12.5", - "@react-navigation/stack": "5.14.3", + "@react-navigation/stack": "5.14.4", "@remobile/react-native-qrcode-local-image": "https://github.com/BlueWallet/react-native-qrcode-local-image", "@sentry/react-native": "2.5.0-beta.1", "aez": "1.0.1", From 05c222f2cbe291a7841c6143463b5a13ec9dcdfc Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Sun, 9 May 2021 13:08:53 +0300 Subject: [PATCH 020/327] REF: upgrade bech32, bip39 and crypto-js --- class/lnurl.js | 18 ++-- class/wallets/abstract-hd-electrum-wallet.js | 4 +- class/wallets/abstract-hd-wallet.js | 4 +- class/wallets/multisig-hd-wallet.js | 10 +- package-lock.json | 99 ++++++++++++-------- package.json | 10 +- screen/selftest.js | 2 +- 7 files changed, 89 insertions(+), 58 deletions(-) diff --git a/class/lnurl.js b/class/lnurl.js index 8a7a3922c..d69e1ec97 100644 --- a/class/lnurl.js +++ b/class/lnurl.js @@ -1,7 +1,6 @@ -import bech32 from 'bech32'; +import { bech32 } from 'bech32'; import bolt11 from 'bolt11'; const CryptoJS = require('crypto-js'); - const createHash = require('create-hash'); /** @@ -20,7 +19,7 @@ export default class Lnurl { } static findlnurl(bodyOfText) { - var res = /^(?:http.*[&?]lightning=|lightning:)?(lnurl1[02-9ac-hj-np-z]+)/.exec(bodyOfText.toLowerCase()); + const res = /^(?:http.*[&?]lightning=|lightning:)?(lnurl1[02-9ac-hj-np-z]+)/.exec(bodyOfText.toLowerCase()); if (res) { return res[1]; } @@ -97,7 +96,14 @@ export default class Lnurl { if (!this._lnurlPayServicePayload) throw new Error('this._lnurlPayServicePayload is not set'); if (!this._lnurlPayServicePayload.callback) throw new Error('this._lnurlPayServicePayload.callback is not set'); if (amountSat < this._lnurlPayServicePayload.min || amountSat > this._lnurlPayServicePayload.max) - throw new Error('amount is not right, ' + amountSat + ' should be between ' + this._lnurlPayServicePayload.min + ' and ' + this._lnurlPayServicePayload.max); + throw new Error( + 'amount is not right, ' + + amountSat + + ' should be between ' + + this._lnurlPayServicePayload.min + + ' and ' + + this._lnurlPayServicePayload.max, + ); const nonce = Math.floor(Math.random() * 2e16).toString(16); const separator = this._lnurlPayServicePayload.callback.indexOf('?') === -1 ? '?' : '&'; const urlToFetch = this._lnurlPayServicePayload.callback + separator + 'amount=' + Math.floor(amountSat * 1000) + '&nonce=' + nonce; @@ -131,8 +137,8 @@ export default class Lnurl { const data = reply; // parse metadata and extract things from it - var image; - var description; + let image; + let description; const kvs = JSON.parse(data.metadata); for (let i = 0; i < kvs.length; i++) { const [k, v] = kvs[i]; diff --git a/class/wallets/abstract-hd-electrum-wallet.js b/class/wallets/abstract-hd-electrum-wallet.js index bb9d42a34..c006bf8cf 100644 --- a/class/wallets/abstract-hd-electrum-wallet.js +++ b/class/wallets/abstract-hd-electrum-wallet.js @@ -1,4 +1,4 @@ -import bip39 from 'bip39'; +import * as bip39 from 'bip39'; import BigNumber from 'bignumber.js'; import b58 from 'bs58check'; @@ -1116,7 +1116,7 @@ export class AbstractHDElectrumWallet extends AbstractHDWallet { * @returns {string} Hex fingerprint */ static mnemonicToFingerprint(mnemonic) { - const seed = bip39.mnemonicToSeed(mnemonic); + const seed = bip39.mnemonicToSeedSync(mnemonic); return AbstractHDElectrumWallet.seedToFingerprint(seed); } diff --git a/class/wallets/abstract-hd-wallet.js b/class/wallets/abstract-hd-wallet.js index 085231e42..138606110 100644 --- a/class/wallets/abstract-hd-wallet.js +++ b/class/wallets/abstract-hd-wallet.js @@ -52,7 +52,7 @@ export class AbstractHDWallet extends LegacyWallet { */ _getSeed() { const mnemonic = this.secret; - return bip39.mnemonicToSeed(mnemonic); + return bip39.mnemonicToSeedSync(mnemonic); } setSecret(newSecret) { @@ -69,7 +69,7 @@ export class AbstractHDWallet extends LegacyWallet { } getMnemonicToSeedHex() { - return bip39.mnemonicToSeedHex(this.secret); + return bip39.mnemonicToSeedSync(this.secret).toString('hex'); } /** diff --git a/class/wallets/multisig-hd-wallet.js b/class/wallets/multisig-hd-wallet.js index bf337a444..b42a9a3b3 100644 --- a/class/wallets/multisig-hd-wallet.js +++ b/class/wallets/multisig-hd-wallet.js @@ -1,5 +1,5 @@ import { AbstractHDElectrumWallet } from './abstract-hd-electrum-wallet'; -import bip39 from 'bip39'; +import * as bip39 from 'bip39'; import b58 from 'bs58check'; import { decodeUR } from 'bc-ur'; const BlueElectrum = require('../../blue_modules/BlueElectrum'); @@ -298,7 +298,7 @@ export class MultisigHDWallet extends AbstractHDElectrumWallet { if (mnemonic.startsWith(ELECTRUM_SEED_PREFIX)) { seed = MultisigHDWallet.convertElectrumMnemonicToSeed(mnemonic); } else { - seed = bip39.mnemonicToSeed(mnemonic); + seed = bip39.mnemonicToSeedSync(mnemonic); } const root = bitcoin.bip32.fromSeed(seed); @@ -835,7 +835,7 @@ export class MultisigHDWallet extends AbstractHDElectrumWallet { // dont sign more than we need, otherwise there will be "Too many signatures" error continue; } - let seed = bip39.mnemonicToSeed(cosigner); + let seed = bip39.mnemonicToSeedSync(cosigner); if (cosigner.startsWith(ELECTRUM_SEED_PREFIX)) { seed = MultisigHDWallet.convertElectrumMnemonicToSeed(cosigner); } @@ -979,7 +979,7 @@ export class MultisigHDWallet extends AbstractHDElectrumWallet { for (const [cosignerIndex, cosigner] of this._cosigners.entries()) { if (!MultisigHDWallet.isXpubString(cosigner)) { // ok this is a mnemonic, lets try to sign - const seed = bip39.mnemonicToSeed(cosigner); + const seed = bip39.mnemonicToSeedSync(cosigner); const hdRoot = bitcoin.bip32.fromSeed(seed); try { psbt.signInputHD(cc, hdRoot); @@ -995,7 +995,7 @@ export class MultisigHDWallet extends AbstractHDElectrumWallet { // correctly points to `/internal/index`, so we extract pubkey from our stored mnemonics+path and // match it to the one provided in PSBT's input, and if we have a match - we are in luck! we can sign // with this private key. - const seed = bip39.mnemonicToSeed(cosigner); + const seed = bip39.mnemonicToSeedSync(cosigner); const root = HDNode.fromSeed(seed); const splt = derivation.path.split('/'); const internal = +splt[splt.length - 2]; diff --git a/package-lock.json b/package-lock.json index 21fd4cf8b..a2b9d5940 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4519,27 +4519,14 @@ } }, "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" } }, "assert-plus": { @@ -5277,9 +5264,9 @@ } }, "bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" }, "big-integer": { "version": "1.6.48", @@ -5339,15 +5326,21 @@ } }, "bip39": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.6.0.tgz", - "integrity": "sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", "requires": { + "@types/node": "11.11.6", "create-hash": "^1.1.0", "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1", - "safe-buffer": "^5.0.1", - "unorm": "^1.3.3" + "randombytes": "^2.0.1" + }, + "dependencies": { + "@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" + } } }, "bip66": { @@ -5383,6 +5376,13 @@ "typeforce": "^1.11.3", "varuint-bitcoin": "^1.0.4", "wif": "^2.0.1" + }, + "dependencies": { + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + } } }, "bitcoinjs-message": { @@ -5396,6 +5396,13 @@ "create-hash": "^1.1.2", "secp256k1": "^3.0.1", "varuint-bitcoin": "^1.0.1" + }, + "dependencies": { + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + } } }, "bl": { @@ -5464,6 +5471,11 @@ "secp256k1": "^3.4.0" }, "dependencies": { + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, "bitcoinjs-lib": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-3.3.2.tgz", @@ -6472,9 +6484,9 @@ } }, "crypto-js": { - "version": "3.1.9-1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", - "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=" + "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", @@ -7213,6 +7225,11 @@ "is-symbol": "^1.0.2" } }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -9798,6 +9815,15 @@ "is-extglob": "^2.1.1" } }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", @@ -18715,6 +18741,10 @@ "object-assign": "^4.1.1" } }, + "scryptsy": { + "version": "file:blue_modules/scryptsy", + "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" + }, "secp256k1": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", @@ -20084,11 +20114,6 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, - "unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index cbbf9921f..5d7c3e7d3 100644 --- a/package.json +++ b/package.json @@ -82,29 +82,29 @@ "@react-native-community/blur": "3.6.0", "@react-native-community/masked-view": "0.1.10", "@react-native-community/push-notification-ios": "1.8.0", - "@react-navigation/native": "5.9.4", "@react-navigation/drawer": "5.12.5", + "@react-navigation/native": "5.9.4", "@react-navigation/stack": "5.14.4", "@remobile/react-native-qrcode-local-image": "https://github.com/BlueWallet/react-native-qrcode-local-image", "@sentry/react-native": "2.5.0-beta.1", "aez": "1.0.1", "amplitude-js": "7.4.4", - "assert": "1.5.0", + "assert": "2.0.0", "base-x": "3.0.8", "bc-bech32": "file:blue_modules/bc-bech32", "bc-ur": "file:blue_modules/bc-ur", - "bech32": "1.1.4", + "bech32": "2.0.0", "bignumber.js": "9.0.1", "bip21": "2.0.3", "bip32": "2.0.6", - "bip39": "2.6.0", + "bip39": "3.0.4", "bitcoinjs-lib": "5.2.0", "bitcoinjs-message": "2.2.0", "bolt11": "1.3.1", "buffer": "6.0.3", "buffer-reverse": "1.0.1", "coinselect": "3.1.12", - "crypto-js": "3.1.9-1", + "crypto-js": "4.0.0", "dayjs": "1.10.4", "detox": "18.12.0", "ecurve": "1.0.6", diff --git a/screen/selftest.js b/screen/selftest.js index 1432488d8..cb5edabd6 100644 --- a/screen/selftest.js +++ b/screen/selftest.js @@ -158,7 +158,7 @@ export default class Selftest extends Component { const bip39 = require('bip39'); const mnemonic = 'honey risk juice trip orient galaxy win situate shoot anchor bounce remind horse traffic exotic since escape mimic ramp skin judge owner topple erode'; - const seed = bip39.mnemonicToSeed(mnemonic); + const seed = bip39.mnemonicToSeedSync(mnemonic); const root = bitcoin.bip32.fromSeed(seed); const path = "m/49'/0'/0'/0/0"; From 54669ee686e304765577731e892120661a797429 Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Sun, 9 May 2021 17:21:51 +0300 Subject: [PATCH 021/327] TST: add more encryption tests --- tests/unit/encryption.test.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/unit/encryption.test.js b/tests/unit/encryption.test.js index 10c1ec9bb..bac202242 100644 --- a/tests/unit/encryption.test.js +++ b/tests/unit/encryption.test.js @@ -34,4 +34,12 @@ describe('unit - encryption', function () { ); assert.ok(!decrypted); }); + + it('can decrypt cipher created by CryptoJS@3.1.9-1', () => { + const data2decrypt = 'really long data string bla bla really long data string bla bla really long data string bla bla'; + const crypted = + 'U2FsdGVkX19fJ4PcLum+tmBpEVNgGGsGKOhRS21cEcYAox+Df8VqmnnG9t2PvpM05eWImCRArorVUUegtcfSq314WMFzxKmiPIl9eqV1aOY+VFGuIBx0VIVsCWix2Q7sRZZwnOVpG5bdveZI0+Azyw=='; + const decrypted = c.decrypt(crypted, 'password'); + assert.deepEqual(data2decrypt, decrypted); + }); }); From c922c0673b30c9528a30e84525a0fe0a1cf7cdc0 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sun, 9 May 2021 14:58:46 -0400 Subject: [PATCH 022/327] OPS: Version bump --- android/app/build.gradle | 2 +- ios/BlueWallet.xcodeproj/project.pbxproj | 72 ++++++++++++------------ package-lock.json | 2 +- package.json | 2 +- 4 files changed, 39 insertions(+), 39 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index e74b4cb29..afc83ee75 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -136,7 +136,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 - versionName "6.1.2" + versionName "6.1.3" multiDexEnabled true missingDimensionStrategy 'react-native-camera', 'general' testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index f6e42f7a3..950b84643 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -1628,7 +1628,7 @@ CODE_SIGN_ENTITLEMENTS = BlueWallet/BlueWallet.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; @@ -1649,7 +1649,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1678,7 +1678,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; @@ -1693,7 +1693,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1723,7 +1723,7 @@ CODE_SIGN_ENTITLEMENTS = "TodayExtension/BlueWallet - Bitcoin Price.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1734,7 +1734,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; @@ -1762,7 +1762,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1773,7 +1773,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; PRODUCT_NAME = "BlueWallet - Bitcoin Price"; @@ -1799,13 +1799,13 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; @@ -1830,13 +1830,13 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1861,7 +1861,7 @@ CODE_SIGN_ENTITLEMENTS = PriceWidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1872,7 +1872,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget; @@ -1903,7 +1903,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1914,7 +1914,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1943,7 +1943,7 @@ CODE_SIGN_ENTITLEMENTS = MarketWidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1954,7 +1954,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; @@ -1986,7 +1986,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1997,7 +1997,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2026,7 +2026,7 @@ CODE_SIGN_ENTITLEMENTS = MarketWidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2038,7 +2038,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget; @@ -2070,7 +2070,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2082,7 +2082,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2111,7 +2111,7 @@ CODE_SIGN_ENTITLEMENTS = WalletInformationWidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2122,7 +2122,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget; @@ -2153,7 +2153,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2164,7 +2164,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2296,7 +2296,7 @@ CODE_SIGN_ENTITLEMENTS = "BlueWalletWatch Extension/BlueWalletWatch Extension.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2306,7 +2306,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; @@ -2336,7 +2336,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2346,7 +2346,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -2376,13 +2376,13 @@ CODE_SIGN_ENTITLEMENTS = BlueWalletWatch/BlueWalletWatch.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; @@ -2415,13 +2415,13 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 310; + CURRENT_PROJECT_VERSION = 504; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.2; + MARKETING_VERSION = 6.1.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/package-lock.json b/package-lock.json index 21fd4cf8b..287a64d11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.2", + "version": "6.1.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index cbbf9921f..a96d03658 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.2", + "version": "6.1.3", "license": "MIT", "repository": { "type": "git", From 02b58621a8f32b03362794f6847ac372b20e1780 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Mon, 10 May 2021 03:51:06 +0000 Subject: [PATCH 023/327] fix: upgrade react-native-device-info from 8.1.0 to 8.1.2 Snyk has created this PR to upgrade react-native-device-info from 8.1.0 to 8.1.2. See this package in npm: https://www.npmjs.com/package/react-native-device-info See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 287a64d11..b56f2a254 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17528,9 +17528,9 @@ "integrity": "sha512-sQDYwGEdxwKwXKP/8Intc81FyH33Rv8ZvOxdmPX4NM75RAIVeBc13pdabEqycAimNZoY5IDvGp4o1cTTa5gNrA==" }, "react-native-device-info": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-8.1.0.tgz", - "integrity": "sha512-szEbRRFQ1NYPOjGWyIMsZGk5W2eU4JTiFLaNVXTbK4u/BS/Z5moVJKcoJgYR6Fxiu6qPAY/ofJySJoSdhSeOnw==" + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-8.1.2.tgz", + "integrity": "sha512-5jaQBL42H3g8+KXkFlIy2lMyKyPPETI8eUYgEg7JylW7rltkMPngn/wDnupgP4NhDYI+fBdMRGdRjEeetFr0IQ==" }, "react-native-document-picker": { "version": "git+https://github.com/BlueWallet/react-native-document-picker.git#3684d4fcc2bc0b47c32be39024e4796004c3e428", diff --git a/package.json b/package.json index a96d03658..fb2eb3e0a 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "react-native-camera": "3.43.5", "react-native-crypto": "2.2.0", "react-native-default-preference": "1.4.3", - "react-native-device-info": "8.1.0", + "react-native-device-info": "8.1.2", "react-native-document-picker": "https://github.com/BlueWallet/react-native-document-picker#3684d4fcc2bc0b47c32be39024e4796004c3e428", "react-native-elements": "2.3.2", "react-native-fingerprint-scanner": "https://github.com/BlueWallet/react-native-fingerprint-scanner#ce644673681716335d786727bab998f7e632ab5e", From 1aa4e6016f1a64b856ee2f946605948f5d15043d Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Mon, 10 May 2021 11:59:54 +0300 Subject: [PATCH 024/327] REF: upgrade react-native-reanimated to v2 --- .../java/io/bluewallet/bluewallet/MainApplication.java | 9 ++++++++- babel.config.js | 1 + ios/Podfile.lock | 4 ++-- package-lock.json | 6 +++--- package.json | 2 +- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/android/app/src/main/java/io/bluewallet/bluewallet/MainApplication.java b/android/app/src/main/java/io/bluewallet/bluewallet/MainApplication.java index 5d8770559..36d7e3c8c 100644 --- a/android/app/src/main/java/io/bluewallet/bluewallet/MainApplication.java +++ b/android/app/src/main/java/io/bluewallet/bluewallet/MainApplication.java @@ -7,7 +7,9 @@ import com.facebook.react.ReactApplication; import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.JSIModulePackage; // required by react-native-reanimated v2 https://docs.swmansion.com/react-native-reanimated/docs/installation/ import com.facebook.soloader.SoLoader; +import com.swmansion.reanimated.ReanimatedJSIModulePackage; // required by react-native-reanimated v2 https://docs.swmansion.com/react-native-reanimated/docs/installation/ import java.lang.reflect.InvocationTargetException; import com.facebook.react.modules.i18nmanager.I18nUtil; import java.util.List; @@ -34,6 +36,12 @@ public class MainApplication extends Application implements ReactApplication { protected String getJSMainModuleName() { return "index"; } + + // required by react-native-reanimated v2 https://docs.swmansion.com/react-native-reanimated/docs/installation/ + @Override + protected JSIModulePackage getJSIModulePackage() { + return new ReanimatedJSIModulePackage(); + } }; @Override @@ -81,4 +89,3 @@ public class MainApplication extends Application implements ReactApplication { } } } - \ No newline at end of file diff --git a/babel.config.js b/babel.config.js index f842b77fc..fff45f944 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,3 +1,4 @@ module.exports = { presets: ['module:metro-react-native-babel-preset'], + plugins: ['react-native-reanimated/plugin'], // required by react-native-reanimated v2 https://docs.swmansion.com/react-native-reanimated/docs/installation/ }; diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a3c363e67..e3fe51053 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -386,7 +386,7 @@ PODS: - React - RNReactNativeHapticFeedback (1.11.0): - React-Core - - RNReanimated (2.0.1): + - RNReanimated (2.1.0): - DoubleConversion - FBLazyVector - FBReactNativeSpec @@ -774,7 +774,7 @@ SPEC CHECKSUMS: RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93 RNRate: 2b31dad120cd1b78e33c6034808561c386a3dddf RNReactNativeHapticFeedback: 653a8c126a0f5e88ce15ffe280b3ff37e1fbb285 - RNReanimated: c5e9d841d33ed7f83861462756cec7146e73afaa + RNReanimated: 70f662b5232dd5d19ccff581e919a54ea73df51c RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 RNSentry: 1868bcfe8c69b2c3b2451439a38b3ebea0a7510f diff --git a/package-lock.json b/package-lock.json index e453d0020..48bcc4d0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17781,9 +17781,9 @@ } }, "react-native-reanimated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-2.0.1.tgz", - "integrity": "sha512-Wg/mEdI8xMRDQHYkgNGztJDjAcx1EFR5OMMtXrLSMmT0qzqcRWcVZgDHBN2MEAJqem/HkPAoOFutWzibwvinVg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-2.1.0.tgz", + "integrity": "sha512-tlPvvcdf+X7HGQ7g/7npBFhwMznfdk7MHUc9gUB/kp2abSscXNe/kOVKlrNEOO4DS11rNOXc+llFxVFMuNk0zA==", "requires": { "@babel/plugin-transform-object-assign": "^7.10.4", "fbjs": "^3.0.0", diff --git a/package.json b/package.json index 8c7e030ba..ca8a1289f 100644 --- a/package.json +++ b/package.json @@ -155,7 +155,7 @@ "react-native-quick-actions": "0.3.13", "react-native-randombytes": "3.6.0", "react-native-rate": "1.2.4", - "react-native-reanimated": "2.0.1", + "react-native-reanimated": "2.1.0", "react-native-safe-area-context": "3.2.0", "react-native-screens": "2.18.1", "react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#4828fd1a67d12e4c0e21eee0bee673fde75e6f9a", From b08bb1fe33b167b061a85ce4e5a36e8b107220d1 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Mon, 10 May 2021 16:01:28 +0100 Subject: [PATCH 025/327] REF: smarter utxo selection (closes #3085) --- class/wallets/legacy-wallet.js | 4 +-- tests/unit/hd-legacy-wallet.test.js | 4 +-- tests/unit/legacy-wallet.test.js | 41 +++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/class/wallets/legacy-wallet.js b/class/wallets/legacy-wallet.js index cb51e8b7c..83e2b9bd5 100644 --- a/class/wallets/legacy-wallet.js +++ b/class/wallets/legacy-wallet.js @@ -5,7 +5,7 @@ import { AbstractWallet } from './abstract-wallet'; import { HDSegwitBech32Wallet } from '..'; const bitcoin = require('bitcoinjs-lib'); const BlueElectrum = require('../../blue_modules/BlueElectrum'); -const coinSelectAccumulative = require('coinselect/accumulative'); +const coinSelect = require('coinselect'); const coinSelectSplit = require('coinselect/split'); /** @@ -337,7 +337,7 @@ export class LegacyWallet extends AbstractWallet { coinselect(utxos, targets, feeRate, changeAddress) { if (!changeAddress) throw new Error('No change address provided'); - let algo = coinSelectAccumulative; + let algo = coinSelect; // if targets has output without a value, we want send MAX to it if (targets.some(i => !('value' in i))) { algo = coinSelectSplit; diff --git a/tests/unit/hd-legacy-wallet.test.js b/tests/unit/hd-legacy-wallet.test.js index 63047c0d7..062e0d590 100644 --- a/tests/unit/hd-legacy-wallet.test.js +++ b/tests/unit/hd-legacy-wallet.test.js @@ -110,10 +110,10 @@ describe('Legacy HD (BIP44)', () => { hd._getInternalAddressByIndex(hd.next_free_change_address_index), ); let tx = bitcoin.Transaction.fromHex(txNew.tx.toHex()); - assert.strictEqual(tx.ins.length, 4); + assert.strictEqual(tx.ins.length, 3); assert.strictEqual(tx.outs.length, 2); assert.strictEqual(tx.outs[0].value, 80000); // payee - assert.strictEqual(tx.outs[1].value, 19330); // change + assert.strictEqual(tx.outs[1].value, 9478); // change let toAddress = bitcoin.address.fromOutputScript(tx.outs[0].script); const changeAddress = bitcoin.address.fromOutputScript(tx.outs[1].script); assert.strictEqual('3GcKN7q7gZuZ8eHygAhHrvPa5zZbG5Q1rK', toAddress); diff --git a/tests/unit/legacy-wallet.test.js b/tests/unit/legacy-wallet.test.js index faef25a3f..0ebd2578c 100644 --- a/tests/unit/legacy-wallet.test.js +++ b/tests/unit/legacy-wallet.test.js @@ -53,6 +53,47 @@ describe('Legacy wallet', () => { assert.strictEqual('bc1q3rl0mkyk0zrtxfmqn9wpcd3gnaz00yv9yp0hxe', bitcoin.address.fromOutputScript(tx.outs[1].script)); // to address }); + it('can create transaction with better UTXO selection', async () => { + const l = new LegacyWallet(); + l.setSecret('L4ccWrPMmFDZw4kzAKFqJNxgHANjdy6b7YKNXMwB4xac4FLF3Tov'); + + const utxos = [ + { + txid: 'cc44e933a094296d9fe424ad7306f16916253a3d154d52e4f1a757c18242cec4', + vout: 0, + value: 1000, + txhex: + '0200000000010161890cd52770c150da4d7d190920f43b9f88e7660c565a5a5ad141abb6de09de00000000000000008002a0860100000000001976a91426e01119d265aa980390c49eece923976c218f1588ac3e17000000000000160014c1af8c9dd85e0e55a532a952282604f820746fcd02473044022072b3f28808943c6aa588dd7a4e8f29fad7357a2814e05d6c5d767eb6b307b4e6022067bc6a8df2dbee43c87b8ce9ddd9fe678e00e0f7ae6690d5cb81eca6170c47e8012102e8fba5643e15ab70ec79528833a2c51338c1114c4eebc348a235b1a3e13ab07100000000', + }, + { + txid: 'cc44e933a094296d9fe424ad7306f16916253a3d154d52e4f1a757c18242cec4', + vout: 1, + value: 1000, + txhex: + '0200000000010161890cd52770c150da4d7d190920f43b9f88e7660c565a5a5ad141abb6de09de00000000000000008002a0860100000000001976a91426e01119d265aa980390c49eece923976c218f1588ac3e17000000000000160014c1af8c9dd85e0e55a532a952282604f820746fcd02473044022072b3f28808943c6aa588dd7a4e8f29fad7357a2814e05d6c5d767eb6b307b4e6022067bc6a8df2dbee43c87b8ce9ddd9fe678e00e0f7ae6690d5cb81eca6170c47e8012102e8fba5643e15ab70ec79528833a2c51338c1114c4eebc348a235b1a3e13ab07100000000', + }, + + { + txid: 'cc44e933a094296d9fe424ad7306f16916253a3d154d52e4f1a757c18242cec4', + vout: 2, + value: 69000000, + txhex: + '0200000000010161890cd52770c150da4d7d190920f43b9f88e7660c565a5a5ad141abb6de09de00000000000000008002a0860100000000001976a91426e01119d265aa980390c49eece923976c218f1588ac3e17000000000000160014c1af8c9dd85e0e55a532a952282604f820746fcd02473044022072b3f28808943c6aa588dd7a4e8f29fad7357a2814e05d6c5d767eb6b307b4e6022067bc6a8df2dbee43c87b8ce9ddd9fe678e00e0f7ae6690d5cb81eca6170c47e8012102e8fba5643e15ab70ec79528833a2c51338c1114c4eebc348a235b1a3e13ab07100000000', + }, + ]; + // ^^ only non-segwit inputs need full transaction txhex + + const { psbt } = l.createTransaction( + utxos, + [{ value: 60000000, address: '1GX36PGBUrF8XahZEGQqHqnJGW2vCZteoB' }], + 1, + l.getAddress(), + 0, + true, + ); + assert.strictEqual(psbt.data.inputs.length, 1); + }); + it("throws error if you can't create wallet from this entropy", async () => { const l = new LegacyWallet(); const zeroes = [...Array(32)].map(() => 0); From 8fa309ccb30b43c28cab17370b6d1f46fb8a7be3 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 22:08:57 +0000 Subject: [PATCH 026/327] Translate /loc/en.json in es_419 review completed for the source file '/loc/en.json' on the 'es_419' language. --- loc/es_419.json | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/loc/es_419.json b/loc/es_419.json index e1b6acaec..738b90bea 100644 --- a/loc/es_419.json +++ b/loc/es_419.json @@ -15,8 +15,8 @@ "save": "Guardar", "seed": "Semilla", "success": "Éxito", - "wallet_key": "Llave de billetera", - "invalid_animated_qr_code_fragment" : "Fragmento de Código QR invalido. Por favor intenta de nuevo", + "wallet_key": "Clave de la billetera", + "invalid_animated_qr_code_fragment" : "Fragmento inválido de Código QR animado. Por favor intenta de nuevo", "file_saved": "El archivo ({filePath}) se ha guardado en tu carpeta de Descargas.", "discard_changes": "¿Descartar cambios?", "discard_changes_detail": "Tienes cambios no guardados. ¿Estás seguro de descartarlos y salir de la pantalla?" @@ -67,8 +67,8 @@ "filter_currency": "Divisa", "filter_detail": "Detalle", "filter_filters": "Filtros", - "filter_iambuying": "Estoy comprando Bitcoin", - "filter_iamselling": "Estoy vendiendo Bitcoin", + "filter_iambuying": "Estoy comprando bitcoin", + "filter_iamselling": "Estoy vendiendo bitcoin", "filter_method": "Método de pago", "filter_search": "Buscar", "filter_selling": "Vendiendo", @@ -124,7 +124,7 @@ "create_fake_storage": "Crear almacenamiento cifrado", "create_password": "Crear una contraseña", "create_password_explanation": "La contraseña del almacenamiento falso no debe coincidir con la contraseña de tu almacenamiento principal.", - "help": "Bajo ciertas circunstancias, tu podrías verte obligado a revelar una contraseña. Para mantener tus monedas seguras, BlueWallet puede crear otro almacenamiento cifrado, con una contraseña diferente. Bajo presión puedes revelar esta contraseña a un tercero. Si se ingresa en BlueWallet, desbloqueará un nuevo almacenamiento \"falso\". Esto parecerá legítimo para un tercero, pero en secreto mantendrá tu almacenamiento principal con monedas seguras.", + "help": "Bajo ciertas circunstancias, podrías verte obligado a revelar una contraseña. Para mantener tus monedas seguras, BlueWallet puede crear otro almacenamiento cifrado, con una contraseña diferente. Bajo presión puedes revelar esta contraseña a un tercero. Si se ingresa en BlueWallet, desbloqueará un nuevo almacenamiento \"falso\". Esto parecerá legítimo para un tercero, pero en secreto mantendrá tu almacenamiento principal con monedas seguras.", "help2": "El nuevo almacén será completamente funcional, y puedes almacenar cantidades mínimas para que sea mas creíble.", "password_should_not_match": "La contraseña está actualmente en uso. Intenta con una contraseña diferente.", "passwords_do_not_match": "Las contraseñas no coinciden, intenta nuevamente", @@ -220,8 +220,8 @@ "psbt_this_is_psbt": "Esta es una Transacción Bitcoin Parcialmente Firmada (PSBT). Para finalizar por favor fírmala con tu hardware wallet.", "psbt_tx_export": "Exportar a archivo", "no_tx_signing_in_progress": "No hay ninguna transacción en curso.", - "psbt_tx_open": "Abir transaccion firmada", - "psbt_tx_scan": "Escanear transaccion firmada", + "psbt_tx_open": "Abrir transacción firmada", + "psbt_tx_scan": "Escanear transacción firmada", "qr_error_no_qrcode": "La imagen seleccionada no contiene un código QR.", "qr_error_no_wallet": "El archivo seleccionado no contiene una billetera que se pueda importar.", "success_done": "Hecho", @@ -252,7 +252,7 @@ "currency_source": "Precios obtenidos de", "default_desc": "Cuando está deshabilitado, BlueWallet abrirá inmediatamente la billetera seleccionada al inicio", "default_info": "Información por defecto", - "default_title": "En inicio", + "default_title": "Al inicio", "default_wallets": "Ver todas las Billeteras", "electrum_connected": "Conectado", "electrum_connected_not": "No Conectado", @@ -289,7 +289,7 @@ "general_adv_mode": "Modo Avanzado", "general_adv_mode_e": "Cuando esté habilitado, verás opciones avanzadas como diferentes tipos de billetera, la capacidad de especificar la instancia de LNDHub a la que deseas conectarte y la entropía personalizada durante la creación de la billetera.", "general_continuity": "Continuidad", - "general_continuity_e": "Cuando esté habilitado, podrá ver carteras seleccionadas y transacciones, utilizando sus otros dispositivos conectados a Apple iCloud.", + "general_continuity_e": "Cuando esté habilitado, podrás ver carteras seleccionadas y transacciones utilizando tus otros dispositivos conectados a Apple iCloud.", "groundcontrol_explanation": "GroundControl es un servidor de notificaciones push de código abierto gratuito para billeteras Bitcoin. Puedes instalar tu propio servidor GroundControl y poner tu URL aquí para no depender de la infraestructura de BlueWallet. Déjalo en blanco para usar el predeterminado.", "header": "Ajustes", "language": "Idioma", @@ -298,7 +298,7 @@ "lightning_saved": "Tus cambios han sido guardados correctamente.", "lightning_settings": "Configuración de Lightning", "tor_settings": "Configuración de Tor", - "lightning_settings_explain": "Para conectarse a tu propio nodo LND, instala LNDHub y pon su URL aquí en la configuración. Déjalo en blanco para usar LNDHub de BlueWallet (lndhub.io). Las carteras creadas después de guardar los cambios se conectarán al LNDHub especificado.", + "lightning_settings_explain": "Para conectarte a tu propio nodo LND, instala LNDHub y pon su URL aquí en la configuración. Déjalo en blanco para usar LNDHub de BlueWallet (lndhub.io). Las carteras creadas después de guardar los cambios se conectarán al LNDHub especificado.", "network": "Red", "network_broadcast": "Publicar transacción", "network_electrum": "Servidor Electrum", @@ -316,6 +316,8 @@ "privacy_quickactions": "Atajos de la Billetera", "privacy_quickactions_explanation": "Mantén presionado el ícono de la aplicación BlueWallet en tu pantalla de inicio para ver rápidamente el saldo de tu billetera.", "privacy_clipboard_explanation": "Proporciona atajos si encuentras una dirección o factura en tu portapapeles.", + "privacy_do_not_track": "Desactivar análisis", + "privacy_do_not_track_explanation": "La información de rendimiento y confiabilidad no se enviará para su análisis.", "push_notifications": "Notificaciones Push", "retype_password": "Ingresa la contraseña nuevamente", "selfTest": "Auto-Test", @@ -418,9 +420,9 @@ "enter_bip38_password": "Ingresa la contraseña para descifrar", "export_title": "Exportación de Billetera", "import_do_import": "Importar", - "import_error": "No se pudo importar. Asegúrese de que los datos proporcionados sean válidos.", + "import_error": "No se pudo importar. Asegúrate de que los datos proporcionados sean válidos.", "import_explanation": "Ingresa tus palabras iniciales, clave pública, WIF o cualquier cosa que tenga. BlueWallet hará todo lo posible para adivinar el formato correcto e importar tu billetera.", - "import_file": "Importar Frchivo", + "import_file": "Importar Archivo", "import_imported": "Importado", "import_placeholder_fail": "Importación de Billetera", "import_placeholder_inprogress": "Importando Billetera...", @@ -433,7 +435,7 @@ "list_empty_txs1": "Tus transacciones aparecerán aquí.", "list_empty_txs1_lightning": "La billetera Lightning debe usarse para tus transacciones diarias. Las tarifas son injustamente baratas y la velocidad es increíblemente rápida.", "list_empty_txs2": "Comienza con tu billetera.", - "list_empty_txs2_lightning": "\nPara comenzar a usarla, toca Administrar fondos y recarga tu saldo.", + "list_empty_txs2_lightning": "\nPara comenzar a usarla, toca Administrar Fondos y recarga tu saldo.", "list_header": "Una billetera representa un par de claves, una privada y otra que puede compartir para recibir monedas.", "list_import_error": "Se encontró un error al intentar importar esta billetera.", "list_import_problem": "Hubo un problema al importar esta billetera.", @@ -455,7 +457,7 @@ "select_no_bitcoin_exp": "Se requiere una billetera Bitcoin para recargar las billeteras Lightning. Por favor, crea o importa una.", "select_wallet": "Selecciona Billetera", "take_photo": "Tomar foto", - "xpub_copiedToClipboard": "Copiado a portapapeles.", + "xpub_copiedToClipboard": "Copiado al portapapeles.", "pull_to_refresh": "Tira para actualizar", "warning_do_not_disclose": "¡Advertencia! No revelar.", "add_ln_wallet_first": "Primero debes agregar una billetera Lightning.", @@ -517,7 +519,7 @@ "are_you_sure_seed_will_be_lost": "¿Estás segur@? Tu semilla mnemotécnica se perderá si no tienes una copia de seguridad.", "forget_this_seed": "Olvídate de esta semilla y usa XPUB en su lugar.", "invalid_fingerprint": "La huella dactilar de esta semilla no coincide con la huella dactilar de este cofirmante.", - "view_edit_cosigners": "Ver/Editar Cofirmantes", + "view_edit_cosigners": "Ver / Editar Cofirmantes", "this_cosigner_is_already_imported": "Este cofirmante ya está importado.", "export_signed_psbt": "Exportar PSBT firmado", "input_fp": "Ingresa huella digital", @@ -528,13 +530,13 @@ "ms_help_title": "Cómo funcionan las Bóvedas Multifirma: Consejos y Trucos", "ms_help_text": "Una billetera con varias llaves para mayor seguridad o custodia compartida", "ms_help_title1": "Se recomiendan varios dispositivos.", - "ms_help_1": "La Bóveda funcionará con la app BlueWallet instalada en otros dispositivos y carteras compatibles con PSBT, como Electrum, Spectre, Coldcard, Cobo Vault, etc.", + "ms_help_1": "La Bóveda funcionará con otras apps de BlueWallet instalada en otros dispositivos y billeteras compatibles con PSBT, como Electrum, Spectre, Coldcard, Cobo Vault, etc.", "ms_help_title2": "Editar Claves", "ms_help_2": "Puedes crear todas las claves de Bóveda en este dispositivo y eliminarlas o editarlas más tarde. Tener todas las claves en el mismo dispositivo tiene la seguridad equivalente a una billetera Bitcoin normal.", "ms_help_title3": "Copias de seguridad de la Bóveda", - "ms_help_3": "En las opciones de billetera, encontrarás la copia de seguridad de la Bóveda y la copia de seguridad de solo-ver. Esta copia de seguridad es como un mapa de tu billetera. Es esencial para la recuperación de la billetera en caso de que pierdas una de tus semillas.", + "ms_help_3": "En las opciones de la billetera, encontrarás la copia de seguridad de la Bóveda y la copia de seguridad de solo-ver. Esta copia de seguridad es como un mapa de tu billetera. Es esencial para la recuperación de la billetera en caso de que pierdas una de tus semillas.", "ms_help_title4": "Importando Bóvedas", - "ms_help_4": "Para importar una multifirma, usa tu archivo de respaldo y la función Importar. Si solo tienes semillas y XPUB, puedes usar el botón Importar individual al crear claves de la Bóveda.", + "ms_help_4": "Para importar una multifirma, usa tu archivo de respaldo y la función Importar. Si solo tienes semillas y XPUB, puedes utilizar el botón de importación individual al crear claves de Bóveda.", "ms_help_title5": "Modo Avanzado", "ms_help_5": "De forma predeterminada, BlueWallet generará una bóveda 2-de-3. Para crear un quórum diferente o cambiar el tipo de dirección, activa el Modo Avanzado en la Configuración." }, @@ -570,7 +572,7 @@ "sign_sign_submit": "Firma y envía", "sign_verify": "Verificar", "sign_signature_correct": "¡Verificación Exitosa!", - "sign_signature_incorrect": "¡Fallo en la Verificación!", + "sign_signature_incorrect": "¡Falló la Verificación!", "sign_placeholder_address": "Dirección", "sign_placeholder_message": "Mensaje", "sign_placeholder_signature": "Firma", From 89265cbff6607d4e27d9528f4154a46a57b5b77d Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 11 May 2021 03:51:22 +0000 Subject: [PATCH 027/327] feat: upgrade react-native-share from 5.2.2 to 6.0.0 Snyk has created this PR to upgrade react-native-share from 5.2.2 to 6.0.0. See this package in npm: https://www.npmjs.com/package/react-native-share See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 48bcc4d0a..a7ffef690 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17838,9 +17838,9 @@ "from": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#4828fd1a67d12e4c0e21eee0bee673fde75e6f9a" }, "react-native-share": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-5.2.2.tgz", - "integrity": "sha512-Jn92T+fXzq8ZIfiZllznFYrhDQoFUcMZ6vO0oXgQJYR5leVZuesqy8II3taWLtQzbAD5tl4Y+EaNYo7Z6TNGTw==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-6.0.0.tgz", + "integrity": "sha512-6mNDXKt5/d8pQbl56EmxzXSTsW4g/6zwXt8/YfzJL4WFx/Go5YEaKbb/PYyD2XLv2UU8CPEa2bHpnzwLmUnMDg==" }, "react-native-snap-carousel": { "version": "3.9.1", diff --git a/package.json b/package.json index ca8a1289f..340b8092f 100644 --- a/package.json +++ b/package.json @@ -159,7 +159,7 @@ "react-native-safe-area-context": "3.2.0", "react-native-screens": "2.18.1", "react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#4828fd1a67d12e4c0e21eee0bee673fde75e6f9a", - "react-native-share": "5.2.2", + "react-native-share": "6.0.0", "react-native-snap-carousel": "3.9.1", "react-native-sortable-list": "0.0.24", "react-native-svg": "12.1.1", From 35be8e4a9b1f16743357527f767de82a18311d96 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 11 May 2021 03:51:26 +0000 Subject: [PATCH 028/327] fix: upgrade react-native-camera from 3.43.5 to 3.43.6 Snyk has created this PR to upgrade react-native-camera from 3.43.5 to 3.43.6. See this package in npm: https://www.npmjs.com/package/react-native-camera See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 48bcc4d0a..70dda9a73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17514,9 +17514,9 @@ "from": "git+https://github.com/BlueWallet/react-native-blue-crypto.git" }, "react-native-camera": { - "version": "3.43.5", - "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.43.5.tgz", - "integrity": "sha512-5eyF5/Whpuf6BJvGDX261ynTYc/uxzPKl/JHdV1Ztx3WX3gBMF3nlOs9H9mB7QcRiPSUgtRfgFV4LDUBJ0XOIw==", + "version": "3.43.6", + "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.43.6.tgz", + "integrity": "sha512-O6BDl0Rzsmbh4LF/4GqokIA6Q1tyhx0IlZuQ5wVKnKsGgZp/JAxF9W/2dsPjd5KyL8TgXEgpK0mqOjxd9lP5iw==", "requires": { "prop-types": "^15.6.2" } diff --git a/package.json b/package.json index ca8a1289f..567fe9bb7 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "react-localization": "1.0.16", "react-native": "0.63.4", "react-native-blue-crypto": "https://github.com/BlueWallet/react-native-blue-crypto", - "react-native-camera": "3.43.5", + "react-native-camera": "3.43.6", "react-native-crypto": "2.2.0", "react-native-default-preference": "1.4.3", "react-native-device-info": "8.1.2", From 2b5e947935ff64c4addee6e18547fb9b72bfa826 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Tue, 11 May 2021 00:10:11 -0400 Subject: [PATCH 029/327] FIX: widgets shows wrong price in RUB currency --- ios/Podfile.lock | 8 ++++---- .../Widgets/Shared/Fiat/FiatUnits.plist | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index e3fe51053..bc7f70041 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -356,7 +356,7 @@ PODS: - React - RemobileReactNativeQrcodeLocalImage (1.0.4): - React - - RNCAsyncStorage (1.15.1): + - RNCAsyncStorage (1.15.2): - React-Core - RNCClipboard (1.7.0): - React-Core @@ -366,7 +366,7 @@ PODS: - React-Core - RNDefaultPreference (1.4.3): - React - - RNDeviceInfo (8.1.0): + - RNDeviceInfo (8.1.2): - React-Core - RNFS (2.16.6): - React @@ -759,12 +759,12 @@ SPEC CHECKSUMS: ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b RealmJS: 5195064e9aeccf94ae3756bd9d0f2301b9074b07 RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa - RNCAsyncStorage: 11080f1edfb382991959746b580a2dae29e75da0 + RNCAsyncStorage: 502fbf425b9ee2d73ca6fa4b299dce0be411b422 RNCClipboard: dac13db8b1ce9b998f1cbc7ca33440113602847f RNCMaskedView: f5c7d14d6847b7b44853f7acb6284c1da30a3459 RNCPushNotificationIOS: 5b1cf9ad2aaa107ecb92d5d2d7005ba521b2b97a RNDefaultPreference: 21816c0a6f61a2829ccc0cef034392e9b509ee5f - RNDeviceInfo: 77944ee74f4464aa4672b62e3239e4fa69ab534f + RNDeviceInfo: 4f480456c7ac8c9919448375399c1a6f14479549 RNFS: 2bd9eb49dc82fa9676382f0585b992c424cd59df RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211 RNHandoff: d3b0754cca3a6bcd9b25f544f733f7f033ccf5fa diff --git a/ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnits.plist b/ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnits.plist index b886be9be..ab660c082 100644 --- a/ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnits.plist +++ b/ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnits.plist @@ -212,7 +212,7 @@ source CoinDesk - + endPointKey LBP symbol @@ -300,7 +300,7 @@ locale ru-RU source - BitcoinduLiban + CoinDesk endPointKey @@ -372,7 +372,7 @@ source CoinDesk - + endPointKey UYU symbol From 1db6dfd33fd06be11a0e10a56aa3a769577f0ac2 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Tue, 11 May 2021 11:18:24 +0100 Subject: [PATCH 030/327] TST: fix e2e --- tests/e2e/bluewallet.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e/bluewallet.spec.js b/tests/e2e/bluewallet.spec.js index af01b78ab..c0ce2bbbf 100644 --- a/tests/e2e/bluewallet.spec.js +++ b/tests/e2e/bluewallet.spec.js @@ -528,7 +528,7 @@ describe('BlueWallet UI Tests', () => { await yo('TransactionValue'); expect(element(by.id('TransactionValue'))).toHaveText('0.0001'); const transactionFee = await extractTextFromElementById('TransactionFee'); - assert.ok(transactionFee.startsWith('Fee: 0.00000748 BTC'), 'Unexpected tx fee: ' + transactionFee); + assert.ok(transactionFee.startsWith('Fee: 0.00000452 BTC'), 'Unexpected tx fee: ' + transactionFee); await element(by.id('TransactionDetailsButton')).tap(); let txhex = await extractTextFromElementById('TxhexInput'); @@ -540,7 +540,7 @@ describe('BlueWallet UI Tests', () => { assert.strictEqual(transaction.outs[0].value, 10000); // checking fee rate: - const totalIns = 100000 + 5526; // we hardcode it since we know it in advance + const totalIns = 100000; // we hardcode it since we know it in advance const totalOuts = transaction.outs.map(el => el.value).reduce((a, b) => a + b, 0); assert.strictEqual(Math.round((totalIns - totalOuts) / (txhex.length / 2)), feeRate); assert.strictEqual(transactionFee.split(' ')[1] * 100000000, totalIns - totalOuts); From 8dd1bb85c92ba89ac20bddd1fcf8620f06e0063d Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 11 May 2021 21:22:25 +0000 Subject: [PATCH 031/327] Translate /loc/en.json in pt_BR review completed for the source file '/loc/en.json' on the 'pt_BR' language. --- loc/pt_br.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/loc/pt_br.json b/loc/pt_br.json index 759c66236..1805109c6 100644 --- a/loc/pt_br.json +++ b/loc/pt_br.json @@ -316,6 +316,8 @@ "privacy_quickactions": "Atalhos da carteira", "privacy_quickactions_explanation": "Toque e segure o ícone do aplicativo BlueWallet em sua tela inicial para visualizar rapidamente o saldo de sua carteira.", "privacy_clipboard_explanation": "Fornece atalhos se endereços ou faturas são encontrados na área de transferência.", + "privacy_do_not_track": "Desativar analítica", + "privacy_do_not_track_explanation": "Informações de desempenho não serão enviadas para análise.", "push_notifications": "Notificações push", "retype_password": "Inserir senha novamente", "selfTest": "Autoteste", @@ -579,7 +581,7 @@ "address_balance": "Saldo: {balance} sats", "addresses_title": "Endereços", "type_change": "Troco", - "type_receive": "Recebimento" + "type_receive": "Receber" }, "aopp": { "title": "Selecionar endereço", From 06f0b434aa6a56a37c3e3f73f99370b6a9aa37ae Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 12 May 2021 03:51:04 +0000 Subject: [PATCH 032/327] fix: upgrade react-native-webview from 11.4.0 to 11.4.2 Snyk has created this PR to upgrade react-native-webview from 11.4.0 to 11.4.2. See this package in npm: https://www.npmjs.com/package/react-native-webview See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index a7ffef690..2a660ad5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18074,9 +18074,9 @@ } }, "react-native-webview": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.4.0.tgz", - "integrity": "sha512-il4OOJxBJgFXk8rtVgYQJIGRqYD5wJXc4By6nvnkHlH3hbyw1Mx5HKfP9Qmsy8xdCwHYgCBjUuCfHoGXJ9hMSA==", + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.4.2.tgz", + "integrity": "sha512-reGWtlFCQCgZEROy0IJaI5iMhrhFzedNIFlj0d6eo0K6T91eeKaoDr24ebBvqmeemOCj0ZYtzX19qiInRznhLA==", "requires": { "escape-string-regexp": "2.0.0", "invariant": "2.2.4" diff --git a/package.json b/package.json index 340b8092f..ab51979ef 100644 --- a/package.json +++ b/package.json @@ -168,7 +168,7 @@ "react-native-tor": "0.1.7", "react-native-vector-icons": "7.1.0", "react-native-watch-connectivity": "1.0.3", - "react-native-webview": "11.4.0", + "react-native-webview": "11.4.2", "react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#e2e9a9038b76d096bf929a87105a97a0a7095001", "react-test-render": "1.1.2", "readable-stream": "3.6.0", From 3436d515f46b6e42ced437683eba3bd3e050419d Mon Sep 17 00:00:00 2001 From: Overtorment Date: Wed, 12 May 2021 13:49:04 +0100 Subject: [PATCH 033/327] OPS: expose DevSettingsActivity only in Debug build (closes #3076) --- android/app/src/debug/AndroidManifest.xml | 4 +++- android/app/src/main/AndroidManifest.xml | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index fa26aa56e..0c4927bcc 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -4,5 +4,7 @@ - + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 1f2c164b8..91cc9df31 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -93,7 +93,6 @@ /> - From e3b239ff8162429b224b370ab5c8418cb8d279f3 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Wed, 12 May 2021 19:39:51 +0100 Subject: [PATCH 034/327] TST: fix detox --- .../java/io/bluewallet/bluewallet/MainApplication.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/android/app/src/main/java/io/bluewallet/bluewallet/MainApplication.java b/android/app/src/main/java/io/bluewallet/bluewallet/MainApplication.java index 36d7e3c8c..792d8899d 100644 --- a/android/app/src/main/java/io/bluewallet/bluewallet/MainApplication.java +++ b/android/app/src/main/java/io/bluewallet/bluewallet/MainApplication.java @@ -7,9 +7,7 @@ import com.facebook.react.ReactApplication; import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; -import com.facebook.react.bridge.JSIModulePackage; // required by react-native-reanimated v2 https://docs.swmansion.com/react-native-reanimated/docs/installation/ import com.facebook.soloader.SoLoader; -import com.swmansion.reanimated.ReanimatedJSIModulePackage; // required by react-native-reanimated v2 https://docs.swmansion.com/react-native-reanimated/docs/installation/ import java.lang.reflect.InvocationTargetException; import com.facebook.react.modules.i18nmanager.I18nUtil; import java.util.List; @@ -36,12 +34,6 @@ public class MainApplication extends Application implements ReactApplication { protected String getJSMainModuleName() { return "index"; } - - // required by react-native-reanimated v2 https://docs.swmansion.com/react-native-reanimated/docs/installation/ - @Override - protected JSIModulePackage getJSIModulePackage() { - return new ReanimatedJSIModulePackage(); - } }; @Override From 666bdf9b5c95a0b1017df59c9d24d9a00a5b5ac5 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 12 May 2021 20:07:52 +0000 Subject: [PATCH 035/327] fix: upgrade @react-native-async-storage/async-storage from 1.15.2 to 1.15.3 Snyk has created this PR to upgrade @react-native-async-storage/async-storage from 1.15.2 to 1.15.3. See this package in npm: https://www.npmjs.com/package/@react-native-async-storage/async-storage See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2a660ad5e..571b230ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3019,9 +3019,9 @@ } }, "@react-native-async-storage/async-storage": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.15.2.tgz", - "integrity": "sha512-E1SajKtyeLwi6JVfMZQx+I01z3ZvA0/O2e09EVFzU75YK0696S5N2CqeKlxAZQFVSvzh+Jfq0q412Kdkuh+l6A==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.15.3.tgz", + "integrity": "sha512-dmkK6sNOKPGVDUuM2WvMXfkCEzG3/MZnv0mfixntpAip83d5YEi3gLkvPet2JLSWw3PstOqdklm6/MALNBbUGg==", "requires": { "deep-assign": "^3.0.0" } diff --git a/package.json b/package.json index ab51979ef..e18ed469b 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ }, "dependencies": { "@babel/preset-env": "7.12.1", - "@react-native-async-storage/async-storage": "1.15.2", + "@react-native-async-storage/async-storage": "1.15.3", "@react-native-clipboard/clipboard": "1.7.0", "@react-native-community/blur": "3.6.0", "@react-native-community/masked-view": "0.1.10", From 1f953db4828bf5fcaf81b9646fc8a2e85d975d4a Mon Sep 17 00:00:00 2001 From: Overtorment Date: Thu, 13 May 2021 10:35:26 +0100 Subject: [PATCH 036/327] TST: disable Tor test from runtime selftest screen --- screen/selftest.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/screen/selftest.js b/screen/selftest.js index cb5edabd6..da8b69643 100644 --- a/screen/selftest.js +++ b/screen/selftest.js @@ -17,7 +17,6 @@ const bitcoin = require('bitcoinjs-lib'); const BlueCrypto = require('react-native-blue-crypto'); const encryption = require('../blue_modules/encryption'); const BlueElectrum = require('../blue_modules/BlueElectrum'); -const torrific = require('../blue_modules/torrific'); const styles = StyleSheet.create({ center: { @@ -54,13 +53,6 @@ export default class Selftest extends Component { // - if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { - await torrific.testHttp(); - await torrific.testSocket(); - } else { - // skipping RN-specific test' - } - if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { await BlueElectrum.ping(); await BlueElectrum.waitTillConnected(); From 9961c17b6093ae5a5abb2896e84fa3a9f98c94f9 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 13 May 2021 10:19:37 +0000 Subject: [PATCH 037/327] Translate /loc/en.json in ar review completed for the source file '/loc/en.json' on the 'ar' language. --- loc/ar.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/loc/ar.json b/loc/ar.json index 4db86ee4f..d6ee6c632 100644 --- a/loc/ar.json +++ b/loc/ar.json @@ -316,8 +316,8 @@ "privacy_quickactions": "اختصارات المحفظة", "privacy_quickactions_explanation": "المس مع الاستمرار ايقونة تطبيق BlueWallet على شاشتك الرئيسية للمشاهدة عرض سريع لرصيد محفظتك.", "privacy_clipboard_explanation": "عرض اختصار إذا تم العثور على عنوان أو فاتورة في الحافظة الخاصة بك.", - "privacy_do_not_track": "عدم التتبع", - "privacy_do_not_track_explanation": "لن يتم إرسال بيانات معرفة اخطاء التطبيق وبعض التحليلات المجهولة الهوية إلى خدمة التحليلات.", + "privacy_do_not_track": "تعطيل التحليلات", + "privacy_do_not_track_explanation": "لن يتم إرسال التحليلات المتعلقة بأداء وقابلية تشغيل المحفظة إلينا.", "push_notifications": "الإشعارات الفورية", "retype_password": "إعادة إدخال كلمة المرور", "selfTest": "اختبار ذاتي", From e5689462816cf5fc5330070f30a2ecf02eca4361 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Thu, 13 May 2021 20:53:29 +0100 Subject: [PATCH 038/327] FIX: cobo vault watch-only occasionally gets imported as wrong wallet type (closes #3152) --- class/wallet-import.js | 18 +++++++++--------- tests/integration/import.test.js | 7 +++++++ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/class/wallet-import.js b/class/wallet-import.js index 7c9d81b1b..ea2125cd7 100644 --- a/class/wallet-import.js +++ b/class/wallet-import.js @@ -230,6 +230,15 @@ function WalletImport() { // if we're here - nope, its not a valid WIF + // maybe its a watch-only address? + const watchOnly = new WatchOnlyWallet(); + watchOnly.setSecret(importText); + if (watchOnly.valid()) { + await watchOnly.fetchBalance(); + return WalletImport._saveWallet(watchOnly, additionalProperties); + } + // nope, not watch-only + try { const hdElectrumSeedLegacy = new HDSegwitElectrumSeedP2WPKHWallet(); hdElectrumSeedLegacy.setSecret(importText); @@ -270,15 +279,6 @@ function WalletImport() { } } catch (_) {} - // not valid? maybe its a watch-only address? - - const watchOnly = new WatchOnlyWallet(); - watchOnly.setSecret(importText); - if (watchOnly.valid()) { - await watchOnly.fetchBalance(); - return WalletImport._saveWallet(watchOnly, additionalProperties); - } - // if it is multi-line string, then it is probably SLIP39 wallet // each line - one share if (importText.includes('\n')) { diff --git a/tests/integration/import.test.js b/tests/integration/import.test.js index b3e9283b4..ade2f6745 100644 --- a/tests/integration/import.test.js +++ b/tests/integration/import.test.js @@ -188,4 +188,11 @@ describe('import procedure', function () { ); assert.strictEqual(lastImportedWallet.type, SLIP39SegwitP2SHWallet.type); }); + + it('can import watch-only Cobo vault export', async () => { + await WalletImport.processImportText( + '{"ExtPubKey":"zpub6riZchHnrWzhhZ3Z4dhCJmesGyafMmZBRC9txhnidR313XJbcv4KiDubderKHhL7rMsqacYd82FQ38e4whgs8Dg7CpsxX3dSGWayXsEerF4","MasterFingerprint":"7D2F0272","AccountKeyPath":"84\'\\/0\'\\/0\'","CoboVaultFirmwareVersion":"2.6.1(BTC-Only)"}', + ); + assert.strictEqual(lastImportedWallet.type, WatchOnlyWallet.type); + }); }); From 095adaabe3f0ece9fdbdfff1eb8e5b7729c7ef25 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Thu, 13 May 2021 21:30:49 +0100 Subject: [PATCH 039/327] Update issue templates --- .github/ISSUE_TEMPLATE/custom.md | 10 ++++++++++ .github/ISSUE_TEMPLATE/general.md | 23 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/issue-template.md | 23 +++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/custom.md create mode 100644 .github/ISSUE_TEMPLATE/general.md create mode 100644 .github/ISSUE_TEMPLATE/issue-template.md diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md new file mode 100644 index 000000000..48d5f81fa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/custom.md @@ -0,0 +1,10 @@ +--- +name: Custom issue template +about: Describe this issue template's purpose here. +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/.github/ISSUE_TEMPLATE/general.md b/.github/ISSUE_TEMPLATE/general.md new file mode 100644 index 000000000..4d9cae395 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/general.md @@ -0,0 +1,23 @@ +--- +name: General +about: general issue template +title: '' +labels: '' +assignees: '' + +--- + +## Do you need support? Just email bluewallet@bluewallet.io + +## Are you reporting a bug? + +Please provide: + +* your phone model and OS version +* BlueWallet app version (settings->about->scroll down) +* self-test passes? Open settings->about->scroll down, tap "Run self-test" +* unique ID for our crash reporting service (settings->about->scroll down, tap "copy") + +## Proposing a feature? + +Go right ahead diff --git a/.github/ISSUE_TEMPLATE/issue-template.md b/.github/ISSUE_TEMPLATE/issue-template.md new file mode 100644 index 000000000..d89b00f94 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue-template.md @@ -0,0 +1,23 @@ +--- +name: Issue template +about: general issue template +title: '' +labels: '' +assignees: '' + +--- + +## Do you need support? Just email bluewallet@bluewallet.io + +## Are you reporting a bug? + +Please provide: + +* your phone model and OS version +* BlueWallet app version (settings->about->scroll down) +* self-test passes? Open settings->about->scroll down, tap "Run self-test" +* unique ID for our crash reporting service (settings->about->scroll down, tap "copy") + +## Proposing a feature? + +Go right ahead From a5b6e37e866593f4a62801c5f691ce4e3dd420fc Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 13 May 2021 20:32:42 +0000 Subject: [PATCH 040/327] fix: upgrade metro-react-native-babel-preset from 0.65.2 to 0.66.0 Snyk has created this PR to upgrade metro-react-native-babel-preset from 0.65.2 to 0.66.0. See this package in npm: https://www.npmjs.com/package/metro-react-native-babel-preset See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 571b230ad..6dead52a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15414,9 +15414,9 @@ } }, "metro-react-native-babel-preset": { - "version": "0.65.2", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.65.2.tgz", - "integrity": "sha512-jBpZwJwnGHXUnzoZl81LlUzvec2dh1llMJ2A7pbTMuCKhx4LjqOGEE1E+hkNqj/Uh7gi6tCPy5JYSCo9Ue/Vog==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.66.0.tgz", + "integrity": "sha512-rO3yayxplLNxFDc7HyMShN+psgEb2mbw15EMreNvgV8QnXNYHmgU6e15tLbtEvC8LuftOLuSufEdSmR/ykm+aA==", "requires": { "@babel/core": "^7.0.0", "@babel/plugin-proposal-class-properties": "^7.0.0", diff --git a/package.json b/package.json index e18ed469b..7a588da71 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "junderw-crc32c": "1.2.0", "lottie-ios": "3.1.9", "lottie-react-native": "4.0.2", - "metro-react-native-babel-preset": "0.65.2", + "metro-react-native-babel-preset": "0.66.0", "path-browserify": "1.0.1", "payjoin-client": "1.0.0", "pbkdf2": "3.1.1", From ca746d6cccc15a26930660e761cfb063118caef0 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Thu, 13 May 2021 21:33:23 +0100 Subject: [PATCH 041/327] Delete general.md --- .github/ISSUE_TEMPLATE/general.md | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/general.md diff --git a/.github/ISSUE_TEMPLATE/general.md b/.github/ISSUE_TEMPLATE/general.md deleted file mode 100644 index 4d9cae395..000000000 --- a/.github/ISSUE_TEMPLATE/general.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -name: General -about: general issue template -title: '' -labels: '' -assignees: '' - ---- - -## Do you need support? Just email bluewallet@bluewallet.io - -## Are you reporting a bug? - -Please provide: - -* your phone model and OS version -* BlueWallet app version (settings->about->scroll down) -* self-test passes? Open settings->about->scroll down, tap "Run self-test" -* unique ID for our crash reporting service (settings->about->scroll down, tap "copy") - -## Proposing a feature? - -Go right ahead From a83a989d9a696a29e7f7495b017d212924770bfc Mon Sep 17 00:00:00 2001 From: Overtorment Date: Thu, 13 May 2021 21:33:35 +0100 Subject: [PATCH 042/327] Delete custom.md --- .github/ISSUE_TEMPLATE/custom.md | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/custom.md diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md deleted file mode 100644 index 48d5f81fa..000000000 --- a/.github/ISSUE_TEMPLATE/custom.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Custom issue template -about: Describe this issue template's purpose here. -title: '' -labels: '' -assignees: '' - ---- - - From 7e1b1acef075361b4eef891b20ae7e6b7253f0d4 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 13 May 2021 20:51:40 +0000 Subject: [PATCH 043/327] Translate /loc/en.json in fa_IR review completed for the source file '/loc/en.json' on the 'fa_IR' language. --- loc/fa.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/loc/fa.json b/loc/fa.json index 56216474f..5f09fd40f 100644 --- a/loc/fa.json +++ b/loc/fa.json @@ -316,6 +316,8 @@ "privacy_quickactions": "میان‌برهای کیف پول", "privacy_quickactions_explanation": "آیکون برنامهٔ BlueWallet را در صفحهٔ اصلی لمس کرده و نگه دارید تا موجودی کیف پول خود را سریع مشاهده کنید.", "privacy_clipboard_explanation": "اگر آدرس یا صورت‌حسابی در کلیپ‌بورد شما پیدا شد، میان‌بر ارائه می‌دهد.", + "privacy_do_not_track": "غیرفعال‌کردن تحلیل", + "privacy_do_not_track_explanation": "اطلاعات کارایی و پایداری جهت تحلیل ارسال نخواهد شد.", "push_notifications": "پوش نوتیفیکیشن", "retype_password": "گذرواژه را دوباره بنویسید", "selfTest": "خودآزمایی", From b09bf7f7fde3dc20d8e4c888e100754f895f56b1 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Thu, 13 May 2021 17:47:42 -0400 Subject: [PATCH 044/327] REF: Rename widget file --- .../{WidgetCommunication.android.js => WidgetCommunication.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename blue_modules/{WidgetCommunication.android.js => WidgetCommunication.js} (100%) diff --git a/blue_modules/WidgetCommunication.android.js b/blue_modules/WidgetCommunication.js similarity index 100% rename from blue_modules/WidgetCommunication.android.js rename to blue_modules/WidgetCommunication.js From bd91e7df5927fd30f9c816812045a258eeef7fc0 Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Fri, 14 May 2021 19:07:33 +0300 Subject: [PATCH 045/327] ADD: add passphrase support to wallets --- class/wallets/abstract-hd-wallet.js | 15 +++-- .../hd-legacy-electrum-seed-p2pkh-wallet.js | 11 ++-- .../hd-segwit-electrum-seed-p2wpkh-wallet.js | 11 ++-- class/wallets/slip39-wallets.js | 2 +- ...-legacy-electrum-seed-p2pkh-wallet.test.js | 17 ++++++ tests/unit/hd-legacy-wallet.test.js | 23 +++++++- tests/unit/hd-segwit-bech32-wallet.test.js | 19 ++++++- ...segwit-electrum-seed-p2wpkh-wallet.test.js | 18 ++++++ tests/unit/hd-segwit-p2sh-wallet.test.js | 24 +++++++- tests/unit/slip39-wallets.test.js | 56 +++++++++++++++++++ 10 files changed, 174 insertions(+), 22 deletions(-) diff --git a/class/wallets/abstract-hd-wallet.js b/class/wallets/abstract-hd-wallet.js index 138606110..4c78df88c 100644 --- a/class/wallets/abstract-hd-wallet.js +++ b/class/wallets/abstract-hd-wallet.js @@ -52,7 +52,8 @@ export class AbstractHDWallet extends LegacyWallet { */ _getSeed() { const mnemonic = this.secret; - return bip39.mnemonicToSeedSync(mnemonic); + const passphrase = this.passphrase; + return bip39.mnemonicToSeedSync(mnemonic, passphrase); } setSecret(newSecret) { @@ -61,6 +62,14 @@ export class AbstractHDWallet extends LegacyWallet { return this; } + setPassphrase(passphrase) { + this.passphrase = passphrase; + } + + getPassphrase() { + return this.passphrase; + } + /** * @return {Boolean} is mnemonic in `this.secret` valid */ @@ -68,10 +77,6 @@ export class AbstractHDWallet extends LegacyWallet { return bip39.validateMnemonic(this.secret); } - getMnemonicToSeedHex() { - return bip39.mnemonicToSeedSync(this.secret).toString('hex'); - } - /** * Derives from hierarchy, returns next free address * (the one that has no transactions). Looks for several, diff --git a/class/wallets/hd-legacy-electrum-seed-p2pkh-wallet.js b/class/wallets/hd-legacy-electrum-seed-p2pkh-wallet.js index 6e10d686f..bc515e305 100644 --- a/class/wallets/hd-legacy-electrum-seed-p2pkh-wallet.js +++ b/class/wallets/hd-legacy-electrum-seed-p2pkh-wallet.js @@ -5,9 +5,6 @@ const mn = require('electrum-mnemonic'); const HDNode = require('bip32'); const PREFIX = mn.PREFIXES.standard; -const MNEMONIC_TO_SEED_OPTS = { - prefix: PREFIX, -}; /** * ElectrumSeed means that instead of BIP39 seed format it works with the format invented by Electrum wallet. Otherwise @@ -32,7 +29,9 @@ export class HDLegacyElectrumSeedP2PKHWallet extends HDLegacyP2PKHWallet { if (this._xpub) { return this._xpub; // cache hit } - const root = bitcoin.bip32.fromSeed(mn.mnemonicToSeedSync(this.secret, MNEMONIC_TO_SEED_OPTS)); + const args = { prefix: PREFIX }; + if (this.passphrase) args.passphrase = this.passphrase; + const root = bitcoin.bip32.fromSeed(mn.mnemonicToSeedSync(this.secret, args)); this._xpub = root.neutered().toBase58(); return this._xpub; } @@ -63,7 +62,9 @@ export class HDLegacyElectrumSeedP2PKHWallet extends HDLegacyP2PKHWallet { _getWIFByIndex(internal, index) { if (!this.secret) return false; - const root = bitcoin.bip32.fromSeed(mn.mnemonicToSeedSync(this.secret, MNEMONIC_TO_SEED_OPTS)); + const args = { prefix: PREFIX }; + if (this.passphrase) args.passphrase = this.passphrase; + const root = bitcoin.bip32.fromSeed(mn.mnemonicToSeedSync(this.secret, args)); const path = `m/${internal ? 1 : 0}/${index}`; const child = root.derivePath(path); diff --git a/class/wallets/hd-segwit-electrum-seed-p2wpkh-wallet.js b/class/wallets/hd-segwit-electrum-seed-p2wpkh-wallet.js index 0cd15e340..f3d36274c 100644 --- a/class/wallets/hd-segwit-electrum-seed-p2wpkh-wallet.js +++ b/class/wallets/hd-segwit-electrum-seed-p2wpkh-wallet.js @@ -6,9 +6,6 @@ const mn = require('electrum-mnemonic'); const HDNode = require('bip32'); const PREFIX = mn.PREFIXES.segwit; -const MNEMONIC_TO_SEED_OPTS = { - prefix: PREFIX, -}; /** * ElectrumSeed means that instead of BIP39 seed format it works with the format invented by Electrum wallet. Otherwise @@ -33,7 +30,9 @@ export class HDSegwitElectrumSeedP2WPKHWallet extends HDSegwitBech32Wallet { if (this._xpub) { return this._xpub; // cache hit } - const root = bitcoin.bip32.fromSeed(mn.mnemonicToSeedSync(this.secret, MNEMONIC_TO_SEED_OPTS)); + const args = { prefix: PREFIX }; + if (this.passphrase) args.passphrase = this.passphrase; + const root = bitcoin.bip32.fromSeed(mn.mnemonicToSeedSync(this.secret, args)); const xpub = root.derivePath("m/0'").neutered().toBase58(); // bitcoinjs does not support zpub yet, so we just convert it from xpub @@ -73,7 +72,9 @@ export class HDSegwitElectrumSeedP2WPKHWallet extends HDSegwitBech32Wallet { _getWIFByIndex(internal, index) { if (!this.secret) return false; - const root = bitcoin.bip32.fromSeed(mn.mnemonicToSeedSync(this.secret, MNEMONIC_TO_SEED_OPTS)); + const args = { prefix: PREFIX }; + if (this.passphrase) args.passphrase = this.passphrase; + const root = bitcoin.bip32.fromSeed(mn.mnemonicToSeedSync(this.secret, args)); const path = `m/0'/${internal ? 1 : 0}/${index}`; const child = root.derivePath(path); diff --git a/class/wallets/slip39-wallets.js b/class/wallets/slip39-wallets.js index ed7a891c0..6aadf9d38 100644 --- a/class/wallets/slip39-wallets.js +++ b/class/wallets/slip39-wallets.js @@ -8,7 +8,7 @@ import { HDSegwitBech32Wallet } from './hd-segwit-bech32-wallet'; // collection of SLIP39 functions const SLIP39Mixin = { _getSeed() { - const master = slip39.recoverSecret(this.secret); + const master = slip39.recoverSecret(this.secret, this.passphrase); return Buffer.from(master); }, diff --git a/tests/unit/hd-legacy-electrum-seed-p2pkh-wallet.test.js b/tests/unit/hd-legacy-electrum-seed-p2pkh-wallet.test.js index dd0dbb61f..b3b3e2d64 100644 --- a/tests/unit/hd-legacy-electrum-seed-p2pkh-wallet.test.js +++ b/tests/unit/hd-legacy-electrum-seed-p2pkh-wallet.test.js @@ -50,4 +50,21 @@ describe('HDLegacyElectrumSeedP2PKHWallet', () => { hd.setSecret('bs'); assert.ok(!hd.validateMnemonic()); }); + + it('can use mnemonic with passphrase', () => { + const mnemonic = 'receive happy wash prosper update pet neck acid try profit proud hungry '; + const passphrase = 'super secret passphrase'; + const hd = new HDLegacyElectrumSeedP2PKHWallet(); + hd.setSecret(mnemonic); + hd.setPassphrase(passphrase); + + assert.strictEqual( + hd.getXpub(), + 'xpub661MyMwAqRbcGSUBZaVtq8qEoRkJM1TZNNvUJEgQvtiZE73gS1wKWQoTj6R2E46UDYS2SBpmGGrSHGsJUNxtr1krixFuq8JA772pG43Mo6R', + ); + + assert.strictEqual(hd._getExternalAddressByIndex(0), '13sPvsrgRN8XibZNHtZXNqVDJPnNZLjTap'); + assert.strictEqual(hd._getInternalAddressByIndex(0), '16oEuy5H7ejmapqc2AtKAYerdfkDkoyrDX'); + assert.strictEqual(hd._getExternalWIFByIndex(0), 'Ky9WTDUTTZUKKYSPEE6uah2y5sJa89z6177kD23xh5cq1znX2HDj'); + }); }); diff --git a/tests/unit/hd-legacy-wallet.test.js b/tests/unit/hd-legacy-wallet.test.js index 062e0d590..289394bed 100644 --- a/tests/unit/hd-legacy-wallet.test.js +++ b/tests/unit/hd-legacy-wallet.test.js @@ -1,6 +1,7 @@ +import assert from 'assert'; +import * as bitcoin from 'bitcoinjs-lib'; + import { HDLegacyP2PKHWallet } from '../../class'; -const assert = require('assert'); -const bitcoin = require('bitcoinjs-lib'); describe('Legacy HD (BIP44)', () => { it('works', async () => { @@ -156,4 +157,22 @@ describe('Legacy HD (BIP44)', () => { hd.setSecret(mnemonic); assert.strictEqual(hd.getMasterFingerprintHex(), '73C5DA0A'); }); + + // from electrum tests https://github.com/spesmilo/electrum/blob/9c1a51547a301e765b9b0f9935c6d940bb9d658e/electrum/tests/test_wallet_vertical.py#L292 + it('can use mnemonic with passphrase', () => { + const mnemonic = 'treat dwarf wealth gasp brass outside high rent blood crowd make initial'; + const UNICODE_HORROR = '₿ 😀 😈 う けたま わる w͢͢͝h͡o͢͡ ̸͢k̵͟n̴͘ǫw̸̛s͘ ̀́w͘͢ḩ̵a҉̡͢t ̧̕h́o̵r͏̵rors̡ ̶͡͠lį̶e͟͟ ̶͝in͢ ͏t̕h̷̡͟e ͟͟d̛a͜r̕͡k̢̨ ͡h̴e͏a̷̢̡rt́͏ ̴̷͠ò̵̶f̸ u̧͘ní̛͜c͢͏o̷͏d̸͢e̡͝?͞'; + const hd = new HDLegacyP2PKHWallet(); + hd.setSecret(mnemonic); + hd.setPassphrase(UNICODE_HORROR); + + assert.strictEqual( + hd.getXpub(), + 'xpub6D85QDBajeLe2JXJrZeGyQCaw47PWKi3J9DPuHakjTkVBWCxVQQkmMVMSSfnw39tj9FntbozpRtb1AJ8ubjeVSBhyK4M5mzdvsXZzKPwodT', + ); + + assert.strictEqual(hd._getExternalAddressByIndex(0), '1F88g2naBMhDB7pYFttPWGQgryba3hPevM'); + assert.strictEqual(hd._getInternalAddressByIndex(0), '1H4QD1rg2zQJ4UjuAVJr5eW1fEM8WMqyxh'); + assert.strictEqual(hd._getExternalWIFByIndex(0), 'L3HLzdVcwo4711gFiZG4fiLzLVNJpR6nejfo6J85wuYn9YF2G5zk'); + }); }); diff --git a/tests/unit/hd-segwit-bech32-wallet.test.js b/tests/unit/hd-segwit-bech32-wallet.test.js index a0691b5c4..8e43567f7 100644 --- a/tests/unit/hd-segwit-bech32-wallet.test.js +++ b/tests/unit/hd-segwit-bech32-wallet.test.js @@ -1,5 +1,5 @@ +import assert from 'assert'; import { HDSegwitBech32Wallet } from '../../class'; -const assert = require('assert'); describe('Bech32 Segwit HD (BIP84)', () => { it('can create', async function () { @@ -163,4 +163,21 @@ describe('Bech32 Segwit HD (BIP84)', () => { true, ); }); + + it('can use mnemonic with passphrase', () => { + const mnemonic = 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about'; + const passphrase = 'super secret passphrase'; + const hd = new HDSegwitBech32Wallet(); + hd.setSecret(mnemonic); + hd.setPassphrase(passphrase); + + assert.strictEqual( + hd.getXpub(), + 'zpub6qNvUL1qNQwaReccveprgd4urE2EUvShpcFe7WB9tzf9L4NJNcWhPzJSk4fzNXqBNZdRr6135hBKaqqp5RVvyxZ6eMbZXL6u5iK4zrfkCaQ', + ); + + assert.strictEqual(hd._getExternalAddressByIndex(0), 'bc1qgaj3satczjem43pz46ct6r3758twhnny4y720z'); + assert.strictEqual(hd._getInternalAddressByIndex(0), 'bc1qthe7wh5eplzxczslvthyrer36ph3kxpnfnxgjg'); + assert.strictEqual(hd._getExternalWIFByIndex(0), 'L1tfV6fbRjDNwGQdJqHC9fneM9bTHigApnWgoKoU8JwgziwbbE7i'); + }); }); diff --git a/tests/unit/hd-segwit-electrum-seed-p2wpkh-wallet.test.js b/tests/unit/hd-segwit-electrum-seed-p2wpkh-wallet.test.js index 1629f55d4..95a056e11 100644 --- a/tests/unit/hd-segwit-electrum-seed-p2wpkh-wallet.test.js +++ b/tests/unit/hd-segwit-electrum-seed-p2wpkh-wallet.test.js @@ -48,4 +48,22 @@ describe('HDSegwitElectrumSeedP2WPKHWallet', () => { hd.setSecret('bs'); assert.ok(!hd.validateMnemonic()); }); + + // from electrum tests https://github.com/spesmilo/electrum/blob/9c1a51547a301e765b9b0f9935c6d940bb9d658e/electrum/tests/test_wallet_vertical.py#L130 + it('can use mnemonic with passphrase', () => { + const mnemonic = 'bitter grass shiver impose acquire brush forget axis eager alone wine silver'; + const UNICODE_HORROR = '₿ 😀 😈 う けたま わる w͢͢͝h͡o͢͡ ̸͢k̵͟n̴͘ǫw̸̛s͘ ̀́w͘͢ḩ̵a҉̡͢t ̧̕h́o̵r͏̵rors̡ ̶͡͠lį̶e͟͟ ̶͝in͢ ͏t̕h̷̡͟e ͟͟d̛a͜r̕͡k̢̨ ͡h̴e͏a̷̢̡rt́͏ ̴̷͠ò̵̶f̸ u̧͘ní̛͜c͢͏o̷͏d̸͢e̡͝?͞'; + const hd = new HDSegwitElectrumSeedP2WPKHWallet(); + hd.setSecret(mnemonic); + hd.setPassphrase(UNICODE_HORROR); + + assert.strictEqual( + hd.getXpub(), + 'zpub6nD7dvF6ArArjskKHZLmEL9ky8FqaSti1LN5maDWGwFrqwwGTp1b6ic4EHwciFNaYDmCXcQYxXSiF9BjcLCMPcaYkVN2nQD6QjYQ8vpSR3Z', + ); + + assert.strictEqual(hd._getExternalAddressByIndex(0), 'bc1qx94dutas7ysn2my645cyttujrms5d9p57f6aam'); + assert.strictEqual(hd._getInternalAddressByIndex(0), 'bc1qcywwsy87sdp8vz5rfjh3sxdv6rt95kujdqq38g'); + assert.strictEqual(hd._getExternalWIFByIndex(0), 'KyBagP6JHrNTGanqBSDVzKrsBTVbD9hhkTeVe1zEhewKeCU6wJb7'); + }); }); diff --git a/tests/unit/hd-segwit-p2sh-wallet.test.js b/tests/unit/hd-segwit-p2sh-wallet.test.js index 668683b01..ead0ea3bb 100644 --- a/tests/unit/hd-segwit-p2sh-wallet.test.js +++ b/tests/unit/hd-segwit-p2sh-wallet.test.js @@ -1,5 +1,6 @@ +import assert from 'assert'; + import { SegwitP2SHWallet, SegwitBech32Wallet, HDSegwitP2SHWallet, HDLegacyP2PKHWallet, LegacyWallet } from '../../class'; -const assert = require('assert'); describe('P2SH Segwit HD (BIP49)', () => { it('can create a wallet', async () => { @@ -106,7 +107,7 @@ describe('P2SH Segwit HD (BIP49)', () => { 'honey risk juice trip orient galaxy win situate shoot anchor bounce remind horse traffic exotic since escape mimic ramp skin judge owner topple erode'; let hd = new HDSegwitP2SHWallet(); hd.setSecret(mnemonic); - const seed1 = hd.getMnemonicToSeedHex(); + const seed1 = hd._getSeed().toString('hex'); assert.ok(hd.validateMnemonic()); mnemonic = 'hell'; @@ -120,7 +121,7 @@ describe('P2SH Segwit HD (BIP49)', () => { ' honey risk juice trip orient galaxy win !situate ;; shoot ;;; anchor Bounce remind\nhorse \n traffic exotic since escape mimic ramp skin judge owner topple erode '; hd = new HDSegwitP2SHWallet(); hd.setSecret(mnemonic); - const seed2 = hd.getMnemonicToSeedHex(); + const seed2 = hd._getSeed().toString('hex'); assert.strictEqual(seed1, seed2); assert.ok(hd.validateMnemonic()); }); @@ -189,4 +190,21 @@ describe('P2SH Segwit HD (BIP49)', () => { hd.setSecret(mnemonic); assert.strictEqual(hd.getMasterFingerprintHex(), '73C5DA0A'); }); + + it('can use mnemonic with passphrase', () => { + const mnemonic = 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about'; + const passphrase = 'super secret passphrase'; + const hd = new HDSegwitP2SHWallet(); + hd.setSecret(mnemonic); + hd.setPassphrase(passphrase); + + assert.strictEqual( + hd.getXpub(), + 'ypub6Xa3WiyXHriYt1fxZGWS8B1iduw92yxHCMWKSwJkW6w92FUCTJxwWQQHLXjRHBSsMLY6SvRu8ErqFEC3JmrkTHEm7KSUfbzhUhj7Yopo2JR', + ); + + assert.strictEqual(hd._getExternalAddressByIndex(0), '3BtnNenqpGTXwwjb5a1KgzzoKV4TjCuySm'); + assert.strictEqual(hd._getInternalAddressByIndex(0), '3EJctafkUBvcSHYhunQRa2iYUHjrMGLXBV'); + assert.strictEqual(hd._getExternalWIFByIndex(0), 'L489rJZvUMrFsNop9EyuG2XdEmyKNTbjC1DWkg9WGEc1ddK6jgDg'); + }); }); diff --git a/tests/unit/slip39-wallets.test.js b/tests/unit/slip39-wallets.test.js index 4c2546bdc..6fed0e10f 100644 --- a/tests/unit/slip39-wallets.test.js +++ b/tests/unit/slip39-wallets.test.js @@ -75,4 +75,60 @@ describe('SLIP39 wallets tests', () => { assert.strictEqual(w._getInternalAddressByIndex(0), 'bc1qgx35amln8aryyr0lw6j2729l3gemzjftp5xrne'); assert.strictEqual(w._getInternalAddressByIndex(1), 'bc1q48v0hcuz2jjsls628wj8jtn7rqp8wsyz2gxdxm'); }); + + // tests below are from https://github.com/spesmilo/electrum/pull/6917/files#diff-2940d8023ed102277f9c8b91135a9d6fa90fd2752b7b6147c1b5911f26db6d7fR497 + it('SLIP39LegacyP2PKHWallet can use passphrase', async () => { + const w = new SLIP39LegacyP2PKHWallet(); + w.setSecret( + 'extra extend academic bishop cricket bundle tofu goat apart victim enlarge program behavior permit course armed jerky faint language modern\n' + + 'extra extend academic acne away best indicate impact square oasis prospect painting voting guest either argue username racism enemy eclipse\n' + + 'extra extend academic arcade born dive legal hush gross briefing talent drug much home firefly toxic analysis idea umbrella slice', + ); + w.setPassphrase('TREZOR'); + + assert.strictEqual( + w.getXpub(), + 'xpub6CDgeTHt97zmW24XoYdjH9PVFMUj6qcYAe9SZXMKRKJbvTNeZhutNkQqajLyZrQ9DCqdnGenKhBD6UTrT1nHnoLCfFHkdeX8hDsZx1je6b2', + ); + + assert.strictEqual(w._getExternalAddressByIndex(0), '1NomKAUNnbASwbPuGHmkSVmnrJS5tZeVce'); + assert.strictEqual(w._getInternalAddressByIndex(0), '1Aw4wpXsAyEHSgMZqPdyewoAtJqH9Jaso3'); + assert.strictEqual(w._getExternalWIFByIndex(0), 'L55ZfXJgyXNPFrFtq2eqnwAkrjrarkKdmbkTEWxYXd2srXcfj3KF'); + }); + + it('SLIP39SegwitP2SHWallet can use passphrase', async () => { + const w = new SLIP39SegwitP2SHWallet(); + w.setSecret( + 'hobo romp academic axis august founder knife legal recover alien expect emphasis loan kitchen involve teacher capture rebuild trial numb spider forward ladle lying voter typical security quantity hawk legs idle leaves gasoline\n' + + 'hobo romp academic agency ancestor industry argue sister scene midst graduate profile numb paid headset airport daisy flame express scene usual welcome quick silent downtown oral critical step remove says rhythm venture aunt', + ); + w.setPassphrase('TREZOR'); + + assert.strictEqual( + w.getXpub(), + 'ypub6Y6aCjkcjCP2y7jZStTevc8Tj3GjoXncqC4ReMzdVZWScB68vKZSZBZ88ENvuPUXXBBR58JXkuz1UrwLnCFvnFTUEpzu5yQabeYBRyd7Edf', + ); + + assert.strictEqual(w._getExternalAddressByIndex(0), '3GCgNoWWVqVdhBxWxrnWQHgwLtffGSYn7D'); + assert.strictEqual(w._getInternalAddressByIndex(0), '3FVvdRhR7racZhmcvrGAqX9eJoP8Sw3ypp'); + }); + + it('SLIP39SegwitBech32Wallet can use passphrase', async () => { + const w = new SLIP39SegwitBech32Wallet(); + w.setSecret( + 'eraser senior beard romp adorn nuclear spill corner cradle style ancient family general leader ambition exchange unusual garlic promise voice\n' + + 'eraser senior ceramic snake clay various huge numb argue hesitate auction category timber browser greatest hanger petition script leaf pickup\n' + + 'eraser senior ceramic shaft dynamic become junior wrist silver peasant force math alto coal amazing segment yelp velvet image paces\n' + + 'eraser senior ceramic round column hawk trust auction smug shame alive greatest sheriff living perfect corner chest sled fumes adequate', + ); + w.setPassphrase('TREZOR'); + + assert.strictEqual( + w.getXpub(), + 'zpub6rs6bFckxdWVHBucVX129aNAYqiwPwh1HgsWt6HEQBa9F9QBKRcYzsw7WZR7rPSCWKmRVTUaEgrGrHStx2LSTpbgAEerbnrh4XxkRXbUUZF', + ); + + assert.strictEqual(w._getExternalAddressByIndex(0), 'bc1qaggygkqgqjjpt58zrmhvjz5m9dj8mjshw0lpgu'); + assert.strictEqual(w._getInternalAddressByIndex(0), 'bc1q8l6hcvlczu4mtjcnlwhczw7vdxnvwccpjl3cwz'); + }); }); From b02d7cd04b7209aff44d5ad1384b3db927586225 Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Fri, 14 May 2021 19:21:35 +0300 Subject: [PATCH 046/327] ADD: use passphrase to get wallet ID --- class/wallets/abstract-wallet.js | 4 +++- class/wallets/slip39-wallets.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/class/wallets/abstract-wallet.js b/class/wallets/abstract-wallet.js index c62d4e463..4a4f66158 100644 --- a/class/wallets/abstract-wallet.js +++ b/class/wallets/abstract-wallet.js @@ -45,7 +45,9 @@ export class AbstractWallet { } getID() { - return createHash('sha256').update(this.getSecret()).digest().toString('hex'); + const passphrase = this.getPassphrase ? this.getPassphrase() : ''; + const string2hash = this.getSecret() + passphrase; + return createHash('sha256').update(string2hash).digest().toString('hex'); } getTransactions() { diff --git a/class/wallets/slip39-wallets.js b/class/wallets/slip39-wallets.js index 6aadf9d38..044ab4dbd 100644 --- a/class/wallets/slip39-wallets.js +++ b/class/wallets/slip39-wallets.js @@ -39,7 +39,7 @@ const SLIP39Mixin = { }, getID() { - const string2hash = this.secret.sort().join(','); + const string2hash = this.secret.sort().join(',') + (this.getPassphrase() || ''); return createHash('sha256').update(string2hash).digest().toString('hex'); }, }; From d93d36713bfce67274a1c1ee8e9b402551d39c1a Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Fri, 14 May 2021 23:24:04 -0400 Subject: [PATCH 047/327] FIX: Applied xpub to wrong object --- WatchConnectivity.ios.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/WatchConnectivity.ios.js b/WatchConnectivity.ios.js index 5a21ad043..92db03e1a 100644 --- a/WatchConnectivity.ios.js +++ b/WatchConnectivity.ios.js @@ -69,11 +69,17 @@ function WatchConnectivity() { if (message.request === 'createInvoice') { handleLightningInvoiceCreateRequest(message.walletIndex, message.amount, message.description) .then(createInvoiceRequest => reply({ invoicePaymentRequest: createInvoiceRequest })) - .catch(e => console.log(e)); + .catch(e => { + console.log(e); + reply({}); + }); } else if (message.message === 'sendApplicationContext') { sendWalletsToWatch(); + reply({}); } else if (message.message === 'fetchTransactions') { - fetchWalletTransactions().then(() => saveToDisk()); + fetchWalletTransactions() + .then(() => saveToDisk()) + .finally(() => reply({})); } else if (message.message === 'hideBalance') { const walletIndex = message.walletIndex; const wallet = wallets[walletIndex]; @@ -207,7 +213,7 @@ function WatchConnectivity() { hideBalance: wallet.hideBalance, }; if (wallet.chain === Chain.ONCHAIN && wallet.type !== MultisigHDWallet.type) { - walletInformation.push({ xpub: wallet.getXpub() ? wallet.getXpub() : wallet.getSecret() }); + walletInformation.xpub = wallet.getXpub() ? wallet.getXpub() : wallet.getSecret(); } walletsToProcess.push(walletInformation); } From 46122d9c4d21b0b9eb4e4270dbd1c5b7a03e79b2 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 15 May 2021 00:44:58 -0400 Subject: [PATCH 048/327] Update WatchConnectivity.ios.js --- WatchConnectivity.ios.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WatchConnectivity.ios.js b/WatchConnectivity.ios.js index 92db03e1a..b603dcf7c 100644 --- a/WatchConnectivity.ios.js +++ b/WatchConnectivity.ios.js @@ -116,7 +116,7 @@ function WatchConnectivity() { if (!Array.isArray(wallets)) { console.log('No Wallets set to sync with Watch app. Exiting...'); return; - } else if (wallets.length === 0) { + } else if (walletsInitialized && wallets.length === 0) { console.log('Wallets array is set. No Wallets set to sync with Watch app. Exiting...'); updateApplicationContext({ wallets: [], randomID: Math.floor(Math.random() * 11) }); return; From 00ca48a147487f5f06a6d3d8cb2c394a2b350fff Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 15 May 2021 02:53:27 -0400 Subject: [PATCH 049/327] DEL: Remove tooltip as its not needed on multisig create screen. --- ios/Podfile.lock | 12 ++++---- screen/wallets/addMultisigStep2.js | 49 ++---------------------------- 2 files changed, 8 insertions(+), 53 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index bc7f70041..2b68abd61 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -287,7 +287,7 @@ PODS: - React - react-native-tor (0.1.7): - React - - react-native-webview (11.4.0): + - react-native-webview (11.4.2): - React-Core - react-native-widget-center (0.0.4): - React @@ -356,7 +356,7 @@ PODS: - React - RemobileReactNativeQrcodeLocalImage (1.0.4): - React - - RNCAsyncStorage (1.15.2): + - RNCAsyncStorage (1.15.3): - React-Core - RNCClipboard (1.7.0): - React-Core @@ -422,7 +422,7 @@ PODS: - RNSentry (2.5.0-beta.1): - React-Core - Sentry (= 7.0.0) - - RNShare (5.2.2): + - RNShare (6.0.0): - React-Core - RNSVG (12.1.1): - React @@ -745,7 +745,7 @@ SPEC CHECKSUMS: react-native-safe-area-context: e471852c5ed67eea4b10c5d9d43c1cebae3b231d react-native-tcp-socket: 96a4f104cdcc9c6621aafe92937f163d88447c5b react-native-tor: 4f389f5719dad633542b57ea32744e954730e7ef - react-native-webview: fdd3c7c2ad173e8ca8c82729ed05f3fda2491a82 + react-native-webview: 90ccc4add19f940dfe6c89d30659aed8134f234d react-native-widget-center: 0f81d17beb163e7fb5848b06754d7d277fe7d99a React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336 React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b @@ -759,7 +759,7 @@ SPEC CHECKSUMS: ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b RealmJS: 5195064e9aeccf94ae3756bd9d0f2301b9074b07 RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa - RNCAsyncStorage: 502fbf425b9ee2d73ca6fa4b299dce0be411b422 + RNCAsyncStorage: 68fabb4cccd2a736e5a5c9b91ca469125274cde9 RNCClipboard: dac13db8b1ce9b998f1cbc7ca33440113602847f RNCMaskedView: f5c7d14d6847b7b44853f7acb6284c1da30a3459 RNCPushNotificationIOS: 5b1cf9ad2aaa107ecb92d5d2d7005ba521b2b97a @@ -778,7 +778,7 @@ SPEC CHECKSUMS: RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 RNSentry: 1868bcfe8c69b2c3b2451439a38b3ebea0a7510f - RNShare: 5cfe16bfd42cd2c4869a7692462181ac8cc15a6d + RNShare: 31fa0cedbd06c2744a78e0d2b7ba364778aa3506 RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 RNWatch: e4c5d19506c94506860032fb68aedd5991beb985 diff --git a/screen/wallets/addMultisigStep2.js b/screen/wallets/addMultisigStep2.js index 3185c519a..9bc04d984 100644 --- a/screen/wallets/addMultisigStep2.js +++ b/screen/wallets/addMultisigStep2.js @@ -20,9 +20,6 @@ import { Icon } from 'react-native-elements'; import { useNavigation, useRoute, useTheme } from '@react-navigation/native'; import { getSystemName } from 'react-native-device-info'; import QRCode from 'react-native-qrcode-svg'; -import Clipboard from '@react-native-clipboard/clipboard'; -import showPopupMenu from 'react-native-popup-menu-android'; -import ToolTip from 'react-native-tooltip'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; import { @@ -67,7 +64,6 @@ const WalletsAddMultisigStep2 = () => { const [cosignerXpubFilename, setCosignerXpubFilename] = useState('bw-cosigner.json'); const [vaultKeyData, setVaultKeyData] = useState({ keyIndex: 1, xpub: '', seed: '', isLoading: false }); // string rendered in modal const [importText, setImportText] = useState(''); - const tooltip = useRef(); const openScannerButton = useRef(); const data = useRef(new Array(n)); const hasUnsavedChanges = Boolean(cosigners.length > 0 && cosigners.length !== n); @@ -518,32 +514,6 @@ const WalletsAddMultisigStep2 = () => { ); }; - const toolTipMenuOptions = () => { - return Platform.select({ - // NOT WORKING ATM. - // ios: [ - // { text: this.state.wallet.hideBalance ? loc.transactions.details_balance_show : loc.transactions.details_balance_hide, onPress: this.handleBalanceVisibility }, - // { text: loc.transactions.details_copy, onPress: this.handleCopyPress }, - // ], - android: { - id: 'copyXpub', - label: loc.transactions.details_copy, - }, - }); - }; - - const showAndroidTooltip = () => { - showPopupMenu(toolTipMenuOptions, handleToolTipSelection, vaultKeyData.xpub); - }; - - const handleToolTipSelection = () => { - handleCopyPress(); - }; - - const handleCopyPress = () => { - Clipboard.setString(vaultKeyData.xpub); - }; - const renderSecret = entries => { const component = []; const entriesObject = entries.entries(); @@ -558,24 +528,9 @@ const WalletsAddMultisigStep2 = () => { ); } else { component.push( - (Platform.OS === 'ios' ? tooltip.current.showMenu() : showAndroidTooltip())} - > - {Platform.OS === 'ios' && ( - handleCopyPress, - }, - ]} - /> - )} + {secret} - , + , ); } } From c24a477768b0abbd6a44d1bc0f0a6537e7961d68 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 15 May 2021 12:45:02 -0400 Subject: [PATCH 050/327] REF: Use DeviceQuickActions instead of QuickActions --- App.js | 3 +-- class/quick-actions.js | 6 ++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/App.js b/App.js index e7cb32709..c7b52b801 100644 --- a/App.js +++ b/App.js @@ -21,7 +21,6 @@ import * as NavigationService from './NavigationService'; import { BlueTextCentered, BlueButton, SecondButton } from './BlueComponents'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; import { Chain } from './models/bitcoinUnits'; -import QuickActions from 'react-native-quick-actions'; import * as Sentry from '@sentry/react-native'; import OnAppLaunch from './class/on-app-launch'; import DeeplinkSchemaMatch from './class/deeplink-schema-match'; @@ -125,7 +124,7 @@ const App = () => { Linking.addEventListener('url', handleOpenURL); AppState.addEventListener('change', handleAppStateChange); DeviceEventEmitter.addListener('quickActionShortcut', walletQuickActions); - QuickActions.popInitialAction().then(popInitialAction); + DeviceQuickActions.popInitialAction().then(popInitialAction); handleAppStateChange(undefined); /* When a notification on iOS is shown while the app is on foreground; diff --git a/class/quick-actions.js b/class/quick-actions.js index 5506d73cb..6ba96178a 100644 --- a/class/quick-actions.js +++ b/class/quick-actions.js @@ -34,6 +34,12 @@ function DeviceQuickActions() { }); }; + DeviceQuickActions.popInitialAction = async () => { + const data = await QuickActions.popInitialAction(); + return data; + }; + + DeviceQuickActions.getEnabled = async () => { try { const isEnabled = await AsyncStorage.getItem(DeviceQuickActions.STORAGE_KEY); From 91dc34171b7e6798e0a0a3040c5ae798d6a70087 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 15 May 2021 12:48:00 -0400 Subject: [PATCH 051/327] Update quick-actions.windows.js --- class/quick-actions.windows.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/class/quick-actions.windows.js b/class/quick-actions.windows.js index a56acf66b..842d0f50f 100644 --- a/class/quick-actions.windows.js +++ b/class/quick-actions.windows.js @@ -7,6 +7,8 @@ function DeviceQuickActions() { return false; }; + DeviceQuickActions.popInitialAction = () => {}; + return null; } From b09927855238fd8f3e608def854e5319f960ce18 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 16 May 2021 00:15:56 +0000 Subject: [PATCH 052/327] fix: upgrade react-native-image-picker from 3.3.2 to 3.3.4 Snyk has created this PR to upgrade react-native-image-picker from 3.3.2 to 3.3.4. See this package in npm: https://www.npmjs.com/package/react-native-image-picker See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6dead52a1..a53deb721 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17648,9 +17648,9 @@ "from": "git+https://github.com/BlueWallet/react-native-idle-timer.git#8587876d68ab5920e79619726aeca9e672beaf2b" }, "react-native-image-picker": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-3.3.2.tgz", - "integrity": "sha512-7z902J7a7j2rUM6zzyLSGpBSDfXy/V9ssSDKV0QyoQpr7COZs3zsJye2PU1Z4TRqmuNtREIeG5m1NdwtpcXBkg==" + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-3.3.4.tgz", + "integrity": "sha512-XKQ1xCEKL77foV0gi4Jyv0kqekE//DX7FhoYwOTLH4T44myVBQllrVGedBYMNBfjvRfeqFz4DQ6MgvGQUqaLbg==" }, "react-native-inappbrowser-reborn": { "version": "git+https://github.com/BlueWallet/react-native-inappbrowser.git#fa2d8e1763e46dd12a7e53081e97a0f908049103", diff --git a/package.json b/package.json index 7a588da71..e3616cbb9 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "react-native-handoff": "https://github.com/marcosrdz/react-native-handoff#f5becc63f3e36bf2da1ed1fc60fc690323e73602", "react-native-haptic-feedback": "1.11.0", "react-native-idle-timer": "https://github.com/BlueWallet/react-native-idle-timer#8587876d68ab5920e79619726aeca9e672beaf2b", - "react-native-image-picker": "3.3.2", + "react-native-image-picker": "3.3.4", "react-native-inappbrowser-reborn": "https://github.com/BlueWallet/react-native-inappbrowser#fa2d8e1763e46dd12a7e53081e97a0f908049103", "react-native-is-catalyst": "https://github.com/BlueWallet/react-native-is-catalyst#v1.0.0", "react-native-level-fs": "3.0.1", From 4c123446d491a7eef17a754bf9ad977954ee0533 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sun, 16 May 2021 13:47:04 -0400 Subject: [PATCH 053/327] FIX: Dont display Tor text in catalyst --- screen/settings/NetworkSettings.js | 3 ++- screen/settings/electrumSettings.js | 5 ++++- screen/settings/lightningSettings.js | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/screen/settings/NetworkSettings.js b/screen/settings/NetworkSettings.js index c023fc6da..37b2bbcae 100644 --- a/screen/settings/NetworkSettings.js +++ b/screen/settings/NetworkSettings.js @@ -5,6 +5,7 @@ import Notifications from '../../blue_modules/notifications'; import navigationStyle from '../../components/navigationStyle'; import { SafeBlueArea, BlueListItem } from '../../BlueComponents'; import loc from '../../loc'; +import { isCatalyst } from '../../blue_modules/environment'; const NetworkSettings = () => { const { navigate } = useNavigation(); @@ -34,7 +35,7 @@ const NetworkSettings = () => { chevron /> )} - + {!isCatalyst && } ); diff --git a/screen/settings/electrumSettings.js b/screen/settings/electrumSettings.js index 55b18da92..f1f03bc0a 100644 --- a/screen/settings/electrumSettings.js +++ b/screen/settings/electrumSettings.js @@ -33,6 +33,7 @@ import { BlueDismissKeyboardInputAccessory, } from '../../BlueComponents'; import { BlueCurrentTheme } from '../../components/themes'; +import { isCatalyst } from '../../blue_modules/environment'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; const BlueElectrum = require('../../blue_modules/BlueElectrum'); @@ -267,7 +268,9 @@ export default class ElectrumSettings extends Component { this.setState({ host: text.trim() })} diff --git a/screen/settings/lightningSettings.js b/screen/settings/lightningSettings.js index 7c74be4d1..7b6de8ba2 100644 --- a/screen/settings/lightningSettings.js +++ b/screen/settings/lightningSettings.js @@ -12,6 +12,7 @@ import { LightningCustodianWallet } from '../../class/wallets/lightning-custodia import loc from '../../loc'; import { BlueCurrentTheme } from '../../components/themes'; import DeeplinkSchemaMatch from '../../class/deeplink-schema-match'; +import { isCatalyst } from '../../blue_modules/environment'; const styles = StyleSheet.create({ uri: { @@ -147,7 +148,7 @@ const LightningSettings = () => { /> - {loc.settings.tor_supported} + {!isCatalyst && {loc.settings.tor_supported}} From 96b82acc9d6f4de895cb1b3f92a446df6e1d26c5 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Mon, 17 May 2021 00:53:38 +0000 Subject: [PATCH 054/327] fix: upgrade @react-native-async-storage/async-storage from 1.15.3 to 1.15.4 Snyk has created this PR to upgrade @react-native-async-storage/async-storage from 1.15.3 to 1.15.4. See this package in npm: https://www.npmjs.com/package/@react-native-async-storage/async-storage See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index a53deb721..2a3751c73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3019,9 +3019,9 @@ } }, "@react-native-async-storage/async-storage": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.15.3.tgz", - "integrity": "sha512-dmkK6sNOKPGVDUuM2WvMXfkCEzG3/MZnv0mfixntpAip83d5YEi3gLkvPet2JLSWw3PstOqdklm6/MALNBbUGg==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.15.4.tgz", + "integrity": "sha512-pC0MS6UBuv/YiVAxtzi7CgUed8oCQNYMtGt0yb/I9fI/BWTiJK5cj4YtW2XtL95K5IuvPX/6uGWaouZ8KqXwdg==", "requires": { "deep-assign": "^3.0.0" } diff --git a/package.json b/package.json index e3616cbb9..c4b42deed 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ }, "dependencies": { "@babel/preset-env": "7.12.1", - "@react-native-async-storage/async-storage": "1.15.3", + "@react-native-async-storage/async-storage": "1.15.4", "@react-native-clipboard/clipboard": "1.7.0", "@react-native-community/blur": "3.6.0", "@react-native-community/masked-view": "0.1.10", From 41d5239783789f69cd67cf5b20fd6ef0b7ccd2d0 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Mon, 17 May 2021 22:17:00 -0400 Subject: [PATCH 055/327] ADD: Add close to modals #2584 --- components/BottomModal.js | 31 ++++++++++++++++++++++++++----- ios/Podfile.lock | 20 ++++++++++---------- screen/wallets/addMultisig.js | 2 +- 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/components/BottomModal.js b/components/BottomModal.js index f73bcd165..960f77470 100644 --- a/components/BottomModal.js +++ b/components/BottomModal.js @@ -1,21 +1,33 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { StyleSheet, useWindowDimensions } from 'react-native'; +import { StyleSheet, Platform, useWindowDimensions, View } from 'react-native'; import Modal from 'react-native-modal'; +import { BlueButton, BlueSpacing40 } from '../BlueComponents'; +import loc from '../loc'; +import { useTheme } from '@react-navigation/native'; const styles = StyleSheet.create({ root: { justifyContent: 'flex-end', margin: 0, }, + hasDoneButton: { + padding: 16, + paddingBottom: 24, + }, }); -const BottomModal = ({ onBackButtonPress, onBackdropPress, onClose, windowHeight, windowWidth, ...props }) => { +const BottomModal = ({ onBackButtonPress, onBackdropPress, onClose, windowHeight, windowWidth, doneButton, ...props }) => { const valueWindowHeight = useWindowDimensions().height; const valueWindowWidth = useWindowDimensions().width; const handleBackButtonPress = onBackButtonPress ?? onClose; const handleBackdropPress = onBackdropPress ?? onClose; - + const { colors } = useTheme(); + const stylesHook = StyleSheet.create({ + hasDoneButton: { + backgroundColor: colors.elevated, + }, + }); return ( + useNativeDriverForBackdrop={Platform.OS === 'android'} + > + {props.children} + {doneButton && ( + + + + + )} + ); }; @@ -36,6 +56,7 @@ BottomModal.propTypes = { onBackButtonPress: PropTypes.func, onBackdropPress: PropTypes.func, onClose: PropTypes.func, + doneButton: PropTypes.func, windowHeight: PropTypes.number, windowWidth: PropTypes.number, }; diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 2b68abd61..31ec4529c 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -260,13 +260,13 @@ PODS: - React - react-native-blur (0.8.0): - React - - react-native-camera (3.43.5): + - react-native-camera (3.43.6): - React-Core - - react-native-camera/RCT (= 3.43.5) - - react-native-camera/RN (= 3.43.5) - - react-native-camera/RCT (3.43.5): + - react-native-camera/RCT (= 3.43.6) + - react-native-camera/RN (= 3.43.6) + - react-native-camera/RCT (3.43.6): - React-Core - - react-native-camera/RN (3.43.5): + - react-native-camera/RN (3.43.6): - React-Core - react-native-document-picker (3.5.4): - React @@ -274,7 +274,7 @@ PODS: - React - react-native-idle-timer (2.1.6): - React-Core - - react-native-image-picker (3.3.2): + - react-native-image-picker (3.3.4): - React-Core - react-native-is-catalyst (1.0.0): - React @@ -356,7 +356,7 @@ PODS: - React - RemobileReactNativeQrcodeLocalImage (1.0.4): - React - - RNCAsyncStorage (1.15.3): + - RNCAsyncStorage (1.15.4): - React-Core - RNCClipboard (1.7.0): - React-Core @@ -735,11 +735,11 @@ SPEC CHECKSUMS: React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a react-native-blue-crypto: 23f1558ad3d38d7a2edb7e2f6ed1bc520ed93e56 react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c - react-native-camera: 8a79f048c146e08e416c542bcf57984cbc7ed404 + react-native-camera: 68bc0c37d11df806570bfe53e8d7561bd984cb76 react-native-document-picker: c5752781fbc0c126c627c1549b037c139444a4cf react-native-fingerprint-scanner: c68136ca57e3704d7bdf5faa554ea535ce15b1d0 react-native-idle-timer: 97b8283237d45146a7a5c25bdebe9e1e85f3687b - react-native-image-picker: 5b2f1ea1f9230b131abbfb8a4aa1eb209aba9ed9 + react-native-image-picker: 4436d2ae609d1fc5b6426133755fc8d468347b61 react-native-is-catalyst: 52ee70e0123c82419dd4ce47dc4cc94b22467512 react-native-randombytes: 45ae693012df24c9a07a5e578b3b567c01468581 react-native-safe-area-context: e471852c5ed67eea4b10c5d9d43c1cebae3b231d @@ -759,7 +759,7 @@ SPEC CHECKSUMS: ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b RealmJS: 5195064e9aeccf94ae3756bd9d0f2301b9074b07 RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa - RNCAsyncStorage: 68fabb4cccd2a736e5a5c9b91ca469125274cde9 + RNCAsyncStorage: b17c417b356114699a486715adfa5829a5d6d8b9 RNCClipboard: dac13db8b1ce9b998f1cbc7ca33440113602847f RNCMaskedView: f5c7d14d6847b7b44853f7acb6284c1da30a3459 RNCPushNotificationIOS: 5b1cf9ad2aaa107ecb92d5d2d7005ba521b2b97a diff --git a/screen/wallets/addMultisig.js b/screen/wallets/addMultisig.js index f3920836a..985893bb3 100644 --- a/screen/wallets/addMultisig.js +++ b/screen/wallets/addMultisig.js @@ -101,7 +101,7 @@ const WalletsAddMultisig = () => { const renderModal = () => { return ( - + {loc.multisig.quorum_header} From b8b6457d826d408f0f5629fbb081772cfb2f5547 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Mon, 17 May 2021 22:18:39 -0400 Subject: [PATCH 056/327] Update BottomModal.js --- components/BottomModal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/BottomModal.js b/components/BottomModal.js index 960f77470..54c0e6385 100644 --- a/components/BottomModal.js +++ b/components/BottomModal.js @@ -56,7 +56,7 @@ BottomModal.propTypes = { onBackButtonPress: PropTypes.func, onBackdropPress: PropTypes.func, onClose: PropTypes.func, - doneButton: PropTypes.func, + doneButton: PropTypes.bool, windowHeight: PropTypes.number, windowWidth: PropTypes.number, }; From 09acff6bdeb1b65e85136d88e027d1dabd2b68f9 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 18 May 2021 08:07:31 +0000 Subject: [PATCH 057/327] fix: upgrade @react-native-community/masked-view from 0.1.10 to 0.1.11 Snyk has created this PR to upgrade @react-native-community/masked-view from 0.1.10 to 0.1.11. See this package in npm: https://www.npmjs.com/package/@react-native-community/masked-view See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9abdc3b0e..21d390fc6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3426,9 +3426,9 @@ "dev": true }, "@react-native-community/masked-view": { - "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==" + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@react-native-community/masked-view/-/masked-view-0.1.11.tgz", + "integrity": "sha512-rQfMIGSR/1r/SyN87+VD8xHHzDYeHaJq6elOSCAD+0iLagXkSI2pfA0LmSXP21uw5i3em7GkkRjfJ8wpqWXZNw==" }, "@react-native-community/push-notification-ios": { "version": "1.8.0", diff --git a/package.json b/package.json index d23d8540c..15aa74a72 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "@react-native-async-storage/async-storage": "1.15.4", "@react-native-clipboard/clipboard": "1.7.0", "@react-native-community/blur": "3.6.0", - "@react-native-community/masked-view": "0.1.10", + "@react-native-community/masked-view": "0.1.11", "@react-native-community/push-notification-ios": "1.8.0", "@react-navigation/drawer": "5.12.5", "@react-navigation/native": "5.9.4", From ea3b16444b8c343572570cbca2168fe96241ddde Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 18 May 2021 08:07:34 +0000 Subject: [PATCH 058/327] fix: upgrade react-native-fs from 2.16.6 to 2.17.0 Snyk has created this PR to upgrade react-native-fs from 2.16.6 to 2.17.0. See this package in npm: https://www.npmjs.com/package/react-native-fs See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9abdc3b0e..52374baa9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17590,9 +17590,9 @@ "from": "git+https://github.com/BlueWallet/react-native-fingerprint-scanner.git#ce644673681716335d786727bab998f7e632ab5e" }, "react-native-fs": { - "version": "2.16.6", - "resolved": "https://registry.npmjs.org/react-native-fs/-/react-native-fs-2.16.6.tgz", - "integrity": "sha512-ZWOooD1AuFoAGY3HS2GY7Qx2LZo4oIg6AK0wbC68detxwvX75R/q9lRqThXNKP6vIo2VHWa0fYUo/SrLw80E8w==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/react-native-fs/-/react-native-fs-2.17.0.tgz", + "integrity": "sha512-SmibqNWTt6uE+Yki5GkmytoCUTWm73GpFNMEAy12bD1PQ70PSH4XbIf1WUMNJzjctlcfEymQLKsk5Cyi6Y0Jrg==", "requires": { "base-64": "^0.1.0", "utf8": "^3.0.0" diff --git a/package.json b/package.json index d23d8540c..a02422d36 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "react-native-document-picker": "https://github.com/BlueWallet/react-native-document-picker#3684d4fcc2bc0b47c32be39024e4796004c3e428", "react-native-elements": "2.3.2", "react-native-fingerprint-scanner": "https://github.com/BlueWallet/react-native-fingerprint-scanner#ce644673681716335d786727bab998f7e632ab5e", - "react-native-fs": "2.16.6", + "react-native-fs": "2.17.0", "react-native-gesture-handler": "1.10.3", "react-native-handoff": "https://github.com/marcosrdz/react-native-handoff#f5becc63f3e36bf2da1ed1fc60fc690323e73602", "react-native-haptic-feedback": "1.11.0", From 4714e2c5e1c734b3fba38033967d046badcc888b Mon Sep 17 00:00:00 2001 From: Overtorment Date: Tue, 18 May 2021 12:54:18 +0100 Subject: [PATCH 059/327] REF: sentry unique id --- App.js | 7 ------- blue_modules/analytics.js | 9 ++++++++- screen/settings/about.js | 24 ++++++++++++++++++------ 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/App.js b/App.js index c7b52b801..4c8f510e8 100644 --- a/App.js +++ b/App.js @@ -21,7 +21,6 @@ import * as NavigationService from './NavigationService'; import { BlueTextCentered, BlueButton, SecondButton } from './BlueComponents'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; import { Chain } from './models/bitcoinUnits'; -import * as Sentry from '@sentry/react-native'; import OnAppLaunch from './class/on-app-launch'; import DeeplinkSchemaMatch from './class/deeplink-schema-match'; import loc from './loc'; @@ -41,12 +40,6 @@ const A = require('./blue_modules/analytics'); const eventEmitter = new NativeEventEmitter(NativeModules.EventEmitter); -if (process.env.NODE_ENV !== 'development') { - Sentry.init({ - dsn: 'https://23377936131848ca8003448a893cb622@sentry.io/1295736', - }); -} - const ClipboardContentType = Object.freeze({ BITCOIN: 'BITCOIN', LIGHTNING: 'LIGHTNING', diff --git a/blue_modules/analytics.js b/blue_modules/analytics.js index 9a8fd3417..08502da57 100644 --- a/blue_modules/analytics.js +++ b/blue_modules/analytics.js @@ -1,9 +1,16 @@ import * as Sentry from '@sentry/react-native'; import amplitude from 'amplitude-js'; -import { getVersion, getSystemName } from 'react-native-device-info'; +import { getVersion, getSystemName, getUniqueId } from 'react-native-device-info'; import { Platform } from 'react-native'; const BlueApp = require('../BlueApp'); +if (process.env.NODE_ENV !== 'development') { + Sentry.init({ + dsn: 'https://23377936131848ca8003448a893cb622@sentry.io/1295736', + }); + Sentry.setUser({ id: getUniqueId() }); +} + amplitude.getInstance().init('8b7cf19e8eea3cdcf16340f5fbf16330', null, { useNativeDeviceInfo: true, platform: getSystemName().toLocaleLowerCase().includes('mac') ? getSystemName() : Platform.OS, diff --git a/screen/settings/about.js b/screen/settings/about.js index a8e485ee8..f3c9adf5f 100644 --- a/screen/settings/about.js +++ b/screen/settings/about.js @@ -1,13 +1,15 @@ import React from 'react'; -import { TouchableOpacity, ScrollView, Linking, Image, View, Text, StyleSheet, useWindowDimensions, Platform } from 'react-native'; +import { TouchableOpacity, ScrollView, Linking, Image, View, Text, StyleSheet, useWindowDimensions } from 'react-native'; import { useNavigation, useTheme } from '@react-navigation/native'; import { Icon } from 'react-native-elements'; import { getApplicationName, getVersion, getBundleId, getBuildNumber, getUniqueId } from 'react-native-device-info'; import Rate, { AndroidMarket } from 'react-native-rate'; -import { BlueButton, BlueCard, BlueListItem, BlueSpacing20, BlueTextCentered, BlueCopyToClipboardButton } from '../../BlueComponents'; +import { BlueButton, BlueCard, BlueListItem, BlueSpacing20, BlueTextCentered } from '../../BlueComponents'; import navigationStyle from '../../components/navigationStyle'; import loc from '../../loc'; +import Clipboard from '@react-native-clipboard/clipboard'; +import * as Sentry from '@sentry/react-native'; const About = () => { const { navigate } = useNavigation(); @@ -18,6 +20,11 @@ const About = () => { justifyContent: 'center', alignItems: 'center', }, + copyToClipboardText: { + fontSize: 13, + fontWeight: '400', + color: '#68bbe1', + }, center: { justifyContent: 'center', alignItems: 'center', @@ -203,10 +210,15 @@ const About = () => { Unique ID: {getUniqueId()} - + { + const stringToCopy = 'user.id:' + getUniqueId(); + Sentry.captureMessage('copied unique id'); + Clipboard.setString(stringToCopy); + }} + > + {loc.transactions.details_copy} + From 59b881b9fc366b170d691888988ab2de85bf36db Mon Sep 17 00:00:00 2001 From: Overtorment Date: Tue, 18 May 2021 21:02:03 +0100 Subject: [PATCH 060/327] FIX: tor supported text --- screen/settings/electrumSettings.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/screen/settings/electrumSettings.js b/screen/settings/electrumSettings.js index f1f03bc0a..52d2d5235 100644 --- a/screen/settings/electrumSettings.js +++ b/screen/settings/electrumSettings.js @@ -268,9 +268,8 @@ export default class ElectrumSettings extends Component { this.setState({ host: text.trim() })} From 68b2f281784007b59f2e96859995ba05f729e2ed Mon Sep 17 00:00:00 2001 From: Overtorment Date: Tue, 18 May 2021 21:38:18 +0100 Subject: [PATCH 061/327] REF: storage improvements --- BlueApp.js | 1 + blue_modules/BlueElectrum.js | 41 ++++++++++++++++++----------- blue_modules/currency.js | 18 ++++++++----- blue_modules/storage-context.js | 11 ++++---- class/app-storage.js | 41 +++++++++++++++++++++-------- class/biometrics.js | 12 ++++----- loc/index.js | 9 ++++--- screen/settings/electrumSettings.js | 37 +++++++++++++------------- tests/integration/Currency.test.js | 11 ++++---- tests/setup.js | 12 ++++++--- 10 files changed, 115 insertions(+), 78 deletions(-) diff --git a/BlueApp.js b/BlueApp.js index 8a5e53e7e..26a80c414 100644 --- a/BlueApp.js +++ b/BlueApp.js @@ -15,6 +15,7 @@ const startAndDecrypt = async retry => { console.log('App already has some wallets, so we are in already started state, exiting startAndDecrypt'); return true; } + await BlueApp.migrateKeys(); let password = false; if (await BlueApp.storageIsEncrypted()) { do { diff --git a/blue_modules/BlueElectrum.js b/blue_modules/BlueElectrum.js index 40b0b3b02..174e9aa2e 100644 --- a/blue_modules/BlueElectrum.js +++ b/blue_modules/BlueElectrum.js @@ -1,7 +1,7 @@ /* global alert */ import AsyncStorage from '@react-native-async-storage/async-storage'; import { Alert } from 'react-native'; -import { AppStorage, LegacyWallet, SegwitBech32Wallet, SegwitP2SHWallet } from '../class'; +import { LegacyWallet, SegwitBech32Wallet, SegwitP2SHWallet } from '../class'; import DefaultPreference from 'react-native-default-preference'; import RNWidgetCenter from 'react-native-widget-center'; import loc from '../loc'; @@ -12,6 +12,11 @@ const BigNumber = require('bignumber.js'); const torrific = require('../blue_modules/torrific'); const Realm = require('realm'); +const ELECTRUM_HOST = 'electrum_host'; +const ELECTRUM_TCP_PORT = 'electrum_tcp_port'; +const ELECTRUM_SSL_PORT = 'electrum_ssl_port'; +const ELECTRUM_SERVER_HISTORY = 'electrum_server_history'; + let _realm; async function _getRealm() { if (_realm) return _realm; @@ -79,13 +84,13 @@ async function connectMain() { try { if (usingPeer.host.endsWith('onion')) { const randomPeer = await getRandomHardcodedPeer(); - await DefaultPreference.set(AppStorage.ELECTRUM_HOST, randomPeer.host); - await DefaultPreference.set(AppStorage.ELECTRUM_TCP_PORT, randomPeer.tcp); - await DefaultPreference.set(AppStorage.ELECTRUM_SSL_PORT, randomPeer.ssl); + await DefaultPreference.set(ELECTRUM_HOST, randomPeer.host); + await DefaultPreference.set(ELECTRUM_TCP_PORT, randomPeer.tcp); + await DefaultPreference.set(ELECTRUM_SSL_PORT, randomPeer.ssl); } else { - await DefaultPreference.set(AppStorage.ELECTRUM_HOST, usingPeer.host); - await DefaultPreference.set(AppStorage.ELECTRUM_TCP_PORT, usingPeer.tcp); - await DefaultPreference.set(AppStorage.ELECTRUM_SSL_PORT, usingPeer.ssl); + await DefaultPreference.set(ELECTRUM_HOST, usingPeer.host); + await DefaultPreference.set(ELECTRUM_TCP_PORT, usingPeer.tcp); + await DefaultPreference.set(ELECTRUM_SSL_PORT, usingPeer.ssl); } RNWidgetCenter.reloadAllTimelines(); @@ -187,14 +192,14 @@ async function presentNetworkErrorAlert(usingPeer) { text: loc._.ok, style: 'destructive', onPress: async () => { - await AsyncStorage.setItem(AppStorage.ELECTRUM_HOST, ''); - await AsyncStorage.setItem(AppStorage.ELECTRUM_TCP_PORT, ''); - await AsyncStorage.setItem(AppStorage.ELECTRUM_SSL_PORT, ''); + await AsyncStorage.setItem(ELECTRUM_HOST, ''); + await AsyncStorage.setItem(ELECTRUM_TCP_PORT, ''); + await AsyncStorage.setItem(ELECTRUM_SSL_PORT, ''); try { await DefaultPreference.setName('group.io.bluewallet.bluewallet'); - await DefaultPreference.clear(AppStorage.ELECTRUM_HOST); - await DefaultPreference.clear(AppStorage.ELECTRUM_SSL_PORT); - await DefaultPreference.clear(AppStorage.ELECTRUM_TCP_PORT); + await DefaultPreference.clear(ELECTRUM_HOST); + await DefaultPreference.clear(ELECTRUM_SSL_PORT); + await DefaultPreference.clear(ELECTRUM_TCP_PORT); RNWidgetCenter.reloadAllTimelines(); } catch (e) { // Must be running on Android @@ -236,9 +241,9 @@ async function getRandomHardcodedPeer() { } async function getSavedPeer() { - const host = await AsyncStorage.getItem(AppStorage.ELECTRUM_HOST); - const port = await AsyncStorage.getItem(AppStorage.ELECTRUM_TCP_PORT); - const sslPort = await AsyncStorage.getItem(AppStorage.ELECTRUM_SSL_PORT); + const host = await AsyncStorage.getItem(ELECTRUM_HOST); + const port = await AsyncStorage.getItem(ELECTRUM_TCP_PORT); + const sslPort = await AsyncStorage.getItem(ELECTRUM_SSL_PORT); return { host, tcp: port, ssl: sslPort }; } @@ -845,6 +850,10 @@ module.exports.setBatchingEnabled = () => { module.exports.hardcodedPeers = hardcodedPeers; module.exports.getRandomHardcodedPeer = getRandomHardcodedPeer; +module.exports.ELECTRUM_HOST = ELECTRUM_HOST; +module.exports.ELECTRUM_TCP_PORT = ELECTRUM_TCP_PORT; +module.exports.ELECTRUM_SSL_PORT = ELECTRUM_SSL_PORT; +module.exports.ELECTRUM_SERVER_HISTORY = ELECTRUM_SERVER_HISTORY; const splitIntoChunks = function (arr, chunkSize) { const groups = []; diff --git a/blue_modules/currency.js b/blue_modules/currency.js index 3b5498b19..e2d6f625e 100644 --- a/blue_modules/currency.js +++ b/blue_modules/currency.js @@ -4,9 +4,11 @@ import RNWidgetCenter from 'react-native-widget-center'; import * as RNLocalize from 'react-native-localize'; import BigNumber from 'bignumber.js'; -import { AppStorage } from '../class'; import { FiatUnit, getFiatRate } from '../models/fiatUnit'; +const PREFERRED_CURRENCY = 'preferredCurrency'; +const EXCHANGE_RATES = 'currency'; + let preferredFiatCurrency = FiatUnit.USD; const exchangeRates = {}; @@ -22,7 +24,7 @@ const STRUCT = { * @returns {Promise} */ async function setPrefferedCurrency(item) { - await AsyncStorage.setItem(AppStorage.PREFERRED_CURRENCY, JSON.stringify(item)); + await AsyncStorage.setItem(PREFERRED_CURRENCY, JSON.stringify(item)); await DefaultPreference.setName('group.io.bluewallet.bluewallet'); await DefaultPreference.set('preferredCurrency', item.endPointKey); await DefaultPreference.set('preferredCurrencyLocale', item.locale.replace('-', '_')); @@ -30,7 +32,7 @@ async function setPrefferedCurrency(item) { } async function getPreferredCurrency() { - const preferredCurrency = await JSON.parse(await AsyncStorage.getItem(AppStorage.PREFERRED_CURRENCY)); + const preferredCurrency = await JSON.parse(await AsyncStorage.getItem(PREFERRED_CURRENCY)); await DefaultPreference.setName('group.io.bluewallet.bluewallet'); await DefaultPreference.set('preferredCurrency', preferredCurrency.endPointKey); await DefaultPreference.set('preferredCurrencyLocale', preferredCurrency.locale.replace('-', '_')); @@ -44,7 +46,7 @@ async function updateExchangeRate() { } try { - preferredFiatCurrency = JSON.parse(await AsyncStorage.getItem(AppStorage.PREFERRED_CURRENCY)); + preferredFiatCurrency = JSON.parse(await AsyncStorage.getItem(PREFERRED_CURRENCY)); if (preferredFiatCurrency === null) { throw Error('No Preferred Fiat selected'); } @@ -61,15 +63,15 @@ async function updateExchangeRate() { try { rate = await getFiatRate(preferredFiatCurrency.endPointKey); } catch (Err) { - const lastSavedExchangeRate = JSON.parse(await AsyncStorage.getItem(AppStorage.EXCHANGE_RATES)); + const lastSavedExchangeRate = JSON.parse(await AsyncStorage.getItem(EXCHANGE_RATES)); exchangeRates['BTC_' + preferredFiatCurrency.endPointKey] = lastSavedExchangeRate['BTC_' + preferredFiatCurrency.endPointKey] * 1; return; } exchangeRates[STRUCT.LAST_UPDATED] = +new Date(); exchangeRates['BTC_' + preferredFiatCurrency.endPointKey] = rate; - await AsyncStorage.setItem(AppStorage.EXCHANGE_RATES, JSON.stringify(exchangeRates)); - await AsyncStorage.setItem(AppStorage.PREFERRED_CURRENCY, JSON.stringify(preferredFiatCurrency)); + await AsyncStorage.setItem(EXCHANGE_RATES, JSON.stringify(exchangeRates)); + await AsyncStorage.setItem(PREFERRED_CURRENCY, JSON.stringify(preferredFiatCurrency)); await setPrefferedCurrency(preferredFiatCurrency); } @@ -179,3 +181,5 @@ module.exports.btcToSatoshi = btcToSatoshi; module.exports.getCurrencySymbol = getCurrencySymbol; module.exports._setPreferredFiatCurrency = _setPreferredFiatCurrency; // export it to mock data in tests module.exports._setExchangeRate = _setExchangeRate; // export it to mock data in tests +module.exports.PREFERRED_CURRENCY = PREFERRED_CURRENCY; +module.exports.EXCHANGE_RATES = EXCHANGE_RATES; diff --git a/blue_modules/storage-context.js b/blue_modules/storage-context.js index 08ab08522..7f42aa058 100644 --- a/blue_modules/storage-context.js +++ b/blue_modules/storage-context.js @@ -2,10 +2,11 @@ import { useAsyncStorage } from '@react-native-async-storage/async-storage'; import React, { createContext, useEffect, useState } from 'react'; import { LayoutAnimation } from 'react-native'; -import { AppStorage } from '../class'; import { FiatUnit } from '../models/fiatUnit'; +import loc from '../loc'; const BlueApp = require('../BlueApp'); const BlueElectrum = require('./BlueElectrum'); +const currency = require('../blue_modules/currency'); const _lastTimeTriedToRefetchWallet = {}; // hashmap of timestamps we _started_ refetching some wallet @@ -19,14 +20,14 @@ export const BlueStorageProvider = ({ children }) => { const [walletsInitialized, setWalletsInitialized] = useState(false); const [preferredFiatCurrency, _setPreferredFiatCurrency] = useState(FiatUnit.USD); const [language, _setLanguage] = useState(); - const getPreferredCurrencyAsyncStorage = useAsyncStorage(AppStorage.PREFERRED_CURRENCY).getItem; - const getLanguageAsyncStorage = useAsyncStorage(AppStorage.LANG).getItem; + const getPreferredCurrencyAsyncStorage = useAsyncStorage(currency.PREFERRED_CURRENCY).getItem; + const getLanguageAsyncStorage = useAsyncStorage(loc.LANG).getItem; const [isHandOffUseEnabled, setIsHandOffUseEnabled] = useState(false); const [isDrawerListBlurred, _setIsDrawerListBlurred] = useState(false); const setIsHandOffUseEnabledAsyncStorage = value => { setIsHandOffUseEnabled(value); - return BlueApp.setItem(AppStorage.HANDOFF_STORAGE_KEY, value === true ? '1' : ''); + return BlueApp.setIsHandoffEnabled(value); }; const saveToDisk = async () => { @@ -43,7 +44,7 @@ export const BlueStorageProvider = ({ children }) => { useEffect(() => { (async () => { try { - const enabledHandoff = await BlueApp.getItem(AppStorage.HANDOFF_STORAGE_KEY); + const enabledHandoff = await BlueApp.isHandoffEnabled(); setIsHandOffUseEnabled(!!enabledHandoff); } catch (_e) { setIsHandOffUseEnabledAsyncStorage(false); diff --git a/class/app-storage.js b/class/app-storage.js index 205a13cac..840a14912 100644 --- a/class/app-storage.js +++ b/class/app-storage.js @@ -27,14 +27,7 @@ let usedBucketNum = false; export class AppStorage { static FLAG_ENCRYPTED = 'data_encrypted'; - static LANG = 'lang'; - static EXCHANGE_RATES = 'currency'; static LNDHUB = 'lndhub'; - static ELECTRUM_HOST = 'electrum_host'; - static ELECTRUM_TCP_PORT = 'electrum_tcp_port'; - static ELECTRUM_SSL_PORT = 'electrum_ssl_port'; - static ELECTRUM_SERVER_HISTORY = 'electrum_server_history'; - static PREFERRED_CURRENCY = 'preferredCurrency'; static ADVANCED_MODE_ENABLED = 'advancedmodeenabled'; static DO_NOT_TRACK = 'donottrack'; static HODL_HODL_API_KEY = 'HODL_HODL_API_KEY'; @@ -42,6 +35,8 @@ export class AppStorage { static HODL_HODL_CONTRACTS = 'HODL_HODL_CONTRACTS'; static HANDOFF_STORAGE_KEY = 'HandOff'; + static keys2migrate = [AppStorage.HANDOFF_STORAGE_KEY, AppStorage.DO_NOT_TRACK, AppStorage.ADVANCED_MODE_ENABLED]; + constructor() { /** {Array.} */ this.wallets = []; @@ -49,6 +44,19 @@ export class AppStorage { this.cachedPassword = false; } + async migrateKeys() { + if (!(typeof navigator !== 'undefined' && navigator.product === 'ReactNative')) return; + for (const key of this.constructor.keys2migrate) { + try { + const value = await RNSecureKeyStore.get(key); + if (value) { + await AsyncStorage.setItem(key, value); + await RNSecureKeyStore.remove(key); + } + } catch (_) {} + } + } + /** * Wrapper for storage call. Secure store works only in RN environment. AsyncStorage is * used for cli/tests @@ -645,24 +653,35 @@ export class AppStorage { isAdancedModeEnabled = async () => { try { - return !!(await this.getItem(AppStorage.ADVANCED_MODE_ENABLED)); + return !!(await AsyncStorage.getItem(AppStorage.ADVANCED_MODE_ENABLED)); } catch (_) {} return false; }; setIsAdancedModeEnabled = async value => { - await this.setItem(AppStorage.ADVANCED_MODE_ENABLED, value ? '1' : ''); + await AsyncStorage.setItem(AppStorage.ADVANCED_MODE_ENABLED, value ? '1' : ''); + }; + + isHandoffEnabled = async () => { + try { + return !!(await AsyncStorage.getItem(AppStorage.HANDOFF_STORAGE_KEY)); + } catch (_) {} + return false; + }; + + setIsHandoffEnabled = async value => { + await AsyncStorage.setItem(AppStorage.HANDOFF_STORAGE_KEY, value ? '1' : ''); }; isDoNotTrackEnabled = async () => { try { - return !!(await this.getItem(AppStorage.DO_NOT_TRACK)); + return !!(await AsyncStorage.getItem(AppStorage.DO_NOT_TRACK)); } catch (_) {} return false; }; setDoNotTrack = async value => { - await this.setItem(AppStorage.DO_NOT_TRACK, value ? '1' : ''); + await AsyncStorage.setItem(AppStorage.DO_NOT_TRACK, value ? '1' : ''); }; /** diff --git a/class/biometrics.js b/class/biometrics.js index 554e1ad64..d1e14b944 100644 --- a/class/biometrics.js +++ b/class/biometrics.js @@ -8,9 +8,10 @@ import RNSecureKeyStore from 'react-native-secure-key-store'; import loc from '../loc'; import { useContext } from 'react'; import { BlueStorageContext } from '../blue_modules/storage-context'; +import * as Sentry from '@sentry/react-native'; function Biometric() { - const { getItem, setItem, setResetOnAppUninstallTo } = useContext(BlueStorageContext); + const { getItem, setItem } = useContext(BlueStorageContext); Biometric.STORAGEKEY = 'Biometrics'; Biometric.FaceID = 'Face ID'; Biometric.TouchID = 'Touch ID'; @@ -42,10 +43,9 @@ function Biometric() { try { const enabledBiometrics = await getItem(Biometric.STORAGEKEY); return !!enabledBiometrics; - } catch (_e) { - await setItem(Biometric.STORAGEKEY, ''); - return false; - } + } catch (_) {} + + return false; }; Biometric.isBiometricUseCapableAndEnabled = async () => { @@ -72,10 +72,10 @@ function Biometric() { }; Biometric.clearKeychain = async () => { + Sentry.captureMessage('Biometric.clearKeychain()'); await RNSecureKeyStore.remove('data'); await RNSecureKeyStore.remove('data_encrypted'); await RNSecureKeyStore.remove(Biometric.STORAGEKEY); - await setResetOnAppUninstallTo(true); NavigationService.dispatch(StackActions.replace('WalletsRoot')); }; diff --git a/loc/index.js b/loc/index.js index dd093cbeb..ebaac25bf 100644 --- a/loc/index.js +++ b/loc/index.js @@ -6,12 +6,13 @@ import localizedFormat from 'dayjs/plugin/localizedFormat'; import * as RNLocalize from 'react-native-localize'; import BigNumber from 'bignumber.js'; -import { AppStorage } from '../class'; import { BitcoinUnit } from '../models/bitcoinUnits'; import { AvailableLanguages } from './languages'; import { I18nManager } from 'react-native'; const currency = require('../blue_modules/currency'); +const LANG = 'lang'; + dayjs.extend(relativeTime); dayjs.extend(localizedFormat); @@ -158,8 +159,7 @@ const setDateTimeLocale = async () => { const setLanguageLocale = async () => { // finding out whether lang preference was saved - // For some reason using the AppStorage.LANG constant is not working. Hard coding string for now. - const lang = await AsyncStorage.getItem('lang'); + const lang = await AsyncStorage.getItem(LANG); if (lang) { strings.setLanguage(lang); await setDateTimeLocale(); @@ -222,7 +222,7 @@ const strings = new Localization({ }); strings.saveLanguage = async lang => { - await AsyncStorage.setItem(AppStorage.LANG, lang); + await AsyncStorage.setItem(LANG, lang); strings.setLanguage(lang); await setDateTimeLocale(); }; @@ -324,4 +324,5 @@ export function _leaveNumbersAndDots(newInputValue) { return newInputValue; } +strings.LANG = LANG; export default strings; diff --git a/screen/settings/electrumSettings.js b/screen/settings/electrumSettings.js index 52d2d5235..4d0f927c6 100644 --- a/screen/settings/electrumSettings.js +++ b/screen/settings/electrumSettings.js @@ -18,7 +18,6 @@ import RNWidgetCenter from 'react-native-widget-center'; import AsyncStorage from '@react-native-async-storage/async-storage'; import loc from '../../loc'; -import { AppStorage } from '../../class'; import DeeplinkSchemaMatch from '../../class/deeplink-schema-match'; import navigationStyle from '../../components/navigationStyle'; import { @@ -55,10 +54,10 @@ export default class ElectrumSettings extends Component { } async componentDidMount() { - const host = await AsyncStorage.getItem(AppStorage.ELECTRUM_HOST); - const port = await AsyncStorage.getItem(AppStorage.ELECTRUM_TCP_PORT); - const sslPort = await AsyncStorage.getItem(AppStorage.ELECTRUM_SSL_PORT); - const serverHistoryStr = await AsyncStorage.getItem(AppStorage.ELECTRUM_SERVER_HISTORY); + const host = await AsyncStorage.getItem(BlueElectrum.ELECTRUM_HOST); + const port = await AsyncStorage.getItem(BlueElectrum.ELECTRUM_TCP_PORT); + const sslPort = await AsyncStorage.getItem(BlueElectrum.ELECTRUM_SSL_PORT); + const serverHistoryStr = await AsyncStorage.getItem(BlueElectrum.ELECTRUM_SERVER_HISTORY); const serverHistory = JSON.parse(serverHistoryStr) || []; this.setState({ @@ -127,7 +126,7 @@ export default class ElectrumSettings extends Component { clearHistory = async () => { this.setState({ isLoading: true }, async () => { - await AsyncStorage.setItem(AppStorage.ELECTRUM_SERVER_HISTORY, JSON.stringify([])); + await AsyncStorage.setItem(BlueElectrum.ELECTRUM_SERVER_HISTORY, JSON.stringify([])); this.setState({ serverHistory: [], isLoading: false, @@ -157,14 +156,14 @@ export default class ElectrumSettings extends Component { this.setState({ isLoading: true }, async () => { try { if (!host && !port && !sslPort) { - await AsyncStorage.setItem(AppStorage.ELECTRUM_HOST, ''); - await AsyncStorage.setItem(AppStorage.ELECTRUM_TCP_PORT, ''); - await AsyncStorage.setItem(AppStorage.ELECTRUM_SSL_PORT, ''); + await AsyncStorage.setItem(BlueElectrum.ELECTRUM_HOST, ''); + await AsyncStorage.setItem(BlueElectrum.ELECTRUM_TCP_PORT, ''); + await AsyncStorage.setItem(BlueElectrum.ELECTRUM_SSL_PORT, ''); try { await DefaultPreference.setName('group.io.bluewallet.bluewallet'); - await DefaultPreference.clear(AppStorage.ELECTRUM_HOST); - await DefaultPreference.clear(AppStorage.ELECTRUM_SSL_PORT); - await DefaultPreference.clear(AppStorage.ELECTRUM_TCP_PORT); + await DefaultPreference.clear(BlueElectrum.ELECTRUM_HOST); + await DefaultPreference.clear(BlueElectrum.ELECTRUM_SSL_PORT); + await DefaultPreference.clear(BlueElectrum.ELECTRUM_TCP_PORT); RNWidgetCenter.reloadAllTimelines(); } catch (e) { // Must be running on Android @@ -176,9 +175,9 @@ export default class ElectrumSettings extends Component { ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); alert(loc.settings.electrum_error_connect); } else { - await AsyncStorage.setItem(AppStorage.ELECTRUM_HOST, host); - await AsyncStorage.setItem(AppStorage.ELECTRUM_TCP_PORT, port); - await AsyncStorage.setItem(AppStorage.ELECTRUM_SSL_PORT, sslPort); + await AsyncStorage.setItem(BlueElectrum.ELECTRUM_HOST, host); + await AsyncStorage.setItem(BlueElectrum.ELECTRUM_TCP_PORT, port); + await AsyncStorage.setItem(BlueElectrum.ELECTRUM_SSL_PORT, sslPort); if (!this.serverExists({ host, port, sslPort })) { serverHistory.push({ @@ -186,14 +185,14 @@ export default class ElectrumSettings extends Component { port, sslPort, }); - await AsyncStorage.setItem(AppStorage.ELECTRUM_SERVER_HISTORY, JSON.stringify(serverHistory)); + await AsyncStorage.setItem(BlueElectrum.ELECTRUM_SERVER_HISTORY, JSON.stringify(serverHistory)); } try { await DefaultPreference.setName('group.io.bluewallet.bluewallet'); - await DefaultPreference.set(AppStorage.ELECTRUM_HOST, host); - await DefaultPreference.set(AppStorage.ELECTRUM_TCP_PORT, port); - await DefaultPreference.set(AppStorage.ELECTRUM_SSL_PORT, sslPort); + await DefaultPreference.set(BlueElectrum.ELECTRUM_HOST, host); + await DefaultPreference.set(BlueElectrum.ELECTRUM_TCP_PORT, port); + await DefaultPreference.set(BlueElectrum.ELECTRUM_SSL_PORT, sslPort); RNWidgetCenter.reloadAllTimelines(); } catch (e) { // Must be running on Android diff --git a/tests/integration/Currency.test.js b/tests/integration/Currency.test.js index bd491449b..a23e0644d 100644 --- a/tests/integration/Currency.test.js +++ b/tests/integration/Currency.test.js @@ -1,4 +1,3 @@ -import { AppStorage } from '../../class'; import { FiatUnit } from '../../models/fiatUnit'; import AsyncStorage from '@react-native-async-storage/async-storage'; const assert = require('assert'); @@ -9,16 +8,16 @@ describe('currency', () => { jasmine.DEFAULT_TIMEOUT_INTERVAL = 15000; const currency = require('../../blue_modules/currency'); await currency.startUpdater(); - let cur = await AsyncStorage.getItem(AppStorage.EXCHANGE_RATES); + let cur = await AsyncStorage.getItem(currency.EXCHANGE_RATES); cur = JSON.parse(cur); assert.ok(Number.isInteger(cur[currency.STRUCT.LAST_UPDATED])); assert.ok(cur[currency.STRUCT.LAST_UPDATED] > 0); assert.ok(cur.BTC_USD > 0); // now, setting other currency as default - await AsyncStorage.setItem(AppStorage.PREFERRED_CURRENCY, JSON.stringify(FiatUnit.JPY)); + await AsyncStorage.setItem(currency.PREFERRED_CURRENCY, JSON.stringify(FiatUnit.JPY)); await currency.startUpdater(); - cur = JSON.parse(await AsyncStorage.getItem(AppStorage.EXCHANGE_RATES)); + cur = JSON.parse(await AsyncStorage.getItem(currency.EXCHANGE_RATES)); assert.ok(cur.BTC_JPY > 0); // now setting with a proper setter @@ -26,13 +25,13 @@ describe('currency', () => { await currency.startUpdater(); const preferred = await currency.getPreferredCurrency(); assert.strictEqual(preferred.endPointKey, 'EUR'); - cur = JSON.parse(await AsyncStorage.getItem(AppStorage.EXCHANGE_RATES)); + cur = JSON.parse(await AsyncStorage.getItem(currency.EXCHANGE_RATES)); assert.ok(cur.BTC_EUR > 0); // test Yadio rate source await currency.setPrefferedCurrency(FiatUnit.ARS); await currency.startUpdater(); - cur = JSON.parse(await AsyncStorage.getItem(AppStorage.EXCHANGE_RATES)); + cur = JSON.parse(await AsyncStorage.getItem(currency.EXCHANGE_RATES)); assert.ok(cur.BTC_ARS > 0); // test BitcoinduLiban rate source diff --git a/tests/setup.js b/tests/setup.js index c65d96335..02a6c5846 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -9,15 +9,17 @@ jest.mock('react-native-watch-connectivity', () => { }); jest.mock('react-native-secure-key-store', () => { - return { - setResetOnAppUninstallTo: jest.fn(), - }; + return {}; }); jest.mock('@react-native-community/push-notification-ios', () => { return {}; }); +jest.mock('@sentry/react-native', () => { + return {}; +}); + jest.mock('react-native-device-info', () => { return { getSystemName: jest.fn(), @@ -96,7 +98,9 @@ jest.mock('react-native-haptic-feedback', () => ({})); const realmInstanceMock = { close: function () {}, write: function () {}, - objectForPrimaryKey: function () { return {}; }, + objectForPrimaryKey: function () { + return {}; + }, objects: function () { const wallets = { filtered: function () { From 6c8fa0a147e99e85390d474c2675dbaf6be83f2d Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 19 May 2021 02:55:03 +0000 Subject: [PATCH 062/327] fix: upgrade detox from 18.12.0 to 18.12.1 Snyk has created this PR to upgrade detox from 18.12.0 to 18.12.1. See this package in npm: https://www.npmjs.com/package/detox See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac37d27a1..ba97cfe3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6765,9 +6765,9 @@ "dev": true }, "detox": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/detox/-/detox-18.12.0.tgz", - "integrity": "sha512-AZLbI1TInfK1/aQjqIDDGYtgdlaocexnC40wN9NIa3rEwUjh21UyasYeYjG9RmHGVz3QQjVdmp2cDx+rKduDfg==", + "version": "18.12.1", + "resolved": "https://registry.npmjs.org/detox/-/detox-18.12.1.tgz", + "integrity": "sha512-XFQg6bI2XzhakQKHreMxDFJzJY2Cqvk0SazHplVl7a6QxR/9DpehhhYvMQbe0L9Ytn2ELmQob4W7Xh2s3CWEKg==", "requires": { "bunyan": "^1.8.12", "bunyan-debug-stream": "^1.1.0", diff --git a/package.json b/package.json index 28bfcc88f..6f23016bd 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "coinselect": "3.1.12", "crypto-js": "4.0.0", "dayjs": "1.10.4", - "detox": "18.12.0", + "detox": "18.12.1", "ecurve": "1.0.6", "electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4", "electrum-mnemonic": "2.0.0", From 5d4c862bbd1182d38d16f412c9e8dfeef277e142 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 19 May 2021 02:55:07 +0000 Subject: [PATCH 063/327] fix: upgrade react-native-localize from 2.0.2 to 2.0.3 Snyk has created this PR to upgrade react-native-localize from 2.0.2 to 2.0.3. See this package in npm: https://www.npmjs.com/package/react-native-localize See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac37d27a1..96be7d13e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17684,9 +17684,9 @@ "integrity": "sha512-HDwEaXcQIuXXCV70O+bK1rizFong3wj+5Q/jSyifKFLg0VWF95xh8XQgfzXwtq0NggL9vNjPKXa016KuFu+VFg==" }, "react-native-localize": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-2.0.2.tgz", - "integrity": "sha512-4Ii7lqiD9iL0LxTWifAiEsDcDPpvos/29fEVkHxgEDD7J5f+NROMkFSFomKgz1Cab1TmN5mau3o8yFmYrPFcnw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-2.0.3.tgz", + "integrity": "sha512-6SILy2yX/U1rTjF56/BiywcFXeO9AY8LmPF2p3TgP3Y2uKejxAOOQ4nzr+bAP1h+X5TaBmwTPBGNMZ1TttEJvA==" }, "react-native-modal": { "version": "11.10.0", diff --git a/package.json b/package.json index 28bfcc88f..cbff33fc7 100644 --- a/package.json +++ b/package.json @@ -142,7 +142,7 @@ "react-native-is-catalyst": "https://github.com/BlueWallet/react-native-is-catalyst#v1.0.0", "react-native-level-fs": "3.0.1", "react-native-linear-gradient": "2.5.6", - "react-native-localize": "2.0.2", + "react-native-localize": "2.0.3", "react-native-modal": "11.10.0", "react-native-navigation-bar-color": "https://github.com/BlueWallet/react-native-navigation-bar-color#34e44b8f44e442133de9d35c35f2679d40982804", "react-native-obscure": "1.2.1", From 79f21946fb0494efb2ab87bf178b6ea192a384d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20V=C3=ADtor=20Dias?= Date: Wed, 19 May 2021 12:52:56 -0300 Subject: [PATCH 064/327] FIX: Check Bech32 uppercase address --- class/wallets/abstract-hd-electrum-wallet.js | 10 ++++++++-- class/wallets/legacy-wallet.js | 8 +++++++- tests/integration/hd-segwit-bech32-wallet.test.js | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/class/wallets/abstract-hd-electrum-wallet.js b/class/wallets/abstract-hd-electrum-wallet.js index c006bf8cf..a79c8e846 100644 --- a/class/wallets/abstract-hd-electrum-wallet.js +++ b/class/wallets/abstract-hd-electrum-wallet.js @@ -824,11 +824,17 @@ export class AbstractHDElectrumWallet extends AbstractHDWallet { } weOwnAddress(address) { + let cleanAddress = address; + + if (this.segwitType === 'p2wpkh') { + cleanAddress = address.toLowerCase(); + } + for (let c = 0; c < this.next_free_address_index + this.gap_limit; c++) { - if (this._getExternalAddressByIndex(c) === address) return true; + if (this._getExternalAddressByIndex(c) === cleanAddress) return true; } for (let c = 0; c < this.next_free_change_address_index + this.gap_limit; c++) { - if (this._getInternalAddressByIndex(c) === address) return true; + if (this._getInternalAddressByIndex(c) === cleanAddress) return true; } return false; } diff --git a/class/wallets/legacy-wallet.js b/class/wallets/legacy-wallet.js index 83e2b9bd5..1e7e5a247 100644 --- a/class/wallets/legacy-wallet.js +++ b/class/wallets/legacy-wallet.js @@ -465,7 +465,13 @@ export class LegacyWallet extends AbstractWallet { } weOwnAddress(address) { - return this.getAddress() === address || this._address === address; + let cleanAddress = address; + + if (this.segwitType === 'p2wpkh') { + cleanAddress = address.toLowerCase(); + } + + return this.getAddress() === cleanAddress || this._address === cleanAddress; } weOwnTransaction(txid) { diff --git a/tests/integration/hd-segwit-bech32-wallet.test.js b/tests/integration/hd-segwit-bech32-wallet.test.js index b19276808..c59ad2ce6 100644 --- a/tests/integration/hd-segwit-bech32-wallet.test.js +++ b/tests/integration/hd-segwit-bech32-wallet.test.js @@ -40,6 +40,7 @@ describe('Bech32 Segwit HD (BIP84)', () => { assert.strictEqual(hd._getInternalAddressByIndex(1), 'bc1qwp58x4c9e5cplsnw5096qzdkae036ug7a34x3r'); assert.ok(hd.weOwnAddress('bc1qvd6w54sydc08z3802svkxr7297ez7cusd6266p')); + assert.ok(hd.weOwnAddress('BC1QVD6W54SYDC08Z3802SVKXR7297EZ7CUSD6266P')); assert.ok(hd.weOwnAddress('bc1qt4t9xl2gmjvxgmp5gev6m8e6s9c85979ta7jeh')); assert.ok(!hd.weOwnAddress('1HjsSTnrwWzzEV2oi4r5MsAYENkTkrCtwL')); From d4a0195fbb481ddfb61c9f6600b7c0908802949d Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Wed, 19 May 2021 14:47:18 -0400 Subject: [PATCH 065/327] FIX: File import icon was not visible --- ios/Podfile.lock | 12 ++++++------ screen/send/ScanQRCode.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 31ec4529c..400c09a17 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -360,7 +360,7 @@ PODS: - React-Core - RNCClipboard (1.7.0): - React-Core - - RNCMaskedView (0.1.10): + - RNCMaskedView (0.1.11): - React - RNCPushNotificationIOS (1.8.0): - React-Core @@ -368,7 +368,7 @@ PODS: - React - RNDeviceInfo (8.1.2): - React-Core - - RNFS (2.16.6): + - RNFS (2.17.0): - React - RNGestureHandler (1.10.3): - React-Core @@ -376,7 +376,7 @@ PODS: - React - RNInAppBrowser (3.5.1): - React-Core - - RNLocalize (2.0.2): + - RNLocalize (2.0.3): - React-Core - RNPrivacySnapshot (1.0.0): - React @@ -761,15 +761,15 @@ SPEC CHECKSUMS: RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa RNCAsyncStorage: b17c417b356114699a486715adfa5829a5d6d8b9 RNCClipboard: dac13db8b1ce9b998f1cbc7ca33440113602847f - RNCMaskedView: f5c7d14d6847b7b44853f7acb6284c1da30a3459 + RNCMaskedView: f127cd9652acfa31b91dcff613e07ba18b774db6 RNCPushNotificationIOS: 5b1cf9ad2aaa107ecb92d5d2d7005ba521b2b97a RNDefaultPreference: 21816c0a6f61a2829ccc0cef034392e9b509ee5f RNDeviceInfo: 4f480456c7ac8c9919448375399c1a6f14479549 - RNFS: 2bd9eb49dc82fa9676382f0585b992c424cd59df + RNFS: 93d5b5535eb39d98e6b19009faa8fe717f7ea45d RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211 RNHandoff: d3b0754cca3a6bcd9b25f544f733f7f033ccf5fa RNInAppBrowser: 3733c1aa6699983a1c9b4963e85d5e5a48ad297e - RNLocalize: 47e22ef8c36df1d572e42a87c8ae22e3fcf551dd + RNLocalize: 29e84ea169d3bca6c3b83584536c7f586a07fb98 RNPrivacySnapshot: 71919dde3c6a29dd332115409c2aec564afee8f4 RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93 RNRate: 2b31dad120cd1b78e33c6034808561c386a3dddf diff --git a/screen/send/ScanQRCode.js b/screen/send/ScanQRCode.js index 8f0eccf58..c807eaf0f 100644 --- a/screen/send/ScanQRCode.js +++ b/screen/send/ScanQRCode.js @@ -283,7 +283,7 @@ const ScanQRCode = () => { {showFileImportButton && ( - + )} {urTotal > 0 && ( From f2f0ae8cb46b2ccbc2dc7f6fbaf9df310c8e1416 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Wed, 19 May 2021 21:25:16 -0400 Subject: [PATCH 066/327] REL: ver bump & release notes --- android/app/build.gradle | 2 +- ios/BlueWallet.xcodeproj/project.pbxproj | 72 +++++++++---------- ios/fastlane/metadata/en-US/release_notes.txt | 20 ++++++ package-lock.json | 2 +- package.json | 2 +- 5 files changed, 59 insertions(+), 39 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index afc83ee75..290da8a41 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -136,7 +136,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 - versionName "6.1.3" + versionName "6.1.4" multiDexEnabled true missingDimensionStrategy 'react-native-camera', 'general' testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index 950b84643..a9ea5aa56 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -1628,7 +1628,7 @@ CODE_SIGN_ENTITLEMENTS = BlueWallet/BlueWallet.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; @@ -1649,7 +1649,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1678,7 +1678,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; @@ -1693,7 +1693,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1723,7 +1723,7 @@ CODE_SIGN_ENTITLEMENTS = "TodayExtension/BlueWallet - Bitcoin Price.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1734,7 +1734,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; @@ -1762,7 +1762,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1773,7 +1773,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; PRODUCT_NAME = "BlueWallet - Bitcoin Price"; @@ -1799,13 +1799,13 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; @@ -1830,13 +1830,13 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1861,7 +1861,7 @@ CODE_SIGN_ENTITLEMENTS = PriceWidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1872,7 +1872,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget; @@ -1903,7 +1903,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1914,7 +1914,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1943,7 +1943,7 @@ CODE_SIGN_ENTITLEMENTS = MarketWidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1954,7 +1954,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; @@ -1986,7 +1986,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1997,7 +1997,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2026,7 +2026,7 @@ CODE_SIGN_ENTITLEMENTS = MarketWidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2038,7 +2038,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget; @@ -2070,7 +2070,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2082,7 +2082,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2111,7 +2111,7 @@ CODE_SIGN_ENTITLEMENTS = WalletInformationWidgetExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2122,7 +2122,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget; @@ -2153,7 +2153,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2164,7 +2164,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2296,7 +2296,7 @@ CODE_SIGN_ENTITLEMENTS = "BlueWalletWatch Extension/BlueWalletWatch Extension.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2306,7 +2306,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; @@ -2336,7 +2336,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2346,7 +2346,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -2376,13 +2376,13 @@ CODE_SIGN_ENTITLEMENTS = BlueWalletWatch/BlueWalletWatch.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; @@ -2415,13 +2415,13 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 504; + CURRENT_PROJECT_VERSION = 508; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.3; + MARKETING_VERSION = 6.1.4; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ios/fastlane/metadata/en-US/release_notes.txt b/ios/fastlane/metadata/en-US/release_notes.txt index 572705a66..f9a9a7392 100644 --- a/ios/fastlane/metadata/en-US/release_notes.txt +++ b/ios/fastlane/metadata/en-US/release_notes.txt @@ -1,3 +1,23 @@ +v6.1.3 +====== + +* FIX: File import icon was not visible +* FIX: Check Bech32 uppercase address +* ADD: Add close to modals #2584 +* FIX: Dont display Tor text in catalyst +* DEL: Remove tooltip as its not needed on multisig create screen. +* FIX: Applied xpub to wrong object +* FIX: cobo vault watch-only occasionally gets imported as wrong wallet type (closes #3152) +* FIX: widgets shows wrong price in RUB currency +* REF: smarter utxo selection (closes #3085) + +v6.1.2 +====== + +* ADD: Opt-out of analytics tracking in settings/privacy +* FIX: Loading indicator for wallet details +* FIX: Lightning invoice unit didn't reflect user change + v6.1.1 ====== diff --git a/package-lock.json b/package-lock.json index 56961db18..6c37dd067 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.3", + "version": "6.1.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9590e422d..f298ed0b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.3", + "version": "6.1.4", "license": "MIT", "repository": { "type": "git", From 8e291a96331369209a7dcf0a28f0082b39d9fb5a Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Wed, 19 May 2021 21:29:37 -0400 Subject: [PATCH 067/327] FIX: Remove flash on modal open --- screen/send/details.js | 1 - 1 file changed, 1 deletion(-) diff --git a/screen/send/details.js b/screen/send/details.js index 0d3806b7d..d3d9dc560 100644 --- a/screen/send/details.js +++ b/screen/send/details.js @@ -161,7 +161,6 @@ const SendDetails = () => { // load fresh fees from servers - LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut); setNetworkTransactionFeesIsLoading(true); NetworkTransactionFees.recommendedFees() .then(async fees => { From fc11da2aae920b3b2706a794e21898a2f1b6fd6f Mon Sep 17 00:00:00 2001 From: Overtorment Date: Thu, 20 May 2021 09:49:40 +0100 Subject: [PATCH 068/327] FIX: capital bech32 addresses --- class/wallets/abstract-hd-electrum-wallet.js | 1 + class/wallets/abstract-hd-wallet.js | 9 --------- class/wallets/legacy-wallet.js | 1 + class/wallets/watch-only-wallet.js | 2 ++ .../integration/hd-segwit-bech32-transaction.test.js | 5 +++++ tests/integration/hd-segwit-bech32-wallet.test.js | 2 ++ tests/integration/legacy-wallet.test.js | 11 ++++++++++- tests/integration/watch-only-wallet.test.js | 3 +++ tests/unit/hd-aezeed.test.js | 2 ++ 9 files changed, 26 insertions(+), 10 deletions(-) diff --git a/class/wallets/abstract-hd-electrum-wallet.js b/class/wallets/abstract-hd-electrum-wallet.js index a79c8e846..5a71e0490 100644 --- a/class/wallets/abstract-hd-electrum-wallet.js +++ b/class/wallets/abstract-hd-electrum-wallet.js @@ -824,6 +824,7 @@ export class AbstractHDElectrumWallet extends AbstractHDWallet { } weOwnAddress(address) { + if (!address) return false; let cleanAddress = address; if (this.segwitType === 'p2wpkh') { diff --git a/class/wallets/abstract-hd-wallet.js b/class/wallets/abstract-hd-wallet.js index 138606110..5548429ee 100644 --- a/class/wallets/abstract-hd-wallet.js +++ b/class/wallets/abstract-hd-wallet.js @@ -242,15 +242,6 @@ export class AbstractHDWallet extends LegacyWallet { throw new Error('Not implemented'); } - weOwnAddress(addr) { - const hashmap = {}; - for (const a of this.usedAddresses) { - hashmap[a] = 1; - } - - return hashmap[addr] === 1; - } - _getDerivationPathByAddress(address) { throw new Error('Not implemented'); } diff --git a/class/wallets/legacy-wallet.js b/class/wallets/legacy-wallet.js index 1e7e5a247..3d46c92d0 100644 --- a/class/wallets/legacy-wallet.js +++ b/class/wallets/legacy-wallet.js @@ -465,6 +465,7 @@ export class LegacyWallet extends AbstractWallet { } weOwnAddress(address) { + if (!address) return false; let cleanAddress = address; if (this.segwitType === 'p2wpkh') { diff --git a/class/wallets/watch-only-wallet.js b/class/wallets/watch-only-wallet.js index 21925c68a..26f7c5971 100644 --- a/class/wallets/watch-only-wallet.js +++ b/class/wallets/watch-only-wallet.js @@ -221,6 +221,8 @@ export class WatchOnlyWallet extends LegacyWallet { throw new Error('Not initialized'); } + if (address && address.startsWith('BC1')) address = address.toLowerCase(); + return this.getAddress() === address; } diff --git a/tests/integration/hd-segwit-bech32-transaction.test.js b/tests/integration/hd-segwit-bech32-transaction.test.js index 86f949c7e..bb3a81673 100644 --- a/tests/integration/hd-segwit-bech32-transaction.test.js +++ b/tests/integration/hd-segwit-bech32-transaction.test.js @@ -18,6 +18,11 @@ beforeAll(async () => { }); let _cachedHdWallet = false; + +/** + * @returns {Promise} + * @private + */ async function _getHdWallet() { if (_cachedHdWallet) return _cachedHdWallet; _cachedHdWallet = new HDSegwitBech32Wallet(); diff --git a/tests/integration/hd-segwit-bech32-wallet.test.js b/tests/integration/hd-segwit-bech32-wallet.test.js index c59ad2ce6..e69e88c98 100644 --- a/tests/integration/hd-segwit-bech32-wallet.test.js +++ b/tests/integration/hd-segwit-bech32-wallet.test.js @@ -43,6 +43,8 @@ describe('Bech32 Segwit HD (BIP84)', () => { assert.ok(hd.weOwnAddress('BC1QVD6W54SYDC08Z3802SVKXR7297EZ7CUSD6266P')); assert.ok(hd.weOwnAddress('bc1qt4t9xl2gmjvxgmp5gev6m8e6s9c85979ta7jeh')); assert.ok(!hd.weOwnAddress('1HjsSTnrwWzzEV2oi4r5MsAYENkTkrCtwL')); + assert.ok(!hd.weOwnAddress('garbage')); + assert.ok(!hd.weOwnAddress(false)); assert.strictEqual(hd.timeToRefreshBalance(), true); assert.ok(hd._lastTxFetch === 0); diff --git a/tests/integration/legacy-wallet.test.js b/tests/integration/legacy-wallet.test.js index 8272b6210..8406fb5b4 100644 --- a/tests/integration/legacy-wallet.test.js +++ b/tests/integration/legacy-wallet.test.js @@ -44,6 +44,7 @@ describe('LegacyWallet', function () { w._address = '115fUy41sZkAG14CmdP1VbEKcNRZJWkUWG'; // hack internals assert.ok(w.weOwnAddress('115fUy41sZkAG14CmdP1VbEKcNRZJWkUWG')); assert.ok(!w.weOwnAddress('aaa')); + assert.ok(!w.weOwnAddress(false)); assert.ok(w.getBalance() === 0); assert.ok(w.getUnconfirmedBalance() === 0); assert.ok(w._lastBalanceFetch === 0); @@ -126,6 +127,8 @@ describe('SegwitP2SHWallet', function () { assert.ok(l.getAddress() === '34AgLJhwXrvmkZS1o5TrcdeevMt22Nar53', 'expected ' + l.getAddress()); assert.ok(l.getAddress() === (await l.getAddressAsync())); assert.ok(l.weOwnAddress('34AgLJhwXrvmkZS1o5TrcdeevMt22Nar53')); + assert.ok(!l.weOwnAddress('garbage')); + assert.ok(!l.weOwnAddress(false)); }); }); @@ -134,6 +137,9 @@ describe('SegwitBech32Wallet', function () { const w = new SegwitBech32Wallet(); w._address = 'bc1qn887fmetaytw4vj68vsh529ft408q8j9x3dndc'; assert.ok(w.weOwnAddress('bc1qn887fmetaytw4vj68vsh529ft408q8j9x3dndc')); + assert.ok(w.weOwnAddress('BC1QN887FMETAYTW4VJ68VSH529FT408Q8J9X3DNDC')); + assert.ok(!w.weOwnAddress('garbage')); + assert.ok(!w.weOwnAddress(false)); await w.fetchBalance(); assert.strictEqual(w.getBalance(), 100000); }); @@ -173,9 +179,12 @@ describe('SegwitBech32Wallet', function () { }); it('can fetch TXs', async () => { - const w = new LegacyWallet(); + const w = new SegwitBech32Wallet(); w._address = 'bc1qn887fmetaytw4vj68vsh529ft408q8j9x3dndc'; assert.ok(w.weOwnAddress('bc1qn887fmetaytw4vj68vsh529ft408q8j9x3dndc')); + assert.ok(w.weOwnAddress('BC1QN887FMETAYTW4VJ68VSH529FT408Q8J9X3DNDC')); + assert.ok(!w.weOwnAddress('garbage')); + assert.ok(!w.weOwnAddress(false)); await w.fetchTransactions(); assert.strictEqual(w.getTransactions().length, 1); diff --git a/tests/integration/watch-only-wallet.test.js b/tests/integration/watch-only-wallet.test.js index 4a4e75801..771ff6e4f 100644 --- a/tests/integration/watch-only-wallet.test.js +++ b/tests/integration/watch-only-wallet.test.js @@ -63,6 +63,9 @@ describe('Watch only wallet', () => { assert.strictEqual(w.getAddress(), 'bc1quhnve8q4tk3unhmjts7ymxv8cd6w9xv8wy29uv'); assert.strictEqual(await w.getAddressAsync(), 'bc1quhnve8q4tk3unhmjts7ymxv8cd6w9xv8wy29uv'); assert.ok(w.weOwnAddress('bc1quhnve8q4tk3unhmjts7ymxv8cd6w9xv8wy29uv')); + assert.ok(w.weOwnAddress('BC1QUHNVE8Q4TK3UNHMJTS7YMXV8CD6W9XV8WY29UV')); + assert.ok(!w.weOwnAddress('garbage')); + assert.ok(!w.weOwnAddress(false)); await w.fetchTransactions(); for (const tx of w.getTransactions()) { diff --git a/tests/unit/hd-aezeed.test.js b/tests/unit/hd-aezeed.test.js index 38f964d62..d30b879de 100644 --- a/tests/unit/hd-aezeed.test.js +++ b/tests/unit/hd-aezeed.test.js @@ -113,6 +113,8 @@ describe('HDAezeedWallet', () => { watchOnly.init(); assert.strictEqual(watchOnly._getExternalAddressByIndex(0), aezeed._getExternalAddressByIndex(0)); assert.ok(watchOnly.weOwnAddress('bc1qdjj7lhj9lnjye7xq3dzv3r4z0cta294xy78txn')); + assert.ok(!watchOnly.weOwnAddress('garbage')); + assert.ok(!watchOnly.weOwnAddress(false)); }); it('can sign and verify messages', async () => { From 7ab48fece98da07e19a87250d51b43661d77f8b1 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Fri, 21 May 2021 02:02:29 -0400 Subject: [PATCH 069/327] REF: Use a single currency JSON for app and widgets --- ios/BlueWallet.xcodeproj/project.pbxproj | 56 +-- .../Widgets/Shared/Fiat/FiatUnit.swift | 45 +- .../Widgets/Shared/Fiat/FiatUnits.plist | 416 ------------------ models/fiatUnit.js | 44 +- models/fiatUnit.json | 248 +++++++++++ 5 files changed, 301 insertions(+), 508 deletions(-) delete mode 100644 ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnits.plist create mode 100644 models/fiatUnit.json diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index a9ea5aa56..f9d3d164b 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -21,10 +21,6 @@ 590C62D2ED8BF487C33945B0 /* libPods-WalletInformationAndMarketWidgetExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 98455D960744E4E5DD50BA87 /* libPods-WalletInformationAndMarketWidgetExtension.a */; platformFilter = ios; }; 6D2A6464258BA92D0092292B /* Stickers.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D2A6463258BA92D0092292B /* Stickers.xcassets */; }; 6D2A6468258BA92D0092292B /* Stickers.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6D2A6461258BA92C0092292B /* Stickers.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 6D2AA7FA2568B8750090B089 /* FiatUnits.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6D2AA7F92568B8750090B089 /* FiatUnits.plist */; }; - 6D2AA7FB2568B8750090B089 /* FiatUnits.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6D2AA7F92568B8750090B089 /* FiatUnits.plist */; }; - 6D2AA7FC2568B8750090B089 /* FiatUnits.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6D2AA7F92568B8750090B089 /* FiatUnits.plist */; }; - 6D2AA7FD2568B8750090B089 /* FiatUnits.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6D2AA7F92568B8750090B089 /* FiatUnits.plist */; }; 6D2AA8082568B8F40090B089 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; }; 6D2AA8092568B8F40090B089 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; }; 6D2AA80A2568B8F40090B089 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; }; @@ -33,7 +29,6 @@ 6D4AF15925D21172009DD853 /* WidgetAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* WidgetAPI.swift */; }; 6D4AF16325D21185009DD853 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6B254BAB1B007B5B82 /* WidgetDataStore.swift */; }; 6D4AF16D25D21192009DD853 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; }; - 6D4AF17725D211A3009DD853 /* FiatUnits.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6D2AA7F92568B8750090B089 /* FiatUnits.plist */; }; 6D4AF17825D211A3009DD853 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; }; 6D4AF18425D215D1009DD853 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; }; 6D4AF18525D215D1009DD853 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; }; @@ -82,6 +77,11 @@ 6D9A2E6D254BAB1B007B5B82 /* WidgetAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* WidgetAPI.swift */; }; 6D9A2E6F254BAB1B007B5B82 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6B254BAB1B007B5B82 /* WidgetDataStore.swift */; }; 6DA7047E254E24D5005FE5E2 /* UserDefaultsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */; }; + 6DE38F062657765900EA6C22 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DE38F052657765900EA6C22 /* fiatUnit.json */; }; + 6DE38F072657765900EA6C22 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DE38F052657765900EA6C22 /* fiatUnit.json */; }; + 6DE38F082657765900EA6C22 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DE38F052657765900EA6C22 /* fiatUnit.json */; }; + 6DE38F092657765900EA6C22 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DE38F052657765900EA6C22 /* fiatUnit.json */; }; + 6DE38F0A2657765900EA6C22 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DE38F052657765900EA6C22 /* fiatUnit.json */; }; 6DEB4AAE254FB59C00E9F9AA /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3A252FE1A3004D72DF /* WidgetKit.framework */; platformFilter = ios; }; 6DEB4AAF254FB59C00E9F9AA /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3C252FE1A3004D72DF /* SwiftUI.framework */; platformFilter = ios; }; 6DEB4AB2254FB59C00E9F9AA /* WalletInformationWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4AB1254FB59C00E9F9AA /* WalletInformationWidget.swift */; }; @@ -95,7 +95,7 @@ 6DEB4C3B254FBF4800E9F9AA /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; }; 6DEB4C3C254FBF4800E9F9AA /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; }; 6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; }; - 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */; }; + 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* EFQRCode */; }; 6DFC807224EA2FA9007B8700 /* ViewQRCodefaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFC807124EA2FA9007B8700 /* ViewQRCodefaceController.swift */; }; 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; @@ -319,7 +319,6 @@ 6D2A6461258BA92C0092292B /* Stickers.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = Stickers.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 6D2A6463258BA92D0092292B /* Stickers.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Stickers.xcassets; sourceTree = ""; }; 6D2A6465258BA92D0092292B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 6D2AA7F92568B8750090B089 /* FiatUnits.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = FiatUnits.plist; sourceTree = ""; }; 6D2AA8072568B8F40090B089 /* FiatUnit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FiatUnit.swift; sourceTree = ""; }; 6D32C5C42596CE2F008C077C /* EventEmitter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EventEmitter.h; sourceTree = ""; }; 6D32C5C52596CE3A008C077C /* EventEmitter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EventEmitter.m; sourceTree = ""; }; @@ -347,6 +346,7 @@ 6D9A2E6A254BAB1B007B5B82 /* WidgetAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WidgetAPI.swift; sourceTree = ""; }; 6D9A2E6B254BAB1B007B5B82 /* WidgetDataStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WidgetDataStore.swift; sourceTree = ""; }; 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsGroup.swift; sourceTree = ""; }; + 6DE38F052657765900EA6C22 /* fiatUnit.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = fiatUnit.json; path = ../../../../../models/fiatUnit.json; sourceTree = ""; }; 6DEB496F254E38DE00E9F9AA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MainInterface.strings; sourceTree = ""; }; 6DEB4AAD254FB59B00E9F9AA /* WalletInformationWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = WalletInformationWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 6DEB4AB1254FB59C00E9F9AA /* WalletInformationWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletInformationWidget.swift; sourceTree = ""; }; @@ -496,7 +496,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */, + 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -610,7 +610,7 @@ 6D2AA8062568B8E50090B089 /* Fiat */ = { isa = PBXGroup; children = ( - 6D2AA7F92568B8750090B089 /* FiatUnits.plist */, + 6DE38F052657765900EA6C22 /* fiatUnit.json */, 6D2AA8072568B8F40090B089 /* FiatUnit.swift */, ); path = Fiat; @@ -996,7 +996,7 @@ ); name = "BlueWalletWatch Extension"; packageProductDependencies = ( - 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */, + 6DFC806F24EA0B6C007B8700 /* EFQRCode */, ); productName = "BlueWalletWatch Extension"; productReference = B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */; @@ -1089,7 +1089,7 @@ ); mainGroup = 83CBB9F61A601CBA00E9B192; packageReferences = ( - 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */, + 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */, ); productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; projectDirPath = ""; @@ -1138,8 +1138,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6D2AA7FD2568B8750090B089 /* FiatUnits.plist in Resources */, 6D6CA4D725587397009312A5 /* Assets.xcassets in Resources */, + 6DE38F0A2657765900EA6C22 /* fiatUnit.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1147,8 +1147,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6D2AA7FA2568B8750090B089 /* FiatUnits.plist in Resources */, 6D9946832555A695000E52E8 /* Assets.xcassets in Resources */, + 6DE38F072657765900EA6C22 /* fiatUnit.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1156,8 +1156,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6D2AA7FC2568B8750090B089 /* FiatUnits.plist in Resources */, 6D9A2E09254BA348007B5B82 /* Assets.xcassets in Resources */, + 6DE38F092657765900EA6C22 /* fiatUnit.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1165,8 +1165,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6D2AA7FB2568B8750090B089 /* FiatUnits.plist in Resources */, 6DEB4B05254FB79100E9F9AA /* Assets.xcassets in Resources */, + 6DE38F082657765900EA6C22 /* fiatUnit.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1183,8 +1183,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6D4AF17725D211A3009DD853 /* FiatUnits.plist in Resources */, B4EE583C226703320003363C /* Assets.xcassets in Resources */, + 6DE38F062657765900EA6C22 /* fiatUnit.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1205,24 +1205,6 @@ shellPath = /bin/sh; shellScript = "export SENTRY_PROPERTIES=sentry.properties\nexport NODE_BINARY=node\n../node_modules/@sentry/cli/bin/sentry-cli react-native xcode ../node_modules/react-native/scripts/react-native-xcode.sh\n"; }; - 1D2D05C5A2622FFEA3FB0BEB /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-frameworks.sh", - "${PODS_ROOT}/../../node_modules/react-native-tor/ios/Libsifir_ios.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Libsifir_ios.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 2130DE983D1D45AC8FC45F7E /* Upload Debug Symbols to Sentry */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -2533,7 +2515,7 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */ = { + 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/EFPrefix/EFQRCode.git"; requirement = { @@ -2544,9 +2526,9 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */ = { + 6DFC806F24EA0B6C007B8700 /* EFQRCode */ = { isa = XCSwiftPackageProductDependency; - package = 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */; + package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */; productName = EFQRCode; }; /* End XCSwiftPackageProductDependency section */ diff --git a/ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnit.swift b/ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnit.swift index 05d99e812..f1d0672b0 100644 --- a/ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnit.swift +++ b/ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnit.swift @@ -7,24 +7,45 @@ // import Foundation -typealias FiatUnits = [FiatUnit] struct FiatUnit: Codable { let endPointKey: String let symbol: String let locale: String let source: String + } func fiatUnit(currency: String) -> FiatUnit? { - guard let file = Bundle.main.path(forResource: "FiatUnits", ofType: "plist") else { - return nil - } - let fileURL: URL = URL(fileURLWithPath: file) - var fiatUnits: FiatUnits? - - if let data = try? Data(contentsOf: fileURL) { - let decoder = PropertyListDecoder() - fiatUnits = try? decoder.decode(FiatUnits.self, from: data) - } - return fiatUnits?.first(where: {$0.endPointKey == currency}) + return Bundle.main.decode([String: FiatUnit].self, from: "fiatUnit.json").first(where: {$1.endPointKey == currency})?.value +} + +extension Bundle { + func decode(_ type: T.Type, from file: String, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .deferredToDate, keyDecodingStrategy: JSONDecoder.KeyDecodingStrategy = .useDefaultKeys) -> T { + guard let url = self.url(forResource: file, withExtension: nil) else { + fatalError("Failed to locate \(file) in bundle.") + } + + guard let data = try? Data(contentsOf: url) else { + fatalError("Failed to load \(file) from bundle.") + } + + let decoder = JSONDecoder() + + decoder.dateDecodingStrategy = dateDecodingStrategy + decoder.keyDecodingStrategy = keyDecodingStrategy + + do { + return try decoder.decode(T.self, from: data) + } catch DecodingError.keyNotFound(let key, let context) { + fatalError("Failed to decode \(file) from bundle due to missing key '\(key.stringValue)' not found – \(context.debugDescription)") + } catch DecodingError.typeMismatch(_, let context) { + fatalError("Failed to decode \(file) from bundle due to type mismatch – \(context.debugDescription)") + } catch DecodingError.valueNotFound(let type, let context) { + fatalError("Failed to decode \(file) from bundle due to missing \(type) value – \(context.debugDescription)") + } catch DecodingError.dataCorrupted(_) { + fatalError("Failed to decode \(file) from bundle because it appears to be invalid JSON") + } catch { + fatalError("Failed to decode \(file) from bundle: \(error.localizedDescription)") + } + } } diff --git a/ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnits.plist b/ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnits.plist deleted file mode 100644 index ab660c082..000000000 --- a/ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnits.plist +++ /dev/null @@ -1,416 +0,0 @@ - - - - - - endPointKey - USD - symbol - $ - locale - en-US - source - CoinDesk - - - endPointKey - ANG - symbol - ƒ - locale - en-SX - source - CoinDesk - - - endPointKey - ARS - symbol - $ - locale - es-AR - source - Yadio - - - endPointKey - AUD - symbol - $ - locale - en-AU - source - CoinDesk - - - endPointKey - AWG - symbol - ƒ - locale - nl-AW - source - CoinDesk - - - endPointKey - BRL - symbol - R$ - locale - pt-BR - source - CoinDesk - - - endPointKey - CAD - symbol - $ - locale - en-CA - source - CoinDesk - - - endPointKey - CHF - symbol - CHF - locale - de-CH - source - CoinDesk - - - endPointKey - CLP - symbol - $ - locale - es-CL - source - CoinDesk - - - endPointKey - COP - symbol - $ - locale - es-CO - source - CoinDesk - - - endPointKey - CZK - symbol - - locale - cs-CZ - source - CoinDesk - - - endPointKey - CNY - symbol - ¥ - locale - zh-CN - source - CoinDesk - - - endPointKey - EUR - symbol - - locale - en-IE - source - CoinDesk - - - endPointKey - GBP - symbol - £ - locale - en-GB - source - CoinDesk - - - endPointKey - HRK - symbol - HRK - locale - hr-HR - source - CoinDesk - - - endPointKey - HUF - symbol - Ft - locale - hu-HU - source - CoinDesk - - - endPointKey - ILS - symbol - - locale - he-IL - source - CoinDesk - - - endPointKey - INR - symbol - - locale - hi-HN - source - CoinDesk - - - endPointKey - JPY - symbol - ¥ - locale - ja-JP - source - CoinDesk - - - endPointKey - KES - symbol - Ksh - locale - en-KE - source - CoinDesk - - - endPointKey - KRW - symbol - - locale - ko-KR - source - CoinDesk - - - endPointKey - LBP - symbol - ل.ل.‏ - locale - ar-LB - source - BitcoinduLiban - - - endPointKey - MXN - symbol - $ - locale - es-MX - source - CoinDesk - - - endPointKey - MYR - symbol - RM - locale - ms-MY - source - CoinDesk - - - endPointKey - NGN - symbol - - locale - en-NG - source - CoinDesk - - - endPointKey - NOK - symbol - kr - locale - nb-NO - source - CoinDesk - - - endPointKey - NZD - symbol - $ - locale - en-NZ - source - CoinDesk - - - endPointKey - PLN - symbol - - locale - pl-PL - source - CoinDesk - - - endPointKey - PHP - symbol - - locale - en-PH - source - CoinDesk - - - endPointKey - RUB - symbol - - locale - ru-RU - source - CoinDesk - - - endPointKey - SGD - symbol - S$ - locale - zh-SG - source - CoinDesk - - - endPointKey - SEK - symbol - kr - locale - sv-SE - source - CoinDesk - - - endPointKey - TRY - symbol - - locale - tr-TR - source - CoinDesk - - - endPointKey - THB - symbol - ฿ - locale - th-TH - source - CoinDesk - - - endPointKey - TWD - symbol - NT$ - locale - zh-Hant-TW - source - CoinDesk - - - endPointKey - TZS - symbol - TSh - locale - en-TZ - source - CoinDesk - - - endPointKey - UAH - symbol - - locale - uk-UA - source - CoinDesk - - - endPointKey - UYU - symbol - $ - locale - es-UY - source - CoinDesk - - - endPointKey - VEF - symbol - Bs. - locale - es-VE - source - CoinDesk - - - endPointKey - VES - symbol - Bs. - locale - es-VE - source - Yadio - - - endPointKey - ZAR - symbol - R - locale - en-ZA - source - CoinDesk - - - diff --git a/models/fiatUnit.js b/models/fiatUnit.js index ab0d12e25..3595e7b8f 100644 --- a/models/fiatUnit.js +++ b/models/fiatUnit.js @@ -63,49 +63,7 @@ const RateExtractors = Object.freeze({ }, }); -export const FiatUnit = Object.freeze({ - USD: { endPointKey: 'USD', symbol: '$', locale: 'en-US', source: FiatUnitSource.CoinDesk }, - ANG: { endPointKey: 'ANG', symbol: 'ƒ', locale: 'en-SX', source: FiatUnitSource.CoinDesk }, - ARS: { endPointKey: 'ARS', symbol: '$', locale: 'es-AR', source: FiatUnitSource.Yadio }, - AUD: { endPointKey: 'AUD', symbol: '$', locale: 'en-AU', source: FiatUnitSource.CoinDesk }, - AWG: { endPointKey: 'AWG', symbol: 'ƒ', locale: 'nl-AW', source: FiatUnitSource.CoinDesk }, - BRL: { endPointKey: 'BRL', symbol: 'R$', locale: 'pt-BR', source: FiatUnitSource.CoinDesk }, - CAD: { endPointKey: 'CAD', symbol: '$', locale: 'en-CA', source: FiatUnitSource.CoinDesk }, - CHF: { endPointKey: 'CHF', symbol: 'CHF', locale: 'de-CH', source: FiatUnitSource.CoinDesk }, - CLP: { endPointKey: 'CLP', symbol: '$', locale: 'es-CL', source: FiatUnitSource.CoinDesk }, - COP: { endPointKey: 'COP', symbol: '$', locale: 'es-CO', source: FiatUnitSource.CoinDesk }, - CZK: { endPointKey: 'CZK', symbol: 'Kč', locale: 'cs-CZ', source: FiatUnitSource.CoinDesk }, - CNY: { endPointKey: 'CNY', symbol: '¥', locale: 'zh-CN', source: FiatUnitSource.CoinDesk }, - EUR: { endPointKey: 'EUR', symbol: '€', locale: 'en-IE', source: FiatUnitSource.CoinDesk }, - GBP: { endPointKey: 'GBP', symbol: '£', locale: 'en-GB', source: FiatUnitSource.CoinDesk }, - HRK: { endPointKey: 'HRK', symbol: 'HRK', locale: 'hr-HR', source: FiatUnitSource.CoinDesk }, - HUF: { endPointKey: 'HUF', symbol: 'Ft', locale: 'hu-HU', source: FiatUnitSource.CoinDesk }, - ILS: { endPointKey: 'ILS', symbol: '₪', locale: 'he-IL', source: FiatUnitSource.CoinDesk }, - INR: { endPointKey: 'INR', symbol: '₹', locale: 'hi-HN', source: FiatUnitSource.CoinDesk }, - JPY: { endPointKey: 'JPY', symbol: '¥', locale: 'ja-JP', source: FiatUnitSource.CoinDesk }, - KES: { endPointKey: 'KES', symbol: 'Ksh', locale: 'en-KE', source: FiatUnitSource.CoinDesk }, - KRW: { endPointKey: 'KRW', symbol: '₩', locale: 'ko-KR', source: FiatUnitSource.CoinDesk }, - LBP: { endPointKey: 'LBP', symbol: 'ل.ل.', locale: 'ar-LB', source: FiatUnitSource.BitcoinduLiban }, - MXN: { endPointKey: 'MXN', symbol: '$', locale: 'es-MX', source: FiatUnitSource.CoinDesk }, - MYR: { endPointKey: 'MYR', symbol: 'RM', locale: 'ms-MY', source: FiatUnitSource.CoinDesk }, - NGN: { endPointKey: 'NGN', symbol: '₦', locale: 'en-NG', source: FiatUnitSource.CoinDesk }, - NOK: { endPointKey: 'NOK', symbol: 'kr', locale: 'nb-NO', source: FiatUnitSource.CoinDesk }, - NZD: { endPointKey: 'NZD', symbol: '$', locale: 'en-NZ', source: FiatUnitSource.CoinDesk }, - PLN: { endPointKey: 'PLN', symbol: 'zł', locale: 'pl-PL', source: FiatUnitSource.CoinDesk }, - PHP: { endPointKey: 'PHP', symbol: '₱', locale: 'en-PH', source: FiatUnitSource.CoinDesk }, - RUB: { endPointKey: 'RUB', symbol: '₽', locale: 'ru-RU', source: FiatUnitSource.CoinDesk }, - SGD: { endPointKey: 'SGD', symbol: 'S$', locale: 'zh-SG', source: FiatUnitSource.CoinDesk }, - SEK: { endPointKey: 'SEK', symbol: 'kr', locale: 'sv-SE', source: FiatUnitSource.CoinDesk }, - TRY: { endPointKey: 'TRY', symbol: '₺', locale: 'tr-TR', source: FiatUnitSource.CoinDesk }, - THB: { endPointKey: 'THB', symbol: '฿', locale: 'th-TH', source: FiatUnitSource.CoinDesk }, - TWD: { endPointKey: 'TWD', symbol: 'NT$', locale: 'zh-Hant-TW', source: FiatUnitSource.CoinDesk }, - TZS: { endPointKey: 'TZS', symbol: 'TSh', locale: 'en-TZ', source: FiatUnitSource.CoinDesk }, - UAH: { endPointKey: 'UAH', symbol: '₴', locale: 'uk-UA', source: FiatUnitSource.CoinDesk }, - UYU: { endPointKey: 'UYU', symbol: '$', locale: 'es-UY', source: FiatUnitSource.CoinDesk }, - VEF: { endPointKey: 'VEF', symbol: 'Bs.', locale: 'es-VE', source: FiatUnitSource.CoinDesk }, - VES: { endPointKey: 'VES', symbol: 'Bs.', locale: 'es-VE', source: FiatUnitSource.Yadio }, - ZAR: { endPointKey: 'ZAR', symbol: 'R', locale: 'en-ZA', source: FiatUnitSource.CoinDesk }, -}); +export const FiatUnit = require('./fiatUnit.json'); export async function getFiatRate(ticker) { return await RateExtractors[FiatUnit[ticker].source](ticker); diff --git a/models/fiatUnit.json b/models/fiatUnit.json new file mode 100644 index 000000000..c1326f7b9 --- /dev/null +++ b/models/fiatUnit.json @@ -0,0 +1,248 @@ +{ + "USD": { + "endPointKey": "USD", + "symbol": "$", + "locale": "en-US", + "source": "CoinDesk" + }, + "ANG": { + "endPointKey": "ANG", + "symbol": "ƒ", + "locale": "en-SX", + "source": "CoinDesk" + }, + "ARS": { + "endPointKey": "ARS", + "symbol": "$", + "locale": "es-AR", + "source": "Yadio" + }, + "AUD": { + "endPointKey": "AUD", + "symbol": "$", + "locale": "en-AU", + "source": "CoinDesk" + }, + "AWG": { + "endPointKey": "AWG", + "symbol": "ƒ", + "locale": "nl-AW", + "source": "CoinDesk" + }, + "BRL": { + "endPointKey": "BRL", + "symbol": "R$", + "locale": "pt-BR", + "source": "CoinDesk" + }, + "CAD": { + "endPointKey": "CAD", + "symbol": "$", + "locale": "en-CA", + "source": "CoinDesk" + }, + "CHF": { + "endPointKey": "CHF", + "symbol": "CHF", + "locale": "de-CH", + "source": "CoinDesk" + }, + "CLP": { + "endPointKey": "CLP", + "symbol": "$", + "locale": "es-CL", + "source": "CoinDesk" + }, + "COP": { + "endPointKey": "COP", + "symbol": "$", + "locale": "es-CO", + "source": "CoinDesk" + }, + "CZK": { + "endPointKey": "CZK", + "symbol": "Kč", + "locale": "cs-CZ", + "source": "CoinDesk" + }, + "CNY": { + "endPointKey": "CNY", + "symbol": "¥", + "locale": "zh-CN", + "source": "CoinDesk" + }, + "EUR": { + "endPointKey": "EUR", + "symbol": "€", + "locale": "en-IE", + "source": "CoinDesk" + }, + "GBP": { + "endPointKey": "GBP", + "symbol": "£", + "locale": "en-GB", + "source": "CoinDesk" + }, + "HRK": { + "endPointKey": "HRK", + "symbol": "HRK", + "locale": "hr-HR", + "source": "CoinDesk" + }, + "HUF": { + "endPointKey": "HUF", + "symbol": "Ft", + "locale": "hu-HU", + "source": "CoinDesk" + }, + "ILS": { + "endPointKey": "ILS", + "symbol": "₪", + "locale": "he-IL", + "source": "CoinDesk" + }, + "INR": { + "endPointKey": "INR", + "symbol": "₹", + "locale": "hi-HN", + "source": "CoinDesk" + }, + "JPY": { + "endPointKey": "JPY", + "symbol": "¥", + "locale": "ja-JP", + "source": "CoinDesk" + }, + "KES": { + "endPointKey": "KES", + "symbol": "Ksh", + "locale": "en-KE", + "source": "CoinDesk" + }, + "KRW": { + "endPointKey": "KRW", + "symbol": "₩", + "locale": "ko-KR", + "source": "CoinDesk" + }, + "LBP": { + "endPointKey": "LBP", + "symbol": "ل.ل.", + "locale": "ar-LB", + "source": "BitcoinduLiban" + }, + "MXN": { + "endPointKey": "MXN", + "symbol": "$", + "locale": "es-MX", + "source": "CoinDesk" + }, + "MYR": { + "endPointKey": "MYR", + "symbol": "RM", + "locale": "ms-MY", + "source": "CoinDesk" + }, + "NGN": { + "endPointKey": "NGN", + "symbol": "₦", + "locale": "en-NG", + "source": "CoinDesk" + }, + "NOK": { + "endPointKey": "NOK", + "symbol": "kr", + "locale": "nb-NO", + "source": "CoinDesk" + }, + "NZD": { + "endPointKey": "NZD", + "symbol": "$", + "locale": "en-NZ", + "source": "CoinDesk" + }, + "PLN": { + "endPointKey": "PLN", + "symbol": "zł", + "locale": "pl-PL", + "source": "CoinDesk" + }, + "PHP": { + "endPointKey": "PHP", + "symbol": "₱", + "locale": "en-PH", + "source": "CoinDesk" + }, + "RUB": { + "endPointKey": "RUB", + "symbol": "₽", + "locale": "ru-RU", + "source": "CoinDesk" + }, + "SGD": { + "endPointKey": "SGD", + "symbol": "S$", + "locale": "zh-SG", + "source": "CoinDesk" + }, + "SEK": { + "endPointKey": "SEK", + "symbol": "kr", + "locale": "sv-SE", + "source": "CoinDesk" + }, + "TRY": { + "endPointKey": "TRY", + "symbol": "₺", + "locale": "tr-TR", + "source": "CoinDesk" + }, + "THB": { + "endPointKey": "THB", + "symbol": "฿", + "locale": "th-TH", + "source": "CoinDesk" + }, + "TWD": { + "endPointKey": "TWD", + "symbol": "NT$", + "locale": "zh-Hant-TW", + "source": "CoinDesk" + }, + "TZS": { + "endPointKey": "TZS", + "symbol": "TSh", + "locale": "en-TZ", + "source": "CoinDesk" + }, + "UAH": { + "endPointKey": "UAH", + "symbol": "₴", + "locale": "uk-UA", + "source": "CoinDesk" + }, + "UYU": { + "endPointKey": "UYU", + "symbol": "$", + "locale": "es-UY", + "source": "CoinDesk" + }, + "VEF": { + "endPointKey": "VEF", + "symbol": "Bs.", + "locale": "es-VE", + "source": "CoinDesk" + }, + "VES": { + "endPointKey": "VES", + "symbol": "Bs.", + "locale": "es-VE", + "source": "Yadio" + }, + "ZAR": { + "endPointKey": "ZAR", + "symbol": "R", + "locale": "en-ZA", + "source": "CoinDesk" + } +} From 2249c5afb65710a950be05b6c7e45325eb488570 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 21 May 2021 12:23:23 +0000 Subject: [PATCH 070/327] Translate /loc/en.json in pl review completed for the source file '/loc/en.json' on the 'pl' language. --- loc/pl.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/loc/pl.json b/loc/pl.json index e401305fe..458290d5e 100644 --- a/loc/pl.json +++ b/loc/pl.json @@ -316,6 +316,8 @@ "privacy_quickactions": "Skróty Portfeli", "privacy_quickactions_explanation": "Dotknij i przytrzymaj ikonę aplikacji BlueWallet na swoim ekranie głównym aby szybko wyświetlić stan portfela.", "privacy_clipboard_explanation": "Udostępnij jeżeli adres lub wezwanie są znalezione w schowku.", + "privacy_do_not_track": "Wyłącz analitykę", + "privacy_do_not_track_explanation": "Informacje dotyczące wydajności i niezawodności nie będą przesyłane do analizy.", "push_notifications": "Powiadomienia Push", "retype_password": "Wprowadź Ponownie hasło", "selfTest": "Autotest", @@ -549,7 +551,7 @@ "change": "Reszta", "coins_selected": "Wybrano monet ({number})", "empty": "Ten portfel nie ma żadnych monet w tej chwili.", - "freeze": "Zamroź", + "freeze": "Zamrożona", "freezeLabel": "Zamroź", "freezeLabel_un": "Odmroź", "header": "Kontrola monet", From 1fde883994955d6ae2436488f2395c4230221ba6 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Fri, 21 May 2021 14:04:17 +0100 Subject: [PATCH 071/327] REL: ver bump --- android/app/build.gradle | 2 +- ios/BlueWallet.xcodeproj/project.pbxproj | 36 ++++++++++++------------ package-lock.json | 2 +- package.json | 2 +- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 290da8a41..4e0363aec 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -136,7 +136,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 - versionName "6.1.4" + versionName "6.1.5" multiDexEnabled true missingDimensionStrategy 'react-native-camera', 'general' testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index a9ea5aa56..0d5c8eda1 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -1649,7 +1649,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1693,7 +1693,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1734,7 +1734,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; @@ -1773,7 +1773,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; PRODUCT_NAME = "BlueWallet - Bitcoin Price"; @@ -1805,7 +1805,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; @@ -1836,7 +1836,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1872,7 +1872,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget; @@ -1914,7 +1914,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1954,7 +1954,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; @@ -1997,7 +1997,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2038,7 +2038,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget; @@ -2082,7 +2082,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2122,7 +2122,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget; @@ -2164,7 +2164,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2306,7 +2306,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; @@ -2346,7 +2346,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -2382,7 +2382,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; @@ -2421,7 +2421,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.4; + MARKETING_VERSION = 6.1.5; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/package-lock.json b/package-lock.json index 6c37dd067..b4a195346 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.4", + "version": "6.1.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f298ed0b0..435c91562 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.4", + "version": "6.1.5", "license": "MIT", "repository": { "type": "git", From 75bd1bfccc88e4b3d9487cf206f9c2ea69919a61 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 20 May 2021 01:05:59 +0000 Subject: [PATCH 072/327] fix: upgrade react-native-image-picker from 3.3.4 to 3.5.0 Snyk has created this PR to upgrade react-native-image-picker from 3.3.4 to 3.5.0. See this package in npm: https://www.npmjs.com/package/react-native-image-picker See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4a195346..4ff2b9253 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17648,9 +17648,9 @@ "from": "git+https://github.com/BlueWallet/react-native-idle-timer.git#8587876d68ab5920e79619726aeca9e672beaf2b" }, "react-native-image-picker": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-3.3.4.tgz", - "integrity": "sha512-XKQ1xCEKL77foV0gi4Jyv0kqekE//DX7FhoYwOTLH4T44myVBQllrVGedBYMNBfjvRfeqFz4DQ6MgvGQUqaLbg==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-3.5.0.tgz", + "integrity": "sha512-i3vr3cM/nu+FbpDpW+msxKX5dvFCMo0DIvHgDGxD9r43KgEDHcROavjQSAXjul/WDfMA2dqlR6gqi1AM8JLkvA==" }, "react-native-inappbrowser-reborn": { "version": "git+https://github.com/BlueWallet/react-native-inappbrowser.git#fa2d8e1763e46dd12a7e53081e97a0f908049103", diff --git a/package.json b/package.json index 435c91562..287af242d 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "react-native-handoff": "https://github.com/marcosrdz/react-native-handoff#f5becc63f3e36bf2da1ed1fc60fc690323e73602", "react-native-haptic-feedback": "1.11.0", "react-native-idle-timer": "https://github.com/BlueWallet/react-native-idle-timer#8587876d68ab5920e79619726aeca9e672beaf2b", - "react-native-image-picker": "3.3.4", + "react-native-image-picker": "3.5.0", "react-native-inappbrowser-reborn": "https://github.com/BlueWallet/react-native-inappbrowser#fa2d8e1763e46dd12a7e53081e97a0f908049103", "react-native-is-catalyst": "https://github.com/BlueWallet/react-native-is-catalyst#v1.0.0", "react-native-level-fs": "3.0.1", From 9570a292ff0278f660c2e3c9e304084745c6ef01 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 21 May 2021 23:31:30 +0000 Subject: [PATCH 073/327] fix: upgrade lottie-ios from 3.1.9 to 3.2.2 Snyk has created this PR to upgrade lottie-ios from 3.1.9 to 3.2.2. See this package in npm: https://www.npmjs.com/package/lottie-ios See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4ff2b9253..54fb3c57b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14772,9 +14772,9 @@ } }, "lottie-ios": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/lottie-ios/-/lottie-ios-3.1.9.tgz", - "integrity": "sha512-iB/jtMQiZnhNvPiQOkyRU3h8y+SKsIL8bqo8aAC9wTv2YStXSInmCPLw3JbIFy0HqW6YPwEFbqgFjtgo9vAHUg==" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/lottie-ios/-/lottie-ios-3.2.2.tgz", + "integrity": "sha512-buYj/HbzoTeqiVy+Hpzfd2STdRW7RJnne+09z48nVvBYO+ioG5B5EvRb92pYOoRDNr0stQpfurzK1uFXW4gGCA==" }, "lottie-react-native": { "version": "4.0.2", diff --git a/package.json b/package.json index 287af242d..edf847cd1 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "events": "1.1.1", "frisbee": "3.1.4", "junderw-crc32c": "1.2.0", - "lottie-ios": "3.1.9", + "lottie-ios": "3.2.2", "lottie-react-native": "4.0.2", "metro-react-native-babel-preset": "0.66.0", "path-browserify": "1.0.1", From f4a187d9e62016696a0637253b61830ad4235102 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Fri, 21 May 2021 23:36:34 -0400 Subject: [PATCH 074/327] =?UTF-8?q?FIX:=20=20RTL=20on=20iOS=20doesn?= =?UTF-8?q?=E2=80=99t=20work=20#3122?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BlueComponents.js | 66 +++++++++++++++++++++++++++++++---- components/WalletsCarousel.js | 17 ++++----- screen/wallets/details.js | 4 +++ screen/wallets/list.js | 4 ++- 4 files changed, 75 insertions(+), 16 deletions(-) diff --git a/BlueComponents.js b/BlueComponents.js index ed99458d0..c1de1fc09 100644 --- a/BlueComponents.js +++ b/BlueComponents.js @@ -146,8 +146,19 @@ export const BitcoinButton = props => { - {loc.wallets.add_bitcoin} - {loc.wallets.add_bitcoin_explain} + + {loc.wallets.add_bitcoin} + + + {loc.wallets.add_bitcoin_explain} + @@ -176,8 +187,24 @@ export const VaultButton = props => { - {loc.multisig.multisig_vault} - + + {loc.multisig.multisig_vault} + + {loc.multisig.multisig_vault_explain} @@ -209,8 +236,21 @@ export const LightningButton = props => { - {loc.wallets.add_lightning} - {loc.wallets.add_lightning_explain} + + {loc.wallets.add_lightning} + + + {loc.wallets.add_lightning_explain} + @@ -596,7 +636,9 @@ export const BlueText = props => { {...props} style={{ color: colors.foregroundColor, + ...props.style, + writingDirection: I18nManager.isRTL ? 'rtl' : 'ltr', }} /> ); @@ -670,7 +712,17 @@ export const BlueListItem = React.memo(props => { export const BlueFormLabel = props => { const { colors } = useTheme(); - return ; + return ( + + ); }; export const BlueFormInput = props => { diff --git a/components/WalletsCarousel.js b/components/WalletsCarousel.js index 1299d3435..180f4aa5d 100644 --- a/components/WalletsCarousel.js +++ b/components/WalletsCarousel.js @@ -26,7 +26,7 @@ import { BlueStorageContext } from '../blue_modules/storage-context'; const nStyles = StyleSheet.create({ root: { marginVertical: 17, - paddingRight: 10, + paddingLeft: 16, }, container: { paddingHorizontal: 24, @@ -77,7 +77,7 @@ NewWalletPanel.propTypes = { const iStyles = StyleSheet.create({ root: { - paddingRight: 10, + paddingLeft: 16, marginVertical: 17, }, grad: { @@ -287,8 +287,9 @@ const cStyles = StyleSheet.create({ }, content: { left: 16, - flexDirection: I18nManager.isRTL ? 'row-reverse' : 'row', - }, + flexDirection: I18nManager.isRTL && Platform.OS === 'android' ? 'row-reverse' : 'row', + +} }); const WalletsCarousel = forwardRef((props, ref) => { @@ -342,12 +343,12 @@ const WalletsCarousel = forwardRef((props, ref) => { sliderHeight={sliderHeight} itemWidth={itemWidth} inactiveSlideScale={1} - inactiveSlideOpacity={I18nManager.isRTL ? 1.0 : 0.7} + inactiveSlideOpacity={I18nManager.isRTL && Platform.OS === 'android' ? 1.0 : 0.7} activeSlideAlignment="start" - initialNumToRender={10} - inverted={I18nManager.isRTL && Platform.OS === 'android'} - onLayout={onLayout} contentContainerCustomStyle={cStyles.content} + + initialNumToRender={10} + onLayout={onLayout} {...props} /> diff --git a/screen/wallets/details.js b/screen/wallets/details.js index eb26b0d8d..bee6f793c 100644 --- a/screen/wallets/details.js +++ b/screen/wallets/details.js @@ -17,6 +17,7 @@ import { PermissionsAndroid, InteractionManager, ActivityIndicator, + I18nManager, } from 'react-native'; import { BlueCard, BlueLoading, BlueSpacing10, BlueSpacing20, BlueText, SecondButton, BlueListItem } from '../../BlueComponents'; import navigationStyle from '../../components/navigationStyle'; @@ -64,11 +65,13 @@ const styles = StyleSheet.create({ fontWeight: '500', fontSize: 14, marginVertical: 12, + writingDirection: I18nManager.isRTL ? 'rtl' : 'ltr', }, textLabel2: { fontWeight: '500', fontSize: 14, marginVertical: 16, + writingDirection: I18nManager.isRTL ? 'rtl' : 'ltr', }, textValue: { fontWeight: '500', @@ -88,6 +91,7 @@ const styles = StyleSheet.create({ marginHorizontal: 8, minHeight: 33, color: '#81868e', + writingDirection: I18nManager.isRTL ? 'rtl' : 'ltr', }, hardware: { flexDirection: 'row', diff --git a/screen/wallets/list.js b/screen/wallets/list.js index 64995720b..6314c2003 100644 --- a/screen/wallets/list.js +++ b/screen/wallets/list.js @@ -89,7 +89,7 @@ const WalletsList = () => { useEffect(() => { const allWallets = wallets.concat(pendingWallets); - const newCarouselData = I18nManager.isRTL && Platform.OS !== 'android' ? [false].concat(allWallets) : allWallets.concat(false); + const newCarouselData = allWallets.concat(false); setCarouselData(newCarouselData); // eslint-disable-next-line react-hooks/exhaustive-deps }, [wallets, pendingWallets]); @@ -522,10 +522,12 @@ const styles = StyleSheet.create({ ltTextBig: { fontSize: 16, fontWeight: '600', + writingDirection: I18nManager.isRTL ? 'rtl' : 'ltr', }, ltTextSmall: { fontSize: 13, fontWeight: '500', + writingDirection: I18nManager.isRTL ? 'rtl' : 'ltr', }, footerRoot: { top: 80, From eb5ee5883751b13bf7a1a9998d6036613d986f51 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Fri, 21 May 2021 23:56:57 -0400 Subject: [PATCH 075/327] FIX: No scroll in android sim on receive #3192 --- screen/receive/details.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/screen/receive/details.js b/screen/receive/details.js index 5488bebac..9edcfd9b2 100644 --- a/screen/receive/details.js +++ b/screen/receive/details.js @@ -89,21 +89,20 @@ const ReceiveDetails = () => { }, qrCodeContainer: { borderWidth: 6, borderRadius: 8, borderColor: '#FFFFFF' }, root: { - flex: 1, + flexGrow: 1, backgroundColor: colors.elevated, justifyContent: 'space-between', }, scrollBody: { - flexGrow: 3, marginTop: 32, + flexGrow: 1, alignItems: 'center', paddingHorizontal: 16, }, share: { - justifyContent: 'center', + justifyContent: 'flex-end', paddingVertical: 16, alignItems: 'center', - flexGrow: 1, marginBottom: 8, }, link: { From 98231b91b93381d8b5bb039ac10fc88cbe7c3124 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 22 May 2021 00:44:08 -0400 Subject: [PATCH 076/327] ADD: Abbreviated Price display --- .../ComplicationController.swift | 16 +++++++----- .../Widgets/Shared/WidgetDataStore.swift | 25 ++++++++++++++++--- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/ios/BlueWalletWatch Extension/ComplicationController.swift b/ios/BlueWalletWatch Extension/ComplicationController.swift index 4b485b77b..704b388fe 100644 --- a/ios/BlueWalletWatch Extension/ComplicationController.swift +++ b/ios/BlueWalletWatch Extension/ComplicationController.swift @@ -39,12 +39,14 @@ class ComplicationController: NSObject, CLKComplicationDataSource { let entry: CLKComplicationTimelineEntry let date: Date let valueLabel: String + let valueSmallLabel: String let currencySymbol: String let timeLabel: String - if let price = marketData?.formattedRateForComplication, let marketDatadata = marketData?.date, let lastUpdated = marketData?.formattedDate { + if let price = marketData?.formattedRateForComplication, let priceAbbreviated = marketData?.formattedRateForSmallComplication, let marketDatadata = marketData?.date, let lastUpdated = marketData?.formattedDate { date = marketDatadata valueLabel = price timeLabel = lastUpdated + valueSmallLabel = priceAbbreviated if let preferredFiatCurrency = UserDefaults.standard.string(forKey: "preferredFiatCurrency"), let preferredFiatUnit = fiatUnit(currency: preferredFiatCurrency) { currencySymbol = preferredFiatUnit.symbol } else { @@ -53,24 +55,26 @@ class ComplicationController: NSObject, CLKComplicationDataSource { } else { valueLabel = "--" timeLabel = "--" + valueSmallLabel = "--" currencySymbol = fiatUnit(currency: "USD")!.symbol date = Date() } let line1Text = CLKSimpleTextProvider(text:valueLabel) let line2Text = CLKSimpleTextProvider(text:currencySymbol) + let line1SmallText = CLKSimpleTextProvider(text: valueSmallLabel) switch complication.family { case .circularSmall: let template = CLKComplicationTemplateCircularSmallStackText() - template.line1TextProvider = line1Text + template.line1TextProvider = line1SmallText template.line2TextProvider = line2Text entry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template) handler(entry) case .utilitarianSmallFlat: let template = CLKComplicationTemplateUtilitarianSmallFlat() if #available(watchOSApplicationExtension 6.0, *) { - template.textProvider = CLKTextProvider(format: "%@%@", currencySymbol, valueLabel) + template.textProvider = CLKTextProvider(format: "%@%@", currencySymbol, valueSmallLabel) } else { handler(nil) } @@ -94,14 +98,14 @@ class ComplicationController: NSObject, CLKComplicationDataSource { } case .modularSmall: let template = CLKComplicationTemplateModularSmallStackText() - template.line1TextProvider = line1Text + template.line1TextProvider = line1SmallText template.line2TextProvider = line2Text entry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template) handler(entry) case .graphicCorner: let template = CLKComplicationTemplateGraphicCornerStackText() if #available(watchOSApplicationExtension 6.0, *) { - template.outerTextProvider = CLKTextProvider(format: "%@", valueLabel) + template.outerTextProvider = CLKTextProvider(format: "%@", valueSmallLabel) template.innerTextProvider = CLKTextProvider(format: "%@", currencySymbol) } else { handler(nil) @@ -111,7 +115,7 @@ class ComplicationController: NSObject, CLKComplicationDataSource { case .graphicBezel: let template = CLKComplicationTemplateGraphicBezelCircularText() if #available(watchOSApplicationExtension 6.0, *) { - template.textProvider = CLKTextProvider(format: "%@%@", currencySymbol, valueLabel) + template.textProvider = CLKTextProvider(format: "%@%@", currencySymbol, valueSmallLabel) let imageProvider = CLKFullColorImageProvider(fullColorImage: UIImage(named: "Complication/Graphic Bezel")!) let circularTemplate = CLKComplicationTemplateGraphicCircularImage() circularTemplate.imageProvider = imageProvider diff --git a/ios/WalletInformationWidget/Widgets/Shared/WidgetDataStore.swift b/ios/WalletInformationWidget/Widgets/Shared/WidgetDataStore.swift index c332ea98b..1305f87d0 100644 --- a/ios/WalletInformationWidget/Widgets/Shared/WidgetDataStore.swift +++ b/ios/WalletInformationWidget/Widgets/Shared/WidgetDataStore.swift @@ -8,6 +8,23 @@ import Foundation +extension Numeric { + + var abbreviated: String { + let bytecountFormatter = ByteCountFormatter() + bytecountFormatter.zeroPadsFractionDigits = true + bytecountFormatter.countStyle = .decimal + bytecountFormatter.allowsNonnumericFormatting = true + let bytesString = bytecountFormatter.string(fromByteCount: (self as! NSNumber).int64Value) + + let numericString = bytesString + .replacingOccurrences(of: "bytes", with: "") + .replacingOccurrences(of: "B", with: "") // removes B (bytes) in 'KB'/'MB'/'GB' + .replacingOccurrences(of: "G", with: "B") // replace G (Giga) to just B (billions) + return numericString.replacingOccurrences(of: " ", with: "") + } +} + struct WidgetDataStore: Codable { let rate: String let lastUpdate: String @@ -23,19 +40,21 @@ struct WidgetDataStore: Codable { } return rate } + var formattedRateForSmallComplication: String? { + return rateDouble.abbreviated + } + var formattedRateForComplication: String? { let numberFormatter = NumberFormatter() numberFormatter.locale = Locale(identifier: WidgetAPI.getUserPreferredCurrencyLocale()) numberFormatter.numberStyle = .currency - numberFormatter.usesSignificantDigits = true - numberFormatter.maximumFractionDigits = 0 - numberFormatter.minimumFractionDigits = 0 numberFormatter.currencySymbol = "" if let rateString = numberFormatter.string(from: NSNumber(value: rateDouble)) { return rateString } return rate } + var date: Date? { let isoDateFormatter = ISO8601DateFormatter() let dateFormatter = DateFormatter() From a11c39be85c3b72762de21b0d1bcdcc8e5a03d83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Fri, 21 May 2021 23:57:50 -0400 Subject: [PATCH 077/327] Revert "[Snyk] Upgrade lottie-ios from 3.1.9 to 3.2.2" --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 54fb3c57b..4ff2b9253 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14772,9 +14772,9 @@ } }, "lottie-ios": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/lottie-ios/-/lottie-ios-3.2.2.tgz", - "integrity": "sha512-buYj/HbzoTeqiVy+Hpzfd2STdRW7RJnne+09z48nVvBYO+ioG5B5EvRb92pYOoRDNr0stQpfurzK1uFXW4gGCA==" + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/lottie-ios/-/lottie-ios-3.1.9.tgz", + "integrity": "sha512-iB/jtMQiZnhNvPiQOkyRU3h8y+SKsIL8bqo8aAC9wTv2YStXSInmCPLw3JbIFy0HqW6YPwEFbqgFjtgo9vAHUg==" }, "lottie-react-native": { "version": "4.0.2", diff --git a/package.json b/package.json index edf847cd1..287af242d 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "events": "1.1.1", "frisbee": "3.1.4", "junderw-crc32c": "1.2.0", - "lottie-ios": "3.2.2", + "lottie-ios": "3.1.9", "lottie-react-native": "4.0.2", "metro-react-native-babel-preset": "0.66.0", "path-browserify": "1.0.1", From e97e2533a1bcff8268013e9ee38cb37d7f3e59d8 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 21 May 2021 23:31:34 +0000 Subject: [PATCH 078/327] fix: upgrade react-native-randombytes from 3.6.0 to 3.6.1 Snyk has created this PR to upgrade react-native-randombytes from 3.6.0 to 3.6.1. See this package in npm: https://www.npmjs.com/package/react-native-randombytes See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4ff2b9253..4bfeeb476 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17746,9 +17746,9 @@ "integrity": "sha512-Vz13a0+NV0mzCh/29tNt0qDzWPh8i2srTQW8eCSzGFDArnVm1COTOhTD0FY0hWHlxRY0ahvX+BlezTDvsyAuMA==" }, "react-native-randombytes": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/react-native-randombytes/-/react-native-randombytes-3.6.0.tgz", - "integrity": "sha512-ZUhqoHuJ51Fv/u74/1zt9/vz7Obu0q7BJ5sZ8j/pthHwRJu2B9Q9J+2R8/Gozkdli8QVed6bMH4kkeVG9xzEag==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/react-native-randombytes/-/react-native-randombytes-3.6.1.tgz", + "integrity": "sha512-qxkwMbOZ0Hff1V7VqpaWrR6ItkA+oF6bnI79Qp9F3Tk8WBsdKDi6m1mi3dEdFWePoRLrhJ2L03rU0yabst1tVw==", "requires": { "buffer": "^4.9.1", "sjcl": "^1.0.3" diff --git a/package.json b/package.json index 287af242d..a4c21c1cd 100644 --- a/package.json +++ b/package.json @@ -153,7 +153,7 @@ "react-native-push-notification": "5.1.1", "react-native-qrcode-svg": "6.1.1", "react-native-quick-actions": "0.3.13", - "react-native-randombytes": "3.6.0", + "react-native-randombytes": "3.6.1", "react-native-rate": "1.2.4", "react-native-reanimated": "2.1.0", "react-native-safe-area-context": "3.2.0", From b60c3ab7f3a165eae7d75d4cedc7c6a80d571136 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 22 May 2021 11:39:05 -0400 Subject: [PATCH 079/327] Update Podfile.lock --- ios/Podfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 400c09a17..73992e3ed 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -274,11 +274,11 @@ PODS: - React - react-native-idle-timer (2.1.6): - React-Core - - react-native-image-picker (3.3.4): + - react-native-image-picker (3.5.0): - React-Core - react-native-is-catalyst (1.0.0): - React - - react-native-randombytes (3.6.0): + - react-native-randombytes (3.6.1): - React-Core - react-native-safe-area-context (3.2.0): - React-Core @@ -739,9 +739,9 @@ SPEC CHECKSUMS: react-native-document-picker: c5752781fbc0c126c627c1549b037c139444a4cf react-native-fingerprint-scanner: c68136ca57e3704d7bdf5faa554ea535ce15b1d0 react-native-idle-timer: 97b8283237d45146a7a5c25bdebe9e1e85f3687b - react-native-image-picker: 4436d2ae609d1fc5b6426133755fc8d468347b61 + react-native-image-picker: 189e8d3653b00442cb790bce09a283edaf8e02b6 react-native-is-catalyst: 52ee70e0123c82419dd4ce47dc4cc94b22467512 - react-native-randombytes: 45ae693012df24c9a07a5e578b3b567c01468581 + react-native-randombytes: 5fc412efe7b5c55b9002c0004d75fe5fabcaa507 react-native-safe-area-context: e471852c5ed67eea4b10c5d9d43c1cebae3b231d react-native-tcp-socket: 96a4f104cdcc9c6621aafe92937f163d88447c5b react-native-tor: 4f389f5719dad633542b57ea32744e954730e7ef From ecd6e6a3f4b9491042d61ebcf32887d84f00c72c Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 22 May 2021 18:58:29 -0400 Subject: [PATCH 080/327] OPS: Update secure keystore git hash --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4bfeeb476..e9c5c440f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17834,8 +17834,8 @@ "integrity": "sha512-r5WZLpmx2hHjC1RgMdPq5YpSU9tEhBpUaZ5M1SUtNIONyiLqQVxabhRCINdebIk4depJiIl7yw2Q85zJyeX6fw==" }, "react-native-secure-key-store": { - "version": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#4828fd1a67d12e4c0e21eee0bee673fde75e6f9a", - "from": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#4828fd1a67d12e4c0e21eee0bee673fde75e6f9a" + "version": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#63ab38c9d382a819844a086a69cc204c46aa93f9", + "from": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#63ab38c9d382a819844a086a69cc204c46aa93f9" }, "react-native-share": { "version": "6.0.0", diff --git a/package.json b/package.json index a4c21c1cd..bbecfda78 100644 --- a/package.json +++ b/package.json @@ -158,7 +158,7 @@ "react-native-reanimated": "2.1.0", "react-native-safe-area-context": "3.2.0", "react-native-screens": "2.18.1", - "react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#4828fd1a67d12e4c0e21eee0bee673fde75e6f9a", + "react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#63ab38c9d382a819844a086a69cc204c46aa93f9", "react-native-share": "6.0.0", "react-native-snap-carousel": "3.9.1", "react-native-sortable-list": "0.0.24", From 24e975d3cac2aafce2807524f49453c750fd3834 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 23 May 2021 01:38:52 +0000 Subject: [PATCH 081/327] fix: upgrade react-localization from 1.0.16 to 1.0.17 Snyk has created this PR to upgrade react-localization from 1.0.16 to 1.0.17. See this package in npm: https://www.npmjs.com/package/react-localization See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index e9c5c440f..1e844ca84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17176,9 +17176,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-localization": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/react-localization/-/react-localization-1.0.16.tgz", - "integrity": "sha512-frk4jYgnA1fNdRczVh5TSFWW1f4JaPo9Zz2IBAeQPYb5MKkujSMsqt/nj1nHTTBrOoEgWmrRn3V6OttLqOW90w==", + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/react-localization/-/react-localization-1.0.17.tgz", + "integrity": "sha512-UowuLAvnEPXJgzxjDX/9hKdKYvtUgC6hQ5PV0CnT5f/77tItIUru5tTwgrDY2UL5oUK3JRMgz42tqnAU2W5eoA==", "requires": { "localized-strings": "^0.2.0" } diff --git a/package.json b/package.json index bbecfda78..d9efca0ce 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "process": "0.11.10", "prop-types": "15.7.2", "react": "16.13.1", - "react-localization": "1.0.16", + "react-localization": "1.0.17", "react-native": "0.63.4", "react-native-blue-crypto": "https://github.com/BlueWallet/react-native-blue-crypto", "react-native-camera": "3.43.6", From cc07f536f0cf76ff37e16be6a1845b958fa10da6 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sun, 23 May 2021 11:24:07 -0400 Subject: [PATCH 082/327] FIX: LNURLPay was defaulting to sats --- screen/lnd/lnurlPay.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/screen/lnd/lnurlPay.js b/screen/lnd/lnurlPay.js index df8d6095d..d3ea8b95c 100644 --- a/screen/lnd/lnurlPay.js +++ b/screen/lnd/lnurlPay.js @@ -41,6 +41,7 @@ export default class LnurlPay extends Component { fromWallet, lnurl, payButtonDisabled: false, + unit: fromWallet.getPreferredBalanceUnit(), }; } @@ -52,7 +53,6 @@ export default class LnurlPay extends Component { payload, amount: payload.min, isLoading: false, - unit: BitcoinUnit.SATS, LN, }); } From 6ebd930af97318ab491bf92a99208ac0e3657aa3 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Mon, 24 May 2021 01:57:06 +0000 Subject: [PATCH 083/327] fix: upgrade react-native-share from 6.0.0 to 6.0.1 Snyk has created this PR to upgrade react-native-share from 6.0.0 to 6.0.1. See this package in npm: https://www.npmjs.com/package/react-native-share See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1e844ca84..bf6e983fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17838,9 +17838,9 @@ "from": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#63ab38c9d382a819844a086a69cc204c46aa93f9" }, "react-native-share": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-6.0.0.tgz", - "integrity": "sha512-6mNDXKt5/d8pQbl56EmxzXSTsW4g/6zwXt8/YfzJL4WFx/Go5YEaKbb/PYyD2XLv2UU8CPEa2bHpnzwLmUnMDg==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-6.0.1.tgz", + "integrity": "sha512-K7mw2ep4cg++K6GUab32Kic3DeDUveonsQhTElwb6pZyjp0R/TLGQ11+pxcZBVlTiZhdOttyrLdCA6TsMX1lzg==" }, "react-native-snap-carousel": { "version": "3.9.1", diff --git a/package.json b/package.json index d9efca0ce..df9985b04 100644 --- a/package.json +++ b/package.json @@ -159,7 +159,7 @@ "react-native-safe-area-context": "3.2.0", "react-native-screens": "2.18.1", "react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#63ab38c9d382a819844a086a69cc204c46aa93f9", - "react-native-share": "6.0.0", + "react-native-share": "6.0.1", "react-native-snap-carousel": "3.9.1", "react-native-sortable-list": "0.0.24", "react-native-svg": "12.1.1", From 4911dc4bb1696e3b8b5d5cf09ad157dce84a461b Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Mon, 24 May 2021 01:57:09 +0000 Subject: [PATCH 084/327] fix: upgrade react-native-webview from 11.4.2 to 11.4.3 Snyk has created this PR to upgrade react-native-webview from 11.4.2 to 11.4.3. See this package in npm: https://www.npmjs.com/package/react-native-webview See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1e844ca84..0c563ad5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18074,9 +18074,9 @@ } }, "react-native-webview": { - "version": "11.4.2", - "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.4.2.tgz", - "integrity": "sha512-reGWtlFCQCgZEROy0IJaI5iMhrhFzedNIFlj0d6eo0K6T91eeKaoDr24ebBvqmeemOCj0ZYtzX19qiInRznhLA==", + "version": "11.4.3", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.4.3.tgz", + "integrity": "sha512-bC6r7vbukC1QYbG2vTmif8/gt6jzlGA7WK7zeVLt8ysZJvBNtoHtT2k7EoMgJIW6/6DTy1rrn6uZS4v2Fa4exQ==", "requires": { "escape-string-regexp": "2.0.0", "invariant": "2.2.4" diff --git a/package.json b/package.json index d9efca0ce..c6631e7e0 100644 --- a/package.json +++ b/package.json @@ -168,7 +168,7 @@ "react-native-tor": "0.1.7", "react-native-vector-icons": "7.1.0", "react-native-watch-connectivity": "1.0.3", - "react-native-webview": "11.4.2", + "react-native-webview": "11.4.3", "react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#e2e9a9038b76d096bf929a87105a97a0a7095001", "react-test-render": "1.1.2", "readable-stream": "3.6.0", From 7f54df279dc51c56dfa93bbbab4870541c8179a7 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 25 May 2021 01:16:57 +0000 Subject: [PATCH 085/327] fix: upgrade rn-nodeify from 10.2.0 to 10.3.0 Snyk has created this PR to upgrade rn-nodeify from 10.2.0 to 10.3.0. See this package in npm: https://www.npmjs.com/package/rn-nodeify See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index de44d4cc0..14c074840 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18596,9 +18596,9 @@ } }, "rn-nodeify": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/rn-nodeify/-/rn-nodeify-10.2.0.tgz", - "integrity": "sha512-mPNe2vNR14UTwAbpebI9fXn9HAU37vebyZDCqZOK6G5GBEUiMCANIVa7zgc9aJ1JeziLUGLR9c+H9/BSbVdd4Q==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/rn-nodeify/-/rn-nodeify-10.3.0.tgz", + "integrity": "sha512-EZB3M4M5i8yySCWF7AAZ31xU7cpdLuIKMlVxXji9t0aY8Ojy3BAyRt1sTp0OwBgy1ejShmlIu2L4f8mToJ+uvg==", "requires": { "@yarnpkg/lockfile": "^1.0.0", "deep-equal": "^1.0.0", diff --git a/package.json b/package.json index 32a686a01..41bb4d0a9 100644 --- a/package.json +++ b/package.json @@ -173,7 +173,7 @@ "react-test-render": "1.1.2", "readable-stream": "3.6.0", "realm": "10.2.0", - "rn-nodeify": "10.2.0", + "rn-nodeify": "10.3.0", "scryptsy": "file:blue_modules/scryptsy", "secure-random": "1.1.2", "slip39": "file:blue_modules/slip39", From 7cccc456db66d96266700a9c3d07aca86850dc6b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 May 2021 10:00:16 +0000 Subject: [PATCH 086/327] build(deps): bump browserslist in /blue_modules/slip39 Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.16.4 to 4.16.6. - [Release notes](https://github.com/browserslist/browserslist/releases) - [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md) - [Commits](https://github.com/browserslist/browserslist/compare/4.16.4...4.16.6) Signed-off-by: dependabot[bot] --- blue_modules/slip39/package-lock.json | 36 ++++++++++++++------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/blue_modules/slip39/package-lock.json b/blue_modules/slip39/package-lock.json index aab5f8bae..4c63ed259 100644 --- a/blue_modules/slip39/package-lock.json +++ b/blue_modules/slip39/package-lock.json @@ -576,16 +576,30 @@ "dev": true }, "browserslist": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.4.tgz", - "integrity": "sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001208", + "caniuse-lite": "^1.0.30001219", "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.712", + "electron-to-chromium": "^1.3.723", "escalade": "^3.1.1", "node-releases": "^1.1.71" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001228", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", + "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.737", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.737.tgz", + "integrity": "sha512-P/B84AgUSQXaum7a8m11HUsYL8tj9h/Pt5f7Hg7Ty6bm5DxlFq+e5+ouHUoNQMsKDJ7u4yGfI8mOErCmSH9wyg==", + "dev": true + } } }, "cache-base": { @@ -622,12 +636,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "caniuse-lite": { - "version": "1.0.30001208", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz", - "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1016,12 +1024,6 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "electron-to-chromium": { - "version": "1.3.713", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.713.tgz", - "integrity": "sha512-HWgkyX4xTHmxcWWlvv7a87RHSINEcpKYZmDMxkUlHcY+CJcfx7xEfBHuXVsO1rzyYs1WQJ7EgDp2CoErakBIow==", - "dev": true - }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", From f00c5b4488e068b7185dd8fb25bbe51199836183 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Mon, 24 May 2021 13:16:03 +0100 Subject: [PATCH 087/327] REF: storage improvements --- BlueApp.js | 6 +- class/app-storage.js | 222 +++++++++++++++++++++++++++++++------------ package-lock.json | 5 + package.json | 1 + tests/setup.js | 1 + 5 files changed, 170 insertions(+), 65 deletions(-) diff --git a/BlueApp.js b/BlueApp.js index 26a80c414..e167e00f1 100644 --- a/BlueApp.js +++ b/BlueApp.js @@ -29,7 +29,7 @@ const startAndDecrypt = async retry => { } catch (error) { // in case of exception reading from keystore, lets retry instead of assuming there is no storage and // proceeding with no wallets - console.warn(error); + console.warn('exception loading from disk:', error); wasException = true; } @@ -38,7 +38,9 @@ const startAndDecrypt = async retry => { try { await new Promise(resolve => setTimeout(resolve, 3000)); // sleep success = await BlueApp.loadFromDisk(password); - } catch (_) {} + } catch (error) { + console.warn('second exception loading from disk:', error); + } } if (success) { diff --git a/class/app-storage.js b/class/app-storage.js index 840a14912..ecdbe4b0a 100644 --- a/class/app-storage.js +++ b/class/app-storage.js @@ -1,6 +1,7 @@ /* global alert */ import AsyncStorage from '@react-native-async-storage/async-storage'; import RNSecureKeyStore, { ACCESSIBLE } from 'react-native-secure-key-store'; +import * as Keychain from 'react-native-keychain'; import { HDLegacyBreadwalletWallet, HDSegwitP2SHWallet, @@ -20,10 +21,12 @@ import { SLIP39LegacyP2PKHWallet, SLIP39SegwitBech32Wallet, } from './'; +import { randomBytes } from './rng'; const encryption = require('../blue_modules/encryption'); const Realm = require('realm'); const createHash = require('create-hash'); let usedBucketNum = false; +let savingInProgress = 0; // its both a flag and a counter of attempts to write to disk export class AppStorage { static FLAG_ENCRYPTED = 'data_encrypted'; @@ -88,11 +91,36 @@ export class AppStorage { } }; + /** + * @throws Error + * @param key {string} + * @returns {Promise<*>|null} + */ + getItemWithFallbackToRealm = async key => { + let value; + try { + return await this.getItem(key); + } catch (error) { + console.warn('error reading', key, error.message); + console.warn('fallback to realm'); + const realmKeyValue = await this.openRealmKeyValue(); + const obj = realmKeyValue.objectForPrimaryKey('KeyValue', key); // search for a realm object with a primary key + value = obj?.value; + realmKeyValue.close(); + if (value) { + console.warn('successfully recovered', value.length, 'bytes from realm for key', key); + return value; + } + return null; + } + }; + storageIsEncrypted = async () => { let data; try { - data = await this.getItem(AppStorage.FLAG_ENCRYPTED); + data = await this.getItemWithFallbackToRealm(AppStorage.FLAG_ENCRYPTED); } catch (error) { + console.warn('error reading `' + AppStorage.FLAG_ENCRYPTED + '` key:', error.message); return false; } @@ -220,6 +248,58 @@ export class AppStorage { }); } + /** + * Returns instace of the Realm database, which is encrypted by device unique id + * Database file is static. + * + * @returns {Promise} + */ + async openRealmKeyValue() { + const service = 'realm_encryption_key'; + let password; + const credentials = await Keychain.getGenericPassword({ service }); + if (credentials) { + password = credentials.password; + } else { + const buf = await randomBytes(64); + password = buf.toString('hex'); + await Keychain.setGenericPassword(service, password, { service }); + } + + const buf = Buffer.from(password, 'hex'); + const encryptionKey = Int8Array.from(buf); + const path = 'keyvalue.realm'; + + const schema = [ + { + name: 'KeyValue', + primaryKey: 'key', + properties: { + key: { type: 'string', indexed: true }, + value: 'string', // stringified json, or whatever + }, + }, + ]; + return Realm.open({ + schema, + path, + encryptionKey, + }); + } + + saveToRealmKeyValue(realmkeyValue, key, value) { + realmkeyValue.write(() => { + realmkeyValue.create( + 'KeyValue', + { + key: key, + value: value, + }, + Realm.UpdateMode.Modified, + ); + }); + } + /** * Loads from storage all wallets and * maps them to `this.wallets` @@ -228,7 +308,7 @@ export class AppStorage { * @returns {Promise.} */ async loadFromDisk(password) { - let data = await this.getItem('data'); + let data = await this.getItemWithFallbackToRealm('data'); if (password) { data = this.decryptData(data, password); if (data) { @@ -414,71 +494,87 @@ export class AppStorage { * @returns {Promise} Result of storage save */ async saveToDisk() { - const walletsToSave = []; - const realm = await this.getRealm(); - for (const key of this.wallets) { - if (typeof key === 'boolean' || key.type === PlaceholderWallet.type) continue; - key.prepareForSerialization(); - delete key.current; - const keyCloned = Object.assign({}, key); // stripped-down version of a wallet to save to secure keystore - if (key._hdWalletInstance) keyCloned._hdWalletInstance = Object.assign({}, key._hdWalletInstance); - this.offloadWalletToRealm(realm, key); - // stripping down: - if (key._txs_by_external_index) { - keyCloned._txs_by_external_index = {}; - keyCloned._txs_by_internal_index = {}; - } - if (key._hdWalletInstance) { - keyCloned._hdWalletInstance._txs_by_external_index = {}; - keyCloned._hdWalletInstance._txs_by_internal_index = {}; - } - walletsToSave.push(JSON.stringify({ ...keyCloned, type: keyCloned.type })); + if (savingInProgress) { + console.warn('saveToDisk is in progress'); + if (++savingInProgress > 10) alert('Critical error. Last actions were not saved'); // should never happen + await new Promise(resolve => setTimeout(resolve, 1000 * savingInProgress)); // sleep + return this.saveToDisk(); } - realm.close(); - let data = { - wallets: walletsToSave, - tx_metadata: this.tx_metadata, - }; + savingInProgress = 1; - if (this.cachedPassword) { - // should find the correct bucket, encrypt and then save - let buckets = await this.getItem('data'); - buckets = JSON.parse(buckets); - const newData = []; - let num = 0; - for (const bucket of buckets) { - let decrypted; - // if we had `usedBucketNum` during loadFromDisk(), no point to try to decode each bucket to find the one we - // need, we just to find bucket with the same index - if (usedBucketNum !== false) { - if (num === usedBucketNum) { - decrypted = true; - } - num++; - } else { - // we dont have `usedBucketNum` for whatever reason, so lets try to decrypt each bucket after bucket - // till we find the right one - decrypted = encryption.decrypt(bucket, this.cachedPassword); - } - - if (!decrypted) { - // no luck decrypting, its not our bucket - newData.push(bucket); - } else { - // decrypted ok, this is our bucket - // we serialize our object's data, encrypt it, and add it to buckets - newData.push(encryption.encrypt(JSON.stringify(data), this.cachedPassword)); - await this.setItem(AppStorage.FLAG_ENCRYPTED, '1'); - } - } - data = newData; - } else { - await this.setItem(AppStorage.FLAG_ENCRYPTED, ''); // drop the flag - } try { - return await this.setItem('data', JSON.stringify(data)); + const walletsToSave = []; + const realm = await this.getRealm(); + for (const key of this.wallets) { + if (typeof key === 'boolean' || key.type === PlaceholderWallet.type) continue; + key.prepareForSerialization(); + delete key.current; + const keyCloned = Object.assign({}, key); // stripped-down version of a wallet to save to secure keystore + if (key._hdWalletInstance) keyCloned._hdWalletInstance = Object.assign({}, key._hdWalletInstance); + this.offloadWalletToRealm(realm, key); + // stripping down: + if (key._txs_by_external_index) { + keyCloned._txs_by_external_index = {}; + keyCloned._txs_by_internal_index = {}; + } + if (key._hdWalletInstance) { + keyCloned._hdWalletInstance._txs_by_external_index = {}; + keyCloned._hdWalletInstance._txs_by_internal_index = {}; + } + walletsToSave.push(JSON.stringify({ ...keyCloned, type: keyCloned.type })); + } + realm.close(); + let data = { + wallets: walletsToSave, + tx_metadata: this.tx_metadata, + }; + + if (this.cachedPassword) { + // should find the correct bucket, encrypt and then save + let buckets = await this.getItemWithFallbackToRealm('data'); + buckets = JSON.parse(buckets); + const newData = []; + let num = 0; + for (const bucket of buckets) { + let decrypted; + // if we had `usedBucketNum` during loadFromDisk(), no point to try to decode each bucket to find the one we + // need, we just to find bucket with the same index + if (usedBucketNum !== false) { + if (num === usedBucketNum) { + decrypted = true; + } + num++; + } else { + // we dont have `usedBucketNum` for whatever reason, so lets try to decrypt each bucket after bucket + // till we find the right one + decrypted = encryption.decrypt(bucket, this.cachedPassword); + } + + if (!decrypted) { + // no luck decrypting, its not our bucket + newData.push(bucket); + } else { + // decrypted ok, this is our bucket + // we serialize our object's data, encrypt it, and add it to buckets + newData.push(encryption.encrypt(JSON.stringify(data), this.cachedPassword)); + } + } + data = newData; + } + + await this.setItem('data', JSON.stringify(data)); + await this.setItem(AppStorage.FLAG_ENCRYPTED, this.cachedPassword ? '1' : ''); + + // now, backing up same data in realm: + const realmkeyValue = await this.openRealmKeyValue(); + this.saveToRealmKeyValue(realmkeyValue, 'data', JSON.stringify(data)); + this.saveToRealmKeyValue(realmkeyValue, AppStorage.FLAG_ENCRYPTED, this.cachedPassword ? '1' : ''); + realmkeyValue.close(); } catch (error) { - alert(error.message); + console.error('save to disk exception:', error.message); + alert('save to disk exception: ' + error.message); + } finally { + savingInProgress = 0; } } diff --git a/package-lock.json b/package-lock.json index 1e844ca84..af32d6174 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17669,6 +17669,11 @@ "version": "git+https://github.com/BlueWallet/react-native-is-catalyst.git#a665155424ae5b865971f71ba2625b2c53983364", "from": "git+https://github.com/BlueWallet/react-native-is-catalyst.git#v1.0.0" }, + "react-native-keychain": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/react-native-keychain/-/react-native-keychain-7.0.0.tgz", + "integrity": "sha512-tH26sgW4OxB/llXmhO+DajFISEUoF1Ip2+WSDMIgCt8SP1xRE81m2qFzgIOc/7StYsUERxHhDPkxvq2H0/Goig==" + }, "react-native-level-fs": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/react-native-level-fs/-/react-native-level-fs-3.0.1.tgz", diff --git a/package.json b/package.json index d9efca0ce..6ec723912 100644 --- a/package.json +++ b/package.json @@ -140,6 +140,7 @@ "react-native-image-picker": "3.5.0", "react-native-inappbrowser-reborn": "https://github.com/BlueWallet/react-native-inappbrowser#fa2d8e1763e46dd12a7e53081e97a0f908049103", "react-native-is-catalyst": "https://github.com/BlueWallet/react-native-is-catalyst#v1.0.0", + "react-native-keychain": "7.0.0", "react-native-level-fs": "3.0.1", "react-native-linear-gradient": "2.5.6", "react-native-localize": "2.0.3", diff --git a/tests/setup.js b/tests/setup.js index 02a6c5846..80b753609 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -22,6 +22,7 @@ jest.mock('@sentry/react-native', () => { jest.mock('react-native-device-info', () => { return { + getUniqueId: jest.fn().mockReturnValue('uniqueId'), getSystemName: jest.fn(), hasGmsSync: jest.fn().mockReturnValue(true), hasHmsSync: jest.fn().mockReturnValue(false), From fe9096c3dfba5a922b1f8615c60e5873da7b671c Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 27 May 2021 21:45:33 +0000 Subject: [PATCH 088/327] Translate /loc/en.json in sl_SI review completed for the source file '/loc/en.json' on the 'sl_SI' language. --- loc/sl_SI.json | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/loc/sl_SI.json b/loc/sl_SI.json index 02cdc94fe..26e4d0e6e 100644 --- a/loc/sl_SI.json +++ b/loc/sl_SI.json @@ -48,7 +48,7 @@ "cont_cancel": "Preklic pogodbe", "cont_cancel_q": "Ali ste prepričani, da želite preklicati to pogodbo?", "cont_cancel_y": "Da, prekliči pogodbo", - "cont_chat": "Odprite klepet", + "cont_chat": "Odpri klepet", "cont_how": "Kako plačati", "cont_no": "Nimate aktivnih pogodb.", "cont_paid": "Označi pogodbo kot plačano", @@ -316,6 +316,8 @@ "privacy_quickactions": "Bližnjice", "privacy_quickactions_explanation": "Za ogled stanja denarnice se dotaknite in pridržite ikono aplikacije BlueWallet na domačem zaslonu.", "privacy_clipboard_explanation": "Prikaži bližnjice, če je v odložišču najden naslov ali račun.", + "privacy_do_not_track": "Onemogoči analitiko", + "privacy_do_not_track_explanation": "Informacije o zmogljivosti in zanesljivosti ne bodo poslane v analizo.", "push_notifications": "Potisna obvestila", "retype_password": "Ponovno vpišite geslo", "selfTest": "Samotestiranje", @@ -424,7 +426,7 @@ "import_imported": "Uvoženo", "import_placeholder_fail": "Uvoz denarnice", "import_placeholder_inprogress": "Uvažanje denarnice...", - "import_scan_qr": "Skenirajte ali uvozite datoteko", + "import_scan_qr": "Skeniraj ali uvozi datoteko", "import_success": "Vaša denarnica je bila uspešno uvožena.", "import_title": "Uvozi", "list_create_a_button": "Ustvarite", @@ -479,7 +481,7 @@ "how_many_signatures_can_bluewallet_make": "koliko podpisov lahko naredi BlueWallet", "signatures_required_to_spend": "Zahtevano podpisov {number}", "signatures_we_can_make": "na napravi {number}", - "scan_or_import_file": "Skenirajte ali uvozite datoteko", + "scan_or_import_file": "Skeniraj ali uvozi datoteko", "export_coordination_setup": "Izvoz koordinacijskih nastavitev", "cosign_this_transaction": "Sopodpis te transakcije?", "lets_start": "Začnimo", @@ -507,7 +509,7 @@ "not_a_multisignature_xpub": "Ta xpub ne pripada multisig denarnici!", "invalid_cosigner_format": "Nepravilen sopodpisnik: to ni sopodpisnik za {format} obliko", "create_new_key": "Ustvari novega", - "scan_or_open_file": "Skenirajte ali odprite datoteko", + "scan_or_open_file": "Skeniraj ali odpri datoteko", "i_have_mnemonics": "Za ta ključ imam seme...", "please_write_down_mnemonics": "Prosimo, zapišite si seznam besed (mnemonično seme) na list papirja. Lahko si zapišete tudi pozneje.", "i_wrote_it_down": "V redu, sem si zapisal.", From 1dcc6e695fa2be0505980980b1ac5937d4649bae Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 28 May 2021 02:25:20 +0000 Subject: [PATCH 089/327] fix: upgrade react-native-device-info from 8.1.2 to 8.1.3 Snyk has created this PR to upgrade react-native-device-info from 8.1.2 to 8.1.3. See this package in npm: https://www.npmjs.com/package/react-native-device-info See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 241a8f27e..0dbb15448 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17554,9 +17554,9 @@ "integrity": "sha512-sQDYwGEdxwKwXKP/8Intc81FyH33Rv8ZvOxdmPX4NM75RAIVeBc13pdabEqycAimNZoY5IDvGp4o1cTTa5gNrA==" }, "react-native-device-info": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-8.1.2.tgz", - "integrity": "sha512-5jaQBL42H3g8+KXkFlIy2lMyKyPPETI8eUYgEg7JylW7rltkMPngn/wDnupgP4NhDYI+fBdMRGdRjEeetFr0IQ==" + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-8.1.3.tgz", + "integrity": "sha512-73e3wiGFL8DvIXEd8x4Aq+mO8mZvHARwfYorIEu+X0trLHY92bP5Ict8DJHDjCQ0+HtAvpA4Wda2VoUVN1zh6Q==" }, "react-native-document-picker": { "version": "git+https://github.com/BlueWallet/react-native-document-picker.git#3684d4fcc2bc0b47c32be39024e4796004c3e428", diff --git a/package.json b/package.json index c208819d2..aba23679c 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "react-native-camera": "3.43.6", "react-native-crypto": "2.2.0", "react-native-default-preference": "1.4.3", - "react-native-device-info": "8.1.2", + "react-native-device-info": "8.1.3", "react-native-document-picker": "https://github.com/BlueWallet/react-native-document-picker#3684d4fcc2bc0b47c32be39024e4796004c3e428", "react-native-elements": "2.3.2", "react-native-fingerprint-scanner": "https://github.com/BlueWallet/react-native-fingerprint-scanner#ce644673681716335d786727bab998f7e632ab5e", From 70788e2099588317de4ebb79838dbcc50d2cbc49 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 28 May 2021 23:33:04 +0000 Subject: [PATCH 090/327] fix: upgrade detox from 18.12.1 to 18.13.0 Snyk has created this PR to upgrade detox from 18.12.1 to 18.13.0. See this package in npm: https://www.npmjs.com/package/detox See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 28 +++++++++++++++++++++++++--- package.json | 2 +- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0dbb15448..9413f0af7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6765,9 +6765,9 @@ "dev": true }, "detox": { - "version": "18.12.1", - "resolved": "https://registry.npmjs.org/detox/-/detox-18.12.1.tgz", - "integrity": "sha512-XFQg6bI2XzhakQKHreMxDFJzJY2Cqvk0SazHplVl7a6QxR/9DpehhhYvMQbe0L9Ytn2ELmQob4W7Xh2s3CWEKg==", + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/detox/-/detox-18.13.0.tgz", + "integrity": "sha512-YQPhi+uUGhVXYQm4W76EyKXdDKXnxq3dO+9ua22gGhNGwiJDbV8TUOavZNMbjBKWLb+OueGKOEBp4uNGOrVANw==", "requires": { "bunyan": "^1.8.12", "bunyan-debug-stream": "^1.1.0", @@ -6783,6 +6783,7 @@ "proper-lockfile": "^3.0.2", "resolve-from": "^5.0.0", "sanitize-filename": "^1.6.1", + "semver": "^7.0.0", "serialize-error": "^8.0.1", "shell-quote": "^1.7.2", "signal-exit": "^3.0.3", @@ -6858,6 +6859,14 @@ "p-locate": "^4.1.0" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -6871,6 +6880,14 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -6904,6 +6921,11 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/package.json b/package.json index aba23679c..150b26bbc 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "coinselect": "3.1.12", "crypto-js": "4.0.0", "dayjs": "1.10.4", - "detox": "18.12.1", + "detox": "18.13.0", "ecurve": "1.0.6", "electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4", "electrum-mnemonic": "2.0.0", From 01c5dfc8898307a8da6af0f3421195e4b2059236 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 28 May 2021 23:33:08 +0000 Subject: [PATCH 091/327] fix: upgrade react-native-rate from 1.2.4 to 1.2.6 Snyk has created this PR to upgrade react-native-rate from 1.2.4 to 1.2.6. See this package in npm: https://www.npmjs.com/package/react-native-rate See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0dbb15448..14c5f3151 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17772,9 +17772,9 @@ } }, "react-native-rate": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/react-native-rate/-/react-native-rate-1.2.4.tgz", - "integrity": "sha512-lvmxu4UJ7/OfpNwww3AmTzAkKdD8z65VNguoKanRyBhrSm/IeNYLe482Vku9YodgWNkjZfl2AtJ51Sv9rhUu3A==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/react-native-rate/-/react-native-rate-1.2.6.tgz", + "integrity": "sha512-sCAwNo9DxM7TA6Dwc81WXboPu+UppXkkUiAxKuh31KF+VXbknhwKNw5sUzCaJUJ3M5PKV+WKgfYrAPoByQRVww==" }, "react-native-ratings": { "version": "7.6.1", diff --git a/package.json b/package.json index aba23679c..6a4b66ede 100644 --- a/package.json +++ b/package.json @@ -155,7 +155,7 @@ "react-native-qrcode-svg": "6.1.1", "react-native-quick-actions": "0.3.13", "react-native-randombytes": "3.6.1", - "react-native-rate": "1.2.4", + "react-native-rate": "1.2.6", "react-native-reanimated": "2.1.0", "react-native-safe-area-context": "3.2.0", "react-native-screens": "2.18.1", From e722f135780cdb958504f997ba1e58f1b473d21f Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 29 May 2021 01:44:50 -0400 Subject: [PATCH 092/327] DEL: Remove inappbrowser package. --- ios/Podfile.lock | 28 ++++++++++++++-------------- package-lock.json | 14 +++----------- package.json | 3 +-- screen/wallets/buyBitcoin.js | 23 +++++++++++++---------- 4 files changed, 31 insertions(+), 37 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 73992e3ed..cf32a2380 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -287,7 +287,7 @@ PODS: - React - react-native-tor (0.1.7): - React - - react-native-webview (11.4.2): + - react-native-webview (11.6.2): - React-Core - react-native-widget-center (0.0.4): - React @@ -366,7 +366,7 @@ PODS: - React-Core - RNDefaultPreference (1.4.3): - React - - RNDeviceInfo (8.1.2): + - RNDeviceInfo (8.1.3): - React-Core - RNFS (2.17.0): - React @@ -374,7 +374,7 @@ PODS: - React-Core - RNHandoff (0.0.3): - React - - RNInAppBrowser (3.5.1): + - RNKeychain (7.0.0): - React-Core - RNLocalize (2.0.3): - React-Core @@ -382,8 +382,8 @@ PODS: - React - RNQuickAction (0.3.13): - React - - RNRate (1.2.4): - - React + - RNRate (1.2.6): + - React-Core - RNReactNativeHapticFeedback (1.11.0): - React-Core - RNReanimated (2.1.0): @@ -422,7 +422,7 @@ PODS: - RNSentry (2.5.0-beta.1): - React-Core - Sentry (= 7.0.0) - - RNShare (6.0.0): + - RNShare (6.0.1): - React-Core - RNSVG (12.1.1): - React @@ -516,7 +516,7 @@ DEPENDENCIES: - RNFS (from `../node_modules/react-native-fs`) - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNHandoff (from `../node_modules/react-native-handoff`) - - RNInAppBrowser (from `../node_modules/react-native-inappbrowser-reborn`) + - RNKeychain (from `../node_modules/react-native-keychain`) - RNLocalize (from `../node_modules/react-native-localize`) - RNPrivacySnapshot (from `../node_modules/react-native-privacy-snapshot`) - RNQuickAction (from `../node_modules/react-native-quick-actions`) @@ -660,8 +660,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-gesture-handler" RNHandoff: :path: "../node_modules/react-native-handoff" - RNInAppBrowser: - :path: "../node_modules/react-native-inappbrowser-reborn" + RNKeychain: + :path: "../node_modules/react-native-keychain" RNLocalize: :path: "../node_modules/react-native-localize" RNPrivacySnapshot: @@ -745,7 +745,7 @@ SPEC CHECKSUMS: react-native-safe-area-context: e471852c5ed67eea4b10c5d9d43c1cebae3b231d react-native-tcp-socket: 96a4f104cdcc9c6621aafe92937f163d88447c5b react-native-tor: 4f389f5719dad633542b57ea32744e954730e7ef - react-native-webview: 90ccc4add19f940dfe6c89d30659aed8134f234d + react-native-webview: 1f56115845c98f0a59dfbbac685797c014a821be react-native-widget-center: 0f81d17beb163e7fb5848b06754d7d277fe7d99a React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336 React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b @@ -764,21 +764,21 @@ SPEC CHECKSUMS: RNCMaskedView: f127cd9652acfa31b91dcff613e07ba18b774db6 RNCPushNotificationIOS: 5b1cf9ad2aaa107ecb92d5d2d7005ba521b2b97a RNDefaultPreference: 21816c0a6f61a2829ccc0cef034392e9b509ee5f - RNDeviceInfo: 4f480456c7ac8c9919448375399c1a6f14479549 + RNDeviceInfo: 49f6d50f861c7810fac2dd9b71cfb56cc1940e14 RNFS: 93d5b5535eb39d98e6b19009faa8fe717f7ea45d RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211 RNHandoff: d3b0754cca3a6bcd9b25f544f733f7f033ccf5fa - RNInAppBrowser: 3733c1aa6699983a1c9b4963e85d5e5a48ad297e + RNKeychain: f75b8c8b2f17d3b2aa1f25b4a0ac5b83d947ff8f RNLocalize: 29e84ea169d3bca6c3b83584536c7f586a07fb98 RNPrivacySnapshot: 71919dde3c6a29dd332115409c2aec564afee8f4 RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93 - RNRate: 2b31dad120cd1b78e33c6034808561c386a3dddf + RNRate: e0af7e724e5fcf89578dbd22ab6395c85402ef29 RNReactNativeHapticFeedback: 653a8c126a0f5e88ce15ffe280b3ff37e1fbb285 RNReanimated: 70f662b5232dd5d19ccff581e919a54ea73df51c RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 RNSentry: 1868bcfe8c69b2c3b2451439a38b3ebea0a7510f - RNShare: 31fa0cedbd06c2744a78e0d2b7ba364778aa3506 + RNShare: 755de6bac084428f8fd8fb54c376f126f40e560c RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 RNWatch: e4c5d19506c94506860032fb68aedd5991beb985 diff --git a/package-lock.json b/package-lock.json index ea66907c3..22aaf6082 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17674,14 +17674,6 @@ "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-3.5.0.tgz", "integrity": "sha512-i3vr3cM/nu+FbpDpW+msxKX5dvFCMo0DIvHgDGxD9r43KgEDHcROavjQSAXjul/WDfMA2dqlR6gqi1AM8JLkvA==" }, - "react-native-inappbrowser-reborn": { - "version": "git+https://github.com/BlueWallet/react-native-inappbrowser.git#fa2d8e1763e46dd12a7e53081e97a0f908049103", - "from": "git+https://github.com/BlueWallet/react-native-inappbrowser.git#fa2d8e1763e46dd12a7e53081e97a0f908049103", - "requires": { - "invariant": "^2.2.4", - "opencollective-postinstall": "^2.0.2" - } - }, "react-native-iphone-x-helper": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz", @@ -18101,9 +18093,9 @@ } }, "react-native-webview": { - "version": "11.4.3", - "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.4.3.tgz", - "integrity": "sha512-bC6r7vbukC1QYbG2vTmif8/gt6jzlGA7WK7zeVLt8ysZJvBNtoHtT2k7EoMgJIW6/6DTy1rrn6uZS4v2Fa4exQ==", + "version": "11.6.2", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.6.2.tgz", + "integrity": "sha512-7e5ltLBgqt1mX0gdTTS2nFPIjfS6y300wqJ4rLWqU71lDO+8ZeayfsF5qo83qxo2Go74CtLnSeWae4pdGwUqYw==", "requires": { "escape-string-regexp": "2.0.0", "invariant": "2.2.4" diff --git a/package.json b/package.json index 730bf10cd..f529711cf 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,6 @@ "react-native-haptic-feedback": "1.11.0", "react-native-idle-timer": "https://github.com/BlueWallet/react-native-idle-timer#8587876d68ab5920e79619726aeca9e672beaf2b", "react-native-image-picker": "3.5.0", - "react-native-inappbrowser-reborn": "https://github.com/BlueWallet/react-native-inappbrowser#fa2d8e1763e46dd12a7e53081e97a0f908049103", "react-native-is-catalyst": "https://github.com/BlueWallet/react-native-is-catalyst#v1.0.0", "react-native-keychain": "7.0.0", "react-native-level-fs": "3.0.1", @@ -169,7 +168,7 @@ "react-native-tor": "0.1.7", "react-native-vector-icons": "7.1.0", "react-native-watch-connectivity": "1.0.3", - "react-native-webview": "11.4.3", + "react-native-webview": "11.6.2", "react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#e2e9a9038b76d096bf929a87105a97a0a7095001", "react-test-render": "1.1.2", "readable-stream": "3.6.0", diff --git a/screen/wallets/buyBitcoin.js b/screen/wallets/buyBitcoin.js index 6c9cd8c71..c0ff34ba6 100644 --- a/screen/wallets/buyBitcoin.js +++ b/screen/wallets/buyBitcoin.js @@ -2,12 +2,13 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { StatusBar, Linking } from 'react-native'; import { WebView } from 'react-native-webview'; -import InAppBrowser from 'react-native-inappbrowser-reborn'; - import { BlueLoading, SafeBlueArea } from '../../BlueComponents'; import navigationStyle from '../../components/navigationStyle'; import { LightningCustodianWallet, WatchOnlyWallet } from '../../class'; import { BlueStorageContext } from '../../blue_modules/storage-context'; +import { isCatalyst } from '../../blue_modules/environment'; +import * as NavigationService from '../../NavigationService'; + const currency = require('../../blue_modules/currency'); export default class BuyBitcoin extends Component { @@ -81,7 +82,10 @@ export default class BuyBitcoin extends Component { return ( + { - const uri = await BuyBitcoin.generateURL(wallet); - InAppBrowser.isAvailable() - .then(_value => { - InAppBrowser.open(uri, { dismissButtonStyle: 'done', modalEnabled: true, animated: true }); - }) - .catch(error => { - console.log(error); - Linking.openURL(uri); + if (isCatalyst) { + const uri = await BuyBitcoin.generateURL(wallet); + Linking.openURL(uri); + } else { + NavigationService.navigate('BuyBitcoin', { + wallet, }); + } }; From 646c5a8ea05c7e3a864c42116db34391b67e4a30 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 29 May 2021 01:57:40 -0400 Subject: [PATCH 093/327] DEL: Remove isCatalyst package --- Navigation.js | 4 ++-- blue_modules/environment.js | 5 ++--- blue_modules/fs.js | 4 ++-- ios/Podfile.lock | 30 +++++++++++++-------------- package-lock.json | 4 ---- package.json | 1 - screen/send/create.js | 5 ++--- screen/send/details.js | 1 - screen/send/psbtWithHardwareWallet.js | 4 ++-- screen/settings/NetworkSettings.js | 4 ++-- screen/settings/electrumSettings.js | 4 ++-- screen/settings/lightningSettings.js | 4 ++-- screen/wallets/details.js | 4 ++-- screen/wallets/import.js | 4 ++-- screen/wallets/list.js | 10 ++++----- screen/wallets/transactions.js | 4 ++-- 16 files changed, 42 insertions(+), 50 deletions(-) diff --git a/Navigation.js b/Navigation.js index 4c250e91d..bf088a22f 100644 --- a/Navigation.js +++ b/Navigation.js @@ -80,7 +80,7 @@ import LnurlPay from './screen/lnd/lnurlPay'; import LnurlPaySuccess from './screen/lnd/lnurlPaySuccess'; import UnlockWith from './UnlockWith'; import DrawerList from './screen/wallets/drawerList'; -import { isCatalyst, isTablet } from './blue_modules/environment'; +import { isDesktop, isTablet } from './blue_modules/environment'; import SettingsPrivacy from './screen/settings/SettingsPrivacy'; import LNDViewAdditionalInvoicePreImage from './screen/lnd/lndViewAdditionalInvoicePreImage'; @@ -349,7 +349,7 @@ const Drawer = createDrawerNavigator(); function DrawerRoot() { const dimensions = useWindowDimensions(); const isLargeScreen = - Platform.OS === 'android' ? isTablet() : dimensions.width >= Dimensions.get('screen').width / 2 && (isTablet() || isCatalyst); + Platform.OS === 'android' ? isTablet() : dimensions.width >= Dimensions.get('screen').width / 2 && (isTablet() || isDesktop); const drawerStyle = { width: '0%' }; return ( diff --git a/blue_modules/environment.js b/blue_modules/environment.js index e708f0db4..f9d1aa844 100644 --- a/blue_modules/environment.js +++ b/blue_modules/environment.js @@ -1,8 +1,7 @@ -import { getSystemName, isTablet } from 'react-native-device-info'; -import isCatalyst from 'react-native-is-catalyst'; +import { getSystemName, isTablet, getDeviceType } from 'react-native-device-info'; const isMacCatalina = getSystemName() === 'Mac OS X'; module.exports.isMacCatalina = isMacCatalina; -module.exports.isCatalyst = isCatalyst; +module.exports.isDesktop = getDeviceType() === 'Desktop'; module.exports.isTablet = isTablet; diff --git a/blue_modules/fs.js b/blue_modules/fs.js index 9376aa656..41d12f14d 100644 --- a/blue_modules/fs.js +++ b/blue_modules/fs.js @@ -4,9 +4,9 @@ import RNFS from 'react-native-fs'; import Share from 'react-native-share'; import loc from '../loc'; import DocumentPicker from 'react-native-document-picker'; -import isCatalyst from 'react-native-is-catalyst'; import { launchCamera, launchImageLibrary } from 'react-native-image-picker'; import { presentCameraNotAuthorizedAlert } from '../class/camera'; +import { isDesktop } from '../blue_modules/environment'; import ActionSheet from '../screen/ActionSheet'; import BlueClipboard from './clipboard'; const LocalQRCode = require('@remobile/react-native-qrcode-local-image'); @@ -17,7 +17,7 @@ const writeFileAndExport = async function (filename, contents) { await RNFS.writeFile(filePath, contents); Share.open({ url: 'file://' + filePath, - saveToFiles: isCatalyst, + saveToFiles: isDesktop, }) .catch(error => { console.log(error); diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 73992e3ed..5053508c8 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -276,8 +276,6 @@ PODS: - React-Core - react-native-image-picker (3.5.0): - React-Core - - react-native-is-catalyst (1.0.0): - - React - react-native-randombytes (3.6.1): - React-Core - react-native-safe-area-context (3.2.0): @@ -287,7 +285,7 @@ PODS: - React - react-native-tor (0.1.7): - React - - react-native-webview (11.4.2): + - react-native-webview (11.4.3): - React-Core - react-native-widget-center (0.0.4): - React @@ -366,7 +364,7 @@ PODS: - React-Core - RNDefaultPreference (1.4.3): - React - - RNDeviceInfo (8.1.2): + - RNDeviceInfo (8.1.3): - React-Core - RNFS (2.17.0): - React @@ -376,14 +374,16 @@ PODS: - React - RNInAppBrowser (3.5.1): - React-Core + - RNKeychain (7.0.0): + - React-Core - RNLocalize (2.0.3): - React-Core - RNPrivacySnapshot (1.0.0): - React - RNQuickAction (0.3.13): - React - - RNRate (1.2.4): - - React + - RNRate (1.2.6): + - React-Core - RNReactNativeHapticFeedback (1.11.0): - React-Core - RNReanimated (2.1.0): @@ -422,7 +422,7 @@ PODS: - RNSentry (2.5.0-beta.1): - React-Core - Sentry (= 7.0.0) - - RNShare (6.0.0): + - RNShare (6.0.1): - React-Core - RNSVG (12.1.1): - React @@ -488,7 +488,6 @@ DEPENDENCIES: - react-native-fingerprint-scanner (from `../node_modules/react-native-fingerprint-scanner`) - react-native-idle-timer (from `../node_modules/react-native-idle-timer`) - react-native-image-picker (from `../node_modules/react-native-image-picker`) - - react-native-is-catalyst (from `../node_modules/react-native-is-catalyst`) - react-native-randombytes (from `../node_modules/react-native-randombytes`) - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - react-native-tcp-socket (from `../node_modules/react-native-tcp-socket`) @@ -517,6 +516,7 @@ DEPENDENCIES: - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNHandoff (from `../node_modules/react-native-handoff`) - RNInAppBrowser (from `../node_modules/react-native-inappbrowser-reborn`) + - RNKeychain (from `../node_modules/react-native-keychain`) - RNLocalize (from `../node_modules/react-native-localize`) - RNPrivacySnapshot (from `../node_modules/react-native-privacy-snapshot`) - RNQuickAction (from `../node_modules/react-native-quick-actions`) @@ -604,8 +604,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-idle-timer" react-native-image-picker: :path: "../node_modules/react-native-image-picker" - react-native-is-catalyst: - :path: "../node_modules/react-native-is-catalyst" react-native-randombytes: :path: "../node_modules/react-native-randombytes" react-native-safe-area-context: @@ -662,6 +660,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-handoff" RNInAppBrowser: :path: "../node_modules/react-native-inappbrowser-reborn" + RNKeychain: + :path: "../node_modules/react-native-keychain" RNLocalize: :path: "../node_modules/react-native-localize" RNPrivacySnapshot: @@ -740,12 +740,11 @@ SPEC CHECKSUMS: react-native-fingerprint-scanner: c68136ca57e3704d7bdf5faa554ea535ce15b1d0 react-native-idle-timer: 97b8283237d45146a7a5c25bdebe9e1e85f3687b react-native-image-picker: 189e8d3653b00442cb790bce09a283edaf8e02b6 - react-native-is-catalyst: 52ee70e0123c82419dd4ce47dc4cc94b22467512 react-native-randombytes: 5fc412efe7b5c55b9002c0004d75fe5fabcaa507 react-native-safe-area-context: e471852c5ed67eea4b10c5d9d43c1cebae3b231d react-native-tcp-socket: 96a4f104cdcc9c6621aafe92937f163d88447c5b react-native-tor: 4f389f5719dad633542b57ea32744e954730e7ef - react-native-webview: 90ccc4add19f940dfe6c89d30659aed8134f234d + react-native-webview: 5d05c17ff4a2075735d72c54acb5317c1737a0f5 react-native-widget-center: 0f81d17beb163e7fb5848b06754d7d277fe7d99a React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336 React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b @@ -764,21 +763,22 @@ SPEC CHECKSUMS: RNCMaskedView: f127cd9652acfa31b91dcff613e07ba18b774db6 RNCPushNotificationIOS: 5b1cf9ad2aaa107ecb92d5d2d7005ba521b2b97a RNDefaultPreference: 21816c0a6f61a2829ccc0cef034392e9b509ee5f - RNDeviceInfo: 4f480456c7ac8c9919448375399c1a6f14479549 + RNDeviceInfo: 49f6d50f861c7810fac2dd9b71cfb56cc1940e14 RNFS: 93d5b5535eb39d98e6b19009faa8fe717f7ea45d RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211 RNHandoff: d3b0754cca3a6bcd9b25f544f733f7f033ccf5fa RNInAppBrowser: 3733c1aa6699983a1c9b4963e85d5e5a48ad297e + RNKeychain: f75b8c8b2f17d3b2aa1f25b4a0ac5b83d947ff8f RNLocalize: 29e84ea169d3bca6c3b83584536c7f586a07fb98 RNPrivacySnapshot: 71919dde3c6a29dd332115409c2aec564afee8f4 RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93 - RNRate: 2b31dad120cd1b78e33c6034808561c386a3dddf + RNRate: e0af7e724e5fcf89578dbd22ab6395c85402ef29 RNReactNativeHapticFeedback: 653a8c126a0f5e88ce15ffe280b3ff37e1fbb285 RNReanimated: 70f662b5232dd5d19ccff581e919a54ea73df51c RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 RNSentry: 1868bcfe8c69b2c3b2451439a38b3ebea0a7510f - RNShare: 31fa0cedbd06c2744a78e0d2b7ba364778aa3506 + RNShare: 755de6bac084428f8fd8fb54c376f126f40e560c RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 RNWatch: e4c5d19506c94506860032fb68aedd5991beb985 diff --git a/package-lock.json b/package-lock.json index ea66907c3..483b07cd0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17687,10 +17687,6 @@ "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz", "integrity": "sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg==" }, - "react-native-is-catalyst": { - "version": "git+https://github.com/BlueWallet/react-native-is-catalyst.git#a665155424ae5b865971f71ba2625b2c53983364", - "from": "git+https://github.com/BlueWallet/react-native-is-catalyst.git#v1.0.0" - }, "react-native-keychain": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/react-native-keychain/-/react-native-keychain-7.0.0.tgz", diff --git a/package.json b/package.json index 730bf10cd..5a664bf3d 100644 --- a/package.json +++ b/package.json @@ -139,7 +139,6 @@ "react-native-idle-timer": "https://github.com/BlueWallet/react-native-idle-timer#8587876d68ab5920e79619726aeca9e672beaf2b", "react-native-image-picker": "3.5.0", "react-native-inappbrowser-reborn": "https://github.com/BlueWallet/react-native-inappbrowser#fa2d8e1763e46dd12a7e53081e97a0f908049103", - "react-native-is-catalyst": "https://github.com/BlueWallet/react-native-is-catalyst#v1.0.0", "react-native-keychain": "7.0.0", "react-native-level-fs": "3.0.1", "react-native-linear-gradient": "2.5.6", diff --git a/screen/send/create.js b/screen/send/create.js index 5665bf835..84304b138 100644 --- a/screen/send/create.js +++ b/screen/send/create.js @@ -20,9 +20,7 @@ import Clipboard from '@react-native-clipboard/clipboard'; import { Icon } from 'react-native-elements'; import Share from 'react-native-share'; import RNFS from 'react-native-fs'; -import isCatalyst from 'react-native-is-catalyst'; import BigNumber from 'bignumber.js'; - import { SafeBlueArea, BlueCard, BlueText } from '../../BlueComponents'; import navigationStyle from '../../components/navigationStyle'; import Privacy from '../../blue_modules/Privacy'; @@ -30,6 +28,7 @@ import { BitcoinUnit } from '../../models/bitcoinUnits'; import loc from '../../loc'; import { BlueCurrentTheme } from '../../components/themes'; import { DynamicQRCode } from '../../components/DynamicQRCode'; +import { isDesktop } from '../../blue_modules/environment'; const currency = require('../../blue_modules/currency'); export default class SendCreate extends Component { @@ -64,7 +63,7 @@ export default class SendCreate extends Component { await RNFS.writeFile(filePath, this.state.tx); Share.open({ url: 'file://' + filePath, - saveToFiles: isCatalyst, + saveToFiles: isDesktop, }) .catch(error => { console.log(error); diff --git a/screen/send/details.js b/screen/send/details.js index d3d9dc560..914e7b703 100644 --- a/screen/send/details.js +++ b/screen/send/details.js @@ -44,7 +44,6 @@ const currency = require('../../blue_modules/currency'); const prompt = require('../../blue_modules/prompt'); const fs = require('../../blue_modules/fs'); const scanqr = require('../../helpers/scan-qr'); - const btcAddressRx = /^[a-zA-Z0-9]{26,35}$/; const SendDetails = () => { diff --git a/screen/send/psbtWithHardwareWallet.js b/screen/send/psbtWithHardwareWallet.js index 218b6008d..4e90132ad 100644 --- a/screen/send/psbtWithHardwareWallet.js +++ b/screen/send/psbtWithHardwareWallet.js @@ -19,7 +19,7 @@ import Share from 'react-native-share'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; import DocumentPicker from 'react-native-document-picker'; import { useNavigation, useRoute, useTheme } from '@react-navigation/native'; -import { isCatalyst, isMacCatalina } from '../../blue_modules/environment'; +import { isDesktop, isMacCatalina } from '../../blue_modules/environment'; import RNFS from 'react-native-fs'; import Biometric from '../../class/biometrics'; @@ -188,7 +188,7 @@ const PsbtWithHardwareWallet = () => { await RNFS.writeFile(filePath, typeof psbt === 'string' ? psbt : psbt.toBase64()); Share.open({ url: 'file://' + filePath, - saveToFiles: isCatalyst, + saveToFiles: isDesktop, }) .catch(error => { console.log(error); diff --git a/screen/settings/NetworkSettings.js b/screen/settings/NetworkSettings.js index 37b2bbcae..63d2c3055 100644 --- a/screen/settings/NetworkSettings.js +++ b/screen/settings/NetworkSettings.js @@ -5,7 +5,7 @@ import Notifications from '../../blue_modules/notifications'; import navigationStyle from '../../components/navigationStyle'; import { SafeBlueArea, BlueListItem } from '../../BlueComponents'; import loc from '../../loc'; -import { isCatalyst } from '../../blue_modules/environment'; +import { isDesktop } from '../../blue_modules/environment'; const NetworkSettings = () => { const { navigate } = useNavigation(); @@ -35,7 +35,7 @@ const NetworkSettings = () => { chevron /> )} - {!isCatalyst && } + {!isDesktop && } ); diff --git a/screen/settings/electrumSettings.js b/screen/settings/electrumSettings.js index 4d0f927c6..6e900f80b 100644 --- a/screen/settings/electrumSettings.js +++ b/screen/settings/electrumSettings.js @@ -32,7 +32,7 @@ import { BlueDismissKeyboardInputAccessory, } from '../../BlueComponents'; import { BlueCurrentTheme } from '../../components/themes'; -import { isCatalyst } from '../../blue_modules/environment'; +import { isDesktop } from '../../blue_modules/environment'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; const BlueElectrum = require('../../blue_modules/BlueElectrum'); @@ -268,7 +268,7 @@ export default class ElectrumSettings extends Component { this.setState({ host: text.trim() })} diff --git a/screen/settings/lightningSettings.js b/screen/settings/lightningSettings.js index 7b6de8ba2..a115eeb38 100644 --- a/screen/settings/lightningSettings.js +++ b/screen/settings/lightningSettings.js @@ -12,7 +12,7 @@ import { LightningCustodianWallet } from '../../class/wallets/lightning-custodia import loc from '../../loc'; import { BlueCurrentTheme } from '../../components/themes'; import DeeplinkSchemaMatch from '../../class/deeplink-schema-match'; -import { isCatalyst } from '../../blue_modules/environment'; +import { isDesktop } from '../../blue_modules/environment'; const styles = StyleSheet.create({ uri: { @@ -148,7 +148,7 @@ const LightningSettings = () => { /> - {!isCatalyst && {loc.settings.tor_supported}} + {!isDesktop && {loc.settings.tor_supported}} diff --git a/screen/wallets/details.js b/screen/wallets/details.js index bee6f793c..ba5d46917 100644 --- a/screen/wallets/details.js +++ b/screen/wallets/details.js @@ -40,7 +40,7 @@ import RNFS from 'react-native-fs'; import Share from 'react-native-share'; import { BlueStorageContext } from '../../blue_modules/storage-context'; import Notifications from '../../blue_modules/notifications'; -import isCatalyst from 'react-native-is-catalyst'; +import { isDesktop } from '../../blue_modules/environment'; import { AbstractHDElectrumWallet } from '../../class/wallets/abstract-hd-electrum-wallet'; const prompt = require('../../blue_modules/prompt'); @@ -324,7 +324,7 @@ const WalletDetails = () => { await RNFS.writeFile(filePath, contents); Share.open({ url: 'file://' + filePath, - saveToFiles: isCatalyst, + saveToFiles: isDesktop, }) .catch(error => { console.log(error); diff --git a/screen/wallets/import.js b/screen/wallets/import.js index 71f12dde4..4c20159a7 100644 --- a/screen/wallets/import.js +++ b/screen/wallets/import.js @@ -16,7 +16,7 @@ import navigationStyle from '../../components/navigationStyle'; import Privacy from '../../blue_modules/Privacy'; import WalletImport from '../../class/wallet-import'; import loc from '../../loc'; -import { isCatalyst, isMacCatalina } from '../../blue_modules/environment'; +import { isDesktop, isMacCatalina } from '../../blue_modules/environment'; const fs = require('../../blue_modules/fs'); const WalletsImport = () => { @@ -121,7 +121,7 @@ const WalletsImport = () => { diff --git a/screen/wallets/list.js b/screen/wallets/list.js index 6314c2003..d38298ebc 100644 --- a/screen/wallets/list.js +++ b/screen/wallets/list.js @@ -28,7 +28,7 @@ import loc from '../../loc'; import { FContainer, FButton } from '../../components/FloatButtons'; import { useFocusEffect, useNavigation, useRoute, useTheme } from '@react-navigation/native'; import { BlueStorageContext } from '../../blue_modules/storage-context'; -import { isCatalyst, isMacCatalina, isTablet } from '../../blue_modules/environment'; +import { isDesktop, isMacCatalina, isTablet } from '../../blue_modules/environment'; import BlueClipboard from '../../blue_modules/clipboard'; import navigationStyle from '../../components/navigationStyle'; @@ -50,7 +50,7 @@ const WalletsList = () => { const [isLoading, setIsLoading] = useState(false); const [itemWidth, setItemWidth] = useState(width * 0.82 > 375 ? 375 : width * 0.82); const [isLargeScreen, setIsLargeScreen] = useState( - Platform.OS === 'android' ? isTablet() : width >= Dimensions.get('screen').width / 2 && (isTablet() || isCatalyst), + Platform.OS === 'android' ? isTablet() : width >= Dimensions.get('screen').width / 2 && (isTablet() || isDesktop), ); const [carouselData, setCarouselData] = useState([]); const dataSource = getTransactions(null, 10); @@ -119,7 +119,7 @@ const WalletsList = () => { useEffect(() => { setOptions({ title: '', - headerShown: !isCatalyst, + headerShown: !isDesktop, headerStyle: { backgroundColor: colors.customHeader, borderBottomWidth: 0, @@ -217,7 +217,7 @@ const WalletsList = () => { {`${loc.transactions.list_title}${' '}`} - {isCatalyst && ( + {isDesktop && ( refreshTransactions(true)} disabled={isLoading}> @@ -422,7 +422,7 @@ const WalletsList = () => { }; const onLayout = _e => { - setIsLargeScreen(Platform.OS === 'android' ? isTablet() : width >= Dimensions.get('screen').width / 2 && (isTablet() || isCatalyst)); + setIsLargeScreen(Platform.OS === 'android' ? isTablet() : width >= Dimensions.get('screen').width / 2 && (isTablet() || isDesktop)); setItemWidth(width * 0.82 > 375 ? 375 : width * 0.82); }; diff --git a/screen/wallets/transactions.js b/screen/wallets/transactions.js index c408dd137..c5cc54254 100644 --- a/screen/wallets/transactions.js +++ b/screen/wallets/transactions.js @@ -35,7 +35,7 @@ import { FContainer, FButton } from '../../components/FloatButtons'; import BottomModal from '../../components/BottomModal'; import BuyBitcoin from './buyBitcoin'; import { BlueStorageContext } from '../../blue_modules/storage-context'; -import { isCatalyst, isMacCatalina } from '../../blue_modules/environment'; +import { isDesktop, isMacCatalina } from '../../blue_modules/environment'; import BlueClipboard from '../../blue_modules/clipboard'; const fs = require('../../blue_modules/fs'); @@ -225,7 +225,7 @@ const WalletTransactions = () => { const renderListHeaderComponent = () => { const style = {}; - if (!isCatalyst) { + if (!isDesktop) { // we need this button for testing style.opacity = 0; style.height = 1; From 5988a92aff8dc30b111fc4121b851dcff1454b87 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 29 May 2021 02:04:33 -0400 Subject: [PATCH 094/327] OPS: Update Package --- ios/Podfile.lock | 28 +++++++++++++++++----------- package.json | 2 +- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 73992e3ed..a1dac2efa 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -287,7 +287,7 @@ PODS: - React - react-native-tor (0.1.7): - React - - react-native-webview (11.4.2): + - react-native-webview (11.4.3): - React-Core - react-native-widget-center (0.0.4): - React @@ -366,7 +366,7 @@ PODS: - React-Core - RNDefaultPreference (1.4.3): - React - - RNDeviceInfo (8.1.2): + - RNDeviceInfo (8.1.3): - React-Core - RNFS (2.17.0): - React @@ -376,14 +376,16 @@ PODS: - React - RNInAppBrowser (3.5.1): - React-Core - - RNLocalize (2.0.3): + - RNKeychain (7.0.0): + - React-Core + - RNLocalize (2.1.0): - React-Core - RNPrivacySnapshot (1.0.0): - React - RNQuickAction (0.3.13): - React - - RNRate (1.2.4): - - React + - RNRate (1.2.6): + - React-Core - RNReactNativeHapticFeedback (1.11.0): - React-Core - RNReanimated (2.1.0): @@ -422,7 +424,7 @@ PODS: - RNSentry (2.5.0-beta.1): - React-Core - Sentry (= 7.0.0) - - RNShare (6.0.0): + - RNShare (6.0.1): - React-Core - RNSVG (12.1.1): - React @@ -517,6 +519,7 @@ DEPENDENCIES: - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNHandoff (from `../node_modules/react-native-handoff`) - RNInAppBrowser (from `../node_modules/react-native-inappbrowser-reborn`) + - RNKeychain (from `../node_modules/react-native-keychain`) - RNLocalize (from `../node_modules/react-native-localize`) - RNPrivacySnapshot (from `../node_modules/react-native-privacy-snapshot`) - RNQuickAction (from `../node_modules/react-native-quick-actions`) @@ -662,6 +665,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-handoff" RNInAppBrowser: :path: "../node_modules/react-native-inappbrowser-reborn" + RNKeychain: + :path: "../node_modules/react-native-keychain" RNLocalize: :path: "../node_modules/react-native-localize" RNPrivacySnapshot: @@ -745,7 +750,7 @@ SPEC CHECKSUMS: react-native-safe-area-context: e471852c5ed67eea4b10c5d9d43c1cebae3b231d react-native-tcp-socket: 96a4f104cdcc9c6621aafe92937f163d88447c5b react-native-tor: 4f389f5719dad633542b57ea32744e954730e7ef - react-native-webview: 90ccc4add19f940dfe6c89d30659aed8134f234d + react-native-webview: 5d05c17ff4a2075735d72c54acb5317c1737a0f5 react-native-widget-center: 0f81d17beb163e7fb5848b06754d7d277fe7d99a React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336 React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b @@ -764,21 +769,22 @@ SPEC CHECKSUMS: RNCMaskedView: f127cd9652acfa31b91dcff613e07ba18b774db6 RNCPushNotificationIOS: 5b1cf9ad2aaa107ecb92d5d2d7005ba521b2b97a RNDefaultPreference: 21816c0a6f61a2829ccc0cef034392e9b509ee5f - RNDeviceInfo: 4f480456c7ac8c9919448375399c1a6f14479549 + RNDeviceInfo: 49f6d50f861c7810fac2dd9b71cfb56cc1940e14 RNFS: 93d5b5535eb39d98e6b19009faa8fe717f7ea45d RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211 RNHandoff: d3b0754cca3a6bcd9b25f544f733f7f033ccf5fa RNInAppBrowser: 3733c1aa6699983a1c9b4963e85d5e5a48ad297e - RNLocalize: 29e84ea169d3bca6c3b83584536c7f586a07fb98 + RNKeychain: f75b8c8b2f17d3b2aa1f25b4a0ac5b83d947ff8f + RNLocalize: ff053575acafb6ae18284974469bdf04fcaf6514 RNPrivacySnapshot: 71919dde3c6a29dd332115409c2aec564afee8f4 RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93 - RNRate: 2b31dad120cd1b78e33c6034808561c386a3dddf + RNRate: e0af7e724e5fcf89578dbd22ab6395c85402ef29 RNReactNativeHapticFeedback: 653a8c126a0f5e88ce15ffe280b3ff37e1fbb285 RNReanimated: 70f662b5232dd5d19ccff581e919a54ea73df51c RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 RNSentry: 1868bcfe8c69b2c3b2451439a38b3ebea0a7510f - RNShare: 31fa0cedbd06c2744a78e0d2b7ba364778aa3506 + RNShare: 755de6bac084428f8fd8fb54c376f126f40e560c RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 RNWatch: e4c5d19506c94506860032fb68aedd5991beb985 diff --git a/package.json b/package.json index 730bf10cd..376e9fba3 100644 --- a/package.json +++ b/package.json @@ -143,7 +143,7 @@ "react-native-keychain": "7.0.0", "react-native-level-fs": "3.0.1", "react-native-linear-gradient": "2.5.6", - "react-native-localize": "2.0.3", + "react-native-localize": "2.1.0", "react-native-modal": "11.10.0", "react-native-navigation-bar-color": "https://github.com/BlueWallet/react-native-navigation-bar-color#34e44b8f44e442133de9d35c35f2679d40982804", "react-native-obscure": "1.2.1", From c127dca97aec2aa530148cf65910dc0164070c4d Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 29 May 2021 02:23:15 -0400 Subject: [PATCH 095/327] OPS: Update package --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea66907c3..f53be4648 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17747,8 +17747,8 @@ "from": "git+https://github.com/BlueWallet/react-native-privacy-snapshot.git#529e4627d93f67752a27e82a040ff7b64dca0783" }, "react-native-prompt-android": { - "version": "git+https://github.com/BlueWallet/react-native-prompt-android.git#2073b07f64bf5dc95807f64d79f37bdb111e6951", - "from": "git+https://github.com/BlueWallet/react-native-prompt-android.git#2073b07f64bf5dc95807f64d79f37bdb111e6951" + "version": "git+https://github.com/BlueWallet/react-native-prompt-android.git#ed168d66fed556bc2ed07cf498770f058b78a376", + "from": "git+https://github.com/BlueWallet/react-native-prompt-android.git#ed168d66fed556bc2ed07cf498770f058b78a376" }, "react-native-push-notification": { "version": "5.1.1", @@ -18769,7 +18769,7 @@ } }, "scryptsy": { - "version": "file:blue_modules/scryptsy", + "version": "file:https:/registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" }, "secp256k1": { diff --git a/package.json b/package.json index 730bf10cd..0246beba3 100644 --- a/package.json +++ b/package.json @@ -150,7 +150,7 @@ "react-native-passcode-auth": "https://github.com/BlueWallet/react-native-passcode-auth#a2ff977ba92b36f8d0a5567f59c05cc608e8bd12", "react-native-popup-menu-android": "1.0.3", "react-native-privacy-snapshot": "https://github.com/BlueWallet/react-native-privacy-snapshot#529e4627d93f67752a27e82a040ff7b64dca0783", - "react-native-prompt-android": "https://github.com/BlueWallet/react-native-prompt-android#2073b07f64bf5dc95807f64d79f37bdb111e6951", + "react-native-prompt-android": "https://github.com/BlueWallet/react-native-prompt-android#ed168d66fed556bc2ed07cf498770f058b78a376", "react-native-push-notification": "5.1.1", "react-native-qrcode-svg": "6.1.1", "react-native-quick-actions": "0.3.13", From 87682368c732ec60ea58c5735fee6ddc2ad914cf Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 29 May 2021 02:24:16 -0400 Subject: [PATCH 096/327] Update package-lock.json --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index f53be4648..2a2e373c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18769,7 +18769,7 @@ } }, "scryptsy": { - "version": "file:https:/registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", + "version": "file:blue_modules/scryptsy", "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" }, "secp256k1": { From 43b7c8eb1d9e54b554e6e75eb7349412fde9fdc8 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 29 May 2021 14:39:32 -0400 Subject: [PATCH 097/327] Update package-lock.json --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b1bae7959..ae3cf8198 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17707,9 +17707,9 @@ "integrity": "sha512-HDwEaXcQIuXXCV70O+bK1rizFong3wj+5Q/jSyifKFLg0VWF95xh8XQgfzXwtq0NggL9vNjPKXa016KuFu+VFg==" }, "react-native-localize": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-2.0.3.tgz", - "integrity": "sha512-6SILy2yX/U1rTjF56/BiywcFXeO9AY8LmPF2p3TgP3Y2uKejxAOOQ4nzr+bAP1h+X5TaBmwTPBGNMZ1TttEJvA==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-2.1.0.tgz", + "integrity": "sha512-+054+Hdw6ds5A0PIXEf+Xj2DmMZQ5jj9XzRg7Hq4lmZq/sL0dEs5MOsuID2JyO5y6wRbFEZ7XE4HUBVdT9Jisw==" }, "react-native-modal": { "version": "11.10.0", From 6878aac4f10b57be6165620902e4784e9bc33d3d Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 29 May 2021 14:40:52 -0400 Subject: [PATCH 098/327] Update package-lock.json --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 845afc9e1..f4660ddb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17703,9 +17703,9 @@ "integrity": "sha512-HDwEaXcQIuXXCV70O+bK1rizFong3wj+5Q/jSyifKFLg0VWF95xh8XQgfzXwtq0NggL9vNjPKXa016KuFu+VFg==" }, "react-native-localize": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-2.0.3.tgz", - "integrity": "sha512-6SILy2yX/U1rTjF56/BiywcFXeO9AY8LmPF2p3TgP3Y2uKejxAOOQ4nzr+bAP1h+X5TaBmwTPBGNMZ1TttEJvA==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-2.1.0.tgz", + "integrity": "sha512-+054+Hdw6ds5A0PIXEf+Xj2DmMZQ5jj9XzRg7Hq4lmZq/sL0dEs5MOsuID2JyO5y6wRbFEZ7XE4HUBVdT9Jisw==" }, "react-native-modal": { "version": "11.10.0", From 6a7f799d7ffd23ef06ad9450cd0acc3df4246739 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 30 May 2021 00:40:48 +0000 Subject: [PATCH 099/327] fix: upgrade react-native-fs from 2.17.0 to 2.18.0 Snyk has created this PR to upgrade react-native-fs from 2.17.0 to 2.18.0. See this package in npm: https://www.npmjs.com/package/react-native-fs See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae3cf8198..66d961311 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17612,9 +17612,9 @@ "from": "git+https://github.com/BlueWallet/react-native-fingerprint-scanner.git#ce644673681716335d786727bab998f7e632ab5e" }, "react-native-fs": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/react-native-fs/-/react-native-fs-2.17.0.tgz", - "integrity": "sha512-SmibqNWTt6uE+Yki5GkmytoCUTWm73GpFNMEAy12bD1PQ70PSH4XbIf1WUMNJzjctlcfEymQLKsk5Cyi6Y0Jrg==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/react-native-fs/-/react-native-fs-2.18.0.tgz", + "integrity": "sha512-9iQhkUNnN2JNED0in06JwZy88YEVyIGKWz4KLlQYxa5Y2U0U2AZh9FUHtA04oWj+xt2LlHh0LFPCzhmNsAsUDg==", "requires": { "base-64": "^0.1.0", "utf8": "^3.0.0" diff --git a/package.json b/package.json index 340428a84..c5c65c21f 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "react-native-document-picker": "https://github.com/BlueWallet/react-native-document-picker#3684d4fcc2bc0b47c32be39024e4796004c3e428", "react-native-elements": "2.3.2", "react-native-fingerprint-scanner": "https://github.com/BlueWallet/react-native-fingerprint-scanner#ce644673681716335d786727bab998f7e632ab5e", - "react-native-fs": "2.17.0", + "react-native-fs": "2.18.0", "react-native-gesture-handler": "1.10.3", "react-native-handoff": "https://github.com/marcosrdz/react-native-handoff#f5becc63f3e36bf2da1ed1fc60fc690323e73602", "react-native-haptic-feedback": "1.11.0", From ea0adc1758e77fc95780613652404862b3338495 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 30 May 2021 00:40:52 +0000 Subject: [PATCH 100/327] fix: upgrade react-native-image-picker from 3.5.0 to 3.6.0 Snyk has created this PR to upgrade react-native-image-picker from 3.5.0 to 3.6.0. See this package in npm: https://www.npmjs.com/package/react-native-image-picker See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae3cf8198..023c89cb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17670,9 +17670,9 @@ "from": "git+https://github.com/BlueWallet/react-native-idle-timer.git#8587876d68ab5920e79619726aeca9e672beaf2b" }, "react-native-image-picker": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-3.5.0.tgz", - "integrity": "sha512-i3vr3cM/nu+FbpDpW+msxKX5dvFCMo0DIvHgDGxD9r43KgEDHcROavjQSAXjul/WDfMA2dqlR6gqi1AM8JLkvA==" + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-3.6.0.tgz", + "integrity": "sha512-5Qs4w1aN4hzESKl8qqYhSuXa84AYy1E9Je/owG7c1N+Gb4fWkmSL/fldiMJ/UYMXg4Ae/1tikLLAbJDTofCkAQ==" }, "react-native-inappbrowser-reborn": { "version": "git+https://github.com/BlueWallet/react-native-inappbrowser.git#fa2d8e1763e46dd12a7e53081e97a0f908049103", diff --git a/package.json b/package.json index 340428a84..4c1b6d3a2 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "react-native-handoff": "https://github.com/marcosrdz/react-native-handoff#f5becc63f3e36bf2da1ed1fc60fc690323e73602", "react-native-haptic-feedback": "1.11.0", "react-native-idle-timer": "https://github.com/BlueWallet/react-native-idle-timer#8587876d68ab5920e79619726aeca9e672beaf2b", - "react-native-image-picker": "3.5.0", + "react-native-image-picker": "3.6.0", "react-native-inappbrowser-reborn": "https://github.com/BlueWallet/react-native-inappbrowser#fa2d8e1763e46dd12a7e53081e97a0f908049103", "react-native-keychain": "7.0.0", "react-native-level-fs": "3.0.1", From d5e04a75faad7bc4e5ac16a23e249f7009a073ec Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 29 May 2021 22:15:46 -0400 Subject: [PATCH 101/327] WIP --- ios/Podfile.lock | 8 ++++---- package.json | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index cde4693db..2040c08cb 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -274,7 +274,7 @@ PODS: - React - react-native-idle-timer (2.1.6): - React-Core - - react-native-image-picker (3.5.0): + - react-native-image-picker (3.6.0): - React-Core - react-native-randombytes (3.6.1): - React-Core @@ -366,7 +366,7 @@ PODS: - React - RNDeviceInfo (8.1.3): - React-Core - - RNFS (2.17.0): + - RNFS (2.18.0): - React - RNGestureHandler (1.10.3): - React-Core @@ -734,7 +734,7 @@ SPEC CHECKSUMS: react-native-document-picker: c5752781fbc0c126c627c1549b037c139444a4cf react-native-fingerprint-scanner: c68136ca57e3704d7bdf5faa554ea535ce15b1d0 react-native-idle-timer: 97b8283237d45146a7a5c25bdebe9e1e85f3687b - react-native-image-picker: 189e8d3653b00442cb790bce09a283edaf8e02b6 + react-native-image-picker: 25f5fe3a3a9c4297e0b7a5a16566c5609632856d react-native-randombytes: 5fc412efe7b5c55b9002c0004d75fe5fabcaa507 react-native-safe-area-context: e471852c5ed67eea4b10c5d9d43c1cebae3b231d react-native-tcp-socket: 96a4f104cdcc9c6621aafe92937f163d88447c5b @@ -759,7 +759,7 @@ SPEC CHECKSUMS: RNCPushNotificationIOS: 5b1cf9ad2aaa107ecb92d5d2d7005ba521b2b97a RNDefaultPreference: 21816c0a6f61a2829ccc0cef034392e9b509ee5f RNDeviceInfo: 49f6d50f861c7810fac2dd9b71cfb56cc1940e14 - RNFS: 93d5b5535eb39d98e6b19009faa8fe717f7ea45d + RNFS: 3ab21fa6c56d65566d1fb26c2228e2b6132e5e32 RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211 RNHandoff: d3b0754cca3a6bcd9b25f544f733f7f033ccf5fa RNKeychain: f75b8c8b2f17d3b2aa1f25b4a0ac5b83d947ff8f diff --git a/package.json b/package.json index d60320675..462cae73a 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,6 @@ "react-native-haptic-feedback": "1.11.0", "react-native-idle-timer": "https://github.com/BlueWallet/react-native-idle-timer#8587876d68ab5920e79619726aeca9e672beaf2b", "react-native-image-picker": "3.6.0", - "react-native-inappbrowser-reborn": "https://github.com/BlueWallet/react-native-inappbrowser#fa2d8e1763e46dd12a7e53081e97a0f908049103", "react-native-keychain": "7.0.0", "react-native-level-fs": "3.0.1", "react-native-linear-gradient": "2.5.6", From e30c80b383723b722ba371bb1bba83ea35bdc89a Mon Sep 17 00:00:00 2001 From: ncoelho Date: Mon, 31 May 2021 14:20:41 +0200 Subject: [PATCH 102/327] REF: Wallet cards alignment on RTL --- components/WalletsCarousel.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/WalletsCarousel.js b/components/WalletsCarousel.js index 180f4aa5d..14f7b1eb3 100644 --- a/components/WalletsCarousel.js +++ b/components/WalletsCarousel.js @@ -26,7 +26,8 @@ import { BlueStorageContext } from '../blue_modules/storage-context'; const nStyles = StyleSheet.create({ root: { marginVertical: 17, - paddingLeft: 16, + paddingLeft: I18nManager.isRTL ? 12 : 0, + paddingRight: I18nManager.isRTL ? 0 : 12, }, container: { paddingHorizontal: 24, @@ -77,7 +78,8 @@ NewWalletPanel.propTypes = { const iStyles = StyleSheet.create({ root: { - paddingLeft: 16, + paddingLeft: I18nManager.isRTL ? 12 : 0, + paddingRight: I18nManager.isRTL ? 0 : 12, marginVertical: 17, }, grad: { From b2cb63f63cb9bf9da392c8d911300a786ccc01c7 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Mon, 31 May 2021 12:18:08 -0400 Subject: [PATCH 103/327] FIX: Cannot read seed words for vault key - mostly blank #3232 --- screen/wallets/addMultisigStep2.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/screen/wallets/addMultisigStep2.js b/screen/wallets/addMultisigStep2.js index 9bc04d984..3af1d840f 100644 --- a/screen/wallets/addMultisigStep2.js +++ b/screen/wallets/addMultisigStep2.js @@ -519,17 +519,21 @@ const WalletsAddMultisigStep2 = () => { const entriesObject = entries.entries(); for (const [index, secret] of entriesObject) { if (entries.length > 1) { + const text = `${index + 1}. ${secret} `; component.push( - - {index + 1}. {secret} + + {text} , ); } else { + const text = `${secret} `; component.push( - {secret} + + {text} + , ); } From 6ab6e8444f3f291871737bd1100a875f268580e7 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Wed, 2 Jun 2021 17:33:37 +0100 Subject: [PATCH 104/327] TST: add mock for rn keystore --- tests/setup.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/setup.js b/tests/setup.js index 80b753609..bd391bcc1 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -141,4 +141,14 @@ jest.mock('react-native-share', () => { }; }); +const keychainMock = { + SECURITY_LEVEL_ANY: 'MOCK_SECURITY_LEVEL_ANY', + SECURITY_LEVEL_SECURE_SOFTWARE: 'MOCK_SECURITY_LEVEL_SECURE_SOFTWARE', + SECURITY_LEVEL_SECURE_HARDWARE: 'MOCK_SECURITY_LEVEL_SECURE_HARDWARE', + setGenericPassword: jest.fn().mockResolvedValue(), + getGenericPassword: jest.fn().mockResolvedValue(), + resetGenericPassword: jest.fn().mockResolvedValue(), +}; +jest.mock('react-native-keychain', () => keychainMock); + global.alert = () => {}; From 667f3617d7a202db0ce155a652c3dd4849455524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 3 Jun 2021 08:45:49 -0400 Subject: [PATCH 105/327] FIX: Dont open screen with loading indicator --- screen/send/details.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/screen/send/details.js b/screen/send/details.js index 914e7b703..07fa965cf 100644 --- a/screen/send/details.js +++ b/screen/send/details.js @@ -56,7 +56,7 @@ const SendDetails = () => { // state const [width, setWidth] = useState(Dimensions.get('window').width); - const [isLoading, setIsLoading] = useState(true); + const [isLoading, setIsLoading] = useState(false); const [wallet, setWallet] = useState(null); const [walletSelectionOrCoinsSelectedHidden, setWalletSelectionOrCoinsSelectedHidden] = useState(false); const [isAmountToolbarVisibleForAndroid, setIsAmountToolbarVisibleForAndroid] = useState(false); From 978dc24a5bd8a34ad9e06b65e3b207c3ca10f998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 3 Jun 2021 12:30:01 -0400 Subject: [PATCH 106/327] ADD: IDR Fiat --- models/fiatUnit.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/models/fiatUnit.json b/models/fiatUnit.json index c1326f7b9..d9b828b72 100644 --- a/models/fiatUnit.json +++ b/models/fiatUnit.json @@ -94,6 +94,12 @@ "symbol": "Ft", "locale": "hu-HU", "source": "CoinDesk" + }, + "IDR": { + "endPointKey": "IDR", + "symbol": "Rp", + "locale": "id-ID", + "source": "CoinDesk" }, "ILS": { "endPointKey": "ILS", From 8c99f1b10d96590d6e6f5ffbaff01a729f3e759f Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 4 Jun 2021 00:51:35 +0000 Subject: [PATCH 107/327] fix: upgrade realm from 10.2.0 to 10.4.1 Snyk has created this PR to upgrade realm from 10.2.0 to 10.4.1. See this package in npm: https://www.npmjs.com/package/realm See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 339 ++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 165 insertions(+), 176 deletions(-) diff --git a/package-lock.json b/package-lock.json index edcc38979..1dd278976 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3975,11 +3975,6 @@ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -5690,9 +5685,9 @@ } }, "bson": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.3.0.tgz", - "integrity": "sha512-LkKKeFJx5D6RRCRvLE+fDs40M2ZQNuk7W7tFXmKd7OOcQQ+BHdzCgRdL4XEGjc1UEGtiYuMvIVk91Bv8qsI50A==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.4.0.tgz", + "integrity": "sha512-uX9Zqzv2DpFXJgQOWKD8nbf0dTQV57WM8eiXDXVWeJYgiu/zIRz61OGLJKwbfSEEjZJ+AgS+7TUT7Y8EloTaqQ==", "requires": { "buffer": "^5.6.0" }, @@ -6596,6 +6591,14 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + }, "dedent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.6.0.tgz", @@ -8283,6 +8286,11 @@ } } }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, "expect": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", @@ -8915,6 +8923,11 @@ } } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs-extra": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", @@ -8926,11 +8939,11 @@ } }, "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "requires": { - "minipass": "^2.6.0" + "minipass": "^3.0.0" } }, "fs-readdir-recursive": { @@ -9077,6 +9090,11 @@ "assert-plus": "^1.0.0" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -9419,14 +9437,6 @@ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "requires": { - "minimatch": "^3.0.4" - } - }, "image-size": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", @@ -15627,6 +15637,11 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -15651,27 +15666,34 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" }, "dependencies": { "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "requires": { - "minipass": "^2.9.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "mixin-deep": { @@ -15701,6 +15723,11 @@ "minimist": "^1.2.5" } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "mockdate": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/mockdate/-/mockdate-3.0.5.tgz", @@ -15761,6 +15788,11 @@ "to-regex": "^3.0.1" } }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -15773,26 +15805,6 @@ "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", "optional": true }, - "needle": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", - "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -15808,10 +15820,18 @@ "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==" }, + "node-abi": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", + "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", + "requires": { + "semver": "^5.4.1" + } + }, "node-addon-api": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", - "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" }, "node-fetch": { "version": "2.6.1", @@ -15904,52 +15924,6 @@ } } }, - "node-pre-gyp": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", - "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==", - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.3", - "needle": "^2.5.0", - "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" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "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" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, "node-releases": { "version": "1.1.71", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", @@ -15965,15 +15939,6 @@ "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz", "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==" }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -15994,29 +15959,6 @@ "remove-trailing-separator": "^1.0.1" } }, - "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -16387,7 +16329,8 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true }, "os-locale": { "version": "3.1.0", @@ -16404,15 +16347,6 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "output-file-sync": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", @@ -16725,6 +16659,26 @@ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, + "prebuild-install": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.3.tgz", + "integrity": "sha512-iqqSR84tNYQUQHRXalSKdIaM8Ov1QxOVuBNWI7+BzZWv6Ih9k75wOnH1rGQ9WWTaaLkTpxWKIciOF0KyfM74+Q==", + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.21.0", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -17179,9 +17133,9 @@ } }, "react-clone-referenced-element": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/react-clone-referenced-element/-/react-clone-referenced-element-1.1.0.tgz", - "integrity": "sha512-FKOsfKbBkPxYE8576EM6uAfHC4rnMpLyH6/TJUL4WcHUEB3EUn8AxPjnnV/IiwSSzsClvHYK+sDELKN/EJ0WYg==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/react-clone-referenced-element/-/react-clone-referenced-element-1.1.1.tgz", + "integrity": "sha512-LZBPvQV8W0B5dFzXFu+D3Tpil8YHS8tO00iFsfXcTLdtpuH7XyvaHqHcoz4hd4uNPQCZ30fceh+s7mLznzMXvg==" }, "react-devtools-core": { "version": "4.13.1", @@ -18274,10 +18228,11 @@ } }, "realm": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/realm/-/realm-10.2.0.tgz", - "integrity": "sha512-MR2oWV4QtYd/aRhNYdniFqXom1hVzXeS2FsYv9JDgkYcxWJlq2cFsI2x3094i+LwNFRJZZtSxahc3xFuRCZcHg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/realm/-/realm-10.4.1.tgz", + "integrity": "sha512-WpQFYkgkqxe1vSx9rPz9YYOMj6R6c0Po+Kib86rbskUbEBoCGVWtr6fiah/l3rQrJ1anVRqcjaP3LJ+DUQiDgg==", "requires": { + "bindings": "^1.5.0", "bson": "^4.2.0", "command-line-args": "^4.0.6", "deepmerge": "2.1.0", @@ -18288,7 +18243,7 @@ "node-addon-api": "^3.1.0", "node-fetch": "^2.6.1", "node-machine-id": "^1.1.10", - "node-pre-gyp": "^0.15.0", + "prebuild-install": "^6.1.1", "progress": "^2.0.3", "prop-types": "^15.6.2", "realm-network-transport": "^0.7.0", @@ -18946,6 +18901,21 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "simple-plist": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.1.tgz", @@ -19636,31 +19606,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -19673,6 +19618,50 @@ } } }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, "telnet-client": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/telnet-client/-/telnet-client-1.2.8.tgz", diff --git a/package.json b/package.json index 462cae73a..8f6a0a4ad 100644 --- a/package.json +++ b/package.json @@ -171,7 +171,7 @@ "react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#e2e9a9038b76d096bf929a87105a97a0a7095001", "react-test-render": "1.1.2", "readable-stream": "3.6.0", - "realm": "10.2.0", + "realm": "10.4.1", "rn-nodeify": "10.3.0", "scryptsy": "file:blue_modules/scryptsy", "secure-random": "1.1.2", From 223bef01b6d43ca91b589d3f8c381112d8302e78 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 4 Jun 2021 00:51:39 +0000 Subject: [PATCH 108/327] fix: upgrade react-native-camera from 3.43.6 to 3.43.8 Snyk has created this PR to upgrade react-native-camera from 3.43.6 to 3.43.8. See this package in npm: https://www.npmjs.com/package/react-native-camera See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index edcc38979..84610a5a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17536,9 +17536,9 @@ "from": "git+https://github.com/BlueWallet/react-native-blue-crypto.git" }, "react-native-camera": { - "version": "3.43.6", - "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.43.6.tgz", - "integrity": "sha512-O6BDl0Rzsmbh4LF/4GqokIA6Q1tyhx0IlZuQ5wVKnKsGgZp/JAxF9W/2dsPjd5KyL8TgXEgpK0mqOjxd9lP5iw==", + "version": "3.43.8", + "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.43.8.tgz", + "integrity": "sha512-OLQ0UfYaQz7VI8yLpYHFcsfg8R+zbsnxYrFxyVjfxOagqAllkFOgPI7eCf6S5HM119RQV6a+gAK2M2ZXzv8OvA==", "requires": { "prop-types": "^15.6.2" } diff --git a/package.json b/package.json index 462cae73a..acf26710b 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "react-localization": "1.0.17", "react-native": "0.63.4", "react-native-blue-crypto": "https://github.com/BlueWallet/react-native-blue-crypto", - "react-native-camera": "3.43.6", + "react-native-camera": "3.43.8", "react-native-crypto": "2.2.0", "react-native-default-preference": "1.4.3", "react-native-device-info": "8.1.3", From 9de0807925421966e15cb2acdca666e0f26a46e0 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 4 Jun 2021 23:23:40 +0000 Subject: [PATCH 109/327] fix: upgrade @react-navigation/stack from 5.14.4 to 5.14.5 Snyk has created this PR to upgrade @react-navigation/stack from 5.14.4 to 5.14.5. See this package in npm: https://www.npmjs.com/package/@react-navigation/stack See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4d6db44f3..3116a286a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3492,9 +3492,9 @@ } }, "@react-navigation/stack": { - "version": "5.14.4", - "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-5.14.4.tgz", - "integrity": "sha512-gQjWK8JHtVkD1p7wzjtSPuScJI0mSAk/N/gzgjQZo+rDUwgM8rOTDcVNRbtEOqCEgLQcZrZQHwhOjkrJirehjQ==", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-5.14.5.tgz", + "integrity": "sha512-hpdn1SS0tc3/3atkV2Q2y++n5B4e0rUcCj4W43PODMu72yX2m0LkKAAcpkPDCWAvwnLLIoLAEl5BEifZigl/6A==", "requires": { "color": "^3.1.3", "react-native-iphone-x-helper": "^1.3.0" diff --git a/package.json b/package.json index 7bbe89838..ffa05f108 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "@react-native-community/push-notification-ios": "1.8.0", "@react-navigation/drawer": "5.12.5", "@react-navigation/native": "5.9.4", - "@react-navigation/stack": "5.14.4", + "@react-navigation/stack": "5.14.5", "@remobile/react-native-qrcode-local-image": "https://github.com/BlueWallet/react-native-qrcode-local-image", "@sentry/react-native": "2.5.0-beta.1", "aez": "1.0.1", From 719d0b4bef7d09490b2689769ca4154592bf46d0 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Sat, 5 Jun 2021 12:00:47 +0100 Subject: [PATCH 110/327] REL: ver bump v6.1.6 --- android/app/build.gradle | 2 +- ios/BlueWallet.xcodeproj/project.pbxproj | 36 ++++++++++++------------ package-lock.json | 2 +- package.json | 2 +- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 4e0363aec..5a73fd9c7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -136,7 +136,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 - versionName "6.1.5" + versionName "6.1.6" multiDexEnabled true missingDimensionStrategy 'react-native-camera', 'general' testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index 3ed883b57..42a28d40a 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -1631,7 +1631,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1675,7 +1675,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1716,7 +1716,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; @@ -1755,7 +1755,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; PRODUCT_NAME = "BlueWallet - Bitcoin Price"; @@ -1787,7 +1787,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; @@ -1818,7 +1818,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1854,7 +1854,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget; @@ -1896,7 +1896,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1936,7 +1936,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; @@ -1979,7 +1979,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2020,7 +2020,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget; @@ -2064,7 +2064,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2104,7 +2104,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget; @@ -2146,7 +2146,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2288,7 +2288,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; @@ -2328,7 +2328,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -2364,7 +2364,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; @@ -2403,7 +2403,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.5; + MARKETING_VERSION = 6.1.6; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/package-lock.json b/package-lock.json index 3116a286a..3693033a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.5", + "version": "6.1.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ffa05f108..575405b21 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.5", + "version": "6.1.6", "license": "MIT", "repository": { "type": "git", From 9e3b4bd8d7f7236c82aa253e35d5b6966d206c5f Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sat, 5 Jun 2021 11:06:45 -0400 Subject: [PATCH 111/327] Update Podfile.lock --- ios/Podfile.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 2040c08cb..6b7f4ffa1 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -260,13 +260,13 @@ PODS: - React - react-native-blur (0.8.0): - React - - react-native-camera (3.43.6): + - react-native-camera (3.43.8): - React-Core - - react-native-camera/RCT (= 3.43.6) - - react-native-camera/RN (= 3.43.6) - - react-native-camera/RCT (3.43.6): + - react-native-camera/RCT (= 3.43.8) + - react-native-camera/RN (= 3.43.8) + - react-native-camera/RCT (3.43.8): - React-Core - - react-native-camera/RN (3.43.6): + - react-native-camera/RN (3.43.8): - React-Core - react-native-document-picker (3.5.4): - React @@ -349,7 +349,7 @@ PODS: - React-Core (= 0.63.4) - React-cxxreact (= 0.63.4) - React-jsi (= 0.63.4) - - RealmJS (10.2.0): + - RealmJS (10.4.1): - GCDWebServer - React - RemobileReactNativeQrcodeLocalImage (1.0.4): @@ -730,7 +730,7 @@ SPEC CHECKSUMS: React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a react-native-blue-crypto: 23f1558ad3d38d7a2edb7e2f6ed1bc520ed93e56 react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c - react-native-camera: 68bc0c37d11df806570bfe53e8d7561bd984cb76 + react-native-camera: 894cdcb9e5bfe41719513ad95e0cd1d108b79ee6 react-native-document-picker: c5752781fbc0c126c627c1549b037c139444a4cf react-native-fingerprint-scanner: c68136ca57e3704d7bdf5faa554ea535ce15b1d0 react-native-idle-timer: 97b8283237d45146a7a5c25bdebe9e1e85f3687b @@ -751,7 +751,7 @@ SPEC CHECKSUMS: React-RCTText: 5c51df3f08cb9dedc6e790161195d12bac06101c React-RCTVibration: ae4f914cfe8de7d4de95ae1ea6cc8f6315d73d9d ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b - RealmJS: 5195064e9aeccf94ae3756bd9d0f2301b9074b07 + RealmJS: 8a51eff2b9eaabf78b53a6819da6da6edde27467 RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa RNCAsyncStorage: b17c417b356114699a486715adfa5829a5d6d8b9 RNCClipboard: dac13db8b1ce9b998f1cbc7ca33440113602847f From ceb8269ceedccd70e319b79b270e577ddc1916e7 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 6 Jun 2021 04:13:51 +0000 Subject: [PATCH 112/327] Translate /loc/en.json in fr_FR review completed for the source file '/loc/en.json' on the 'fr_FR' language. --- loc/fr_fr.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/loc/fr_fr.json b/loc/fr_fr.json index 8ef45c1ff..982b8216a 100644 --- a/loc/fr_fr.json +++ b/loc/fr_fr.json @@ -316,6 +316,8 @@ "privacy_quickactions": "Raccourci Portefeuille", "privacy_quickactions_explanation": "Touchez et maintenez l'icone BlueWallet sur votre écran d'accueil pour voir rapidement le solde de vos portefeuilles.", "privacy_clipboard_explanation": "Fourni un raccourci si une adresse ou une facture est trouvée dans le presse-papier.", + "privacy_do_not_track": "Désactiver l'analyse des données", + "privacy_do_not_track_explanation": "Les informations de performance et de fiabilité ne seront pas soumises pour analyse.", "push_notifications": "Notifications push", "retype_password": "Re-saisir votre mot de passe", "selfTest": "Auto-test", From c484302d047d9a07f7570225546f91aa6938103e Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sun, 6 Jun 2021 03:58:39 -0400 Subject: [PATCH 113/327] REF: Use WidgetBundler --- ios/BlueWallet.xcodeproj/project.pbxproj | 852 +++--------------- ios/BlueWallet/Info.plist | 2 +- ios/MarketWidgetExtension.entitlements | 14 - ios/Podfile | 6 +- ios/Podfile.lock | 2 +- ios/PriceWidgetExtension.entitlements | 14 - ios/WalletInformationWidget/Info.plist | 29 - .../WalletInformationWidget.swift | 36 +- .../Widgets/MarketWidget/Info.plist | 29 - .../Info.plist | 29 - ...letInformationWidgetExtension.entitlements | 14 - .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../ContainerGreen.colorset/Contents.json | 0 .../ContainerRed.colorset/Contents.json | 0 .../Assets.xcassets/Contents.json | 0 .../TextColor.colorset/Contents.json | 0 .../WidgetBackground.colorset/Contents.json | 0 .../PriceWidget => Widgets}/Info.plist | 2 +- .../Widgets/MarketWidget/MarketWidget.swift | 33 +- .../Widgets/PriceWidget/PriceWidget.swift | 32 +- .../Shared/BlueWalletWatch-Bridging-Header.h | 0 .../Widgets/Shared/Colors.swift | 0 .../Widgets/Shared/Fiat/FiatUnit.swift | 0 .../Widgets/Shared/Models.swift | 0 .../Shared/UserDefaultsExtension.swift | 0 .../Widgets/Shared/UserDefaultsGroup.swift | 0 .../Widgets/Shared/Views/MarketView.swift | 0 .../Widgets/Shared/Views/PriceView.swift | 0 .../Shared/Views/SendReceiveButtons.swift | 0 .../Shared/Views/WalletInformationView.swift | 0 .../Widgets/Shared/WidgetAPI+Electrum.swift | 0 .../Widgets/Shared/WidgetAPI.swift | 0 .../Widgets/Shared/WidgetDataStore.swift | 0 .../WalletInformationAndMarketWidget.swift | 36 +- ios/Widgets/Widgets.swift | 21 + 36 files changed, 235 insertions(+), 916 deletions(-) delete mode 100644 ios/MarketWidgetExtension.entitlements delete mode 100644 ios/PriceWidgetExtension.entitlements delete mode 100644 ios/WalletInformationWidget/Info.plist delete mode 100644 ios/WalletInformationWidget/Widgets/MarketWidget/Info.plist delete mode 100644 ios/WalletInformationWidget/Widgets/WalletInformationAndMarketWidget/Info.plist delete mode 100644 ios/WalletInformationWidgetExtension.entitlements rename ios/{WalletInformationWidget/Widgets/Shared => Widgets}/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename ios/{WalletInformationWidget/Widgets/Shared => Widgets}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename ios/{WalletInformationWidget/Widgets/Shared => Widgets}/Assets.xcassets/ContainerGreen.colorset/Contents.json (100%) rename ios/{WalletInformationWidget/Widgets/Shared => Widgets}/Assets.xcassets/ContainerRed.colorset/Contents.json (100%) rename ios/{WalletInformationWidget/Widgets/Shared => Widgets}/Assets.xcassets/Contents.json (100%) rename ios/{WalletInformationWidget/Widgets/Shared => Widgets}/Assets.xcassets/TextColor.colorset/Contents.json (100%) rename ios/{WalletInformationWidget/Widgets/Shared => Widgets}/Assets.xcassets/WidgetBackground.colorset/Contents.json (100%) rename ios/{WalletInformationWidget/Widgets/PriceWidget => Widgets}/Info.plist (96%) rename ios/{WalletInformationWidget => }/Widgets/MarketWidget/MarketWidget.swift (58%) rename ios/{WalletInformationWidget => }/Widgets/PriceWidget/PriceWidget.swift (64%) rename ios/{WalletInformationWidget => }/Widgets/Shared/BlueWalletWatch-Bridging-Header.h (100%) rename ios/{WalletInformationWidget => }/Widgets/Shared/Colors.swift (100%) rename ios/{WalletInformationWidget => }/Widgets/Shared/Fiat/FiatUnit.swift (100%) rename ios/{WalletInformationWidget => }/Widgets/Shared/Models.swift (100%) rename ios/{WalletInformationWidget => }/Widgets/Shared/UserDefaultsExtension.swift (100%) rename ios/{WalletInformationWidget => }/Widgets/Shared/UserDefaultsGroup.swift (100%) rename ios/{WalletInformationWidget => }/Widgets/Shared/Views/MarketView.swift (100%) rename ios/{WalletInformationWidget => }/Widgets/Shared/Views/PriceView.swift (100%) rename ios/{WalletInformationWidget => }/Widgets/Shared/Views/SendReceiveButtons.swift (100%) rename ios/{WalletInformationWidget => }/Widgets/Shared/Views/WalletInformationView.swift (100%) rename ios/{WalletInformationWidget => }/Widgets/Shared/WidgetAPI+Electrum.swift (100%) rename ios/{WalletInformationWidget => }/Widgets/Shared/WidgetAPI.swift (100%) rename ios/{WalletInformationWidget => }/Widgets/Shared/WidgetDataStore.swift (100%) rename ios/{WalletInformationWidget => }/Widgets/WalletInformationAndMarketWidget/WalletInformationAndMarketWidget.swift (56%) create mode 100644 ios/Widgets/Widgets.swift diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index 42a28d40a..4138dc116 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -18,13 +18,8 @@ 3271B0BB236E329400DA766F /* TodayAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3271B0BA236E329400DA766F /* TodayAPI.swift */; }; 32B5A32A2334450100F8D608 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32B5A3292334450100F8D608 /* Bridge.swift */; }; 32F0A29A2311DBB20095C559 /* ComplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F0A2992311DBB20095C559 /* ComplicationController.swift */; }; - 590C62D2ED8BF487C33945B0 /* libPods-WalletInformationAndMarketWidgetExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 98455D960744E4E5DD50BA87 /* libPods-WalletInformationAndMarketWidgetExtension.a */; platformFilter = ios; }; 6D2A6464258BA92D0092292B /* Stickers.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D2A6463258BA92D0092292B /* Stickers.xcassets */; }; 6D2A6468258BA92D0092292B /* Stickers.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6D2A6461258BA92C0092292B /* Stickers.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 6D2AA8082568B8F40090B089 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; }; - 6D2AA8092568B8F40090B089 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; }; - 6D2AA80A2568B8F40090B089 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; }; - 6D2AA80B2568B8F40090B089 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; }; 6D32C5C62596CE3A008C077C /* EventEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D32C5C52596CE3A008C077C /* EventEmitter.m */; }; 6D4AF15925D21172009DD853 /* WidgetAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* WidgetAPI.swift */; }; 6D4AF16325D21185009DD853 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6B254BAB1B007B5B82 /* WidgetDataStore.swift */; }; @@ -32,73 +27,34 @@ 6D4AF17825D211A3009DD853 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; }; 6D4AF18425D215D1009DD853 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; }; 6D4AF18525D215D1009DD853 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; }; - 6D4AF18625D215D1009DD853 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; }; - 6D4AF18725D215D1009DD853 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; }; - 6D4AF18825D215D1009DD853 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; }; - 6D4AF18925D215D1009DD853 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; }; - 6D641F18255226DA003792DF /* MarketView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F17255226DA003792DF /* MarketView.swift */; }; - 6D641F19255226DA003792DF /* MarketView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F17255226DA003792DF /* MarketView.swift */; }; - 6D641F2325525054003792DF /* WalletInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F2225525053003792DF /* WalletInformationView.swift */; }; - 6D641F2425525054003792DF /* WalletInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F2225525053003792DF /* WalletInformationView.swift */; }; - 6D641F3525526311003792DF /* SendReceiveButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F3425526311003792DF /* SendReceiveButtons.swift */; }; - 6D641F3625526311003792DF /* SendReceiveButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F3425526311003792DF /* SendReceiveButtons.swift */; }; - 6D6CA4B9255872E3009312A5 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3A252FE1A3004D72DF /* WidgetKit.framework */; platformFilter = ios; }; - 6D6CA4BA255872E3009312A5 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3C252FE1A3004D72DF /* SwiftUI.framework */; platformFilter = ios; }; - 6D6CA4BD255872E3009312A5 /* PriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA4BC255872E3009312A5 /* PriceWidget.swift */; }; - 6D6CA4C3255872E7009312A5 /* PriceWidgetExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6D6CA4B8255872E3009312A5 /* PriceWidgetExtension.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 6D6CA4D725587397009312A5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D9A2E08254BA348007B5B82 /* Assets.xcassets */; }; - 6D6CA4E0255873BC009312A5 /* UserDefaultsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */; }; - 6D6CA5152558EBA4009312A5 /* WidgetAPI+Electrum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA5142558EBA3009312A5 /* WidgetAPI+Electrum.swift */; }; - 6D6CA5162558EBA4009312A5 /* WidgetAPI+Electrum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA5142558EBA3009312A5 /* WidgetAPI+Electrum.swift */; }; - 6D6CA5282558EC52009312A5 /* PriceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA5272558EC52009312A5 /* PriceView.swift */; }; - 6D6CA5292558EC52009312A5 /* PriceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA5272558EC52009312A5 /* PriceView.swift */; }; - 6D6CA5322558ED4D009312A5 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; }; - 6D6CA5332558ED54009312A5 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; }; - 6D6CA53C2558F316009312A5 /* WidgetAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* WidgetAPI.swift */; }; - 6D6CA5452558F365009312A5 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6B254BAB1B007B5B82 /* WidgetDataStore.swift */; }; - 6D99465F2555A660000E52E8 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3A252FE1A3004D72DF /* WidgetKit.framework */; platformFilter = ios; }; - 6D9946602555A660000E52E8 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3C252FE1A3004D72DF /* SwiftUI.framework */; platformFilter = ios; }; - 6D9946632555A660000E52E8 /* MarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9946622555A660000E52E8 /* MarketWidget.swift */; }; - 6D9946692555A661000E52E8 /* MarketWidgetExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6D99465E2555A660000E52E8 /* MarketWidgetExtension.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 6D99467B2555A68A000E52E8 /* MarketView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F17255226DA003792DF /* MarketView.swift */; }; - 6D9946832555A695000E52E8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D9A2E08254BA348007B5B82 /* Assets.xcassets */; }; - 6D9946842555A695000E52E8 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; }; - 6D9946852555A695000E52E8 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; }; - 6D9946862555A695000E52E8 /* WidgetAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* WidgetAPI.swift */; }; - 6D9946872555A695000E52E8 /* UserDefaultsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */; }; - 6D9946882555A695000E52E8 /* SendReceiveButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F3425526311003792DF /* SendReceiveButtons.swift */; }; - 6D9946892555A695000E52E8 /* WalletInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F2225525053003792DF /* WalletInformationView.swift */; }; - 6D99468A2555A695000E52E8 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6B254BAB1B007B5B82 /* WidgetDataStore.swift */; }; - 6D9A2E03254BA347007B5B82 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3A252FE1A3004D72DF /* WidgetKit.framework */; platformFilter = ios; }; - 6D9A2E04254BA347007B5B82 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3C252FE1A3004D72DF /* SwiftUI.framework */; platformFilter = ios; }; - 6D9A2E07254BA347007B5B82 /* WalletInformationAndMarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E06254BA347007B5B82 /* WalletInformationAndMarketWidget.swift */; }; - 6D9A2E09254BA348007B5B82 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D9A2E08254BA348007B5B82 /* Assets.xcassets */; }; - 6D9A2E0D254BA348007B5B82 /* WalletInformationAndMarketWidgetExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6D9A2E02254BA347007B5B82 /* WalletInformationAndMarketWidgetExtension.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 6D9A2E6D254BAB1B007B5B82 /* WidgetAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* WidgetAPI.swift */; }; - 6D9A2E6F254BAB1B007B5B82 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6B254BAB1B007B5B82 /* WidgetDataStore.swift */; }; - 6DA7047E254E24D5005FE5E2 /* UserDefaultsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */; }; - 6DE38F062657765900EA6C22 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DE38F052657765900EA6C22 /* fiatUnit.json */; }; - 6DE38F072657765900EA6C22 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DE38F052657765900EA6C22 /* fiatUnit.json */; }; - 6DE38F082657765900EA6C22 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DE38F052657765900EA6C22 /* fiatUnit.json */; }; - 6DE38F092657765900EA6C22 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DE38F052657765900EA6C22 /* fiatUnit.json */; }; - 6DE38F0A2657765900EA6C22 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DE38F052657765900EA6C22 /* fiatUnit.json */; }; - 6DEB4AAE254FB59C00E9F9AA /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3A252FE1A3004D72DF /* WidgetKit.framework */; platformFilter = ios; }; - 6DEB4AAF254FB59C00E9F9AA /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3C252FE1A3004D72DF /* SwiftUI.framework */; platformFilter = ios; }; - 6DEB4AB2254FB59C00E9F9AA /* WalletInformationWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4AB1254FB59C00E9F9AA /* WalletInformationWidget.swift */; }; - 6DEB4AB8254FB59E00E9F9AA /* WalletInformationWidgetExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6DEB4AAD254FB59B00E9F9AA /* WalletInformationWidgetExtension.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 6DEB4B05254FB79100E9F9AA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D9A2E08254BA348007B5B82 /* Assets.xcassets */; }; - 6DEB4BD9254FB98E00E9F9AA /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6B254BAB1B007B5B82 /* WidgetDataStore.swift */; }; - 6DEB4BDA254FB98E00E9F9AA /* WidgetAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* WidgetAPI.swift */; }; - 6DEB4BDB254FB98E00E9F9AA /* UserDefaultsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */; }; - 6DEB4BFB254FBA0E00E9F9AA /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; }; - 6DEB4BFC254FBA0E00E9F9AA /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; }; - 6DEB4C3B254FBF4800E9F9AA /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; }; - 6DEB4C3C254FBF4800E9F9AA /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; }; + 6DD4109D266CADF10087DE03 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3A252FE1A3004D72DF /* WidgetKit.framework */; }; + 6DD4109E266CADF10087DE03 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3C252FE1A3004D72DF /* SwiftUI.framework */; }; + 6DD410A1266CADF10087DE03 /* Widgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DD410A0266CADF10087DE03 /* Widgets.swift */; }; + 6DD410A7266CADF40087DE03 /* WidgetsExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 6DD410AC266CAE470087DE03 /* PriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA4BC255872E3009312A5 /* PriceWidget.swift */; }; + 6DD410AE266CAF1F0087DE03 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnit.json */; }; + 6DD410AF266CAF5C0087DE03 /* WalletInformationAndMarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E06254BA347007B5B82 /* WalletInformationAndMarketWidget.swift */; }; + 6DD410B0266CAF5C0087DE03 /* WalletInformationWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4AB1254FB59C00E9F9AA /* WalletInformationWidget.swift */; }; + 6DD410B1266CAF5C0087DE03 /* WidgetAPI+Electrum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA5142558EBA3009312A5 /* WidgetAPI+Electrum.swift */; }; + 6DD410B2266CAF5C0087DE03 /* WalletInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F2225525053003792DF /* WalletInformationView.swift */; }; + 6DD410B3266CAF5C0087DE03 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; }; + 6DD410B4266CAF5C0087DE03 /* WidgetAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* WidgetAPI.swift */; }; + 6DD410B5266CAF5C0087DE03 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6B254BAB1B007B5B82 /* WidgetDataStore.swift */; }; + 6DD410B6266CAF5C0087DE03 /* PriceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA5272558EC52009312A5 /* PriceView.swift */; }; + 6DD410B7266CAF5C0087DE03 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D9A2E08254BA348007B5B82 /* Assets.xcassets */; }; + 6DD410B8266CAF5C0087DE03 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; }; + 6DD410B9266CAF5C0087DE03 /* UserDefaultsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */; }; + 6DD410BA266CAF5C0087DE03 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; }; + 6DD410BB266CAF5C0087DE03 /* MarketView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F17255226DA003792DF /* MarketView.swift */; }; + 6DD410BE266CAF5C0087DE03 /* SendReceiveButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F3425526311003792DF /* SendReceiveButtons.swift */; }; + 6DD410BF266CB13D0087DE03 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; }; + 6DD410C0266CB1460087DE03 /* MarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9946622555A660000E52E8 /* MarketWidget.swift */; }; 6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; }; 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* EFQRCode */; }; 6DFC807224EA2FA9007B8700 /* ViewQRCodefaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFC807124EA2FA9007B8700 /* ViewQRCodefaceController.swift */; }; 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; + 8CBB9CC9ACE4B44B45C28DF8 /* libPods-WidgetsExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E45F9A25C15BEA362225C9B /* libPods-WidgetsExtension.a */; }; 906451CAD44154C2950030EC /* libPods-BlueWallet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 731973BA0AC6EA78962CE5B6 /* libPods-BlueWallet.a */; }; B40D4E34225841EC00428FCC /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E32225841EC00428FCC /* Interface.storyboard */; }; B40D4E36225841ED00428FCC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E35225841ED00428FCC /* Assets.xcassets */; }; @@ -119,7 +75,6 @@ B43D037C225847C500FBAA95 /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0376225847C500FBAA95 /* Wallet.swift */; }; B43D037D225847C500FBAA95 /* WalletInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0377225847C500FBAA95 /* WalletInformation.swift */; }; B4EE583C226703320003363C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E35225841ED00428FCC /* Assets.xcassets */; }; - D0CC417D5450A724DE9F87FE /* libPods-MarketWidgetExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 41BD3AC9FD81723B68A63C12 /* libPods-MarketWidgetExtension.a */; platformFilter = ios; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -137,20 +92,6 @@ remoteGlobalIDString = 6D2A6460258BA92C0092292B; remoteInfo = Stickers; }; - 6D6CA4C1255872E7009312A5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 6D6CA4B7255872E3009312A5; - remoteInfo = PriceWidgetExtension; - }; - 6D9946442555A583000E52E8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 6D99465D2555A660000E52E8; - remoteInfo = MarketWidgetExtension; - }; 6D9946672555A661000E52E8 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; @@ -158,19 +99,12 @@ remoteGlobalIDString = 6D99465D2555A660000E52E8; remoteInfo = MarketWidgetExtension; }; - 6D9A2E0B254BA348007B5B82 /* PBXContainerItemProxy */ = { + 6DD410A5266CADF40087DE03 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; proxyType = 1; - remoteGlobalIDString = 6D9A2E01254BA347007B5B82; - remoteInfo = MarketWidgetExtension; - }; - 6DEB4AB6254FB59E00E9F9AA /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 6DEB4AAC254FB59B00E9F9AA; - remoteInfo = WalletInformationWidgetExtension; + remoteGlobalIDString = 6DD4109B266CADF10087DE03; + remoteInfo = WidgetsExtension; }; B40D4E3E225841ED00428FCC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; @@ -196,11 +130,8 @@ dstSubfolderSpec = 13; files = ( 6D2A6468258BA92D0092292B /* Stickers.appex in Embed App Extensions */, - 6D9946692555A661000E52E8 /* MarketWidgetExtension.appex in Embed App Extensions */, - 6D6CA4C3255872E7009312A5 /* PriceWidgetExtension.appex in Embed App Extensions */, - 6D9A2E0D254BA348007B5B82 /* WalletInformationAndMarketWidgetExtension.appex in Embed App Extensions */, - 6DEB4AB8254FB59E00E9F9AA /* WalletInformationWidgetExtension.appex in Embed App Extensions */, 3271B0B5236E2E0700DA766F /* BlueWallet - Bitcoin Price.appex in Embed App Extensions */, + 6DD410A7266CADF40087DE03 /* WidgetsExtension.appex in Embed App Extensions */, ); name = "Embed App Extensions"; runOnlyForDeploymentPostprocessing = 0; @@ -329,29 +260,21 @@ 6D641F17255226DA003792DF /* MarketView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarketView.swift; sourceTree = ""; }; 6D641F2225525053003792DF /* WalletInformationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletInformationView.swift; sourceTree = ""; }; 6D641F3425526311003792DF /* SendReceiveButtons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendReceiveButtons.swift; sourceTree = ""; }; - 6D6CA4B8255872E3009312A5 /* PriceWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = PriceWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 6D6CA4BC255872E3009312A5 /* PriceWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceWidget.swift; sourceTree = ""; }; - 6D6CA4C0255872E7009312A5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 6D6CA5142558EBA3009312A5 /* WidgetAPI+Electrum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WidgetAPI+Electrum.swift"; sourceTree = ""; }; 6D6CA5272558EC52009312A5 /* PriceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceView.swift; sourceTree = ""; }; - 6D6CA6192558F6AB009312A5 /* PriceWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = PriceWidgetExtension.entitlements; sourceTree = ""; }; - 6D99465E2555A660000E52E8 /* MarketWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = MarketWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 6D9946622555A660000E52E8 /* MarketWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarketWidget.swift; sourceTree = ""; }; - 6D9946662555A661000E52E8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 6D9947152555AB9E000E52E8 /* MarketWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MarketWidgetExtension.entitlements; sourceTree = ""; }; - 6D9A2E02254BA347007B5B82 /* WalletInformationAndMarketWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = WalletInformationAndMarketWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 6D9A2E06254BA347007B5B82 /* WalletInformationAndMarketWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletInformationAndMarketWidget.swift; sourceTree = ""; }; 6D9A2E08254BA348007B5B82 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 6D9A2E0A254BA348007B5B82 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 6D9A2E6A254BAB1B007B5B82 /* WidgetAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WidgetAPI.swift; sourceTree = ""; }; 6D9A2E6B254BAB1B007B5B82 /* WidgetDataStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WidgetDataStore.swift; sourceTree = ""; }; 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsGroup.swift; sourceTree = ""; }; - 6DE38F052657765900EA6C22 /* fiatUnit.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = fiatUnit.json; path = ../../../../../models/fiatUnit.json; sourceTree = ""; }; + 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = WidgetsExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 6DD410A0266CADF10087DE03 /* Widgets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Widgets.swift; sourceTree = ""; }; + 6DD410A4266CADF40087DE03 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 6DD410AD266CAF1F0087DE03 /* fiatUnit.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = fiatUnit.json; path = ../../../../models/fiatUnit.json; sourceTree = ""; }; 6DEB496F254E38DE00E9F9AA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MainInterface.strings; sourceTree = ""; }; - 6DEB4AAD254FB59B00E9F9AA /* WalletInformationWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = WalletInformationWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 6DEB4AB1254FB59C00E9F9AA /* WalletInformationWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletInformationWidget.swift; sourceTree = ""; }; - 6DEB4AB5254FB59E00E9F9AA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 6DEB4ACE254FB5D800E9F9AA /* WalletInformationWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WalletInformationWidgetExtension.entitlements; sourceTree = ""; }; 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Models.swift; sourceTree = ""; }; 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; @@ -362,8 +285,10 @@ 78A87E7251D94144A71A2F67 /* FontAwesome5_Solid.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Solid.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf"; sourceTree = ""; }; 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.0.tbd; path = usr/lib/libsqlite3.0.tbd; sourceTree = SDKROOT; }; 7BAA8F97E61B677D33CF1944 /* Pods-WalletInformationAndMarketWidgetExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WalletInformationAndMarketWidgetExtension.release.xcconfig"; path = "Pods/Target Support Files/Pods-WalletInformationAndMarketWidgetExtension/Pods-WalletInformationAndMarketWidgetExtension.release.xcconfig"; sourceTree = ""; }; + 7E45F9A25C15BEA362225C9B /* libPods-WidgetsExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-WidgetsExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 8448882949434D41A054C0B2 /* ToolTipMenuTests.xctest */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = ToolTipMenuTests.xctest; sourceTree = ""; }; 8637D4B5E14D443A9031DA95 /* libRNFS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFS.a; sourceTree = ""; }; + 8C30FBCA42C6BF0B45757763 /* Pods-WidgetsExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsExtension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WidgetsExtension/Pods-WidgetsExtension.debug.xcconfig"; sourceTree = ""; }; 90F86BC5194548CA87D729A9 /* libToolTipMenu.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libToolTipMenu.a; sourceTree = ""; }; 94565BFC6A0C4235B3EC7B01 /* libRNSVG.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSVG.a; sourceTree = ""; }; 95208B2A05884A76B5BB99C0 /* libRCTGoogleAnalyticsBridge.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTGoogleAnalyticsBridge.a; sourceTree = ""; }; @@ -409,6 +334,7 @@ CD746B955C55410793BB72C0 /* libRNGestureHandler.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNGestureHandler.a; sourceTree = ""; }; CF4A4D7AAD974D67A2D62B3E /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; }; D6EC5B694E664FD7B02EDD2F /* libRNSentry.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSentry.a; sourceTree = ""; }; + E0A230940404CA7C51FBED37 /* Pods-WidgetsExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsExtension.release.xcconfig"; path = "Pods/Target Support Files/Pods-WidgetsExtension/Pods-WidgetsExtension.release.xcconfig"; sourceTree = ""; }; E6B44173A8854B6D85D7F933 /* libRNVectorIcons-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNVectorIcons-tvOS.a"; sourceTree = ""; }; E8E8CE89B3D142C6A8A56C34 /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; @@ -447,41 +373,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 6D6CA4B5255872E3009312A5 /* Frameworks */ = { + 6DD41099266CADF10087DE03 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6D6CA4BA255872E3009312A5 /* SwiftUI.framework in Frameworks */, - 6D6CA4B9255872E3009312A5 /* WidgetKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6D99465B2555A660000E52E8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6D9946602555A660000E52E8 /* SwiftUI.framework in Frameworks */, - 6D99465F2555A660000E52E8 /* WidgetKit.framework in Frameworks */, - D0CC417D5450A724DE9F87FE /* libPods-MarketWidgetExtension.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6D9A2DFF254BA347007B5B82 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6D9A2E04254BA347007B5B82 /* SwiftUI.framework in Frameworks */, - 6D9A2E03254BA347007B5B82 /* WidgetKit.framework in Frameworks */, - 590C62D2ED8BF487C33945B0 /* libPods-WalletInformationAndMarketWidgetExtension.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6DEB4AAA254FB59B00E9F9AA /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6DEB4AAF254FB59C00E9F9AA /* SwiftUI.framework in Frameworks */, - 6DEB4AAE254FB59C00E9F9AA /* WidgetKit.framework in Frameworks */, + 6DD4109E266CADF10087DE03 /* SwiftUI.framework in Frameworks */, + 6DD4109D266CADF10087DE03 /* WidgetKit.framework in Frameworks */, + 8CBB9CC9ACE4B44B45C28DF8 /* libPods-WidgetsExtension.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -559,6 +457,7 @@ 6D333B3C252FE1A3004D72DF /* SwiftUI.framework */, 98455D960744E4E5DD50BA87 /* libPods-WalletInformationAndMarketWidgetExtension.a */, 41BD3AC9FD81723B68A63C12 /* libPods-MarketWidgetExtension.a */, + 7E45F9A25C15BEA362225C9B /* libPods-WidgetsExtension.a */, ); name = Frameworks; sourceTree = ""; @@ -610,7 +509,7 @@ 6D2AA8062568B8E50090B089 /* Fiat */ = { isa = PBXGroup; children = ( - 6DE38F052657765900EA6C22 /* fiatUnit.json */, + 6DD410AD266CAF1F0087DE03 /* fiatUnit.json */, 6D2AA8072568B8F40090B089 /* FiatUnit.swift */, ); path = Fiat; @@ -620,7 +519,6 @@ isa = PBXGroup; children = ( 6D6CA4BC255872E3009312A5 /* PriceWidget.swift */, - 6D6CA4C0255872E7009312A5 /* Info.plist */, ); path = PriceWidget; sourceTree = ""; @@ -629,7 +527,6 @@ isa = PBXGroup; children = ( 6D9946622555A660000E52E8 /* MarketWidget.swift */, - 6D9946662555A661000E52E8 /* Info.plist */, ); path = MarketWidget; sourceTree = ""; @@ -638,32 +535,32 @@ isa = PBXGroup; children = ( 6D9A2E06254BA347007B5B82 /* WalletInformationAndMarketWidget.swift */, - 6D9A2E0A254BA348007B5B82 /* Info.plist */, ); path = WalletInformationAndMarketWidget; sourceTree = ""; }; - 6DEB4AB0254FB59C00E9F9AA /* WalletInformationWidget */ = { - isa = PBXGroup; - children = ( - 6DEB4AB1254FB59C00E9F9AA /* WalletInformationWidget.swift */, - 6DEB4AB5254FB59E00E9F9AA /* Info.plist */, - ); - name = WalletInformationWidget; - path = ..; - sourceTree = ""; - }; - 6DEB4B18254FB7D700E9F9AA /* Widgets */ = { + 6DD4109F266CADF10087DE03 /* Widgets */ = { isa = PBXGroup; children = ( + 6DD410A0266CADF10087DE03 /* Widgets.swift */, + 6DD410A4266CADF40087DE03 /* Info.plist */, + 6D9A2E08254BA348007B5B82 /* Assets.xcassets */, 6DEB4BC1254FB98300E9F9AA /* Shared */, 6D9946612555A660000E52E8 /* MarketWidget */, 6D6CA4BB255872E3009312A5 /* PriceWidget */, 6D9A2E05254BA347007B5B82 /* WalletInformationAndMarketWidget */, 6DEB4AB0254FB59C00E9F9AA /* WalletInformationWidget */, ); - name = Widgets; - path = WalletInformationWidget/Widgets; + path = Widgets; + sourceTree = ""; + }; + 6DEB4AB0254FB59C00E9F9AA /* WalletInformationWidget */ = { + isa = PBXGroup; + children = ( + 6DEB4AB1254FB59C00E9F9AA /* WalletInformationWidget.swift */, + ); + name = WalletInformationWidget; + path = ../WalletInformationWidget; sourceTree = ""; }; 6DEB4BC1254FB98300E9F9AA /* Shared */ = { @@ -675,7 +572,6 @@ 6D6CA5142558EBA3009312A5 /* WidgetAPI+Electrum.swift */, 6D9A2E6B254BAB1B007B5B82 /* WidgetDataStore.swift */, 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */, - 6D9A2E08254BA348007B5B82 /* Assets.xcassets */, 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */, 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */, 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */, @@ -698,16 +594,13 @@ 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( - 6D6CA6192558F6AB009312A5 /* PriceWidgetExtension.entitlements */, - 6D9947152555AB9E000E52E8 /* MarketWidgetExtension.entitlements */, - 6DEB4ACE254FB5D800E9F9AA /* WalletInformationWidgetExtension.entitlements */, 13B07FAE1A68108700A75B9A /* BlueWallet */, 00E356EF1AD99517003FC87E /* BlueWalletTests */, B40D4E31225841EC00428FCC /* BlueWalletWatch */, B40D4E40225841ED00428FCC /* BlueWalletWatch Extension */, 3271B0AC236E2E0700DA766F /* TodayExtension */, - 6DEB4B18254FB7D700E9F9AA /* Widgets */, 6D2A6462258BA92C0092292B /* Stickers */, + 6DD4109F266CADF10087DE03 /* Widgets */, 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, B40FE50A21FAD228005D5578 /* Recovered References */, @@ -726,11 +619,8 @@ B40D4E30225841EC00428FCC /* BlueWalletWatch.app */, B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */, 3271B0A9236E2E0700DA766F /* BlueWallet - Bitcoin Price.appex */, - 6D9A2E02254BA347007B5B82 /* WalletInformationAndMarketWidgetExtension.appex */, - 6DEB4AAD254FB59B00E9F9AA /* WalletInformationWidgetExtension.appex */, - 6D99465E2555A660000E52E8 /* MarketWidgetExtension.appex */, - 6D6CA4B8255872E3009312A5 /* PriceWidgetExtension.appex */, 6D2A6461258BA92C0092292B /* Stickers.appex */, + 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */, ); name = Products; sourceTree = ""; @@ -744,6 +634,8 @@ FF45EB303C9601ED114589A4 /* Pods-MarketWidgetExtension.release.xcconfig */, AA7DCFB2C7887DF26EDB5710 /* Pods-WalletInformationAndMarketWidgetExtension.debug.xcconfig */, 7BAA8F97E61B677D33CF1944 /* Pods-WalletInformationAndMarketWidgetExtension.release.xcconfig */, + 8C30FBCA42C6BF0B45757763 /* Pods-WidgetsExtension.debug.xcconfig */, + E0A230940404CA7C51FBED37 /* Pods-WidgetsExtension.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -849,12 +741,9 @@ dependencies = ( B40D4E4C225841ED00428FCC /* PBXTargetDependency */, 3271B0B4236E2E0700DA766F /* PBXTargetDependency */, - 6D9A2E0C254BA348007B5B82 /* PBXTargetDependency */, - 6DEB4AB7254FB59E00E9F9AA /* PBXTargetDependency */, - 6D9946452555A583000E52E8 /* PBXTargetDependency */, 6D9946682555A661000E52E8 /* PBXTargetDependency */, - 6D6CA4C2255872E7009312A5 /* PBXTargetDependency */, 6D2A6467258BA92D0092292B /* PBXTargetDependency */, + 6DD410A6266CADF40087DE03 /* PBXTargetDependency */, ); name = BlueWallet; productName = "Hello World"; @@ -894,74 +783,22 @@ productReference = 6D2A6461258BA92C0092292B /* Stickers.appex */; productType = "com.apple.product-type.app-extension.messages-sticker-pack"; }; - 6D6CA4B7255872E3009312A5 /* PriceWidgetExtension */ = { + 6DD4109B266CADF10087DE03 /* WidgetsExtension */ = { isa = PBXNativeTarget; - buildConfigurationList = 6D6CA4C6255872E7009312A5 /* Build configuration list for PBXNativeTarget "PriceWidgetExtension" */; + buildConfigurationList = 6DD410A9266CADF40087DE03 /* Build configuration list for PBXNativeTarget "WidgetsExtension" */; buildPhases = ( - 6D6CA4B4255872E3009312A5 /* Sources */, - 6D6CA4B5255872E3009312A5 /* Frameworks */, - 6D6CA4B6255872E3009312A5 /* Resources */, + 0CD668CB2F65F36C4CADD5AB /* [CP] Check Pods Manifest.lock */, + 6DD41098266CADF10087DE03 /* Sources */, + 6DD41099266CADF10087DE03 /* Frameworks */, + 6DD4109A266CADF10087DE03 /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = PriceWidgetExtension; - productName = PriceWidgetExtension; - productReference = 6D6CA4B8255872E3009312A5 /* PriceWidgetExtension.appex */; - productType = "com.apple.product-type.app-extension"; - }; - 6D99465D2555A660000E52E8 /* MarketWidgetExtension */ = { - isa = PBXNativeTarget; - buildConfigurationList = 6D99466A2555A661000E52E8 /* Build configuration list for PBXNativeTarget "MarketWidgetExtension" */; - buildPhases = ( - 3DC2B4F006D9D733C3782C62 /* [CP] Check Pods Manifest.lock */, - 6D99465A2555A660000E52E8 /* Sources */, - 6D99465B2555A660000E52E8 /* Frameworks */, - 6D99465C2555A660000E52E8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = MarketWidgetExtension; - productName = MarketWidgetExtension; - productReference = 6D99465E2555A660000E52E8 /* MarketWidgetExtension.appex */; - productType = "com.apple.product-type.app-extension"; - }; - 6D9A2E01254BA347007B5B82 /* WalletInformationAndMarketWidgetExtension */ = { - isa = PBXNativeTarget; - buildConfigurationList = 6D9A2E0E254BA348007B5B82 /* Build configuration list for PBXNativeTarget "WalletInformationAndMarketWidgetExtension" */; - buildPhases = ( - E236ECCDCA1DDCA1D4270919 /* [CP] Check Pods Manifest.lock */, - 6D9A2DFE254BA347007B5B82 /* Sources */, - 6D9A2DFF254BA347007B5B82 /* Frameworks */, - 6D9A2E00254BA347007B5B82 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = WalletInformationAndMarketWidgetExtension; - productName = MarketWidgetExtension; - productReference = 6D9A2E02254BA347007B5B82 /* WalletInformationAndMarketWidgetExtension.appex */; - productType = "com.apple.product-type.app-extension"; - }; - 6DEB4AAC254FB59B00E9F9AA /* WalletInformationWidgetExtension */ = { - isa = PBXNativeTarget; - buildConfigurationList = 6DEB4ABB254FB59E00E9F9AA /* Build configuration list for PBXNativeTarget "WalletInformationWidgetExtension" */; - buildPhases = ( - 6DEB4AA9254FB59B00E9F9AA /* Sources */, - 6DEB4AAA254FB59B00E9F9AA /* Frameworks */, - 6DEB4AAB254FB59B00E9F9AA /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = WalletInformationWidgetExtension; - productName = WalletInformationWidgetExtension; - productReference = 6DEB4AAD254FB59B00E9F9AA /* WalletInformationWidgetExtension.appex */; + name = WidgetsExtension; + productName = WidgetsExtension; + productReference = 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */; productType = "com.apple.product-type.app-extension"; }; B40D4E2F225841EC00428FCC /* BlueWalletWatch */ = { @@ -1008,7 +845,7 @@ 83CBB9F71A601CBA00E9B192 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1210; + LastSwiftUpdateCheck = 1250; LastUpgradeCheck = 1020; ORGANIZATIONNAME = BlueWallet; TargetAttributes = { @@ -1027,17 +864,8 @@ 6D2A6460258BA92C0092292B = { CreatedOnToolsVersion = 12.1; }; - 6D6CA4B7255872E3009312A5 = { - CreatedOnToolsVersion = 12.1; - }; - 6D99465D2555A660000E52E8 = { - CreatedOnToolsVersion = 12.1; - }; - 6D9A2E01254BA347007B5B82 = { - CreatedOnToolsVersion = 12.1; - }; - 6DEB4AAC254FB59B00E9F9AA = { - CreatedOnToolsVersion = 12.1; + 6DD4109B266CADF10087DE03 = { + CreatedOnToolsVersion = 12.5; }; B40D4E2F225841EC00428FCC = { CreatedOnToolsVersion = 10.2; @@ -1099,11 +927,8 @@ B40D4E2F225841EC00428FCC /* BlueWalletWatch */, B40D4E3B225841ED00428FCC /* BlueWalletWatch Extension */, 3271B0A8236E2E0700DA766F /* TodayExtension */, - 6D99465D2555A660000E52E8 /* MarketWidgetExtension */, - 6DEB4AAC254FB59B00E9F9AA /* WalletInformationWidgetExtension */, - 6D9A2E01254BA347007B5B82 /* WalletInformationAndMarketWidgetExtension */, - 6D6CA4B7255872E3009312A5 /* PriceWidgetExtension */, 6D2A6460258BA92C0092292B /* Stickers */, + 6DD4109B266CADF10087DE03 /* WidgetsExtension */, ); }; /* End PBXProject section */ @@ -1134,39 +959,12 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 6D6CA4B6255872E3009312A5 /* Resources */ = { + 6DD4109A266CADF10087DE03 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6D6CA4D725587397009312A5 /* Assets.xcassets in Resources */, - 6DE38F0A2657765900EA6C22 /* fiatUnit.json in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6D99465C2555A660000E52E8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6D9946832555A695000E52E8 /* Assets.xcassets in Resources */, - 6DE38F072657765900EA6C22 /* fiatUnit.json in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6D9A2E00254BA347007B5B82 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6D9A2E09254BA348007B5B82 /* Assets.xcassets in Resources */, - 6DE38F092657765900EA6C22 /* fiatUnit.json in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6DEB4AAB254FB59B00E9F9AA /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6DEB4B05254FB79100E9F9AA /* Assets.xcassets in Resources */, - 6DE38F082657765900EA6C22 /* fiatUnit.json in Resources */, + 6DD410B7266CAF5C0087DE03 /* Assets.xcassets in Resources */, + 6DD410AE266CAF1F0087DE03 /* fiatUnit.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1184,7 +982,6 @@ buildActionMask = 2147483647; files = ( B4EE583C226703320003363C /* Assets.xcassets in Resources */, - 6DE38F062657765900EA6C22 /* fiatUnit.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1205,21 +1002,7 @@ shellPath = /bin/sh; shellScript = "export SENTRY_PROPERTIES=sentry.properties\nexport NODE_BINARY=node\n../node_modules/@sentry/cli/bin/sentry-cli react-native xcode ../node_modules/react-native/scripts/react-native-xcode.sh\n"; }; - 2130DE983D1D45AC8FC45F7E /* Upload Debug Symbols to Sentry */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Upload Debug Symbols to Sentry"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export SENTRY_PROPERTIES=sentry.properties\n../node_modules/@sentry/cli/bin/sentry-cli upload-dsym"; - }; - 3DC2B4F006D9D733C3782C62 /* [CP] Check Pods Manifest.lock */ = { + 0CD668CB2F65F36C4CADD5AB /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1234,13 +1017,27 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-MarketWidgetExtension-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-WidgetsExtension-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + 2130DE983D1D45AC8FC45F7E /* Upload Debug Symbols to Sentry */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Upload Debug Symbols to Sentry"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export SENTRY_PROPERTIES=sentry.properties\n../node_modules/@sentry/cli/bin/sentry-cli upload-dsym"; + }; 68CD4C52AC5B27E333599B5C /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1331,28 +1128,6 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-resources.sh\"\n"; showEnvVarsInLog = 0; }; - E236ECCDCA1DDCA1D4270919 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-WalletInformationAndMarketWidgetExtension-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1378,76 +1153,27 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 6D6CA4B4255872E3009312A5 /* Sources */ = { + 6DD41098266CADF10087DE03 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6D6CA5452558F365009312A5 /* WidgetDataStore.swift in Sources */, - 6D6CA4E0255873BC009312A5 /* UserDefaultsGroup.swift in Sources */, - 6D6CA5322558ED4D009312A5 /* Colors.swift in Sources */, - 6D6CA4BD255872E3009312A5 /* PriceWidget.swift in Sources */, - 6D6CA5292558EC52009312A5 /* PriceView.swift in Sources */, - 6D2AA80B2568B8F40090B089 /* FiatUnit.swift in Sources */, - 6D6CA53C2558F316009312A5 /* WidgetAPI.swift in Sources */, - 6D4AF18925D215D1009DD853 /* UserDefaultsExtension.swift in Sources */, - 6D6CA5332558ED54009312A5 /* Models.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6D99465A2555A660000E52E8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6D9946892555A695000E52E8 /* WalletInformationView.swift in Sources */, - 6D9946862555A695000E52E8 /* WidgetAPI.swift in Sources */, - 6D9946842555A695000E52E8 /* Models.swift in Sources */, - 6D9946882555A695000E52E8 /* SendReceiveButtons.swift in Sources */, - 6D9946852555A695000E52E8 /* Colors.swift in Sources */, - 6D99468A2555A695000E52E8 /* WidgetDataStore.swift in Sources */, - 6D2AA8082568B8F40090B089 /* FiatUnit.swift in Sources */, - 6D99467B2555A68A000E52E8 /* MarketView.swift in Sources */, - 6D9946872555A695000E52E8 /* UserDefaultsGroup.swift in Sources */, - 6D9946632555A660000E52E8 /* MarketWidget.swift in Sources */, - 6D4AF18625D215D1009DD853 /* UserDefaultsExtension.swift in Sources */, - 6D6CA5152558EBA4009312A5 /* WidgetAPI+Electrum.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6D9A2DFE254BA347007B5B82 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6D641F2325525054003792DF /* WalletInformationView.swift in Sources */, - 6D2AA80A2568B8F40090B089 /* FiatUnit.swift in Sources */, - 6D9A2E6D254BAB1B007B5B82 /* WidgetAPI.swift in Sources */, - 6DEB4C3B254FBF4800E9F9AA /* Colors.swift in Sources */, - 6D6CA5282558EC52009312A5 /* PriceView.swift in Sources */, - 6D9A2E6F254BAB1B007B5B82 /* WidgetDataStore.swift in Sources */, - 6DA7047E254E24D5005FE5E2 /* UserDefaultsGroup.swift in Sources */, - 6D9A2E07254BA347007B5B82 /* WalletInformationAndMarketWidget.swift in Sources */, - 6D641F3525526311003792DF /* SendReceiveButtons.swift in Sources */, - 6DEB4BFB254FBA0E00E9F9AA /* Models.swift in Sources */, - 6D641F18255226DA003792DF /* MarketView.swift in Sources */, - 6D6CA5162558EBA4009312A5 /* WidgetAPI+Electrum.swift in Sources */, - 6D4AF18825D215D1009DD853 /* UserDefaultsExtension.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6DEB4AA9254FB59B00E9F9AA /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6D641F2425525054003792DF /* WalletInformationView.swift in Sources */, - 6DEB4AB2254FB59C00E9F9AA /* WalletInformationWidget.swift in Sources */, - 6DEB4C3C254FBF4800E9F9AA /* Colors.swift in Sources */, - 6DEB4BDA254FB98E00E9F9AA /* WidgetAPI.swift in Sources */, - 6DEB4BDB254FB98E00E9F9AA /* UserDefaultsGroup.swift in Sources */, - 6DEB4BD9254FB98E00E9F9AA /* WidgetDataStore.swift in Sources */, - 6D2AA8092568B8F40090B089 /* FiatUnit.swift in Sources */, - 6D641F3625526311003792DF /* SendReceiveButtons.swift in Sources */, - 6DEB4BFC254FBA0E00E9F9AA /* Models.swift in Sources */, - 6D641F19255226DA003792DF /* MarketView.swift in Sources */, - 6D4AF18725D215D1009DD853 /* UserDefaultsExtension.swift in Sources */, + 6DD410BE266CAF5C0087DE03 /* SendReceiveButtons.swift in Sources */, + 6DD410B4266CAF5C0087DE03 /* WidgetAPI.swift in Sources */, + 6DD410A1266CADF10087DE03 /* Widgets.swift in Sources */, + 6DD410AC266CAE470087DE03 /* PriceWidget.swift in Sources */, + 6DD410B2266CAF5C0087DE03 /* WalletInformationView.swift in Sources */, + 6DD410B6266CAF5C0087DE03 /* PriceView.swift in Sources */, + 6DD410B3266CAF5C0087DE03 /* Colors.swift in Sources */, + 6DD410BB266CAF5C0087DE03 /* MarketView.swift in Sources */, + 6DD410B5266CAF5C0087DE03 /* WidgetDataStore.swift in Sources */, + 6DD410C0266CB1460087DE03 /* MarketWidget.swift in Sources */, + 6DD410BA266CAF5C0087DE03 /* FiatUnit.swift in Sources */, + 6DD410AF266CAF5C0087DE03 /* WalletInformationAndMarketWidget.swift in Sources */, + 6DD410BF266CB13D0087DE03 /* Models.swift in Sources */, + 6DD410B0266CAF5C0087DE03 /* WalletInformationWidget.swift in Sources */, + 6DD410B1266CAF5C0087DE03 /* WidgetAPI+Electrum.swift in Sources */, + 6DD410B9266CAF5C0087DE03 /* UserDefaultsGroup.swift in Sources */, + 6DD410B8266CAF5C0087DE03 /* UserDefaultsExtension.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1493,34 +1219,14 @@ target = 6D2A6460258BA92C0092292B /* Stickers */; targetProxy = 6D2A6466258BA92D0092292B /* PBXContainerItemProxy */; }; - 6D6CA4C2255872E7009312A5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - platformFilter = ios; - target = 6D6CA4B7255872E3009312A5 /* PriceWidgetExtension */; - targetProxy = 6D6CA4C1255872E7009312A5 /* PBXContainerItemProxy */; - }; - 6D9946452555A583000E52E8 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - platformFilter = ios; - target = 6D99465D2555A660000E52E8 /* MarketWidgetExtension */; - targetProxy = 6D9946442555A583000E52E8 /* PBXContainerItemProxy */; - }; 6D9946682555A661000E52E8 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 6D99465D2555A660000E52E8 /* MarketWidgetExtension */; targetProxy = 6D9946672555A661000E52E8 /* PBXContainerItemProxy */; }; - 6D9A2E0C254BA348007B5B82 /* PBXTargetDependency */ = { + 6DD410A6266CADF40087DE03 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - platformFilter = ios; - target = 6D9A2E01254BA347007B5B82 /* WalletInformationAndMarketWidgetExtension */; - targetProxy = 6D9A2E0B254BA348007B5B82 /* PBXContainerItemProxy */; - }; - 6DEB4AB7254FB59E00E9F9AA /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - platformFilter = ios; - target = 6DEB4AAC254FB59B00E9F9AA /* WalletInformationWidgetExtension */; - targetProxy = 6DEB4AB6254FB59E00E9F9AA /* PBXContainerItemProxy */; + target = 6DD4109B266CADF10087DE03 /* WidgetsExtension */; + targetProxy = 6DD410A5266CADF40087DE03 /* PBXContainerItemProxy */; }; B40D4E3F225841ED00428FCC /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -1610,7 +1316,7 @@ CODE_SIGN_ENTITLEMENTS = BlueWallet/BlueWallet.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 508; + CURRENT_PROJECT_VERSION = 525; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; @@ -1660,7 +1366,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 508; + CURRENT_PROJECT_VERSION = 525; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; @@ -1705,7 +1411,7 @@ CODE_SIGN_ENTITLEMENTS = "TodayExtension/BlueWallet - Bitcoin Price.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 508; + CURRENT_PROJECT_VERSION = 525; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1744,7 +1450,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 508; + CURRENT_PROJECT_VERSION = 525; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1781,7 +1487,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 508; + CURRENT_PROJECT_VERSION = 525; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1812,7 +1518,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 508; + CURRENT_PROJECT_VERSION = 525; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1828,8 +1534,9 @@ }; name = Release; }; - 6D6CA4C4255872E7009312A5 /* Debug */ = { + 6DD410AA266CADF40087DE03 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 8C30FBCA42C6BF0B45757763 /* Pods-WidgetsExtension.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; @@ -1840,97 +1547,16 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = PriceWidgetExtension.entitlements; + CODE_SIGN_ENTITLEMENTS = WidgetsExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 508; + CURRENT_PROJECT_VERSION = 525; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "$(SRCROOT)/WalletInformationWidget/Widgets/PriceWidget/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 6.1.6; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 6D6CA4C5255872E7009312A5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = PriceWidgetExtension.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 508; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "$(SRCROOT)/WalletInformationWidget/Widgets/PriceWidget/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 6.1.6; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.PriceWidget; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = YES; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 6D99466B2555A661000E52E8 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 367FA8CEB35BC9431019D98A /* Pods-MarketWidgetExtension.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = MarketWidgetExtension.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 508; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "$(SRCROOT)/WalletInformationWidget/Widgets/MarketWidget/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; + INFOPLIST_FILE = Widgets/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.5; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1941,19 +1567,18 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,6"; }; name = Debug; }; - 6D99466C2555A661000E52E8 /* Release */ = { + 6DD410AB266CADF40087DE03 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FF45EB303C9601ED114589A4 /* Pods-MarketWidgetExtension.release.xcconfig */; + baseConfigurationReference = E0A230940404CA7C51FBED37 /* Pods-WidgetsExtension.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; @@ -1964,16 +1589,18 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = MarketWidgetExtension.entitlements; + CODE_SIGN_ENTITLEMENTS = WidgetsExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 508; + CURRENT_PROJECT_VERSION = 525; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "$(SRCROOT)/WalletInformationWidget/Widgets/MarketWidget/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; + INFOPLIST_FILE = Widgets/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.5; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1983,179 +1610,11 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = YES; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 6D9A2E0F254BA348007B5B82 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = AA7DCFB2C7887DF26EDB5710 /* Pods-WalletInformationAndMarketWidgetExtension.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = MarketWidgetExtension.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 508; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_EXPAND_BUILD_SETTINGS = YES; - INFOPLIST_FILE = WalletInformationWidget/Widgets/MarketWidget/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 6.1.6; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 6D9A2E10254BA348007B5B82 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7BAA8F97E61B677D33CF1944 /* Pods-WalletInformationAndMarketWidgetExtension.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = MarketWidgetExtension.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 508; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_EXPAND_BUILD_SETTINGS = YES; - INFOPLIST_FILE = WalletInformationWidget/Widgets/MarketWidget/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 6.1.6; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationAndMarketWidget; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = YES; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 6DEB4AB9254FB59E00E9F9AA /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = WalletInformationWidgetExtension.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 508; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = WalletInformationWidget/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 6.1.6; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 6DEB4ABA254FB59E00E9F9AA /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = WalletInformationWidgetExtension.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 508; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = WalletInformationWidget/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 6.1.6; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.WalletInformationWidget; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = YES; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,6"; }; name = Release; }; @@ -2278,7 +1737,7 @@ CODE_SIGN_ENTITLEMENTS = "BlueWalletWatch Extension/BlueWalletWatch Extension.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 508; + CURRENT_PROJECT_VERSION = 525; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2318,7 +1777,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 508; + CURRENT_PROJECT_VERSION = 525; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2358,7 +1817,7 @@ CODE_SIGN_ENTITLEMENTS = BlueWalletWatch/BlueWalletWatch.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 508; + CURRENT_PROJECT_VERSION = 525; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2397,7 +1856,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 508; + CURRENT_PROJECT_VERSION = 525; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2449,38 +1908,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 6D6CA4C6255872E7009312A5 /* Build configuration list for PBXNativeTarget "PriceWidgetExtension" */ = { + 6DD410A9266CADF40087DE03 /* Build configuration list for PBXNativeTarget "WidgetsExtension" */ = { isa = XCConfigurationList; buildConfigurations = ( - 6D6CA4C4255872E7009312A5 /* Debug */, - 6D6CA4C5255872E7009312A5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 6D99466A2555A661000E52E8 /* Build configuration list for PBXNativeTarget "MarketWidgetExtension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 6D99466B2555A661000E52E8 /* Debug */, - 6D99466C2555A661000E52E8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 6D9A2E0E254BA348007B5B82 /* Build configuration list for PBXNativeTarget "WalletInformationAndMarketWidgetExtension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 6D9A2E0F254BA348007B5B82 /* Debug */, - 6D9A2E10254BA348007B5B82 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 6DEB4ABB254FB59E00E9F9AA /* Build configuration list for PBXNativeTarget "WalletInformationWidgetExtension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 6DEB4AB9254FB59E00E9F9AA /* Debug */, - 6DEB4ABA254FB59E00E9F9AA /* Release */, + 6DD410AA266CADF40087DE03 /* Debug */, + 6DD410AB266CADF40087DE03 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/ios/BlueWallet/Info.plist b/ios/BlueWallet/Info.plist index cb5808010..cb44b8a4c 100644 --- a/ios/BlueWallet/Info.plist +++ b/ios/BlueWallet/Info.plist @@ -150,7 +150,7 @@ NSCalendarsUsageDescription This alert should not show up as we do not require this data NSCameraUsageDescription - In order to quickly scan the recipient's address, we need your permission to use the camera to scan their QR Code. + In order to quickly scan the recipient's address, we need your permission to use the camera to scan their QR Code. NSFaceIDUsageDescription In order to use FaceID please confirm your permission. NSLocationAlwaysUsageDescription diff --git a/ios/MarketWidgetExtension.entitlements b/ios/MarketWidgetExtension.entitlements deleted file mode 100644 index 8030e4904..000000000 --- a/ios/MarketWidgetExtension.entitlements +++ /dev/null @@ -1,14 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.application-groups - - group.io.bluewallet.bluewallet - - com.apple.security.network.client - - - diff --git a/ios/Podfile b/ios/Podfile index 90527c069..716f9f1af 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -30,10 +30,6 @@ target 'BlueWallet' do end -target 'MarketWidgetExtension' do - pod 'SwiftSocket', :git => 'https://github.com/swiftsocket/SwiftSocket.git', :branch => 'master' -end - -target 'WalletInformationAndMarketWidgetExtension' do +target 'WidgetsExtension' do pod 'SwiftSocket', :git => 'https://github.com/swiftsocket/SwiftSocket.git', :branch => 'master' end \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 6b7f4ffa1..b3294aeec 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -782,6 +782,6 @@ SPEC CHECKSUMS: Yoga: 4bd86afe9883422a7c4028c00e34790f560923d6 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: e5cd06c8e5cb8f554b34954eef0d4d4f18e7d9d2 +PODFILE CHECKSUM: 73464a154246ad233697748ecc693fe37cb2eacb COCOAPODS: 1.10.1 diff --git a/ios/PriceWidgetExtension.entitlements b/ios/PriceWidgetExtension.entitlements deleted file mode 100644 index 8030e4904..000000000 --- a/ios/PriceWidgetExtension.entitlements +++ /dev/null @@ -1,14 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.application-groups - - group.io.bluewallet.bluewallet - - com.apple.security.network.client - - - diff --git a/ios/WalletInformationWidget/Info.plist b/ios/WalletInformationWidget/Info.plist deleted file mode 100644 index e161bc0f4..000000000 --- a/ios/WalletInformationWidget/Info.plist +++ /dev/null @@ -1,29 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - WalletInformationWidget - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSExtension - - NSExtensionPointIdentifier - com.apple.widgetkit-extension - - - diff --git a/ios/WalletInformationWidget/WalletInformationWidget.swift b/ios/WalletInformationWidget/WalletInformationWidget.swift index 4c14eaf14..17f57fba8 100644 --- a/ios/WalletInformationWidget/WalletInformationWidget.swift +++ b/ios/WalletInformationWidget/WalletInformationWidget.swift @@ -9,34 +9,35 @@ import WidgetKit import SwiftUI -struct Provider: TimelineProvider { - func placeholder(in context: Context) -> SimpleEntry { - return SimpleEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 10000), allWalletsBalance: WalletData(balance: 1000000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000))) +struct WalletInformationWidgetProvider: TimelineProvider { + typealias Entry = WalletInformationWidgetEntry + func placeholder(in context: Context) -> WalletInformationWidgetEntry { + return WalletInformationWidgetEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 10000), allWalletsBalance: WalletData(balance: 1000000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000))) } - func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) { - let entry: SimpleEntry + func getSnapshot(in context: Context, completion: @escaping (WalletInformationWidgetEntry) -> ()) { + let entry: WalletInformationWidgetEntry if (context.isPreview) { - entry = SimpleEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 10000), allWalletsBalance: WalletData(balance: 1000000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000))) + entry = WalletInformationWidgetEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 10000), allWalletsBalance: WalletData(balance: 1000000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000))) } else { - entry = SimpleEntry(date: Date(), marketData: emptyMarketData) + entry = WalletInformationWidgetEntry(date: Date(), marketData: emptyMarketData) } completion(entry) } func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { - var entries: [SimpleEntry] = [] + var entries: [WalletInformationWidgetEntry] = [] let userPreferredCurrency = WidgetAPI.getUserPreferredCurrency(); let marketDataEntry = MarketData(nextBlock: "...", sats: "...", price: "...", rate: 0) let allwalletsBalance = WalletData(balance: UserDefaultsGroup.getAllWalletsBalance(), latestTransactionTime: UserDefaultsGroup.getAllWalletsLatestTransactionTime()) WidgetAPI.fetchPrice(currency: userPreferredCurrency, completion: { (result, error) in - let entry: SimpleEntry + let entry: WalletInformationWidgetEntry if let result = result { - entry = SimpleEntry(date: Date(), marketData: MarketData(nextBlock: "", sats: "", price: result.formattedRate ?? "!", rate: result.rateDouble), allWalletsBalance: allwalletsBalance) + entry = WalletInformationWidgetEntry(date: Date(), marketData: MarketData(nextBlock: "", sats: "", price: result.formattedRate ?? "!", rate: result.rateDouble), allWalletsBalance: allwalletsBalance) } else { - entry = SimpleEntry(date: Date(), marketData: marketDataEntry, allWalletsBalance: allwalletsBalance) + entry = WalletInformationWidgetEntry(date: Date(), marketData: marketDataEntry, allWalletsBalance: allwalletsBalance) } entries.append(entry) let timeline = Timeline(entries: entries, policy: .atEnd) @@ -45,14 +46,14 @@ struct Provider: TimelineProvider { } } -struct SimpleEntry: TimelineEntry { +struct WalletInformationWidgetEntry: TimelineEntry { let date: Date let marketData: MarketData var allWalletsBalance: WalletData = WalletData(balance: 0) } struct WalletInformationWidgetEntryView : View { - var entry: Provider.Entry + let entry: WalletInformationWidgetEntry var WalletBalance: some View { WalletInformationView(allWalletsBalance: entry.allWalletsBalance, marketData: entry.marketData) @@ -65,22 +66,21 @@ struct WalletInformationWidgetEntryView : View { } } -@main struct WalletInformationWidget: Widget { let kind: String = "WalletInformationWidget" var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: Provider()) { entry in + StaticConfiguration(kind: kind, provider: WalletInformationWidgetProvider()) { entry in WalletInformationWidgetEntryView(entry: entry) } - .configurationDisplayName("Wallets") - .description("View your total wallet balance.").supportedFamilies([.systemSmall]) + .configurationDisplayName("Balance") + .description("View your accumulated balance.").supportedFamilies([.systemSmall]) } } struct WalletInformationWidget_Previews: PreviewProvider { static var previews: some View { - WalletInformationWidgetEntryView(entry: SimpleEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: Double(0)), allWalletsBalance: WalletData(balance: 10000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000)))) + WalletInformationWidgetEntryView(entry: WalletInformationWidgetEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: Double(0)), allWalletsBalance: WalletData(balance: 10000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000)))) .previewContext(WidgetPreviewContext(family: .systemSmall)) } } diff --git a/ios/WalletInformationWidget/Widgets/MarketWidget/Info.plist b/ios/WalletInformationWidget/Widgets/MarketWidget/Info.plist deleted file mode 100644 index 8f520812f..000000000 --- a/ios/WalletInformationWidget/Widgets/MarketWidget/Info.plist +++ /dev/null @@ -1,29 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - MarketWidget - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSExtension - - NSExtensionPointIdentifier - com.apple.widgetkit-extension - - - diff --git a/ios/WalletInformationWidget/Widgets/WalletInformationAndMarketWidget/Info.plist b/ios/WalletInformationWidget/Widgets/WalletInformationAndMarketWidget/Info.plist deleted file mode 100644 index ce40d34c5..000000000 --- a/ios/WalletInformationWidget/Widgets/WalletInformationAndMarketWidget/Info.plist +++ /dev/null @@ -1,29 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - WalletInformationAndMarketWidget - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSExtension - - NSExtensionPointIdentifier - com.apple.widgetkit-extension - - - diff --git a/ios/WalletInformationWidgetExtension.entitlements b/ios/WalletInformationWidgetExtension.entitlements deleted file mode 100644 index 8030e4904..000000000 --- a/ios/WalletInformationWidgetExtension.entitlements +++ /dev/null @@ -1,14 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.application-groups - - group.io.bluewallet.bluewallet - - com.apple.security.network.client - - - diff --git a/ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/AccentColor.colorset/Contents.json b/ios/Widgets/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/AccentColor.colorset/Contents.json rename to ios/Widgets/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Widgets/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json rename to ios/Widgets/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/ContainerGreen.colorset/Contents.json b/ios/Widgets/Assets.xcassets/ContainerGreen.colorset/Contents.json similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/ContainerGreen.colorset/Contents.json rename to ios/Widgets/Assets.xcassets/ContainerGreen.colorset/Contents.json diff --git a/ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/ContainerRed.colorset/Contents.json b/ios/Widgets/Assets.xcassets/ContainerRed.colorset/Contents.json similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/ContainerRed.colorset/Contents.json rename to ios/Widgets/Assets.xcassets/ContainerRed.colorset/Contents.json diff --git a/ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/Contents.json b/ios/Widgets/Assets.xcassets/Contents.json similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/Contents.json rename to ios/Widgets/Assets.xcassets/Contents.json diff --git a/ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/TextColor.colorset/Contents.json b/ios/Widgets/Assets.xcassets/TextColor.colorset/Contents.json similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/TextColor.colorset/Contents.json rename to ios/Widgets/Assets.xcassets/TextColor.colorset/Contents.json diff --git a/ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/WidgetBackground.colorset/Contents.json b/ios/Widgets/Assets.xcassets/WidgetBackground.colorset/Contents.json similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Assets.xcassets/WidgetBackground.colorset/Contents.json rename to ios/Widgets/Assets.xcassets/WidgetBackground.colorset/Contents.json diff --git a/ios/WalletInformationWidget/Widgets/PriceWidget/Info.plist b/ios/Widgets/Info.plist similarity index 96% rename from ios/WalletInformationWidget/Widgets/PriceWidget/Info.plist rename to ios/Widgets/Info.plist index 02dc1c990..0e3dabb23 100644 --- a/ios/WalletInformationWidget/Widgets/PriceWidget/Info.plist +++ b/ios/Widgets/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - PriceWidget + Widgets CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/ios/WalletInformationWidget/Widgets/MarketWidget/MarketWidget.swift b/ios/Widgets/MarketWidget/MarketWidget.swift similarity index 58% rename from ios/WalletInformationWidget/Widgets/MarketWidget/MarketWidget.swift rename to ios/Widgets/MarketWidget/MarketWidget.swift index 5532c87cb..235aac6ad 100644 --- a/ios/WalletInformationWidget/Widgets/MarketWidget/MarketWidget.swift +++ b/ios/Widgets/MarketWidget/MarketWidget.swift @@ -9,25 +9,25 @@ import WidgetKit import SwiftUI -struct Provider: TimelineProvider { - func placeholder(in context: Context) -> SimpleEntry { - return SimpleEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10 000", rate: 10000)) +struct MarketWidgetProvider: TimelineProvider { + func placeholder(in context: Context) -> MarketWidgetEntry { + return MarketWidgetEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10 000", rate: 10000)) } - func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) { - let entry: SimpleEntry + func getSnapshot(in context: Context, completion: @escaping (MarketWidgetEntry) -> ()) { + let entry: MarketWidgetEntry if (context.isPreview) { - entry = SimpleEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10 000", rate: 10000)) + entry = MarketWidgetEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10 000", rate: 10000)) } else { - entry = SimpleEntry(date: Date(), marketData: emptyMarketData) + entry = MarketWidgetEntry(date: Date(), marketData: emptyMarketData) } completion(entry) } func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { - var entries: [SimpleEntry] = [] + var entries: [MarketWidgetEntry] = [] if context.isPreview { - let entry = SimpleEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10 000", rate: 10000)) + let entry = MarketWidgetEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10 000", rate: 10000)) entries.append(entry) let timeline = Timeline(entries: entries, policy: .atEnd) completion(timeline) @@ -35,12 +35,12 @@ struct Provider: TimelineProvider { let userPreferredCurrency = WidgetAPI.getUserPreferredCurrency(); let marketDataEntry = MarketData(nextBlock: "...", sats: "...", price: "...", rate: 0) WidgetAPI.fetchMarketData(currency: userPreferredCurrency, completion: { (result, error) in - let entry: SimpleEntry + let entry: MarketWidgetEntry if let result = result { - entry = SimpleEntry(date: Date(), marketData: result) + entry = MarketWidgetEntry(date: Date(), marketData: result) } else { - entry = SimpleEntry(date: Date(), marketData: marketDataEntry) + entry = MarketWidgetEntry(date: Date(), marketData: marketDataEntry) } entries.append(entry) let timeline = Timeline(entries: entries, policy: .atEnd) @@ -50,13 +50,13 @@ struct Provider: TimelineProvider { } } -struct SimpleEntry: TimelineEntry { +struct MarketWidgetEntry: TimelineEntry { let date: Date let marketData: MarketData } struct MarketWidgetEntryView : View { - var entry: Provider.Entry + var entry: MarketWidgetProvider.Entry var MarketStack: some View { MarketView(marketData: entry.marketData).padding(EdgeInsets(top: 18, leading: 11, bottom: 18, trailing: 11)) @@ -69,12 +69,11 @@ struct MarketWidgetEntryView : View { } } -@main struct MarketWidget: Widget { let kind: String = "MarketWidget" var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: Provider()) { entry in + StaticConfiguration(kind: kind, provider: MarketWidgetProvider()) { entry in MarketWidgetEntryView(entry: entry) } .configurationDisplayName("Market") @@ -84,7 +83,7 @@ struct MarketWidget: Widget { struct MarketWidget_Previews: PreviewProvider { static var previews: some View { - MarketWidgetEntryView(entry: SimpleEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 0))) + MarketWidgetEntryView(entry: MarketWidgetEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 0))) .previewContext(WidgetPreviewContext(family: .systemSmall)) } } diff --git a/ios/WalletInformationWidget/Widgets/PriceWidget/PriceWidget.swift b/ios/Widgets/PriceWidget/PriceWidget.swift similarity index 64% rename from ios/WalletInformationWidget/Widgets/PriceWidget/PriceWidget.swift rename to ios/Widgets/PriceWidget/PriceWidget.swift index a8b8cc0bd..c7a03e0fd 100644 --- a/ios/WalletInformationWidget/Widgets/PriceWidget/PriceWidget.swift +++ b/ios/Widgets/PriceWidget/PriceWidget.swift @@ -10,26 +10,27 @@ import WidgetKit import SwiftUI var marketData: [MarketDataTimeline: MarketData?] = [ .Current: nil, .Previous: nil] -struct Provider: TimelineProvider { +struct PriceWidgetProvider: TimelineProvider { + typealias Entry = PriceWidgetEntry - func placeholder(in context: Context) -> SimpleEntry { - return SimpleEntry(date: Date(), currentMarketData: MarketData(nextBlock: "", sats: "", price: "$10,000", rate: 10000, dateString: "2019-09-18T17:27:00+00:00")) + func placeholder(in context: Context) -> PriceWidgetEntry { + return PriceWidgetEntry(date: Date(), currentMarketData: MarketData(nextBlock: "", sats: "", price: "$10,000", rate: 10000, dateString: "2019-09-18T17:27:00+00:00")) } - func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) { - let entry: SimpleEntry + func getSnapshot(in context: Context, completion: @escaping (PriceWidgetEntry) -> ()) { + let entry: PriceWidgetEntry if (context.isPreview) { - entry = SimpleEntry(date: Date(), currentMarketData: MarketData(nextBlock: "", sats: "", price: "$10,000", rate: 10000, dateString: "2019-09-18T17:27:00+00:00")) + entry = PriceWidgetEntry(date: Date(), currentMarketData: MarketData(nextBlock: "", sats: "", price: "$10,000", rate: 10000, dateString: "2019-09-18T17:27:00+00:00")) } else { - entry = SimpleEntry(date: Date(), currentMarketData: emptyMarketData) + entry = PriceWidgetEntry(date: Date(), currentMarketData: emptyMarketData) } completion(entry) } func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { - var entries: [SimpleEntry] = [] + var entries: [PriceWidgetEntry] = [] if (context.isPreview) { - let entry = SimpleEntry(date: Date(), currentMarketData: MarketData(nextBlock: "", sats: "", price: "$10,000", rate: 10000, dateString: "2019-09-18T17:27:00+00:00")) + let entry = PriceWidgetEntry(date: Date(), currentMarketData: MarketData(nextBlock: "", sats: "", price: "$10,000", rate: 10000, dateString: "2019-09-18T17:27:00+00:00")) entries.append(entry) let timeline = Timeline(entries: entries, policy: .atEnd) completion(timeline) @@ -48,9 +49,9 @@ struct Provider: TimelineProvider { marketData[.Previous] = marketData[.Current] marketData[.Current] = currentMarketData entryMarketData = currentMarketData - entries.append(SimpleEntry(date:Date(), currentMarketData: entryMarketData)) + entries.append(PriceWidgetEntry(date:Date(), currentMarketData: entryMarketData)) } else { - entries.append(SimpleEntry(date:Date(), currentMarketData: currentMarketData)) + entries.append(PriceWidgetEntry(date:Date(), currentMarketData: currentMarketData)) } } @@ -61,7 +62,7 @@ struct Provider: TimelineProvider { } } -struct SimpleEntry: TimelineEntry { +struct PriceWidgetEntry: TimelineEntry { let date: Date let currentMarketData: MarketData? var previousMarketData: MarketData? { @@ -70,7 +71,7 @@ struct SimpleEntry: TimelineEntry { } struct PriceWidgetEntryView : View { - var entry: Provider.Entry + let entry: PriceWidgetEntry var priceView: some View { PriceView(currentMarketData: entry.currentMarketData, previousMarketData: marketData[.Previous] ?? emptyMarketData).padding() } @@ -82,12 +83,11 @@ struct PriceWidgetEntryView : View { } } -@main struct PriceWidget: Widget { let kind: String = "PriceWidget" var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: Provider()) { entry in + StaticConfiguration(kind: kind, provider: PriceWidgetProvider()) { entry in PriceWidgetEntryView(entry: entry) } .configurationDisplayName("Price") @@ -97,7 +97,7 @@ struct PriceWidget: Widget { struct PriceWidget_Previews: PreviewProvider { static var previews: some View { - PriceWidgetEntryView(entry: SimpleEntry(date: Date(), currentMarketData: MarketData(nextBlock: "", sats: "", price: "$10,000", rate: 10000, dateString: "2019-09-18T17:27:00+00:00"))) + PriceWidgetEntryView(entry: PriceWidgetEntry(date: Date(), currentMarketData: MarketData(nextBlock: "", sats: "", price: "$10,000", rate: 10000, dateString: "2019-09-18T17:27:00+00:00"))) .previewContext(WidgetPreviewContext(family: .systemSmall)) } } diff --git a/ios/WalletInformationWidget/Widgets/Shared/BlueWalletWatch-Bridging-Header.h b/ios/Widgets/Shared/BlueWalletWatch-Bridging-Header.h similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/BlueWalletWatch-Bridging-Header.h rename to ios/Widgets/Shared/BlueWalletWatch-Bridging-Header.h diff --git a/ios/WalletInformationWidget/Widgets/Shared/Colors.swift b/ios/Widgets/Shared/Colors.swift similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Colors.swift rename to ios/Widgets/Shared/Colors.swift diff --git a/ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnit.swift b/ios/Widgets/Shared/Fiat/FiatUnit.swift similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Fiat/FiatUnit.swift rename to ios/Widgets/Shared/Fiat/FiatUnit.swift diff --git a/ios/WalletInformationWidget/Widgets/Shared/Models.swift b/ios/Widgets/Shared/Models.swift similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Models.swift rename to ios/Widgets/Shared/Models.swift diff --git a/ios/WalletInformationWidget/Widgets/Shared/UserDefaultsExtension.swift b/ios/Widgets/Shared/UserDefaultsExtension.swift similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/UserDefaultsExtension.swift rename to ios/Widgets/Shared/UserDefaultsExtension.swift diff --git a/ios/WalletInformationWidget/Widgets/Shared/UserDefaultsGroup.swift b/ios/Widgets/Shared/UserDefaultsGroup.swift similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/UserDefaultsGroup.swift rename to ios/Widgets/Shared/UserDefaultsGroup.swift diff --git a/ios/WalletInformationWidget/Widgets/Shared/Views/MarketView.swift b/ios/Widgets/Shared/Views/MarketView.swift similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Views/MarketView.swift rename to ios/Widgets/Shared/Views/MarketView.swift diff --git a/ios/WalletInformationWidget/Widgets/Shared/Views/PriceView.swift b/ios/Widgets/Shared/Views/PriceView.swift similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Views/PriceView.swift rename to ios/Widgets/Shared/Views/PriceView.swift diff --git a/ios/WalletInformationWidget/Widgets/Shared/Views/SendReceiveButtons.swift b/ios/Widgets/Shared/Views/SendReceiveButtons.swift similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Views/SendReceiveButtons.swift rename to ios/Widgets/Shared/Views/SendReceiveButtons.swift diff --git a/ios/WalletInformationWidget/Widgets/Shared/Views/WalletInformationView.swift b/ios/Widgets/Shared/Views/WalletInformationView.swift similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/Views/WalletInformationView.swift rename to ios/Widgets/Shared/Views/WalletInformationView.swift diff --git a/ios/WalletInformationWidget/Widgets/Shared/WidgetAPI+Electrum.swift b/ios/Widgets/Shared/WidgetAPI+Electrum.swift similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/WidgetAPI+Electrum.swift rename to ios/Widgets/Shared/WidgetAPI+Electrum.swift diff --git a/ios/WalletInformationWidget/Widgets/Shared/WidgetAPI.swift b/ios/Widgets/Shared/WidgetAPI.swift similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/WidgetAPI.swift rename to ios/Widgets/Shared/WidgetAPI.swift diff --git a/ios/WalletInformationWidget/Widgets/Shared/WidgetDataStore.swift b/ios/Widgets/Shared/WidgetDataStore.swift similarity index 100% rename from ios/WalletInformationWidget/Widgets/Shared/WidgetDataStore.swift rename to ios/Widgets/Shared/WidgetDataStore.swift diff --git a/ios/WalletInformationWidget/Widgets/WalletInformationAndMarketWidget/WalletInformationAndMarketWidget.swift b/ios/Widgets/WalletInformationAndMarketWidget/WalletInformationAndMarketWidget.swift similarity index 56% rename from ios/WalletInformationWidget/Widgets/WalletInformationAndMarketWidget/WalletInformationAndMarketWidget.swift rename to ios/Widgets/WalletInformationAndMarketWidget/WalletInformationAndMarketWidget.swift index 29f602d07..1baf51106 100644 --- a/ios/WalletInformationWidget/Widgets/WalletInformationAndMarketWidget/WalletInformationAndMarketWidget.swift +++ b/ios/Widgets/WalletInformationAndMarketWidget/WalletInformationAndMarketWidget.swift @@ -9,25 +9,26 @@ import WidgetKit import SwiftUI -struct Provider: TimelineProvider { - func placeholder(in context: Context) -> SimpleEntry { - return SimpleEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 10000), allWalletsBalance: WalletData(balance: 1000000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000))) +struct WalletInformationAndMarketWidgetProvider: TimelineProvider { + typealias Entry = WalletInformationAndMarketWidgetEntry + func placeholder(in context: Context) -> WalletInformationAndMarketWidgetEntry { + return WalletInformationAndMarketWidgetEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 10000), allWalletsBalance: WalletData(balance: 1000000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000))) } - func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) { - let entry: SimpleEntry + func getSnapshot(in context: Context, completion: @escaping (WalletInformationAndMarketWidgetEntry) -> ()) { + let entry: WalletInformationAndMarketWidgetEntry if (context.isPreview) { - entry = SimpleEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 10000), allWalletsBalance: WalletData(balance: 1000000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000))) + entry = WalletInformationAndMarketWidgetEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 10000), allWalletsBalance: WalletData(balance: 1000000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000))) } else { - entry = SimpleEntry(date: Date(), marketData: emptyMarketData) + entry = WalletInformationAndMarketWidgetEntry(date: Date(), marketData: emptyMarketData) } completion(entry) } func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { - var entries: [SimpleEntry] = [] + var entries: [WalletInformationAndMarketWidgetEntry] = [] if (context.isPreview) { - let entry = SimpleEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 10000), allWalletsBalance: WalletData(balance: 1000000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000))) + let entry = WalletInformationAndMarketWidgetEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 10000), allWalletsBalance: WalletData(balance: 1000000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000))) entries.append(entry) let timeline = Timeline(entries: entries, policy: .atEnd) completion(timeline) @@ -36,12 +37,12 @@ struct Provider: TimelineProvider { let allwalletsBalance = WalletData(balance: UserDefaultsGroup.getAllWalletsBalance(), latestTransactionTime: UserDefaultsGroup.getAllWalletsLatestTransactionTime()) let marketDataEntry = MarketData(nextBlock: "...", sats: "...", price: "...", rate: 0) WidgetAPI.fetchMarketData(currency: userPreferredCurrency, completion: { (result, error) in - let entry: SimpleEntry + let entry: WalletInformationAndMarketWidgetEntry if let result = result { - entry = SimpleEntry(date: Date(), marketData: result, allWalletsBalance: allwalletsBalance) + entry = WalletInformationAndMarketWidgetEntry(date: Date(), marketData: result, allWalletsBalance: allwalletsBalance) } else { - entry = SimpleEntry(date: Date(), marketData: marketDataEntry, allWalletsBalance: allwalletsBalance) + entry = WalletInformationAndMarketWidgetEntry(date: Date(), marketData: marketDataEntry, allWalletsBalance: allwalletsBalance) } entries.append(entry) let timeline = Timeline(entries: entries, policy: .atEnd) @@ -51,7 +52,7 @@ struct Provider: TimelineProvider { } } -struct SimpleEntry: TimelineEntry { +struct WalletInformationAndMarketWidgetEntry: TimelineEntry { let date: Date let marketData: MarketData var allWalletsBalance: WalletData = WalletData(balance: 0) @@ -59,7 +60,7 @@ struct SimpleEntry: TimelineEntry { struct WalletInformationAndMarketWidgetEntryView : View { @Environment(\.widgetFamily) var family - var entry: Provider.Entry + let entry: WalletInformationAndMarketWidgetEntry var WalletBalance: some View { @@ -99,12 +100,11 @@ struct WalletInformationAndMarketWidgetEntryView : View { } } -@main struct WalletInformationAndMarketWidget: Widget { let kind: String = "WalletInformationAndMarketWidget" var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: Provider()) { entry in + StaticConfiguration(kind: kind, provider: WalletInformationAndMarketWidgetProvider()) { entry in WalletInformationAndMarketWidgetEntryView(entry: entry) } .configurationDisplayName("Wallet and Market") @@ -114,9 +114,9 @@ struct WalletInformationAndMarketWidget: Widget { struct WalletInformationAndMarketWidget_Previews: PreviewProvider { static var previews: some View { - WalletInformationAndMarketWidgetEntryView(entry: SimpleEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 0), allWalletsBalance: WalletData(balance: 10000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000)))) + WalletInformationAndMarketWidgetEntryView(entry: WalletInformationAndMarketWidgetEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 0), allWalletsBalance: WalletData(balance: 10000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000)))) .previewContext(WidgetPreviewContext(family: .systemMedium)) - WalletInformationAndMarketWidgetEntryView(entry: SimpleEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 0), allWalletsBalance: WalletData(balance: 10000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000)))) + WalletInformationAndMarketWidgetEntryView(entry: WalletInformationAndMarketWidgetEntry(date: Date(), marketData: MarketData(nextBlock: "26", sats: "9 134", price: "$10,000", rate: 0), allWalletsBalance: WalletData(balance: 10000, latestTransactionTime: LatestTransaction(isUnconfirmed: false, epochValue: 1568804029000)))) .previewContext(WidgetPreviewContext(family: .systemLarge)) } } diff --git a/ios/Widgets/Widgets.swift b/ios/Widgets/Widgets.swift new file mode 100644 index 000000000..ac8e25a92 --- /dev/null +++ b/ios/Widgets/Widgets.swift @@ -0,0 +1,21 @@ +// +// Widgets.swift +// Widgets +// +// Created by Marcos Rodriguez on 6/6/21. +// Copyright © 2021 BlueWallet. All rights reserved. +// + +import WidgetKit +import SwiftUI + +@main +struct Widgets: WidgetBundle { + @WidgetBundleBuilder + var body: some Widget { + PriceWidget() + MarketWidget() + WalletInformationAndMarketWidget() + WalletInformationWidget() + } +} From b3b56ae7f1e14565cd5241e5bcc2cd45b0cf8e9d Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sun, 6 Jun 2021 04:14:09 -0400 Subject: [PATCH 114/327] Update project.pbxproj --- ios/BlueWallet.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index 4138dc116..539eee162 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -1555,7 +1555,7 @@ DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1599,7 +1599,7 @@ DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", From 2b448add72458fc11bb159b434800e19bd0a28f5 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sun, 6 Jun 2021 05:23:44 -0400 Subject: [PATCH 115/327] OPS:Entitlements file --- ios/BlueWallet.xcodeproj/project.pbxproj | 7 +++++++ ios/BlueWallet/Info.plist | 6 +----- ios/WidgetsExtension.entitlements | 10 ++++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 ios/WidgetsExtension.entitlements diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index 539eee162..4d17b28d8 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -273,6 +273,7 @@ 6DD410A0266CADF10087DE03 /* Widgets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Widgets.swift; sourceTree = ""; }; 6DD410A4266CADF40087DE03 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 6DD410AD266CAF1F0087DE03 /* fiatUnit.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = fiatUnit.json; path = ../../../../models/fiatUnit.json; sourceTree = ""; }; + 6DD410C3266CCB780087DE03 /* WidgetsExtension.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = WidgetsExtension.entitlements; sourceTree = SOURCE_ROOT; }; 6DEB496F254E38DE00E9F9AA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MainInterface.strings; sourceTree = ""; }; 6DEB4AB1254FB59C00E9F9AA /* WalletInformationWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletInformationWidget.swift; sourceTree = ""; }; 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Models.swift; sourceTree = ""; }; @@ -542,6 +543,7 @@ 6DD4109F266CADF10087DE03 /* Widgets */ = { isa = PBXGroup; children = ( + 6DD410C3266CCB780087DE03 /* WidgetsExtension.entitlements */, 6DD410A0266CADF10087DE03 /* Widgets.swift */, 6DD410A4266CADF40087DE03 /* Info.plist */, 6D9A2E08254BA348007B5B82 /* Assets.xcassets */, @@ -1549,6 +1551,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = WidgetsExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 525; DEBUG_INFORMATION_FORMAT = dwarf; @@ -1567,6 +1570,8 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; @@ -1610,6 +1615,8 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = YES; SWIFT_OPTIMIZATION_LEVEL = "-O"; diff --git a/ios/BlueWallet/Info.plist b/ios/BlueWallet/Info.plist index cb44b8a4c..2eada192f 100644 --- a/ios/BlueWallet/Info.plist +++ b/ios/BlueWallet/Info.plist @@ -150,7 +150,7 @@ NSCalendarsUsageDescription This alert should not show up as we do not require this data NSCameraUsageDescription - In order to quickly scan the recipient's address, we need your permission to use the camera to scan their QR Code. + In order to quickly scan the recipient's address, we need your permission to use the camera to scan their QR Code. NSFaceIDUsageDescription In order to use FaceID please confirm your permission. NSLocationAlwaysUsageDescription @@ -167,10 +167,6 @@ In order to import an image for scanning, we need your permission to access your photo library. NSSpeechRecognitionUsageDescription This alert should not show up as we do not require this data - NSUserActivityTypes - - ConfigurationIntent - UIAppFonts AntDesign.ttf diff --git a/ios/WidgetsExtension.entitlements b/ios/WidgetsExtension.entitlements new file mode 100644 index 000000000..ee95ab7e5 --- /dev/null +++ b/ios/WidgetsExtension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.network.client + + + From a45cba0c300ab39e55ff63b98e38efdad273fc01 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sun, 6 Jun 2021 05:38:03 -0400 Subject: [PATCH 116/327] FIX: Recipient amount text align --- screen/send/details.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/screen/send/details.js b/screen/send/details.js index 07fa965cf..ada3582cd 100644 --- a/screen/send/details.js +++ b/screen/send/details.js @@ -25,7 +25,7 @@ import RNFS from 'react-native-fs'; import BigNumber from 'bignumber.js'; import * as bitcoin from 'bitcoinjs-lib'; -import { BlueButton, BlueDismissKeyboardInputAccessory, BlueListItem, BlueLoading, BlueText } from '../../BlueComponents'; +import { BlueButton, BlueDismissKeyboardInputAccessory, BlueListItem, BlueLoading } from '../../BlueComponents'; import { navigationStyleTx } from '../../components/navigationStyle'; import NetworkTransactionFees, { NetworkTransactionFee } from '../../models/networkTransactionFees'; import { BitcoinUnit, Chain } from '../../models/bitcoinUnits'; @@ -1190,9 +1190,7 @@ const SendDetails = () => { launchedBy={name} /> {addresses.length > 1 && ( - - {loc.formatString(loc._.of, { number: index + 1, total: addresses.length })} - + {loc.formatString(loc._.of, { number: index + 1, total: addresses.length })} )} ); From af3fe6f5c5f2ce556fd0947dad23d93b86ac1204 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sun, 6 Jun 2021 05:50:12 -0400 Subject: [PATCH 117/327] FIX: Header would flash on dark mode transitions --- Navigation.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/Navigation.js b/Navigation.js index bf088a22f..68b197ef6 100644 --- a/Navigation.js +++ b/Navigation.js @@ -89,7 +89,6 @@ const defaultScreenOptions = ? ({ route, navigation }) => ({ gestureEnabled: true, cardOverlayEnabled: true, - cardStyle: { backgroundColor: '#FFFFFF' }, headerStatusBarHeight: navigation.dangerouslyGetState().routes.indexOf(route) > 0 ? 10 : undefined, ...TransitionPresets.ModalPresentationIOS, gestureResponseDistance: { vertical: Dimensions.get('window').height, horizontal: 50 }, @@ -104,7 +103,6 @@ const defaultStackScreenOptions = ? { gestureEnabled: true, cardOverlayEnabled: true, - cardStyle: { backgroundColor: '#FFFFFF' }, headerStatusBarHeight: 10, } : { From edee84f20ba274f934332b56621805fe561d70ca Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sun, 6 Jun 2021 05:59:48 -0400 Subject: [PATCH 118/327] FIX: React Nav would throw a warning when passing a func to setParams --- screen/wallets/reorderWallets.js | 34 +++++++++----------------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/screen/wallets/reorderWallets.js b/screen/wallets/reorderWallets.js index 0afa18651..2486b9369 100644 --- a/screen/wallets/reorderWallets.js +++ b/screen/wallets/reorderWallets.js @@ -4,7 +4,7 @@ import { BluePrivateBalance } from '../../BlueComponents'; import SortableList from 'react-native-sortable-list'; import LinearGradient from 'react-native-linear-gradient'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; -import { useNavigation, useTheme } from '@react-navigation/native'; +import { useTheme } from '@react-navigation/native'; import navigationStyle from '../../components/navigationStyle'; import { PlaceholderWallet, LightningCustodianWallet, MultisigHDWallet } from '../../class'; @@ -75,7 +75,6 @@ const ReorderWallets = () => { const [hasMovedARow, setHasMovedARow] = useState(false); const [scrollEnabled, setScrollEnabled] = useState(true); const sortableList = useRef(); - const { setParams, goBack } = useNavigation(); const { colors } = useTheme(); const { wallets, setWalletsWithNewOrder } = useContext(BlueStorageContext); const stylesHook = { @@ -88,25 +87,15 @@ const ReorderWallets = () => { }; useEffect(() => { - setParams( - { - customCloseButtonFunction: async () => { - if (sortableList.current.state.data.length === data.length && hasMovedARow) { - const newWalletsOrderArray = []; - sortableList.current.state.order.forEach(element => { - newWalletsOrderArray.push(data[element]); - }); - setWalletsWithNewOrder(newWalletsOrderArray); - goBack(); - } else { - goBack(); - } - }, - }, - [], - ); + if (sortableList.current?.state.data.length === data.length && hasMovedARow) { + const newWalletsOrderArray = []; + sortableList.current.state.order.forEach(element => { + newWalletsOrderArray.push(data[element]); + }); + setWalletsWithNewOrder(newWalletsOrderArray); + } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [goBack, hasMovedARow, setParams]); + }, [hasMovedARow]); useEffect(() => { const loadWallets = wallets.filter(wallet => wallet.type !== PlaceholderWallet.type); @@ -202,11 +191,6 @@ const ReorderWallets = () => { ReorderWallets.navigationOptions = navigationStyle( { closeButton: true, - closeButtonFunc: ({ navigation, route }) => { - if (route.params && route.params.customCloseButtonFunction) { - route.params.customCloseButtonFunction(); - } - }, headerLeft: null, }, opts => ({ ...opts, title: loc.wallets.reorder_title }), From d6f1660d3d8c1e3d5bce7e898e316c3e006d9e89 Mon Sep 17 00:00:00 2001 From: marcosrdz Date: Sun, 6 Jun 2021 11:58:57 -0400 Subject: [PATCH 119/327] FIX: Widget App Group --- ios/Widgets/Widgets.swift | 2 +- ios/WidgetsExtension.entitlements | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ios/Widgets/Widgets.swift b/ios/Widgets/Widgets.swift index ac8e25a92..b74f3decb 100644 --- a/ios/Widgets/Widgets.swift +++ b/ios/Widgets/Widgets.swift @@ -14,8 +14,8 @@ struct Widgets: WidgetBundle { @WidgetBundleBuilder var body: some Widget { PriceWidget() + WalletInformationWidget() MarketWidget() WalletInformationAndMarketWidget() - WalletInformationWidget() } } diff --git a/ios/WidgetsExtension.entitlements b/ios/WidgetsExtension.entitlements index ee95ab7e5..8030e4904 100644 --- a/ios/WidgetsExtension.entitlements +++ b/ios/WidgetsExtension.entitlements @@ -4,6 +4,10 @@ com.apple.security.app-sandbox + com.apple.security.application-groups + + group.io.bluewallet.bluewallet + com.apple.security.network.client From 1996a33e8cc34457c2aa96f1c88c16af8ebc0229 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 8 Jun 2021 22:50:55 +0000 Subject: [PATCH 120/327] fix: upgrade react-native-camera from 3.43.8 to 3.43.9 Snyk has created this PR to upgrade react-native-camera from 3.43.8 to 3.43.9. See this package in npm: https://www.npmjs.com/package/react-native-camera See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3693033a4..2835fce90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17490,9 +17490,9 @@ "from": "git+https://github.com/BlueWallet/react-native-blue-crypto.git" }, "react-native-camera": { - "version": "3.43.8", - "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.43.8.tgz", - "integrity": "sha512-OLQ0UfYaQz7VI8yLpYHFcsfg8R+zbsnxYrFxyVjfxOagqAllkFOgPI7eCf6S5HM119RQV6a+gAK2M2ZXzv8OvA==", + "version": "3.43.9", + "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.43.9.tgz", + "integrity": "sha512-HTXxkGdNa9G0ErVXBoqsf1lYorBXjXfVZbDeHUBVxQrOqL8CV3eJTuaY5kHH41Y7woJ8yISmklZeUwpZrskEgw==", "requires": { "prop-types": "^15.6.2" } diff --git a/package.json b/package.json index 575405b21..ac1d8d451 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "react-localization": "1.0.17", "react-native": "0.63.4", "react-native-blue-crypto": "https://github.com/BlueWallet/react-native-blue-crypto", - "react-native-camera": "3.43.8", + "react-native-camera": "3.43.9", "react-native-crypto": "2.2.0", "react-native-default-preference": "1.4.3", "react-native-device-info": "8.1.3", From 9a705c84cedf37f7220a5b7a9f0db49279f8670f Mon Sep 17 00:00:00 2001 From: Overtorment Date: Wed, 9 Jun 2021 14:51:53 +0100 Subject: [PATCH 121/327] FIX: rare alert that recipients list can't be empty --- screen/send/details.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/screen/send/details.js b/screen/send/details.js index ada3582cd..a8a8565f0 100644 --- a/screen/send/details.js +++ b/screen/send/details.js @@ -497,7 +497,13 @@ const SendDetails = () => { }; await saveToDisk(); - const recipients = outputs.filter(({ address }) => address !== changeAddress); + let recipients = outputs.filter(({ address }) => address !== changeAddress); + + if (recipients.length === 0) { + // special case. maybe the only destination in this transaction is our own change address..? + // (ez can be the case for single-address wallet when doing self-payment for consolidation) + recipients = outputs; + } navigation.navigate('Confirm', { fee: new BigNumber(fee).dividedBy(100000000).toNumber(), From d11727f1920988e372edaf0687a4efa3826979ea Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 10 Jun 2021 23:06:43 +0000 Subject: [PATCH 122/327] fix: upgrade react-native-image-picker from 3.6.0 to 3.7.0 Snyk has created this PR to upgrade react-native-image-picker from 3.6.0 to 3.7.0. See this package in npm: https://www.npmjs.com/package/react-native-image-picker See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2835fce90..0c2455ca2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17624,9 +17624,9 @@ "from": "git+https://github.com/BlueWallet/react-native-idle-timer.git#8587876d68ab5920e79619726aeca9e672beaf2b" }, "react-native-image-picker": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-3.6.0.tgz", - "integrity": "sha512-5Qs4w1aN4hzESKl8qqYhSuXa84AYy1E9Je/owG7c1N+Gb4fWkmSL/fldiMJ/UYMXg4Ae/1tikLLAbJDTofCkAQ==" + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-3.7.0.tgz", + "integrity": "sha512-WeJPK1sgIODBzEOpNQUxaP3m3kkCPuOH0vamaC6K/ez7EKYAbpMErng/TgvFndzB2whmBbFYoMYLXh1fLBLmww==" }, "react-native-iphone-x-helper": { "version": "1.3.1", diff --git a/package.json b/package.json index ac1d8d451..10f0030a5 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "react-native-handoff": "https://github.com/marcosrdz/react-native-handoff#f5becc63f3e36bf2da1ed1fc60fc690323e73602", "react-native-haptic-feedback": "1.11.0", "react-native-idle-timer": "https://github.com/BlueWallet/react-native-idle-timer#8587876d68ab5920e79619726aeca9e672beaf2b", - "react-native-image-picker": "3.6.0", + "react-native-image-picker": "3.7.0", "react-native-keychain": "7.0.0", "react-native-level-fs": "3.0.1", "react-native-linear-gradient": "2.5.6", From e2526e0df08e2682a22e54adab2dcc3289d0a6a8 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 10 Jun 2021 23:06:46 +0000 Subject: [PATCH 123/327] fix: upgrade react-native-share from 6.0.1 to 6.1.0 Snyk has created this PR to upgrade react-native-share from 6.0.1 to 6.1.0. See this package in npm: https://www.npmjs.com/package/react-native-share See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2835fce90..25d18b293 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17807,9 +17807,9 @@ "from": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#63ab38c9d382a819844a086a69cc204c46aa93f9" }, "react-native-share": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-6.0.1.tgz", - "integrity": "sha512-K7mw2ep4cg++K6GUab32Kic3DeDUveonsQhTElwb6pZyjp0R/TLGQ11+pxcZBVlTiZhdOttyrLdCA6TsMX1lzg==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-6.1.0.tgz", + "integrity": "sha512-3X71U4Hz69zoQsaUMmZMBzE2BbpJdze1iGs0ifmHmLre2/0RtW2bATHH2QpQgyZry4uwFG0y4RyZBl54pvX3gw==" }, "react-native-snap-carousel": { "version": "3.9.1", diff --git a/package.json b/package.json index ac1d8d451..50ced8380 100644 --- a/package.json +++ b/package.json @@ -158,7 +158,7 @@ "react-native-safe-area-context": "3.2.0", "react-native-screens": "2.18.1", "react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#63ab38c9d382a819844a086a69cc204c46aa93f9", - "react-native-share": "6.0.1", + "react-native-share": "6.1.0", "react-native-snap-carousel": "3.9.1", "react-native-sortable-list": "0.0.24", "react-native-svg": "12.1.1", From 0d5d15e8536afe5eddb1a5423782d1457e7255eb Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 11 Jun 2021 05:10:42 +0000 Subject: [PATCH 124/327] Translate /loc/en.json in cs_CZ review completed for the source file '/loc/en.json' on the 'cs_CZ' language. --- loc/cs_cz.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/loc/cs_cz.json b/loc/cs_cz.json index 37a0a8d34..9f283a52e 100644 --- a/loc/cs_cz.json +++ b/loc/cs_cz.json @@ -316,6 +316,8 @@ "privacy_quickactions": "Zástupci peněženky", "privacy_quickactions_explanation": "Dlouhý stisk ikony BlueWallet na vaší výchozí obrazovce zobrazí váš zůstatek.", "privacy_clipboard_explanation": "Pokud se ve vaší schránce nachází adresa nebo faktura, zadejte zástupce.", + "privacy_do_not_track": "Zakázat Analytiku", + "privacy_do_not_track_explanation": "Informace o výkonu a spolehlivosti nebudou odeslány k analýze.", "push_notifications": "Push notifikace", "retype_password": "Zadejte heslo znovu", "selfTest": "Autotest", From ceee6a056100550db3f796cd2155e80fa0eef1f4 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 11 Jun 2021 21:41:57 +0000 Subject: [PATCH 125/327] fix: upgrade react-native-image-picker from 3.7.0 to 3.8.0 Snyk has created this PR to upgrade react-native-image-picker from 3.7.0 to 3.8.0. See this package in npm: https://www.npmjs.com/package/react-native-image-picker See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9bcd9e7e1..f5252bc22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17624,9 +17624,9 @@ "from": "git+https://github.com/BlueWallet/react-native-idle-timer.git#8587876d68ab5920e79619726aeca9e672beaf2b" }, "react-native-image-picker": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-3.7.0.tgz", - "integrity": "sha512-WeJPK1sgIODBzEOpNQUxaP3m3kkCPuOH0vamaC6K/ez7EKYAbpMErng/TgvFndzB2whmBbFYoMYLXh1fLBLmww==" + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-3.8.0.tgz", + "integrity": "sha512-jlL8YdKBaN8OamKZZYWjjpgUEj4+VvMdnh69euUsUdKBu2iD9HTLQrC9NHVQ78p0fQ2YL3Gf4xNwMTDDFspNpA==" }, "react-native-iphone-x-helper": { "version": "1.3.1", diff --git a/package.json b/package.json index c87edcd0e..9b279b782 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "react-native-handoff": "https://github.com/marcosrdz/react-native-handoff#f5becc63f3e36bf2da1ed1fc60fc690323e73602", "react-native-haptic-feedback": "1.11.0", "react-native-idle-timer": "https://github.com/BlueWallet/react-native-idle-timer#8587876d68ab5920e79619726aeca9e672beaf2b", - "react-native-image-picker": "3.7.0", + "react-native-image-picker": "3.8.0", "react-native-keychain": "7.0.0", "react-native-level-fs": "3.0.1", "react-native-linear-gradient": "2.5.6", From 397ac7e7e117d0d4a3edd649e0c8001d978906f9 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 13 Jun 2021 21:58:10 +0000 Subject: [PATCH 126/327] fix: upgrade detox from 18.13.0 to 18.14.0 Snyk has created this PR to upgrade detox from 18.13.0 to 18.14.0. See this package in npm: https://www.npmjs.com/package/detox See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index f5252bc22..0309f4f49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6768,9 +6768,9 @@ "dev": true }, "detox": { - "version": "18.13.0", - "resolved": "https://registry.npmjs.org/detox/-/detox-18.13.0.tgz", - "integrity": "sha512-YQPhi+uUGhVXYQm4W76EyKXdDKXnxq3dO+9ua22gGhNGwiJDbV8TUOavZNMbjBKWLb+OueGKOEBp4uNGOrVANw==", + "version": "18.14.0", + "resolved": "https://registry.npmjs.org/detox/-/detox-18.14.0.tgz", + "integrity": "sha512-bo/Ob2Ds0WeCz0UO6hmIm6/L2JjZ2p1ZKJ2EbTv2Ta/jidwsgM/RBfmvdi4a/VzUAyH9C3jFG9WlmERu9mHg+g==", "requires": { "bunyan": "^1.8.12", "bunyan-debug-stream": "^1.1.0", diff --git a/package.json b/package.json index 9b279b782..adc02ea51 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "coinselect": "3.1.12", "crypto-js": "4.0.0", "dayjs": "1.10.4", - "detox": "18.13.0", + "detox": "18.14.0", "ecurve": "1.0.6", "electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4", "electrum-mnemonic": "2.0.0", From d143b91899c433c773b09f68f192769913e8276d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Mon, 14 Jun 2021 19:53:15 -0400 Subject: [PATCH 127/327] FIX: Watch app had no access to fiat json file --- ios/BlueWallet.xcodeproj/project.pbxproj | 5 +++++ .../ComplicationController.swift | 2 +- ios/Podfile.lock | 20 +++++++++---------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index 4d17b28d8..caa204cd2 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -75,6 +75,8 @@ B43D037C225847C500FBAA95 /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0376225847C500FBAA95 /* Wallet.swift */; }; B43D037D225847C500FBAA95 /* WalletInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0377225847C500FBAA95 /* WalletInformation.swift */; }; B4EE583C226703320003363C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E35225841ED00428FCC /* Assets.xcassets */; }; + E5D4794B26781FC0007838C1 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnit.json */; }; + E5D4794C26781FC1007838C1 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnit.json */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -975,6 +977,7 @@ buildActionMask = 2147483647; files = ( B40D4E36225841ED00428FCC /* Assets.xcassets in Resources */, + E5D4794C26781FC1007838C1 /* fiatUnit.json in Resources */, B40D4E34225841EC00428FCC /* Interface.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -984,6 +987,7 @@ buildActionMask = 2147483647; files = ( B4EE583C226703320003363C /* Assets.xcassets in Resources */, + E5D4794B26781FC0007838C1 /* fiatUnit.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1500,6 +1504,7 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; diff --git a/ios/BlueWalletWatch Extension/ComplicationController.swift b/ios/BlueWalletWatch Extension/ComplicationController.swift index 704b388fe..d6c57fce1 100644 --- a/ios/BlueWalletWatch Extension/ComplicationController.swift +++ b/ios/BlueWalletWatch Extension/ComplicationController.swift @@ -89,7 +89,7 @@ class ComplicationController: NSObject, CLKComplicationDataSource { case .graphicCircular: if #available(watchOSApplicationExtension 6.0, *) { let template = CLKComplicationTemplateGraphicCircularStackText() - template.line1TextProvider = line1Text + template.line1TextProvider = line1SmallText template.line2TextProvider = line2Text entry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template) handler(entry) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b3294aeec..9759ccc77 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -260,13 +260,13 @@ PODS: - React - react-native-blur (0.8.0): - React - - react-native-camera (3.43.8): + - react-native-camera (3.43.9): - React-Core - - react-native-camera/RCT (= 3.43.8) - - react-native-camera/RN (= 3.43.8) - - react-native-camera/RCT (3.43.8): + - react-native-camera/RCT (= 3.43.9) + - react-native-camera/RN (= 3.43.9) + - react-native-camera/RCT (3.43.9): - React-Core - - react-native-camera/RN (3.43.8): + - react-native-camera/RN (3.43.9): - React-Core - react-native-document-picker (3.5.4): - React @@ -274,7 +274,7 @@ PODS: - React - react-native-idle-timer (2.1.6): - React-Core - - react-native-image-picker (3.6.0): + - react-native-image-picker (3.8.0): - React-Core - react-native-randombytes (3.6.1): - React-Core @@ -420,7 +420,7 @@ PODS: - RNSentry (2.5.0-beta.1): - React-Core - Sentry (= 7.0.0) - - RNShare (6.0.1): + - RNShare (6.1.0): - React-Core - RNSVG (12.1.1): - React @@ -730,11 +730,11 @@ SPEC CHECKSUMS: React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a react-native-blue-crypto: 23f1558ad3d38d7a2edb7e2f6ed1bc520ed93e56 react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c - react-native-camera: 894cdcb9e5bfe41719513ad95e0cd1d108b79ee6 + react-native-camera: a3193de4cc61352d9309d15a849b1e0c4a085ac4 react-native-document-picker: c5752781fbc0c126c627c1549b037c139444a4cf react-native-fingerprint-scanner: c68136ca57e3704d7bdf5faa554ea535ce15b1d0 react-native-idle-timer: 97b8283237d45146a7a5c25bdebe9e1e85f3687b - react-native-image-picker: 25f5fe3a3a9c4297e0b7a5a16566c5609632856d + react-native-image-picker: a135b727a79e0f11423506994bfcdb96c6da4a06 react-native-randombytes: 5fc412efe7b5c55b9002c0004d75fe5fabcaa507 react-native-safe-area-context: e471852c5ed67eea4b10c5d9d43c1cebae3b231d react-native-tcp-socket: 96a4f104cdcc9c6621aafe92937f163d88447c5b @@ -772,7 +772,7 @@ SPEC CHECKSUMS: RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 RNSentry: 1868bcfe8c69b2c3b2451439a38b3ebea0a7510f - RNShare: 755de6bac084428f8fd8fb54c376f126f40e560c + RNShare: c93ee0df653c76d913554272d56f6ffd8bdcb3cc RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 RNWatch: e4c5d19506c94506860032fb68aedd5991beb985 From 21f0f7e55c072096ab9e6d2d0100eabce6f3801e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Mon, 14 Jun 2021 20:10:42 -0400 Subject: [PATCH 128/327] Update WidgetDataStore.swift --- ios/Widgets/Shared/WidgetDataStore.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/Widgets/Shared/WidgetDataStore.swift b/ios/Widgets/Shared/WidgetDataStore.swift index 1305f87d0..3c55398ff 100644 --- a/ios/Widgets/Shared/WidgetDataStore.swift +++ b/ios/Widgets/Shared/WidgetDataStore.swift @@ -14,7 +14,7 @@ extension Numeric { let bytecountFormatter = ByteCountFormatter() bytecountFormatter.zeroPadsFractionDigits = true bytecountFormatter.countStyle = .decimal - bytecountFormatter.allowsNonnumericFormatting = true + bytecountFormatter.isAdaptive = false let bytesString = bytecountFormatter.string(fromByteCount: (self as! NSNumber).int64Value) let numericString = bytesString From e34b3837dd6dc6d2f9387d92ef1083ba5c724338 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 15 Jun 2021 01:06:13 +0000 Subject: [PATCH 129/327] fix: upgrade detox from 18.14.0 to 18.14.1 Snyk has created this PR to upgrade detox from 18.14.0 to 18.14.1. See this package in npm: https://www.npmjs.com/package/detox See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0309f4f49..eb484bb23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6768,9 +6768,9 @@ "dev": true }, "detox": { - "version": "18.14.0", - "resolved": "https://registry.npmjs.org/detox/-/detox-18.14.0.tgz", - "integrity": "sha512-bo/Ob2Ds0WeCz0UO6hmIm6/L2JjZ2p1ZKJ2EbTv2Ta/jidwsgM/RBfmvdi4a/VzUAyH9C3jFG9WlmERu9mHg+g==", + "version": "18.14.1", + "resolved": "https://registry.npmjs.org/detox/-/detox-18.14.1.tgz", + "integrity": "sha512-BOrf7rKgee7zZYmUIHQeomQ8SoQWEOJ9aNAM8lFQoON/RJrBi/NRUlO/jh4XFFepOkeJ5gr85Kz7g3pQxIPXow==", "requires": { "bunyan": "^1.8.12", "bunyan-debug-stream": "^1.1.0", diff --git a/package.json b/package.json index adc02ea51..917c7a418 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "coinselect": "3.1.12", "crypto-js": "4.0.0", "dayjs": "1.10.4", - "detox": "18.14.0", + "detox": "18.14.1", "ecurve": "1.0.6", "electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4", "electrum-mnemonic": "2.0.0", From 25212c00b12ec897dfcc77c9a7076fd47b01acd5 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 15 Jun 2021 23:03:29 +0000 Subject: [PATCH 130/327] fix: upgrade react-native-image-picker from 3.8.0 to 3.8.1 Snyk has created this PR to upgrade react-native-image-picker from 3.8.0 to 3.8.1. See this package in npm: https://www.npmjs.com/package/react-native-image-picker See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index eb484bb23..95f19f0c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17624,9 +17624,9 @@ "from": "git+https://github.com/BlueWallet/react-native-idle-timer.git#8587876d68ab5920e79619726aeca9e672beaf2b" }, "react-native-image-picker": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-3.8.0.tgz", - "integrity": "sha512-jlL8YdKBaN8OamKZZYWjjpgUEj4+VvMdnh69euUsUdKBu2iD9HTLQrC9NHVQ78p0fQ2YL3Gf4xNwMTDDFspNpA==" + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-3.8.1.tgz", + "integrity": "sha512-Q7qaJ7Zkt8ipIkkF+7UcuRbI0cxaNwsHBcnDLZdlpHnxuMaLhS/xp6v/om/kBYhMg6BeT+NcncynZQoKz7dQqw==" }, "react-native-iphone-x-helper": { "version": "1.3.1", diff --git a/package.json b/package.json index 917c7a418..e98a17b30 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "react-native-handoff": "https://github.com/marcosrdz/react-native-handoff#f5becc63f3e36bf2da1ed1fc60fc690323e73602", "react-native-haptic-feedback": "1.11.0", "react-native-idle-timer": "https://github.com/BlueWallet/react-native-idle-timer#8587876d68ab5920e79619726aeca9e672beaf2b", - "react-native-image-picker": "3.8.0", + "react-native-image-picker": "3.8.1", "react-native-keychain": "7.0.0", "react-native-level-fs": "3.0.1", "react-native-linear-gradient": "2.5.6", From 010ec6fcc417591aa36c9f3bdd4d25f81371f9fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Tue, 15 Jun 2021 23:21:28 -0400 Subject: [PATCH 131/327] REF: FlatList Wallet Carousel #3273 --- Navigation.js | 8 +-- components/WalletsCarousel.js | 98 +++++++++++++++-------------------- package-lock.json | 47 ----------------- package.json | 1 - screen/wallets/drawerList.js | 3 -- screen/wallets/list.js | 11 ++-- 6 files changed, 49 insertions(+), 119 deletions(-) diff --git a/Navigation.js b/Navigation.js index 68b197ef6..f0039fed0 100644 --- a/Navigation.js +++ b/Navigation.js @@ -347,14 +347,14 @@ const Drawer = createDrawerNavigator(); function DrawerRoot() { const dimensions = useWindowDimensions(); const isLargeScreen = - Platform.OS === 'android' ? isTablet() : dimensions.width >= Dimensions.get('screen').width / 2 && (isTablet() || isDesktop); + Platform.OS === 'android' ? isTablet() : dimensions.width >= Dimensions.get('screen').width / 2 ; const drawerStyle = { width: '0%' }; return ( (isLargeScreen ? : null)} + drawerStyle={null} + drawerType={'permanent'} + drawerContent={props => ( )} drawerPosition={I18nManager.isRTL ? 'right' : 'left'} > diff --git a/components/WalletsCarousel.js b/components/WalletsCarousel.js index 14f7b1eb3..6020d88c7 100644 --- a/components/WalletsCarousel.js +++ b/components/WalletsCarousel.js @@ -1,4 +1,4 @@ -import React, { useRef, useCallback, useState, useImperativeHandle, forwardRef, useContext } from 'react'; +import React, { useRef, useCallback, useImperativeHandle, forwardRef, useContext } from 'react'; import PropTypes from 'prop-types'; import { ActivityIndicator, @@ -12,11 +12,10 @@ import { TouchableWithoutFeedback, useWindowDimensions, View, + FlatList, } from 'react-native'; import { useTheme } from '@react-navigation/native'; import LinearGradient from 'react-native-linear-gradient'; -import Carousel from 'react-native-snap-carousel'; - import loc, { formatBalance, transactionTimeToReadable } from '../loc'; import { LightningCustodianWallet, MultisigHDWallet, PlaceholderWallet } from '../class'; import WalletGradient from '../class/wallet-gradient'; @@ -24,11 +23,7 @@ import { BluePrivateBalance } from '../BlueComponents'; import { BlueStorageContext } from '../blue_modules/storage-context'; const nStyles = StyleSheet.create({ - root: { - marginVertical: 17, - paddingLeft: I18nManager.isRTL ? 12 : 0, - paddingRight: I18nManager.isRTL ? 0 : 12, - }, + root: {}, container: { paddingHorizontal: 24, paddingVertical: 16, @@ -59,9 +54,12 @@ const nStyles = StyleSheet.create({ const NewWalletPanel = ({ onPress }) => { const { colors } = useTheme(); + const { width } = useWindowDimensions(); + const itemWidth = width * 0.82 > 375 ? 375 : width * 0.82; + return ( - - + + {loc.wallets.list_create_a_wallet} {loc.wallets.list_create_a_wallet_text} @@ -77,11 +75,7 @@ NewWalletPanel.propTypes = { }; const iStyles = StyleSheet.create({ - root: { - paddingLeft: I18nManager.isRTL ? 12 : 0, - paddingRight: I18nManager.isRTL ? 0 : 12, - marginVertical: 17, - }, + root: {}, grad: { padding: 15, borderRadius: 12, @@ -134,6 +128,8 @@ const WalletCarouselItem = ({ item, index, onPress, handleLongPress, isSelectedW const scaleValue = new Animated.Value(1.0); const { colors } = useTheme(); const { walletTransactionUpdateStatus } = useContext(BlueStorageContext); + const { width } = useWindowDimensions(); + const itemWidth = width * 0.82 > 375 ? 375 : width * 0.82; const onPressedIn = () => { const props = { duration: 50 }; @@ -162,7 +158,7 @@ const WalletCarouselItem = ({ item, index, onPress, handleLongPress, isSelectedW if (item.type === PlaceholderWallet.type) { return ( { - const carouselRef = useRef(); - const [loading, setLoading] = useState(true); const { preferredFiatCurrency, language } = useContext(BlueStorageContext); const renderItem = useCallback( ({ item, index }) => ( @@ -311,49 +306,38 @@ const WalletsCarousel = forwardRef((props, ref) => { // eslint-disable-next-line react-hooks/exhaustive-deps [props.vertical, props.selectedWallet, props.handleLongPress, props.onPress, preferredFiatCurrency, language], ); + const flatListRef = useRef(); + const ItemSeparatorComponent = () => ; useImperativeHandle(ref, () => ({ - snapToItem: item => carouselRef?.current?.snapToItem(item), + scrollToItem: ({ item }) => { + flatListRef?.current?.scrollToItem({ item }); + }, })); const { width } = useWindowDimensions(); - const sliderWidth = width * 1; - const itemWidth = width * 0.82 > 375 ? 375 : width * 0.82; const sliderHeight = 190; - - const onLayout = () => setLoading(false); + const itemWidth = width * 0.82 > 375 ? 375 : width * 0.82; return ( - <> - {loading && ( - - - - )} - - + index.toString()} + showsVerticalScrollIndicator={false} + pagingEnabled + removeClippedSubviews={false} + snapToAlignment="start" + snapToInterval={itemWidth + 20} // Adjust to your content width + ItemSeparatorComponent={ItemSeparatorComponent} + decelerationRate="fast" + contentContainerStyle={cStyles.content} + directionalLockEnabled + showsHorizontalScrollIndicator={false} + initialNumToRender={10} + style={{ height: sliderHeight + 16 }} + {...props} + /> ); }); diff --git a/package-lock.json b/package-lock.json index eb484bb23..b2f2b36e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17094,44 +17094,6 @@ "prop-types": "^15.6.2" } }, - "react-addons-shallow-compare": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-addons-shallow-compare/-/react-addons-shallow-compare-15.6.2.tgz", - "integrity": "sha1-GYoAuR/DdiPbZKKP0XtZa6NicC8=", - "requires": { - "fbjs": "^0.8.4", - "object-assign": "^4.1.0" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - } - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - } - } - }, "react-clone-referenced-element": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/react-clone-referenced-element/-/react-clone-referenced-element-1.1.1.tgz", @@ -17811,15 +17773,6 @@ "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-6.1.0.tgz", "integrity": "sha512-3X71U4Hz69zoQsaUMmZMBzE2BbpJdze1iGs0ifmHmLre2/0RtW2bATHH2QpQgyZry4uwFG0y4RyZBl54pvX3gw==" }, - "react-native-snap-carousel": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/react-native-snap-carousel/-/react-native-snap-carousel-3.9.1.tgz", - "integrity": "sha512-xWEGusacIgK1YaDXLi7Gao2+ISLoGPVEBR8fcMf4tOOJQufutlNwkoLu0l6B8Qgsrre0nTxoVZikRgGRDWlLaQ==", - "requires": { - "prop-types": "^15.6.1", - "react-addons-shallow-compare": "15.6.2" - } - }, "react-native-sortable-list": { "version": "0.0.24", "resolved": "https://registry.npmjs.org/react-native-sortable-list/-/react-native-sortable-list-0.0.24.tgz", diff --git a/package.json b/package.json index 917c7a418..f847f4a89 100644 --- a/package.json +++ b/package.json @@ -159,7 +159,6 @@ "react-native-screens": "2.18.1", "react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#63ab38c9d382a819844a086a69cc204c46aa93f9", "react-native-share": "6.1.0", - "react-native-snap-carousel": "3.9.1", "react-native-sortable-list": "0.0.24", "react-native-svg": "12.1.1", "react-native-tcp-socket": "3.7.1", diff --git a/screen/wallets/drawerList.js b/screen/wallets/drawerList.js index 8c47ba3ab..8579a0d72 100644 --- a/screen/wallets/drawerList.js +++ b/screen/wallets/drawerList.js @@ -110,10 +110,7 @@ const DrawerList = props => { ref={walletsCarousel} testID="WalletsList" vertical - itemHeight={190} - sliderHeight={height} contentContainerCustomStyle={styles.contentContainerCustomStyle} - inactiveSlideOpacity={1.0} selectedWallet={selectedWallet} /> ); diff --git a/screen/wallets/list.js b/screen/wallets/list.js index d38298ebc..bcc34a43f 100644 --- a/screen/wallets/list.js +++ b/screen/wallets/list.js @@ -48,7 +48,6 @@ const WalletsList = () => { const { navigate, setOptions } = useNavigation(); const routeName = useRoute().name; const [isLoading, setIsLoading] = useState(false); - const [itemWidth, setItemWidth] = useState(width * 0.82 > 375 ? 375 : width * 0.82); const [isLargeScreen, setIsLargeScreen] = useState( Platform.OS === 'android' ? isTablet() : width >= Dimensions.get('screen').width / 2 && (isTablet() || isDesktop), ); @@ -96,14 +95,14 @@ const WalletsList = () => { useEffect(() => { if (walletsCount.current < wallets.length) { - walletsCarousel.current?.snapToItem(walletsCount.current); + walletsCarousel.current?.scrollToItem({item: wallets[walletsCount.current]}); } walletsCount.current = wallets.length; }, [wallets]); useEffect(() => { if (pendingWallets.length > 0) { - walletsCarousel.current?.snapToItem(carouselData.length - pendingWallets.length); + walletsCarousel.current?.scrollToIndex(carouselData.length - pendingWallets.length); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [pendingWallets]); @@ -267,15 +266,14 @@ const WalletsList = () => { const renderWalletsCarousel = () => { return ( ); }; @@ -423,7 +421,6 @@ const WalletsList = () => { const onLayout = _e => { setIsLargeScreen(Platform.OS === 'android' ? isTablet() : width >= Dimensions.get('screen').width / 2 && (isTablet() || isDesktop)); - setItemWidth(width * 0.82 > 375 ? 375 : width * 0.82); }; const onRefresh = () => { From 5d3b6270f5bae147f308198e8a92a889e95e320b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 16 Jun 2021 02:05:04 -0400 Subject: [PATCH 132/327] WIP --- Navigation.js | 8 ++--- components/WalletsCarousel.js | 15 +++++--- screen/wallets/drawerList.js | 66 +++++++++++++++-------------------- screen/wallets/list.js | 11 ++++-- 4 files changed, 52 insertions(+), 48 deletions(-) diff --git a/Navigation.js b/Navigation.js index f0039fed0..68b197ef6 100644 --- a/Navigation.js +++ b/Navigation.js @@ -347,14 +347,14 @@ const Drawer = createDrawerNavigator(); function DrawerRoot() { const dimensions = useWindowDimensions(); const isLargeScreen = - Platform.OS === 'android' ? isTablet() : dimensions.width >= Dimensions.get('screen').width / 2 ; + Platform.OS === 'android' ? isTablet() : dimensions.width >= Dimensions.get('screen').width / 2 && (isTablet() || isDesktop); const drawerStyle = { width: '0%' }; return ( ( )} + drawerStyle={isLargeScreen ? null : drawerStyle} + drawerType={isLargeScreen ? 'permanent' : null} + drawerContent={props => (isLargeScreen ? : null)} drawerPosition={I18nManager.isRTL ? 'right' : 'left'} > diff --git a/components/WalletsCarousel.js b/components/WalletsCarousel.js index 6020d88c7..f3dd0c546 100644 --- a/components/WalletsCarousel.js +++ b/components/WalletsCarousel.js @@ -288,7 +288,7 @@ const cStyles = StyleSheet.create({ paddingTop: 16, }, - separatorStyle: { width: 16 }, + separatorStyle: { width: 16, height: 20 }, }); const WalletsCarousel = forwardRef((props, ref) => { @@ -311,8 +311,16 @@ const WalletsCarousel = forwardRef((props, ref) => { useImperativeHandle(ref, () => ({ scrollToItem: ({ item }) => { - flatListRef?.current?.scrollToItem({ item }); + setTimeout(() => { + flatListRef?.current?.scrollToItem({ item, viewPosition: 0.3 }); + }, 300) + }, + scrollToIndex: (index) => { + setTimeout(() => { + flatListRef?.current?.scrollToIndex({ index, viewPosition: 0.3 }); + }, 300) + } })); const { width } = useWindowDimensions(); @@ -326,7 +334,6 @@ const WalletsCarousel = forwardRef((props, ref) => { keyExtractor={(_, index) => index.toString()} showsVerticalScrollIndicator={false} pagingEnabled - removeClippedSubviews={false} snapToAlignment="start" snapToInterval={itemWidth + 20} // Adjust to your content width ItemSeparatorComponent={ItemSeparatorComponent} @@ -335,7 +342,7 @@ const WalletsCarousel = forwardRef((props, ref) => { directionalLockEnabled showsHorizontalScrollIndicator={false} initialNumToRender={10} - style={{ height: sliderHeight + 16 }} + style={props.horizontal ? { height: sliderHeight + 9 }: {}} {...props} /> ); diff --git a/screen/wallets/drawerList.js b/screen/wallets/drawerList.js index 8579a0d72..c14812665 100644 --- a/screen/wallets/drawerList.js +++ b/screen/wallets/drawerList.js @@ -1,12 +1,11 @@ import React, { useContext, useEffect, useRef, useState } from 'react'; -import { StatusBar, View, StyleSheet, Alert, useWindowDimensions } from 'react-native'; +import { StatusBar, View, StyleSheet, Alert } from 'react-native'; import { DrawerContentScrollView } from '@react-navigation/drawer'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; import PropTypes from 'prop-types'; import { useTheme } from '@react-navigation/native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { BlueHeaderDefaultMain } from '../../BlueComponents'; +import { BlueHeaderDefaultMain, BlueSpacing20 } from '../../BlueComponents'; import WalletsCarousel from '../../components/WalletsCarousel'; import { PlaceholderWallet } from '../../class'; import WalletImport from '../../class/wallet-import'; @@ -19,7 +18,6 @@ const DrawerList = props => { const walletsCarousel = useRef(); const { wallets, selectedWallet, pendingWallets, isDrawerListBlurred } = useContext(BlueStorageContext); const [carouselData, setCarouselData] = useState([]); - const height = useWindowDimensions().height; const { colors } = useTheme(); const walletsCount = useRef(wallets.length); const stylesHook = StyleSheet.create({ @@ -38,14 +36,14 @@ const DrawerList = props => { useEffect(() => { if (walletsCount.current < wallets.length) { - walletsCarousel.current?.snapToItem(walletsCount.current); + walletsCarousel.current?.scrollToItem({ item: wallets[walletsCount.current] }); } walletsCount.current = wallets.length; }, [wallets]); useEffect(() => { if (pendingWallets.length > 0) { - walletsCarousel.current?.snapToItem(carouselData.length - pendingWallets.length); + walletsCarousel.current?.scrollToItem(carouselData.length - pendingWallets.length); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [pendingWallets]); @@ -100,34 +98,37 @@ const DrawerList = props => { } }; - const renderWalletsCarousel = () => { - return ( - - ); - }; - const onNewWalletPress = () => { return !carouselData.some(wallet => wallet.type === PlaceholderWallet.type) ? props.navigation.navigate('AddWalletRoot') : null; }; + const ListHeaderComponent = () => { + return ( + <> + + + + ); + }; + + const renderWalletsCarousel = ( + + ); + return ( - + - - - - {renderWalletsCarousel()} + {renderWalletsCarousel} {isDrawerListBlurred && ( @@ -139,19 +140,10 @@ const DrawerList = props => { export default DrawerList; const styles = StyleSheet.create({ - contentContainerCustomStyle: { - paddingRight: 10, - paddingLeft: 20, - }, root: { flex: 1, }, - headerTouch: { - height: 48, - paddingRight: 16, - paddingLeft: 32, - paddingVertical: 10, - }, + absolute: { position: 'absolute', top: 0, diff --git a/screen/wallets/list.js b/screen/wallets/list.js index bcc34a43f..1bbe5361c 100644 --- a/screen/wallets/list.js +++ b/screen/wallets/list.js @@ -95,7 +95,7 @@ const WalletsList = () => { useEffect(() => { if (walletsCount.current < wallets.length) { - walletsCarousel.current?.scrollToItem({item: wallets[walletsCount.current]}); + walletsCarousel.current?.scrollToItem({ item: wallets[walletsCount.current] }); } walletsCount.current = wallets.length; }, [wallets]); @@ -201,7 +201,12 @@ const WalletsList = () => { } }; - const onSnapToItem = index => { + const onSnapToItem = e => { + const contentOffset = e.nativeEvent.contentOffset; + const viewSize = e.nativeEvent.layoutMeasurement; + // If the lateral slide is + // Math.floor(contentOffset.x/viewSize.width); + const index = Math.floor(contentOffset.x / viewSize.width); console.log('onSnapToItem', index); if (wallets[index] && (wallets[index].timeToRefreshBalance() || wallets[index].timeToRefreshTransaction())) { console.log(wallets[index].getLabel(), 'thinks its time to refresh either balance or transactions. refetching both'); @@ -270,7 +275,7 @@ const WalletsList = () => { extraData={carouselData} onPress={handleClick} handleLongPress={handleLongPress} - onSnapToItem={onSnapToItem} + onMomentumScrollEnd={onSnapToItem} ref={walletsCarousel} testID="WalletsList" horizontal From 050a8ed8e0914cac74b2429d1e53682fdcbc7187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 16 Jun 2021 02:13:13 -0400 Subject: [PATCH 133/327] WIP --- blue_modules/environment.js | 1 + components/WalletsCarousel.js | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/blue_modules/environment.js b/blue_modules/environment.js index f9d1aa844..c9c211a7e 100644 --- a/blue_modules/environment.js +++ b/blue_modules/environment.js @@ -4,4 +4,5 @@ const isMacCatalina = getSystemName() === 'Mac OS X'; module.exports.isMacCatalina = isMacCatalina; module.exports.isDesktop = getDeviceType() === 'Desktop'; +module.exports.isHandset = getDeviceType() === 'Handset'; module.exports.isTablet = isTablet; diff --git a/components/WalletsCarousel.js b/components/WalletsCarousel.js index f3dd0c546..17a2fe667 100644 --- a/components/WalletsCarousel.js +++ b/components/WalletsCarousel.js @@ -21,6 +21,7 @@ import { LightningCustodianWallet, MultisigHDWallet, PlaceholderWallet } from '. import WalletGradient from '../class/wallet-gradient'; import { BluePrivateBalance } from '../BlueComponents'; import { BlueStorageContext } from '../blue_modules/storage-context'; +import { isHandset } from '../blue_modules/environment'; const nStyles = StyleSheet.create({ root: {}, @@ -335,6 +336,7 @@ const WalletsCarousel = forwardRef((props, ref) => { showsVerticalScrollIndicator={false} pagingEnabled snapToAlignment="start" + disableIntervalMomentum={isHandset} snapToInterval={itemWidth + 20} // Adjust to your content width ItemSeparatorComponent={ItemSeparatorComponent} decelerationRate="fast" @@ -342,7 +344,7 @@ const WalletsCarousel = forwardRef((props, ref) => { directionalLockEnabled showsHorizontalScrollIndicator={false} initialNumToRender={10} - style={props.horizontal ? { height: sliderHeight + 9 }: {}} + style={props.vertical ? {} : { height: sliderHeight + 9 }} {...props} /> ); From 92ea039aa69dfc2a9c8591dfe648460036f7270f Mon Sep 17 00:00:00 2001 From: Overtorment Date: Wed, 16 Jun 2021 12:34:19 +0100 Subject: [PATCH 134/327] OPS: fix missing env for CI on GA --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b6fc791ef..5ef1505f9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,6 +44,9 @@ jobs: HD_MNEMONIC_BIP49_MANY_TX: ${{ secrets.HD_MNEMONIC_BIP49_MANY_TX }} HD_MNEMONIC_BIP84: ${{ secrets.HD_MNEMONIC_BIP84 }} HD_MNEMONIC_BREAD: ${{ secrets.HD_MNEMONIC_BREAD }} + FAULTY_ZPUB: ${{ secrets.FAULTY_ZPUB }} + MNEMONICS_COBO: ${{ secrets.MNEMONICS_COBO }} + MNEMONICS_COLDCARD: ${{ secrets.MNEMONICS_COLDCARD }} e2e: runs-on: macos-latest From 355bf63a15280b31f6a669ce4c17826cda211f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 16 Jun 2021 10:00:02 -0400 Subject: [PATCH 135/327] Update Podfile.lock --- ios/Podfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 9759ccc77..f3f6d3637 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -274,7 +274,7 @@ PODS: - React - react-native-idle-timer (2.1.6): - React-Core - - react-native-image-picker (3.8.0): + - react-native-image-picker (3.8.1): - React-Core - react-native-randombytes (3.6.1): - React-Core @@ -734,7 +734,7 @@ SPEC CHECKSUMS: react-native-document-picker: c5752781fbc0c126c627c1549b037c139444a4cf react-native-fingerprint-scanner: c68136ca57e3704d7bdf5faa554ea535ce15b1d0 react-native-idle-timer: 97b8283237d45146a7a5c25bdebe9e1e85f3687b - react-native-image-picker: a135b727a79e0f11423506994bfcdb96c6da4a06 + react-native-image-picker: 5a7dd93d4f9dd0d910da5dde3707fd96f70d03b3 react-native-randombytes: 5fc412efe7b5c55b9002c0004d75fe5fabcaa507 react-native-safe-area-context: e471852c5ed67eea4b10c5d9d43c1cebae3b231d react-native-tcp-socket: 96a4f104cdcc9c6621aafe92937f163d88447c5b From 436fa1bcf7d1500b23117e1b5d1970283c00717e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 16 Jun 2021 14:46:40 -0400 Subject: [PATCH 136/327] OPS: Upgrade Package --- ios/Podfile.lock | 4 ++-- package-lock.json | 6 +++--- package.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f3f6d3637..47efb6bd2 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -374,7 +374,7 @@ PODS: - React - RNKeychain (7.0.0): - React-Core - - RNLocalize (2.1.0): + - RNLocalize (2.1.1): - React-Core - RNPrivacySnapshot (1.0.0): - React @@ -763,7 +763,7 @@ SPEC CHECKSUMS: RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211 RNHandoff: d3b0754cca3a6bcd9b25f544f733f7f033ccf5fa RNKeychain: f75b8c8b2f17d3b2aa1f25b4a0ac5b83d947ff8f - RNLocalize: ff053575acafb6ae18284974469bdf04fcaf6514 + RNLocalize: b9a5d22c7e4ecb5db604861f1b1fff6013e03340 RNPrivacySnapshot: 71919dde3c6a29dd332115409c2aec564afee8f4 RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93 RNRate: e0af7e724e5fcf89578dbd22ab6395c85402ef29 diff --git a/package-lock.json b/package-lock.json index 95f19f0c4..799214b17 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17653,9 +17653,9 @@ "integrity": "sha512-HDwEaXcQIuXXCV70O+bK1rizFong3wj+5Q/jSyifKFLg0VWF95xh8XQgfzXwtq0NggL9vNjPKXa016KuFu+VFg==" }, "react-native-localize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-2.1.0.tgz", - "integrity": "sha512-+054+Hdw6ds5A0PIXEf+Xj2DmMZQ5jj9XzRg7Hq4lmZq/sL0dEs5MOsuID2JyO5y6wRbFEZ7XE4HUBVdT9Jisw==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-2.1.1.tgz", + "integrity": "sha512-+uyz2/b0vyLq19fcb7r1qU1gqmzbp3aC6EMTvOVXwfBuiN+aJXR/fDdFOJJ8D7+bLccKeuS2zBDrazh+ZayX/g==" }, "react-native-modal": { "version": "11.10.0", diff --git a/package.json b/package.json index e98a17b30..84600af88 100644 --- a/package.json +++ b/package.json @@ -141,7 +141,7 @@ "react-native-keychain": "7.0.0", "react-native-level-fs": "3.0.1", "react-native-linear-gradient": "2.5.6", - "react-native-localize": "2.1.0", + "react-native-localize": "2.1.1", "react-native-modal": "11.10.0", "react-native-navigation-bar-color": "https://github.com/BlueWallet/react-native-navigation-bar-color#34e44b8f44e442133de9d35c35f2679d40982804", "react-native-obscure": "1.2.1", From 63db5b360452751d554d237adfc4b9ae4dca42c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 16 Jun 2021 16:35:12 -0400 Subject: [PATCH 137/327] OPS: Restrict Widget options to iOS --- ios/BlueWallet.xcodeproj/project.pbxproj | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index caa204cd2..334305924 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -30,7 +30,7 @@ 6DD4109D266CADF10087DE03 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3A252FE1A3004D72DF /* WidgetKit.framework */; }; 6DD4109E266CADF10087DE03 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3C252FE1A3004D72DF /* SwiftUI.framework */; }; 6DD410A1266CADF10087DE03 /* Widgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DD410A0266CADF10087DE03 /* Widgets.swift */; }; - 6DD410A7266CADF40087DE03 /* WidgetsExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 6DD410A7266CADF40087DE03 /* WidgetsExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 6DD410AC266CAE470087DE03 /* PriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA4BC255872E3009312A5 /* PriceWidget.swift */; }; 6DD410AE266CAF1F0087DE03 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnit.json */; }; 6DD410AF266CAF5C0087DE03 /* WalletInformationAndMarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E06254BA347007B5B82 /* WalletInformationAndMarketWidget.swift */; }; @@ -1231,6 +1231,7 @@ }; 6DD410A6266CADF40087DE03 /* PBXTargetDependency */ = { isa = PBXTargetDependency; + platformFilter = ios; target = 6DD4109B266CADF10087DE03 /* WidgetsExtension */; targetProxy = 6DD410A5266CADF40087DE03 /* PBXContainerItemProxy */; }; @@ -1564,7 +1565,6 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.1; - "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1578,11 +1578,11 @@ PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = YES; + SUPPORTS_MACCATALYST = NO; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2,6"; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; @@ -1610,7 +1610,6 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.1; - "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1623,10 +1622,10 @@ PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = YES; + SUPPORTS_MACCATALYST = NO; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2,6"; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; From 3a26fa71eb3a54cab58954597f36d2988b40235f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 17 Jun 2021 13:21:42 -0400 Subject: [PATCH 138/327] DEL: Detox Recorder --- package-lock.json | 6 ------ package.json | 1 - 2 files changed, 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 95f19f0c4..3de243a9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6950,12 +6950,6 @@ } } }, - "detox-recorder": { - "version": "1.0.151", - "resolved": "https://registry.npmjs.org/detox-recorder/-/detox-recorder-1.0.151.tgz", - "integrity": "sha512-a4ZPo7AR5XJJiLy8Xqml8YXxrIz6R7RKfiGmG9u5MBxG2I+w+yGJTj7ZhYDfoi5StpUD+dKHTCdvycZTOQ84Cw==", - "dev": true - }, "diff-sequences": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", diff --git a/package.json b/package.json index e98a17b30..4139acbfd 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,6 @@ "babel-eslint": "^10.1.0", "babel-jest": "^26.1.0", "babel-preset-flow": "^6.23.0", - "detox-recorder": "^1.0.149", "eslint": "^7.25.0", "eslint-config-prettier": "^8.3.0", "eslint-config-standard": "^16.0.2", From 4d2de59bf57e48545817b430f645b28e9287df94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 17 Jun 2021 17:24:00 -0400 Subject: [PATCH 139/327] REF: Use walletID instead of secret --- BlueComponents.js | 2 +- class/deeplink-schema-match.js | 3 +-- class/wallets/lightning-custodian-wallet.js | 2 +- .../BlueWalletWatch (Notification).xcscheme | 25 +++++-------------- .../xcschemes/BlueWalletWatch.xcscheme | 25 +++++-------------- screen/lnd/browser.js | 9 ++++--- screen/wallets/buyBitcoin.js | 8 +++--- screen/wallets/details.js | 4 +-- screen/wallets/marketplace.js | 9 ++++--- screen/wallets/transactions.js | 7 +++--- screen/wallets/xpub.js | 15 +++-------- 11 files changed, 39 insertions(+), 70 deletions(-) diff --git a/BlueComponents.js b/BlueComponents.js index c1de1fc09..2aa795812 100644 --- a/BlueComponents.js +++ b/BlueComponents.js @@ -1401,7 +1401,7 @@ export const BlueTransactionListItem = React.memo(({ item, itemPriceUnit = Bitco if (item.hash) { navigate('TransactionStatus', { hash: item.hash }); } else if (item.type === 'user_invoice' || item.type === 'payment_request' || item.type === 'paid_invoice') { - const lightningWallet = wallets.filter(wallet => wallet?.getSecret() === item.fromWallet); + const lightningWallet = wallets.filter(wallet => wallet?.getID() === item.walletID); if (lightningWallet.length === 1) { try { // is it a successful lnurl-pay? diff --git a/class/deeplink-schema-match.js b/class/deeplink-schema-match.js index 1835f164c..906f8345f 100644 --- a/class/deeplink-schema-match.js +++ b/class/deeplink-schema-match.js @@ -254,8 +254,7 @@ class DeeplinkSchemaMatch { { screen: 'LappBrowser', params: { - fromSecret: lnWallet.getSecret(), - fromWallet: lnWallet, + walletID: lnWallet.getID(), url: urlObject.query.url, }, }, diff --git a/class/wallets/lightning-custodian-wallet.js b/class/wallets/lightning-custodian-wallet.js index 06187db94..0f0a08b2c 100644 --- a/class/wallets/lightning-custodian-wallet.js +++ b/class/wallets/lightning-custodian-wallet.js @@ -377,7 +377,7 @@ export class LightningCustodianWallet extends LegacyWallet { txs = txs.concat(this.pending_transactions_raw.slice(), this.transactions_raw.slice().reverse(), this.user_invoices_raw.slice()); // slice so array is cloned // transforming to how wallets/list screen expects it for (const tx of txs) { - tx.fromWallet = this.getSecret(); + tx.walletID = this.getID(); if (tx.amount) { // pending tx tx.amt = tx.amount * -100000000; diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme index 78505ec4c..ce67c26c8 100644 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme +++ b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme @@ -65,10 +65,8 @@ allowLocationSimulation = "YES" launchAutomaticallySubstyle = "8" notificationPayloadFile = "BlueWalletWatch Extension/PushNotificationPayload.apns"> - + - + - + - - - - - + diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme index 876b91430..772e95fd0 100644 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme +++ b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme @@ -64,10 +64,8 @@ debugServiceExtension = "internal" allowLocationSimulation = "YES" notificationPayloadFile = "BlueWalletWatch Extension/PushNotificationPayload.apns"> - + - + - + - - - - - + diff --git a/screen/lnd/browser.js b/screen/lnd/browser.js index f7e4e2972..bef0a587e 100644 --- a/screen/lnd/browser.js +++ b/screen/lnd/browser.js @@ -20,6 +20,7 @@ import navigationStyle from '../../components/navigationStyle'; import Notifications from '../../blue_modules/notifications'; import loc from '../../loc'; import { Button } from 'react-native-elements'; +import { BlueStorageContext } from '../../blue_modules/storage-context'; let processedInvoices = {}; let lastTimeTriedToPay = 0; @@ -293,15 +294,15 @@ const styles = StyleSheet.create({ export default class Browser extends Component { webView = React.createRef(); - constructor(props) { + constructor(props, context) { super(props); - if (!props.route.params.fromWallet) throw new Error('Invalid param'); + if (!props.route.params.walletID) throw new Error('Missing walletID param'); let url; if (props.route.params.url) url = props.route.params.url; this.state = { url: url || 'https://bluewallet.io/marketplace/', - fromWallet: props.route.params.fromWallet, + fromWallet: context.wallets.find(w => w.getID() === props.route.params.walletID), canGoBack: false, pageIsLoading: false, stateURL: url || 'https://bluewallet.io/marketplace/', @@ -526,6 +527,8 @@ Browser.propTypes = { }), }; +Browser.contextType = BlueStorageContext; + Browser.navigationOptions = navigationStyle( { closeButton: true, diff --git a/screen/wallets/buyBitcoin.js b/screen/wallets/buyBitcoin.js index c0ff34ba6..61f43062a 100644 --- a/screen/wallets/buyBitcoin.js +++ b/screen/wallets/buyBitcoin.js @@ -13,9 +13,9 @@ const currency = require('../../blue_modules/currency'); export default class BuyBitcoin extends Component { static contextType = BlueStorageContext; - constructor(props) { + constructor(props, context) { super(props); - const wallet = props.route.params.wallet; + const wallet = context.wallets.find(w => w.getID() === props.route.params.walletID); if (!wallet) console.warn('wallet was not passed to buyBitcoin'); this.state = { @@ -99,7 +99,7 @@ BuyBitcoin.propTypes = { route: PropTypes.shape({ name: PropTypes.string, params: PropTypes.shape({ - wallet: PropTypes.object.isRequired, + walletID: PropTypes.string.isRequired, safelloStateToken: PropTypes.string, }), }), @@ -117,7 +117,7 @@ BuyBitcoin.navigate = async wallet => { Linking.openURL(uri); } else { NavigationService.navigate('BuyBitcoin', { - wallet, + walletID: wallet.getID(), }); } }; diff --git a/screen/wallets/details.js b/screen/wallets/details.js index ba5d46917..2e0a171eb 100644 --- a/screen/wallets/details.js +++ b/screen/wallets/details.js @@ -252,7 +252,7 @@ const WalletDetails = () => { navigate('WalletXpubRoot', { screen: 'WalletXpub', params: { - secret: wallet.getSecret(), + walletID, }, }); const navigateToSignVerify = () => @@ -276,7 +276,7 @@ const WalletDetails = () => { testID="Marketplace" onPress={() => navigate('Marketplace', { - fromWallet: wallet, + walletID, }) } title={loc.wallets.details_marketplace} diff --git a/screen/wallets/marketplace.js b/screen/wallets/marketplace.js index 859adf62c..aaa612b5c 100644 --- a/screen/wallets/marketplace.js +++ b/screen/wallets/marketplace.js @@ -5,14 +5,15 @@ import { WebView } from 'react-native-webview'; import { BlueLoading } from '../../BlueComponents'; import navigationStyle from '../../components/navigationStyle'; +import loc from '../../loc'; export default class Marketplace extends Component { webview = React.createRef(); - constructor(props) { + constructor(props, context) { super(props); - if (!props.route.params.fromWallet) throw new Error('Invalid param'); - const fromWallet = props.route.params.fromWallet; + if (!props.route.params.walletID) throw new Error('Invalid param'); + const fromWallet = context.wallets.find(w => w.getID() === props.route.params.walletID); this.state = { url: '', @@ -80,6 +81,6 @@ Marketplace.propTypes = { Marketplace.navigationOptions = navigationStyle({ closeButton: true, - title: 'Marketplace', + title: loc.wallets.list_marketplace, headerLeft: null, }); diff --git a/screen/wallets/transactions.js b/screen/wallets/transactions.js index c5cc54254..990f3dd15 100644 --- a/screen/wallets/transactions.js +++ b/screen/wallets/transactions.js @@ -344,10 +344,10 @@ const WalletTransactions = () => { if (wallet.type === LightningCustodianWallet.type) { navigate('LappBrowserRoot', { screen: 'LappBrowser', - params: { fromSecret: wallet.getSecret(), fromWallet: wallet }, + params: { walletID }, }); } else { - navigate('Marketplace', { fromWallet: wallet }); + navigate('Marketplace', { walletID }); } }} style={[styles.marketplaceButton1, stylesHook.marketplaceButton1]} @@ -377,8 +377,7 @@ const WalletTransactions = () => { navigate('LappBrowserRoot', { screen: 'LappBrowser', params: { - fromSecret: wallet.getSecret(), - fromWallet: wallet, + walletID, url: 'https://duckduckgo.com', }, }); diff --git a/screen/wallets/xpub.js b/screen/wallets/xpub.js index 2a4b58bcb..2245e6227 100644 --- a/screen/wallets/xpub.js +++ b/screen/wallets/xpub.js @@ -24,28 +24,21 @@ const styles = StyleSheet.create({ }); const WalletXpub = () => { - const { secret } = useRoute().params; + const { wallets } = useContext(BlueStorageContext); + const { walletID } = useRoute().params; + const wallet = wallets.find(w => w.getID() === walletID); const [isLoading, setIsLoading] = useState(true); const [xPub, setXPub] = useState(); const [xPubText, setXPubText] = useState(); - const [wallet, setWallet] = useState(); const { goBack } = useNavigation(); const { colors } = useTheme(); const { width, height } = useWindowDimensions(); const stylesHook = StyleSheet.create({ root: { backgroundColor: colors.elevated } }); - const { wallets } = useContext(BlueStorageContext); useFocusEffect( useCallback(() => { Privacy.enableBlur(); const task = InteractionManager.runAfterInteractions(async () => { - for (const w of wallets) { - if (w.getSecret() === secret) { - // found our wallet - setWallet(w); - } - } - if (wallet) { const isBiometricsEnabled = await Biometric.isBiometricUseCapableAndEnabled(); @@ -64,7 +57,7 @@ const WalletXpub = () => { Privacy.disableBlur(); }; // eslint-disable-next-line react-hooks/exhaustive-deps - }, [goBack, secret, wallet]), + }, [goBack, walletID]), ); return isLoading ? ( From 98ec5f9a7948436cc0b029055f51d741400b7dfd Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 17 Jun 2021 21:45:32 +0000 Subject: [PATCH 140/327] Translate /loc/en.json in es_ES review completed for the source file '/loc/en.json' on the 'es_ES' language. --- loc/es.json | 89 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 30 deletions(-) diff --git a/loc/es.json b/loc/es.json index b0219ad48..2326911f8 100644 --- a/loc/es.json +++ b/loc/es.json @@ -9,13 +9,14 @@ "ok": "OK", "storage_is_encrypted": "Tu almacenamiento está cifrado. Se requiere la contraseña para descifrarlo.", "allow": "Permitir", - "dont_allow": "No Permitir", + "dont_allow": "No permitir", "yes": "Sí", "no": "No", "save": "Guardar", "seed": "Semilla", + "success": "Completado", "wallet_key": "Llave de la cartera", - "invalid_animated_qr_code_fragment": "Fragmento de código QR inválido. Por favor inténtalo de nuevo.", + "invalid_animated_qr_code_fragment" : "Fragmento de código QR inválido. Por favor inténtalo de nuevo.", "file_saved": "El archivo ({filePath}) se ha guardado en su carpeta de Descargas.", "discard_changes": "¿Descartar cambios? ", "discard_changes_detail": "Tienes cambios sin guardar. ¿Estás seguro que quieres descartarlos y salir?" @@ -75,10 +76,10 @@ "item_nooffers": "No hay ofertas. Prueba a cambiar \"Cerca de mí\" a \"Ofertas globales\".", "item_rating": "{rating} operaciones", "item_rating_no": "Sin valoraciones", - "local_trader": "Comerciante local", + "local_trader": "Local Trader", "local_trader_new": "Nuevo", "login": "Login", - "logout": "cerrar sesión", + "logout": "Cerrar sesión", "mycont": "Mis contratos", "offer_accept": "Aceptar oferta", "offer_account_finish": "Parece que no terminó de configurar la cuenta en HodlHodl. ¿Le gustaría finalizar la configuración ahora?", @@ -88,14 +89,14 @@ "offer_minutes": "Mín", "offer_promt_fiat": "¿Cuántos {currency} quieres comprar?", "offer_promt_fiat_e": "Por ejemplo, 100", - "offer_window": "ventana", + "offer_window": "Ventana", "p2p": "Compra Bitcoin en un Exchange Peer-to-Peer " }, "lnd": { "errorInvoiceExpired": "Factura expirada", "exchange": "Casa de cambio", "expired": "Expirado", - "expiredLow": "expirado", + "expiredLow": "Expirado", "expiresIn": "Expiración: {time}", "payButton": "Pagar", "placeholder": "Factura", @@ -116,7 +117,7 @@ "open_direct_channel": "Abrir un canal directo con este nodo:", "please_pay": "Por favor, pague", "preimage": "Preimage", - "sats": "sats", + "sats": "sats.", "wasnt_paid_and_expired": "Esta factura no fue pagada y ha expirado." }, "plausibledeniability": { @@ -135,9 +136,9 @@ "ask": "¿Has guardado la frase de respaldo de tu cartera? Esta frase de respaldo es necesaria para acceder a tus fondos si pierdes este dispositivo. Sin la frase de respaldo, tus fondos se perderán permanentemente.", "ask_no": "No, no lo he hecho", "ask_yes": "Sí, lo he hecho", - "ok": "OK, ya lo he anotado.", - "ok_lnd": "OK, lo he guardado.", - "text": "Por favor, tome un momento para anotar esta frase mnemotécnica en un papel. Este es su backup que puede utilizar para restaurar la billetera en otro dispositivo. ", + "ok": "OK, ya lo he anotado", + "ok_lnd": "OK, lo he guardado", + "text": "Por favor, apunta esta frase mnemotécnica en un papel. Será tu copia de seguridad y te permitirá restaurar la cartera en otro dispositivo.", "text_lnd": "Por favor guarda la copia de seguridad de esta cartera. Te permitirá restaurarla en caso de pérdida.", "text_lnd2": "Esta cartera está alojada en BlueWallet.", "title": "Tu cartera ha sido creada" @@ -174,22 +175,20 @@ "details_address_field_is_not_valid": "La dirección no es válida", "details_adv_fee_bump": "Permitir aumentar la comisión", "details_adv_full": "Usar todo el balance", - "details_adv_full_remove": "Los otros destinatarios serán eliminados de esta transacción.", "details_adv_full_sure": "¿Estás seguro de querer utilizar todo el saldo de tu cartera en esta transacción?", "details_adv_import": "Importar transacción", "details_amount_field_is_not_valid": "La cantidad no es válida", "details_amount_field_is_less_than_minimum_amount_sat": "La cantidad especificada es muy pequeña. Por favor, introduzca una cantidad mayor a 500 sats. ", "details_create": "Crear factura", + "details_error_decode": "No se ha podido decodificar la dirección de Bitcoin", "details_fee_field_is_not_valid": "La comisión introducida no es válida", "details_next": "Siguiente", - "details_no_maximum": "La cartera seleccionada no permite el cálculo automático del saldo máximo. ¿Estás seguro de querer seleccionar esta cartera?", - "details_no_multiple": "La cartera seleccionada no admite el envío de bitcoin a varios destinatarios. ¿Estás seguro de querer seleccionar esta cartera?", "details_no_signed_tx": "El archivo seleccionado no contiene una transacción que se pueda importar.", "details_note_placeholder": "Nota personal", "details_scan": "Escanear", "details_total_exceeds_balance": "El monto excede el balance disponible.", + "details_unrecognized_file_format": "Formato no reconocido", "details_wallet_before_tx": "Antes de crear una transacción debes añadir una cartera de Bitcoin.", - "details_wallet_selection": "Selección de cartera", "dynamic_init": "Iniciando", "dynamic_next": "Avanzar", "dynamic_prev": "Volver", @@ -258,14 +257,14 @@ "electrum_connected": "Conectado", "electrum_connected_not": "Desconectado", "electrum_error_connect": "No se ha podido conectar al servidor de Electrum", - "electrum_host": "Servidor, por ejemplo {example}", + "electrum_host": "p. ej. {example}", "electrum_port": "Puerto TCP, normalmente {example}", "electrum_port_ssl": "Puerto SSL, normalmente {example}", "electrum_saved": "Los cambios se han guardado. Puede que se requiera reiniciar la aplicación para que tomen efecto.", "set_electrum_server_as_default": "¿Establecer {server} como servidor Electrum por defecto?", "set_lndhub_as_default": "¿Establecer {url} como servidor LNDHub por defecto?", - "electrum_settings_server": "Ajustes del Servidor Electrum", - "electrum_settings_explain": "Déjalo en blanco para usar el predeterminado", + "electrum_settings_server": "Servidor Electrum", + "electrum_settings_explain": "Déjalo en blanco para usar el predeterminado.", "electrum_status": "Estado", "electrum_clear_alert_title": "¿Limpiar historial?", "electrum_clear_alert_message": "¿Quieres eliminar el historial de los servidores de Electrum?", @@ -277,6 +276,7 @@ "electrum_history": "Historial del servidor", "electrum_reset_to_default": "¿Estás seguro de querer reiniciar sus ajustes de Electrum por defecto? ", "electrum_clear": "Limpiar", + "tor_supported": "Compatible con Tor", "encrypt_decrypt": "Desencriptar almacenamiento", "encrypt_decrypt_q": "¿Seguro que quieres desencriptar tu almacenamiento? Al hacerlo, se podrá acceder a tus carteras sin contraseña.", "encrypt_del_uninstall": "Bórralo si desinstalas BlueWallet", @@ -293,17 +293,18 @@ "groundcontrol_explanation": "GroundControl es un servidor gratuito y de código abierto de notificaciones push para carteras Bitcoin. Puedes instalar tu propio servidor de GroundControl y poner su URL aquí para no depender del de BlueWallet. Déjalo en blanco para usar el predeterminado.", "header": "Ajustes", "language": "Idioma", - "language_restart": "Al seleccionar otro idioma, será necesario reiniciar BlueWallet para mostrar los cambios.", + "language_isRTL": "Al seleccionar otro idioma, será necesario reiniciar BlueWallet para mostrar los cambios.", "lightning_error_lndhub_uri": "LNDHub URI no válida", "lightning_saved": "Tus cambios se han guardado correctamente", "lightning_settings": "Configuración de Lightning", + "tor_settings": "Configuración de Tor", "lightning_settings_explain": "Para conectar a tu propio nodo LND, por favor instala LNDHub y escribe su URL aquí. Déjalo en blanco para usar el LNDHub de BlueWallet (lndhub.io). Las carteras creadas tras guardar los cambios se conectarán al LNDHub especificado.", "network": "Red", "network_broadcast": "Emitir transacción", "network_electrum": "Servidor Electrum", "not_a_valid_uri": "URI no válida", "notifications": "Notificaciones", - "open_link_in_explorer": "Abrir enlace en el navegador", + "open_link_in_explorer" : "Abrir enlace en el navegador", "password": "Contraseña", "password_explain": "Crea la contraseña que usarás para descifrar el almacenamiento", "passwords_do_not_match": "Contraseñas deben ser iguales", @@ -315,14 +316,18 @@ "privacy_quickactions": "Atajos para tus carteras", "privacy_quickactions_explanation": "Toca y mantén pulsado el icono de BlueWallet en tu pantalla de inicio para ver rápidamente el balance de tu cartera.", "privacy_clipboard_explanation": "Muestra atajos si encuentra direcciones o facturas en tu portapapeles.", + "privacy_do_not_track": "Desabilitar Analytics", + "privacy_do_not_track_explanation": "Los datos sobre funcionamiento y fiabilidad no serán enviados para ser analizados.", "push_notifications": "Notificaciones push", "retype_password": "Introduce la contraseña otra vez", + "selfTest": "Self-Test", "save": "Guardar", "saved": "Guardado", - "success_transaction_broadcasted": "¡Listo! ¡Tu transacción ha sido emitida!", + "success_transaction_broadcasted" : "¡Listo! ¡Tu transacción ha sido emitida!", "total_balance": "Balance total", "total_balance_explanation": "Muestra el balance total de todas tus carteras en los widgets de tu pantalla principal.", - "widgets": "Widgets" + "widgets": "Widgets", + "tools": "Herramientas" }, "notifications": { "would_you_like_to_receive_notifications": "¿Quires recibir notificaciones cuando detectemos transferencias entrantes?", @@ -330,17 +335,16 @@ "ask_me_later": "Pregúntame después" }, "transactions": { - "cancel_explain": "Reemplazaremos esta transacción con la que que te pague y tenga mayor fee. Esto cancela efectivamente la transacción. Esto es llamado RBF—Reemplazar por Fee. ", + "cancel_explain": "Reemplazaremos esta transacción con la que que te pague y tenga mayor fee. Esto cancela efectivamente la transacción. Se conoce como RBF—Reemplazar por Fee. ", "cancel_no": "Esta transacción no se puede reemplazar.", "cancel_title": "Cancelar esta transacción (RBF)", "confirmations_lowercase": "{confirmations} confirmaciones", - "transaction_id": "ID de transacción", "note": "Nota", "expand_note": "Expandir Nota", "block_explorer_link": "Enlace al explorador de bloques", "cpfp_create": "Crear", "cpfp_exp": "Crearemos una nueva transacción que gastará tu transacción aún no confirmada. La comisión total será mayor que la comisión original, lo cual debería hacer que sea minada en menos tiempo. Esto se denomina CPFP—Child Pays For Parent.", - "cpfp_no_bump": "Esta transacción no se puede acelerar", + "cpfp_no_bump": "Esta transacción no se puede acelerar.", "cpfp_title": "Aumentar comisión (CPFP)", "details_balance_hide": "Esconder balance", "details_balance_show": "Mostrar balance", @@ -407,6 +411,7 @@ "details_no_cancel": "No, cancelar", "details_save": "Guardar", "details_show_xpub": "Mostrar el XPUB de la cartera", + "details_show_addresses": "Mostrar dirección", "details_title": "Cartera", "details_type": "Tipo", "details_use_with_hardware_wallet": "Usar con cartera de hardware", @@ -444,7 +449,7 @@ "list_title": "Carteras", "list_tryagain": "Inténtalo otra vez", "no_ln_wallet_error": "Antes de pagar una factura Lightning, primero debe agregar una cartera Lightning.", - "looks_like_bip38": "Parece que esto es una llave privada protegida con contraseña (BIP38)", + "looks_like_bip38": "Parece que esto es una llave privada protegida con contraseña (BIP38).", "reorder_title": "Reorganizar carteras", "please_continue_scanning": "Por favor, continúa escaneando", "scan_error": "Error al escanear", @@ -456,6 +461,7 @@ "pull_to_refresh": "Desliza el dedo de arriba a abajo para actualizar", "warning_do_not_disclose": "¡Advertencia! No comparta esta información", "add_ln_wallet_first": "Primero tienes que agregar una cartera Lightning.", + "identity_pubkey": "Identity Pubkey", "xpub_title": "XPUB de la cartera" }, "multisig": { @@ -501,12 +507,12 @@ "invalid_mnemonics": "Esta frase mnemotécnica no es válida", "invalid_cosigner": "Los datos del co-firmante no son válidos", "not_a_multisignature_xpub": "¡Esto no es el XPUB de una cartera multifirma!", - "invalid_cosigner_format": "Co-firmante incorrecto: no es un co-firmante de {format}", + "invalid_cosigner_format": "Co-firmante incorrecto: no es un co-firmante de {format}.", "create_new_key": "Crear una nueva", "scan_or_open_file": "Escanear o abrir archivo", - "i_have_mnemonics": "Tengo una semilla para esta llave...", + "i_have_mnemonics": "Tengo una semilla para esta llave.", "please_write_down_mnemonics": "Por favor, anota esta frase mnemotécnica en un papel. No te preocupes, la puedes anotar más tarde.", - "i_wrote_it_down": "OK, ya la he anotado", + "i_wrote_it_down": "OK, ya la he anotado.", "type_your_mnemonics": "Introduce una semilla para importar la llave de tu Vault", "this_is_cosigners_xpub": "Este es el XPUB del co-firmante, listo para ser importado en otra cartera. Es seguro compartirla.", "wallet_key_created": "La clave de tu bóveda ha sido creada. Tómate un momento para anotar la semilla mnemotécnica", @@ -523,7 +529,7 @@ "ms_help": "Ayuda", "ms_help_title": "Cómo funcionan las bóvedas Multisig. Consejos y trucos", "ms_help_text": "Una cartera con múltiples claves, para aumentar exponencialmente la seguridad o para custodia compartida.", - "ms_help_title1": "Se recomienda multiples dispositivos", + "ms_help_title1": "Se recomienda usar multiples dispositivos.", "ms_help_1": "La bóveda funcionará con otras aplicaciones de BlueWallet y carteras compatibles con PSBT como Electrum, Spectre, Coldcard, Cobo Vault, etc.", "ms_help_title2": "Editar claves", "ms_help_2": "Puedes crear todas las claves de la bóveda en este dispositivo y eliminarlas o editarlas más tarde. Tener todas las claves en el mismo dispositivo tiene la seguridad equivalente a una cartera de Bitcoin convencional.", @@ -555,8 +561,31 @@ }, "units": { "BTC": "BTC", - "MAX": "MÁX", + "MAX": "Máx", "sat_byte": "sat/byte", "sats": "sats" + }, + "addresses": { + "sign_title": "Firmar/Verificar mensage", + "sign_help": "Aquí puedes crear o verificar una firma criptográfica basada en una dirección de Bitcoin", + "sign_sign": "Firmar", + "sign_sign_submit": "Firmar y enviar", + "sign_verify": "Verificar", + "sign_signature_correct": "¡Verificación completada!", + "sign_signature_incorrect": "Verificación fallida", + "sign_placeholder_address": "Dirección", + "sign_placeholder_message": "Mensaje", + "sign_placeholder_signature": "Firma", + "sign_aopp_title": "AOPP", + "sign_aopp_confirm": "¿Quieres enviar el mensaje firmado a {hostname}?", + "address_balance": "Balance: {balance} sats", + "addresses_title": "Direcciones", + "type_change": "Cambio", + "type_receive": "Recibir" + }, + "aopp": { + "title": "Selecciona la dirección", + "send_success": "Firma enviada correctamente", + "send_error": "Error al enviar la firma" } } From e801c5cd2a4394d9168324c1284341b96329c2f3 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 17 Jun 2021 23:28:52 +0000 Subject: [PATCH 141/327] fix: upgrade dayjs from 1.10.4 to 1.10.5 Snyk has created this PR to upgrade dayjs from 1.10.4 to 1.10.5. See this package in npm: https://www.npmjs.com/package/dayjs See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 503c26b95..bdf8e14b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6563,9 +6563,9 @@ } }, "dayjs": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", - "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==" + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.5.tgz", + "integrity": "sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g==" }, "debug": { "version": "4.3.1", diff --git a/package.json b/package.json index 0e31620f0..7bfbb039d 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "buffer-reverse": "1.0.1", "coinselect": "3.1.12", "crypto-js": "4.0.0", - "dayjs": "1.10.4", + "dayjs": "1.10.5", "detox": "18.14.1", "ecurve": "1.0.6", "electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4", From ab0f35740c2a9e0d4e41b652adf5f5976bd5065f Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 17 Jun 2021 23:28:57 +0000 Subject: [PATCH 142/327] fix: upgrade detox from 18.14.1 to 18.15.0 Snyk has created this PR to upgrade detox from 18.14.1 to 18.15.0. See this package in npm: https://www.npmjs.com/package/detox See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 503c26b95..608bdee07 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6768,9 +6768,9 @@ "dev": true }, "detox": { - "version": "18.14.1", - "resolved": "https://registry.npmjs.org/detox/-/detox-18.14.1.tgz", - "integrity": "sha512-BOrf7rKgee7zZYmUIHQeomQ8SoQWEOJ9aNAM8lFQoON/RJrBi/NRUlO/jh4XFFepOkeJ5gr85Kz7g3pQxIPXow==", + "version": "18.15.0", + "resolved": "https://registry.npmjs.org/detox/-/detox-18.15.0.tgz", + "integrity": "sha512-2PtDkfO0D5eyfqPqa5PUtO210f/WHGb4wJIVhiWPOCgBT+k5bwhqP7zeOmhS43dRkS3M3isq4GNuLSnQujK8uw==", "requires": { "bunyan": "^1.8.12", "bunyan-debug-stream": "^1.1.0", diff --git a/package.json b/package.json index 0e31620f0..f45e70b53 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "coinselect": "3.1.12", "crypto-js": "4.0.0", "dayjs": "1.10.4", - "detox": "18.14.1", + "detox": "18.15.0", "ecurve": "1.0.6", "electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4", "electrum-mnemonic": "2.0.0", From 9b2fd1364b0f40fd8a35a870a50420432d933c41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Fri, 18 Jun 2021 11:22:50 -0400 Subject: [PATCH 143/327] OPS: Package updates --- ios/Podfile.lock | 8 +- package-lock.json | 401 +++++++++++++++++++++++----------------------- package.json | 4 +- 3 files changed, 208 insertions(+), 205 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 47efb6bd2..b238073b7 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -285,7 +285,7 @@ PODS: - React - react-native-tor (0.1.7): - React - - react-native-webview (11.6.2): + - react-native-webview (11.6.4): - React-Core - react-native-widget-center (0.0.4): - React @@ -417,7 +417,7 @@ PODS: - React-Core - RNSecureKeyStore (1.0.0): - React - - RNSentry (2.5.0-beta.1): + - RNSentry (2.5.1): - React-Core - Sentry (= 7.0.0) - RNShare (6.1.0): @@ -739,7 +739,7 @@ SPEC CHECKSUMS: react-native-safe-area-context: e471852c5ed67eea4b10c5d9d43c1cebae3b231d react-native-tcp-socket: 96a4f104cdcc9c6621aafe92937f163d88447c5b react-native-tor: 4f389f5719dad633542b57ea32744e954730e7ef - react-native-webview: 1f56115845c98f0a59dfbbac685797c014a821be + react-native-webview: 4288b81c682bca4dcc9037afb3ee118af2655c03 react-native-widget-center: 0f81d17beb163e7fb5848b06754d7d277fe7d99a React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336 React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b @@ -771,7 +771,7 @@ SPEC CHECKSUMS: RNReanimated: 70f662b5232dd5d19ccff581e919a54ea73df51c RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 - RNSentry: 1868bcfe8c69b2c3b2451439a38b3ebea0a7510f + RNSentry: f109c8729739aa29f182c7d995bbcbccad373f31 RNShare: c93ee0df653c76d913554272d56f6ffd8bdcb3cc RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 diff --git a/package-lock.json b/package-lock.json index 5119fce8d..6eaf59ec3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3505,20 +3505,20 @@ "from": "git+https://github.com/BlueWallet/react-native-qrcode-local-image.git" }, "@sentry/browser": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.2.1.tgz", - "integrity": "sha512-OAikFZ9EimD3noxMp8tA6Cf6qJcQ2U8k5QSgTPwdx+09nZOGJzbRFteK7WWmrS93ZJdzN61lpSQbg5v+bmmfbQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.5.1.tgz", + "integrity": "sha512-iVLCdEFwsoWAzE/hNknexPQjjDpMQV7mmaq9Z1P63bD6MfhwVTx4hG4pHn8HEvC38VvCVf1wv0v/LxtoODAYXg==", "requires": { - "@sentry/core": "6.2.1", - "@sentry/types": "6.2.1", - "@sentry/utils": "6.2.1", + "@sentry/core": "6.5.1", + "@sentry/types": "6.5.1", + "@sentry/utils": "6.5.1", "tslib": "^1.9.3" } }, "@sentry/cli": { - "version": "1.64.1", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-1.64.1.tgz", - "integrity": "sha512-G+TzOSG+58fG3f5uYvPXweK65f1sP/8MWSEuRmJE4P0JJTTXQI6WErvrqrhfR5F7UVvGzltEbpc8rvO7N3+88A==", + "version": "1.66.0", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-1.66.0.tgz", + "integrity": "sha512-2pZ+JHnvKqwyJWcGkKg/gCM/zURYronAnruBNllI+rH2g5IL0N90deMmjB1xcqXS66J222+MPTtWrGEK1Vl0/w==", "requires": { "https-proxy-agent": "^5.0.0", "mkdirp": "^0.5.5", @@ -3529,107 +3529,107 @@ } }, "@sentry/core": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.2.1.tgz", - "integrity": "sha512-jPqQEtafxxDtLONhCbTHh/Uq8mZRhsfbwJTSVYfPVEe/ELfFZLQK7tP6rOh7zEWKbTkE0mE6XcaoH3ZRAhgrqg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.5.1.tgz", + "integrity": "sha512-Mh3sl/iUOT1myHmM6RlDy2ARzkUClx/g4DAt1rJ/IpQBOlDYQraplXSIW80i/hzRgQDfwhwgf4wUa5DicKBjKw==", "requires": { - "@sentry/hub": "6.2.1", - "@sentry/minimal": "6.2.1", - "@sentry/types": "6.2.1", - "@sentry/utils": "6.2.1", + "@sentry/hub": "6.5.1", + "@sentry/minimal": "6.5.1", + "@sentry/types": "6.5.1", + "@sentry/utils": "6.5.1", "tslib": "^1.9.3" } }, "@sentry/hub": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.2.1.tgz", - "integrity": "sha512-pG7wCQeRpzeP6t0bT4T0X029R19dbDS3/qswF8BL6bg0AI3afjfjBAZm/fqn1Uwe/uBoMHVVdbxgJDZeQ5d4rQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.5.1.tgz", + "integrity": "sha512-lBRMBVMYP8B4PfRiM70murbtJAXiIAao/asDEMIRNGMP6pI2ArqXfJCBYDkStukhikYD0Kqb4trXq+JYF07Hbg==", "requires": { - "@sentry/types": "6.2.1", - "@sentry/utils": "6.2.1", + "@sentry/types": "6.5.1", + "@sentry/utils": "6.5.1", "tslib": "^1.9.3" } }, "@sentry/integrations": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.2.1.tgz", - "integrity": "sha512-UBvuil/b9M5HGH6aBDzTiIVRsmpC/wqwDKy28IO05XLdalmKgJ9C1EQhoyN6xw+1lINpXXFtfq4NhfgZgWbc7Q==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.5.1.tgz", + "integrity": "sha512-NYiW0rH7fwv7aRtrRnfCSIiwulfV2NoLjhmghCONsyo10DNtYmOpogLotCytZFWLDnTJW1+pmTomq8UW/OSTcQ==", "requires": { - "@sentry/types": "6.2.1", - "@sentry/utils": "6.2.1", + "@sentry/types": "6.5.1", + "@sentry/utils": "6.5.1", "localforage": "^1.8.1", "tslib": "^1.9.3" } }, "@sentry/minimal": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.2.1.tgz", - "integrity": "sha512-wuSXB4Ayxv9rBEQ4pm7fnG4UU2ZPtPnnChoEfd4/mw1UthXSvmPFEn6O4pdo2G8fTkl8eqm6wT/Q7uIXMEmw+A==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.5.1.tgz", + "integrity": "sha512-q9Do/oreu1RP695CXCLowVDuQyk7ilE6FGdz2QLpTXAfx8247qOwk6+zy9Kea/Djk93+BoSDVQUSneNiVwl0nQ==", "requires": { - "@sentry/hub": "6.2.1", - "@sentry/types": "6.2.1", + "@sentry/hub": "6.5.1", + "@sentry/types": "6.5.1", "tslib": "^1.9.3" } }, "@sentry/react": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-6.2.1.tgz", - "integrity": "sha512-emJnYVASM2hej2f8eSjqiDRMljwLsDJDSwa6kVc5HUOs9gnVrE4MR+vSywraACf5tKZbH1YI+NUXCmR++fIB0g==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-6.5.1.tgz", + "integrity": "sha512-YeGi7FzInhMZQxiy5fKqb7kS6W+u4NfsjzsVV3bLjJ1kiVtbpzZ2gs+ObHqW3zVE622V4nL7A4P8/CBHbcm5PA==", "requires": { - "@sentry/browser": "6.2.1", - "@sentry/minimal": "6.2.1", - "@sentry/types": "6.2.1", - "@sentry/utils": "6.2.1", + "@sentry/browser": "6.5.1", + "@sentry/minimal": "6.5.1", + "@sentry/types": "6.5.1", + "@sentry/utils": "6.5.1", "hoist-non-react-statics": "^3.3.2", "tslib": "^1.9.3" } }, "@sentry/react-native": { - "version": "2.5.0-beta.1", - "resolved": "https://registry.npmjs.org/@sentry/react-native/-/react-native-2.5.0-beta.1.tgz", - "integrity": "sha512-q+WQwFRBl/3uKIdB+NExfPMoDzQzdHuA+W3p9ZPfBdsNX3t3iHa3JHT6t0EYRf46NlAmFmnHaQNqHxP7u9I6LQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@sentry/react-native/-/react-native-2.5.1.tgz", + "integrity": "sha512-Utf/Cq98J+jk2YQ4mO+EWLfa5vyWA62tvV46Yw7dtpZlhpf7Ip3xN+OxnMdDf8H9tWWAerp/v6bcncKAnvcMQA==", "requires": { - "@sentry/browser": "6.2.1", - "@sentry/core": "6.2.1", - "@sentry/hub": "6.2.1", - "@sentry/integrations": "6.2.1", - "@sentry/react": "6.2.1", - "@sentry/tracing": "6.2.1", - "@sentry/types": "6.2.1", - "@sentry/utils": "6.2.1", + "@sentry/browser": "6.5.1", + "@sentry/core": "6.5.1", + "@sentry/hub": "6.5.1", + "@sentry/integrations": "6.5.1", + "@sentry/react": "6.5.1", + "@sentry/tracing": "6.5.1", + "@sentry/types": "6.5.1", + "@sentry/utils": "6.5.1", "@sentry/wizard": "^1.2.2" } }, "@sentry/tracing": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.2.1.tgz", - "integrity": "sha512-bvStY1SnL08wkSeVK3j9K5rivQQJdKFCPR2VYRFOCaUoleZ6ChPUnBvxQ/E2LXc0hk/y/wo1q4r5B0dfCCY+bQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.5.1.tgz", + "integrity": "sha512-y1W/xFC2hAuKqSuuaovkElHY4pbli3XoXrreesg8PtO7ilX6ZbatOQbHsEsHQyoUv0F6aVA+MABOxWH2jt7tfw==", "requires": { - "@sentry/hub": "6.2.1", - "@sentry/minimal": "6.2.1", - "@sentry/types": "6.2.1", - "@sentry/utils": "6.2.1", + "@sentry/hub": "6.5.1", + "@sentry/minimal": "6.5.1", + "@sentry/types": "6.5.1", + "@sentry/utils": "6.5.1", "tslib": "^1.9.3" } }, "@sentry/types": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.2.1.tgz", - "integrity": "sha512-h0OV1QT+fv5ojfK5/+iEXClu33HirmvbjcQC2jf05IHj9yXIOWy6EB10S8nBjuLiiFqQiAQYj3FN9Ip4eN8NJA==" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.5.1.tgz", + "integrity": "sha512-b/7a6CMoytaeFPx4IBjfxPw3nPvsQh7ui1C8Vw0LxNNDgBwVhPLzUOWeLWbo5YZCVbGEMIWwtCUQYWxneceZSA==" }, "@sentry/utils": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.2.1.tgz", - "integrity": "sha512-6kQgM/yBPdXu+3qbJnI6HBcWztN9QfiMkH++ZiKk4ERhg9d2LYWlze478uTU5Fyo/JQYcp+McpjtjpR9QIrr0g==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.5.1.tgz", + "integrity": "sha512-Wv86JYGQH+ZJ5XGFQX7h6ijl32667ikenoL9EyXMn8UoOYX/MLwZoQZin1P60wmKkYR9ifTNVmpaI9OoTaH+UQ==", "requires": { - "@sentry/types": "6.2.1", + "@sentry/types": "6.5.1", "tslib": "^1.9.3" } }, "@sentry/wizard": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@sentry/wizard/-/wizard-1.2.7.tgz", - "integrity": "sha512-1R23M4nvJg9MkrnEoj2pYH7VTTqS3BueEkCmdI4F+7TJG9BOLGLK3LJoVH44J/tmcZnAxUeTdPP46eH5VhoFMg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@sentry/wizard/-/wizard-1.2.8.tgz", + "integrity": "sha512-2gHVOT7YcoG56hUgzVG53ID7eThQJxN7Fu+jNZH1WBCG3qSuj+ied2CZ3U+/VsxB6l13GBVwqlHH9GaVptrh3g==", "requires": { "@sentry/cli": "^1.52.4", "chalk": "^2.4.1", @@ -3639,8 +3639,24 @@ "opn": "^5.4.0", "r2": "^2.0.1", "read-env": "^1.3.0", - "xcode": "2.0.0", - "yargs": "^12.0.2" + "xcode": "3.0.1", + "yargs": "^16.2.0" + }, + "dependencies": { + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==" + }, + "xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "requires": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + } + } } }, "@sinonjs/commons": { @@ -6086,40 +6102,41 @@ "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.0" } } } @@ -9029,9 +9046,9 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { "version": "1.1.1", @@ -9632,11 +9649,6 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -14286,14 +14298,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, "level-blobs": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", @@ -14838,14 +14842,6 @@ "tmpl": "1.0.x" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -14881,23 +14877,6 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - } - } - }, "merge-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", @@ -16326,16 +16305,6 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -16352,11 +16321,6 @@ "object-assign": "^4.1.0" } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, "p-each-series": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", @@ -16368,11 +16332,6 @@ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -18037,9 +17996,9 @@ } }, "react-native-webview": { - "version": "11.6.2", - "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.6.2.tgz", - "integrity": "sha512-7e5ltLBgqt1mX0gdTTS2nFPIjfS6y300wqJ4rLWqU71lDO+8ZeayfsF5qo83qxo2Go74CtLnSeWae4pdGwUqYw==", + "version": "11.6.4", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.6.4.tgz", + "integrity": "sha512-ahW9KL/iBooDRdQwBgPEWOl5Awjwvmo5FtV83WzbgUpQxDJ+ZRzZDpbmwcjLtd6R67yWg6dk1inqKQTrmkWiXQ==", "requires": { "escape-string-regexp": "2.0.0", "invariant": "2.2.4" @@ -18471,11 +18430,6 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -20463,12 +20417,64 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, "wrappy": { @@ -20553,61 +20559,58 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.0" } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" } } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" }, "yargs-unparser": { "version": "2.0.0", diff --git a/package.json b/package.json index 2b155a02e..e545570a9 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "@react-navigation/native": "5.9.4", "@react-navigation/stack": "5.14.5", "@remobile/react-native-qrcode-local-image": "https://github.com/BlueWallet/react-native-qrcode-local-image", - "@sentry/react-native": "2.5.0-beta.1", + "@sentry/react-native": "2.5.1", "aez": "1.0.1", "amplitude-js": "7.4.4", "assert": "2.0.0", @@ -166,7 +166,7 @@ "react-native-tor": "0.1.7", "react-native-vector-icons": "7.1.0", "react-native-watch-connectivity": "1.0.3", - "react-native-webview": "11.6.2", + "react-native-webview": "11.6.4", "react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#e2e9a9038b76d096bf929a87105a97a0a7095001", "react-test-render": "1.1.2", "readable-stream": "3.6.0", From 141aac061288a0618e660a68de85af2ab5ec3a48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Fri, 18 Jun 2021 12:09:19 -0400 Subject: [PATCH 144/327] Update marketplace.js --- screen/wallets/marketplace.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/screen/wallets/marketplace.js b/screen/wallets/marketplace.js index aaa612b5c..a2f372298 100644 --- a/screen/wallets/marketplace.js +++ b/screen/wallets/marketplace.js @@ -6,6 +6,7 @@ import { WebView } from 'react-native-webview'; import { BlueLoading } from '../../BlueComponents'; import navigationStyle from '../../components/navigationStyle'; import loc from '../../loc'; +import { BlueStorageContext } from '../../blue_modules/storage-context'; export default class Marketplace extends Component { webview = React.createRef(); @@ -79,6 +80,8 @@ Marketplace.propTypes = { }), }; +Marketplace.contextType = BlueStorageContext; + Marketplace.navigationOptions = navigationStyle({ closeButton: true, title: loc.wallets.list_marketplace, From bef996899cda29f6430f04fdc917b26c90751716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Fri, 18 Jun 2021 14:13:25 -0400 Subject: [PATCH 145/327] OPS: Use Package fork with updated code --- package-lock.json | 5 ++--- package.json | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6eaf59ec3..edaacd9b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17774,9 +17774,8 @@ } }, "react-native-sortable-list": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/react-native-sortable-list/-/react-native-sortable-list-0.0.24.tgz", - "integrity": "sha512-UomAYeTeTpkuPmcRcqFd3mzKioVaD/+yDAlsivKjBnQoV9aEBd2SNthoxaSsYWTwoadBOStthZj2vIXMMC3+XQ==", + "version": "git+https://github.com/BlueWallet/react-native-sortable-list.git#46e39a30ae0c4328e7c06c30b72b1af0b69e1aeb", + "from": "git+https://github.com/BlueWallet/react-native-sortable-list.git#46e39a30ae0c4328e7c06c30b72b1af0b69e1aeb", "requires": { "prop-types": "^15.5.10" } diff --git a/package.json b/package.json index e545570a9..e11a4b98c 100644 --- a/package.json +++ b/package.json @@ -159,7 +159,7 @@ "react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#63ab38c9d382a819844a086a69cc204c46aa93f9", "react-native-share": "6.1.0", "react-native-snap-carousel": "3.9.1", - "react-native-sortable-list": "0.0.24", + "react-native-sortable-list": "https://github.com/BlueWallet/react-native-sortable-list.git#46e39a30ae0c4328e7c06c30b72b1af0b69e1aeb", "react-native-svg": "12.1.1", "react-native-tcp-socket": "3.7.1", "react-native-tooltip": "https://github.com/BlueWallet/react-native-tooltip#d369e7ece09e4dec73873f1cfeac83e9d35294a6", From 071fb56747b2162cc0086be8093c5b3d5ed59530 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Fri, 18 Jun 2021 17:51:42 +0100 Subject: [PATCH 146/327] OPS: forbid anon upload to filestorage --- appcenter-post-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appcenter-post-build.sh b/appcenter-post-build.sh index 313bf807c..c0ed0fd7b 100755 --- a/appcenter-post-build.sh +++ b/appcenter-post-build.sh @@ -22,7 +22,7 @@ if [ -f $FILENAME ]; then HASH=`date +%s` FILENAME_UNIQ="$APPCENTER_OUTPUT_DIRECTORY/$BRANCH-$HASH.apk" cp "$FILENAME" "$FILENAME_UNIQ" - curl "http://filestorage.bluewallet.io:1488/upload.php" -F "fileToUpload=@$FILENAME_UNIQ" + curl "http://filestorage.bluewallet.io:1488/$FILESTORAGE" -F "fileToUpload=@$FILENAME_UNIQ" rm "$FILENAME_UNIQ" DLOAD_APK="http://filestorage.bluewallet.io:1488/$BRANCH-$HASH.apk" From d70112bb2f6a0a8945c53c6d28b69f72787b1c51 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 19 Jun 2021 03:11:52 +0000 Subject: [PATCH 147/327] fix: upgrade react-native-reanimated from 2.1.0 to 2.2.0 Snyk has created this PR to upgrade react-native-reanimated from 2.1.0 to 2.2.0. See this package in npm: https://www.npmjs.com/package/react-native-reanimated See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6eaf59ec3..97156dcd9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17703,9 +17703,9 @@ } }, "react-native-reanimated": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-2.1.0.tgz", - "integrity": "sha512-tlPvvcdf+X7HGQ7g/7npBFhwMznfdk7MHUc9gUB/kp2abSscXNe/kOVKlrNEOO4DS11rNOXc+llFxVFMuNk0zA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-2.2.0.tgz", + "integrity": "sha512-lOJDd+5w1gY6DHGXG2jD1dsjzQmXQ2699HUc3IztvI2WP4zUT+UAA+zSG+5JiBS5DUnTL8YhhkmUQmr1KNGO5w==", "requires": { "@babel/plugin-transform-object-assign": "^7.10.4", "fbjs": "^3.0.0", diff --git a/package.json b/package.json index e545570a9..4d1b21c73 100644 --- a/package.json +++ b/package.json @@ -153,7 +153,7 @@ "react-native-quick-actions": "0.3.13", "react-native-randombytes": "3.6.1", "react-native-rate": "1.2.6", - "react-native-reanimated": "2.1.0", + "react-native-reanimated": "2.2.0", "react-native-safe-area-context": "3.2.0", "react-native-screens": "2.18.1", "react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#63ab38c9d382a819844a086a69cc204c46aa93f9", From 0ce6c6b346ccf776fe043c00127c1989b67590c9 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 19 Jun 2021 03:11:56 +0000 Subject: [PATCH 148/327] fix: upgrade react-native-share from 6.1.0 to 6.2.0 Snyk has created this PR to upgrade react-native-share from 6.1.0 to 6.2.0. See this package in npm: https://www.npmjs.com/package/react-native-share See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6eaf59ec3..515084fda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17760,9 +17760,9 @@ "from": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#63ab38c9d382a819844a086a69cc204c46aa93f9" }, "react-native-share": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-6.1.0.tgz", - "integrity": "sha512-3X71U4Hz69zoQsaUMmZMBzE2BbpJdze1iGs0ifmHmLre2/0RtW2bATHH2QpQgyZry4uwFG0y4RyZBl54pvX3gw==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-6.2.0.tgz", + "integrity": "sha512-8s5WNaUP8HImy08SzbwRx7RMgGSYZjNWeOiPNVZhyIY/YKRBQEUxEF7ewsmRY4PAtg8Yytb5DYGtCs4S/04ScA==" }, "react-native-snap-carousel": { "version": "3.9.1", diff --git a/package.json b/package.json index e545570a9..e940db918 100644 --- a/package.json +++ b/package.json @@ -157,7 +157,7 @@ "react-native-safe-area-context": "3.2.0", "react-native-screens": "2.18.1", "react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#63ab38c9d382a819844a086a69cc204c46aa93f9", - "react-native-share": "6.1.0", + "react-native-share": "6.2.0", "react-native-snap-carousel": "3.9.1", "react-native-sortable-list": "0.0.24", "react-native-svg": "12.1.1", From 44aa1ba177eca39bde42156b1159c4f4e6f82c11 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Sat, 19 Jun 2021 12:33:40 +0100 Subject: [PATCH 149/327] REL: version bump --- android/app/build.gradle | 2 +- ios/BlueWallet.xcodeproj/project.pbxproj | 24 ++++++++++++------------ package-lock.json | 2 +- package.json | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 5a73fd9c7..24e89fa41 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -136,7 +136,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 - versionName "6.1.6" + versionName "6.1.7" multiDexEnabled true missingDimensionStrategy 'react-native-camera', 'general' testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index 334305924..22a0444cf 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -1344,7 +1344,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.6; + MARKETING_VERSION = 6.1.7; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1388,7 +1388,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.6; + MARKETING_VERSION = 6.1.7; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1429,7 +1429,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.6; + MARKETING_VERSION = 6.1.7; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; @@ -1468,7 +1468,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.6; + MARKETING_VERSION = 6.1.7; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; PRODUCT_NAME = "BlueWallet - Bitcoin Price"; @@ -1500,7 +1500,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.6; + MARKETING_VERSION = 6.1.7; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; @@ -1532,7 +1532,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.6; + MARKETING_VERSION = 6.1.7; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1570,7 +1570,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.6; + MARKETING_VERSION = 6.1.7; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; @@ -1615,7 +1615,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.6; + MARKETING_VERSION = 6.1.7; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1758,7 +1758,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.6; + MARKETING_VERSION = 6.1.7; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; @@ -1798,7 +1798,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.6; + MARKETING_VERSION = 6.1.7; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -1834,7 +1834,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.6; + MARKETING_VERSION = 6.1.7; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; @@ -1873,7 +1873,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.6; + MARKETING_VERSION = 6.1.7; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/package-lock.json b/package-lock.json index 6eaf59ec3..d23f8d66d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.6", + "version": "6.1.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e545570a9..fa40d8460 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.6", + "version": "6.1.7", "license": "MIT", "repository": { "type": "git", From 55733fc43aaa265a400f2b23bc6b05ac6e0ed760 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 19 Jun 2021 21:59:47 +0000 Subject: [PATCH 150/327] fix: upgrade util from 0.12.3 to 0.12.4 Snyk has created this PR to upgrade util from 0.12.3 to 0.12.4. See this package in npm: https://www.npmjs.com/package/util See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 22 ++++++---------------- package.json | 2 +- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 07d974d20..383d311a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4581,19 +4581,9 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "available-typed-arrays": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", - "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", - "requires": { - "array-filter": "^1.0.0" - }, - "dependencies": { - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=" - } - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==" }, "aws-sign2": { "version": "0.7.0", @@ -20180,9 +20170,9 @@ "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=" }, "util": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", - "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", diff --git a/package.json b/package.json index 4bcb3c147..fd589de61 100644 --- a/package.json +++ b/package.json @@ -177,7 +177,7 @@ "slip39": "file:blue_modules/slip39", "stream-browserify": "2.0.2", "url": "0.11.0", - "util": "0.12.3", + "util": "0.12.4", "wif": "2.0.6" }, "react-native": { From 159306b26514fd0a04c2fd532d0d95640ebd1f2b Mon Sep 17 00:00:00 2001 From: Erfan Abdi Date: Mon, 21 Jun 2021 19:12:22 +0430 Subject: [PATCH 151/327] Fastlane: Initial setup for fastlane metadata --- .../android/en-US/full_description.txt | 44 ++++++++++++++++++ .../metadata/android/en-US/images/icon.png | Bin 0 -> 13025 bytes .../en-US/images/phoneScreenshots/01-Home.png | Bin 0 -> 93705 bytes .../images/phoneScreenshots/02-Wallet.png | Bin 0 -> 89749 bytes .../en-US/images/phoneScreenshots/03-Send.png | Bin 0 -> 25983 bytes .../images/phoneScreenshots/04-Receive.png | Bin 0 -> 52696 bytes .../images/phoneScreenshots/05-Create.png | Bin 0 -> 32344 bytes .../android/en-US/short_description.txt | 1 + fastlane/metadata/android/en-US/title.txt | 1 + 9 files changed, 46 insertions(+) create mode 100644 fastlane/metadata/android/en-US/full_description.txt create mode 100644 fastlane/metadata/android/en-US/images/icon.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/01-Home.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/02-Wallet.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/03-Send.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/04-Receive.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/05-Create.png create mode 100644 fastlane/metadata/android/en-US/short_description.txt create mode 100644 fastlane/metadata/android/en-US/title.txt diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt new file mode 100644 index 000000000..b0167fc68 --- /dev/null +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -0,0 +1,44 @@ +A Bitcoin wallet that allows you to store, send Bitcoin, receive Bitcoin and buy Bitcoin with focus on security and simplicity. +On BlueWallet, a bitcoin wallet you own you private keys. A Bitcoin wallet made by Bitcoin users for the community. +You can instantly transact with anyone in the world and transform the financial system right from your pocket. +Create for free unlimited number of bitcoin wallets or import your existing one on your Android device. It's simple and fast. +_____ + +Here's what you get: + +1 - Security by design + +• Open Source +MIT licensed, you can build it and run it on your own! Made with ReactNative + +• Plausible deniability +Password which decrypts fake bitcoin wallets if you are forced to disclose your access + +• Full encryption +On top of the iOS multi-layer encryption, we encrypt everything with added passwords + +• SegWit & HD wallets +SegWit supported and HD wallets enable + +2 - Focused on your experience + +• Be in control +Private keys never leave your device.
You control your private keys + +• Flexible fees +Starting from 1 Satoshi. Defined by you, the user + +• Replace-By-Fee +(RBF) Speed-up your transactions by increasing the fee (BIP125) + +• Watch-only wallets +Watch-only wallets allow you to keep an eye on your cold storage without touching the hardware. + +• Lightning Network +Lightning wallet with zero-configuration. Unfairly cheap and fast transactions with the best Bitcoin user experience. + +• Buy Bitcoin +Enter in the open financial revolution with the ability to buy Bitcoin directly in your wallet. + +• Local Trader +A p2p Bitcoin Trading platform, that allows you to buy and sell bitcoin directly to other users without 3rd parties. \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ec541528a9a35368962bfaaa59dac1bdc66f940c GIT binary patch literal 13025 zcmXwf1ys}D`~T<;X%QGGp@0&iG^0ZrL_lH)C`fm+O+r#YLJ*_`B}A!@AhppT-5@o( zd*Xtz{r3Hz^FQZ(&ig*E`}A|~bMO0XNoFQ`O!U0;004l=KwsMe03as~$pN$!q*u>Z z;Xx8{ZD#aTheWFTHn=vfa_i=B>wMtW$>P$<=G1)0t^48sKe^mG+4f)O4C33lb#qmN zYt@2&@EYa`8sxh*uRHx%T#16Ms)=j-!9{oJ0?|*zdc5F+hIMm|3n%9lqb-%1zBAGUL z+oAuqoix^p{z=lQ18XLMYQeQ6giHH9D7;oFWFSBv~N^s2nh*3mrZ8?%d|mO!w{DQ4O9?m`1;y{ue%Y95s9zGx3)c znp)^0r$#Dl>>{vt|IIkcqhk{kx)d{xN}j`#jCvuqxHR5HkDPI7WpL@_s07Z&PhBR> zV&Wz*Q|56Y{fDpHH%OWBgl{VOO>k*vg$*7>44sg|1cfa}4xNM!9C2x9hYTDB_3m?k z68wAiNYzmdUf=*FK}OCr)GwN_fTN(9*0^&t*Kc{RL3U*ryHfOH z&jIMz#nm-|T?wilz8p7t^4O#A?bsQcViXE@{eAWCo8e3)Mf#ti z1I#f7zxDTO4Ry6}ifi5cXO*=gYE=m|{K&7LGj@piZ~d}x{vxdFB(U{Z!F%|g?T?a$ zi|D?Kw8>K)$jtIN4!(^xh@FiYxpe)yeN*e*z#b-J>fF0=&*}4;P2RG0^f(qzXx{i2 z2tR-hqTIi4*%z+*{@UZwNHk8GGfkQP?@yNlX#+eBvM{j(P!jC_y*r=pJVefWUA5*z zUD+83*Z22Ixl!Ai*^NHx3>H~+~K@ctn9_S@HgiVB>yYso~jgWw{-F|36Pywl5%v~ zabJL}fX$iJO(U*zIom7qIt>q`*Oup%##U|C>-IdxHBV{2`$g=aAft};9h}LY*m%k$ zs{p5`t7&6hze}bNB+vMGvh3QE2h;+$^nd7+e&d{OAhfvuj3=r&D?`BTvKovxgybzC zyS!??-13g&N?QI>Ph_saDlII>Ahz~~UU_aj`(0d7 zcFun*e;^=S=R(Fm+5~?RH6Qc#CMNz&9Yf)sts=?uG#q^!(hSMdiZzOH@$Y@c(P}-B z_v1#B=^e;CMEXs?O@t(mX)={4M&P^+-60~^+pQ>II>7!|AYa37TE~b!R zP@?bx!0Y*hZsYUwit^sm0aI^x*sr_R{6I_1TyzpL7uvIi`!1TSEw@>nHbhSMuhQd{#_NrOP31BrDVV$XOqaeQkFHbF`4Br&nAjr~^T(%c z#kVS%m6P(8NPVBGlpQ_JjrrEUje>2rGoe@V_{&t zvwS^#B~pQZ=$mO&a`zm~VGq;?>in%*^PrE|m-gpd(+x_pu(-OMZq_;t+TVhD z@e{Z5)Rj6kZwCs$^K+B;VE(D`PCSc8u|zj|it=e*(Ca?_>Z!%*&r0JNwsQr)-O)kx zW9gzr>3wbT%E;yLN1r}$<8+3;tR}+a7!n-^qyeA>D8(K-<6}}2>-abINZ`H z_dFc%SPWx!;EO=)aGJU5+-NKME2e;1-RgLEo?s4+0pn-6)tixhFP=Re>2f(RJbMTx z``)%?FwfNs{3R!Qs>CSx*re~qEMAYbe0kf+972JA zQ+MLxdHDtNlJiTdaSO{qi z&IBiL(zn^JWI-)caGCfOazEahv*&-hfcnw45DEoT|JbZ6k9Ea^;fvx3Bp~DtJlTJt z<(8#PduLbj8Q5!CBqfT@Zgn>_4cbkgOenUnxI*Gun;331t)#I5z zu)FE6@(lbL9IH%k)wrE}uF2E$zN4v9YO@_FHhziQ z>9&5&^zeUyKSeOU{cy}7-cJ|I5B?@K z>-%Q?ra>u4?qc)6@Ur+#>B(b7;ho?doW->gkH@<4sZwJeY0S&>WZi_GZv9l?@(a#b z`e_;81%0*DERlMUz@?IiBMu^IU_JWbb$sONE@dObdu)1shS4n$3c$an{WmkjHi7_v zZ@rs(S*4Zl-RB#ITb_>k(Jh1&=Jvd0FwNrzR3oMtnJk0Q+0&b6> zH{)5M((eW^=gaJEoaizS{aHxIr7TG`7HrEJXSu2sL-4qhm9=eD*7S69VPm7?DJ~*R zl@B5S>6dX`qh@{%g)?t^H6srT3xijSii%XAiahOCxEHwBMZ&LJ?N>+O%MWmqKoImq zk7}XW;YBGW!liQB>(hn&`Bih{%lwgwT9daLXaAk4?8CGYJg|uCEbHm;%m;4G*H=Zv zR|K`E%c8+d8*?9J0_LvHotuo*n3M|mbbS|kZj42SL3aBpC~v*^6iPr};l=$1<$E0Z zd^>+%=%v^y0U09+Qn@UO2Z+3iMxE^F|FJNa8vlMFLwp4%zWQLI98QxJs(-*<_*yBF zU5$7Z4e@rj$G>t!3QOU^j9tIe6I>3UZUgw>!ndW;Csg%kl+tHzPOdN4Wu~50t~AKh zO9yGKNc;%0N_xU?qa;XqoFndVN%wi{)lk0c=fL6;iUFn_r?v_cisk-g)Ni@5bL^i7 zyD63mz35H+HAd?2W7zXxcq&4@Z0avx#F4C_XqwckcORh!Bfw2DgOIh4K8}cr4YK#H z3PcdskYL!1uZ;;jl?h*2`OHA?D14NmSG zQsUfoS$!u4h%$|f^-RG|V+;u95@9_!)f?#ShiBsP5B%F|QhV~jsYef?O2B@Rx$@W7 zCrJY{Z87;HgNW20Y2J7y{JdBcA1BHf`)w}(?{*m}DNq2Q7ZWLboF?jP>oz0Y>g5QU za5)c9DN3uDma^pYgY8ugyMJ!8RD9-8rO=;8w1i}&7tFEXr22-%0iv+CuV5@0oUuMs zn!qB+GRGiB_HS;l%np&7r9wRmr;$Y+7Ds2%Wanpp>c$>a9x@vwnSe#~nKn!x%C8>2 z4~sK-ACo2;^nR6?fs67YK%;Q$<+wNEcVJ|4`pV+!)Rh~+EQZmFMQZc>ly_<Zwa+1CliV$E!=)Q3l`*Qyzr&PJc(p9-@a zdZ)qN2;lPGZfz;|}VniJaFz5wj7Z z9Yh~UZsXDpeISr&&~#7j>o1{Y!O7-}tsE?LyyCP5HyLqPz#@LW)?ypBV0K)Vf?Zmp z*MOv%4RX6qmM3A?o3GkDJ1DZv8^NTG(YIZrOi?D(dej^JJ(qo~?D zV-BZA>x|p-EBnk}k(jrp?_WwE>V^q9+ECHht|h#$r+whjpGXqP1x8QMvnYj4#gZ|L zWTZHj z<>9xcf2ZUxm=}{Z2VQ-;Q_V;N^B05>`kvm;|iinG!Q zGXPutmWChfA3^PYJ{d@15p~`%YeY+ zr1?v@mI52MUwc*_2!w=!8a-0c9c4CdjfYut?!V)y!>F49i}(x*Lf*7Pv@Hs*-ia= z(S%38?>zbU(U+yTs`YsVtde?0u$oUGK;9u~tW91{hPDPn4yQY<#D zgQs6TFJa6DZj9f$I5S8Gk(*z|@rcELy-e>j8);5S|DIrfQ{BKYu~iU#J17;~bpGDa zMMMTv?yWBAv^-t#0`47ES6F6Gt$(9Dn6#MxoxhHz*b+JfJw1^FzyY5Q;#J+BreYso zbTxe?`!Pya4>lcX&N4l`Dd^E8bMz4TOs(1lwl8?J?s`!j=Wl;zMlx|xR#koB42Ov_ z)lHC>7#}B1djDb#%JY>%RC%O6YBquOh3NkpbEN#T{SfJ>wy@FTXdqb)sHE?wFX!6w zFCN$|?i*n5RA8ew@+r^2hM@XZ0hoytMe41~f?9AYHUi%qy?xHX%D_SSke%<}+leE! zoPnq%EaOlrOUEk!E%cd9cb4(DJh zIa)%Y>}=B?zKJkiK+RQE_F&3v0}kcFv`iRW0|9?a7ZxU4Zcjsd=2!w5&4OPQF=VMJe2QrX1%MJ#vgtA=;0|l$W~IK%3A$RRv!Be+0}<5 zSAE=X$=JFT`6y!WM{uNBtX+ zK7<3YE6;hIm}+6&>vFq1D7A||wq&VthR6RIo)x9W=Aqvs2a(Vzz~PKc)wJ!%)nLUC zU|0j_8neh57pa8fdwTf?U`sTyLj$c84(RQF6$gzr7f5bxChCYX=*9v1$#em+$Keq1f?q6kkkQlc{Z*d8naG?f-5MZ@j2QNm1qjgyu$C9M`R93;+y%XhzQ z2Xxtv@21B3Y3@XCZ{7+gx1ToY+Hzr#J(YmoH-#14SQo$ZQNV>{B8Y-IFVw8uGi_V? zR0>2x;pJeULLjF3b^%1l=D1LV3lSc{!@83iS!s3n={u!6?$5~k_xX0Nw*#d+b;Z0E zL`Xw!56fl;|B3iaRrq1-;n>=)`X%_&=&m172JaRP* zrJ>lXJN{J0uHmxkM$nbKK`x}OxuZF9H6qnJLau&-rZX9AAIBRV4QjA<0Axw{X>Zf? z%^>QDAnU5Uc3>*?g!GSH+0%yz&M!wpWJb3|Mf>y6AEk7JG=@dQsU3{ovSjQ?vZB;b z@qDoVH?he$y=>3TPIIfdM=J4thuN#St zyFiKEd4zPF(X_p+S$fPE_X6%JPvPJy=&8Cm>$YWd_k)>)zvZ%}^j@stiUAnJ z9y9tR13I3)BotMqcs**G-GQ(QMYpGyM`?9hja8Zigusq$Hlr8 zmf76?7j;#0`yM$j+Zz7He*3+>y%nH&Y{9X!6hQQb1aM+rwhTASiaS^rBnUsaa1T<7 zR!SoKeEUz7VQA6WHk}N5IO0BD(h%XD`FWO>m`Cyr`hTubJBiRzJP zY5k%ex9#GTmsUbi#Os4lPoI~$XRi0s{LPPx!WHg~^$&%j+NxPS=E@+=J6{hE7N%{V zUZ>IQ<2AF9xne8|!TZ*TTc~>G3_e!Xou$VmAIjPHLyhoETc{yme{H6GjhgCVvz*}{ z)r&l-eCsbkX4rL7BnhaOIb{!`54rQ>H@Uv4I&f65?{*$(2(N48oc^wmIhd}6lw!L9 zqF4_N$+2D<=S-jp7O~z~?sn}2Q0scRsp*yNn&lZ{f(tVq{ikp@{f;#jvEAr8(+nwZ zvHeSNc+sfEFRqylr7M!0sDR7?#>EC1rnfWdnQp z+fKGE2zgQYAUja=Tz@c?(>#wI@p*_;Zbk*(KO8DCV_NzB<3ocVRh-d?e1{iWICXE` zZkvoza{?xc_vf5x;>R)J)D(yL7i|Jhu$E_SBjZ9*J^Cxml|Hrj^6##J-@Q|V>;!DS zIUzfW_Z;`4{gkQmO;kdU*`{?m=a0$?MU~WxitSLvgMq%yw}|8Nrh<~Ys^dOsj>#H+ zUoI+khPyj{+xbv7s;}!btKb&26#%Za_db;2_rr;k_f;q<7AXIk@uyHop7`7y7y61< z#0Z9X9Lz0@EV0=XQ+gE$B$yLa+H>n-Tt)~qYh(og?|KhJ&t0e*WSAZ)+6aS7!p%H? ziJbqNTexNEsha~5E2foia{(CmPn`NWWrM_ky+_+`onX@Tan4g^QUYG%TH;X0RcMfh z0KptJA=qhTHjvEFCY_|@)-#rOvAZKh|LiP+@#X-hSssFuyPvvS=+F_1LcN6h#YGg< z3H;Y0JhY%WCi){EJH+y4{Ps*c!~;?^U_kY&I`|H&QS)Rrdu?Sx@#la}vf zJ|E;~-2G1N&Z^KAYCl_vYcA$dy37XH^$Tvad>Yv=pE(=aThj7>sFv*Y_lJm11B}lL zsbdt1()Tq6ja9Q_as_%#C(|eFN~xc9C9`OlsfY_joRzoWm~o39ueUkH3TlXqn`V!4 zQ^$(Gw0$f@9(5Di_9I<(YI~W?dVN7v9b`YqEMigm-SLAxc-7s3QLy}OsvU?|uDSY zGsl9!RdQ&AnYt^$eSG<|gR=1b@o)w_+>Fuh9hKlOefGy&?M#H{GMzc}Rr8FwsK=OZ z;9Diyturgip;h%68K`HN245I!GHb#u;cF8a#gJ8cgn^r5Tn#o+)aHkoHiu}^ufbpv z_&nKK{cd%3Q2*C^tStKgebtM%qPD5+X?fpurTygU=>iXKlXz>DC}seHu>9$a z&30qB50lyFypsoiV*OXep$~c2ER56>liUWwzu{lXbvCi6i~udN1b4O~`$))R-n9&J z7O{I8WSok=IUsF{qss<_^$2N3jn^rsjbQnmmqL;o`#HK?gV$42fM@sk!ceyJBv)q# z`)Sel{)S2c6nijz*z602wqm-&d-eV!^50ww`g&%|t%!s|hyCcd7KV|{qtHkP@lCgFC&F-_hv1h zTsq5hq5~29L<A=<+_Ej<$as zA7AZI?c$E5)>{C|Zts%&HO>(YqBBjff9wU%y1Ds!?yJ)a8ba>DYA&G`(0nV3?kb73 zcos;|#F;_lSNsN7#!muh7U;+0_o|Cq?PyY?Anv^gfGRF>C?ANFaRego$B0v zOHq+nrHTNKXU%71KuZQeOX_&}QdIO||pu!?ME5 z?!~J~FQulc*J$1)$oG^-qvQZ^^C5o7Pp;takZXEHfJ5KxoYC&H)(*Nk)N4%Jz ze$k1j$xQQ4I1SemGc%qCnF7#`Q8Q#QEG;mb!Qm_|xEA9IEy7g&&QS4fEBeU1JN#VzZ6%8@&GI{+aVpC?;T>TlfK?_RLeLR16u2@$VkOW- z;&%hLv!fUwznn+%0u@&f+jd3mWx6SYpcPRv7z%|(LL=?k-+79{Y1Dc(Uxsff_ttSm zh5x)1h7R9~7(|pd?xo-ZCMuD5MzgYqd6X2&p$z)-AWlqg{hCggRC}bZPwt=y!W~6M zM~I^=QYa?sR76K7hVDro(GN?}yu*!(b@q#<^?ybppRgat;M{`ffzy|!RMg0QGP2A# z9#c&?|2cN6Im|HJ=!*flA!h48JB^|TxBhy`o&E<>DhzjJqbLIZFTctgDVEL)YE+lM z?)coNNw%G$le73|N~hCFM%DL+)ow%#q4gQL#$w>yPfCGD*K;3*SleA*to4SR;~Cz0 zqSAKJ_WJYG5}+;~UB1Zzpom5MB(chJnns|0&GR;jz`n8PMNlMrgfSL_ar*9lQ<%ICtVqFI!7aWL zGyq8j-%C z!$`I|2CrXIPj~S_OcSuzub#K<`LvEj?7b*Qk_VB&fKX3Ax;i`aGyb3rAh`r7Ws(nt zCt=GMxs*nqANmCUJXd9vPW+8rNpI>9C5xgGTz{wz6MI7cRG5n7Shef5UcFF>ZTd)9 z=i);5F~l1|cGyvcGKG@AyB}zbyb8h%vywo7R&n zv?}?=0zwp4bKPcPEjpWb>jC$u6!8sU2?b1OIs4P+rt+7Q{ubfkow=K=TH))0AoTz9 z^`}9k4K%m5$d712ayInKYB!nRQVUh!NO2;Kvb?M`UH~p6F!0su_#WA~Ly;bBr=0r? zn{Q~6UDh#}p5*Il1i3=V)4Sodn37CRjH?kwbpX##78s)E$09?qs#p2u-{3gSQ^#{Y z3xFhoPws&GUmfJeib)fcbS_?_CV{kL zg#Zy!a@^XZHPyxb5aI#LHP?~f9+1bf7-$RP{jD8}ur=1(w*|=H7m-2#1>IPn02_th zyD%iH`(HCnUpgGX0b9D+PKp^y3V%Ym52pBN3s(QOb+0(=j}bq)5n@q)(qu&*9gK5g{vY}=(Zz_+2_j-Ty*9KT9o z*j<-^(u#Q=p|m!H1r5D;{~Dyo+t&@(rnF%riwMI@X6C9-ohMy(6bE!% z7vAe=71W{elngVrel_6z`7WiT4xD%Qf7QsJl{%_~YBKg{Um@9?>~3D6O|DrF$S6-K zxcZ#C(-!Pe73D5LTLa;4sZ#wa_v?dcjD-Lnz>NRv+aAZX=S(jDPXCHMOgU{6d5j9K z^ig#nLd<-H%{9di;PxnVd0F7rxPjigY3t=i&=0V^w!;5P;=vIz<7<^vsu-Yyy|f~( zg<=RVXQ$sZ+K!6J8O$T(5A+;v!hEJ(0!EP;X+tt!4V45GRw8z$!)t&6Hid6Rd3#FC zEqj@@wQY*-x2?|Fhb|pHhfXm*8b-H%wwbZKJk`6be%g9(WqEl;urq4;HkZecJVMW0 zjt5a4DS{CB^sff7{4>bn-L~mnz$Z~ArF1eRNWg)zwF-xRa^1_MQRjB%7=}*mX2vu{ zp@8?2_4<8YuNH3A-lOvvBprQ=<%RQza1%j5lho7u>!cfj=|ONwGJrNixUwRMqK)P> z5{|`DCZr-K+mC6XAM^nvq0s~G5Ob)Q26;U(%u0!5=y?@76u@U@_Q{w}tYwFLc(Eh% zT*BP#(NO5S`Q2af*gDeDW}~Xz}ZG z03TDPjeAsuQGMRb6)WuZL?y^M*Jde*_s25AbD*z$ADLru&|S&P`U`9)hs5(5{G~#e zvT3P8@j=h~lpl~m$^j^IsHt(&IUyO&+N3Ax^Z&z!K<@1#SPUtBUodR-qs z%aKdv){+PzQemN-N8v(N#MOIWR_i7xjc1RsyVkAV1OAH+&8!2VTBk|)oUzIm@<~Vi zAt!G`()UpZ@A2{Pnw>%|(|76_LpqOBzrOSMm{=54_}9V!#58N#M|Bx{M68KhOi>UUz~S*ERsBDAlhw1Yopq+SSn~e z_@Cr=N^>4H1B4+Lg`I8Ea<`3+c3hmGcw&6~Pa!Wv`NCf;MJ6IccCEJE&0$_X>tT!X ztp^J1<2{{GYNuZQJelAjptvIGMz_23bz!U;SPeBPW~@n=kasMHs5!b6`0H>_+9q=Ew0=+x)LnM-`{;Uib8)X_(jS2l_Y#K zTIMcQxc-mQh_Es^tNlWqtvpZ5QEK9OkgyKU zDm0l#u~-ukm=)$@p(1evEDsh&o?WJ=0@$EiFp^)MXjYFVUgyEK=@x#0yZzk8X3;AH z6i#dnVN zuHe>;}&gZoVlndUjiS?AvKA$guML4D0>UR^SQb$!Pn78*|k5 zU*WZciyS_lS3~b*g}IfuZ|1#x=o7#w8F_HE4-OhkaxJ{4H+Wk}?<7QmKCotKTza|c zv<#{@rp*$WNE$6=IL(kEJ5M%jk*r)cj!m$ zXfQsTxs-i0yG-z4LL;^9)mTK+j_8gv;|#j%G;Lo!6HfaR+=MQhA%-K0C%XQA;4`Dn z@e`BkghxAE7ymn_S!4CtjjRrkv6Gx*NDwo)MjU?__i0dP?M&!!5snYLa80FgaV~qL zT~_t=`*m@X>Dn#7b(1K1NA#@&x38}D<(ynzySc_8H~$TcbT9n(9F*5>fO(PF62j7( z`pZPD8;~}WYUaPLi+>UgG;#f;f^w3L6LIYm+OXdB?e~-YR%_r_uKX?(%*&Vz{)n*E zAWPNykmn?Gpet^V_rUux#;?(|#az4BW_epmC{mz7K|?X`O4p z=RW*3(p&S5LNa$Q%yKNIPySGXhW_OXF_sG90s69zt2~TobR-#-%TJrkqm6~1m>v8F zs=nz&3xgp3pTpLbp!$z|0>Pdv?N!2m`;9ly(3Y(?04#m6F%=6S)#&X!ZO!;MVxtQME5L9@(&)f`vzI`%<9Qr^b?%%$`#f z8?45ms7J@#L=Gf=clW+@NkEnKffJVt4I8n7P;xO&OnUgV-E4K8V>gi)4QAr6WRUlL z%sKYz_NLhebi5hqQ}RqM!7-aonN#jJsi5ay%1Az)GMZC4i%-OpWQNNf&r_6%cZcIA}ZGzK-M`EB2|7w{y8u z&hn%#Pn2LCg+DvAtwr5Zi_SkW+-*TC*n#g$Eggp-PVa5^w@e_m0?`iE;n!;LwBha9 kh<^)_C+$4fXGB2Q^TU*Y^o2RnU-bb7IwsmbG@WAp4^Y7;IRF3v literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/01-Home.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/01-Home.png new file mode 100644 index 0000000000000000000000000000000000000000..5d8514a4258a53020457db393e8e2acc0d5058fc GIT binary patch literal 93705 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 k5zzO%d#u>$5N`C+ImV?yS1n=fK#m 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/02-Wallet.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/02-Wallet.png new file mode 100644 index 0000000000000000000000000000000000000000..fde57d6fee236257e07faba4a59936dc4a52ebd6 GIT binary patch literal 89749 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/04-Receive.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/04-Receive.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9812169ab57d08f2e1a4436327d8075d901e2d GIT binary patch literal 52696 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 b=(pZEWR$`lsfUPffPWGqvR_Mu^!@%9caAhT literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/05-Create.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/05-Create.png new file mode 100644 index 0000000000000000000000000000000000000000..e5002a77da933fc07c2d600a43fed1149a4a7e11 GIT binary patch literal 32344 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 Date: Mon, 21 Jun 2021 20:02:50 +0000 Subject: [PATCH 152/327] fix: upgrade @react-native-async-storage/async-storage from 1.15.4 to 1.15.5 Snyk has created this PR to upgrade @react-native-async-storage/async-storage from 1.15.4 to 1.15.5. See this package in npm: https://www.npmjs.com/package/@react-native-async-storage/async-storage See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 07d974d20..8f303adf5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3019,9 +3019,9 @@ } }, "@react-native-async-storage/async-storage": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.15.4.tgz", - "integrity": "sha512-pC0MS6UBuv/YiVAxtzi7CgUed8oCQNYMtGt0yb/I9fI/BWTiJK5cj4YtW2XtL95K5IuvPX/6uGWaouZ8KqXwdg==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.15.5.tgz", + "integrity": "sha512-4AYehLH39B9a8UXCMf3ieOK+G61wGMP72ikx6/XSMA0DUnvx0PgaeaT2Wyt06kTrDTy8edewKnbrbeqwaM50TQ==", "requires": { "deep-assign": "^3.0.0" } diff --git a/package.json b/package.json index 4bcb3c147..15db5db5f 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ }, "dependencies": { "@babel/preset-env": "7.12.1", - "@react-native-async-storage/async-storage": "1.15.4", + "@react-native-async-storage/async-storage": "1.15.5", "@react-native-clipboard/clipboard": "1.7.0", "@react-native-community/blur": "3.6.0", "@react-native-community/masked-view": "0.1.11", From 3813cddbe4744c5773ca47d85203bf146913945a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Tue, 22 Jun 2021 12:27:18 -0400 Subject: [PATCH 153/327] Update Podfile.lock --- ios/Podfile.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b238073b7..e01603af9 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -354,7 +354,7 @@ PODS: - React - RemobileReactNativeQrcodeLocalImage (1.0.4): - React - - RNCAsyncStorage (1.15.4): + - RNCAsyncStorage (1.15.5): - React-Core - RNCClipboard (1.7.0): - React-Core @@ -384,7 +384,7 @@ PODS: - React-Core - RNReactNativeHapticFeedback (1.11.0): - React-Core - - RNReanimated (2.1.0): + - RNReanimated (2.2.0): - DoubleConversion - FBLazyVector - FBReactNativeSpec @@ -420,7 +420,7 @@ PODS: - RNSentry (2.5.1): - React-Core - Sentry (= 7.0.0) - - RNShare (6.1.0): + - RNShare (6.2.0): - React-Core - RNSVG (12.1.1): - React @@ -753,7 +753,7 @@ SPEC CHECKSUMS: ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b RealmJS: 8a51eff2b9eaabf78b53a6819da6da6edde27467 RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa - RNCAsyncStorage: b17c417b356114699a486715adfa5829a5d6d8b9 + RNCAsyncStorage: 8324611026e8dc3706f829953aa6e3899f581589 RNCClipboard: dac13db8b1ce9b998f1cbc7ca33440113602847f RNCMaskedView: f127cd9652acfa31b91dcff613e07ba18b774db6 RNCPushNotificationIOS: 5b1cf9ad2aaa107ecb92d5d2d7005ba521b2b97a @@ -768,11 +768,11 @@ SPEC CHECKSUMS: RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93 RNRate: e0af7e724e5fcf89578dbd22ab6395c85402ef29 RNReactNativeHapticFeedback: 653a8c126a0f5e88ce15ffe280b3ff37e1fbb285 - RNReanimated: 70f662b5232dd5d19ccff581e919a54ea73df51c + RNReanimated: d9da990fc90123f4ffbfdda93d00fc15174863a8 RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 RNSentry: f109c8729739aa29f182c7d995bbcbccad373f31 - RNShare: c93ee0df653c76d913554272d56f6ffd8bdcb3cc + RNShare: 32ded9b8603fddf8f8eed42014e7ea7a4b0b8bf0 RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 RNWatch: e4c5d19506c94506860032fb68aedd5991beb985 From 475daa71d0241f41a58b08651d671331ad6748b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Tue, 22 Jun 2021 16:47:00 -0400 Subject: [PATCH 154/327] OPS: Package fixes --- ios/Podfile.lock | 20 +++---- package-lock.json | 138 +++++++++++++++++++++++----------------------- package.json | 8 +-- 3 files changed, 83 insertions(+), 83 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b238073b7..4efe4ea12 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -354,9 +354,9 @@ PODS: - React - RemobileReactNativeQrcodeLocalImage (1.0.4): - React - - RNCAsyncStorage (1.15.4): + - RNCAsyncStorage (1.15.5): - React-Core - - RNCClipboard (1.7.0): + - RNCClipboard (1.8.2): - React-Core - RNCMaskedView (0.1.11): - React @@ -384,7 +384,7 @@ PODS: - React-Core - RNReactNativeHapticFeedback (1.11.0): - React-Core - - RNReanimated (2.1.0): + - RNReanimated (2.2.0): - DoubleConversion - FBLazyVector - FBReactNativeSpec @@ -417,10 +417,10 @@ PODS: - React-Core - RNSecureKeyStore (1.0.0): - React - - RNSentry (2.5.1): + - RNSentry (2.5.2): - React-Core - Sentry (= 7.0.0) - - RNShare (6.1.0): + - RNShare (6.2.0): - React-Core - RNSVG (12.1.1): - React @@ -753,8 +753,8 @@ SPEC CHECKSUMS: ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b RealmJS: 8a51eff2b9eaabf78b53a6819da6da6edde27467 RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa - RNCAsyncStorage: b17c417b356114699a486715adfa5829a5d6d8b9 - RNCClipboard: dac13db8b1ce9b998f1cbc7ca33440113602847f + RNCAsyncStorage: 8324611026e8dc3706f829953aa6e3899f581589 + RNCClipboard: 879d10980df1c0a241d4d52aa15f14fae7af5f2c RNCMaskedView: f127cd9652acfa31b91dcff613e07ba18b774db6 RNCPushNotificationIOS: 5b1cf9ad2aaa107ecb92d5d2d7005ba521b2b97a RNDefaultPreference: 21816c0a6f61a2829ccc0cef034392e9b509ee5f @@ -768,11 +768,11 @@ SPEC CHECKSUMS: RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93 RNRate: e0af7e724e5fcf89578dbd22ab6395c85402ef29 RNReactNativeHapticFeedback: 653a8c126a0f5e88ce15ffe280b3ff37e1fbb285 - RNReanimated: 70f662b5232dd5d19ccff581e919a54ea73df51c + RNReanimated: d9da990fc90123f4ffbfdda93d00fc15174863a8 RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 - RNSentry: f109c8729739aa29f182c7d995bbcbccad373f31 - RNShare: c93ee0df653c76d913554272d56f6ffd8bdcb3cc + RNSentry: bfa1e2776c7413570e790cbbf79d2060dd0a565b + RNShare: 32ded9b8603fddf8f8eed42014e7ea7a4b0b8bf0 RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 RNWatch: e4c5d19506c94506860032fb68aedd5991beb985 diff --git a/package-lock.json b/package-lock.json index 3b180d469..9c9050493 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1070,9 +1070,9 @@ } }, "@babel/runtime": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", - "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -3027,9 +3027,9 @@ } }, "@react-native-clipboard/clipboard": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.7.0.tgz", - "integrity": "sha512-i5dJgR+wM8Om+hFEB/PqNb65/x5WxpaZG+UjEBX2/gmmIrmAWI72tI9rVL1gjPA9RWNpdpzvp+ioGjpdl7MyWQ==" + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.8.2.tgz", + "integrity": "sha512-IMUBqkwS6HyyHX1Dcu/yNqSYsgmI6UGilcUhD+qbH7tVQP8mX3k7hugr5K5IPzpGKaC1VSq4Lt7avy0jomHhLg==" }, "@react-native-community/blur": { "version": "3.6.0", @@ -3505,13 +3505,13 @@ "from": "git+https://github.com/BlueWallet/react-native-qrcode-local-image.git" }, "@sentry/browser": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.5.1.tgz", - "integrity": "sha512-iVLCdEFwsoWAzE/hNknexPQjjDpMQV7mmaq9Z1P63bD6MfhwVTx4hG4pHn8HEvC38VvCVf1wv0v/LxtoODAYXg==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.7.1.tgz", + "integrity": "sha512-R5PYx4TTvifcU790XkK6JVGwavKaXwycDU0MaAwfc4Vf7BLm5KCNJCsDySu1RPAap/017MVYf54p6dWvKiRviA==", "requires": { - "@sentry/core": "6.5.1", - "@sentry/types": "6.5.1", - "@sentry/utils": "6.5.1", + "@sentry/core": "6.7.1", + "@sentry/types": "6.7.1", + "@sentry/utils": "6.7.1", "tslib": "^1.9.3" } }, @@ -3529,100 +3529,100 @@ } }, "@sentry/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.5.1.tgz", - "integrity": "sha512-Mh3sl/iUOT1myHmM6RlDy2ARzkUClx/g4DAt1rJ/IpQBOlDYQraplXSIW80i/hzRgQDfwhwgf4wUa5DicKBjKw==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.7.1.tgz", + "integrity": "sha512-VAv8OR/7INn2JfiLcuop4hfDcyC7mfL9fdPndQEhlacjmw8gRrgXjR7qyhnCTgzFLkHI7V5bcdIzA83TRPYQpA==", "requires": { - "@sentry/hub": "6.5.1", - "@sentry/minimal": "6.5.1", - "@sentry/types": "6.5.1", - "@sentry/utils": "6.5.1", + "@sentry/hub": "6.7.1", + "@sentry/minimal": "6.7.1", + "@sentry/types": "6.7.1", + "@sentry/utils": "6.7.1", "tslib": "^1.9.3" } }, "@sentry/hub": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.5.1.tgz", - "integrity": "sha512-lBRMBVMYP8B4PfRiM70murbtJAXiIAao/asDEMIRNGMP6pI2ArqXfJCBYDkStukhikYD0Kqb4trXq+JYF07Hbg==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.7.1.tgz", + "integrity": "sha512-eVCTWvvcp6xa0A5GGNHMQEWslmKPlisE5rGmsV/kjvSUv3zSrI0eIDfb51ikdnCiBjHpK2NBWP8Vy8cZOEJegg==", "requires": { - "@sentry/types": "6.5.1", - "@sentry/utils": "6.5.1", + "@sentry/types": "6.7.1", + "@sentry/utils": "6.7.1", "tslib": "^1.9.3" } }, "@sentry/integrations": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.5.1.tgz", - "integrity": "sha512-NYiW0rH7fwv7aRtrRnfCSIiwulfV2NoLjhmghCONsyo10DNtYmOpogLotCytZFWLDnTJW1+pmTomq8UW/OSTcQ==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.7.1.tgz", + "integrity": "sha512-nWxAPTunZxE+E6bi4FyhKHXcUUVpbSpvtwvdHiw/K72p7FuX/K0qU002Ltdfs4U1nyMIjesE776IGMrBLU67uA==", "requires": { - "@sentry/types": "6.5.1", - "@sentry/utils": "6.5.1", + "@sentry/types": "6.7.1", + "@sentry/utils": "6.7.1", "localforage": "^1.8.1", "tslib": "^1.9.3" } }, "@sentry/minimal": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.5.1.tgz", - "integrity": "sha512-q9Do/oreu1RP695CXCLowVDuQyk7ilE6FGdz2QLpTXAfx8247qOwk6+zy9Kea/Djk93+BoSDVQUSneNiVwl0nQ==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.7.1.tgz", + "integrity": "sha512-HDDPEnQRD6hC0qaHdqqKDStcdE1KhkFh0RCtJNMCDn0zpav8Dj9AteF70x6kLSlliAJ/JFwi6AmQrLz+FxPexw==", "requires": { - "@sentry/hub": "6.5.1", - "@sentry/types": "6.5.1", + "@sentry/hub": "6.7.1", + "@sentry/types": "6.7.1", "tslib": "^1.9.3" } }, "@sentry/react": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-6.5.1.tgz", - "integrity": "sha512-YeGi7FzInhMZQxiy5fKqb7kS6W+u4NfsjzsVV3bLjJ1kiVtbpzZ2gs+ObHqW3zVE622V4nL7A4P8/CBHbcm5PA==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-6.7.1.tgz", + "integrity": "sha512-kLswcfwkq+Pv4ZAQ0Tq1X3PUx0t/glD3kRRSQ0ZGn4zdQWhkTkIaVeSrxfU+K9nwZisVEAVXtMJadk4X2KNySA==", "requires": { - "@sentry/browser": "6.5.1", - "@sentry/minimal": "6.5.1", - "@sentry/types": "6.5.1", - "@sentry/utils": "6.5.1", + "@sentry/browser": "6.7.1", + "@sentry/minimal": "6.7.1", + "@sentry/types": "6.7.1", + "@sentry/utils": "6.7.1", "hoist-non-react-statics": "^3.3.2", "tslib": "^1.9.3" } }, "@sentry/react-native": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@sentry/react-native/-/react-native-2.5.1.tgz", - "integrity": "sha512-Utf/Cq98J+jk2YQ4mO+EWLfa5vyWA62tvV46Yw7dtpZlhpf7Ip3xN+OxnMdDf8H9tWWAerp/v6bcncKAnvcMQA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@sentry/react-native/-/react-native-2.5.2.tgz", + "integrity": "sha512-AwcDZ+1SQ1EBFwnlYFGwSF/T3KrV1kdir3H9XOtR8WrxaItbwlkqwwP7D1EBMHu02WmuOgJ2a8aJlrhqEJ2pYA==", "requires": { - "@sentry/browser": "6.5.1", - "@sentry/core": "6.5.1", - "@sentry/hub": "6.5.1", - "@sentry/integrations": "6.5.1", - "@sentry/react": "6.5.1", - "@sentry/tracing": "6.5.1", - "@sentry/types": "6.5.1", - "@sentry/utils": "6.5.1", + "@sentry/browser": "6.7.1", + "@sentry/core": "6.7.1", + "@sentry/hub": "6.7.1", + "@sentry/integrations": "6.7.1", + "@sentry/react": "6.7.1", + "@sentry/tracing": "6.7.1", + "@sentry/types": "6.7.1", + "@sentry/utils": "6.7.1", "@sentry/wizard": "^1.2.2" } }, "@sentry/tracing": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.5.1.tgz", - "integrity": "sha512-y1W/xFC2hAuKqSuuaovkElHY4pbli3XoXrreesg8PtO7ilX6ZbatOQbHsEsHQyoUv0F6aVA+MABOxWH2jt7tfw==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.7.1.tgz", + "integrity": "sha512-wyS3nWNl5mzaC1qZ2AIp1hjXnfO9EERjMIJjCihs2LWBz1r3efxrHxJHs8wXlNWvrT3KLhq/7vvF5CdU82uPeQ==", "requires": { - "@sentry/hub": "6.5.1", - "@sentry/minimal": "6.5.1", - "@sentry/types": "6.5.1", - "@sentry/utils": "6.5.1", + "@sentry/hub": "6.7.1", + "@sentry/minimal": "6.7.1", + "@sentry/types": "6.7.1", + "@sentry/utils": "6.7.1", "tslib": "^1.9.3" } }, "@sentry/types": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.5.1.tgz", - "integrity": "sha512-b/7a6CMoytaeFPx4IBjfxPw3nPvsQh7ui1C8Vw0LxNNDgBwVhPLzUOWeLWbo5YZCVbGEMIWwtCUQYWxneceZSA==" + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.7.1.tgz", + "integrity": "sha512-9AO7HKoip2MBMNQJEd6+AKtjj2+q9Ze4ooWUdEvdOVSt5drg7BGpK221/p9JEOyJAZwEPEXdcMd3VAIMiOb4MA==" }, "@sentry/utils": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.5.1.tgz", - "integrity": "sha512-Wv86JYGQH+ZJ5XGFQX7h6ijl32667ikenoL9EyXMn8UoOYX/MLwZoQZin1P60wmKkYR9ifTNVmpaI9OoTaH+UQ==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.7.1.tgz", + "integrity": "sha512-Tq2otdbWlHAkctD+EWTYKkEx6BL1Qn3Z/imkO06/PvzpWvVhJWQ5qHAzz5XnwwqNHyV03KVzYB6znq1Bea9HuA==", "requires": { - "@sentry/types": "6.5.1", + "@sentry/types": "6.7.1", "tslib": "^1.9.3" } }, @@ -20607,9 +20607,9 @@ } }, "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, "yargs-unparser": { "version": "2.0.0", diff --git a/package.json b/package.json index 72936bcc6..7222d95c9 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "devDependencies": { "@babel/core": "^7.10.4", - "@babel/runtime": "^7.10.4", + "@babel/runtime": "^7.14.6", "@jest/reporters": "^26.4.1", "@react-native-community/eslint-config": "^2.0.0", "babel-cli": "^6.26.0", @@ -77,7 +77,7 @@ "dependencies": { "@babel/preset-env": "7.12.1", "@react-native-async-storage/async-storage": "1.15.5", - "@react-native-clipboard/clipboard": "1.7.0", + "@react-native-clipboard/clipboard": "1.8.2", "@react-native-community/blur": "3.6.0", "@react-native-community/masked-view": "0.1.11", "@react-native-community/push-notification-ios": "1.8.0", @@ -85,7 +85,7 @@ "@react-navigation/native": "5.9.4", "@react-navigation/stack": "5.14.5", "@remobile/react-native-qrcode-local-image": "https://github.com/BlueWallet/react-native-qrcode-local-image", - "@sentry/react-native": "2.5.1", + "@sentry/react-native": "2.5.2", "aez": "1.0.1", "amplitude-js": "7.4.4", "assert": "2.0.0", @@ -104,8 +104,8 @@ "buffer-reverse": "1.0.1", "coinselect": "3.1.12", "crypto-js": "4.0.0", - "detox": "18.15.0", "dayjs": "1.10.5", + "detox": "18.15.0", "ecurve": "1.0.6", "electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4", "electrum-mnemonic": "2.0.0", From 68253a7a361f07f9fa6000d613926cdf98831aa3 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Tue, 22 Jun 2021 22:05:49 +0100 Subject: [PATCH 155/327] OPS: filestorage --- appcenter-post-build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appcenter-post-build.sh b/appcenter-post-build.sh index c0ed0fd7b..a5f3b84aa 100755 --- a/appcenter-post-build.sh +++ b/appcenter-post-build.sh @@ -22,9 +22,9 @@ if [ -f $FILENAME ]; then HASH=`date +%s` FILENAME_UNIQ="$APPCENTER_OUTPUT_DIRECTORY/$BRANCH-$HASH.apk" cp "$FILENAME" "$FILENAME_UNIQ" - curl "http://filestorage.bluewallet.io:1488/$FILESTORAGE" -F "fileToUpload=@$FILENAME_UNIQ" + curl "http://206.189.62.190:1488/$FILESTORAGE" -F "fileToUpload=@$FILENAME_UNIQ" rm "$FILENAME_UNIQ" - DLOAD_APK="http://filestorage.bluewallet.io:1488/$BRANCH-$HASH.apk" + DLOAD_APK="http://206.189.62.190:1488/$BRANCH-$HASH.apk" curl -X POST --data "{\"body\":\"♫ This was a triumph. I'm making a note here: HUGE SUCCESS ♫\n\n [android in browser] $APPURL\n\n[download apk]($DLOAD_APK) \"}" -u "$GITHUB" "https://api.github.com/repos/BlueWallet/BlueWallet/issues/$PR/comments" fi From 9c67d17dc8c04170f6c1650a1dbf16a8345ebba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 23 Jun 2021 12:22:13 -0400 Subject: [PATCH 156/327] OPS: Test fails on newer clipboard. Downgrade. --- .../BlueWalletWatch (Notification).xcscheme | 25 +++++-------------- .../xcschemes/BlueWalletWatch.xcscheme | 25 +++++-------------- ios/Podfile.lock | 4 +-- package-lock.json | 6 ++--- package.json | 2 +- 5 files changed, 18 insertions(+), 44 deletions(-) diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme index 78505ec4c..ce67c26c8 100644 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme +++ b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme @@ -65,10 +65,8 @@ allowLocationSimulation = "YES" launchAutomaticallySubstyle = "8" notificationPayloadFile = "BlueWalletWatch Extension/PushNotificationPayload.apns"> - + - + - + - - - - - + diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme index 876b91430..772e95fd0 100644 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme +++ b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme @@ -64,10 +64,8 @@ debugServiceExtension = "internal" allowLocationSimulation = "YES" notificationPayloadFile = "BlueWalletWatch Extension/PushNotificationPayload.apns"> - + - + - + - - - - - + diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 4efe4ea12..04871a6fe 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -356,7 +356,7 @@ PODS: - React - RNCAsyncStorage (1.15.5): - React-Core - - RNCClipboard (1.8.2): + - RNCClipboard (1.7.0): - React-Core - RNCMaskedView (0.1.11): - React @@ -754,7 +754,7 @@ SPEC CHECKSUMS: RealmJS: 8a51eff2b9eaabf78b53a6819da6da6edde27467 RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa RNCAsyncStorage: 8324611026e8dc3706f829953aa6e3899f581589 - RNCClipboard: 879d10980df1c0a241d4d52aa15f14fae7af5f2c + RNCClipboard: dac13db8b1ce9b998f1cbc7ca33440113602847f RNCMaskedView: f127cd9652acfa31b91dcff613e07ba18b774db6 RNCPushNotificationIOS: 5b1cf9ad2aaa107ecb92d5d2d7005ba521b2b97a RNDefaultPreference: 21816c0a6f61a2829ccc0cef034392e9b509ee5f diff --git a/package-lock.json b/package-lock.json index 9c9050493..d64b7524d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3027,9 +3027,9 @@ } }, "@react-native-clipboard/clipboard": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.8.2.tgz", - "integrity": "sha512-IMUBqkwS6HyyHX1Dcu/yNqSYsgmI6UGilcUhD+qbH7tVQP8mX3k7hugr5K5IPzpGKaC1VSq4Lt7avy0jomHhLg==" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.7.0.tgz", + "integrity": "sha512-i5dJgR+wM8Om+hFEB/PqNb65/x5WxpaZG+UjEBX2/gmmIrmAWI72tI9rVL1gjPA9RWNpdpzvp+ioGjpdl7MyWQ==" }, "@react-native-community/blur": { "version": "3.6.0", diff --git a/package.json b/package.json index 7222d95c9..36eba504f 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "dependencies": { "@babel/preset-env": "7.12.1", "@react-native-async-storage/async-storage": "1.15.5", - "@react-native-clipboard/clipboard": "1.8.2", + "@react-native-clipboard/clipboard": "1.7.0", "@react-native-community/blur": "3.6.0", "@react-native-community/masked-view": "0.1.11", "@react-native-community/push-notification-ios": "1.8.0", From 06905ee0a486f3dd98e060ae827e289e2332e5e6 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 24 Jun 2021 02:53:29 +0000 Subject: [PATCH 157/327] fix: upgrade react-native-camera from 3.43.9 to 3.44.0 Snyk has created this PR to upgrade react-native-camera from 3.43.9 to 3.44.0. See this package in npm: https://www.npmjs.com/package/react-native-camera See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 799651448..62a72a555 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17433,9 +17433,9 @@ "from": "git+https://github.com/BlueWallet/react-native-blue-crypto.git" }, "react-native-camera": { - "version": "3.43.9", - "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.43.9.tgz", - "integrity": "sha512-HTXxkGdNa9G0ErVXBoqsf1lYorBXjXfVZbDeHUBVxQrOqL8CV3eJTuaY5kHH41Y7woJ8yISmklZeUwpZrskEgw==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.44.0.tgz", + "integrity": "sha512-gAFtqWcNl/4N85V9RPFPuo32/OTaPvrLzhzXiFoK6eR8Ms2uvOZ/wRjj5gM1WqNoKilmAaULgypbplok1s53yA==", "requires": { "prop-types": "^15.6.2" } diff --git a/package.json b/package.json index b3fdb26fb..3eefdfa47 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "react-localization": "1.0.17", "react-native": "0.63.4", "react-native-blue-crypto": "https://github.com/BlueWallet/react-native-blue-crypto", - "react-native-camera": "3.43.9", + "react-native-camera": "3.44.0", "react-native-crypto": "2.2.0", "react-native-default-preference": "1.4.3", "react-native-device-info": "8.1.3", From 71da52165790976411767651346cc92b5bb9c237 Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Wed, 23 Jun 2021 20:49:45 -0700 Subject: [PATCH 158/327] ADD: sync ar, ca, de, es, es_419, id, nl --- loc/ar.json | 20 ++++----- loc/ca.json | 17 ++++---- loc/de_de.json | 8 ++-- loc/es.json | 32 +++++++-------- loc/es_419.json | 38 ++++++++--------- loc/he.json | 107 +++++++++++++++++++++++++++++------------------- loc/id_id.json | 13 +++--- loc/nl_nl.json | 13 ++---- 8 files changed, 136 insertions(+), 112 deletions(-) diff --git a/loc/ar.json b/loc/ar.json index d6ee6c632..6a7aabb1b 100644 --- a/loc/ar.json +++ b/loc/ar.json @@ -16,7 +16,7 @@ "seed": "عبارة الاسترداد", "success": "نجاح", "wallet_key": "مفتاح المحفظة", - "invalid_animated_qr_code_fragment" : "قطعة من رمز الـ QRcode المتحرك غير صحيحة، حاول مرة اخرى.", + "invalid_animated_qr_code_fragment": "قطعة من رمز الـ QRcode المتحرك غير صحيحة، حاول مرة اخرى.", "file_saved": "تم حفظ الملف ({filePath}) في مجلد التنزيلات.", "discard_changes": "تجاهل التغييرات؟", "discard_changes_detail": "يوجد تغييرات غير محفوظة. هل أنت متأكد من الخروج من الشاشة وتجاهلها؟" @@ -304,7 +304,7 @@ "network_electrum": "خادم Electrum", "not_a_valid_uri": "معرِّف URI غير صالح", "notifications": "الإشعارات", - "open_link_in_explorer" : "فتح الرابط في المتصفح", + "open_link_in_explorer": "فتح الرابط في المتصفح", "password": "كلمه المرور", "password_explain": "أنشئ كلمة المرور التي ستستخدمها لفك تشفير وحدة التخزين", "passwords_do_not_match": "كلمتا المرور لا تتطابقان", @@ -323,7 +323,7 @@ "selfTest": "اختبار ذاتي", "save": "الحفظ", "saved": "تم الحفظ", - "success_transaction_broadcasted" : "تمت بنجاح! لقد تم نشر معاملتك!", + "success_transaction_broadcasted": "تمت بنجاح! لقد تم نشر معاملتك!", "total_balance": "الرصيد الاجمالي", "total_balance_explanation": "اعرض الرصيد الإجمالي لجميع محافظك على ويدجيت الشاشة الرئيسية الخاصة بك.", "widgets": "ويدجيت", @@ -345,27 +345,27 @@ "cpfp_create": "الإنشاء", "cpfp_exp": "سننشئ معاملة أخرى تستبدل معاملتك غير المؤكدة. وسيكون إجمالي الرسوم أعلى من رسوم المعاملة الأصلية؛ حتى يجري تعدينها بشكلٍ أسرع. وهذا ما يُسمَّى CPFP؛ أي دعم المعاملة الرئيسية بمعاملة فرعية.", "cpfp_no_bump": "هذه المعاملة غير قابلة للتسريع", - "cpfp_title": "رسوم التسريع (CPFP)", + "cpfp_title": "تسريع المعاملة (CPFP)", "details_balance_hide": "إخفاء الرصيد", "details_balance_show": "عرض الرصيد", "details_block": "ارتفاع الكتلة", "details_copy": "النسخ", - "details_from": "المدخل", + "details_from": "من", "details_inputs": "المدخلات", "details_outputs": "المخرجات", - "details_received": "المستلمة", + "details_received": "التاريخ", "transaction_note_saved": "تم حفظ مذكرة المعاملة بنجاح.", "details_show_in_block_explorer": "العرض في مستكشف الكتل", "details_title": "المعاملة", - "details_to": "المخرج", + "details_to": "إلى", "details_transaction_details": "تفاصيل المعاملة", "enable_offline_signing": "هذه المحفظة لا يتم استعمالها مع التوقيع دون اتصال. هل ترغب في تمكينه الآن؟", "list_conf": "تأكيد: {number}", "pending": "قيد الانتظار", "list_title": "المعاملات", - "rbf_explain": "سنستبدل هذه المعاملة بالمعاملة ذات الرسوم الأعلى؛ حتى يجري تعدينها بشكلٍ أسرع. وهذا ما يُسمَّى RBF؛ أي الاستبدال بالرسوم.", - "rbf_title": "رسوم التسريع (RBF)", - "status_bump": "رسوم التسريع", + "rbf_explain": "سنستبدل هذه المعاملة بمعاملة جديدة تدفع رسوم اعلى؛ حتى يجري تعدينها بشكلٍ أسرع. وهذا ما يُسمَّى RBF؛ أي الاستبدال بالرسوم.", + "rbf_title": "تسريع المعاملة (RBF)", + "status_bump": "تسريع المعاملة", "status_cancel": "إلغاء المعاملة", "transactions_count": "عدد المعاملات", "txid": "معرف المعاملة", diff --git a/loc/ca.json b/loc/ca.json index d49231e6f..64f4b9824 100644 --- a/loc/ca.json +++ b/loc/ca.json @@ -130,12 +130,10 @@ "ask": "Heu desat la frase de recuperació del vostre moneder? Aquesta frase de recuperació és necessària per accedir als vostres fons en cas que perdeu aquest dispositiu. Sense la frase de recuperació, els vostres fons es perdran permanentment.", "ask_no": "No, no en tinc", "ask_yes": "Si, en tinc", - "ok": "OK, ja he assegurat una còpia en paper!", "ok_lnd": "D'acord, l'he guardat", - "text": "Si us plau, preneu-vos un moment per escriure aquesta frase mnemotècnica en un tros de paper. És la vostra còpia de seguretat que podeu utilitzar per restaurar el moneder en un altre dispositiu.", "text_lnd": "Si us plau, deseu aquesta còpia de seguretat del moneder. Permet restaurar el moneder en cas de pèrdua.", "text_lnd2": "Aquest moneder està allotjat a BlueWallet.", - "title": "El teu moneder ha estat creat..." + "title": "El teu moneder ha estat creat" }, "receive": { "details_create": "Crear", @@ -169,7 +167,6 @@ "details_address_field_is_not_valid": "Adreça invalida", "details_adv_fee_bump": "Permeteu ampliar la comissió", "details_adv_full": "Utilitzeu tot el saldo", - "details_adv_full_remove": "Els altres destinataris s'eliminaran d'aquesta transacció.", "details_adv_full_sure": "Esteu segur que voleu utilitzar el saldo complet del moneder per a aquesta transacció?", "details_adv_import": "Importar transacció", "details_amount_field_is_not_valid": "Quantitat invalida", @@ -182,7 +179,6 @@ "details_total_exceeds_balance": "La quantitat excedeix el balanç disponible.", "details_unrecognized_file_format": "Format de fitxer no reconegut", "details_wallet_before_tx": "Abans de crear una transacció, primer heu d’afegir un moneder Bitcoin.", - "details_wallet_selection": "Seleccionar moneder", "dynamic_init": "Inicialitzant", "dynamic_next": "Següent", "dynamic_prev": "Anterior", @@ -236,6 +232,7 @@ "electrum_connected_not": "No conectat", "electrum_port": "TCP port, generalment {example}", "electrum_port_ssl": "SSL port, generalment {example}", + "electrum_settings_server": "Servidor Electrum", "electrum_settings_explain": "Deixa-ho buit per usar el valor per defecte", "electrum_status": "estat", "electrum_clear_alert_title": "Netejar l'historial?", @@ -252,6 +249,7 @@ "language": "Idioma", "lightning_error_lndhub_uri": "LNDHub URI no vàlid", "lightning_settings": "Configuració Lightning", + "tor_settings": "Configuració de Tor", "lightning_settings_explain": "Per connectar-te al teu propi node LND node instala LndHub i posa la seva URL aquí. Deixa el camp buit per utilitzar el LndHub per defecte \n (lndhub.io)", "network": "Xarxa", "network_electrum": "Servidor Electrum", @@ -264,17 +262,21 @@ "plausible_deniability": "Negació plausible...", "privacy": "Privacitat", "privacy_read_clipboard": "Llegir el portapapers", + "privacy_system_settings": "Configuració del Sistema", "retype_password": "Introdueix de nou la contrasenya contrasenya", "save": "guardar", - "saved": "Desat" + "saved": "Desat", + "tools": "Eines" }, "notifications": { + "no_and_dont_ask": "No, i no m'ho tornis a preguntar", "ask_me_later": "Pregunta'm després" }, "transactions": { "cancel_title": "Cancel·lar aquesta transacció (RBF)", "confirmations_lowercase": "{confirmations} confirmacions", "note": "Nota", + "block_explorer_link": "Enllaç a l' explorador de blocs", "cpfp_create": "Crear", "details_balance_hide": "Amaga el saldo", "details_balance_show": "Mostra el saldo", @@ -292,7 +294,8 @@ "list_conf": "Conf: {number}", "pending": "Pendent", "list_title": "transaccions", - "status_cancel": "Cancel·lar la Transacció" + "status_cancel": "Cancel·lar la Transacció", + "updating": "Actualitzant..." }, "wallets": { "add_bitcoin": "Bitcoin", diff --git a/loc/de_de.json b/loc/de_de.json index ca4d82134..5111ad617 100644 --- a/loc/de_de.json +++ b/loc/de_de.json @@ -16,7 +16,7 @@ "seed": "Seed", "success": "Erfolg", "wallet_key": "Wallet Schlüssel", - "invalid_animated_qr_code_fragment" : "Ungültig animiertes QR-Code-Fragment. Bitte erneut versuchen.", + "invalid_animated_qr_code_fragment": "Ungültig animiertes QR-Code-Fragment. Bitte erneut versuchen.", "file_saved": "Die Datei ({filePath}) wurde in deinen Downloadfolder gespeichert.", "discard_changes": "Änderungen verwerfen?", "discard_changes_detail": "Die nicht gespeicherten Änderungen verwerfen und den Bildschirm verlassen?" @@ -173,7 +173,7 @@ "details_add_rec_rem": "Empfänger entfernen", "details_address": "Adresse", "details_address_field_is_not_valid": "Adresseingabe ist nicht korrekt", - "details_adv_fee_bump": "TRX-Gebührenerhöhung nach Senden ermöglichen", + "details_adv_fee_bump": "Erhöhung TRX-Gebühr nach Senden erlauben", "details_adv_full": "Gesamtes Guthaben senden", "details_adv_full_sure": "Bist Du sicher, dass Du das gesamte Guthaben für diese Transaktion verwenden willst?", "details_adv_import": "Transaktion importieren", @@ -304,7 +304,7 @@ "network_electrum": "Electrum Server", "not_a_valid_uri": "Keine gültige URL", "notifications": "Benachrichtigungen", - "open_link_in_explorer" : "Link in Explorer öffnen", + "open_link_in_explorer": "Link in Explorer öffnen", "password": "Passwort", "password_explain": "Erstelle das Passwort zum Entschlüsseln des Speichers", "passwords_do_not_match": "Passwörter stimmen nicht überein", @@ -323,7 +323,7 @@ "selfTest": "Selbsttest", "save": "Speichern", "saved": "Gespeichert", - "success_transaction_broadcasted" : "Erfolg! Diene Transaktion wurde übertragen.", + "success_transaction_broadcasted": "Erfolg! Diene Transaktion wurde übertragen.", "total_balance": "Gesamtes Guthaben", "total_balance_explanation": "Zeigt das Wallet Guthaben auf dem Widget deiner Homepage", "widgets": "Widgets", diff --git a/loc/es.json b/loc/es.json index 2326911f8..11d370ac6 100644 --- a/loc/es.json +++ b/loc/es.json @@ -16,7 +16,7 @@ "seed": "Semilla", "success": "Completado", "wallet_key": "Llave de la cartera", - "invalid_animated_qr_code_fragment" : "Fragmento de código QR inválido. Por favor inténtalo de nuevo.", + "invalid_animated_qr_code_fragment": "Fragmento de código QR inválido. Por favor inténtalo de nuevo.", "file_saved": "El archivo ({filePath}) se ha guardado en su carpeta de Descargas.", "discard_changes": "¿Descartar cambios? ", "discard_changes_detail": "Tienes cambios sin guardar. ¿Estás seguro que quieres descartarlos y salir?" @@ -304,7 +304,7 @@ "network_electrum": "Servidor Electrum", "not_a_valid_uri": "URI no válida", "notifications": "Notificaciones", - "open_link_in_explorer" : "Abrir enlace en el navegador", + "open_link_in_explorer": "Abrir enlace en el navegador", "password": "Contraseña", "password_explain": "Crea la contraseña que usarás para descifrar el almacenamiento", "passwords_do_not_match": "Contraseñas deben ser iguales", @@ -323,7 +323,7 @@ "selfTest": "Self-Test", "save": "Guardar", "saved": "Guardado", - "success_transaction_broadcasted" : "¡Listo! ¡Tu transacción ha sido emitida!", + "success_transaction_broadcasted": "¡Listo! ¡Tu transacción ha sido emitida!", "total_balance": "Balance total", "total_balance_explanation": "Muestra el balance total de todas tus carteras en los widgets de tu pantalla principal.", "widgets": "Widgets", @@ -466,10 +466,10 @@ }, "multisig": { "multisig_vault": "Vault", - "default_label": "Bóveda multifirma", + "default_label": "Vault multifirma", "multisig_vault_explain": "La mejor seguridad para grandes cantidades", "provide_signature": "Proporcionar firma", - "vault_key": "Clave del Vault {number}", + "vault_key": "Clave de la Vault {number}", "required_keys_out_of_total": "Las llaves que se necesitarán del total de llaves creadas", "fee": "Tarifa: {number}", "fee_btc": "{number} BTC", @@ -494,9 +494,9 @@ "what_is_vault": "Un Vault es", "what_is_vault_numberOfWallets": " {m}-of-{n} multifirma ", "what_is_vault_wallet": "Cartera", - "vault_advanced_customize": "Configuración de la bóveda", + "vault_advanced_customize": "Configuración de la Vault", "needs": "Necesita", - "what_is_vault_description_number_of_vault_keys": " {m} llaves del Vault", + "what_is_vault_description_number_of_vault_keys": " {m} claves de la Vault", "what_is_vault_description_to_spend": "para gastar y una tercera \nque puedes usar como copia de seguridad.", "what_is_vault_description_to_spend_other": "para gastar.", "quorum": "{m} de {n} quórum", @@ -515,7 +515,7 @@ "i_wrote_it_down": "OK, ya la he anotado.", "type_your_mnemonics": "Introduce una semilla para importar la llave de tu Vault", "this_is_cosigners_xpub": "Este es el XPUB del co-firmante, listo para ser importado en otra cartera. Es seguro compartirla.", - "wallet_key_created": "La clave de tu bóveda ha sido creada. Tómate un momento para anotar la semilla mnemotécnica", + "wallet_key_created": "La clave de tu Vault ha sido creada. Tómate un momento para anotar la semilla mnemotécnica", "are_you_sure_seed_will_be_lost": "¿Estás seguro? Tu semilla mnemotécnica se perderá si no tienes una copia de seguridad", "forget_this_seed": "Olvida esta semilla y usa XPUB", "invalid_fingerprint": "La huella de esta semilla no encaja con la huella del co-firmante", @@ -527,18 +527,18 @@ "input_path": "Introduce la ruta de derivación", "input_path_explain": "Déjalo en blanco para usar el predeterminado ({default})", "ms_help": "Ayuda", - "ms_help_title": "Cómo funcionan las bóvedas Multisig. Consejos y trucos", + "ms_help_title": "Cómo funcionan la Vault multifirma: Consejos y trucos", "ms_help_text": "Una cartera con múltiples claves, para aumentar exponencialmente la seguridad o para custodia compartida.", "ms_help_title1": "Se recomienda usar multiples dispositivos.", - "ms_help_1": "La bóveda funcionará con otras aplicaciones de BlueWallet y carteras compatibles con PSBT como Electrum, Spectre, Coldcard, Cobo Vault, etc.", + "ms_help_1": "La Vault funcionará con otras aplicaciones de BlueWallet y carteras compatibles con PSBT como Electrum, Spectre, Coldcard, Cobo Vault, etc.", "ms_help_title2": "Editar claves", - "ms_help_2": "Puedes crear todas las claves de la bóveda en este dispositivo y eliminarlas o editarlas más tarde. Tener todas las claves en el mismo dispositivo tiene la seguridad equivalente a una cartera de Bitcoin convencional.", - "ms_help_title3": "Copias de seguridad de la bóveda", - "ms_help_3": "En las opciones de la cartera encontrarás la copia de seguridad de tu bóveda y una copia de seguridad watch-only (solo ver). Esta copia de seguridad es como un mapa que conduce hacia tu cartera. Es esencial para recuperar tu cartera si pierdes una de tus semillas.", - "ms_help_title4": "Importando bóvedas", - "ms_help_4": "Para importar una bóveda Multisig, selecciona la opción de importar y usa la copia de seguridad. Si solo tienes claves extendidas y semillas, puedes usar los campos de importación individuales durante el proceso de crear una bóveda.", + "ms_help_2": "Puedes crear todas las claves de la Vault en este dispositivo y eliminarlas o editarlas más tarde. Tener todas las claves en el mismo dispositivo tiene la seguridad equivalente a una cartera de Bitcoin convencional.", + "ms_help_title3": "Copias de seguridad de la Vault", + "ms_help_3": "En las opciones de la cartera encontrarás la copia de seguridad de tu Vault y una copia de seguridad watch-only (solo ver). Esta copia de seguridad es como un mapa que conduce hacia tu cartera. Es esencial para recuperar tu cartera si pierdes una de tus semillas.", + "ms_help_title4": "Importando Vaults", + "ms_help_4": "Para importar una Vault multifirma, selecciona la opción de importar y usa la copia de seguridad. Si solo tienes claves extendidas y semillas, puedes usar los campos de importación individuales durante el proceso de crear una Vault.", "ms_help_title5": "Opciones avanzadas", - "ms_help_5": "Por defecto, BlueWallet creara una bóveda 2-de-3. Para crear una con diferente quórum o para cambiar el tipo de dirección, activa las opciones avanzadas en Ajustes." + "ms_help_5": "Por defecto, BlueWallet creará una Vault 2-de-3. Para crear una con diferente quórum o para cambiar el tipo de dirección, activa las opciones avanzadas en Ajustes." }, "is_it_my_address": { "title": "¿Es esta mi dirección?", diff --git a/loc/es_419.json b/loc/es_419.json index 738b90bea..3c931d77e 100644 --- a/loc/es_419.json +++ b/loc/es_419.json @@ -7,7 +7,7 @@ "never": "Nunca", "of": "{number} de {total}", "ok": "OK", - "storage_is_encrypted": "Tu almacenamiento está cifrado. Se requiere contraseña para descifrarla.", + "storage_is_encrypted": "Tu almacenamiento está cifrado. Se requiere contraseña para descifrarlo.", "allow": "Permitir", "dont_allow": "No permitir", "yes": "Sí", @@ -16,7 +16,7 @@ "seed": "Semilla", "success": "Éxito", "wallet_key": "Clave de la billetera", - "invalid_animated_qr_code_fragment" : "Fragmento inválido de Código QR animado. Por favor intenta de nuevo", + "invalid_animated_qr_code_fragment": "Fragmento inválido de Código QR animado. Por favor intenta de nuevo.", "file_saved": "El archivo ({filePath}) se ha guardado en tu carpeta de Descargas.", "discard_changes": "¿Descartar cambios?", "discard_changes_detail": "Tienes cambios no guardados. ¿Estás seguro de descartarlos y salir de la pantalla?" @@ -42,7 +42,7 @@ }, "hodl": { "are_you_sure_you_want_to_logout": "¿Estás seguro de que quieres cerrar sesión en Hodl Hodl?", - "cont_address_escrow": "Custodia", + "cont_address_escrow": "Depósito", "cont_address_to": "Para", "cont_buying": "Comprando", "cont_cancel": "Cancelar contrato", @@ -54,12 +54,12 @@ "cont_paid": "Marcar contrato como pagado", "cont_paid_e": "Haz esto solo si enviaste fondos al vendedor a través del método de pago acordado", "cont_paid_q": "¿Estás seguro de que quieres marcar este contrato como pagado?", - "cont_selling": "En venta", + "cont_selling": "Venta", "cont_st_completed": "¡Todo listo!", - "cont_st_in_progress_buyer": "Las monedas están en custodia. Por favor paga al vendedor.", - "cont_st_paid_enought": "Los Bitcoins están en custodia. Paga al vendedor\na través del método de pago acordado.", - "cont_st_paid_waiting": "Esperando a que el vendedor libere las monedas en custodia", - "cont_st_waiting": "Esperando que el vendedor deposite Bitcoins en custodia", + "cont_st_in_progress_buyer": "Las monedas están en depósito. Por favor pagale al vendedor.", + "cont_st_paid_enought": "Los bitcoins están en depósito. Pagale al vendedor\na través del método de pago acordado.", + "cont_st_paid_waiting": "Esperando a que el vendedor libere las monedas en depósito en garantía", + "cont_st_waiting": "Esperando a que el vendedor deposite bitcoins en el depósito en garantía", "cont_title": "Mis contratos", "filter_any": "Algo", "filter_buying": "Comprando", @@ -71,7 +71,7 @@ "filter_iamselling": "Estoy vendiendo bitcoin", "filter_method": "Método de pago", "filter_search": "Buscar", - "filter_selling": "Vendiendo", + "filter_selling": "Venta", "item_minmax": "Mín/Máx", "item_nooffers": "No hay ofertas. Intenta cambiar \"Cerca de mí\" a \"Ofertas Globales.\"", "item_rating": "{rating} operaciones", @@ -104,8 +104,8 @@ "refill": "Recarga", "refill_card": "Recarga con tarjeta bancaria", "refill_create": "Para continuar, crea una billetera Bitcoin para recargar.", - "refill_external": "Recarga con Billetera Externa", - "refill_lnd_balance": "Recargar el saldo de la Billetera Lightning", + "refill_external": "Recarga con billetera externa", + "refill_lnd_balance": "Recargar el saldo de la billetera Lightning", "sameWalletAsInvoiceError": "No puedes pagar una factura con la misma billetera que usaste para crearla.", "title": "Manejar fondos" }, @@ -134,8 +134,8 @@ }, "pleasebackup": { "ask": "¿Has guardado la frase de respaldo de tu billetera? Esta frase de respaldo es necesaria para acceder a tus fondos en caso de que pierdas este dispositivo. Sin la frase de respaldo, tus fondos se perderán permanentemente.", - "ask_no": "No, no tengo", - "ask_yes": "Sí, tengo", + "ask_no": "No la tengo", + "ask_yes": "Sí, la tengo", "ok": "OK, lo escribí", "ok_lnd": "OK, lo he guardado", "text": "Tómate un momento para escribir esta frase mnemotécnica en una hoja de papel.\nEs tu copia de seguridad y puedes usarla para recuperar la billetera.", @@ -304,7 +304,7 @@ "network_electrum": "Servidor Electrum", "not_a_valid_uri": "URI inválida", "notifications": "Notificaciones", - "open_link_in_explorer" : "Abrir enlace en el explorador", + "open_link_in_explorer": "Abrir enlace en el explorador", "password": "Contraseña", "password_explain": "Crea la contraseña que usarás para desencriptar el almacenamiento", "passwords_do_not_match": "Las contraseñas no coinciden.", @@ -323,7 +323,7 @@ "selfTest": "Auto-Test", "save": "Guardar", "saved": "Guardado", - "success_transaction_broadcasted" : "¡Éxito! ¡Tu transacción ha sido transmitida!", + "success_transaction_broadcasted": "¡Éxito! ¡Tu transacción ha sido transmitida!", "total_balance": "Balance Total", "total_balance_explanation": "Muestra el saldo total de todas tus billeteras en los widgets de tu pantalla de inicio.", "widgets": "Widgets", @@ -421,7 +421,7 @@ "export_title": "Exportación de Billetera", "import_do_import": "Importar", "import_error": "No se pudo importar. Asegúrate de que los datos proporcionados sean válidos.", - "import_explanation": "Ingresa tus palabras iniciales, clave pública, WIF o cualquier cosa que tenga. BlueWallet hará todo lo posible para adivinar el formato correcto e importar tu billetera.", + "import_explanation": "Ingresa tus palabras iniciales, clave pública, WIF o cualquier cosa que tengas. BlueWallet hará todo lo posible para adivinar el formato correcto e importar tu billetera.", "import_file": "Importar Archivo", "import_imported": "Importado", "import_placeholder_fail": "Importación de Billetera", @@ -447,7 +447,7 @@ "list_marketplace": "Mercado", "list_tap_here_to_buy": "Comprar Bitcoin", "list_title": "Billeteras", - "list_tryagain": "Intentar nuevamente", + "list_tryagain": "Intenta otra vez", "no_ln_wallet_error": "Antes de pagar una factura Lightning, primero debes agregar una billetera Lightning.", "looks_like_bip38": "Esto parece una clave privada protegida por contraseña (BIP38).", "reorder_title": "Reorganizar Billeteras", @@ -511,7 +511,7 @@ "create_new_key": "Crear Nuevo", "scan_or_open_file": "Escanear o abrir archivo", "i_have_mnemonics": "Tengo una semilla para esta clave.", - "please_write_down_mnemonics": "Escribe esta frase mnemotécnica en un papel. No te preocupes, puedes escribirlo más tarde.", + "please_write_down_mnemonics": "Escribe esta frase mnemotécnica en un papel. No te preocupes, puedes escribirla más tarde.", "i_wrote_it_down": "OK, lo escribí.", "type_your_mnemonics": "Inserta una semilla para importar tu clave de la Bóveda existente.", "this_is_cosigners_xpub": "Este es el XPUB del cofirmante, listo para ser importado a otra billetera. Es seguro compartirlo.", @@ -571,7 +571,7 @@ "sign_sign": "Firmar", "sign_sign_submit": "Firma y envía", "sign_verify": "Verificar", - "sign_signature_correct": "¡Verificación Exitosa!", + "sign_signature_correct": "¡Verificación exitosa!", "sign_signature_incorrect": "¡Falló la Verificación!", "sign_placeholder_address": "Dirección", "sign_placeholder_message": "Mensaje", diff --git a/loc/he.json b/loc/he.json index ee48baafb..f66b2ffd5 100644 --- a/loc/he.json +++ b/loc/he.json @@ -14,6 +14,7 @@ "no": "לא", "save": "שמירה", "seed": "גרעין", + "success": "הצלחה", "wallet_key": "מפתח ארנק", "invalid_animated_qr_code_fragment": "קטע קוד QR מונפש לא תקין, אנא נסו שוב", "file_saved": "הקובץ ({filePath}) נשמר לתיקיית ההורדות שלך.", @@ -134,12 +135,12 @@ "ask": "האם שמרת את מילות הגיבוי שלך? מילות גיבוי אלה דרושות כדי לגשת לכספים שלך במקרה של אובדן מכשיר זה. ללא גיבוי זה, הכספים יאבדו לצמיתות.", "ask_no": "לא, לא גיביתי", "ask_yes": "כן, גיביתי", - "ok": "אוקיי, רשמתי את זה!", + "ok": "אוקיי, רשמתי את זה.", "ok_lnd": "אוקיי, שמרתי את זה.", - "text": "אנא קחו רגע כדי לכתוב על דף נייר את מילות הגיבוי האלו. זה הגיבוי איתו תוכלו לשחזר את הארנק על מכשיר אחר.", + "text": "אנא קחו רגע כדי לכתוב על דף נייר את מילות הגיבוי האלו. זה הגיבוי שלכם ואיתו תוכלו לשחזר את הארנק.", "text_lnd": "אנא קחו רגע כדי לשמור את אימות ה- LNDHub. זה הגיבוי איתו תוכלו לשחזר את הארנק על מכשיר אחר.", "text_lnd2": "ארנק זה מאוחסן על ידי BlueWallet.", - "title": "ארנקכם נוצר..." + "title": "ארנקך נוצר" }, "receive": { "details_create": "יצירה", @@ -151,7 +152,7 @@ "send": { "broadcastButton": "שדר", "broadcastError": "שגיאה", - "broadcastNone": "קלט גיבוב העברה", + "broadcastNone": "קלט גיבוב פעולה", "broadcastPending": "ממתין", "broadcastSuccess": "הצלחה", "confirm_header": "אישור", @@ -163,9 +164,9 @@ "create_fee": "עמלה", "create_memo": "תזכיר", "create_satoshi_per_byte": "סאטושי לבית", - "create_this_is_hex": "זוהי ההעברה שלך, חתומה ומוכנה לשידור לרשת.", + "create_this_is_hex": "זוהי הפעולה שלך, חתומה ומוכנה לשידור לרשת.", "create_to": "עבור", - "create_tx_size": "גודל ההעברה", + "create_tx_size": "גודל הפעולה", "create_verify": "אמתו ב- coinb.in", "details_add_rec_add": "הוספת נמען", "details_add_rec_rem": "הסרת נמען", @@ -173,20 +174,20 @@ "details_address_field_is_not_valid": "שדה כתובת לא תקין", "details_adv_fee_bump": "אפשר הקפצת עמלה", "details_adv_full": "שימוש בכל היתרה", - "details_adv_full_sure": "האם אתם בטוחים שתרצו להשתמש בכל יתרת הארנק בשביל העברה זאת?", - "details_adv_import": "יבוא העברה", + "details_adv_full_sure": "האם אתם בטוחים שתרצו להשתמש בכל יתרת הארנק בשביל פעולה זאת?", + "details_adv_import": "יבוא פעולה", "details_amount_field_is_not_valid": "שדה סכום אינו תקין", "details_amount_field_is_less_than_minimum_amount_sat": "הסכום המוגדר קטן מידי. אנא הכניסו סכום גדול מ- 500 sats.", "details_create": "יצירת קבלה", "details_error_decode": "לא ניתן לפענח כתובת ביטקוין", "details_fee_field_is_not_valid": "שדה עמלה אינו תקין", "details_next": "הבא", - "details_no_signed_tx": "הקובץ הנבחר אינו מכיל העברה שניתן לייבא.", + "details_no_signed_tx": "הקובץ הנבחר אינו מכיל פעולה שניתן לייבא.", "details_note_placeholder": "הערה לעצמך", "details_scan": "סריקה", "details_total_exceeds_balance": "הסכום לשליחה חורג מהיתרה הזמינה.", "details_unrecognized_file_format": "פורמט קובץ לא מזוהה", - "details_wallet_before_tx": "לפני יצירת העברה, עליך להוסיף ארנק ביטקוין.", + "details_wallet_before_tx": "לפני יצירת פעולה, עליך להוסיף ארנק ביטקוין.", "dynamic_init": "איתחול", "dynamic_next": "הבא", "dynamic_prev": "הקודם", @@ -208,22 +209,22 @@ "input_total": "סך הכל:", "permission_camera_message": "אנחנו צריכים את הרשאתך לשימוש במצלמה שלך.", "permission_camera_title": "הרשאה לשימוש במצלמה", - "psbt_sign": "חתימה על העברה", + "psbt_sign": "חתימה על פעולה", "open_settings": "פתח הגדרות", "permission_storage_later": "שאל אותי מאוחר יותר", "permission_storage_message": "ארנק BlueWallet צריך את הרשאתך לגשת לאחסון שלך כדי לשמור את קובץ זה.", "permission_storage_denied_message": "ארנק BlueWallet אינו יכול לשמור קובץ זה. אנא פתחו את הגדרות המכשיר שלכם ואפשרו הרשאת אחסון.", "permission_storage_title": "הרשאת גישת אחסון", "psbt_clipboard": "העתקה ללוח", - "psbt_this_is_psbt": "זוהי העברת ביטקוין חתומה חלקית (PSBT). אנא סיימו את תהליך החתימה בארנק החומרה שלכם.", + "psbt_this_is_psbt": "זוהי פעולת ביטקוין חתומה חלקית (PSBT). אנא סיימו את תהליך החתימה בארנק החומרה שלכם.", "psbt_tx_export": "יצא לקובץ", - "no_tx_signing_in_progress": "אין חתימת העברה בתהליך", - "psbt_tx_open": "פתחו העברה חתומה", - "psbt_tx_scan": "סרקו העברה חתומה", + "no_tx_signing_in_progress": "אין חתימת פעולה בתהליך", + "psbt_tx_open": "פתחו פעולה חתומה", + "psbt_tx_scan": "סרקו פעולה חתומה", "qr_error_no_qrcode": "התמונה אינה מכילה קוד QR.", "qr_error_no_wallet": "הקובץ הנבחר אינו מכיל ארנק שניתן לייבא.", "success_done": "בוצע", - "txSaved": "קובץ ההעברה ({filePath}) נשמר בספריית ההורדות שלך.", + "txSaved": "קובץ הפעולה ({filePath}) נשמר בספריית ההורדות שלך.", "problem_with_psbt": "בעיה עם PBST" }, "settings": { @@ -255,10 +256,13 @@ "electrum_connected": "מחובר", "electrum_connected_not": "לא מחובר", "electrum_error_connect": "לא ניתן להתחבר לשרת אלקטרום", + "electrum_host": "למשל {example}", + "electrum_port": "פתחת TCP, לרוב {example}", + "electrum_port_ssl": "פתחת SSL, לרוב {example}", "electrum_saved": "השינויים נשמרו בהצלחה. ייתכן ותדרש הפעלה מחדש כדי שהשינויים ייכנסו לתוקף.", "set_electrum_server_as_default": "הגדרת {server} כשרת אלקטרום ברירת מחדל?", "set_lndhub_as_default": "הגדרת {url} כשרת LNDHub ברירת מחדל?", - "electrum_settings_server": "הגדרות שרת אלקטרום", + "electrum_settings_server": "שרת אלקטרום", "electrum_settings_explain": "השאירו ריק כדי להשתמש בברירת מחדל", "electrum_status": "מצב", "electrum_clear_alert_title": "ניקוי היסטוריה?", @@ -271,6 +275,7 @@ "electrum_history": "היסטוריית שרת", "electrum_reset_to_default": "האם אתם בטוחים שברצונכם לשחזר את הגדרות האקלטרום שלכם לברירת מחדל?", "electrum_clear": "ניקוי", + "tor_supported": "Tor נתמך", "encrypt_decrypt": "פתיחת אחסון מוצפן", "encrypt_decrypt_q": "האם לפענח אחסון מוצפן? זה יאפשר לגשת לארנקים שלך ללא סיסמה.", "encrypt_del_uninstall": "מחק אם BlueWallet הוסר", @@ -278,21 +283,23 @@ "encrypt_title": "אבטחה", "encrypt_tstorage": "אחסון", "encrypt_use": "השתמש {type}", - "encrypt_use_expl": "{type} ישמש לאמת את זהותך לפני ביצוע העברה, פתיחה, יצוא או מחיקה של ארנק. {type} אינו ישמש לפתיחת אחסון מוצפן.", + "encrypt_use_expl": "{type} ישמש לאמת את זהותך לפני ביצוע פעולה, פתיחה, יצוא או מחיקה של ארנק. {type} אינו ישמש לפתיחת אחסון מוצפן.", "general": "כללי", "general_adv_mode": "מצב מתקדם", "general_adv_mode_e": "כאשר מופעל, אפשרויות מתקדמות יוצגו כגון סוגי ארנק שונים, אפשרות להתחבר לצומת LNDHub לפי רצונך ואנטרופיה מותאמת בתהליך יצירת ארנק.", "general_continuity": "המשכיות", - "general_continuity_e": "כאשר מופעל, תוכלו לצפות בארנקים והעברות נבחרים, באמצעות מכשירי Apple iCloud מחוברים אחרים.", + "general_continuity_e": "כאשר מופעל, תוכלו לצפות בארנקים ופעולות נבחרים, באמצעות מכשירי Apple iCloud מחוברים אחרים.", "groundcontrol_explanation": "שרת GroundControl הינו שרת התראות חופשי בקוד פתוח בשביל ארנקי ביטקוין. באפשרותך להתקין שרת GroundControl אישי ולהכניס את ה- URL שלו כאן, כדי לא להסתמך על התשתית של BlueWallet. השאירו ריק כדי להשתמש בברירת המחדל", "header": "הגדרות", "language": "שפה", + "language_isRTL": "הפעלה מחדש של BlueWallet נדרשת לשינוי כיוון שפה.", "lightning_error_lndhub_uri": "LndHub URI לא תקין", "lightning_saved": "השינויים נשמרו בהצלחה", "lightning_settings": "הגדרות ברק", + "tor_settings": "הגדרות Tor", "lightning_settings_explain": "כדי להתחבר לצומת LND אישי, אנא התקינו LndHub והכניסו את כתובת ה- URL שלו כאן בהגדרות. השאירו ריק כדי להשתמש ב- LNDHub של BlueWallet (lndhub.io). ארנקים שנוצרו אחרי שמירת השינויים יתחברו ל- LNDHub שהוגדר.", "network": "רשת", - "network_broadcast": "שידור העברה", + "network_broadcast": "שידור פעולה", "network_electrum": "שרת אלקטרום", "not_a_valid_uri": "URI לא תקני", "notifications": "התראות", @@ -308,15 +315,18 @@ "privacy_quickactions": "קיצורי דרך ארנק", "privacy_quickactions_explanation": "לצפייה מהירה במאזן הארנק שלכם לחצו והחזיקו את סמליל אפליקציית BlueWallet במסך הבית.", "privacy_clipboard_explanation": "מספק קיצורי דרך במקרה שכתובת, או חשבונית, נמצאות בקליפבורד שלך.", + "privacy_do_not_track": "נטרול ניתוח", + "privacy_do_not_track_explanation": "מידע ביצועים ומהימנות לא ישלח לניתוח.", "push_notifications": "התראות", "retype_password": "הכניסו שוב סיסמה", "selfTest": "בדיקה עצמית", "save": "שמירה", "saved": "נשמר", - "success_transaction_broadcasted": "הצלחה! ההעברה שלך שודרה!", + "success_transaction_broadcasted": "הצלחה! הפעולה שלך שודרה!", "total_balance": "יתרה כוללת", "total_balance_explanation": "הצגת היתרה הכוללת של כל הארנקים שלך ביישומונים של מסך הבית.", - "widgets": "יישומונים" + "widgets": "יישומונים", + "tools": "כלים" }, "notifications": { "would_you_like_to_receive_notifications": "האם ברצונך לקבל התראות כאשר מתקבלים תשלומים נכנסים?", @@ -325,15 +335,15 @@ }, "transactions": { "cancel_explain": "אנחנו נחליף את העברה זאת עם העברה לעצמך עם עמלות גבוהות יותר. זה למעשה מבטל את ההעברה. זה נקרא RBF—Replace by Fee.", - "cancel_no": "העברה זאת אינה ניתנת להחלפה", - "cancel_title": "בטל העברה זאת (RBF)", + "cancel_no": "פעולה זאת אינה ניתנת להחלפה", + "cancel_title": "בטל פעולה זאת (RBF)", "confirmations_lowercase": "{confirmations} אישורים", "note": "הערה", "expand_note": "הרחבת הערה", "block_explorer_link": "קישור סייר בלוקים", "cpfp_create": "צור", - "cpfp_exp": "אנו ניצור העברה נוספת שתשתמש בעודף שנשאר מההעברה הקודמת שבוצעה. סך כל העמלה יהיה גבוה יותר מעמלת ההעברה המקורית, כך שמהירות קבלת האישור אמורה לעלות. פעולה זאת נקראת CPFP - Child Pays For Parent.", - "cpfp_no_bump": "עמלת העברה זו אינה ניתנת להעלאה", + "cpfp_exp": "אנו ניצור פעולה נוספת שתשתמש בעודף שנשאר מהפעולה הקודמת שבוצעה. סך כל העמלה יהיה גבוה יותר מעמלת הפעולה המקורית, כך שמהירות קבלת האישור אמורה לעלות. פעולה זאת נקראת CPFP - Child Pays For Parent.", + "cpfp_no_bump": "עמלת פעולה זו אינה ניתנת להעלאה", "cpfp_title": "הקפץ עמלה (CPFP)", "details_balance_hide": "הסתרת מאזן", "details_balance_show": "הצגת מאזן", @@ -343,20 +353,21 @@ "details_inputs": "קלטים", "details_outputs": "פלטים", "details_received": "התקבל", - "transaction_note_saved": "הערת העברה נשמרה בהצלחה.", + "transaction_note_saved": "הערת פעולה נשמרה בהצלחה.", "details_show_in_block_explorer": "צפייה בסייר בלוקים", - "details_title": "העברה", + "details_title": "פעולה", "details_to": "פלט", - "details_transaction_details": "פרטי העברה", + "details_transaction_details": "פרטי פעולה", + "enable_offline_signing": "ארנק זה לא בשימוש בצירוף חתימה קרה. האם ברצונך לאפשר זאת עכשיו?", "list_conf": "אישורים: {number}", "pending": "ממתין", "list_title": "תנועות", - "rbf_explain": "אנו נחליף את העברה זו בהעברה עם עמלה גבוהה יותר, כך שמהירות קבלת האישור אמורה לעלות. פעולה זאת נקראת CPFP - Child Pays For Parent.", + "rbf_explain": "אנו נחליף את פעולה זו בפעולה עם עמלה גבוהה יותר, כך שמהירות קבלת האישור אמורה לעלות. פעולה זאת נקראת CPFP - Child Pays For Parent.", "rbf_title": "העלאת עמלה (RBF)", "status_bump": "העלאת עמלה", - "status_cancel": "ביטול העברה", + "status_cancel": "ביטול פעולה", "transactions_count": "מספר תנועות", - "txid": "מזהה העברה", + "txid": "מזהה פעולה", "updating": "מעדכן..." }, "wallets": { @@ -388,7 +399,7 @@ "details_delete": "מחיקה", "details_delete_wallet": "מחיקת ארנק", "details_derivation_path": "נתיב גזירה", - "details_display": "הצג ברשימת ארנקים", + "details_display": "הצגה ברשימת ארנקים", "details_export_backup": "יצוא / גיבוי", "details_marketplace": "שוק", "details_master_fingerprint": "טביעת אצבע ראשית", @@ -398,7 +409,8 @@ "details_multisig_type": "רב-חתימות", "details_no_cancel": "לא, בטל", "details_save": "שמירה", - "details_show_xpub": "הצג מפתח צפייה של הארנק", + "details_show_xpub": "הצגת מפתח צפייה של הארנק", + "details_show_addresses": "הצגת כתובות", "details_title": "ארנק", "details_type": "סוג", "details_use_with_hardware_wallet": "שימוש עם ארנק חומרה", @@ -419,14 +431,14 @@ "list_create_a_button": "הוסיפו עכשיו", "list_create_a_wallet": "הוסיפו ארנק", "list_create_a_wallet_text": "זה חינם ותוכלו ליצור\nכמה שתרצו", - "list_empty_txs1": "התנועות שלכם יופיעו פה", - "list_empty_txs1_lightning": "ארנק הברק משמש לתשלומים יומיומיים. העברות זולות בצורה לא הגיונית המתבצעות במהירות הבזק.", + "list_empty_txs1": "התנועות שלך יופיעו פה", + "list_empty_txs1_lightning": "ארנק הברק משמש לתשלומים יומיומיים. פעולות זולות בצורה לא הגיונית המתבצעות במהירות הבזק.", "list_empty_txs2": "התחילו שימוש בארנקכם.", "list_empty_txs2_lightning": "\nלהתחלת שימוש לחצו על \"ניהול כספים\" ומלאו את היתרה", "list_header": "ארנק מייצר צמד מפתחות, מפתח פרטי וכתובת שאותה ניתן לשתף כדי לקבל מטבעות.", "list_import_error": "התרחשה שגיאה בניסיון לייבא ארנק זה.", "list_import_problem": "לא ניתן לייבא ארנק הזה", - "list_latest_transaction": "העברה אחרונה", + "list_latest_transaction": "פעולה אחרונה", "list_ln_browser": "דפדפן LApp", "list_long_choose": "בחר תמונה", "list_long_clipboard": "העתקה מלוח", @@ -454,6 +466,7 @@ "multisig_vault": "כספת", "default_label": "כספת רבת-חתימות", "multisig_vault_explain": "ההגנה הטובה היותר לסכומים גדולים", + "provide_signature": "ספקו חתימה", "vault_key": "מפתח כספת {number}", "required_keys_out_of_total": " מפתחות נדרשים מתוך הסך הכולל", "fee": "עמלה: {number}", @@ -467,19 +480,19 @@ "signatures_we_can_make": "יכול לייצר {number}", "scan_or_import_file": "סריקה או יבוא קובץ", "export_coordination_setup": "יצוא מערך תאום", - "cosign_this_transaction": "חתום במשותף על העברה זו?", + "cosign_this_transaction": "חתום במשותף על פעולה זו?", "lets_start": "בואו נתחיל", "create": "יצירה", "provide_key": "ספקו מפתח", "native_segwit_title": "נוהג מומלץ", "wrapped_segwit_title": "תאימות גבוהה", - "co_sign_transaction": "חתימה על העברה", + "co_sign_transaction": "חתימה על פעולה", "what_is_vault": "כספת היא ארנק ", "what_is_vault_numberOfWallets": "רב-חתימות {m}-מתוך-{n}", "what_is_vault_wallet": ".", "vault_advanced_customize": "הגדרות כספת...", "needs": "נדרשים ", - "what_is_vault_description_number_of_vault_keys": "{m} מפתחות כספת", + "what_is_vault_description_number_of_vault_keys": "{m} מפתחות כספת ", "what_is_vault_description_to_spend": "לבזבוז ובשלישי תוכלו \nלהשתמש כגיבוי.", "what_is_vault_description_to_spend_other": "לבזבוז.", "quorum": "קוורום {m} מתוך {n}", @@ -545,12 +558,24 @@ }, "addresses": { "sign_title": "חתימת/אימות הודעה", + "sign_help": "פה תוכלו ליצור או לאמת חתימה קריפטוגרפית מבוססת כתובת ביטקוין", "sign_sign": "חתימה", + "sign_sign_submit": "חתימה ושליחה", "sign_verify": "אימות", "sign_signature_correct": "אימות הצליח!", "sign_signature_incorrect": "אימות נכשל!", "sign_placeholder_address": "כתובת", "sign_placeholder_message": "הודעה", - "sign_placeholder_signature": "חתימה" + "sign_placeholder_signature": "חתימה", + "sign_aopp_confirm": "האם ברצונך לשלוח הודעה חתומה אל {hostname}?", + "address_balance": "מאזן: {balance} sats", + "addresses_title": "כתובות", + "type_change": "עודף", + "type_receive": "קבלה" + }, + "aopp": { + "title": "בחירת כתובת", + "send_success": "חתימה נשלחה בהצלחה", + "send_error": "שגיאת שליחת חתימה" } } diff --git a/loc/id_id.json b/loc/id_id.json index bfa9a6328..d30ac8d7a 100644 --- a/loc/id_id.json +++ b/loc/id_id.json @@ -7,7 +7,7 @@ "never": "Tidak Pernah", "of": "{number} dari {total}", "ok": "OK", - "storage_is_encrypted": "Penyimpanan anda dienkripsi. Masukkan kata sandi untuk mendekripsinya:", + "storage_is_encrypted": "Ruang penyimpanan terenkripsi. Masukkan kata sandi untuk decript:", "allow": "Perbolehkan", "dont_allow": "Tidak Perbolehkan", "yes": "Ya", @@ -136,12 +136,11 @@ "ask": "Sudahkah Anda menyimpan frase cadangan dompet Anda? Frase cadangan ini diperlukan untuk mengakses dana Anda jika Anda kehilangan perangkat ini. Tanpa frase cadangan, dana Anda akan hilang secara permanen.", "ask_no": "Tidak, belum saya lakukan", "ask_yes": "Ya, sudah", - "ok": "Oke, saya tulis ini!", - "ok_lnd": "Oke, saya sudah menyimpannya.", - "text": "Mohon luangkan waktu sejenak untuk menuliskan kalimat mnemonik ini di selembar kertas. Ini adalah cadangan dompet Anda yang dapat Anda gunakan untuk memulihkan dompet di perangkat lain.", + "ok": "OK, saya tuliskan", + "ok_lnd": "OK, saya sudah menyimpan", "text_lnd": "Harap luangkan waktu sejenak untuk menyimpan otentikasi LNDHub ini. Ini cadangan Anda yang dapat Anda gunakan untuk memulihkan dompet di perangkat lain.", "text_lnd2": "Dompet ini dihost oleh BlueWallet", - "title": "Dompet Anda telah dibuat ..." + "title": "Wallet anda telah dibuat" }, "receive": { "details_create": "Buat", @@ -225,6 +224,7 @@ "qr_error_no_qrcode": "Gambar yang dipilih tidak berisi Kode QR.", "qr_error_no_wallet": "File yang dipilih tidak berisi dompet yang dapat diimpor.", "success_done": "Selesai", + "txSaved": "File transaksi ({filePath}) telah disimpan pada folder Unduhan.", "problem_with_psbt": "Ada masalah dengan PSBT" }, "settings": { @@ -250,11 +250,12 @@ "currency": "Mata Uang", "currency_source": "Harga diperoleh dari", "default_desc": "Saat dinonaktifkan, BlueWallet akan segera membuka dompet yang dipilih saat diluncurkan.", + "default_info": "Informasi standar", "default_wallets": "Lihat Semua Dompet", "electrum_connected": "Terhubung", "electrum_connected_not": "Tidak Terhubung", "electrum_error_connect": "Tidak dapat terhubung dengan server Electrum", - "electrum_host": "Host, sebagai contoh, {contoh}", + "electrum_host": "Contoh. {example}", "electrum_port": "Port TCP, biasanya {contoh}", "electrum_port_ssl": "Port SSL, biasanya {contoh}", "general_adv_mode": "Enable advanced mode", diff --git a/loc/nl_nl.json b/loc/nl_nl.json index 1261d91a6..e2a8957c0 100644 --- a/loc/nl_nl.json +++ b/loc/nl_nl.json @@ -136,12 +136,9 @@ "ask": "Heeft u uw back-up zin opgeslagen? Deze back-up zin is nodig om toegang te krijgen tot uw tegoeden wanneer u dit apparaat verliest. Zonder de back-up zin zijn je gelden voor altijd verloren.", "ask_no": "Nee, dat heb ik niet", "ask_yes": "Ja, dat heb ik.", - "ok": "Oké, ik heb het opgeschreven!", - "ok_lnd": "Oké, ik heb het bewaard.", - "text": "Neem alstublieft een moment om deze mnemonic phrase op papier te schrijven. Het is uw back-up die u kunt gebruiken om uw wallet te herstellen op een ander apparaat.", + "ok": "Oké, ik heb het opgeschreven", "text_lnd": "Sla deze wallet backup op. Zo kun je de wallet herstellen in geval van verlies.", - "text_lnd2": "Deze wallet wordt gehost door BlueWallet.", - "title": "Je wallet is aangemaakt" + "text_lnd2": "Deze wallet wordt gehost door BlueWallet." }, "receive": { "details_create": "Maken", @@ -257,14 +254,11 @@ "electrum_connected": "Verbonden", "electrum_connected_not": "Niet verbonden", "electrum_error_connect": "Kan niet verbinden met aangeleverde Electrum server", - "electrum_host": "host, bijvoorbeeld {example}", "electrum_port": "TCP-poort, gebruikelijk {example}", "electrum_port_ssl": "SSL-poort, gebruikelijk {example}", "electrum_saved": "Uw veranderingen zijn succesvol opgeslagen. Opnieuw opstarten kan nodig zijn om de wijzigingen door te voeren.", "set_electrum_server_as_default": "{server} instellen als de standaard electrum server?", "set_lndhub_as_default": "{url} instellen als de standaard LNDHub server?", - "electrum_settings_server": "Electrum Server Instellingen", - "electrum_settings_explain": "Laat leeg om standaardinstelling te gebruiken", "electrum_status": "Status", "electrum_clear_alert_title": "Geschiedenis verwijderen?", "electrum_clear_alert_message": "Wil je de geschiedenis van de electrum servers wissen?", @@ -566,6 +560,7 @@ "sign_signature_incorrect": "Verificatie Mislukt!", "sign_placeholder_address": "Adres", "sign_placeholder_message": "Bericht", - "sign_placeholder_signature": "Handtekening" + "sign_placeholder_signature": "Handtekening", + "addresses_title": "Adressen" } } From 51d67ae1b3e8424830fade6d06220c32c068577f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 24 Jun 2021 08:50:57 -0400 Subject: [PATCH 159/327] ADD: Accessibility button trait to TouchableOpacity --- BlueComponents.js | 31 ++++++++++++++++++------ UnlockWith.js | 6 ++--- components/AddressInput.js | 9 +++++-- components/AmountInput.js | 7 +++++- components/CoinsSelected.js | 4 +-- components/DynamicQRCode.js | 4 +++ components/FloatButtons.js | 2 +- components/MultipleStepsListItem.js | 9 ++++++- components/SquareButton.js | 1 + components/SquareEnumeratedWords.js | 6 ++++- components/WalletsCarousel.js | 6 ++--- components/navigationStyle.js | 3 ++- loc/en.json | 1 + package.json | 2 +- screen/lnd/browser.js | 2 ++ screen/lnd/lndCreateInvoice.js | 13 +++++++--- screen/lnd/lndViewInvoice.js | 2 +- screen/lnd/lnurlPay.js | 2 ++ screen/lnd/scanLndInvoice.js | 4 +-- screen/receive/aztecoRedeem.js | 2 ++ screen/send/confirm.js | 1 + screen/send/create.js | 10 +++++--- screen/send/details.js | 6 +++++ screen/send/psbtMultisig.js | 2 ++ screen/send/psbtWithHardwareWallet.js | 4 +-- screen/settings/about.js | 3 ++- screen/settings/electrumSettings.js | 6 ++--- screen/transactions/CPFP.js | 8 ++++-- screen/transactions/details.js | 3 ++- screen/transactions/transactionStatus.js | 4 +-- screen/wallets/addMultisig.js | 8 +++--- screen/wallets/addMultisigStep2.js | 2 +- screen/wallets/details.js | 4 +-- screen/wallets/hodlHodl.js | 3 ++- screen/wallets/hodlHodlMyContracts.js | 1 + screen/wallets/list.js | 7 +++--- screen/wallets/provideEntropy.js | 8 +++--- screen/wallets/selectWallet.js | 1 + screen/wallets/transactions.js | 20 ++++++++++++--- 39 files changed, 154 insertions(+), 63 deletions(-) diff --git a/BlueComponents.js b/BlueComponents.js index c1de1fc09..d52efa1ec 100644 --- a/BlueComponents.js +++ b/BlueComponents.js @@ -80,6 +80,7 @@ export const BlueButton = props => { alignItems: 'center', paddingHorizontal: 16, }} + accessibilityRole="button" {...props} > @@ -101,6 +102,7 @@ export const SecondButton = forwardRef((props, ref) => { return ( { export const BitcoinButton = props => { const { colors } = useTheme(); return ( - + { export const VaultButton = props => { const { colors } = useTheme(); return ( - + { export const LightningButton = props => { const { colors } = useTheme(); return ( - + {this.state.wallet.type === LightningCustodianWallet.type && this.state.allowOnchainAddress && ( - + )} {this.state.wallet.type === MultisigHDWallet.type && ( - + { const { colors } = useTheme(); return ( { export const BlueCopyToClipboardButton = ({ stringToCopy, displayText = false }) => { return ( - Clipboard.setString(stringToCopy)}> + Clipboard.setString(stringToCopy)}> {displayText || loc.transactions.details_copy} ); @@ -599,7 +603,12 @@ export class BlueCopyTextToClipboard extends Component { render() { return ( - + {this.state.address} @@ -1193,7 +1202,7 @@ export const BlueReceiveButtonIcon = props => { const { colors } = useTheme(); return ( - + ( this.onFeeSelected(type)} style={[ @@ -1654,6 +1664,7 @@ export class BlueReplaceFeeSuggestions extends Component { ))} this.customTextInput.focus()} style={[ { paddingHorizontal: 16, paddingVertical: 8, marginBottom: 10 }, @@ -1752,6 +1763,7 @@ export const BlueTabs = ({ active, onSwitch, tabs }) => ( {tabs.map((Tab, i) => ( onSwitch(i)} style={[ tabsStyles.tabRoot, @@ -1859,18 +1871,21 @@ export class DynamicQRCode extends Component { {loc.send.dynamic_prev} {this.state.intervalHandler ? loc.send.dynamic_stop : loc.send.dynamic_start} diff --git a/UnlockWith.js b/UnlockWith.js index adf93c014..8b1d3de4c 100644 --- a/UnlockWith.js +++ b/UnlockWith.js @@ -97,13 +97,13 @@ const UnlockWith = () => { const color = colorScheme === 'dark' ? '#FFFFFF' : '#000000'; if ((biometricType === Biometric.TouchID || biometricType === Biometric.Biometrics) && !isStorageEncryptedEnabled) { return ( - + ); } else if (biometricType === Biometric.FaceID && !isStorageEncryptedEnabled) { return ( - + { ); } else if (isStorageEncryptedEnabled) { return ( - + ); diff --git a/components/AddressInput.js b/components/AddressInput.js index 005743a08..b64fe2bfc 100644 --- a/components/AddressInput.js +++ b/components/AddressInput.js @@ -66,10 +66,15 @@ const AddressInput = ({ }); } }} + accessibilityRole="button" style={[styles.scan, stylesHook.scan]} + accessibilityLabel={loc.send.details_scan} + accessibilityHint={loc.send.details_scan_hint} > - - {loc.send.details_scan} + + + {loc.send.details_scan} + ); diff --git a/components/AmountInput.js b/components/AmountInput.js index f49bab7db..3ecc1735a 100644 --- a/components/AmountInput.js +++ b/components/AmountInput.js @@ -240,7 +240,12 @@ class AmountInput extends Component { {!disabled && amount !== BitcoinUnit.MAX && ( - + )} diff --git a/components/CoinsSelected.js b/components/CoinsSelected.js index 58c383ff9..2c7c12550 100644 --- a/components/CoinsSelected.js +++ b/components/CoinsSelected.js @@ -35,11 +35,11 @@ const styles = StyleSheet.create({ }); const CoinsSelected = ({ number, onContainerPress, onClose }) => ( - + {loc.formatString(loc.cc.coins_selected, { number })} - + diff --git a/components/DynamicQRCode.js b/components/DynamicQRCode.js index 10dd7fdad..8e277b3e1 100644 --- a/components/DynamicQRCode.js +++ b/components/DynamicQRCode.js @@ -105,6 +105,7 @@ export class DynamicQRCode extends Component { return ( { @@ -136,18 +137,21 @@ export class DynamicQRCode extends Component { {loc.send.dynamic_prev} {this.state.intervalHandler ? loc.send.dynamic_stop : loc.send.dynamic_start} diff --git a/components/FloatButtons.js b/components/FloatButtons.js index 8aaf0d03a..433e55c38 100644 --- a/components/FloatButtons.js +++ b/components/FloatButtons.js @@ -119,7 +119,7 @@ export const FButton = ({ text, icon, width, first, last, ...props }) => { } return ( - + {icon} {text} diff --git a/components/MultipleStepsListItem.js b/components/MultipleStepsListItem.js index 6a091d6a3..bcb7b25d6 100644 --- a/components/MultipleStepsListItem.js +++ b/components/MultipleStepsListItem.js @@ -139,6 +139,7 @@ const MultipleStepsListItem = props => { {props.button.buttonType === undefined || (props.button.buttonType === MultipleStepsListItemButtohType.full && ( { {props.button.leftText} { )} {!showActivityIndicator && props.rightButton && checked && ( - + {props.rightButton.text} diff --git a/components/SquareButton.js b/components/SquareButton.js index 3003be53b..4bbaf0395 100644 --- a/components/SquareButton.js +++ b/components/SquareButton.js @@ -29,6 +29,7 @@ export const SquareButton = forwardRef((props, ref) => { }} {...props} ref={ref} + accessibilityRole="button" > {props.icon && } diff --git a/components/SquareEnumeratedWords.js b/components/SquareEnumeratedWords.js index 986076b78..680ab840e 100644 --- a/components/SquareEnumeratedWords.js +++ b/components/SquareEnumeratedWords.js @@ -35,7 +35,11 @@ const SquareEnumeratedWords = props => { ); } else { component.push( - + {secret} diff --git a/components/WalletsCarousel.js b/components/WalletsCarousel.js index 14f7b1eb3..c3f696b05 100644 --- a/components/WalletsCarousel.js +++ b/components/WalletsCarousel.js @@ -60,7 +60,7 @@ const nStyles = StyleSheet.create({ const NewWalletPanel = ({ onPress }) => { const { colors } = useTheme(); return ( - + {loc.wallets.list_create_a_wallet} {loc.wallets.list_create_a_wallet_text} @@ -290,8 +290,7 @@ const cStyles = StyleSheet.create({ content: { left: 16, flexDirection: I18nManager.isRTL && Platform.OS === 'android' ? 'row-reverse' : 'row', - -} + }, }); const WalletsCarousel = forwardRef((props, ref) => { @@ -348,7 +347,6 @@ const WalletsCarousel = forwardRef((props, ref) => { inactiveSlideOpacity={I18nManager.isRTL && Platform.OS === 'android' ? 1.0 : 0.7} activeSlideAlignment="start" contentContainerCustomStyle={cStyles.content} - initialNumToRender={10} onLayout={onLayout} {...props} diff --git a/components/navigationStyle.js b/components/navigationStyle.js index 4f3d66aa0..fc4ce1d51 100644 --- a/components/navigationStyle.js +++ b/components/navigationStyle.js @@ -21,7 +21,7 @@ const navigationStyle = ({ closeButton = false, closeButtonFunc, ...opts }, form navigation.goBack(null); }; headerRight = () => ( - + ); @@ -71,6 +71,7 @@ export const navigationStyleTx = (opts, formatter) => { headerTintColor: theme.colors.foregroundColor, headerLeft: () => ( { Keyboard.dismiss(); diff --git a/loc/en.json b/loc/en.json index 431b48359..4cafc498f 100644 --- a/loc/en.json +++ b/loc/en.json @@ -186,6 +186,7 @@ "details_no_signed_tx": "The selected file doesn’t contain a transaction that can be imported.", "details_note_placeholder": "Note to Self", "details_scan": "Scan", + "details_scan_hint": "Double tap to scan or import a destination", "details_total_exceeds_balance": "The sending amount exceeds the available balance.", "details_unrecognized_file_format": "Unrecognized file format", "details_wallet_before_tx": "Before creating a transaction, you must first add a Bitcoin wallet.", diff --git a/package.json b/package.json index a1435070b..b9b18fb9e 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "e2e:debug": "(test -f android/app/build/outputs/apk/debug/app-debug.apk && test -f android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk) || npm run e2e:debug-build; npm run e2e:debug-test", "e2e:release-build": "detox build -c android.emu.release", "e2e:release-test": "detox test -c android.emu.release --record-videos all --take-screenshots all --headless --loglevel trace", - "lint": "eslint *.js screen/**/*.js blue_modules/*.js class/**/*.js models/ loc/ tests/**/*.js components/**/*.js", + "lint": "eslint *.js screen/**/*.js blue_modules/*.js class/**/*.js models/ loc/ tests/**/*.js components/**/*.js components/*.js", "lint:fix": "npm run lint -- --fix", "lint:quickfix": "git status --porcelain | grep -v '\\.json' | grep '\\.js' --color=never | awk '{print $2}' | xargs eslint --fix; exit 0", "unit": "jest tests/unit/*" diff --git a/screen/lnd/browser.js b/screen/lnd/browser.js index f7e4e2972..6991f0c3a 100644 --- a/screen/lnd/browser.js +++ b/screen/lnd/browser.js @@ -482,6 +482,7 @@ export default class Browser extends Component { {Platform.OS !== 'ios' && ( // on iOS lappbrowser opens blank page, thus, no HOME button { processedInvoices = {}; this.setState({ url: 'https://bluewallet.io/marketplace/' }); @@ -496,6 +497,7 @@ export default class Browser extends Component { )} { this.webView.current?.reload(); }} diff --git a/screen/lnd/lndCreateInvoice.js b/screen/lnd/lndCreateInvoice.js index f26e91603..bbe865038 100644 --- a/screen/lnd/lndCreateInvoice.js +++ b/screen/lnd/lndCreateInvoice.js @@ -304,7 +304,14 @@ const LNDCreateInvoice = () => { const renderScanClickable = () => { return ( - + {loc.send.details_scan} @@ -320,13 +327,13 @@ const LNDCreateInvoice = () => { return ( {!isLoading && ( - + {loc.wallets.select_wallet.toLowerCase()} )} - + {wallet.current.getLabel()} {formatBalanceWithoutSuffix(wallet.current.getBalance(), BitcoinUnit.SATS, false)} diff --git a/screen/lnd/lndViewInvoice.js b/screen/lnd/lndViewInvoice.js index 8421af5e7..c187f93bc 100644 --- a/screen/lnd/lndViewInvoice.js +++ b/screen/lnd/lndViewInvoice.js @@ -214,7 +214,7 @@ const LNDViewInvoice = () => { /> {invoice.payment_preimage && typeof invoice.payment_preimage === 'string' ? ( - + {loc.send.create_details} {!this.state.isLoading && ( this.props.navigation.navigate('SelectWallet', { onWalletSelect: this.onWalletSelect, chainType: Chain.OFFCHAIN }) @@ -139,6 +140,7 @@ export default class LnurlPay extends Component { )} this.props.navigation.navigate('SelectWallet', { onWalletSelect: this.onWalletSelect, chainType: Chain.OFFCHAIN }) diff --git a/screen/lnd/scanLndInvoice.js b/screen/lnd/scanLndInvoice.js index 05354d633..7505458f0 100644 --- a/screen/lnd/scanLndInvoice.js +++ b/screen/lnd/scanLndInvoice.js @@ -247,13 +247,13 @@ const ScanLndInvoice = () => { return ( {!isLoading && ( - + {loc.wallets.select_wallet.toLowerCase()} )} - + {walletLabel} {formatBalanceWithoutSuffix(wallet.getBalance(), BitcoinUnit.SATS, false)} diff --git a/screen/receive/aztecoRedeem.js b/screen/receive/aztecoRedeem.js index 3ad705514..e6265a7fb 100644 --- a/screen/receive/aztecoRedeem.js +++ b/screen/receive/aztecoRedeem.js @@ -112,6 +112,7 @@ export default class AztecoRedeem extends Component { {!this.state.isLoading && ( this.props.navigation.navigate('SelectWallet', { @@ -126,6 +127,7 @@ export default class AztecoRedeem extends Component { )} this.props.navigation.navigate('SelectWallet', { diff --git a/screen/send/confirm.js b/screen/send/confirm.js index 1b01dc86e..408ce1406 100644 --- a/screen/send/confirm.js +++ b/screen/send/confirm.js @@ -221,6 +221,7 @@ export default class Confirm extends Component { {this.state.isLoading ? : this.send()} title={loc.send.confirm_sendNow} />} { diff --git a/screen/send/create.js b/screen/send/create.js index 84304b138..20f219d70 100644 --- a/screen/send/create.js +++ b/screen/send/create.js @@ -144,10 +144,14 @@ export default class SendCreate extends Component { {loc.send.create_this_is_hex} - Clipboard.setString(this.state.tx)}> + Clipboard.setString(this.state.tx)}> {loc.send.create_copy} - Linking.openURL('https://coinb.in/?verify=' + this.state.tx)}> + Linking.openURL('https://coinb.in/?verify=' + this.state.tx)} + > {loc.send.create_verify} @@ -258,7 +262,7 @@ SendCreate.navigationOptions = navigationStyle({}, (options, { theme, navigation let headerRight; if (route.params.exportTXN) { headerRight = () => ( - + ); diff --git a/screen/send/details.js b/screen/send/details.js index a8a8565f0..1b7bf5716 100644 --- a/screen/send/details.js +++ b/screen/send/details.js @@ -930,6 +930,7 @@ const SendDetails = () => { {options.map(({ label, time, fee, rate, active }, index) => ( { setFeePrecalc(fp => ({ ...fp, current: fee })); @@ -954,6 +955,7 @@ const SendDetails = () => { ))} { let error = loc.send.fee_satbyte; @@ -1102,6 +1104,7 @@ const SendDetails = () => { {!isLoading && ( navigation.navigate('SelectWallet', { onWalletSelect, chainType: Chain.ONCHAIN })} > @@ -1111,6 +1114,7 @@ const SendDetails = () => { )} navigation.navigate('SelectWallet', { onWalletSelect, chainType: Chain.ONCHAIN })} > @@ -1251,6 +1255,7 @@ const SendDetails = () => { setIsFeeSelectionModalVisible(true)} disabled={isLoading} style={styles.fee} @@ -1428,6 +1433,7 @@ SendDetails.navigationOptions = navigationStyleTx({}, (options, { theme, navigat ...options, headerRight: () => ( { {renderProvideSignature && ( { {isConfirmEnabled() && ( { {loc.send.create_this_is_hex} - + {loc.send.create_copy} - + {loc.send.create_verify} diff --git a/screen/settings/about.js b/screen/settings/about.js index f3c9adf5f..c5b07a3df 100644 --- a/screen/settings/about.js +++ b/screen/settings/about.js @@ -161,7 +161,7 @@ const About = () => { Electrum server - + {loc.settings.about_sm_github} @@ -211,6 +211,7 @@ const About = () => { Unique ID: {getUniqueId()} { const stringToCopy = 'user.id:' + getUniqueId(); Sentry.captureMessage('copied unique id'); diff --git a/screen/settings/electrumSettings.js b/screen/settings/electrumSettings.js index 6e900f80b..b28a92c61 100644 --- a/screen/settings/electrumSettings.js +++ b/screen/settings/electrumSettings.js @@ -236,7 +236,7 @@ export default class ElectrumSettings extends Component { {`${server.host}:${server.port || server.sslPort}`} - this.selectServer(server)}> + this.selectServer(server)}> {loc.settings.electrum_select} @@ -328,7 +328,7 @@ export default class ElectrumSettings extends Component { {loc.settings.electrum_settings_explain} - this.resetToDefault()}> + this.resetToDefault()}> {loc.settings.electrum_reset} @@ -371,7 +371,7 @@ export default class ElectrumSettings extends Component { {loc.settings.electrum_history} - this.clearHistoryAlert()}> + this.clearHistoryAlert()}> {loc.settings.electrum_clear} diff --git a/screen/transactions/CPFP.js b/screen/transactions/CPFP.js index 283cd9321..b6deee93e 100644 --- a/screen/transactions/CPFP.js +++ b/screen/transactions/CPFP.js @@ -198,10 +198,14 @@ export default class CPFP extends Component { {loc.send.create_this_is_hex} - Clipboard.setString(this.state.txhex)}> + Clipboard.setString(this.state.txhex)}> {loc.send.create_copy} - Linking.openURL('https://coinb.in/?verify=' + this.state.txhex)}> + Linking.openURL('https://coinb.in/?verify=' + this.state.txhex)} + > {loc.send.create_verify} this.broadcast()} title={loc.send.confirm_sendNow} /> diff --git a/screen/transactions/details.js b/screen/transactions/details.js index ef59866b8..4c9822b20 100644 --- a/screen/transactions/details.js +++ b/screen/transactions/details.js @@ -66,7 +66,7 @@ const TransactionsDetails = () => { useEffect(() => { setOptions({ headerRight: () => ( - + {loc.wallets.details_save} ), @@ -242,6 +242,7 @@ const TransactionsDetails = () => { ]} /> { } else if (isRBFCancelPossible === buttonStatus.possible) { return ( <> - + {loc.transactions.status_cancel} @@ -348,7 +348,7 @@ const TransactionsStatus = () => { {renderCPFP()} {renderRBFBumpFee()} {renderRBFCancel()} - + {loc.send.create_details.toLowerCase()} diff --git a/screen/wallets/addMultisig.js b/screen/wallets/addMultisig.js index 985893bb3..df969e590 100644 --- a/screen/wallets/addMultisig.js +++ b/screen/wallets/addMultisig.js @@ -108,7 +108,7 @@ const WalletsAddMultisig = () => { {loc.multisig.required_keys_out_of_total} - + { /> {m} - + @@ -127,11 +127,11 @@ const WalletsAddMultisig = () => { - + {n} - + diff --git a/screen/wallets/addMultisigStep2.js b/screen/wallets/addMultisigStep2.js index 3af1d840f..cdd86ad5d 100644 --- a/screen/wallets/addMultisigStep2.js +++ b/screen/wallets/addMultisigStep2.js @@ -643,7 +643,7 @@ const WalletsAddMultisigStep2 = () => { const renderHelp = () => { return ( - + {loc.multisig.ms_help} diff --git a/screen/wallets/details.js b/screen/wallets/details.js index ba5d46917..87e3beff6 100644 --- a/screen/wallets/details.js +++ b/screen/wallets/details.js @@ -179,7 +179,7 @@ const WalletDetails = () => { // eslint-disable-next-line react-hooks/exhaustive-deps setOptions({ headerRight: () => ( - + {loc.wallets.details_save} ), @@ -599,7 +599,7 @@ const WalletDetails = () => { )} - + {`${loc.wallets.details_delete}${' '}`} diff --git a/screen/wallets/hodlHodl.js b/screen/wallets/hodlHodl.js index a2f2933df..e0be72dde 100644 --- a/screen/wallets/hodlHodl.js +++ b/screen/wallets/hodlHodl.js @@ -714,11 +714,12 @@ export default class HodlHodl extends Component { {this.state.isLoading ? ( ) : ( - this.setState({ isChooseCountryModalVisible: true })}> + this.setState({ isChooseCountryModalVisible: true })}> {this.getNativeCountryName()} )} { this.setState({ isFiltersModalVisible: true }); diff --git a/screen/wallets/hodlHodlMyContracts.js b/screen/wallets/hodlHodlMyContracts.js index abbdf3dec..a36e7ebc0 100644 --- a/screen/wallets/hodlHodlMyContracts.js +++ b/screen/wallets/hodlHodlMyContracts.js @@ -443,6 +443,7 @@ HodlHodlMyContracts.navigationOptions = navigationStyle( }, headerRight: () => ( { Alert.alert( diff --git a/screen/wallets/list.js b/screen/wallets/list.js index d38298ebc..6ee94274b 100644 --- a/screen/wallets/list.js +++ b/screen/wallets/list.js @@ -129,13 +129,13 @@ const WalletsList = () => { }, headerRight: () => I18nManager.isRTL ? null : ( - + ), headerLeft: () => I18nManager.isRTL ? ( - + ) : null, @@ -218,7 +218,7 @@ const WalletsList = () => { {`${loc.transactions.list_title}${' '}`} {isDesktop && ( - refreshTransactions(true)} disabled={isLoading}> + refreshTransactions(true)} disabled={isLoading}> )} @@ -247,6 +247,7 @@ const WalletsList = () => { if (carouselData.length > 0 && !carouselData.some(wallet => wallet.type === PlaceholderWallet.type)) { const button = ( { navigate('HodlHodl', { screen: 'HodlHodl' }); }} diff --git a/screen/wallets/provideEntropy.js b/screen/wallets/provideEntropy.js index 617f0bbf2..34e85b816 100644 --- a/screen/wallets/provideEntropy.js +++ b/screen/wallets/provideEntropy.js @@ -103,10 +103,10 @@ export const convertToBuffer = ({ entropy, bits }) => { const Coin = ({ push }) => ( - push(getEntropy(0, 2))} style={styles.coinBody}> + push(getEntropy(0, 2))} style={styles.coinBody}> - push(getEntropy(1, 2))} style={styles.coinBody}> + push(getEntropy(1, 2))} style={styles.coinBody}> @@ -151,7 +151,7 @@ const Dice = ({ push, sides }) => { return ( {[...Array(sides)].map((_, i) => ( - push(getEntropy(i, sides))}> + push(getEntropy(i, sides))}> {sides === 6 ? ( @@ -240,7 +240,7 @@ const Entropy = () => { return ( - setShow(!show)}> + setShow(!show)}> {show ? hex : `${bits} of 256 bits`} diff --git a/screen/wallets/selectWallet.js b/screen/wallets/selectWallet.js index d62b43fad..f4c284d21 100644 --- a/screen/wallets/selectWallet.js +++ b/screen/wallets/selectWallet.js @@ -105,6 +105,7 @@ const SelectWallet = () => { ReactNativeHapticFeedback.trigger('selection', { ignoreAndroidSystemSettings: false }); onWalletSelect(item); }} + accessibilityRole="button" > diff --git a/screen/wallets/transactions.js b/screen/wallets/transactions.js index c5cc54254..821479695 100644 --- a/screen/wallets/transactions.js +++ b/screen/wallets/transactions.js @@ -259,7 +259,13 @@ const WalletTransactions = () => { {loc.transactions.list_title} - + @@ -340,6 +346,7 @@ const WalletTransactions = () => { return Platform.select({ android: ( { if (wallet.type === LightningCustodianWallet.type) { navigate('LappBrowserRoot', { @@ -358,6 +365,7 @@ const WalletTransactions = () => { ios: wallet.getBalance() > 0 ? ( { Linking.openURL('https://bluewallet.io/marketplace/'); }} @@ -373,6 +381,7 @@ const WalletTransactions = () => { const renderLappBrowserButton = () => { return ( { navigate('LappBrowserRoot', { screen: 'LappBrowser', @@ -392,7 +401,11 @@ const WalletTransactions = () => { const renderSellFiat = () => { return ( - + {loc.wallets.list_tap_here_to_buy} ); @@ -655,7 +668,7 @@ const WalletTransactions = () => { {isLightning() && {loc.wallets.list_empty_txs2_lightning}} {!isLightning() && ( - + {loc.wallets.list_tap_here_to_buy} @@ -717,6 +730,7 @@ WalletTransactions.navigationOptions = navigationStyle({}, (options, { theme, na return { headerRight: () => ( Date: Thu, 24 Jun 2021 21:27:00 +0000 Subject: [PATCH 160/327] Translate /loc/en.json in fa_IR review completed for the source file '/loc/en.json' on the 'fa_IR' language. --- loc/fa.json | 1 + 1 file changed, 1 insertion(+) diff --git a/loc/fa.json b/loc/fa.json index 5f09fd40f..4529f8c90 100644 --- a/loc/fa.json +++ b/loc/fa.json @@ -186,6 +186,7 @@ "details_no_signed_tx": "فایل انتخاب‌شده حاوی تراکنشی نیست که بتوان آن را وارد کرد.", "details_note_placeholder": "یادداشت به خود", "details_scan": "اسکن", + "details_scan_hint": "جهت اسکن یا واردکردن مقصد دو بار ضربه بزنید", "details_total_exceeds_balance": "مقدار ارسالی بیش از ماندهٔ موجود است.", "details_unrecognized_file_format": "قالب فایل ناشناخته", "details_wallet_before_tx": "قبل از ایجاد تراکنش، ابتدا باید یک کیف پول بیت‌کوین اضافه کنید.", From 20e726215359a441853e66e02ac8b79f6ab86226 Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Thu, 24 Jun 2021 17:48:14 -0700 Subject: [PATCH 161/327] TST: tmp fix for e2e tests --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ef1505f9..edb578971 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ on: [pull_request] jobs: test: - runs-on: macos-latest + runs-on: macos-10.15 # tmp fix for https://github.com/ReactiveCircus/android-emulator-runner/issues/160 steps: - name: Checkout project uses: actions/checkout@v2 @@ -92,6 +92,7 @@ jobs: uses: reactivecircus/android-emulator-runner@v2 with: api-level: 29 + emulator-build: 6110076 # tmp fix for https://github.com/ReactiveCircus/android-emulator-runner/issues/160 target: google_apis avd-name: Pixel_API_29_AOSP emulator-options: -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim -camera-back none -camera-front none From 5118442a976ac5298dc5bf42c55c52cffc5fa491 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 25 Jun 2021 13:07:38 +0000 Subject: [PATCH 162/327] Translate /loc/en.json in es_419 review completed for the source file '/loc/en.json' on the 'es_419' language. --- loc/es_419.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/loc/es_419.json b/loc/es_419.json index 3c931d77e..48c78c52b 100644 --- a/loc/es_419.json +++ b/loc/es_419.json @@ -16,7 +16,7 @@ "seed": "Semilla", "success": "Éxito", "wallet_key": "Clave de la billetera", - "invalid_animated_qr_code_fragment": "Fragmento inválido de Código QR animado. Por favor intenta de nuevo.", + "invalid_animated_qr_code_fragment" : "Fragmento inválido de Código QR animado. Por favor intenta de nuevo.", "file_saved": "El archivo ({filePath}) se ha guardado en tu carpeta de Descargas.", "discard_changes": "¿Descartar cambios?", "discard_changes_detail": "Tienes cambios no guardados. ¿Estás seguro de descartarlos y salir de la pantalla?" @@ -186,6 +186,7 @@ "details_no_signed_tx": "El archivo seleccionado no contiene una transacción que se pueda importar.", "details_note_placeholder": "Nota personal", "details_scan": "Escanear", + "details_scan_hint": "Toca dos veces para escanear o importar un destino", "details_total_exceeds_balance": "La cantidad de envío excede el saldo disponible.", "details_unrecognized_file_format": "Formato de archivo no reconocido", "details_wallet_before_tx": "Antes de crear una transacción, primero debes agregar una billetera Bitcoin.", @@ -304,7 +305,7 @@ "network_electrum": "Servidor Electrum", "not_a_valid_uri": "URI inválida", "notifications": "Notificaciones", - "open_link_in_explorer": "Abrir enlace en el explorador", + "open_link_in_explorer" : "Abrir enlace en el explorador", "password": "Contraseña", "password_explain": "Crea la contraseña que usarás para desencriptar el almacenamiento", "passwords_do_not_match": "Las contraseñas no coinciden.", @@ -323,7 +324,7 @@ "selfTest": "Auto-Test", "save": "Guardar", "saved": "Guardado", - "success_transaction_broadcasted": "¡Éxito! ¡Tu transacción ha sido transmitida!", + "success_transaction_broadcasted" : "¡Éxito! ¡Tu transacción ha sido transmitida!", "total_balance": "Balance Total", "total_balance_explanation": "Muestra el saldo total de todas tus billeteras en los widgets de tu pantalla de inicio.", "widgets": "Widgets", From 179b519d857c2d020c2966d34c9f9953d1fa7231 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 25 Jun 2021 17:47:15 +0000 Subject: [PATCH 163/327] Translate /loc/en.json in de_DE review completed for the source file '/loc/en.json' on the 'de_DE' language. --- loc/de_de.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/loc/de_de.json b/loc/de_de.json index 5111ad617..8ec6453db 100644 --- a/loc/de_de.json +++ b/loc/de_de.json @@ -16,7 +16,7 @@ "seed": "Seed", "success": "Erfolg", "wallet_key": "Wallet Schlüssel", - "invalid_animated_qr_code_fragment": "Ungültig animiertes QR-Code-Fragment. Bitte erneut versuchen.", + "invalid_animated_qr_code_fragment" : "Ungültig animiertes QR-Code-Fragment. Bitte erneut versuchen.", "file_saved": "Die Datei ({filePath}) wurde in deinen Downloadfolder gespeichert.", "discard_changes": "Änderungen verwerfen?", "discard_changes_detail": "Die nicht gespeicherten Änderungen verwerfen und den Bildschirm verlassen?" @@ -186,6 +186,7 @@ "details_no_signed_tx": "Die ausgewählte Datei enthält keine importierbare signierte Transaktion.", "details_note_placeholder": "Eigene Bezeichnung", "details_scan": "Scannen", + "details_scan_hint": "Zum Importieren / Scannen zweimal tippen", "details_total_exceeds_balance": "Der zu sendende Betrag ist größer als der verfügbare Betrag.", "details_unrecognized_file_format": "Dateiformat unbekannt", "details_wallet_before_tx": "Vor Erstellung einer Transaktion zuerst eine Wallet hinzufügen.", @@ -304,7 +305,7 @@ "network_electrum": "Electrum Server", "not_a_valid_uri": "Keine gültige URL", "notifications": "Benachrichtigungen", - "open_link_in_explorer": "Link in Explorer öffnen", + "open_link_in_explorer" : "Link in Explorer öffnen", "password": "Passwort", "password_explain": "Erstelle das Passwort zum Entschlüsseln des Speichers", "passwords_do_not_match": "Passwörter stimmen nicht überein", @@ -323,7 +324,7 @@ "selfTest": "Selbsttest", "save": "Speichern", "saved": "Gespeichert", - "success_transaction_broadcasted": "Erfolg! Diene Transaktion wurde übertragen.", + "success_transaction_broadcasted" : "Erfolg! Diene Transaktion wurde übertragen.", "total_balance": "Gesamtes Guthaben", "total_balance_explanation": "Zeigt das Wallet Guthaben auf dem Widget deiner Homepage", "widgets": "Widgets", From ac16c0a7b6631a728758a986f725996bf75c2efb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 24 Jun 2021 12:46:08 -0400 Subject: [PATCH 164/327] ADD: Windows --- metro.config.js | 29 ++ package-lock.json | 446 ++++++++++++++++++ package.json | 3 +- windows/.gitignore | 92 ++++ windows/bluewallet.sln | 295 ++++++++++++ windows/bluewallet/.gitignore | 1 + windows/bluewallet/App.cpp | 79 ++++ windows/bluewallet/App.h | 18 + windows/bluewallet/App.idl | 3 + windows/bluewallet/App.xaml | 10 + .../Assets/LockScreenLogo.scale-200.png | Bin 0 -> 1430 bytes .../Assets/SplashScreen.scale-200.png | Bin 0 -> 7700 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 0 -> 2937 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 0 -> 1647 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 0 -> 1255 bytes windows/bluewallet/Assets/StoreLogo.png | Bin 0 -> 1451 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 0 -> 3204 bytes .../bluewallet/AutolinkedNativeModules.g.cpp | 38 ++ .../bluewallet/AutolinkedNativeModules.g.h | 10 + .../AutolinkedNativeModules.g.props | 6 + .../AutolinkedNativeModules.g.targets | 26 + windows/bluewallet/MainPage.cpp | 20 + windows/bluewallet/MainPage.h | 19 + windows/bluewallet/MainPage.idl | 8 + windows/bluewallet/MainPage.xaml | 16 + windows/bluewallet/Package.appxmanifest | 50 ++ windows/bluewallet/PropertySheet.props | 16 + windows/bluewallet/ReactPackageProvider.cpp | 15 + windows/bluewallet/ReactPackageProvider.h | 13 + windows/bluewallet/bluewallet.vcxproj | 195 ++++++++ windows/bluewallet/bluewallet.vcxproj.filters | 63 +++ .../bluewallet/bluewallet_TemporaryKey.pfx | Bin 0 -> 4190 bytes windows/bluewallet/packages.config | 5 + windows/bluewallet/pch.cpp | 1 + windows/bluewallet/pch.h | 26 + 35 files changed, 1502 insertions(+), 1 deletion(-) create mode 100644 metro.config.js create mode 100644 windows/.gitignore create mode 100644 windows/bluewallet.sln create mode 100644 windows/bluewallet/.gitignore create mode 100644 windows/bluewallet/App.cpp create mode 100644 windows/bluewallet/App.h create mode 100644 windows/bluewallet/App.idl create mode 100644 windows/bluewallet/App.xaml create mode 100644 windows/bluewallet/Assets/LockScreenLogo.scale-200.png create mode 100644 windows/bluewallet/Assets/SplashScreen.scale-200.png create mode 100644 windows/bluewallet/Assets/Square150x150Logo.scale-200.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.scale-200.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.targetsize-24_altform-unplated.png create mode 100644 windows/bluewallet/Assets/StoreLogo.png create mode 100644 windows/bluewallet/Assets/Wide310x150Logo.scale-200.png create mode 100644 windows/bluewallet/AutolinkedNativeModules.g.cpp create mode 100644 windows/bluewallet/AutolinkedNativeModules.g.h create mode 100644 windows/bluewallet/AutolinkedNativeModules.g.props create mode 100644 windows/bluewallet/AutolinkedNativeModules.g.targets create mode 100644 windows/bluewallet/MainPage.cpp create mode 100644 windows/bluewallet/MainPage.h create mode 100644 windows/bluewallet/MainPage.idl create mode 100644 windows/bluewallet/MainPage.xaml create mode 100644 windows/bluewallet/Package.appxmanifest create mode 100644 windows/bluewallet/PropertySheet.props create mode 100644 windows/bluewallet/ReactPackageProvider.cpp create mode 100644 windows/bluewallet/ReactPackageProvider.h create mode 100644 windows/bluewallet/bluewallet.vcxproj create mode 100644 windows/bluewallet/bluewallet.vcxproj.filters create mode 100644 windows/bluewallet/bluewallet_TemporaryKey.pfx create mode 100644 windows/bluewallet/packages.config create mode 100644 windows/bluewallet/pch.cpp create mode 100644 windows/bluewallet/pch.h diff --git a/metro.config.js b/metro.config.js new file mode 100644 index 000000000..1b710a4d4 --- /dev/null +++ b/metro.config.js @@ -0,0 +1,29 @@ +/** + * Metro configuration for React Native + * https://github.com/facebook/react-native + * + * @format + */ +const path = require('path'); +const blacklist = require('metro-config/src/defaults/blacklist'); + +module.exports = { + resolver: { + blacklistRE: blacklist([ + // This stops "react-native run-windows" from causing the metro server to crash if its already running + new RegExp( + `${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`, + ), + // This prevents "react-native run-windows" from hitting: EBUSY: resource busy or locked, open msbuild.ProjectImports.zip + /.*\.ProjectImports\.zip/, + ]), + }, + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: false, + }, + }), + }, +}; diff --git a/package-lock.json b/package-lock.json index 1208377ad..8a162e922 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3438,6 +3438,243 @@ "invariant": "^2.2.4" } }, + "@react-native-windows/cli": { + "version": "0.63.12", + "resolved": "https://registry.npmjs.org/@react-native-windows/cli/-/cli-0.63.12.tgz", + "integrity": "sha512-N8cD2SpDqJl8H4z+IvlYIibMEBlcA+KO/2fT80Qz3c303FibPJjxcz2OAYoXMwYXhSsfzJf5mSrCOrmFXTbw0g==", + "requires": { + "@react-native-windows/telemetry": "^0.63.5", + "chalk": "^3.0.0", + "cli-spinners": "^2.2.0", + "envinfo": "^7.5.0", + "find-up": "^4.1.0", + "glob": "^7.1.1", + "inquirer": "^3.0.6", + "mustache": "^4.0.1", + "nuget-exe": "5.8.0", + "ora": "^3.4.0", + "semver": "^7.1.3", + "shelljs": "^0.8.4", + "username": "^5.1.0", + "uuid": "^3.3.2", + "xml-parser": "^1.2.1", + "xmldom": "^0.5.0", + "xpath": "^0.0.27" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "@react-native-windows/telemetry": { + "version": "0.63.5", + "resolved": "https://registry.npmjs.org/@react-native-windows/telemetry/-/telemetry-0.63.5.tgz", + "integrity": "sha512-Ifd54IIcGbPjwAGfjJkRfdk5+SNtc9oCWgKMrJszIrlJ1REYVUXBo+6Xw3taKyA1Jf1eCB7DWlb98/NbqdLgcg==", + "requires": { + "applicationinsights": "^1.8.8" + } + }, "@react-navigation/core": { "version": "5.15.3", "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-5.15.3.tgz", @@ -4211,6 +4448,17 @@ "normalize-path": "^2.1.1" } }, + "applicationinsights": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.8.10.tgz", + "integrity": "sha512-ZLDA7mShh4mP2Z/HlFolmvhBPX1LfnbIWXrselyYVA7EKjHhri1fZzpu2EiWAmfbRxNBY6fRjoPJWbx5giKy4A==", + "requires": { + "cls-hooked": "^4.2.2", + "continuation-local-storage": "^3.2.1", + "diagnostic-channel": "0.3.1", + "diagnostic-channel-publishers": "0.4.4" + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -4570,6 +4818,23 @@ "dev": true, "optional": true }, + "async-hook-jl": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", + "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==", + "requires": { + "stack-chain": "^1.3.7" + } + }, + "async-listener": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", + "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", + "requires": { + "semver": "^5.3.0", + "shimmer": "^1.1.0" + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -6146,6 +6411,16 @@ "shallow-clone": "^3.0.0" } }, + "cls-hooked": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", + "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==", + "requires": { + "async-hook-jl": "^1.7.6", + "emitter-listener": "^1.0.1", + "semver": "^5.4.1" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -6372,6 +6647,15 @@ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, + "continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "requires": { + "async-listener": "^0.6.0", + "emitter-listener": "^1.1.1" + } + }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -6957,6 +7241,19 @@ } } }, + "diagnostic-channel": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.3.1.tgz", + "integrity": "sha512-6eb9YRrimz8oTr5+JDzGmSYnXy5V7YnK5y/hd8AUDK1MssHjQKm9LlD6NSrHx4vMDF3+e/spI2hmWTviElgWZA==", + "requires": { + "semver": "^5.3.0" + } + }, + "diagnostic-channel-publishers": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.4.4.tgz", + "integrity": "sha512-l126t01d2ZS9EreskvEtZPrcgstuvH3rbKy82oUhUrVmBaGx4hO9wECdl3cvZbKDYjMF3QJDB5z5dL9yWAjvZQ==" + }, "diff-sequences": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", @@ -7109,6 +7406,14 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "emitter-listener": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "requires": { + "shimmer": "^1.2.0" + } + }, "emittery": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", @@ -9631,6 +9936,11 @@ "side-channel": "^1.0.4" } }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -14832,6 +15142,14 @@ "tmpl": "1.0.x" } }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -14867,6 +15185,23 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + } + } + }, "merge-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", @@ -15707,6 +16042,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" + }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -15949,6 +16289,11 @@ "boolbase": "~1.0.0" } }, + "nuget-exe": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/nuget-exe/-/nuget-exe-5.8.0.tgz", + "integrity": "sha512-m95SBWa+SJNOfR0GTwdQ3OwK2915Ts3XvajYx0iaOZYydwvz6reJyptiNGf+HQhvTe5viNiRAmGXxNww9obZjw==" + }, "nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", @@ -16311,6 +16656,11 @@ "object-assign": "^4.1.0" } }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, "p-each-series": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", @@ -16322,6 +16672,11 @@ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -17957,6 +18312,32 @@ "version": "git+https://github.com/BlueWallet/react-native-widget-center.git#e2e9a9038b76d096bf929a87105a97a0a7095001", "from": "git+https://github.com/BlueWallet/react-native-widget-center.git#e2e9a9038b76d096bf929a87105a97a0a7095001" }, + "react-native-windows": { + "version": "0.63.35", + "resolved": "https://registry.npmjs.org/react-native-windows/-/react-native-windows-0.63.35.tgz", + "integrity": "sha512-E4J4PQbBV68c95ZZzjotuWOXfrHYJ1Npju9BxQjfvZFwE31cS6963LfSXc/MUeO2fEbyyJFE0CYoOv7B6FzZsg==", + "requires": { + "@babel/runtime": "^7.8.4", + "@react-native-windows/cli": "0.63.12", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "base64-js": "^1.1.2", + "event-target-shim": "^5.0.1", + "fbjs": "^1.0.0", + "fbjs-scripts": "^1.1.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "pretty-format": "^24.9.0", + "promise": "^8.0.3", + "prop-types": "^15.7.2", + "react-devtools-core": "^4.6.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.19.1", + "stacktrace-parser": "^0.1.3", + "use-subscription": "^1.0.0", + "whatwg-fetch": "^3.0.0" + } + }, "react-refresh": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", @@ -18190,6 +18571,14 @@ "node-fetch": "^2.6.0" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -18762,6 +19151,16 @@ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", @@ -18769,6 +19168,11 @@ "dev": true, "optional": true }, + "shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -19080,6 +19484,11 @@ "tweetnacl": "~0.14.0" } }, + "stack-chain": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", + "integrity": "sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=" + }, "stack-utils": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", @@ -20111,6 +20520,15 @@ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", "dev": true }, + "username": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz", + "integrity": "sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==", + "requires": { + "execa": "^1.0.0", + "mem": "^4.3.0" + } + }, "utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", @@ -20456,6 +20874,29 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xml-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/xml-parser/-/xml-parser-1.2.1.tgz", + "integrity": "sha1-wx9MNPKXXbgq0BMiISBZJzYVb80=", + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "xmlbuilder": { "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", @@ -20480,6 +20921,11 @@ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==" }, + "xpath": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", + "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==" + }, "xpipe": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/xpipe/-/xpipe-1.0.5.tgz", diff --git a/package.json b/package.json index 9bbaa40e6..b386718f5 100644 --- a/package.json +++ b/package.json @@ -177,7 +177,8 @@ "stream-browserify": "2.0.2", "url": "0.11.0", "util": "0.12.4", - "wif": "2.0.6" + "wif": "2.0.6", + "react-native-windows": "0.63.0-0" }, "react-native": { "crypto": "react-native-crypto", diff --git a/windows/.gitignore b/windows/.gitignore new file mode 100644 index 000000000..878f7ba59 --- /dev/null +++ b/windows/.gitignore @@ -0,0 +1,92 @@ +*AppPackages* +*BundleArtifacts* + +#OS junk files +[Tt]humbs.db +*.DS_Store + +#Visual Studio files +*.[Oo]bj +*.user +*.aps +*.pch +*.vspscc +*.vssscc +*_i.c +*_p.c +*.ncb +*.suo +*.tlb +*.tlh +*.bak +*.[Cc]ache +*.ilk +*.log +*.lib +*.sbr +*.sdf +*.opensdf +*.opendb +*.unsuccessfulbuild +ipch/ +[Oo]bj/ +[Bb]in +[Dd]ebug*/ +[Rr]elease*/ +Ankh.NoLoad + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +#MonoDevelop +*.pidb +*.userprefs + +#Tooling +_ReSharper*/ +*.resharper +[Tt]est[Rr]esult* +*.sass-cache + +#Project files +[Bb]uild/ + +#Subversion files +.svn + +# Office Temp Files +~$* + +# vim Temp Files +*~ + +#NuGet +packages/ +*.nupkg + +#ncrunch +*ncrunch* +*crunch*.local.xml + +# visual studio database projects +*.dbmdl + +#Test files +*.testsettings + +#Other files +*.DotSettings +.vs/ +*project.lock.json + +#Files generated by the VS build +**/Generated Files/** + diff --git a/windows/bluewallet.sln b/windows/bluewallet.sln new file mode 100644 index 000000000..8872e18d8 --- /dev/null +++ b/windows/bluewallet.sln @@ -0,0 +1,295 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29215.179 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bluewallet", "bluewallet\bluewallet.vcxproj", "{79725546-EC43-45DE-9048-6D0B2B6D376E}" + ProjectSection(ProjectDependencies) = postProject + {F7D32BD0-2749-483E-9A0D-1635EF7E3136} = {F7D32BD0-2749-483E-9A0D-1635EF7E3136} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Folly", "..\node_modules\react-native-windows\Folly\Folly.vcxproj", "{A990658C-CE31-4BCC-976F-0FC6B1AF693D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactCommon", "..\node_modules\react-native-windows\ReactCommon\ReactCommon.vcxproj", "{A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}" + ProjectSection(ProjectDependencies) = postProject + {A990658C-CE31-4BCC-976F-0FC6B1AF693D} = {A990658C-CE31-4BCC-976F-0FC6B1AF693D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra", "..\node_modules\react-native-windows\Chakra\Chakra.vcxitems", "{C38970C0-5FBF-4D69-90D8-CBAC225AE895}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative", "..\node_modules\react-native-windows\Microsoft.ReactNative\Microsoft.ReactNative.vcxproj", "{F7D32BD0-2749-483E-9A0D-1635EF7E3136}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JSI.Shared", "..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems", "{0CC28589-39E4-4288-B162-97B959F8B843}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JSI.Universal", "..\node_modules\react-native-windows\JSI\Universal\JSI.Universal.vcxproj", "{A62D504A-16B8-41D2-9F19-E2E86019E5E4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative.Cxx", "..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems", "{DA8B35B3-DA00-4B02-BDE6-6A397B3FD46B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "..\node_modules\react-native-windows\Common\Common.vcxproj", "{FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ReactNative", "ReactNative", "{5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative.Shared", "..\node_modules\react-native-windows\Shared\Shared.vcxitems", "{2049DBE9-8D13-42C9-AE4B-413AE38FFFD0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Mso", "..\node_modules\react-native-windows\Mso\Mso.vcxitems", "{84E05BFA-CBAF-4F0D-BFB6-4CE85742A57E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Include", "..\node_modules\react-native-windows\include\Include.vcxitems", "{EF074BA1-2D54-4D49-A28E-5E040B47CD2E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactNativeAsyncStorage", "../node_modules/@react-native-async-storage/async-storage/windows/ReactNativeAsyncStorage/ReactNativeAsyncStorage.vcxproj", "{4855D892-E16C-404D-8286-0089E0F7F9C4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactNativeCameraCPP", "../node_modules/react-native-camera/windows/ReactNativeCameraCPP/ReactNativeCameraCPP.vcxproj", "{7432C343-CC07-4BC7-9BD0-8C467BE0F018}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RNDeviceInfoCPP", "../node_modules/react-native-device-info/windows/RNDeviceInfoCPP/RNDeviceInfoCPP.vcxproj", "{3E3931F2-4735-4417-8CB0-33668A7314D6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RNLocalize", "../node_modules/react-native-localize/windows/RNLocalize/RNLocalize.vcxproj", "{10E2379C-4264-444A-8656-B3D7E83ACB44}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactNativeWebView", "../node_modules/react-native-webview/windows/ReactNativeWebView/ReactNativeWebView.vcxproj", "{729D9AF8-CD9E-4427-9F6C-FB757E287729}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WebViewBridgeComponent", "../node_modules/react-native-webview/windows/WebViewBridgeComponent/WebViewBridgeComponent.vcxproj", "{FCB612AD-FACC-410C-828C-24B5940B2762}" +EndProject +Global + GlobalSection(SharedMSBuildProjectFiles) = preSolution + ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{0cc28589-39e4-4288-b162-97b959f8b843}*SharedItemsImports = 9 + ..\node_modules\react-native-windows\Shared\Shared.vcxitems*{2049dbe9-8d13-42c9-ae4b-413ae38fffd0}*SharedItemsImports = 9 + ..\node_modules\react-native-windows\Mso\Mso.vcxitems*{84e05bfa-cbaf-4f0d-bfb6-4ce85742a57e}*SharedItemsImports = 9 + ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{a62d504a-16b8-41d2-9f19-e2e86019e5e4}*SharedItemsImports = 4 + ..\node_modules\react-native-windows\Chakra\Chakra.vcxitems*{c38970c0-5fbf-4d69-90d8-cbac225ae895}*SharedItemsImports = 9 + ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{da8b35b3-da00-4b02-bde6-6a397b3fd46b}*SharedItemsImports = 9 + ..\node_modules\react-native-windows\include\Include.vcxitems*{ef074ba1-2d54-4d49-a28e-5e040b47cd2e}*SharedItemsImports = 9 + ..\node_modules\react-native-windows\Chakra\Chakra.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4 + ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4 + ..\node_modules\react-native-windows\Mso\Mso.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4 + ..\node_modules\react-native-windows\Shared\Shared.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4 + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|ARM.ActiveCfg = Debug|ARM + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|ARM.Build.0 = Debug|ARM + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|ARM.Deploy.0 = Debug|ARM + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|ARM64.Build.0 = Debug|ARM64 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|x64.ActiveCfg = Debug|x64 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|x64.Build.0 = Debug|x64 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|x64.Deploy.0 = Debug|x64 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|x86.ActiveCfg = Debug|Win32 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|x86.Build.0 = Debug|Win32 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|x86.Deploy.0 = Debug|Win32 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|ARM.ActiveCfg = Release|ARM + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|ARM.Build.0 = Release|ARM + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|ARM.Deploy.0 = Release|ARM + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|ARM64.ActiveCfg = Release|ARM64 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|ARM64.Build.0 = Release|ARM64 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|ARM64.Deploy.0 = Release|ARM64 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|x64.ActiveCfg = Release|x64 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|x64.Build.0 = Release|x64 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|x64.Deploy.0 = Release|x64 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|x86.ActiveCfg = Release|Win32 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|x86.Build.0 = Release|Win32 + {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|x86.Deploy.0 = Release|Win32 + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.ActiveCfg = Debug|ARM + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.Build.0 = Debug|ARM + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.Build.0 = Debug|ARM64 + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x64.ActiveCfg = Debug|x64 + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x64.Build.0 = Debug|x64 + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x86.ActiveCfg = Debug|Win32 + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x86.Build.0 = Debug|Win32 + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM.ActiveCfg = Release|ARM + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM.Build.0 = Release|ARM + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM64.ActiveCfg = Release|ARM64 + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM64.Build.0 = Release|ARM64 + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x64.ActiveCfg = Release|x64 + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x64.Build.0 = Release|x64 + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x86.ActiveCfg = Release|Win32 + {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x86.Build.0 = Release|Win32 + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM.ActiveCfg = Debug|ARM + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM.Build.0 = Debug|ARM + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM64.Build.0 = Debug|ARM64 + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x64.ActiveCfg = Debug|x64 + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x64.Build.0 = Debug|x64 + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x86.ActiveCfg = Debug|Win32 + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x86.Build.0 = Debug|Win32 + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM.ActiveCfg = Release|ARM + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM.Build.0 = Release|ARM + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM64.ActiveCfg = Release|ARM64 + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM64.Build.0 = Release|ARM64 + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x64.ActiveCfg = Release|x64 + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x64.Build.0 = Release|x64 + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x86.ActiveCfg = Release|Win32 + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x86.Build.0 = Release|Win32 + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM.ActiveCfg = Debug|ARM + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM.Build.0 = Debug|ARM + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM64.Build.0 = Debug|ARM64 + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x64.ActiveCfg = Debug|x64 + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x64.Build.0 = Debug|x64 + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x86.ActiveCfg = Debug|Win32 + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x86.Build.0 = Debug|Win32 + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM.ActiveCfg = Release|ARM + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM.Build.0 = Release|ARM + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM64.ActiveCfg = Release|ARM64 + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM64.Build.0 = Release|ARM64 + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x64.ActiveCfg = Release|x64 + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x64.Build.0 = Release|x64 + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x86.ActiveCfg = Release|Win32 + {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x86.Build.0 = Release|Win32 + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM.ActiveCfg = Debug|ARM + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM.Build.0 = Debug|ARM + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|ARM64.Build.0 = Debug|ARM64 + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x64.ActiveCfg = Debug|x64 + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x64.Build.0 = Debug|x64 + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x86.ActiveCfg = Debug|Win32 + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Debug|x86.Build.0 = Debug|Win32 + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM.ActiveCfg = Release|ARM + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM.Build.0 = Release|ARM + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM64.ActiveCfg = Release|ARM64 + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|ARM64.Build.0 = Release|ARM64 + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x64.ActiveCfg = Release|x64 + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x64.Build.0 = Release|x64 + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x86.ActiveCfg = Release|Win32 + {A62D504A-16B8-41D2-9F19-E2E86019E5E4}.Release|x86.Build.0 = Release|Win32 + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM.ActiveCfg = Debug|ARM + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM.Build.0 = Debug|ARM + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM64.Build.0 = Debug|ARM64 + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x64.ActiveCfg = Debug|x64 + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x64.Build.0 = Debug|x64 + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x86.ActiveCfg = Debug|Win32 + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x86.Build.0 = Debug|Win32 + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM.ActiveCfg = Release|ARM + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM.Build.0 = Release|ARM + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM64.ActiveCfg = Release|ARM64 + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM64.Build.0 = Release|ARM64 + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.ActiveCfg = Release|x64 + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.Build.0 = Release|x64 + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.ActiveCfg = Release|Win32 + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.Build.0 = Release|Win32 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|ARM.ActiveCfg = Debug|ARM + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|ARM.Build.0 = Debug|ARM + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|ARM64.Build.0 = Debug|ARM64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|x64.ActiveCfg = Debug|x64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|x64.Build.0 = Debug|x64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|x86.ActiveCfg = Debug|Win32 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|x86.Build.0 = Debug|Win32 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|ARM.ActiveCfg = Release|ARM + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|ARM.Build.0 = Release|ARM + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|ARM64.ActiveCfg = Release|ARM64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|ARM64.Build.0 = Release|ARM64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|x64.ActiveCfg = Release|x64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|x64.Build.0 = Release|x64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|x86.ActiveCfg = Release|Win32 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|x86.Build.0 = Release|Win32 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|ARM.ActiveCfg = Debug|ARM + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|ARM.Build.0 = Debug|ARM + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|ARM64.Build.0 = Debug|ARM64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|x64.ActiveCfg = Debug|x64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|x64.Build.0 = Debug|x64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|x86.ActiveCfg = Debug|Win32 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|x86.Build.0 = Debug|Win32 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|ARM.ActiveCfg = Release|ARM + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|ARM.Build.0 = Release|ARM + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|ARM64.ActiveCfg = Release|ARM64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|ARM64.Build.0 = Release|ARM64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|x64.ActiveCfg = Release|x64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|x64.Build.0 = Release|x64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|x86.ActiveCfg = Release|Win32 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|x86.Build.0 = Release|Win32 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|ARM.ActiveCfg = Debug|ARM + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|ARM.Build.0 = Debug|ARM + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|ARM64.Build.0 = Debug|ARM64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|x64.ActiveCfg = Debug|x64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|x64.Build.0 = Debug|x64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|x86.ActiveCfg = Debug|Win32 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|x86.Build.0 = Debug|Win32 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|ARM.ActiveCfg = Release|ARM + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|ARM.Build.0 = Release|ARM + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|ARM64.ActiveCfg = Release|ARM64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|ARM64.Build.0 = Release|ARM64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|x64.ActiveCfg = Release|x64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|x64.Build.0 = Release|x64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|x86.ActiveCfg = Release|Win32 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|x86.Build.0 = Release|Win32 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|ARM.ActiveCfg = Debug|ARM + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|ARM.Build.0 = Debug|ARM + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|ARM64.Build.0 = Debug|ARM64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|x64.ActiveCfg = Debug|x64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|x64.Build.0 = Debug|x64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|x86.ActiveCfg = Debug|Win32 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|x86.Build.0 = Debug|Win32 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|ARM.ActiveCfg = Release|ARM + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|ARM.Build.0 = Release|ARM + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|ARM64.ActiveCfg = Release|ARM64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|ARM64.Build.0 = Release|ARM64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|x64.ActiveCfg = Release|x64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|x64.Build.0 = Release|x64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|x86.ActiveCfg = Release|Win32 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|x86.Build.0 = Release|Win32 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|ARM.ActiveCfg = Debug|ARM + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|ARM.Build.0 = Debug|ARM + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|ARM64.Build.0 = Debug|ARM64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|x64.ActiveCfg = Debug|x64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|x64.Build.0 = Debug|x64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|x86.ActiveCfg = Debug|Win32 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|x86.Build.0 = Debug|Win32 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|ARM.ActiveCfg = Release|ARM + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|ARM.Build.0 = Release|ARM + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|ARM64.ActiveCfg = Release|ARM64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|ARM64.Build.0 = Release|ARM64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|x64.ActiveCfg = Release|x64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|x64.Build.0 = Release|x64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|x86.ActiveCfg = Release|Win32 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|x86.Build.0 = Release|Win32 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|ARM.ActiveCfg = Debug|ARM + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|ARM.Build.0 = Debug|ARM + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|ARM64.Build.0 = Debug|ARM64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|x64.ActiveCfg = Debug|x64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|x64.Build.0 = Debug|x64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|x86.ActiveCfg = Debug|Win32 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|x86.Build.0 = Debug|Win32 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|ARM.ActiveCfg = Release|ARM + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|ARM.Build.0 = Release|ARM + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|ARM64.ActiveCfg = Release|ARM64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|ARM64.Build.0 = Release|ARM64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|x64.ActiveCfg = Release|x64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|x64.Build.0 = Release|x64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|x86.ActiveCfg = Release|Win32 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {A990658C-CE31-4BCC-976F-0FC6B1AF693D} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1} + {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1} + {C38970C0-5FBF-4D69-90D8-CBAC225AE895} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1} + {F7D32BD0-2749-483E-9A0D-1635EF7E3136} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1} + {0CC28589-39E4-4288-B162-97B959F8B843} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1} + {A62D504A-16B8-41D2-9F19-E2E86019E5E4} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1} + {DA8B35B3-DA00-4B02-BDE6-6A397B3FD46B} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1} + {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1} + {2049DBE9-8D13-42C9-AE4B-413AE38FFFD0} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1} + {84E05BFA-CBAF-4F0D-BFB6-4CE85742A57E} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1} + {EF074BA1-2D54-4D49-A28E-5E040B47CD2E} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D43FAD39-F619-437D-BB40-04A3982ACB6A} + EndGlobalSection +EndGlobal diff --git a/windows/bluewallet/.gitignore b/windows/bluewallet/.gitignore new file mode 100644 index 000000000..cd828d9fc --- /dev/null +++ b/windows/bluewallet/.gitignore @@ -0,0 +1 @@ +/Bundle diff --git a/windows/bluewallet/App.cpp b/windows/bluewallet/App.cpp new file mode 100644 index 000000000..5fa7a87b1 --- /dev/null +++ b/windows/bluewallet/App.cpp @@ -0,0 +1,79 @@ +#include "pch.h" + +#include "App.h" + +#include "AutolinkedNativeModules.g.h" +#include "ReactPackageProvider.h" + +using namespace winrt::bluewallet; +using namespace winrt::bluewallet::implementation; +using namespace winrt; +using namespace Windows::UI::Xaml; +using namespace Windows::UI::Xaml::Controls; +using namespace Windows::UI::Xaml::Navigation; +using namespace Windows::ApplicationModel; + +/// +/// Initializes the singleton application object. This is the first line of +/// authored code executed, and as such is the logical equivalent of main() or +/// WinMain(). +/// +App::App() noexcept +{ +#if BUNDLE + JavaScriptBundleFile(L"index.windows"); + InstanceSettings().UseWebDebugger(false); + InstanceSettings().UseFastRefresh(false); +#else + JavaScriptMainModuleName(L"index"); + InstanceSettings().UseWebDebugger(true); + InstanceSettings().UseFastRefresh(true); +#endif + +#if _DEBUG + InstanceSettings().UseDeveloperSupport(true); +#else + InstanceSettings().UseDeveloperSupport(false); +#endif + + RegisterAutolinkedNativeModulePackages(PackageProviders()); // Includes any autolinked modules + + PackageProviders().Append(make()); // Includes all modules in this project + + InitializeComponent(); +} + +/// +/// Invoked when the application is launched normally by the end user. Other entry points +/// will be used such as when the application is launched to open a specific file. +/// +/// Details about the launch request and process. +void App::OnLaunched(activation::LaunchActivatedEventArgs const& e) +{ + super::OnLaunched(e); + + Frame rootFrame = Window::Current().Content().as(); + rootFrame.Navigate(xaml_typename(), box_value(e.Arguments())); +} + +/// +/// Invoked when application execution is being suspended. Application state is saved +/// without knowing whether the application will be terminated or resumed with the contents +/// of memory still intact. +/// +/// The source of the suspend request. +/// Details about the suspend request. +void App::OnSuspending([[maybe_unused]] IInspectable const& sender, [[maybe_unused]] SuspendingEventArgs const& e) +{ + // Save application state and stop any background activity +} + +/// +/// Invoked when Navigation to a certain page fails +/// +/// The Frame which failed navigation +/// Details about the navigation failure +void App::OnNavigationFailed(IInspectable const&, NavigationFailedEventArgs const& e) +{ + throw hresult_error(E_FAIL, hstring(L"Failed to load Page ") + e.SourcePageType().Name); +} diff --git a/windows/bluewallet/App.h b/windows/bluewallet/App.h new file mode 100644 index 000000000..820f7d6d5 --- /dev/null +++ b/windows/bluewallet/App.h @@ -0,0 +1,18 @@ +#pragma once + +#include "App.xaml.g.h" + +namespace activation = winrt::Windows::ApplicationModel::Activation; + +namespace winrt::bluewallet::implementation +{ + struct App : AppT + { + App() noexcept; + void OnLaunched(activation::LaunchActivatedEventArgs const&); + void OnSuspending(IInspectable const&, Windows::ApplicationModel::SuspendingEventArgs const&); + void OnNavigationFailed(IInspectable const&, Windows::UI::Xaml::Navigation::NavigationFailedEventArgs const&); + private: + using super = AppT; + }; +} // namespace winrt::bluewallet::implementation diff --git a/windows/bluewallet/App.idl b/windows/bluewallet/App.idl new file mode 100644 index 000000000..32821a84a --- /dev/null +++ b/windows/bluewallet/App.idl @@ -0,0 +1,3 @@ +namespace bluewallet +{ +} diff --git a/windows/bluewallet/App.xaml b/windows/bluewallet/App.xaml new file mode 100644 index 000000000..a2ee3247f --- /dev/null +++ b/windows/bluewallet/App.xaml @@ -0,0 +1,10 @@ + + + + + diff --git a/windows/bluewallet/Assets/LockScreenLogo.scale-200.png b/windows/bluewallet/Assets/LockScreenLogo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..735f57adb5dfc01886d137b4e493d7e97cf13af3 GIT binary patch literal 1430 zcmaJ>TTC2P7~aKltDttVHYH6u8Io4i*}3fO&d$gd*bA_<3j~&e7%8(eXJLfhS!M@! zKrliY>>6yT4+Kr95$!DoD(Qn-5TP|{V_KS`k~E6(LGS@#`v$hQo&^^BKsw3HIsZBT z_y6C2n`lK@apunKojRQ^(_P}Mgewt$(^BBKCTZ;*xa?J3wQ7~@S0lUvbcLeq1Bg4o zH-bvQi|wt~L7q$~a-gDFP!{&TQfc3fX*6=uHv* zT&1&U(-)L%Xp^djI2?~eBF2cxC@YOP$+9d?P&h?lPy-9M2UT9fg5jKm1t$m#iWE{M zIf%q9@;fyT?0UP>tcw-bLkz;s2LlKl2qeP0w zECS7Ate+Awk|KQ+DOk;fl}Xsy4o^CY=pwq%QAAKKl628_yNPsK>?A>%D8fQG6IgdJ ztnxttBz#NI_a@fk7SU`WtrpsfZsNs9^0(2a z@C3#YO3>k~w7?2hipBf{#b6`}Xw1hlG$yi?;1dDs7k~xDAw@jiI*+tc;t2Lflg&bM)0!Y;0_@=w%`LW^8DsYpS#-bLOklX9r?Ei}TScw|4DbpW%+7 zFgAI)f51s}{y-eWb|vrU-Ya!GuYKP)J7z#*V_k^Xo>4!1Yqj*m)x&0L^tg3GJbVAJ zJ-Pl$R=NAabouV=^z_t;^K*0AvFs!vYU>_<|I^#c?>>CR<(T?=%{;U=aI*SbZADLH z&(f2wz_Y0??Tf|g;?|1Znw6}6U43Q#qNRwv1vp9uFn1)V#*4p&%$mP9x&15^OaBiDS(XppT|z^>;B{PLVEbS3IFYV yGvCsSX*m literal 0 HcmV?d00001 diff --git a/windows/bluewallet/Assets/SplashScreen.scale-200.png b/windows/bluewallet/Assets/SplashScreen.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..023e7f1feda78d5100569825acedfd213a0d84e9 GIT binary patch literal 7700 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 literal 0 HcmV?d00001 diff --git a/windows/bluewallet/Assets/Square150x150Logo.scale-200.png b/windows/bluewallet/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..af49fec1a5484db1d52a7f9b5ec90a27c7030186 GIT binary patch literal 2937 zcma)84OCO-8BSud5)jwMLRVKgX(S?$n?Ld|vrsm<$CF7)&zTbyy1FE5bU`Q17MRv`9ue$;R(@8kR;#vJ*IM0>cJIAOte!d7oRgdH zd%ySjdB6L9=gX^A6)VzH7p2l@v~3zJAMw|DFy#^)F@@F*`mqUn=Il>l)8_+ab;nOW{%+iPx z+s{Eu|&pIs)Z7{La9~?xKfyl z#43?gjEL15d4WbOZo#SiP%>DB^+BcnJ=7dHEe;r#G=tuw|ka z%q@}##Uh7;tc%L_64m(kHtw74ty%BJMb)_1)#S0j`)F8_1jF7vScpsnH=0V19bO8y zR`0SjIdCUo&=>JwMQF8KHA<{ODHTiQh}0^@5QRmCA?gOH6_H3K^-_sNB^RrdNuK-R zOO*vOrKCVvDwgUck`kF(E7j{I#iiN;b*ZdCt4m@HPA`EuEqGGf4%!K<;(=I=&Vyrw z%TwcWtxa}8mCZ%Cyf&ActJ6_$ox5z6-D!0-dvnRx6t7y3d+h6QYpKWO;8OdnvERo7 zuEf>ih5`wqY)~o@OeVt-wM?Q!>QzdGRj!bz6fzYrfw$hZfAKzr2-M+D+R>}~oT574c;_3zquHcElqKIsryILt3g8n3jcMb+j?i?-L3FpZJ z2WRVBRdDPc+G5aaYg#5hpE+6nQ|(VSoxT3|biF;BUq#==-27Xi=gihDPYP$7?=9cP zYKE$jeQ|3~_L0VG-(F~2ZPyD0=k{J4Q~h(t__{-mz_w8{JDY9{`1ouzz!Vr5!ECdE z6U~O1k8c}24V7~zzXWTV-Pe4)y}wQJS&q%H5`Fo_f_JvIU489aCX$;P`u#!I-=^4ijC2{&9!O&h>mi?9oYD=GC#%)6{GzN6nQYw+Fal50!#x^asjBBR50i`+mho*ttoqV)ubM2KD9S~k7+FR4>{29?6 z{!l6kDdyTN0YJ9LgkPWeXm|gyi@zM3?0@{&pXT12w|78&W-q!RRF)&iLCEZVH<|fR zN0fr2^t8H(>L?>K#>^+jWROLral(Qy-xoBq1U7A&DV||wClb)Otd9?(gZ|8znMF}D zf<1haWz^s0qgecz;RFGt0C-B4g`jNGHsFU+;{<%t65v^sjk^h$lmWn#B0#_)9ij&d z-~lc`A)YYExi^7sBuPM^Y|wA2g*5?`K?#7tzELQYNxGo$UB$4J8RJp1k(8Jj+~hMT zlN~>M@KTTh^--8y3PK_NZ@AC!{PT=CziBzGd+wTJ^@icH!Bd}%)g8V)%K?|c&WTUk zy}qv1C%(fjRoZ4ozC3{O%@5?)XzH35zHns$pgU*Q?fj4v?fp1Qbm+j;3l;9jam9Da zXVcKjPlQ73x78QPu|Ffm6x?`~e3oD=gl=4kYK?={kD5j~QCXU)`HSdduNNENzA*2$ zOm3PzF!lN5e*06-f1Uot67wY#{o-S1!KZ7E=!~7ynnk9_iJR#kFoNbAOT#^2Gd17F zMmvU6>lndZQGd|ax9kUoXXO+$N?|j@6qpsF&_j7YXvwo_C{JpmLw5&#e6k>atv%es z5)7r*Wvv_JkUpT}M!_o!nVlEk1Zbl=a*2hQ*<|%*K1Glj^FcF`6kTzGQ3lz~2tCc@ z&x|tj;aH&1&9HwcJBcT`;{?a+pnej;M1HO(6Z{#J!cZA04hnFl;NXA+&`=7bjW_^o zfC40u3LMG?NdPtwGl>Tq6u}*QG)}-y;)lu-_>ee3kibW(69n0$0Zy!}9rQz%*v1iO zT9_H>99yIrSPYVy6^);rR}7Yo=J_T@hi+qhTZXnVWyf;JDYm5#eYLTxr*?kiNn!+Y zQ+LUkBafNJ#rH#C(?d5^;gw9o#%daEI{mA*LHPIHPU`#|H$hD zwm>0&+kahQ)E#%~k>&5@&#Vg82H?s%71=)(soi@174pi9--2{w{1$}Sz4zGn3Du&x bht0Iza^2ykEt4(epJ78uh5nDlX8(TxzDYwP literal 0 HcmV?d00001 diff --git a/windows/bluewallet/Assets/Square44x44Logo.scale-200.png b/windows/bluewallet/Assets/Square44x44Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..ce342a2ec8a61291ba76c54604aea7e9d20af11b GIT binary patch literal 1647 zcmaJ?eM}Q)7(e+G1Q(|`V9JhTI2>MkceK4;p;PR&$Pi?ejk3YQ_3o`S&|W_dsOZ8# zWPTt69g`t$ab`0cj-Y0yiBSOqmd)tG7G(}M5aP0_%&9TijB#&)I{zSE^4@#z^FF`l z`8{8`o%wlL(UI|y2!cdsuVamHH~H86F!*-15em4)NqUpCQM5?aoC_eCf@lV4wvF2a zjDQn1JBL69f&@2M3rvzJcfE!eZ8FZUBlFlC5RD)it33{mF9#B82AiyQE%w)`vlwa> zv{<1sm&kSKK$&%2jSFn7$t&P%%6Ue>R=EAnG8N7fqynWG8L3p!4801a;8{+nliO(qd(jNJ_?+9W3#hLIDLoT6~3fx9=`CC-D}-AMrpEO7HK zt3$GicGPc?GmDjy7K2P@La;eu4!$zWCZ`ym{Z$b zu-O6RM&K4JT|BIZB`E-gxqG%FzanI#+2FFmqHqXG7yxWB=w55RGOM)$xMb(>kSNR z2w=1AZi%z=AmG~yea~XaXJR!v7vLn(RUnELfiB1|6D84ICOS}^Zo2AdN}<&*h}G_u z{xZ!(%>tLT3J3<5XhWy-tg+6)0nmUUENLW8TWA{R6bgVd3X;anYFZ^IRis*_P-C-r z;i>%1^eL3UI2-{w8nuFFcs0e~7J{O2k^~Ce%+Ly4U?|=!0LH=t6()xi<^I-rs+9sF z*q{E-CxZbGPeu#a;XJwE;9S1?#R&uns>^0G3p`hEUF*v`M?@h%T%J%RChmD|EVydq zmHWh*_=S%emRC*mhxaVLzT@>Z2SX0u9v*DIJ@WC^kLVdlGV6LpK$KIrlJqc zpJ921)+3JJdTx|<`G&kXpKkjGJv=76R`yYIQ{#c-`%+`#V(7}Q;&@6U8!Td1`d;?N z_9mnI#?AA}4J!r)LN4!E-@H5eXauuB7TOawS>Y|{-P?NNx-lq+z1W-+y(;39P&&LP zL{N80?&=C*qKmdA^moMZRuPcD!B<*mq$ch=0Cnlitw#txRWhb3%TQvPqjkC`F69G4b! ze7z9MZ#+;_#l?H37UqUhDFb^l&s2{oM$3I0o^Q!yx;;V)QmCMo)Tb_ui|mit8MS?U zm##6$sZZ1$@|s%?l@>4Z<*Q}sRBSKMhb4I{e5LdEhsHIHTe8Bod5c>6QtT>$XgUBz z6MK`kO$=jmt@FqggOhJ5j~e@ygRbG;<{Vu)*+nn9aQeo0;$#j;|MS=S$&L?BeV25z xs3B`@=#`5TF{^6(A1rvdY@|-RtQ|iS5{tyX+wH?;n8E)G$kykv-D^wh{{!TZT%7;_ literal 0 HcmV?d00001 diff --git a/windows/bluewallet/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/windows/bluewallet/Assets/Square44x44Logo.targetsize-24_altform-unplated.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c02ce97e0a802b85f6021e822c89f8bf57d5cd GIT binary patch literal 1255 zcmaJ>TWs4@7*5+{G#S+&C!qC#> zf>5N3P6jO*Cz>ug*(_DmW=)kea&m$gZ^+nyiF`;j%w@}y8)>p*SH}C`m?DXeieF2U zyQHecc_L%Gh!7GMt+hG06y;+|p4>m~}PjA}rKViGiEnn7G0ZO<>G|7q;2?NwGCM3s?eued6%hd$B+ z*kQJ{#~$S=DFE(%=E+UkmlEI*%3llUf~8Ja9YU1Vui0IbGBkW_gHB%Rd&!!ioX zs40O?i9I{};kle7GMvE7(rk`la=gTI)47=>%?q@^iL-nUo3}h4S}N-KHn8t5mVP8w z&bSErwp+37 zNJJ8?a|{r5Q3R0Z5s-LB1WHOwYC@7pCHWND#cL1cZ?{kJ368_*(UDWUDyb<}0y@o# zfMF016iMWPCb6obAxT$JlB6(2DrlXDTB&!0`!m??4F(qWMhjVZo?JXQmz`1*58Z=& zcDmB|S-E@j?BoFGix0flckqdS4jsPNzhfWyWIM98GxcLs89C(~dw%$_t;JjX-SD}E zfiGV;{8Q%8r}w9x>EEigW81>`kvnU@pK)4+xk9@+bNj9L!AAZ@SZ@q|)&BmY3+HZx zul~BeG4|}-;L%cHViQGQX?^zFfO0&#cHwel=d`lH9sJ-@Sl@n*(8J2>%Ac`IxyY?Q z{=GhWvC#gu-~Ia7*n{=+;qM?Ul_wy1+u7ho;=`>EwP^g~R@{unBds`!#@}tluZQpS zm)M~nYEifJWJGx?_6DcTy>#uh%>!H9=hb^(v`=m3F1{L>db=<5_tm+_&knAQ2EU$s Mu9UqpbNZeC0BbUo^Z)<= literal 0 HcmV?d00001 diff --git a/windows/bluewallet/Assets/StoreLogo.png b/windows/bluewallet/Assets/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..7385b56c0e4d3c6b0efe3324aa1194157d837826 GIT binary patch literal 1451 zcmaJ>eN5D57_Z|bH;{0+1#mbl)eTU3{h)Wf7EZV?;HD@XL@{B`Ui%(2aMxQ~xdXSv z5nzWi(LW)U2=Vc-cY@s7nPt{i0hc6!7xN4NNHI#EQl>YNBy8l4%x9gr_W-j zEZMQmmTIy(>;lblRfh`dIyTgc9W5d!VP$L4(kKrN1c5G~(O_#xG zAJCNTstD^5SeXFB+&$h=ToJP2H>xr$iqPs-#O*;4(!Fjw25-!gEb*)mU}=)J;Iu>w zxK(5XoD0wrPSKQ~rbL^Cw6O_03*l*}i=ydbu7adJ6y;%@tjFeXIXT+ms30pmbOP%Q zX}S;+LBh8Tea~TSkHzvX6$rYb)+n&{kSbIqh|c7hmlxmwSiq5iVhU#iEQ<>a18|O^Sln-8t&+t`*{qBWo5M?wFM(JuimAOb5!K#D}XbslM@#1ZVz_;!9U zpfEpLAOz=0g@bd6Xj_ILi-x^!M}73h^o@}hM$1jflTs|Yuj9AL@A3<-?MV4!^4q`e z)fO@A;{9K^?W?DbnesnPr6kK>$zaKo&;FhFd(GYFCIU^T+OIMb%Tqo+P%oq(IdX7S zf6+HLO?7o0m+p>~Tp5UrXWh!UH!wZ5kv!E`_w)PTpI(#Iw{AS`gH4^b(bm^ZCq^FZ zY9DD7bH}rq9mg88+KgA$Zp!iWncuU2n1AuIa@=sWvUR-s`Qb{R*kk(SPU^`$6BXz8 zn#7yaFOIK%qGxyi`dYtm#&qqox0$h=pNi#u=M8zUG@bpiZ=3sT=1}Trr}39cC)H|v zbL?W)=&s4zrh)7>L(|cc%$1#!zfL?HjpeP%T+x_a+jZ16b^iKOHxFEX$7d|8${H-* zIrOJ5w&i$>*D>AKaIoYg`;{L@jM((Kt?$N$5OnuPqVvq**Nm}(f0wwOF%iX_Pba;V z;m@wxX&NcV3?<1+u?A{y_DIj7#m3Af1rCE)o`D&Y3}0%7E;iX1yMDiS)sh0wKi!36 zL!Wmq?P^Ku&rK~HJd97KkLTRl>ScGFYZNlYytWnhmuu|)L&ND8_PmkayQb{HOY640 bno1(wj@u8DCVuFR|31B*4ek@pZJqxCDDe1x literal 0 HcmV?d00001 diff --git a/windows/bluewallet/Assets/Wide310x150Logo.scale-200.png b/windows/bluewallet/Assets/Wide310x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..288995b397fdbef1fb7e85afd71445d5de1952c5 GIT binary patch literal 3204 zcmbVPeQXow8NYmBd90>}0NP?GhXW~VaeThm=a0tV#EwJMI!)6M3}|c4_Bl3=Kd>G0 z(GHx1wl<7(tP?FsOQkTilSo*iIvF%uArExJ73~P zSv1xEy!U(Wd4A9D`FQV@W3@F^qJ@PEF$@z`Z!*BbFsS(^?B zyiAzJ+q})bkgiQHWqEb*jJD-coHYr1^iocg)l!Qa{Xqs-l~6J}p-|##ZHYofskQ3$ zI0;xzXyhazBeXhIsg5A=%ufo@f)1yy&ScKS0;HF^!r_2UE^lpZEom(+@duma3awTv zCrCL-%D_SvYWIcdHkmI}#50(fkUi)Qgx!80ju>g1za^}ff>JI8Z@^-iCiaCgg@TgF z+vtE?Q9{VQUX&MW9SYYmGcxA14%N2@7FwBTD4N<(2{nWgV8$e3?-F=L^&FrtWn~(U_Q~~^uYiyeY6-KoTnfh9AWz@ zIKje0)u!_Lw)E}G!#kEfwKVdNt(UAf9*f>tEL_(=xco-T%jTi@7YlC3hs2ik%Le0H ztj}RTeCF(5mwvi3_56>-yB?l;J>-1%!9~=fs|QcNG3J~a@JCu`4SB460s0ZO+##4fFUSGLcj_ja^fL4&BKALfb#$6$O?>P@qx2Agl^x0i&ugt zsy5Pyu=()`7HRMG3IB7F1@`_ z+-!J%#i6e^U$e#+C%Q>_qVRzWRsG^W_n+@OcX@vzI&z;mzHNb!GQ?LWA(wtpqHqTM z1OFw_{Zn?fD)p)`c`kOgv{de=v@suGRqY{N^U7gI1VF3*F=obwaXI6ob5__Yn zVTguS!%(NI09J8x#AO_aW!9W7k*UvB;IWDFC3srwftr{kHj%g)fvnAm;&h_dnl~

MY- zf+K}sCe8qU6Ujs`3ua{U0Of$R_gVQBuUA za0v=mu#vIOqiiAZOr&h*$WyOw&k-xr$;G4Ixa!#TJNr>95(h>l%)PUy4p+^SgR(uR zta%k*?ny-+nAr8spEk1fo{J4i!b^Fia`N{_F6@zidA2ZTTrjl#^5Z-2KfB@Cu}l9s z(*|Z2jc?p~vn2f)3y9i*7zJV1L{$?|&q)4oaT;uXi6>1GkRXVTOzAz(RHEmr=eFIi z`}<>-Q?K0GN8!IYxeP1XKXO+jsJbp~o^);Bc;%b7Flpe7;1`Ny@3r7ZR;?R)aJt8C ziNlEC<@3f_lIV4TwV}&e;D!Ee5_|e#g0LUh=5vmYWYm7&2h*M>QPKvGh9-)wfMMW3 z8J9b%1k7dzPzO0_NGQy92BZ^FR6R~6;^6?lqO;-QUP4BY%cG%3vEhbm#>4vIhPBh3 z-+pZGjh$x%Hp{?=FHsMp0&wNPlj00us{&`1ZOZTqs8%4X&xH=UDr*xyBW(Zp&Em94 zf)ZSfn#yg0N)>!1kWdkqJ^S*z0FF5|fj&qcE#Na|%OY0$uO>!&hP+1ywfD_WXk@4J(?MBftK7>$Nvqh@tDuarN%PrTLQ2Uzysx>UV=V zk^RrDSvdQ?0;=hY67EgII-f4`t=+i*yS=Y~!XlqIy_4x&%+OdfbKOFPXS2X5%4R{N z$SQMX^AK6(fA + +// Includes from react-native-camera +#include + +// Includes from react-native-device-info +#include + +// Includes from react-native-localize +#include + +// Includes from react-native-webview +#include + +namespace winrt::Microsoft::ReactNative +{ + +void RegisterAutolinkedNativeModulePackages(winrt::Windows::Foundation::Collections::IVector const& packageProviders) +{ + // IReactPackageProviders from @react-native-async-storage/async-storage + packageProviders.Append(winrt::ReactNativeAsyncStorage::ReactPackageProvider()); + // IReactPackageProviders from react-native-camera + packageProviders.Append(winrt::ReactNativeCameraCPP::ReactPackageProvider()); + // IReactPackageProviders from react-native-device-info + packageProviders.Append(winrt::RNDeviceInfoCPP::ReactPackageProvider()); + // IReactPackageProviders from react-native-localize + packageProviders.Append(winrt::RNLocalize::ReactPackageProvider()); + // IReactPackageProviders from react-native-webview + packageProviders.Append(winrt::ReactNativeWebView::ReactPackageProvider()); +} + +} diff --git a/windows/bluewallet/AutolinkedNativeModules.g.h b/windows/bluewallet/AutolinkedNativeModules.g.h new file mode 100644 index 000000000..e51283fa6 --- /dev/null +++ b/windows/bluewallet/AutolinkedNativeModules.g.h @@ -0,0 +1,10 @@ +// AutolinkedNativeModules.g.h contents generated by "react-native autolink-windows" +// clang-format off +#pragma once + +namespace winrt::Microsoft::ReactNative +{ + +void RegisterAutolinkedNativeModulePackages(winrt::Windows::Foundation::Collections::IVector const& packageProviders); + +} diff --git a/windows/bluewallet/AutolinkedNativeModules.g.props b/windows/bluewallet/AutolinkedNativeModules.g.props new file mode 100644 index 000000000..37e6f4b3f --- /dev/null +++ b/windows/bluewallet/AutolinkedNativeModules.g.props @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/windows/bluewallet/AutolinkedNativeModules.g.targets b/windows/bluewallet/AutolinkedNativeModules.g.targets new file mode 100644 index 000000000..c702dd22b --- /dev/null +++ b/windows/bluewallet/AutolinkedNativeModules.g.targets @@ -0,0 +1,26 @@ + + + + + + + {4855D892-E16C-404D-8286-0089E0F7F9C4} + + + + {7432c343-cc07-4bc7-9bd0-8c467be0f018} + + + + {3e3931f2-4735-4417-8cb0-33668a7314d6} + + + + {10e2379c-4264-444a-8656-b3d7e83acb44} + + + + {729d9af8-cd9e-4427-9f6c-fb757e287729} + + + diff --git a/windows/bluewallet/MainPage.cpp b/windows/bluewallet/MainPage.cpp new file mode 100644 index 000000000..79a1b353e --- /dev/null +++ b/windows/bluewallet/MainPage.cpp @@ -0,0 +1,20 @@ +#include "pch.h" +#include "MainPage.h" +#if __has_include("MainPage.g.cpp") +#include "MainPage.g.cpp" +#endif + +#include "App.h" + +using namespace winrt; +using namespace Windows::UI::Xaml; + +namespace winrt::bluewallet::implementation +{ + MainPage::MainPage() + { + InitializeComponent(); + auto app = Application::Current().as(); + ReactRootView().ReactNativeHost(app->Host()); + } +} diff --git a/windows/bluewallet/MainPage.h b/windows/bluewallet/MainPage.h new file mode 100644 index 000000000..3123600b2 --- /dev/null +++ b/windows/bluewallet/MainPage.h @@ -0,0 +1,19 @@ +#pragma once +#include "MainPage.g.h" +#include + +namespace winrt::bluewallet::implementation +{ + struct MainPage : MainPageT + { + MainPage(); + }; +} + +namespace winrt::bluewallet::factory_implementation +{ + struct MainPage : MainPageT + { + }; +} + diff --git a/windows/bluewallet/MainPage.idl b/windows/bluewallet/MainPage.idl new file mode 100644 index 000000000..930f20bf4 --- /dev/null +++ b/windows/bluewallet/MainPage.idl @@ -0,0 +1,8 @@ +namespace bluewallet +{ + [default_interface] + runtimeclass MainPage : Windows.UI.Xaml.Controls.Page + { + MainPage(); + } +} diff --git a/windows/bluewallet/MainPage.xaml b/windows/bluewallet/MainPage.xaml new file mode 100644 index 000000000..08def174a --- /dev/null +++ b/windows/bluewallet/MainPage.xaml @@ -0,0 +1,16 @@ + + + diff --git a/windows/bluewallet/Package.appxmanifest b/windows/bluewallet/Package.appxmanifest new file mode 100644 index 000000000..257e3aea9 --- /dev/null +++ b/windows/bluewallet/Package.appxmanifest @@ -0,0 +1,50 @@ + + + + + + + + + + bluewallet + marcosrodriguezvelez + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/windows/bluewallet/PropertySheet.props b/windows/bluewallet/PropertySheet.props new file mode 100644 index 000000000..3e15bb903 --- /dev/null +++ b/windows/bluewallet/PropertySheet.props @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/windows/bluewallet/ReactPackageProvider.cpp b/windows/bluewallet/ReactPackageProvider.cpp new file mode 100644 index 000000000..b74187254 --- /dev/null +++ b/windows/bluewallet/ReactPackageProvider.cpp @@ -0,0 +1,15 @@ +#include "pch.h" +#include "ReactPackageProvider.h" +#include "NativeModules.h" + +using namespace winrt::Microsoft::ReactNative; + +namespace winrt::bluewallet::implementation +{ + +void ReactPackageProvider::CreatePackage(IReactPackageBuilder const &packageBuilder) noexcept +{ + AddAttributedModules(packageBuilder); +} + +} // namespace winrt::bluewallet::implementation diff --git a/windows/bluewallet/ReactPackageProvider.h b/windows/bluewallet/ReactPackageProvider.h new file mode 100644 index 000000000..3f804bc71 --- /dev/null +++ b/windows/bluewallet/ReactPackageProvider.h @@ -0,0 +1,13 @@ +#pragma once + +#include "winrt/Microsoft.ReactNative.h" + +namespace winrt::bluewallet::implementation +{ + struct ReactPackageProvider : winrt::implements + { + public: // IReactPackageProvider + void CreatePackage(winrt::Microsoft::ReactNative::IReactPackageBuilder const &packageBuilder) noexcept; + }; +} // namespace winrt::bluewallet::implementation + diff --git a/windows/bluewallet/bluewallet.vcxproj b/windows/bluewallet/bluewallet.vcxproj new file mode 100644 index 000000000..842c66044 --- /dev/null +++ b/windows/bluewallet/bluewallet.vcxproj @@ -0,0 +1,195 @@ + + + + + true + true + true + {79725546-ec43-45de-9048-6d0b2b6d376e} + bluewallet + bluewallet + en-US + 16.0 + true + Windows Store + 10.0 + 10.0.18362.0 + 10.0.16299.0 + bluewallet_TemporaryKey.pfx + password + + + + $([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), 'node_modules\react-native-windows\package.json'))\node_modules\react-native-windows\ + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + Application + Unicode + + + true + true + + + false + true + false + + + + + + + + + + + + + + + + + Use + pch.h + $(IntDir)pch.pch + Level4 + %(AdditionalOptions) /bigobj + 4453;28204 + + + + + _DEBUG;%(PreprocessorDefinitions) + + + + + NDEBUG;%(PreprocessorDefinitions) + + + + + MainPage.xaml + Code + + + + + + App.xaml + + + + + Designer + + + + + Designer + + + + + + + + + + + + + + MainPage.xaml + Code + + + + + Create + + + App.xaml + + + + + + App.xaml + + + MainPage.xaml + Code + + + + + + + false + + + + + Designer + + + + + + + + + This project references targets in your node_modules\react-native-windows folder. The missing file is {0}. + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + diff --git a/windows/bluewallet/bluewallet.vcxproj.filters b/windows/bluewallet/bluewallet.vcxproj.filters new file mode 100644 index 000000000..909fc4c19 --- /dev/null +++ b/windows/bluewallet/bluewallet.vcxproj.filters @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + + + + + + {e48dc53e-40b1-40cb-970a-f89935452892} + + + + + + + + + + + + + \ No newline at end of file diff --git a/windows/bluewallet/bluewallet_TemporaryKey.pfx b/windows/bluewallet/bluewallet_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..5a39b89df1a187d875b26e3b4151d69db82b7cf5 GIT binary patch literal 4190 zcmaJ^`A=Ne6@G6vhGhVIFgq9+vl#67&3IVGV+;m|)drfuV2ptQ!@vMB!;V=~w^b@d zjVf1_D>dqps;b&JRi$pEtCXawTGe)iV~Y|wmHI=a{?vb=-#6!az__jSo$q|-ynElf z@7{CoyfOa$``^aHOuE^i?6Ad`!?(ZyhaRVkim$Uk#QUR-s>xQ^|7grhY)=2Y>2q&O zeBu5{3AzcbR0lRHlC0|U?=i|%*^`q$` zHm|{VaQNA<^kKWCtu<>9UUkzc1f6nC&3{Kw)k(&QSRd0z z_n?hjP#DHeC41in12vo>0jB`qvTrPMHqWhqGGG9=@H(t>62xjAUjW%1AfR6yc;`1u zUR79#dSN}VJQyGA+T+AtTLKM@7iklmr|O2#bvSpep=yV90Ngqs;Di9XKNJss`c;uL zowX2sFn{pTFR0n8@Hhx4=K%Bet3yrpa8efwr&1b$n{&8zx?pW;v5YdcnTB}_paJ&a zr~OHAdv{Y<3V>R9D1Wx^mgIPsEI(+gT@tFWBnXHr?H!-{`;VZGFcCYur$}ilOn8L;pPF%%Unm`q&Q33hKL?rEoq^|Y-WPhN(dfxtCC$qz%iYv zk6nXcB?xZ9WoK}g$B>*Sa%h4RYCoC3B{4^Jxz(}y>^;wVvt4rF(@mgbPrb8T2ew@q09A4fJ8xUT?Zst< zyzB1I)4>A0(ZQuDItpSTUV^Dg;!2!gk;HxYwr7+A*uA?V;^7zIRm)9Dflrr!>T=X> zIe~y11=uf&Iz&8F#@X~`sD|9;PS{raC)>+oqa619qi_Dg9r49GN*uV$YmzEb zX8?}~;EcF+mhq$SaPI+z^U$YS{4ux9V$n5CGkOnSN^`g6w`jwfTdUDRFpuWbyxM7G zyxNFnKzX$>s1TG7*KeW)b3XVn75lVm=qhd47_h}x*mMh*sQQTR?#l1bu4rL&n$u>q zd00qW&h-L+|kXv(;Q; z;pL)eqx>jmzx)NNev!FD*o6Mj_h)=M$FHvOmIvFikGgC&=_XU^IuhYigI#by^AxBQ z#shlAa2y({o@mvKqwZ8A*=D|KF+1bN=E67UW>$^-42QeQsPvrm7?po}d@K{0QBu@g4OPEjrc&j$YR_@W=NT!9061szHM8*3q(ZNFI}qe;ihup~K$7 zcC2U*PX$|G6x<2}xKFy1c=uUY=BICffznj*5%xNW@=bR;j~>AgN7v9DN!z`10V?+* z=oGh2;&m^#6>y>R@iyF|JTWX#qIf&%P^q^OX1}_q-5w#|k7Ao(=V^Epk+X1vt*}xe8EDT4tl9!6vh=vHHr4 z5+eyEl;_kLT1)40JGsI@7Fx}iUe21 zg~Y|U@Xv3GK064X!<`j~UCe?SP-S~**c8!iJp5(~r9mECChYO|KrQnO>-jq(*e||M z-jU3VIL<;OwHEy0&m>cN6rQI(my}z_Hvno-zr9(j?0B1715j`8fDFR=n?Vh*9M~pj zjl~z@Y#fATdCN68giMQ%Z + + + + \ No newline at end of file diff --git a/windows/bluewallet/pch.cpp b/windows/bluewallet/pch.cpp new file mode 100644 index 000000000..e0d2ef1a2 --- /dev/null +++ b/windows/bluewallet/pch.cpp @@ -0,0 +1 @@ +#include "pch.h" diff --git a/windows/bluewallet/pch.h b/windows/bluewallet/pch.h new file mode 100644 index 000000000..f82c2aa2d --- /dev/null +++ b/windows/bluewallet/pch.h @@ -0,0 +1,26 @@ +#pragma once + +#define NOMINMAX + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include From a5c1fcc9b0e3c48ef658a7b627df999dc4eee0f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 24 Jun 2021 12:49:27 -0400 Subject: [PATCH 165/327] Update metro.config.js --- metro.config.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/metro.config.js b/metro.config.js index 1b710a4d4..01be4d59d 100644 --- a/metro.config.js +++ b/metro.config.js @@ -11,9 +11,7 @@ module.exports = { resolver: { blacklistRE: blacklist([ // This stops "react-native run-windows" from causing the metro server to crash if its already running - new RegExp( - `${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`, - ), + new RegExp(`${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`), // This prevents "react-native run-windows" from hitting: EBUSY: resource busy or locked, open msbuild.ProjectImports.zip /.*\.ProjectImports\.zip/, ]), From dd9c2b24fe147ada8d3a816604c50b47cc4b51a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 24 Jun 2021 12:55:33 -0400 Subject: [PATCH 166/327] OPS: Version lock --- package.json | 2 +- windows/bluewallet.sln | 50 ++++++++++++------------- windows/bluewallet/Package.appxmanifest | 4 +- windows/bluewallet/bluewallet.vcxproj | 2 +- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index b386718f5..186761507 100644 --- a/package.json +++ b/package.json @@ -178,7 +178,7 @@ "url": "0.11.0", "util": "0.12.4", "wif": "2.0.6", - "react-native-windows": "0.63.0-0" + "react-native-windows": "0.63.35" }, "react-native": { "crypto": "react-native-crypto", diff --git a/windows/bluewallet.sln b/windows/bluewallet.sln index 8872e18d8..f4d41da78 100644 --- a/windows/bluewallet.sln +++ b/windows/bluewallet.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29215.179 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bluewallet", "bluewallet\bluewallet.vcxproj", "{79725546-EC43-45DE-9048-6D0B2B6D376E}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bluewallet", "bluewallet\bluewallet.vcxproj", "{3B23E606-7EFC-44B4-818B-41A6525E4C9E}" ProjectSection(ProjectDependencies) = postProject {F7D32BD0-2749-483E-9A0D-1635EF7E3136} = {F7D32BD0-2749-483E-9A0D-1635EF7E3136} EndProjectSection @@ -72,30 +72,30 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|ARM.ActiveCfg = Debug|ARM - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|ARM.Build.0 = Debug|ARM - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|ARM.Deploy.0 = Debug|ARM - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|ARM64.Build.0 = Debug|ARM64 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|ARM64.Deploy.0 = Debug|ARM64 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|x64.ActiveCfg = Debug|x64 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|x64.Build.0 = Debug|x64 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|x64.Deploy.0 = Debug|x64 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|x86.ActiveCfg = Debug|Win32 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|x86.Build.0 = Debug|Win32 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Debug|x86.Deploy.0 = Debug|Win32 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|ARM.ActiveCfg = Release|ARM - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|ARM.Build.0 = Release|ARM - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|ARM.Deploy.0 = Release|ARM - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|ARM64.ActiveCfg = Release|ARM64 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|ARM64.Build.0 = Release|ARM64 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|ARM64.Deploy.0 = Release|ARM64 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|x64.ActiveCfg = Release|x64 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|x64.Build.0 = Release|x64 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|x64.Deploy.0 = Release|x64 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|x86.ActiveCfg = Release|Win32 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|x86.Build.0 = Release|Win32 - {79725546-EC43-45DE-9048-6D0B2B6D376E}.Release|x86.Deploy.0 = Release|Win32 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|ARM.ActiveCfg = Debug|ARM + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|ARM.Build.0 = Debug|ARM + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|ARM.Deploy.0 = Debug|ARM + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|ARM64.Build.0 = Debug|ARM64 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|x64.ActiveCfg = Debug|x64 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|x64.Build.0 = Debug|x64 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|x64.Deploy.0 = Debug|x64 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|x86.ActiveCfg = Debug|Win32 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|x86.Build.0 = Debug|Win32 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|x86.Deploy.0 = Debug|Win32 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|ARM.ActiveCfg = Release|ARM + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|ARM.Build.0 = Release|ARM + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|ARM.Deploy.0 = Release|ARM + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|ARM64.ActiveCfg = Release|ARM64 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|ARM64.Build.0 = Release|ARM64 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|ARM64.Deploy.0 = Release|ARM64 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|x64.ActiveCfg = Release|x64 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|x64.Build.0 = Release|x64 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|x64.Deploy.0 = Release|x64 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|x86.ActiveCfg = Release|Win32 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|x86.Build.0 = Release|Win32 + {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|x86.Deploy.0 = Release|Win32 {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.ActiveCfg = Debug|ARM {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.Build.0 = Debug|ARM {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.ActiveCfg = Debug|ARM64 diff --git a/windows/bluewallet/Package.appxmanifest b/windows/bluewallet/Package.appxmanifest index 257e3aea9..8f64cd6da 100644 --- a/windows/bluewallet/Package.appxmanifest +++ b/windows/bluewallet/Package.appxmanifest @@ -7,11 +7,11 @@ IgnorableNamespaces="uap mp"> - + bluewallet diff --git a/windows/bluewallet/bluewallet.vcxproj b/windows/bluewallet/bluewallet.vcxproj index 842c66044..56b18c11d 100644 --- a/windows/bluewallet/bluewallet.vcxproj +++ b/windows/bluewallet/bluewallet.vcxproj @@ -5,7 +5,7 @@ true true true - {79725546-ec43-45de-9048-6d0b2b6d376e} + {3b23e606-7efc-44b4-818b-41a6525e4c9e} bluewallet bluewallet en-US From f16487b78daf707720dfa3ede356ada36ab1b5c8 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 26 Jun 2021 02:26:11 +0000 Subject: [PATCH 167/327] Translate /loc/en.json in fr_FR review completed for the source file '/loc/en.json' on the 'fr_FR' language. --- loc/fr_fr.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/loc/fr_fr.json b/loc/fr_fr.json index 982b8216a..5c0f79119 100644 --- a/loc/fr_fr.json +++ b/loc/fr_fr.json @@ -184,8 +184,9 @@ "details_fee_field_is_not_valid": "Champ frais invalide", "details_next": "Suivant", "details_no_signed_tx": "Le fichier sélectionné ne contient pas de transaction pouvant être importée.", - "details_note_placeholder": "note (optionnelle)", + "details_note_placeholder": "note à moi même (optionnelle)", "details_scan": "Scanner", + "details_scan_hint": "tapez deux fois pour scanner ou importer une destination", "details_total_exceeds_balance": "Le montant à envoyer excède le montant disponible.", "details_unrecognized_file_format": "Format fichier inconnu", "details_wallet_before_tx": "Avant de créer une transaction, vous devez d'abord importer un ajouter un portefeuille Bitcoin.", @@ -286,7 +287,7 @@ "encrypt_use": "Utiliser {type}", "encrypt_use_expl": "{type} sera utilisé pour confirmer votre identité avant toute transaction, dévérouillage, export ou suppression de portefeuille. {type} ne sera pas utilisé pour dévérouiller un stockage chiffré.", "general": "Général", - "general_adv_mode": "Enable advanced mode", + "general_adv_mode": "Mode avancé", "general_adv_mode_e": "Si activé, vous aurez accès aux options avancées telles que la sélection parmi différents types de portefeuilles, la possibilité de spécifier une instance LNDHub de votre choix, et la création manuelle d'entropie lors de la création de portefeuille.", "general_continuity": "Continuité", "general_continuity_e": "Si activé, vous pourrez visualiser les portefeuilles sélectionnés ainsi que leurs transactions depuis vos autres appareils Apple iCloud connectés.", @@ -296,7 +297,7 @@ "language_isRTL": "Il est nécessaire de redémarrer BlueWallet pour que le changement de langue prenne effet.", "lightning_error_lndhub_uri": "URI LndHub invalide", "lightning_saved": "Les changements ont bien été enregistrés", - "lightning_settings": "Lightning settings", + "lightning_settings": "Paramètres Lightning", "tor_settings": "Paramètres Tor", "lightning_settings_explain": "To connect to your own LND node please install LndHub and put its URL here in settings. Leave blank to use default ndHub\n (lndhub.io)", "network": "Réseau", From d46b3e02ce031696c64c62bcc2096b5bb21c4dd9 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 26 Jun 2021 20:53:46 +0000 Subject: [PATCH 168/327] Translate /loc/en.json in ar review completed for the source file '/loc/en.json' on the 'ar' language. --- loc/ar.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/loc/ar.json b/loc/ar.json index 6a7aabb1b..cfbe6db2f 100644 --- a/loc/ar.json +++ b/loc/ar.json @@ -16,7 +16,7 @@ "seed": "عبارة الاسترداد", "success": "نجاح", "wallet_key": "مفتاح المحفظة", - "invalid_animated_qr_code_fragment": "قطعة من رمز الـ QRcode المتحرك غير صحيحة، حاول مرة اخرى.", + "invalid_animated_qr_code_fragment" : "قطعة من رمز الـ QRcode المتحرك غير صحيحة، حاول مرة اخرى.", "file_saved": "تم حفظ الملف ({filePath}) في مجلد التنزيلات.", "discard_changes": "تجاهل التغييرات؟", "discard_changes_detail": "يوجد تغييرات غير محفوظة. هل أنت متأكد من الخروج من الشاشة وتجاهلها؟" @@ -186,6 +186,7 @@ "details_no_signed_tx": "لا يحتوي الملف المحدَّد على معاملة موقَّعة يمكن استيرادها.", "details_note_placeholder": "ملاحظة شخصية", "details_scan": "المسح الضوئي", + "details_scan_hint": "انقر نقرًا مزدوجًا لنسخ او استيراد مستلم", "details_total_exceeds_balance": "مبلغ الإرسال يتجاوز الرصيد المتاح.", "details_unrecognized_file_format": "تنسيق ملف غير معروف", "details_wallet_before_tx": "يجب عليك إضافة محفظة Bitcoin أولًا قبل إنشاء معاملة.", @@ -304,7 +305,7 @@ "network_electrum": "خادم Electrum", "not_a_valid_uri": "معرِّف URI غير صالح", "notifications": "الإشعارات", - "open_link_in_explorer": "فتح الرابط في المتصفح", + "open_link_in_explorer" : "فتح الرابط في المتصفح", "password": "كلمه المرور", "password_explain": "أنشئ كلمة المرور التي ستستخدمها لفك تشفير وحدة التخزين", "passwords_do_not_match": "كلمتا المرور لا تتطابقان", @@ -323,7 +324,7 @@ "selfTest": "اختبار ذاتي", "save": "الحفظ", "saved": "تم الحفظ", - "success_transaction_broadcasted": "تمت بنجاح! لقد تم نشر معاملتك!", + "success_transaction_broadcasted" : "تمت بنجاح! لقد تم نشر معاملتك!", "total_balance": "الرصيد الاجمالي", "total_balance_explanation": "اعرض الرصيد الإجمالي لجميع محافظك على ويدجيت الشاشة الرئيسية الخاصة بك.", "widgets": "ويدجيت", From 17355226efb29e21e751638cb301c4e02367bdcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sun, 27 Jun 2021 15:49:03 -0400 Subject: [PATCH 169/327] FIX: Ports from previous scan were not cleared. --- screen/settings/electrumSettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/screen/settings/electrumSettings.js b/screen/settings/electrumSettings.js index b28a92c61..ec638d581 100644 --- a/screen/settings/electrumSettings.js +++ b/screen/settings/electrumSettings.js @@ -215,7 +215,7 @@ export default class ElectrumSettings extends Component { value = DeeplinkSchemaMatch.getServerFromSetElectrumServerAction(value); } const [host, port, type] = value.split(':'); - this.setState({ host: host }); + this.setState({ host: host, sslPort: '', port: '' }); type === 's' ? this.setState({ sslPort: port }) : this.setState({ port: port }); }; From b3dd9d41d19154167ad52fb0629ad754f4f075e6 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 27 Jun 2021 21:19:03 +0000 Subject: [PATCH 170/327] fix: upgrade react-native-camera from 3.44.0 to 3.44.1 Snyk has created this PR to upgrade react-native-camera from 3.44.0 to 3.44.1. See this package in npm: https://www.npmjs.com/package/react-native-camera See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8a162e922..874e7f607 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17750,9 +17750,9 @@ "from": "git+https://github.com/BlueWallet/react-native-blue-crypto.git" }, "react-native-camera": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.44.0.tgz", - "integrity": "sha512-gAFtqWcNl/4N85V9RPFPuo32/OTaPvrLzhzXiFoK6eR8Ms2uvOZ/wRjj5gM1WqNoKilmAaULgypbplok1s53yA==", + "version": "3.44.1", + "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.44.1.tgz", + "integrity": "sha512-B95RL3laK2v8R7L/37v28MYcEcwsM/mS94h6EZuRMLH5HFolkAwh7zJo+UAn7FG9eFtAdBwIM6s9OqYudTVO4Q==", "requires": { "prop-types": "^15.6.2" } diff --git a/package.json b/package.json index 186761507..ae114a32a 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "react-localization": "1.0.17", "react-native": "0.63.4", "react-native-blue-crypto": "https://github.com/BlueWallet/react-native-blue-crypto", - "react-native-camera": "3.44.0", + "react-native-camera": "3.44.1", "react-native-crypto": "2.2.0", "react-native-default-preference": "1.4.3", "react-native-device-info": "8.1.3", From e47ef59c5bad065b46a5f220d9edb1ac5612b255 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 27 Jun 2021 21:19:06 +0000 Subject: [PATCH 171/327] fix: upgrade react-native-share from 6.2.0 to 6.2.1 Snyk has created this PR to upgrade react-native-share from 6.2.0 to 6.2.1. See this package in npm: https://www.npmjs.com/package/react-native-share See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8a162e922..429a020a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18067,9 +18067,9 @@ "from": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#63ab38c9d382a819844a086a69cc204c46aa93f9" }, "react-native-share": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-6.2.0.tgz", - "integrity": "sha512-8s5WNaUP8HImy08SzbwRx7RMgGSYZjNWeOiPNVZhyIY/YKRBQEUxEF7ewsmRY4PAtg8Yytb5DYGtCs4S/04ScA==" + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-6.2.1.tgz", + "integrity": "sha512-LtT29le01c3k/1sWoumZDyAxigq/JrW4skv8Ri7eySgfIeXrjgnkk1SSR3bt4NrRO74knVngPwtb5xv/UCPP3w==" }, "react-native-sortable-list": { "version": "git+https://github.com/BlueWallet/react-native-sortable-list.git#46e39a30ae0c4328e7c06c30b72b1af0b69e1aeb", diff --git a/package.json b/package.json index 186761507..651b437e5 100644 --- a/package.json +++ b/package.json @@ -157,7 +157,7 @@ "react-native-safe-area-context": "3.2.0", "react-native-screens": "2.18.1", "react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#63ab38c9d382a819844a086a69cc204c46aa93f9", - "react-native-share": "6.2.0", + "react-native-share": "6.2.1", "react-native-sortable-list": "https://github.com/BlueWallet/react-native-sortable-list.git#46e39a30ae0c4328e7c06c30b72b1af0b69e1aeb", "react-native-svg": "12.1.1", "react-native-tcp-socket": "3.7.1", From 378daae749a1e3df091ea1c57275aaea0b4ac6c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Mon, 28 Jun 2021 09:22:41 -0400 Subject: [PATCH 172/327] FIX: Second setState after first async called is done --- ios/Podfile.lock | 16 ++++++++-------- screen/settings/electrumSettings.js | 5 +++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 653db53bc..20b1f0293 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -260,13 +260,13 @@ PODS: - React - react-native-blur (0.8.0): - React - - react-native-camera (3.44.0): + - react-native-camera (3.44.1): - React-Core - - react-native-camera/RCT (= 3.44.0) - - react-native-camera/RN (= 3.44.0) - - react-native-camera/RCT (3.44.0): + - react-native-camera/RCT (= 3.44.1) + - react-native-camera/RN (= 3.44.1) + - react-native-camera/RCT (3.44.1): - React-Core - - react-native-camera/RN (3.44.0): + - react-native-camera/RN (3.44.1): - React-Core - react-native-document-picker (3.5.4): - React @@ -420,7 +420,7 @@ PODS: - RNSentry (2.5.2): - React-Core - Sentry (= 7.0.0) - - RNShare (6.2.0): + - RNShare (6.2.1): - React-Core - RNSVG (12.1.1): - React @@ -730,7 +730,7 @@ SPEC CHECKSUMS: React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a react-native-blue-crypto: 23f1558ad3d38d7a2edb7e2f6ed1bc520ed93e56 react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c - react-native-camera: 14f79f085a97ee82f99344e10888cbc774403926 + react-native-camera: 6e6d25f6318980dd2837747760628b4442aac01a react-native-document-picker: c5752781fbc0c126c627c1549b037c139444a4cf react-native-fingerprint-scanner: c68136ca57e3704d7bdf5faa554ea535ce15b1d0 react-native-idle-timer: 97b8283237d45146a7a5c25bdebe9e1e85f3687b @@ -772,7 +772,7 @@ SPEC CHECKSUMS: RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 RNSentry: bfa1e2776c7413570e790cbbf79d2060dd0a565b - RNShare: 32ded9b8603fddf8f8eed42014e7ea7a4b0b8bf0 + RNShare: 5ac8f6532ca4cd80fc71caef1cfbba1854a6a045 RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 RNWatch: e4c5d19506c94506860032fb68aedd5991beb985 diff --git a/screen/settings/electrumSettings.js b/screen/settings/electrumSettings.js index b28a92c61..4db7de398 100644 --- a/screen/settings/electrumSettings.js +++ b/screen/settings/electrumSettings.js @@ -215,8 +215,9 @@ export default class ElectrumSettings extends Component { value = DeeplinkSchemaMatch.getServerFromSetElectrumServerAction(value); } const [host, port, type] = value.split(':'); - this.setState({ host: host }); - type === 's' ? this.setState({ sslPort: port }) : this.setState({ port: port }); + this.setState({ host: host, sslPort: '', port: '' }, () => { + type === 's' ? this.setState({ sslPort: port }) : this.setState({ port: port }); + }); }; importScan = () => { From 83b531ece51ccfd38c25ca56248ce97298d07fac Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 29 Jun 2021 16:03:33 +0000 Subject: [PATCH 173/327] Translate /loc/en.json in pl review completed for the source file '/loc/en.json' on the 'pl' language. --- loc/pl.json | 1 + 1 file changed, 1 insertion(+) diff --git a/loc/pl.json b/loc/pl.json index 458290d5e..ab28ab01b 100644 --- a/loc/pl.json +++ b/loc/pl.json @@ -186,6 +186,7 @@ "details_no_signed_tx": "Wskazany plik nie zawiera transakcji, która może zostać zaimportowana.", "details_note_placeholder": "opis transakcji", "details_scan": "Skanuj", + "details_scan_hint": "Kliknij dwukrotnie, aby zeskanować lub zaimportować miejsce docelowe", "details_total_exceeds_balance": "Wysłanie tej ilości przekracza dostępne saldo.", "details_unrecognized_file_format": "Format nierozpoznany", "details_wallet_before_tx": "Przed stworzeniem transakcji, najpierw utwórz portfel Bitcoin.", From 7824765d3c66b7c8d92087558c275a2506f30186 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Tue, 29 Jun 2021 20:19:54 +0100 Subject: [PATCH 174/327] OPS: feature-branch apk builds are now downloaded directly from CI (appcenter.ms) --- .travis.yml | 2 -- appcenter-post-build.sh | 8 +------- tests/e2e/upload-artifacts.sh | 16 ---------------- 3 files changed, 1 insertion(+), 25 deletions(-) delete mode 100755 tests/e2e/upload-artifacts.sh diff --git a/.travis.yml b/.travis.yml index a4d9f4f1f..ac7f7ca07 100644 --- a/.travis.yml +++ b/.travis.yml @@ -90,5 +90,3 @@ script: - npm i -g detox-cli - npm run e2e:release-build - npm run e2e:release-test || npm run e2e:release-test || npm run e2e:release-test - -after_failure: ./tests/e2e/upload-artifacts.sh diff --git a/appcenter-post-build.sh b/appcenter-post-build.sh index a5f3b84aa..eeff0bf8a 100755 --- a/appcenter-post-build.sh +++ b/appcenter-post-build.sh @@ -18,13 +18,7 @@ if [ -f $FILENAME ]; then PR=`node scripts/appcenter-post-build-get-pr-number.js` echo PR: $PR - # uploading file - HASH=`date +%s` - FILENAME_UNIQ="$APPCENTER_OUTPUT_DIRECTORY/$BRANCH-$HASH.apk" - cp "$FILENAME" "$FILENAME_UNIQ" - curl "http://206.189.62.190:1488/$FILESTORAGE" -F "fileToUpload=@$FILENAME_UNIQ" - rm "$FILENAME_UNIQ" - DLOAD_APK="http://206.189.62.190:1488/$BRANCH-$HASH.apk" + DLOAD_APK="https://lambda-download-android-build.herokuapp.com/download/$BUILD_BUILDID" curl -X POST --data "{\"body\":\"♫ This was a triumph. I'm making a note here: HUGE SUCCESS ♫\n\n [android in browser] $APPURL\n\n[download apk]($DLOAD_APK) \"}" -u "$GITHUB" "https://api.github.com/repos/BlueWallet/BlueWallet/issues/$PR/comments" fi diff --git a/tests/e2e/upload-artifacts.sh b/tests/e2e/upload-artifacts.sh deleted file mode 100755 index ffb0f75b2..000000000 --- a/tests/e2e/upload-artifacts.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash - -echo uploading artifacts... -cp ./android/app/build/outputs/apk/release/app-release.apk ./artifacts/ -cp ./android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk ./artifacts/ -cp ~/.android/avd/Pixel_API_29_AOSP.avd/config.ini ./artifacts/ -tar -cvzf artifacts.tar.gz artifacts -FILENAME="artifacts.tar.gz" -HASH=`date +%s` -FILENAME_UNIQ="$HASH.tar.gz" -cp "$FILENAME" "$FILENAME_UNIQ" -curl "http://filestorage.bluewallet.io:1488/upload.php" -F "fileToUpload=@$FILENAME_UNIQ" -rm "$FILENAME_UNIQ" -DLOAD="http://filestorage.bluewallet.io:1488/$HASH.tar.gz" -echo artifacts download link: -echo $DLOAD \ No newline at end of file From 7bed1e4c8812697475c9eefe4090d6b5f1d8d588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 1 Jul 2021 00:28:50 -0400 Subject: [PATCH 175/327] FIX: Index when scrolling carousel --- screen/wallets/list.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/screen/wallets/list.js b/screen/wallets/list.js index a776d89fe..64c01329b 100644 --- a/screen/wallets/list.js +++ b/screen/wallets/list.js @@ -203,10 +203,7 @@ const WalletsList = () => { const onSnapToItem = e => { const contentOffset = e.nativeEvent.contentOffset; - const viewSize = e.nativeEvent.layoutMeasurement; - // If the lateral slide is - // Math.floor(contentOffset.x/viewSize.width); - const index = Math.floor(contentOffset.x / viewSize.width); + const index = Math.ceil(contentOffset.x / width); console.log('onSnapToItem', index); if (wallets[index] && (wallets[index].timeToRefreshBalance() || wallets[index].timeToRefreshTransaction())) { console.log(wallets[index].getLabel(), 'thinks its time to refresh either balance or transactions. refetching both'); From f5346b338c445bf470f604b3de84d8ba1ac68627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 1 Jul 2021 01:02:45 -0400 Subject: [PATCH 176/327] FIX: Snapping --- components/WalletsCarousel.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/components/WalletsCarousel.js b/components/WalletsCarousel.js index 997041b86..896f82964 100644 --- a/components/WalletsCarousel.js +++ b/components/WalletsCarousel.js @@ -76,7 +76,7 @@ NewWalletPanel.propTypes = { }; const iStyles = StyleSheet.create({ - root: {}, + root: { paddingRight: 20 }, grad: { padding: 15, borderRadius: 12, @@ -285,7 +285,6 @@ const cStyles = StyleSheet.create({ alignItems: 'center', }, content: { - paddingLeft: 20, paddingTop: 16, }, separatorStyle: { width: 16, height: 20 }, @@ -307,7 +306,7 @@ const WalletsCarousel = forwardRef((props, ref) => { [props.vertical, props.selectedWallet, props.handleLongPress, props.onPress, preferredFiatCurrency, language], ); const flatListRef = useRef(); - const ItemSeparatorComponent = () => ; + const ListHeaderComponent = () => ; useImperativeHandle(ref, () => ({ scrollToItem: ({ item }) => { @@ -333,15 +332,16 @@ const WalletsCarousel = forwardRef((props, ref) => { keyExtractor={(_, index) => index.toString()} showsVerticalScrollIndicator={false} pagingEnabled - snapToAlignment="start" disableIntervalMomentum={isHandset} - snapToInterval={itemWidth + 20} // Adjust to your content width - ItemSeparatorComponent={ItemSeparatorComponent} + snapToInterval={itemWidth} // Adjust to your content width decelerationRate="fast" + snapToStart contentContainerStyle={cStyles.content} directionalLockEnabled showsHorizontalScrollIndicator={false} initialNumToRender={10} + centerContent + ListHeaderComponent={ListHeaderComponent} style={props.vertical ? {} : { height: sliderHeight + 9 }} {...props} /> From f04d275af9faacb1bc05a0c670f508eed632a8a7 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 1 Jul 2021 18:28:29 +0000 Subject: [PATCH 177/327] Translate /loc/en.json in cs_CZ review completed for the source file '/loc/en.json' on the 'cs_CZ' language. --- loc/cs_cz.json | 1 + 1 file changed, 1 insertion(+) diff --git a/loc/cs_cz.json b/loc/cs_cz.json index 9f283a52e..1ae28e7a9 100644 --- a/loc/cs_cz.json +++ b/loc/cs_cz.json @@ -186,6 +186,7 @@ "details_no_signed_tx": "Vybraný soubor neobsahuje transakci, kterou lze importovat.", "details_note_placeholder": "poznámka pro sebe", "details_scan": "Skenovat", + "details_scan_hint": "Dvojitým klepnutím naskenujete nebo importujete cíl", "details_total_exceeds_balance": "Částka, kterou se snažíte poslat, přesahuje dostupný zůstatek.", "details_unrecognized_file_format": "Neznámý formát souboru", "details_wallet_before_tx": "Před vytvořením transakce musíte nejprve přidat bitcoinovou peněženku.", From 3ddd6b2d4c7091f66a73fcc10a8a8895ef20de4e Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 1 Jul 2021 23:52:14 +0000 Subject: [PATCH 178/327] fix: upgrade detox from 18.15.0 to 18.17.0 Snyk has created this PR to upgrade detox from 18.15.0 to 18.17.0. See this package in npm: https://www.npmjs.com/package/detox See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 110 +++------------------------------------------- package.json | 2 +- 2 files changed, 7 insertions(+), 105 deletions(-) diff --git a/package-lock.json b/package-lock.json index a164d5f31..bae337629 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7059,9 +7059,9 @@ "dev": true }, "detox": { - "version": "18.15.0", - "resolved": "https://registry.npmjs.org/detox/-/detox-18.15.0.tgz", - "integrity": "sha512-2PtDkfO0D5eyfqPqa5PUtO210f/WHGb4wJIVhiWPOCgBT+k5bwhqP7zeOmhS43dRkS3M3isq4GNuLSnQujK8uw==", + "version": "18.17.0", + "resolved": "https://registry.npmjs.org/detox/-/detox-18.17.0.tgz", + "integrity": "sha512-cdi+nUgk0Me76UdG7pUYIchmfEdzSghIC0xjTrEMyjhBz2Zsb7WscZZHO1rORAjDHJF7u0QhvAHvGDksDWmjiw==", "requires": { "bunyan": "^1.8.12", "bunyan-debug-stream": "^1.1.0", @@ -7090,42 +7090,6 @@ "yargs-unparser": "^2.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -7135,16 +7099,6 @@ "path-exists": "^4.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==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -7182,62 +7136,10 @@ "lru-cache": "^6.0.0" } }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" } } }, @@ -19883,9 +19785,9 @@ } }, "tail": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tail/-/tail-2.2.2.tgz", - "integrity": "sha512-IlfiFF8g5sPAqIZEL3qkIFcjODBM5DqdkVUhwXdKSDYqOgXGL4Gu0Hh1UQWXdCW5gBHi52cnk9WWMowsfjF4XA==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tail/-/tail-2.2.3.tgz", + "integrity": "sha512-XbBmVsJZ636kncPew2Y+pOxOsb9GsNFZ1bcAGCDn23ME/JPJ+TImZYjnqBnMLdw+K11Hql5ZgiUQmRvDHaFc6w==" }, "tar": { "version": "6.1.0", diff --git a/package.json b/package.json index 106bcd7bd..2872f594c 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "coinselect": "3.1.12", "crypto-js": "4.0.0", "dayjs": "1.10.5", - "detox": "18.15.0", + "detox": "18.17.0", "ecurve": "1.0.6", "electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4", "electrum-mnemonic": "2.0.0", From 32c2268cb6b315407b7a6f676ac6e09ce453f468 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 1 Jul 2021 23:52:18 +0000 Subject: [PATCH 179/327] fix: upgrade realm from 10.4.1 to 10.4.2 Snyk has created this PR to upgrade realm from 10.4.1 to 10.4.2. See this package in npm: https://www.npmjs.com/package/realm See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index a164d5f31..ae55d572e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18504,12 +18504,12 @@ } }, "realm": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/realm/-/realm-10.4.1.tgz", - "integrity": "sha512-WpQFYkgkqxe1vSx9rPz9YYOMj6R6c0Po+Kib86rbskUbEBoCGVWtr6fiah/l3rQrJ1anVRqcjaP3LJ+DUQiDgg==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/realm/-/realm-10.4.2.tgz", + "integrity": "sha512-pesozKE4loyFlOvxFeeM6CYLD6u1GZcXy88E2n6r2zzWk4/C8g16C2xPi0yuxh+PdhHUXDs5TsEDw6YnpBrhxg==", "requires": { "bindings": "^1.5.0", - "bson": "^4.2.0", + "bson": "^4.4.0", "command-line-args": "^4.0.6", "deepmerge": "2.1.0", "deprecated-react-native-listview": "0.0.6", diff --git a/package.json b/package.json index 106bcd7bd..186c8d5a3 100644 --- a/package.json +++ b/package.json @@ -169,7 +169,7 @@ "react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#e2e9a9038b76d096bf929a87105a97a0a7095001", "react-test-render": "1.1.2", "readable-stream": "3.6.0", - "realm": "10.4.1", + "realm": "10.4.2", "rn-nodeify": "10.3.0", "scryptsy": "file:blue_modules/scryptsy", "secure-random": "1.1.2", From 3d22a06fd963eb8123fa22eb21db971a23817692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sat, 3 Jul 2021 11:27:44 -0400 Subject: [PATCH 180/327] FIX: Typing 1 would turn into 10 due to default custom value --- screen/receive/details.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/screen/receive/details.js b/screen/receive/details.js index 9edcfd9b2..c6d2c3594 100644 --- a/screen/receive/details.js +++ b/screen/receive/details.js @@ -44,7 +44,7 @@ const ReceiveDetails = () => { const { wallets, saveToDisk, sleep } = useContext(BlueStorageContext); const wallet = wallets.find(w => w.getID() === walletID); const [customLabel, setCustomLabel] = useState(); - const [customAmount, setCustomAmount] = useState(0); + const [customAmount, setCustomAmount] = useState(); const [customUnit, setCustomUnit] = useState(BitcoinUnit.BTC); const [bip21encoded, setBip21encoded] = useState(); const [isCustom, setIsCustom] = useState(false); From 9f25850e60cb47a1935e874b261cd3976e5b9fa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sat, 3 Jul 2021 11:58:22 -0400 Subject: [PATCH 181/327] Update WalletsCarousel.js --- components/WalletsCarousel.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/WalletsCarousel.js b/components/WalletsCarousel.js index 896f82964..4ad9b70d5 100644 --- a/components/WalletsCarousel.js +++ b/components/WalletsCarousel.js @@ -335,12 +335,10 @@ const WalletsCarousel = forwardRef((props, ref) => { disableIntervalMomentum={isHandset} snapToInterval={itemWidth} // Adjust to your content width decelerationRate="fast" - snapToStart contentContainerStyle={cStyles.content} directionalLockEnabled showsHorizontalScrollIndicator={false} initialNumToRender={10} - centerContent ListHeaderComponent={ListHeaderComponent} style={props.vertical ? {} : { height: sliderHeight + 9 }} {...props} From 35fc5114b17b29d29e743eee101f343971a9f2de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sun, 4 Jul 2021 00:21:31 -0400 Subject: [PATCH 182/327] FIX: Re-order wallet bug #3341 --- screen/wallets/list.js | 18 +++++++++++------- screen/wallets/reorderWallets.js | 23 ++++++++++++++--------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/screen/wallets/list.js b/screen/wallets/list.js index 64c01329b..570c53429 100644 --- a/screen/wallets/list.js +++ b/screen/wallets/list.js @@ -26,7 +26,7 @@ import WalletImport from '../../class/wallet-import'; import ActionSheet from '../ActionSheet'; import loc from '../../loc'; import { FContainer, FButton } from '../../components/FloatButtons'; -import { useFocusEffect, useNavigation, useRoute, useTheme } from '@react-navigation/native'; +import { useFocusEffect, useIsFocused, useNavigation, useRoute, useTheme } from '@react-navigation/native'; import { BlueStorageContext } from '../../blue_modules/storage-context'; import { isDesktop, isMacCatalina, isTablet } from '../../blue_modules/environment'; import BlueClipboard from '../../blue_modules/clipboard'; @@ -46,6 +46,7 @@ const WalletsList = () => { const { width } = useWindowDimensions(); const { colors, scanImage } = useTheme(); const { navigate, setOptions } = useNavigation(); + const isFocused = useIsFocused(); const routeName = useRoute().name; const [isLoading, setIsLoading] = useState(false); const [isLargeScreen, setIsLargeScreen] = useState( @@ -202,12 +203,14 @@ const WalletsList = () => { }; const onSnapToItem = e => { - const contentOffset = e.nativeEvent.contentOffset; - const index = Math.ceil(contentOffset.x / width); - console.log('onSnapToItem', index); - if (wallets[index] && (wallets[index].timeToRefreshBalance() || wallets[index].timeToRefreshTransaction())) { - console.log(wallets[index].getLabel(), 'thinks its time to refresh either balance or transactions. refetching both'); - refreshAllWalletTransactions(index, false).finally(() => setIsLoading(false)); + if (isFocused) { + const contentOffset = e.nativeEvent.contentOffset; + const index = Math.ceil(contentOffset.x / width); + console.log('onSnapToItem', index); + if (wallets[index] && (wallets[index].timeToRefreshBalance() || wallets[index].timeToRefreshTransaction())) { + console.log(wallets[index].getLabel(), 'thinks its time to refresh either balance or transactions. refetching both'); + refreshAllWalletTransactions(index, false).finally(() => setIsLoading(false)); + } } }; @@ -277,6 +280,7 @@ const WalletsList = () => { ref={walletsCarousel} testID="WalletsList" horizontal + scrollEnabled={isFocused} /> ); }; diff --git a/screen/wallets/reorderWallets.js b/screen/wallets/reorderWallets.js index 2486b9369..7d3224f38 100644 --- a/screen/wallets/reorderWallets.js +++ b/screen/wallets/reorderWallets.js @@ -4,7 +4,7 @@ import { BluePrivateBalance } from '../../BlueComponents'; import SortableList from 'react-native-sortable-list'; import LinearGradient from 'react-native-linear-gradient'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; -import { useTheme } from '@react-navigation/native'; +import { useNavigation, useTheme } from '@react-navigation/native'; import navigationStyle from '../../components/navigationStyle'; import { PlaceholderWallet, LightningCustodianWallet, MultisigHDWallet } from '../../class'; @@ -77,6 +77,7 @@ const ReorderWallets = () => { const sortableList = useRef(); const { colors } = useTheme(); const { wallets, setWalletsWithNewOrder } = useContext(BlueStorageContext); + const navigation = useNavigation(); const stylesHook = { root: { backgroundColor: colors.elevated, @@ -87,15 +88,19 @@ const ReorderWallets = () => { }; useEffect(() => { - if (sortableList.current?.state.data.length === data.length && hasMovedARow) { - const newWalletsOrderArray = []; - sortableList.current.state.order.forEach(element => { - newWalletsOrderArray.push(data[element]); - }); - setWalletsWithNewOrder(newWalletsOrderArray); - } + const unsubscribe = navigation.addListener('blur', () => { + if (sortableList.current?.state.data.length === data.length && hasMovedARow) { + const newWalletsOrderArray = []; + sortableList.current.state.order.forEach(element => { + newWalletsOrderArray.push(data[element]); + }); + setWalletsWithNewOrder(newWalletsOrderArray); + } + }); + + return unsubscribe; // eslint-disable-next-line react-hooks/exhaustive-deps - }, [hasMovedARow]); + }, [navigation, hasMovedARow]); useEffect(() => { const loadWallets = wallets.filter(wallet => wallet.type !== PlaceholderWallet.type); From aaa1cac5967de20d863f43b0fee60aea79ef8aba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sun, 4 Jul 2021 22:32:35 -0400 Subject: [PATCH 183/327] FIX: Scanning for a batch tx woud reset contentOffset --- ios/Podfile.lock | 8 ++++---- screen/send/details.js | 6 +++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 20b1f0293..12ed68240 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -349,7 +349,7 @@ PODS: - React-Core (= 0.63.4) - React-cxxreact (= 0.63.4) - React-jsi (= 0.63.4) - - RealmJS (10.4.1): + - RealmJS (10.4.2): - GCDWebServer - React - RemobileReactNativeQrcodeLocalImage (1.0.4): @@ -700,7 +700,7 @@ SPEC CHECKSUMS: boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - DoubleConversion: cde416483dac037923206447da6e1454df403714 + DoubleConversion: cf9b38bf0b2d048436d9a82ad2abe1404f11e7de FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e Flipper: 1bd2db48dcc31e4b167b9a33ec1df01c2ded4893 @@ -712,7 +712,7 @@ SPEC CHECKSUMS: FlipperKit: 651f50a42eb95c01b3e89a60996dd6aded529eeb Folly: b73c3869541e86821df3c387eb0af5f65addfab4 GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4 - glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3 + glog: 73c2498ac6884b13ede40eda8228cb1eee9d9d62 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 lottie-ios: 3a3758ef5a008e762faec9c9d50a39842f26d124 lottie-react-native: 4dff8fe8d10ddef9e7880e770080f4a56121397e @@ -751,7 +751,7 @@ SPEC CHECKSUMS: React-RCTText: 5c51df3f08cb9dedc6e790161195d12bac06101c React-RCTVibration: ae4f914cfe8de7d4de95ae1ea6cc8f6315d73d9d ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b - RealmJS: 8a51eff2b9eaabf78b53a6819da6da6edde27467 + RealmJS: 90f2a558fdda19ebb9fcbc0a52c7b1d1b049fb88 RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa RNCAsyncStorage: 8324611026e8dc3706f829953aa6e3899f581589 RNCClipboard: dac13db8b1ce9b998f1cbc7ca33440113602847f diff --git a/screen/send/details.js b/screen/send/details.js index 1b7bf5716..5ce8348bd 100644 --- a/screen/send/details.js +++ b/screen/send/details.js @@ -76,7 +76,6 @@ const SendDetails = () => { const [payjoinUrl, setPayjoinUrl] = useState(null); const [changeAddress, setChangeAddress] = useState(); const [dumb, setDumb] = useState(false); - // if cutomFee is not set, we need to choose highest possible fee for wallet balance // if there are no funds for even Slow option, use 1 sat/byte fee const feeRate = useMemo(() => { @@ -326,6 +325,7 @@ const SendDetails = () => { * @param data {String} Can be address or `bitcoin:xxxxxxx` uri scheme, or invalid garbage */ const processAddressData = data => { + const currentIndex = scrollIndex.current; setIsLoading(true); if (!data.replace) { // user probably scanned PSBT and got an object instead of string..? @@ -340,6 +340,8 @@ const SendDetails = () => { return [...addresses]; }); setIsLoading(false); + // RN Bug: contentOffset gets reset to 0 when state changes. Remove code once this bug is resolved. + setTimeout(() => scrollView.current.scrollToIndex({ index: currentIndex, animated: false }), 50); return; } @@ -373,6 +375,8 @@ const SendDetails = () => { setMemo(options.label || options.message); setAmountUnit(BitcoinUnit.BTC); setPayjoinUrl(options.pj || ''); + // RN Bug: contentOffset gets reset to 0 when state changes. Remove code once this bug is resolved. + setTimeout(() => scrollView.current.scrollToIndex({ index: currentIndex, animated: false }), 50); } setIsLoading(false); From 79c9d9f91d198c9529ca137c99a0ed2fa16d5b4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sun, 4 Jul 2021 23:05:04 -0400 Subject: [PATCH 184/327] REF: Use Switch for SSL Electrum port --- ios/Podfile.lock | 8 +-- loc/en.json | 4 +- screen/settings/electrumSettings.js | 97 ++++++++++++++++++----------- tests/e2e/bluewallet.spec.js | 3 +- 4 files changed, 67 insertions(+), 45 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 20b1f0293..12ed68240 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -349,7 +349,7 @@ PODS: - React-Core (= 0.63.4) - React-cxxreact (= 0.63.4) - React-jsi (= 0.63.4) - - RealmJS (10.4.1): + - RealmJS (10.4.2): - GCDWebServer - React - RemobileReactNativeQrcodeLocalImage (1.0.4): @@ -700,7 +700,7 @@ SPEC CHECKSUMS: boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - DoubleConversion: cde416483dac037923206447da6e1454df403714 + DoubleConversion: cf9b38bf0b2d048436d9a82ad2abe1404f11e7de FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e Flipper: 1bd2db48dcc31e4b167b9a33ec1df01c2ded4893 @@ -712,7 +712,7 @@ SPEC CHECKSUMS: FlipperKit: 651f50a42eb95c01b3e89a60996dd6aded529eeb Folly: b73c3869541e86821df3c387eb0af5f65addfab4 GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4 - glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3 + glog: 73c2498ac6884b13ede40eda8228cb1eee9d9d62 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 lottie-ios: 3a3758ef5a008e762faec9c9d50a39842f26d124 lottie-react-native: 4dff8fe8d10ddef9e7880e770080f4a56121397e @@ -751,7 +751,7 @@ SPEC CHECKSUMS: React-RCTText: 5c51df3f08cb9dedc6e790161195d12bac06101c React-RCTVibration: ae4f914cfe8de7d4de95ae1ea6cc8f6315d73d9d ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b - RealmJS: 8a51eff2b9eaabf78b53a6819da6da6edde27467 + RealmJS: 90f2a558fdda19ebb9fcbc0a52c7b1d1b049fb88 RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa RNCAsyncStorage: 8324611026e8dc3706f829953aa6e3899f581589 RNCClipboard: dac13db8b1ce9b998f1cbc7ca33440113602847f diff --git a/loc/en.json b/loc/en.json index 4cafc498f..3486b449f 100644 --- a/loc/en.json +++ b/loc/en.json @@ -259,8 +259,8 @@ "electrum_connected_not": "Not Connected", "electrum_error_connect": "Can’t connect to the provided Electrum server", "electrum_host": "E.g. {example}", - "electrum_port": "TCP port, usually {example}", - "electrum_port_ssl": "SSL port, usually {example}", + "electrum_port": "Port, usually {example}", + "use_ssl": "Use SSL", "electrum_saved": "Your changes have been saved successfully. Restarting BlueWallet may be required for the changes to take effect.", "set_electrum_server_as_default": "Set {server} as the default Electrum server?", "set_lndhub_as_default": "Set {url} as the default LNDHub server?", diff --git a/screen/settings/electrumSettings.js b/screen/settings/electrumSettings.js index 4db7de398..0321460aa 100644 --- a/screen/settings/electrumSettings.js +++ b/screen/settings/electrumSettings.js @@ -12,6 +12,7 @@ import { Keyboard, KeyboardAvoidingView, Platform, + Switch, } from 'react-native'; import DefaultPreference from 'react-native-default-preference'; import RNWidgetCenter from 'react-native-widget-center'; @@ -46,6 +47,8 @@ export default class ElectrumSettings extends Component { serverHistory: [], config: {}, server, + sslPort: '', + port: '', }; } @@ -231,6 +234,21 @@ export default class ElectrumSettings extends Component { }); }; + useSSLPortToggled = value => { + switch (value) { + case true: + this.setState(prevState => { + return { port: '', sslPort: prevState.port }; + }); + break; + case false: + this.setState(prevState => { + return { port: prevState.sslPort, sslPort: '' }; + }); + break; + } + }; + render() { const serverHistoryItems = this.state.serverHistory.map((server, i) => { return ( @@ -287,45 +305,38 @@ export default class ElectrumSettings extends Component { /> - - this.setState({ port: text.trim() })} - numberOfLines={1} - style={styles.inputText} - editable={!this.state.isLoading} - placeholderTextColor="#81868e" - underlineColorAndroid="transparent" - autoCorrect={false} - autoCapitalize="none" - keyboardType="number-pad" - inputAccessoryViewID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID} - testID="PortInput" - onFocus={() => this.setState({ isAndroidNumericKeyboardFocused: true })} - onBlur={() => this.setState({ isAndroidNumericKeyboardFocused: false })} - /> + + + + this.setState(prevState => { + if (prevState.sslPort?.trim() === '') { + return { port: text.trim(), sslPort: '' }; + } else { + return { port: '', sslPort: text.trim() }; + } + }) + } + numberOfLines={1} + style={styles.inputText} + editable={!this.state.isLoading} + placeholderTextColor="#81868e" + underlineColorAndroid="transparent" + autoCorrect={false} + autoCapitalize="none" + keyboardType="number-pad" + inputAccessoryViewID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID} + testID="PortInput" + onFocus={() => this.setState({ isAndroidNumericKeyboardFocused: true })} + onBlur={() => this.setState({ isAndroidNumericKeyboardFocused: false })} + /> + + {loc.settings.use_ssl} + 0} onValueChange={this.useSSLPortToggled} /> - - this.setState({ sslPort: text.trim() })} - numberOfLines={1} - style={styles.inputText} - editable={!this.state.isLoading} - autoCorrect={false} - placeholderTextColor="#81868e" - autoCapitalize="none" - keyboardType="number-pad" - underlineColorAndroid="transparent" - inputAccessoryViewID={BlueDismissKeyboardInputAccessory.InputAccessoryViewID} - testID="SSLPortInput" - onFocus={() => this.setState({ isAndroidNumericKeyboardFocused: true })} - onBlur={() => this.setState({ isAndroidNumericKeyboardFocused: false })} - /> - {loc.settings.electrum_settings_explain} @@ -438,6 +449,11 @@ const styles = StyleSheet.create({ textAlign: 'center', color: BlueCurrentTheme.colors.foregroundColor, }, + usePort: { + textAlign: 'center', + color: BlueCurrentTheme.colors.foregroundColor, + marginHorizontal: 8, + }, explain: { color: BlueCurrentTheme.colors.feeText, marginBottom: -24, @@ -449,6 +465,7 @@ const styles = StyleSheet.create({ alignItems: 'flex-start', }, inputWrap: { + flex: 1, flexDirection: 'row', borderColor: BlueCurrentTheme.colors.formBorder, borderBottomColor: BlueCurrentTheme.colors.formBorder, @@ -460,6 +477,12 @@ const styles = StyleSheet.create({ alignItems: 'center', borderRadius: 4, }, + portWrap: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + }, inputText: { flex: 1, marginHorizontal: 8, diff --git a/tests/e2e/bluewallet.spec.js b/tests/e2e/bluewallet.spec.js index c0ce2bbbf..388024644 100644 --- a/tests/e2e/bluewallet.spec.js +++ b/tests/e2e/bluewallet.spec.js @@ -86,7 +86,6 @@ describe('BlueWallet UI Tests', () => { await element(by.id('ElectrumSettings')).tap(); await element(by.id('HostInput')).replaceText('electrum.blockstream.info\n'); await element(by.id('PortInput')).replaceText('50001\n'); - await element(by.id('SSLPortInput')).replaceText('50002\n'); await element(by.id('Save')).tap(); await sup('OK'); await element(by.text('OK')).tap(); @@ -95,7 +94,7 @@ describe('BlueWallet UI Tests', () => { await element(by.text('OK')).tap(); await expect(element(by.id('HostInput'))).toHaveText(''); await expect(element(by.id('PortInput'))).toHaveText(''); - await expect(element(by.id('SSLPortInput'))).toHaveText(''); + await expect(element(by.id('SSLPortInput'))).toHaveToggleValue(false); await device.pressBack(); // network -> lightning From d0bf044895db4015679e6beed29e021c627a248e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sun, 4 Jul 2021 23:30:40 -0400 Subject: [PATCH 185/327] DEL: Flow --- .flowconfig | 75 ----------------------------------------------- package-lock.json | 31 -------------------- package.json | 2 -- 3 files changed, 108 deletions(-) delete mode 100644 .flowconfig diff --git a/.flowconfig b/.flowconfig deleted file mode 100644 index 4bead39d6..000000000 --- a/.flowconfig +++ /dev/null @@ -1,75 +0,0 @@ -[ignore] -; We fork some components by platform -.*/*[.]android.js - -; Ignore "BUCK" generated dirs -/\.buckd/ - -; Ignore polyfills -node_modules/react-native/Libraries/polyfills/.* - -; These should not be required directly -; require from fbjs/lib instead: require('fbjs/lib/warning') -node_modules/warning/.* - -; Flow doesn't support platforms -.*/Libraries/Utilities/LoadingView.js - -[untyped] -.*/node_modules/@react-native-community/cli/.*/.* - -[include] - -[libs] -node_modules/react-native/interface.js -node_modules/react-native/flow/ - -[options] -emoji=true - -esproposal.optional_chaining=enable -esproposal.nullish_coalescing=enable - -module.file_ext=.js -module.file_ext=.json -module.file_ext=.ios.js - -munge_underscores=true - -module.name_mapper='^react-native/\(.*\)$' -> '/node_modules/react-native/\1' -module.name_mapper='^@?[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> '/node_modules/react-native/Libraries/Image/RelativeImageStub' - -suppress_type=$FlowIssue -suppress_type=$FlowFixMe -suppress_type=$FlowFixMeProps -suppress_type=$FlowFixMeState - -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\)?:? #[0-9]+ -suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError - -[lints] -sketchy-null-number=warn -sketchy-null-mixed=warn -sketchy-number=warn -untyped-type-import=warn -nonstrict-import=warn -deprecated-type=warn -unsafe-getters-setters=warn -inexact-spread=warn -unnecessary-invariant=warn -signature-verification-failure=warn -deprecated-utility=error - -[strict] -deprecated-type -nonstrict-import -sketchy-null -unclear-type -unsafe-getters-setters -untyped-import -untyped-type-import - -[version] -^0.122.0 - \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3e09b75e2..cd9bd3f10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5204,27 +5204,11 @@ "@babel/helper-define-polyfill-provider": "^0.2.0" } }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", - "dev": true - }, "babel-plugin-syntax-trailing-function-commas": { "version": "7.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true, - "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } - }, "babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", @@ -5298,15 +5282,6 @@ "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" } }, - "babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" - } - }, "babel-preset-jest": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", @@ -9053,12 +9028,6 @@ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, - "flow-bin": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.150.0.tgz", - "integrity": "sha512-s+0dcKJnZZO6mkS92YtJzBZ6vq7i1o77+NggEiiefPpCVsehwPlyRLmEnb6XN9OI5OfXp+kFnZt4q8a3zLNuUg==", - "dev": true - }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", diff --git a/package.json b/package.json index dcf0bba9e..5e87bce2b 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,6 @@ "babel-cli": "^6.26.0", "babel-eslint": "^10.1.0", "babel-jest": "^26.1.0", - "babel-preset-flow": "^6.23.0", "eslint": "^7.25.0", "eslint-config-prettier": "^8.3.0", "eslint-config-standard": "^16.0.2", @@ -27,7 +26,6 @@ "eslint-plugin-promise": "^5.1.0", "eslint-plugin-react": "^7.23.2", "eslint-plugin-standard": "^4.1.0", - "flow-bin": "^0.150.0", "jest": "^26.1.0", "prettier": "^2.2.1", "react-test-renderer": "16.13.1" From ff09a64d8de518deeb727f4273131dd3f3c2c133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Mon, 5 Jul 2021 13:56:11 -0400 Subject: [PATCH 186/327] Update list.js --- screen/wallets/list.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/screen/wallets/list.js b/screen/wallets/list.js index 570c53429..dfc3822ab 100644 --- a/screen/wallets/list.js +++ b/screen/wallets/list.js @@ -203,14 +203,14 @@ const WalletsList = () => { }; const onSnapToItem = e => { - if (isFocused) { - const contentOffset = e.nativeEvent.contentOffset; - const index = Math.ceil(contentOffset.x / width); - console.log('onSnapToItem', index); - if (wallets[index] && (wallets[index].timeToRefreshBalance() || wallets[index].timeToRefreshTransaction())) { - console.log(wallets[index].getLabel(), 'thinks its time to refresh either balance or transactions. refetching both'); - refreshAllWalletTransactions(index, false).finally(() => setIsLoading(false)); - } + if (!isFocused) return; + + const contentOffset = e.nativeEvent.contentOffset; + const index = Math.ceil(contentOffset.x / width); + console.log('onSnapToItem', index); + if (wallets[index] && (wallets[index].timeToRefreshBalance() || wallets[index].timeToRefreshTransaction())) { + console.log(wallets[index].getLabel(), 'thinks its time to refresh either balance or transactions. refetching both'); + refreshAllWalletTransactions(index, false).finally(() => setIsLoading(false)); } }; From 63dde7d10920266445367ebd50b1f648587b2a11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Mon, 5 Jul 2021 15:12:28 -0400 Subject: [PATCH 187/327] FIX: Port wasnt being saved --- ios/Podfile.lock | 4 ++-- screen/settings/electrumSettings.js | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 12ed68240..bce823aad 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -700,7 +700,7 @@ SPEC CHECKSUMS: boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - DoubleConversion: cf9b38bf0b2d048436d9a82ad2abe1404f11e7de + DoubleConversion: cde416483dac037923206447da6e1454df403714 FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e Flipper: 1bd2db48dcc31e4b167b9a33ec1df01c2ded4893 @@ -712,7 +712,7 @@ SPEC CHECKSUMS: FlipperKit: 651f50a42eb95c01b3e89a60996dd6aded529eeb Folly: b73c3869541e86821df3c387eb0af5f65addfab4 GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4 - glog: 73c2498ac6884b13ede40eda8228cb1eee9d9d62 + glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 lottie-ios: 3a3758ef5a008e762faec9c9d50a39842f26d124 lottie-react-native: 4dff8fe8d10ddef9e7880e770080f4a56121397e diff --git a/screen/settings/electrumSettings.js b/screen/settings/electrumSettings.js index 0321460aa..a484dd232 100644 --- a/screen/settings/electrumSettings.js +++ b/screen/settings/electrumSettings.js @@ -62,7 +62,6 @@ export default class ElectrumSettings extends Component { const sslPort = await AsyncStorage.getItem(BlueElectrum.ELECTRUM_SSL_PORT); const serverHistoryStr = await AsyncStorage.getItem(BlueElectrum.ELECTRUM_SERVER_HISTORY); const serverHistory = JSON.parse(serverHistoryStr) || []; - this.setState({ isLoading: false, host, @@ -309,7 +308,7 @@ export default class ElectrumSettings extends Component { this.setState(prevState => { if (prevState.sslPort?.trim() === '') { From a163819d0bebfa9e024c0d30f098ad24aaafb217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Mon, 5 Jul 2021 15:43:57 -0400 Subject: [PATCH 188/327] ADD: "at" for clearer understanding of presented timestamp --- .../ComplicationController.swift | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ios/BlueWalletWatch Extension/ComplicationController.swift b/ios/BlueWalletWatch Extension/ComplicationController.swift index d6c57fce1..88f14dcb2 100644 --- a/ios/BlueWalletWatch Extension/ComplicationController.swift +++ b/ios/BlueWalletWatch Extension/ComplicationController.swift @@ -60,7 +60,6 @@ class ComplicationController: NSObject, CLKComplicationDataSource { date = Date() } - let line1Text = CLKSimpleTextProvider(text:valueLabel) let line2Text = CLKSimpleTextProvider(text:currencySymbol) let line1SmallText = CLKSimpleTextProvider(text: valueSmallLabel) @@ -139,7 +138,7 @@ class ComplicationController: NSObject, CLKComplicationDataSource { if #available(watchOSApplicationExtension 6.0, *) { template.headerTextProvider = CLKTextProvider(format: "Bitcoin Price") template.body1TextProvider = CLKTextProvider(format: "%@%@", currencySymbol, valueLabel) - template.body2TextProvider = CLKTextProvider(format: "%@", timeLabel) + template.body2TextProvider = CLKTextProvider(format: "at %@", timeLabel) entry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template) handler(entry) } else { @@ -149,7 +148,7 @@ class ComplicationController: NSObject, CLKComplicationDataSource { let template = CLKComplicationTemplateExtraLargeStackText() if #available(watchOSApplicationExtension 6.0, *) { template.line1TextProvider = CLKTextProvider(format: "%@%@", currencySymbol, valueLabel) - template.line2TextProvider = CLKTextProvider(format: "%@", timeLabel) + template.line2TextProvider = CLKTextProvider(format: "at %@", timeLabel) entry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template) handler(entry) } else { @@ -160,7 +159,7 @@ class ComplicationController: NSObject, CLKComplicationDataSource { if #available(watchOSApplicationExtension 6.0, *) { template.headerTextProvider = CLKTextProvider(format: "Bitcoin Price") template.body1TextProvider = CLKTextProvider(format: "%@%@", currencySymbol, valueLabel) - template.body2TextProvider = CLKTextProvider(format: "%@", timeLabel) + template.body2TextProvider = CLKTextProvider(format: "at %@", timeLabel) entry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template) handler(entry) } else { @@ -170,7 +169,7 @@ class ComplicationController: NSObject, CLKComplicationDataSource { if #available(watchOSApplicationExtension 7.0, *) { let template = CLKComplicationTemplateGraphicExtraLargeCircularStackText() template.line1TextProvider = CLKTextProvider(format: "%@%@", currencySymbol, valueLabel) - template.line1TextProvider = CLKTextProvider(format: "%@", timeLabel) + template.line1TextProvider = CLKTextProvider(format: "at %@", timeLabel) entry = CLKComplicationTimelineEntry(date: date, complicationTemplate: template) handler(entry) } else { From fc93e9243ee50580c1b8880fd5e0cd4b3c9d2ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Dias?= Date: Tue, 6 Jul 2021 06:37:15 -0300 Subject: [PATCH 189/327] REF: Hierarchy navigator screen --- components/addresses/AddressItem.js | 94 ++++++++++++++++++------ components/addresses/AddressTypeBadge.js | 28 ++++++- components/addresses/AddressTypeTabs.js | 94 ++++++++++++++++++++++++ loc/ar.json | 1 - loc/cs_cz.json | 1 - loc/cy.json | 1 - loc/de_de.json | 1 - loc/en.json | 5 +- loc/es_419.json | 1 - loc/fa.json | 1 - loc/fr_fr.json | 1 - loc/pl.json | 1 - loc/pt_br.json | 1 - loc/sl_SI.json | 1 - screen/wallets/addresses.js | 62 +++++++++------- tests/unit/addresses.test.js | 60 +++++++++++---- 16 files changed, 274 insertions(+), 79 deletions(-) create mode 100644 components/addresses/AddressTypeTabs.js diff --git a/components/addresses/AddressItem.js b/components/addresses/AddressItem.js index ab7521e98..300b3b4f4 100644 --- a/components/addresses/AddressItem.js +++ b/components/addresses/AddressItem.js @@ -1,6 +1,6 @@ import React, { useRef } from 'react'; import { StyleSheet, Text, View } from 'react-native'; -import { useTheme } from '@react-navigation/native'; +import { useNavigation, useTheme } from '@react-navigation/native'; import { ListItem } from 'react-native-elements'; import PropTypes from 'prop-types'; import { AddressTypeBadge } from './AddressTypeBadge'; @@ -9,11 +9,13 @@ import TooltipMenu from '../TooltipMenu'; import Clipboard from '@react-native-clipboard/clipboard'; import Share from 'react-native-share'; -const AddressItem = ({ item, balanceUnit, onPress }) => { +const AddressItem = ({ item, balanceUnit, walletID, allowSignVerifyMessage }) => { const { colors } = useTheme(); const tooltip = useRef(); const listItem = useRef(); + const hasTransactions = item.transactions > 0; + const stylesHook = StyleSheet.create({ container: { borderBottomColor: colors.lightBorder, @@ -28,8 +30,33 @@ const AddressItem = ({ item, balanceUnit, onPress }) => { balance: { color: colors.alternativeTextColor, }, + address: { + color: hasTransactions ? colors.darkGray : colors.buttonTextColor, + }, }); + const { navigate } = useNavigation(); + + const navigateToReceive = () => { + navigate('ReceiveDetailsRoot', { + screen: 'ReceiveDetails', + params: { + walletID, + address: item.address, + }, + }); + }; + + const navigateToSignVerify = () => { + navigate('SignVerifyRoot', { + screen: 'SignVerify', + params: { + walletID, + address: item.address, + }, + }); + }; + const showToolTipMenu = () => { tooltip.current.showMenu(); }; @@ -44,30 +71,40 @@ const AddressItem = ({ item, balanceUnit, onPress }) => { Share.open({ message: item.address }).catch(error => console.log(error)); }; + const getAvailableActions = () => { + const actions = [ + { + id: 'copyToClipboard', + text: loc.transactions.details_copy, + onPress: handleCopyPress, + }, + { + id: 'share', + text: loc.receive.details_share, + onPress: handleSharePress, + }, + ]; + + if (allowSignVerifyMessage) { + actions.push({ + id: 'signVerify', + text: loc.addresses.sign_title, + onPress: navigateToSignVerify, + }); + } + + return actions; + }; + const render = () => { return ( - + @@ -76,9 +113,16 @@ const AddressItem = ({ item, balanceUnit, onPress }) => { {item.index + 1}{' '} {item.address} - {balance} + + {balance} + - + + + + {loc.addresses.transactions}: {item.transactions} + + ); @@ -89,7 +133,7 @@ const AddressItem = ({ item, balanceUnit, onPress }) => { const styles = StyleSheet.create({ address: { - fontWeight: '600', + fontWeight: 'bold', marginHorizontal: 40, }, index: { @@ -99,6 +143,12 @@ const styles = StyleSheet.create({ marginTop: 8, marginLeft: 14, }, + subtitle: { + flex: 1, + flexDirection: 'row', + justifyContent: 'space-between', + width: '100%', + }, }); AddressItem.propTypes = { diff --git a/components/addresses/AddressTypeBadge.js b/components/addresses/AddressTypeBadge.js index bcbcda666..ba3880b45 100644 --- a/components/addresses/AddressTypeBadge.js +++ b/components/addresses/AddressTypeBadge.js @@ -9,27 +9,46 @@ const styles = StyleSheet.create({ paddingVertical: 4, paddingHorizontal: 10, borderRadius: 20, + alignSelf: 'flex-end', }, badgeText: { fontSize: 12, + textAlign: 'center', }, }); -const AddressTypeBadge = ({ isInternal }) => { +const AddressTypeBadge = ({ isInternal, hasTransactions }) => { const { colors } = useTheme(); const stylesHook = StyleSheet.create({ changeBadge: { backgroundColor: colors.changeBackground }, receiveBadge: { backgroundColor: colors.receiveBackground }, + usedBadge: { backgroundColor: colors.buttonDisabledBackgroundColor }, changeText: { color: colors.changeText }, receiveText: { color: colors.receiveText }, + usedText: { color: colors.alternativeTextColor }, }); - const badgeLabel = isInternal ? loc.addresses.type_change : loc.addresses.type_receive; + // eslint-disable-next-line prettier/prettier + const badgeLabel = hasTransactions + ? loc.addresses.type_used + : isInternal + ? loc.addresses.type_change + : loc.addresses.type_receive; - const badgeStyle = isInternal ? stylesHook.changeBadge : stylesHook.receiveBadge; + // eslint-disable-next-line prettier/prettier + const badgeStyle = hasTransactions + ? stylesHook.usedBadge + : isInternal + ? stylesHook.changeBadge + : stylesHook.receiveBadge; - const textStyle = isInternal ? stylesHook.changeText : stylesHook.receiveText; + // eslint-disable-next-line prettier/prettier + const textStyle = hasTransactions + ? stylesHook.usedText + : isInternal + ? stylesHook.changeText + : stylesHook.receiveText; return ( @@ -40,6 +59,7 @@ const AddressTypeBadge = ({ isInternal }) => { AddressTypeBadge.propTypes = { isInternal: PropTypes.bool, + hasTransactions: PropTypes.bool, }; export { AddressTypeBadge }; diff --git a/components/addresses/AddressTypeTabs.js b/components/addresses/AddressTypeTabs.js new file mode 100644 index 000000000..9e63ab698 --- /dev/null +++ b/components/addresses/AddressTypeTabs.js @@ -0,0 +1,94 @@ +import { useTheme } from '@react-navigation/native'; +import React from 'react'; +import { View, Text, StyleSheet } from 'react-native'; +import loc from '../../loc'; + +export const TABS = { + EXTERNAL: 'receive', + INTERNAL: 'change', +}; + +const AddressTypeTabs = ({ currentTab, setCurrentTab }) => { + const { colors } = useTheme(); + + const stylesHook = StyleSheet.create({ + activeTab: { + backgroundColor: colors.modal, + }, + activeText: { + fontWeight: 'bold', + color: colors.foregroundColor, + }, + inactiveTab: { + fontWeight: 'normal', + color: colors.foregroundColor, + }, + backTabs: { + backgroundColor: colors.buttonDisabledBackgroundColor, + }, + }); + + const tabs = Object.entries(TABS).map(([key, value]) => { + return { + key, + value, + name: loc.addresses[`type_${value}`], + }; + }); + + const changeToTab = tabKey => { + if (tabKey in TABS) { + setCurrentTab(TABS[tabKey]); + } + }; + + const render = () => { + const tabsButtons = tabs.map(tab => { + const isActive = tab.value === currentTab; + + const tabStyle = isActive ? stylesHook.activeTab : stylesHook.inactiveTab; + const textStyle = isActive ? stylesHook.activeText : stylesHook.inactiveTab; + + return ( + changeToTab(tab.key)} style={[styles.tab, tabStyle]}> + changeToTab(tab.key)} style={textStyle}>{tab.name} + + ); + }); + + return ( + + + {tabsButtons} + + + ); + }; + + return render(); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + flexDirection: 'row', + justifyContent: 'center', + }, + backTabs: { + padding: 4, + marginVertical: 8, + borderRadius: 8, + }, + tabs: { + flex: 1, + flexDirection: 'row', + justifyContent: 'center', + }, + tab: { + borderRadius: 6, + paddingVertical: 8, + paddingHorizontal: 16, + }, +}); + +export { AddressTypeTabs }; diff --git a/loc/ar.json b/loc/ar.json index cfbe6db2f..a39a4b526 100644 --- a/loc/ar.json +++ b/loc/ar.json @@ -579,7 +579,6 @@ "sign_placeholder_signature": "التوقيع", "sign_aopp_title": "AOPP", "sign_aopp_confirm": "هل تريد إرسال رسالة موقعة إلى {hostname}؟", - "address_balance": "الرصيد: {Balance} ساتوشي", "addresses_title": "العنوان", "type_change": "تغيير", "type_receive": "استلام" diff --git a/loc/cs_cz.json b/loc/cs_cz.json index 1ae28e7a9..d647d6dec 100644 --- a/loc/cs_cz.json +++ b/loc/cs_cz.json @@ -579,7 +579,6 @@ "sign_placeholder_signature": "Podpis", "sign_aopp_title": "AOPP", "sign_aopp_confirm": "Chcete poslat podepsanou zprávu uživateli {hostname}?", - "address_balance": "Zůstatek: {balance} sats", "addresses_title": "Adresy", "type_change": "Změnit", "type_receive": "Příjmout" diff --git a/loc/cy.json b/loc/cy.json index a3f953c9d..734720772 100644 --- a/loc/cy.json +++ b/loc/cy.json @@ -283,7 +283,6 @@ "sign_placeholder_address": "Cyfeiriad", "sign_placeholder_message": "Neges", "sign_placeholder_signature": "Llofnod", - "address_balance": "Balans: {balance} sats", "addresses_title": "Cyfeiriadau", "type_change": "Newid", "type_receive": "Derbyn" diff --git a/loc/de_de.json b/loc/de_de.json index 8ec6453db..53e542662 100644 --- a/loc/de_de.json +++ b/loc/de_de.json @@ -579,7 +579,6 @@ "sign_placeholder_signature": "Signatur", "sign_aopp_title": "AOPP", "sign_aopp_confirm": "Senden der signierten Nachricht nach {hostname}?", - "address_balance": "Guthaben: {balance} sats", "addresses_title": "Adressen", "type_change": "Wechsel", "type_receive": "Empfang" diff --git a/loc/en.json b/loc/en.json index 4cafc498f..6b49dd27d 100644 --- a/loc/en.json +++ b/loc/en.json @@ -579,10 +579,11 @@ "sign_placeholder_signature": "Signature", "sign_aopp_title": "AOPP", "sign_aopp_confirm": "Do you want to send signed message to {hostname}?", - "address_balance": "Balance: {balance} sats", "addresses_title": "Addresses", "type_change": "Change", - "type_receive": "Receive" + "type_receive": "Receive", + "type_used": "Used", + "transactions": "Transactions" }, "aopp": { "title": "Select Address", diff --git a/loc/es_419.json b/loc/es_419.json index 48c78c52b..b70bf3033 100644 --- a/loc/es_419.json +++ b/loc/es_419.json @@ -579,7 +579,6 @@ "sign_placeholder_signature": "Firma", "sign_aopp_title": "AOPP", "sign_aopp_confirm": "¿Quieres enviar un mensaje firmado a {hostname}?", - "address_balance": "Saldo: {balance} sats", "addresses_title": "Direcciones", "type_change": "Cambio", "type_receive": "Recibir" diff --git a/loc/fa.json b/loc/fa.json index 4529f8c90..b515cccef 100644 --- a/loc/fa.json +++ b/loc/fa.json @@ -579,7 +579,6 @@ "sign_placeholder_signature": "امضا", "sign_aopp_title": "پروتکل اثبات مالکیت آدرس (AOPP)", "sign_aopp_confirm": "آیا مایل به ارسال پیام امضاشده به {hostname} هستید؟", - "address_balance": "موجودی: {balance} ساتوشی", "addresses_title": "آدرس‌ها", "type_change": "باقی‌مانده", "type_receive": "دریافت" diff --git a/loc/fr_fr.json b/loc/fr_fr.json index 5c0f79119..068136f4d 100644 --- a/loc/fr_fr.json +++ b/loc/fr_fr.json @@ -579,7 +579,6 @@ "sign_placeholder_signature": "Signature", "sign_aopp_title": "AOPP", "sign_aopp_confirm": "Voulez-vous envoyer un message signé à {hostname} ?", - "address_balance": "Solde : {balance} sats", "addresses_title": "Adresses", "type_change": "Monnaie", "type_receive": "Réception" diff --git a/loc/pl.json b/loc/pl.json index ab28ab01b..81cc34e50 100644 --- a/loc/pl.json +++ b/loc/pl.json @@ -579,7 +579,6 @@ "sign_placeholder_signature": "Podpis", "sign_aopp_title": "AOPP", "sign_aopp_confirm": "Czy chcesz wysłać podpisaną wiadomość do [hostname]?", - "address_balance": "Saldo: {balance} sats", "addresses_title": "Adresy", "type_change": "Reszta", "type_receive": "Otrzymaj" diff --git a/loc/pt_br.json b/loc/pt_br.json index 1805109c6..6fd07966d 100644 --- a/loc/pt_br.json +++ b/loc/pt_br.json @@ -578,7 +578,6 @@ "sign_placeholder_signature": "Assinatura", "sign_aopp_title": "AOPP", "sign_aopp_confirm": "Você deseja enviar a mensagem assinada para {hostname}?", - "address_balance": "Saldo: {balance} sats", "addresses_title": "Endereços", "type_change": "Troco", "type_receive": "Receber" diff --git a/loc/sl_SI.json b/loc/sl_SI.json index 26e4d0e6e..b710db54f 100644 --- a/loc/sl_SI.json +++ b/loc/sl_SI.json @@ -578,7 +578,6 @@ "sign_placeholder_signature": "Podpis", "sign_aopp_title": "AOPP", "sign_aopp_confirm": "Ali želite podpisano sporočilo poslati na {hostname}?", - "address_balance": "Stanje: {balance} sats", "addresses_title": "Naslovi", "type_change": "Vračilo", "type_receive": "Prejemni" diff --git a/screen/wallets/addresses.js b/screen/wallets/addresses.js index 75efbdc75..a0e29735d 100644 --- a/screen/wallets/addresses.js +++ b/screen/wallets/addresses.js @@ -1,11 +1,12 @@ import React, { useCallback, useState, useContext, useRef, useEffect } from 'react'; import { ActivityIndicator, FlatList, StyleSheet, View, StatusBar } from 'react-native'; -import { useFocusEffect, useNavigation, useRoute, useTheme } from '@react-navigation/native'; +import { useFocusEffect, useRoute, useTheme } from '@react-navigation/native'; import Privacy from '../../blue_modules/Privacy'; import { BlueStorageContext } from '../../blue_modules/storage-context'; import loc from '../../loc'; import navigationStyle from '../../components/navigationStyle'; import { AddressItem } from '../../components/addresses/AddressItem'; +import { AddressTypeTabs, TABS } from '../../components/addresses/AddressTypeTabs'; import { WatchOnlyWallet } from '../../class'; export const totalBalance = ({ c, u } = { c: 0, u: 0 }) => c + u; @@ -13,13 +14,16 @@ export const totalBalance = ({ c, u } = { c: 0, u: 0 }) => c + u; export const getAddress = (wallet, index, isInternal) => { let address; let balance = 0; + let transactions = 0; if (isInternal) { address = wallet._getInternalAddressByIndex(index); balance = totalBalance(wallet._balances_by_internal_index[index]); + transactions = wallet._txs_by_internal_index[index].length; } else { address = wallet._getExternalAddressByIndex(index); balance = totalBalance(wallet._balances_by_external_index[index]); + transactions = wallet._txs_by_external_index[index].length; } return { @@ -28,16 +32,22 @@ export const getAddress = (wallet, index, isInternal) => { address, isInternal, balance, - transactions: 0, + transactions, }; }; -export const sortByIndexAndType = (a, b) => { - if (a.isInternal > b.isInternal) return 1; - if (a.isInternal < b.isInternal) return -1; +export const sortByAddressIndex = (a, b) => { + if (a.index > b.index) { + return 1; + } + return -1; +}; - if (a.index > b.index) return 1; - if (a.index < b.index) return -1; +export const filterByAddressType = (type, isInternal, currentType) => { + if (currentType === type) { + return isInternal === true; + } + return isInternal === false; }; const WalletAddresses = () => { @@ -45,6 +55,8 @@ const WalletAddresses = () => { const [addresses, setAddresses] = useState([]); + const [currentTab, setCurrentTab] = useState(TABS.EXTERNAL); + const { wallets } = useContext(BlueStorageContext); const { walletID } = useRoute().params; @@ -55,18 +67,25 @@ const WalletAddresses = () => { const balanceUnit = wallet.getPreferredBalanceUnit(); - const walletInstance = wallet.type === WatchOnlyWallet.type ? wallet._hdWalletInstance : wallet; + const isWatchOnly = wallet.type === WatchOnlyWallet.type; + + const walletInstance = isWatchOnly ? wallet._hdWalletInstance : wallet; + + const allowSignVerifyMessage = 'allowSignVerifyMessage' in wallet && wallet.allowSignVerifyMessage(); const { colors } = useTheme(); - const { navigate } = useNavigation(); - const stylesHook = StyleSheet.create({ root: { backgroundColor: colors.elevated, }, }); + // computed property + const filteredAddresses = addresses + .filter(address => filterByAddressType(TABS.INTERNAL, address.isInternal, currentTab)) + .sort(sortByAddressIndex); + useEffect(() => { if (showAddresses) { addressList.current.scrollToIndex({ animated: false, index: 0 }); @@ -76,7 +95,7 @@ const WalletAddresses = () => { const getAddresses = () => { const addressList = []; - for (let index = 0; index < walletInstance.next_free_change_address_index + walletInstance.gap_limit; index++) { + for (let index = 0; index <= walletInstance.next_free_change_address_index; index++) { const address = getAddress(walletInstance, index, true); addressList.push(address); @@ -88,7 +107,7 @@ const WalletAddresses = () => { addressList.push(address); } - setAddresses(addressList.sort(sortByIndexAndType)); + setAddresses(addressList); setShowAddresses(true); }; @@ -102,18 +121,8 @@ const WalletAddresses = () => { }, []), ); - const navigateToReceive = item => { - navigate('ReceiveDetailsRoot', { - screen: 'ReceiveDetails', - params: { - walletID, - address: item.item.address, - }, - }); - }; - const renderRow = item => { - return navigateToReceive(item)} />; + return ; }; return ( @@ -122,13 +131,14 @@ const WalletAddresses = () => { } centerContent={!showAddresses} contentInsetAdjustmentBehavior="automatic" + ListHeaderComponent={} /> ); diff --git a/tests/unit/addresses.test.js b/tests/unit/addresses.test.js index ab2db20a1..920ec4383 100644 --- a/tests/unit/addresses.test.js +++ b/tests/unit/addresses.test.js @@ -1,21 +1,49 @@ import assert from 'assert'; -import { getAddress, sortByIndexAndType, totalBalance } from '../../screen/wallets/addresses'; +import { getAddress, sortByAddressIndex, totalBalance, filterByAddressType } from '../../screen/wallets/addresses'; +import { TABS } from '../../components/addresses/AddressTypeTabs'; + +const mockAddressesList = [ + { index: 2, isInternal: false, key: 'third_external_address' }, + { index: 0, isInternal: true, key: 'first_internal_address' }, + { index: 1, isInternal: false, key: 'second_external_address' }, + { index: 1, isInternal: true, key: 'second_internal_address' }, + { index: 0, isInternal: false, key: 'first_external_address' }, +]; describe('Addresses', () => { - it('Sort by index ASC and externals first', () => { - const originalList = [ - { index: 0, isInternal: true, key: 'first_internal_address' }, - { index: 1, isInternal: false, key: 'second_external_address' }, - { index: 1, isInternal: true, key: 'second_internal_address' }, - { index: 0, isInternal: false, key: 'first_external_address' }, - ]; + it('Sort by index', () => { + const sortedList = mockAddressesList.sort(sortByAddressIndex); - const sortedList = originalList.sort(sortByIndexAndType); + assert.strictEqual(sortedList[0].index, 0); + assert.strictEqual(sortedList[2].index, 1); + assert.strictEqual(sortedList[4].index, 2); + }); - assert.strictEqual(sortedList[0].key, 'first_external_address'); - assert.strictEqual(sortedList[1].key, 'second_external_address'); - assert.strictEqual(sortedList[2].key, 'first_internal_address'); - assert.strictEqual(sortedList[3].key, 'second_internal_address'); + it('Have tabs defined', () => { + const tabsEnum = { + EXTERNAL: 'receive', + INTERNAL: 'change', + }; + + assert.deepStrictEqual(TABS, tabsEnum); + }); + + it('Filter by type', () => { + let currentTab = TABS.EXTERNAL; + + const externalAddresses = mockAddressesList.filter(address => filterByAddressType(TABS.INTERNAL, address.isInternal, currentTab)); + + currentTab = TABS.INTERNAL; + + const internalAddresses = mockAddressesList.filter(address => filterByAddressType(TABS.INTERNAL, address.isInternal, currentTab)); + + externalAddresses.forEach(address => { + assert.strictEqual(address.isInternal, false); + }); + + internalAddresses.forEach(address => { + assert.strictEqual(address.isInternal, true); + }); }); it('Sum confirmed/unconfirmed balance', () => { @@ -34,6 +62,8 @@ describe('Addresses', () => { _getInternalAddressByIndex: index => `internal_address_${index}`, _balances_by_external_index: [{ c: 0, u: 0 }], _balances_by_internal_index: [{ c: 0, u: 0 }], + _txs_by_external_index: { 0: [{}] }, + _txs_by_internal_index: { 0: [{}, {}] }, }; const firstExternalAddress = getAddress(fakeWallet, 0, false); @@ -45,7 +75,7 @@ describe('Addresses', () => { index: 0, isInternal: false, key: 'external_address_0', - transactions: 0, + transactions: 1, }); assert.deepStrictEqual(firstInternalAddress, { @@ -54,7 +84,7 @@ describe('Addresses', () => { index: 0, isInternal: true, key: 'internal_address_0', - transactions: 0, + transactions: 2, }); }); }); From bac8a23d4f3cafe26d343eb633c46c941582fe27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Tue, 6 Jul 2021 05:38:53 -0400 Subject: [PATCH 190/327] OPS: Upgrade RN 0.64.2 (#3170) OPS: Upgrade RN 0.64.1 FIX: Re-order wallet bug --- .gitattributes | 3 +- _editorconfig | 4 + android/app/build.gradle | 26 +- android/app/src/main/res/values/styles.xml | 2 +- android/build.gradle | 28 +- android/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/gradlew.bat | 7 +- ios/BlueWallet.xcodeproj/project.pbxproj | 16 +- ios/Podfile | 12 +- ios/Podfile.lock | 568 ++--- metro.config.js | 34 +- package-lock.json | 1967 +++++++++-------- package.json | 27 +- tests/e2e/bluewallet.spec.js | 8 +- 15 files changed, 1417 insertions(+), 1289 deletions(-) create mode 100644 _editorconfig diff --git a/.gitattributes b/.gitattributes index 7c669b1f5..d6149af24 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,5 @@ *.pbxproj -text *.patch -text -# specific for windows script files +# Windows files should use crlf line endings +# https://help.github.com/articles/dealing-with-line-endings/ *.bat text eol=crlf \ No newline at end of file diff --git a/_editorconfig b/_editorconfig new file mode 100644 index 000000000..358a10245 --- /dev/null +++ b/_editorconfig @@ -0,0 +1,4 @@ +# Windows files +[*.bat] +end_of_line = crlf + diff --git a/android/app/build.gradle b/android/app/build.gradle index 24e89fa41..b168717e7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -20,7 +20,7 @@ import com.android.build.OutputFile * // default. Can be overridden with ENTRY_FILE environment variable. * entryFile: "index.android.js", * - * // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format + * // https://reactnative.dev/docs/performance#enable-the-ram-format * bundleCommand: "ram-bundle", * * // whether to bundle JS and assets in debug mode @@ -121,7 +121,10 @@ def jscFlavor = 'org.webkit:android-jsc-intl:+' def enableHermes = project.ext.react.get("enableHermes", false); android { + ndkVersion rootProject.ext.ndkVersion + compileSdkVersion rootProject.ext.compileSdkVersion + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -150,10 +153,11 @@ android { include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" } } + buildTypes { release { // Caution! In production, you need to generate your own keystore file. - // see https://facebook.github.io/react-native/docs/signed-apk-android. + // see https://reactnative.dev/docs/signed-apk-android. minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } @@ -164,11 +168,11 @@ android { variant.outputs.each { output -> // For each separate APK per architecture, set a unique version code as described here: // https://developer.android.com/studio/build/configure-apk-splits.html + // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc. def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants - output.versionCodeOverride = - versionCodes.get(abi) * 1048576 + defaultConfig.versionCode + output.versionCodeOverride = versionCodes.get(abi) * 1048576 + defaultConfig.versionCode } } @@ -177,13 +181,8 @@ android { dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation files("../../node_modules/react-native-tor/android/libs/sifir_android.aar") //noinspection GradleDynamicVersion - - androidTestImplementation('com.wix:detox:+') { - exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8' - } - + implementation files("../../node_modules/react-native-tor/android/libs/sifir_android.aar") implementation "com.facebook.react:react-native:+" // From node_modules implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" @@ -194,12 +193,17 @@ dependencies { debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { exclude group:'com.facebook.flipper' + exclude group:'com.squareup.okhttp3', module:'okhttp' } debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") { exclude group:'com.facebook.flipper' } + androidTestImplementation('com.wix:detox:+') { + exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8' + } + if (enableHermes) { def hermesPath = "../../node_modules/hermes-engine/android/"; debugImplementation files(hermesPath + "hermes-debug.aar") @@ -217,4 +221,4 @@ task copyDownloadableDepsToLibs(type: Copy) { } apply plugin: 'com.google.gms.google-services' // Google Services plugin -apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) +apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 62fe59fa4..9fab0be74 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -1,7 +1,7 @@ - diff --git a/android/build.gradle b/android/build.gradle index c112a3741..48d2d949b 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -11,14 +11,15 @@ buildscript { googlePlayServicesIidVersion = "16.0.1" firebaseVersion = "17.3.4" firebaseMessagingVersion = "20.2.1" + ndkVersion = "20.1.5948944" } repositories { google() - jcenter() + mavenCentral() } ext.kotlinVersion = '1.4.32' dependencies { - classpath('com.android.tools.build:gradle:4.0.1') + classpath('com.android.tools.build:gradle:4.2.1') classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" classpath 'com.google.gms:google-services:4.3.5' // Google Services plugin @@ -30,6 +31,25 @@ buildscript { allprojects { repositories { + jcenter() { + content { + includeModule("com.facebook.yoga", "proguard-annotations") + includeModule("com.facebook.fbjni", "fbjni-java-only") + includeModule("com.facebook.fresco", "fresco") + includeModule("com.facebook.fresco", "stetho") + includeModule("com.facebook.fresco", "fbcore") + includeModule("com.facebook.fresco", "drawee") + includeModule("com.facebook.fresco", "imagepipeline") + includeModule("com.facebook.fresco", "imagepipeline-native") + includeModule("com.facebook.fresco", "memory-type-native") + includeModule("com.facebook.fresco", "memory-type-java") + includeModule("com.facebook.fresco", "nativeimagefilters") + includeModule("com.facebook.stetho", "stetho") + includeModule("com.wei.android.lib", "fingerprintidentify") + includeModule("com.eightbitlab", "blurview") + } + } + mavenCentral() mavenLocal() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm @@ -44,7 +64,6 @@ allprojects { url "$rootDir/../node_modules/detox/Detox-android" } google() - jcenter() maven { url 'https://www.jitpack.io' } } } @@ -54,6 +73,9 @@ subprojects { if (project.hasProperty("android")) { android { compileSdkVersion 29 + defaultConfig { + minSdkVersion 28 + } } } } diff --git a/android/gradle.properties b/android/gradle.properties index 2bd906514..6b94a20f9 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -31,4 +31,4 @@ org.gradle.configureondemand=true org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # Version of flipper SDK to use with React Native -FLIPPER_VERSION=0.54.0 \ No newline at end of file +FLIPPER_VERSION=0.75.1 \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 020856ca8..b02efd0d6 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip diff --git a/android/gradlew.bat b/android/gradlew.bat index 9991c5032..e3ecc7d77 100644 --- a/android/gradlew.bat +++ b/android/gradlew.bat @@ -37,7 +37,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -51,7 +51,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -82,8 +82,7 @@ set CMD_LINE_ARGS=%* set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell if "%ERRORLEVEL%"=="0" goto mainEnd diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index 22a0444cf..15dad55d6 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -50,7 +50,7 @@ 6DD410BF266CB13D0087DE03 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; }; 6DD410C0266CB1460087DE03 /* MarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9946622555A660000E52E8 /* MarketWidget.swift */; }; 6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; }; - 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* EFQRCode */; }; + 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */; }; 6DFC807224EA2FA9007B8700 /* ViewQRCodefaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFC807124EA2FA9007B8700 /* ViewQRCodefaceController.swift */; }; 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; @@ -397,7 +397,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */, + 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -837,7 +837,7 @@ ); name = "BlueWalletWatch Extension"; packageProductDependencies = ( - 6DFC806F24EA0B6C007B8700 /* EFQRCode */, + 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */, ); productName = "BlueWalletWatch Extension"; productReference = B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */; @@ -921,7 +921,7 @@ ); mainGroup = 83CBB9F61A601CBA00E9B192; packageReferences = ( - 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */, + 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */, ); productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; projectDirPath = ""; @@ -1661,6 +1661,7 @@ COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "arm64 "; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1717,6 +1718,7 @@ COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "arm64 "; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1958,7 +1960,7 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */ = { + 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/EFPrefix/EFQRCode.git"; requirement = { @@ -1969,9 +1971,9 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 6DFC806F24EA0B6C007B8700 /* EFQRCode */ = { + 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */ = { isa = XCSwiftPackageProductDependency; - package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */; + package = 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */; productName = EFQRCode; }; /* End XCSwiftPackageProductDependency section */ diff --git a/ios/Podfile b/ios/Podfile index 716f9f1af..b9f9b5af4 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -2,19 +2,23 @@ platform :ios, '11.1' workspace 'BlueWallet' require_relative '../node_modules/react-native/scripts/react_native_pods' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' - + target 'BlueWallet' do config = use_native_modules! - use_react_native!(:path => config["reactNativePath"]) + use_react_native!( + :path => config[:reactNativePath], + # to enable hermes on iOS, change `false` to `true` and then install pods + :hermes_enabled => false + ) # Enables Flipper. # # Note that if you have use_frameworks! enabled, Flipper will not work and # you should disable these next few lines. - use_flipper!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' }) + use_flipper!() post_install do |installer| - flipper_post_install(installer) + react_native_post_install(installer) installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '10.0' diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 12ed68240..50cce2325 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -4,15 +4,15 @@ PODS: - React - CocoaAsyncSocket (7.6.5) - DoubleConversion (1.1.6) - - FBLazyVector (0.63.4) - - FBReactNativeSpec (0.63.4): - - Folly (= 2020.01.13.00) - - RCTRequired (= 0.63.4) - - RCTTypeSafety (= 0.63.4) - - React-Core (= 0.63.4) - - React-jsi (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - Flipper (0.87.0): + - FBLazyVector (0.64.2) + - FBReactNativeSpec (0.64.2): + - RCT-Folly (= 2020.01.13.00) + - RCTRequired (= 0.64.2) + - RCTTypeSafety (= 0.64.2) + - React-Core (= 0.64.2) + - React-jsi (= 0.64.2) + - ReactCommon/turbomodule/core (= 0.64.2) + - Flipper (0.75.1): - Flipper-Folly (~> 2.5) - Flipper-RSocket (~> 1.3) - Flipper-DoubleConversion (1.1.7) @@ -26,58 +26,38 @@ PODS: - Flipper-PeerTalk (0.0.4) - Flipper-RSocket (1.3.1): - Flipper-Folly (~> 2.5) - - FlipperKit (0.87.0): - - FlipperKit/Core (= 0.87.0) - - FlipperKit/Core (0.87.0): - - Flipper (~> 0.87.0) + - FlipperKit (0.75.1): + - FlipperKit/Core (= 0.75.1) + - FlipperKit/Core (0.75.1): + - Flipper (~> 0.75.1) - FlipperKit/CppBridge - FlipperKit/FBCxxFollyDynamicConvert - FlipperKit/FBDefines - FlipperKit/FKPortForwarding - - FlipperKit/CppBridge (0.87.0): - - Flipper (~> 0.87.0) - - FlipperKit/FBCxxFollyDynamicConvert (0.87.0): + - FlipperKit/CppBridge (0.75.1): + - Flipper (~> 0.75.1) + - FlipperKit/FBCxxFollyDynamicConvert (0.75.1): - Flipper-Folly (~> 2.5) - - FlipperKit/FBDefines (0.87.0) - - FlipperKit/FKPortForwarding (0.87.0): + - FlipperKit/FBDefines (0.75.1) + - FlipperKit/FKPortForwarding (0.75.1): - CocoaAsyncSocket (~> 7.6) - Flipper-PeerTalk (~> 0.0.4) - - FlipperKit/FlipperKitHighlightOverlay (0.87.0) - - FlipperKit/FlipperKitLayoutHelpers (0.87.0): + - FlipperKit/FlipperKitHighlightOverlay (0.75.1) + - FlipperKit/FlipperKitLayoutPlugin (0.75.1): - FlipperKit/Core - FlipperKit/FlipperKitHighlightOverlay - FlipperKit/FlipperKitLayoutTextSearchable - - FlipperKit/FlipperKitLayoutIOSDescriptors (0.87.0): - - FlipperKit/Core - - FlipperKit/FlipperKitHighlightOverlay - - FlipperKit/FlipperKitLayoutHelpers - YogaKit (~> 1.18) - - FlipperKit/FlipperKitLayoutPlugin (0.87.0): + - FlipperKit/FlipperKitLayoutTextSearchable (0.75.1) + - FlipperKit/FlipperKitNetworkPlugin (0.75.1): - FlipperKit/Core - - FlipperKit/FlipperKitHighlightOverlay - - FlipperKit/FlipperKitLayoutHelpers - - FlipperKit/FlipperKitLayoutIOSDescriptors - - FlipperKit/FlipperKitLayoutTextSearchable - - YogaKit (~> 1.18) - - FlipperKit/FlipperKitLayoutTextSearchable (0.87.0) - - FlipperKit/FlipperKitNetworkPlugin (0.87.0): + - FlipperKit/FlipperKitReactPlugin (0.75.1): - FlipperKit/Core - - FlipperKit/FlipperKitReactPlugin (0.87.0): + - FlipperKit/FlipperKitUserDefaultsPlugin (0.75.1): - FlipperKit/Core - - FlipperKit/FlipperKitUserDefaultsPlugin (0.87.0): - - FlipperKit/Core - - FlipperKit/SKIOSNetworkPlugin (0.87.0): + - FlipperKit/SKIOSNetworkPlugin (0.75.1): - FlipperKit/Core - FlipperKit/FlipperKitNetworkPlugin - - Folly (2020.01.13.00): - - boost-for-react-native - - DoubleConversion - - Folly/Default (= 2020.01.13.00) - - glog - - Folly/Default (2020.01.13.00): - - boost-for-react-native - - DoubleConversion - - glog - GCDWebServer (3.5.4): - GCDWebServer/Core (= 3.5.4) - GCDWebServer/Core (3.5.4) @@ -90,172 +70,199 @@ PODS: - OpenSSL-Universal (1.1.180) - PasscodeAuth (1.0.0): - React - - RCTRequired (0.63.4) - - RCTTypeSafety (0.63.4): - - FBLazyVector (= 0.63.4) - - Folly (= 2020.01.13.00) - - RCTRequired (= 0.63.4) - - React-Core (= 0.63.4) - - React (0.63.4): - - React-Core (= 0.63.4) - - React-Core/DevSupport (= 0.63.4) - - React-Core/RCTWebSocket (= 0.63.4) - - React-RCTActionSheet (= 0.63.4) - - React-RCTAnimation (= 0.63.4) - - React-RCTBlob (= 0.63.4) - - React-RCTImage (= 0.63.4) - - React-RCTLinking (= 0.63.4) - - React-RCTNetwork (= 0.63.4) - - React-RCTSettings (= 0.63.4) - - React-RCTText (= 0.63.4) - - React-RCTVibration (= 0.63.4) - - React-callinvoker (0.63.4) - - React-Core (0.63.4): - - Folly (= 2020.01.13.00) + - RCT-Folly (2020.01.13.00): + - boost-for-react-native + - DoubleConversion - glog - - React-Core/Default (= 0.63.4) - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - RCT-Folly/Default (= 2020.01.13.00) + - RCT-Folly/Default (2020.01.13.00): + - boost-for-react-native + - DoubleConversion + - glog + - RCTRequired (0.64.2) + - RCTTypeSafety (0.64.2): + - FBLazyVector (= 0.64.2) + - RCT-Folly (= 2020.01.13.00) + - RCTRequired (= 0.64.2) + - React-Core (= 0.64.2) + - React (0.64.2): + - React-Core (= 0.64.2) + - React-Core/DevSupport (= 0.64.2) + - React-Core/RCTWebSocket (= 0.64.2) + - React-RCTActionSheet (= 0.64.2) + - React-RCTAnimation (= 0.64.2) + - React-RCTBlob (= 0.64.2) + - React-RCTImage (= 0.64.2) + - React-RCTLinking (= 0.64.2) + - React-RCTNetwork (= 0.64.2) + - React-RCTSettings (= 0.64.2) + - React-RCTText (= 0.64.2) + - React-RCTVibration (= 0.64.2) + - React-callinvoker (0.64.2) + - React-Core (0.64.2): + - glog + - RCT-Folly (= 2020.01.13.00) + - React-Core/Default (= 0.64.2) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-Core/CoreModulesHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/CoreModulesHeaders (0.64.2): - glog + - RCT-Folly (= 2020.01.13.00) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-Core/Default (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/Default (0.64.2): - glog - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - RCT-Folly (= 2020.01.13.00) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-Core/DevSupport (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/DevSupport (0.64.2): - glog - - React-Core/Default (= 0.63.4) - - React-Core/RCTWebSocket (= 0.63.4) - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) - - React-jsinspector (= 0.63.4) + - RCT-Folly (= 2020.01.13.00) + - React-Core/Default (= 0.64.2) + - React-Core/RCTWebSocket (= 0.64.2) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-jsinspector (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-Core/RCTActionSheetHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTActionSheetHeaders (0.64.2): - glog + - RCT-Folly (= 2020.01.13.00) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-Core/RCTAnimationHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTAnimationHeaders (0.64.2): - glog + - RCT-Folly (= 2020.01.13.00) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-Core/RCTBlobHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTBlobHeaders (0.64.2): - glog + - RCT-Folly (= 2020.01.13.00) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-Core/RCTImageHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTImageHeaders (0.64.2): - glog + - RCT-Folly (= 2020.01.13.00) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-Core/RCTLinkingHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTLinkingHeaders (0.64.2): - glog + - RCT-Folly (= 2020.01.13.00) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-Core/RCTNetworkHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTNetworkHeaders (0.64.2): - glog + - RCT-Folly (= 2020.01.13.00) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-Core/RCTSettingsHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTSettingsHeaders (0.64.2): - glog + - RCT-Folly (= 2020.01.13.00) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-Core/RCTTextHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTTextHeaders (0.64.2): - glog + - RCT-Folly (= 2020.01.13.00) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-Core/RCTVibrationHeaders (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTVibrationHeaders (0.64.2): - glog + - RCT-Folly (= 2020.01.13.00) - React-Core/Default - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-Core/RCTWebSocket (0.63.4): - - Folly (= 2020.01.13.00) + - React-Core/RCTWebSocket (0.64.2): - glog - - React-Core/Default (= 0.63.4) - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsiexecutor (= 0.63.4) + - RCT-Folly (= 2020.01.13.00) + - React-Core/Default (= 0.64.2) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsiexecutor (= 0.64.2) + - React-perflogger (= 0.64.2) - Yoga - - React-CoreModules (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.4) - - React-Core/CoreModulesHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - React-RCTImage (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-cxxreact (0.63.4): + - React-CoreModules (0.64.2): + - FBReactNativeSpec (= 0.64.2) + - RCT-Folly (= 2020.01.13.00) + - RCTTypeSafety (= 0.64.2) + - React-Core/CoreModulesHeaders (= 0.64.2) + - React-jsi (= 0.64.2) + - React-RCTImage (= 0.64.2) + - ReactCommon/turbomodule/core (= 0.64.2) + - React-cxxreact (0.64.2): - boost-for-react-native (= 1.63.0) - DoubleConversion - - Folly (= 2020.01.13.00) - glog - - React-callinvoker (= 0.63.4) - - React-jsinspector (= 0.63.4) - - React-jsi (0.63.4): + - RCT-Folly (= 2020.01.13.00) + - React-callinvoker (= 0.64.2) + - React-jsi (= 0.64.2) + - React-jsinspector (= 0.64.2) + - React-perflogger (= 0.64.2) + - React-runtimeexecutor (= 0.64.2) + - React-jsi (0.64.2): - boost-for-react-native (= 1.63.0) - DoubleConversion - - Folly (= 2020.01.13.00) - glog - - React-jsi/Default (= 0.63.4) - - React-jsi/Default (0.63.4): + - RCT-Folly (= 2020.01.13.00) + - React-jsi/Default (= 0.64.2) + - React-jsi/Default (0.64.2): - boost-for-react-native (= 1.63.0) - DoubleConversion - - Folly (= 2020.01.13.00) - glog - - React-jsiexecutor (0.63.4): + - RCT-Folly (= 2020.01.13.00) + - React-jsiexecutor (0.64.2): - DoubleConversion - - Folly (= 2020.01.13.00) - glog - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) - - React-jsinspector (0.63.4) + - RCT-Folly (= 2020.01.13.00) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-perflogger (= 0.64.2) + - React-jsinspector (0.64.2) - react-native-blue-crypto (1.0.0): - React - react-native-blur (0.8.0): @@ -289,66 +296,70 @@ PODS: - React-Core - react-native-widget-center (0.0.4): - React - - React-RCTActionSheet (0.63.4): - - React-Core/RCTActionSheetHeaders (= 0.63.4) - - React-RCTAnimation (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.4) - - React-Core/RCTAnimationHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-RCTBlob (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - React-Core/RCTBlobHeaders (= 0.63.4) - - React-Core/RCTWebSocket (= 0.63.4) - - React-jsi (= 0.63.4) - - React-RCTNetwork (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-RCTImage (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.4) - - React-Core/RCTImageHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - React-RCTNetwork (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-RCTLinking (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - React-Core/RCTLinkingHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-RCTNetwork (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.4) - - React-Core/RCTNetworkHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-RCTSettings (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.4) - - React-Core/RCTSettingsHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - React-RCTText (0.63.4): - - React-Core/RCTTextHeaders (= 0.63.4) - - React-RCTVibration (0.63.4): - - FBReactNativeSpec (= 0.63.4) - - Folly (= 2020.01.13.00) - - React-Core/RCTVibrationHeaders (= 0.63.4) - - React-jsi (= 0.63.4) - - ReactCommon/turbomodule/core (= 0.63.4) - - ReactCommon/turbomodule/core (0.63.4): + - React-perflogger (0.64.2) + - React-RCTActionSheet (0.64.2): + - React-Core/RCTActionSheetHeaders (= 0.64.2) + - React-RCTAnimation (0.64.2): + - FBReactNativeSpec (= 0.64.2) + - RCT-Folly (= 2020.01.13.00) + - RCTTypeSafety (= 0.64.2) + - React-Core/RCTAnimationHeaders (= 0.64.2) + - React-jsi (= 0.64.2) + - ReactCommon/turbomodule/core (= 0.64.2) + - React-RCTBlob (0.64.2): + - FBReactNativeSpec (= 0.64.2) + - RCT-Folly (= 2020.01.13.00) + - React-Core/RCTBlobHeaders (= 0.64.2) + - React-Core/RCTWebSocket (= 0.64.2) + - React-jsi (= 0.64.2) + - React-RCTNetwork (= 0.64.2) + - ReactCommon/turbomodule/core (= 0.64.2) + - React-RCTImage (0.64.2): + - FBReactNativeSpec (= 0.64.2) + - RCT-Folly (= 2020.01.13.00) + - RCTTypeSafety (= 0.64.2) + - React-Core/RCTImageHeaders (= 0.64.2) + - React-jsi (= 0.64.2) + - React-RCTNetwork (= 0.64.2) + - ReactCommon/turbomodule/core (= 0.64.2) + - React-RCTLinking (0.64.2): + - FBReactNativeSpec (= 0.64.2) + - React-Core/RCTLinkingHeaders (= 0.64.2) + - React-jsi (= 0.64.2) + - ReactCommon/turbomodule/core (= 0.64.2) + - React-RCTNetwork (0.64.2): + - FBReactNativeSpec (= 0.64.2) + - RCT-Folly (= 2020.01.13.00) + - RCTTypeSafety (= 0.64.2) + - React-Core/RCTNetworkHeaders (= 0.64.2) + - React-jsi (= 0.64.2) + - ReactCommon/turbomodule/core (= 0.64.2) + - React-RCTSettings (0.64.2): + - FBReactNativeSpec (= 0.64.2) + - RCT-Folly (= 2020.01.13.00) + - RCTTypeSafety (= 0.64.2) + - React-Core/RCTSettingsHeaders (= 0.64.2) + - React-jsi (= 0.64.2) + - ReactCommon/turbomodule/core (= 0.64.2) + - React-RCTText (0.64.2): + - React-Core/RCTTextHeaders (= 0.64.2) + - React-RCTVibration (0.64.2): + - FBReactNativeSpec (= 0.64.2) + - RCT-Folly (= 2020.01.13.00) + - React-Core/RCTVibrationHeaders (= 0.64.2) + - React-jsi (= 0.64.2) + - ReactCommon/turbomodule/core (= 0.64.2) + - React-runtimeexecutor (0.64.2): + - React-jsi (= 0.64.2) + - ReactCommon/turbomodule/core (0.64.2): - DoubleConversion - - Folly (= 2020.01.13.00) - glog - - React-callinvoker (= 0.63.4) - - React-Core (= 0.63.4) - - React-cxxreact (= 0.63.4) - - React-jsi (= 0.63.4) + - RCT-Folly (= 2020.01.13.00) + - React-callinvoker (= 0.64.2) + - React-Core (= 0.64.2) + - React-cxxreact (= 0.64.2) + - React-jsi (= 0.64.2) + - React-perflogger (= 0.64.2) - RealmJS (10.4.2): - GCDWebServer - React @@ -388,8 +399,8 @@ PODS: - DoubleConversion - FBLazyVector - FBReactNativeSpec - - Folly - glog + - RCT-Folly - RCTRequired - RCTTypeSafety - React @@ -413,11 +424,12 @@ PODS: - React-RCTVibration - ReactCommon/turbomodule/core - Yoga - - RNScreens (2.18.1): + - RNScreens (3.4.0): - React-Core + - React-RCTImage - RNSecureKeyStore (1.0.0): - React - - RNSentry (2.5.2): + - RNSentry (2.6.0): - React-Core - Sentry (= 7.0.0) - RNShare (6.2.1): @@ -442,31 +454,31 @@ DEPENDENCIES: - BVLinearGradient (from `../node_modules/react-native-linear-gradient`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`) - - Flipper (= 0.87.0) + - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) + - Flipper (~> 0.75.1) - Flipper-DoubleConversion (= 1.1.7) - - Flipper-Folly (= 2.5.3) + - Flipper-Folly (~> 2.5.3) - Flipper-Glog (= 0.3.6) - Flipper-PeerTalk (~> 0.0.4) - - Flipper-RSocket (= 1.3.1) - - FlipperKit (= 0.87.0) - - FlipperKit/Core (= 0.87.0) - - FlipperKit/CppBridge (= 0.87.0) - - FlipperKit/FBCxxFollyDynamicConvert (= 0.87.0) - - FlipperKit/FBDefines (= 0.87.0) - - FlipperKit/FKPortForwarding (= 0.87.0) - - FlipperKit/FlipperKitHighlightOverlay (= 0.87.0) - - FlipperKit/FlipperKitLayoutPlugin (= 0.87.0) - - FlipperKit/FlipperKitLayoutTextSearchable (= 0.87.0) - - FlipperKit/FlipperKitNetworkPlugin (= 0.87.0) - - FlipperKit/FlipperKitReactPlugin (= 0.87.0) - - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.87.0) - - FlipperKit/SKIOSNetworkPlugin (= 0.87.0) - - Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`) + - Flipper-RSocket (~> 1.3) + - FlipperKit (~> 0.75.1) + - FlipperKit/Core (~> 0.75.1) + - FlipperKit/CppBridge (~> 0.75.1) + - FlipperKit/FBCxxFollyDynamicConvert (~> 0.75.1) + - FlipperKit/FBDefines (~> 0.75.1) + - FlipperKit/FKPortForwarding (~> 0.75.1) + - FlipperKit/FlipperKitHighlightOverlay (~> 0.75.1) + - FlipperKit/FlipperKitLayoutPlugin (~> 0.75.1) + - FlipperKit/FlipperKitLayoutTextSearchable (~> 0.75.1) + - FlipperKit/FlipperKitNetworkPlugin (~> 0.75.1) + - FlipperKit/FlipperKitReactPlugin (~> 0.75.1) + - FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.75.1) + - FlipperKit/SKIOSNetworkPlugin (~> 0.75.1) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - lottie-ios (from `../node_modules/lottie-ios`) - lottie-react-native (from `../node_modules/lottie-react-native`) - PasscodeAuth (from `../node_modules/react-native-passcode-auth`) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - React (from `../node_modules/react-native/`) @@ -492,6 +504,7 @@ DEPENDENCIES: - react-native-tor (from `../node_modules/react-native-tor`) - react-native-webview (from `../node_modules/react-native-webview`) - react-native-widget-center (from `../node_modules/react-native-widget-center`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) @@ -501,6 +514,7 @@ DEPENDENCIES: - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - RealmJS (from `../node_modules/realm`) - "RemobileReactNativeQrcodeLocalImage (from `../node_modules/@remobile/react-native-qrcode-local-image`)" @@ -556,9 +570,7 @@ EXTERNAL SOURCES: FBLazyVector: :path: "../node_modules/react-native/Libraries/FBLazyVector" FBReactNativeSpec: - :path: "../node_modules/react-native/Libraries/FBReactNativeSpec" - Folly: - :podspec: "../node_modules/react-native/third-party-podspecs/Folly.podspec" + :path: "../node_modules/react-native/React/FBReactNativeSpec" glog: :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" lottie-ios: @@ -567,6 +579,8 @@ EXTERNAL SOURCES: :path: "../node_modules/lottie-react-native" PasscodeAuth: :path: "../node_modules/react-native-passcode-auth" + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTRequired: :path: "../node_modules/react-native/Libraries/RCTRequired" RCTTypeSafety: @@ -613,6 +627,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-webview" react-native-widget-center: :path: "../node_modules/react-native-widget-center" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" React-RCTActionSheet: :path: "../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: @@ -631,6 +647,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/Text" React-RCTVibration: :path: "../node_modules/react-native/Libraries/Vibration" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" ReactCommon: :path: "../node_modules/react-native/ReactCommon" RealmJS: @@ -701,16 +719,15 @@ SPEC CHECKSUMS: BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 DoubleConversion: cf9b38bf0b2d048436d9a82ad2abe1404f11e7de - FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e - FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e - Flipper: 1bd2db48dcc31e4b167b9a33ec1df01c2ded4893 + FBLazyVector: e686045572151edef46010a6f819ade377dfeb4b + FBReactNativeSpec: da2b9104721789106ad3943049ccf61ef6f4db39 + Flipper: d3da1aa199aad94455ae725e9f3aa43f3ec17021 Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41 Flipper-Folly: 755929a4f851b2fb2c347d533a23f191b008554c Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6 Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 Flipper-RSocket: 127954abe8b162fcaf68d2134d34dc2bd7076154 - FlipperKit: 651f50a42eb95c01b3e89a60996dd6aded529eeb - Folly: b73c3869541e86821df3c387eb0af5f65addfab4 + FlipperKit: 8a20b5c5fcf9436cac58551dc049867247f64b00 GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4 glog: 73c2498ac6884b13ede40eda8228cb1eee9d9d62 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 @@ -718,16 +735,17 @@ SPEC CHECKSUMS: lottie-react-native: 4dff8fe8d10ddef9e7880e770080f4a56121397e OpenSSL-Universal: 1aa4f6a6ee7256b83db99ec1ccdaa80d10f9af9b PasscodeAuth: 1cc99b13d8e4de4716d7e2b4069af2f1a9de30b2 - RCTRequired: 082f10cd3f905d6c124597fd1c14f6f2655ff65e - RCTTypeSafety: 8c9c544ecbf20337d069e4ae7fd9a377aadf504b - React: b0a957a2c44da4113b0c4c9853d8387f8e64e615 - React-callinvoker: c3f44dd3cb195b6aa46621fff95ded79d59043fe - React-Core: d3b2a1ac9a2c13c3bcde712d9281fc1c8a5b315b - React-CoreModules: 0581ff36cb797da0943d424f69e7098e43e9be60 - React-cxxreact: c1480d4fda5720086c90df537ee7d285d4c57ac3 - React-jsi: a0418934cf48f25b485631deb27c64dc40fb4c31 - React-jsiexecutor: 93bd528844ad21dc07aab1c67cb10abae6df6949 - React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a + RCT-Folly: ec7a233ccc97cc556cf7237f0db1ff65b986f27c + RCTRequired: 6d3e854f0e7260a648badd0d44fc364bc9da9728 + RCTTypeSafety: c1f31d19349c6b53085766359caac425926fafaa + React: bda6b6d7ae912de97d7a61aa5c160db24aa2ad69 + React-callinvoker: 9840ea7e8e88ed73d438edb725574820b29b5baa + React-Core: b5e385da7ce5f16a220fc60fd0749eae2c6120f0 + React-CoreModules: 17071a4e2c5239b01585f4aa8070141168ab298f + React-cxxreact: 9be7b6340ed9f7c53e53deca7779f07cd66525ba + React-jsi: 67747b9722f6dab2ffe15b011bcf6b3f2c3f1427 + React-jsiexecutor: 80c46bd381fd06e418e0d4f53672dc1d1945c4c3 + React-jsinspector: cc614ec18a9ca96fd275100c16d74d62ee11f0ae react-native-blue-crypto: 23f1558ad3d38d7a2edb7e2f6ed1bc520ed93e56 react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c react-native-camera: 6e6d25f6318980dd2837747760628b4442aac01a @@ -741,16 +759,18 @@ SPEC CHECKSUMS: react-native-tor: 4f389f5719dad633542b57ea32744e954730e7ef react-native-webview: 4288b81c682bca4dcc9037afb3ee118af2655c03 react-native-widget-center: 0f81d17beb163e7fb5848b06754d7d277fe7d99a - React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336 - React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b - React-RCTBlob: a97d378b527740cc667e03ebfa183a75231ab0f0 - React-RCTImage: c1b1f2d3f43a4a528c8946d6092384b5c880d2f0 - React-RCTLinking: 35ae4ab9dc0410d1fcbdce4d7623194a27214fb2 - React-RCTNetwork: 29ec2696f8d8cfff7331fac83d3e893c95ef43ae - React-RCTSettings: 60f0691bba2074ef394f95d4c2265ec284e0a46a - React-RCTText: 5c51df3f08cb9dedc6e790161195d12bac06101c - React-RCTVibration: ae4f914cfe8de7d4de95ae1ea6cc8f6315d73d9d - ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b + React-perflogger: 25373e382fed75ce768a443822f07098a15ab737 + React-RCTActionSheet: af7796ba49ffe4ca92e7277a5d992d37203f7da5 + React-RCTAnimation: 6a2e76ab50c6f25b428d81b76a5a45351c4d77aa + React-RCTBlob: 02a2887023e0eed99391b6445b2e23a2a6f9226d + React-RCTImage: ce5bf8e7438f2286d9b646a05d6ab11f38b0323d + React-RCTLinking: ccd20742de14e020cb5f99d5c7e0bf0383aefbd9 + React-RCTNetwork: dfb9d089ab0753e5e5f55fc4b1210858f7245647 + React-RCTSettings: b14aef2d83699e48b410fb7c3ba5b66cd3291ae2 + React-RCTText: 41a2e952dd9adc5caf6fb68ed46b275194d5da5f + React-RCTVibration: 24600e3b1aaa77126989bc58b6747509a1ba14f3 + React-runtimeexecutor: a9904c6d0218fb9f8b19d6dd88607225927668f9 + ReactCommon: 149906e01aa51142707a10665185db879898e966 RealmJS: 90f2a558fdda19ebb9fcbc0a52c7b1d1b049fb88 RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa RNCAsyncStorage: 8324611026e8dc3706f829953aa6e3899f581589 @@ -768,10 +788,10 @@ SPEC CHECKSUMS: RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93 RNRate: e0af7e724e5fcf89578dbd22ab6395c85402ef29 RNReactNativeHapticFeedback: 653a8c126a0f5e88ce15ffe280b3ff37e1fbb285 - RNReanimated: d9da990fc90123f4ffbfdda93d00fc15174863a8 - RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d + RNReanimated: 9c13c86454bfd54dab7505c1a054470bfecd2563 + RNScreens: 21b73c94c9117e1110a79ee0ee80c93ccefed8ce RNSecureKeyStore: f1ad870e53806453039f650720d2845c678d89c8 - RNSentry: bfa1e2776c7413570e790cbbf79d2060dd0a565b + RNSentry: a2b02b326ae4fce91ce7c57d3f7dcf8df4f72269 RNShare: 5ac8f6532ca4cd80fc71caef1cfbba1854a6a045 RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 @@ -779,9 +799,9 @@ SPEC CHECKSUMS: Sentry: 89d26e036063b9cb9caa59b6951dd2f8277aa13b SwiftSocket: c8d482e867ae4d3eb4c769e9382e123c1f1f833b ToolTipMenu: 4d89d95ddffd7539230bdbe02ee51bbde362e37e - Yoga: 4bd86afe9883422a7c4028c00e34790f560923d6 + Yoga: 575c581c63e0d35c9a83f4b46d01d63abc1100ac YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: 73464a154246ad233697748ecc693fe37cb2eacb +PODFILE CHECKSUM: d6f6c7992cb83adb1c2ca00fa4d3e3a3402f4787 COCOAPODS: 1.10.1 diff --git a/metro.config.js b/metro.config.js index 01be4d59d..2b544f130 100644 --- a/metro.config.js +++ b/metro.config.js @@ -4,24 +4,26 @@ * * @format */ -const path = require('path'); -const blacklist = require('metro-config/src/defaults/blacklist'); + +// const path = require('path'); +// const blacklist = require('metro-config/src/defaults/blacklist'); module.exports = { resolver: { - blacklistRE: blacklist([ - // This stops "react-native run-windows" from causing the metro server to crash if its already running - new RegExp(`${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`), - // This prevents "react-native run-windows" from hitting: EBUSY: resource busy or locked, open msbuild.ProjectImports.zip - /.*\.ProjectImports\.zip/, - ]), - }, - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: false, - }, - }), + // blacklistRE: blacklist([ + // // This stops "react-native run-windows" from causing the metro server to crash if its already running + // new RegExp(`${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`), + // // This prevents "react-native run-windows" from hitting: EBUSY: resource busy or locked, open msbuild.ProjectImports.zip + // /.*\.ProjectImports\.zip/, + // ]), + // }, + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: false, + }, + }), + }, }, }; diff --git a/package-lock.json b/package-lock.json index cd9bd3f10..dd3c3704b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -324,14 +324,6 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.1.tgz", "integrity": "sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q==" }, - "@babel/plugin-external-helpers": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.12.13.tgz", - "integrity": "sha512-ClvAsk4RqpE6iacYUjdU9PtvIwC9yAefZENsPfGeG5FckX3jFZLDlWPuyv5gi9/9C2VgwX6H8q1ukBifC0ha+Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.13.15", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", @@ -1045,6 +1037,16 @@ "semver": "^5.5.0" } }, + "@babel/preset-flow": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.13.13.tgz", + "integrity": "sha512-MDtwtamMifqq3R2mC7l3A3uFalUb3NH5TIBQWjN/epEPlZktcLq4se3J+ivckKrLMGsR7H9LW8+pYuIUN9tsKg==", + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-transform-flow-strip-types": "^7.13.0" + } + }, "@babel/preset-modules": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", @@ -1057,6 +1059,16 @@ "esutils": "^2.0.2" } }, + "@babel/preset-typescript": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz", + "integrity": "sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw==", + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-transform-typescript": "^7.13.0" + } + }, "@babel/register": { "version": "7.13.16", "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.13.16.tgz", @@ -1208,38 +1220,17 @@ } } }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" - }, "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", + "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==" }, "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", + "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", "requires": { - "@hapi/hoek": "^8.3.0" + "@hapi/hoek": "^9.0.0" } }, "@istanbuljs/load-nyc-config": { @@ -1303,23 +1294,6 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - } - } - }, "@jest/core": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", @@ -1705,6 +1679,14 @@ } } }, + "@jest/create-cache-key-function": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-26.6.2.tgz", + "integrity": "sha512-LgEuqU1f/7WEIPYqwLPIvvHuc1sB6gMVbT6zWhin3txYUNYK/kGQrC1F2WR4gR34YlI9bBtViTm5z98RqVZAaw==", + "requires": { + "@jest/types": "^26.6.2" + } + }, "@jest/environment": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", @@ -1933,36 +1915,6 @@ } } }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", - "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", - "requires": { - "@types/yargs-parser": "*" - } - } - } - }, "@jest/globals": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", @@ -2376,58 +2328,6 @@ } } }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", - "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", - "requires": { - "@types/yargs-parser": "*" - } - } - } - }, "@jest/test-sequencer": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", @@ -2963,14 +2863,15 @@ } }, "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" + "chalk": "^4.0.0" }, "dependencies": { "ansi-styles": { @@ -2982,9 +2883,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3040,20 +2941,20 @@ } }, "@react-native-community/cli-debugger-ui": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.13.1.tgz", - "integrity": "sha512-UFnkg5RTq3s2X15fSkrWY9+5BKOFjihNSnJjTV2H5PtTUFbd55qnxxPw8CxSfK0bXb1IrSvCESprk2LEpqr5cg==", + "version": "5.0.1-alpha.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-5.0.1-alpha.1.tgz", + "integrity": "sha512-o6msDywXU7q0dPKhCTo8IrpmJ+7o+kVghyHlrAndnb30p6vnm4pID5Yi7lHXGfs6bQXorKUWX8oD5xYwWkN8qw==", "requires": { "serve-static": "^1.13.1" } }, "@react-native-community/cli-hermes": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-4.13.0.tgz", - "integrity": "sha512-oG+w0Uby6rSGsUkJGLvMQctZ5eVRLLfhf84lLyz942OEDxFRa9U19YJxOe9FmgCKtotbYiM3P/XhK+SVCuerPQ==", + "version": "5.0.1-alpha.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-5.0.1-alpha.1.tgz", + "integrity": "sha512-7FNhqeZCbON4vhzZpV8nx4gB3COJy2KGbVku376CnIAjMncxJhupqORWdMukP8jNuuvUZ1R0vj0L0+W/M5rY1w==", "requires": { - "@react-native-community/cli-platform-android": "^4.13.0", - "@react-native-community/cli-tools": "^4.13.0", + "@react-native-community/cli-platform-android": "^5.0.1-alpha.1", + "@react-native-community/cli-tools": "^5.0.1-alpha.1", "chalk": "^3.0.0", "hermes-profile-transformer": "^0.0.6", "ip": "^1.1.5" @@ -3105,11 +3006,11 @@ } }, "@react-native-community/cli-platform-android": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-4.13.0.tgz", - "integrity": "sha512-3i8sX8GklEytUZwPnojuoFbCjIRzMugCdzDIdZ9UNmi/OhD4/8mLGO0dgXfT4sMWjZwu3qjy45sFfk2zOAgHbA==", + "version": "5.0.1-alpha.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-5.0.1-alpha.1.tgz", + "integrity": "sha512-Fx9Tm0Z9sl5CD/VS8XWIY1gTgf28MMnAvyx0oj7yO4IzWuOpJPyWxTJITc80GAK6tlyijORv5kriYpXnquxQLg==", "requires": { - "@react-native-community/cli-tools": "^4.13.0", + "@react-native-community/cli-tools": "^5.0.1-alpha.1", "chalk": "^3.0.0", "execa": "^1.0.0", "fs-extra": "^8.1.0", @@ -3177,11 +3078,11 @@ } }, "@react-native-community/cli-platform-ios": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.13.0.tgz", - "integrity": "sha512-6THlTu8zp62efkzimfGr3VIuQJ2514o+vScZERJCV1xgEi8XtV7mb/ZKt9o6Y9WGxKKkc0E0b/aVAtgy+L27CA==", + "version": "5.0.1-alpha.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-5.0.1-alpha.2.tgz", + "integrity": "sha512-W15A75j+4bx6qbcapFia1A0M+W3JAt7Bc4VgEYvxDDRI62EsSHk1k6ZBNxs/j0cDPSYF9ZXHlRI+CWi3r9bTbQ==", "requires": { - "@react-native-community/cli-tools": "^4.13.0", + "@react-native-community/cli-tools": "^5.0.1-alpha.1", "chalk": "^3.0.0", "glob": "^7.1.3", "js-yaml": "^3.13.1", @@ -3236,58 +3137,21 @@ } }, "@react-native-community/cli-server-api": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-4.13.1.tgz", - "integrity": "sha512-vQzsFKD9CjHthA2ehTQX8c7uIzlI9A7ejaIow1I9RlEnLraPH2QqVDmzIdbdh5Od47UPbRzamCgAP8Bnqv3qwQ==", + "version": "5.0.1-alpha.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-5.0.1-alpha.2.tgz", + "integrity": "sha512-qzjoLF51GmvUHQrcJZE+wD3bTmgnTNOnGBU6z4terKmPdt/EBBSUkdXc6ScWWRF6oWP+xpxLZ//tKic2v2f+ag==", "requires": { - "@react-native-community/cli-debugger-ui": "^4.13.1", - "@react-native-community/cli-tools": "^4.13.0", + "@react-native-community/cli-debugger-ui": "^5.0.1-alpha.1", + "@react-native-community/cli-tools": "^5.0.1-alpha.1", "compression": "^1.7.1", "connect": "^3.6.5", "errorhandler": "^1.5.0", "nocache": "^2.1.0", - "pretty-format": "^25.1.0", + "pretty-format": "^26.6.2", "serve-static": "^1.13.1", "ws": "^1.1.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "pretty-format": { - "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.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, "ws": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", @@ -3300,9 +3164,9 @@ } }, "@react-native-community/cli-tools": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-4.13.0.tgz", - "integrity": "sha512-s4f489h5+EJksn4CfheLgv5PGOM0CDmK1UEBLw2t/ncWs3cW2VI7vXzndcd/WJHTv3GntJhXDcJMuL+Z2IAOgg==", + "version": "5.0.1-alpha.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-5.0.1-alpha.1.tgz", + "integrity": "sha512-TwQxtfEOxGf8n5+UYKVO5exm56TwEAsWjYcoWkUKcSsIBl6VwCR4s3qGB8Y63uLUN2wf9MKnzvsaX337GjMVTA==", "requires": { "chalk": "^3.0.0", "lodash": "^4.17.15", @@ -3374,9 +3238,12 @@ } }, "@react-native-community/cli-types": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-4.10.1.tgz", - "integrity": "sha512-ael2f1onoPF3vF7YqHGWy7NnafzGu+yp88BbFbP0ydoCP2xGSUzmZVw0zakPTC040Id+JQ9WeFczujMkDy6jYQ==" + "version": "5.0.1-alpha.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-5.0.1-alpha.1.tgz", + "integrity": "sha512-RdsLU0Jf3HodFnAY+oxCJt3VlhaN4MxGhfISvjGzqdjq3kpzmxex3+7fi6QvS97Kd6G2cheOJAdgP5wcwxp3Ng==", + "requires": { + "ora": "^3.4.0" + } }, "@react-native-community/eslint-config": { "version": "2.0.0", @@ -3675,6 +3542,21 @@ "applicationinsights": "^1.8.8" } }, + "@react-native/assets": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@react-native/assets/-/assets-1.0.0.tgz", + "integrity": "sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ==" + }, + "@react-native/normalize-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-1.0.0.tgz", + "integrity": "sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg==" + }, + "@react-native/polyfills": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@react-native/polyfills/-/polyfills-1.0.0.tgz", + "integrity": "sha512-0jbp4RxjYopTsIdLl+/Fy2TiwVYHy4mgeu07DG4b/LyM0OS/+lPP5c9sbnt/AMlnF6qz2JRZpPpGw1eMNS6A4w==" + }, "@react-navigation/core": { "version": "5.15.3", "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-5.15.3.tgz", @@ -3822,9 +3704,9 @@ } }, "@sentry/react-native": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@sentry/react-native/-/react-native-2.5.2.tgz", - "integrity": "sha512-AwcDZ+1SQ1EBFwnlYFGwSF/T3KrV1kdir3H9XOtR8WrxaItbwlkqwwP7D1EBMHu02WmuOgJ2a8aJlrhqEJ2pYA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@sentry/react-native/-/react-native-2.6.0.tgz", + "integrity": "sha512-Sajrg7GWSZ1S26X2mIHRt+wCuc7CuPjdmx8tQfDg6cpswXgqryb0fv99VCpImb4ZB/WiaCTu2z9BSGUiZahnBg==", "requires": { "@sentry/browser": "6.7.1", "@sentry/core": "6.7.1", @@ -3864,9 +3746,9 @@ } }, "@sentry/wizard": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@sentry/wizard/-/wizard-1.2.8.tgz", - "integrity": "sha512-2gHVOT7YcoG56hUgzVG53ID7eThQJxN7Fu+jNZH1WBCG3qSuj+ied2CZ3U+/VsxB6l13GBVwqlHH9GaVptrh3g==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@sentry/wizard/-/wizard-1.2.9.tgz", + "integrity": "sha512-j6OdWF2W3Q24EmIXnNiomspJWKXicAPYnAUF1kcE4c+RuKxv/WFmPkSgg57BZRQ4613GUeHrs3eHGW6FDovolg==", "requires": { "@sentry/cli": "^1.52.4", "chalk": "^2.4.1", @@ -3896,6 +3778,24 @@ } } }, + "@sideway/address": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", + "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -3978,7 +3878,6 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, "requires": { "@types/node": "*" } @@ -4002,11 +3901,10 @@ } }, "@types/istanbul-reports": { - "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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "requires": { - "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, @@ -4076,11 +3974,6 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" - }, "@types/yargs": { "version": "15.0.13", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", @@ -4448,6 +4341,11 @@ "normalize-path": "^2.1.1" } }, + "appdirsjs": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.5.tgz", + "integrity": "sha512-UyaAyzj+7XLoKhbXJi4zoAw8IDXCiLNCKfQEiuCsCCTkDmiG1vpCliQn/MoUvO3DZqCN1i6gOahokcFtNSIrVA==" + }, "applicationinsights": { "version": "1.8.10", "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.8.10.tgz", @@ -4798,6 +4696,21 @@ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, + "ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "requires": { + "tslib": "^2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -4826,6 +4739,11 @@ "stack-chain": "^1.3.7" } }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, "async-listener": { "version": "0.6.10", "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", @@ -5249,9 +5167,9 @@ } }, "babel-preset-fbjs": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz", - "integrity": "sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", + "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", "requires": { "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-object-rest-spread": "^7.0.0", @@ -5972,11 +5890,6 @@ "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-equals": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/buffer-equals/-/buffer-equals-1.0.4.tgz", @@ -7034,9 +6947,9 @@ "dev": true }, "detox": { - "version": "18.17.0", - "resolved": "https://registry.npmjs.org/detox/-/detox-18.17.0.tgz", - "integrity": "sha512-cdi+nUgk0Me76UdG7pUYIchmfEdzSghIC0xjTrEMyjhBz2Zsb7WscZZHO1rORAjDHJF7u0QhvAHvGDksDWmjiw==", + "version": "18.18.1", + "resolved": "https://registry.npmjs.org/detox/-/detox-18.18.1.tgz", + "integrity": "sha512-H3KouvWnuPjeqV6R+f/SN5ZGSXIQMwMG/24lcynRmaq2ASSjSaJqKWRCimreIr3WKkhkaEmY9cPKtj0nAJHOmw==", "requires": { "bunyan": "^1.8.12", "bunyan-debug-stream": "^1.1.0", @@ -8311,11 +8224,6 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -9028,6 +8936,11 @@ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, + "flow-parser": { + "version": "0.121.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.121.0.tgz", + "integrity": "sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg==" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -9138,6 +9051,7 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, "optional": true, "requires": { "bindings": "^1.5.0", @@ -9468,9 +9382,9 @@ } }, "hermes-engine": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/hermes-engine/-/hermes-engine-0.5.1.tgz", - "integrity": "sha512-hLwqh8dejHayjlpvZY40e1aDCDvyP98cWx/L5DhAjSJLH8g4z9Tp08D7y4+3vErDsncPOdf1bxm+zUWpx0/Fxg==" + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/hermes-engine/-/hermes-engine-0.7.2.tgz", + "integrity": "sha512-E2DkRaO97gwL98LPhgfkMqhHiNsrAjIfEk3wWYn2Y31xdkdWn0572H7RnVcGujMJVqZNJvtknxlpsUb8Wzc3KA==" }, "hermes-profile-transformer": { "version": "0.0.6", @@ -9703,8 +9617,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indexof": { "version": "0.0.1", @@ -11867,45 +11780,87 @@ } }, "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" }, "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "@types/yargs": { - "version": "13.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", - "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { - "@types/yargs-parser": "*" + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" } } } @@ -12411,74 +12366,6 @@ } } }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", - "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - } - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "requires": { - "@jest/types": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", - "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", - "requires": { - "@types/yargs-parser": "*" - } - } - } - }, "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", @@ -12488,8 +12375,7 @@ "jest-regex-util": { "version": "26.0.0", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==" }, "jest-resolve": { "version": "26.6.2", @@ -13581,9 +13467,13 @@ } }, "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } }, "jest-snapshot": { "version": "26.6.2", @@ -13904,94 +13794,161 @@ } }, "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" + "micromatch": "^4.0.2" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" } }, - "@types/yargs": { - "version": "13.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", - "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { - "@types/yargs-parser": "*" + "fill-range": "^7.0.1" } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } } } }, "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^24.9.0" + "pretty-format": "^26.6.2" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", - "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", - "requires": { - "@types/yargs-parser": "*" + "color-convert": "^2.0.1" } }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -14244,25 +14201,26 @@ } }, "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" + "supports-color": "^7.0.0" }, "dependencies": { - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } @@ -14272,6 +14230,18 @@ "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.8.tgz", "integrity": "sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw==" }, + "joi": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz", + "integrity": "sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==", + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -14301,6 +14271,49 @@ "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-245459.0.0.tgz", "integrity": "sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==" }, + "jscodeshift": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.11.0.tgz", + "integrity": "sha512-SdRK2C7jjs4k/kT2mwtO07KJN9RnjxtKn03d9JVj6c3j9WwaLcFYsICYDnLAzY0hp+wG2nxl+Cm2jWLiNVYb8g==", + "requires": { + "@babel/core": "^7.1.6", + "@babel/parser": "^7.1.6", + "@babel/plugin-proposal-class-properties": "^7.1.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.1.0", + "@babel/plugin-proposal-optional-chaining": "^7.1.0", + "@babel/plugin-transform-modules-commonjs": "^7.1.0", + "@babel/preset-flow": "^7.0.0", + "@babel/preset-typescript": "^7.1.0", + "@babel/register": "^7.0.0", + "babel-core": "^7.0.0-bridge.0", + "colors": "^1.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^3.1.10", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.20.3", + "temp": "^0.8.1", + "write-file-atomic": "^2.3.0" + }, + "dependencies": { + "babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, "jsdom": { "version": "16.5.3", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.3.tgz", @@ -14380,14 +14393,6 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - } - }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -14466,8 +14471,7 @@ "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, "level-blobs": { "version": "0.1.7", @@ -15074,28 +15078,9 @@ } }, "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "requires": { - "readable-stream": "^2.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "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" - } - } - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merkle-lib": { "version": "2.0.10", @@ -15103,98 +15088,108 @@ "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=" }, "metro": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.59.0.tgz", - "integrity": "sha512-OpVgYXyuTvouusFZQJ/UYKEbwfLmialrSCUUTGTFaBor6UMUHZgXPYtK86LzesgMqRc8aiuTQVO78iKW2Iz3wg==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.64.0.tgz", + "integrity": "sha512-G2OC08Rzfs0kqnSEuKo2yZxR+/eNUpA93Ru45c60uN0Dw3HPrDi+ZBipgFftC6iLE0l+6hu8roFFIofotWxybw==", "requires": { "@babel/code-frame": "^7.0.0", "@babel/core": "^7.0.0", "@babel/generator": "^7.5.0", "@babel/parser": "^7.0.0", - "@babel/plugin-external-helpers": "^7.0.0", "@babel/template": "^7.0.0", "@babel/traverse": "^7.0.0", "@babel/types": "^7.0.0", "absolute-path": "^0.0.0", + "accepts": "^1.3.7", "async": "^2.4.0", - "babel-preset-fbjs": "^3.3.0", - "buffer-crc32": "^0.2.13", - "chalk": "^2.4.1", + "chalk": "^4.0.0", "ci-info": "^2.0.0", - "concat-stream": "^1.6.0", "connect": "^3.6.5", "debug": "^2.2.0", "denodeify": "^1.2.1", "error-stack-parser": "^2.0.6", - "eventemitter3": "^3.0.0", - "fbjs": "^1.0.0", "fs-extra": "^1.0.0", "graceful-fs": "^4.1.3", "image-size": "^0.6.0", "invariant": "^2.2.4", - "jest-haste-map": "^24.9.0", - "jest-worker": "^24.9.0", - "json-stable-stringify": "^1.0.1", + "jest-haste-map": "^26.5.2", + "jest-worker": "^26.0.0", "lodash.throttle": "^4.1.1", - "merge-stream": "^1.0.1", - "metro-babel-register": "0.59.0", - "metro-babel-transformer": "0.59.0", - "metro-cache": "0.59.0", - "metro-config": "0.59.0", - "metro-core": "0.59.0", - "metro-inspector-proxy": "0.59.0", - "metro-minify-uglify": "0.59.0", - "metro-react-native-babel-preset": "0.59.0", - "metro-resolver": "0.59.0", - "metro-source-map": "0.59.0", - "metro-symbolicate": "0.59.0", - "mime-types": "2.1.11", + "metro-babel-register": "0.64.0", + "metro-babel-transformer": "0.64.0", + "metro-cache": "0.64.0", + "metro-cache-key": "0.64.0", + "metro-config": "0.64.0", + "metro-core": "0.64.0", + "metro-hermes-compiler": "0.64.0", + "metro-inspector-proxy": "0.64.0", + "metro-minify-uglify": "0.64.0", + "metro-react-native-babel-preset": "0.64.0", + "metro-resolver": "0.64.0", + "metro-runtime": "0.64.0", + "metro-source-map": "0.64.0", + "metro-symbolicate": "0.64.0", + "metro-transform-plugins": "0.64.0", + "metro-transform-worker": "0.64.0", + "mime-types": "^2.1.27", "mkdirp": "^0.5.1", "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", - "resolve": "^1.5.0", "rimraf": "^2.5.4", "serialize-error": "^2.1.0", "source-map": "^0.5.6", - "strip-ansi": "^4.0.0", + "strip-ansi": "^6.0.0", "temp": "0.8.3", - "throat": "^4.1.0", - "wordwrap": "^1.0.0", + "throat": "^5.0.0", "ws": "^1.1.5", - "xpipe": "^1.0.5", - "yargs": "^14.2.0" + "yargs": "^15.3.1" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -15203,10 +15198,14 @@ "ms": "2.0.0" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } }, "fs-extra": { "version": "1.0.0", @@ -15223,10 +15222,15 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "jsonfile": { "version": "2.4.0", @@ -15236,11 +15240,20 @@ "graceful-fs": "^4.1.6" } }, - "metro-react-native-babel-preset": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.59.0.tgz", - "integrity": "sha512-BoO6ncPfceIDReIH8pQ5tQptcGo5yRWQXJGVXfANbiKLq4tfgdZB1C1e2rMUJ6iypmeJU9dzl+EhPmIFKtgREg==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { + "p-locate": "^4.1.0" + } + }, + "metro-react-native-babel-preset": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.64.0.tgz", + "integrity": "sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ==", + "requires": { + "@babel/core": "^7.0.0", "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-export-default-from": "^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", @@ -15281,24 +15294,24 @@ "react-refresh": "^0.4.0" } }, - "mime-db": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", - "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=" - }, - "mime-types": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", - "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", - "requires": { - "mime-db": "~1.23.0" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -15318,61 +15331,39 @@ "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=" }, "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==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.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==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "ws": { @@ -15385,27 +15376,27 @@ } }, "yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "requires": { - "cliui": "^5.0.0", + "cliui": "^6.0.0", "decamelize": "^1.2.0", - "find-up": "^3.0.0", + "find-up": "^4.1.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", + "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" + "yargs-parser": "^18.1.2" } }, "yargs-parser": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", - "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -15414,9 +15405,9 @@ } }, "metro-babel-register": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.59.0.tgz", - "integrity": "sha512-JtWc29erdsXO/V3loenXKw+aHUXgj7lt0QPaZKPpctLLy8kcEpI/8pfXXgVK9weXICCpCnYtYncIosAyzh0xjg==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.64.0.tgz", + "integrity": "sha512-Kf6YvE3kIRumGnjK0Q9LqGDIdnsX9eFGtNBmBuCVDuB9wGGA/5CgX8We8W7Y44dz1RGTcHJRhfw5iGg+pwC3aQ==", "requires": { "@babel/core": "^7.0.0", "@babel/plugin-proposal-class-properties": "^7.0.0", @@ -15429,21 +15420,21 @@ } }, "metro-babel-transformer": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.59.0.tgz", - "integrity": "sha512-fdZJl8rs54GVFXokxRdD7ZrQ1TJjxWzOi/xSP25VR3E8tbm3nBZqS+/ylu643qSr/IueABR+jrlqAyACwGEf6w==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.64.0.tgz", + "integrity": "sha512-itZaxKTgmKGEZWxNzbSZBc22NngrMZzoUNuU92aHSTGkYi2WH4XlvzEHsstmIKHMsRVKl75cA+mNmgk4gBFJKw==", "requires": { "@babel/core": "^7.0.0", - "metro-source-map": "0.59.0" + "metro-source-map": "0.64.0", + "nullthrows": "^1.1.1" } }, "metro-cache": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.59.0.tgz", - "integrity": "sha512-ryWNkSnpyADfRpHGb8BRhQ3+k8bdT/bsxMH2O0ntlZYZ188d8nnYWmxbRvFmEzToJxe/ol4uDw0tJFAaQsN8KA==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.64.0.tgz", + "integrity": "sha512-QvGfxe/1QQYM9XOlR8W1xqE9eHDw/AgJIgYGn/TxZxBu9Zga+Rgs1omeSZju45D8w5VWgMr83ma5kACgzvOecg==", "requires": { - "jest-serializer": "^24.9.0", - "metro-core": "0.59.0", + "metro-core": "0.64.0", "mkdirp": "^0.5.1", "rimraf": "^2.5.4" }, @@ -15458,55 +15449,86 @@ } } }, + "metro-cache-key": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.64.0.tgz", + "integrity": "sha512-O9B65G8L/fopck45ZhdRosyVZdMtUQuX5mBWEC1NRj02iWBIUPLmYMjrunqIe8vHipCMp3DtTCm/65IlBmO8jg==" + }, "metro-config": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.59.0.tgz", - "integrity": "sha512-MDsknFG9vZ4Nb5VR6OUDmGHaWz6oZg/FtE3up1zVBKPVRTXE1Z+k7zypnPtMXjMh3WHs/Sy4+wU1xnceE/zdnA==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.64.0.tgz", + "integrity": "sha512-QhM4asnX5KhlRWaugwVGNNXhX0Z85u5nK0UQ/A90bBb4xWyXqUe20e788VtdA75rkQiiI6wXTCIHWT0afbnjwQ==", "requires": { "cosmiconfig": "^5.0.5", - "jest-validate": "^24.9.0", - "metro": "0.59.0", - "metro-cache": "0.59.0", - "metro-core": "0.59.0" + "jest-validate": "^26.5.2", + "metro": "0.64.0", + "metro-cache": "0.64.0", + "metro-core": "0.64.0", + "metro-runtime": "0.64.0" } }, "metro-core": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.59.0.tgz", - "integrity": "sha512-kb5LKvV5r2pqMEzGyTid8ai2mIjW13NMduQ8oBmfha7/EPTATcTQ//s+bkhAs1toQD8vqVvjAb0cPNjWQEmcmQ==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.64.0.tgz", + "integrity": "sha512-v8ZQ5j72EaUwamQ8pLfHlOHTyp7SbdazvHPzFGDpHnwIQqIT0Bw3Syg8R4regTlVG3ngpeSEAi005UITljmMcQ==", "requires": { - "jest-haste-map": "^24.9.0", + "jest-haste-map": "^26.5.2", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.59.0", - "wordwrap": "^1.0.0" + "metro-resolver": "0.64.0" } }, + "metro-hermes-compiler": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.64.0.tgz", + "integrity": "sha512-CLAjVDWGAoGhbi2ZyPHnH5YDdfrDIx6+tzFWfHGIMTZkYBXsYta9IfYXBV8lFb6BIbrXLjlXZAOoosknetMPOA==" + }, "metro-inspector-proxy": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.59.0.tgz", - "integrity": "sha512-hPeAuQcofTOH0F+2GEZqWkvkVY1/skezSSlMocDQDaqds+Kw6JgdA7FlZXxnKmQ/jYrWUzff/pl8SUCDwuYthQ==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.64.0.tgz", + "integrity": "sha512-KywbH3GNSz9Iqw4UH3smgaV2dBHHYMISeN7ORntDL/G+xfgPc6vt13d+zFb907YpUcXj5N0vdoiAHI5V/0y8IA==", "requires": { "connect": "^3.6.5", "debug": "^2.2.0", "ws": "^1.1.5", - "yargs": "^14.2.0" + "yargs": "^15.3.1" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -15515,10 +15537,14 @@ "ms": "2.0.0" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } }, "get-caller-file": { "version": "2.0.5", @@ -15526,46 +15552,67 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, "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==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.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==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "ws": { @@ -15578,27 +15625,27 @@ } }, "yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "requires": { - "cliui": "^5.0.0", + "cliui": "^6.0.0", "decamelize": "^1.2.0", - "find-up": "^3.0.0", + "find-up": "^4.1.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", + "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" + "yargs-parser": "^18.1.2" } }, "yargs-parser": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", - "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -15607,9 +15654,9 @@ } }, "metro-minify-uglify": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.59.0.tgz", - "integrity": "sha512-7IzVgCVWZMymgZ/quieg/9v5EQ8QmZWAgDc86Zp9j0Vy6tQTjUn6jlU+YAKW3mfMEjMr6iIUzCD8YklX78tFAw==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.64.0.tgz", + "integrity": "sha512-DRwRstqXR5qfte9Nuwoov5dRXxL7fJeVlO5fGyOajWeO3+AgPjvjXh/UcLJqftkMWTPGUFuzAD5/7JC5v5FLWw==", "requires": { "uglify-es": "^3.1.9" } @@ -15662,22 +15709,24 @@ } }, "metro-react-native-babel-transformer": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.59.0.tgz", - "integrity": "sha512-1O3wrnMq4NcPQ1asEcl9lRDn/t+F1Oef6S9WaYVIKEhg9m/EQRGVrrTVP+R6B5Eeaj3+zNKbzM8Dx/NWy1hUbQ==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.64.0.tgz", + "integrity": "sha512-K1sHO3ODBFCr7uEiCQ4RvVr+cQg0EHQF8ChVPnecGh/WDD8udrTq9ECwB0dRfMjAvlsHtRUlJm6ZSI8UPgum2w==", "requires": { "@babel/core": "^7.0.0", "babel-preset-fbjs": "^3.3.0", - "metro-babel-transformer": "0.59.0", - "metro-react-native-babel-preset": "0.59.0", - "metro-source-map": "0.59.0" + "metro-babel-transformer": "0.64.0", + "metro-react-native-babel-preset": "0.64.0", + "metro-source-map": "0.64.0", + "nullthrows": "^1.1.1" }, "dependencies": { "metro-react-native-babel-preset": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.59.0.tgz", - "integrity": "sha512-BoO6ncPfceIDReIH8pQ5tQptcGo5yRWQXJGVXfANbiKLq4tfgdZB1C1e2rMUJ6iypmeJU9dzl+EhPmIFKtgREg==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.64.0.tgz", + "integrity": "sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ==", "requires": { + "@babel/core": "^7.0.0", "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-export-default-from": "^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", @@ -15721,39 +15770,78 @@ } }, "metro-resolver": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.59.0.tgz", - "integrity": "sha512-lbgiumnwoVosffEI96z0FGuq1ejTorHAj3QYUPmp5dFMfitRxLP7Wm/WP9l4ZZjIptxTExsJwuEff1SLRCPD9w==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.64.0.tgz", + "integrity": "sha512-cJ26Id8Zf+HmS/1vFwu71K3u7ep/+HeXXAJIeVDYf+niE7AWB9FijyMtAlQgbD8elWqv1leJCnQ/xHRFBfGKYA==", "requires": { "absolute-path": "^0.0.0" } }, + "metro-runtime": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.64.0.tgz", + "integrity": "sha512-m7XbWOaIOeFX7YcxUhmnOi6Pg8EaeL89xyZ+quZyZVF1aNoTr4w8FfbKxvijpjsytKHIZtd+43m2Wt5JrqyQmQ==" + }, "metro-source-map": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.59.0.tgz", - "integrity": "sha512-0w5CmCM+ybSqXIjqU4RiK40t4bvANL6lafabQ2GP2XD3vSwkLY+StWzCtsb4mPuyi9R/SgoLBel+ZOXHXAH0eQ==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.64.0.tgz", + "integrity": "sha512-OCG2rtcp5cLEGYvAbfkl6mEc0J2FPRP4/UCEly+juBk7hawS9bCBMBfhJm/HIsvY1frk6nT2Vsl1O8YBbwyx2g==", "requires": { "@babel/traverse": "^7.0.0", "@babel/types": "^7.0.0", "invariant": "^2.2.4", - "metro-symbolicate": "0.59.0", - "ob1": "0.59.0", + "metro-symbolicate": "0.64.0", + "nullthrows": "^1.1.1", + "ob1": "0.64.0", "source-map": "^0.5.6", "vlq": "^1.0.0" } }, "metro-symbolicate": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz", - "integrity": "sha512-asLaF2A7rndrToGFIknL13aiohwPJ95RKHf0NM3hP/nipiLDoMzXT6ZnQvBqDxkUKyP+51AI75DMtb+Wcyw4Bw==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.64.0.tgz", + "integrity": "sha512-qIi+YRrDWnLVmydj6gwidYLPaBsakZRibGWSspuXgHAxOI3UuLwlo4dpQ73Et0gyHjI7ZvRMRY8JPiOntf9AQQ==", "requires": { "invariant": "^2.2.4", - "metro-source-map": "0.59.0", + "metro-source-map": "0.64.0", + "nullthrows": "^1.1.1", "source-map": "^0.5.6", "through2": "^2.0.1", "vlq": "^1.0.0" } }, + "metro-transform-plugins": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.64.0.tgz", + "integrity": "sha512-iTIRBD/wBI98plfxj8jAoNUUXfXLNlyvcjPtshhpGvdwu9pzQilGfnDnOaaK+vbITcOk9w5oQectXyJwAqTr1A==", + "requires": { + "@babel/core": "^7.0.0", + "@babel/generator": "^7.5.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "nullthrows": "^1.1.1" + } + }, + "metro-transform-worker": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.64.0.tgz", + "integrity": "sha512-wegRtK8GyLF6IPZRBJp+zsORgA4iX0h1DRpknyAMDCtSbJ4VU2xV/AojteOgAsDvY3ucAGsvfuZLNDJHUdUNHQ==", + "requires": { + "@babel/core": "^7.0.0", + "@babel/generator": "^7.5.0", + "@babel/parser": "^7.0.0", + "@babel/types": "^7.0.0", + "babel-preset-fbjs": "^3.3.0", + "metro": "0.64.0", + "metro-babel-transformer": "0.64.0", + "metro-cache": "0.64.0", + "metro-cache-key": "0.64.0", + "metro-hermes-compiler": "0.64.0", + "metro-source-map": "0.64.0", + "metro-transform-plugins": "0.64.0", + "nullthrows": "^1.1.1" + } + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -15984,6 +16072,11 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -16007,6 +16100,14 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" }, + "node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", + "requires": { + "minimatch": "^3.0.2" + } + }, "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", @@ -16187,9 +16288,9 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "ob1": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.59.0.tgz", - "integrity": "sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ==" + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.64.0.tgz", + "integrity": "sha512-CO1N+5dhvy+MoAwxz8+fymEUcwsT4a+wHhrHFb02LppcJdHxgcBWviwEhUwKOD2kLMQ7ijrrzybOqpGcqEtvpQ==" }, "object-assign": { "version": "4.1.1", @@ -16730,8 +16831,7 @@ "picomatch": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==" }, "pify": { "version": "4.0.1", @@ -16877,38 +16977,46 @@ } }, "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", - "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", - "requires": { - "@types/yargs-parser": "*" - } - }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" } } }, @@ -16955,7 +17063,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "dev": true, "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -17254,13 +17361,12 @@ } }, "react": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", - "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", + "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", "requires": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" + "object-assign": "^4.1.1" } }, "react-clone-referenced-element": { @@ -17269,9 +17375,9 @@ "integrity": "sha512-LZBPvQV8W0B5dFzXFu+D3Tpil8YHS8tO00iFsfXcTLdtpuH7XyvaHqHcoz4hd4uNPQCZ30fceh+s7mLznzMXvg==" }, "react-devtools-core": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.13.1.tgz", - "integrity": "sha512-+N7vZgjQWqkPe/q7yltXOi20U3Zy4WdXax9IcLCNB4nWsUxLrkVF0Mqbsr3h4m/j0dA4046QpJOnlwdWVQuiFw==", + "version": "4.13.5", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.13.5.tgz", + "integrity": "sha512-k+P5VSKM6P22Go9IQ8dJmjj9fbztvKt1iRDI/4wS5oTvd1EnytIJMYB59wZt+D3kgp64jklNX/MRmY42xAQ08g==", "requires": { "shell-quote": "^1.6.1", "ws": "^7" @@ -17291,50 +17397,55 @@ } }, "react-native": { - "version": "0.63.4", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.63.4.tgz", - "integrity": "sha512-I4kM8kYO2mWEYUFITMcpRulcy4/jd+j9T6PbIzR0FuMcz/xwd+JwHoLPa1HmCesvR1RDOw9o4D+OFLwuXXfmGw==", + "version": "0.64.2", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.64.2.tgz", + "integrity": "sha512-Ty/fFHld9DcYsFZujXYdeVjEhvSeQcwuTGXezyoOkxfiGEGrpL/uwUZvMzwShnU4zbbTKDu2PAm/uwuOittRGA==", "requires": { - "@babel/runtime": "^7.0.0", - "@react-native-community/cli": "^4.10.0", - "@react-native-community/cli-platform-android": "^4.10.0", - "@react-native-community/cli-platform-ios": "^4.10.0", + "@jest/create-cache-key-function": "^26.5.0", + "@react-native-community/cli": "^5.0.1-alpha.1", + "@react-native-community/cli-platform-android": "^5.0.1-alpha.1", + "@react-native-community/cli-platform-ios": "^5.0.1-alpha.1", + "@react-native/assets": "1.0.0", + "@react-native/normalize-color": "1.0.0", + "@react-native/polyfills": "1.0.0", "abort-controller": "^3.0.0", "anser": "^1.4.9", "base64-js": "^1.1.2", "event-target-shim": "^5.0.1", - "fbjs": "^1.0.0", - "fbjs-scripts": "^1.1.0", - "hermes-engine": "~0.5.0", + "hermes-engine": "~0.7.0", "invariant": "^2.2.4", "jsc-android": "^245459.0.0", - "metro-babel-register": "0.59.0", - "metro-react-native-babel-transformer": "0.59.0", - "metro-source-map": "0.59.0", + "metro-babel-register": "0.64.0", + "metro-react-native-babel-transformer": "0.64.0", + "metro-runtime": "0.64.0", + "metro-source-map": "0.64.0", "nullthrows": "^1.1.1", - "pretty-format": "^24.9.0", + "pretty-format": "^26.5.2", "promise": "^8.0.3", "prop-types": "^15.7.2", "react-devtools-core": "^4.6.0", + "react-native-codegen": "^0.0.6", "react-refresh": "^0.4.0", "regenerator-runtime": "^0.13.2", - "scheduler": "0.19.1", + "scheduler": "^0.20.1", + "shelljs": "^0.8.4", "stacktrace-parser": "^0.1.3", "use-subscription": "^1.0.0", - "whatwg-fetch": "^3.0.0" + "whatwg-fetch": "^3.0.0", + "ws": "^6.1.4" }, "dependencies": { "@react-native-community/cli": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-4.14.0.tgz", - "integrity": "sha512-EYJKBuxFxAu/iwNUfwDq41FjORpvSh1wvQ3qsHjzcR5uaGlWEOJrd3uNJDuKBAS0TVvbEesLF9NEXipjyRVr4Q==", + "version": "5.0.1-alpha.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-5.0.1-alpha.2.tgz", + "integrity": "sha512-PP22TVV2VyELXhAX4PcBisasssastSEx23XDklfPoCPIXD2QgGC7y39n/b5I9tOzKi2qYswCEAcDpwXYwevGOg==", "requires": { - "@hapi/joi": "^15.0.3", - "@react-native-community/cli-debugger-ui": "^4.13.1", - "@react-native-community/cli-hermes": "^4.13.0", - "@react-native-community/cli-server-api": "^4.13.1", - "@react-native-community/cli-tools": "^4.13.0", - "@react-native-community/cli-types": "^4.10.1", + "@react-native-community/cli-debugger-ui": "^5.0.1-alpha.1", + "@react-native-community/cli-hermes": "^5.0.1-alpha.1", + "@react-native-community/cli-server-api": "^5.0.1-alpha.2", + "@react-native-community/cli-tools": "^5.0.1-alpha.1", + "@react-native-community/cli-types": "^5.0.1-alpha.1", + "appdirsjs": "^1.2.4", "chalk": "^3.0.0", "command-exists": "^1.2.8", "commander": "^2.19.0", @@ -17346,48 +17457,32 @@ "fs-extra": "^8.1.0", "glob": "^7.1.3", "graceful-fs": "^4.1.3", - "inquirer": "^3.0.6", + "joi": "^17.2.1", "leven": "^3.1.0", "lodash": "^4.17.15", - "metro": "^0.59.0", - "metro-config": "^0.59.0", - "metro-core": "^0.59.0", - "metro-react-native-babel-transformer": "^0.59.0", - "metro-resolver": "^0.59.0", + "metro": "^0.64.0", + "metro-config": "^0.64.0", + "metro-core": "^0.64.0", + "metro-react-native-babel-transformer": "^0.64.0", + "metro-resolver": "^0.64.0", + "metro-runtime": "^0.64.0", "minimist": "^1.2.0", "mkdirp": "^0.5.1", "node-stream-zip": "^1.9.1", "ora": "^3.4.0", - "pretty-format": "^25.2.0", + "pretty-format": "^26.6.2", + "prompts": "^2.4.0", "semver": "^6.3.0", "serve-static": "^1.13.1", "strip-ansi": "^5.2.0", "sudo-prompt": "^9.0.0", "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "pretty-format": { - "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.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - } } }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "ansi-styles": { "version": "4.3.0", @@ -17406,11 +17501,6 @@ "supports-color": "^7.1.0" } }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -17424,16 +17514,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -17458,86 +17538,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -17564,38 +17564,12 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - } } }, "supports-color": { @@ -17605,6 +17579,14 @@ "requires": { "has-flag": "^4.0.0" } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "requires": { + "async-limiter": "~1.0.0" + } } } }, @@ -17628,6 +17610,16 @@ "prop-types": "^15.6.2" } }, + "react-native-codegen": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.6.tgz", + "integrity": "sha512-cMvrUelD81wiPitEPiwE/TCNscIVauXxmt4NTGcy18HrUd0WRWXfYzAQGXm0eI87u3NMudNhqFj2NISJenxQHg==", + "requires": { + "flow-parser": "^0.121.0", + "jscodeshift": "^0.11.0", + "nullthrows": "^1.1.1" + } + }, "react-native-crypto": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/react-native-crypto/-/react-native-crypto-2.2.0.tgz", @@ -17746,9 +17738,8 @@ "from": "git+https://github.com/marcosrdz/react-native-handoff.git#f5becc63f3e36bf2da1ed1fc60fc690323e73602" }, "react-native-haptic-feedback": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/react-native-haptic-feedback/-/react-native-haptic-feedback-1.11.0.tgz", - "integrity": "sha512-KTIy7lExwMtB6pOpCARyUzFj5EzYTh+A1GN/FB5Eb0LrW5C6hbb1kdj9K2/RHyZC+wyAJD1M823ZaDCU6n6cLA==" + "version": "git+https://github.com/junina-de/react-native-haptic-feedback.git#8e4d598ad9be886325316b0e2140df8df624a91f", + "from": "git+https://github.com/junina-de/react-native-haptic-feedback.git#8e4d598ad9be886325316b0e2140df8df624a91f" }, "react-native-idle-timer": { "version": "git+https://github.com/BlueWallet/react-native-idle-timer.git#8587876d68ab5920e79619726aeca9e672beaf2b", @@ -17798,13 +17789,12 @@ } }, "react-native-navigation-bar-color": { - "version": "git+https://github.com/BlueWallet/react-native-navigation-bar-color.git#34e44b8f44e442133de9d35c35f2679d40982804", - "from": "git+https://github.com/BlueWallet/react-native-navigation-bar-color.git#34e44b8f44e442133de9d35c35f2679d40982804" + "version": "git+https://github.com/BlueWallet/react-native-navigation-bar-color.git#3b2894ae62fbce99a3bd24105f0921cebaef5c94", + "from": "git+https://github.com/BlueWallet/react-native-navigation-bar-color.git#3b2894ae62fbce99a3bd24105f0921cebaef5c94" }, "react-native-obscure": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-native-obscure/-/react-native-obscure-1.2.1.tgz", - "integrity": "sha512-zepY31U2HAWrxPP+uGhDFFa1yGdbIa06iviCYRQJcEN2K4gtcEYBCtsk+PdClaiwIREZOQ7YKscxCIlZyR1m6w==" + "version": "git+https://github.com/BlueWallet/react-native-obscure.git#f4b83b4a261e39b1f5ed4a45ac5bcabc8a59eadb", + "from": "git+https://github.com/BlueWallet/react-native-obscure.git#f4b83b4a261e39b1f5ed4a45ac5bcabc8a59eadb" }, "react-native-passcode-auth": { "version": "git+https://github.com/BlueWallet/react-native-passcode-auth.git#a2ff977ba92b36f8d0a5567f59c05cc608e8bd12", @@ -17929,9 +17919,12 @@ } }, "react-native-screens": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-2.18.1.tgz", - "integrity": "sha512-r5WZLpmx2hHjC1RgMdPq5YpSU9tEhBpUaZ5M1SUtNIONyiLqQVxabhRCINdebIk4depJiIl7yw2Q85zJyeX6fw==" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.4.0.tgz", + "integrity": "sha512-cg+q9MRnVdeOcJyvJtqffoXLur/C2wHA/7IO2+FAipzTlgHbbM1mTuSM7qG+SeiQjoIs4mHOEf7A0ziPKW04sA==", + "requires": { + "warn-once": "^0.1.0" + } }, "react-native-secure-key-store": { "version": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#63ab38c9d382a819844a086a69cc204c46aa93f9", @@ -18207,6 +18200,60 @@ "stacktrace-parser": "^0.1.3", "use-subscription": "^1.0.0", "whatwg-fetch": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/istanbul-reports": { + "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/yargs": { + "version": "13.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", + "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } } }, "react-refresh": { @@ -18214,6 +18261,16 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==" }, + "react-shallow-renderer": { + "version": "16.14.1", + "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz", + "integrity": "sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0" + } + }, "react-shallow-testutils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/react-shallow-testutils/-/react-shallow-testutils-2.0.0.tgz", @@ -18230,15 +18287,23 @@ } }, "react-test-renderer": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.13.1.tgz", - "integrity": "sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.1.tgz", + "integrity": "sha512-/dRae3mj6aObwkjCcxZPlxDFh73XZLgvwhhyON2haZGUEhiaY5EjfAdw+d/rQmlcFwdTpMXCSGVk374QbCTlrA==", "dev": true, "requires": { "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.19.1" + "react-is": "^17.0.1", + "react-shallow-renderer": "^16.13.1", + "scheduler": "^0.20.1" + }, + "dependencies": { + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + } } }, "read-env": { @@ -18442,6 +18507,29 @@ "node-fetch": "^2.6.0" } }, + "recast": { + "version": "0.20.4", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.4.tgz", + "integrity": "sha512-6qLIBGGRcwjrTZGIiBpJVC/NeuXpogXNyRQpqU1zWPUigCphvApoCs9KIwDYh1eDuJ6dAFlQoi/QUyE5KQ6RBQ==", + "requires": { + "ast-types": "0.14.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.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==" + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -18853,9 +18941,9 @@ } }, "scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -19102,8 +19190,7 @@ "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "sjcl": { "version": "1.0.8", @@ -19360,21 +19447,6 @@ "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", "integrity": "sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=" }, - "stack-utils": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", - "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", - "requires": { - "escape-string-regexp": "^2.0.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==" - } - } - }, "stackframe": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", @@ -19962,9 +20034,9 @@ } }, "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" }, "through": { "version": "2.3.8", @@ -20536,6 +20608,11 @@ "makeerror": "1.0.x" } }, + "warn-once": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.0.tgz", + "integrity": "sha512-recZTSvuaH/On5ZU5ywq66y99lImWqzP93+AiUo9LUwG8gXHW+LJjhOd6REJHm7qb0niYqrEQJvbHSQfuJtTqA==" + }, "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -20642,11 +20719,6 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -20797,11 +20869,6 @@ "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==" }, - "xpipe": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/xpipe/-/xpipe-1.0.5.tgz", - "integrity": "sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98=" - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 5e87bce2b..a1630dddb 100644 --- a/package.json +++ b/package.json @@ -7,13 +7,13 @@ "url": "https://github.com/BlueWallet/BlueWallet.git" }, "devDependencies": { - "@babel/core": "^7.10.4", + "@babel/core": "^7.12.9", "@babel/runtime": "^7.14.6", "@jest/reporters": "^26.4.1", "@react-native-community/eslint-config": "^2.0.0", "babel-cli": "^6.26.0", "babel-eslint": "^10.1.0", - "babel-jest": "^26.1.0", + "babel-jest": "^26.6.3", "eslint": "^7.25.0", "eslint-config-prettier": "^8.3.0", "eslint-config-standard": "^16.0.2", @@ -28,7 +28,7 @@ "eslint-plugin-standard": "^4.1.0", "jest": "^26.1.0", "prettier": "^2.2.1", - "react-test-renderer": "16.13.1" + "react-test-renderer": "17.0.1" }, "engines": { "node": ">=10.16.0", @@ -48,7 +48,7 @@ "jest": "jest -b -w 1 tests/integration/*", "maccatalystpatches": "./scripts/maccatalystpatches/applypatchesformaccatalyst.sh", "e2e:debug-build": "detox build -c android.emu.debug", - "e2e:debug-test": "detox test -c android.emu.debug", + "e2e:debug-test": "detox test -c android.emu.debug -l fatal", "e2e:debug": "(test -f android/app/build/outputs/apk/debug/app-debug.apk && test -f android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk) || npm run e2e:debug-build; npm run e2e:debug-test", "e2e:release-build": "detox build -c android.emu.release", "e2e:release-test": "detox test -c android.emu.release --record-videos all --take-screenshots all --headless --loglevel trace", @@ -62,6 +62,9 @@ "transform": { "^.+\\.js$": "/node_modules/react-native/jest/preprocessor.js" }, + "transformIgnorePatterns": [ + "node_modules/(?!((jest-)?react-native(-.*)?|@react-native(-community)?)/)" + ], "setupFiles": [ "./tests/setup.js" ], @@ -83,7 +86,7 @@ "@react-navigation/native": "5.9.4", "@react-navigation/stack": "5.14.5", "@remobile/react-native-qrcode-local-image": "https://github.com/BlueWallet/react-native-qrcode-local-image", - "@sentry/react-native": "2.5.2", + "@sentry/react-native": "2.6.0", "aez": "1.0.1", "amplitude-js": "7.4.4", "assert": "2.0.0", @@ -103,7 +106,7 @@ "coinselect": "3.1.12", "crypto-js": "4.0.0", "dayjs": "1.10.5", - "detox": "18.17.0", + "detox": "18.18.1", "ecurve": "1.0.6", "electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4", "electrum-mnemonic": "2.0.0", @@ -118,9 +121,9 @@ "pbkdf2": "3.1.1", "process": "0.11.10", "prop-types": "15.7.2", - "react": "16.13.1", + "react": "17.0.1", + "react-native": "0.64.2", "react-localization": "1.0.17", - "react-native": "0.63.4", "react-native-blue-crypto": "https://github.com/BlueWallet/react-native-blue-crypto", "react-native-camera": "3.44.1", "react-native-crypto": "2.2.0", @@ -132,7 +135,7 @@ "react-native-fs": "2.18.0", "react-native-gesture-handler": "1.10.3", "react-native-handoff": "https://github.com/marcosrdz/react-native-handoff#f5becc63f3e36bf2da1ed1fc60fc690323e73602", - "react-native-haptic-feedback": "1.11.0", + "react-native-haptic-feedback": "https://github.com/junina-de/react-native-haptic-feedback.git#8e4d598ad9be886325316b0e2140df8df624a91f", "react-native-idle-timer": "https://github.com/BlueWallet/react-native-idle-timer#8587876d68ab5920e79619726aeca9e672beaf2b", "react-native-image-picker": "3.8.1", "react-native-keychain": "7.0.0", @@ -140,8 +143,8 @@ "react-native-linear-gradient": "2.5.6", "react-native-localize": "2.1.1", "react-native-modal": "11.10.0", - "react-native-navigation-bar-color": "https://github.com/BlueWallet/react-native-navigation-bar-color#34e44b8f44e442133de9d35c35f2679d40982804", - "react-native-obscure": "1.2.1", + "react-native-navigation-bar-color": "https://github.com/BlueWallet/react-native-navigation-bar-color#3b2894ae62fbce99a3bd24105f0921cebaef5c94", + "react-native-obscure": "https://github.com/BlueWallet/react-native-obscure.git#f4b83b4a261e39b1f5ed4a45ac5bcabc8a59eadb", "react-native-passcode-auth": "https://github.com/BlueWallet/react-native-passcode-auth#a2ff977ba92b36f8d0a5567f59c05cc608e8bd12", "react-native-popup-menu-android": "1.0.3", "react-native-privacy-snapshot": "https://github.com/BlueWallet/react-native-privacy-snapshot#529e4627d93f67752a27e82a040ff7b64dca0783", @@ -153,7 +156,7 @@ "react-native-rate": "1.2.6", "react-native-reanimated": "2.2.0", "react-native-safe-area-context": "3.2.0", - "react-native-screens": "2.18.1", + "react-native-screens": "3.4.0", "react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#63ab38c9d382a819844a086a69cc204c46aa93f9", "react-native-share": "6.2.1", "react-native-sortable-list": "https://github.com/BlueWallet/react-native-sortable-list.git#46e39a30ae0c4328e7c06c30b72b1af0b69e1aeb", diff --git a/tests/e2e/bluewallet.spec.js b/tests/e2e/bluewallet.spec.js index c0ce2bbbf..c54a70ada 100644 --- a/tests/e2e/bluewallet.spec.js +++ b/tests/e2e/bluewallet.spec.js @@ -186,7 +186,7 @@ describe('BlueWallet UI Tests', () => { await yo('BitcoinAddressQRCodeContainer'); await yo('BlueCopyTextToClipboard'); await element(by.id('SetCustomAmountButton')).tap(); - await element(by.id('BitcoinAmountInput')).typeText('1'); + await element(by.id('BitcoinAmountInput')).replaceText('1'); await element(by.id('CustomAmountDescription')).typeText('test'); await element(by.id('CustomAmountSaveButton')).tap(); await sup('1 BTC'); @@ -836,11 +836,11 @@ describe('BlueWallet UI Tests', () => { await expect(element(by.id('BitcoinAddressQRCodeContainer'))).toBeVisible(); await expect(element(by.text('bc1qtc9zquvq7lgq87kzsgltvv4etwm9uxphfkvkay'))).toBeVisible(); await element(by.id('SetCustomAmountButton')).tap(); - await element(by.id('BitcoinAmountInput')).typeText('1'); + await element(by.id('BitcoinAmountInput')).replaceText('1'); await element(by.id('CustomAmountDescription')).typeText('Test'); await element(by.id('CustomAmountSaveButton')).tap(); - await expect(element(by.text('1 BTC'))).toBeVisible(); - await expect(element(by.text('Test'))).toBeVisible(); + await sup('1 BTC'); + await sup('Test'); await expect(element(by.id('BitcoinAddressQRCodeContainer'))).toBeVisible(); await expect(element(by.text('bitcoin:bc1qtc9zquvq7lgq87kzsgltvv4etwm9uxphfkvkay?amount=1&label=Test'))).toBeVisible(); From 07c75c47b010892a752c3650a77ee988bb455477 Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Tue, 6 Jul 2021 12:05:11 +0300 Subject: [PATCH 191/327] FIX: for slip39 wallets import bech32 even if no tx found --- class/wallet-import.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/class/wallet-import.js b/class/wallet-import.js index ea2125cd7..266abdf22 100644 --- a/class/wallet-import.js +++ b/class/wallet-import.js @@ -298,9 +298,7 @@ function WalletImport() { const s3 = new SLIP39SegwitBech32Wallet(); s3.setSecret(importText); - if (await s3.wasEverUsed()) { - return WalletImport._saveWallet(s3); - } + return WalletImport._saveWallet(s3); } } From ebdc8412f034ba9b4412049c077279bfffb0d266 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 6 Jul 2021 12:46:02 +0000 Subject: [PATCH 192/327] Translate /loc/en.json in es_419 review completed for the source file '/loc/en.json' on the 'es_419' language. --- loc/es_419.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/loc/es_419.json b/loc/es_419.json index b70bf3033..0fda1fe09 100644 --- a/loc/es_419.json +++ b/loc/es_419.json @@ -581,7 +581,9 @@ "sign_aopp_confirm": "¿Quieres enviar un mensaje firmado a {hostname}?", "addresses_title": "Direcciones", "type_change": "Cambio", - "type_receive": "Recibir" + "type_receive": "Recibir", + "type_used": "Usado", + "transactions": "Transacciones" }, "aopp": { "title": "Seleccionar dirección", From cd135c95e393394957dc197d5802d48d5c5da1f7 Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Tue, 6 Jul 2021 16:07:47 +0300 Subject: [PATCH 193/327] ADD: IRR currency --- ios/Widgets/Shared/WidgetAPI.swift | 9 ++++++++- models/fiatUnit.js | 19 +++++++++++++++++++ models/fiatUnit.json | 6 ++++++ tests/integration/Currency.test.js | 8 +++++++- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/ios/Widgets/Shared/WidgetAPI.swift b/ios/Widgets/Shared/WidgetAPI.swift index fc2e2655b..5719142a1 100644 --- a/ios/Widgets/Shared/WidgetAPI.swift +++ b/ios/Widgets/Shared/WidgetAPI.swift @@ -31,6 +31,8 @@ class WidgetAPI { urlString = "https://api.yadio.io/json/\(endPointKey)" case "BitcoinduLiban": urlString = "https://bitcoinduliban.org/api.php?key=lbpusd" + case "Exir": + urlString = "https://api.exir.io/v1/ticker?symbol=btc-irt" default: urlString = "https://api.coindesk.com/v1/bpi/currentprice/\(endPointKey).json" } @@ -59,7 +61,12 @@ class WidgetAPI { latestRateDataStore = WidgetDataStore(rate: String(rateDouble), lastUpdate: lastUpdatedString, rateDouble: rateDouble) case "BitcoinduLiban": guard let rateString = json["BTC/LBP"] as? String else { break } - guard let rateDouble = Double(rateString) else {return} + guard let rateDouble = Double(rateString) else { break } + let lastUpdatedString = ISO8601DateFormatter().string(from: Date()) + latestRateDataStore = WidgetDataStore(rate: rateString, lastUpdate: lastUpdatedString, rateDouble: rateDouble) + case "Exir": + guard let rateDouble = json["last"] as? Double else { break } + let rateString = String(rateDouble) let lastUpdatedString = ISO8601DateFormatter().string(from: Date()) latestRateDataStore = WidgetDataStore(rate: rateString, lastUpdate: lastUpdatedString, rateDouble: rateDouble) default: diff --git a/models/fiatUnit.js b/models/fiatUnit.js index 3595e7b8f..9526c3823 100644 --- a/models/fiatUnit.js +++ b/models/fiatUnit.js @@ -4,6 +4,7 @@ export const FiatUnitSource = Object.freeze({ CoinDesk: 'CoinDesk', Yadio: 'Yadio', BitcoinduLiban: 'BitcoinduLiban', + Exir: 'Exir', }); const RateExtractors = Object.freeze({ @@ -57,6 +58,24 @@ const RateExtractors = Object.freeze({ let rate = json?.[`BTC/${ticker}`]; if (!rate) throw new Error(`Could not update rate for ${ticker}: data is wrong`); + rate = Number(rate); + if (!(rate >= 0)) throw new Error(`Could not update rate for ${ticker}: data is wrong`); + return rate; + }, + Exir: async ticker => { + const api = new Frisbee({ baseURI: 'https://api.exir.io' }); + const res = await api.get('/v1/ticker?symbol=btc-irt'); + if (res.err) throw new Error(`Could not update rate for ${ticker}: ${res.err}`); + + let json; + try { + json = typeof res.body === 'string' ? JSON.parse(res.body) : res.body; + } catch (e) { + throw new Error(`Could not update rate for ${ticker}: ${e.message}`); + } + let rate = json?.last; + if (!rate) throw new Error(`Could not update rate for ${ticker}: data is wrong`); + rate = Number(rate); if (!(rate >= 0)) throw new Error(`Could not update rate for ${ticker}: data is wrong`); return rate; diff --git a/models/fiatUnit.json b/models/fiatUnit.json index d9b828b72..617bed235 100644 --- a/models/fiatUnit.json +++ b/models/fiatUnit.json @@ -113,6 +113,12 @@ "locale": "hi-HN", "source": "CoinDesk" }, + "IRR": { + "endPointKey": "IRR", + "symbol": "﷼", + "locale": "fa-IR", + "source": "Exir" + }, "JPY": { "endPointKey": "JPY", "symbol": "¥", diff --git a/tests/integration/Currency.test.js b/tests/integration/Currency.test.js index a23e0644d..971de5556 100644 --- a/tests/integration/Currency.test.js +++ b/tests/integration/Currency.test.js @@ -38,7 +38,13 @@ describe('currency', () => { // disabled, because it throws "Service Temporarily Unavailable" on circleci // await currency.setPrefferedCurrency(FiatUnit.LBP); // await currency.startUpdater(); - // cur = JSON.parse(await AsyncStorage.getItem(AppStorage.EXCHANGE_RATES)); + // cur = JSON.parse(await AsyncStorage.getItem(currency.EXCHANGE_RATES)); // assert.ok(cur.BTC_LBP > 0); + + // test Exir rate source + await currency.setPrefferedCurrency(FiatUnit.IRR); + await currency.startUpdater(); + cur = JSON.parse(await AsyncStorage.getItem(currency.EXCHANGE_RATES)); + assert.ok(cur.BTC_IRR > 0); }); }); From 1a6b67fe22c748f18fd01464253a29cc32741532 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 6 Jul 2021 16:54:18 +0000 Subject: [PATCH 194/327] Translate /loc/en.json in fa_IR review completed for the source file '/loc/en.json' on the 'fa_IR' language. --- loc/fa.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/loc/fa.json b/loc/fa.json index b515cccef..75d22a8c8 100644 --- a/loc/fa.json +++ b/loc/fa.json @@ -581,7 +581,9 @@ "sign_aopp_confirm": "آیا مایل به ارسال پیام امضاشده به {hostname} هستید؟", "addresses_title": "آدرس‌ها", "type_change": "باقی‌مانده", - "type_receive": "دریافت" + "type_receive": "دریافت", + "type_used": "استفاده‌شده", + "transactions": "تراکنش‌ها" }, "aopp": { "title": "انتخاب آدرس", From 9a0a9ff84e06909b0b5e79e3a5ce130dc52fce82 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Tue, 6 Jul 2021 21:41:00 +0100 Subject: [PATCH 195/327] FIX: hardware wallet with BIP44/BIP49 wallet reports incorrect change address in PSBT --- class/wallets/hd-legacy-p2pkh-wallet.js | 5 +++ class/wallets/hd-segwit-p2sh-wallet.js | 5 +++ tests/unit/hd-legacy-wallet.test.js | 4 +-- tests/unit/hd-segwit-p2sh-wallet.test.js | 4 +-- tests/unit/watch-only-wallet.test.js | 39 ++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 4 deletions(-) diff --git a/class/wallets/hd-legacy-p2pkh-wallet.js b/class/wallets/hd-legacy-p2pkh-wallet.js index a0fcb5b22..21a60fce4 100644 --- a/class/wallets/hd-legacy-p2pkh-wallet.js +++ b/class/wallets/hd-legacy-p2pkh-wallet.js @@ -162,4 +162,9 @@ export class HDLegacyP2PKHWallet extends AbstractHDElectrumWallet { return psbt; } + + _getDerivationPathByAddress(address, BIP = 44) { + // only changing defaults for function arguments + return super._getDerivationPathByAddress(address, BIP); + } } diff --git a/class/wallets/hd-segwit-p2sh-wallet.js b/class/wallets/hd-segwit-p2sh-wallet.js index eb4096948..5f9fe1014 100644 --- a/class/wallets/hd-segwit-p2sh-wallet.js +++ b/class/wallets/hd-segwit-p2sh-wallet.js @@ -148,4 +148,9 @@ export class HDSegwitP2SHWallet extends AbstractHDElectrumWallet { }); return address; } + + _getDerivationPathByAddress(address, BIP = 49) { + // only changing defaults for function arguments + return super._getDerivationPathByAddress(address, BIP); + } } diff --git a/tests/unit/hd-legacy-wallet.test.js b/tests/unit/hd-legacy-wallet.test.js index 062e0d590..81315d278 100644 --- a/tests/unit/hd-legacy-wallet.test.js +++ b/tests/unit/hd-legacy-wallet.test.js @@ -35,8 +35,8 @@ describe('Legacy HD (BIP44)', () => { '02ad7b2216f3a2b38d56db8a7ee5c540fd12c4bbb7013106eff78cc2ace65aa002', ); - assert.strictEqual(hd._getDerivationPathByAddress(hd._getExternalAddressByIndex(0)), "m/84'/0'/0'/0/0"); // wrong, FIXME - assert.strictEqual(hd._getDerivationPathByAddress(hd._getInternalAddressByIndex(0)), "m/84'/0'/0'/1/0"); // wrong, FIXME + assert.strictEqual(hd._getDerivationPathByAddress(hd._getExternalAddressByIndex(0)), "m/44'/0'/0'/0/0"); + assert.strictEqual(hd._getDerivationPathByAddress(hd._getInternalAddressByIndex(0)), "m/44'/0'/0'/1/0"); }); it('can create TX', async () => { diff --git a/tests/unit/hd-segwit-p2sh-wallet.test.js b/tests/unit/hd-segwit-p2sh-wallet.test.js index 668683b01..76b140fda 100644 --- a/tests/unit/hd-segwit-p2sh-wallet.test.js +++ b/tests/unit/hd-segwit-p2sh-wallet.test.js @@ -24,8 +24,8 @@ describe('P2SH Segwit HD (BIP49)', () => { '03c107e6976d59e17490513fbed3fb321736b7231d24f3d09306c72714acf1859d', ); - assert.strictEqual(hd._getDerivationPathByAddress(hd._getExternalAddressByIndex(0)), "m/84'/0'/0'/0/0"); // wrong, FIXME - assert.strictEqual(hd._getDerivationPathByAddress(hd._getInternalAddressByIndex(0)), "m/84'/0'/0'/1/0"); // wrong, FIXME + assert.strictEqual(hd._getDerivationPathByAddress(hd._getExternalAddressByIndex(0)), "m/49'/0'/0'/0/0"); + assert.strictEqual(hd._getDerivationPathByAddress(hd._getInternalAddressByIndex(0)), "m/49'/0'/0'/1/0"); assert.strictEqual('L4MqtwJm6hkbACLG4ho5DF8GhcXdLEbbvpJnbzA9abfD6RDpbr2m', hd._getExternalWIFByIndex(0)); assert.strictEqual( diff --git a/tests/unit/watch-only-wallet.test.js b/tests/unit/watch-only-wallet.test.js index 134a06bb3..7f281afdd 100644 --- a/tests/unit/watch-only-wallet.test.js +++ b/tests/unit/watch-only-wallet.test.js @@ -297,6 +297,45 @@ describe('Watch only wallet', () => { assert.ok(!w.addressIsChange(await w._getExternalAddressByIndex(0))); assert.ok(w.addressIsChange(await w._getInternalAddressByIndex(0))); }); + + it('can craft correct psbt for HW wallet to sign', async () => { + const w = new WatchOnlyWallet(); + w.setSecret('ypub6Y9u3QCRC1HkZv3stNxcQVwmw7vC7KX5Ldz38En5P88RQbesP2oy16hNyQocVCfYRQPxdHcd3pmu9AFhLv7NdChWmw5iNLryZ2U6EEHdnfo'); + w.init(); + + // a hack to make it find pubkey for address correctly: + w._hdWalletInstance.next_free_address_index = 110; + w._hdWalletInstance.next_free_change_address_index = 110; + + const utxos = [ + { + height: 557538, + value: 51432, + address: '3GCvDBAktgQQtsbN6x5DYiQCMmgZ9Yk8BK', + txId: 'b2ac59bc282083498d1e87805d89bef9d3f3bc216c1d2c4dfaa2e2911b547100', + vout: 0, + txid: 'b2ac59bc282083498d1e87805d89bef9d3f3bc216c1d2c4dfaa2e2911b547100', + amount: 51432, + wif: false, + confirmations: 132402, + }, + ]; + + const changeAddress = '3DrZBgntD8kBBbuKLJtPVAeGT75BMC7NxU'; + + const { psbt } = await w.createTransaction( + utxos, + [{ address: 'bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu', value: 5000 }], + 1, + changeAddress, + ); + + assert.strictEqual( + psbt.data.outputs[1].bip32Derivation[0].pubkey.toString('hex'), + '03e060c9b5bb85476caa53e3b8cd3d40c9dc2c36a8a5e8ed87e48bfc9bbe1760ad', + ); + assert.strictEqual(psbt.data.outputs[1].bip32Derivation[0].path, "m/49'/0'/0'/1/46"); + }); }); describe('BC-UR', () => { From a70781180c08b375e9fa1d890170a992b2eaab59 Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Wed, 7 Jul 2021 10:52:42 +0300 Subject: [PATCH 196/327] ADD: Refactor Aezeed wallet to use this.passphrase --- class/wallets/hd-aezeed-wallet.js | 10 +++++----- tests/unit/hd-aezeed.test.js | 13 ++++++++++--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/class/wallets/hd-aezeed-wallet.js b/class/wallets/hd-aezeed-wallet.js index 423b7b431..36aae589b 100644 --- a/class/wallets/hd-aezeed-wallet.js +++ b/class/wallets/hd-aezeed-wallet.js @@ -21,7 +21,7 @@ export class HDAezeedWallet extends AbstractHDElectrumWallet { setSecret(newSecret) { this.secret = newSecret.trim(); - this.secret = this.secret.replace(/[^a-zA-Z0-9:]/g, ' ').replace(/\s+/g, ' '); + this.secret = this.secret.replace(/[^a-zA-Z0-9]/g, ' ').replace(/\s+/g, ' '); return this; } @@ -56,9 +56,9 @@ export class HDAezeedWallet extends AbstractHDElectrumWallet { } async validateMnemonicAsync() { - const [mnemonic3, password] = this.secret.split(':'); + const passphrase = this.getPassphrase() || 'aezeed'; try { - const cipherSeed1 = await CipherSeed.fromMnemonic(mnemonic3, password || 'aezeed'); + const cipherSeed1 = await CipherSeed.fromMnemonic(this.secret, passphrase); this._entropyHex = cipherSeed1.entropy.toString('hex'); // save cache return !!cipherSeed1.entropy; } catch (_) { @@ -67,9 +67,9 @@ export class HDAezeedWallet extends AbstractHDElectrumWallet { } async mnemonicInvalidPassword() { - const [mnemonic3, password] = this.secret.split(':'); + const passphrase = this.getPassphrase() || 'aezeed'; try { - const cipherSeed1 = await CipherSeed.fromMnemonic(mnemonic3, password || 'aezeed'); + const cipherSeed1 = await CipherSeed.fromMnemonic(this.secret, passphrase); this._entropyHex = cipherSeed1.entropy.toString('hex'); // save cache } catch (error) { return error.message === 'Invalid Password'; diff --git a/tests/unit/hd-aezeed.test.js b/tests/unit/hd-aezeed.test.js index d30b879de..30d436a6d 100644 --- a/tests/unit/hd-aezeed.test.js +++ b/tests/unit/hd-aezeed.test.js @@ -11,8 +11,9 @@ describe('HDAezeedWallet', () => { // correct pass: aezeed.setSecret( - 'able mix price funny host express lawsuit congress antique float pig exchange vapor drip wide cup style apple tumble verb fix blush tongue market:strongPassword', + 'able mix price funny host express lawsuit congress antique float pig exchange vapor drip wide cup style apple tumble verb fix blush tongue market', ); + aezeed.setPassphrase('strongPassword'); assert.ok(await aezeed.validateMnemonicAsync()); assert.ok(!(await aezeed.mnemonicInvalidPassword())); @@ -20,31 +21,37 @@ describe('HDAezeedWallet', () => { aezeed.setSecret( 'able mix price funny host express lawsuit congress antique float pig exchange vapor drip wide cup style apple tumble verb fix blush tongue market', ); + aezeed.setPassphrase(); assert.ok(!(await aezeed.validateMnemonicAsync())); assert.ok(await aezeed.mnemonicInvalidPassword()); // wrong pass: aezeed.setSecret( - 'able mix price funny host express lawsuit congress antique float pig exchange vapor drip wide cup style apple tumble verb fix blush tongue market:badpassword', + 'able mix price funny host express lawsuit congress antique float pig exchange vapor drip wide cup style apple tumble verb fix blush tongue market', ); + aezeed.setPassphrase('badpassword'); assert.ok(!(await aezeed.validateMnemonicAsync())); assert.ok(await aezeed.mnemonicInvalidPassword()); aezeed.setSecret( 'able concert slush lend olive cost wagon dawn board robot park snap dignity churn fiction quote shrimp hammer wing jump immune skill sunset west', ); + aezeed.setPassphrase(); assert.ok(await aezeed.validateMnemonicAsync()); assert.ok(!(await aezeed.mnemonicInvalidPassword())); aezeed.setSecret( - 'able concert slush lend olive cost wagon dawn board robot park snap dignity churn fiction quote shrimp hammer wing jump immune skill sunset west:aezeed', + 'able concert slush lend olive cost wagon dawn board robot park snap dignity churn fiction quote shrimp hammer wing jump immune skill sunset west', ); + aezeed.setPassphrase(); + aezeed.setPassphrase('aezeed'); assert.ok(await aezeed.validateMnemonicAsync()); assert.ok(!(await aezeed.mnemonicInvalidPassword())); aezeed.setSecret( 'abstract rhythm weird food attract treat mosquito sight royal actor surround ride strike remove guilt catch filter summer mushroom protect poverty cruel chaos pattern', ); + aezeed.setPassphrase(); assert.ok(await aezeed.validateMnemonicAsync()); assert.ok(!(await aezeed.mnemonicInvalidPassword())); From d809fd6526272422a69db6b5c4ad2d05c4dc40a7 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 7 Jul 2021 15:52:26 +0000 Subject: [PATCH 197/327] Translate /loc/en.json in de_DE review completed for the source file '/loc/en.json' on the 'de_DE' language. --- loc/de_de.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/loc/de_de.json b/loc/de_de.json index 53e542662..ed1632272 100644 --- a/loc/de_de.json +++ b/loc/de_de.json @@ -259,8 +259,8 @@ "electrum_connected_not": "Nicht verbunden", "electrum_error_connect": "Keine Verbindung zum angegebenen Electrum-Server möglich.", "electrum_host": "Z.b. {example}", - "electrum_port": "TCP Port, normalerweise {example}", - "electrum_port_ssl": "SSL Port, normalerweise {example}", + "electrum_port": "Port, üblich {Beispiel}", + "use_ssl": "SSL verwenden", "electrum_saved": "Deine Änderungen wurden gespeichert. Zur Aktivierung ist ggf. ein Neustart von BlueWallet erforderlich.", "set_electrum_server_as_default": "{server} als Standard Electrum-Server setzten?", "set_lndhub_as_default": "{url} als Standard LNDHub-Server setzten?", @@ -581,7 +581,9 @@ "sign_aopp_confirm": "Senden der signierten Nachricht nach {hostname}?", "addresses_title": "Adressen", "type_change": "Wechsel", - "type_receive": "Empfang" + "type_receive": "Empfang", + "type_used": "Verwendet", + "transactions": "Transaktionen" }, "aopp": { "title": "Adresse wählen", From f42baff4da31edb645c5062e50413e2fbadbb8c6 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 7 Jul 2021 17:43:16 +0000 Subject: [PATCH 198/327] Translate /loc/en.json in fa_IR review completed for the source file '/loc/en.json' on the 'fa_IR' language. --- loc/fa.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/loc/fa.json b/loc/fa.json index 75d22a8c8..bf1428035 100644 --- a/loc/fa.json +++ b/loc/fa.json @@ -259,8 +259,8 @@ "electrum_connected_not": "عدم اتصال", "electrum_error_connect": "نمی‌توان به سرور الکترام ارائه‌شده متصل شد", "electrum_host": "به‌عنوان مثال، {example}", - "electrum_port": "درگاه TCP، به‌طورمعمول {example}", - "electrum_port_ssl": "درگاه SSL، به‌طورمعمول {example}", + "electrum_port": "درگاه، به‌طورمعمول {example}", + "use_ssl": "از SSL استفاده کن", "electrum_saved": "تغییرات شما با موفقیت ذخیره شدند. ممکن است برای اعمال تغییرات به راه‌اندازی مجدد برنامه نیاز داشته باشید.", "set_electrum_server_as_default": "آیا {server} به‌عنوان سرور پیش‌فرض الکترام تعیین شود؟", "set_lndhub_as_default": "آیا {url} به‌عنوان سرور پیش‌فرض LNDHub تعیین شود؟", From 2d0818acdfaf827965bc37114a081268caa48e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 8 Jul 2021 00:35:01 -0400 Subject: [PATCH 199/327] FIX: Wallet carousel was not rending properly on large screens --- components/WalletsCarousel.js | 46 ++++++++++++++++++++----- components/addresses/AddressTypeTabs.js | 4 ++- ios/Podfile.lock | 2 +- screen/wallets/drawerList.js | 7 ++-- 4 files changed, 46 insertions(+), 13 deletions(-) diff --git a/components/WalletsCarousel.js b/components/WalletsCarousel.js index 4ad9b70d5..f71278174 100644 --- a/components/WalletsCarousel.js +++ b/components/WalletsCarousel.js @@ -12,6 +12,7 @@ import { TouchableWithoutFeedback, useWindowDimensions, View, + Dimensions, FlatList, } from 'react-native'; import { useTheme } from '@react-navigation/native'; @@ -21,13 +22,11 @@ import { LightningCustodianWallet, MultisigHDWallet, PlaceholderWallet } from '. import WalletGradient from '../class/wallet-gradient'; import { BluePrivateBalance } from '../BlueComponents'; import { BlueStorageContext } from '../blue_modules/storage-context'; -import { isHandset } from '../blue_modules/environment'; +import { isHandset, isTablet, isDesktop } from '../blue_modules/environment'; const nStyles = StyleSheet.create({ root: {}, container: { - paddingHorizontal: 24, - paddingVertical: 16, borderRadius: 10, minHeight: Platform.OS === 'ios' ? 164 : 181, justifyContent: 'center', @@ -57,10 +56,31 @@ const NewWalletPanel = ({ onPress }) => { const { colors } = useTheme(); const { width } = useWindowDimensions(); const itemWidth = width * 0.82 > 375 ? 375 : width * 0.82; + const isLargeScreen = Platform.OS === 'android' ? isTablet() : width >= Dimensions.get('screen').width / 2 && (isTablet() || isDesktop); + const nStylesHooks = StyleSheet.create({ + container: isLargeScreen + ? { + paddingHorizontal: 24, + marginVertical: 16, + } + : { paddingVertical: 16, paddingHorizontal: 24 }, + }); return ( - - + + {loc.wallets.list_create_a_wallet} {loc.wallets.list_create_a_wallet_text} @@ -77,6 +97,7 @@ NewWalletPanel.propTypes = { const iStyles = StyleSheet.create({ root: { paddingRight: 20 }, + rootLargeDevice: { marginVertical: 20 }, grad: { padding: 15, borderRadius: 12, @@ -131,7 +152,7 @@ const WalletCarouselItem = ({ item, index, onPress, handleLongPress, isSelectedW const { walletTransactionUpdateStatus } = useContext(BlueStorageContext); const { width } = useWindowDimensions(); const itemWidth = width * 0.82 > 375 ? 375 : width * 0.82; - + const isLargeScreen = Platform.OS === 'android' ? isTablet() : width >= Dimensions.get('screen').width / 2 && (isTablet() || isDesktop); const onPressedIn = () => { const props = { duration: 50 }; props.useNativeDriver = true; @@ -159,7 +180,7 @@ const WalletCarouselItem = ({ item, index, onPress, handleLongPress, isSelectedW if (item.type === PlaceholderWallet.type) { return ( { const { width } = useWindowDimensions(); const sliderHeight = 190; const itemWidth = width * 0.82 > 375 ? 375 : width * 0.82; + const isLargeScreen = Platform.OS === 'android' ? isTablet() : width >= Dimensions.get('screen').width / 2 && (isTablet() || isDesktop); return ( { disableIntervalMomentum={isHandset} snapToInterval={itemWidth} // Adjust to your content width decelerationRate="fast" - contentContainerStyle={cStyles.content} + contentContainerStyle={isLargeScreen ? cStyles.contentLargeScreen : cStyles.content} directionalLockEnabled showsHorizontalScrollIndicator={false} initialNumToRender={10} diff --git a/components/addresses/AddressTypeTabs.js b/components/addresses/AddressTypeTabs.js index 9e63ab698..a7a2da63b 100644 --- a/components/addresses/AddressTypeTabs.js +++ b/components/addresses/AddressTypeTabs.js @@ -51,7 +51,9 @@ const AddressTypeTabs = ({ currentTab, setCurrentTab }) => { return ( changeToTab(tab.key)} style={[styles.tab, tabStyle]}> - changeToTab(tab.key)} style={textStyle}>{tab.name} + changeToTab(tab.key)} style={textStyle}> + {tab.name} + ); }); diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 24958e958..50cce2325 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -729,7 +729,7 @@ SPEC CHECKSUMS: Flipper-RSocket: 127954abe8b162fcaf68d2134d34dc2bd7076154 FlipperKit: 8a20b5c5fcf9436cac58551dc049867247f64b00 GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4 - glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3 + glog: 73c2498ac6884b13ede40eda8228cb1eee9d9d62 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 lottie-ios: 3a3758ef5a008e762faec9c9d50a39842f26d124 lottie-react-native: 4dff8fe8d10ddef9e7880e770080f4a56121397e diff --git a/screen/wallets/drawerList.js b/screen/wallets/drawerList.js index c14812665..030fcc2bf 100644 --- a/screen/wallets/drawerList.js +++ b/screen/wallets/drawerList.js @@ -3,7 +3,7 @@ import { StatusBar, View, StyleSheet, Alert } from 'react-native'; import { DrawerContentScrollView } from '@react-navigation/drawer'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; import PropTypes from 'prop-types'; -import { useTheme } from '@react-navigation/native'; +import { useIsFocused, useTheme } from '@react-navigation/native'; import { BlueHeaderDefaultMain, BlueSpacing20 } from '../../BlueComponents'; import WalletsCarousel from '../../components/WalletsCarousel'; @@ -20,6 +20,7 @@ const DrawerList = props => { const [carouselData, setCarouselData] = useState([]); const { colors } = useTheme(); const walletsCount = useRef(wallets.length); + const isFocused = useIsFocused(); const stylesHook = StyleSheet.create({ root: { backgroundColor: colors.brandingColor, @@ -113,14 +114,16 @@ const DrawerList = props => { const renderWalletsCarousel = ( ); From 3cf15b740ae9ac32fc00d88d826b48469023c616 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 8 Jul 2021 12:42:38 +0000 Subject: [PATCH 200/327] Translate /loc/en.json in es_419 review completed for the source file '/loc/en.json' on the 'es_419' language. --- loc/es_419.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/loc/es_419.json b/loc/es_419.json index 0fda1fe09..b42d9fa4e 100644 --- a/loc/es_419.json +++ b/loc/es_419.json @@ -259,8 +259,8 @@ "electrum_connected_not": "No Conectado", "electrum_error_connect": "No se puede conectar al servidor Electrum proporcionado", "electrum_host": "Por ej.: {example}", - "electrum_port": "Puerto TCP, generalmente {example}", - "electrum_port_ssl": "Puerto SSL, generalmente {example}", + "electrum_port": "Puerto, generalmente {example}", + "use_ssl": "Utiliza SSL", "electrum_saved": "Tus cambios se han guardado correctamente. Es necesario reiniciar para que los cambios surtan efecto.", "set_electrum_server_as_default": "Establecer {server} como el servidor Electrum predeterminado?", "set_lndhub_as_default": "¿Establecer {url} como servidor LNDHub predeterminado?", From f7c264e36e21353931e0b279f23de6a31551e01a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 8 Jul 2021 11:35:06 -0400 Subject: [PATCH 201/327] OPS: Version bump and release notes --- android/app/build.gradle | 2 +- ios/BlueWallet.xcodeproj/project.pbxproj | 66 +++++++++---------- .../BlueWalletWatch (Notification).xcscheme | 25 +++++-- .../xcschemes/BlueWalletWatch.xcscheme | 25 +++++-- ios/fastlane/metadata/en-US/release_notes.txt | 19 ++++++ package-lock.json | 2 +- package.json | 2 +- 7 files changed, 93 insertions(+), 48 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index b168717e7..216b75fc0 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -139,7 +139,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 - versionName "6.1.7" + versionName "6.1.8" multiDexEnabled true missingDimensionStrategy 'react-native-camera', 'general' testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index 15dad55d6..054af6242 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -50,7 +50,7 @@ 6DD410BF266CB13D0087DE03 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; }; 6DD410C0266CB1460087DE03 /* MarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9946622555A660000E52E8 /* MarketWidget.swift */; }; 6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; }; - 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */; }; + 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* EFQRCode */; }; 6DFC807224EA2FA9007B8700 /* ViewQRCodefaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFC807124EA2FA9007B8700 /* ViewQRCodefaceController.swift */; }; 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; @@ -397,7 +397,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */, + 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -837,7 +837,7 @@ ); name = "BlueWalletWatch Extension"; packageProductDependencies = ( - 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */, + 6DFC806F24EA0B6C007B8700 /* EFQRCode */, ); productName = "BlueWalletWatch Extension"; productReference = B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */; @@ -921,7 +921,7 @@ ); mainGroup = 83CBB9F61A601CBA00E9B192; packageReferences = ( - 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */, + 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */, ); productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; projectDirPath = ""; @@ -1323,7 +1323,7 @@ CODE_SIGN_ENTITLEMENTS = BlueWallet/BlueWallet.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 525; + CURRENT_PROJECT_VERSION = 601; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; @@ -1344,7 +1344,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.7; + MARKETING_VERSION = 6.1.8; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1373,7 +1373,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 525; + CURRENT_PROJECT_VERSION = 601; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; @@ -1388,7 +1388,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.7; + MARKETING_VERSION = 6.1.8; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1418,7 +1418,7 @@ CODE_SIGN_ENTITLEMENTS = "TodayExtension/BlueWallet - Bitcoin Price.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 525; + CURRENT_PROJECT_VERSION = 601; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1429,7 +1429,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.7; + MARKETING_VERSION = 6.1.8; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; @@ -1457,7 +1457,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 525; + CURRENT_PROJECT_VERSION = 601; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1468,7 +1468,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.7; + MARKETING_VERSION = 6.1.8; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; PRODUCT_NAME = "BlueWallet - Bitcoin Price"; @@ -1494,13 +1494,13 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 525; + CURRENT_PROJECT_VERSION = 601; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.7; + MARKETING_VERSION = 6.1.8; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; @@ -1526,13 +1526,13 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 525; + CURRENT_PROJECT_VERSION = 601; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.7; + MARKETING_VERSION = 6.1.8; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1559,7 +1559,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 525; + CURRENT_PROJECT_VERSION = 601; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1570,7 +1570,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.7; + MARKETING_VERSION = 6.1.8; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; @@ -1604,7 +1604,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 525; + CURRENT_PROJECT_VERSION = 601; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1615,7 +1615,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.7; + MARKETING_VERSION = 6.1.8; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1677,7 +1677,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.2; LIBRARY_SEARCH_PATHS = "\"$(inherited)\""; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -1727,7 +1727,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.2; LIBRARY_SEARCH_PATHS = "\"$(inherited)\""; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; @@ -1750,7 +1750,7 @@ CODE_SIGN_ENTITLEMENTS = "BlueWalletWatch Extension/BlueWalletWatch Extension.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 525; + CURRENT_PROJECT_VERSION = 601; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1760,7 +1760,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.7; + MARKETING_VERSION = 6.1.8; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; @@ -1790,7 +1790,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 525; + CURRENT_PROJECT_VERSION = 601; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1800,7 +1800,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.7; + MARKETING_VERSION = 6.1.8; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -1830,13 +1830,13 @@ CODE_SIGN_ENTITLEMENTS = BlueWalletWatch/BlueWalletWatch.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 525; + CURRENT_PROJECT_VERSION = 601; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.7; + MARKETING_VERSION = 6.1.8; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; @@ -1869,13 +1869,13 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 525; + CURRENT_PROJECT_VERSION = 601; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.7; + MARKETING_VERSION = 6.1.8; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1960,7 +1960,7 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */ = { + 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/EFPrefix/EFQRCode.git"; requirement = { @@ -1971,9 +1971,9 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */ = { + 6DFC806F24EA0B6C007B8700 /* EFQRCode */ = { isa = XCSwiftPackageProductDependency; - package = 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */; + package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */; productName = EFQRCode; }; /* End XCSwiftPackageProductDependency section */ diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme index ce67c26c8..78505ec4c 100644 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme +++ b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch (Notification).xcscheme @@ -65,8 +65,10 @@ allowLocationSimulation = "YES" launchAutomaticallySubstyle = "8" notificationPayloadFile = "BlueWalletWatch Extension/PushNotificationPayload.apns"> - + - + - + - + + + + + diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme index 772e95fd0..876b91430 100644 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme +++ b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWalletWatch.xcscheme @@ -64,8 +64,10 @@ debugServiceExtension = "internal" allowLocationSimulation = "YES" notificationPayloadFile = "BlueWalletWatch Extension/PushNotificationPayload.apns"> - + - + - + - + + + + + diff --git a/ios/fastlane/metadata/en-US/release_notes.txt b/ios/fastlane/metadata/en-US/release_notes.txt index f9a9a7392..a564a66cb 100644 --- a/ios/fastlane/metadata/en-US/release_notes.txt +++ b/ios/fastlane/metadata/en-US/release_notes.txt @@ -1,3 +1,22 @@ +v6.1.8 +====== +FIX: Wallet carousel was not rending properly on large screens + + +v6.1.7 +====== + +* ADD: IRR currency +* ADD: better accessibility for buttons +* FIX: hardware wallet with BIP44/BIP49 wallet reports incorrect change address in PSBT +* FIX: for slip39 wallets import bech32 even if no tx found +* FIX: Scanning for a batch tx woud reset contentOffset +* FIX: Re-order wallet bug +* FIX: Typing 1 would turn into 10 due to default custom value +* FIX: Ports from previous scan were not cleared +* REF: Hierarchy navigator screen +* Translate ar, ca, cs_CZ, de_DE, es, fa_IR, fr_FR, id, in, nl, pl + v6.1.3 ====== diff --git a/package-lock.json b/package-lock.json index dd3c3704b..75c0fedf5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.7", + "version": "6.1.8", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a1630dddb..6a2f40526 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.7", + "version": "6.1.8", "license": "MIT", "repository": { "type": "git", From e5c4730cc93b7bde3da60dbd54dfa41c90295423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 8 Jul 2021 13:39:03 -0400 Subject: [PATCH 202/327] Blue --- class/app-storage.js | 3 +-- class/wallet-import.js | 3 --- class/wallets/lightning-custodian-wallet.js | 13 +++---------- screen/settings/lightningSettings.js | 7 ++++--- screen/wallets/add.js | 13 +++++++++---- screen/wallets/pleaseBackupLNDHub.js | 4 +--- 6 files changed, 18 insertions(+), 25 deletions(-) diff --git a/class/app-storage.js b/class/app-storage.js index ecdbe4b0a..17dbc2578 100644 --- a/class/app-storage.js +++ b/class/app-storage.js @@ -391,8 +391,7 @@ export class AppStorage { console.log('using wallet-wide settings ', lndhub, 'for ln wallet'); unserializedWallet.setBaseURI(lndhub); } else { - console.log('using default', LightningCustodianWallet.defaultBaseUri, 'for ln wallet'); - unserializedWallet.setBaseURI(LightningCustodianWallet.defaultBaseUri); + console.log('wallet does not have a baseURI. Continuing init...'); } unserializedWallet.init(); break; diff --git a/class/wallet-import.js b/class/wallet-import.js index 266abdf22..01066c4a1 100644 --- a/class/wallet-import.js +++ b/class/wallet-import.js @@ -147,9 +147,6 @@ function WalletImport() { const split = importText.split('@'); lnd.setBaseURI(split[1]); lnd.setSecret(split[0]); - } else { - lnd.setBaseURI(LightningCustodianWallet.defaultBaseUri); - lnd.setSecret(importText); } lnd.init(); await lnd.authorize(); diff --git a/class/wallets/lightning-custodian-wallet.js b/class/wallets/lightning-custodian-wallet.js index 0f0a08b2c..ce8b33315 100644 --- a/class/wallets/lightning-custodian-wallet.js +++ b/class/wallets/lightning-custodian-wallet.js @@ -7,7 +7,7 @@ const torrific = require('../../blue_modules/torrific'); export class LightningCustodianWallet extends LegacyWallet { static type = 'lightningCustodianWallet'; static typeReadable = 'Lightning'; - static defaultBaseUri = 'https://lndhub.herokuapp.com/'; + constructor(props) { super(props); this.setBaseURI(); // no args to init with default value @@ -30,11 +30,7 @@ export class LightningCustodianWallet extends LegacyWallet { * @param URI */ setBaseURI(URI) { - if (URI) { - this.baseURI = URI; - } else { - this.baseURI = LightningCustodianWallet.defaultBaseUri; - } + this.baseURI = URI; } getBaseURI() { @@ -54,9 +50,6 @@ export class LightningCustodianWallet extends LegacyWallet { } getSecret() { - if (this.baseURI === LightningCustodianWallet.defaultBaseUri) { - return this.secret; - } return this.secret + '@' + this.baseURI; } @@ -79,7 +72,7 @@ export class LightningCustodianWallet extends LegacyWallet { baseURI: this.baseURI, }); - if (this.baseURI.indexOf('.onion') !== -1) { + if (this.baseURI?.indexOf('.onion') !== -1) { this._api = new torrific.Torsbee({ baseURI: this.baseURI, }); diff --git a/screen/settings/lightningSettings.js b/screen/settings/lightningSettings.js index a115eeb38..31863ff32 100644 --- a/screen/settings/lightningSettings.js +++ b/screen/settings/lightningSettings.js @@ -133,8 +133,11 @@ const LightningSettings = () => { { /> - {!isDesktop && {loc.settings.tor_supported}} - {isLoading ? : } diff --git a/screen/wallets/add.js b/screen/wallets/add.js index b95c9848b..aecfdbf36 100644 --- a/screen/wallets/add.js +++ b/screen/wallets/add.js @@ -43,7 +43,7 @@ const WalletsAdd = () => { const { colors } = useTheme(); const { addWallet, saveToDisk, isAdancedModeEnabled } = useContext(BlueStorageContext); const [isLoading, setIsLoading] = useState(true); - const [walletBaseURI, setWalletBaseURI] = useState(); + const [walletBaseURI, setWalletBaseURI] = useState(''); const [selectedIndex, setSelectedIndex] = useState(0); const [label, setLabel] = useState(''); const [isAdvancedOptionsEnabled, setIsAdvancedOptionsEnabled] = useState(false); @@ -160,7 +160,7 @@ const WalletsAdd = () => { wallet.setLabel(label || loc.wallets.details_title); try { - const lndhub = walletBaseURI && walletBaseURI.trim().length > 0 ? walletBaseURI : LightningCustodianWallet.defaultBaseUri; + const lndhub = walletBaseURI?.trim(); if (lndhub) { const isValidNodeAddress = await LightningCustodianWallet.isValidNodeAddress(lndhub); if (isValidNodeAddress) { @@ -277,7 +277,7 @@ const WalletsAdd = () => { /> ); - } else if (selectedWalletType === ButtonSelected.OFFCHAIN && isAdvancedOptionsEnabled) { + } else if (selectedWalletType === ButtonSelected.OFFCHAIN) { return ( <> @@ -310,7 +310,12 @@ const WalletsAdd = () => { {!isLoading ? ( - + ) : ( )} diff --git a/screen/wallets/pleaseBackupLNDHub.js b/screen/wallets/pleaseBackupLNDHub.js index c57280ba6..49a3b7a6a 100644 --- a/screen/wallets/pleaseBackupLNDHub.js +++ b/screen/wallets/pleaseBackupLNDHub.js @@ -4,12 +4,11 @@ import { View, StyleSheet, BackHandler, StatusBar } from 'react-native'; import QRCode from 'react-native-qrcode-svg'; import { ScrollView } from 'react-native-gesture-handler'; -import { BlueButton, BlueCopyTextToClipboard, BlueSpacing20, BlueText, BlueTextCentered, SafeBlueArea } from '../../BlueComponents'; +import { BlueButton, BlueCopyTextToClipboard, BlueSpacing20, BlueTextCentered, SafeBlueArea } from '../../BlueComponents'; import navigationStyle from '../../components/navigationStyle'; import Privacy from '../../blue_modules/Privacy'; import loc from '../../loc'; import { BlueStorageContext } from '../../blue_modules/storage-context'; -import { LightningCustodianWallet } from '../../class'; const PleaseBackupLNDHub = () => { const { wallets } = useContext(BlueStorageContext); @@ -59,7 +58,6 @@ const PleaseBackupLNDHub = () => { {loc.pleasebackup.text_lnd} - {wallet.getBaseURI() === LightningCustodianWallet.defaultBaseUri && - {loc.pleasebackup.text_lnd2}} From 066302cf16b8f00305acd35c704885dcc5d849d7 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 8 Jul 2021 18:28:13 +0000 Subject: [PATCH 203/327] Translate /loc/en.json in pl review completed for the source file '/loc/en.json' on the 'pl' language. --- loc/pl.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/loc/pl.json b/loc/pl.json index 81cc34e50..74dffa526 100644 --- a/loc/pl.json +++ b/loc/pl.json @@ -259,8 +259,8 @@ "electrum_connected_not": "Nie Podłączony", "electrum_error_connect": "Nie można się połączyć z wybranym serwerem Electrum", "electrum_host": "np. {example}", - "electrum_port": "port TCP, zazwyczaj {example}", - "electrum_port_ssl": "port SSL, zazwyczaj {example}", + "electrum_port": "Port, zazwyczaj {example}", + "use_ssl": "Użyj SSL", "electrum_saved": "Zmiany zostały zachowane pomyślnie. Żeby je zobaczyć zrestartuj aplikację.", "set_electrum_server_as_default": "Ustawić {server} jako domyślny serwer Electrum?", "set_lndhub_as_default": "Ustawić {url} jako domyślny serwer LNDHub?", @@ -581,7 +581,9 @@ "sign_aopp_confirm": "Czy chcesz wysłać podpisaną wiadomość do [hostname]?", "addresses_title": "Adresy", "type_change": "Reszta", - "type_receive": "Otrzymaj" + "type_receive": "Otrzymaj", + "type_used": "Używany", + "transactions": "Transakcje" }, "aopp": { "title": "Wybierz adres", From 060f86beadc3b471eb4bd79ece0d2a83dc2a64b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Fri, 9 Jul 2021 00:03:46 -0400 Subject: [PATCH 204/327] OPS: Upgrade Realm and Enable widgets for macOS --- ios/BlueWallet.xcodeproj/project.pbxproj | 26 ++-- .../xcschemes/MarketWidgetExtension.xcscheme | 113 ---------------- .../xcschemes/PriceWidgetExtension.xcscheme | 124 ------------------ ...formationAndMarketWidgetExtension.xcscheme | 113 ---------------- .../WalletInformationWidgetExtension.xcscheme | 113 ---------------- ios/Podfile | 2 +- ios/Podfile.lock | 6 +- package-lock.json | 91 +++++-------- package.json | 2 +- .../applypatchesformaccatalyst.sh | 22 +--- 10 files changed, 52 insertions(+), 560 deletions(-) delete mode 100644 ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/MarketWidgetExtension.xcscheme delete mode 100644 ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/PriceWidgetExtension.xcscheme delete mode 100644 ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/WalletInformationAndMarketWidgetExtension.xcscheme delete mode 100644 ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/WalletInformationWidgetExtension.xcscheme diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index 054af6242..cb76d70f3 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -30,7 +30,7 @@ 6DD4109D266CADF10087DE03 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3A252FE1A3004D72DF /* WidgetKit.framework */; }; 6DD4109E266CADF10087DE03 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3C252FE1A3004D72DF /* SwiftUI.framework */; }; 6DD410A1266CADF10087DE03 /* Widgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DD410A0266CADF10087DE03 /* Widgets.swift */; }; - 6DD410A7266CADF40087DE03 /* WidgetsExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 6DD410A7266CADF40087DE03 /* WidgetsExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 6DD410AC266CAE470087DE03 /* PriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA4BC255872E3009312A5 /* PriceWidget.swift */; }; 6DD410AE266CAF1F0087DE03 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnit.json */; }; 6DD410AF266CAF5C0087DE03 /* WalletInformationAndMarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E06254BA347007B5B82 /* WalletInformationAndMarketWidget.swift */; }; @@ -50,7 +50,7 @@ 6DD410BF266CB13D0087DE03 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; }; 6DD410C0266CB1460087DE03 /* MarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9946622555A660000E52E8 /* MarketWidget.swift */; }; 6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; }; - 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* EFQRCode */; }; + 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */; }; 6DFC807224EA2FA9007B8700 /* ViewQRCodefaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFC807124EA2FA9007B8700 /* ViewQRCodefaceController.swift */; }; 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; @@ -397,7 +397,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */, + 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -837,7 +837,7 @@ ); name = "BlueWalletWatch Extension"; packageProductDependencies = ( - 6DFC806F24EA0B6C007B8700 /* EFQRCode */, + 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */, ); productName = "BlueWalletWatch Extension"; productReference = B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */; @@ -921,7 +921,7 @@ ); mainGroup = 83CBB9F61A601CBA00E9B192; packageReferences = ( - 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */, + 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */, ); productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; projectDirPath = ""; @@ -1222,6 +1222,7 @@ }; 6D2A6467258BA92D0092292B /* PBXTargetDependency */ = { isa = PBXTargetDependency; + platformFilter = ios; target = 6D2A6460258BA92C0092292B /* Stickers */; targetProxy = 6D2A6466258BA92D0092292B /* PBXContainerItemProxy */; }; @@ -1231,7 +1232,6 @@ }; 6DD410A6266CADF40087DE03 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - platformFilter = ios; target = 6DD4109B266CADF10087DE03 /* WidgetsExtension */; targetProxy = 6DD410A5266CADF40087DE03 /* PBXContainerItemProxy */; }; @@ -1578,11 +1578,11 @@ PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = NO; + SUPPORTS_MACCATALYST = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,6"; }; name = Debug; }; @@ -1622,10 +1622,10 @@ PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = NO; + SUPPORTS_MACCATALYST = YES; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,6"; }; name = Release; }; @@ -1960,7 +1960,7 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */ = { + 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/EFPrefix/EFQRCode.git"; requirement = { @@ -1971,9 +1971,9 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 6DFC806F24EA0B6C007B8700 /* EFQRCode */ = { + 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */ = { isa = XCSwiftPackageProductDependency; - package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */; + package = 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */; productName = EFQRCode; }; /* End XCSwiftPackageProductDependency section */ diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/MarketWidgetExtension.xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/MarketWidgetExtension.xcscheme deleted file mode 100644 index ca8ab5e6c..000000000 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/MarketWidgetExtension.xcscheme +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/PriceWidgetExtension.xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/PriceWidgetExtension.xcscheme deleted file mode 100644 index f92a34ef4..000000000 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/PriceWidgetExtension.xcscheme +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/WalletInformationAndMarketWidgetExtension.xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/WalletInformationAndMarketWidgetExtension.xcscheme deleted file mode 100644 index fcdc15c16..000000000 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/WalletInformationAndMarketWidgetExtension.xcscheme +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/WalletInformationWidgetExtension.xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/WalletInformationWidgetExtension.xcscheme deleted file mode 100644 index 6a1f99854..000000000 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/WalletInformationWidgetExtension.xcscheme +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/Podfile b/ios/Podfile index b9f9b5af4..c766a8ec0 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -21,7 +21,7 @@ target 'BlueWallet' do react_native_post_install(installer) installer.pods_project.targets.each do |target| target.build_configurations.each do |config| - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '10.0' + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.1' if ['React-Core-AccessibilityResources'].include? target.name config.build_settings['CODE_SIGN_STYLE'] = "Manual" config.build_settings['CODE_SIGN_IDENTITY'] = "Apple Distribution: Bluewallet Services, S. R. L. (A7W54YZ4WU)" diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 50cce2325..ee0bb4ecd 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -360,7 +360,7 @@ PODS: - React-cxxreact (= 0.64.2) - React-jsi (= 0.64.2) - React-perflogger (= 0.64.2) - - RealmJS (10.4.2): + - RealmJS (10.6.0): - GCDWebServer - React - RemobileReactNativeQrcodeLocalImage (1.0.4): @@ -771,7 +771,7 @@ SPEC CHECKSUMS: React-RCTVibration: 24600e3b1aaa77126989bc58b6747509a1ba14f3 React-runtimeexecutor: a9904c6d0218fb9f8b19d6dd88607225927668f9 ReactCommon: 149906e01aa51142707a10665185db879898e966 - RealmJS: 90f2a558fdda19ebb9fcbc0a52c7b1d1b049fb88 + RealmJS: c903034b0d767fcef11dc8207e91b6f07e60d7b8 RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa RNCAsyncStorage: 8324611026e8dc3706f829953aa6e3899f581589 RNCClipboard: dac13db8b1ce9b998f1cbc7ca33440113602847f @@ -802,6 +802,6 @@ SPEC CHECKSUMS: Yoga: 575c581c63e0d35c9a83f4b46d01d63abc1100ac YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: d6f6c7992cb83adb1c2ca00fa4d3e3a3402f4787 +PODFILE CHECKSUM: d190822228dafb8d4bccaddd003676c563d92dce COCOAPODS: 1.10.1 diff --git a/package-lock.json b/package-lock.json index 75c0fedf5..72536f554 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3815,9 +3815,9 @@ } }, "@types/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.6.tgz", - "integrity": "sha512-ZkrXnZLC1mc4b9QLKaSrsxV4oxTRs10OI2kgSApT8G0v1jrmqppSHUVQ15kLorzsFBTjvf7OKF4kAibuuNQ+xA==" + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.7.tgz", + "integrity": "sha512-a+MBBfOTs3ShFMlbH9qsRVFkjIUunEtxrBT0gxRx1cntjKRg2WApuGmNYzHkwKaIhMi3SMbKktaD/rLObQMwIw==" }, "@types/babel__core": { "version": "7.1.14", @@ -4411,12 +4411,9 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "requires": { - "typical": "^2.6.1" - } + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==" }, "array-filter": { "version": "0.0.1", @@ -5849,9 +5846,9 @@ } }, "bson": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.4.0.tgz", - "integrity": "sha512-uX9Zqzv2DpFXJgQOWKD8nbf0dTQV57WM8eiXDXVWeJYgiu/zIRz61OGLJKwbfSEEjZJ+AgS+7TUT7Y8EloTaqQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.4.1.tgz", + "integrity": "sha512-Uu4OCZa0jouQJCKOk1EmmyqtdWAP5HVLru4lQxTwzJzxT+sJ13lVpEZU/MATDxtHiekWMAL84oQY3Xn1LpJVSg==", "requires": { "buffer": "^5.6.0" }, @@ -6400,13 +6397,14 @@ "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" }, "command-line-args": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz", - "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.1.tgz", + "integrity": "sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==", "requires": { - "array-back": "^2.0.0", - "find-replace": "^1.0.3", - "typical": "^2.6.1" + "array-back": "^3.0.1", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" } }, "commander": { @@ -8873,22 +8871,11 @@ } }, "find-replace": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", - "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "requires": { - "array-back": "^1.0.4", - "test-value": "^2.1.0" - }, - "dependencies": { - "array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", - "requires": { - "typical": "^2.6.0" - } - } + "array-back": "^3.0.1" } }, "find-up": { @@ -14737,6 +14724,11 @@ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -18440,13 +18432,13 @@ } }, "realm": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/realm/-/realm-10.4.2.tgz", - "integrity": "sha512-pesozKE4loyFlOvxFeeM6CYLD6u1GZcXy88E2n6r2zzWk4/C8g16C2xPi0yuxh+PdhHUXDs5TsEDw6YnpBrhxg==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/realm/-/realm-10.6.0.tgz", + "integrity": "sha512-hJSBsUemUhCg/WKTt9BAeEX/q75RldMDgXLjJKqu/B6k+vuE5HYWJqmNZxg/slUoNJcVTAWjUr2buXwBqO9/1w==", "requires": { "bindings": "^1.5.0", "bson": "^4.4.0", - "command-line-args": "^4.0.6", + "command-line-args": "^5.1.1", "deepmerge": "2.1.0", "deprecated-react-native-listview": "0.0.6", "fs-extra": "^4.0.3", @@ -19980,25 +19972,6 @@ "minimatch": "^3.0.4" } }, - "test-value": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", - "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=", - "requires": { - "array-back": "^1.0.3", - "typical": "^2.6.0" - }, - "dependencies": { - "array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", - "requires": { - "typical": "^2.6.0" - } - } - } - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -20267,9 +20240,9 @@ "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" }, "typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==" }, "ua-parser-js": { "version": "0.7.28", diff --git a/package.json b/package.json index 6a2f40526..4b27a18e8 100644 --- a/package.json +++ b/package.json @@ -170,7 +170,7 @@ "react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#e2e9a9038b76d096bf929a87105a97a0a7095001", "react-test-render": "1.1.2", "readable-stream": "3.6.0", - "realm": "10.4.2", + "realm": "10.6.0", "rn-nodeify": "10.3.0", "scryptsy": "file:blue_modules/scryptsy", "secure-random": "1.1.2", diff --git a/scripts/maccatalystpatches/applypatchesformaccatalyst.sh b/scripts/maccatalystpatches/applypatchesformaccatalyst.sh index 3ebbf42f6..700c20978 100755 --- a/scripts/maccatalystpatches/applypatchesformaccatalyst.sh +++ b/scripts/maccatalystpatches/applypatchesformaccatalyst.sh @@ -1,24 +1,6 @@ echo "Applying patch for package.json" -patch package.json ./scripts/maccatalystpatches/packagejson.patch --no-backup-if-mismatch -echo "Removing node_modules" -rm -fr node_modules -echo "Removing ios/Pods" -rm -fr ios/Pods -echo "Removing ios/Podfile.lock" -rm -fr ios/Podfile.lock +sed -i '' '/react-native-tor/d' ./package.json echo "Re-installing node_modules" npm i -echo "Applying patch for react-native-camera" -cd node_modules/react-native-camera/ios/RCT -patch RCTCameraManager.m ../../../../scripts/maccatalystpatches/RCTCameraManager.patch --no-backup-if-mismatch -cd ../RN/ -patch RNCamera.m ../../../../scripts/maccatalystpatches/RNCamera.patch -echo "Applying patch for Podfile" -cd ../../../../ -patch ios/Podfile ./scripts/maccatalystpatches/podfile.patch --no-backup-if-mismatch -echo "Applying patch for Realm podspec" -patch node_modules/realm/RealmJS.podspec ./scripts/maccatalystpatches/realm.patch --no-backup-if-mismatch -cd ios -pod update echo "" -echo "You should now be able to compile BlueWallet using Mac Catalyst on XCode. Enable Mac under Deployment Info by using XCode. If you are running macOS Catalina, you will need to remove the iOS 14 Widgets from the project targets." +echo "react-native-tor is not currently compatible with Mac Catalyst. You will need to remove all references from torrific.js. After this, you should now be able to compile BlueWallet using Mac Catalyst on XCode. If you are running macOS Catalina, you will need to remove the iOS 14 Widgets from the project targets." From ece7475f0d4537db62764677210e07e0118a3875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Fri, 9 Jul 2021 00:04:50 -0400 Subject: [PATCH 205/327] Update applypatchesformaccatalyst.sh --- scripts/maccatalystpatches/applypatchesformaccatalyst.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/maccatalystpatches/applypatchesformaccatalyst.sh b/scripts/maccatalystpatches/applypatchesformaccatalyst.sh index 700c20978..dcacb9ff2 100755 --- a/scripts/maccatalystpatches/applypatchesformaccatalyst.sh +++ b/scripts/maccatalystpatches/applypatchesformaccatalyst.sh @@ -3,4 +3,4 @@ sed -i '' '/react-native-tor/d' ./package.json echo "Re-installing node_modules" npm i echo "" -echo "react-native-tor is not currently compatible with Mac Catalyst. You will need to remove all references from torrific.js. After this, you should now be able to compile BlueWallet using Mac Catalyst on XCode. If you are running macOS Catalina, you will need to remove the iOS 14 Widgets from the project targets." +echo "react-native-tor is not currently compatible with Mac Catalyst. You will need to remove all references from torrific.js. After this, you should be able to compile BlueWallet using Mac Catalyst on XCode. If you are running macOS Catalina, you will need to remove the iOS 14 Widgets from the project targets." From 0bb1c53f560fff2414a463dbe5efd8deae8d74f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Fri, 9 Jul 2021 00:10:26 -0400 Subject: [PATCH 206/327] DEL: Files not needed any longer --- .../maccatalystpatches/RCTCameraManager.patch | 1719 ----------------- scripts/maccatalystpatches/RNCamera.patch | 37 - scripts/maccatalystpatches/packagejson.patch | 11 - scripts/maccatalystpatches/podfile.patch | 31 - scripts/maccatalystpatches/realm.patch | 11 - 5 files changed, 1809 deletions(-) delete mode 100644 scripts/maccatalystpatches/RCTCameraManager.patch delete mode 100644 scripts/maccatalystpatches/RNCamera.patch delete mode 100644 scripts/maccatalystpatches/packagejson.patch delete mode 100644 scripts/maccatalystpatches/podfile.patch delete mode 100644 scripts/maccatalystpatches/realm.patch diff --git a/scripts/maccatalystpatches/RCTCameraManager.patch b/scripts/maccatalystpatches/RCTCameraManager.patch deleted file mode 100644 index 86aa04385..000000000 --- a/scripts/maccatalystpatches/RCTCameraManager.patch +++ /dev/null @@ -1,1719 +0,0 @@ -8a9 -> #if !TARGET_OS_MACCATALYST -9a11 -> #endif -33,34c35,36 -< self.session = [AVCaptureSession new]; -< #if !(TARGET_IPHONE_SIMULATOR) ---- -> self.session = [AVCaptureSession new]; -> #if !(TARGET_IPHONE_SIMULATOR) -37,42c39,44 -< #endif -< -< if(!self.camera){ -< self.camera = [[RCTCamera alloc] initWithManager:self bridge:self.bridge]; -< } -< return self.camera; ---- -> #endif -> -> if(!self.camera){ -> self.camera = [[RCTCamera alloc] initWithManager:self bridge:self.bridge]; -> } -> return self.camera; -47c49 -< return NO; ---- -> return NO; -52c54 -< ---- -> -55,66c57,68 -< @"upce": AVMetadataObjectTypeUPCECode, -< @"code39": AVMetadataObjectTypeCode39Code, -< @"code39mod43": AVMetadataObjectTypeCode39Mod43Code, -< @"ean13": AVMetadataObjectTypeEAN13Code, -< @"ean8": AVMetadataObjectTypeEAN8Code, -< @"code93": AVMetadataObjectTypeCode93Code, -< @"code128": AVMetadataObjectTypeCode128Code, -< @"pdf417": AVMetadataObjectTypePDF417Code, -< @"qr": AVMetadataObjectTypeQRCode, -< @"aztec": AVMetadataObjectTypeAztecCode -< }]; -< ---- -> @"upce": AVMetadataObjectTypeUPCECode, -> @"code39": AVMetadataObjectTypeCode39Code, -> @"code39mod43": AVMetadataObjectTypeCode39Mod43Code, -> @"ean13": AVMetadataObjectTypeEAN13Code, -> @"ean8": AVMetadataObjectTypeEAN8Code, -> @"code93": AVMetadataObjectTypeCode93Code, -> @"code128": AVMetadataObjectTypeCode128Code, -> @"pdf417": AVMetadataObjectTypePDF417Code, -> @"qr": AVMetadataObjectTypeQRCode, -> @"aztec": AVMetadataObjectTypeAztecCode -> }]; -> -70c72 -< ---- -> -74c76 -< ---- -> -78,136c80,138 -< -< -< return @{ -< @"Aspect": @{ -< @"stretch": @(RCTCameraAspectStretch), -< @"fit": @(RCTCameraAspectFit), -< @"fill": @(RCTCameraAspectFill) -< }, -< @"BarCodeType": runtimeBarcodeTypes, -< @"Type": @{ -< @"front": @(RCTCameraTypeFront), -< @"back": @(RCTCameraTypeBack) -< }, -< @"CaptureMode": @{ -< @"still": @(RCTCameraCaptureModeStill), -< @"video": @(RCTCameraCaptureModeVideo) -< }, -< @"CaptureQuality": @{ -< @"low": @(RCTCameraCaptureSessionPresetLow), -< @"AVCaptureSessionPresetLow": @(RCTCameraCaptureSessionPresetLow), -< @"medium": @(RCTCameraCaptureSessionPresetMedium), -< @"AVCaptureSessionPresetMedium": @(RCTCameraCaptureSessionPresetMedium), -< @"high": @(RCTCameraCaptureSessionPresetHigh), -< @"AVCaptureSessionPresetHigh": @(RCTCameraCaptureSessionPresetHigh), -< @"photo": @(RCTCameraCaptureSessionPresetPhoto), -< @"AVCaptureSessionPresetPhoto": @(RCTCameraCaptureSessionPresetPhoto), -< @"480p": @(RCTCameraCaptureSessionPreset480p), -< @"AVCaptureSessionPreset640x480": @(RCTCameraCaptureSessionPreset480p), -< @"720p": @(RCTCameraCaptureSessionPreset720p), -< @"AVCaptureSessionPreset1280x720": @(RCTCameraCaptureSessionPreset720p), -< @"1080p": @(RCTCameraCaptureSessionPreset1080p), -< @"AVCaptureSessionPreset1920x1080": @(RCTCameraCaptureSessionPreset1080p), -< @"4k": @(RCTCameraCaptureSessionPreset4k), -< @"AVCaptureSessionPreset3840x2160": @(RCTCameraCaptureSessionPreset4k) -< }, -< @"CaptureTarget": @{ -< @"memory": @(RCTCameraCaptureTargetMemory), -< @"disk": @(RCTCameraCaptureTargetDisk), -< @"temp": @(RCTCameraCaptureTargetTemp), -< @"cameraRoll": @(RCTCameraCaptureTargetCameraRoll) -< }, -< @"Orientation": @{ -< @"auto": @(RCTCameraOrientationAuto), -< @"landscapeLeft": @(RCTCameraOrientationLandscapeLeft), -< @"landscapeRight": @(RCTCameraOrientationLandscapeRight), -< @"portrait": @(RCTCameraOrientationPortrait), -< @"portraitUpsideDown": @(RCTCameraOrientationPortraitUpsideDown) -< }, -< @"FlashMode": @{ -< @"off": @(RCTCameraFlashModeOff), -< @"on": @(RCTCameraFlashModeOn), -< @"auto": @(RCTCameraFlashModeAuto) -< }, -< @"TorchMode": @{ -< @"off": @(RCTCameraTorchModeOff), -< @"on": @(RCTCameraTorchModeOn), -< @"auto": @(RCTCameraTorchModeAuto) -< } -< }; ---- -> -> -> return @{ -> @"Aspect": @{ -> @"stretch": @(RCTCameraAspectStretch), -> @"fit": @(RCTCameraAspectFit), -> @"fill": @(RCTCameraAspectFill) -> }, -> @"BarCodeType": runtimeBarcodeTypes, -> @"Type": @{ -> @"front": @(RCTCameraTypeFront), -> @"back": @(RCTCameraTypeBack) -> }, -> @"CaptureMode": @{ -> @"still": @(RCTCameraCaptureModeStill), -> @"video": @(RCTCameraCaptureModeVideo) -> }, -> @"CaptureQuality": @{ -> @"low": @(RCTCameraCaptureSessionPresetLow), -> @"AVCaptureSessionPresetLow": @(RCTCameraCaptureSessionPresetLow), -> @"medium": @(RCTCameraCaptureSessionPresetMedium), -> @"AVCaptureSessionPresetMedium": @(RCTCameraCaptureSessionPresetMedium), -> @"high": @(RCTCameraCaptureSessionPresetHigh), -> @"AVCaptureSessionPresetHigh": @(RCTCameraCaptureSessionPresetHigh), -> @"photo": @(RCTCameraCaptureSessionPresetPhoto), -> @"AVCaptureSessionPresetPhoto": @(RCTCameraCaptureSessionPresetPhoto), -> @"480p": @(RCTCameraCaptureSessionPreset480p), -> @"AVCaptureSessionPreset640x480": @(RCTCameraCaptureSessionPreset480p), -> @"720p": @(RCTCameraCaptureSessionPreset720p), -> @"AVCaptureSessionPreset1280x720": @(RCTCameraCaptureSessionPreset720p), -> @"1080p": @(RCTCameraCaptureSessionPreset1080p), -> @"AVCaptureSessionPreset1920x1080": @(RCTCameraCaptureSessionPreset1080p), -> @"4k": @(RCTCameraCaptureSessionPreset4k), -> @"AVCaptureSessionPreset3840x2160": @(RCTCameraCaptureSessionPreset4k) -> }, -> @"CaptureTarget": @{ -> @"memory": @(RCTCameraCaptureTargetMemory), -> @"disk": @(RCTCameraCaptureTargetDisk), -> @"temp": @(RCTCameraCaptureTargetTemp), -> @"cameraRoll": @(RCTCameraCaptureTargetCameraRoll) -> }, -> @"Orientation": @{ -> @"auto": @(RCTCameraOrientationAuto), -> @"landscapeLeft": @(RCTCameraOrientationLandscapeLeft), -> @"landscapeRight": @(RCTCameraOrientationLandscapeRight), -> @"portrait": @(RCTCameraOrientationPortrait), -> @"portraitUpsideDown": @(RCTCameraOrientationPortraitUpsideDown) -> }, -> @"FlashMode": @{ -> @"off": @(RCTCameraFlashModeOff), -> @"on": @(RCTCameraFlashModeOn), -> @"auto": @(RCTCameraFlashModeAuto) -> }, -> @"TorchMode": @{ -> @"off": @(RCTCameraTorchModeOff), -> @"on": @(RCTCameraTorchModeOn), -> @"auto": @(RCTCameraTorchModeAuto) -> } -> }; -145,175c147,177 -< NSInteger quality = [RCTConvert NSInteger:json]; -< NSString *qualityString; -< switch (quality) { -< default: -< case RCTCameraCaptureSessionPresetHigh: -< qualityString = AVCaptureSessionPresetHigh; -< break; -< case RCTCameraCaptureSessionPresetMedium: -< qualityString = AVCaptureSessionPresetMedium; -< break; -< case RCTCameraCaptureSessionPresetLow: -< qualityString = AVCaptureSessionPresetLow; -< break; -< case RCTCameraCaptureSessionPresetPhoto: -< qualityString = AVCaptureSessionPresetPhoto; -< break; -< case RCTCameraCaptureSessionPreset4k: -< qualityString = AVCaptureSessionPreset3840x2160; -< break; -< case RCTCameraCaptureSessionPreset1080p: -< qualityString = AVCaptureSessionPreset1920x1080; -< break; -< case RCTCameraCaptureSessionPreset720p: -< qualityString = AVCaptureSessionPreset1280x720; -< break; -< case RCTCameraCaptureSessionPreset480p: -< qualityString = AVCaptureSessionPreset640x480; -< break; -< } -< -< [self setCaptureQuality:qualityString]; ---- -> NSInteger quality = [RCTConvert NSInteger:json]; -> NSString *qualityString; -> switch (quality) { -> default: -> case RCTCameraCaptureSessionPresetHigh: -> qualityString = AVCaptureSessionPresetHigh; -> break; -> case RCTCameraCaptureSessionPresetMedium: -> qualityString = AVCaptureSessionPresetMedium; -> break; -> case RCTCameraCaptureSessionPresetLow: -> qualityString = AVCaptureSessionPresetLow; -> break; -> case RCTCameraCaptureSessionPresetPhoto: -> qualityString = AVCaptureSessionPresetPhoto; -> break; -> case RCTCameraCaptureSessionPreset4k: -> qualityString = AVCaptureSessionPreset3840x2160; -> break; -> case RCTCameraCaptureSessionPreset1080p: -> qualityString = AVCaptureSessionPreset1920x1080; -> break; -> case RCTCameraCaptureSessionPreset720p: -> qualityString = AVCaptureSessionPreset1280x720; -> break; -> case RCTCameraCaptureSessionPreset480p: -> qualityString = AVCaptureSessionPreset640x480; -> break; -> } -> -> [self setCaptureQuality:qualityString]; -179,194c181,196 -< NSInteger aspect = [RCTConvert NSInteger:json]; -< NSString *aspectString; -< switch (aspect) { -< default: -< case RCTCameraAspectFill: -< aspectString = AVLayerVideoGravityResizeAspectFill; -< break; -< case RCTCameraAspectFit: -< aspectString = AVLayerVideoGravityResizeAspect; -< break; -< case RCTCameraAspectStretch: -< aspectString = AVLayerVideoGravityResize; -< break; -< } -< -< self.previewLayer.videoGravity = aspectString; ---- -> NSInteger aspect = [RCTConvert NSInteger:json]; -> NSString *aspectString; -> switch (aspect) { -> default: -> case RCTCameraAspectFill: -> aspectString = AVLayerVideoGravityResizeAspectFill; -> break; -> case RCTCameraAspectFit: -> aspectString = AVLayerVideoGravityResizeAspect; -> break; -> case RCTCameraAspectStretch: -> aspectString = AVLayerVideoGravityResize; -> break; -> } -> -> self.previewLayer.videoGravity = aspectString; -198,243c200,245 -< NSInteger type = [RCTConvert NSInteger:json]; -< -< self.presetCamera = type; -< if (self.session.isRunning) { -< dispatch_async(self.sessionQueue, ^{ -< AVCaptureDevice *currentCaptureDevice = [self.videoCaptureDeviceInput device]; -< AVCaptureDevicePosition position = (AVCaptureDevicePosition)type; -< AVCaptureDevice *captureDevice = [self deviceWithMediaType:AVMediaTypeVideo preferringPosition:(AVCaptureDevicePosition)position]; -< -< if (captureDevice == nil) { -< return; -< } -< -< self.presetCamera = type; -< -< NSError *error = nil; -< AVCaptureDeviceInput *captureDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; -< -< if (error || captureDeviceInput == nil) -< { -< NSLog(@"%@", error); -< return; -< } -< -< [self.session beginConfiguration]; -< -< [self.session removeInput:self.videoCaptureDeviceInput]; -< -< if ([self.session canAddInput:captureDeviceInput]) -< { -< [self.session addInput:captureDeviceInput]; -< -< [NSNotificationCenter.defaultCenter removeObserver:self name:AVCaptureDeviceSubjectAreaDidChangeNotification object:currentCaptureDevice]; -< [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(subjectAreaDidChange:) name:AVCaptureDeviceSubjectAreaDidChangeNotification object:captureDevice]; -< self.videoCaptureDeviceInput = captureDeviceInput; -< [self setFlashMode]; -< } -< else -< { -< [self.session addInput:self.videoCaptureDeviceInput]; -< } -< -< [self.session commitConfiguration]; -< }); -< } -< [self initializeCaptureSessionInput:AVMediaTypeVideo]; ---- -> NSInteger type = [RCTConvert NSInteger:json]; -> -> self.presetCamera = type; -> if (self.session.isRunning) { -> dispatch_async(self.sessionQueue, ^{ -> AVCaptureDevice *currentCaptureDevice = [self.videoCaptureDeviceInput device]; -> AVCaptureDevicePosition position = (AVCaptureDevicePosition)type; -> AVCaptureDevice *captureDevice = [self deviceWithMediaType:AVMediaTypeVideo preferringPosition:(AVCaptureDevicePosition)position]; -> -> if (captureDevice == nil) { -> return; -> } -> -> self.presetCamera = type; -> -> NSError *error = nil; -> AVCaptureDeviceInput *captureDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; -> -> if (error || captureDeviceInput == nil) -> { -> NSLog(@"%@", error); -> return; -> } -> -> [self.session beginConfiguration]; -> -> [self.session removeInput:self.videoCaptureDeviceInput]; -> -> if ([self.session canAddInput:captureDeviceInput]) -> { -> [self.session addInput:captureDeviceInput]; -> -> [NSNotificationCenter.defaultCenter removeObserver:self name:AVCaptureDeviceSubjectAreaDidChangeNotification object:currentCaptureDevice]; -> [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(subjectAreaDidChange:) name:AVCaptureDeviceSubjectAreaDidChangeNotification object:captureDevice]; -> self.videoCaptureDeviceInput = captureDeviceInput; -> [self setFlashMode]; -> } -> else -> { -> [self.session addInput:self.videoCaptureDeviceInput]; -> } -> -> [self.session commitConfiguration]; -> }); -> } -> [self initializeCaptureSessionInput:AVMediaTypeVideo]; -254c256 -< ---- -> -277,289c279,291 -< dispatch_async(self.sessionQueue, ^{ -< NSInteger *torchMode = [RCTConvert NSInteger:json]; -< AVCaptureDevice *device = [self.videoCaptureDeviceInput device]; -< NSError *error = nil; -< -< if (![device hasTorch]) return; -< if (![device lockForConfiguration:&error]) { -< NSLog(@"%@", error); -< return; -< } -< [device setTorchMode: torchMode]; -< [device unlockForConfiguration]; -< }); ---- -> dispatch_async(self.sessionQueue, ^{ -> NSInteger *torchMode = [RCTConvert NSInteger:json]; -> AVCaptureDevice *device = [self.videoCaptureDeviceInput device]; -> NSError *error = nil; -> -> if (![device hasTorch]) return; -> if (![device lockForConfiguration:&error]) { -> NSLog(@"%@", error); -> return; -> } -> [device setTorchMode: torchMode]; -> [device unlockForConfiguration]; -> }); -293,294c295,296 -< BOOL enabled = [RCTConvert BOOL:json]; -< [UIApplication sharedApplication].idleTimerDisabled = enabled; ---- -> BOOL enabled = [RCTConvert BOOL:json]; -> [UIApplication sharedApplication].idleTimerDisabled = enabled; -298c300 -< self.mirrorImage = [RCTConvert BOOL:json]; ---- -> self.mirrorImage = [RCTConvert BOOL:json]; -310c312 -< self.barCodeTypes = [RCTConvert NSArray:json]; ---- -> self.barCodeTypes = [RCTConvert NSArray:json]; -314,318c316,320 -< BOOL captureAudio = [RCTConvert BOOL:json]; -< if (captureAudio) { -< RCTLog(@"capturing audio"); -< [self initializeCaptureSessionInput:AVMediaTypeAudio]; -< } ---- -> BOOL captureAudio = [RCTConvert BOOL:json]; -> if (captureAudio) { -> RCTLog(@"capturing audio"); -> [self initializeCaptureSessionInput:AVMediaTypeAudio]; -> } -324,325c326,327 -< @"focusChanged", -< @"zoomChanged", ---- -> @"focusChanged", -> @"zoomChanged", -330,338c332,340 -< if ((self = [super init])) { -< self.mirrorImage = false; -< self.mirrorVideo = false; -< -< self.sessionQueue = dispatch_queue_create("cameraManagerQueue", DISPATCH_QUEUE_SERIAL); -< -< self.sensorOrientationChecker = [RCTSensorOrientationChecker new]; -< } -< return self; ---- -> if ((self = [super init])) { -> self.mirrorImage = false; -> self.mirrorVideo = false; -> -> self.sessionQueue = dispatch_queue_create("cameraManagerQueue", DISPATCH_QUEUE_SERIAL); -> -> self.sensorOrientationChecker = [RCTSensorOrientationChecker new]; -> } -> return self; -343,355c345,357 -< __block NSString *mediaType = AVMediaTypeVideo; -< -< [AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) { -< if (!granted) { -< resolve(@(granted)); -< } -< else { -< mediaType = AVMediaTypeAudio; -< [AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) { -< resolve(@(granted)); -< }]; -< } -< }]; ---- -> __block NSString *mediaType = AVMediaTypeVideo; -> -> [AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) { -> if (!granted) { -> resolve(@(granted)); -> } -> else { -> mediaType = AVMediaTypeAudio; -> [AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) { -> resolve(@(granted)); -> }]; -> } -> }]; -362c364 -< ---- -> -371c373 -< ---- -> -378c380 -< [self setOrientation:orientation]; ---- -> [self setOrientation:orientation]; -384,392c386,394 -< NSInteger captureMode = [[options valueForKey:@"mode"] intValue]; -< NSInteger captureTarget = [[options valueForKey:@"target"] intValue]; -< -< if (captureMode == RCTCameraCaptureModeStill) { -< [self captureStill:captureTarget options:options resolve:resolve reject:reject]; -< } -< else if (captureMode == RCTCameraCaptureModeVideo) { -< [self captureVideo:captureTarget options:options resolve:resolve reject:reject]; -< } ---- -> NSInteger captureMode = [[options valueForKey:@"mode"] intValue]; -> NSInteger captureTarget = [[options valueForKey:@"target"] intValue]; -> -> if (captureMode == RCTCameraCaptureModeStill) { -> [self captureStill:captureTarget options:options resolve:resolve reject:reject]; -> } -> else if (captureMode == RCTCameraCaptureModeVideo) { -> [self captureVideo:captureTarget options:options resolve:resolve reject:reject]; -> } -418,420c420,422 -< if (self.movieFileOutput.recording) { -< [self.movieFileOutput stopRecording]; -< } ---- -> if (self.movieFileOutput.recording) { -> [self.movieFileOutput stopRecording]; -> } -424,452c426,454 -< NSArray *devices = [AVCaptureDevice devices]; -< AVCaptureDevice *frontCamera; -< AVCaptureDevice *backCamera; -< double frontFov = 0.0; -< double backFov = 0.0; -< -< for (AVCaptureDevice *device in devices) { -< -< NSLog(@"Device name: %@", [device localizedName]); -< -< if ([device hasMediaType:AVMediaTypeVideo]) { -< -< if ([device position] == AVCaptureDevicePositionBack) { -< NSLog(@"Device position : back"); -< backCamera = device; -< backFov = backCamera.activeFormat.videoFieldOfView; -< } -< else { -< NSLog(@"Device position : front"); -< frontCamera = device; -< frontFov = frontCamera.activeFormat.videoFieldOfView; -< } -< } -< } -< -< resolve(@{ -< [NSNumber numberWithInt:RCTCameraTypeBack]: [NSNumber numberWithDouble: backFov], -< [NSNumber numberWithInt:RCTCameraTypeFront]: [NSNumber numberWithDouble: frontFov] -< }); ---- -> NSArray *devices = [AVCaptureDevice devices]; -> AVCaptureDevice *frontCamera; -> AVCaptureDevice *backCamera; -> double frontFov = 0.0; -> double backFov = 0.0; -> -> for (AVCaptureDevice *device in devices) { -> -> NSLog(@"Device name: %@", [device localizedName]); -> -> if ([device hasMediaType:AVMediaTypeVideo]) { -> -> if ([device position] == AVCaptureDevicePositionBack) { -> NSLog(@"Device position : back"); -> backCamera = device; -> backFov = backCamera.activeFormat.videoFieldOfView; -> } -> else { -> NSLog(@"Device position : front"); -> frontCamera = device; -> frontFov = frontCamera.activeFormat.videoFieldOfView; -> } -> } -> } -> -> resolve(@{ -> [NSNumber numberWithInt:RCTCameraTypeBack]: [NSNumber numberWithDouble: backFov], -> [NSNumber numberWithInt:RCTCameraTypeFront]: [NSNumber numberWithDouble: frontFov] -> }); -476c478 -< return; ---- -> return; -478,516c480,518 -< dispatch_async(self.sessionQueue, ^{ -< if (self.presetCamera == AVCaptureDevicePositionUnspecified) { -< self.presetCamera = AVCaptureDevicePositionBack; -< } -< -< AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; -< if ([self.session canAddOutput:stillImageOutput]) -< { -< stillImageOutput.outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG}; -< [self.session addOutput:stillImageOutput]; -< self.stillImageOutput = stillImageOutput; -< } -< -< AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; -< if ([self.session canAddOutput:movieFileOutput]) -< { -< [self.session addOutput:movieFileOutput]; -< self.movieFileOutput = movieFileOutput; -< } -< -< AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init]; -< if ([self.session canAddOutput:metadataOutput]) { -< [metadataOutput setMetadataObjectsDelegate:self queue:self.sessionQueue]; -< [self.session addOutput:metadataOutput]; -< [metadataOutput setMetadataObjectTypes:self.barCodeTypes]; -< self.metadataOutput = metadataOutput; -< } -< -< __weak RCTCameraManager *weakSelf = self; -< [self setRuntimeErrorHandlingObserver:[NSNotificationCenter.defaultCenter addObserverForName:AVCaptureSessionRuntimeErrorNotification object:self.session queue:nil usingBlock:^(NSNotification *note) { -< RCTCameraManager *strongSelf = weakSelf; -< dispatch_async(strongSelf.sessionQueue, ^{ -< // Manually restarting the session since it must have been stopped due to an error. -< [strongSelf.session startRunning]; -< }); -< }]]; -< -< [self.session startRunning]; -< }); ---- -> dispatch_async(self.sessionQueue, ^{ -> if (self.presetCamera == AVCaptureDevicePositionUnspecified) { -> self.presetCamera = AVCaptureDevicePositionBack; -> } -> -> AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; -> if ([self.session canAddOutput:stillImageOutput]) -> { -> stillImageOutput.outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG}; -> [self.session addOutput:stillImageOutput]; -> self.stillImageOutput = stillImageOutput; -> } -> -> AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; -> if ([self.session canAddOutput:movieFileOutput]) -> { -> [self.session addOutput:movieFileOutput]; -> self.movieFileOutput = movieFileOutput; -> } -> -> AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init]; -> if ([self.session canAddOutput:metadataOutput]) { -> [metadataOutput setMetadataObjectsDelegate:self queue:self.sessionQueue]; -> [self.session addOutput:metadataOutput]; -> [metadataOutput setMetadataObjectTypes:self.barCodeTypes]; -> self.metadataOutput = metadataOutput; -> } -> -> __weak RCTCameraManager *weakSelf = self; -> [self setRuntimeErrorHandlingObserver:[NSNotificationCenter.defaultCenter addObserverForName:AVCaptureSessionRuntimeErrorNotification object:self.session queue:nil usingBlock:^(NSNotification *note) { -> RCTCameraManager *strongSelf = weakSelf; -> dispatch_async(strongSelf.sessionQueue, ^{ -> // Manually restarting the session since it must have been stopped due to an error. -> [strongSelf.session startRunning]; -> }); -> }]]; -> -> [self.session startRunning]; -> }); -521,524d522 -< self.camera = nil; -< return; -< #endif -< dispatch_async(self.sessionQueue, ^{ -526,536c524,538 -< [self.previewLayer removeFromSuperlayer]; -< [self.session commitConfiguration]; -< [self.session stopRunning]; -< for(AVCaptureInput *input in self.session.inputs) { -< [self.session removeInput:input]; -< } -< -< for(AVCaptureOutput *output in self.session.outputs) { -< [self.session removeOutput:output]; -< } -< }); ---- -> return; -> #endif -> dispatch_async(self.sessionQueue, ^{ -> self.camera = nil; -> [self.previewLayer removeFromSuperlayer]; -> [self.session commitConfiguration]; -> [self.session stopRunning]; -> for(AVCaptureInput *input in self.session.inputs) { -> [self.session removeInput:input]; -> } -> -> for(AVCaptureOutput *output in self.session.outputs) { -> [self.session removeOutput:output]; -> } -> }); -540,545c542,549 -< dispatch_async(self.sessionQueue, ^{ -< if (type == AVMediaTypeAudio) { -< for (AVCaptureDeviceInput* input in [self.session inputs]) { -< if ([input.device hasMediaType:AVMediaTypeAudio]) { -< // If an audio input has been configured we don't need to set it up again -< return; ---- -> dispatch_async(self.sessionQueue, ^{ -> if (type == AVMediaTypeAudio) { -> for (AVCaptureDeviceInput* input in [self.session inputs]) { -> if ([input.device hasMediaType:AVMediaTypeAudio]) { -> // If an audio input has been configured we don't need to set it up again -> return; -> } -> } -547,596c551,598 -< } -< } -< -< [self.session beginConfiguration]; -< -< NSError *error = nil; -< -< AVCaptureDevice *currentCaptureDevice = [self.videoCaptureDeviceInput device]; -< AVCaptureDevice *captureDevice; -< -< if (type == AVMediaTypeAudio) { -< captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; -< } -< else if (type == AVMediaTypeVideo) { -< captureDevice = [self deviceWithMediaType:AVMediaTypeVideo preferringPosition:self.presetCamera]; -< } -< -< if (captureDevice == nil) { -< return; -< } -< -< AVCaptureDeviceInput *captureDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; -< -< if (error || captureDeviceInput == nil) { -< NSLog(@"%@", error); -< return; -< } -< -< if (type == AVMediaTypeVideo) { -< [self.session removeInput:self.videoCaptureDeviceInput]; -< } -< -< if ([self.session canAddInput:captureDeviceInput]) { -< [self.session addInput:captureDeviceInput]; -< -< if (type == AVMediaTypeAudio) { -< self.audioCaptureDeviceInput = captureDeviceInput; -< } -< else if (type == AVMediaTypeVideo) { -< [NSNotificationCenter.defaultCenter removeObserver:self name:AVCaptureDeviceSubjectAreaDidChangeNotification object:currentCaptureDevice]; -< [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(subjectAreaDidChange:) name:AVCaptureDeviceSubjectAreaDidChangeNotification object:captureDevice]; -< -< self.videoCaptureDeviceInput = captureDeviceInput; -< [self setFlashMode]; -< } -< [self.metadataOutput setMetadataObjectTypes:self.metadataOutput.availableMetadataObjectTypes]; -< } -< -< [self.session commitConfiguration]; -< }); ---- -> -> [self.session beginConfiguration]; -> -> NSError *error = nil; -> -> AVCaptureDevice *currentCaptureDevice = [self.videoCaptureDeviceInput device]; -> AVCaptureDevice *captureDevice; -> -> if (type == AVMediaTypeAudio) { -> captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; -> } -> else if (type == AVMediaTypeVideo) { -> captureDevice = [self deviceWithMediaType:AVMediaTypeVideo preferringPosition:self.presetCamera]; -> } -> -> if (captureDevice == nil) { -> return; -> } -> -> AVCaptureDeviceInput *captureDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; -> -> if (error || captureDeviceInput == nil) { -> NSLog(@"%@", error); -> return; -> } -> -> if (type == AVMediaTypeVideo) { -> [self.session removeInput:self.videoCaptureDeviceInput]; -> } -> -> if ([self.session canAddInput:captureDeviceInput]) { -> [self.session addInput:captureDeviceInput]; -> -> if (type == AVMediaTypeAudio) { -> self.audioCaptureDeviceInput = captureDeviceInput; -> } -> else if (type == AVMediaTypeVideo) { -> [NSNotificationCenter.defaultCenter removeObserver:self name:AVCaptureDeviceSubjectAreaDidChangeNotification object:currentCaptureDevice]; -> [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(subjectAreaDidChange:) name:AVCaptureDeviceSubjectAreaDidChangeNotification object:captureDevice]; -> -> self.videoCaptureDeviceInput = captureDeviceInput; -> [self setFlashMode]; -> } -> [self.metadataOutput setMetadataObjectTypes:self.metadataOutput.availableMetadataObjectTypes]; -> } -> -> [self.session commitConfiguration]; -> }); -603,609c605,611 -< #if TARGET_IPHONE_SIMULATOR -< [self captureStill:target options:options orientation:self.previewLayer.connection.videoOrientation resolve:resolve reject:reject]; -< #else -< [self.sensorOrientationChecker getDeviceOrientationWithBlock:^(UIInterfaceOrientation orientation) { -< [self captureStill:target options:options orientation:[self.sensorOrientationChecker convertToAVCaptureVideoOrientation: orientation] resolve:resolve reject:reject]; -< }]; -< #endif ---- -> #if TARGET_IPHONE_SIMULATOR -> [self captureStill:target options:options orientation:self.previewLayer.connection.videoOrientation resolve:resolve reject:reject]; -> #else -> [self.sensorOrientationChecker getDeviceOrientationWithBlock:^(UIInterfaceOrientation orientation) { -> [self captureStill:target options:options orientation:[self.sensorOrientationChecker convertToAVCaptureVideoOrientation: orientation] resolve:resolve reject:reject]; -> }]; -> #endif -617c619 -< dispatch_async(self.sessionQueue, ^{ ---- -> dispatch_async(self.sessionQueue, ^{ -619,642c621,644 -< CGSize size = CGSizeMake(720, 1280); -< UIGraphicsBeginImageContextWithOptions(size, YES, 0); -< // Thanks https://gist.github.com/kylefox/1689973 -< CGFloat hue = ( arc4random() % 256 / 256.0 ); // 0.0 to 1.0 -< CGFloat saturation = ( arc4random() % 128 / 256.0 ) + 0.5; // 0.5 to 1.0, away from white -< CGFloat brightness = ( arc4random() % 128 / 256.0 ) + 0.5; // 0.5 to 1.0, away from black -< UIColor *color = [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1]; -< [color setFill]; -< UIRectFill(CGRectMake(0, 0, size.width, size.height)); -< NSDate *currentDate = [NSDate date]; -< NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; -< [dateFormatter setDateFormat:@"dd.MM.YY HH:mm:ss"]; -< NSString *text = [dateFormatter stringFromDate:currentDate]; -< UIFont *font = [UIFont systemFontOfSize:40.0]; -< NSDictionary *attributes = [NSDictionary dictionaryWithObjects: -< @[font, [UIColor blackColor]] -< forKeys: -< @[NSFontAttributeName, NSForegroundColorAttributeName]]; -< [text drawAtPoint:CGPointMake(size.width/3, size.height/2) withAttributes:attributes]; -< UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); -< UIGraphicsEndImageContext(); -< -< NSData *imageData = UIImageJPEGRepresentation(image, 1.0); -< [self saveImage:imageData imageSize:size target:target metadata:nil resolve:resolve reject:reject]; ---- -> CGSize size = CGSizeMake(720, 1280); -> UIGraphicsBeginImageContextWithOptions(size, YES, 0); -> // Thanks https://gist.github.com/kylefox/1689973 -> CGFloat hue = ( arc4random() % 256 / 256.0 ); // 0.0 to 1.0 -> CGFloat saturation = ( arc4random() % 128 / 256.0 ) + 0.5; // 0.5 to 1.0, away from white -> CGFloat brightness = ( arc4random() % 128 / 256.0 ) + 0.5; // 0.5 to 1.0, away from black -> UIColor *color = [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1]; -> [color setFill]; -> UIRectFill(CGRectMake(0, 0, size.width, size.height)); -> NSDate *currentDate = [NSDate date]; -> NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; -> [dateFormatter setDateFormat:@"dd.MM.YY HH:mm:ss"]; -> NSString *text = [dateFormatter stringFromDate:currentDate]; -> UIFont *font = [UIFont systemFontOfSize:40.0]; -> NSDictionary *attributes = [NSDictionary dictionaryWithObjects: -> @[font, [UIColor blackColor]] -> forKeys: -> @[NSFontAttributeName, NSForegroundColorAttributeName]]; -> [text drawAtPoint:CGPointMake(size.width/3, size.height/2) withAttributes:attributes]; -> UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); -> UIGraphicsEndImageContext(); -> -> NSData *imageData = UIImageJPEGRepresentation(image, 1.0); -> [self saveImage:imageData imageSize:size target:target metadata:nil resolve:resolve reject:reject]; -644,680c646,735 -< [[self.stillImageOutput connectionWithMediaType:AVMediaTypeVideo] setVideoOrientation:orientation]; -< -< [self.stillImageOutput captureStillImageAsynchronouslyFromConnection:[self.stillImageOutput connectionWithMediaType:AVMediaTypeVideo] completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { -< -< if (imageDataSampleBuffer) { -< NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; -< -< // Create image source -< CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)imageData, NULL); -< //get all the metadata in the image -< NSMutableDictionary *imageMetadata = [(NSDictionary *) CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(source, 0, NULL)) mutableCopy]; -< -< // create cgimage -< CGImageRef cgImage = CGImageSourceCreateImageAtIndex(source, 0, NULL); -< -< // setup viewport size before using -< CGSize viewportSize; -< -< // Rotate it -< CGImageRef rotatedCGImage; -< if ([options objectForKey:@"rotation"]) { -< float rotation = [[options objectForKey:@"rotation"] floatValue]; -< rotatedCGImage = [self newCGImageRotatedByAngle:cgImage angle:rotation]; -< } else if ([[options objectForKey:@"fixOrientation"] boolValue] == YES) { -< // Get metadata orientation -< int metadataOrientation = [[imageMetadata objectForKey:(NSString *)kCGImagePropertyOrientation] intValue]; -< -< bool rotated = false; -< //see http://www.impulseadventure.com/photo/exif-orientation.html -< if (metadataOrientation == 6) { -< rotatedCGImage = [self newCGImageRotatedByAngle:cgImage angle:270]; -< rotated = true; -< } else if (metadataOrientation == 3) { -< rotatedCGImage = [self newCGImageRotatedByAngle:cgImage angle:180]; -< rotated = true; -< } else { -< rotatedCGImage = cgImage; ---- -> [[self.stillImageOutput connectionWithMediaType:AVMediaTypeVideo] setVideoOrientation:orientation]; -> -> [self.stillImageOutput captureStillImageAsynchronouslyFromConnection:[self.stillImageOutput connectionWithMediaType:AVMediaTypeVideo] completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { -> -> if (imageDataSampleBuffer) { -> NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; -> -> // Create image source -> CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)imageData, NULL); -> //get all the metadata in the image -> NSMutableDictionary *imageMetadata = [(NSDictionary *) CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(source, 0, NULL)) mutableCopy]; -> -> // create cgimage -> CGImageRef cgImage = CGImageSourceCreateImageAtIndex(source, 0, NULL); -> -> // setup viewport size before using -> CGSize viewportSize; -> -> // Rotate it -> CGImageRef rotatedCGImage; -> if ([options objectForKey:@"rotation"]) { -> float rotation = [[options objectForKey:@"rotation"] floatValue]; -> rotatedCGImage = [self newCGImageRotatedByAngle:cgImage angle:rotation]; -> } else if ([[options objectForKey:@"fixOrientation"] boolValue] == YES) { -> // Get metadata orientation -> int metadataOrientation = [[imageMetadata objectForKey:(NSString *)kCGImagePropertyOrientation] intValue]; -> -> bool rotated = false; -> //see http://www.impulseadventure.com/photo/exif-orientation.html -> if (metadataOrientation == 6) { -> rotatedCGImage = [self newCGImageRotatedByAngle:cgImage angle:270]; -> rotated = true; -> } else if (metadataOrientation == 3) { -> rotatedCGImage = [self newCGImageRotatedByAngle:cgImage angle:180]; -> rotated = true; -> } else { -> rotatedCGImage = cgImage; -> } -> -> if(rotated) { -> [imageMetadata setObject:[NSNumber numberWithInteger:1] forKey:(NSString *)kCGImagePropertyOrientation]; -> CGImageRelease(cgImage); -> } -> } else { -> rotatedCGImage = cgImage; -> } -> -> // Crop it -> if (self.cropToPreview) { -> -> if (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])) -> { -> viewportSize = CGSizeMake(self.previewLayer.frame.size.height, self.previewLayer.frame.size.width); -> } else { -> viewportSize = CGSizeMake(self.previewLayer.frame.size.width, self.previewLayer.frame.size.height); -> } -> -> CGRect captureRect = CGRectMake(0, 0, CGImageGetWidth(rotatedCGImage), CGImageGetHeight(rotatedCGImage)); -> CGRect croppedSize = AVMakeRectWithAspectRatioInsideRect(viewportSize, captureRect); -> rotatedCGImage = CGImageCreateWithImageInRect(rotatedCGImage, croppedSize); -> } -> -> // Erase stupid TIFF stuff -> [imageMetadata removeObjectForKey:(NSString *)kCGImagePropertyTIFFDictionary]; -> -> // Add input metadata -> [imageMetadata mergeMetadata:[options objectForKey:@"metadata"]]; -> -> // Create destination thing -> NSMutableData *rotatedImageData = [NSMutableData data]; -> CGImageDestinationRef destination = CGImageDestinationCreateWithData((CFMutableDataRef)rotatedImageData, CGImageSourceGetType(source), 1, NULL); -> CFRelease(source); -> // add the image to the destination, reattaching metadata -> CGImageDestinationAddImage(destination, rotatedCGImage, (CFDictionaryRef) imageMetadata); -> // And write -> CGImageDestinationFinalize(destination); -> CGSize frameSize; -> if (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])) -> { -> frameSize = CGSizeMake(CGImageGetHeight(rotatedCGImage), -> CGImageGetWidth(rotatedCGImage)); -> } else { -> frameSize = CGSizeMake(CGImageGetWidth(rotatedCGImage), -> CGImageGetHeight(rotatedCGImage)); -> } -> CFRelease(destination); -> -> [self saveImage:rotatedImageData imageSize:frameSize target:target metadata:imageMetadata resolve:resolve reject:reject]; -> -> CGImageRelease(rotatedCGImage); -682,685c737,738 -< -< if(rotated) { -< [imageMetadata setObject:[NSNumber numberWithInteger:1] forKey:(NSString *)kCGImagePropertyOrientation]; -< CGImageRelease(cgImage); ---- -> else { -> reject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); -687,738c740 -< } else { -< rotatedCGImage = cgImage; -< } -< -< // Crop it -< if (self.cropToPreview) { -< -< if (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])) -< { -< viewportSize = CGSizeMake(self.previewLayer.frame.size.height, self.previewLayer.frame.size.width); -< } else { -< viewportSize = CGSizeMake(self.previewLayer.frame.size.width, self.previewLayer.frame.size.height); -< } -< -< CGRect captureRect = CGRectMake(0, 0, CGImageGetWidth(rotatedCGImage), CGImageGetHeight(rotatedCGImage)); -< CGRect croppedSize = AVMakeRectWithAspectRatioInsideRect(viewportSize, captureRect); -< rotatedCGImage = CGImageCreateWithImageInRect(rotatedCGImage, croppedSize); -< } -< -< // Erase stupid TIFF stuff -< [imageMetadata removeObjectForKey:(NSString *)kCGImagePropertyTIFFDictionary]; -< -< // Add input metadata -< [imageMetadata mergeMetadata:[options objectForKey:@"metadata"]]; -< -< // Create destination thing -< NSMutableData *rotatedImageData = [NSMutableData data]; -< CGImageDestinationRef destination = CGImageDestinationCreateWithData((CFMutableDataRef)rotatedImageData, CGImageSourceGetType(source), 1, NULL); -< CFRelease(source); -< // add the image to the destination, reattaching metadata -< CGImageDestinationAddImage(destination, rotatedCGImage, (CFDictionaryRef) imageMetadata); -< // And write -< CGImageDestinationFinalize(destination); -< CGSize frameSize; -< if (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])) -< { -< frameSize = CGSizeMake(CGImageGetHeight(rotatedCGImage), -< CGImageGetWidth(rotatedCGImage)); -< } else { -< frameSize = CGSizeMake(CGImageGetWidth(rotatedCGImage), -< CGImageGetHeight(rotatedCGImage)); -< } -< CFRelease(destination); -< -< [self saveImage:rotatedImageData imageSize:frameSize target:target metadata:imageMetadata resolve:resolve reject:reject]; -< -< CGImageRelease(rotatedCGImage); -< } -< else { -< reject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); -< } -< }]; ---- -> }]; -740c742 -< }); ---- -> }); -745,783c747,787 -< NSString *responseString; -< -< if (target == RCTCameraCaptureTargetMemory) { -< resolve(@{@"data":[imageData base64EncodedStringWithOptions:0]}); -< return; -< } -< -< else if (target == RCTCameraCaptureTargetDisk) { -< NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); -< NSString *documentsDirectory = [paths firstObject]; -< -< NSFileManager *fileManager = [NSFileManager defaultManager]; -< NSString *fullPath = [[documentsDirectory stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]] stringByAppendingPathExtension:@"jpg"]; -< -< [fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; -< responseString = fullPath; -< } -< -< else if (target == RCTCameraCaptureTargetTemp) { -< NSString *fileName = [[NSProcessInfo processInfo] globallyUniqueString]; -< NSString *fullPath = [NSString stringWithFormat:@"%@%@.jpg", NSTemporaryDirectory(), fileName]; -< -< [imageData writeToFile:fullPath atomically:YES]; -< responseString = fullPath; -< } -< -< else if (target == RCTCameraCaptureTargetCameraRoll) { -< [[[ALAssetsLibrary alloc] init] writeImageDataToSavedPhotosAlbum:imageData metadata:metadata completionBlock:^(NSURL* url, NSError* error) { -< if (error == nil) { -< //path isn't really applicable here (this is an asset uri), but left it in for backward comparability -< resolve(@{@"path":[url absoluteString], @"mediaUri":[url absoluteString]}); -< } -< else { -< reject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); -< } -< }]; -< return; -< } -< resolve(@{@"path":responseString, @"width":[NSNumber numberWithFloat:imageSize.width], @"height":[NSNumber numberWithFloat:imageSize.height]}); ---- -> NSString *responseString; -> -> if (target == RCTCameraCaptureTargetMemory) { -> resolve(@{@"data":[imageData base64EncodedStringWithOptions:0]}); -> return; -> } -> -> else if (target == RCTCameraCaptureTargetDisk) { -> NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); -> NSString *documentsDirectory = [paths firstObject]; -> -> NSFileManager *fileManager = [NSFileManager defaultManager]; -> NSString *fullPath = [[documentsDirectory stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]] stringByAppendingPathExtension:@"jpg"]; -> -> [fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; -> responseString = fullPath; -> } -> -> else if (target == RCTCameraCaptureTargetTemp) { -> NSString *fileName = [[NSProcessInfo processInfo] globallyUniqueString]; -> NSString *fullPath = [NSString stringWithFormat:@"%@%@.jpg", NSTemporaryDirectory(), fileName]; -> -> [imageData writeToFile:fullPath atomically:YES]; -> responseString = fullPath; -> } -> -> else if (target == RCTCameraCaptureTargetCameraRoll) { -> #if !TARGET_OS_MACCATALYST -> [[[ALAssetsLibrary alloc] init] writeImageDataToSavedPhotosAlbum:imageData metadata:metadata completionBlock:^(NSURL* url, NSError* error) { -> if (error == nil) { -> //path isn't really applicable here (this is an asset uri), but left it in for backward comparability -> resolve(@{@"path":[url absoluteString], @"mediaUri":[url absoluteString]}); -> } -> else { -> reject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); -> } -> }]; -> #endif -> return; -> } -> resolve(@{@"path":responseString, @"width":[NSNumber numberWithFloat:imageSize.width], @"height":[NSNumber numberWithFloat:imageSize.height]}); -788,818c792,822 -< CGFloat angleInRadians = angle * (M_PI / 180); -< CGFloat width = CGImageGetWidth(imgRef); -< CGFloat height = CGImageGetHeight(imgRef); -< -< CGRect imgRect = CGRectMake(0, 0, width, height); -< CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians); -< CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform); -< -< CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); -< CGContextRef bmContext = CGBitmapContextCreate(NULL, rotatedRect.size.width, rotatedRect.size.height, 8, 0, colorSpace, (CGBitmapInfo) kCGImageAlphaPremultipliedFirst); -< -< if (self.mirrorImage) { -< CGAffineTransform transform = CGAffineTransformMakeTranslation(rotatedRect.size.width, 0.0); -< transform = CGAffineTransformScale(transform, -1.0, 1.0); -< CGContextConcatCTM(bmContext, transform); -< } -< -< CGContextSetAllowsAntialiasing(bmContext, TRUE); -< CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone); -< -< CGColorSpaceRelease(colorSpace); -< -< CGContextTranslateCTM(bmContext, +(rotatedRect.size.width/2), +(rotatedRect.size.height/2)); -< CGContextRotateCTM(bmContext, angleInRadians); -< CGContextTranslateCTM(bmContext, -(rotatedRect.size.width/2), -(rotatedRect.size.height/2)); -< -< CGContextDrawImage(bmContext, CGRectMake((rotatedRect.size.width-width)/2.0f, (rotatedRect.size.height-height)/2.0f, width, height), imgRef); -< -< CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext); -< CFRelease(bmContext); -< return rotatedImage; ---- -> CGFloat angleInRadians = angle * (M_PI / 180); -> CGFloat width = CGImageGetWidth(imgRef); -> CGFloat height = CGImageGetHeight(imgRef); -> -> CGRect imgRect = CGRectMake(0, 0, width, height); -> CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians); -> CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform); -> -> CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); -> CGContextRef bmContext = CGBitmapContextCreate(NULL, rotatedRect.size.width, rotatedRect.size.height, 8, 0, colorSpace, (CGBitmapInfo) kCGImageAlphaPremultipliedFirst); -> -> if (self.mirrorImage) { -> CGAffineTransform transform = CGAffineTransformMakeTranslation(rotatedRect.size.width, 0.0); -> transform = CGAffineTransformScale(transform, -1.0, 1.0); -> CGContextConcatCTM(bmContext, transform); -> } -> -> CGContextSetAllowsAntialiasing(bmContext, TRUE); -> CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone); -> -> CGColorSpaceRelease(colorSpace); -> -> CGContextTranslateCTM(bmContext, +(rotatedRect.size.width/2), +(rotatedRect.size.height/2)); -> CGContextRotateCTM(bmContext, angleInRadians); -> CGContextTranslateCTM(bmContext, -(rotatedRect.size.width/2), -(rotatedRect.size.height/2)); -> -> CGContextDrawImage(bmContext, CGRectMake((rotatedRect.size.width-width)/2.0f, (rotatedRect.size.height-height)/2.0f, width, height), imgRef); -> -> CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext); -> CFRelease(bmContext); -> return rotatedImage; -835,866c839,841 -< if (self.movieFileOutput.recording) { -< reject(RCTErrorUnspecified, nil, RCTErrorWithMessage(@"Already recording")); -< return; -< } -< -< if ([[options valueForKey:@"audio"] boolValue]) { -< [self initializeCaptureSessionInput:AVMediaTypeAudio]; -< } -< -< Float64 totalSeconds = [[options valueForKey:@"totalSeconds"] floatValue]; -< if (totalSeconds > -1) { -< int32_t preferredTimeScale = [[options valueForKey:@"preferredTimeScale"] intValue]; -< CMTime maxDuration = CMTimeMakeWithSeconds(totalSeconds, preferredTimeScale); -< self.movieFileOutput.maxRecordedDuration = maxDuration; -< } -< -< dispatch_async(self.sessionQueue, ^{ -< [[self.movieFileOutput connectionWithMediaType:AVMediaTypeVideo] setVideoOrientation:orientation]; -< -< if (self.mirrorVideo) { -< [[self.movieFileOutput connectionWithMediaType:AVMediaTypeVideo] setVideoMirrored:YES]; -< } -< //Create temporary URL to record to -< NSString *outputPath = [[NSString alloc] initWithFormat:@"%@%@", NSTemporaryDirectory(), @"output.mov"]; -< NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputPath]; -< NSFileManager *fileManager = [NSFileManager defaultManager]; -< if ([fileManager fileExistsAtPath:outputPath]) { -< NSError *error; -< if ([fileManager removeItemAtPath:outputPath error:&error] == NO) { -< reject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); -< return; -< } ---- -> if (self.movieFileOutput.recording) { -> reject(RCTErrorUnspecified, nil, RCTErrorWithMessage(@"Already recording")); -> return; -868,875c843,879 -< -< //Start recording -< [self.movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self]; -< -< self.videoResolve = resolve; -< self.videoReject = reject; -< self.videoTarget = target; -< }); ---- -> -> if ([[options valueForKey:@"audio"] boolValue]) { -> [self initializeCaptureSessionInput:AVMediaTypeAudio]; -> } -> -> Float64 totalSeconds = [[options valueForKey:@"totalSeconds"] floatValue]; -> if (totalSeconds > -1) { -> int32_t preferredTimeScale = [[options valueForKey:@"preferredTimeScale"] intValue]; -> CMTime maxDuration = CMTimeMakeWithSeconds(totalSeconds, preferredTimeScale); -> self.movieFileOutput.maxRecordedDuration = maxDuration; -> } -> -> dispatch_async(self.sessionQueue, ^{ -> [[self.movieFileOutput connectionWithMediaType:AVMediaTypeVideo] setVideoOrientation:orientation]; -> -> if (self.mirrorVideo) { -> [[self.movieFileOutput connectionWithMediaType:AVMediaTypeVideo] setVideoMirrored:YES]; -> } -> //Create temporary URL to record to -> NSString *outputPath = [[NSString alloc] initWithFormat:@"%@%@", NSTemporaryDirectory(), @"output.mov"]; -> NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputPath]; -> NSFileManager *fileManager = [NSFileManager defaultManager]; -> if ([fileManager fileExistsAtPath:outputPath]) { -> NSError *error; -> if ([fileManager removeItemAtPath:outputPath error:&error] == NO) { -> reject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); -> return; -> } -> } -> -> //Start recording -> [self.movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self]; -> -> self.videoResolve = resolve; -> self.videoReject = reject; -> self.videoTarget = target; -> }); -883,967c887,896 -< BOOL recordSuccess = YES; -< if ([error code] != noErr) { -< // A problem occurred: Find out if the recording was successful. -< id value = [[error userInfo] objectForKey:AVErrorRecordingSuccessfullyFinishedKey]; -< if (value) { -< recordSuccess = [value boolValue]; -< } -< } -< if (!recordSuccess) { -< self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(@"Error while recording")); -< return; -< } -< -< AVURLAsset* videoAsAsset = [AVURLAsset URLAssetWithURL:outputFileURL options:nil]; -< AVAssetTrack* videoTrack = [[videoAsAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; -< float videoWidth; -< float videoHeight; -< -< CGSize videoSize = [videoTrack naturalSize]; -< CGAffineTransform txf = [videoTrack preferredTransform]; -< -< if ((txf.tx == videoSize.width && txf.ty == videoSize.height) || (txf.tx == 0 && txf.ty == 0)) { -< // Video recorded in landscape orientation -< videoWidth = videoSize.width; -< videoHeight = videoSize.height; -< } else { -< // Video recorded in portrait orientation, so have to swap reported width/height -< videoWidth = videoSize.height; -< videoHeight = videoSize.width; -< } -< -< NSMutableDictionary *videoInfo = [NSMutableDictionary dictionaryWithDictionary:@{ -< @"duration":[NSNumber numberWithFloat:CMTimeGetSeconds(videoAsAsset.duration)], -< @"width":[NSNumber numberWithFloat:videoWidth], -< @"height":[NSNumber numberWithFloat:videoHeight], -< @"size":[NSNumber numberWithLongLong:captureOutput.recordedFileSize], -< }]; -< -< if (self.videoTarget == RCTCameraCaptureTargetCameraRoll) { -< ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; -< if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputFileURL]) { -< [library writeVideoAtPathToSavedPhotosAlbum:outputFileURL -< completionBlock:^(NSURL *assetURL, NSError *error) { -< if (error) { -< self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); -< return; -< } else if (assetURL == nil) { -< //It's possible for writing to camera roll to fail, -< //without receiving an error message, but assetURL will be nil -< //Happens when disk is (almost) full -< self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(@"Not enough storage")); -< return; -< } -< -< [videoInfo setObject:[assetURL absoluteString] forKey:@"path"]; -< self.videoResolve(videoInfo); -< }]; -< } -< } -< else if (self.videoTarget == RCTCameraCaptureTargetDisk) { -< NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); -< NSString *documentsDirectory = [paths firstObject]; -< NSString *fullPath = [[documentsDirectory stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]] stringByAppendingPathExtension:@"mov"]; -< -< NSFileManager * fileManager = [NSFileManager defaultManager]; -< NSError * error = nil; -< -< //moving to destination -< if (!([fileManager moveItemAtPath:[outputFileURL path] toPath:fullPath error:&error])) { -< self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); -< return; -< } -< [videoInfo setObject:fullPath forKey:@"path"]; -< self.videoResolve(videoInfo); -< } -< else if (self.videoTarget == RCTCameraCaptureTargetTemp) { -< NSString *fileName = [[NSProcessInfo processInfo] globallyUniqueString]; -< NSString *fullPath = [NSString stringWithFormat:@"%@%@.mov", NSTemporaryDirectory(), fileName]; -< -< NSFileManager * fileManager = [NSFileManager defaultManager]; -< NSError * error = nil; -< -< //moving to destination -< if (!([fileManager moveItemAtPath:[outputFileURL path] toPath:fullPath error:&error])) { -< self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); ---- -> BOOL recordSuccess = YES; -> if ([error code] != noErr) { -> // A problem occurred: Find out if the recording was successful. -> id value = [[error userInfo] objectForKey:AVErrorRecordingSuccessfullyFinishedKey]; -> if (value) { -> recordSuccess = [value boolValue]; -> } -> } -> if (!recordSuccess) { -> self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(@"Error while recording")); -970,975c899,982 -< [videoInfo setObject:fullPath forKey:@"path"]; -< self.videoResolve(videoInfo); -< } -< else { -< self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(@"Target not supported")); -< } ---- -> -> AVURLAsset* videoAsAsset = [AVURLAsset URLAssetWithURL:outputFileURL options:nil]; -> AVAssetTrack* videoTrack = [[videoAsAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; -> float videoWidth; -> float videoHeight; -> -> CGSize videoSize = [videoTrack naturalSize]; -> CGAffineTransform txf = [videoTrack preferredTransform]; -> -> if ((txf.tx == videoSize.width && txf.ty == videoSize.height) || (txf.tx == 0 && txf.ty == 0)) { -> // Video recorded in landscape orientation -> videoWidth = videoSize.width; -> videoHeight = videoSize.height; -> } else { -> // Video recorded in portrait orientation, so have to swap reported width/height -> videoWidth = videoSize.height; -> videoHeight = videoSize.width; -> } -> -> NSMutableDictionary *videoInfo = [NSMutableDictionary dictionaryWithDictionary:@{ -> @"duration":[NSNumber numberWithFloat:CMTimeGetSeconds(videoAsAsset.duration)], -> @"width":[NSNumber numberWithFloat:videoWidth], -> @"height":[NSNumber numberWithFloat:videoHeight], -> @"size":[NSNumber numberWithLongLong:captureOutput.recordedFileSize], -> }]; -> -> if (self.videoTarget == RCTCameraCaptureTargetCameraRoll) { -> #if !TARGET_OS_MACCATALYST -> ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; -> if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputFileURL]) { -> [library writeVideoAtPathToSavedPhotosAlbum:outputFileURL -> completionBlock:^(NSURL *assetURL, NSError *error) { -> if (error) { -> self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); -> return; -> } else if (assetURL == nil) { -> //It's possible for writing to camera roll to fail, -> //without receiving an error message, but assetURL will be nil -> //Happens when disk is (almost) full -> self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(@"Not enough storage")); -> return; -> } -> -> [videoInfo setObject:[assetURL absoluteString] forKey:@"path"]; -> self.videoResolve(videoInfo); -> }]; -> } -> -> #endif -> } -> else if (self.videoTarget == RCTCameraCaptureTargetDisk) { -> NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); -> NSString *documentsDirectory = [paths firstObject]; -> NSString *fullPath = [[documentsDirectory stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]] stringByAppendingPathExtension:@"mov"]; -> -> NSFileManager * fileManager = [NSFileManager defaultManager]; -> NSError * error = nil; -> -> //moving to destination -> if (!([fileManager moveItemAtPath:[outputFileURL path] toPath:fullPath error:&error])) { -> self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); -> return; -> } -> [videoInfo setObject:fullPath forKey:@"path"]; -> self.videoResolve(videoInfo); -> } -> else if (self.videoTarget == RCTCameraCaptureTargetTemp) { -> NSString *fileName = [[NSProcessInfo processInfo] globallyUniqueString]; -> NSString *fullPath = [NSString stringWithFormat:@"%@%@.mov", NSTemporaryDirectory(), fileName]; -> -> NSFileManager * fileManager = [NSFileManager defaultManager]; -> NSError * error = nil; -> -> //moving to destination -> if (!([fileManager moveItemAtPath:[outputFileURL path] toPath:fullPath error:&error])) { -> self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); -> return; -> } -> [videoInfo setObject:fullPath forKey:@"path"]; -> self.videoResolve(videoInfo); -> } -> else { -> self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(@"Target not supported")); -> } -979,996c986,1008 -< -< for (AVMetadataMachineReadableCodeObject *metadata in metadataObjects) { -< for (id barcodeType in self.barCodeTypes) { -< if ([metadata.type isEqualToString:barcodeType] && metadata.stringValue) { -< // Transform the meta-data coordinates to screen coords -< AVMetadataMachineReadableCodeObject *transformed = (AVMetadataMachineReadableCodeObject *)[_previewLayer transformedMetadataObjectForMetadataObject:metadata]; -< -< NSDictionary *event = @{ -< @"type": metadata.type, -< @"data": metadata.stringValue, -< @"bounds": @{ -< @"origin": @{ -< @"x": [NSString stringWithFormat:@"%f", transformed.bounds.origin.x], -< @"y": [NSString stringWithFormat:@"%f", transformed.bounds.origin.y] -< }, -< @"size": @{ -< @"height": [NSString stringWithFormat:@"%f", transformed.bounds.size.height], -< @"width": [NSString stringWithFormat:@"%f", transformed.bounds.size.width], ---- -> -> for (AVMetadataMachineReadableCodeObject *metadata in metadataObjects) { -> for (id barcodeType in self.barCodeTypes) { -> if ([metadata.type isEqualToString:barcodeType] && metadata.stringValue) { -> // Transform the meta-data coordinates to screen coords -> AVMetadataMachineReadableCodeObject *transformed = (AVMetadataMachineReadableCodeObject *)[_previewLayer transformedMetadataObjectForMetadataObject:metadata]; -> -> NSDictionary *event = @{ -> @"type": metadata.type, -> @"data": metadata.stringValue, -> @"bounds": @{ -> @"origin": @{ -> @"x": [NSString stringWithFormat:@"%f", transformed.bounds.origin.x], -> @"y": [NSString stringWithFormat:@"%f", transformed.bounds.origin.y] -> }, -> @"size": @{ -> @"height": [NSString stringWithFormat:@"%f", transformed.bounds.size.height], -> @"width": [NSString stringWithFormat:@"%f", transformed.bounds.size.width], -> } -> } -> }; -> -> [self.bridge.eventDispatcher sendAppEventWithName:@"CameraBarCodeRead" body:event]; -998,1002c1010 -< } -< }; -< -< [self.bridge.eventDispatcher sendAppEventWithName:@"CameraBarCodeRead" body:event]; -< } ---- -> } -1004d1011 -< } -1010,1015c1017,1020 -< NSArray *devices = [AVCaptureDevice devicesWithMediaType:mediaType]; -< AVCaptureDevice *captureDevice = [devices firstObject]; -< -< for (AVCaptureDevice *device in devices) -< { -< if ([device position] == position) ---- -> NSArray *devices = [AVCaptureDevice devicesWithMediaType:mediaType]; -> AVCaptureDevice *captureDevice = [devices firstObject]; -> -> for (AVCaptureDevice *device in devices) -1017,1018c1022,1026 -< captureDevice = device; -< break; ---- -> if ([device position] == position) -> { -> captureDevice = device; -> break; -> } -1020,1022c1028,1029 -< } -< -< return captureDevice; ---- -> -> return captureDevice; -1027,1028c1034,1044 -< CGPoint devicePoint = CGPointMake(.5, .5); -< [self focusWithMode:AVCaptureFocusModeContinuousAutoFocus exposeWithMode:AVCaptureExposureModeContinuousAutoExposure atDevicePoint:devicePoint monitorSubjectAreaChange:NO]; ---- -> CGPoint devicePoint = CGPointMake(.5, .5); -> [self focusWithMode:AVCaptureFocusModeContinuousAutoFocus exposeWithMode:AVCaptureExposureModeContinuousAutoExposure atDevicePoint:devicePoint monitorSubjectAreaChange:NO]; -> -> if (self.camera.camFocus) -> { -> [self.camera.camFocus removeFromSuperview]; -> } -> self.camera.camFocus = [[RCTCameraFocusSquare alloc]initWithFrame:CGRectMake([self.view center].x-80, [self.view center].y-80, 160, 160)]; -> [self.camera.camFocus setBackgroundColor:[UIColor clearColor]]; -> [self.view addSubview:self.camera.camFocus]; -> [self.camera.camFocus setNeedsDisplay]; -1030,1042c1046,1049 -< if (self.camera.camFocus) -< { -< [self.camera.camFocus removeFromSuperview]; -< } -< self.camera.camFocus = [[RCTCameraFocusSquare alloc]initWithFrame:CGRectMake([self.view center].x-80, [self.view center].y-80, 160, 160)]; -< [self.camera.camFocus setBackgroundColor:[UIColor clearColor]]; -< [self.view addSubview:self.camera.camFocus]; -< [self.camera.camFocus setNeedsDisplay]; -< -< [UIView beginAnimations:nil context:NULL]; -< [UIView setAnimationDuration:1.0]; -< [self.camera.camFocus setAlpha:0.0]; -< [UIView commitAnimations]; ---- -> [UIView beginAnimations:nil context:NULL]; -> [UIView setAnimationDuration:1.0]; -> [self.camera.camFocus setAlpha:0.0]; -> [UIView commitAnimations]; -1047,1069c1054,1076 -< dispatch_async([self sessionQueue], ^{ -< AVCaptureDevice *device = [[self videoCaptureDeviceInput] device]; -< NSError *error = nil; -< if ([device lockForConfiguration:&error]) -< { -< if ([device isFocusPointOfInterestSupported] && [device isFocusModeSupported:focusMode]) -< { -< [device setFocusMode:focusMode]; -< [device setFocusPointOfInterest:point]; -< } -< if ([device isExposurePointOfInterestSupported] && [device isExposureModeSupported:exposureMode]) -< { -< [device setExposureMode:exposureMode]; -< [device setExposurePointOfInterest:point]; -< } -< [device setSubjectAreaChangeMonitoringEnabled:monitorSubjectAreaChange]; -< [device unlockForConfiguration]; -< } -< else -< { -< NSLog(@"%@", error); -< } -< }); ---- -> dispatch_async([self sessionQueue], ^{ -> AVCaptureDevice *device = [[self videoCaptureDeviceInput] device]; -> NSError *error = nil; -> if ([device lockForConfiguration:&error]) -> { -> if ([device isFocusPointOfInterestSupported] && [device isFocusModeSupported:focusMode]) -> { -> [device setFocusMode:focusMode]; -> [device setFocusPointOfInterest:point]; -> } -> if ([device isExposurePointOfInterestSupported] && [device isExposureModeSupported:exposureMode]) -> { -> [device setExposureMode:exposureMode]; -> [device setExposurePointOfInterest:point]; -> } -> [device setSubjectAreaChangeMonitoringEnabled:monitorSubjectAreaChange]; -> [device unlockForConfiguration]; -> } -> else -> { -> NSLog(@"%@", error); -> } -> }); -1115c1122 -< ---- -> -1117,1119c1124,1126 -< @"target": reactTag, -< @"zoomFactor": [NSNumber numberWithDouble:zoomFactor], -< @"velocity": [NSNumber numberWithDouble:velocity] ---- -> @"target": reactTag, -> @"zoomFactor": [NSNumber numberWithDouble:zoomFactor], -> @"velocity": [NSNumber numberWithDouble:velocity] -1121c1128 -< ---- -> -1123c1130 -< ---- -> -1133,1145c1140,1152 -< #if !(TARGET_IPHONE_SIMULATOR) -< if (quality) { -< dispatch_async([self sessionQueue], ^{ -< [self.session beginConfiguration]; -< if ([self.session canSetSessionPreset:quality]) { -< self.session.sessionPreset = quality; -< } else { -< self.session.sessionPreset = AVCaptureSessionPresetHigh; -< } -< [self.session commitConfiguration]; -< }); -< } -< #endif ---- -> #if !(TARGET_IPHONE_SIMULATOR) -> if (quality) { -> dispatch_async([self sessionQueue], ^{ -> [self.session beginConfiguration]; -> if ([self.session canSetSessionPreset:quality]) { -> self.session.sessionPreset = quality; -> } else { -> self.session.sessionPreset = AVCaptureSessionPresetHigh; -> } -> [self.session commitConfiguration]; -> }); -> } -> #endif diff --git a/scripts/maccatalystpatches/RNCamera.patch b/scripts/maccatalystpatches/RNCamera.patch deleted file mode 100644 index 046783b02..000000000 --- a/scripts/maccatalystpatches/RNCamera.patch +++ /dev/null @@ -1,37 +0,0 @@ ---- RNCamera.m 1985-10-26 04:15:00.000000000 -0400 -+++ RNCamera.m 2020-11-15 20:37:09.000000000 -0500 -@@ -603,7 +603,7 @@ - if (self.whiteBalance != RNCameraWhiteBalanceAuto) { - RCTLogWarn(@"%s: locked whitebalance mode ist note supported. Fallback to continuous auto white balance mode", __func__); - } -- [device setWhiteBalanceMode:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance]; -+// [device setWhiteBalanceMode:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance]; - } else { - AVCaptureWhiteBalanceTemperatureAndTintValues temperatureAndTint = { - .temperature = [RNCameraUtils temperatureForWhiteBalance:self.whiteBalance], -@@ -626,7 +626,7 @@ - [self lockDevice:device andApplySettings:^{ - if (![device isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked]) { - RCTLogWarn(@"%s: locked whitebalance mode ist note supported. Fallback to continuous auto white balance mode", __func__); -- [device setWhiteBalanceMode:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance]; -+// [device setWhiteBalanceMode:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance]; - } else { - AVCaptureWhiteBalanceTemperatureAndTintValues temperatureAndTint = { - .temperature = self.customWhiteBalanceSettings.temperature, -@@ -1282,7 +1282,7 @@ - return; - } - -- -+ #if !TARGET_OS_MACCATALYST - AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; - if ([self.session canAddOutput:stillImageOutput]) { - stillImageOutput.outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG}; -@@ -1291,6 +1291,7 @@ - self.stillImageOutput = stillImageOutput; - } - -+#endif - // If AVCaptureVideoDataOutput is not required because of Google Vision - // (see comment in -record), we go ahead and add the AVCaptureMovieFileOutput - // to avoid an exposure rack on some devices that can cause the first few diff --git a/scripts/maccatalystpatches/packagejson.patch b/scripts/maccatalystpatches/packagejson.patch deleted file mode 100644 index 242e85590..000000000 --- a/scripts/maccatalystpatches/packagejson.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- package.json 2021-02-10 11:32:15.000000000 -0500 -+++ packagep.json 2021-02-10 22:18:55.000000000 -0500 -@@ -166,7 +166,7 @@ - "react-native-widget-center": "git+https://github.com/BlueWallet/react-native-widget-center.git#e2e9a9038b76d096bf929a87105a97a0a7095001", - "react-test-render": "1.1.2", - "readable-stream": "3.6.0", -- "realm": "10.2.0", -+ "realm": "6.1.0", - "rn-nodeify": "10.2.0", - "scryptsy": "file:blue_modules/scryptsy", - "secure-random": "1.1.2", diff --git a/scripts/maccatalystpatches/podfile.patch b/scripts/maccatalystpatches/podfile.patch deleted file mode 100644 index 59e7ef81f..000000000 --- a/scripts/maccatalystpatches/podfile.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- Podfile 2021-02-10 22:20:26.000000000 -0500 -+++ Podfilep 2021-02-10 22:20:56.000000000 -0500 -@@ -12,9 +12,7 @@ - # - # Note that if you have use_frameworks! enabled, Flipper will not work and - # you should disable these next few lines. -- use_flipper!({ 'Flipper' => '0.74.0' }) - post_install do |installer| -- flipper_post_install(installer) - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '10.0' -@@ -28,16 +26,4 @@ - end - - --end -- --target 'MarketWidgetExtension' do -- pod 'SwiftSocket', :git => 'https://github.com/swiftsocket/SwiftSocket.git', :branch => 'master' --end -- --target 'WalletInformationAndMarketWidgetExtension' do -- pod 'SwiftSocket', :git => 'https://github.com/swiftsocket/SwiftSocket.git', :branch => 'master' --end -- --target 'WalletInformationWidgetExtension' do -- pod 'SwiftSocket', :git => 'https://github.com/swiftsocket/SwiftSocket.git', :branch => 'master' --end -+end -\ No newline at end of file diff --git a/scripts/maccatalystpatches/realm.patch b/scripts/maccatalystpatches/realm.patch deleted file mode 100644 index 316792206..000000000 --- a/scripts/maccatalystpatches/realm.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- RealmJS1.podspec 2020-11-19 00:21:10.000000000 -0500 -+++ RealmJS.podspec 2020-11-19 00:21:38.000000000 -0500 -@@ -94,7 +94,7 @@ - } - - # TODO: Consider providing an option to build with the -dbg binaries instead -- s.ios.vendored_libraries = 'vendor/realm-ios/librealm-ios.a', 'vendor/realm-ios/librealm-parser-ios.a' -+ s.ios.vendored_libraries = 'vendor/realm-ios/librealm-maccatalyst.a', 'vendor/realm-ios/librealm-parser-maccatalyst.a' - # s.watchos.vendored_libraries = 'vendor/realm-ios/librealm-watchos.a', 'vendor/realm-ios/librealm-parser-watchos.a' - # s.tvos.vendored_libraries = 'vendor/realm-ios/librealm-tvos.a', 'vendor/realm-ios/librealm-parser-tvos.a' - From 872b8f4e3c6cc7c1ea3bef961c56a19aba2dd5e1 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Fri, 9 Jul 2021 11:29:11 +0100 Subject: [PATCH 207/327] REL: ver bump to 6.1.9 --- android/app/build.gradle | 2 +- ios/BlueWallet.xcodeproj/project.pbxproj | 24 ++++++++++++------------ package-lock.json | 2 +- package.json | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 216b75fc0..49cda46f8 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -139,7 +139,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 - versionName "6.1.8" + versionName "6.1.9" multiDexEnabled true missingDimensionStrategy 'react-native-camera', 'general' testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index 054af6242..369d4dbce 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -1344,7 +1344,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.8; + MARKETING_VERSION = 6.1.9; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1388,7 +1388,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.8; + MARKETING_VERSION = 6.1.9; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1429,7 +1429,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.8; + MARKETING_VERSION = 6.1.9; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; @@ -1468,7 +1468,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.8; + MARKETING_VERSION = 6.1.9; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; PRODUCT_NAME = "BlueWallet - Bitcoin Price"; @@ -1500,7 +1500,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.8; + MARKETING_VERSION = 6.1.9; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; @@ -1532,7 +1532,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.8; + MARKETING_VERSION = 6.1.9; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1570,7 +1570,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.8; + MARKETING_VERSION = 6.1.9; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; @@ -1615,7 +1615,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.8; + MARKETING_VERSION = 6.1.9; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1760,7 +1760,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.8; + MARKETING_VERSION = 6.1.9; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; @@ -1800,7 +1800,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.8; + MARKETING_VERSION = 6.1.9; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -1836,7 +1836,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.8; + MARKETING_VERSION = 6.1.9; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; @@ -1875,7 +1875,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.8; + MARKETING_VERSION = 6.1.9; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/package-lock.json b/package-lock.json index 75c0fedf5..e7b87ff1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.8", + "version": "6.1.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6a2f40526..5ba903b14 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.8", + "version": "6.1.9", "license": "MIT", "repository": { "type": "git", From 5a33c90e3ff5cbdbd01f58c901f538e8a6aebea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Fri, 9 Jul 2021 22:20:53 -0400 Subject: [PATCH 208/327] Revert "Merge pull request #3111 from BlueWallet/fix-3089" This reverts commit 68d8e2145220e1b78885acbf4a57f4c2ecd4d0b4, reversing changes made to 53dde542e7faa2b3ba315f5d056c30ff7286a00f. --- android/app/src/main/AndroidManifest.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d03d243b9..91cc9df31 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -5,8 +5,7 @@ - + From 7b2f27b1e2124c3d37373ffee24d60f40a1f5b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Fri, 9 Jul 2021 22:38:09 -0400 Subject: [PATCH 209/327] ADD: Offer additional file save destinations on Android #3356 --- blue_modules/fs.js | 90 ++++++++++++++++++--------- loc/en.json | 6 +- screen/send/psbtWithHardwareWallet.js | 54 +--------------- 3 files changed, 69 insertions(+), 81 deletions(-) diff --git a/blue_modules/fs.js b/blue_modules/fs.js index 41d12f14d..5eee3168e 100644 --- a/blue_modules/fs.js +++ b/blue_modules/fs.js @@ -11,6 +11,38 @@ import ActionSheet from '../screen/ActionSheet'; import BlueClipboard from './clipboard'; const LocalQRCode = require('@remobile/react-native-qrcode-local-image'); +const writeFileAndExportToAndroidDestionation = async ({ filename, contents, destinationLocalizedString, destination }) => { + const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE, { + title: loc.send.permission_storage_title, + message: loc.send.permission_storage_message, + buttonNeutral: loc.send.permission_storage_later, + buttonNegative: loc._.cancel, + buttonPositive: loc._.ok, + }); + if (granted === PermissionsAndroid.RESULTS.GRANTED) { + const filePath = destination + `/${filename}`; + try { + await RNFS.writeFile(filePath, contents); + alert(loc.formatString(loc._.file_saved, { filePath: filename, destination: destinationLocalizedString })); + } catch (e) { + console.log(e); + alert(e.message); + } + } else { + console.log('Storage Permission: Denied'); + Alert.alert(loc.send.permission_storage_title, loc.send.permission_storage_denied_message, [ + { + text: loc.send.open_settings, + onPress: () => { + Linking.openSettings(); + }, + style: 'default', + }, + { text: loc._.cancel, onPress: () => {}, style: 'cancel' }, + ]); + } +}; + const writeFileAndExport = async function (filename, contents) { if (Platform.OS === 'ios') { const filePath = RNFS.TemporaryDirectoryPath + `/${filename}`; @@ -26,37 +58,37 @@ const writeFileAndExport = async function (filename, contents) { RNFS.unlink(filePath); }); } else if (Platform.OS === 'android') { - const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE, { - title: loc.send.permission_storage_title, - message: loc.send.permission_storage_message, - buttonNeutral: loc.send.permission_storage_later, - buttonNegative: loc._.cancel, - buttonPositive: loc._.ok, - }); + Alert.alert( + loc._.file_save_title, - if (granted === PermissionsAndroid.RESULTS.GRANTED) { - console.log('Storage Permission: Granted'); - const filePath = RNFS.DownloadDirectoryPath + `/${filename}`; - try { - await RNFS.writeFile(filePath, contents); - alert(loc.formatString(loc._.file_saved, { filePath: filename })); - } catch (e) { - console.log(e); - alert(e.message); - } - } else { - console.log('Storage Permission: Denied'); - Alert.alert(loc.send.permission_storage_title, loc.send.permission_storage_denied_message, [ - { - text: loc.send.open_settings, - onPress: () => { - Linking.openSettings(); - }, - style: 'default', - }, + loc.formatString(loc._.file_save_location, { filePath: filename }), + [ { text: loc._.cancel, onPress: () => {}, style: 'cancel' }, - ]); - } + { + text: loc._.downloads_folder, + onPress: () => { + writeFileAndExportToAndroidDestionation({ + filename, + contents, + destinationLocalizedString: loc._.downloads_folder, + destination: RNFS.DownloadDirectoryPath, + }); + }, + }, + { + text: loc._.external_storage, + onPress: async () => { + writeFileAndExportToAndroidDestionation({ + filename, + contents, + destination: RNFS.ExternalStorageDirectoryPath, + destinationLocalizedString: loc._.external_storage, + }); + }, + }, + ], + { cancelable: true }, + ); } }; diff --git a/loc/en.json b/loc/en.json index 45b26207c..2a9adcb9e 100644 --- a/loc/en.json +++ b/loc/en.json @@ -17,7 +17,11 @@ "success": "Success", "wallet_key": "Wallet key", "invalid_animated_qr_code_fragment" : "Invalid animated QRCode fragment. Please try again.", - "file_saved": "File ({filePath}) has been saved in your Downloads folder.", + "file_saved": "File {filePath} has been saved in your {destination}.", + "file_save_title": "Save File", + "file_save_location": "Select where to save {filePath}", + "downloads_folder": "Downloads Folder", + "external_storage": "External Storage", "discard_changes": "Discard changes?", "discard_changes_detail": "You have unsaved changes. Are you sure to discard them and leave the screen?" }, diff --git a/screen/send/psbtWithHardwareWallet.js b/screen/send/psbtWithHardwareWallet.js index e1b454da5..fc0597dca 100644 --- a/screen/send/psbtWithHardwareWallet.js +++ b/screen/send/psbtWithHardwareWallet.js @@ -8,18 +8,15 @@ import { TextInput, Linking, Platform, - PermissionsAndroid, Text, StyleSheet, - Alert, findNodeHandle, } from 'react-native'; import Clipboard from '@react-native-clipboard/clipboard'; -import Share from 'react-native-share'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; import DocumentPicker from 'react-native-document-picker'; import { useNavigation, useRoute, useTheme } from '@react-navigation/native'; -import { isDesktop, isMacCatalina } from '../../blue_modules/environment'; +import { isMacCatalina } from '../../blue_modules/environment'; import RNFS from 'react-native-fs'; import Biometric from '../../class/biometrics'; @@ -181,54 +178,9 @@ const PsbtWithHardwareWallet = () => { ); }; - const exportPSBT = async () => { + const exportPSBT = () => { const fileName = `${Date.now()}.psbt`; - if (Platform.OS === 'ios') { - const filePath = RNFS.TemporaryDirectoryPath + `/${fileName}`; - await RNFS.writeFile(filePath, typeof psbt === 'string' ? psbt : psbt.toBase64()); - Share.open({ - url: 'file://' + filePath, - saveToFiles: isDesktop, - }) - .catch(error => { - console.log(error); - }) - .finally(() => { - RNFS.unlink(filePath); - }); - } else if (Platform.OS === 'android') { - const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE, { - title: loc.send.permission_storage_title, - message: loc.send.permission_storage_message, - buttonNeutral: loc.send.permission_storage_later, - buttonNegative: loc._.cancel, - buttonPositive: loc._.ok, - }); - - if (granted === PermissionsAndroid.RESULTS.GRANTED) { - console.log('Storage Permission: Granted'); - const filePath = RNFS.DownloadDirectoryPath + `/${fileName}`; - try { - await RNFS.writeFile(filePath, typeof psbt === 'string' ? psbt : psbt.toBase64()); - alert(loc.formatString(loc.send.txSaved, { filePath: fileName })); - } catch (e) { - console.log(e); - alert(e.message); - } - } else { - console.log('Storage Permission: Denied'); - Alert.alert(loc.send.permission_storage_title, loc.send.permission_storage_denied_message, [ - { - text: loc.send.open_settings, - onPress: () => { - Linking.openSettings(); - }, - style: 'default', - }, - { text: loc._.cancel, onPress: () => {}, style: 'cancel' }, - ]); - } - } + fs.writeFileAndExport(fileName, typeof psbt === 'string' ? psbt : psbt.toBase64()); }; const openSignedTransaction = async () => { From 7526c826699624d093155cbef8e7c1d4565379e5 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Fri, 9 Jul 2021 11:52:09 +0100 Subject: [PATCH 210/327] ADD: support for URv2 QR codes --- BlueComponents.js | 2 +- blue_modules/ur/index.js | 228 ++++++++++++++++++++ class/multisig-cosigner.js | 59 +++++ class/wallets/multisig-hd-wallet.js | 2 +- components/DynamicQRCode.js | 2 +- package-lock.json | 68 +++++- package.json | 3 +- screen/send/ScanQRCode.js | 49 ++++- screen/settings/GeneralSettings.js | 13 ++ screen/wallets/addMultisigStep2.js | 8 +- screen/wallets/viewEditMultisigCosigners.js | 8 +- tests/unit/multisig-hd-wallet.test.js | 81 ++++++- tests/unit/watch-only-wallet.test.js | 135 +++++++++++- 13 files changed, 642 insertions(+), 16 deletions(-) create mode 100644 blue_modules/ur/index.js diff --git a/BlueComponents.js b/BlueComponents.js index abb2ec26e..0c816dbe1 100644 --- a/BlueComponents.js +++ b/BlueComponents.js @@ -34,7 +34,7 @@ import WalletGradient from './class/wallet-gradient'; import { BlurView } from '@react-native-community/blur'; import NetworkTransactionFees, { NetworkTransactionFee, NetworkTransactionFeeType } from './models/networkTransactionFees'; import Biometric from './class/biometrics'; -import { encodeUR } from 'bc-ur/dist'; +import { encodeUR } from './blue_modules/ur'; import QRCode from 'react-native-qrcode-svg'; import AsyncStorage from '@react-native-async-storage/async-storage'; import { useNavigation, useTheme } from '@react-navigation/native'; diff --git a/blue_modules/ur/index.js b/blue_modules/ur/index.js new file mode 100644 index 000000000..28b73a626 --- /dev/null +++ b/blue_modules/ur/index.js @@ -0,0 +1,228 @@ +import { URDecoder } from '@ngraveio/bc-ur'; +import b58 from 'bs58check'; +import { + CryptoHDKey, + CryptoKeypath, + CryptoOutput, + PathComponent, + ScriptExpressions, + CryptoPSBT, + CryptoAccount, + Bytes, +} from '@keystonehq/bc-ur-registry'; +import { decodeUR as origDecodeUr, encodeUR as origEncodeUR, extractSingleWorkload as origExtractSingleWorkload } from '../bc-ur/dist'; +import { MultisigCosigner, MultisigHDWallet } from '../../class'; +import { Psbt } from 'bitcoinjs-lib'; +import AsyncStorage from '@react-native-async-storage/async-storage'; + +const USE_UR_V1 = 'USE_UR_V1'; + +let useURv1 = false; + +(async () => { + try { + useURv1 = !!(await AsyncStorage.getItem(USE_UR_V1)); + } catch (_) {} +})(); + +async function isURv1Enabled() { + try { + return !!(await AsyncStorage.getItem(USE_UR_V1)); + } catch (_) {} + + return false; +} + +async function setUseURv1() { + useURv1 = true; + return AsyncStorage.setItem(USE_UR_V1, '1'); +} + +async function clearUseURv1() { + useURv1 = false; + return AsyncStorage.removeItem(USE_UR_V1); +} + +function encodeUR(arg1, arg2) { + return useURv1 ? encodeURv1(arg1, arg2) : encodeURv2(arg1, arg2); +} + +function encodeURv1(arg1, arg2) { + // first, lets check that its not a cosigner's json, which we do NOT encode at all: + try { + const json = JSON.parse(arg1); + if (json && json.xpub && json.path && json.xfp) return [arg1]; + } catch (_) {} + + return origEncodeUR(arg1, arg2); +} + +/** + * + * @param str {string} For PSBT, or coordination setup (translates to `bytes`) it expects hex string. For ms cosigner it expects plain json string + * @param len {number} lenght of each fragment + * @return {string[]} txt fragments ready to be displayed in dynamic QR + */ +function encodeURv2(str, len) { + // now, lets do some intelligent guessing what we've got here, psbt hex, or json with a multisig cosigner..? + + try { + const cosigner = new MultisigCosigner(str); + + if (cosigner.isValid()) { + let scriptExpressions = false; + + if (cosigner.isNativeSegwit()) { + scriptExpressions = [ScriptExpressions.WITNESS_SCRIPT_HASH]; + } else if (cosigner.isWrappedSegwit()) { + scriptExpressions = [ScriptExpressions.SCRIPT_HASH, ScriptExpressions.WITNESS_SCRIPT_HASH]; + } else if (cosigner.isLegacy()) { + scriptExpressions = [ScriptExpressions.SCRIPT_HASH]; + } else { + return ['unsupported multisig type']; + } + + const cryptoKeyPathComponents = []; + for (const component of cosigner.getPath().split('/')) { + if (component === 'm') continue; + const index = parseInt(component); + const hardened = component.endsWith('h') || component.endsWith("'"); + cryptoKeyPathComponents.push(new PathComponent({ index, hardened })); + } + + const cryptoAccount = new CryptoAccount(Buffer.from(cosigner.getFp(), 'hex'), [ + new CryptoOutput( + scriptExpressions, + new CryptoHDKey({ + isMaster: false, + key: Buffer.from(cosigner.getKeyHex(), 'hex'), + chainCode: Buffer.from(cosigner.getChainCodeHex(), 'hex'), + origin: new CryptoKeypath( + cryptoKeyPathComponents, + Buffer.from(cosigner.getFp(), 'hex'), + cosigner.getDepthNumber(), + ), + parentFingerprint: Buffer.from(cosigner.getParentFingerprintHex(), 'hex'), + }), + ), + ]); + const ur = cryptoAccount.toUREncoder(2000).nextPart(); + return [ur]; + } + } catch (_) {} + + // not account. lets try psbt + + try { + Psbt.fromHex(str); // will throw if not PSBT hex + const data = Buffer.from(str, 'hex'); + const cryptoPSBT = new CryptoPSBT(data); + const encoder = cryptoPSBT.toUREncoder(len); + + const ret = []; + for (let c = 1; c <= encoder.fragmentsLength; c++) { + const ur = encoder.nextPart(); + ret.push(ur); + } + + return ret; + } catch (_) {} + + // fail. fallback to bytes + + const bytes = new Bytes(Buffer.from(str, 'hex')); + const encoder = bytes.toUREncoder(len); + + const ret = []; + for (let c = 1; c <= encoder.fragmentsLength; c++) { + const ur = encoder.nextPart(); + ret.push(ur); + } + + return ret; +} + +function extractSingleWorkload(arg) { + return origExtractSingleWorkload(arg); +} + +function decodeUR(arg) { + try { + return origDecodeUr(arg); + } catch (_) {} + + const decoder = new URDecoder(); + + for (const part of arg) { + decoder.receivePart(part); + } + + if (!decoder.isSuccess()) { + throw new Error(decoder.resultError()); + } + + const decoded = decoder.resultUR(); + + if (decoded.type === 'crypto-psbt') { + const cryptoPsbt = CryptoPSBT.fromCBOR(decoded.cbor); + return cryptoPsbt.getPSBT().toString('hex'); + } + + if (decoded.type === 'bytes') { + const b = Bytes.fromCBOR(decoded.cbor); + return b.getData(); + } + + const cryptoAccount = CryptoAccount.fromCBOR(decoded.cbor); + + // now, crafting zpub out of data we have + const hdKey = cryptoAccount.outputDescriptors[0].getCryptoKey(); + const derivationPath = 'm/' + hdKey.getOrigin().getPath(); + const script = cryptoAccount.outputDescriptors[0].getScriptExpressions()[0].getExpression(); + const isMultisig = + script === ScriptExpressions.WITNESS_SCRIPT_HASH.getExpression() || + // fallback to paths (unreliable). + // dont know how to add ms p2sh (legacy) or p2sh-p2wsh (wrapped segwit) atm + derivationPath === MultisigHDWallet.PATH_LEGACY || + derivationPath === MultisigHDWallet.PATH_WRAPPED_SEGWIT || + derivationPath === MultisigHDWallet.PATH_NATIVE_SEGWIT; + const version = Buffer.from(isMultisig ? '02aa7ed3' : '04b24746', 'hex'); + const parentFingerprint = hdKey.getParentFingerprint(); + const depth = hdKey.getOrigin().getDepth(); + const depthBuf = Buffer.alloc(1); + depthBuf.writeUInt8(depth); + const components = hdKey.getOrigin().getComponents(); + const lastComponents = components[components.length - 1]; + const index = lastComponents.isHardened() ? lastComponents.getIndex() + 0x80000000 : lastComponents.getIndex(); + const indexBuf = Buffer.alloc(4); + indexBuf.writeUInt32BE(index); + const chainCode = hdKey.getChainCode(); + const key = hdKey.getKey(); + const data = Buffer.concat([version, depthBuf, parentFingerprint, indexBuf, chainCode, key]); + + const zpub = b58.encode(data); + + const result = {}; + result.ExtPubKey = zpub; + result.MasterFingerprint = cryptoAccount.getMasterFingerprint().toString('hex').toUpperCase(); + result.AccountKeyPath = derivationPath; + + const str = JSON.stringify(result); + return Buffer.from(str, 'ascii').toString('hex'); // we are expected to return hex-encoded string +} + +class BlueURDecoder extends URDecoder { + toString() { + const decoded = this.resultUR(); + + if (decoded.type === 'crypto-psbt') { + const cryptoPsbt = CryptoPSBT.fromCBOR(decoded.cbor); + return cryptoPsbt.getPSBT().toString('base64'); + } else if (decoded.type === 'bytes') { + const bytes = Bytes.fromCBOR(decoded.cbor); + return Buffer.from(bytes.getData(), 'hex').toString('ascii'); + } + } +} + +export { decodeUR, encodeUR, extractSingleWorkload, BlueURDecoder, isURv1Enabled, setUseURv1, clearUseURv1 }; diff --git a/class/multisig-cosigner.js b/class/multisig-cosigner.js index 6cab04f26..81a62f4ff 100644 --- a/class/multisig-cosigner.js +++ b/class/multisig-cosigner.js @@ -69,6 +69,21 @@ export class MultisigCosigner { this._valid = false; } + // is it cobo crypto-account URv2 ? + try { + const json = JSON.parse(data); + if (json && json.ExtPubKey && json.MasterFingerprint && json.AccountKeyPath) { + this._fp = json.MasterFingerprint; + this._xpub = json.ExtPubKey; + this._path = json.AccountKeyPath; + this._cosigners = [true]; + this._valid = true; + return; + } + } catch (_) { + this._valid = false; + } + // is it coldcard json? try { const json = JSON.parse(data); @@ -149,4 +164,48 @@ export class MultisigCosigner { getAllCosigners() { return this._cosigners; } + + isNativeSegwit() { + return this.getXpub().startsWith('Zpub'); + } + + isWrappedSegwit() { + return this.getXpub().startsWith('Ypub'); + } + + isLegacy() { + return this.getXpub().startsWith('xpub'); + } + + getChainCodeHex() { + let data = b58.decode(this.getXpub()); + data = data.slice(4); + data = data.slice(1); + data = data.slice(4); + data = data.slice(4, 36); + return data.toString('hex'); + } + + getKeyHex() { + let data = b58.decode(this.getXpub()); + data = data.slice(4); + data = data.slice(1); + data = data.slice(4); + data = data.slice(36); + return data.toString('hex'); + } + + getParentFingerprintHex() { + let data = b58.decode(this.getXpub()); + data = data.slice(4); + data = data.slice(1); + data = data.slice(0, 4); + return data.toString('hex'); + } + + getDepthNumber() { + let data = b58.decode(this.getXpub()); + data = data.slice(4, 5); + return data.readInt8(); + } } diff --git a/class/wallets/multisig-hd-wallet.js b/class/wallets/multisig-hd-wallet.js index b42a9a3b3..1baae76b9 100644 --- a/class/wallets/multisig-hd-wallet.js +++ b/class/wallets/multisig-hd-wallet.js @@ -1,7 +1,7 @@ import { AbstractHDElectrumWallet } from './abstract-hd-electrum-wallet'; import * as bip39 from 'bip39'; import b58 from 'bs58check'; -import { decodeUR } from 'bc-ur'; +import { decodeUR } from '../../blue_modules/ur'; const BlueElectrum = require('../../blue_modules/BlueElectrum'); const HDNode = require('bip32'); const bitcoin = require('bitcoinjs-lib'); diff --git a/components/DynamicQRCode.js b/components/DynamicQRCode.js index 8e277b3e1..3aa3f1cf0 100644 --- a/components/DynamicQRCode.js +++ b/components/DynamicQRCode.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import { Text } from 'react-native-elements'; import { Dimensions, LayoutAnimation, StyleSheet, TouchableOpacity, View } from 'react-native'; -import { encodeUR } from 'bc-ur/dist'; +import { encodeUR } from '../blue_modules/ur'; import QRCode from 'react-native-qrcode-svg'; import { BlueCurrentTheme } from '../components/themes'; import { BlueSpacing20 } from '../BlueComponents'; diff --git a/package-lock.json b/package-lock.json index c3486d38e..8c7d91df6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,11 @@ "tslib": "^1.9.3" } }, + "@apocentre/alias-sampling": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@apocentre/alias-sampling/-/alias-sampling-0.5.3.tgz", + "integrity": "sha512-7UDWIIF9hIeJqfKXkNIzkVandlwLf1FWTSdrb9iXvOP8oF544JRXQjCbiTmCv2c9n44n/FIWtehhBfNuAx2CZA==" + }, "@babel/code-frame": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", @@ -2919,6 +2924,41 @@ } } }, + "@keystonehq/bc-ur-registry": { + "version": "git+https://github.com/BlueWallet/ur-registry.git#8e80466920d0cde4c06b112ad126c311bcdd3384", + "from": "git+https://github.com/BlueWallet/ur-registry.git", + "requires": { + "@ngraveio/bc-ur": "git+https://github.com/BlueWallet/bc-ur.git", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@ngraveio/bc-ur": { + "version": "git+https://github.com/BlueWallet/bc-ur.git#5514e3ddb7e7dafb123471818d0e516048d8a90e", + "from": "git+https://github.com/BlueWallet/bc-ur.git", + "requires": { + "@apocentre/alias-sampling": "^0.5.3", + "assert": "^2.0.0", + "bignumber.js": "^9.0.1", + "cbor-sync": "^1.0.4", + "crc": "^3.8.0", + "jsbi": "^3.1.5", + "sha.js": "^2.4.11" + }, + "dependencies": { + "jsbi": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.1.5.tgz", + "integrity": "sha512-w2BY0VOYC1ahe+w6Qhl4SFoPvPsZ9NPHY4bwass+LCgU7RK3PBoVQlQ3G1s7vI8W3CYyJiEXcbKF7FIM/L8q3Q==" + } + } + }, "@react-native-async-storage/async-storage": { "version": "1.15.5", "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.15.5.tgz", @@ -5407,10 +5447,6 @@ "version": "file:blue_modules/bc-bech32", "integrity": "sha512-lwAn5R4LUhcnyrZgNx3YdDPr5+nseM4kARANcv8i0YOMtnPJRTF7B7TZzS3DYgC6tff/aR2W/3jGoY/SJMs6MA==" }, - "bc-ur": { - "version": "file:blue_modules/bc-ur", - "integrity": "sha512-k5jZLNgiCMQH5d/4lwsa6DJjH12vzdTEr9qVH1y9UPzJW32Ga1u8iC0KDAqtYnkvh8NR4DW8Fco6D2hphHZLzg==" - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -6006,6 +6042,11 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "cbor-sync": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cbor-sync/-/cbor-sync-1.0.4.tgz", + "integrity": "sha512-GWlXN4wiz0vdWWXBU71Dvc1q3aBo0HytqwAZnXF1wOwjqNnDWA1vZ1gDMFLlqohak31VQzmhiYfiCX5QSSfagA==" + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -6592,6 +6633,25 @@ "parse-json": "^4.0.0" } }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "requires": { + "buffer": "^5.1.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, "create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", diff --git a/package.json b/package.json index bcb409e98..e6f10f94b 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,8 @@ }, "dependencies": { "@babel/preset-env": "7.12.1", + "@keystonehq/bc-ur-registry": "https://github.com/BlueWallet/ur-registry", + "@ngraveio/bc-ur": "https://github.com/BlueWallet/bc-ur", "@react-native-async-storage/async-storage": "1.15.5", "@react-native-clipboard/clipboard": "1.7.0", "@react-native-community/blur": "3.6.0", @@ -92,7 +94,6 @@ "assert": "2.0.0", "base-x": "3.0.8", "bc-bech32": "file:blue_modules/bc-bech32", - "bc-ur": "file:blue_modules/bc-ur", "bech32": "2.0.0", "bignumber.js": "9.0.1", "bip21": "2.0.3", diff --git a/screen/send/ScanQRCode.js b/screen/send/ScanQRCode.js index c807eaf0f..1d0dd5505 100644 --- a/screen/send/ScanQRCode.js +++ b/screen/send/ScanQRCode.js @@ -4,7 +4,7 @@ import { Image, View, TouchableOpacity, StatusBar, Platform, StyleSheet, TextInp import { RNCamera } from 'react-native-camera'; import { Icon } from 'react-native-elements'; import { launchImageLibrary } from 'react-native-image-picker'; -import { decodeUR, extractSingleWorkload } from 'bc-ur'; +import { decodeUR, extractSingleWorkload, BlueURDecoder } from '../../blue_modules/ur'; import { useNavigation, useRoute, useIsFocused, useTheme } from '@react-navigation/native'; import loc from '../../loc'; import { BlueLoading, BlueText, BlueButton, BlueSpacing40 } from '../../BlueComponents'; @@ -16,6 +16,7 @@ const createHash = require('create-hash'); const fs = require('../../blue_modules/fs'); const Base43 = require('../../blue_modules/base43'); const bitcoin = require('bitcoinjs-lib'); +let decoder = false; const styles = StyleSheet.create({ root: { @@ -112,6 +113,41 @@ const ScanQRCode = () => { return createHash('sha256').update(s).digest().toString('hex'); }; + const _onReadUniformResourceV2 = part => { + if (!decoder) decoder = new BlueURDecoder(); + try { + decoder.receivePart(part); + if (decoder.isComplete()) { + const data = decoder.toString(); + decoder = false; // nullify for future use (?) + if (launchedBy) { + navigation.navigate(launchedBy); + } + onBarScanned({ data }); + } else { + setUrTotal(100); + setUrHave(Math.floor(decoder.estimatedPercentComplete() * 100)); + } + } catch (error) { + console.warn(error); + setIsLoading(true); + Alert.alert(loc.send.scan_error, loc._.invalid_animated_qr_code_fragment, [ + { + text: loc._.ok, + onPress: () => { + setIsLoading(false); + }, + style: 'default', + }, + { cancelabe: false }, + ]); + } + }; + + /** + * + * @deprecated remove when we get rid of URv1 support + */ const _onReadUniformResource = ur => { try { const [index, total] = extractSingleWorkload(ur); @@ -160,6 +196,17 @@ const ScanQRCode = () => { } scannedCache[h] = +new Date(); + if (ret.data.toUpperCase().startsWith('UR:CRYPTO-PSBT')) { + return _onReadUniformResourceV2(ret.data); + } + + if (ret.data.toUpperCase().startsWith('UR:BYTES')) { + const splitted = ret.data.split('/'); + if (splitted.length === 3 && splitted[1].includes('-')) { + return _onReadUniformResourceV2(ret.data); + } + } + if (ret.data.toUpperCase().startsWith('UR')) { return _onReadUniformResource(ret.data); } diff --git a/screen/settings/GeneralSettings.js b/screen/settings/GeneralSettings.js index 3f1f422e9..3139062c2 100644 --- a/screen/settings/GeneralSettings.js +++ b/screen/settings/GeneralSettings.js @@ -6,6 +6,7 @@ import { BlueLoading, BlueText, BlueSpacing20, BlueListItem, BlueCard } from '.. import { useNavigation, useTheme } from '@react-navigation/native'; import loc from '../../loc'; import { BlueStorageContext } from '../../blue_modules/storage-context'; +import { isURv1Enabled, clearUseURv1, setUseURv1 } from '../../blue_modules/ur'; const styles = StyleSheet.create({ root: { @@ -19,16 +20,22 @@ const GeneralSettings = () => { ); const [isLoading, setIsLoading] = useState(true); const [isAdancedModeSwitchEnabled, setIsAdancedModeSwitchEnabled] = useState(false); + const [isURv1SwitchEnabled, setIsURv1SwitchEnabled] = useState(false); const { navigate } = useNavigation(); const { colors } = useTheme(); const onAdvancedModeSwitch = async value => { await setIsAdancedModeEnabled(value); setIsAdancedModeSwitchEnabled(value); }; + const onLegacyURv1Switch = async value => { + setIsURv1SwitchEnabled(value); + return value ? setUseURv1() : clearUseURv1(); + }; useEffect(() => { (async () => { setIsAdancedModeSwitchEnabled(await isAdancedModeEnabled()); + setIsURv1SwitchEnabled(await isURv1Enabled()); setIsLoading(false); })(); }); @@ -85,6 +92,12 @@ const GeneralSettings = () => { {loc.settings.general_adv_mode_e} + + ); }; diff --git a/screen/wallets/addMultisigStep2.js b/screen/wallets/addMultisigStep2.js index cdd86ad5d..1ac7fed95 100644 --- a/screen/wallets/addMultisigStep2.js +++ b/screen/wallets/addMultisigStep2.js @@ -41,6 +41,7 @@ import MultipleStepsListItem, { MultipleStepsListItemDashType, } from '../../components/MultipleStepsListItem'; import { BlueStorageContext } from '../../blue_modules/storage-context'; +import { encodeUR } from '../../blue_modules/ur'; const prompt = require('../../blue_modules/prompt'); const A = require('../../blue_modules/analytics'); @@ -60,7 +61,8 @@ const WalletsAddMultisigStep2 = () => { const [isMnemonicsModalVisible, setIsMnemonicsModalVisible] = useState(false); const [isProvideMnemonicsModalVisible, setIsProvideMnemonicsModalVisible] = useState(false); const [isRenderCosignersXpubModalVisible, setIsRenderCosignersXpubModalVisible] = useState(false); - const [cosignerXpub, setCosignerXpub] = useState(''); // string displayed in renderCosignersXpubModal() + const [cosignerXpub, setCosignerXpub] = useState(''); // string used in exportCosigner() + const [cosignerXpubURv2, setCosignerXpubURv2] = useState(''); // string displayed in renderCosignersXpubModal() const [cosignerXpubFilename, setCosignerXpubFilename] = useState('bw-cosigner.json'); const [vaultKeyData, setVaultKeyData] = useState({ keyIndex: 1, xpub: '', seed: '', isLoading: false }); // string rendered in modal const [importText, setImportText] = useState(''); @@ -250,6 +252,7 @@ const WalletsAddMultisigStep2 = () => { const viewKey = cosigner => { if (MultisigHDWallet.isXpubValid(cosigner[0])) { setCosignerXpub(MultisigCosigner.exportToJson(cosigner[1], cosigner[0], cosigner[2])); + setCosignerXpubURv2(encodeUR(MultisigCosigner.exportToJson(cosigner[1], cosigner[0], cosigner[2]))[0]); setCosignerXpubFilename('bw-cosigner-' + cosigner[1] + '.json'); setIsRenderCosignersXpubModalVisible(true); } else { @@ -258,6 +261,7 @@ const WalletsAddMultisigStep2 = () => { const xpub = getXpubCacheForMnemonics(cosigner[0]); const fp = getFpCacheForMnemonics(cosigner[0]); setCosignerXpub(MultisigCosigner.exportToJson(fp, xpub, path)); + setCosignerXpubURv2(encodeUR(MultisigCosigner.exportToJson(fp, xpub, path))[0]); setCosignerXpubFilename('bw-cosigner-' + fp + '.json'); setIsRenderCosignersXpubModalVisible(true); } @@ -618,7 +622,7 @@ const WalletsAddMultisigStep2 = () => { { @@ -62,7 +63,8 @@ const ViewEditMultisigCosigners = () => { const [isMnemonicsModalVisible, setIsMnemonicsModalVisible] = useState(false); const [isShareModalVisible, setIsShareModalVisible] = useState(false); const [importText, setImportText] = useState(''); - const [exportString, setExportString] = useState('{}'); + const [exportString, setExportString] = useState('{}'); // used in exportCosigner() + const [exportStringURv2, setExportStringURv2] = useState(''); // used in QR const [exportFilename, setExportFilename] = useState('bw-cosigner.json'); const [vaultKeyData, setVaultKeyData] = useState({ keyIndex: 1, xpub: '', seed: '', path: '', fp: '', isLoading: false }); // string rendered in modal const data = useRef(); @@ -330,6 +332,7 @@ const ViewEditMultisigCosigners = () => { isLoading: false, }); setExportString(MultisigCosigner.exportToJson(fp, xpub, path)); + setExportStringURv2(encodeUR(MultisigCosigner.exportToJson(fp, xpub, path))[0]); setExportFilename('bw-cosigner-' + fp + '.json'); setIsMnemonicsModalVisible(true); }, @@ -377,6 +380,7 @@ const ViewEditMultisigCosigners = () => { const path = wallet.getCustomDerivationPathForCosigner(keyIndex); const xpub = wallet.convertXpubToMultisignatureXpub(MultisigHDWallet.seedToXpub(seed, path)); setExportString(MultisigCosigner.exportToJson(fp, xpub, path)); + setExportStringURv2(encodeUR(MultisigCosigner.exportToJson(fp, xpub, path))[0]); setExportFilename('bw-cosigner-' + fp + '.json'); }, }} @@ -544,7 +548,7 @@ const ViewEditMultisigCosigners = () => { {loc.multisig.this_is_cosigners_xpub} { assert.strictEqual(cosigner.howManyCosignersWeHave(), 1); }); + it('can parse cobo URv2 account', () => { + let decoded = decodeUR([ + 'UR:CRYPTO-ACCOUNT/OEADCYADWMTNKIAOLYTAADMETAADDLOLAOWKAXHDCLAXHPDIHNWKMYCFHNROCARHSESKLDPDSWOTMWGTJNGWIYHYYNWSOLENTSUEMKTOTAVDAAHDCXBDHHBZSBURBSMKZOECOEHHJPHTSRVACMBGHEROMYCKHHNBHFHGNBGMNYAESPNDFHAHTAADEHOEADADAOAEAMTAADDYOTADLOCSDYYKAEYKAEYKAOYKAOCYADWMTNKIAXAAAYCYLOWLDITOJTCNDTAY', + ]); + decoded = Buffer.from(decoded, 'hex').toString('ascii'); + + const cosigner = new MultisigCosigner(decoded); + assert.ok(cosigner.isValid()); + assert.strictEqual( + cosigner.getXpub(), + 'Zpub756tPxxwHiYkYiT12G2WUD2cpAHyVWhjvKPbXoY5jDZSyo71yG5C14LCuwhycTTAzgTUcQfddR8FFTQ1bSWR6kzmNbMEaVzUrj4Lhxbonjo', + ); + assert.strictEqual(cosigner.getPath(), "m/48'/0'/0'/2'"); + assert.strictEqual(cosigner.howManyCosignersWeHave(), 1); + assert.strictEqual(cosigner.getFp(), '01EBDA7D'); + }); + it('can parse plain Zpub', () => { const cosigner = new MultisigCosigner(Zpub1); assert.ok(cosigner.isValid()); @@ -1890,4 +1907,66 @@ describe('multisig-cosigner', () => { assert.strictEqual(w._getExternalAddressByIndex(0), 'bc1qtysquqsjqjfqvhd6l2h470hdgwhcahs4nq2ca49cyxftwjnjt9ssh8emel'); } }); + + it('can export to json', () => { + const result = MultisigCosigner.exportToJson(fp1cobo, Zpub1, "m/48'/0'/0'/2'"); + assert.strictEqual( + result, + '{"xfp":"D37EAD88","xpub":"Zpub74ijpfhERJNjhCKXRspTdLJV5eoEmSRZdHqDvp9kVtdVEyiXk7pXxRbfZzQvsDFpfDHEHVtVpx4Dz9DGUWGn2Xk5zG5u45QTMsYS2vjohNQ","path":"m/48\'/0\'/0\'/2\'"}', + ); + + const cosigner = new MultisigCosigner(MultisigCosigner.exportToJson(fp1cobo, Zpub1, "m/48'/0'/0'/2'")); + assert.strictEqual(cosigner.getFp(), 'D37EAD88'); + assert.strictEqual( + cosigner.getXpub(), + 'Zpub74ijpfhERJNjhCKXRspTdLJV5eoEmSRZdHqDvp9kVtdVEyiXk7pXxRbfZzQvsDFpfDHEHVtVpx4Dz9DGUWGn2Xk5zG5u45QTMsYS2vjohNQ', + ); + assert.strictEqual(cosigner.getPath(), "m/48'/0'/0'/2'"); + assert.strictEqual(cosigner.isValid(), true); + assert.strictEqual(cosigner.isNativeSegwit(), true); + assert.strictEqual(cosigner.isWrappedSegwit(), false); + assert.strictEqual(cosigner.isLegacy(), false); + + // using bad xpub just to check chaincode & keyhex + const c2 = new MultisigCosigner( + MultisigCosigner.exportToJson( + fp1cobo, + 'zpub6qT7amLcp2exr4mU4AhXZMjD9CFkopECVhUxc9LHW8pNsJG2B9ogs5sFbGZpxEeT5TBjLmc7EFYgZA9EeWEM1xkJMFLefzZc8eigRFhKB8Q', + "m/48'/0'/0'/2'", + ), + ); + assert.strictEqual(c2.getChainCodeHex(), '906730ab8a03fb4baa32a912134f2c5bfe6ae70e0264e4e9fe4b0abe3a560692'); + assert.strictEqual(c2.getKeyHex(), '0395b643f45bd89fede6f4f6416b288e73005419b48cdcd88465913bd31b4be5ea'); + assert.strictEqual(c2.getParentFingerprintHex(), '125688b1'); + assert.strictEqual(c2.getDepthNumber(), 3); + }); + + it('can export cosigner to URv2', () => { + let result = encodeUR(MultisigCosigner.exportToJson(fp1cobo, Zpub1, "m/48'/0'/0'/2'")); + assert.deepStrictEqual(result, [ + 'ur:crypto-account/oeadcytekbpmloaolytaadmetaaddloxaxhdclaofejnolgudllagdgodyweehzsmeyasnswrpdalnwzfenbmewlrtplsklbjkvdloweaahdcxltjzjpctayfsimuogtpypffrnlisflswwzntbecabtbdwdbstojnfrahdamnpfcyamtaaddyotadlocsdyykaeykaeykaoykaocytekbpmloaxaaaycyghykhpcmkgnstevs', + ]); + + result = encodeUR( + MultisigCosigner.exportToJson( + '42A2460E', + 'Ypub6m2WhkZvujztfZVYWEB4Hfcq3mKfeZYMfZj2wfvgNmTDjcCncU9ua6VSxXno7FeF8P2kqp1S7N8UoYapR8YKnMLNq8bEDDd2PU6q7QCHoEb', + "m/48'/0'/0'/1'", + ), + ); + assert.deepStrictEqual(result, [ + 'ur:crypto-account/oeadcyfwoefgbaaolytaadmhtaadmetaaddloxaxhdclaxsblplucfptgtwywzcmnshtotqzleihrnndtoeodrfdpfoyeyqzsbenrplbhtdymuaahdcxlgbdsrcxatcmdpuokpwzvymttatphtlftplsvlgmeeflpdtanlromhfgvekbbznyamtaaddyotadlocsdyykaeykaeykadykaocyfwoefgbaaxaaaycywsutbeuyyndacaeh', + ]); + + result = encodeUR( + MultisigCosigner.exportToJson( + 'ED5C5B8A', + 'xpub69dgpFkP9mFYhaAWt6svmwd1BYsuGiyyNs8sJW1GwCn8GSK69mrCmNG6ZLcrPGvBSiJzfjXD66ntgJxdqQbhMk4j273VQYHEMc5knoqFGvt', + "m/45'", + ), + ); + assert.deepStrictEqual(result, [ + 'ur:crypto-account/oeadcywehhhpleaolytaadmhtaaddloxaxhdclaoamutctbahthnislelbwemnkeoefnhddienfetbpygrpaqdkemyrywyldaspyjkdtaahdcxhyneskwdhlehlfbwrpdnjlgsgakplkjtknvyttsgolnnlbwlcagoolcpfgsglkinamtaaddyotadlfcsdpykaocywehhhpleaxadaycywehhhplekpdwveih', + ]); + }); }); diff --git a/tests/unit/watch-only-wallet.test.js b/tests/unit/watch-only-wallet.test.js index 7f281afdd..d003d71de 100644 --- a/tests/unit/watch-only-wallet.test.js +++ b/tests/unit/watch-only-wallet.test.js @@ -1,5 +1,5 @@ import { WatchOnlyWallet } from '../../class'; -import { decodeUR } from 'bc-ur/dist'; +import { decodeUR, encodeUR, setUseURv1, clearUseURv1, extractSingleWorkload, BlueURDecoder } from '../../blue_modules/ur'; import { Psbt } from 'bitcoinjs-lib'; const assert = require('assert'); @@ -339,7 +339,7 @@ describe('Watch only wallet', () => { }); describe('BC-UR', () => { - it('can decodeUR() and then combine unfinalized signed PSBT', () => { + it('v1: can decodeUR() and then combine unfinalized signed PSBT', () => { const unsignedPayload = decodeUR([ 'UR:BYTES/TYQ4XURNVF607QGQWYPQQQQQQ9U63JU4AD5C93Y057WNRNTV24AE8QK4DDHVT04GHTKNQZCXYHNW5QGQQQQQPLHLLLLS9LRRQQQQQQQQQQTQQ9P9YMAAVV5GVUNKD49W4GDNJ4C9GJP7383QFCQQQQQQQQQPVQQ5CXKNG9PNTGMDRV0GNWNJZS23KGG3V0KXQQQQQQQQQYQ375XRQQQQQQQQQQTQQ98UXJHTKAHE83Q8W5VGHH2G93698VZLP6PZQCPXW47RAFD36W04SNHNTZK8CLCWHXDJJRRZ2EP998STFNRYWFQPC0CC3N8X87Z5QQQGQQQQQZQQQQQQSQQQQQQQQQQQQQQQYGPQY5M4J23F3Z9TK6HZTRDD6M89QX955DEH3HXGXAC6NJQMT3CHYTJHRZXVUCLC2SQQPQQQQQQGQQQQQZQQZQQQQQQQQQQQQQ3QYQK6E2MCA75ZCRMMWZYWXNQKGKNNJC7JUXPNWR5QPYQC3EYRM4NDQ5VGENNRLP2QQQYQQQQQPQQQQQQGQQQQQQQQZQQQQQQQ6GYX3G', ]); @@ -360,4 +360,135 @@ describe('BC-UR', () => { '0200000000010179a8cb95eb6982c48fa79d31cd6c557b9382d56b6ec5bea8baed300b0625e6ea0100000000feffffff02fc630000000000001600142526fbd63288672766d4aeaa1b3957054483e89e204e000000000000160014c1ad3414335a36d1b1e89ba7214151b211163ec602473044022077ad33068b4a8da130ac8a64a3efbbaabaf18fa20d705adc86d53cbb69c18258022035eea4daadf9ba51080f57a7a3476d9f300414e82c544d58a24e682161e4be700121026757c3ea5b1d39f584ef358ac7c7f0eb99b290c625642529e0b4cc6472401c3f00000000', ); }); + + it('v1: decodeUR() txt works', () => { + const txtFileFormatMultisigNativeSegwit = + 'UR:BYTES/TYQHKGEQGDHKYM6KV96KCAPQF46KCARFWD5KWGRNV4682UPQVE5KCEFQ9P3HYETPW3JKGGR0DCSYGVEHG4Q5GWPC9Y9ZXZJWV9KK2W3QGDT97VENGG65YWF3G90NYTFJPFGX7MRFVDUN5GPJYPHKVGPJPFZX2UNFWESHG6T0DCAZQMF0XSUZWTESYUHNQFE0XGNS53N0WFKKZAP6YPGRY46NFQ9Q53PNXAZ5Z3PC8QAZQKNSW43RWDRFDFCXV6Z92F9YU6NGGD94S5NNWP2XGNZ22C6K2M69D4F4YKNYFPC5GANS8944VARY2EZHJ62CDVMHQKRC2F3XVKN629M8X3ZXWPNYGJZ9FPT8G4NS0Q6YG73EG3R42468DCE9S6E40FRN2AF5X4G4GNTNT9FNYAN2DA5YU5G2XYMRS3ZYXCCRXW3QTFC82C3HX4K5Z3FCG448J7ZN0FHHJ5RDGAHXGD29XEXHJ3PHG9XYWNNWV3E824MKX5E8SUR6D9K4552TW44HWAJ9VEV9GJR3D4YRSMNZVF3NVCMR2Q6HGVNPF5EK6AMNXDCYKK2NDE9HQJ6DF4UHGERZFEZ453J40P9H57N5T9RY6WZSDC9QWZ5LU2'; + const rez = decodeUR([txtFileFormatMultisigNativeSegwit]); + const b = Buffer.from(rez, 'hex'); + assert.strictEqual( + b.toString('ascii'), + "# CoboVault Multisig setup file (created on D37EAD88)\n#\nName: CV_33B5B91A_2-2\nPolicy: 2 of 2\nDerivation: m/48'/0'/0'/2'\nFormat: P2WSH\n\nD37EAD88: Zpub74ijpfhERJNjhCKXRspTdLJV5eoEmSRZdHqDvp9kVtdVEyiXk7pXxRbfZzQvsDFpfDHEHVtVpx4Dz9DGUWGn2Xk5zG5u45QTMsYS2vjohNQ\n168DD603: Zpub75mAE8EjyxSzoyPmGnd5E6MyD7ALGNndruWv52xpzimZQKukwvEfXTHqmH8nbbc6ccP5t2aM3mws3pKYSnKpKMMytdbNEZFUxKzztYFM8Pn\n", + ); + }); + + it('v2: decodeUR() crypto-account works', () => { + const payload = + 'UR:CRYPTO-ACCOUNT/OEADCYADWMTNKIAOLYTAADMWTAADDLOSAOWKAXHDCLAXMDRPFXWKHPTPNEWEVAWKYNFPJEDEMNJKAEGHCFQZLKUOTPLRIHMEFRTECWGRVWWDAAHDCXMHIODYPYLEAXZOGRPKEYPTBGBWGWDWHPZEIMVDBAAOIEVEWLZEGRBKRNFTHFAMMOAHTAADEHOEADADAOAEAMTAADDYOTADLNCSGHYKAEYKAEYKAOCYADWMTNKIAXAXATTAADDYOEADLRAEWKLAWKAXAEAYCYBGHFLOPACMIOWZLB'; + + const [index, total] = extractSingleWorkload(payload); + assert.strictEqual(index, 1); + assert.strictEqual(total, 1); + + const decoded = decodeUR([payload]); + + assert.strictEqual( + Buffer.from(decoded, 'hex').toString('ascii'), + '{"ExtPubKey":"zpub6qT7amLcp2exr4mU4AhXZMjD9CFkopECVhUxc9LHW8pNsJG2B9ogs5sFbGZpxEeT5TBjLmc7EFYgZA9EeWEM1xkJMFLefzZc8eigRFhKB8Q","MasterFingerprint":"01EBDA7D","AccountKeyPath":"m/84\'/0\'/0\'"}', + ); + }); + + it('v2: can decodeUR() PSBT', () => { + const payload = decodeUR([ + 'UR:CRYPTO-PSBT/HKADGSJOJKIDJYZMADAEJYAOAEAEAEADWKMTGWJPPFGMCKJLKPNDNDBWAHBEAXCNFHPKRHUTPMGTBAFNWEBTLBECKENNBDJKADAEAEAEAEZMZMZMZMAONBLNADAEAEAEAEAECFKOPTBBCFBGNTGUVAEHNDPECFUYNBHKRNPMCMJNYTBKROYKLOPSVOHTADAEAEAEAEAECMAEBBWEWETAYKBETTTDISVDGYTTGMEHLSDMASFYPSPYDRAEAEAEAEAEADADCTLNZMAOAEAEAEAEAECMAEBBJYLSWNATMWIOEMHTPMFXCWMTGLZSTPVSCMWDLBKKADAYJEAOFLDYFYAOCXGYFNRKKPVYWFWEGLFZTYLDSFWNNEFGCTIMPEFHWMCWNNMTCHHTMYGRSOFRLODSAEAOCXKTKBHDNDCEFLMEBYOESETTIOAACHAXZMVWDNRDHEISHKETAMCHDSEOFXIYDECPHGADCLAOHSHHTYMTPAWKLNFYESCWNBKSWDVDNNYNMNCFLOFNTTWTNYFYNTHERORKDKQDWEGWAEAECPAOAXIHWEMNLPPDZTKSTEJLBNMOWFCSVYKNMNHKHFGDRNKELFRTSFCTSRZSSGJZAXRNHYCSADWMTNKIGHAEAELAAEAEAELAAEAEAELAADAEAEAELNAEAEAEAESSAOMKSP', + ]); + + const uPsbtB64 = Buffer.from(payload, 'hex').toString('base64'); + + const psbtTx = Psbt.fromBase64(uPsbtB64); + assert.strictEqual( + psbtTx.extractTransaction().toHex(), + '02000000000101f4964f72b0521e6f759b9b13051003233faab9ddad4d0e3ced0d7f357c9e0b730100000000ffffffff02a0860100000000001976a91419129d53e6319baf19dba059bead166df90ab8f588ace25a010000000000160014ededd9f510d1d268e751d15231832e0944acab2a024730440220513cbb75e1f3ed4e40d489ccf19f461f6aaf3feb1b9e96175a8f4bc93b8826000220777e589b1c479111a2c1d167041703ffe52bba5f685938061726334366282257012102615cd496b1f48644391ba078eae79ef68e19883cd1f09a449d5fb8bb24b3ed4f00000000', + ); + + // now, full psbt tx via parts: + const decoder = new BlueURDecoder(); + decoder.receivePart( + 'UR:CRYPTO-PSBT/33-2/LPCSCLAOCFAOIOCYCSKEMSHLHKADEEFZZEMETDFRIEAEAXFPTACLNTMTTKGRAXKTKGUOFPMOGWCWIYMEKKVDVONETLPRKGBSONGAKKEMCNGALGOXBDFTLSJLHERNWKINJPADAYJEZCROTKRKGHJPFEAMSRJNJLMYETDSGYWFBSSNPFUTPFDIJOCYWZFLZENSKOYNSOVLVSPTVTHFPKTAAOCXCPFYMKKPKPBEGLMSCMDNVSPYJNTNLKGTFMZMRSFWSNZEPYVTWFPTQDDTPERPPSLREEHLNSKNLOENSTFYFDTSSOFZNEIAVYTDISWEOTUYHLFMGWOLCNMSTKZSFLNSPFKTWSDNECCFTNOYFGETGMBBJNYTBKROYKNNPSBBJYLSWNATMDIYDEGLTYFWCWMTGLZSTPZECMZEGADMNNLDDWREFSZTGHLOOSYTEMIEWKBWHKHHNTCPGHBNMELSLGBAPDGELAHYSBWLAMYNCSFRNLFRKPMWFNUEKSAEURNNLYPLPMLTVWVDDKBTVWBWLDJKYKWPCTJZIEEHSANYMHZMNDZEDYCWBZDPKBGSBARKIMAYFLGYIMCFLSMKENPEEOPSRFWSJKINLFYLPECYQZZCLBLSKOHLHGJZRHRYVTLOGLCMHGHLPAHNWYMULS', + ); + decoder.receivePart( + 'UR:CRYPTO-PSBT/47-2/LPCSDLAOCFAOIOCYCSKEMSHLHKADEEFZZEMETDFRIEAEAXFPTACLNTMTTKGRAXKTKGUOFPMOGWCWIYMEKKVDVONETLPRKGBSONGAKKEMCNGALGOXBDFTLSJLHERNWKINJPADAYJEZCROTKRKGHJPFEAMSRJNJLMYETDSGYWFBSSNPFUTPFDIJOCYWZFLZENSKOYNSOVLVSPTVTHFPKTAAOCXCPFYMKKPKPBEGLMSCMDNVSPYJNTNLKGTFMZMRSFWSNZEPYVTWFPTQDDTPERPPSLREEHLNSKNLOENSTFYFDTSSOFZNEIAVYTDISWEOTUYHLFMGWOLCNMSTKZSFLNSPFKTWSDNECCFTNOYFGETGMBBJNYTBKROYKNNPSBBJYLSWNATMDIYDEGLTYFWCWMTGLZSTPZECMZEGADMNNLDDWREFSZTGHLOOSYTEMIEWKBWHKHHNTCPGHBNMELSLGBAPDGELAHYSBWLAMYNCSFRNLFRKPMWFNUEKSAEURNNLYPLPMLTVWVDDKBTVWBWLDJKYKWPCTJZIEEHSANYMHZMNDZEDYCWBZDPKBGSBARKIMAYFLGYIMCFLSMKENPEEOPSRFWSJKINLFYLPECYQZZCLBLSKOHLHGJZRHRYVTLOGLCMHGHLPAYKAOHEGU', + ); + decoder.receivePart( + 'UR:CRYPTO-PSBT/73-2/LPCSGAAOCFAOIOCYCSKEMSHLHKADEEFZZEMETDFRIEAEAXFPTACLNTMTTKGRAXKTKGUOFPMOGWCWIYMEKKVDVONETLPRKGBSONGAKKEMCNGALGOXBDFTLSJLHERNWKINJPADAYJEZCROTKRKGHJPFEAMSRJNJLMYETDSGYWFBSSNPFUTPFDIJOCYWZFLZENSKOYNSOVLVSPTVTHFPKTAAOCXCPFYMKKPKPBEGLMSCMDNVSPYJNTNLKGTFMZMRSFWSNZEPYVTWFPTQDDTPERPPSLREEHLNSKNLOENSTFYFDTSSOFZNEIAVYTDISWEOTUYHLFMGWOLCNMSTKZSFLNSPFKTWSDNECCFTNOYFGETGMBBJNYTBKROYKNNPSBBJYLSWNATMDIYDEGLTYFWCWMTGLZSTPZECMZEGADMNNLDDWREFSZTGHLOOSYTEMIEWKBWHKHHNTCPGHBNMELSLGBAPDGELAHYSBWLAMYNCSFRNLFRKPMWFNUEKSAEURNNLYPLPMLTVWVDDKBTVWBWLDJKYKWPCTJZIEEHSANYMHZMNDZEDYCWBZDPKBGSBARKIMAYFLGYIMCFLSMKENPEEOPSRFWSJKINLFYLPECYQZZCLBLSKOHLHGJZRHRYVTLOGLCMHGHLPASAVWCXNE', + ); + decoder.receivePart( + 'UR:CRYPTO-PSBT/75-2/LPCSGRAOCFAOIOCYCSKEMSHLHKADEECFZTYKOEFDAMJYZTFZTALNNEMTTKGRAEADADCTCYWMAOAEAEAEAEAECMAEBBTYKNASSBGUVSCFDYOEUOWYDRKPSEJOUYMORPISJPADAYJEAOFLDYFYAOCXBYYKBYFMMTSPFYFZFYWESNHNEYSWGDWSIOBNHYBTGETNSBJOEYLNOSGUGOVOPYTAAOCXCPRKIOLELEVETPTPIENDRDREAOPECHTBDPZSPEFPWYSEADHKDMAAZEDIMUHPOYZOADCLAOJSZOEMSTFYFDTSENRSHNNSVTLNFGWDOTUYHLFMGWRSGOFMUYVLGOADVLMEUEPFNYAEADADCTLNZMAOAEAEAEAEAECMAEBBJYLSWNATMWIOEMHTPMFXCWMTGLZSTPVSCMWDLBKKADAYJEAOFLDYFYAOCXIYQZMEGUDAAXSOKNWMGOAAZSLYSGFMWPFDNBDPBDJEFSMSDLPFJSWMHLAXKNTDGEAOCXDKHEPTGMZMYACWCEDEJEEORHOYCAHYSRJTFYDSMHROFTDYPEFGZMRSRLJZBDAMONADCLAOHSHHTYMTPAWKLNFYESCWNBKSWDVDNNYNMNCFLOFNTTWTNYFYNTHERORKDKQDWEGWAEAEAEPDBAJSAH', + ); + assert.strictEqual(decoder.estimatedPercentComplete(), 1); + const psbt = Psbt.fromBase64(decoder.toString()); + assert.ok(psbt); + }); + + it('v2: can decodeUR() multipart bytes', () => { + const decoder = new BlueURDecoder(); + decoder.receivePart( + 'UR:BYTES/246-2/LPCSYNAOCFADKECYCEBTIDBGHDRNGRISEEECIOEYFWFLGEFPGOKOFWKSFXGTKTKKHTKOEYEEGOJLECKNJPEEGRGRIAHKHKESEEEOFXFYGEGMGEJNETHSJNFDGOIHJOIOFPHFIEKPGOGOEYINKSGOJOGYESIYGYKNEHBKDYEHFEFWFYFPEMFYFTCXHTJOKPIDEMECENJYGDKSKSKTFDINHKJEHKINGHEHEYFLEYHGGOFYEYIAJOFPFDKKHFHGISIMKOGRGDIDHDJLHKECIMFYHTGUKKJLEMEHKKFLECFXEHEEGSFXKPKTISKKIAGHGHFPKNIOGHGOIAGYIYIEIEGMETFGFGGHGYEHIDGUHGGMENJEKNJNGLIDGTFEHSHFKNGOJPIMEEGSISKSIDJLJTIMJLBKCFCFRYME', + ); + decoder.receivePart( + 'UR:BYTES/243-2/LPCSWFAOCFADKECYCEBTIDBGHDRNBGINGTCMFLKKDIFMESECFTCSDIHDBAETCWBTEOAHHPGUKPCEGDBAATFYJEDPBKECFNCFCEGDEHCLDNDSDLASCSBAAXISIHGHECDAAHCHGUEHKEHEBYIAENEECAEEAXFGCEBSHLKBHKFWDWDAIECHHFEHHFGHGDCXCYBAHYHFGWGLJOGEHDCSDMGAJEHSCABNDSHDFYDSFGFMFTDRAYFXCAJTKEFPJSKSHDGTHKKGKTGTIMFDGUJKAHENEMEYBTGOCHHSGRBEIYBDFRFMASKTEOFLDWFRGMIYJTHSCXCHCLEMGHIHCNDRCKCHJTCTATDKFRHKGYASENDRGWCFAYGHAABGAXFHFRCHFMADDYDYKPDNCWBKHPCEBDAODIJTBBFGRHFH', + ); + decoder.receivePart( + 'UR:BYTES/240-2/LPCSWTAOCFADKECYCEBTIDBGHDRNHKADKKCNCXGRIHKKJKJYJLJTIHCXGTKPJZJYINJKINIOCXJKIHJYKPJOCXIYINJZIHCXDEIAJPIHHSJYIHIECXJLJTCXDYEHFEFWFYFPEMFYDTBKCNBKGLHSJNIHFTCXGTKPJZJYINJKINIOCXHFHSKPJZJYBKGDJLJZINIAKKFTCXEYCXJLIYCXEYBKFYIHJPINKOHSJYINJLJTFTCXJNDLEEETDIDLDYDIDLDYDIDLEYDIBKFGJLJPJNHSJYFTCXGDEYHGGUFDBKBKFEEEFGDYFYFWEHEYFTCXHTJOKPIDEMEEFEGLKNFEHFHKFPJOIMISEOHTHSKSKKJPJPESGEJOGLKNHTFPFYGHFWHTFPIOJKJPESJKIHISFDIEIYENASAX', + ); + decoder.receivePart( + 'UR:BYTES/238-2/LPCSWYAOCFADKECYCEBTIDBGHDRNGRISEEECIOEYFWFLGEFPGOKOFWKSFXGTKTKKHTKOEYEEGOJLECKNJPEEGRGRIAHKHKESEEEOFXFYGEGMGEJNETHSJNFDGOIHJOIOFPHFIEKPGOGOEYINKSGOJOGYESIYGYKNEHBKDYEHFEFWFYFPEMFYFTCXHTJOKPIDEMECENJYGDKSKSKTFDINHKJEHKINGHEHEYFLEYHGGOFYEYIAJOFPFDKKHFHGISIMKOGRGDIDHDJLHKECIMFYHTGUKKJLEMEHKKFLECFXEHEEGSFXKPKTISKKIAGHGHFPKNIOGHGOIAGYIYIEIEGMETFGFGGHGYEHIDGUHGGMENJEKNJNGLIDGTFEHSHFKNGOJPIMEEGSISKSIDJLJTIMJLBKNYBTOSBE', + ); + decoder.receivePart( + 'UR:BYTES/235-2/LPCSWMAOCFADKECYCEBTIDBGHDRNHKADKKCNCXGRIHKKJKJYJLJTIHCXGTKPJZJYINJKINIOCXJKIHJYKPJOCXIYINJZIHCXDEIAJPIHHSJYIHIECXJLJTCXDYEHFEFWFYFPEMFYDTBKCNBKGLHSJNIHFTCXGTKPJZJYINJKINIOCXHFHSKPJZJYBKGDJLJZINIAKKFTCXEYCXJLIYCXEYBKFYIHJPINKOHSJYINJLJTFTCXJNDLEEETDIDLDYDIDLDYDIDLEYDIBKFGJLJPJNHSJYFTCXGDEYHGGUFDBKBKFEEEFGDYFYFWEHEYFTCXHTJOKPIDEMEEFEGLKNFEHFHKFPJOIMISEOHTHSKSKKJPJPESGEJOGLKNHTFPFYGHFWHTFPIOJKJPESJKIHISFDIETODMPFCY', + ); + decoder.receivePart( + 'UR:BYTES/224-2/LPCSVTAOCFADKECYCEBTIDBGHDRNBGINGTCMFLKKDIFMESECFTCSDIHDBAETCWBTEOAHHPGUKPCEGDBAATFYJEDPBKECFNCFCEGDEHCLDNDSDLASCSBAAXISIHGHECDAAHCHGUEHKEHEBYIAENEECAEEAXFGCEBSHLKBHKFWDWDAIECHHFEHHFGHGDCXCYBAHYHFGWGLJOGEHDCSDMGAJEHSCABNDSHDFYDSFGFMFTDRAYFXCAJTKEFPJSKSHDGTHKKGKTGTIMFDGUJKAHENEMEYBTGOCHHSGRBEIYBDFRFMASKTEOFLDWFRGMIYJTHSCXCHCLEMGHIHCNDRCKCHJTCTATDKFRHKGYASENDRGWCFAYGHAABGAXFHFRCHFMADDYDYKPDNCWBKHPCEBDAODIJTSAPMYNHK', + ); + assert.strictEqual(decoder.estimatedPercentComplete(), 1); + const str = decoder.toString(); + + assert.ok(str.includes('E4F0DB12')); + assert.ok(str.includes('Keystone Multisig setup file')); + }); + + it('v1: decodeUR() works', async () => { + await new Promise(resolve => setTimeout(resolve, 1000)); // sleep + // sleep is needed because in test envirnment setUseURv1() and init function have a race condition + await setUseURv1(); + const txt = 'hello world'; + const b = Buffer.from(txt, 'ascii'); + let fragments = encodeUR(b.toString('hex'), 666); + assert.deepStrictEqual(fragments, ['ur:bytes/fd5x2mrvdus8wmmjd3jqugwtl9']); + assert.strictEqual(Buffer.from(decodeUR(fragments), 'hex').toString('ascii'), txt); + + fragments = encodeUR(b.toString('hex'), 10); + assert.deepStrictEqual(fragments, [ + 'ur:bytes/1of3/fc38n9ue84vu8ra8ue6cdnrghws0dwep4f46q4rlrgdncwsg49lsw38e6m/fd5x2mrvdu', + 'ur:bytes/2of3/fc38n9ue84vu8ra8ue6cdnrghws0dwep4f46q4rlrgdncwsg49lsw38e6m/s8wmmjd3jq', + 'ur:bytes/3of3/fc38n9ue84vu8ra8ue6cdnrghws0dwep4f46q4rlrgdncwsg49lsw38e6m/ugwtl9', + ]); + assert.strictEqual(Buffer.from(decodeUR(fragments), 'hex').toString('ascii'), txt); + }); + + it('v2: decodeUR() bytes works', () => { + const payload = + 'UR:BYTES/HKADKNCNCXGRIHKKJKJYJLJTIHCXGTKPJZJYINJKINIOCXJKIHJYKPJOCXIYINJZIHCXDEIAJPIHHSJYIHIECXJLJTCXDYEHFEFWFYFPEMFYDTBKCNBKGLHSJNIHFTCXGRGHHEFGFPFPESDYFEFWENHEEYDPEYBKGDJLJZINIAKKFTCXEYCXJLIYCXEYBKFYIHJPINKOHSJYINJLJTFTCXJNDLEEETDIDLDYDIDLDYDIDLEYDIBKFGJLJPJNHSJYFTCXGDEYHGGUFDBKBKDYEHFEFWFYFPEMFYFTCXHTJOKPIDEMECENJYGDKSKSKTFDINHKJEHKINGHEHEYFLEYHGGOFYEYIAJOFPFDKKHFHGISIMKOGRGDIDHDJLHKECIMFYHTGUKKJLEMEHKKFLECFXEHEEGSFXKPKTISKKIAGHGHFPKNIOGHGOIAGYIYIEIEGMETFGFGGHGYEHIDGUHGGMENJEKNJNGLIDGTFEHSHFKNGOJPIMEEGSISKSIDJLJTIMJLBKESEMFXFWEHECEEEYFTCXHTJOKPIDEMECHFKPHKIYKTJPFXIMEYGLHDKTFGGSGMIEIDKKKOGDGDJNGDKOEMGMJYIHGYKTFGGTHDFDGEGTGDJKFYKPFXEMKOISKOIDHGJSJLJNFEIEEMETHKJOJLGRIEEMJEGRJEIAIAGHGHFXFPJNJNIDECHFJNHDFPEHESHSISEMIMHDGYINIOGRGOIHKSJEIHGSIHKPGRIMKTJYFDKKENECJLBKYLYAHNRS'; + const result = Buffer.from(decodeUR([payload]), 'hex').toString(); + assert.ok(result.includes('Keystone Multisig setup file')); + }); + + it('v2: encodeUR() psbt works', async () => { + await clearUseURv1(); + const psbtHex = + '70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f000000000000000000'; + + const fragments = encodeUR(psbtHex, 100); + assert.strictEqual(fragments.length, 2); + assert.deepStrictEqual(fragments, [ + 'ur:crypto-psbt/1-2/lpadaocsptcybkgdcarhhdgohdosjojkidjyzmadaenyaoaeaeaeaohdvsknclrejnpebncnrnmnjojofejzeojlkerdonspkpkkdkykfelokgprpyutkpaeaeaeaeaezmzmzmzmlslgaaditiwpihbkispkfgrkbdaslewdfycprtjsprsgksecdratkkhktimndacnch', + 'ur:crypto-psbt/2-2/lpaoaocsptcybkgdcarhhdgokewdcaadaeaeaeaezmzmzmzmaojopkwtayaeaeaeaecmaebbtphhdnjstiambdassoloimwmlyhygdnlcatnbggtaevyykahaeaeaeaecmaebbaeplptoevwwtyakoonlourgofgvsjydpcaltaemyaeaeaeaeaeaeaeaeaeaeswhhtptt', + ]); + }); + + it('v1: extractSingleWorkload() works', () => { + const [index, total] = extractSingleWorkload('ur:bytes/2of3/fc38n9ue84vu8ra8ue6cdnrghws0dwep4f46q4rlrgdncwsg49lsw38e6m/s8wmmjd3jq'); + assert.strictEqual(index, 2); + assert.strictEqual(total, 3); + }); }); From 801fe7e59e260b5322650c40a5051890f7370520 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sat, 10 Jul 2021 10:22:29 -0400 Subject: [PATCH 211/327] OPS: Version bump and release notes --- android/app/build.gradle | 2 +- ios/BlueWallet.xcodeproj/project.pbxproj | 62 +++++++++---------- ios/fastlane/metadata/en-US/release_notes.txt | 8 +++ package-lock.json | 2 +- package.json | 2 +- 5 files changed, 42 insertions(+), 34 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 49cda46f8..157fa3358 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -139,7 +139,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 - versionName "6.1.9" + versionName "6.2.0" multiDexEnabled true missingDimensionStrategy 'react-native-camera', 'general' testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index 389df01c7..a4a26471e 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -50,7 +50,7 @@ 6DD410BF266CB13D0087DE03 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; }; 6DD410C0266CB1460087DE03 /* MarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9946622555A660000E52E8 /* MarketWidget.swift */; }; 6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; }; - 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */; }; + 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* EFQRCode */; }; 6DFC807224EA2FA9007B8700 /* ViewQRCodefaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFC807124EA2FA9007B8700 /* ViewQRCodefaceController.swift */; }; 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; @@ -397,7 +397,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */, + 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -837,7 +837,7 @@ ); name = "BlueWalletWatch Extension"; packageProductDependencies = ( - 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */, + 6DFC806F24EA0B6C007B8700 /* EFQRCode */, ); productName = "BlueWalletWatch Extension"; productReference = B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */; @@ -921,7 +921,7 @@ ); mainGroup = 83CBB9F61A601CBA00E9B192; packageReferences = ( - 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */, + 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */, ); productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; projectDirPath = ""; @@ -1323,7 +1323,7 @@ CODE_SIGN_ENTITLEMENTS = BlueWallet/BlueWallet.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 601; + CURRENT_PROJECT_VERSION = 603; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; @@ -1344,7 +1344,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.9; + MARKETING_VERSION = 6.2.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1373,7 +1373,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 601; + CURRENT_PROJECT_VERSION = 603; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; @@ -1388,7 +1388,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.1.9; + MARKETING_VERSION = 6.2.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1418,7 +1418,7 @@ CODE_SIGN_ENTITLEMENTS = "TodayExtension/BlueWallet - Bitcoin Price.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 601; + CURRENT_PROJECT_VERSION = 603; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1429,7 +1429,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.9; + MARKETING_VERSION = 6.2.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; @@ -1457,7 +1457,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 601; + CURRENT_PROJECT_VERSION = 603; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1468,7 +1468,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.9; + MARKETING_VERSION = 6.2.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; PRODUCT_NAME = "BlueWallet - Bitcoin Price"; @@ -1494,13 +1494,13 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 601; + CURRENT_PROJECT_VERSION = 603; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.9; + MARKETING_VERSION = 6.2.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; @@ -1526,13 +1526,13 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 601; + CURRENT_PROJECT_VERSION = 603; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.1.9; + MARKETING_VERSION = 6.2.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1559,7 +1559,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 601; + CURRENT_PROJECT_VERSION = 603; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1570,7 +1570,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.9; + MARKETING_VERSION = 6.2.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; @@ -1604,7 +1604,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 601; + CURRENT_PROJECT_VERSION = 603; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1615,7 +1615,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.9; + MARKETING_VERSION = 6.2.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1750,7 +1750,7 @@ CODE_SIGN_ENTITLEMENTS = "BlueWalletWatch Extension/BlueWalletWatch Extension.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 601; + CURRENT_PROJECT_VERSION = 603; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1760,7 +1760,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.9; + MARKETING_VERSION = 6.2.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; @@ -1790,7 +1790,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 601; + CURRENT_PROJECT_VERSION = 603; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1800,7 +1800,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.1.9; + MARKETING_VERSION = 6.2.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -1830,13 +1830,13 @@ CODE_SIGN_ENTITLEMENTS = BlueWalletWatch/BlueWalletWatch.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 601; + CURRENT_PROJECT_VERSION = 603; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.9; + MARKETING_VERSION = 6.2.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; @@ -1869,13 +1869,13 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 601; + CURRENT_PROJECT_VERSION = 603; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.1.9; + MARKETING_VERSION = 6.2.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1960,7 +1960,7 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */ = { + 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/EFPrefix/EFQRCode.git"; requirement = { @@ -1971,9 +1971,9 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */ = { + 6DFC806F24EA0B6C007B8700 /* EFQRCode */ = { isa = XCSwiftPackageProductDependency; - package = 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */; + package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */; productName = EFQRCode; }; /* End XCSwiftPackageProductDependency section */ diff --git a/ios/fastlane/metadata/en-US/release_notes.txt b/ios/fastlane/metadata/en-US/release_notes.txt index a564a66cb..b11b34649 100644 --- a/ios/fastlane/metadata/en-US/release_notes.txt +++ b/ios/fastlane/metadata/en-US/release_notes.txt @@ -1,3 +1,11 @@ +v6.1.9 +====== + +* ADD: Support for URv2 QR codes +* ADD: Offer additional file save destinations on Android +* ADD: macOS Widgets +* FIX: PSBT File save would fail on Android + v6.1.8 ====== FIX: Wallet carousel was not rending properly on large screens diff --git a/package-lock.json b/package-lock.json index 8c7d91df6..2ba1bf458 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.9", + "version": "6.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e6f10f94b..1f8a666c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.1.9", + "version": "6.2.0", "license": "MIT", "repository": { "type": "git", From b1afd584343c3eed38d1e154b46dcf2935b8225f Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 11 Jul 2021 11:20:54 +0000 Subject: [PATCH 212/327] Translate /loc/en.json in ar review completed for the source file '/loc/en.json' on the 'ar' language. --- loc/ar.json | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/loc/ar.json b/loc/ar.json index a39a4b526..dcbfbfeb1 100644 --- a/loc/ar.json +++ b/loc/ar.json @@ -17,7 +17,11 @@ "success": "نجاح", "wallet_key": "مفتاح المحفظة", "invalid_animated_qr_code_fragment" : "قطعة من رمز الـ QRcode المتحرك غير صحيحة، حاول مرة اخرى.", - "file_saved": "تم حفظ الملف ({filePath}) في مجلد التنزيلات.", + "file_saved": "تم حفظ الملف {filePath} في {destination}.", + "file_save_title": "احفظ الملف", + "file_save_location": "حدد مكان حفظ {filePath}", + "downloads_folder": "مجلد التنزيلات", + "external_storage": "التخزين خارجيًا", "discard_changes": "تجاهل التغييرات؟", "discard_changes_detail": "يوجد تغييرات غير محفوظة. هل أنت متأكد من الخروج من الشاشة وتجاهلها؟" }, @@ -259,8 +263,8 @@ "electrum_connected_not": "غير متصل", "electrum_error_connect": "يتعذَّر الاتصال بخادم Electrum المقدَّم", "electrum_host": "على سبيل المثال {example}", - "electrum_port": "منفذ TCP، يكون عادةً {example}", - "electrum_port_ssl": "منفذ SSL، يكون عادةً {example}", + "electrum_port": "منفذ، يكون عادةً {example}", + "use_ssl": "استخدم SSL", "electrum_saved": "تم حفظ تغييراتك بنجاح. قد تحتاج إلى إعادة التشغيل لتصبح التغييرات سارية المفعول.", "set_electrum_server_as_default": "هل تريد تعيين {server} كخادم Electrum الافتراضي؟", "set_lndhub_as_default": "هل تريد تعيين {url} كخادم LNDHub الافتراضي؟", @@ -581,7 +585,9 @@ "sign_aopp_confirm": "هل تريد إرسال رسالة موقعة إلى {hostname}؟", "addresses_title": "العنوان", "type_change": "تغيير", - "type_receive": "استلام" + "type_receive": "استلام", + "type_used": "مستخدم", + "transactions": "الحوالات" }, "aopp": { "title": "اختر عنوانًا", From 18612a420c782a7887d680532f9c723843ae97db Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 11 Jul 2021 19:08:04 +0000 Subject: [PATCH 213/327] Translate /loc/en.json in fa_IR review completed for the source file '/loc/en.json' on the 'fa_IR' language. --- loc/fa.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/loc/fa.json b/loc/fa.json index bf1428035..057188462 100644 --- a/loc/fa.json +++ b/loc/fa.json @@ -17,7 +17,11 @@ "success": "موفقیت‌آمیز بود", "wallet_key": "کلید کیف پول", "invalid_animated_qr_code_fragment" : "کد QR جزئی متحرک نامعتبر است. لطفاً دوباره امتحان کنید.", - "file_saved": "فایل ({filePath}) در پوشهٔ دانلودهای شما ذخیره شده است.", + "file_saved": "فایل {filePath} در {destination} شما ذخیره شد.", + "file_save_title": "ذخیرهٔ فایل", + "file_save_location": "محل ذخیرهٔ {filePath} را انتخاب کنید", + "downloads_folder": "پوشهٔ دانلودها", + "external_storage": "فضای ذخیره‌سازی خارجی", "discard_changes": "نادیده‌گرفتن تغییرات", "discard_changes_detail": "شما تغییرات ذخیره‌نشده‌ای دارید. آیا از نادیده‌گرفتن آن‌ها و خروج از صفحه اطمینان دارید؟" }, From b92c2577d0a333d1bfe52adba30d80f941421129 Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Mon, 12 Jul 2021 11:55:28 +0300 Subject: [PATCH 214/327] ADD: migrate AEZEED wallets --- class/app-storage.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/class/app-storage.js b/class/app-storage.js index ecdbe4b0a..14b84b809 100644 --- a/class/app-storage.js +++ b/class/app-storage.js @@ -364,6 +364,14 @@ export class AppStorage { break; case HDAezeedWallet.type: unserializedWallet = HDAezeedWallet.fromJson(key); + // migrate password to this.passphrase field + // remove this code somewhere in year 2022 + if (unserializedWallet.secret.includes(':')) { + const [mnemonic, passphrase] = unserializedWallet.secret.split(':'); + unserializedWallet.secret = mnemonic; + unserializedWallet.passphrase = passphrase; + } + break; case SLIP39SegwitP2SHWallet.type: unserializedWallet = SLIP39SegwitP2SHWallet.fromJson(key); From c52c6567a5663a1d435ccfd1be7b781615164b89 Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Mon, 12 Jul 2021 12:11:35 +0300 Subject: [PATCH 215/327] ADD: show passphrase on wallet details screen --- screen/wallets/export.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/screen/wallets/export.js b/screen/wallets/export.js index ad04c5707..1da0348f0 100644 --- a/screen/wallets/export.js +++ b/screen/wallets/export.js @@ -27,6 +27,7 @@ const styles = StyleSheet.create({ fontWeight: '700', }, secret: { + alignSelf: 'stretch', alignItems: 'center', paddingHorizontal: 16, fontSize: 16, @@ -135,6 +136,14 @@ const WalletExport = () => { )} ))} + {wallet.getPassphrase() && ( + <> + + + {wallet.getPassphrase()} + + + )} ); From 84b3ccfc0acbe57b509838839fb1d8402d93e120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Mon, 12 Jul 2021 15:20:36 -0400 Subject: [PATCH 216/327] FIX: lndhub backup QR doesnt have a "@%server%" suffix #3379 --- class/wallets/lightning-custodian-wallet.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/class/wallets/lightning-custodian-wallet.js b/class/wallets/lightning-custodian-wallet.js index 0f0a08b2c..8d33d7442 100644 --- a/class/wallets/lightning-custodian-wallet.js +++ b/class/wallets/lightning-custodian-wallet.js @@ -54,9 +54,6 @@ export class LightningCustodianWallet extends LegacyWallet { } getSecret() { - if (this.baseURI === LightningCustodianWallet.defaultBaseUri) { - return this.secret; - } return this.secret + '@' + this.baseURI; } From 5c53ef17f529613a265c3b3140c0ef5da3d1c663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Mon, 12 Jul 2021 22:06:19 -0400 Subject: [PATCH 217/327] Revert "FIX: lndhub backup QR doesnt have a "@%server%" suffix #3379" This reverts commit 84b3ccfc0acbe57b509838839fb1d8402d93e120. --- class/wallets/lightning-custodian-wallet.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/class/wallets/lightning-custodian-wallet.js b/class/wallets/lightning-custodian-wallet.js index 8d33d7442..0f0a08b2c 100644 --- a/class/wallets/lightning-custodian-wallet.js +++ b/class/wallets/lightning-custodian-wallet.js @@ -54,6 +54,9 @@ export class LightningCustodianWallet extends LegacyWallet { } getSecret() { + if (this.baseURI === LightningCustodianWallet.defaultBaseUri) { + return this.secret; + } return this.secret + '@' + this.baseURI; } From 0ab020b430df04fc0ad983e72c02be804ed0fc6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Mon, 12 Jul 2021 22:06:23 -0400 Subject: [PATCH 218/327] Update pleaseBackupLNDHub.js --- screen/wallets/pleaseBackupLNDHub.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/screen/wallets/pleaseBackupLNDHub.js b/screen/wallets/pleaseBackupLNDHub.js index c57280ba6..92041a642 100644 --- a/screen/wallets/pleaseBackupLNDHub.js +++ b/screen/wallets/pleaseBackupLNDHub.js @@ -64,7 +64,7 @@ const PleaseBackupLNDHub = () => { Date: Mon, 12 Jul 2021 22:45:16 -0400 Subject: [PATCH 219/327] FIX: Dont use hardcoded label --- class/wallets/abstract-wallet.js | 1 - 1 file changed, 1 deletion(-) diff --git a/class/wallets/abstract-wallet.js b/class/wallets/abstract-wallet.js index c62d4e463..e36bac35d 100644 --- a/class/wallets/abstract-wallet.js +++ b/class/wallets/abstract-wallet.js @@ -213,7 +213,6 @@ export class AbstractWallet { this.secret = parsedSecret.ExtPubKey; const mfp = Buffer.from(parsedSecret.MasterFingerprint, 'hex').reverse().toString('hex'); this.masterFingerprint = parseInt(mfp, 16); - this.setLabel('Cobo Vault ' + parsedSecret.MasterFingerprint); if (parsedSecret.CoboVaultFirmwareVersion) this.use_with_hardware_wallet = true; } } catch (_) {} From 0e45fe46c07c0a8f97abb5d65e8a6ff9ab489ff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Tue, 13 Jul 2021 10:55:05 -0400 Subject: [PATCH 220/327] Update lightning-custodian-wallet.test.js --- tests/integration/lightning-custodian-wallet.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/lightning-custodian-wallet.test.js b/tests/integration/lightning-custodian-wallet.test.js index 2f5b70108..986210f0b 100644 --- a/tests/integration/lightning-custodian-wallet.test.js +++ b/tests/integration/lightning-custodian-wallet.test.js @@ -2,7 +2,7 @@ import Frisbee from 'frisbee'; import { LightningCustodianWallet } from '../../class'; const assert = require('assert'); -describe('LightningCustodianWallet', () => { +describe.skip('LightningCustodianWallet', () => { const l1 = new LightningCustodianWallet(); it.skip('issue credentials', async () => { From b9d7b5657461b07df3b1c1f7522c689560dbd8c6 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 13 Jul 2021 18:49:09 +0000 Subject: [PATCH 221/327] Translate /loc/en.json in es_419 review completed for the source file '/loc/en.json' on the 'es_419' language. --- loc/es_419.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/loc/es_419.json b/loc/es_419.json index b42d9fa4e..cea49399f 100644 --- a/loc/es_419.json +++ b/loc/es_419.json @@ -17,7 +17,11 @@ "success": "Éxito", "wallet_key": "Clave de la billetera", "invalid_animated_qr_code_fragment" : "Fragmento inválido de Código QR animado. Por favor intenta de nuevo.", - "file_saved": "El archivo ({filePath}) se ha guardado en tu carpeta de Descargas.", + "file_saved": "El archivo {filePath} se ha guardado en tu {destination}.", + "file_save_title": "Guardar el archivo", + "file_save_location": "Selecciona dónde guardar {filePath}", + "downloads_folder": "Carpeta de descargas", + "external_storage": "Almacenamiento externo", "discard_changes": "¿Descartar cambios?", "discard_changes_detail": "Tienes cambios no guardados. ¿Estás seguro de descartarlos y salir de la pantalla?" }, From c7875ca945754b7bfb4d309b9b2bfa41b1450b1f Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 13 Jul 2021 19:10:05 +0000 Subject: [PATCH 222/327] Translate /loc/en.json in de_DE review completed for the source file '/loc/en.json' on the 'de_DE' language. --- loc/de_de.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/loc/de_de.json b/loc/de_de.json index ed1632272..8934b7128 100644 --- a/loc/de_de.json +++ b/loc/de_de.json @@ -17,7 +17,11 @@ "success": "Erfolg", "wallet_key": "Wallet Schlüssel", "invalid_animated_qr_code_fragment" : "Ungültig animiertes QR-Code-Fragment. Bitte erneut versuchen.", - "file_saved": "Die Datei ({filePath}) wurde in deinen Downloadfolder gespeichert.", + "file_saved": "Die Datei {filePath} wurde im Ordner {destination} gespeichert.", + "file_save_title": "Datei speichern", + "file_save_location": "Speicherort wählen {filePath}", + "downloads_folder": "Download-Ordner", + "external_storage": "Externer Speicher", "discard_changes": "Änderungen verwerfen?", "discard_changes_detail": "Die nicht gespeicherten Änderungen verwerfen und den Bildschirm verlassen?" }, From a88e56aae586b6d63838caadb2b39ab56a9c1098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 14 Jul 2021 00:28:07 -0400 Subject: [PATCH 223/327] Update skeleton-cobo.txt --- tests/unit/fixtures/skeleton-cobo.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/fixtures/skeleton-cobo.txt b/tests/unit/fixtures/skeleton-cobo.txt index 3990f296a..aa6cfea12 100644 --- a/tests/unit/fixtures/skeleton-cobo.txt +++ b/tests/unit/fixtures/skeleton-cobo.txt @@ -1 +1 @@ -{"ExtPubKey":"zpub6rcabYFcdr41zyUNRWRyHYs2Sm86E5XV8RjjRzTFYsiCngteeZnkwaF2xuhjmM6kpHjuNpFW42BMhzPmFwXt48e1FhddMB7xidZzN4SF24K","MasterFingerprint":"5271c071","CoboVaultFirmwareVersion":"1.2.4(BTC-Only)"} \ No newline at end of file +{"ExtPubKey":"zpub6rcabYFcdr41zyUNRWRyHYs2Sm86E5XV8RjjRzTFYsiCngteeZnkwaF2xuhjmM6kpHjuNpFW42BMhzPmFwXt48e1FhddMB7xidZzN4SF24K","MasterFingerprint":"5271c071","CoboVaultFirmwareVersion":"1.2.4(BTC-Only)", "keystore": { "label": "Cobo Vault"} } \ No newline at end of file From cdbf6b377099279ad850bf1b95975c49ae37ae11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 14 Jul 2021 01:42:20 -0400 Subject: [PATCH 224/327] WIP --- tests/unit/fixtures/skeleton-cobo.txt | 2 +- tests/unit/watch-only-wallet.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/fixtures/skeleton-cobo.txt b/tests/unit/fixtures/skeleton-cobo.txt index aa6cfea12..3990f296a 100644 --- a/tests/unit/fixtures/skeleton-cobo.txt +++ b/tests/unit/fixtures/skeleton-cobo.txt @@ -1 +1 @@ -{"ExtPubKey":"zpub6rcabYFcdr41zyUNRWRyHYs2Sm86E5XV8RjjRzTFYsiCngteeZnkwaF2xuhjmM6kpHjuNpFW42BMhzPmFwXt48e1FhddMB7xidZzN4SF24K","MasterFingerprint":"5271c071","CoboVaultFirmwareVersion":"1.2.4(BTC-Only)", "keystore": { "label": "Cobo Vault"} } \ No newline at end of file +{"ExtPubKey":"zpub6rcabYFcdr41zyUNRWRyHYs2Sm86E5XV8RjjRzTFYsiCngteeZnkwaF2xuhjmM6kpHjuNpFW42BMhzPmFwXt48e1FhddMB7xidZzN4SF24K","MasterFingerprint":"5271c071","CoboVaultFirmwareVersion":"1.2.4(BTC-Only)"} \ No newline at end of file diff --git a/tests/unit/watch-only-wallet.test.js b/tests/unit/watch-only-wallet.test.js index d003d71de..d512dd225 100644 --- a/tests/unit/watch-only-wallet.test.js +++ b/tests/unit/watch-only-wallet.test.js @@ -234,7 +234,7 @@ describe('Watch only wallet', () => { ); assert.strictEqual(w.getMasterFingerprint(), 1908437330); assert.strictEqual(w.getMasterFingerprintHex(), '5271c071'); - assert.strictEqual(w.getLabel(), 'Cobo Vault 5271c071'); + assert.strictEqual(w.getLabel(), 'Imported Watch-only'); assert.ok(w.useWithHardwareWalletEnabled()); }); From c56acd5e54501734c0955728a3639ddcc024632d Mon Sep 17 00:00:00 2001 From: Gabriele Genta Date: Wed, 14 Jul 2021 14:40:19 +0200 Subject: [PATCH 225/327] FIX: remove checks before invoking getAddressAsync --- WatchConnectivity.ios.js | 34 ++++++++++++++++------------------ screen/receive/details.js | 6 +----- screen/wallets/aopp.js | 2 +- 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/WatchConnectivity.ios.js b/WatchConnectivity.ios.js index b603dcf7c..142d25083 100644 --- a/WatchConnectivity.ios.js +++ b/WatchConnectivity.ios.js @@ -126,24 +126,22 @@ function WatchConnectivity() { for (const wallet of wallets) { let receiveAddress; - if (wallet.getAddressAsync) { - if (wallet.chain === Chain.ONCHAIN) { - try { - receiveAddress = await wallet.getAddressAsync(); - } catch (_) {} - if (!receiveAddress) { - // either sleep expired or getAddressAsync threw an exception - receiveAddress = wallet._getExternalAddressByIndex(wallet.next_free_address_index); - } - } else if (wallet.chain === Chain.OFFCHAIN) { - try { - await wallet.getAddressAsync(); - receiveAddress = wallet.getAddress(); - } catch (_) {} - if (!receiveAddress) { - // either sleep expired or getAddressAsync threw an exception - receiveAddress = wallet.getAddress(); - } + if (wallet.chain === Chain.ONCHAIN) { + try { + receiveAddress = await wallet.getAddressAsync(); + } catch (_) {} + if (!receiveAddress) { + // either sleep expired or getAddressAsync threw an exception + receiveAddress = wallet._getExternalAddressByIndex(wallet.next_free_address_index); + } + } else if (wallet.chain === Chain.OFFCHAIN) { + try { + await wallet.getAddressAsync(); + receiveAddress = wallet.getAddress(); + } catch (_) {} + if (!receiveAddress) { + // either sleep expired or getAddressAsync threw an exception + receiveAddress = wallet.getAddress(); } } const transactions = wallet.getTransactions(10); diff --git a/screen/receive/details.js b/screen/receive/details.js index c6d2c3594..1550cc372 100644 --- a/screen/receive/details.js +++ b/screen/receive/details.js @@ -216,7 +216,7 @@ const ReceiveDetails = () => { setAddressBIP21Encoded(address); await Notifications.tryToObtainPermissions(); Notifications.majorTomToGroundControl([address], [], []); - } else if (wallet.getAddressAsync) { + } else { if (wallet.chain === Chain.ONCHAIN) { try { newAddress = await Promise.race([wallet.getAddressAsync(), sleep(1000)]); @@ -244,10 +244,6 @@ const ReceiveDetails = () => { setAddressBIP21Encoded(newAddress); await Notifications.tryToObtainPermissions(); Notifications.majorTomToGroundControl([newAddress], [], []); - } else if (wallet.getAddress) { - setAddressBIP21Encoded(wallet.getAddress()); - await Notifications.tryToObtainPermissions(); - Notifications.majorTomToGroundControl([wallet.getAddress()], [], []); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/screen/wallets/aopp.js b/screen/wallets/aopp.js index b3ec1878a..d1c687fcc 100644 --- a/screen/wallets/aopp.js +++ b/screen/wallets/aopp.js @@ -37,7 +37,7 @@ const AOPP = () => { const wallet = await selectWallet(navigation.navigate, name, false, availableWallets, 'Onchain wallet is required to sign a message'); if (!wallet) return navigation.pop(); - const address = wallet.getAddressAsync ? await wallet.getAddressAsync() : wallet.getAddress(); + const address = await wallet.getAddressAsync(); navigation.navigate('SignVerify', { walletID: wallet.getID(), address, From fb0490e9774521cc15dcbf864e978b68cc2981a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 14 Jul 2021 12:28:47 -0400 Subject: [PATCH 226/327] Update build.gradle --- android/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 48d2d949b..419884021 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { - minSdkVersion = 28 + minSdkVersion = 26 supportLibVersion = "28.0.0" buildToolsVersion = "29.0.3" compileSdkVersion = 29 @@ -74,7 +74,7 @@ subprojects { android { compileSdkVersion 29 defaultConfig { - minSdkVersion 28 + minSdkVersion 26 } } } From 59a1ebde1ff5836e7ce36602e2f42d3d1f568238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 15 Jul 2021 10:19:06 -0400 Subject: [PATCH 227/327] Update watch-only-wallet.test.js --- tests/unit/watch-only-wallet.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/watch-only-wallet.test.js b/tests/unit/watch-only-wallet.test.js index d512dd225..47aed0c4e 100644 --- a/tests/unit/watch-only-wallet.test.js +++ b/tests/unit/watch-only-wallet.test.js @@ -234,7 +234,7 @@ describe('Watch only wallet', () => { ); assert.strictEqual(w.getMasterFingerprint(), 1908437330); assert.strictEqual(w.getMasterFingerprintHex(), '5271c071'); - assert.strictEqual(w.getLabel(), 'Imported Watch-only'); + assert.strictEqual(w.getLabel(), 'Wallet'); assert.ok(w.useWithHardwareWalletEnabled()); }); From 2626691d807088c163a9aebc81b1ac1b22fcf6a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Thu, 15 Jul 2021 10:25:41 -0400 Subject: [PATCH 228/327] OPS: Version bump --- android/app/build.gradle | 2 +- ios/BlueWallet.xcodeproj/project.pbxproj | 48 ++++++++++++------------ package-lock.json | 2 +- package.json | 2 +- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 157fa3358..6e07ed6e5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -139,7 +139,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 - versionName "6.2.0" + versionName "6.2.1" multiDexEnabled true missingDimensionStrategy 'react-native-camera', 'general' testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index a4a26471e..e60d6230c 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -1323,7 +1323,7 @@ CODE_SIGN_ENTITLEMENTS = BlueWallet/BlueWallet.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 603; + CURRENT_PROJECT_VERSION = 604; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; @@ -1344,7 +1344,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.2.0; + MARKETING_VERSION = 6.2.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1373,7 +1373,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 603; + CURRENT_PROJECT_VERSION = 604; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; @@ -1388,7 +1388,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.2.0; + MARKETING_VERSION = 6.2.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1418,7 +1418,7 @@ CODE_SIGN_ENTITLEMENTS = "TodayExtension/BlueWallet - Bitcoin Price.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 603; + CURRENT_PROJECT_VERSION = 604; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1429,7 +1429,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.0; + MARKETING_VERSION = 6.2.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; @@ -1457,7 +1457,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 603; + CURRENT_PROJECT_VERSION = 604; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1468,7 +1468,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.0; + MARKETING_VERSION = 6.2.1; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; PRODUCT_NAME = "BlueWallet - Bitcoin Price"; @@ -1494,13 +1494,13 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 603; + CURRENT_PROJECT_VERSION = 604; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.2.0; + MARKETING_VERSION = 6.2.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; @@ -1526,13 +1526,13 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 603; + CURRENT_PROJECT_VERSION = 604; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.2.0; + MARKETING_VERSION = 6.2.1; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1559,7 +1559,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 603; + CURRENT_PROJECT_VERSION = 604; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1570,7 +1570,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.0; + MARKETING_VERSION = 6.2.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; @@ -1604,7 +1604,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 603; + CURRENT_PROJECT_VERSION = 604; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1615,7 +1615,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.0; + MARKETING_VERSION = 6.2.1; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1750,7 +1750,7 @@ CODE_SIGN_ENTITLEMENTS = "BlueWalletWatch Extension/BlueWalletWatch Extension.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 603; + CURRENT_PROJECT_VERSION = 604; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1760,7 +1760,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.0; + MARKETING_VERSION = 6.2.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; @@ -1790,7 +1790,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 603; + CURRENT_PROJECT_VERSION = 604; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1800,7 +1800,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.0; + MARKETING_VERSION = 6.2.1; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -1830,13 +1830,13 @@ CODE_SIGN_ENTITLEMENTS = BlueWalletWatch/BlueWalletWatch.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 603; + CURRENT_PROJECT_VERSION = 604; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.2.0; + MARKETING_VERSION = 6.2.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; @@ -1869,13 +1869,13 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 603; + CURRENT_PROJECT_VERSION = 604; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.2.0; + MARKETING_VERSION = 6.2.1; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/package-lock.json b/package-lock.json index 2ba1bf458..5be41e3f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.2.0", + "version": "6.2.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1f8a666c9..0e8c4dca9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.2.0", + "version": "6.2.1", "license": "MIT", "repository": { "type": "git", From 43f2117ad0612dd40f5bc9a780108c139f9286f0 Mon Sep 17 00:00:00 2001 From: Gabriele Genta Date: Fri, 16 Jul 2021 13:18:56 +0200 Subject: [PATCH 229/327] FIX: removed unused additionalProperties argument --- class/wallet-import.js | 13 +++---------- screen/send/ScanQRCode.js | 6 +----- screen/wallets/import.js | 10 ++++------ 3 files changed, 8 insertions(+), 21 deletions(-) diff --git a/class/wallet-import.js b/class/wallet-import.js index 01066c4a1..10f3011e0 100644 --- a/class/wallet-import.js +++ b/class/wallet-import.js @@ -35,11 +35,10 @@ function WalletImport() { /** * * @param w {AbstractWallet} - * @param additionalProperties key-values passed from outside. Used only to set up `masterFingerprint` property for watch-only wallet * @returns {Promise} * @private */ - WalletImport._saveWallet = async (w, additionalProperties) => { + WalletImport._saveWallet = async w => { IdleTimerManager.setIdleTimerDisabled(false); if (WalletImport.isWalletImported(w)) { WalletImport.presentWalletAlreadyExistsAlert(); @@ -49,11 +48,6 @@ function WalletImport() { ReactNativeHapticFeedback.trigger('notificationSuccess', { ignoreAndroidSystemSettings: false }); if (w.getLabel() === emptyWalletLabel) w.setLabel(loc.wallets.import_imported + ' ' + w.typeReadable); w.setUserHasSavedExport(true); - if (additionalProperties) { - for (const [key, value] of Object.entries(additionalProperties)) { - w[key] = value; - } - } addWallet(w); await saveToDisk(); A(A.ENUM.CREATED_WALLET); @@ -92,10 +86,9 @@ function WalletImport() { /** * * @param importText - * @param additionalProperties key-values passed from outside. Used only to set up `masterFingerprint` property for watch-only wallet * @returns {Promise} */ - WalletImport.processImportText = async (importText, additionalProperties) => { + WalletImport.processImportText = async importText => { IdleTimerManager.setIdleTimerDisabled(true); // Plan: // -2. check if BIP38 encrypted @@ -232,7 +225,7 @@ function WalletImport() { watchOnly.setSecret(importText); if (watchOnly.valid()) { await watchOnly.fetchBalance(); - return WalletImport._saveWallet(watchOnly, additionalProperties); + return WalletImport._saveWallet(watchOnly); } // nope, not watch-only diff --git a/screen/send/ScanQRCode.js b/screen/send/ScanQRCode.js index 1d0dd5505..b1129cea7 100644 --- a/screen/send/ScanQRCode.js +++ b/screen/send/ScanQRCode.js @@ -229,11 +229,7 @@ const ScanQRCode = () => { if (launchedBy) { navigation.navigate(launchedBy); } - if (ret.additionalProperties) { - onBarScanned(ret.data, ret.additionalProperties); - } else { - onBarScanned(ret.data); - } + onBarScanned(ret.data); } catch (e) { console.log(e); } diff --git a/screen/wallets/import.js b/screen/wallets/import.js index 4c20159a7..eb8d6a014 100644 --- a/screen/wallets/import.js +++ b/screen/wallets/import.js @@ -65,9 +65,8 @@ const WalletsImport = () => { /** * * @param importText - * @param additionalProperties key-values passed from outside. Used only to set up `masterFingerprint` property for watch-only wallet */ - const importMnemonic = async (importText, additionalProperties) => { + const importMnemonic = async importText => { if (WalletImport.isCurrentlyImportingWallet()) { return; } @@ -75,7 +74,7 @@ const WalletsImport = () => { navigation.dangerouslyGetParent().pop(); await new Promise(resolve => setTimeout(resolve, 500)); // giving some time to animations try { - await WalletImport.processImportText(importText, additionalProperties); + await WalletImport.processImportText(importText); WalletImport.removePlaceholderWallet(); } catch (error) { WalletImport.removePlaceholderWallet(); @@ -89,12 +88,11 @@ const WalletsImport = () => { /** * * @param value - * @param additionalProperties key-values passed from outside. Used only to set up `masterFingerprint` property for watch-only wallet */ - const onBarScanned = (value, additionalProperties) => { + const onBarScanned = value => { if (value && value.data) value = value.data + ''; // no objects here, only strings setImportText(value); - setTimeout(() => importMnemonic(value, additionalProperties), 500); + setTimeout(() => importMnemonic(value), 500); }; const importScan = () => { From 30062e9795c75762d51419af2956195287ef23c8 Mon Sep 17 00:00:00 2001 From: Gabriele Genta Date: Fri, 16 Jul 2021 13:51:49 +0200 Subject: [PATCH 230/327] ADD: import path for supported watch only formats --- class/wallets/abstract-wallet.js | 10 ++++++++-- tests/unit/fixtures/skeleton-cobo.txt | 2 +- tests/unit/watch-only-wallet.test.js | 6 +++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/class/wallets/abstract-wallet.js b/class/wallets/abstract-wallet.js index 06dca61d9..aa4701bbb 100644 --- a/class/wallets/abstract-wallet.js +++ b/class/wallets/abstract-wallet.js @@ -174,10 +174,12 @@ export class AbstractWallet { const re = /\[([^\]]+)\](.*)/; const m = this.secret.match(re); if (m && m.length === 3) { - let hexFingerprint = m[1].split('/')[0]; + let [hexFingerprint, ...derivationPathArray] = m[1].split('/'); + const derivationPath = `m/${derivationPathArray.join('/').replace(/h/g, "'")}`; if (hexFingerprint.length === 8) { hexFingerprint = Buffer.from(hexFingerprint, 'hex').reverse().toString('hex'); this.masterFingerprint = parseInt(hexFingerprint, 16); + this._derivationPath = derivationPath; } this.secret = m[2]; } @@ -205,16 +207,20 @@ export class AbstractWallet { if (parsedSecret.keystore.label) { this.setLabel(parsedSecret.keystore.label); } + if (parsedSecret.keystore.derivation) { + this._derivationPath = parsedSecret.keystore.derivation; + } this.secret = parsedSecret.keystore.xpub; this.masterFingerprint = masterFingerprint; if (parsedSecret.keystore.type === 'hardware') this.use_with_hardware_wallet = true; } // It is a Cobo Vault Hardware Wallet - if (parsedSecret && parsedSecret.ExtPubKey && parsedSecret.MasterFingerprint) { + if (parsedSecret && parsedSecret.ExtPubKey && parsedSecret.MasterFingerprint && parsedSecret.AccountKeyPath) { this.secret = parsedSecret.ExtPubKey; const mfp = Buffer.from(parsedSecret.MasterFingerprint, 'hex').reverse().toString('hex'); this.masterFingerprint = parseInt(mfp, 16); + this._derivationPath = `m/${parsedSecret.AccountKeyPath}`; if (parsedSecret.CoboVaultFirmwareVersion) this.use_with_hardware_wallet = true; } } catch (_) {} diff --git a/tests/unit/fixtures/skeleton-cobo.txt b/tests/unit/fixtures/skeleton-cobo.txt index 3990f296a..a8c77d3be 100644 --- a/tests/unit/fixtures/skeleton-cobo.txt +++ b/tests/unit/fixtures/skeleton-cobo.txt @@ -1 +1 @@ -{"ExtPubKey":"zpub6rcabYFcdr41zyUNRWRyHYs2Sm86E5XV8RjjRzTFYsiCngteeZnkwaF2xuhjmM6kpHjuNpFW42BMhzPmFwXt48e1FhddMB7xidZzN4SF24K","MasterFingerprint":"5271c071","CoboVaultFirmwareVersion":"1.2.4(BTC-Only)"} \ No newline at end of file +{"ExtPubKey":"zpub6rcabYFcdr41zyUNRWRyHYs2Sm86E5XV8RjjRzTFYsiCngteeZnkwaF2xuhjmM6kpHjuNpFW42BMhzPmFwXt48e1FhddMB7xidZzN4SF24K","MasterFingerprint":"5271c071","AccountKeyPath":"84'\/0'\/0'","CoboVaultFirmwareVersion":"1.2.4(BTC-Only)"} diff --git a/tests/unit/watch-only-wallet.test.js b/tests/unit/watch-only-wallet.test.js index 47aed0c4e..51a2160ab 100644 --- a/tests/unit/watch-only-wallet.test.js +++ b/tests/unit/watch-only-wallet.test.js @@ -156,6 +156,7 @@ describe('Watch only wallet', () => { ); assert.strictEqual(w.getMasterFingerprint(), 64392470); assert.strictEqual(w.getMasterFingerprintHex(), '168dd603'); + assert.strictEqual(w.getDerivationPath(), "m/84'/0'/0'"); assert.ok(w.useWithHardwareWalletEnabled()); const utxos = [ @@ -195,6 +196,7 @@ describe('Watch only wallet', () => { ); assert.strictEqual(w.getMasterFingerprint(), 64392470); assert.strictEqual(w.getMasterFingerprintHex(), '168dd603'); + assert.strictEqual(w.getDerivationPath(), "m/84'/0'/1'"); assert.ok(w.useWithHardwareWalletEnabled()); const utxos = [ @@ -235,10 +237,11 @@ describe('Watch only wallet', () => { assert.strictEqual(w.getMasterFingerprint(), 1908437330); assert.strictEqual(w.getMasterFingerprintHex(), '5271c071'); assert.strictEqual(w.getLabel(), 'Wallet'); + assert.strictEqual(w.getDerivationPath(), "m/84'/0'/0'"); assert.ok(w.useWithHardwareWalletEnabled()); }); - it('can import zpub with master fingerprint', async () => { + it('can import zpub with master fingerprint and derivation path', async () => { const w = new WatchOnlyWallet(); w.setSecret(require('fs').readFileSync('./tests/unit/fixtures/skeleton-walletdescriptor.txt', 'ascii')); w.init(); @@ -249,6 +252,7 @@ describe('Watch only wallet', () => { ); assert.strictEqual(w.getMasterFingerprint(), 4167290508); assert.strictEqual(w.getMasterFingerprintHex(), '8cce63f8'); + assert.strictEqual(w.getDerivationPath(), "m/84'/0'/0'"); assert.ok(!w.useWithHardwareWalletEnabled()); }); From 4ac9b6016b7c7cb9205b878c3981bd4447a2b36b Mon Sep 17 00:00:00 2001 From: Gabriele Genta Date: Fri, 16 Jul 2021 14:01:36 +0200 Subject: [PATCH 231/327] ADD: default derivation path for watch only wallets --- class/wallets/abstract-wallet.js | 11 +++++++++++ tests/unit/watch-only-wallet.test.js | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/class/wallets/abstract-wallet.js b/class/wallets/abstract-wallet.js index aa4701bbb..4f33eec7e 100644 --- a/class/wallets/abstract-wallet.js +++ b/class/wallets/abstract-wallet.js @@ -224,6 +224,17 @@ export class AbstractWallet { if (parsedSecret.CoboVaultFirmwareVersion) this.use_with_hardware_wallet = true; } } catch (_) {} + + if (!this._derivationPath) { + if (this.secret.startsWith('xpub')) { + this._derivationPath = "m/44'/0'/0'"; // Assume default BIP44 path for legacy wallets + } else if (this.secret.startsWith('ypub')) { + this._derivationPath = "m/49'/0'/0'"; // Assume default BIP49 path for segwit wrapped wallets + } else if (this.secret.startsWith('zpub')) { + this._derivationPath = "m/84'/0'/0'"; // Assume default BIP84 for native segwit wallets + } + } + return this; } diff --git a/tests/unit/watch-only-wallet.test.js b/tests/unit/watch-only-wallet.test.js index 51a2160ab..00aad36dc 100644 --- a/tests/unit/watch-only-wallet.test.js +++ b/tests/unit/watch-only-wallet.test.js @@ -340,6 +340,27 @@ describe('Watch only wallet', () => { ); assert.strictEqual(psbt.data.outputs[1].bip32Derivation[0].path, "m/49'/0'/0'/1/46"); }); + + it('xpub watch only has derivation path set to BIP44 default', () => { + const w = new WatchOnlyWallet(); + w.setSecret('xpub6CQdfC3v9gU86eaSn7AhUFcBVxiGhdtYxdC5Cw2vLmFkfth2KXCMmYcPpvZviA89X6DXDs4PJDk5QVL2G2xaVjv7SM4roWHr1gR4xB3Z7Ps'); + + assert.strictEqual(w.getDerivationPath(), "m/44'/0'/0'"); + }); + + it('ypub watch only has derivation path set to BIP49 default', () => { + const w = new WatchOnlyWallet(); + w.setSecret('ypub6Y9u3QCRC1HkZv3stNxcQVwmw7vC7KX5Ldz38En5P88RQbesP2oy16hNyQocVCfYRQPxdHcd3pmu9AFhLv7NdChWmw5iNLryZ2U6EEHdnfo'); + + assert.strictEqual(w.getDerivationPath(), "m/49'/0'/0'"); + }); + + it('zpub watch only has derivation path set to BIP84 default', () => { + const w = new WatchOnlyWallet(); + w.setSecret('zpub6rjLjQVqVnj7crz9E4QWj4WgczmEseJq22u2B6k2HZr6NE2PQx3ZYg8BnbjN9kCfHymSeMd2EpwpM5iiz5Nrb3TzvddxW2RMcE3VXdVaXHk'); + + assert.strictEqual(w.getDerivationPath(), "m/84'/0'/0'"); + }); }); describe('BC-UR', () => { From 8ca6be5872102f3d3717f175dbdb20bfa33d61b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Fri, 16 Jul 2021 15:21:00 -0400 Subject: [PATCH 232/327] FIX: getPassphrase crash --- screen/wallets/export.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/screen/wallets/export.js b/screen/wallets/export.js index 1da0348f0..882d850eb 100644 --- a/screen/wallets/export.js +++ b/screen/wallets/export.js @@ -136,7 +136,7 @@ const WalletExport = () => { )} ))} - {wallet.getPassphrase() && ( + {wallet.getPassphrase && wallet.getPassphrase() && ( <> From 472f4c214cf8c2f0f71b461b4006d90ef7d70575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sun, 18 Jul 2021 11:54:43 -0400 Subject: [PATCH 233/327] REF: Remove error-prone random placeholder scroll calculation --- BlueComponents.js | 3 +- blue_modules/storage-context.js | 6 +- class/wallet-import.js | 36 +++++----- components/WalletsCarousel.js | 112 +++++++++++++++++--------------- screen/wallets/drawerList.js | 79 ++++++---------------- screen/wallets/import.js | 36 ++++++++-- screen/wallets/list.js | 95 +++++++++------------------ 7 files changed, 158 insertions(+), 209 deletions(-) diff --git a/BlueComponents.js b/BlueComponents.js index 0c816dbe1..43ee8ce59 100644 --- a/BlueComponents.js +++ b/BlueComponents.js @@ -831,6 +831,7 @@ export const BlueHeaderDefaultSub = props => { export const BlueHeaderDefaultMain = props => { const { colors } = useTheme(); const { isDrawerList } = props; + const { isImportingWallet } = useContext(BlueStorageContext); return (

{ bottomDivider={false} topDivider={false} backgroundColor={isDrawerList ? colors.elevated : colors.background} - rightComponent={} + rightComponent={isImportingWallet ? undefined : } /> ); }; diff --git a/blue_modules/storage-context.js b/blue_modules/storage-context.js index 7f42aa058..8c3be1f23 100644 --- a/blue_modules/storage-context.js +++ b/blue_modules/storage-context.js @@ -14,7 +14,7 @@ export const WalletTransactionsStatus = { NONE: false, ALL: true }; export const BlueStorageContext = createContext(); export const BlueStorageProvider = ({ children }) => { const [wallets, setWallets] = useState([]); - const [pendingWallets, setPendingWallets] = useState([]); + const [isImportingWallet, setIsImportingWallet] = useState(false); const [selectedWallet, setSelectedWallet] = useState(''); const [walletTransactionUpdateStatus, setWalletTransactionUpdateStatus] = useState(WalletTransactionsStatus.NONE); const [walletsInitialized, setWalletsInitialized] = useState(false); @@ -186,8 +186,8 @@ export const BlueStorageProvider = ({ children }) => { value={{ wallets, setWalletsWithNewOrder, - pendingWallets, - setPendingWallets, + isImportingWallet, + setIsImportingWallet, txMetadata, saveToDisk, getTransactions, diff --git a/class/wallet-import.js b/class/wallet-import.js index 10f3011e0..06c440aa0 100644 --- a/class/wallet-import.js +++ b/class/wallet-import.js @@ -8,13 +8,13 @@ import { HDLegacyP2PKHWallet, HDSegwitBech32Wallet, LightningCustodianWallet, - PlaceholderWallet, SegwitBech32Wallet, HDLegacyElectrumSeedP2PKHWallet, HDSegwitElectrumSeedP2WPKHWallet, HDAezeedWallet, MultisigHDWallet, SLIP39LegacyP2PKHWallet, + PlaceholderWallet, SLIP39SegwitP2SHWallet, SLIP39SegwitBech32Wallet, } from '.'; @@ -30,7 +30,7 @@ const wif = require('wif'); const prompt = require('../blue_modules/prompt'); function WalletImport() { - const { wallets, pendingWallets, setPendingWallets, saveToDisk, addWallet } = useContext(BlueStorageContext); + const { wallets, saveToDisk, addWallet, setIsImportingWallet } = useContext(BlueStorageContext); /** * @@ -55,15 +55,21 @@ function WalletImport() { Notifications.majorTomToGroundControl(w.getAllExternalAddresses(), [], []); }; - WalletImport.removePlaceholderWallet = () => { - setPendingWallets([]); + WalletImport.isWalletImported = w => { + const wallet = wallets.some(wallet => wallet.getSecret() === w.secret || wallet.getID() === w.getID()); + return !!wallet; }; - WalletImport.isWalletImported = w => { - const wallet = wallets.some( - wallet => (wallet.getSecret() === w.secret || wallet.getID() === w.getID()) && wallet.type !== PlaceholderWallet.type, - ); - return !!wallet; + WalletImport.removePlaceholderWallet = ()=> { + setIsImportingWallet(false) + } + + + WalletImport.addPlaceholderWallet = (importText, isFailure = false) => { + const placeholderWallet = new PlaceholderWallet(); + placeholderWallet.setSecret(importText); + placeholderWallet.setIsFailure(isFailure); + setIsImportingWallet(placeholderWallet); }; WalletImport.presentWalletAlreadyExistsAlert = () => { @@ -71,18 +77,6 @@ function WalletImport() { alert('This wallet has been previously imported.'); }; - WalletImport.addPlaceholderWallet = (importText, isFailure = false) => { - const wallet = new PlaceholderWallet(); - wallet.setSecret(importText); - wallet.setIsFailure(isFailure); - setPendingWallets([...pendingWallets, wallet]); - return wallet; - }; - - WalletImport.isCurrentlyImportingWallet = () => { - return wallets.some(wallet => wallet.type === PlaceholderWallet.type); - }; - /** * * @param importText diff --git a/components/WalletsCarousel.js b/components/WalletsCarousel.js index f71278174..5b49cd4be 100644 --- a/components/WalletsCarousel.js +++ b/components/WalletsCarousel.js @@ -52,6 +52,43 @@ const nStyles = StyleSheet.create({ }, }); +const PlaceholderWalletCarouselItem = props => { + const { colors } = useTheme(); + + const { isImportingWallet } = useContext(BlueStorageContext); + + return ( + { + if (isImportingWallet && isImportingWallet.getIsFailure()) { + props.onPressedIn(); + } else { + props.onPressedOut(); + } + }} + onPressOut={isImportingWallet && isImportingWallet.getIsFailure() ? props.onPressedOut : null} + onPress={isImportingWallet && isImportingWallet.getIsFailure() ? props.onPress : null} + > + + + + + {isImportingWallet.getIsFailure() ? loc.wallets.import_placeholder_fail : loc.wallets.import_placeholder_inprogress} + + {isImportingWallet.getIsFailure() ? ( + + {loc.wallets.list_import_error} + + ) : ( + + )} + + + ); +}; + +PlaceholderWalletCarouselItem.propTypes = { onPress: PropTypes.func, onPressedOut: PropTypes.func, onPressedIn: PropTypes.func }; + const NewWalletPanel = ({ onPress }) => { const { colors } = useTheme(); const { width } = useWindowDimensions(); @@ -149,7 +186,7 @@ const iStyles = StyleSheet.create({ const WalletCarouselItem = ({ item, index, onPress, handleLongPress, isSelectedWallet }) => { const scaleValue = new Animated.Value(1.0); const { colors } = useTheme(); - const { walletTransactionUpdateStatus } = useContext(BlueStorageContext); + const { walletTransactionUpdateStatus, isImportingWallet } = useContext(BlueStorageContext); const { width } = useWindowDimensions(); const itemWidth = width * 0.82 > 375 ? 375 : width * 0.82; const isLargeScreen = Platform.OS === 'android' ? isTablet() : width >= Dimensions.get('screen').width / 2 && (isTablet() || isDesktop); @@ -168,7 +205,16 @@ const WalletCarouselItem = ({ item, index, onPress, handleLongPress, isSelectedW }; if (!item) - return ( + return isImportingWallet ? ( + + + + ) : ( { onPressedOut(); @@ -177,47 +223,6 @@ const WalletCarouselItem = ({ item, index, onPress, handleLongPress, isSelectedW /> ); - if (item.type === PlaceholderWallet.type) { - return ( - - { - if (item.getIsFailure()) { - onPressedOut(); - onPress(index); - onPressedOut(); - } - }} - > - - - - - {item.getIsFailure() ? loc.wallets.import_placeholder_fail : loc.wallets.import_placeholder_inprogress} - - {item.getIsFailure() ? ( - - {loc.wallets.list_import_error} - - ) : ( - - )} - - - - ); - } - const opacity = isSelectedWallet === false ? 0.5 : 1.0; let image; switch (item.type) { @@ -318,11 +323,11 @@ const cStyles = StyleSheet.create({ }); const WalletsCarousel = forwardRef((props, ref) => { - const { preferredFiatCurrency, language } = useContext(BlueStorageContext); + const { preferredFiatCurrency, language, isImportingWallet } = useContext(BlueStorageContext); const renderItem = useCallback( ({ item, index }) => ( { /> ), // eslint-disable-next-line react-hooks/exhaustive-deps - [props.vertical, props.selectedWallet, props.handleLongPress, props.onPress, preferredFiatCurrency, language], + [props.horizontal, props.selectedWallet, props.handleLongPress, props.onPress, preferredFiatCurrency, language, isImportingWallet], ); const flatListRef = useRef(); const ListHeaderComponent = () => ; @@ -338,12 +343,12 @@ const WalletsCarousel = forwardRef((props, ref) => { useImperativeHandle(ref, () => ({ scrollToItem: ({ item }) => { setTimeout(() => { - flatListRef?.current?.scrollToItem({ item, viewPosition: 0.3 }); + flatListRef?.current?.scrollToItem({ item, viewOffset: 16 }); }, 300); }, - scrollToIndex: index => { + scrollToIndex: ({ index }) => { setTimeout(() => { - flatListRef?.current?.scrollToIndex({ index, viewPosition: 0.3 }); + flatListRef?.current?.scrollToIndex({ index, viewOffset: 16 }); }, 300); }, })); @@ -351,31 +356,30 @@ const WalletsCarousel = forwardRef((props, ref) => { const { width } = useWindowDimensions(); const sliderHeight = 190; const itemWidth = width * 0.82 > 375 ? 375 : width * 0.82; - const isLargeScreen = Platform.OS === 'android' ? isTablet() : width >= Dimensions.get('screen').width / 2 && (isTablet() || isDesktop); - return ( index.toString()} showsVerticalScrollIndicator={false} pagingEnabled disableIntervalMomentum={isHandset} snapToInterval={itemWidth} // Adjust to your content width decelerationRate="fast" - contentContainerStyle={isLargeScreen ? cStyles.contentLargeScreen : cStyles.content} + contentContainerStyle={props.horizontal ? cStyles.content : cStyles.contentLargeScreen} directionalLockEnabled showsHorizontalScrollIndicator={false} initialNumToRender={10} ListHeaderComponent={ListHeaderComponent} - style={props.vertical ? {} : { height: sliderHeight + 9 }} + style={props.horizontal ? { height: sliderHeight + 9 } : {}} {...props} /> ); }); WalletsCarousel.propTypes = { - vertical: PropTypes.bool, + horizontal: PropTypes.bool, selectedWallet: PropTypes.string, onPress: PropTypes.func.isRequired, handleLongPress: PropTypes.func.isRequired, diff --git a/screen/wallets/drawerList.js b/screen/wallets/drawerList.js index 030fcc2bf..24eb202f6 100644 --- a/screen/wallets/drawerList.js +++ b/screen/wallets/drawerList.js @@ -1,5 +1,5 @@ -import React, { useContext, useEffect, useRef, useState } from 'react'; -import { StatusBar, View, StyleSheet, Alert } from 'react-native'; +import React, { useContext, useEffect, useRef } from 'react'; +import { StatusBar, View, StyleSheet } from 'react-native'; import { DrawerContentScrollView } from '@react-navigation/drawer'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; import PropTypes from 'prop-types'; @@ -7,8 +7,6 @@ import { useIsFocused, useTheme } from '@react-navigation/native'; import { BlueHeaderDefaultMain, BlueSpacing20 } from '../../BlueComponents'; import WalletsCarousel from '../../components/WalletsCarousel'; -import { PlaceholderWallet } from '../../class'; -import WalletImport from '../../class/wallet-import'; import loc from '../../loc'; import { BlueStorageContext } from '../../blue_modules/storage-context'; import { BlurView } from '@react-native-community/blur'; @@ -16,8 +14,7 @@ import { BlurView } from '@react-native-community/blur'; const DrawerList = props => { console.log('drawerList rendering...'); const walletsCarousel = useRef(); - const { wallets, selectedWallet, pendingWallets, isDrawerListBlurred } = useContext(BlueStorageContext); - const [carouselData, setCarouselData] = useState([]); + const { wallets, selectedWallet, isImportingWallet, isDrawerListBlurred } = useContext(BlueStorageContext); const { colors } = useTheme(); const walletsCount = useRef(wallets.length); const isFocused = useIsFocused(); @@ -27,14 +24,6 @@ const DrawerList = props => { }, }); - useEffect(() => { - const allWallets = wallets.concat(pendingWallets); - setCarouselData(allWallets.concat(false)); - const newCarouselData = allWallets.concat(false); - setCarouselData(newCarouselData); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [wallets, pendingWallets]); - useEffect(() => { if (walletsCount.current < wallets.length) { walletsCarousel.current?.scrollToItem({ item: wallets[walletsCount.current] }); @@ -43,56 +32,29 @@ const DrawerList = props => { }, [wallets]); useEffect(() => { - if (pendingWallets.length > 0) { - walletsCarousel.current?.scrollToItem(carouselData.length - pendingWallets.length); + if (isImportingWallet) { + walletsCarousel.current?.scrollToItem({ item: false }); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [pendingWallets]); + }, [isImportingWallet]); const handleClick = index => { console.log('click', index); - const wallet = carouselData[index]; - if (wallet) { - if (wallet.type === PlaceholderWallet.type) { - Alert.alert( - loc.wallets.add_details, - loc.wallets.list_import_problem, - [ - { - text: loc.wallets.details_delete, - onPress: () => { - WalletImport.removePlaceholderWallet(); - }, - style: 'destructive', - }, - { - text: loc.wallets.list_tryagain, - onPress: () => { - props.navigation.navigate('AddWalletRoot', { screen: 'ImportWallet', params: { label: wallet.getSecret() } }); - WalletImport.removePlaceholderWallet(); - }, - style: 'default', - }, - ], - { cancelable: false }, - ); - } else { - props.navigation.navigate('WalletTransactions', { - walletID: wallet.getID(), - walletType: wallet.type, - key: `WalletTransactions-${wallet.getID()}`, - }); - } - } else { - // if its out of index - this must be last card with incentive to create wallet - if (!carouselData.some(wallet => wallet.type === PlaceholderWallet.type)) { - props.navigation.navigate('Navigation', { screen: 'AddWalletRoot' }); - } + if (index <= wallets.length - 1) { + const wallet = wallets[index]; + const walletID = wallet.getID(); + props.navigation.navigate('WalletTransactions', { + walletID: wallet.getID(), + walletType: wallet.type, + key: `WalletTransactions-${walletID}`, + }); + } else if (index >= wallets.length && !isImportingWallet) { + props.navigation.navigate('Navigation', { screen: 'AddWalletRoot' }); } }; const handleLongPress = () => { - if (carouselData.length > 1 && !carouselData.some(wallet => wallet.type === PlaceholderWallet.type)) { + if (wallets.length > 1 && !isImportingWallet) { props.navigation.navigate('ReorderWallets'); } else { ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); @@ -100,7 +62,7 @@ const DrawerList = props => { }; const onNewWalletPress = () => { - return !carouselData.some(wallet => wallet.type === PlaceholderWallet.type) ? props.navigation.navigate('AddWalletRoot') : null; + return !isImportingWallet ? props.navigation.navigate('AddWalletRoot') : null; }; const ListHeaderComponent = () => { @@ -114,13 +76,12 @@ const DrawerList = props => { const renderWalletsCarousel = ( { const [isToolbarVisibleForAndroid, setIsToolbarVisibleForAndroid] = useState(false); const route = useRoute(); + const { isImportingWallet } = useContext(BlueStorageContext); const label = (route.params && route.params.label) || ''; const triggerImport = (route.params && route.params.triggerImport) || false; const [importText, setImportText] = useState(label); @@ -67,9 +69,10 @@ const WalletsImport = () => { * @param importText */ const importMnemonic = async importText => { - if (WalletImport.isCurrentlyImportingWallet()) { + if (isImportingWallet && isImportingWallet.isFailure === false) { return; } + WalletImport.addPlaceholderWallet(importText); navigation.dangerouslyGetParent().pop(); await new Promise(resolve => setTimeout(resolve, 500)); // giving some time to animations @@ -77,11 +80,30 @@ const WalletsImport = () => { await WalletImport.processImportText(importText); WalletImport.removePlaceholderWallet(); } catch (error) { - WalletImport.removePlaceholderWallet(); - WalletImport.addPlaceholderWallet(importText, true); console.log(error); - alert(loc.wallets.import_error); ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); + Alert.alert( + loc.wallets.add_details, + loc.wallets.list_import_problem, + [ + { + text: loc.wallets.list_tryagain, + onPress: () => { + navigation.navigate('AddWalletRoot', { screen: 'ImportWallet', params: { label: importText } }); + WalletImport.removePlaceholderWallet(); + }, + style: 'default', + }, + { + text: loc._.cancel, + onPress: () => { + WalletImport.removePlaceholderWallet(); + }, + style: 'cancel', + }, + ], + { cancelable: false }, + ); } }; diff --git a/screen/wallets/list.js b/screen/wallets/list.js index dfc3822ab..79945154b 100644 --- a/screen/wallets/list.js +++ b/screen/wallets/list.js @@ -6,7 +6,6 @@ import { Text, StyleSheet, SectionList, - Alert, Platform, Image, Dimensions, @@ -21,8 +20,6 @@ import WalletsCarousel from '../../components/WalletsCarousel'; import { Icon } from 'react-native-elements'; import DeeplinkSchemaMatch from '../../class/deeplink-schema-match'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; -import { PlaceholderWallet } from '../../class'; -import WalletImport from '../../class/wallet-import'; import ActionSheet from '../ActionSheet'; import loc from '../../loc'; import { FContainer, FButton } from '../../components/FloatButtons'; @@ -39,8 +36,9 @@ const WalletsListSections = { CAROUSEL: 'CAROUSEL', LOCALTRADER: 'LOCALTRADER', const WalletsList = () => { const walletsCarousel = useRef(); + const currentWalletIndex = useRef(0); const colorScheme = useColorScheme(); - const { wallets, pendingWallets, getTransactions, getBalance, refreshAllWalletTransactions, setSelectedWallet } = useContext( + const { wallets, getTransactions, isImportingWallet, getBalance, refreshAllWalletTransactions, setSelectedWallet } = useContext( BlueStorageContext, ); const { width } = useWindowDimensions(); @@ -52,7 +50,6 @@ const WalletsList = () => { const [isLargeScreen, setIsLargeScreen] = useState( Platform.OS === 'android' ? isTablet() : width >= Dimensions.get('screen').width / 2 && (isTablet() || isDesktop), ); - const [carouselData, setCarouselData] = useState([]); const dataSource = getTransactions(null, 10); const walletsCount = useRef(wallets.length); const walletActionButtonsRef = useRef(); @@ -87,13 +84,6 @@ const WalletsList = () => { }, []), ); - useEffect(() => { - const allWallets = wallets.concat(pendingWallets); - const newCarouselData = allWallets.concat(false); - setCarouselData(newCarouselData); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [wallets, pendingWallets]); - useEffect(() => { if (walletsCount.current < wallets.length) { walletsCarousel.current?.scrollToItem({ item: wallets[walletsCount.current] }); @@ -102,11 +92,11 @@ const WalletsList = () => { }, [wallets]); useEffect(() => { - if (pendingWallets.length > 0) { - walletsCarousel.current?.scrollToIndex(carouselData.length - pendingWallets.length); + if (isImportingWallet) { + walletsCarousel.current?.scrollToItem({ item: false }); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [pendingWallets]); + }, [isImportingWallet]); const verifyBalance = () => { if (getBalance() !== 0) { @@ -163,41 +153,15 @@ const WalletsList = () => { const handleClick = index => { console.log('click', index); - const wallet = carouselData[index]; - if (wallet) { - if (wallet.type === PlaceholderWallet.type) { - Alert.alert( - loc.wallets.add_details, - loc.wallets.list_import_problem, - [ - { - text: loc.wallets.details_delete, - onPress: () => { - WalletImport.removePlaceholderWallet(); - }, - style: 'destructive', - }, - { - text: loc.wallets.list_tryagain, - onPress: () => { - navigate('AddWalletRoot', { screen: 'ImportWallet', params: { label: wallet.getSecret() } }); - WalletImport.removePlaceholderWallet(); - }, - style: 'default', - }, - ], - { cancelable: false }, - ); - } else { - const walletID = wallet.getID(); - navigate('WalletTransactions', { - walletID, - walletType: wallet.type, - key: `WalletTransactions-${walletID}`, - }); - } - } else { - // if its out of index - this must be last card with incentive to create wallet + if (index <= wallets.length - 1) { + const wallet = wallets[index]; + const walletID = wallet.getID(); + navigate('WalletTransactions', { + walletID, + walletType: wallet.type, + key: `WalletTransactions-${walletID}`, + }); + } else if (index >= wallets.length && !isImportingWallet) { navigate('AddWalletRoot'); } }; @@ -207,10 +171,16 @@ const WalletsList = () => { const contentOffset = e.nativeEvent.contentOffset; const index = Math.ceil(contentOffset.x / width); - console.log('onSnapToItem', index); - if (wallets[index] && (wallets[index].timeToRefreshBalance() || wallets[index].timeToRefreshTransaction())) { - console.log(wallets[index].getLabel(), 'thinks its time to refresh either balance or transactions. refetching both'); - refreshAllWalletTransactions(index, false).finally(() => setIsLoading(false)); + + if (currentWalletIndex.current !== index) { + console.log('onSnapToItem', wallets.length === index ? 'NewWallet/Importing card' : index); + if (wallets[index] && (wallets[index].timeToRefreshBalance() || wallets[index].timeToRefreshTransaction())) { + console.log(wallets[index].getLabel(), 'thinks its time to refresh either balance or transactions. refetching both'); + refreshAllWalletTransactions(index, false).finally(() => setIsLoading(false)); + } + currentWalletIndex.current = index; + } else { + console.log('onSnapToItem did not change. Most likely momentum stopped at the same index it started.'); } }; @@ -231,7 +201,7 @@ const WalletsList = () => { }; const handleLongPress = () => { - if (carouselData.length > 1 && !carouselData.some(wallet => wallet.type === PlaceholderWallet.type)) { + if (wallets.length > 1 && !isImportingWallet) { navigate('ReorderWallets'); } else { ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); @@ -247,8 +217,8 @@ const WalletsList = () => { }; const renderLocalTrader = () => { - if (carouselData.every(wallet => wallet === false)) return null; - if (carouselData.length > 0 && !carouselData.some(wallet => wallet.type === PlaceholderWallet.type)) { + if (wallets.every(wallet => wallet === false)) return null; + if (wallets.length > 0 && !isImportingWallet) { const button = ( { const renderWalletsCarousel = () => { return ( { switch (section.section.key) { case WalletsListSections.CAROUSEL: return isLargeScreen ? null : ( - wallet.type === PlaceholderWallet.type) ? () => navigate('AddWalletRoot') : null} - /> + navigate('AddWalletRoot')} /> ); case WalletsListSections.TRANSACTIONS: return renderListHeaderComponent(); @@ -333,7 +300,7 @@ const WalletsList = () => { }; const renderScanButton = () => { - if (carouselData.length > 0 && !carouselData.some(wallet => wallet.type === PlaceholderWallet.type)) { + if (wallets.length > 0 && isImportingWallet) { return ( Date: Sun, 18 Jul 2021 18:17:33 +0000 Subject: [PATCH 234/327] Translate /loc/en.json in sl_SI review completed for the source file '/loc/en.json' on the 'sl_SI' language. --- loc/sl_SI.json | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/loc/sl_SI.json b/loc/sl_SI.json index b710db54f..5e612922b 100644 --- a/loc/sl_SI.json +++ b/loc/sl_SI.json @@ -17,7 +17,11 @@ "success": "Uspešno", "wallet_key": "Ključ denarnice", "invalid_animated_qr_code_fragment" : "Neveljaven del animirane QR kode. Prosimo poskusite ponovno.", - "file_saved": "Datoteka ({filePath}) je bila shranjena v mapo Prenosi.", + "file_saved": "Datoteka {filePath} je bila shranjena v {destination}.", + "file_save_title": "Shrani datoteko", + "file_save_location": "Izberite, kam želite shraniti {filePath}", + "downloads_folder": "Mapa Prenosi", + "external_storage": "Zunanja shramba", "discard_changes": "Zavrzi spremembe?", "discard_changes_detail": "Imate neshranjene spremembe. Ali ste prepričani, da jih želite zavreči?" }, @@ -186,6 +190,7 @@ "details_no_signed_tx": "Izbrana datoteka ne vsebuje transakcije, ki jo je mogoče uvoziti.", "details_note_placeholder": "lastna opomba", "details_scan": "Skeniraj", + "details_scan_hint": "Dvakrat tapnite za skeniranje ali uvoz", "details_total_exceeds_balance": "Znesek presega razpoložljivo stanje.", "details_unrecognized_file_format": "Neprepoznana oblika datoteke", "details_wallet_before_tx": "Pred ustvarjanjem transakcije, morate dodati Bitcoin denarnico.", @@ -258,8 +263,8 @@ "electrum_connected_not": "Brez povezave", "electrum_error_connect": "Povezave s podanim Electrum strežnikom ni mogoče vzpostaviti", "electrum_host": "Npr. {example}", - "electrum_port": "TCP vrata, ponavadi {example}", - "electrum_port_ssl": "SSL vrata, ponavadi {example}", + "electrum_port": "Vrata, ponavadi {example}", + "use_ssl": "SSL", "electrum_saved": "Spremembe so bile uspešno shranjene. Da bodo spremembe začele veljati, bo morda potreben ponovni zagon.", "set_electrum_server_as_default": "Želite nastaviti {server} kot privzeti electrum strežnik?", "set_lndhub_as_default": "Želite nastaviti {url} kot privzeti LNDHub strežnik?", @@ -580,7 +585,9 @@ "sign_aopp_confirm": "Ali želite podpisano sporočilo poslati na {hostname}?", "addresses_title": "Naslovi", "type_change": "Vračilo", - "type_receive": "Prejemni" + "type_receive": "Prejemni", + "type_used": "Uporabljen", + "transactions": "Transakcije" }, "aopp": { "title": "Izberite Naslov", From 308e9e15452df84f83af1c9b4ecc87221b49af69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sun, 18 Jul 2021 12:34:03 -0400 Subject: [PATCH 235/327] ADD: isTorCapable Removes the need to manual code adjustments on platforms that aren't compatible with react-native-tor --- blue_modules/BlueElectrum.js | 10 ++++++---- blue_modules/environment.js | 14 +++++++++++++- class/wallets/lightning-custodian-wallet.js | 3 ++- screen/send/confirm.js | 3 ++- screen/settings/NetworkSettings.js | 4 ++-- screen/settings/electrumSettings.js | 4 ++-- screen/settings/lightningSettings.js | 4 ++-- screen/settings/torSettings.js | 3 +++ .../applypatchesformaccatalyst.sh | 7 ++++++- tests/setup.js | 1 + 10 files changed, 39 insertions(+), 14 deletions(-) diff --git a/blue_modules/BlueElectrum.js b/blue_modules/BlueElectrum.js index 174e9aa2e..0fe57391b 100644 --- a/blue_modules/BlueElectrum.js +++ b/blue_modules/BlueElectrum.js @@ -5,11 +5,12 @@ import { LegacyWallet, SegwitBech32Wallet, SegwitP2SHWallet } from '../class'; import DefaultPreference from 'react-native-default-preference'; import RNWidgetCenter from 'react-native-widget-center'; import loc from '../loc'; +import { isTorCapable } from './environment'; const bitcoin = require('bitcoinjs-lib'); const ElectrumClient = require('electrum-client'); const reverse = require('buffer-reverse'); const BigNumber = require('bignumber.js'); -const torrific = require('../blue_modules/torrific'); +const torrific = require('./torrific'); const Realm = require('realm'); const ELECTRUM_HOST = 'electrum_host'; @@ -102,12 +103,13 @@ async function connectMain() { try { console.log('begin connection:', JSON.stringify(usingPeer)); mainClient = new ElectrumClient( - usingPeer.host.endsWith('.onion') ? torrific : global.net, + usingPeer.host.endsWith('.onion') && isTorCapable ? torrific : global.net, global.tls, usingPeer.ssl || usingPeer.tcp, usingPeer.host, usingPeer.ssl ? 'tls' : 'tcp', ); + mainClient.onError = function (e) { console.log('electrum mainClient.onError():', e.message); if (mainConnected) { @@ -806,7 +808,7 @@ module.exports.calculateBlockTime = function (height) { */ module.exports.testConnection = async function (host, tcpPort, sslPort) { const client = new ElectrumClient( - host.endsWith('.onion') ? torrific : global.net, + host.endsWith('.onion') && isTorCapable ? torrific : global.net, global.tls, sslPort || tcpPort, host, @@ -818,7 +820,7 @@ module.exports.testConnection = async function (host, tcpPort, sslPort) { try { const rez = await Promise.race([ new Promise(resolve => { - timeoutId = setTimeout(() => resolve('timeout'), host.endsWith('.onion') ? 21000 : 5000); + timeoutId = setTimeout(() => resolve('timeout'), host.endsWith('.onion') && isTorCapable ? 21000 : 5000); }), client.connect(), ]); diff --git a/blue_modules/environment.js b/blue_modules/environment.js index c9c211a7e..a0850b5fc 100644 --- a/blue_modules/environment.js +++ b/blue_modules/environment.js @@ -1,8 +1,20 @@ +import { Platform } from 'react-native'; import { getSystemName, isTablet, getDeviceType } from 'react-native-device-info'; const isMacCatalina = getSystemName() === 'Mac OS X'; +const isDesktop = getDeviceType() === 'Desktop'; +const isTorCapable = () => { + let capable = true; + if (Platform.OS === 'android' && Platform.Version < 26) { + capable = false; + } else if (isDesktop) { + capable = false; + } + return capable; +}; module.exports.isMacCatalina = isMacCatalina; -module.exports.isDesktop = getDeviceType() === 'Desktop'; +module.exports.isDesktop = isDesktop; module.exports.isHandset = getDeviceType() === 'Handset'; module.exports.isTablet = isTablet; +module.exports.isTorCapable = isTorCapable(); diff --git a/class/wallets/lightning-custodian-wallet.js b/class/wallets/lightning-custodian-wallet.js index ce8b33315..15f6af987 100644 --- a/class/wallets/lightning-custodian-wallet.js +++ b/class/wallets/lightning-custodian-wallet.js @@ -2,6 +2,7 @@ import { LegacyWallet } from './legacy-wallet'; import Frisbee from 'frisbee'; import bolt11 from 'bolt11'; import { BitcoinUnit, Chain } from '../../models/bitcoinUnits'; +import { isTorCapable } from '../../blue_modules/environment'; const torrific = require('../../blue_modules/torrific'); export class LightningCustodianWallet extends LegacyWallet { @@ -72,7 +73,7 @@ export class LightningCustodianWallet extends LegacyWallet { baseURI: this.baseURI, }); - if (this.baseURI?.indexOf('.onion') !== -1) { + if (isTorCapable && this.baseURI?.indexOf('.onion') !== -1) { this._api = new torrific.Torsbee({ baseURI: this.baseURI, }); diff --git a/screen/send/confirm.js b/screen/send/confirm.js index 408ce1406..a2eb59595 100644 --- a/screen/send/confirm.js +++ b/screen/send/confirm.js @@ -16,6 +16,7 @@ import { BlueCurrentTheme } from '../../components/themes'; import Notifications from '../../blue_modules/notifications'; import { BlueStorageContext } from '../../blue_modules/storage-context'; import { Psbt } from 'bitcoinjs-lib'; +import { isTorCapable } from '../../blue_modules/environment'; const currency = require('../../blue_modules/currency'); const BlueElectrum = require('../../blue_modules/BlueElectrum'); const Bignumber = require('bignumber.js'); @@ -70,7 +71,7 @@ export default class Confirm extends Component { const wallet = new PayjoinTransaction(this.state.psbt, txHex => this.broadcast(txHex), this.state.fromWallet); const paymentScript = this.getPaymentScript(); let payjoinClient; - if (this.state.payjoinUrl.includes('.onion')) { + if (isTorCapable && this.state.payjoinUrl.includes('.onion')) { console.warn('trying TOR....'); const payjoinUrl = this.state.payjoinUrl; // working through TOR - crafting custom requester that will handle TOR http request diff --git a/screen/settings/NetworkSettings.js b/screen/settings/NetworkSettings.js index 63d2c3055..9ef9b7f7e 100644 --- a/screen/settings/NetworkSettings.js +++ b/screen/settings/NetworkSettings.js @@ -5,7 +5,7 @@ import Notifications from '../../blue_modules/notifications'; import navigationStyle from '../../components/navigationStyle'; import { SafeBlueArea, BlueListItem } from '../../BlueComponents'; import loc from '../../loc'; -import { isDesktop } from '../../blue_modules/environment'; +import { isTorCapable } from '../../blue_modules/environment'; const NetworkSettings = () => { const { navigate } = useNavigation(); @@ -35,7 +35,7 @@ const NetworkSettings = () => { chevron /> )} - {!isDesktop && } + {isTorCapable && } ); diff --git a/screen/settings/electrumSettings.js b/screen/settings/electrumSettings.js index a484dd232..ca76ce786 100644 --- a/screen/settings/electrumSettings.js +++ b/screen/settings/electrumSettings.js @@ -33,7 +33,7 @@ import { BlueDismissKeyboardInputAccessory, } from '../../BlueComponents'; import { BlueCurrentTheme } from '../../components/themes'; -import { isDesktop } from '../../blue_modules/environment'; +import { isTorCapable } from '../../blue_modules/environment'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; const BlueElectrum = require('../../blue_modules/BlueElectrum'); @@ -286,7 +286,7 @@ export default class ElectrumSettings extends Component { this.setState({ host: text.trim() })} diff --git a/screen/settings/lightningSettings.js b/screen/settings/lightningSettings.js index 31863ff32..0a0374b8f 100644 --- a/screen/settings/lightningSettings.js +++ b/screen/settings/lightningSettings.js @@ -12,7 +12,7 @@ import { LightningCustodianWallet } from '../../class/wallets/lightning-custodia import loc from '../../loc'; import { BlueCurrentTheme } from '../../components/themes'; import DeeplinkSchemaMatch from '../../class/deeplink-schema-match'; -import { isDesktop } from '../../blue_modules/environment'; +import { isTorCapable } from '../../blue_modules/environment'; const styles = StyleSheet.create({ uri: { @@ -136,7 +136,7 @@ const LightningSettings = () => { value={URI} placeholder={ loc.formatString(loc.settings.electrum_host, { example: '111.222.333.111' }) + - (!isDesktop ? ' (' + loc.settings.tor_supported + ')' : '') + (isTorCapable ? ' (' + loc.settings.tor_supported + ')' : '') } onChangeText={setLndhubURI} numberOfLines={1} diff --git a/screen/settings/torSettings.js b/screen/settings/torSettings.js index 714cd1446..f5b0f3e72 100644 --- a/screen/settings/torSettings.js +++ b/screen/settings/torSettings.js @@ -14,6 +14,9 @@ const styles = StyleSheet.create({ }, }); +/* + TorSettings is not displayed in Settings menu if isTorCapable is false. No need to provide code protection. +*/ const TorSettings = () => { const [isLoading, setIsLoading] = useState(false); const [daemonStatus, setDaemonStatus] = useState(''); diff --git a/scripts/maccatalystpatches/applypatchesformaccatalyst.sh b/scripts/maccatalystpatches/applypatchesformaccatalyst.sh index dcacb9ff2..e382abfb5 100755 --- a/scripts/maccatalystpatches/applypatchesformaccatalyst.sh +++ b/scripts/maccatalystpatches/applypatchesformaccatalyst.sh @@ -1,6 +1,11 @@ echo "Applying patch for package.json" sed -i '' '/react-native-tor/d' ./package.json +rm -fr node_modules echo "Re-installing node_modules" npm i +echo "Applying patch for react-native-xcode.sh" +sed -i '' 's/--platform "$BUNDLE_PLATFORM"/--platform "ios"/g' ./node_modules/react-native/scripts/react-native-xcode.sh +echo "Deleting torrific.js content" +echo > blue_modules/torrific.js echo "" -echo "react-native-tor is not currently compatible with Mac Catalyst. You will need to remove all references from torrific.js. After this, you should be able to compile BlueWallet using Mac Catalyst on XCode. If you are running macOS Catalina, you will need to remove the iOS 14 Widgets from the project targets." +echo "NOTE: react-native-tor is not currently compatible with Mac Catalyst. If you are running macOS Catalina, you will need to remove the iOS 14 Widgets from the project targets." diff --git a/tests/setup.js b/tests/setup.js index bd391bcc1..54864c461 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -24,6 +24,7 @@ jest.mock('react-native-device-info', () => { return { getUniqueId: jest.fn().mockReturnValue('uniqueId'), getSystemName: jest.fn(), + getDeviceType: jest.fn().mockReturnValue(false), hasGmsSync: jest.fn().mockReturnValue(true), hasHmsSync: jest.fn().mockReturnValue(false), }; From 695ec205bcc2b1abc71d30d4717de09cfee27b73 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 20 Jul 2021 00:31:03 +0000 Subject: [PATCH 236/327] fix: upgrade bolt11 from 1.3.1 to 1.3.2 Snyk has created this PR to upgrade bolt11 from 1.3.1 to 1.3.2. See this package in npm: https://www.npmjs.com/package/bolt11 See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5be41e3f7..18c99c6bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5649,9 +5649,9 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "bolt11": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/bolt11/-/bolt11-1.3.1.tgz", - "integrity": "sha512-dmTcJGIQ4RcSDgXMijhUO4JWskCelXhbpcedWsF7YoFcPw3QYzYWCowO0+GJFT2TvrHXtlYdbnMBT85Se8IJSA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/bolt11/-/bolt11-1.3.2.tgz", + "integrity": "sha512-WW86n1QdusD6t3j64B+GZLztj4skwoH/LBiiIrt7zpQvtaGJsRMavv22tDwoDBF/Yb143omPIq+R6sJaRRUP9w==", "requires": { "@types/bn.js": "^4.11.3", "bech32": "^1.1.2", diff --git a/package.json b/package.json index 0e8c4dca9..573b2adb9 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "bip39": "3.0.4", "bitcoinjs-lib": "5.2.0", "bitcoinjs-message": "2.2.0", - "bolt11": "1.3.1", + "bolt11": "1.3.2", "buffer": "6.0.3", "buffer-reverse": "1.0.1", "coinselect": "3.1.12", From eb1e8aedf7fd7b78efa6406de6a3a2aaa2e2848d Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Tue, 20 Jul 2021 17:36:44 +0300 Subject: [PATCH 237/327] ADD: UI for import wallet with passphrase --- BlueComponents.js | 2 +- class/wallet-import.js | 89 +++++++++++++++++++++++--------- loc/en.json | 2 + screen/wallets/export.js | 8 --- screen/wallets/import.js | 13 ++++- tests/e2e/bluewallet.spec.js | 45 +++++++++++++++- tests/integration/import.test.js | 35 ++++++++++++- tests/unit/hd-aezeed.test.js | 1 - 8 files changed, 157 insertions(+), 38 deletions(-) diff --git a/BlueComponents.js b/BlueComponents.js index 43ee8ce59..6992b1036 100644 --- a/BlueComponents.js +++ b/BlueComponents.js @@ -609,7 +609,7 @@ export class BlueCopyTextToClipboard extends Component { disabled={this.state.hasTappedText} testID="BlueCopyTextToClipboard" > - + {this.state.address} diff --git a/class/wallet-import.js b/class/wallet-import.js index 06c440aa0..d98688c60 100644 --- a/class/wallet-import.js +++ b/class/wallet-import.js @@ -60,10 +60,9 @@ function WalletImport() { return !!wallet; }; - WalletImport.removePlaceholderWallet = ()=> { - setIsImportingWallet(false) - } - + WalletImport.removePlaceholderWallet = () => { + setIsImportingWallet(false); + }; WalletImport.addPlaceholderWallet = (importText, isFailure = false) => { const placeholderWallet = new PlaceholderWallet(); @@ -81,8 +80,60 @@ function WalletImport() { * * @param importText * @returns {Promise} + * @returns {Promise<{text: string, password: string|void}>} */ - WalletImport.processImportText = async importText => { + WalletImport.askPasswordIfNeeded = async importText => { + const text = importText.trim(); + let password; + + // BIP38 password required + if (text.startsWith('6P')) { + do { + password = await prompt(loc.wallets.looks_like_bip38, loc.wallets.enter_bip38_password); + } while (!password); + return { text, password }; + } + + // HD BIP39 wallet password is optinal + const hd = new HDSegwitBech32Wallet(); + hd.setSecret(text); + if (hd.validateMnemonic()) { + password = await prompt(loc.wallets.import_passphrase_title, loc.wallets.import_passphrase_message); + return { text, password }; + } + + // AEZEED password needs to be correct + const aezeed = new HDAezeedWallet(); + aezeed.setSecret(text); + if (await aezeed.mnemonicInvalidPassword()) { + do { + password = await prompt('', loc.wallets.enter_bip38_password); + aezeed.setPassphrase(password); + } while (await aezeed.mnemonicInvalidPassword()); + return { text, password }; + } + + // SLIP39 wallet password is optinal + if (text.includes('\n')) { + const s1 = new SLIP39SegwitP2SHWallet(); + s1.setSecret(text); + + if (s1.validateMnemonic()) { + password = await prompt(loc.wallets.import_passphrase_title, loc.wallets.import_passphrase_message); + return { text, password }; + } + } + + return { text, password }; + }; + + /** + * + * @param importText + * @param password + * @returns {Promise} + */ + WalletImport.processImportText = async (importText, password) => { IdleTimerManager.setIdleTimerDisabled(true); // Plan: // -2. check if BIP38 encrypted @@ -94,6 +145,7 @@ function WalletImport() { // 3. check if its HDLegacyBreadwalletWallet (no BIP, just "m/0") // 3.1 check HD Electrum legacy // 3.2 check if its AEZEED + // 3.3 check if its SLIP39 // 4. check if its Segwit WIF (P2SH) // 5. check if its Legacy WIF // 6. check if its address (watch-only wallet) @@ -103,11 +155,6 @@ function WalletImport() { importText = importText.trim(); if (importText.startsWith('6P')) { - let password = false; - do { - password = await prompt(loc.wallets.looks_like_bip38, loc.wallets.enter_bip38_password, false); - } while (!password); - const decryptedKey = await bip38.decrypt(importText, password); if (decryptedKey) { @@ -148,8 +195,7 @@ function WalletImport() { const hd4 = new HDSegwitBech32Wallet(); hd4.setSecret(importText); if (hd4.validateMnemonic()) { - // OK its a valid BIP39 seed - + hd4.setPassphrase(password); if (await hd4.wasEverUsed()) { await hd4.fetchBalance(); // fetching balance for BIP84 only on purpose return WalletImport._saveWallet(hd4); @@ -157,18 +203,21 @@ function WalletImport() { const hd2 = new HDSegwitP2SHWallet(); hd2.setSecret(importText); + hd2.setPassphrase(password); if (await hd2.wasEverUsed()) { return WalletImport._saveWallet(hd2); } const hd3 = new HDLegacyP2PKHWallet(); hd3.setSecret(importText); + hd3.setPassphrase(password); if (await hd3.wasEverUsed()) { return WalletImport._saveWallet(hd3); } const hd1 = new HDLegacyBreadwalletWallet(); hd1.setSecret(importText); + hd1.setPassphrase(password); if (await hd1.wasEverUsed()) { return WalletImport._saveWallet(hd1); } @@ -245,21 +294,10 @@ function WalletImport() { try { const aezeed = new HDAezeedWallet(); aezeed.setSecret(importText); + aezeed.setPassphrase(password); if (await aezeed.validateMnemonicAsync()) { // not fetching txs or balances, fuck it, yolo, life is too short return WalletImport._saveWallet(aezeed); - } else { - // there is a chance that a password is required - if (await aezeed.mnemonicInvalidPassword()) { - const password = await prompt(loc.wallets.enter_bip38_password, '', false); - if (!password) { - // no passord is basically cancel whole aezeed import process - throw new Error(loc._.bad_password); - } - - const mnemonics = importText.split(':')[0]; - return WalletImport.processImportText(mnemonics + ':' + password); - } } } catch (_) {} @@ -270,11 +308,13 @@ function WalletImport() { s1.setSecret(importText); if (s1.validateMnemonic()) { + s1.setPassphrase(password); if (await s1.wasEverUsed()) { return WalletImport._saveWallet(s1); } const s2 = new SLIP39LegacyP2PKHWallet(); + s2.setPassphrase(password); s2.setSecret(importText); if (await s2.wasEverUsed()) { return WalletImport._saveWallet(s2); @@ -282,6 +322,7 @@ function WalletImport() { const s3 = new SLIP39SegwitBech32Wallet(); s3.setSecret(importText); + s3.setPassphrase(password); return WalletImport._saveWallet(s3); } } diff --git a/loc/en.json b/loc/en.json index 2a9adcb9e..a50afe462 100644 --- a/loc/en.json +++ b/loc/en.json @@ -425,6 +425,8 @@ "enter_bip38_password": "Enter password to decrypt", "export_title": "Wallet Export", "import_do_import": "Import", + "import_passphrase_title": "Passphrase", + "import_passphrase_message": "Enter passphrase if you have used any", "import_error": "Failed to import. Please make sure that the provided data is valid.", "import_explanation": "Please enter your seed words, public key, WIF, or anything you’ve got. BlueWallet will do its best to guess the correct format and import your wallet.", "import_file": "Import File", diff --git a/screen/wallets/export.js b/screen/wallets/export.js index 882d850eb..6cd8501da 100644 --- a/screen/wallets/export.js +++ b/screen/wallets/export.js @@ -136,14 +136,6 @@ const WalletExport = () => { )} ))} - {wallet.getPassphrase && wallet.getPassphrase() && ( - <> - - - {wallet.getPassphrase()} - - - )} ); diff --git a/screen/wallets/import.js b/screen/wallets/import.js index 4fdd21267..7b4ac4c79 100644 --- a/screen/wallets/import.js +++ b/screen/wallets/import.js @@ -73,11 +73,20 @@ const WalletsImport = () => { return; } - WalletImport.addPlaceholderWallet(importText); + let res; + try { + res = await WalletImport.askPasswordIfNeeded(importText); + } catch (e) { + // prompt cancelled + return; + } + const { text, password } = res; + + WalletImport.addPlaceholderWallet(text); navigation.dangerouslyGetParent().pop(); await new Promise(resolve => setTimeout(resolve, 500)); // giving some time to animations try { - await WalletImport.processImportText(importText); + await WalletImport.processImportText(text, password); WalletImport.removePlaceholderWallet(); } catch (error) { console.log(error); diff --git a/tests/e2e/bluewallet.spec.js b/tests/e2e/bluewallet.spec.js index e1a45ee8b..50cf5ec7a 100644 --- a/tests/e2e/bluewallet.spec.js +++ b/tests/e2e/bluewallet.spec.js @@ -1145,6 +1145,34 @@ describe('BlueWallet UI Tests', () => { process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1'); }); + + it('can import HD wallet with a passphrase', async () => { + const lockFile = '/tmp/travislock.' + hashIt(jasmine.currentTest.fullName); + if (process.env.TRAVIS) { + if (require('fs').existsSync(lockFile)) + return console.warn('skipping', JSON.stringify(jasmine.currentTest.fullName), 'as it previously passed on Travis'); + } + + await helperImportWallet( + 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about', + 'Imported HD SegWit (BIP84 Bech32 Native)', + '0 BTC', + 'BlueWallet', + ); + + await element(by.id('ReceiveButton')).tap(); + try { + // in case emulator has no google services and doesnt support pushes + // we just dont show this popup + await element(by.text(`No, and don’t ask me again`)).tap(); + } catch (_) {} + await yo('BitcoinAddressQRCodeContainer'); + + // check if imported wallet has correct recive address + await expect(element(by.id('AddressValue'))).toHaveText('bc1qe8q660wfj6uvqg7zyn86jcsux36natklqnfdrc'); + + process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1'); + }); }); async function sleep(ms) { @@ -1183,7 +1211,7 @@ async function helperCreateWallet(walletName) { await expect(element(by.id(walletName || 'cr34t3d'))).toBeVisible(); } -async function helperImportWallet(importText, expectedWalletLabel, expectedBalance) { +async function helperImportWallet(importText, expectedWalletLabel, expectedBalance, passphrase) { await yo('WalletsList'); await element(by.id('WalletsList')).swipe('left', 'fast', 1); // in case emu screen is small and it doesnt fit @@ -1198,6 +1226,21 @@ async function helperImportWallet(importText, expectedWalletLabel, expectedBalan try { await element(by.id('DoImport')).tap(); } catch (_) {} + + let passphraseAsked = false; + try { + await sup('Passphrase', 3000); + passphraseAsked = true; + } catch (e) {} // passphrase not asked + + if (passphraseAsked) { + // enter passphrase if needed + if (passphrase) { + await element(by.type('android.widget.EditText')).typeText(passphrase); + } + await element(by.text('OK')).tap(); + } + if (process.env.TRAVIS) await sleep(60000); // waiting for import result diff --git a/tests/integration/import.test.js b/tests/integration/import.test.js index ade2f6745..edf0fb685 100644 --- a/tests/integration/import.test.js +++ b/tests/integration/import.test.js @@ -11,6 +11,7 @@ import { WatchOnlyWallet, HDAezeedWallet, SLIP39SegwitP2SHWallet, + SLIP39SegwitBech32Wallet, } from '../../class'; import WalletImport from '../../class/wallet-import'; import React from 'react'; @@ -72,6 +73,16 @@ describe('import procedure', function () { assert.strictEqual(lastImportedWallet.getLabel(), 'Imported HD SegWit (BIP84 Bech32 Native)'); }); + it('can import BIP84 with passphrase', async () => { + await WalletImport.processImportText( + 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about', + 'BlueWallet', + ); + assert.strictEqual(lastImportedWallet.type, HDSegwitBech32Wallet.type); + assert.strictEqual(lastImportedWallet._getExternalAddressByIndex(0), 'bc1qe8q660wfj6uvqg7zyn86jcsux36natklqnfdrc'); + assert.strictEqual(lastImportedWallet.getLabel(), 'Imported HD SegWit (BIP84 Bech32 Native)'); + }); + it('can import Legacy', async () => { await WalletImport.processImportText('KztVRmc2EJJBHi599mCdXrxMTsNsGy3NUjc3Fb3FFDSMYyMDRjnv'); assert.strictEqual(lastImportedWallet.type, LegacyWallet.type); @@ -141,6 +152,14 @@ describe('import procedure', function () { assert.strictEqual(lastImportedWallet.type, HDAezeedWallet.type); }); + it('can import AEZEED with password', async () => { + await WalletImport.processImportText( + 'able mix price funny host express lawsuit congress antique float pig exchange vapor drip wide cup style apple tumble verb fix blush tongue market', + 'strongPassword', + ); + assert.strictEqual(lastImportedWallet.type, HDAezeedWallet.type); + }); + it('importing empty BIP39 should yield BIP84', async () => { const tempWallet = new HDSegwitBech32Wallet(); await tempWallet.generate(); @@ -157,7 +176,7 @@ describe('import procedure', function () { }); it('can import BIP38 encrypted backup', async () => { - await WalletImport.processImportText('6PnU5voARjBBykwSddwCdcn6Eu9EcsK24Gs5zWxbJbPZYW7eiYQP8XgKbN'); + await WalletImport.processImportText('6PnU5voARjBBykwSddwCdcn6Eu9EcsK24Gs5zWxbJbPZYW7eiYQP8XgKbN', 'qwerty'); assert.strictEqual(lastImportedWallet.getSecret(), 'KxqRtpd9vFju297ACPKHrGkgXuberTveZPXbRDiQ3MXZycSQYtjc'); assert.strictEqual(lastImportedWallet.type, LegacyWallet.type); assert.strictEqual(lastImportedWallet.getAddress(), '1639W2kM6UY9PdavMQeLqG4SuUEae9NZfq'); @@ -189,6 +208,20 @@ describe('import procedure', function () { assert.strictEqual(lastImportedWallet.type, SLIP39SegwitP2SHWallet.type); }); + it('can import slip39 wallet with password', async () => { + // 2-of-3 slip39 wallet + // crystal lungs academic acid corner infant satisfy spider alcohol laser golden equation fiscal epidemic infant scholar space findings tadpole belong + // crystal lungs academic agency class payment actress avoid rebound ordinary exchange petition tendency mild mobile spine robin fancy shelter increase + // crystal lungs academic always earth satoshi elbow satoshi that pants formal leaf rival texture romantic filter expand regular soul desert + await WalletImport.processImportText( + 'crystal lungs academic acid corner infant satisfy spider alcohol laser golden equation fiscal epidemic infant scholar space findings tadpole belong\n' + + 'crystal lungs academic agency class payment actress avoid rebound ordinary exchange petition tendency mild mobile spine robin fancy shelter increase', + 'BlueWallet', + ); + assert.strictEqual(lastImportedWallet.type, SLIP39SegwitBech32Wallet.type); + assert.strictEqual(lastImportedWallet._getExternalAddressByIndex(0), 'bc1q5k23fle53w8a3982m82e9f6hqlnrh3mv5s9s6z'); + }); + it('can import watch-only Cobo vault export', async () => { await WalletImport.processImportText( '{"ExtPubKey":"zpub6riZchHnrWzhhZ3Z4dhCJmesGyafMmZBRC9txhnidR313XJbcv4KiDubderKHhL7rMsqacYd82FQ38e4whgs8Dg7CpsxX3dSGWayXsEerF4","MasterFingerprint":"7D2F0272","AccountKeyPath":"84\'\\/0\'\\/0\'","CoboVaultFirmwareVersion":"2.6.1(BTC-Only)"}', diff --git a/tests/unit/hd-aezeed.test.js b/tests/unit/hd-aezeed.test.js index 30d436a6d..e24baed38 100644 --- a/tests/unit/hd-aezeed.test.js +++ b/tests/unit/hd-aezeed.test.js @@ -43,7 +43,6 @@ describe('HDAezeedWallet', () => { aezeed.setSecret( 'able concert slush lend olive cost wagon dawn board robot park snap dignity churn fiction quote shrimp hammer wing jump immune skill sunset west', ); - aezeed.setPassphrase(); aezeed.setPassphrase('aezeed'); assert.ok(await aezeed.validateMnemonicAsync()); assert.ok(!(await aezeed.mnemonicInvalidPassword())); From 361c27a93733639268c8b31184a80c22c592ea6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Tue, 20 Jul 2021 11:33:14 -0400 Subject: [PATCH 238/327] OPS: Update RN Windows to match current mobile RN --- package-lock.json | 613 +++++++++++++++++++++++++++++++--------------- package.json | 6 +- 2 files changed, 417 insertions(+), 202 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18c99c6bb..01816bf39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3346,21 +3346,21 @@ } }, "@react-native-windows/cli": { - "version": "0.63.12", - "resolved": "https://registry.npmjs.org/@react-native-windows/cli/-/cli-0.63.12.tgz", - "integrity": "sha512-N8cD2SpDqJl8H4z+IvlYIibMEBlcA+KO/2fT80Qz3c303FibPJjxcz2OAYoXMwYXhSsfzJf5mSrCOrmFXTbw0g==", + "version": "0.64.4", + "resolved": "https://registry.npmjs.org/@react-native-windows/cli/-/cli-0.64.4.tgz", + "integrity": "sha512-4I5dJ/FFiU0oEEXMgAdLo61XS5zuIOKhREP7cCbsYIISV1I/Q9IHnujpAyqgqXlXlxc6OLhjTI3ZKAgmQyd6DQ==", "requires": { - "@react-native-windows/telemetry": "^0.63.5", - "chalk": "^3.0.0", + "@react-native-windows/package-utils": "0.64.0", + "@react-native-windows/telemetry": "0.64.0", + "chalk": "^4.1.0", "cli-spinners": "^2.2.0", "envinfo": "^7.5.0", "find-up": "^4.1.0", "glob": "^7.1.1", "inquirer": "^3.0.6", "mustache": "^4.0.1", - "nuget-exe": "5.8.0", "ora": "^3.4.0", - "semver": "^7.1.3", + "semver": "^7.3.2", "shelljs": "^0.8.4", "username": "^5.1.0", "uuid": "^3.3.2", @@ -3383,9 +3383,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3574,10 +3574,60 @@ } } }, + "@react-native-windows/find-repo-root": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@react-native-windows/find-repo-root/-/find-repo-root-0.64.0.tgz", + "integrity": "sha512-qGWr5wdJrJIraQv7i2v17l3uazhYDMSeqyH96PiJ7XVuPS4dYnsxj4mIXqEneQwaS8T/xs5unAOHKMkGxlkynA==", + "requires": { + "find-up": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + } + } + }, + "@react-native-windows/package-utils": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@react-native-windows/package-utils/-/package-utils-0.64.0.tgz", + "integrity": "sha512-rzfZlNlrFtt0BRH1Pis2oEHpEDSgeLoS72VnSw4lLasfRR22bckGvB40SXSK15+CjPLgyycf0i65q1prR/Ciig==", + "requires": { + "@react-native-windows/find-repo-root": "0.64.0", + "get-monorepo-packages": "^1.2.0", + "lodash": "^4.17.15" + } + }, "@react-native-windows/telemetry": { - "version": "0.63.5", - "resolved": "https://registry.npmjs.org/@react-native-windows/telemetry/-/telemetry-0.63.5.tgz", - "integrity": "sha512-Ifd54IIcGbPjwAGfjJkRfdk5+SNtc9oCWgKMrJszIrlJ1REYVUXBo+6Xw3taKyA1Jf1eCB7DWlb98/NbqdLgcg==", + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@react-native-windows/telemetry/-/telemetry-0.64.0.tgz", + "integrity": "sha512-63tRE65qwahH+9iencPxDq31n/k/VVS4aG3aLDvAmBjnjIqS67ZLv7ewWrVQ0XJLBKn9Xcx38lU2xnJ9IhQN6A==", "requires": { "applicationinsights": "^1.8.8" } @@ -4292,22 +4342,6 @@ "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==" }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", @@ -4338,22 +4372,6 @@ } } }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -4367,11 +4385,6 @@ "color-convert": "^1.9.0" } }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" - }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -4569,10 +4582,18 @@ "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { "version": "0.3.2", @@ -6409,11 +6430,6 @@ "simple-swizzle": "^0.2.2" } }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, "colorette": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", @@ -7123,6 +7139,29 @@ "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.1.tgz", "integrity": "sha1-082BIh4+pAdCz83lVtTpnpjdxxs=" }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "requires": { + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -8736,17 +8775,6 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -8807,35 +8835,6 @@ "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" }, - "fbjs-scripts": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz", - "integrity": "sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ==", - "requires": { - "@babel/core": "^7.0.0", - "ansi-colors": "^1.0.1", - "babel-preset-fbjs": "^3.2.0", - "core-js": "^2.4.1", - "cross-spawn": "^5.1.0", - "fancy-log": "^1.3.2", - "object-assign": "^4.0.1", - "plugin-error": "^0.1.2", - "semver": "^5.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -9187,6 +9186,33 @@ "has-symbols": "^1.0.1" } }, + "get-monorepo-packages": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-monorepo-packages/-/get-monorepo-packages-1.2.0.tgz", + "integrity": "sha512-aDP6tH+eM3EuVSp3YyCutOcFS4Y9AhRRH9FAd+cjtR/g63Hx+DCXdKoP1ViRPUJz5wm+BOEXB4FhoffGHxJ7jQ==", + "requires": { + "globby": "^7.1.1", + "load-json-file": "^4.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -9310,6 +9336,36 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + } + } + }, "graceful-fs": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", @@ -16313,11 +16369,6 @@ "boolbase": "~1.0.0" } }, - "nuget-exe": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/nuget-exe/-/nuget-exe-5.8.0.tgz", - "integrity": "sha512-m95SBWa+SJNOfR0GTwdQ3OwK2915Ts3XvajYx0iaOZYydwvz6reJyptiNGf+HQhvTe5viNiRAmGXxNww9obZjw==" - }, "nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", @@ -16792,11 +16843,6 @@ "json-parse-better-errors": "^1.0.1" } }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" - }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -16929,47 +16975,6 @@ "xmldom": "^0.5.0" } }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" - } - } - }, "pngjs": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", @@ -18229,56 +18234,175 @@ "from": "git+https://github.com/BlueWallet/react-native-widget-center.git#e2e9a9038b76d096bf929a87105a97a0a7095001" }, "react-native-windows": { - "version": "0.63.35", - "resolved": "https://registry.npmjs.org/react-native-windows/-/react-native-windows-0.63.35.tgz", - "integrity": "sha512-E4J4PQbBV68c95ZZzjotuWOXfrHYJ1Npju9BxQjfvZFwE31cS6963LfSXc/MUeO2fEbyyJFE0CYoOv7B6FzZsg==", + "version": "0.64.14", + "resolved": "https://registry.npmjs.org/react-native-windows/-/react-native-windows-0.64.14.tgz", + "integrity": "sha512-OkLl8BvbbZgW5Ep0vWwIDI45/TU/Tns62PQYRyZqQB2a/pyfAFxLJFGR6cWXIsdlHYUqVduJDFEmOt71mqZPUA==", "requires": { - "@babel/runtime": "^7.8.4", - "@react-native-windows/cli": "0.63.12", + "@babel/runtime": "^7.0.0", + "@jest/create-cache-key-function": "^26.5.0", + "@react-native-community/cli": "^5.0.1-alpha.0", + "@react-native-community/cli-platform-android": "^5.0.1-alpha.0", + "@react-native-community/cli-platform-ios": "^5.0.1-alpha.0", + "@react-native-windows/cli": "0.64.4", + "@react-native/assets": "1.0.0", + "@react-native/normalize-color": "1.0.0", + "@react-native/polyfills": "1.0.0", "abort-controller": "^3.0.0", "anser": "^1.4.9", "base64-js": "^1.1.2", "event-target-shim": "^5.0.1", - "fbjs": "^1.0.0", - "fbjs-scripts": "^1.1.0", + "hermes-engine": "~0.7.0", "invariant": "^2.2.4", + "jsc-android": "^245459.0.0", + "metro-babel-register": "0.64.0", + "metro-react-native-babel-transformer": "0.64.0", + "metro-runtime": "0.64.0", + "metro-source-map": "0.64.0", "nullthrows": "^1.1.1", - "pretty-format": "^24.9.0", + "pretty-format": "^26.5.2", "promise": "^8.0.3", "prop-types": "^15.7.2", "react-devtools-core": "^4.6.0", + "react-native-codegen": "^0.0.6", + "react-refresh": "^0.4.0", "regenerator-runtime": "^0.13.2", - "scheduler": "0.19.1", + "scheduler": "^0.20.1", + "shelljs": "^0.8.4", "stacktrace-parser": "^0.1.3", "use-subscription": "^1.0.0", - "whatwg-fetch": "^3.0.0" + "whatwg-fetch": "^3.0.0", + "ws": "^7.4.6" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "@react-native-community/cli": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-5.0.1.tgz", + "integrity": "sha512-9VzSYUYSEqxEH5Ib2UNSdn2eyPiYZ4T7Y79o9DKtRBuSaUIwbCUdZtIm+UUjBpLS1XYBkW26FqL8/UdZDmQvXw==", "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@react-native-community/cli-debugger-ui": "^5.0.1", + "@react-native-community/cli-hermes": "^5.0.1", + "@react-native-community/cli-server-api": "^5.0.1", + "@react-native-community/cli-tools": "^5.0.1", + "@react-native-community/cli-types": "^5.0.1", + "appdirsjs": "^1.2.4", + "chalk": "^3.0.0", + "command-exists": "^1.2.8", + "commander": "^2.19.0", + "cosmiconfig": "^5.1.0", + "deepmerge": "^3.2.0", + "envinfo": "^7.7.2", + "execa": "^1.0.0", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.3", + "graceful-fs": "^4.1.3", + "joi": "^17.2.1", + "leven": "^3.1.0", + "lodash": "^4.17.15", + "metro": "^0.64.0", + "metro-config": "^0.64.0", + "metro-core": "^0.64.0", + "metro-react-native-babel-transformer": "^0.64.0", + "metro-resolver": "^0.64.0", + "metro-runtime": "^0.64.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "node-stream-zip": "^1.9.1", + "ora": "^3.4.0", + "pretty-format": "^26.6.2", + "prompts": "^2.4.0", + "semver": "^6.3.0", + "serve-static": "^1.13.1", + "strip-ansi": "^5.2.0", + "sudo-prompt": "^9.0.0", + "wcwidth": "^1.0.1" } }, - "@types/istanbul-reports": { - "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==", + "@react-native-community/cli-debugger-ui": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-5.0.1.tgz", + "integrity": "sha512-5gGKaaXYOVE423BUqxIfvfAVSj5Cg1cU/TpGbeg/iqpy2CfqyWqJB3tTuVUbOOiOvR5wbU8tti6pIi1pchJ+oA==", "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" + "serve-static": "^1.13.1" } }, - "@types/yargs": { - "version": "13.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", - "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==", + "@react-native-community/cli-hermes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-5.0.1.tgz", + "integrity": "sha512-nD+ZOFvu5MfjLB18eDJ01MNiFrzj8SDtENjGpf0ZRFndOWASDAmU54/UlU/wj8OzTToK1+S1KY7j2P2M1gleww==", "requires": { - "@types/yargs-parser": "*" + "@react-native-community/cli-platform-android": "^5.0.1", + "@react-native-community/cli-tools": "^5.0.1", + "chalk": "^3.0.0", + "hermes-profile-transformer": "^0.0.6", + "ip": "^1.1.5" + }, + "dependencies": { + "@react-native-community/cli-platform-android": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-5.0.1.tgz", + "integrity": "sha512-qv9GJX6BJ+Y4qvV34vgxKwwN1cnveXUdP6y2YmTW7XoAYs5YUzKqHajpY58EyucAL2y++6+573t5y4U/9IIoww==", + "requires": { + "@react-native-community/cli-tools": "^5.0.1", + "chalk": "^3.0.0", + "execa": "^1.0.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.3", + "jetifier": "^1.6.2", + "lodash": "^4.17.15", + "logkitty": "^0.7.1", + "slash": "^3.0.0", + "xmldoc": "^1.1.2" + } + } + } + }, + "@react-native-community/cli-server-api": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-5.0.1.tgz", + "integrity": "sha512-OOxL+y9AOZayQzmSW+h5T54wQe+QBc/f67Y9QlWzzJhkKJdYx+S4VOooHoD5PFJzGbYaxhu2YF17p517pcEIIA==", + "requires": { + "@react-native-community/cli-debugger-ui": "^5.0.1", + "@react-native-community/cli-tools": "^5.0.1", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.0", + "nocache": "^2.1.0", + "pretty-format": "^26.6.2", + "serve-static": "^1.13.1", + "ws": "^1.1.0" + }, + "dependencies": { + "ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + } + } + }, + "@react-native-community/cli-tools": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-5.0.1.tgz", + "integrity": "sha512-XOX5w98oSE8+KnkMZZPMRT7I5TaP8fLbDl0tCu40S7Epz+Zz924n80fmdu6nUDIfPT1nV6yH1hmHmWAWTDOR+Q==", + "requires": { + "chalk": "^3.0.0", + "lodash": "^4.17.15", + "mime": "^2.4.1", + "node-fetch": "^2.6.0", + "open": "^6.2.0", + "shell-quote": "1.6.1" + } + }, + "@react-native-community/cli-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-5.0.1.tgz", + "integrity": "sha512-BesXnuFFlU/d1F3+sHhvKt8fUxbQlAbZ3hhMEImp9A6sopl8TEtryUGJ1dbazGjRXcADutxvjwT/i3LJVTIQug==", + "requires": { + "ora": "^3.4.0" } }, "ansi-regex": { @@ -18286,25 +18410,122 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "color-convert": "^2.0.1" } }, - "scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "ws": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==" } } }, @@ -19688,8 +19909,7 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, "strip-eof": { "version": "1.0.0", @@ -20101,11 +20321,6 @@ } } }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" - }, "tiny-secp256k1": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", diff --git a/package.json b/package.json index 573b2adb9..02e328d0c 100644 --- a/package.json +++ b/package.json @@ -123,8 +123,8 @@ "process": "0.11.10", "prop-types": "15.7.2", "react": "17.0.1", - "react-native": "0.64.2", "react-localization": "1.0.17", + "react-native": "0.64.2", "react-native-blue-crypto": "https://github.com/BlueWallet/react-native-blue-crypto", "react-native-camera": "3.44.1", "react-native-crypto": "2.2.0", @@ -169,6 +169,7 @@ "react-native-watch-connectivity": "1.0.3", "react-native-webview": "11.6.4", "react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#e2e9a9038b76d096bf929a87105a97a0a7095001", + "react-native-windows": "0.64.14", "react-test-render": "1.1.2", "readable-stream": "3.6.0", "realm": "10.6.0", @@ -179,8 +180,7 @@ "stream-browserify": "2.0.2", "url": "0.11.0", "util": "0.12.4", - "wif": "2.0.6", - "react-native-windows": "0.63.35" + "wif": "2.0.6" }, "react-native": { "crypto": "react-native-crypto", From 4fed24a47c61faac7cf741e4e8977b18a9113a32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Tue, 20 Jul 2021 12:21:46 -0400 Subject: [PATCH 239/327] OPS: Update Windows files --- ios/BlueWallet.xcodeproj/project.pbxproj | 14 +- metro.config.js | 36 ++-- package-lock.json | 2 +- package.json | 5 +- windows/ExperimentalFeatures.props | 24 +++ windows/NuGet.Config | 14 ++ windows/bluewallet.sln | 158 +++--------------- windows/bluewallet/App.cpp | 23 ++- windows/bluewallet/App.h | 1 + .../bluewallet/AutolinkedNativeModules.g.cpp | 26 +-- .../AutolinkedNativeModules.g.props | 2 +- .../AutolinkedNativeModules.g.targets | 20 --- windows/bluewallet/Package.appxmanifest | 4 +- windows/bluewallet/bluewallet.vcxproj | 13 +- windows/bluewallet/packages.config | 2 +- windows/bluewallet/pch.h | 3 +- 16 files changed, 125 insertions(+), 222 deletions(-) create mode 100644 windows/ExperimentalFeatures.props create mode 100644 windows/NuGet.Config diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index e60d6230c..d718cdd5c 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -50,7 +50,7 @@ 6DD410BF266CB13D0087DE03 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; }; 6DD410C0266CB1460087DE03 /* MarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9946622555A660000E52E8 /* MarketWidget.swift */; }; 6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; }; - 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* EFQRCode */; }; + 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */; }; 6DFC807224EA2FA9007B8700 /* ViewQRCodefaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFC807124EA2FA9007B8700 /* ViewQRCodefaceController.swift */; }; 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; @@ -397,7 +397,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */, + 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -837,7 +837,7 @@ ); name = "BlueWalletWatch Extension"; packageProductDependencies = ( - 6DFC806F24EA0B6C007B8700 /* EFQRCode */, + 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */, ); productName = "BlueWalletWatch Extension"; productReference = B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */; @@ -921,7 +921,7 @@ ); mainGroup = 83CBB9F61A601CBA00E9B192; packageReferences = ( - 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */, + 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */, ); productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; projectDirPath = ""; @@ -1960,7 +1960,7 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */ = { + 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/EFPrefix/EFQRCode.git"; requirement = { @@ -1971,9 +1971,9 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 6DFC806F24EA0B6C007B8700 /* EFQRCode */ = { + 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */ = { isa = XCSwiftPackageProductDependency; - package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */; + package = 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */; productName = EFQRCode; }; /* End XCSwiftPackageProductDependency section */ diff --git a/metro.config.js b/metro.config.js index 2b544f130..fd816dfa8 100644 --- a/metro.config.js +++ b/metro.config.js @@ -4,26 +4,26 @@ * * @format */ - -// const path = require('path'); -// const blacklist = require('metro-config/src/defaults/blacklist'); +const path = require('path'); +const exclusionList = require('metro-config/src/defaults/exclusionList'); module.exports = { resolver: { - // blacklistRE: blacklist([ - // // This stops "react-native run-windows" from causing the metro server to crash if its already running - // new RegExp(`${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`), - // // This prevents "react-native run-windows" from hitting: EBUSY: resource busy or locked, open msbuild.ProjectImports.zip - // /.*\.ProjectImports\.zip/, - // ]), - // }, - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: false, - }, - }), - }, + blockList: exclusionList([ + // This stops "react-native run-windows" from causing the metro server to crash if its already running + new RegExp( + `${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`, + ), + // This prevents "react-native run-windows" from hitting: EBUSY: resource busy or locked, open msbuild.ProjectImports.zip + /.*\.ProjectImports\.zip/, + ]), + }, + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: true, + }, + }), }, }; diff --git a/package-lock.json b/package-lock.json index 01816bf39..3dc1c95f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19223,7 +19223,7 @@ } }, "scryptsy": { - "version": "file:blue_modules/scryptsy", + "version": "file:https:/registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" }, "secp256k1": { diff --git a/package.json b/package.json index 02e328d0c..cc995dc87 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,8 @@ "lint": "eslint *.js screen/**/*.js blue_modules/*.js class/**/*.js models/ loc/ tests/**/*.js components/**/*.js components/*.js", "lint:fix": "npm run lint -- --fix", "lint:quickfix": "git status --porcelain | grep -v '\\.json' | grep '\\.js' --color=never | awk '{print $2}' | xargs eslint --fix; exit 0", - "unit": "jest tests/unit/*" + "unit": "jest tests/unit/*", + "windows": "react-native run-windows" }, "jest": { "preset": "react-native", @@ -169,7 +170,7 @@ "react-native-watch-connectivity": "1.0.3", "react-native-webview": "11.6.4", "react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#e2e9a9038b76d096bf929a87105a97a0a7095001", - "react-native-windows": "0.64.14", + "react-native-windows": "^0.64.0-0", "react-test-render": "1.1.2", "readable-stream": "3.6.0", "realm": "10.6.0", diff --git a/windows/ExperimentalFeatures.props b/windows/ExperimentalFeatures.props new file mode 100644 index 000000000..80f79c850 --- /dev/null +++ b/windows/ExperimentalFeatures.props @@ -0,0 +1,24 @@ + + + + + + + false + + + false + + + + \ No newline at end of file diff --git a/windows/NuGet.Config b/windows/NuGet.Config new file mode 100644 index 000000000..e2dd3c1ef --- /dev/null +++ b/windows/NuGet.Config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/windows/bluewallet.sln b/windows/bluewallet.sln index f4d41da78..d6c68bc96 100644 --- a/windows/bluewallet.sln +++ b/windows/bluewallet.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29215.179 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bluewallet", "bluewallet\bluewallet.vcxproj", "{3B23E606-7EFC-44B4-818B-41A6525E4C9E}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bluewallet", "bluewallet\bluewallet.vcxproj", "{9A7ACA3E-5742-401A-B142-14184B1E685C}" ProjectSection(ProjectDependencies) = postProject {F7D32BD0-2749-483E-9A0D-1635EF7E3136} = {F7D32BD0-2749-483E-9A0D-1635EF7E3136} EndProjectSection @@ -35,18 +35,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Mso", "..\node_modules\reac EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Include", "..\node_modules\react-native-windows\include\Include.vcxitems", "{EF074BA1-2D54-4D49-A28E-5E040B47CD2E}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactNativeAsyncStorage", "../node_modules/@react-native-async-storage/async-storage/windows/ReactNativeAsyncStorage/ReactNativeAsyncStorage.vcxproj", "{4855D892-E16C-404D-8286-0089E0F7F9C4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactNativeCameraCPP", "../node_modules/react-native-camera/windows/ReactNativeCameraCPP/ReactNativeCameraCPP.vcxproj", "{7432C343-CC07-4BC7-9BD0-8C467BE0F018}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RNDeviceInfoCPP", "../node_modules/react-native-device-info/windows/RNDeviceInfoCPP/RNDeviceInfoCPP.vcxproj", "{3E3931F2-4735-4417-8CB0-33668A7314D6}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RNLocalize", "../node_modules/react-native-localize/windows/RNLocalize/RNLocalize.vcxproj", "{10E2379C-4264-444A-8656-B3D7E83ACB44}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactNativeWebView", "../node_modules/react-native-webview/windows/ReactNativeWebView/ReactNativeWebView.vcxproj", "{729D9AF8-CD9E-4427-9F6C-FB757E287729}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WebViewBridgeComponent", "../node_modules/react-native-webview/windows/WebViewBridgeComponent/WebViewBridgeComponent.vcxproj", "{FCB612AD-FACC-410C-828C-24B5940B2762}" -EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{0cc28589-39e4-4288-b162-97b959f8b843}*SharedItemsImports = 9 @@ -72,30 +60,30 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|ARM.ActiveCfg = Debug|ARM - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|ARM.Build.0 = Debug|ARM - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|ARM.Deploy.0 = Debug|ARM - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|ARM64.Build.0 = Debug|ARM64 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|ARM64.Deploy.0 = Debug|ARM64 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|x64.ActiveCfg = Debug|x64 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|x64.Build.0 = Debug|x64 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|x64.Deploy.0 = Debug|x64 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|x86.ActiveCfg = Debug|Win32 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|x86.Build.0 = Debug|Win32 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Debug|x86.Deploy.0 = Debug|Win32 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|ARM.ActiveCfg = Release|ARM - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|ARM.Build.0 = Release|ARM - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|ARM.Deploy.0 = Release|ARM - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|ARM64.ActiveCfg = Release|ARM64 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|ARM64.Build.0 = Release|ARM64 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|ARM64.Deploy.0 = Release|ARM64 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|x64.ActiveCfg = Release|x64 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|x64.Build.0 = Release|x64 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|x64.Deploy.0 = Release|x64 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|x86.ActiveCfg = Release|Win32 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|x86.Build.0 = Release|Win32 - {3B23E606-7EFC-44B4-818B-41A6525E4C9E}.Release|x86.Deploy.0 = Release|Win32 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|ARM.ActiveCfg = Debug|ARM + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|ARM.Build.0 = Debug|ARM + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|ARM.Deploy.0 = Debug|ARM + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|ARM64.Build.0 = Debug|ARM64 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|x64.ActiveCfg = Debug|x64 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|x64.Build.0 = Debug|x64 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|x64.Deploy.0 = Debug|x64 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|x86.ActiveCfg = Debug|Win32 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|x86.Build.0 = Debug|Win32 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|x86.Deploy.0 = Debug|Win32 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|ARM.ActiveCfg = Release|ARM + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|ARM.Build.0 = Release|ARM + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|ARM.Deploy.0 = Release|ARM + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|ARM64.ActiveCfg = Release|ARM64 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|ARM64.Build.0 = Release|ARM64 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|ARM64.Deploy.0 = Release|ARM64 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|x64.ActiveCfg = Release|x64 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|x64.Build.0 = Release|x64 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|x64.Deploy.0 = Release|x64 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|x86.ActiveCfg = Release|Win32 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|x86.Build.0 = Release|Win32 + {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|x86.Deploy.0 = Release|Win32 {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.ActiveCfg = Debug|ARM {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.Build.0 = Debug|ARM {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -176,102 +164,6 @@ Global {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.Build.0 = Release|x64 {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.ActiveCfg = Release|Win32 {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.Build.0 = Release|Win32 - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|ARM.ActiveCfg = Debug|ARM - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|ARM.Build.0 = Debug|ARM - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|ARM64.Build.0 = Debug|ARM64 - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|x64.ActiveCfg = Debug|x64 - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|x64.Build.0 = Debug|x64 - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|x86.ActiveCfg = Debug|Win32 - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|x86.Build.0 = Debug|Win32 - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|ARM.ActiveCfg = Release|ARM - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|ARM.Build.0 = Release|ARM - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|ARM64.ActiveCfg = Release|ARM64 - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|ARM64.Build.0 = Release|ARM64 - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|x64.ActiveCfg = Release|x64 - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|x64.Build.0 = Release|x64 - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|x86.ActiveCfg = Release|Win32 - {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|x86.Build.0 = Release|Win32 - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|ARM.ActiveCfg = Debug|ARM - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|ARM.Build.0 = Debug|ARM - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|ARM64.Build.0 = Debug|ARM64 - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|x64.ActiveCfg = Debug|x64 - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|x64.Build.0 = Debug|x64 - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|x86.ActiveCfg = Debug|Win32 - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|x86.Build.0 = Debug|Win32 - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|ARM.ActiveCfg = Release|ARM - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|ARM.Build.0 = Release|ARM - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|ARM64.ActiveCfg = Release|ARM64 - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|ARM64.Build.0 = Release|ARM64 - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|x64.ActiveCfg = Release|x64 - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|x64.Build.0 = Release|x64 - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|x86.ActiveCfg = Release|Win32 - {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|x86.Build.0 = Release|Win32 - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|ARM.ActiveCfg = Debug|ARM - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|ARM.Build.0 = Debug|ARM - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|ARM64.Build.0 = Debug|ARM64 - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|x64.ActiveCfg = Debug|x64 - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|x64.Build.0 = Debug|x64 - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|x86.ActiveCfg = Debug|Win32 - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|x86.Build.0 = Debug|Win32 - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|ARM.ActiveCfg = Release|ARM - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|ARM.Build.0 = Release|ARM - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|ARM64.ActiveCfg = Release|ARM64 - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|ARM64.Build.0 = Release|ARM64 - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|x64.ActiveCfg = Release|x64 - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|x64.Build.0 = Release|x64 - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|x86.ActiveCfg = Release|Win32 - {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|x86.Build.0 = Release|Win32 - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|ARM.ActiveCfg = Debug|ARM - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|ARM.Build.0 = Debug|ARM - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|ARM64.Build.0 = Debug|ARM64 - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|x64.ActiveCfg = Debug|x64 - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|x64.Build.0 = Debug|x64 - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|x86.ActiveCfg = Debug|Win32 - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|x86.Build.0 = Debug|Win32 - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|ARM.ActiveCfg = Release|ARM - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|ARM.Build.0 = Release|ARM - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|ARM64.ActiveCfg = Release|ARM64 - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|ARM64.Build.0 = Release|ARM64 - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|x64.ActiveCfg = Release|x64 - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|x64.Build.0 = Release|x64 - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|x86.ActiveCfg = Release|Win32 - {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|x86.Build.0 = Release|Win32 - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|ARM.ActiveCfg = Debug|ARM - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|ARM.Build.0 = Debug|ARM - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|ARM64.Build.0 = Debug|ARM64 - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|x64.ActiveCfg = Debug|x64 - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|x64.Build.0 = Debug|x64 - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|x86.ActiveCfg = Debug|Win32 - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|x86.Build.0 = Debug|Win32 - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|ARM.ActiveCfg = Release|ARM - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|ARM.Build.0 = Release|ARM - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|ARM64.ActiveCfg = Release|ARM64 - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|ARM64.Build.0 = Release|ARM64 - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|x64.ActiveCfg = Release|x64 - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|x64.Build.0 = Release|x64 - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|x86.ActiveCfg = Release|Win32 - {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|x86.Build.0 = Release|Win32 - {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|ARM.ActiveCfg = Debug|ARM - {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|ARM.Build.0 = Debug|ARM - {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|ARM64.Build.0 = Debug|ARM64 - {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|x64.ActiveCfg = Debug|x64 - {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|x64.Build.0 = Debug|x64 - {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|x86.ActiveCfg = Debug|Win32 - {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|x86.Build.0 = Debug|Win32 - {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|ARM.ActiveCfg = Release|ARM - {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|ARM.Build.0 = Release|ARM - {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|ARM64.ActiveCfg = Release|ARM64 - {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|ARM64.Build.0 = Release|ARM64 - {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|x64.ActiveCfg = Release|x64 - {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|x64.Build.0 = Release|x64 - {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|x86.ActiveCfg = Release|Win32 - {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/windows/bluewallet/App.cpp b/windows/bluewallet/App.cpp index 5fa7a87b1..0dea145c4 100644 --- a/windows/bluewallet/App.cpp +++ b/windows/bluewallet/App.cpp @@ -5,14 +5,13 @@ #include "AutolinkedNativeModules.g.h" #include "ReactPackageProvider.h" -using namespace winrt::bluewallet; -using namespace winrt::bluewallet::implementation; using namespace winrt; using namespace Windows::UI::Xaml; using namespace Windows::UI::Xaml::Controls; using namespace Windows::UI::Xaml::Navigation; using namespace Windows::ApplicationModel; - +namespace winrt::bluewallet::implementation +{ /// /// Initializes the singleton application object. This is the first line of /// authored code executed, and as such is the logical equivalent of main() or @@ -25,7 +24,7 @@ App::App() noexcept InstanceSettings().UseWebDebugger(false); InstanceSettings().UseFastRefresh(false); #else - JavaScriptMainModuleName(L"index"); + JavaScriptBundleFile(L"index"); InstanceSettings().UseWebDebugger(true); InstanceSettings().UseFastRefresh(true); #endif @@ -53,7 +52,19 @@ void App::OnLaunched(activation::LaunchActivatedEventArgs const& e) super::OnLaunched(e); Frame rootFrame = Window::Current().Content().as(); - rootFrame.Navigate(xaml_typename(), box_value(e.Arguments())); + rootFrame.Navigate(xaml_typename(), box_value(e.Arguments())); +} + +/// +/// Invoked when the application is activated by some means other than normal launching. +/// +void App::OnActivated(Activation::IActivatedEventArgs const &e) { + auto preActivationContent = Window::Current().Content(); + super::OnActivated(e); + if (!preActivationContent && Window::Current()) { + Frame rootFrame = Window::Current().Content().as(); + rootFrame.Navigate(xaml_typename(), nullptr); + } } /// @@ -77,3 +88,5 @@ void App::OnNavigationFailed(IInspectable const&, NavigationFailedEventArgs cons { throw hresult_error(E_FAIL, hstring(L"Failed to load Page ") + e.SourcePageType().Name); } + +} // namespace winrt::bluewallet::implementation diff --git a/windows/bluewallet/App.h b/windows/bluewallet/App.h index 820f7d6d5..9d4363be5 100644 --- a/windows/bluewallet/App.h +++ b/windows/bluewallet/App.h @@ -10,6 +10,7 @@ namespace winrt::bluewallet::implementation { App() noexcept; void OnLaunched(activation::LaunchActivatedEventArgs const&); + void OnActivated(Windows::ApplicationModel::Activation::IActivatedEventArgs const &e); void OnSuspending(IInspectable const&, Windows::ApplicationModel::SuspendingEventArgs const&); void OnNavigationFailed(IInspectable const&, Windows::UI::Xaml::Navigation::NavigationFailedEventArgs const&); private: diff --git a/windows/bluewallet/AutolinkedNativeModules.g.cpp b/windows/bluewallet/AutolinkedNativeModules.g.cpp index 9144cec6e..13e9d0b78 100644 --- a/windows/bluewallet/AutolinkedNativeModules.g.cpp +++ b/windows/bluewallet/AutolinkedNativeModules.g.cpp @@ -3,36 +3,12 @@ #include "pch.h" #include "AutolinkedNativeModules.g.h" -// Includes from @react-native-async-storage/async-storage -#include - -// Includes from react-native-camera -#include - -// Includes from react-native-device-info -#include - -// Includes from react-native-localize -#include - -// Includes from react-native-webview -#include - namespace winrt::Microsoft::ReactNative { void RegisterAutolinkedNativeModulePackages(winrt::Windows::Foundation::Collections::IVector const& packageProviders) { - // IReactPackageProviders from @react-native-async-storage/async-storage - packageProviders.Append(winrt::ReactNativeAsyncStorage::ReactPackageProvider()); - // IReactPackageProviders from react-native-camera - packageProviders.Append(winrt::ReactNativeCameraCPP::ReactPackageProvider()); - // IReactPackageProviders from react-native-device-info - packageProviders.Append(winrt::RNDeviceInfoCPP::ReactPackageProvider()); - // IReactPackageProviders from react-native-localize - packageProviders.Append(winrt::RNLocalize::ReactPackageProvider()); - // IReactPackageProviders from react-native-webview - packageProviders.Append(winrt::ReactNativeWebView::ReactPackageProvider()); + UNREFERENCED_PARAMETER(packageProviders); } } diff --git a/windows/bluewallet/AutolinkedNativeModules.g.props b/windows/bluewallet/AutolinkedNativeModules.g.props index 37e6f4b3f..61432e35c 100644 --- a/windows/bluewallet/AutolinkedNativeModules.g.props +++ b/windows/bluewallet/AutolinkedNativeModules.g.props @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/windows/bluewallet/AutolinkedNativeModules.g.targets b/windows/bluewallet/AutolinkedNativeModules.g.targets index c702dd22b..2d63489cd 100644 --- a/windows/bluewallet/AutolinkedNativeModules.g.targets +++ b/windows/bluewallet/AutolinkedNativeModules.g.targets @@ -2,25 +2,5 @@ - - - {4855D892-E16C-404D-8286-0089E0F7F9C4} - - - - {7432c343-cc07-4bc7-9bd0-8c467be0f018} - - - - {3e3931f2-4735-4417-8cb0-33668a7314d6} - - - - {10e2379c-4264-444a-8656-b3d7e83acb44} - - - - {729d9af8-cd9e-4427-9f6c-fb757e287729} - diff --git a/windows/bluewallet/Package.appxmanifest b/windows/bluewallet/Package.appxmanifest index 8f64cd6da..5ecf33897 100644 --- a/windows/bluewallet/Package.appxmanifest +++ b/windows/bluewallet/Package.appxmanifest @@ -7,11 +7,11 @@ IgnorableNamespaces="uap mp"> - + bluewallet diff --git a/windows/bluewallet/bluewallet.vcxproj b/windows/bluewallet/bluewallet.vcxproj index 56b18c11d..34b264db7 100644 --- a/windows/bluewallet/bluewallet.vcxproj +++ b/windows/bluewallet/bluewallet.vcxproj @@ -1,11 +1,12 @@ - + + true true true - {3b23e606-7efc-44b4-818b-41a6525e4c9e} + {9a7aca3e-5742-401a-b142-14184b1e685c} bluewallet bluewallet en-US @@ -175,21 +176,21 @@ - This project references targets in your node_modules\react-native-windows folder. The missing file is {0}. + This project references targets in your node_modules\react-native-windows folder that are missing. The missing file is {0}. - + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - + + diff --git a/windows/bluewallet/packages.config b/windows/bluewallet/packages.config index 4e25d99d5..8973d9697 100644 --- a/windows/bluewallet/packages.config +++ b/windows/bluewallet/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/windows/bluewallet/pch.h b/windows/bluewallet/pch.h index f82c2aa2d..5b6892b28 100644 --- a/windows/bluewallet/pch.h +++ b/windows/bluewallet/pch.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #define NOMINMAX @@ -24,3 +24,4 @@ #include #include #include +using namespace winrt::Windows::Foundation; From 81b4d7f1debf3ccb713bbfbde7ac4db9b6edb57e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Tue, 20 Jul 2021 13:33:15 -0400 Subject: [PATCH 240/327] Update list.js --- screen/wallets/list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/screen/wallets/list.js b/screen/wallets/list.js index 79945154b..4a8910cde 100644 --- a/screen/wallets/list.js +++ b/screen/wallets/list.js @@ -300,7 +300,7 @@ const WalletsList = () => { }; const renderScanButton = () => { - if (wallets.length > 0 && isImportingWallet) { + if (wallets.length > 0 && !isImportingWallet) { return ( Date: Tue, 20 Jul 2021 19:03:53 +0100 Subject: [PATCH 241/327] FIX: support lnurl-withdraw via Tor (closes #3086) --- class/wallets/lightning-custodian-wallet.js | 2 +- screen/lnd/lndCreateInvoice.js | 44 +++++++++++++++------ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/class/wallets/lightning-custodian-wallet.js b/class/wallets/lightning-custodian-wallet.js index 15f6af987..79afcb8b2 100644 --- a/class/wallets/lightning-custodian-wallet.js +++ b/class/wallets/lightning-custodian-wallet.js @@ -73,7 +73,7 @@ export class LightningCustodianWallet extends LegacyWallet { baseURI: this.baseURI, }); - if (isTorCapable && this.baseURI?.indexOf('.onion') !== -1) { + if (isTorCapable && this.baseURI && this.baseURI?.indexOf('.onion') !== -1) { this._api = new torrific.Torsbee({ baseURI: this.baseURI, }); diff --git a/screen/lnd/lndCreateInvoice.js b/screen/lnd/lndCreateInvoice.js index bbe865038..4fb574d9b 100644 --- a/screen/lnd/lndCreateInvoice.js +++ b/screen/lnd/lndCreateInvoice.js @@ -29,7 +29,9 @@ import loc, { formatBalanceWithoutSuffix, formatBalancePlain } from '../../loc'; import Lnurl from '../../class/lnurl'; import { BlueStorageContext } from '../../blue_modules/storage-context'; import Notifications from '../../blue_modules/notifications'; +import { isTorCapable } from '../../blue_modules/environment'; const currency = require('../../blue_modules/currency'); +const torrific = require('../../blue_modules/torrific'); const LNDCreateInvoice = () => { const { wallets, saveToDisk, setSelectedWallet } = useContext(BlueStorageContext); @@ -176,12 +178,22 @@ const LNDCreateInvoice = () => { if (lnurlParams) { const { callback, k1 } = lnurlParams; const callbackUrl = callback + (callback.indexOf('?') !== -1 ? '&' : '?') + 'k1=' + k1 + '&pr=' + invoiceRequest; - const resp = await fetch(callbackUrl, { method: 'GET' }); - if (resp.status >= 300) { - const text = await resp.text(); - throw new Error(text); + + let reply; + if (isTorCapable && callbackUrl.includes('.onion')) { + const api = new torrific.Torsbee(); + const torResponse = await api.get(callbackUrl); + reply = torResponse.body; + if (reply && typeof reply === 'string') reply = JSON.parse(reply); + } else { + const resp = await fetch(callbackUrl, { method: 'GET' }); + if (resp.status >= 300) { + const text = await resp.text(); + throw new Error(text); + } + reply = await resp.json(); } - const reply = await resp.json(); + if (reply.status === 'ERROR') { throw new Error('Reply from server: ' + reply.reason); } @@ -217,14 +229,22 @@ const LNDCreateInvoice = () => { const url = Lnurl.getUrlFromLnurl(data); // calling the url + let reply; try { - const resp = await fetch(url, { method: 'GET' }); - if (resp.status >= 300) { - throw new Error('Bad response from server'); - } - const reply = await resp.json(); - if (reply.status === 'ERROR') { - throw new Error('Reply from server: ' + reply.reason); + if (isTorCapable && url.includes('.onion')) { + const api = new torrific.Torsbee(); + const torResponse = await api.get(url); + reply = torResponse.body; + if (reply && typeof reply === 'string') reply = JSON.parse(reply); + } else { + const resp = await fetch(url, { method: 'GET' }); + if (resp.status >= 300) { + throw new Error('Bad response from server'); + } + reply = await resp.json(); + if (reply.status === 'ERROR') { + throw new Error('Reply from server: ' + reply.reason); + } } if (reply.tag === Lnurl.TAG_PAY_REQUEST) { From 5f726005391a9939aaf7b4ee7137ee003369e5a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Tue, 20 Jul 2021 14:11:05 -0400 Subject: [PATCH 242/327] OPS: Update packages --- ios/Podfile.lock | 4 ++-- package-lock.json | 6 +++--- package.json | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index ee0bb4ecd..aeb3795cb 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -292,7 +292,7 @@ PODS: - React - react-native-tor (0.1.7): - React - - react-native-webview (11.6.4): + - react-native-webview (11.6.5): - React-Core - react-native-widget-center (0.0.4): - React @@ -757,7 +757,7 @@ SPEC CHECKSUMS: react-native-safe-area-context: e471852c5ed67eea4b10c5d9d43c1cebae3b231d react-native-tcp-socket: 96a4f104cdcc9c6621aafe92937f163d88447c5b react-native-tor: 4f389f5719dad633542b57ea32744e954730e7ef - react-native-webview: 4288b81c682bca4dcc9037afb3ee118af2655c03 + react-native-webview: 9fef5edbbf9d03694c5fb513cc2e6d96694430af react-native-widget-center: 0f81d17beb163e7fb5848b06754d7d277fe7d99a React-perflogger: 25373e382fed75ce768a443822f07098a15ab737 React-RCTActionSheet: af7796ba49ffe4ca92e7277a5d992d37203f7da5 diff --git a/package-lock.json b/package-lock.json index 3dc1c95f6..34a1642bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18214,9 +18214,9 @@ } }, "react-native-webview": { - "version": "11.6.4", - "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.6.4.tgz", - "integrity": "sha512-ahW9KL/iBooDRdQwBgPEWOl5Awjwvmo5FtV83WzbgUpQxDJ+ZRzZDpbmwcjLtd6R67yWg6dk1inqKQTrmkWiXQ==", + "version": "11.6.5", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.6.5.tgz", + "integrity": "sha512-5U+hI8snkCrFeDy+bUTszwhzcJIenaaOy3ubhY77HZq7R0pFIZzRYWkT0YXe1ymRYW9mSU96nr6S0AVDk8qkMw==", "requires": { "escape-string-regexp": "2.0.0", "invariant": "2.2.4" diff --git a/package.json b/package.json index cc995dc87..86d49d412 100644 --- a/package.json +++ b/package.json @@ -168,9 +168,9 @@ "react-native-tor": "0.1.7", "react-native-vector-icons": "7.1.0", "react-native-watch-connectivity": "1.0.3", - "react-native-webview": "11.6.4", + "react-native-webview": "11.6.5", "react-native-widget-center": "https://github.com/BlueWallet/react-native-widget-center#e2e9a9038b76d096bf929a87105a97a0a7095001", - "react-native-windows": "^0.64.0-0", + "react-native-windows": "0.64.14", "react-test-render": "1.1.2", "readable-stream": "3.6.0", "realm": "10.6.0", From b800993278ed793549521e5826463789b527d3d0 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:40:49 +0000 Subject: [PATCH 243/327] Translate /loc/en.json in es_419 review completed for the source file '/loc/en.json' on the 'es_419' language. --- loc/es_419.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/loc/es_419.json b/loc/es_419.json index cea49399f..f4059ceb6 100644 --- a/loc/es_419.json +++ b/loc/es_419.json @@ -425,6 +425,8 @@ "enter_bip38_password": "Ingresa la contraseña para descifrar", "export_title": "Exportación de Billetera", "import_do_import": "Importar", + "import_passphrase_title": "Frase de contraseña", + "import_passphrase_message": "Ingrese la frase de contraseña si ha usado alguna", "import_error": "No se pudo importar. Asegúrate de que los datos proporcionados sean válidos.", "import_explanation": "Ingresa tus palabras iniciales, clave pública, WIF o cualquier cosa que tengas. BlueWallet hará todo lo posible para adivinar el formato correcto e importar tu billetera.", "import_file": "Importar Archivo", From dd574bbf6fe86825597c0386a04fd1d9093fc846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bordalo?= Date: Tue, 20 Jul 2021 20:35:41 +0100 Subject: [PATCH 244/327] change http to https where visible to users --- README.md | 2 +- blue_modules/bip38/README.md | 2 +- blue_modules/scryptsy/README.md | 8 ++++---- ios/fastlane/metadata/ar-SA/privacy_url.txt | 2 +- ios/fastlane/metadata/da/privacy_url.txt | 2 +- ios/fastlane/metadata/de-DE/privacy_url.txt | 2 +- ios/fastlane/metadata/en-US/privacy_url.txt | 2 +- ios/fastlane/metadata/es-ES/privacy_url.txt | 2 +- ios/fastlane/metadata/es-MX/privacy_url.txt | 2 +- ios/fastlane/metadata/fi/privacy_url.txt | 2 +- ios/fastlane/metadata/fr-FR/privacy_url.txt | 2 +- ios/fastlane/metadata/he/privacy_url.txt | 2 +- ios/fastlane/metadata/hu/privacy_url.txt | 2 +- ios/fastlane/metadata/it/privacy_url.txt | 2 +- ios/fastlane/metadata/nl-NL/privacy_url.txt | 2 +- ios/fastlane/metadata/no/privacy_url.txt | 2 +- ios/fastlane/metadata/pl/privacy_url.txt | 2 +- ios/fastlane/metadata/pt-BR/privacy_url.txt | 2 +- ios/fastlane/metadata/pt-PT/privacy_url.txt | 2 +- ios/fastlane/metadata/ro/privacy_url.txt | 2 +- ios/fastlane/metadata/ru/privacy_url.txt | 2 +- ios/fastlane/metadata/sv/privacy_url.txt | 2 +- ios/fastlane/metadata/zh-Hans/privacy_url.txt | 2 +- 23 files changed, 26 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 3ef0db295..f1a3fa39e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Built with React Native and Electrum. [![Appstore](https://bluewallet.io/uploads/app-store-badge-blue.svg)](https://itunes.apple.com/us/app/bluewallet-bitcoin-wallet/id1376878040?l=ru&ls=1&mt=8) [![Playstore](https://bluewallet.io/uploads/play-store-badge-blue.svg)](https://play.google.com/store/apps/details?id=io.bluewallet.bluewallet) -Website: [bluewallet.io](http://bluewallet.io) +Website: [bluewallet.io](https://bluewallet.io) Community: [telegram group](https://t.me/bluewallet) diff --git a/blue_modules/bip38/README.md b/blue_modules/bip38/README.md index 2c03c460c..778109087 100644 --- a/blue_modules/bip38/README.md +++ b/blue_modules/bip38/README.md @@ -1,6 +1,6 @@ # bip38 -[![build status](https://secure.travis-ci.org/bitcoinjs/bip38.svg)](http://travis-ci.org/bitcoinjs/bip38) +[![build status](https://secure.travis-ci.org/bitcoinjs/bip38.svg)](https://travis-ci.org/bitcoinjs/bip38) [![Coverage Status](https://img.shields.io/coveralls/cryptocoinjs/bip38.svg)](https://coveralls.io/r/cryptocoinjs/bip38) [![Version](http://img.shields.io/npm/v/bip38.svg)](https://www.npmjs.org/package/bip38) diff --git a/blue_modules/scryptsy/README.md b/blue_modules/scryptsy/README.md index fee9b6062..bb86747c1 100644 --- a/blue_modules/scryptsy/README.md +++ b/blue_modules/scryptsy/README.md @@ -1,7 +1,7 @@ scryptsy ======== -[![build status](https://secure.travis-ci.org/cryptocoinjs/scryptsy.svg)](http://travis-ci.org/cryptocoinjs/scryptsy) +[![build status](https://secure.travis-ci.org/cryptocoinjs/scryptsy.svg)](https://travis-ci.org/cryptocoinjs/scryptsy) [![Coverage Status](https://img.shields.io/coveralls/cryptocoinjs/scryptsy.svg)](https://coveralls.io/r/cryptocoinjs/scryptsy) [![Version](http://img.shields.io/npm/v/scryptsy.svg)](https://www.npmjs.org/package/scryptsy) @@ -11,7 +11,7 @@ scryptsy Why? ---- -`Scrypt` is an integral part of many crypto currencies. It's a part of the [BIP38](https://github.com/bitcoin/bips/blob/master/bip-0038.mediawiki) standard for encrypting private Bitcoin keys. It also serves as the [proof-of-work system](http://en.wikipedia.org/wiki/Proof-of-work_system) for many crypto currencies, most notably: Litecoin and Dogecoin. +`Scrypt` is an integral part of many crypto currencies. It's a part of the [BIP38](https://github.com/bitcoin/bips/blob/master/bip-0038.mediawiki) standard for encrypting private Bitcoin keys. It also serves as the [proof-of-work system](https://en.wikipedia.org/wiki/Proof-of-work_system) for many crypto currencies, most notably: Litecoin and Dogecoin. @@ -153,5 +153,5 @@ License MIT -[wiki]: http://en.wikipedia.org/wiki/Scrypt -[tarsnap]: http://www.tarsnap.com/scrypt.html +[wiki]: https://en.wikipedia.org/wiki/Scrypt +[tarsnap]: https://www.tarsnap.com/scrypt.html diff --git a/ios/fastlane/metadata/ar-SA/privacy_url.txt b/ios/fastlane/metadata/ar-SA/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/ar-SA/privacy_url.txt +++ b/ios/fastlane/metadata/ar-SA/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/da/privacy_url.txt b/ios/fastlane/metadata/da/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/da/privacy_url.txt +++ b/ios/fastlane/metadata/da/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/de-DE/privacy_url.txt b/ios/fastlane/metadata/de-DE/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/de-DE/privacy_url.txt +++ b/ios/fastlane/metadata/de-DE/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/en-US/privacy_url.txt b/ios/fastlane/metadata/en-US/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/en-US/privacy_url.txt +++ b/ios/fastlane/metadata/en-US/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/es-ES/privacy_url.txt b/ios/fastlane/metadata/es-ES/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/es-ES/privacy_url.txt +++ b/ios/fastlane/metadata/es-ES/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/es-MX/privacy_url.txt b/ios/fastlane/metadata/es-MX/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/es-MX/privacy_url.txt +++ b/ios/fastlane/metadata/es-MX/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/fi/privacy_url.txt b/ios/fastlane/metadata/fi/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/fi/privacy_url.txt +++ b/ios/fastlane/metadata/fi/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/fr-FR/privacy_url.txt b/ios/fastlane/metadata/fr-FR/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/fr-FR/privacy_url.txt +++ b/ios/fastlane/metadata/fr-FR/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/he/privacy_url.txt b/ios/fastlane/metadata/he/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/he/privacy_url.txt +++ b/ios/fastlane/metadata/he/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/hu/privacy_url.txt b/ios/fastlane/metadata/hu/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/hu/privacy_url.txt +++ b/ios/fastlane/metadata/hu/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/it/privacy_url.txt b/ios/fastlane/metadata/it/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/it/privacy_url.txt +++ b/ios/fastlane/metadata/it/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/nl-NL/privacy_url.txt b/ios/fastlane/metadata/nl-NL/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/nl-NL/privacy_url.txt +++ b/ios/fastlane/metadata/nl-NL/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/no/privacy_url.txt b/ios/fastlane/metadata/no/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/no/privacy_url.txt +++ b/ios/fastlane/metadata/no/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/pl/privacy_url.txt b/ios/fastlane/metadata/pl/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/pl/privacy_url.txt +++ b/ios/fastlane/metadata/pl/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/pt-BR/privacy_url.txt b/ios/fastlane/metadata/pt-BR/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/pt-BR/privacy_url.txt +++ b/ios/fastlane/metadata/pt-BR/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/pt-PT/privacy_url.txt b/ios/fastlane/metadata/pt-PT/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/pt-PT/privacy_url.txt +++ b/ios/fastlane/metadata/pt-PT/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/ro/privacy_url.txt b/ios/fastlane/metadata/ro/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/ro/privacy_url.txt +++ b/ios/fastlane/metadata/ro/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/ru/privacy_url.txt b/ios/fastlane/metadata/ru/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/ru/privacy_url.txt +++ b/ios/fastlane/metadata/ru/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/sv/privacy_url.txt b/ios/fastlane/metadata/sv/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/sv/privacy_url.txt +++ b/ios/fastlane/metadata/sv/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt diff --git a/ios/fastlane/metadata/zh-Hans/privacy_url.txt b/ios/fastlane/metadata/zh-Hans/privacy_url.txt index 849468985..65861a3e4 100644 --- a/ios/fastlane/metadata/zh-Hans/privacy_url.txt +++ b/ios/fastlane/metadata/zh-Hans/privacy_url.txt @@ -1 +1 @@ -http://www.bluewallet.io/privacy.txt +https://www.bluewallet.io/privacy.txt From dc74393481d6464b55474fa6717f6faa5cefb03c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bordalo?= Date: Tue, 20 Jul 2021 20:35:41 +0100 Subject: [PATCH 245/327] change http to https where visible to users --- blue_modules/bip38/README.md | 2 +- blue_modules/scryptsy/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blue_modules/bip38/README.md b/blue_modules/bip38/README.md index 778109087..8a245d9b6 100644 --- a/blue_modules/bip38/README.md +++ b/blue_modules/bip38/README.md @@ -2,7 +2,7 @@ [![build status](https://secure.travis-ci.org/bitcoinjs/bip38.svg)](https://travis-ci.org/bitcoinjs/bip38) [![Coverage Status](https://img.shields.io/coveralls/cryptocoinjs/bip38.svg)](https://coveralls.io/r/cryptocoinjs/bip38) -[![Version](http://img.shields.io/npm/v/bip38.svg)](https://www.npmjs.org/package/bip38) +[![Version](https://img.shields.io/npm/v/bip38.svg)](https://www.npmjs.org/package/bip38) [![js-standard-style](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard) diff --git a/blue_modules/scryptsy/README.md b/blue_modules/scryptsy/README.md index bb86747c1..71350f096 100644 --- a/blue_modules/scryptsy/README.md +++ b/blue_modules/scryptsy/README.md @@ -3,7 +3,7 @@ scryptsy [![build status](https://secure.travis-ci.org/cryptocoinjs/scryptsy.svg)](https://travis-ci.org/cryptocoinjs/scryptsy) [![Coverage Status](https://img.shields.io/coveralls/cryptocoinjs/scryptsy.svg)](https://coveralls.io/r/cryptocoinjs/scryptsy) -[![Version](http://img.shields.io/npm/v/scryptsy.svg)](https://www.npmjs.org/package/scryptsy) +[![Version](https://img.shields.io/npm/v/scryptsy.svg)](https://www.npmjs.org/package/scryptsy) `scryptsy` is a pure Javascript implementation of the [scrypt][wiki] key derivation function that is fully compatible with Node.js and the browser (via Browserify). From 1450ca2e870f1cca48195942c94cb8cbd5927b5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Tue, 20 Jul 2021 16:07:15 -0400 Subject: [PATCH 246/327] OPS: Windows autolink --- windows/bluewallet.sln | 158 +++++++++++++++--- .../bluewallet/AutolinkedNativeModules.g.cpp | 26 ++- .../AutolinkedNativeModules.g.targets | 20 +++ windows/bluewallet/Package.appxmanifest | 4 +- windows/bluewallet/bluewallet.vcxproj | 2 +- 5 files changed, 181 insertions(+), 29 deletions(-) diff --git a/windows/bluewallet.sln b/windows/bluewallet.sln index d6c68bc96..d082922f2 100644 --- a/windows/bluewallet.sln +++ b/windows/bluewallet.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29215.179 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bluewallet", "bluewallet\bluewallet.vcxproj", "{9A7ACA3E-5742-401A-B142-14184B1E685C}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bluewallet", "bluewallet\bluewallet.vcxproj", "{69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}" ProjectSection(ProjectDependencies) = postProject {F7D32BD0-2749-483E-9A0D-1635EF7E3136} = {F7D32BD0-2749-483E-9A0D-1635EF7E3136} EndProjectSection @@ -35,6 +35,18 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Mso", "..\node_modules\reac EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Include", "..\node_modules\react-native-windows\include\Include.vcxitems", "{EF074BA1-2D54-4D49-A28E-5E040B47CD2E}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactNativeAsyncStorage", "../node_modules/@react-native-async-storage/async-storage/windows/ReactNativeAsyncStorage/ReactNativeAsyncStorage.vcxproj", "{4855D892-E16C-404D-8286-0089E0F7F9C4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactNativeCameraCPP", "../node_modules/react-native-camera/windows/ReactNativeCameraCPP/ReactNativeCameraCPP.vcxproj", "{7432C343-CC07-4BC7-9BD0-8C467BE0F018}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RNDeviceInfoCPP", "../node_modules/react-native-device-info/windows/RNDeviceInfoCPP/RNDeviceInfoCPP.vcxproj", "{3E3931F2-4735-4417-8CB0-33668A7314D6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RNLocalize", "../node_modules/react-native-localize/windows/RNLocalize/RNLocalize.vcxproj", "{10E2379C-4264-444A-8656-B3D7E83ACB44}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactNativeWebView", "../node_modules/react-native-webview/windows/ReactNativeWebView/ReactNativeWebView.vcxproj", "{729D9AF8-CD9E-4427-9F6C-FB757E287729}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WebViewBridgeComponent", "../node_modules/react-native-webview/windows/WebViewBridgeComponent/WebViewBridgeComponent.vcxproj", "{FCB612AD-FACC-410C-828C-24B5940B2762}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution ..\node_modules\react-native-windows\JSI\Shared\JSI.Shared.vcxitems*{0cc28589-39e4-4288-b162-97b959f8b843}*SharedItemsImports = 9 @@ -60,30 +72,30 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|ARM.ActiveCfg = Debug|ARM - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|ARM.Build.0 = Debug|ARM - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|ARM.Deploy.0 = Debug|ARM - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|ARM64.Build.0 = Debug|ARM64 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|ARM64.Deploy.0 = Debug|ARM64 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|x64.ActiveCfg = Debug|x64 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|x64.Build.0 = Debug|x64 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|x64.Deploy.0 = Debug|x64 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|x86.ActiveCfg = Debug|Win32 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|x86.Build.0 = Debug|Win32 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Debug|x86.Deploy.0 = Debug|Win32 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|ARM.ActiveCfg = Release|ARM - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|ARM.Build.0 = Release|ARM - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|ARM.Deploy.0 = Release|ARM - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|ARM64.ActiveCfg = Release|ARM64 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|ARM64.Build.0 = Release|ARM64 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|ARM64.Deploy.0 = Release|ARM64 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|x64.ActiveCfg = Release|x64 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|x64.Build.0 = Release|x64 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|x64.Deploy.0 = Release|x64 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|x86.ActiveCfg = Release|Win32 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|x86.Build.0 = Release|Win32 - {9A7ACA3E-5742-401A-B142-14184B1E685C}.Release|x86.Deploy.0 = Release|Win32 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Debug|ARM.ActiveCfg = Debug|ARM + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Debug|ARM.Build.0 = Debug|ARM + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Debug|ARM.Deploy.0 = Debug|ARM + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Debug|ARM64.Build.0 = Debug|ARM64 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Debug|x64.ActiveCfg = Debug|x64 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Debug|x64.Build.0 = Debug|x64 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Debug|x64.Deploy.0 = Debug|x64 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Debug|x86.ActiveCfg = Debug|Win32 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Debug|x86.Build.0 = Debug|Win32 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Debug|x86.Deploy.0 = Debug|Win32 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Release|ARM.ActiveCfg = Release|ARM + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Release|ARM.Build.0 = Release|ARM + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Release|ARM.Deploy.0 = Release|ARM + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Release|ARM64.ActiveCfg = Release|ARM64 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Release|ARM64.Build.0 = Release|ARM64 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Release|ARM64.Deploy.0 = Release|ARM64 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Release|x64.ActiveCfg = Release|x64 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Release|x64.Build.0 = Release|x64 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Release|x64.Deploy.0 = Release|x64 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Release|x86.ActiveCfg = Release|Win32 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Release|x86.Build.0 = Release|Win32 + {69AECC7D-DEBA-4F95-9021-5C6AE85E81F6}.Release|x86.Deploy.0 = Release|Win32 {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.ActiveCfg = Debug|ARM {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM.Build.0 = Debug|ARM {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -164,6 +176,102 @@ Global {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.Build.0 = Release|x64 {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.ActiveCfg = Release|Win32 {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.Build.0 = Release|Win32 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|ARM.ActiveCfg = Debug|ARM + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|ARM.Build.0 = Debug|ARM + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|ARM64.Build.0 = Debug|ARM64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|x64.ActiveCfg = Debug|x64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|x64.Build.0 = Debug|x64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|x86.ActiveCfg = Debug|Win32 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Debug|x86.Build.0 = Debug|Win32 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|ARM.ActiveCfg = Release|ARM + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|ARM.Build.0 = Release|ARM + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|ARM64.ActiveCfg = Release|ARM64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|ARM64.Build.0 = Release|ARM64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|x64.ActiveCfg = Release|x64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|x64.Build.0 = Release|x64 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|x86.ActiveCfg = Release|Win32 + {4855D892-E16C-404D-8286-0089E0F7F9C4}.Release|x86.Build.0 = Release|Win32 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|ARM.ActiveCfg = Debug|ARM + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|ARM.Build.0 = Debug|ARM + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|ARM64.Build.0 = Debug|ARM64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|x64.ActiveCfg = Debug|x64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|x64.Build.0 = Debug|x64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|x86.ActiveCfg = Debug|Win32 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Debug|x86.Build.0 = Debug|Win32 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|ARM.ActiveCfg = Release|ARM + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|ARM.Build.0 = Release|ARM + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|ARM64.ActiveCfg = Release|ARM64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|ARM64.Build.0 = Release|ARM64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|x64.ActiveCfg = Release|x64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|x64.Build.0 = Release|x64 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|x86.ActiveCfg = Release|Win32 + {7432C343-CC07-4BC7-9BD0-8C467BE0F018}.Release|x86.Build.0 = Release|Win32 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|ARM.ActiveCfg = Debug|ARM + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|ARM.Build.0 = Debug|ARM + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|ARM64.Build.0 = Debug|ARM64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|x64.ActiveCfg = Debug|x64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|x64.Build.0 = Debug|x64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|x86.ActiveCfg = Debug|Win32 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Debug|x86.Build.0 = Debug|Win32 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|ARM.ActiveCfg = Release|ARM + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|ARM.Build.0 = Release|ARM + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|ARM64.ActiveCfg = Release|ARM64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|ARM64.Build.0 = Release|ARM64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|x64.ActiveCfg = Release|x64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|x64.Build.0 = Release|x64 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|x86.ActiveCfg = Release|Win32 + {3E3931F2-4735-4417-8CB0-33668A7314D6}.Release|x86.Build.0 = Release|Win32 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|ARM.ActiveCfg = Debug|ARM + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|ARM.Build.0 = Debug|ARM + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|ARM64.Build.0 = Debug|ARM64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|x64.ActiveCfg = Debug|x64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|x64.Build.0 = Debug|x64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|x86.ActiveCfg = Debug|Win32 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Debug|x86.Build.0 = Debug|Win32 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|ARM.ActiveCfg = Release|ARM + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|ARM.Build.0 = Release|ARM + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|ARM64.ActiveCfg = Release|ARM64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|ARM64.Build.0 = Release|ARM64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|x64.ActiveCfg = Release|x64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|x64.Build.0 = Release|x64 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|x86.ActiveCfg = Release|Win32 + {10E2379C-4264-444A-8656-B3D7E83ACB44}.Release|x86.Build.0 = Release|Win32 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|ARM.ActiveCfg = Debug|ARM + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|ARM.Build.0 = Debug|ARM + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|ARM64.Build.0 = Debug|ARM64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|x64.ActiveCfg = Debug|x64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|x64.Build.0 = Debug|x64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|x86.ActiveCfg = Debug|Win32 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Debug|x86.Build.0 = Debug|Win32 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|ARM.ActiveCfg = Release|ARM + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|ARM.Build.0 = Release|ARM + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|ARM64.ActiveCfg = Release|ARM64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|ARM64.Build.0 = Release|ARM64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|x64.ActiveCfg = Release|x64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|x64.Build.0 = Release|x64 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|x86.ActiveCfg = Release|Win32 + {729D9AF8-CD9E-4427-9F6C-FB757E287729}.Release|x86.Build.0 = Release|Win32 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|ARM.ActiveCfg = Debug|ARM + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|ARM.Build.0 = Debug|ARM + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|ARM64.Build.0 = Debug|ARM64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|x64.ActiveCfg = Debug|x64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|x64.Build.0 = Debug|x64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|x86.ActiveCfg = Debug|Win32 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Debug|x86.Build.0 = Debug|Win32 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|ARM.ActiveCfg = Release|ARM + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|ARM.Build.0 = Release|ARM + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|ARM64.ActiveCfg = Release|ARM64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|ARM64.Build.0 = Release|ARM64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|x64.ActiveCfg = Release|x64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|x64.Build.0 = Release|x64 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|x86.ActiveCfg = Release|Win32 + {FCB612AD-FACC-410C-828C-24B5940B2762}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/windows/bluewallet/AutolinkedNativeModules.g.cpp b/windows/bluewallet/AutolinkedNativeModules.g.cpp index 13e9d0b78..9144cec6e 100644 --- a/windows/bluewallet/AutolinkedNativeModules.g.cpp +++ b/windows/bluewallet/AutolinkedNativeModules.g.cpp @@ -3,12 +3,36 @@ #include "pch.h" #include "AutolinkedNativeModules.g.h" +// Includes from @react-native-async-storage/async-storage +#include + +// Includes from react-native-camera +#include + +// Includes from react-native-device-info +#include + +// Includes from react-native-localize +#include + +// Includes from react-native-webview +#include + namespace winrt::Microsoft::ReactNative { void RegisterAutolinkedNativeModulePackages(winrt::Windows::Foundation::Collections::IVector const& packageProviders) { - UNREFERENCED_PARAMETER(packageProviders); + // IReactPackageProviders from @react-native-async-storage/async-storage + packageProviders.Append(winrt::ReactNativeAsyncStorage::ReactPackageProvider()); + // IReactPackageProviders from react-native-camera + packageProviders.Append(winrt::ReactNativeCameraCPP::ReactPackageProvider()); + // IReactPackageProviders from react-native-device-info + packageProviders.Append(winrt::RNDeviceInfoCPP::ReactPackageProvider()); + // IReactPackageProviders from react-native-localize + packageProviders.Append(winrt::RNLocalize::ReactPackageProvider()); + // IReactPackageProviders from react-native-webview + packageProviders.Append(winrt::ReactNativeWebView::ReactPackageProvider()); } } diff --git a/windows/bluewallet/AutolinkedNativeModules.g.targets b/windows/bluewallet/AutolinkedNativeModules.g.targets index 2d63489cd..c702dd22b 100644 --- a/windows/bluewallet/AutolinkedNativeModules.g.targets +++ b/windows/bluewallet/AutolinkedNativeModules.g.targets @@ -2,5 +2,25 @@ + + + {4855D892-E16C-404D-8286-0089E0F7F9C4} + + + + {7432c343-cc07-4bc7-9bd0-8c467be0f018} + + + + {3e3931f2-4735-4417-8cb0-33668a7314d6} + + + + {10e2379c-4264-444a-8656-b3d7e83acb44} + + + + {729d9af8-cd9e-4427-9f6c-fb757e287729} + diff --git a/windows/bluewallet/Package.appxmanifest b/windows/bluewallet/Package.appxmanifest index 5ecf33897..725aee352 100644 --- a/windows/bluewallet/Package.appxmanifest +++ b/windows/bluewallet/Package.appxmanifest @@ -7,11 +7,11 @@ IgnorableNamespaces="uap mp"> - + bluewallet diff --git a/windows/bluewallet/bluewallet.vcxproj b/windows/bluewallet/bluewallet.vcxproj index 34b264db7..b873139ea 100644 --- a/windows/bluewallet/bluewallet.vcxproj +++ b/windows/bluewallet/bluewallet.vcxproj @@ -6,7 +6,7 @@ true true true - {9a7aca3e-5742-401a-b142-14184b1e685c} + {69aecc7d-deba-4f95-9021-5c6ae85e81f6} bluewallet bluewallet en-US From 0359d0363e9292d63042bb1d5ea90c34c5ee5d0e Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 21 Jul 2021 09:28:56 +0000 Subject: [PATCH 247/327] Translate /loc/en.json in ru review completed for the source file '/loc/en.json' on the 'ru' language. --- loc/ru.json | 78 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 15 deletions(-) diff --git a/loc/ru.json b/loc/ru.json index 1f5bdbd5b..c6e17a1db 100644 --- a/loc/ru.json +++ b/loc/ru.json @@ -14,9 +14,14 @@ "no": "Нет", "save": "Сохранить", "seed": "Сид-фраза", + "success": "Получилось", "wallet_key": "Ключ кошелька", - "invalid_animated_qr_code_fragment": "Ошибочный фрагмент QRCode, попробуйте снова", - "file_saved": "Файл ({filePath}) сохранён в папке Загрузки.", + "invalid_animated_qr_code_fragment" : "Ошибочный фрагмент QRCode, попробуйте снова", + "file_saved": "Файл {filePath} сохранён в {destination}.", + "file_save_title": "Сохранить Файл", + "file_save_location": "Выберите куда сохранить {filePath} ", + "downloads_folder": "Папка Загрузки", + "external_storage": "Внешнее Хранилище", "discard_changes": "Отменить изменения?", "discard_changes_detail": "У вас есть несохраненные изменения. Вы уверены, что хотите отменить их?" }, @@ -137,6 +142,7 @@ "ask_yes": "Да, я сохранил", "ok": "Я всё записал!", "ok_lnd": "Я всё сохранил.", + "text": "Пожалуйста, запишите эту мнемоническую фразу на листе бумаги. \nЭто ваша резервная копия, которую вы можете использовать для восстановления кошелька на другом устройстве.", "text_lnd": "Сохраните резервную копию кошелька. Это поможет восстановить его в случае потери.", "text_lnd2": "Кошелёк хранится на серверах BlueWallet.", "title": "Кошелёк создан" @@ -173,22 +179,21 @@ "details_address_field_is_not_valid": "Введенный адрес неверный", "details_adv_fee_bump": "Включить повышение комиссии", "details_adv_full": "Использовать весь баланс", - "details_adv_full_remove": "Другие получатели будут удалены из транзакции.", "details_adv_full_sure": "Ты уверен что хочешь использоавать весь баланс кошелька для этой транзакции?", "details_adv_import": "Импортировать транзакцию", "details_amount_field_is_not_valid": "Введенная сумма неверна", "details_amount_field_is_less_than_minimum_amount_sat": "Сумма слишком мала. Пожалуйста, введите сумму больше 500 сатоши.", "details_create": "Создать", + "details_error_decode": "Нельзя декодировать Bitcoin адрес", "details_fee_field_is_not_valid": "Введенная комиссия неверна", "details_next": "Дальше", - "details_no_maximum": "Этот кошелёк не поддерживает отправку всех средств. Ты уверен что хочешь выбрать его?", - "details_no_multiple": "Этот кошелёк не поддерживает отправку нескольким получателям. Ты уверен что хочешь выбрать его?", "details_no_signed_tx": "В файле нет транзакций которые можно импортировать.", "details_note_placeholder": "примечание платежа", "details_scan": "Скан", + "details_scan_hint": "Тапните два раза чтобы сканировать или импортировать адрес отправки", "details_total_exceeds_balance": "Общая сумма превышает баланс.", + "details_unrecognized_file_format": "Неизвестный формат", "details_wallet_before_tx": "Перед созданием транзакции нужно сделать Bitcoin кошелёк.", - "details_wallet_selection": "Выбор Кошелька", "dynamic_init": "Инициализация", "dynamic_next": "Следующий", "dynamic_prev": "Предыдущий", @@ -257,14 +262,14 @@ "electrum_connected": "Подключено", "electrum_connected_not": "Не Подключено", "electrum_error_connect": "Не удается подключиться к Electrum серверу", - "electrum_host": "хост, например {example}", - "electrum_port": "TCP порт, обычно {example}", - "electrum_port_ssl": "SSL порт, обычно {example}", + "electrum_host": "Например {example}", + "electrum_port": "Порт, обычно {example}", + "use_ssl": "Использовать SSL", "electrum_saved": "Ваши изменения были успешно сохранены. Для вступления изменений в силу может потребоваться перезагрузка.", "set_electrum_server_as_default": "Задать {server} как сервер electrum по умолчанию?", "set_lndhub_as_default": "Задать {url} как сервер LNDHub по умолчанию?", - "electrum_settings_server": "Настройки Electrum", - "electrum_settings_explain": "Очистите чтобы использовать по умолчанию", + "electrum_settings_server": "Сервер Электрум", + "electrum_settings_explain": "Очистите чтобы использовать по умолчанию.", "electrum_status": "Статус", "electrum_clear_alert_title": "Очистить историю?", "electrum_clear_alert_message": "Удалить историю серверов electrum?", @@ -274,7 +279,9 @@ "electrum_reset": "По умолчанию", "electrum_unable_to_connect": "Невозможно подключиться {сервер}.", "electrum_history": "История", + "electrum_reset_to_default": "Вы уверены что хотите сбросить значение Электрум сервер?", "electrum_clear": "Очистить", + "tor_supported": "Tor поддерживается", "encrypt_decrypt": "Расшифровать хранилище", "encrypt_decrypt_q": "Вы уверены, что хотите расшифровать хранилище? Это позволит получить доступ к вашим кошелькам без пароля.", "encrypt_del_uninstall": "Удалить, если BlueWallet удален", @@ -291,17 +298,18 @@ "groundcontrol_explanation": "GroundControl - это бесплатный сервер push-уведомлений с открытым исходным кодом для биткойн-кошельков. Вы можете установить свой собственный сервер GroundControl и указать здесь его URL, чтобы не полагаться на инфраструктуру BlueWallet. Оставьте пустым, чтобы использовать по умолчанию", "header": "Настройки", "language": "Язык", - "language_restart": "При выборе нового языка может потребоваться перезапуск BlueWallet, чтобы изменения вступили в силу.", + "language_isRTL": "Перезапустите приложения для смены направления языка.", "lightning_error_lndhub_uri": "Неверный URI LndHub", "lightning_saved": "Ваши изменения были успешно сохранены", "lightning_settings": "Настройки Lightning", + "tor_settings": "Настройки Tor", "lightning_settings_explain": "Чтобы подключиться к своему узлу LND, пожалуйста, установи LndHub и добавь его URL в настройки. Оставь поле пустым, чтобы использоавать стандартный LndHub\n (lndhub.io)", "network": "Сеть", "network_broadcast": "Отправить транзакцию", "network_electrum": "Electrum сервер", "not_a_valid_uri": "Неверный URI", "notifications": "Уведомления", - "open_link_in_explorer": "Посмотреть в эксплорере", + "open_link_in_explorer" : "Посмотреть в эксплорере", "password": "Пароль", "password_explain": "Придумай пароль для расшифровки хранилища", "passwords_do_not_match": "Пароли не совпадают", @@ -313,14 +321,18 @@ "privacy_quickactions": "Быстрые команды", "privacy_quickactions_explanation": "Нажмите и удерживайте значок приложения BlueWallet на главном экране, чтобы быстро просмотреть баланс своего кошелька.", "privacy_clipboard_explanation": "Показать меню с действием, если в Буфере обмена есть адрес или инвойс.", + "privacy_do_not_track": "Выключить Аналитику", + "privacy_do_not_track_explanation": "Информация о производительности и надежности не будет отправлена на анализ.", "push_notifications": "Push-уведомления", "retype_password": "Набери пароль повторно", + "selfTest": "Проверка приложения", "save": "Сохранить", "saved": "Сохранено", - "success_transaction_broadcasted": "Транзакция успешно транслирована в сеть!", + "success_transaction_broadcasted" : "Транзакция успешно транслирована в сеть!", "total_balance": "Баланс", "total_balance_explanation": "Показывать в виджетах общий баланс кошельков", - "widgets": "Виджеты" + "widgets": "Виджеты", + "tools": "Инструменты" }, "notifications": { "would_you_like_to_receive_notifications": "Хотите получать уведомления при входящих платежах?", @@ -328,9 +340,13 @@ "ask_me_later": "Спроси меня позже" }, "transactions": { + "cancel_explain": "Мы заменим эту транзакцию другой, которая платит вам и имеет более высокую комиссию. Это отменит предыдущую транзакцию. Это называется RBF—Replace By Fee.", "cancel_no": "Эту транзакцию не отменить", "cancel_title": "Отменить транзакцию (RBF)", "confirmations_lowercase": "{confirmations} подтверждений", + "note": "Заметка", + "expand_note": "Раскрыть Заметку", + "block_explorer_link": "Ссылка на Блок Эксплорер", "cpfp_create": "Создать", "cpfp_exp": "Мы создадим новую транзакцию, которая потратит вашу неподтвержденную. Общая сумма комиссии будет выше, чем первоначальная комиссия, поэтому она будет добыта быстрее. Это называется CPFP - ребенок платит за родителя.", "cpfp_no_bump": "Нельзя повысить комиссию этой транзакции", @@ -357,6 +373,7 @@ "status_bump": "Повысить комиссию", "status_cancel": "Отменить транзакцию", "transactions_count": "кол-во транзакций", + "txid": "ID Транзакции", "updating": "Обновление..." }, "wallets": { @@ -399,6 +416,7 @@ "details_no_cancel": "Нет, отмена", "details_save": "Сохранить", "details_show_xpub": "Показать XPUB", + "details_show_addresses": "Показать адрес", "details_title": "Информация", "details_type": "Тип", "details_use_with_hardware_wallet": "Использовать с аппаратным кошельком", @@ -407,7 +425,10 @@ "enter_bip38_password": "Введите пароль, чтобы расшифровать", "export_title": "Экспорт Кошелька", "import_do_import": "Импортировать", + "import_passphrase_title": "Кодовая фраза", + "import_passphrase_message": "Введите кодовую фразу, если она используется", "import_error": "Не удалось импортировать", + "import_explanation": "Напиши тут свою мнемоническую фразу, публичный ключ, WIF - что угодно! BlueWallet постарается угадать верный формат.", "import_file": "Импортировать файл", "import_imported": "Импорт завершен", "import_placeholder_fail": "Импортированный кошелёк", @@ -420,6 +441,7 @@ "list_create_a_wallet_text": "Это бесплатно и ты можешь создать\nнеограниченное количество", "list_empty_txs1": "Список транзакций пока пуст", "list_empty_txs1_lightning": "Lightning кошелек отлично подходит для ежедневных транзакций. Комиссия несправедливо мала, а скорость невероятно высока.", + "list_empty_txs2": "Добавьте кошелёк.", "list_empty_txs2_lightning": "\nДля начала использования нажми \"Мои средства\" и пополни баланс.", "list_header": "Кошелек - пара ключей, один приватный, другой - публичный используется, чтобы получить Bitcoin.", "list_import_error": "При импорте этого кошелька возникла ошибка.", @@ -446,6 +468,7 @@ "pull_to_refresh": "потяните, чтобы обновить", "warning_do_not_disclose": "Внимание! Не разглашать", "add_ln_wallet_first": "Сначала добавьте Лайтнинг кошелёк.", + "identity_pubkey": "Identity Pubkey", "xpub_title": "XPUB кошелька" }, "multisig": { @@ -462,6 +485,7 @@ "share": "Отправить", "view": "Посмотреть", "manage_keys": "Управление ключами", + "how_many_signatures_can_bluewallet_make": "количество подписей, которое может сделать BlueWallet", "signatures_required_to_spend": "Необходимо {number} подписей ", "signatures_we_can_make": "можно сделать {number}", "scan_or_import_file": "Сканировать или импортировать файл", @@ -547,5 +571,29 @@ "MAX": "МАКС", "sat_byte": "сатоши/байт", "sats": "сатоши" + }, + "addresses": { + "sign_title": "Подписать/Проверить сообщение", + "sign_help": "Здесь вы можете создать или проверить криптографическую подпись за базе Биткоин адреса", + "sign_sign": "Подписать", + "sign_sign_submit": "Подписать и отправить", + "sign_verify": "Проверить", + "sign_signature_correct": "Успешно проверено!", + "sign_signature_incorrect": "Проверка не удалась!", + "sign_placeholder_address": "Адрес", + "sign_placeholder_message": "Сообщение", + "sign_placeholder_signature": "Подпись", + "sign_aopp_title": "AOPP", + "sign_aopp_confirm": "Отправить подписанное сообщение на {hostname}?", + "addresses_title": "Адреса", + "type_change": "Сдача", + "type_receive": "Получение", + "type_used": "Использован", + "transactions": "Транзакции" + }, + "aopp": { + "title": "Выберите адрес", + "send_success": "Подпись успешно отправлена", + "send_error": "Ошибка отправки подписи" } } From 0eefa03b2dbc0917de698e220d6b59d95411373f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 21 Jul 2021 09:46:03 -0400 Subject: [PATCH 248/327] OPS: Update RN Clipboard --- ios/Podfile.lock | 4 ++-- package-lock.json | 6 +++--- package.json | 2 +- tests/setup.js | 4 ++++ 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index aeb3795cb..4207c9994 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -367,7 +367,7 @@ PODS: - React - RNCAsyncStorage (1.15.5): - React-Core - - RNCClipboard (1.7.0): + - RNCClipboard (1.8.4): - React-Core - RNCMaskedView (0.1.11): - React @@ -774,7 +774,7 @@ SPEC CHECKSUMS: RealmJS: c903034b0d767fcef11dc8207e91b6f07e60d7b8 RemobileReactNativeQrcodeLocalImage: 57aadc12896b148fb5e04bc7c6805f3565f5c3fa RNCAsyncStorage: 8324611026e8dc3706f829953aa6e3899f581589 - RNCClipboard: dac13db8b1ce9b998f1cbc7ca33440113602847f + RNCClipboard: 5df122bc31f95f2b37de9bbadc1dbef5a79cb1b0 RNCMaskedView: f127cd9652acfa31b91dcff613e07ba18b774db6 RNCPushNotificationIOS: 5b1cf9ad2aaa107ecb92d5d2d7005ba521b2b97a RNDefaultPreference: 21816c0a6f61a2829ccc0cef034392e9b509ee5f diff --git a/package-lock.json b/package-lock.json index 34a1642bb..2d916f9a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2968,9 +2968,9 @@ } }, "@react-native-clipboard/clipboard": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.7.0.tgz", - "integrity": "sha512-i5dJgR+wM8Om+hFEB/PqNb65/x5WxpaZG+UjEBX2/gmmIrmAWI72tI9rVL1gjPA9RWNpdpzvp+ioGjpdl7MyWQ==" + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.8.4.tgz", + "integrity": "sha512-poFq3RvXzkbXcqoQNssbZ+aNbCRzBFAWkR9QL7u9xNMgsyWZtk7d16JQoaBo8D2E+kKi+/9JOiVQzA5w+9N67w==" }, "@react-native-community/blur": { "version": "3.6.0", diff --git a/package.json b/package.json index 86d49d412..30d6ae2e2 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "@keystonehq/bc-ur-registry": "https://github.com/BlueWallet/ur-registry", "@ngraveio/bc-ur": "https://github.com/BlueWallet/bc-ur", "@react-native-async-storage/async-storage": "1.15.5", - "@react-native-clipboard/clipboard": "1.7.0", + "@react-native-clipboard/clipboard": "1.8.4", "@react-native-community/blur": "3.6.0", "@react-native-community/masked-view": "0.1.11", "@react-native-community/push-notification-ios": "1.8.0", diff --git a/tests/setup.js b/tests/setup.js index 54864c461..0a810ccdd 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -1,5 +1,9 @@ /* global jest */ +import mockClipboard from '@react-native-clipboard/clipboard/jest/clipboard-mock.js'; + +jest.mock('@react-native-clipboard/clipboard', () => mockClipboard); + jest.mock('react-native-watch-connectivity', () => { return { getIsWatchAppInstalled: jest.fn(() => Promise.resolve(false)), From 826bdbd388ed6da97cc41aaccb7a31dd4c59e7d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 21 Jul 2021 07:09:29 -0700 Subject: [PATCH 249/327] ADD: Windows assets --- msbuild.binlog | Bin 0 -> 1861 bytes windows/bluewallet.sln | 13 +++-- ...go.altform-lightunplated_targetsize-16.png | Bin 0 -> 617 bytes ...go.altform-lightunplated_targetsize-24.png | Bin 0 -> 996 bytes ...o.altform-lightunplated_targetsize-256.png | Bin 0 -> 19546 bytes ...go.altform-lightunplated_targetsize-32.png | Bin 0 -> 1452 bytes ...go.altform-lightunplated_targetsize-48.png | Bin 0 -> 2414 bytes ...x44Logo.altform-unplated_targetsize-16.png | Bin 0 -> 617 bytes ...44Logo.altform-unplated_targetsize-256.png | Bin 0 -> 19546 bytes ...x44Logo.altform-unplated_targetsize-32.png | Bin 0 -> 1452 bytes ...x44Logo.altform-unplated_targetsize-48.png | Bin 0 -> 2414 bytes .../Assets/Square44x44Logo.scale-100.png | Bin 0 -> 1589 bytes .../Assets/Square44x44Logo.scale-125.png | Bin 0 -> 2174 bytes .../Assets/Square44x44Logo.scale-150.png | Bin 0 -> 2858 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 1647 -> 3912 bytes .../Assets/Square44x44Logo.scale-400.png | Bin 0 -> 8455 bytes .../Assets/Square44x44Logo.targetsize-16.png | Bin 0 -> 508 bytes .../Assets/Square44x44Logo.targetsize-24.png | Bin 0 -> 801 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 1255 -> 1255 bytes .../Assets/Square44x44Logo.targetsize-256.png | Bin 0 -> 13075 bytes .../Assets/Square44x44Logo.targetsize-32.png | Bin 0 -> 1119 bytes .../Assets/Square44x44Logo.targetsize-48.png | Bin 0 -> 1846 bytes .../AutolinkedNativeModules.g.targets | 8 +-- windows/bluewallet/bluewallet.vcxproj | 23 +++++++- windows/bluewallet/bluewallet.vcxproj.filters | 54 ++++++++++++++++++ 25 files changed, 86 insertions(+), 12 deletions(-) create mode 100644 msbuild.binlog create mode 100644 windows/bluewallet/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.altform-unplated_targetsize-16.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.altform-unplated_targetsize-256.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.altform-unplated_targetsize-32.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.altform-unplated_targetsize-48.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.scale-100.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.scale-125.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.scale-150.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.scale-400.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.targetsize-16.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.targetsize-24.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.targetsize-256.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.targetsize-32.png create mode 100644 windows/bluewallet/Assets/Square44x44Logo.targetsize-48.png diff --git a/msbuild.binlog b/msbuild.binlog new file mode 100644 index 0000000000000000000000000000000000000000..a1b4bba32eb6925aa8532d2566708cbca13adcb9 GIT binary patch literal 1861 zcmV-L2fFwliwFP!000040KHe;R@>MWhJ*yhKnOHLP9~XFL&*Ge65&70kH?*nB^i{+ zmPV2dX*G3a>tGaQ9gThhzMIt-=tX-yZ_u@R*SlW!9r^-oAE4Jww!c6-@SXc5I^2s_L%+GU%S6s68|=H zYZ5K9q36L~b%71-AoOqvJ1^>L1T}XZDDs!@2T=FQk!O@27+!!)8Z9uQSXX&Pl@+NX zh&;Ln$CN$N@r*8K1O}RBWSL_$27Nqwe#Uj9d0in!*K#^&kv$}BVjBVO2@b&9HhMG) zrMHI`2%TDsh95-y)?E`m(NZRtEo^2B`Hl7Ud~PF?-^!sSmUO$s>0?C~;-jah;8Z+9 zeSWf8_(D%ilOgnQd|_;L4soxL&t>BSjv$U=&9PEdu4}wfW2!*Yo>1fXMmCeq^9@Es z(_pK*xQ!kI%AVzz^ zZ?PBO&8KJfQU`k_^S*w@?t@*a%5#d);L$C18_h(YGNbLH*)xuyIZw?Gupiq@1MN`pa27S~Y)fi=m*QB}z#Dm3-P}@N>HHqV!{63F98N0BEuQ$FP|Bnez z)#PfE6@}(Y6>VN=KBU=kyL!Yl{D0B5E&7d*K8#Rgg|7(v&6>PF0A#Mrh#2S+I~eC{Tre@sMV`wUTI1d@KR!VRh1OrF^gs-2gh*$5;EfJaQyz@jU|o`ap<92l8RFO zsA|?UG!-Q$`um;th}z->IdNvJcu^SdwQ%?1iDW<~$JkR3v2E*bGjv+N&{lG>qpG{{ zNuITS^mX(G|vEb$4U{@!{ zd17L_B$_zv9|gp{0w;0dX4V6S&Kc2tdV=WA&~zk>{Jw??Gzfl?2B9g^WkxH~Y?Uk0 zjj|d&VC#J$8$9Rb|0M7SZxB1)Ge*?g|>uYITK2x8as9m`rNV9j3|^^60_o zw7~H-O{fSUuzA4=uwBSg72wY9Q3a|BB->PGeUnlH?7BcGmB~G)cCZs#4vx*y!YP)> zH+T_E7SPh^n8G&%Rgh|EY73`LG<&w@&y7^t<%JC_|)mSBBh52z(*WY%J4G+IKBz~Z)hwy4r6=IulIU5SjxBw(5{&?VDX*yP=FHx5M z5^%m=76le948unbTej6kvno&uRK|_LbR?w2#xNS=CNi5!J`_R%lserTO=)~pM$}bN ztKqJTZfjtciW)Uesxm?iJvx1FDiTwL$~frYW}>Osm#Mg}&qm*a$@!73(A{Hj#PZOc zrVGTOsYqiU=I$-rUtIdhgAbP<$pZ<*cWaa7Vvrj+!{EMG|`TPaF_B@@* z=JM->jm@p?;#bAeFTVbUDYG13+1V9dz7neoHA$AfRaC9s*xP^o%U`YP-~GDzo2K!k z^`vd$gU)w{*5vB^>p%UFG^QzJ!OgX??^7jeh%FBSlkW+qh({tg^2xsczSdrPk)?> zunotgY>)v88m=T|B2WLvu2R=;503kJ*Mgzrc!>6Ghgxgf?sko+A)LVL6>CI*gkc;L zoOZDn^hC=KiVf_whz|~xpo&;saCgli@EeOzYwk8=-htH#JtMG)Q{r$d>_o#d6x##h zbxUyG=o`}Oq#Qb?jY~BQ1)N%I0nCBzX11~C5zi;ko)!W00B9=xx6~Z4(A?V06qd^41;FwS#dT-!hKIIr)s5L9_FB9}ND&29n$%QCNI@7O6d($co!Ix<2eXc4ACYV4$^PAcIW(Yi* zw>KY1Ra=8Imz*;dINlUIPg`$nCtcQ>xYR@2?ud)V${R)*R1Q7gL>(D(+@cnZF&yp$ut9M(7F4q1> z0(|Mj*xlX(U0q#3v{FaEJAj)e|A^6iB?bl$&`nFk;+qz}JDn z^Y+nr4RB(K6u*ic-C4sn!qvhEet>WYK>BA!%*DvHUvR1JpuXl>VN^JcX5 z==H~kwXnWsv|eE?O24nAfKn<)n(W2Bqm5^G+FL&Xh{6mtpg#0D00000NkvXXu0mjf Dc~%zS literal 0 HcmV?d00001 diff --git a/windows/bluewallet/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png b/windows/bluewallet/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png new file mode 100644 index 0000000000000000000000000000000000000000..502bc1e4d6ec73850d3f5bb0ce5f8d4bbe55cb8f GIT binary patch literal 996 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 Dc~%zS literal 0 HcmV?d00001 diff --git a/windows/bluewallet/Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/windows/bluewallet/Assets/Square44x44Logo.altform-unplated_targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..f962373c6f9f100f02ec88adca39707c529fcb1b GIT binary patch literal 19546 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 IM6N<$g0JIa4gdfE literal 0 HcmV?d00001 diff --git a/windows/bluewallet/Assets/Square44x44Logo.scale-200.png b/windows/bluewallet/Assets/Square44x44Logo.scale-200.png index ce342a2ec8a61291ba76c54604aea7e9d20af11b..a3679860851220a4541ee9148c6ec115eeff21a8 100644 GIT binary patch literal 3912 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 diff --git a/windows/bluewallet/Assets/Square44x44Logo.scale-400.png b/windows/bluewallet/Assets/Square44x44Logo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2010c0c8aebf3ed7f5e1006d890b2c45fb5392 GIT binary patch literal 8455 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 VcV{UX{!KO@D9WnIz@$t={vWK$RM!9i literal 0 HcmV?d00001 diff --git a/windows/bluewallet/Assets/Square44x44Logo.targetsize-16.png b/windows/bluewallet/Assets/Square44x44Logo.targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..e08bb9a4b1266f2d9948e298271cdacefbcf44fd GIT binary patch literal 508 zcmVeL2Gc{s;r}Mhr2wN9E=~{m z^*EsN@{M)ih`ZgthzBDm&Y)UbvFGCes~Lhoqw*qz@Hpi#ngye)Uqa_nK}I}#p8=}1 zB33tE5rm{;CJtAeOq7!0`0H67P=8D2QTe@Il5I*ekb0b^|q2l%wHctz7T{&7tFH{Js%y|Amk*~ydu0000PB?3=2#Qi7D<7P4o$L z;mW-WA3zrH04|JMA46Bf9hw*u6BA-+(1jWz+H#q;!_1tE{|po;b{tu_(33RNcK-8S z{_k8&{N-W(e*~rZ$5W=AUxb!btz{ls^WP#crWiB!!1!z7IZO4I57%P}N()aW4Q{S7 z!z}3_0D~rgB#l&~RfU=MMZ-+rB8<8E%7a=@0?@DOD#Q^sWiA@A=!e4QUbzv>8T`Vx_a_$7lH8G*=&9gLt|Hw?i&E- z#sPkU5yFMrY+&p28rpkX*;s;fF3&E^T!&?)AZ75!E#jt$Vr3k;;xIPeJ@2yIMKE;! zvNkOnzSm67_SBHVhh_Ig7@KhfncP6s%fJgL4s|91ZgR@njWA*zgdOqseU#6oQ5ngR zA|tW?q1C{X`2MwpADceq*8RGRK#Bmf3!|8vDZnr|bRv3(gHdJ*wfDPtyYeZXVCqU4 zmuAbf5?peV46dkzABM$fFNAZQhJ!b81Y^@hxa|Oe5Qn;shaf_AxUp#$!lG8B2;HL} zBGeLoXzn;+#5yo-4&SFuBfA3*f%7Q_ld-6676JDY!$iM{^<5G~<-=Ky4^0W4;_(DR zO0K!2e#)*QmsCy{Y|M{j@TDojlK~-2i=!aqdjxlfkCr3 zc0G7P!U;4oCPP4=K3Pi{44oCNwM7d>wPOjS6sze>?vC3cuk1L1@N2_W_|^)dP&@H= zPLb$IB8ruQp_H>4OW=Fzk=kzDNEgc`uenF3@PV`lBnlNh2cyMr_vO*rY19Q_#1cHc zIa<5_;^Q?1wy1=d(^B-)+F?gBkJwIt(;-jyha;VxS1qTx^z8OT?Ih+eHyRa$H`2Y{ fTF*ZI{Y(ERFtbLomW`tT00000NkvXXu0mjf2Ig(L literal 0 HcmV?d00001 diff --git a/windows/bluewallet/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/windows/bluewallet/Assets/Square44x44Logo.targetsize-24_altform-unplated.png index f6c02ce97e0a802b85f6021e822c89f8bf57d5cd..178b5e63e2c73ed6db6e7ac1829237ae66063193 100644 GIT binary patch delta 979 zcmV;^11$XK3FirrB!3BTNLh0L03C+_03C+`kLB@Y000A)Nkl1pj3q@K{M8APp=#3PLUi5Q#Q3&-aAcFb@1mEaopm-r- zAs3>p#fX?!cQZ5Dndi;(JiCdgHFRsvz_2sB^ZTFqpL3pPC4a`zer4r(&Xa3!<^qG8 zbIw&TK`_Qj$M`m5;5@tu-x}JS0EU>7m}} zKvt5G$RvD%>vD)}u!X_S227dzqO_z{2T^spjWcIoK)u-=IpiEB_bOBwZ7d?|Z{n99 zZezH=6G<6W&|7*DacvsPtDZpA8f`2ry@VgX{S2~wdVdi~y$Ll;PXz8m7dbI!;MsDz zH4meU;NeMzXL`02QB2+AJIIhlCfLtIeJ5`tYeN|jRRoQef@e$LR;p0o%wS=$iO%UM zBsCe@?coc}LVFK$jjdl(Z2Z&@Od%L#aZsXls)6&DdIYbJa-pD{aM!}6Ow-1>AK@~LxeH0BcIgUMU;a9SAtUa>qa ziCKeZ%WiK9#ZbZ6}2=`Ns^*t2?pP}oGOd}^Qaay_12|I-skV5$ zF0ofw-#_Rk98a97hPQZ(YT7R}c7_Imo|ncLN=wijJXpZL{_oU&%_zZaB9Kx_8LjM% zh~Yq!74$gig7k22ceENC>t}*^#Fmu#F6VsiSc^#J^ZVJ+cH#ZMHz+YEZLn`hBGVNf zz<+o9<;YT=z^GzZYVFpNxcc-k-5+f@4+wvEn~HYWGX8ptnojW1EkF4EV%$mN`D}J( zd75QwvefSVY|y{V<3y-~{8*7A&&GxKpAYB#X!oGEh^lp-{jp~}Ti(1lzkc=0pD)La z=4w3Cj@3aH)+M+Jr#b9o!oxv{7Uh0=TWs4@7*5+{G#S+&C!qC#> zf>5N3P6jO*Cz>ug*(_DmW=)kea&m$gZ^+nyiF`;j%w@}y8)>p*SH}C`m?DXeieF2U zyQHecc_L%Gh!7GMt+hG06y;+|p4>m~}PjA}rKViGiEnn7G0ZO<>G|7q;2?NwGCM3s?eued6%hd$B+ z*kQJ{#~$S=DFE(%=E+UkmlEI*%3llUf~8Ja9YU1Vui0IbGBkW_gHB%Rd&!!ioX zs40O?i9I{};kle7GMvE7(rk`la=gTI)47=>%?q@^iL-nUo3}h4S}N-KHn8t5mVP8w z&bSErwp+37 zNJJ8?a|{r5Q3R0Z5s-LB1WHOwYC@7pCHWND#cL1cZ?{kJ368_*(UDWUDyb<}0y@o# zfMF016iMWPCb6obAxT$JlB6(2DrlXDTB&!0`!m??4F(qWMhjVZo?JXQmz`1*58Z=& zcDmB|S-E@j?BoFGix0flckqdS4jsPNzhfWyWIM98GxcLs89C(~dw%$_t;JjX-SD}E zfiGV;{8Q%8r}w9x>EEigW81>`kvnU@pK)4+xk9@+bNj9L!AAZ@SZ@q|)&BmY3+HZx zul~BeG4|}-;L%cHViQGQX?^zFfO0&#cHwel=d`lH9sJ-@Sl@n*(8J2>%Ac`IxyY?Q z{=GhWvC#gu-~Ia7*n{=+;qM?Ul_wy1+u7ho;=`>EwP^g~R@{unBds`!#@}tluZQpS zm)M~nYEifJWJGx?_6DcTy>#uh%>!H9=hb^(v`=m3F1{L>db=<5_tm+_&knAQ2EU$s Mu9UqpbNZeC0BbUo^Z)<= diff --git a/windows/bluewallet/Assets/Square44x44Logo.targetsize-256.png b/windows/bluewallet/Assets/Square44x44Logo.targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..0723f74fe82ce5e77951b63a2d95899eca334448 GIT binary patch literal 13075 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 literal 0 HcmV?d00001 diff --git a/windows/bluewallet/Assets/Square44x44Logo.targetsize-32.png b/windows/bluewallet/Assets/Square44x44Logo.targetsize-32.png new file mode 100644 index 0000000000000000000000000000000000000000..079a9ba6d30c2e7b55f6298fea433407e5ef9c98 GIT binary patch literal 1119 zcmV-l1fctgP)8&C?yt|l2xTtZW70gu|$Dw zf$^`U?5%Bnx$?ul0qRTVUSq6qo^dY^A^Q&LGm$Y3;mk3fdyENnruN*q<>tk=KN$;9 ze|GHz9Oq-GjLTjqCsVaer6C0&mt)NPsJ3+W`{t$9pGE>mmacL>#bw-zz!gdqwts4*t`E*!$JV4s@{OJmg9$!RhrattB$@5^U z5H&0y+}^++KYxR6XUo#FFL*i3pLhoOVn8d1CKTP<3PBYO^7+empIg6K0M)|_@JnT+ zy`8%vt}Tlr@;QU*kp(oz0ZfeU8P-rT8uD#xfF7pW__Me+B8H;ZagYt?ekD$+VW!oVDn0&Dq;CuM90E7^VwlA6kdjsh3ZbT^p&qu}QMm!{? zz+>oU6l!{$xKN_6>#fA3DwBF9Na`kGwUZ4XsCR(8T}xVs5#fFx6A!|m4VPQJj?Za5Oc*dVBUAY=|2V)#3S$14<_aQhZz z7w?P(cyDR$+FKWXJ(CN9^ZD6YKJ9kQz5q4hG&FBQoWx7Cvv%Wnr@j3Ci}P2<0vL$X z^Pet%v3{i}#EKNz(^Ne4S}yticLMW9ESTV%nUG(l;m+Czryu-ruY2$Kzu?1{9=bw@ lH}|P|V7qt!8U1Gf{sz8z$}Y(Tz0d#v002ovPDHLkV1fmI7<2#t literal 0 HcmV?d00001 diff --git a/windows/bluewallet/Assets/Square44x44Logo.targetsize-48.png b/windows/bluewallet/Assets/Square44x44Logo.targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..66c20c4f0f0f35c347bbeaea469e91267a5a8dac GIT binary patch literal 1846 zcmV-62g&$}P)2yreH@;ku)VDR&of4-IXZ%*LFL$aedx*t&6 zrPbtwnsl+sP($!@VlW#K(I|8xyCBtaDeb4VU*6O4%)tYLne1+SyhYEPz}mg)?(qws z$W*pZyO$A^OLYgEt<+2*q;jOwx|4LT8d|&e1sr}Oh^8Yzqw2bwIisEYIc|T5Y{cF+Cf+j4u83;|3-ac2?#B> ziKdj&mCG76KmE5Q@F1I7m8f{z=<2l_b%`es>NTNXxq_$7=CokekMkfN#u zT89QpVgf>ITkDE3LSgw6SlG4HSe+GxHMa_9mjkXSvrIO$n=)v*s{^@3%W&zhQy4h? z1GLW=gq@fGB`lgr8@>0hLuDq=VMoC7}3Y`$kDoKyy9PkuvT)r*ZH zu>^bqTUh!y7UX*1m5bASeY(}>;v8nJu};?AdGBhR`{mm>nDGQ!TJu=gxs)tF2@`7? zqqG+Q{=$r@BPZP$# zSmGp>faNq_9dW9{d_o;1u!gynh?ba;qL$O9gfTFdSe$VWq?Ak_wM^`J6svtrp-xeB zP_QhC>$J^O$SOXK?Un<$m4FhZgl$)I3}G->k`gfE(l4Na`DpKM!Qz!!<|8*1>&QC--RQ+kLOTc%1F!@I}_F&0_Iap*BR-}WlVL5CH zh^^4vVv(WJSo&}dznvJyk6#Z=VMt6M@Tl%_B-U*1MfZJop)%>gb%VLBOMRLRb|F%- zY;`-*tqzWSdJcgbyPt_C;JF@FufGRfOIlGJcjp9eobamiNhj-mXiXQs|KfCP-&g|q zMHwu9U?EBq?!1Lk*3B4xJN|cUpI8Eg6|I8E&&dI{W-!7|k}3Y&UTI5zAV zS1A*~_LRixoP)tqfX#(wjF9Dt8;zsQcu~%Y#}J>dz8d$hm(Vsi2dt*{9DC(BZOA)|W^Ti!t-4_!jg~xk^aM0);(qoB#1QZI;Y1f1~j|EfnzQ$P=Qa*jGLBS zM+t#yJ!^QM8g0Bw4HUD!%)JilY3h-3YS8J=30tq zJy~WfJ=K%1Z0cK!RE8XXrKpB9!XOz-Vggj!zF!<0c@;_t?fZ!c)TCzR>5K5{1sPtO zB7kY{NXr6Y2pCIZ0`F|>>3`+Rb8okH_UxRvFfcD4N7LDMdHL@@-+E_b;fCKuS?ZS4 zM@9dhM~398Oun;ka^wPSXuP@qPHNo7mg%;3j1LWb#u(~#uS?+Yh7Cdf(4ptMv2H(2 z=k`=K>+ts>B0?Lr#!iZ$qMtumT22ZsmA?}ghYp+{`gZr>EwlN9gXH6AfL$+rcJ{p> z&|3w9rzk@&CQG%D2g_OSi_Lym@XSsK-}~KjD~J7w(uW88dK>f?Q&p-1zCL51b0q(t ke<}Z~a)-ct%WY5KAJ7F|rYyHbi2wiq07*qoM6N<$f>v>PW&i*H literal 0 HcmV?d00001 diff --git a/windows/bluewallet/AutolinkedNativeModules.g.targets b/windows/bluewallet/AutolinkedNativeModules.g.targets index c702dd22b..136ab869f 100644 --- a/windows/bluewallet/AutolinkedNativeModules.g.targets +++ b/windows/bluewallet/AutolinkedNativeModules.g.targets @@ -3,15 +3,15 @@ - + {4855D892-E16C-404D-8286-0089E0F7F9C4} - + {7432c343-cc07-4bc7-9bd0-8c467be0f018} - + {3e3931f2-4735-4417-8cb0-33668a7314d6} @@ -19,7 +19,7 @@ {10e2379c-4264-444a-8656-b3d7e83acb44} - + {729d9af8-cd9e-4427-9f6c-fb757e287729} diff --git a/windows/bluewallet/bluewallet.vcxproj b/windows/bluewallet/bluewallet.vcxproj index b873139ea..1a544801c 100644 --- a/windows/bluewallet/bluewallet.vcxproj +++ b/windows/bluewallet/bluewallet.vcxproj @@ -71,7 +71,8 @@ false - + + @@ -129,8 +130,26 @@ + + + + + + + + + + + + + + + + + + @@ -193,4 +212,4 @@ - + \ No newline at end of file diff --git a/windows/bluewallet/bluewallet.vcxproj.filters b/windows/bluewallet/bluewallet.vcxproj.filters index 909fc4c19..c8f0fc0f8 100644 --- a/windows/bluewallet/bluewallet.vcxproj.filters +++ b/windows/bluewallet/bluewallet.vcxproj.filters @@ -41,6 +41,60 @@ Assets + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + From fa5d1a0ece90333468de8f4dd526be7258cba94b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 21 Jul 2021 10:23:13 -0400 Subject: [PATCH 250/327] Update package-lock.json --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 34a1642bb..64bb5f682 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19223,7 +19223,7 @@ } }, "scryptsy": { - "version": "file:https:/registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", + "version": "file:blue_modules/scryptsy", "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" }, "secp256k1": { From 250466af6b95754e849391168b13ba6a488cf323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 21 Jul 2021 11:47:16 -0400 Subject: [PATCH 251/327] OPS: Windows patches --- package.json | 1 + scripts/windows-patches.sh | 1 + 2 files changed, 2 insertions(+) create mode 100755 scripts/windows-patches.sh diff --git a/package.json b/package.json index 86d49d412..b124ac9e9 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "postinstall": "rn-nodeify --install buffer,events,process,stream,util,inherits,fs,path,assert,crypto --hack; npm run releasenotes2json; npm run podinstall", "test": "npm run lint && npm run unit && npm run jest", "jest": "jest -b -w 1 tests/integration/*", + "windowspatches": "./scripts/windows-patches.sh", "maccatalystpatches": "./scripts/maccatalystpatches/applypatchesformaccatalyst.sh", "e2e:debug-build": "detox build -c android.emu.debug", "e2e:debug-test": "detox test -c android.emu.debug -l fatal", diff --git a/scripts/windows-patches.sh b/scripts/windows-patches.sh new file mode 100755 index 000000000..37246eb52 --- /dev/null +++ b/scripts/windows-patches.sh @@ -0,0 +1 @@ +sed -i '' 's/if (error.code === "ENOENT") {/if (error.code === "ENOENT" || error.code === 'EISDIR') {/g' ./node_modules/metro/src/node-haste/DependencyGraph/ModuleResolution.js From 83c348ef9395675551a2685c2987247ca29ba217 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 21 Jul 2021 16:36:41 +0000 Subject: [PATCH 252/327] Translate /loc/en.json in fa_IR review completed for the source file '/loc/en.json' on the 'fa_IR' language. --- loc/fa.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/loc/fa.json b/loc/fa.json index 057188462..93b8b1a60 100644 --- a/loc/fa.json +++ b/loc/fa.json @@ -425,6 +425,8 @@ "enter_bip38_password": "گذرواژه را برای رمزگشایی وارد کنید", "export_title": "صادرکردن کیف پول", "import_do_import": "واردکردن", + "import_passphrase_title": "پس‌فریز (Passphrase)", + "import_passphrase_message": "درصورتی‌که از پس‌فریز (passphrase) استفاده کرده‌اید آن را وارد کنید", "import_error": "واردکردن ناموفق بود. لطفاً از معتبربودن دادهٔ ارائه‌شده اطمینان حاصل کنید.", "import_explanation": "لطفاً کلمه‌های سید، کلید عمومی، WIF، یا هر چیزی را که دارید وارد کنید. BlueWallet تمام تلاش خود را برای حدس‌زدن قالب صحیح و واردکردن کیف پول شما انجام خواهد داد.", "import_file": "واردکردن فایل", From 9f339c56ae36608005fc04b8445aff097bd721de Mon Sep 17 00:00:00 2001 From: Gabriele Genta Date: Sun, 18 Jul 2021 14:56:59 +0200 Subject: [PATCH 253/327] ADD: configuration to support typescript --- .eslintrc | 43 ++- package-lock.json | 701 ++++++++++++++++++++++++++++++++++------------ package.json | 22 +- tsconfig.json | 16 ++ 4 files changed, 588 insertions(+), 194 deletions(-) create mode 100644 tsconfig.json diff --git a/.eslintrc b/.eslintrc index ba32bc667..b53de32e0 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,7 +1,8 @@ { - "parser": "babel-eslint", + "parser": "@typescript-eslint/parser", "plugins": [ - "react-native", // for no-inline-styles rule + "@typescript-eslint", + "react-native" // for no-inline-styles rule ], "extends": [ "standard", @@ -9,8 +10,9 @@ "standard-jsx", "plugin:react-hooks/recommended", "plugin:react/recommended", + "plugin:@typescript-eslint/recommended", // "@react-native-community", // TODO: try to enable - "plugin:prettier/recommended", // removes all eslint rules that can mess up with prettier + "plugin:prettier/recommended" // removes all eslint rules that can mess up with prettier ], "rules": { "react/jsx-handler-names": "off", // activated by standard-react config @@ -24,9 +26,40 @@ "trailingComma": "all", "arrowParens": "avoid" } - ] + ], + "@typescript-eslint/no-empty-function": "off", // used often in the codebase, useful e.g. in testing + "@typescript-eslint/ban-ts-comment": [ + "error", + { + "ts-expect-error": "allow-with-description", + "ts-ignore": "allow-with-description", // temporary allow to ease the migration + "ts-nocheck": true, + "ts-check": false + } + ], + "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], + + // disable rules that are superseded by @typescript-eslint rules + "no-unused-vars": "off", + "no-use-before-define": "off", + + // disable rules that we want to enforce only for typescript files + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/no-use-before-define": "off" }, - "env":{ + "overrides": [ + { + // enable the rule specifically for TypeScript files + "files": ["*.ts", "*.tsx"], + "rules": { + "@typescript-eslint/explicit-module-boundary-types": ["error"], + "@typescript-eslint/no-var-requires": ["error"], + "@typescript-eslint/no-use-before-define": ["error", { "variables": false }] + } + } + ], + "env": { "es6": true }, "globals": { "fetch": false } diff --git a/package-lock.json b/package-lock.json index 17833b8b7..97a2e7dc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1152,15 +1152,15 @@ } }, "@eslint/eslintrc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", - "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", "espree": "^7.3.0", - "globals": "^12.1.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", @@ -1168,25 +1168,13 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" } }, "ignore": { @@ -1216,12 +1204,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true } } }, @@ -1238,6 +1220,23 @@ "@hapi/hoek": "^9.0.0" } }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2959,6 +2958,32 @@ } } }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@react-native-async-storage/async-storage": { "version": "1.15.5", "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.15.5.tgz", @@ -3306,6 +3331,33 @@ "prettier": "^2.0.2" }, "dependencies": { + "@typescript-eslint/eslint-plugin": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz", + "integrity": "sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "3.10.1", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/parser": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", + "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "3.10.1", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-visitor-keys": "^1.1.0" + } + }, "eslint-config-prettier": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", @@ -3323,6 +3375,30 @@ "requires": { "prettier-linter-helpers": "^1.0.0" } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -3998,6 +4074,16 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jest": { + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, "@types/json-schema": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", @@ -4011,9 +4097,9 @@ "dev": true }, "@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.3.tgz", + "integrity": "sha512-8h7k1YgQKxKXWckzFCMfsIwn0Y61UK6tlD6y2lOb3hTOIMlK3t9/QwHOhc81TwU+RMf0As5fj7NPjroERCnejQ==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -4028,14 +4114,14 @@ "dev": true }, "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "version": "15.7.4", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" }, "@types/react": { - "version": "17.0.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.5.tgz", - "integrity": "sha512-bj4biDB9ZJmGAYTWSKJly6bMr4BLUiBrx9ujiJEoP9XIDY9CTaPGxE5QWN/1WjpPLzYF7/jRNnV2nNxNe970sw==", + "version": "17.0.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.14.tgz", + "integrity": "sha512-0WwKHUbWuQWOce61UexYuWTGuGY/8JvtUe/dtQ6lR4sZ3UiylHotJeWpf3ArP9+DSGUoLY3wbU59VyMrJps5VQ==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4043,9 +4129,9 @@ } }, "@types/react-native": { - "version": "0.64.4", - "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.64.4.tgz", - "integrity": "sha512-VqnlmadGkD5usREvnuyVpWDS1W8f6cCz6MP5fZdgONsaZ9/Ijfb9Iq9MZ5O3bnW1OyJixDX9HtSp3COsFSLD8Q==", + "version": "0.64.12", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.64.12.tgz", + "integrity": "sha512-sw6WGSaL219zqrgdb4kQUtFB9iGXC/LmecLZ+UUWEgwYvD0YH81FqWYmONa2HuTkOFAsxu2bK4DspkWRUHIABQ==", "requires": { "@types/react": "*" } @@ -4059,10 +4145,19 @@ "@types/react-native": "*" } }, + "@types/react-test-renderer": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz", + "integrity": "sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, "@types/scheduler": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", - "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "@types/yargs": { "version": "15.0.13", @@ -4078,19 +4173,80 @@ "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" }, "@typescript-eslint/eslint-plugin": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz", - "integrity": "sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==", + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.3.tgz", + "integrity": "sha512-jW8sEFu1ZeaV8xzwsfi6Vgtty2jf7/lJmQmDkDruBjYAbx5DA8JtbcMnP0rNPUG+oH5GoQBTSp+9613BzuIpYg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "3.10.1", - "debug": "^4.1.1", + "@typescript-eslint/experimental-utils": "4.28.3", + "@typescript-eslint/scope-manager": "4.28.3", + "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.3.tgz", + "integrity": "sha512-zZYl9TnrxwEPi3FbyeX0ZnE8Hp7j3OCR+ELoUfbwGHGxWnHg9+OqSmkw2MoCVpZksPCZYpQzC559Ee9pJNHTQw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.3", + "@typescript-eslint/types": "4.28.3", + "@typescript-eslint/typescript-estree": "4.28.3", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/types": { + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.3.tgz", + "integrity": "sha512-kQFaEsQBQVtA9VGVyciyTbIg7S3WoKHNuOp/UF5RG40900KtGqfoiETWD/v0lzRXc+euVE9NXmfer9dLkUJrkA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.3.tgz", + "integrity": "sha512-YAb1JED41kJsqCQt1NcnX5ZdTA93vKFCMP4lQYG6CFxd0VzDJcKttRlMrlG+1qiWAw8+zowmHU1H0OzjWJzR2w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.3", + "@typescript-eslint/visitor-keys": "4.28.3", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.3.tgz", + "integrity": "sha512-ri1OzcLnk1HH4gORmr1dllxDzzrN6goUIz/P4MHFV0YZJDCADPR3RvYNp0PW2SetKTThar6wlbFTL00hV2Q+fg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.3", + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4131,16 +4287,112 @@ } }, "@typescript-eslint/parser": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", - "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.3.tgz", + "integrity": "sha512-ZyWEn34bJexn/JNYvLQab0Mo5e+qqQNhknxmc8azgNd4XqspVYR5oHq9O11fLwdZMRcj4by15ghSlIEq+H5ltQ==", "dev": true, "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "3.10.1", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/scope-manager": "4.28.3", + "@typescript-eslint/types": "4.28.3", + "@typescript-eslint/typescript-estree": "4.28.3", + "debug": "^4.3.1" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.3.tgz", + "integrity": "sha512-kQFaEsQBQVtA9VGVyciyTbIg7S3WoKHNuOp/UF5RG40900KtGqfoiETWD/v0lzRXc+euVE9NXmfer9dLkUJrkA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.3.tgz", + "integrity": "sha512-YAb1JED41kJsqCQt1NcnX5ZdTA93vKFCMP4lQYG6CFxd0VzDJcKttRlMrlG+1qiWAw8+zowmHU1H0OzjWJzR2w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.3", + "@typescript-eslint/visitor-keys": "4.28.3", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.3.tgz", + "integrity": "sha512-ri1OzcLnk1HH4gORmr1dllxDzzrN6goUIz/P4MHFV0YZJDCADPR3RvYNp0PW2SetKTThar6wlbFTL00hV2Q+fg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.3", + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.3.tgz", + "integrity": "sha512-/8lMisZ5NGIzGtJB+QizQ5eX4Xd8uxedFfMBXOKuJGP0oaBBVEMbJVddQKDXyyB0bPlmt8i6bHV89KbwOelJiQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.3", + "@typescript-eslint/visitor-keys": "4.28.3" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.3.tgz", + "integrity": "sha512-kQFaEsQBQVtA9VGVyciyTbIg7S3WoKHNuOp/UF5RG40900KtGqfoiETWD/v0lzRXc+euVE9NXmfer9dLkUJrkA==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.3.tgz", + "integrity": "sha512-ri1OzcLnk1HH4gORmr1dllxDzzrN6goUIz/P4MHFV0YZJDCADPR3RvYNp0PW2SetKTThar6wlbFTL00hV2Q+fg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.3", + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } } }, "@typescript-eslint/types": { @@ -4270,9 +4522,9 @@ } }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, "acorn-walk": { @@ -4583,12 +4835,10 @@ "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" }, "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true }, "array-uniq": { "version": "1.0.3", @@ -5536,6 +5786,13 @@ "tiny-secp256k1": "^1.1.3", "typeforce": "^1.11.5", "wif": "^2.0.6" + }, + "dependencies": { + "@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + } } }, "bip39": { @@ -7140,25 +7397,19 @@ "integrity": "sha1-082BIh4+pAdCz83lVtTpnpjdxxs=" }, "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "requires": { - "path-type": "^3.0.0" + "path-type": "^4.0.0" }, "dependencies": { "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true } } }, @@ -7544,28 +7795,31 @@ } }, "eslint": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.25.0.tgz", - "integrity": "sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.30.0.tgz", + "integrity": "sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg==", "dev": true, "requires": { "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.0", + "@eslint/eslintrc": "^0.4.2", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", + "glob-parent": "^5.1.2", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", @@ -7574,7 +7828,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.21", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -7583,7 +7837,7 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^6.0.4", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, @@ -7657,15 +7911,11 @@ "esutils": "^2.0.2" } }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true }, "eslint-visitor-keys": { "version": "2.1.0", @@ -7673,23 +7923,6 @@ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -7700,9 +7933,9 @@ } }, "globals": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", - "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -7730,12 +7963,6 @@ "resolve-from": "^4.0.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7805,12 +8032,6 @@ "has-flag": "^4.0.0" } }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8251,14 +8472,6 @@ "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } } }, "esprima": { @@ -8786,6 +8999,73 @@ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", "dev": true }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -8797,6 +9077,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastq": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", + "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -8977,9 +9266,9 @@ } }, "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.1.tgz", + "integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==", "dev": true }, "flow-parser": { @@ -9195,6 +9484,40 @@ "load-json-file": "^4.0.0" }, "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "requires": { + "path-type": "^3.0.0" + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -9206,10 +9529,23 @@ "strip-bom": "^3.0.0" } }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" } } }, @@ -9337,33 +9673,17 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - } + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" } }, "graceful-fs": { @@ -14856,12 +15176,6 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, "lodash.frompairs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.frompairs/-/lodash.frompairs-4.0.1.tgz", @@ -14877,6 +15191,12 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lodash.omit": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", @@ -15190,6 +15510,12 @@ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, "merkle-lib": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", @@ -19045,6 +19371,12 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rimraf": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", @@ -19984,14 +20316,13 @@ } }, "table": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.6.0.tgz", - "integrity": "sha512-iZMtp5tUvcnAdtHpZTWLPF0M7AgiQsURR2DwmxnJwSy8I3+cY+ozzVvYha3BOLG2TB+L0CqjIz+91htuj6yCXg==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", "dev": true, "requires": { "ajv": "^8.0.1", "lodash.clonedeep": "^4.5.0", - "lodash.flatten": "^4.4.0", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", "string-width": "^4.2.0", @@ -19999,9 +20330,9 @@ }, "dependencies": { "ajv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", - "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -20046,12 +20377,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -20514,6 +20839,12 @@ "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" }, + "typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "dev": true + }, "typical": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", diff --git a/package.json b/package.json index c3aaee250..208d9a5c8 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,16 @@ "@babel/runtime": "^7.14.6", "@jest/reporters": "^26.4.1", "@react-native-community/eslint-config": "^2.0.0", + "@types/jest": "^26.0.24", + "@types/react": "^17.0.14", + "@types/react-native": "^0.64.12", + "@types/react-test-renderer": "^17.0.1", + "@typescript-eslint/eslint-plugin": "^4.28.3", + "@typescript-eslint/parser": "^4.28.3", "babel-cli": "^6.26.0", "babel-eslint": "^10.1.0", "babel-jest": "^26.6.3", - "eslint": "^7.25.0", + "eslint": "^7.30.0", "eslint-config-prettier": "^8.3.0", "eslint-config-standard": "^16.0.2", "eslint-config-standard-jsx": "^10.0.0", @@ -28,7 +34,8 @@ "eslint-plugin-standard": "^4.1.0", "jest": "^26.1.0", "prettier": "^2.2.1", - "react-test-renderer": "17.0.1" + "react-test-renderer": "17.0.1", + "typescript": "^4.3.5" }, "engines": { "node": ">=10.16.0", @@ -44,7 +51,7 @@ "android:clean": "cd android; ./gradlew clean ; cd .. ; npm run android", "ios": "react-native run-ios", "postinstall": "rn-nodeify --install buffer,events,process,stream,util,inherits,fs,path,assert,crypto --hack; npm run releasenotes2json; npm run podinstall", - "test": "npm run lint && npm run unit && npm run jest", + "test": "npm run tslint && npm run lint && npm run unit && npm run jest", "jest": "jest -b -w 1 tests/integration/*", "windowspatches": "./scripts/windows-patches.sh", "maccatalystpatches": "./scripts/maccatalystpatches/applypatchesformaccatalyst.sh", @@ -53,7 +60,8 @@ "e2e:debug": "(test -f android/app/build/outputs/apk/debug/app-debug.apk && test -f android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk) || npm run e2e:debug-build; npm run e2e:debug-test", "e2e:release-build": "detox build -c android.emu.release", "e2e:release-test": "detox test -c android.emu.release --record-videos all --take-screenshots all --headless --loglevel trace", - "lint": "eslint *.js screen/**/*.js blue_modules/*.js class/**/*.js models/ loc/ tests/**/*.js components/**/*.js components/*.js", + "tslint": "tsc", + "lint": "eslint --ext .js,.ts,.tsx '*.@(js|ts|tsx)' screen 'blue_modules/*.@(js|ts|tsx)' class models loc tests components", "lint:fix": "npm run lint -- --fix", "lint:quickfix": "git status --porcelain | grep -v '\\.json' | grep '\\.js' --color=never | awk '{print $2}' | xargs eslint --fix; exit 0", "unit": "jest tests/unit/*", @@ -64,6 +72,12 @@ "transform": { "^.+\\.js$": "/node_modules/react-native/jest/preprocessor.js" }, + "moduleFileExtensions": [ + "js", + "json", + "ts", + "tsx" + ], "transformIgnorePatterns": [ "node_modules/(?!((jest-)?react-native(-.*)?|@react-native(-community)?)/)" ], diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..9658e3303 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "allowJs": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "isolatedModules": true, + "jsx": "react", + "lib": ["es2020"], + "moduleResolution": "node", + "noEmit": true, + "strict": true, + "target": "esnext", + "skipLibCheck": true + }, + "exclude": ["node_modules", "babel.config.js", "metro.config.js", "jest.config.js"] +} From 93321f06fbbf2c8a386f3375cb869e6bc7c6b757 Mon Sep 17 00:00:00 2001 From: Gabriele Genta Date: Sat, 17 Jul 2021 22:37:06 +0200 Subject: [PATCH 254/327] FIX: typescript compilation errors --- BlueApp.js | 2 +- __mocks__/@react-native-async-storage/async-storage.js | 4 +++- blue_modules/ur/index.js | 2 +- class/wallets/hd-aezeed-wallet.js | 2 +- screen/send/confirm.js | 2 +- screen/wallets/viewEditMultisigCosigners.js | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/BlueApp.js b/BlueApp.js index e167e00f1..c19875c33 100644 --- a/BlueApp.js +++ b/BlueApp.js @@ -5,7 +5,7 @@ import loc from './loc'; const prompt = require('./blue_modules/prompt'); const currency = require('./blue_modules/currency'); const BlueElectrum = require('./blue_modules/BlueElectrum'); // eslint-disable-line no-unused-vars -const BlueApp: AppStorage = new AppStorage(); +const BlueApp = new AppStorage(); // If attempt reaches 10, a wipe keychain option will be provided to the user. let unlockAttempt = 0; diff --git a/__mocks__/@react-native-async-storage/async-storage.js b/__mocks__/@react-native-async-storage/async-storage.js index 32e39bc7a..ef43ca918 100644 --- a/__mocks__/@react-native-async-storage/async-storage.js +++ b/__mocks__/@react-native-async-storage/async-storage.js @@ -1 +1,3 @@ -export default from '@react-native-async-storage/async-storage/jest/async-storage-mock' +import AsyncStorageMock from '@react-native-async-storage/async-storage/jest/async-storage-mock'; + +export default AsyncStorageMock; diff --git a/blue_modules/ur/index.js b/blue_modules/ur/index.js index 28b73a626..4bf6aff12 100644 --- a/blue_modules/ur/index.js +++ b/blue_modules/ur/index.js @@ -9,7 +9,7 @@ import { CryptoPSBT, CryptoAccount, Bytes, -} from '@keystonehq/bc-ur-registry'; +} from '@keystonehq/bc-ur-registry/dist'; import { decodeUR as origDecodeUr, encodeUR as origEncodeUR, extractSingleWorkload as origExtractSingleWorkload } from '../bc-ur/dist'; import { MultisigCosigner, MultisigHDWallet } from '../../class'; import { Psbt } from 'bitcoinjs-lib'; diff --git a/class/wallets/hd-aezeed-wallet.js b/class/wallets/hd-aezeed-wallet.js index 36aae589b..ac0be902c 100644 --- a/class/wallets/hd-aezeed-wallet.js +++ b/class/wallets/hd-aezeed-wallet.js @@ -51,7 +51,7 @@ export class HDAezeedWallet extends AbstractHDElectrumWallet { return this._xpub; } - validateMnemonic(): boolean { + validateMnemonic() { throw new Error('Use validateMnemonicAsync()'); } diff --git a/screen/send/confirm.js b/screen/send/confirm.js index a2eb59595..33e183b9a 100644 --- a/screen/send/confirm.js +++ b/screen/send/confirm.js @@ -76,7 +76,7 @@ export default class Confirm extends Component { const payjoinUrl = this.state.payjoinUrl; // working through TOR - crafting custom requester that will handle TOR http request const customPayjoinRequester = { - requestPayjoin: async function (psbt: Psbt) { + requestPayjoin: async function (psbt) { console.warn('requesting payjoin with psbt:', psbt.toBase64()); const api = new torrific.Torsbee(); const torResponse = await api.post(payjoinUrl, { diff --git a/screen/wallets/viewEditMultisigCosigners.js b/screen/wallets/viewEditMultisigCosigners.js index 1b6e0a59e..739ac1b06 100644 --- a/screen/wallets/viewEditMultisigCosigners.js +++ b/screen/wallets/viewEditMultisigCosigners.js @@ -55,7 +55,7 @@ const ViewEditMultisigCosigners = () => { const { walletId } = route.params; const w = useRef(wallets.find(wallet => wallet.getID() === walletId)); const tempWallet = useRef(new MultisigHDWallet()); - const [wallet: MultisigHDWallet, setWallet] = useState(); + const [wallet, setWallet] = useState(); const [isLoading, setIsLoading] = useState(true); const [isSaveButtonDisabled, setIsSaveButtonDisabled] = useState(true); const [currentlyEditingCosignerNum, setCurrentlyEditingCosignerNum] = useState(false); From 170e5a742f44045990e09ea09fd10bdfa3880cc4 Mon Sep 17 00:00:00 2001 From: Gabriele Genta Date: Sat, 17 Jul 2021 22:58:24 +0200 Subject: [PATCH 255/327] FIX: eslint errors --- BlueApp.js | 2 +- class/deeplink-schema-match.js | 1 + class/hd-segwit-bech32-transaction.js | 1 + class/lnurl.js | 2 +- class/quick-actions.js | 1 - screen/settings/settings.js | 2 +- tests/unit/provide-entropy.test.js | 4 ++-- 7 files changed, 7 insertions(+), 6 deletions(-) diff --git a/BlueApp.js b/BlueApp.js index c19875c33..acdce2a0a 100644 --- a/BlueApp.js +++ b/BlueApp.js @@ -4,7 +4,7 @@ import { Platform } from 'react-native'; import loc from './loc'; const prompt = require('./blue_modules/prompt'); const currency = require('./blue_modules/currency'); -const BlueElectrum = require('./blue_modules/BlueElectrum'); // eslint-disable-line no-unused-vars +const BlueElectrum = require('./blue_modules/BlueElectrum'); // eslint-disable-line @typescript-eslint/no-unused-vars const BlueApp = new AppStorage(); // If attempt reaches 10, a wipe keychain option will be provided to the user. let unlockAttempt = 0; diff --git a/class/deeplink-schema-match.js b/class/deeplink-schema-match.js index 906f8345f..503cf3287 100644 --- a/class/deeplink-schema-match.js +++ b/class/deeplink-schema-match.js @@ -158,6 +158,7 @@ class DeeplinkSchemaMatch { const safelloStateToken = urlObject.query['safello-state-token']; let wallet; + // eslint-disable-next-line no-unreachable-loop for (const w of context.wallets) { wallet = w; break; diff --git a/class/hd-segwit-bech32-transaction.js b/class/hd-segwit-bech32-transaction.js index de82f92e7..c7402c665 100644 --- a/class/hd-segwit-bech32-transaction.js +++ b/class/hd-segwit-bech32-transaction.js @@ -348,6 +348,7 @@ export class HDSegwitBech32Transaction { let add = 0; while (add <= 128) { + // eslint-disable-next-line no-var var { tx, inputs, outputs, fee } = this._wallet.createTransaction( unconfirmedUtxos, [{ address: myAddress }], diff --git a/class/lnurl.js b/class/lnurl.js index d69e1ec97..b3004d8ca 100644 --- a/class/lnurl.js +++ b/class/lnurl.js @@ -162,7 +162,7 @@ export default class Lnurl { fixed: min === max, min, max, - domain: data.callback.match(new RegExp('https://([^/]+)/'))[1], + domain: data.callback.match(/https:\/\/([^/]+)\//)[1], metadata: data.metadata, description, image, diff --git a/class/quick-actions.js b/class/quick-actions.js index 6ba96178a..5beb014dd 100644 --- a/class/quick-actions.js +++ b/class/quick-actions.js @@ -39,7 +39,6 @@ function DeviceQuickActions() { return data; }; - DeviceQuickActions.getEnabled = async () => { try { const isEnabled = await AsyncStorage.getItem(DeviceQuickActions.STORAGE_KEY); diff --git a/screen/settings/settings.js b/screen/settings/settings.js index b7fc478e4..a1e61fce2 100644 --- a/screen/settings/settings.js +++ b/screen/settings/settings.js @@ -16,7 +16,7 @@ const styles = StyleSheet.create({ const Settings = () => { const { navigate } = useNavigation(); // By simply having it here, it'll re-render the UI if language is changed - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars const { language } = useContext(BlueStorageContext); return ( diff --git a/tests/unit/provide-entropy.test.js b/tests/unit/provide-entropy.test.js index 8b5d34b01..07d600ad9 100644 --- a/tests/unit/provide-entropy.test.js +++ b/tests/unit/provide-entropy.test.js @@ -44,7 +44,7 @@ describe('Entropy reducer and format', () => { it('handles 256 bits correctly', () => { let state = eReducer(undefined, { type: null }); // get init state - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars for (const i of [...Array(256)]) { state = eReducer(state, { type: 'push', value: 1, bits: 1 }); } @@ -143,7 +143,7 @@ describe('convertToBuffer function', () => { it('256 bits or 32bytes', () => { let state = eReducer(undefined, { type: null }); // get init state - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars for (const i of [...Array(256)]) { state = eReducer(state, { type: 'push', value: 1, bits: 1 }); } From 1d015d5a2d2641cd7864e4d5fb3506d8281c5813 Mon Sep 17 00:00:00 2001 From: Gabriele Genta Date: Sun, 18 Jul 2021 15:51:40 +0200 Subject: [PATCH 256/327] REF: convert fiatUnit to typescript --- ios/BlueWallet.xcodeproj/project.pbxproj | 16 ++++++------- ios/Widgets/Shared/Fiat/FiatUnit.swift | 2 +- models/{fiatUnit.js => fiatUnit.ts} | 29 ++++++++++++++++-------- models/{fiatUnit.json => fiatUnits.json} | 0 tsconfig.json | 3 ++- typings/frisbee.d.ts | 15 ++++++++++++ 6 files changed, 45 insertions(+), 20 deletions(-) rename models/{fiatUnit.js => fiatUnit.ts} (81%) rename models/{fiatUnit.json => fiatUnits.json} (100%) create mode 100644 typings/frisbee.d.ts diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index d718cdd5c..efce2c675 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -32,7 +32,7 @@ 6DD410A1266CADF10087DE03 /* Widgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DD410A0266CADF10087DE03 /* Widgets.swift */; }; 6DD410A7266CADF40087DE03 /* WidgetsExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 6DD410AC266CAE470087DE03 /* PriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA4BC255872E3009312A5 /* PriceWidget.swift */; }; - 6DD410AE266CAF1F0087DE03 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnit.json */; }; + 6DD410AE266CAF1F0087DE03 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnits.json */; }; 6DD410AF266CAF5C0087DE03 /* WalletInformationAndMarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E06254BA347007B5B82 /* WalletInformationAndMarketWidget.swift */; }; 6DD410B0266CAF5C0087DE03 /* WalletInformationWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4AB1254FB59C00E9F9AA /* WalletInformationWidget.swift */; }; 6DD410B1266CAF5C0087DE03 /* WidgetAPI+Electrum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA5142558EBA3009312A5 /* WidgetAPI+Electrum.swift */; }; @@ -75,8 +75,8 @@ B43D037C225847C500FBAA95 /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0376225847C500FBAA95 /* Wallet.swift */; }; B43D037D225847C500FBAA95 /* WalletInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0377225847C500FBAA95 /* WalletInformation.swift */; }; B4EE583C226703320003363C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E35225841ED00428FCC /* Assets.xcassets */; }; - E5D4794B26781FC0007838C1 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnit.json */; }; - E5D4794C26781FC1007838C1 /* fiatUnit.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnit.json */; }; + E5D4794B26781FC0007838C1 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnits.json */; }; + E5D4794C26781FC1007838C1 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnits.json */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -274,7 +274,7 @@ 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = WidgetsExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 6DD410A0266CADF10087DE03 /* Widgets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Widgets.swift; sourceTree = ""; }; 6DD410A4266CADF40087DE03 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 6DD410AD266CAF1F0087DE03 /* fiatUnit.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = fiatUnit.json; path = ../../../../models/fiatUnit.json; sourceTree = ""; }; + 6DD410AD266CAF1F0087DE03 /* fiatUnits.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = fiatUnits.json; path = ../../../../models/fiatUnits.json; sourceTree = ""; }; 6DD410C3266CCB780087DE03 /* WidgetsExtension.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = WidgetsExtension.entitlements; sourceTree = SOURCE_ROOT; }; 6DEB496F254E38DE00E9F9AA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MainInterface.strings; sourceTree = ""; }; 6DEB4AB1254FB59C00E9F9AA /* WalletInformationWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletInformationWidget.swift; sourceTree = ""; }; @@ -512,7 +512,7 @@ 6D2AA8062568B8E50090B089 /* Fiat */ = { isa = PBXGroup; children = ( - 6DD410AD266CAF1F0087DE03 /* fiatUnit.json */, + 6DD410AD266CAF1F0087DE03 /* fiatUnits.json */, 6D2AA8072568B8F40090B089 /* FiatUnit.swift */, ); path = Fiat; @@ -968,7 +968,7 @@ buildActionMask = 2147483647; files = ( 6DD410B7266CAF5C0087DE03 /* Assets.xcassets in Resources */, - 6DD410AE266CAF1F0087DE03 /* fiatUnit.json in Resources */, + 6DD410AE266CAF1F0087DE03 /* fiatUnits.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -977,7 +977,7 @@ buildActionMask = 2147483647; files = ( B40D4E36225841ED00428FCC /* Assets.xcassets in Resources */, - E5D4794C26781FC1007838C1 /* fiatUnit.json in Resources */, + E5D4794C26781FC1007838C1 /* fiatUnits.json in Resources */, B40D4E34225841EC00428FCC /* Interface.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -987,7 +987,7 @@ buildActionMask = 2147483647; files = ( B4EE583C226703320003363C /* Assets.xcassets in Resources */, - E5D4794B26781FC0007838C1 /* fiatUnit.json in Resources */, + E5D4794B26781FC0007838C1 /* fiatUnits.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios/Widgets/Shared/Fiat/FiatUnit.swift b/ios/Widgets/Shared/Fiat/FiatUnit.swift index f1d0672b0..eaf2c73e8 100644 --- a/ios/Widgets/Shared/Fiat/FiatUnit.swift +++ b/ios/Widgets/Shared/Fiat/FiatUnit.swift @@ -16,7 +16,7 @@ struct FiatUnit: Codable { } func fiatUnit(currency: String) -> FiatUnit? { - return Bundle.main.decode([String: FiatUnit].self, from: "fiatUnit.json").first(where: {$1.endPointKey == currency})?.value + return Bundle.main.decode([String: FiatUnit].self, from: "fiatUnits.json").first(where: {$1.endPointKey == currency})?.value } extension Bundle { diff --git a/models/fiatUnit.js b/models/fiatUnit.ts similarity index 81% rename from models/fiatUnit.js rename to models/fiatUnit.ts index 9526c3823..0027427c5 100644 --- a/models/fiatUnit.js +++ b/models/fiatUnit.ts @@ -1,14 +1,15 @@ import Frisbee from 'frisbee'; +import untypedFiatUnit from './fiatUnits.json'; -export const FiatUnitSource = Object.freeze({ +export const FiatUnitSource = { CoinDesk: 'CoinDesk', Yadio: 'Yadio', BitcoinduLiban: 'BitcoinduLiban', Exir: 'Exir', -}); +} as const; -const RateExtractors = Object.freeze({ - CoinDesk: async ticker => { +const RateExtractors = { + CoinDesk: async (ticker: string): Promise => { const api = new Frisbee({ baseURI: 'https://api.coindesk.com' }); const res = await api.get(`/v1/bpi/currentprice/${ticker}.json`); if (res.err) throw new Error(`Could not update rate for ${ticker}: ${res.err}`); @@ -26,7 +27,7 @@ const RateExtractors = Object.freeze({ if (!(rate >= 0)) throw new Error(`Could not update rate for ${ticker}: data is wrong`); return rate; }, - Yadio: async ticker => { + Yadio: async (ticker: string): Promise => { const api = new Frisbee({ baseURI: 'https://api.yadio.io/json' }); const res = await api.get(`/${ticker}`); if (res.err) throw new Error(`Could not update rate for ${ticker}: ${res.err}`); @@ -44,7 +45,7 @@ const RateExtractors = Object.freeze({ if (!(rate >= 0)) throw new Error(`Could not update rate for ${ticker}: data is wrong`); return rate; }, - BitcoinduLiban: async ticker => { + BitcoinduLiban: async (ticker: string): Promise => { const api = new Frisbee({ baseURI: 'https://bitcoinduliban.org' }); const res = await api.get('/api.php?key=lbpusd'); if (res.err) throw new Error(`Could not update rate for ${ticker}: ${res.err}`); @@ -62,7 +63,7 @@ const RateExtractors = Object.freeze({ if (!(rate >= 0)) throw new Error(`Could not update rate for ${ticker}: data is wrong`); return rate; }, - Exir: async ticker => { + Exir: async (ticker: string): Promise => { const api = new Frisbee({ baseURI: 'https://api.exir.io' }); const res = await api.get('/v1/ticker?symbol=btc-irt'); if (res.err) throw new Error(`Could not update rate for ${ticker}: ${res.err}`); @@ -80,10 +81,18 @@ const RateExtractors = Object.freeze({ if (!(rate >= 0)) throw new Error(`Could not update rate for ${ticker}: data is wrong`); return rate; }, -}); +} as const; -export const FiatUnit = require('./fiatUnit.json'); +type FiatUnit = { + [key: string]: { + endPointKey: string; + symbol: string; + locale: string; + source: 'CoinDesk' | 'Yadio' | 'Exir' | 'BitcoinduLiban'; + }; +}; +export const FiatUnit = untypedFiatUnit as FiatUnit; -export async function getFiatRate(ticker) { +export async function getFiatRate(ticker: string): Promise { return await RateExtractors[FiatUnit[ticker].source](ticker); } diff --git a/models/fiatUnit.json b/models/fiatUnits.json similarity index 100% rename from models/fiatUnit.json rename to models/fiatUnits.json diff --git a/tsconfig.json b/tsconfig.json index 9658e3303..b42eea8a1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,8 @@ "noEmit": true, "strict": true, "target": "esnext", - "skipLibCheck": true + "skipLibCheck": true, + "resolveJsonModule": true }, "exclude": ["node_modules", "babel.config.js", "metro.config.js", "jest.config.js"] } diff --git a/typings/frisbee.d.ts b/typings/frisbee.d.ts new file mode 100644 index 000000000..b42c1affe --- /dev/null +++ b/typings/frisbee.d.ts @@ -0,0 +1,15 @@ +declare module 'frisbee' { + // TODO: improve with more specific types + type RequestOptions = Record; + type Response = any; + + declare class Frisbee { + constructor(options: { baseURI?: string; headers?: Record }); + + get(path: string, options?: RequestOptions): Promise; + post(path: string, options?: RequestOptions): Promise; + // TODO: add missing methods + } + + export default Frisbee; +} From 2b57c9e4e62eed4ad96c79cac217f639608c3bad Mon Sep 17 00:00:00 2001 From: Gabriele Genta Date: Tue, 20 Jul 2021 15:10:45 +0200 Subject: [PATCH 257/327] REF: convert lightningSettings to typescript --- BlueComponents.js | 5 ++ blue_modules/environment.js | 10 ++-- components/navigationStyle.js | 6 +++ components/themes.js | 4 ++ loc/index.js | 7 ++- ...tningSettings.js => lightningSettings.tsx} | 46 ++++++++++++------- typings/globals.d.ts | 1 + 7 files changed, 56 insertions(+), 23 deletions(-) rename screen/settings/{lightningSettings.js => lightningSettings.tsx} (78%) create mode 100644 typings/globals.d.ts diff --git a/BlueComponents.js b/BlueComponents.js index 6992b1036..9e3de2a0b 100644 --- a/BlueComponents.js +++ b/BlueComponents.js @@ -512,6 +512,11 @@ export class BlueWalletNavigationHeader extends Component { } } +/** + * TODO: remove this comment once this file gets properly converted to typescript. + * + * @type {React.FC} + */ export const BlueButtonLink = forwardRef((props, ref) => { const { colors } = useTheme(); return ( diff --git a/blue_modules/environment.js b/blue_modules/environment.js index a0850b5fc..0fe423f31 100644 --- a/blue_modules/environment.js +++ b/blue_modules/environment.js @@ -3,7 +3,7 @@ import { getSystemName, isTablet, getDeviceType } from 'react-native-device-info const isMacCatalina = getSystemName() === 'Mac OS X'; const isDesktop = getDeviceType() === 'Desktop'; -const isTorCapable = () => { +const getIsTorCapable = () => { let capable = true; if (Platform.OS === 'android' && Platform.Version < 26) { capable = false; @@ -13,8 +13,6 @@ const isTorCapable = () => { return capable; }; -module.exports.isMacCatalina = isMacCatalina; -module.exports.isDesktop = isDesktop; -module.exports.isHandset = getDeviceType() === 'Handset'; -module.exports.isTablet = isTablet; -module.exports.isTorCapable = isTorCapable(); +export const isHandset = getDeviceType() === 'Handset'; +export const isTorCapable = getIsTorCapable(); +export { isMacCatalina, isDesktop, isTablet }; diff --git a/components/navigationStyle.js b/components/navigationStyle.js index fc4ce1d51..e5b333c5e 100644 --- a/components/navigationStyle.js +++ b/components/navigationStyle.js @@ -10,6 +10,12 @@ const styles = StyleSheet.create({ }, }); +/** + * TODO: remove this comment once this file gets properly converted to typescript. + * + * @param {any} param0 + * @param {(opts: any) => any} formatter + */ const navigationStyle = ({ closeButton = false, closeButtonFunc, ...opts }, formatter) => { return theme => ({ navigation, route }) => { let headerRight = null; diff --git a/components/themes.js b/components/themes.js index 05e3f496c..29f303efb 100644 --- a/components/themes.js +++ b/components/themes.js @@ -120,6 +120,10 @@ export const BlueDarkTheme = { }; export class BlueCurrentTheme { + static colors; + static closeImage; + static scanImage; + static updateColorScheme() { const isColorSchemeDark = Appearance.getColorScheme() === 'dark'; BlueCurrentTheme.colors = isColorSchemeDark ? BlueDarkTheme.colors : BlueDefaultTheme.colors; diff --git a/loc/index.js b/loc/index.js index ebaac25bf..f3da18fcb 100644 --- a/loc/index.js +++ b/loc/index.js @@ -136,7 +136,7 @@ const setDateTimeLocale = async () => { if (localeForDayJSAvailable) { dayjs.locale(lang.split('_')[0]); const language = AvailableLanguages.find(language => language.value === lang.replace('_', '-')); - /* I18n Manager breaks testing. Mocking built-in RN modules is not so straightforward. + /* I18n Manager breaks testing. Mocking built-in RN modules is not so straightforward. Only run this conditional if its outside a testing environment. */ if (process.env.JEST_WORKER_ID === undefined) { @@ -180,6 +180,11 @@ const setLanguageLocale = async () => { }; setLanguageLocale(); +/** + * TODO: remove this comment once this file gets properly converted to typescript. + * + * @type {any} + */ const strings = new Localization({ en: require('./en.json'), ar: require('./ar.json'), diff --git a/screen/settings/lightningSettings.js b/screen/settings/lightningSettings.tsx similarity index 78% rename from screen/settings/lightningSettings.js rename to screen/settings/lightningSettings.tsx index 0a0374b8f..d069c35fc 100644 --- a/screen/settings/lightningSettings.js +++ b/screen/settings/lightningSettings.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect, useCallback } from 'react'; import { View, TextInput, Linking, StyleSheet, Alert, I18nManager } from 'react-native'; import { Button } from 'react-native-elements'; -import { useTheme, useNavigation, useRoute } from '@react-navigation/native'; +import { useTheme, useNavigation, useRoute, RouteProp } from '@react-navigation/native'; import AsyncStorage from '@react-native-async-storage/async-storage'; import navigationStyle from '../../components/navigationStyle'; @@ -43,29 +43,39 @@ const styles = StyleSheet.create({ }, }); -const LightningSettings = () => { - const params = useRoute().params; +type LightingSettingsRouteProps = RouteProp< + { + params?: { + url?: string; + }; + }, + 'params' +>; + +// TODO: add proper typing for `navigationOptions` +const LightningSettings: React.FC & { navigationOptions: any } = () => { + const params = useRoute().params; const [isLoading, setIsLoading] = useState(true); - const [URI, setURI] = useState(); - const { colors } = useTheme(); + const [URI, setURI] = useState(); + const { colors } = useTheme() as any; // TODO: add proper types for theme const route = useRoute(); const navigation = useNavigation(); useEffect(() => { AsyncStorage.getItem(AppStorage.LNDHUB) - .then(setURI) + .then(value => setURI(value ?? undefined)) .then(() => setIsLoading(false)) .catch(() => setIsLoading(false)); if (params?.url) { Alert.alert( - loc.formatString(loc.settings.set_lndhub_as_default, { url: params?.url }), + loc.formatString(loc.settings.set_lndhub_as_default, { url: params.url }) as string, '', [ { text: loc._.ok, onPress: () => { - setLndhubURI(params?.url); + params?.url && setLndhubURI(params.url); }, style: 'default', }, @@ -76,12 +86,11 @@ const LightningSettings = () => { } }, [params?.url]); - const setLndhubURI = value => { - if (DeeplinkSchemaMatch.getUrlFromSetLndhubUrlAction(value)) { - // in case user scans a QR with a deeplink like `bluewallet:setlndhuburl?url=https%3A%2F%2Flndhub.herokuapp.com` - value = DeeplinkSchemaMatch.getUrlFromSetLndhubUrlAction(value); - } - setURI(value.trim()); + const setLndhubURI = (value: string) => { + // in case user scans a QR with a deeplink like `bluewallet:setlndhuburl?url=https%3A%2F%2Flndhub.herokuapp.com` + const setLndHubUrl = DeeplinkSchemaMatch.getUrlFromSetLndhubUrlAction(value); + + setURI(typeof setLndHubUrl === 'string' ? setLndHubUrl.trim() : value.trim()); }; const save = useCallback(async () => { @@ -91,7 +100,11 @@ const LightningSettings = () => { await LightningCustodianWallet.isValidNodeAddress(URI); // validating only if its not empty. empty means use default } - await AsyncStorage.setItem(AppStorage.LNDHUB, URI); + if (URI) { + await AsyncStorage.setItem(AppStorage.LNDHUB, URI); + } else { + await AsyncStorage.removeItem(AppStorage.LNDHUB); + } alert(loc.settings.lightning_saved); } catch (error) { alert(loc.settings.lightning_error_lndhub_uri); @@ -126,7 +139,8 @@ const LightningSettings = () => { onPress={() => Linking.openURL('https://github.com/BlueWallet/LndHub')} titleStyle={{ color: colors.buttonAlternativeTextColor }} title="github.com/BlueWallet/LndHub" - color={colors.buttonTextColor} + // TODO: looks like there's no `color` prop on `Button`, does this make any sense? + // color={colors.buttonTextColor} buttonStyle={styles.buttonStyle} /> diff --git a/typings/globals.d.ts b/typings/globals.d.ts new file mode 100644 index 000000000..ac9f899d7 --- /dev/null +++ b/typings/globals.d.ts @@ -0,0 +1 @@ +declare function alert(message: string): void; From b438a19119efc2d9ec4dbe43c45d2f71dcdf8e67 Mon Sep 17 00:00:00 2001 From: Gabriele Genta Date: Wed, 21 Jul 2021 13:42:24 +0200 Subject: [PATCH 258/327] DEL: remove invalid reference to isCatalyst --- screen/wallets/buyBitcoin.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/screen/wallets/buyBitcoin.js b/screen/wallets/buyBitcoin.js index 61f43062a..f7ae91565 100644 --- a/screen/wallets/buyBitcoin.js +++ b/screen/wallets/buyBitcoin.js @@ -1,12 +1,11 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import { StatusBar, Linking } from 'react-native'; +import { StatusBar } from 'react-native'; import { WebView } from 'react-native-webview'; import { BlueLoading, SafeBlueArea } from '../../BlueComponents'; import navigationStyle from '../../components/navigationStyle'; import { LightningCustodianWallet, WatchOnlyWallet } from '../../class'; import { BlueStorageContext } from '../../blue_modules/storage-context'; -import { isCatalyst } from '../../blue_modules/environment'; import * as NavigationService from '../../NavigationService'; const currency = require('../../blue_modules/currency'); @@ -112,12 +111,7 @@ BuyBitcoin.navigationOptions = navigationStyle({ }); BuyBitcoin.navigate = async wallet => { - if (isCatalyst) { - const uri = await BuyBitcoin.generateURL(wallet); - Linking.openURL(uri); - } else { - NavigationService.navigate('BuyBitcoin', { - walletID: wallet.getID(), - }); - } + NavigationService.navigate('BuyBitcoin', { + walletID: wallet.getID(), + }); }; From 6bcb2f9fb35d3d430800f293ceb598e7e34da6cd Mon Sep 17 00:00:00 2001 From: Gabriele Genta Date: Wed, 21 Jul 2021 14:29:18 +0200 Subject: [PATCH 259/327] fixup! REF: convert lightningSettings to typescript --- ...navigationStyle.js => navigationStyle.tsx} | 49 ++++++++++++++----- components/{themes.js => themes.ts} | 19 ++++--- screen/settings/lightningSettings.tsx | 11 ++--- 3 files changed, 55 insertions(+), 24 deletions(-) rename components/{navigationStyle.js => navigationStyle.tsx} (63%) rename components/{themes.js => themes.ts} (89%) diff --git a/components/navigationStyle.js b/components/navigationStyle.tsx similarity index 63% rename from components/navigationStyle.js rename to components/navigationStyle.tsx index e5b333c5e..a5363cd09 100644 --- a/components/navigationStyle.js +++ b/components/navigationStyle.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { Image, Keyboard, TouchableOpacity, StyleSheet } from 'react-native'; +import { Theme } from './themes'; const styles = StyleSheet.create({ button: { @@ -10,13 +11,39 @@ const styles = StyleSheet.create({ }, }); -/** - * TODO: remove this comment once this file gets properly converted to typescript. - * - * @param {any} param0 - * @param {(opts: any) => any} formatter - */ -const navigationStyle = ({ closeButton = false, closeButtonFunc, ...opts }, formatter) => { +type NavigationOptions = { + headerStyle?: { + borderBottomWidth: number; + elevation: number; + shadowOpacity?: number; + shadowOffset: { height?: number; width?: number }; + }; + headerTitleStyle?: { + fontWeight: string; + color: string; + }; + headerLeft?: (() => React.ReactElement) | null; + headerRight?: (() => React.ReactElement) | null; + headerBackTitleVisible?: false; + headerTintColor?: string; + title?: string; +}; + +type OptionsFormatter = (options: NavigationOptions, deps: { theme: Theme; navigation: any; route: any }) => NavigationOptions; + +export type NavigationOptionsGetter = (theme: Theme) => (deps: { navigation: any; route: any }) => NavigationOptions; + +const navigationStyle = ( + { + closeButton = false, + closeButtonFunc, + ...opts + }: NavigationOptions & { + closeButton?: boolean; + closeButtonFunc?: (deps: { navigation: any; route: any }) => React.ReactElement; + }, + formatter: OptionsFormatter, +): NavigationOptionsGetter => { return theme => ({ navigation, route }) => { let headerRight = null; if (closeButton) { @@ -33,7 +60,7 @@ const navigationStyle = ({ closeButton = false, closeButtonFunc, ...opts }, form ); } - let options = { + let options: NavigationOptions = { headerStyle: { borderBottomWidth: 0, elevation: 0, @@ -44,7 +71,7 @@ const navigationStyle = ({ closeButton = false, closeButtonFunc, ...opts }, form fontWeight: '600', color: theme.colors.foregroundColor, }, - headerRight, + headerRight: headerRight, headerBackTitleVisible: false, headerTintColor: theme.colors.foregroundColor, ...opts, @@ -60,9 +87,9 @@ const navigationStyle = ({ closeButton = false, closeButtonFunc, ...opts }, form export default navigationStyle; -export const navigationStyleTx = (opts, formatter) => { +export const navigationStyleTx = (opts: NavigationOptions, formatter: OptionsFormatter): NavigationOptionsGetter => { return theme => ({ navigation, route }) => { - let options = { + let options: NavigationOptions = { headerStyle: { borderBottomWidth: 0, elevation: 0, diff --git a/components/themes.js b/components/themes.ts similarity index 89% rename from components/themes.js rename to components/themes.ts index 29f303efb..e21210fac 100644 --- a/components/themes.js +++ b/components/themes.ts @@ -1,4 +1,4 @@ -import { DefaultTheme, DarkTheme } from '@react-navigation/native'; +import { DefaultTheme, DarkTheme, useTheme as useThemeBase } from '@react-navigation/native'; import { Appearance } from 'react-native'; export const BlueDefaultTheme = { @@ -67,7 +67,9 @@ export const BlueDefaultTheme = { }, }; -export const BlueDarkTheme = { +export type Theme = typeof BlueDefaultTheme; + +export const BlueDarkTheme: Theme = { ...DarkTheme, closeImage: require('../img/close-white.png'), scanImage: require('../img/scan-white.png'), @@ -119,12 +121,15 @@ export const BlueDarkTheme = { }, }; -export class BlueCurrentTheme { - static colors; - static closeImage; - static scanImage; +// Casting theme value to get autocompletion +export const useTheme = (): Theme => useThemeBase() as Theme; - static updateColorScheme() { +export class BlueCurrentTheme { + static colors: Theme['colors']; + static closeImage: Theme['closeImage']; + static scanImage: Theme['scanImage']; + + static updateColorScheme(): void { const isColorSchemeDark = Appearance.getColorScheme() === 'dark'; BlueCurrentTheme.colors = isColorSchemeDark ? BlueDarkTheme.colors : BlueDefaultTheme.colors; BlueCurrentTheme.closeImage = isColorSchemeDark ? BlueDarkTheme.closeImage : BlueDefaultTheme.closeImage; diff --git a/screen/settings/lightningSettings.tsx b/screen/settings/lightningSettings.tsx index d069c35fc..ada97e3e1 100644 --- a/screen/settings/lightningSettings.tsx +++ b/screen/settings/lightningSettings.tsx @@ -2,15 +2,15 @@ import React, { useState, useEffect, useCallback } from 'react'; import { View, TextInput, Linking, StyleSheet, Alert, I18nManager } from 'react-native'; import { Button } from 'react-native-elements'; -import { useTheme, useNavigation, useRoute, RouteProp } from '@react-navigation/native'; +import { useNavigation, useRoute, RouteProp } from '@react-navigation/native'; import AsyncStorage from '@react-native-async-storage/async-storage'; -import navigationStyle from '../../components/navigationStyle'; +import navigationStyle, { NavigationOptionsGetter } from '../../components/navigationStyle'; import { BlueButton, BlueButtonLink, BlueCard, BlueLoading, BlueSpacing20, BlueText, SafeBlueArea } from '../../BlueComponents'; import { AppStorage } from '../../class'; import { LightningCustodianWallet } from '../../class/wallets/lightning-custodian-wallet'; import loc from '../../loc'; -import { BlueCurrentTheme } from '../../components/themes'; +import { BlueCurrentTheme, useTheme } from '../../components/themes'; import DeeplinkSchemaMatch from '../../class/deeplink-schema-match'; import { isTorCapable } from '../../blue_modules/environment'; @@ -52,12 +52,11 @@ type LightingSettingsRouteProps = RouteProp< 'params' >; -// TODO: add proper typing for `navigationOptions` -const LightningSettings: React.FC & { navigationOptions: any } = () => { +const LightningSettings: React.FC & { navigationOptions: NavigationOptionsGetter } = () => { const params = useRoute().params; const [isLoading, setIsLoading] = useState(true); const [URI, setURI] = useState(); - const { colors } = useTheme() as any; // TODO: add proper types for theme + const { colors } = useTheme(); const route = useRoute(); const navigation = useNavigation(); From 518671f6bf8a16bcf395f891a69a0ffd29480936 Mon Sep 17 00:00:00 2001 From: Gabriele Genta Date: Wed, 21 Jul 2021 15:11:04 +0200 Subject: [PATCH 260/327] REF: convert AbstractWallet to typescript --- ...{abstract-wallet.js => abstract-wallet.ts} | 154 ++++++++++++------ models/bitcoinUnits.js | 11 -- models/bitcoinUnits.ts | 13 ++ package-lock.json | 18 ++ package.json | 2 + 5 files changed, 136 insertions(+), 62 deletions(-) rename class/wallets/{abstract-wallet.js => abstract-wallet.ts} (69%) delete mode 100644 models/bitcoinUnits.js create mode 100644 models/bitcoinUnits.ts diff --git a/class/wallets/abstract-wallet.js b/class/wallets/abstract-wallet.ts similarity index 69% rename from class/wallets/abstract-wallet.js rename to class/wallets/abstract-wallet.ts index 4f33eec7e..2e58a988b 100644 --- a/class/wallets/abstract-wallet.js +++ b/class/wallets/abstract-wallet.ts @@ -1,26 +1,63 @@ import { BitcoinUnit, Chain } from '../../models/bitcoinUnits'; import b58 from 'bs58check'; -const createHash = require('create-hash'); +import createHash from 'create-hash'; + +type WalletStatics = { + type: string; + typeReadable: string; + segwitType?: string; + derivationPath?: string; +}; + +type WalletWithPassphrase = AbstractWallet & { getPassphrase: () => string }; +type UtxoMetadata = { + frozen?: boolean; + memo?: string; +}; export class AbstractWallet { static type = 'abstract'; static typeReadable = 'abstract'; - static fromJson(obj) { + static fromJson(obj: string): AbstractWallet { const obj2 = JSON.parse(obj); const temp = new this(); for (const key2 of Object.keys(obj2)) { + // @ts-ignore This kind of magic is not allowed in typescript, we should try and be more specific temp[key2] = obj2[key2]; } return temp; } + type: string; + typeReadable: string; + segwitType?: string; + _derivationPath?: string; + label: string; + secret: string; + balance: number; + unconfirmed_balance: number; // eslint-disable-line camelcase + _address: string | false; + utxo: string[]; + _lastTxFetch: number; + _lastBalanceFetch: number; + preferredBalanceUnit: BitcoinUnit; + chain: Chain; + hideBalance: boolean; + userHasSavedExport: boolean; + _hideTransactionsInWalletsList: boolean; + _utxoMetadata: Record; + use_with_hardware_wallet: boolean; // eslint-disable-line camelcase + masterFingerprint: number | false; + constructor() { - this.type = this.constructor.type; - this.typeReadable = this.constructor.typeReadable; - this.segwitType = this.constructor.segwitType; - this._derivationPath = this.constructor.derivationPath; + const Constructor = (this.constructor as unknown) as WalletStatics; + + this.type = Constructor.type; + this.typeReadable = Constructor.typeReadable; + this.segwitType = Constructor.segwitType; + this._derivationPath = Constructor.derivationPath; this.label = ''; this.secret = ''; // private key or recovery phrase this.balance = 0; @@ -35,38 +72,42 @@ export class AbstractWallet { this.userHasSavedExport = false; this._hideTransactionsInWalletsList = false; this._utxoMetadata = {}; + this.use_with_hardware_wallet = false; + this.masterFingerprint = false; } /** * @returns {number} Timestamp (millisecsec) of when last transactions were fetched from the network */ - getLastTxFetch() { + getLastTxFetch(): number { return this._lastTxFetch; } - getID() { - const passphrase = this.getPassphrase ? this.getPassphrase() : ''; + getID(): string { + const thisWithPassphrase = (this as unknown) as WalletWithPassphrase; + const passphrase = thisWithPassphrase.getPassphrase ? thisWithPassphrase.getPassphrase() : ''; const string2hash = this.getSecret() + passphrase; return createHash('sha256').update(string2hash).digest().toString('hex'); } - getTransactions() { + // TODO: return type is incomplete + getTransactions(): { received: number }[] { throw new Error('not implemented'); } - getUserHasSavedExport() { + getUserHasSavedExport(): boolean { return this.userHasSavedExport; } - setUserHasSavedExport(value) { + setUserHasSavedExport(value: boolean): void { this.userHasSavedExport = value; } - getHideTransactionsInWalletsList() { + getHideTransactionsInWalletsList(): boolean { return this._hideTransactionsInWalletsList; } - setHideTransactionsInWalletsList(value) { + setHideTransactionsInWalletsList(value: boolean): void { this._hideTransactionsInWalletsList = value; } @@ -74,14 +115,14 @@ export class AbstractWallet { * * @returns {string} */ - getLabel() { + getLabel(): string { if (this.label.trim().length === 0) { return 'Wallet'; } return this.label; } - getXpub() { + getXpub(): string | false { return this._address; } @@ -89,11 +130,11 @@ export class AbstractWallet { * * @returns {number} Available to spend amount, int, in sats */ - getBalance() { + getBalance(): number { return this.balance + (this.getUnconfirmedBalance() < 0 ? this.getUnconfirmedBalance() : 0); } - getPreferredBalanceUnit() { + getPreferredBalanceUnit(): BitcoinUnit { for (const value of Object.values(BitcoinUnit)) { if (value === this.preferredBalanceUnit) { return this.preferredBalanceUnit; @@ -102,47 +143,47 @@ export class AbstractWallet { return BitcoinUnit.BTC; } - allowReceive() { + allowReceive(): boolean { return true; } - allowSend() { + allowSend(): boolean { return true; } - allowRBF() { + allowRBF(): boolean { return false; } - allowHodlHodlTrading() { + allowHodlHodlTrading(): boolean { return false; } - allowPayJoin() { + allowPayJoin(): boolean { return false; } - allowCosignPsbt() { + allowCosignPsbt(): boolean { return false; } - allowSignVerifyMessage() { + allowSignVerifyMessage(): boolean { return false; } - allowMasterFingerprint() { + allowMasterFingerprint(): boolean { return false; } - allowXpub() { + allowXpub(): boolean { return false; } - weOwnAddress(address) { + weOwnAddress(address: string): boolean { throw Error('not implemented'); } - weOwnTransaction(txid) { + weOwnTransaction(txid: string): boolean { throw Error('not implemented'); } @@ -152,20 +193,20 @@ export class AbstractWallet { * * @return {number} Satoshis */ - getUnconfirmedBalance() { + getUnconfirmedBalance(): number { return this.unconfirmed_balance; } - setLabel(newLabel) { + setLabel(newLabel: string): this { this.label = newLabel; return this; } - getSecret() { + getSecret(): string { return this.secret; } - setSecret(newSecret) { + setSecret(newSecret: string): this { this.secret = newSecret.trim().replace('bitcoin:', '').replace('BITCOIN:', ''); if (this.secret.startsWith('BC1')) this.secret = this.secret.toLowerCase(); @@ -197,7 +238,7 @@ export class AbstractWallet { parsedSecret = JSON.parse(newSecret); } if (parsedSecret && parsedSecret.keystore && parsedSecret.keystore.xpub) { - let masterFingerprint = false; + let masterFingerprint: number | false = false; if (parsedSecret.keystore.ckcc_xfp) { // It is a ColdCard Hardware Wallet masterFingerprint = Number(parsedSecret.keystore.ckcc_xfp); @@ -238,25 +279,26 @@ export class AbstractWallet { return this; } - getLatestTransactionTime() { + getLatestTransactionTime(): number { return 0; } - getLatestTransactionTimeEpoch() { + getLatestTransactionTimeEpoch(): number { if (this.getTransactions().length === 0) { return 0; } let max = 0; for (const tx of this.getTransactions()) { - max = Math.max(new Date(tx.received) * 1, max); + max = Math.max(new Date(tx.received).getTime(), max); } return max; } /** * @deprecated + * TODO: be more precise on the type */ - createTx() { + createTx(): any { throw Error('not implemented'); } @@ -270,28 +312,38 @@ export class AbstractWallet { * @param skipSigning {boolean} Whether we should skip signing, use returned `psbt` in that case * @param masterFingerprint {number} Decimal number of wallet's master fingerprint * @returns {{outputs: Array, tx: Transaction, inputs: Array, fee: Number, psbt: Psbt}} + * + * TODO: be more specific on the return type */ - createTransaction(utxos, targets, feeRate, changeAddress, sequence, skipSigning = false, masterFingerprint) { + createTransaction( + utxos: { vout: number; value: number; txId: string; address: string }[], + targets: { value: number; address: string }, + feeRate: number, + changeAddress: string, + sequence: number, + skipSigning = false, + masterFingerprint: number, + ): { outputs: any[]; tx: any; inputs: any[]; fee: number; psbt: any } { throw Error('not implemented'); } - getAddress() { + getAddress(): string { throw Error('not implemented'); } - getAddressAsync() { + getAddressAsync(): Promise { return new Promise(resolve => resolve(this.getAddress())); } - async getChangeAddressAsync() { + async getChangeAddressAsync(): Promise { return new Promise(resolve => resolve(this.getAddress())); } - useWithHardwareWalletEnabled() { + useWithHardwareWalletEnabled(): boolean { return false; } - async wasEverUsed() { + async wasEverUsed(): Promise { throw new Error('Not implemented'); } @@ -301,7 +353,7 @@ export class AbstractWallet { * * @returns string[] Addresses */ - getAllExternalAddresses() { + getAllExternalAddresses(): string[] { return []; } @@ -311,7 +363,7 @@ export class AbstractWallet { * @param {String} zpub * @returns {String} xpub */ - static _zpubToXpub(zpub) { + static _zpubToXpub(zpub: string): string { let data = b58.decode(zpub); data = data.slice(4); data = Buffer.concat([Buffer.from('0488b21e', 'hex'), data]); @@ -324,7 +376,7 @@ export class AbstractWallet { * @param {String} ypub - wallet ypub * @returns {*} */ - static _ypubToXpub(ypub) { + static _ypubToXpub(ypub: string): string { let data = b58.decode(ypub); if (data.readUInt32BE() !== 0x049d7cb2) throw new Error('Not a valid ypub extended key!'); data = data.slice(4); @@ -333,7 +385,7 @@ export class AbstractWallet { return b58.encode(data); } - prepareForSerialization() {} + prepareForSerialization(): void {} /* * Get metadata (frozen, memo) for a specific UTXO @@ -341,7 +393,7 @@ export class AbstractWallet { * @param {String} txid - transaction id * @param {number} vout - an index number of the output in transaction */ - getUTXOMetadata(txid, vout) { + getUTXOMetadata(txid: string, vout: number): UtxoMetadata { return this._utxoMetadata[`${txid}:${vout}`] || {}; } @@ -352,7 +404,7 @@ export class AbstractWallet { * @param {number} vout - an index number of the output in transaction * @param {{memo: String, frozen: Boolean}} opts - options to attach to UTXO */ - setUTXOMetadata(txid, vout, opts) { + setUTXOMetadata(txid: string, vout: number, opts: UtxoMetadata): void { const meta = this._utxoMetadata[`${txid}:${vout}`] || {}; if ('memo' in opts) meta.memo = opts.memo; if ('frozen' in opts) meta.frozen = opts.frozen; @@ -362,7 +414,7 @@ export class AbstractWallet { /** * @returns {string} Root derivation path for wallet if any */ - getDerivationPath() { + getDerivationPath(): string { return this._derivationPath ?? ''; } } diff --git a/models/bitcoinUnits.js b/models/bitcoinUnits.js deleted file mode 100644 index d436f27d4..000000000 --- a/models/bitcoinUnits.js +++ /dev/null @@ -1,11 +0,0 @@ -export const BitcoinUnit = Object.freeze({ - BTC: 'BTC', - SATS: 'sats', - LOCAL_CURRENCY: 'local_currency', - MAX: 'MAX', -}); - -export const Chain = Object.freeze({ - ONCHAIN: 'ONCHAIN', - OFFCHAIN: 'OFFCHAIN', -}); diff --git a/models/bitcoinUnits.ts b/models/bitcoinUnits.ts new file mode 100644 index 000000000..0c2f64c90 --- /dev/null +++ b/models/bitcoinUnits.ts @@ -0,0 +1,13 @@ +export const BitcoinUnit = { + BTC: 'BTC', + SATS: 'sats', + LOCAL_CURRENCY: 'local_currency', + MAX: 'MAX', +} as const; +export type BitcoinUnit = typeof BitcoinUnit[keyof typeof BitcoinUnit]; + +export const Chain = { + ONCHAIN: 'ONCHAIN', + OFFCHAIN: 'OFFCHAIN', +} as const; +export type Chain = typeof Chain[keyof typeof Chain]; diff --git a/package-lock.json b/package-lock.json index 97a2e7dc1..229e5203a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4034,6 +4034,24 @@ "@types/node": "*" } }, + "@types/bs58check": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/bs58check/-/bs58check-2.1.0.tgz", + "integrity": "sha512-OxsysnJQh82vy9DRbOcw9m2j/WiyqZLn0YBhKxdQ+aCwoHj+tWzyCgpwAkr79IfDXZKxc6h7k89T9pwS78CqTQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/create-hash": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/create-hash/-/create-hash-1.2.2.tgz", + "integrity": "sha512-Fg8/kfMJObbETFU/Tn+Y0jieYewryLrbKwLCEIwPyklZZVY2qB+64KFjhplGSw+cseZosfFXctXO+PyIYD8iZQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", diff --git a/package.json b/package.json index 208d9a5c8..ec57c86f4 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,8 @@ "@babel/runtime": "^7.14.6", "@jest/reporters": "^26.4.1", "@react-native-community/eslint-config": "^2.0.0", + "@types/bs58check": "^2.1.0", + "@types/create-hash": "^1.2.2", "@types/jest": "^26.0.24", "@types/react": "^17.0.14", "@types/react-native": "^0.64.12", From bfb10a0278d23538917fb0f5ddc37278a69aaceb Mon Sep 17 00:00:00 2001 From: Gabriele Genta Date: Wed, 21 Jul 2021 15:14:20 +0200 Subject: [PATCH 261/327] REF: convert PlaceholderWallet to typescript --- ...aceholder-wallet.js => placeholder-wallet.ts} | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) rename class/wallets/{placeholder-wallet.js => placeholder-wallet.ts} (73%) diff --git a/class/wallets/placeholder-wallet.js b/class/wallets/placeholder-wallet.ts similarity index 73% rename from class/wallets/placeholder-wallet.js rename to class/wallets/placeholder-wallet.ts index 1d756e2fc..d14a6ba79 100644 --- a/class/wallets/placeholder-wallet.js +++ b/class/wallets/placeholder-wallet.ts @@ -4,34 +4,38 @@ export class PlaceholderWallet extends AbstractWallet { static type = 'placeholder'; static typeReadable = 'Placeholder'; + _isFailure: boolean; + constructor() { super(); this._isFailure = false; } - setSecret(newSecret) { + setSecret(newSecret: string): this { // so TRY AGAIN when something goes wrong during import has more consistent prefilled text this.secret = newSecret; + + return this; } - allowSend() { + allowSend(): boolean { return false; } - getLabel() { + getLabel(): string { // no longer used in wallets carousel return this.getIsFailure() ? 'Wallet Import' : 'Importing Wallet...'; } - allowReceive() { + allowReceive(): boolean { return false; } - getIsFailure() { + getIsFailure(): boolean { return this._isFailure; } - setIsFailure(value) { + setIsFailure(value: boolean): void { this._isFailure = value; } } From 5c2600cdfe3105434f589605854d271d2c097e85 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Thu, 22 Jul 2021 19:28:09 +0100 Subject: [PATCH 262/327] REF: lint --- class/wallets/abstract-wallet.ts | 1 + components/navigationStyle.tsx | 1 + metro.config.js | 4 +--- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/class/wallets/abstract-wallet.ts b/class/wallets/abstract-wallet.ts index 2e58a988b..12432f0be 100644 --- a/class/wallets/abstract-wallet.ts +++ b/class/wallets/abstract-wallet.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { BitcoinUnit, Chain } from '../../models/bitcoinUnits'; import b58 from 'bs58check'; import createHash from 'create-hash'; diff --git a/components/navigationStyle.tsx b/components/navigationStyle.tsx index a5363cd09..5042cbb75 100644 --- a/components/navigationStyle.tsx +++ b/components/navigationStyle.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import React from 'react'; import { Image, Keyboard, TouchableOpacity, StyleSheet } from 'react-native'; import { Theme } from './themes'; diff --git a/metro.config.js b/metro.config.js index fd816dfa8..bb53464d2 100644 --- a/metro.config.js +++ b/metro.config.js @@ -11,9 +11,7 @@ module.exports = { resolver: { blockList: exclusionList([ // This stops "react-native run-windows" from causing the metro server to crash if its already running - new RegExp( - `${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`, - ), + new RegExp(`${path.resolve(__dirname, 'windows').replace(/[/\\]/g, '/')}.*`), // This prevents "react-native run-windows" from hitting: EBUSY: resource busy or locked, open msbuild.ProjectImports.zip /.*\.ProjectImports\.zip/, ]), From 813ceffa2e8092f8be004fcf190ffa1a4ca0be6f Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 22 Jul 2021 20:20:52 +0000 Subject: [PATCH 263/327] fix: upgrade react-native-camera from 3.44.1 to 3.44.2 Snyk has created this PR to upgrade react-native-camera from 3.44.1 to 3.44.2. See this package in npm: https://www.npmjs.com/package/react-native-camera See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 229e5203a..751e59918 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18004,9 +18004,9 @@ "from": "git+https://github.com/BlueWallet/react-native-blue-crypto.git" }, "react-native-camera": { - "version": "3.44.1", - "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.44.1.tgz", - "integrity": "sha512-B95RL3laK2v8R7L/37v28MYcEcwsM/mS94h6EZuRMLH5HFolkAwh7zJo+UAn7FG9eFtAdBwIM6s9OqYudTVO4Q==", + "version": "3.44.2", + "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.44.2.tgz", + "integrity": "sha512-JDDgl3y/UEWYvyfp6aopNT1ymSkfr8zmYGAls1RvRQ1BAi7ScjDfA//UTFI0Be+DEgpi3pBVancQiFqw5zM5yg==", "requires": { "prop-types": "^15.6.2" } diff --git a/package.json b/package.json index ec57c86f4..e7929a3f8 100644 --- a/package.json +++ b/package.json @@ -144,7 +144,7 @@ "react-localization": "1.0.17", "react-native": "0.64.2", "react-native-blue-crypto": "https://github.com/BlueWallet/react-native-blue-crypto", - "react-native-camera": "3.44.1", + "react-native-camera": "3.44.2", "react-native-crypto": "2.2.0", "react-native-default-preference": "1.4.3", "react-native-device-info": "8.1.3", From e88a1b635ba4d17545f91dc07ea6afcd75d18e29 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 22 Jul 2021 20:42:57 +0000 Subject: [PATCH 264/327] Translate /loc/en.json in de_DE review completed for the source file '/loc/en.json' on the 'de_DE' language. --- loc/de_de.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/loc/de_de.json b/loc/de_de.json index 8934b7128..b21fba09d 100644 --- a/loc/de_de.json +++ b/loc/de_de.json @@ -425,6 +425,8 @@ "enter_bip38_password": "Passwort zur Entschlüssellung eingeben", "export_title": "Wallet exportieren", "import_do_import": "Importieren", + "import_passphrase_title": "Passphrase", + "import_passphrase_message": "Wenn genutzt, die Passphrase eingeben", "import_error": "Fehler beim Import. Ist die Eingabe korrekt?", "import_explanation": "Gib hier die mnemonische Phrase, den privaten Schlüssel, WIF oder was immer Du hast ein. BlueWallet wird bestmöglich das Format interpretieren und die Wallet importieren.", "import_file": "Datei importieren", From 9a863a4a43931691ecf60cb81e5271fea59e51fb Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 23 Jul 2021 04:40:14 +0000 Subject: [PATCH 265/327] Translate /loc/en.json in hu_HU review completed for the source file '/loc/en.json' on the 'hu_HU' language. --- loc/hu_hu.json | 174 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 145 insertions(+), 29 deletions(-) diff --git a/loc/hu_hu.json b/loc/hu_hu.json index f4d7d6576..7dfd4630d 100644 --- a/loc/hu_hu.json +++ b/loc/hu_hu.json @@ -14,9 +14,16 @@ "no": "Nem", "save": "Mentés", "seed": "jelszó sorozat", + "success": "Sikeres", "wallet_key": "Tárca kulcs", - "invalid_animated_qr_code_fragment": "Érvénytelen animált QR kód részlet, próbáld újra!", - "file_saved": "({filePath}) fájl elmentve a Download (letöltések) könyvtárba." + "invalid_animated_qr_code_fragment" : "Érvénytelen animált QR kód részlet, próbáld újra!", + "file_saved": "{filePath} elmentve a kijelölt helyen: {destination}.", + "file_save_title": "Fájl Mentése", + "file_save_location": "Jelölje ki hova mentsen {filePath}", + "downloads_folder": "Letöltések Mappa", + "external_storage": "Külső Tárhely", + "discard_changes": "Módosítások elvetése?", + "discard_changes_detail": "Nem mentett beállításai vannak. Biztos el akarja hagyni az oldalt mentés nélkül?" }, "azteco": { "codeIs": "A kuponkódod ", @@ -53,9 +60,9 @@ "cont_paid_q": "Biztosan kifizetettnek akarod jelölni ezt az ügyletet?", "cont_selling": "eladás", "cont_st_completed": "Kész!", - "cont_st_in_progress_buyer": "Cryptovaluta letétben, fizess az eladónak", - "cont_st_paid_enought": "Bitcoin letétben! Fizess az eladónak a megállapodás szerinti fizetési módon.", - "cont_st_paid_waiting": "Várj az eladóra, hogy feloldja a letétet a cryptovalutáról.", + "cont_st_in_progress_buyer": "Érmék letétben, fizess az eladónak", + "cont_st_paid_enought": "Bitcoin letétben! Fizess az eladónak\na megállapodás szerinti fizetési módon.", + "cont_st_paid_waiting": "Várj az eladóra, hogy feloldja a letétet az érmékről.", "cont_st_waiting": "Várj az eladóra, hogy letétbe helyezze a Bitcoint.", "cont_title": "Ügyleteim", "filter_any": "Bármennyi", @@ -73,6 +80,7 @@ "item_nooffers": "Nincs ajánlat. Változtasd az ajánlatokat \"Ajánlatok világszerte\"-re.", "item_rating": "{rating} ügyletek", "item_rating_no": "Nincs értékelés", + "local_trader": "Helyi Kereskedő", "local_trader_new": "Új", "login": "Belépés", "logout": "Kilépés", @@ -108,6 +116,7 @@ "lndViewInvoice": { "additional_info": "További információk", "for": "Cím:", + "lightning_invoice": "Villám Számla", "has_been_paid": "Ezt a számlát kifizették", "open_direct_channel": "Közvetlen csatorna nyitása erre a csomópontra:", "please_pay": "Kérlek fizess", @@ -131,10 +140,12 @@ "ask": "Készítettél másolatot a tárca visszaállításához szükséges jelszó sorozatról? Ez az elmentett jelszó sorozat nélkülözhetetlen ha elveszik ez az eszközt. A jelszó sorozat nélkül a pénzed végleg elveszik.", "ask_no": "Nem, nincs", "ask_yes": "Igen, van", - "ok": "Rendben, leírtam!", - "ok_lnd": "OK, elmentettem.", + "ok": "OKÉ, leírtam", + "ok_lnd": "OKÉ, elmentettem", + "text": "Kérlek írd le az alábbi biztonsági szavakat egy papírlapra. \nEz egy biztonsági mentés, amellyel helyreállíthatod a tárcádat.", "text_lnd": "Készíts biztonsági másolatot erről az LNDHub hitelesítésről. Ezzel a biztonsági másolattal visszaállíthatod a tárcát más eszközön.", - "title": "A tárcád elkészült..." + "text_lnd2": "Ezt a tárcát a BlueWallet üzemelteti.", + "title": "A tárcája elkészült." }, "receive": { "details_create": "Létrehoz", @@ -144,7 +155,7 @@ "header": "Fogadás" }, "send": { - "broadcastButton": "TOVÁBBÍT", + "broadcastButton": "Küldés", "broadcastError": "hiba", "broadcastNone": "Bejövő tranzakciós hash", "broadcastPending": "függőben", @@ -168,22 +179,21 @@ "details_address_field_is_not_valid": "Érvénytelen cím", "details_adv_fee_bump": "Kiváltás díjjal engedélyezve", "details_adv_full": "Használd a teljes egyenleget", - "details_adv_full_remove": "A másik kedvezményezett törlése ebben a tranzakcióban", "details_adv_full_sure": "Biztosan használni akarod a tárca teljes egyenlegét ehhez a tranzakcióhoz?", "details_adv_import": "Tranzakció importálása", "details_amount_field_is_not_valid": "Érvénytelen összeg", "details_amount_field_is_less_than_minimum_amount_sat": "A megadott összeg túl kevés. Kérlek adj meg egy 500sat-nál nagyobb összeget.", "details_create": "Készíts számlát", + "details_error_decode": "Nem lehet dekódolni a bitcoin címet", "details_fee_field_is_not_valid": "Èrvénytelen tranzakciós díj", "details_next": "Következő", - "details_no_maximum": "A kiválasztott tárca nem támogatja az automatikus teljes egyenleg számítást. Biztosan ezt a tárcát választod?", - "details_no_multiple": "A kiválasztott tárca nem támogatja a Bitcoin küldést több kedvezményezettnek. Biztosan ezt a tárcát választod?", "details_no_signed_tx": "A kiválasztott fájl nem tartalmaz importálható tranzakciót.", "details_note_placeholder": "saját megjegyzés", "details_scan": "Szkennelés", + "details_scan_hint": "Dupla érintéssel szkennelhet, vagy betölthet uticélt", "details_total_exceeds_balance": "A megadott összeg nagyobb, mint a tárca elérhető egyenlege", + "details_unrecognized_file_format": "Nemismert fálj formátum", "details_wallet_before_tx": "Tranzakció előtt, először adj meg egy Bitcoin tárcát.", - "details_wallet_selection": "Tárca kiválasztása", "dynamic_init": "Előkészítés", "dynamic_next": "Következő", "dynamic_prev": "Előző", @@ -195,7 +205,7 @@ "fee_custom": "beállított", "fee_fast": "Gyors", "fee_medium": "Közepes", - "fee_replace_min": "A teljes tranzakciós díj (satoshi / byte) amit fizetsz, magasabb lesz, mint a minimum díj.", + "fee_replace_min": "A teljes tranzakciós díj (satoshi / byte) amit fizetsz, magasabb lesz, mint a minimum díj azaz {min} sat/byte.", "fee_satbyte": "satoshi/byte", "fee_slow": "Lassú", "header": "Küldés", @@ -205,6 +215,7 @@ "input_total": "Összesen:", "permission_camera_message": "Kamera használat engedélyezése", "permission_camera_title": "Kamera használatának engedélyezése", + "psbt_sign": "Egy tranzakció aláírása", "open_settings": "Beállítások megnyitása", "permission_storage_later": "Később", "permission_storage_message": "A fájl elmentéséhez engedélyezned kell a BlueWallet hozzáférését a háttértárhoz.", @@ -219,7 +230,7 @@ "qr_error_no_qrcode": "A kiválasztott kép nem tartalmaz QR kódot.", "qr_error_no_wallet": "A kiválasztott fájl nem tartalmaz importálható tárcát.", "success_done": "Kész!", - "txSaved": "A tranzakciós fájl ({filePath}) elmentve a Letöltések (Downloads) mappába.", + "txSaved": "A tranzakciós fájl ({filePath}) elmentve a Letöltések mappába.", "problem_with_psbt": "Hiba a PSBT aláírásban." }, "settings": { @@ -227,14 +238,21 @@ "about_awesome": "Nagyszerűséggel fejlesztve", "about_backup": "Mindig készíts biztonsági másolatot a jelszó sorozatodról. ", "about_free": "A BlueWallet alkalmazás ingyenes és nyílt forráskódú. Bitcoin használók fejleszteték. ", + "about_license": "MIT Licensz", "about_release_notes": "Verzió megjegyzések", "about_review": "Írj értékelést", "about_selftest": "Önellenőrző teszt indítása", + "about_selftest_ok": "Minden belső teszt sikeres. A tárca megfelelően működik.", "about_sm_github": "GitHub", + "about_sm_discord": "Discord Szerver", "about_sm_telegram": "Telegram csevegés", "about_sm_twitter": "Kövess minket Twitteren", "advanced_options": "Haladó Beállítások", "biometrics": "Biometrikus azonosító", + "biom_10times": "10-szer próbálta meg megadni a jelszavát. Vissza szeretné állítani a tárhelyet? Ezzel eltávolítja az összes pénztárcát és visszafejti a titkosítást a tárhelyről.", + "biom_conf_identity": "Kérem azonosítsa magát.", + "biom_no_passcode": "A készülék nem rendelkezik jelszóval. A folytatáshoz kérjük, konfigurálja a jelszót a Beállítások menüpontban.", + "biom_remove_decrypt": "Minden pénztárcáját eltávolítjuk, és a tárolójáról visszafejtjük a titkosítást. Biztosan folytatja?", "currency": "Valuta", "currency_source": "Árak forrása", "default_desc": "Ha le van tiltva, a BlueWallet azonnal megnyitja a kiválasztott tárcát indításkor. ", @@ -244,20 +262,26 @@ "electrum_connected": "Kapcsolódva", "electrum_connected_not": "Nincs kapcsolat", "electrum_error_connect": "Nem tud csatlakozni a kiválasztott Electrum szerverhez", - "electrum_host": "host, például {example}", - "electrum_port": "TCP port, általában {example}", - "electrum_port_ssl": "SSL port, általában {example}", + "electrum_host": "Pl. {example}", + "electrum_port": "Port, álltalában {example}", + "use_ssl": "SSL Használata", "electrum_saved": "A változtatás sikeresen elmentve. Az új beállítások aktiválásához űjraindításra lehet szükség.", - "electrum_settings_server": "Electrum Szerver beállítások", - "electrum_settings_explain": "Hagyd üresen az alapértelmezett beállításhoz", + "set_electrum_server_as_default": "{server} bállítása alapértelmezett Electrum szerverként?", + "set_lndhub_as_default": "{url} bállítása alapértelmezett LNDHub szerverként?", + "electrum_settings_server": "Electrum Szerver", + "electrum_settings_explain": "Hagydja üresen ha az alapértelmezettet szerené használni.", "electrum_status": "Állapot", + "electrum_clear_alert_title": "Előzmények törlése?", + "electrum_clear_alert_message": "Kiszeretné törölni az Electrum Szerver előzményeket?", "electrum_clear_alert_cancel": "Mégse", "electrum_clear_alert_ok": "OK", "electrum_select": "Kiválasztás", "electrum_reset": "alapértelmezett beállítások visszaállítása", "electrum_unable_to_connect": "Nincs kapcsolat {server} -hez.", "electrum_history": "Szerver előzmények", + "electrum_reset_to_default": "Biztosan vissza akarja alapértelmezettre állitani az Electrum szerver beállításait?", "electrum_clear": "Törlés", + "tor_supported": "Tor támogatott", "encrypt_decrypt": "Háttértár titkosításának feloldása", "encrypt_decrypt_q": "Biztosan feloldod a háttértár titkosítását? Ez lehetővé teszi a tárca jelszó nélküli használatát. ", "encrypt_del_uninstall": "Töröld ha a BlueWallet el lett távolítva", @@ -274,31 +298,41 @@ "groundcontrol_explanation": "A GroundControl egy ingyenes, nyílt forráskodú, push üzenetküldő szerver Bitcoin tárcákhoz. Telepítheted a saját GroundControl szerveredet webcímed megadásával, ami függetlet lesz a BlueWallet infrastuktúrától. Hagyd üresen alapértelmezésben.", "header": "beállítások", "language": "Nyelv", - "language_restart": "Új nyelv kiválasztásánal, szügség lehet a BlueWallet újraindítására. ", + "language_isRTL": "Az új nyelv használatához újra kell indítanod a BlueWallet alkalmazást.", "lightning_error_lndhub_uri": "Nem érvényes LNDHub URI azonosító", "lightning_saved": "A változtatások sikeresen elmentve", "lightning_settings": "Lightning Beállítások", + "tor_settings": "Tor Beállítások", "lightning_settings_explain": "Saját LND-csomóponthoz való csatlakozáshoz telepítsd az LndHub-ot és írd be az URL-ét alul. Hagyd üresen, ha a BlueWallet saját LNDHub-jához (lndhub.io) szeretnél csatlakozni. A beállítások mentése után, minden újonnan létrehozott tárca a megadott LDNHubot fogja használni.", "network": "Hálózat", "network_broadcast": "Tranzakció továbbitása", "network_electrum": "Electrum szerver", "not_a_valid_uri": "Hibás azonosító (URI)", "notifications": "Megjegyzések", - "open_link_in_explorer": "Link megnyitása explorerben", + "open_link_in_explorer" : "Link megnyitása explorerben", "password": "Jelszó", "password_explain": "Add meg a jelszót, amivel majd dekódolhatod a tárhelyet", "passwords_do_not_match": "A megadott jelszavak különböznek!", "plausible_deniability": "Elfogadható tagadhatóság...", "privacy": "Személyes adatok", "privacy_read_clipboard": "Vágólap olvasása", + "privacy_read_clipboard_alert": "A BlueWallet nem fog megjeleníteni opciót a vágólapon található számla vagy cím kezeléséhez.", "privacy_system_settings": "Rendszer beállítások", "privacy_quickactions": "tárca gyorsbillentyűk", "privacy_quickactions_explanation": "Érintsd meg és tartsd nyomva a BlueWallet alkalmazás ikont a képernyőn a tárca egyenleg gyors megtekintéséhez.", + "privacy_clipboard_explanation": "Jelentsen meg opciókat, ha cím vagy számla található a vágólapon. ", + "privacy_do_not_track": "Analitika kikapcsolása", + "privacy_do_not_track_explanation": "A teljesítményre és a megbízhatóságra vonatkozó információk nem lessznek beküldve elemzésre.", "push_notifications": "Push üzenet", "retype_password": "Jelszó megerősítése", + "selfTest": "Önteszt", "save": "Ment", "saved": "Elmentve", - "total_balance": "Teljes egyenleg" + "success_transaction_broadcasted" : "Siker! A trancakciója el lett küldve a hálózatra.", + "total_balance": "Teljes egyenleg", + "total_balance_explanation": "Jelenítse meg az összes pénztárca egyenlegét a kezdőképernyő moduljain.", + "widgets": "Widgetek", + "tools": "Eszközök" }, "notifications": { "would_you_like_to_receive_notifications": "Szeretnél értesítést a bejövő utalásokról? ", @@ -306,11 +340,13 @@ "ask_me_later": "Később" }, "transactions": { + "cancel_explain": "Ezt a tranzakciót lecseréljük arra, amely fizet Önnek és magasabb díjakkal rendelkezik. Ez gyakorlatilag törli a tranzakciót. Ezt RBF-nek hívják - azaz díj cserének.", "cancel_no": "Ez a tranzakció nem helyettesíthető", "cancel_title": "Tranzakció törlése (RBF)", - "transaction_id": "Tranzakció azonosító", + "confirmations_lowercase": "{confirmations} konfirmációk", "note": "Megjegyzés", "expand_note": "További részletek", + "block_explorer_link": "Blokk Böngésző Link", "cpfp_create": "Létrehoz", "cpfp_exp": "Új tranzakciót adunk a függő tranzakcióhoz. A teljes tranzakciós díj magasabb lesz, így hamarabb teljesül. Ezt hívják angolul \"CPFP - Child Pays For Parent / Gyerek fizet a szülőnek\".", "cpfp_no_bump": "Tranzakció nem kiváltható", @@ -323,10 +359,12 @@ "details_inputs": "Bejövő utalások", "details_outputs": "Kimenő utalások", "details_received": "Fogadott", + "transaction_note_saved": "Tranzakciós megjegyzés sikeresen elmentve.", "details_show_in_block_explorer": "Mutasd a block explorerben", "details_title": "Tranzakció", "details_to": "Kimenő utalás", "details_transaction_details": "Tranzakció részletei", + "enable_offline_signing": "Ezt a pénztárcát nem használják offline aláírással. Szeretné most engedélyezni?", "list_conf": "megerősítés: {number}", "pending": "függőben", "list_title": "tranzakciók", @@ -366,13 +404,19 @@ "details_del_wb_q": "Ennek a tárcának pozitív az egyenlege. Mielőtt tovább mennél, ne felejtsd, hogy a tárca jelszó sorozata nélkül nem lehetséges a tárca helyreállítása. A tárca véletlen törlésének elkerülése érdekében, add meg a tárca {balance} egyenlegét satoshi-ban.", "details_delete": "Törlés", "details_delete_wallet": "Tárca törlése", + "details_derivation_path": "derivációs út", "details_display": "mutasd a tárcák listáján", "details_export_backup": "Exportálás / Biztonsági mentés", "details_marketplace": "Piac", "details_master_fingerprint": "Mester ujjlenyomat ", + "details_ms_l": "{m} a {n}-ból/ből legacy (p2sh)", + "details_ms_ns": "{m} a {n}-ból/ből native segwit (p2wsh)", + "details_ms_ws": "{m} a {n}-ból/bőé csomagolt segwit (p2sh-p2wsh)", + "details_multisig_type": "multisig", "details_no_cancel": "Nem, megszakít", "details_save": "Ment", "details_show_xpub": "Mutasd a tárca XPUB kulcsát", + "details_show_addresses": "Cím mutatása", "details_title": "Tárca", "details_type": "Típus", "details_use_with_hardware_wallet": "Használat hardver tárcával", @@ -381,7 +425,10 @@ "enter_bip38_password": "Írd be a jelszót a titkosításhoz", "export_title": "tárca exportálása", "import_do_import": "Importálás", + "import_passphrase_title": "Jelszó", + "import_passphrase_message": "Add meg a jelszavadat ha használsz olyat", "import_error": "Importálás sikertelen. Ellenőrizd, hogy helyes adatokat adtál-e meg.", + "import_explanation": "Kérjük, írja be a biztonsági szavakat, a nyilvános kulcsot, a WIF-et vagy bármi mást. A BlueWallet mindent megtesz a helyes formátum kitalálásáért és a pénztárca importálásáért. ", "import_file": "fájl importálása", "import_imported": "Importálva", "import_placeholder_fail": "Tárca importálás", @@ -394,11 +441,13 @@ "list_create_a_wallet_text": "Ingyenes, és annyit hozhatsz létre amennyit szeretnél", "list_empty_txs1": "A tranzakcióid itt fognak megjelenni", "list_empty_txs1_lightning": "A Lightning tárcát a mindennapi tranzakcióidhoz használhatod. A tranzakciók azonnal végrehajtódnak, minimális átutalási díjjal.", + "list_empty_txs2": "Kezd a tárcáddal.", "list_empty_txs2_lightning": "\nA kezdéshez kattints a \"Kezelés\"-re, és töltsd fel az egyenleged.", "list_header": "A tárca reprezentálja a kulcs párokat, egy privátot és egyet, amit megoszthatsz, hogy Bitcoint fogadhass. ", "list_import_error": "Hiba történt a tárca importálásakor.", "list_import_problem": "Hiba a tárca importálásakor", "list_latest_transaction": "utolsó tranzakció", + "list_ln_browser": "LApp Böngésző", "list_long_choose": "Válassz fényképet", "list_long_clipboard": "Másolás vágólapról", "list_long_scan": "QR kód szkennelése", @@ -406,20 +455,29 @@ "list_tap_here_to_buy": "Bitcoin vásárláshoz kattints ide", "list_title": "tárcák", "list_tryagain": "Próbáld újra", + "no_ln_wallet_error": "Mielőtt tudnál fizetni a villámhálózaton, először egy Lightning tárcát kell létrehoznod vagy betöltened.", "looks_like_bip38": "Ez egy jelszó védett privát kulcsnak (BIP38) tűnik", "reorder_title": "Tárcák rendezése", + "please_continue_scanning": "Kérem szkenneljen folyamatosan.", + "scan_error": "Szkennelési Hiba", "select_no_bitcoin": "Jelenleg nincs elérhető Bitcoin tárca.", "select_no_bitcoin_exp": "A Lightning tárca feltöltéséhez Bitcoin tárcára van szükség. Készíts vagy importálj egy Bitcoin tárcát.", "select_wallet": "Válassz tárcát", "take_photo": "Fénykép készítése", "xpub_copiedToClipboard": "Vágólapra másolva", + "pull_to_refresh": "Húzza le a frissítéshez", + "warning_do_not_disclose": "VESZÉLY! Ezt soha senkivel ne ossza meg!", + "add_ln_wallet_first": "Először egy Lightning Tárcát kell létrehoznod vagy beadnod.", + "identity_pubkey": "Nyilvános kulcs", "xpub_title": "a tárca XPUB kulcsa" }, "multisig": { "multisig_vault": "Trezor", + "default_label": "Multisig Tárca", "multisig_vault_explain": "Legnagyobb biztonság nagy összegekhez", "provide_signature": "Aláírás végrehajtása ", "vault_key": "Trezor kulcs {number}", + "required_keys_out_of_total": "Szükséges kulcsok az összessből", "fee": "Tranzakciós díj: {number}", "fee_btc": "{number} BTC", "confirm": "Megerősítés", @@ -427,7 +485,9 @@ "share": "Megosztás", "view": "Megnéz", "manage_keys": "Kulcsok kezelése", + "how_many_signatures_can_bluewallet_make": "mennyi szignatúrát tud a BlueWallet létrehozni", "signatures_required_to_spend": "Aláírás szükséges {number}", + "signatures_we_can_make": "létretudsz hozni {number}-et/őt/at", "scan_or_import_file": "Szkennelés vagy fájl importálása", "export_coordination_setup": "koordinációs beállítások exportálása", "cosign_this_transaction": "Aláírod ezt a tranzakciót?", @@ -439,45 +499,101 @@ "legacy_title": "Hagyomány", "co_sign_transaction": "Egy tranzakció aláírása", "what_is_vault": "A Trezor egy", + "what_is_vault_numberOfWallets": " {m}-a-{n}-ból/ből multisig", "what_is_vault_wallet": "tárca", "vault_advanced_customize": "Trezor beállítások", "needs": "szükséges", "what_is_vault_description_number_of_vault_keys": "{m} trezor kulcsok", + "what_is_vault_description_to_spend": "hogy elkölzsd és a harmadik amit te\nbiztonsági másolatként használhatsz.", + "what_is_vault_description_to_spend_other": "elköktésre elérhető.", + "quorum": "{m} a {n}-ból/ből kvórum ", + "quorum_header": "Kvórum", "of": "/", "wallet_type": "Tárca típusa", "view_key": "megnéz", + "invalid_mnemonics": "Ez a biztonsági mentés nem tűnik megfelelőnek.", "invalid_cosigner": "Helytelen társ aláíró adat", + "not_a_multisignature_xpub": "Ez nem egy multiszignaturás tárca publikus kulcsa azaz XPUBja!", + "invalid_cosigner_format": "Nem megfelelő másodaláíró: Ez a másodaláíró nem a megfelelő {format} formátumú.", "create_new_key": "Készíts újat", "scan_or_open_file": "Szkennelés vagy fájl megnyitása", "i_have_mnemonics": "Megvan a jelszó sorozatom ehhez a kulcshoz...", + "please_write_down_mnemonics": "Kérjük, írja le papírra ezen biztonsági szavakat. Ne aggódjon, később is leírhatja.", "i_wrote_it_down": "Rendben, leírtam!", "type_your_mnemonics": "Jelszó sorozat megadása egy létező trezor-kulcs megadásához", + "this_is_cosigners_xpub": "Ez a másodaláíró XPUB-ja — készen áll egy másik pénztárcába történő importálásra. Megosztani biztonságos.", + "wallet_key_created": "A Vault kulcs létrehozva. Szánjon egy percet arra, hogy biztonságosan, biztonsági másolatot készítsen a titkos kulcsszavakról.", + "are_you_sure_seed_will_be_lost": "Biztos benne? A biztonsági mentése el fog veszni ha nincs létező másolata.", + "forget_this_seed": "Felejtse el ezt a kulcsot és használjon XPUB-ot inkább.", + "invalid_fingerprint": "Ennek a kulcsnak az ujjlenyomata nem egyezik meg a másodaláíró ujjlenyomatával.", "view_edit_cosigners": "Társ aláírok megtekintése/szerkesztése ", + "this_cosigner_is_already_imported": "Ezen másodaláíró már importálva van.", + "export_signed_psbt": "Aláírt PSBT Exportálása", "input_fp": "Ujjlenyomat megadása", + "input_fp_explain": "Átugrás az alapértelmezett használatához (00000000)", + "input_path": "Derivációs Út Beillesztése", + "input_path_explain": "Átugrás az alapértelmezett használatához ({default})", "ms_help": "Segítség", + "ms_help_title": "Hogyan működnek a multisig tárcák: Hasznos tippek és ötletek", + "ms_help_text": "Több kulccsal rendelkező pénztárca a nagyobb biztonság vagy megosztott őrizet érdekében", "ms_help_title1": "Több eszköz használata javasolt.", + "ms_help_1": "A Vault működőképes más BlueWallet applikációkkal és PSBT kompatibilis tárcákkal mint például az Electrum, Specter, Coldcard, KeystoneWallet, stb.", "ms_help_title2": "Kulcsok szerkesztése", - "ms_help_title5": "Haladó mód" + "ms_help_2": "Létrehozhat minden Vault kulcsot ezen az eszközön, és később eltávolíthatja vagy szerkesztheti azokat. Ha minden kulcs ugyanazon az eszközön van, akkor megegyezik a szokásos Bitcoin pénztárca biztonságával.", + "ms_help_title3": "Széf Biztonsági Másolat", + "ms_help_3": "A pénztárca beállításainál megtalálhatja a Vault biztonsági másolatát és a csak megtekintésre kész biztonsági másolatot. Ez a biztonsági mentés olyan, mint egy térkép a pénztárcájához. A biztonsági mentés elengedhetetlen a pénztárca helyreállításához, ha elveszítené a hozzáfárérést a biztonsági mentéséhez, akkor pénze elveszhet örökre.", + "ms_help_title4": "Széf Importálása", + "ms_help_4": "Multisig importálásához használja a biztonsági mentési fájlt és az Import funkciót. Ha csak biztonsági mentés szavaival és XPUB-jaival rendelkezik, a Vault kulcsok létrehozásakor használhatja az egyedi Import gombot.", + "ms_help_title5": "Haladó mód", + "ms_help_5": "Alapértelmezettként a BlueWallet egy 2-a-3-ból Vault-ot generál. Másik kvórum létrehozásához vagy a cím típusának megváltoztatásához aktiválja a Speciális módot a Beállításokban. " }, "is_it_my_address": { "title": "Ez a saját címem?", "owns": "{label} tulajdonolja {address}", "enter_address": "Cím megadása", - "check_address": "Cím ellenőrzése" + "check_address": "Cím ellenőrzése", + "no_wallet_owns_address": "Semelyik tárca nem birtokolja ezen használt címet." }, "cc": { "change": "váltás", - "coins_selected": "Kriptopénz kiválasztva ({number})", + "coins_selected": "Érmék kiválasztva ({number})", "empty": "Ez a tárca jelenleg üres.", "freeze": "zárolás", "freezeLabel": "zárolás", "freezeLabel_un": "Zárolás feloldása", + "header": "Érme Kontroll", "use_coin": "Cryptovaluta használata ", - "use_coins": "Kriptopénz használata" + "use_coins": "Érmék használata", + "tip": "Ez a funkció lehetővé teszi az érmék megtekintését, címkézését, befagyasztását vagy kiválasztását a pénztárca jobb kezelése érdekében. Több érmét is kiválaszthat a színes körök megérintésével." }, "units": { "BTC": "BTC", "MAX": "Maximum", - "sat_byte": "sat/byte" + "sat_byte": "sat/byte", + "sats": "sats" + }, + "addresses": { + "sign_title": "Aláíró/Hitelesíŧő üzenet", + "sign_help": "Itt létrehozhat vagy ellenőrizhet kriptográfiai aláírást egy Bitcoin-cím alapján", + "sign_sign": "Aláír", + "sign_sign_submit": "Aláír és Bead", + "sign_verify": "Hitelesít", + "sign_signature_correct": "Hitelesítés sikeres!", + "sign_signature_incorrect": "Sikertelen hitelesítés!", + "sign_placeholder_address": "Cím", + "sign_placeholder_message": "Üzenet", + "sign_placeholder_signature": "Szignatúra", + "sign_aopp_title": "AOPP", + "sign_aopp_confirm": "Biztosan el akarja küldeni az aláírt üzenetet a {hostname}-nek?", + "addresses_title": "Címek", + "type_change": "Váltópénz", + "type_receive": "Fogadás", + "type_used": "Használt", + "transactions": "Tranzakciók" + }, + "aopp": { + "title": "Cím kiválasztása", + "send_success": "Szignatúra sikeresen elküldve", + "send_error": "Hiba a szignatúra küldésekor" } } From b40a4a84768f1bff1c7d2fb22d70634843de9519 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 23 Jul 2021 04:41:16 +0000 Subject: [PATCH 266/327] Translate /loc/en.json in cs_CZ review completed for the source file '/loc/en.json' on the 'cs_CZ' language. --- loc/cs_cz.json | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/loc/cs_cz.json b/loc/cs_cz.json index d647d6dec..ed199e508 100644 --- a/loc/cs_cz.json +++ b/loc/cs_cz.json @@ -17,7 +17,11 @@ "success": "Úspěch", "wallet_key": "Klíč peněženky", "invalid_animated_qr_code_fragment" : "Neplatný animovaný fragment QRCode, zkuste to prosím znovu", - "file_saved": "Soubor ({filePath}) byl uložen do složky Stažené soubory.", + "file_saved": "Soubor {filePath} byl uložen ve vašem {destination}.", + "file_save_title": "Uložit soubor", + "file_save_location": "Výběr místa pro uložení {filePath}", + "downloads_folder": "Složka Stažené soubory", + "external_storage": "Externí úložiště", "discard_changes": "Zrušit změny?", "discard_changes_detail": "Máte neuložené změny. Opravdu je chcete zahodit a opustit obrazovku?" }, @@ -259,8 +263,8 @@ "electrum_connected_not": "Nepřipojeno", "electrum_error_connect": "Nelze se připojit k poskytovanému serveru Electrum", "electrum_host": "Např. {example}", - "electrum_port": "TCP port, obvykle {example}", - "electrum_port_ssl": "SSL port, obvykle {example}", + "electrum_port": "Port, obvykle {example}", + "use_ssl": "Použít protokol SSL", "electrum_saved": "Vaše změny byly úspěšně uloženy. Změny se projeví až po restartu.", "set_electrum_server_as_default": "Nastavit {server} jako výchozí electrum server?", "set_lndhub_as_default": "Nastavit {url} jako výchozí LNDHub server?", @@ -421,6 +425,8 @@ "enter_bip38_password": "Zadejte heslo pro odšifrování.", "export_title": "exportovat peněženku", "import_do_import": "Importovat", + "import_passphrase_title": "Fráze", + "import_passphrase_message": "Zadejte přístupovou frázi, pokud jste nějakou použili", "import_error": "Chyba při importu. Prosím ujistěte se, že poskytnutá data jsou správná.", "import_explanation": "Zadejte seed slova, veřejný klíč, WIF nebo cokoli, co máte. BlueWallet se bude snažit uhodnout správný formát a importovat vaši peněženku.", "import_file": "Importovat soubor", @@ -581,7 +587,9 @@ "sign_aopp_confirm": "Chcete poslat podepsanou zprávu uživateli {hostname}?", "addresses_title": "Adresy", "type_change": "Změnit", - "type_receive": "Příjmout" + "type_receive": "Příjmout", + "type_used": "Použité", + "transactions": "Transakce" }, "aopp": { "title": "Vybrat adresu", From 5636e1f918789618abd3a1cb3be523946c047626 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Fri, 23 Jul 2021 19:56:41 +0100 Subject: [PATCH 267/327] REF: remove scryptsy from sources (closes #3421) --- blue_modules/scryptsy/CHANGELOG.md | 50 ------ blue_modules/scryptsy/LICENSE | 21 --- blue_modules/scryptsy/README.md | 157 ----------------- blue_modules/scryptsy/lib/index.js | 3 - blue_modules/scryptsy/lib/scrypt.js | 26 --- blue_modules/scryptsy/lib/scryptSync.js | 26 --- blue_modules/scryptsy/lib/utils.js | 216 ------------------------ blue_modules/scryptsy/package.json | 65 ------- package-lock.json | 3 +- package.json | 3 +- 10 files changed, 3 insertions(+), 567 deletions(-) delete mode 100644 blue_modules/scryptsy/CHANGELOG.md delete mode 100644 blue_modules/scryptsy/LICENSE delete mode 100644 blue_modules/scryptsy/README.md delete mode 100644 blue_modules/scryptsy/lib/index.js delete mode 100644 blue_modules/scryptsy/lib/scrypt.js delete mode 100644 blue_modules/scryptsy/lib/scryptSync.js delete mode 100644 blue_modules/scryptsy/lib/utils.js delete mode 100644 blue_modules/scryptsy/package.json diff --git a/blue_modules/scryptsy/CHANGELOG.md b/blue_modules/scryptsy/CHANGELOG.md deleted file mode 100644 index c15ed809e..000000000 --- a/blue_modules/scryptsy/CHANGELOG.md +++ /dev/null @@ -1,50 +0,0 @@ -3.0.0 / 2019-03-12 ------------------- -- **breaking** Import gives an object with two functions `scrypt` and `scryptSync` -- `scryptSync` is the old synchronus function. -- `scrypt` will return a promise with the buffer. - -2.0.0 / 2016-05-26 ------------------- -- **breaking** Node v0.10 not supported anymore. - -1.2.1 / 2015-03-01 ------------------- -- now using standard for code formatting -- now using `pbkdf2` module over `pbkdf2-sha256`, huge performance increase in Node - -1.2.0 / 2014-12-11 ------------------- -- upgraded `pbkdf2-sha256` from `1.0.1` to `1.1.0` -- removed `browser` field for `crypto`; not-necessary anymore - -1.1.0 / 2014-07-28 ------------------- -- added `progressCallback` (Nadav Ivgi / #4)[https://github.com/cryptocoinjs/scryptsy/pull/4] - -1.0.0 / 2014-06-10 ------------------- -- moved tests to fixtures -- removed semilcolons per http://cryptocoinjs.com/about/contributing/#semicolons -- changed `module.exports.scrypt = funct..` to `module.exports = funct...` -- removed `terst` from dev deps -- upgraded `"pbkdf2-sha256": "~0.1.1"` to `"pbkdf2-sha256": "^1.0.1"` -- added `crypto-browserify` dev dep for `pbkdf2-sha256` tests -- added TravisCI -- added Coveralls -- added testling - -0.2.0 / 2014-03-05 ------------------- -- made a lot of scrypt functions internal along with variables to make thread safe - -0.1.0 / 2014-02-18 ------------------- -- changed spacing from 4 to 2 -- removed unneeded JavaScript implementations. Using `pbkdf2-sha256` dep now. -- add browser test support -- convert from `Array` to typed arrays and `Buffer` - -0.0.1 / 2014-02-18 ------------------- -- initial release. Forked from https://github.com/cheongwy/node-scrypt-js and added tests. diff --git a/blue_modules/scryptsy/LICENSE b/blue_modules/scryptsy/LICENSE deleted file mode 100644 index 4d5f7a1c1..000000000 --- a/blue_modules/scryptsy/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2018 cryptocoinjs - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/blue_modules/scryptsy/README.md b/blue_modules/scryptsy/README.md deleted file mode 100644 index 71350f096..000000000 --- a/blue_modules/scryptsy/README.md +++ /dev/null @@ -1,157 +0,0 @@ -scryptsy -======== - -[![build status](https://secure.travis-ci.org/cryptocoinjs/scryptsy.svg)](https://travis-ci.org/cryptocoinjs/scryptsy) -[![Coverage Status](https://img.shields.io/coveralls/cryptocoinjs/scryptsy.svg)](https://coveralls.io/r/cryptocoinjs/scryptsy) -[![Version](https://img.shields.io/npm/v/scryptsy.svg)](https://www.npmjs.org/package/scryptsy) - -`scryptsy` is a pure Javascript implementation of the [scrypt][wiki] key derivation function that is fully compatible with Node.js and the browser (via Browserify). - - -Why? ----- - -`Scrypt` is an integral part of many crypto currencies. It's a part of the [BIP38](https://github.com/bitcoin/bips/blob/master/bip-0038.mediawiki) standard for encrypting private Bitcoin keys. It also serves as the [proof-of-work system](https://en.wikipedia.org/wiki/Proof-of-work_system) for many crypto currencies, most notably: Litecoin and Dogecoin. - - - -Installation ------------- - - npm install --save scryptsy - - - -Browserify Note ------------- - -When using a browserified bundle, be sure to add `setImmediate` as a shim. - - - -Example -------- - -```js -const scrypt = require('scryptsy') - -async function main () { - var key = "pleaseletmein" - var salt = "SodiumChloride" - var data1 = scrypt(key, salt, 16384, 8, 1, 64) - console.log(data1.toString('hex')) - // => 7023bdcb3afd7348461c06cd81fd38ebfda8fbba904f8e3ea9b543f6545da1f2d5432955613f0fcf62d49705242a9af9e61e85dc0d651e40dfcf017b45575887 - - // async is actually slower, but it will free up the event loop occasionally - // which will allow for front end GUI elements to update and cause it to not - // freeze up. - // See benchmarks below - // Passing 300 below means every 300 iterations internally will call setImmediate once - var data2 = await scrypt.async(key, salt, 16384, 8, 1, 64, undefined, 300) - console.log(data2.toString('hex')) - // => 7023bdcb3afd7348461c06cd81fd38ebfda8fbba904f8e3ea9b543f6545da1f2d5432955613f0fcf62d49705242a9af9e61e85dc0d651e40dfcf017b45575887 -} -main().catch(console.error) -``` - - -Benchmarks -------- - -Internal iterations are N * p, so changing r doesn't affect the number of calls to setImmediate. -Decreasing pI decreases performance in exchange for more frequently freeing the event loop. -(pI Default is 5000 loops per setImmediate call) - -Note: these benchmarks were done on node v10 on a CPU with good single thread performance. -browsers show a much larger difference. Please tinker with the pI setting to balance between -performance and GUI responsiveness. - -If `pI >= N`, setImmediate will only be called `p * 2` times total (on the i = 0 of each for loop). - -``` ---------------------------- -time : type : (N,r,p,pI) (pI = promiseInterval) ---------------------------- -2266 ms : sync (2^16,16,1) -2548 ms : async (2^16,16,1,5000) -12.44% increase ---------------------------- -2616 ms : sync (2^16,1,16) -2995 ms : async (2^16,1,16,5000) -14.49% increase ---------------------------- -2685 ms : sync (2^20,1,1) -3090 ms : async (2^20,1,1,5000) -15.08% increase ---------------------------- -2235 ms : sync (2^16,16,1) -2627 ms : async (2^16,16,1,10) -17.54% increase ---------------------------- -2592 ms : sync (2^16,1,16) -3305 ms : async (2^16,1,16,10) -27.51% increase ---------------------------- -2705 ms : sync (2^20,1,1) -3363 ms : async (2^20,1,1,10) -24.33% increase ---------------------------- -2278 ms : sync (2^16,16,1) -2773 ms : async (2^16,16,1,1) -21.73% increase ---------------------------- -2617 ms : sync (2^16,1,16) -5632 ms : async (2^16,1,16,1) -115.21% increase ---------------------------- -2727 ms : sync (2^20,1,1) -5723 ms : async (2^20,1,1,1) -109.86% increase ---------------------------- -``` - -API ---- - -### scrypt(key, salt, N, r, p, keyLenBytes, [progressCallback]) - -- **key**: The key. Either `Buffer` or `string`. -- **salt**: The salt. Either `Buffer` or `string`. -- **N**: The number of iterations. `number` (integer) -- **r**: Memory factor. `number` (integer) -- **p**: Parallelization factor. `number` (integer) -- **keyLenBytes**: The number of bytes to return. `number` (integer) -- **progressCallback**: Call callback on every `1000` ops. Passes in `{current, total, percent}` as first parameter to `progressCallback()`. - -Returns `Buffer`. - -### scrypt.async(key, salt, N, r, p, keyLenBytes, [progressCallback, promiseInterval]) - -- **key**: The key. Either `Buffer` or `string`. -- **salt**: The salt. Either `Buffer` or `string`. -- **N**: The number of iterations. `number` (integer) -- **r**: Memory factor. `number` (integer) -- **p**: Parallelization factor. `number` (integer) -- **keyLenBytes**: The number of bytes to return. `number` (integer) -- **progressCallback**: Call callback on every `1000` ops. Passes in `{current, total, percent}` as first parameter to `progressCallback()`. -- **promiseInterval**: The number of internal iterations before calling setImmediate once to free the event loop. - -Returns `Promise`. - - - -Resources ---------- -- [Tarsnap Blurb on Scrypt][tarsnap] -- [Scrypt Whitepaper](http://www.tarsnap.com/scrypt/scrypt.pdf) -- [IETF Scrypt](https://tools.ietf.org/html/draft-josefsson-scrypt-kdf-00) (Test vector params are [incorrect](https://twitter.com/dchest/status/247734446881640448).) - - -License -------- - -MIT - - -[wiki]: https://en.wikipedia.org/wiki/Scrypt -[tarsnap]: https://www.tarsnap.com/scrypt.html diff --git a/blue_modules/scryptsy/lib/index.js b/blue_modules/scryptsy/lib/index.js deleted file mode 100644 index 6e630bdbf..000000000 --- a/blue_modules/scryptsy/lib/index.js +++ /dev/null @@ -1,3 +0,0 @@ -const scrypt = require('./scryptSync') -scrypt.async = require('./scrypt') -module.exports = scrypt diff --git a/blue_modules/scryptsy/lib/scrypt.js b/blue_modules/scryptsy/lib/scrypt.js deleted file mode 100644 index bd98ccc69..000000000 --- a/blue_modules/scryptsy/lib/scrypt.js +++ /dev/null @@ -1,26 +0,0 @@ -let pbkdf2 = require('pbkdf2') -const { - checkAndInit, - smix -} = require('./utils') - -// N = Cpu cost, r = Memory cost, p = parallelization cost -async function scrypt (key, salt, N, r, p, dkLen, progressCallback, promiseInterval) { - const { - XY, - V, - B32, - x, - _X, - B, - tickCallback - } = checkAndInit(key, salt, N, r, p, dkLen, progressCallback) - - for (var i = 0; i < p; i++) { - await smix(B, i * 128 * r, r, N, V, XY, _X, B32, x, tickCallback, promiseInterval) - } - - return pbkdf2.pbkdf2Sync(key, B, 1, dkLen, 'sha256') -} - -module.exports = scrypt diff --git a/blue_modules/scryptsy/lib/scryptSync.js b/blue_modules/scryptsy/lib/scryptSync.js deleted file mode 100644 index b4352de88..000000000 --- a/blue_modules/scryptsy/lib/scryptSync.js +++ /dev/null @@ -1,26 +0,0 @@ -let pbkdf2 = require('pbkdf2') -const { - checkAndInit, - smixSync -} = require('./utils') - -// N = Cpu cost, r = Memory cost, p = parallelization cost -function scrypt (key, salt, N, r, p, dkLen, progressCallback) { - const { - XY, - V, - B32, - x, - _X, - B, - tickCallback - } = checkAndInit(key, salt, N, r, p, dkLen, progressCallback) - - for (var i = 0; i < p; i++) { - smixSync(B, i * 128 * r, r, N, V, XY, _X, B32, x, tickCallback) - } - - return pbkdf2.pbkdf2Sync(key, B, 1, dkLen, 'sha256') -} - -module.exports = scrypt diff --git a/blue_modules/scryptsy/lib/utils.js b/blue_modules/scryptsy/lib/utils.js deleted file mode 100644 index 425c4b42a..000000000 --- a/blue_modules/scryptsy/lib/utils.js +++ /dev/null @@ -1,216 +0,0 @@ -let pbkdf2 = require('pbkdf2') -const MAX_VALUE = 0x7fffffff -const DEFAULT_PROMISE_INTERVAL = 5000 -/* eslint-disable camelcase */ - -function checkAndInit (key, salt, N, r, p, dkLen, progressCallback) { - if (N === 0 || (N & (N - 1)) !== 0) throw Error('N must be > 0 and a power of 2') - - if (N > MAX_VALUE / 128 / r) throw Error('Parameter N is too large') - if (r > MAX_VALUE / 128 / p) throw Error('Parameter r is too large') - - let XY = Buffer.alloc(256 * r) - let V = Buffer.alloc(128 * r * N) - - // pseudo global - let B32 = new Int32Array(16) // salsa20_8 - let x = new Int32Array(16) // salsa20_8 - let _X = Buffer.alloc(64) // blockmix_salsa8 - - // pseudo global - let B = pbkdf2.pbkdf2Sync(key, salt, 1, p * 128 * r, 'sha256') - - let tickCallback - if (progressCallback) { - let totalOps = p * N * 2 - let currentOp = 0 - - tickCallback = function () { - ++currentOp - - // send progress notifications once every 1,000 ops - if (currentOp % 1000 === 0) { - progressCallback({ - current: currentOp, - total: totalOps, - percent: (currentOp / totalOps) * 100.0 - }) - } - } - } - return { - XY, - V, - B32, - x, - _X, - B, - tickCallback - } -} - -async function smix (B, Bi, r, N, V, XY, _X, B32, x, tickCallback, promiseInterval) { - promiseInterval = promiseInterval || DEFAULT_PROMISE_INTERVAL - let Xi = 0 - let Yi = 128 * r - let i - - B.copy(XY, Xi, Bi, Bi + Yi) - - for (i = 0; i < N; i++) { - XY.copy(V, i * Yi, Xi, Xi + Yi) - if (i % promiseInterval === 0) { - await new Promise(resolve => setImmediate(resolve)) - } - blockmix_salsa8(XY, Xi, Yi, r, _X, B32, x) - - if (tickCallback) tickCallback() - } - - for (i = 0; i < N; i++) { - let offset = Xi + (2 * r - 1) * 64 - let j = XY.readUInt32LE(offset) & (N - 1) - blockxor(V, j * Yi, XY, Xi, Yi) - if (i % promiseInterval === 0) { - await new Promise(resolve => setImmediate(resolve)) - } - blockmix_salsa8(XY, Xi, Yi, r, _X, B32, x) - - if (tickCallback) tickCallback() - } - - XY.copy(B, Bi, Xi, Xi + Yi) -} - -function smixSync (B, Bi, r, N, V, XY, _X, B32, x, tickCallback) { - let Xi = 0 - let Yi = 128 * r - let i - - B.copy(XY, Xi, Bi, Bi + Yi) - - for (i = 0; i < N; i++) { - XY.copy(V, i * Yi, Xi, Xi + Yi) - blockmix_salsa8(XY, Xi, Yi, r, _X, B32, x) - - if (tickCallback) tickCallback() - } - - for (i = 0; i < N; i++) { - let offset = Xi + (2 * r - 1) * 64 - let j = XY.readUInt32LE(offset) & (N - 1) - blockxor(V, j * Yi, XY, Xi, Yi) - blockmix_salsa8(XY, Xi, Yi, r, _X, B32, x) - - if (tickCallback) tickCallback() - } - - XY.copy(B, Bi, Xi, Xi + Yi) -} - -function blockmix_salsa8 (BY, Bi, Yi, r, _X, B32, x) { - let i - - arraycopy(BY, Bi + (2 * r - 1) * 64, _X, 0, 64) - - for (i = 0; i < 2 * r; i++) { - blockxor(BY, i * 64, _X, 0, 64) - salsa20_8(_X, B32, x) - arraycopy(_X, 0, BY, Yi + (i * 64), 64) - } - - for (i = 0; i < r; i++) { - arraycopy(BY, Yi + (i * 2) * 64, BY, Bi + (i * 64), 64) - } - - for (i = 0; i < r; i++) { - arraycopy(BY, Yi + (i * 2 + 1) * 64, BY, Bi + (i + r) * 64, 64) - } -} - -function R (a, b) { - return (a << b) | (a >>> (32 - b)) -} - -function salsa20_8 (B, B32, x) { - let i - - for (i = 0; i < 16; i++) { - B32[i] = (B[i * 4 + 0] & 0xff) << 0 - B32[i] |= (B[i * 4 + 1] & 0xff) << 8 - B32[i] |= (B[i * 4 + 2] & 0xff) << 16 - B32[i] |= (B[i * 4 + 3] & 0xff) << 24 - // B32[i] = B.readUInt32LE(i*4) <--- this is signficantly slower even in Node.js - } - - arraycopy(B32, 0, x, 0, 16) - - for (i = 8; i > 0; i -= 2) { - x[4] ^= R(x[0] + x[12], 7) - x[8] ^= R(x[4] + x[0], 9) - x[12] ^= R(x[8] + x[4], 13) - x[0] ^= R(x[12] + x[8], 18) - x[9] ^= R(x[5] + x[1], 7) - x[13] ^= R(x[9] + x[5], 9) - x[1] ^= R(x[13] + x[9], 13) - x[5] ^= R(x[1] + x[13], 18) - x[14] ^= R(x[10] + x[6], 7) - x[2] ^= R(x[14] + x[10], 9) - x[6] ^= R(x[2] + x[14], 13) - x[10] ^= R(x[6] + x[2], 18) - x[3] ^= R(x[15] + x[11], 7) - x[7] ^= R(x[3] + x[15], 9) - x[11] ^= R(x[7] + x[3], 13) - x[15] ^= R(x[11] + x[7], 18) - x[1] ^= R(x[0] + x[3], 7) - x[2] ^= R(x[1] + x[0], 9) - x[3] ^= R(x[2] + x[1], 13) - x[0] ^= R(x[3] + x[2], 18) - x[6] ^= R(x[5] + x[4], 7) - x[7] ^= R(x[6] + x[5], 9) - x[4] ^= R(x[7] + x[6], 13) - x[5] ^= R(x[4] + x[7], 18) - x[11] ^= R(x[10] + x[9], 7) - x[8] ^= R(x[11] + x[10], 9) - x[9] ^= R(x[8] + x[11], 13) - x[10] ^= R(x[9] + x[8], 18) - x[12] ^= R(x[15] + x[14], 7) - x[13] ^= R(x[12] + x[15], 9) - x[14] ^= R(x[13] + x[12], 13) - x[15] ^= R(x[14] + x[13], 18) - } - - for (i = 0; i < 16; ++i) B32[i] = x[i] + B32[i] - - for (i = 0; i < 16; i++) { - let bi = i * 4 - B[bi + 0] = (B32[i] >> 0 & 0xff) - B[bi + 1] = (B32[i] >> 8 & 0xff) - B[bi + 2] = (B32[i] >> 16 & 0xff) - B[bi + 3] = (B32[i] >> 24 & 0xff) - // B.writeInt32LE(B32[i], i*4) //<--- this is signficantly slower even in Node.js - } -} - -// naive approach... going back to loop unrolling may yield additional performance -function blockxor (S, Si, D, Di, len) { - for (let i = 0; i < len; i++) { - D[Di + i] ^= S[Si + i] - } -} - -function arraycopy (src, srcPos, dest, destPos, length) { - if (Buffer.isBuffer(src) && Buffer.isBuffer(dest)) { - src.copy(dest, destPos, srcPos, srcPos + length) - } else { - while (length--) { - dest[destPos++] = src[srcPos++] - } - } -} - -module.exports = { - checkAndInit, - smix, - smixSync -} diff --git a/blue_modules/scryptsy/package.json b/blue_modules/scryptsy/package.json deleted file mode 100644 index a34d5468b..000000000 --- a/blue_modules/scryptsy/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "_from": "scryptsy@2.1.0", - "_id": "scryptsy@2.1.0", - "_inBundle": false, - "_integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==", - "_location": "/scryptsy", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "scryptsy@2.1.0", - "name": "scryptsy", - "escapedName": "scryptsy", - "rawSpec": "2.1.0", - "saveSpec": null, - "fetchSpec": "2.1.0" - }, - "_requiredBy": [ - "#USER", - "/" - ], - "_resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", - "_shasum": "8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790", - "_spec": "scryptsy@2.1.0", - "_where": "/home/overtorment/Documents/BlueWallet", - "author": "", - "bugs": { - "url": "https://github.com/cryptocoinjs/scryptsy/issues" - }, - "bundleDependencies": false, - "dependencies": {}, - "deprecated": false, - "description": "Pure JavaScript implementation of the scrypt key deriviation function that is fully compatible with Node.js and the browser.", - "devDependencies": {}, - "files": [ - "lib" - ], - "homepage": "https://github.com/cryptocoinjs/scryptsy#readme", - "keywords": [ - "crytpo", - "cryptography", - "scrypt", - "kdf", - "litecoin", - "dogecoin", - "bitcoin", - "bip38" - ], - "license": "MIT", - "main": "lib/index.js", - "name": "scryptsy", - "repository": { - "url": "git+ssh://git@github.com/cryptocoinjs/scryptsy.git", - "type": "git" - }, - "scripts": { - "browser-test": "mochify --wd -R spec", - "coverage": "nyc --check-coverage --statements 80 --branches 60 --functions 90 --lines 90 mocha", - "coveralls": "npm run-script coverage && coveralls < coverage/lcov.info", - "lint": "standard", - "test": "mocha --ui bdd", - "unit": "mocha" - }, - "version": "2.1.0" -} diff --git a/package-lock.json b/package-lock.json index 751e59918..b9ea50656 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19573,7 +19573,8 @@ } }, "scryptsy": { - "version": "file:blue_modules/scryptsy", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" }, "secp256k1": { diff --git a/package.json b/package.json index e7929a3f8..c2470dc43 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,6 @@ "metro-react-native-babel-preset": "0.66.0", "path-browserify": "1.0.1", "payjoin-client": "1.0.0", - "pbkdf2": "3.1.1", "process": "0.11.10", "prop-types": "15.7.2", "react": "17.0.1", @@ -192,7 +191,7 @@ "readable-stream": "3.6.0", "realm": "10.6.0", "rn-nodeify": "10.3.0", - "scryptsy": "file:blue_modules/scryptsy", + "scryptsy": "2.1.0", "secure-random": "1.1.2", "slip39": "file:blue_modules/slip39", "stream-browserify": "2.0.2", From db14810b6f10791dbae1d97025f7af4e7aec7a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Fri, 23 Jul 2021 15:13:00 -0400 Subject: [PATCH 268/327] FIX: Disable enable screens --- index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 0be6e19be..0363db6f1 100644 --- a/index.js +++ b/index.js @@ -3,8 +3,9 @@ import './shim.js'; import { AppRegistry } from 'react-native'; import App from './App'; import { BlueStorageProvider } from './blue_modules/storage-context'; +import { enableScreens } from 'react-native-screens'; const A = require('./blue_modules/analytics'); - +enableScreens(false) if (!Error.captureStackTrace) { // captureStackTrace is only available when debugging Error.captureStackTrace = () => {}; From 3d21ed06f1cd73a5a35379b3f517882cb37a6c16 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 23 Jul 2021 19:41:50 +0000 Subject: [PATCH 269/327] fix: upgrade react-native-camera from 3.44.2 to 3.44.3 Snyk has created this PR to upgrade react-native-camera from 3.44.2 to 3.44.3. See this package in npm: https://www.npmjs.com/package/react-native-camera See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 751e59918..535602e0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18004,9 +18004,9 @@ "from": "git+https://github.com/BlueWallet/react-native-blue-crypto.git" }, "react-native-camera": { - "version": "3.44.2", - "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.44.2.tgz", - "integrity": "sha512-JDDgl3y/UEWYvyfp6aopNT1ymSkfr8zmYGAls1RvRQ1BAi7ScjDfA//UTFI0Be+DEgpi3pBVancQiFqw5zM5yg==", + "version": "3.44.3", + "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-3.44.3.tgz", + "integrity": "sha512-Efb5aKhFsE7qnqvTnbSEwFAom79L5BT4jMn+B2wYVUnZeRgWh45gNSG7Ou3MQ6zU2DpUHBPlBFKGVS5yOSfSZQ==", "requires": { "prop-types": "^15.6.2" } diff --git a/package.json b/package.json index e7929a3f8..609a38f3e 100644 --- a/package.json +++ b/package.json @@ -144,7 +144,7 @@ "react-localization": "1.0.17", "react-native": "0.64.2", "react-native-blue-crypto": "https://github.com/BlueWallet/react-native-blue-crypto", - "react-native-camera": "3.44.2", + "react-native-camera": "3.44.3", "react-native-crypto": "2.2.0", "react-native-default-preference": "1.4.3", "react-native-device-info": "8.1.3", From fae4237260bb8689d9e2b6fb21f62e3063139183 Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Fri, 23 Jul 2021 22:53:10 +0300 Subject: [PATCH 270/327] ADD: add ko_KR lang, sync fr and he --- loc/fr_fr.json | 15 +-- loc/he.json | 21 ++-- loc/index.js | 5 + loc/ko_KR.json | 261 +++++++++++++++++++++++++++++++++++++++++++++++ loc/languages.js | 1 + loc/zh_cn.json | 20 +--- 6 files changed, 294 insertions(+), 29 deletions(-) create mode 100644 loc/ko_KR.json diff --git a/loc/fr_fr.json b/loc/fr_fr.json index 068136f4d..57e44ce04 100644 --- a/loc/fr_fr.json +++ b/loc/fr_fr.json @@ -16,8 +16,7 @@ "seed": "Graine", "success": "Succès", "wallet_key": "Clé de portefeuille", - "invalid_animated_qr_code_fragment" : "Fragment du QR Code animé invalide. Veuillez essayer encore.", - "file_saved": "Le fichier ({filePath}) a été enregistré dans le dossier Téléchargements.", + "invalid_animated_qr_code_fragment": "Fragment du QR Code animé invalide. Veuillez essayer encore.", "discard_changes": "Supprimer les changements ?", "discard_changes_detail": "Certaines modifications n'ont pas été enregistrées. Êtes-vous sûr de vouloir les supprimer et quitter cet écran ?" }, @@ -259,8 +258,8 @@ "electrum_connected_not": "Déconnecté", "electrum_error_connect": "Impossible de se connecter au serveur Electrum fourni", "electrum_host": "Par exemple {example}", - "electrum_port": "port TCP, généralement {example}", - "electrum_port_ssl": "port SSL, généralement {example}", + "electrum_port": "Port, en général {example}", + "use_ssl": "Utiliser SSL", "electrum_saved": "Les changements ont bien été enregistrés. Un redémarrage sera peut-être nécessaires pour qu'ils prennent effet.", "set_electrum_server_as_default": "Mettre {server} come serveur electrum par défaut ?", "set_lndhub_as_default": "Mettre {url} comme serveur LNDHub par défaut?", @@ -305,7 +304,7 @@ "network_electrum": "Serveur Electrum", "not_a_valid_uri": "URI invalide", "notifications": "Notifications", - "open_link_in_explorer" : "Ouvrir le lien dans l'explorateur", + "open_link_in_explorer": "Ouvrir le lien dans l'explorateur", "password": "Mot de passe", "password_explain": "Créer le mot de passe utilisé pour déchiffrer l'espace de stockage principal", "passwords_do_not_match": "Les mots de passe ne correspondent pas", @@ -324,7 +323,7 @@ "selfTest": "Auto-test", "save": "Enregistrer", "saved": "Enregistré", - "success_transaction_broadcasted" : "Succès! Votre transaction a été difusée!", + "success_transaction_broadcasted": "Succès! Votre transaction a été difusée!", "total_balance": "Solde total", "total_balance_explanation": "Afficher le solde total de tous vos portefeuilles sur l'écran d'accueil.", "widgets": "Widgets", @@ -581,7 +580,9 @@ "sign_aopp_confirm": "Voulez-vous envoyer un message signé à {hostname} ?", "addresses_title": "Adresses", "type_change": "Monnaie", - "type_receive": "Réception" + "type_receive": "Réception", + "type_used": "Utilisé", + "transactions": "Transactions" }, "aopp": { "title": "Sélectionner l'adresse", diff --git a/loc/he.json b/loc/he.json index f66b2ffd5..f4b5e77f7 100644 --- a/loc/he.json +++ b/loc/he.json @@ -17,7 +17,11 @@ "success": "הצלחה", "wallet_key": "מפתח ארנק", "invalid_animated_qr_code_fragment": "קטע קוד QR מונפש לא תקין, אנא נסו שוב", - "file_saved": "הקובץ ({filePath}) נשמר לתיקיית ההורדות שלך.", + "file_saved": "הקובץ {filePath} נשמר בתיקיית {destination} שלך.", + "file_save_title": "שמירת קובץ", + "file_save_location": "בחירת מיקום לשמירה {filePath}", + "downloads_folder": "תיקיית הורדות", + "external_storage": "אחסון חיצוני", "discard_changes": "ביטול שינויים?", "discard_changes_detail": "יש לכם שינויים לא שמורים. האם להיפטר משינויים אלה ולעזוב את המסך?" }, @@ -185,6 +189,7 @@ "details_no_signed_tx": "הקובץ הנבחר אינו מכיל פעולה שניתן לייבא.", "details_note_placeholder": "הערה לעצמך", "details_scan": "סריקה", + "details_scan_hint": "לחיצה כפולה לסריקה או יבוא יעד", "details_total_exceeds_balance": "הסכום לשליחה חורג מהיתרה הזמינה.", "details_unrecognized_file_format": "פורמט קובץ לא מזוהה", "details_wallet_before_tx": "לפני יצירת פעולה, עליך להוסיף ארנק ביטקוין.", @@ -257,8 +262,7 @@ "electrum_connected_not": "לא מחובר", "electrum_error_connect": "לא ניתן להתחבר לשרת אלקטרום", "electrum_host": "למשל {example}", - "electrum_port": "פתחת TCP, לרוב {example}", - "electrum_port_ssl": "פתחת SSL, לרוב {example}", + "use_ssl": "הפעלת SSL", "electrum_saved": "השינויים נשמרו בהצלחה. ייתכן ותדרש הפעלה מחדש כדי שהשינויים ייכנסו לתוקף.", "set_electrum_server_as_default": "הגדרת {server} כשרת אלקטרום ברירת מחדל?", "set_lndhub_as_default": "הגדרת {url} כשרת LNDHub ברירת מחדל?", @@ -401,7 +405,6 @@ "details_derivation_path": "נתיב גזירה", "details_display": "הצגה ברשימת ארנקים", "details_export_backup": "יצוא / גיבוי", - "details_marketplace": "שוק", "details_master_fingerprint": "טביעת אצבע ראשית", "details_ms_l": "{m} מתוך {n} legacy (p2sh)", "details_ms_ns": "{m} מתוך {n} native segwit (p2wsh)", @@ -465,7 +468,7 @@ "multisig": { "multisig_vault": "כספת", "default_label": "כספת רבת-חתימות", - "multisig_vault_explain": "ההגנה הטובה היותר לסכומים גדולים", + "multisig_vault_explain": "ההגנה הטובה ביותר לסכומים גדולים", "provide_signature": "ספקו חתימה", "vault_key": "מפתח כספת {number}", "required_keys_out_of_total": " מפתחות נדרשים מתוך הסך הכולל", @@ -528,8 +531,11 @@ "ms_help_title1": "ריבוי מכשירים מומלץ.", "ms_help_1": "הכספת תעבוד עם ישומי BlueWallet אחרים וארנקים תואמי PSBT, כגון אלקטרום, Specter, Cobo vault, וכו'.", "ms_help_title2": "עריכת מפתחות", + "ms_help_2": "באפשרותך ליצור את כל מפתחות הכספת במכשיר זה ולמחוק או לערוך את אותם מפתחות אחר כך. רמת האבטחה של שמירת כל המפתחות על אותו המכשיר תהיה שווה לרמת האבטחה של ארנק ביטקוין רגיל.", "ms_help_title3": "גיבויי כספת", + "ms_help_3": "באפשריות הארנק ניתן למצוא את גיבוי הכספת שלך וגיבוי צפייה-בלבד. גיבוי זה הנו כמו מפה של ארנקך. זה חיוני לשחזור הארנק במקרה של אובדן אחד מהגרעינים שלך.", "ms_help_title4": "מייבא כספות", + "ms_help_4": "כדי ליבא ארנק רב-חתימות, השתמשו בקובץ הגיבוי ובאפשרות היבוא. אם יש לכם רק גרעינים ומפתחות צפייה, תוכלו להשתמש בכפתור היבוא הפרטני בתהליך יצירת מפתחות כספת.", "ms_help_title5": "מצב מתקדם", "ms_help_5": "כברירת מחדל, BlueWallet יצור כספת 2-מתוך-3. כדי ליצור קוורום שונה או לשנות סוג כתובת, הפעילו מצב מתקדם בהגדרות." }, @@ -568,10 +574,11 @@ "sign_placeholder_message": "הודעה", "sign_placeholder_signature": "חתימה", "sign_aopp_confirm": "האם ברצונך לשלוח הודעה חתומה אל {hostname}?", - "address_balance": "מאזן: {balance} sats", "addresses_title": "כתובות", "type_change": "עודף", - "type_receive": "קבלה" + "type_receive": "קבלה", + "type_used": "שומש", + "transactions": "פעולות" }, "aopp": { "title": "בחירת כתובת", diff --git a/loc/index.js b/loc/index.js index f3da18fcb..46f8c20db 100644 --- a/loc/index.js +++ b/loc/index.js @@ -80,6 +80,10 @@ const setDateTimeLocale = async () => { lang = 'ja'; require('dayjs/locale/ja'); break; + case 'ko_kr': + lang = 'ko'; + require('dayjs/locale/ko'); + break; case 'nb_no': require('dayjs/locale/nb'); break; @@ -206,6 +210,7 @@ const strings = new Localization({ id_id: require('./id_id.json'), it: require('./it.json'), jp_jp: require('./jp_jp.json'), + ko_kr: require('./ko_KR.json'), nb_no: require('./nb_no.json'), nl_nl: require('./nl_nl.json'), pt_br: require('./pt_br.json'), diff --git a/loc/ko_KR.json b/loc/ko_KR.json new file mode 100644 index 000000000..cf0d08b73 --- /dev/null +++ b/loc/ko_KR.json @@ -0,0 +1,261 @@ +{ + "_": { + "bad_password": "잘못된 암호입니다. 다시 시도하십시오.", + "cancel": "취소", + "continue": "계속", + "enter_password": "비밀번호 입력", + "never": "불가합니다", + "of": "{number} 중 {total}", + "ok": "확인", + "storage_is_encrypted": "저장된 데이터가 암호화되었습니다. 암호화를 해독하려면 비밀번호를 입력하십시오.", + "allow": "허용", + "dont_allow": "불가", + "yes": "네", + "no": "아니요", + "save": "저장", + "seed": "시드", + "success": "성공", + "wallet_key": "지갑 키", + "invalid_animated_qr_code_fragment": "유효하지 않은 QR 코드입니다. 다시 시도하십시오.", + "file_saved": "파일이{filePath} {destination}에 저장되었습니다.", + "file_save_title": "파일 저장하기", + "file_save_location": "{filePath} 를 어디에 저장할지 고르십시오.", + "downloads_folder": "폴더를 다운로드합니다.", + "external_storage": "외부 스토리지", + "discard_changes": "거스름돈을 버리시겠습니까? / 변경 내용을 무시하시겠습니까?", + "discard_changes_detail": "저장하지 않은 변경 사항이 있습니다. 변경을 취소하고 나가시겠습니까?" + }, + "azteco": { + "codeIs": "프로모션 코드", + "errorBeforeRefeem": "교환하기 전에 먼저 비트 코인 지갑을 추가해야합니다.", + "errorSomething": "문제가 발생했습니다. 이 쿠폰은 여전히 ​​유효합니까?", + "redeem": "지갑으로 교환", + "redeemButton": "교환", + "success": "성공", + "title": "제목" + }, + "entropy": { + "save": "저장", + "title": "제목", + "undo": "실행 취소" + }, + "errors": { + "broadcast": "브로드 캐스트 실패", + "error": "오류", + "network": "네크워크 오류" + }, + "hodl": { + "are_you_sure_you_want_to_logout": "Hodl Hodl에서 로그 아웃 하시겠습니까?", + "cont_address_escrow": "에스크로", + "cont_address_to": "대상", + "cont_buying": "구매", + "cont_cancel": "구매 취소", + "cont_cancel_q": "정말 구매를 취소 하시겠습니까?", + "cont_cancel_y": "예. 구매를 취소합니다.", + "cont_chat": "상대방과 채팅", + "cont_how": "지불 방법", + "cont_no": "진행 중인 거래가 없습니다.", + "cont_paid_e": "결제 금액을 합의된 결제 수단을 통해 보냈을 때 이것을 진행하십시오. ", + "cont_selling": "판매", + "cont_st_completed": "모두 끝났습니다.", + "cont_st_in_progress_buyer": "코인이 에스크로에 있습니다. 판매자에게 지불하세요.", + "cont_st_paid_enought": "비트코인이 에스크로에 있습니다. \n판매자에게 합의된 결제수단을 통해 지불하세요.", + "cont_st_paid_waiting": "판매자가 에스크로에서 코인을 넘겨주기를 기다리세요.", + "cont_st_waiting": "판매자가 비트코인을 에스크로에 담기를 기다리세요.", + "cont_title": "내 거래들", + "filter_buying": "구매", + "filter_country_global": "글로벌 오퍼", + "filter_currency": "통화", + "filter_detail": "세부사항
", + "filter_filters": "필터
", + "filter_iambuying": "비트코인 매수", + "filter_iamselling": "비트코인 매도", + "filter_method": "결제 방법", + "filter_search": "검색
", + "filter_selling": "판매", + "item_minmax": "최소/최대", + "item_nooffers": "오퍼가 없습니다. “Near me”를 “글로벌 오퍼”로 바꿔보세요.", + "item_rating": "{rating} 트레이드", + "local_trader_new": "New", + "login": "로그인", + "logout": "로그아웃
", + "mycont": "내 계약/거래들", + "offer_accept": "오퍼를 받아들입니다.", + "offer_choosemethod": "결제 수단을 선택하세요.", + "offer_confirmations": "확인", + "offer_minmax": "최소/최대
", + "offer_minutes": "최소", + "offer_promt_fiat_e": "예시, 100", + "p2p": "비트코인을 P2P(peer-to-peer)교환으로 구매하기" + }, + "lnd": { + "errorInvoiceExpired": "청구서가 만료되었습니다.", + "exchange": "교환", + "expired": "만료되었습니다", + "expiredLow": "만료되었습니다.", + "expiresIn": "만료: {time}", + "payButton": "지불하기", + "placeholder": "청구서", + "potentialFee": "잠재적 수수료:{fee}", + "refill": "재충전", + "refill_card": "은행 카드로 재충전합니다.", + "refill_create": "진행을 위해서 재충전할 수있는 비트코인 지갑을 만들어주세요.", + "refill_external": "외부 지갑으로 재충전합니다.", + "refill_lnd_balance": "라이트닝 월렛잔액 재충전하기", + "title": "자금 관리하기" + }, + "lndViewInvoice": { + "additional_info": "추가적인 정보", + "for": "For:", + "lightning_invoice": "라이트닝 청구서", + "has_been_paid": "이 청구서는 결제가 완료되었습니다. ", + "please_pay": "지불해주세요.", + "preimage": "사전 이미지/ 역상 이미지" + }, + "plausibledeniability": { + "create_password": "비밀번호 만들기
", + "create_password_explanation": "fake storage(페이크 저장소)를 위한 패스워드는 메인 저장소의 패스워드와 일치하지 않아야합니다.", + "help": "특정 상황에서 비밀번호를 강제로 밝혀야 할 수 있습니다. 코인의 안전을 위해 블루월렛에서는 다른 암호화 스토리지를 다른 비밀번호로 만들어 놓을 수있습니다. 제 3자에게 비밀번호를 노출해도 이는 페이크 스토리지를 열것입니다. 이는 제 3자들에게는 진짜처럼 보이겠지만 코인은 메인 스토리지에 안전하게 보관되고 있을 것입니다. ", + "help2": "새로운 스토리지가 활성화됩니다. 최소 금액을 넣으면 더 신뢰성있어보입니다. ", + "password_should_not_match": "이 비밀 번호는 현재 사용중입니다. 다른 비밀번호를 입력해주세요.", + "passwords_do_not_match": "비밀번호가 일치하지 않습니다. 다시 시도해주세요.
", + "success": "성공했습니다." + }, + "pleasebackup": { + "ask": "backup phrase 를 저장해뒀나요? 이 backup phrase는 디바이스를 잃어버렸을 때 자금에 접근하는데 필요합니다. backup phrase가 없다면 영구적으로 자금을 찾을 수 없게 됩니다. ", + "ask_no": "아니요. 없습니다.", + "ask_yes": "예. 있습니다.", + "ok": "네. 적었습니다.", + "ok_lnd": "네 저장했습니다.", + "text": "잠시 멈추고 이 mnemonic phrase를 적을 종이를 준비해주세요.\n이건 월렛을 되찾을 때 쓸 예비 백업입니다." + }, + "receive": { + "details_create": "생성하기" + }, + "send": { + "broadcastError": "Error", + "create_amount": "총액/양", + "create_details": "세부사항", + "create_fee": "수수료", + "create_memo": "메모", + "create_tx_size": "트랜잭션 사이즈", + "details_create": "청구서 만들기", + "details_next": "다음", + "details_scan": "스캔", + "dynamic_next": "다음", + "dynamic_prev": "이전", + "dynamic_start": "Start", + "dynamic_stop": "Stop", + "fee_10m": "10분", + "fee_1d": "1일", + "fee_3h": "3시간", + "header": "보내기", + "input_done": "Done", + "input_paste": "붙여넣기", + "input_total": "총합계:", + "permission_camera_title": "카메라사용 허가", + "permission_storage_denied_message": "블루월렛은 이 파일을 저장할 수 없습니다. 다바이스 셋팅에서 Storage permission을 가능하게 설정해주세요.", + "permission_storage_title": "스토리지 접근 허가", + "psbt_clipboard": "클립보드에 복사하기", + "psbt_this_is_psbt": "PSBT(서명 비트코인거래) 입니다. 하드웨어월렛으로 서명을 마무리해주세요.", + "success_done": "끝났습니다.", + "problem_with_psbt": "PSBT에 문제가 있습니다. " + }, + "settings": { + "about_review": "리뷰를 남겨주세요.", + "about_sm_twitter": "트위터에서 팔로우해주세요.", + "currency": "통화", + "default_info": "기본 정보", + "default_wallets": "모든 지갑 보기", + "electrum_connected": "연결되었습니다.", + "electrum_connected_not": "연결되지 않았습니다.", + "electrum_status": "상태", + "electrum_clear_alert_cancel": "최소하기", + "electrum_clear_alert_ok": "Ok", + "encrypt_tstorage": "스토리지", + "general": "일반", + "notifications": "공지사항", + "password": "패스워드", + "passwords_do_not_match": "비밀번호가 일치하지 않습니다.", + "privacy_system_settings": "시스템 설정" + }, + "transactions": { + "cpfp_create": "생성하기", + "details_title": "트랜잭션", + "details_transaction_details": "트랜잭션 세부사항", + "list_title": "트랜잭션", + "txid": "트랜잭션 아이디" + }, + "wallets": { + "add_bitcoin": "비트코인", + "add_create": "생성하기", + "add_or": "or", + "add_wallet_name": "이름", + "details_no_cancel": "아니요. 취소하겠습니다", + "list_latest_transaction": "최근 트랜잭션", + "list_tryagain": "다시 시도하기", + "warning_do_not_disclose": "경고! 공개하지 마십시오." + }, + "multisig": { + "confirm": "컨펌", + "view": "보기", + "create": "생성하기", + "forget_this_seed": "이 시드를 잊어버리고 대신 공개 키를 사용하십시오.", + "invalid_fingerprint": "이 시드의 지문이 공동 서명자의 지문과 일치하지 않습니다.", + "view_edit_cosigners": "공동 서명자 보기/편집", + "this_cosigner_is_already_imported": "이 공동 서명자가 이미 있습니다.", + "export_signed_psbt": "서명 된 PSBT 내보내기", + "input_fp": "지문 입력", + "input_fp_explain": "기본값 (00000000) 사용 건너뛰기", + "input_path_explain": "기본값 ({default})을 사용 건너뛰기", + "ms_help": "도움말", + "ms_help_title": "다중 서명 저장소 작동 방식 : 팁과 요령", + "ms_help_text": "보안을 강화위한 여러 개의 키가있는 지갑에 보관하는것이 좋습니다.", + "ms_help_title1": "여러 디바이스를 사용하는 것이 좋습니다.", + "ms_help_1": "이 볼트는 Electrum, Spectre, Coldcard, Cobo Vault 등과 같은 다른 BlueWallet 앱 및 PSBT 호환 지갑과 함께 사용됩니다.", + "ms_help_title2": "키 편집", + "ms_help_2": "이 디바이스에서 모든 볼트 키를 생성하고 나중에 삭제하거나 편집할 수 있습니다. 모든 키를 동일한 디바이스에 두는 것은 일반 비트 코인 지갑과 동일한 보안을 갖습니다.", + "ms_help_title3": "볼트 백업", + "ms_help_3": "지갑 옵션에서 볼트 백업과 \"보기 전용\"백업을 찾을 수 있습니다. 이 백업은 지갑에 대한 지도와 같습니다. 시드 중 하나가 손실되면 지갑 복구를 위해 백업이 필수적입니다.", + "ms_help_title4": "볼트로 가져 오기", + "ms_help_4": "다중 서명을 가져오려면 백업 파일과 가져오기 기능을 사용하십시오. 시드 및 공개 키만 있는 경우 저장소 키를 만들 때 별도의 \"가져오기\" 버튼을 사용할 수 있습니다.", + "ms_help_title5": "고급 모드", + "ms_help_5": "기본적으로 BlueWallet은 2/3 Vault를 생성합니다. 다른 쿼럼을 생성하거나 주소 유형을 변경하려면 설정에서 고급 모드를 활성화하십시오." + }, + "is_it_my_address": { + "title": "이것은 자신의 주소?", + "owns": "{label} 소유 {address}", + "enter_address": "주소 입력", + "check_address": "주소 확인", + "no_wallet_owns_address": "제공된 주소를 가지고 있는 지갑이 없습니다." + }, + "cc": { + "change": "변경", + "coins_selected": "선택 된 코인 ({number})", + "empty": "이 지갑에는 현재 코인이 없습니다.", + "freeze": "동결", + "freezeLabel": "동결", + "header": "코인 관리", + "use_coin": "코인 사용", + "use_coins": "코인 사용", + "tip": "이 기능을 사용하면 코인을 확인, 표시, 동결 또는 선택하여 지갑 관리를 개선 할 수 있습니다. 색칠 된 원을 선택하여 여러 코인을 선택할 수 있습니다." + }, + "units": { + "BTC": "비트코인", + "MAX": "최대", + "sat_byte": "사토시/바이트", + "sats": "사토시" + }, + "addresses": { + "sign_title": "서명/검증 메시지", + "sign_help": "여기에서 비트 코인 주소를 기반으로 암호화 서명을 생성하거나 검증할 수 있습니다.", + "sign_sign": "서명", + "sign_verify": "검증", + "sign_signature_correct": "검증에 성공했습니다!", + "sign_signature_incorrect": "검증 실패!", + "sign_placeholder_address": "주소", + "sign_placeholder_message": "메시지", + "sign_placeholder_signature": "서명", + "transactions": "트랜잭션" + } +} diff --git a/loc/languages.js b/loc/languages.js index c380bade6..2c32264d0 100644 --- a/loc/languages.js +++ b/loc/languages.js @@ -21,6 +21,7 @@ export const AvailableLanguages = Object.freeze([ { label: 'Indonesia (ID)', value: 'id_id' }, { label: 'Magyar (HU)', value: 'hu_hu' }, { label: '日本語 (JP)', value: 'jp_jp' }, + { label: '한국어 (KO)', value: 'ko_kr' }, { label: 'Nederlands (NL)', value: 'nl_nl' }, { label: 'Norsk (NB)', value: 'nb_no' }, { label: 'Polskie (PL)', value: 'pl' }, diff --git a/loc/zh_cn.json b/loc/zh_cn.json index 98277aab9..8244dcb21 100644 --- a/loc/zh_cn.json +++ b/loc/zh_cn.json @@ -16,8 +16,8 @@ "seed": "种子", "success": "成功", "wallet_key": "钱包密钥", - "invalid_animated_qr_code_fragment" : "无效的动态二维码,请重试。", - "file_saved": "文件({filePath})已保存在您的“下载”文件夹中。", + "invalid_animated_qr_code_fragment": "无效的动态二维码,请重试。", + "file_save_title": "保存文件", "discard_changes": "放弃更变?", "discard_changes_detail": "您尚有未保存的更变。 您确定要丢弃它们并离开屏幕吗?" }, @@ -136,12 +136,8 @@ "ask": "您是否保存了钱包的备份短语? 如果您丢失了此设备,则需要此备份短语来访问您的资金。没有此备份短语,您的资金将永久丢失。", "ask_no": "不,我还没有", "ask_yes": "是的,我完成了", - "ok": "好的!我已抄下来!", - "ok_lnd": "OK!我已保存好,", - "text": "请花少许时间将您的助记(备份)短语抄写于一张纸上。这些备份可以用来在别的设备或者软件上恢复这个钱包。", "text_lnd": "请保存此钱包备份。这个备份可以在装置遗失时用来恢复此钱包。", - "text_lnd2": "此钱包由BlueWallet托管。", - "title": "你的钱包已创建。" + "text_lnd2": "此钱包由BlueWallet托管。" }, "receive": { "details_create": "创建", @@ -257,14 +253,9 @@ "electrum_connected": "已连接", "electrum_connected_not": "未连接", "electrum_error_connect": "无法连接到提供的Electrum服务器", - "electrum_host": "主机,例如{example}", - "electrum_port": "TCP端口,通常为{example}", - "electrum_port_ssl": "SSL端口,通常为{example}", "electrum_saved": "您的更变已成功保存。要使更变生效,可能需要重新启动BlueWallet。", "set_electrum_server_as_default": "将{server}设置为默认的Electrum服务器?", "set_lndhub_as_default": "将{url}设置为默认的LNDHub服务器?", - "electrum_settings_server": "Electrum服务器设置", - "electrum_settings_explain": "保留空白以使用默认设置。", "electrum_status": "状态", "electrum_clear_alert_title": "清除历史记录?", "electrum_clear_alert_message": "您是否要清除electrum 服务器的历史记录?", @@ -292,7 +283,6 @@ "groundcontrol_explanation": "GroundControl是一款免费的开源推送通知服务器,用于比特币钱包。 您可以安装自己的GroundControl服务器并将其URL放在此处,而不依赖BlueWallet的基础结构。 保留空白以使用GroundControl的默认服务器。", "header": "设置", "language": "语言", - "language_restart": "选择新语言时,可能需要重新启动BlueWallet才能使更改生效。", "lightning_error_lndhub_uri": "不是有效的LNDHub URI", "lightning_saved": "您的更变已成功保存。", "lightning_settings": "闪电网络设置", @@ -302,7 +292,7 @@ "network_electrum": "Electrum服务器", "not_a_valid_uri": "无效的URI", "notifications": "通知事项", - "open_link_in_explorer" : "在资源管理器中打开链接", + "open_link_in_explorer": "在资源管理器中打开链接", "password": "密码", "password_explain": "创建密码,您将用此密码来解密储存空间", "passwords_do_not_match": "两个密码不同", @@ -319,7 +309,7 @@ "selfTest": "自行测试", "save": "保存", "saved": "已保存", - "success_transaction_broadcasted" : "成功! 您的交易已广播!", + "success_transaction_broadcasted": "成功! 您的交易已广播!", "total_balance": "总余额", "total_balance_explanation": "在主屏幕小工具上显示您所有钱包的总余额。", "widgets": "小工具" From 666959964391f18d0396e1f0bc3a0150f47a8870 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Fri, 23 Jul 2021 21:18:34 +0100 Subject: [PATCH 271/327] REF: slip39 dep moved to a separate repo --- blue_modules/slip39/.eslintrc.js | 197 -- blue_modules/slip39/CHANGELOG.md | 25 - blue_modules/slip39/LICENSE | 21 - blue_modules/slip39/README.md | 261 -- blue_modules/slip39/babel.config.js | 5 - blue_modules/slip39/dist/slip39.js | 236 -- blue_modules/slip39/dist/slip39_helper.js | 686 ----- blue_modules/slip39/example/main.js | 122 - blue_modules/slip39/jsbeautifyrc | 16 - blue_modules/slip39/jsconfig.json | 9 - blue_modules/slip39/package-lock.json | 3001 ------------------- blue_modules/slip39/package.json | 36 - blue_modules/slip39/scripts/test_publish.sh | 25 - blue_modules/slip39/sed.sh | 2 - blue_modules/slip39/src/slip39.js | 190 -- blue_modules/slip39/src/slip39_helper.js | 2238 -------------- blue_modules/slip39/test/test.js | 353 --- blue_modules/slip39/test/vectors.json | 322 -- package-lock.json | 14 +- package.json | 2 +- 20 files changed, 3 insertions(+), 7758 deletions(-) delete mode 100644 blue_modules/slip39/.eslintrc.js delete mode 100644 blue_modules/slip39/CHANGELOG.md delete mode 100644 blue_modules/slip39/LICENSE delete mode 100644 blue_modules/slip39/README.md delete mode 100644 blue_modules/slip39/babel.config.js delete mode 100644 blue_modules/slip39/dist/slip39.js delete mode 100644 blue_modules/slip39/dist/slip39_helper.js delete mode 100644 blue_modules/slip39/example/main.js delete mode 100644 blue_modules/slip39/jsbeautifyrc delete mode 100644 blue_modules/slip39/jsconfig.json delete mode 100644 blue_modules/slip39/package-lock.json delete mode 100644 blue_modules/slip39/package.json delete mode 100755 blue_modules/slip39/scripts/test_publish.sh delete mode 100755 blue_modules/slip39/sed.sh delete mode 100644 blue_modules/slip39/src/slip39.js delete mode 100644 blue_modules/slip39/src/slip39_helper.js delete mode 100644 blue_modules/slip39/test/test.js delete mode 100644 blue_modules/slip39/test/vectors.json diff --git a/blue_modules/slip39/.eslintrc.js b/blue_modules/slip39/.eslintrc.js deleted file mode 100644 index 438c5c0e8..000000000 --- a/blue_modules/slip39/.eslintrc.js +++ /dev/null @@ -1,197 +0,0 @@ -//module.exports = { "extends": "standard" }; -module.exports = { - "env": { - "browser": true, - "node": true, - "es6": true - }, - "parserOptions": { - "sourceType": "module", - }, - "rules": { - - // - //Possible Errors - // - // The following rules point out areas where you might have made mistakes. - // - "comma-dangle": 2, // disallow or enforce trailing commas - "no-cond-assign": 2, // disallow assignment in conditional expressions - // NOTE: "no-console": 1, // disallow use of console (off by default in the node environment) - "no-constant-condition": 2, // disallow use of constant expressions in conditions - "no-control-regex": 2, // disallow control characters in regular expressions - "no-debugger": 2, // disallow use of debugger - "no-dupe-args": 2, // disallow duplicate arguments in functions - "no-dupe-keys": 2, // disallow duplicate keys when creating object literals - "no-duplicate-case": 2, // disallow a duplicate case label. - "no-empty": 2, // disallow empty statements - "no-empty-character-class": 2, // disallow the use of empty character classes in regular expressions - "no-ex-assign": 2, // disallow assigning to the exception in a catch block - "no-extra-boolean-cast": 2, // disallow double-negation boolean casts in a boolean context - "no-extra-parens": 0, // disallow unnecessary parentheses (off by default) - "no-extra-semi": 2, // disallow unnecessary semicolons - "no-func-assign": 2, // disallow overwriting functions written as function declarations - "no-inner-declarations": 2, // disallow function or variable declarations in nested blocks - "no-invalid-regexp": 2, // disallow invalid regular expression strings in the RegExp constructor - "no-irregular-whitespace": 2, // disallow irregular whitespace outside of strings and comments - "no-negated-in-lhs": 2, // disallow negation of the left operand of an in expression - "no-obj-calls": 2, // disallow the use of object properties of the global object (Math and JSON) as functions - "no-regex-spaces": 2, // disallow multiple spaces in a regular expression literal - "quote-props": 2, // disallow reserved words being used as object literal keys (off by default) - "no-sparse-arrays": 2, // disallow sparse arrays - "no-unreachable": 2, // disallow unreachable statements after a return, throw, continue, or break statement - "use-isnan": 2, // disallow comparisons with the value NaN - "valid-jsdoc": 2, // Ensure JSDoc comments are valid (off by default) - "valid-typeof": 2, // Ensure that the results of typeof are compared against a valid string - - // - // Best Practices - // - // These are rules designed to prevent you from making mistakes. - // They either prescribe a better way of doing something or help you avoid footguns. - // - "block-scoped-var": 0, // treat var statements as if they were block scoped (off by default). 0: deep destructuring is not compatible https://github.com/eslint/eslint/issues/1863 - "complexity": 0, // specify the maximum cyclomatic complexity allowed in a program (off by default) - //"consistent-return": 2, // require return statements to either always or never specify values - "curly": 2, // specify curly brace conventions for all control statements - "default-case": 2, // require default case in switch statements (off by default) - "dot-notation": 2, // encourages use of dot notation whenever possible - "eqeqeq": 2, // require the use of === and !== - //"guard-for-in": 2, // make sure for-in loops have an if statement (off by default) - "no-alert": 2, // disallow the use of alert, confirm, and prompt - "no-caller": 2, // disallow use of arguments.caller or arguments.callee - "no-div-regex": 2, // disallow division operators explicitly at beginning of regular expression (off by default) - "no-else-return": 2, // disallow else after a return in an if (off by default) - "no-labels": 2, // disallow use of labels for anything other then loops and switches - "no-eq-null": 2, // disallow comparisons to null without a type-checking operator (off by default) - "no-eval": 2, // disallow use of eval() - //"no-extend-native": [0, { "exceptions": ["Object", "String"] }], // disallow adding to native types - "no-extra-bind": 2, // disallow unnecessary function binding - "no-fallthrough": 2, // disallow fallthrough of case statements - "no-floating-decimal": 2, // disallow the use of leading or trailing decimal points in numeric literals (off by default) - "no-implied-eval": 2, // disallow use of eval()-like methods - "no-iterator": 2, // disallow usage of __iterator__ property - "no-labels": 2, // disallow use of labeled statements - "no-lone-blocks": 2, // disallow unnecessary nested blocks - "no-loop-func": 2, // disallow creation of functions within loops - "no-multi-spaces": 2, // disallow use of multiple spaces - "no-multi-str": 2, // disallow use of multiline strings - "no-native-reassign": 2, // disallow reassignments of native objects - "no-new": 2, // disallow use of new operator when not part of the assignment or comparison - "no-new-func": 2, // disallow use of new operator for Function object - "no-new-wrappers": 2, // disallows creating new instances of String,Number, and Boolean - "no-octal": 2, // disallow use of octal literals - "no-octal-escape": 2, // disallow use of octal escape sequences in string literals, such as var foo = "Copyright \251"; - "no-param-reassign": 2, // disallow reassignment of function parameters (off by default) - "no-process-env": 2, // disallow use of process.env (off by default) - "no-proto": 2, // disallow usage of __proto__ property - "no-redeclare": 2, // disallow declaring the same variable more then once - "no-return-assign": 2, // disallow use of assignment in return statement - "no-script-url": 2, // disallow use of javascript: urls. - "no-self-compare": 2, // disallow comparisons where both sides are exactly the same (off by default) - "no-sequences": 2, // disallow use of comma operator - "no-throw-literal": 2, // restrict what can be thrown as an exception (off by default) - //"no-unused-expressions": 2, // disallow usage of expressions in statement position - "no-void": 2, // disallow use of void operator (off by default) - "no-warning-comments": [0, {"terms": ["todo", "fixme"], "location": "start"}], // disallow usage of configurable warning terms in comments": 2, // e.g. TODO or FIXME (off by default) - "no-with": 2, // disallow use of the with statement - "radix": 1, // require use of the second argument for parseInt() (off by default) - "vars-on-top": 2, // requires to declare all vars on top of their containing scope (off by default) - "wrap-iife": 2, // require immediate function invocation to be wrapped in parentheses (off by default) - "yoda": 2, // require or disallow Yoda conditions - - // - // Strict Mode - // - // These rules relate to using strict mode. - // - "strict": 0, // controls location of Use Strict Directives. 0: required by `babel-eslint` - - // - // Variables - // - // These rules have to do with variable declarations. - // - "no-catch-shadow": 2, // disallow the catch clause parameter name being the same as a variable in the outer scope (off by default in the node environment) - "no-delete-var": 2, // disallow deletion of variables - "no-label-var": 2, // disallow labels that share a name with a variable - "no-shadow": 2, // disallow declaration of variables already declared in the outer scope - "no-shadow-restricted-names": 2, // disallow shadowing of names such as arguments - // "no-undef": 2, // disallow use of undeclared variables unless mentioned in a /*global */ block - "no-undef-init": 2, // disallow use of undefined when initializing variables - "no-undefined": 2, // disallow use of undefined variable (off by default) - "no-unused-vars": 2, // disallow declaration of variables that are not used in the code - // "no-use-before-define": 2, // disallow use of variables before they are defined - - // - //Stylistic Issues - // - // These rules are purely matters of style and are quite subjective. - // - "indent": [1, 2], // this option sets a specific tab width for your code (off by default) - "brace-style": 1, // enforce one true brace style (off by default) - "camelcase": 1, // require camel case names - "comma-spacing": [1, {"before": false, "after": true}], // enforce spacing before and after comma - "comma-style": [1, "last"], // enforce one true comma style (off by default) - "consistent-this": [1, "_this"], // enforces consistent naming when capturing the current execution context (off by default) - "eol-last": 1, // enforce newline at the end of file, with no multiple empty lines - "func-names": 0, // require function expressions to have a name (off by default) - "func-style": 0, // enforces use of function declarations or expressions (off by default) - "key-spacing": [1, {"beforeColon": false, "afterColon": true}], // enforces spacing between keys and values in object literal properties - //"max-nested-callbacks": [1, 3], // specify the maximum depth callbacks can be nested (off by default) - "new-cap": [1, {newIsCap: true, capIsNew: false}], // require a capital letter for constructors - "new-parens": 1, // disallow the omission of parentheses when invoking a constructor with no arguments - "newline-after-var": 0, // allow/disallow an empty newline after var statement (off by default) - //"no-array-constructor": 1, // disallow use of the Array constructor - "no-inline-comments": 1, // disallow comments inline after code (off by default) - "no-lonely-if": 1, // disallow if as the only statement in an else block (off by default) - "no-mixed-spaces-and-tabs": 1, // disallow mixed spaces and tabs for indentation - "no-multiple-empty-lines": [1, {"max": 2}], // disallow multiple empty lines (off by default) - "no-nested-ternary": 1, // disallow nested ternary expressions (off by default) - "no-new-object": 1, // disallow use of the Object constructor - "no-spaced-func": 1, // disallow space between function identifier and application - "no-ternary": 0, // disallow the use of ternary operators (off by default) - "no-trailing-spaces": 1, // disallow trailing whitespace at the end of lines - "no-underscore-dangle": 1, // disallow dangling underscores in identifiers - "no-extra-parens": 1, // disallow wrapping of non-IIFE statements in parens - "one-var": [1, "never"], // allow just one var statement per function (off by default) - "operator-assignment": [1, "never"], // require assignment operator shorthand where possible or prohibit it entirely (off by default) - "padded-blocks": [1, "never"], // enforce padding within blocks (off by default) - "quote-props": [1, "as-needed"], // require quotes around object literal property names (off by default) - "quotes": [1, "single"], // specify whether double or single quotes should be used - "semi": [1, "always"], // require or disallow use of semicolons instead of ASI - "semi-spacing": [1, {"before": false, "after": true}], // enforce spacing before and after semicolons - "sort-vars": 0, // sort variables within the same declaration block (off by default) - "space-before-blocks": [1, "always"], // require or disallow space before blocks (off by default) - "space-before-function-paren": [1, {"anonymous": "always", "named": "never"}], // require or disallow space before function opening parenthesis (off by default) - "object-curly-spacing": [1, "never"], // require or disallow spaces inside brackets (off by default) - "space-in-parens": [1, "never"], // require or disallow spaces inside parentheses (off by default) - //"space-infix-ops": [1, "always"], // require spaces around operators - "keyword-spacing": 2, // require a space after return, throw, and case - "space-unary-ops": [1, {"words": true, "nonwords": false}], // Require or disallow spaces before/after unary operators (words on by default, nonwords off by default) - "spaced-comment": [1, "always"], // require or disallow a space immediately following the // in a line comment (off by default) - "wrap-regex": 0, // require regex literals to be wrapped in parentheses (off by default) - - // - // ECMAScript 6 - // - // These rules are only relevant to ES6 environments and are off by default. - // - "no-var": 2, // require let or const instead of var (off by default) - "generator-star-spacing": [2, "before"], // enforce the spacing around the * in generator functions (off by default) - - // - // Legacy - // - // The following rules are included for compatibility with JSHint and JSLint. - // While the names of the rules may not match up with the JSHint/JSLint counterpart, - // the functionality is the same. - // - "max-depth": [2, 3], // specify the maximum depth that blocks can be nested (off by default) - "max-len": [2, 100, 2, { "ignoreStrings": true, "ignoreTemplateLiterals": true, "ignoreUrls": true }], // specify the maximum length of a line in your program (off by default) - "max-params": [2, 8], // limits the number of parameters that can be used in the function declaration. (off by default) - "max-statements": 0, // specify the maximum number of statement allowed in a function (off by default) - "no-bitwise": 0, // disallow use of bitwise operators (off by default) - //"no-plusplus": 2, // disallow use of unary operators, ++ and -- (off by default) - } -} diff --git a/blue_modules/slip39/CHANGELOG.md b/blue_modules/slip39/CHANGELOG.md deleted file mode 100644 index f1df46012..000000000 --- a/blue_modules/slip39/CHANGELOG.md +++ /dev/null @@ -1,25 +0,0 @@ -v0.1.0 -* Initial release - -v0.1.1 -* Code clean up and addes some unit tests - -v0.1.2 -* Added length to encodeBigInt() - -v0.1.5-dev.1 -* Bumped version, changed versioning format - -v0.1.5 -* Bumped version -* Added nodejs.yml -* Merge pull requests from different contributors - -v0.1.6 -* Fixed ilap/slip39-js#12 -* Some cosmetic fixes - -v0.1.7 -* Merge pull requests from different contributors -* Fixed ilap/slip39-js#14 -* Fixed ilap/slip39-js#18 diff --git a/blue_modules/slip39/LICENSE b/blue_modules/slip39/LICENSE deleted file mode 100644 index 4a356fdc1..000000000 --- a/blue_modules/slip39/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Pal Dorogi "ilap" - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/blue_modules/slip39/README.md b/blue_modules/slip39/README.md deleted file mode 100644 index 680f06f9d..000000000 --- a/blue_modules/slip39/README.md +++ /dev/null @@ -1,261 +0,0 @@ -# Bluewallet - -It's original [slip39](https://github.com/ilap/slip39-js/) but compiled with `babel-plugin-transform-bigint` to replace js `BigInt` with `JSBI`. - -To update: -- sync src folder -- run `npm build` - - -# SLIP39 - -[![npm](https://img.shields.io/npm/v/slip39.svg)](https://www.npmjs.org/package/slip39) - - -The javascript implementation of the [SLIP39](https://github.com/satoshilabs/slips/blob/master/slip-0039.md) for Shamir's Secret-Sharing for Mnemonic Codes. - -The code based on my [Dart implementation of SLIP-0039](https://github.com/ilap/slip39-dart/). - -# DISCLAIMER - -This project is still in early development phase. Use it at your own risk. - -## Description - - This SLIP39 implementation uses a 3 level height (l=3) of a 16 degree (d=16) tree (T), which is represented as an array of the level two nodes (groups, G). - - The degree (d) and the level (l) of the tree are 16 and 3 respectively, - which means that max d^(l-1), i.e. 16^2, leaf nodes (M) can be in a complete tree (or forest). - - The first level (l=1) node of the tree is the the root (R), the level 2 ones are the `SSS` groups (Gs or group nodes) e.g. `[G0, ..., Gd]`. - - The last, the third, level nodes are the only leafs (M, group members) which contains the generated mnemonics. - - Every node has two values: - - the N and - - M i.e. n(N,M). - - Whihc means, that N (`threshold`) number of M children are required to reconstruct the node's secret. - -## Format - -The tree's human friendly array representation only uses the group (l=2) nodes as arrays. -For example. : ``` [[1,1], [1,1], [3,5], [2,6]]``` -The group's first parameter is the `N` (group threshold) while the second is the `M`, the number of members in the group. See, and example in [Using](#Using). - -## Installing - -``` -npm install slip39 - -``` - -## Using -See `example/main.js` - - ``` javascript -const slip39 = require('../src/slip39.js'); -const assert = require('assert'); -// threshold (N) number of group shares required to reconstruct the master secret. -const threshold = 2; -const masterSecret = 'ABCDEFGHIJKLMNOP'.slip39EncodeHex(); -const passphrase = 'TREZOR'; - -/** - * 4 groups shares. - * = two for Alice - * = one for friends and - * = one for family members - * Two of these group shares are required to reconstruct the master secret. - */ -const groups = [ - // Alice group shares. 1 is enough to reconstruct a group share, - // therefore she needs at least two group shares to be reconstructed, - [1, 1], - [1, 1], - // 3 of 5 Friends' shares are required to reconstruct this group share - [3, 5], - // 2 of 6 Family's shares are required to reconstruct this group share - [2, 6] -]; - -const slip = slip39.fromArray({ - masterSecret: masterSecret, - passphrase: passphrase, - threshold: threshold, - groups: groups -}); - -// One of Alice's share -const aliceShare = slip.fromPath('r/0').mnemonics; - -// and any two of family's shares. -const familyShares = slip.fromPath('r/3/1').mnemonics - .concat(slip.fromPath('r/3/3').mnemonics); - -const allShares = aliceShare.concat(familyShares); - -console.log('Shares used for restoring the master secret:'); -allShares.forEach((s) => console.log(s)); - -const recoveredSecret = slip39.recoverSecret(allShares, passphrase); -console.log('Master secret: ' + masterSecret.slip39DecodeHex()); -console.log('Recovered one: ' + recoveredSecret.slip39DecodeHex()); -assert(masterSecret.slip39DecodeHex() === recoveredSecret.slip39DecodeHex()); -``` - -## Testing - -``` bash - $ npm install - $ npm test - - Basic Tests - Test threshold 1 with 5 of 7 shares of a group combinations - ✓ Test combination 0 1 2 3 4. - ✓ Test combination 0 1 2 3 5. - ✓ Test combination 0 1 2 3 6. - ✓ Test combination 0 1 2 4 5. - ✓ Test combination 0 1 2 4 6. - ✓ Test combination 0 1 2 5 6. - ✓ Test combination 0 1 3 4 5. - ✓ Test combination 0 1 3 4 6. - ✓ Test combination 0 1 3 5 6. - ✓ Test combination 0 1 4 5 6. - ✓ Test combination 0 2 3 4 5. - ✓ Test combination 0 2 3 4 6. - ✓ Test combination 0 2 3 5 6. - ✓ Test combination 0 2 4 5 6. - ✓ Test combination 0 3 4 5 6. - ✓ Test combination 1 2 3 4 5. - ✓ Test combination 1 2 3 4 6. - ✓ Test combination 1 2 3 5 6. - ✓ Test combination 1 2 4 5 6. - ✓ Test combination 1 3 4 5 6. - ✓ Test combination 2 3 4 5 6. - Test passhrase - ✓ should return valid mastersecret when user submits valid passphrse - ✓ should NOT return valid mastersecret when user submits invalid passphrse - ✓ should return valid mastersecret when user does not submit passphrse - Test iteration exponent - ✓ should return valid mastersecret when user apply valid iteration exponent (44ms) - ✓ should throw an Error when user submits invalid iteration exponent - - Group Shares Tests - Test all valid combinations of mnemonics - ✓ should return the valid mastersecret when valid mnemonics used for recovery - Original test vectors Tests - ✓ 1. Valid mnemonic without sharing (128 bits) - ✓ 2. Mnemonic with invalid checksum (128 bits) - ✓ 3. Mnemonic with invalid padding (128 bits) - ✓ 4. Basic sharing 2-of-3 (128 bits) - ✓ 5. Basic sharing 2-of-3 (128 bits) - ✓ 6. Mnemonics with different identifiers (128 bits) - ✓ 7. Mnemonics with different iteration exponents (128 bits) - ✓ 8. Mnemonics with mismatching group thresholds (128 bits) - ✓ 9. Mnemonics with mismatching group counts (128 bits) - ✓ 10. Mnemonics with greater group threshold than group counts (128 bits) - ✓ 11. Mnemonics with duplicate member indices (128 bits) - ✓ 12. Mnemonics with mismatching member thresholds (128 bits) - ✓ 13. Mnemonics giving an invalid digest (128 bits) - ✓ 14. Insufficient number of groups (128 bits, case 1) - ✓ 15. Insufficient number of groups (128 bits, case 2) - ✓ 16. Threshold number of groups, but insufficient number of members in one group (128 bits) - ✓ 17. Threshold number of groups and members in each group (128 bits, case 1) - ✓ 18. Threshold number of groups and members in each group (128 bits, case 2) - ✓ 19. Threshold number of groups and members in each group (128 bits, case 3) - ✓ 20. Valid mnemonic without sharing (256 bits) - ✓ 21. Mnemonic with invalid checksum (256 bits) - ✓ 22. Mnemonic with invalid padding (256 bits) - ✓ 23. Basic sharing 2-of-3 (256 bits) - ✓ 24. Basic sharing 2-of-3 (256 bits) - ✓ 25. Mnemonics with different identifiers (256 bits) - ✓ 26. Mnemonics with different iteration exponents (256 bits) - ✓ 27. Mnemonics with mismatching group thresholds (256 bits) - ✓ 28. Mnemonics with mismatching group counts (256 bits) - ✓ 29. Mnemonics with greater group threshold than group counts (256 bits) - ✓ 30. Mnemonics with duplicate member indices (256 bits) - ✓ 31. Mnemonics with mismatching member thresholds (256 bits) - ✓ 32. Mnemonics giving an invalid digest (256 bits) - ✓ 33. Insufficient number of groups (256 bits, case 1) - ✓ 34. Insufficient number of groups (256 bits, case 2) - ✓ 35. Threshold number of groups, but insufficient number of members in one group (256 bits) - ✓ 36. Threshold number of groups and members in each group (256 bits, case 1) - ✓ 37. Threshold number of groups and members in each group (256 bits, case 2) - ✓ 38. Threshold number of groups and members in each group (256 bits, case 3) - ✓ 39. Mnemonic with insufficient length - ✓ 40. Mnemonic with invalid master secret length - Invalid Shares - ✓ Short master secret - ✓ Odd length master secret - ✓ Group threshold exceeds number of groups - ✓ Invalid group threshold. - ✓ Member threshold exceeds number of members - ✓ Invalid member threshold - ✓ Group with multiple members and threshold 1 - - - 74 passing (477ms) - -``` - -## TODOS - -- [x] Add unit tests. -- [x] Test with the reference code's test vectors. -- [ ] Refactor the helpers to different helper classes e.g. `CryptoHelper()`, `ShamirHelper()` etc. -- [ ] Add `JSON` representation, see [JSON representation](#json-representation) below. -- [ ] Refactor to much simpler code. - -### JSON Representation - -``` json - { - "name": "Slip39", - "threshold": 2, - "shares": [ - { - "name": "My Primary", - "threshold": 1, - "shares": [ - "Primary" - ] - }, - { - "name": "My Secondary", - "threshold": 1, - "shares": [ - "Secondary" - ] - }, - { - "name": "Friends", - "threshold": 3, - "shares": [ - "Alice", - "Bob", - "Charlie", - "David", - "Erin" - ] - }, - { - "name": "Family", - "threshold": 2, - "shares": [ - "Adam", - "Brenda", - "Carol", - "Dan", - "Edward", - "Frank" - ] - } - ] -} -``` -# LICENSE - -CopyRight (c) 2019 Pal Dorogi `"iLap"` - -[MIT License](LICENSE) diff --git a/blue_modules/slip39/babel.config.js b/blue_modules/slip39/babel.config.js deleted file mode 100644 index d53544472..000000000 --- a/blue_modules/slip39/babel.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - "plugins": [ - "babel-plugin-transform-bigint", - ] -} diff --git a/blue_modules/slip39/dist/slip39.js b/blue_modules/slip39/dist/slip39.js deleted file mode 100644 index 5bd1aca37..000000000 --- a/blue_modules/slip39/dist/slip39.js +++ /dev/null @@ -1,236 +0,0 @@ -var maybeJSBI = { - BigInt: function BigInt(a) { - return JSBI.BigInt(a); - }, - toNumber: function toNumber(a) { - return typeof a === "object" ? JSBI.toNumber(a) : Number(a); - }, - add: function add(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.add(a, b) : a + b; - }, - subtract: function subtract(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.subtract(a, b) : a - b; - }, - multiply: function multiply(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.multiply(a, b) : a * b; - }, - divide: function divide(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.divide(a, b) : a / b; - }, - remainder: function remainder(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.remainder(a, b) : a % b; - }, - exponentiate: function exponentiate(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.exponentiate(a, b) : typeof a === "bigint" && typeof b === "bigint" ? new Function("a**b", "a", "b")(a, b) : Math.pow(a, b); - }, - leftShift: function leftShift(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.leftShift(a, b) : a << b; - }, - signedRightShift: function signedRightShift(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.signedRightShift(a, b) : a >> b; - }, - bitwiseAnd: function bitwiseAnd(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.bitwiseAnd(a, b) : a & b; - }, - bitwiseOr: function bitwiseOr(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.bitwiseOr(a, b) : a | b; - }, - bitwiseXor: function bitwiseXor(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.bitwiseXor(a, b) : a ^ b; - }, - lessThan: function lessThan(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.lessThan(a, b) : a < b; - }, - greaterThan: function greaterThan(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.greaterThan(a, b) : a > b; - }, - lessThanOrEqual: function lessOrEqualThan(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.lessThanOrEqual(a, b) : a <= b; - }, - greaterThanOrEqual: function greaterOrEqualThan(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.greaterThanOrEqual(a, b) : a >= b; - }, - equal: function equal(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.equal(a, b) : a === b; - }, - notEqual: function notEqual(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.notEqual(a, b) : a !== b; - }, - unaryMinus: function unaryMinus(a) { - return typeof a === "object" ? JSBI.unaryMinus(a) : -a; - }, - bitwiseNot: function bitwiseNot(a) { - return typeof a === "object" ? JSBI.bitwiseNot(a) : ~a; - } -}; -const JSBI = require("jsbi/dist/jsbi-cjs.js"); - -/* eslint-disable radix */ -const slipHelper = require('./slip39_helper.js'); - -const MAX_DEPTH = 2; -/** - * Slip39Node - * For root node, description refers to the whole set's title e.g. "Hardware wallet X SSSS shares" - * For children nodes, description refers to the group e.g. "Family group: mom, dad, sister, wife" - */ - -class Slip39Node { - constructor(index = 0, description = '', mnemonic = '', children = []) { - this.index = index; - this.description = description; - this.mnemonic = mnemonic; - this.children = children; - } - - get mnemonics() { - if (this.children.length === 0) { - return [this.mnemonic]; - } - - const result = this.children.reduce((prev, item) => { - return prev.concat(item.mnemonics); - }, []); - return result; - } - -} // -// The javascript implementation of the SLIP-0039: Shamir's Secret-Sharing for Mnemonic Codes -// see: https://github.com/satoshilabs/slips/blob/master/slip-0039.md) -// - - -class Slip39 { - constructor({ - iterationExponent = 0, - identifier, - groupCount, - groupThreshold - } = {}) { - this.iterationExponent = iterationExponent; - this.identifier = identifier; - this.groupCount = groupCount; - this.groupThreshold = groupThreshold; - } - - static fromArray(masterSecret, { - passphrase = '', - threshold = 1, - groups = [[1, 1, 'Default 1-of-1 group share']], - iterationExponent = 0, - title = 'My default slip39 shares' - } = {}) { - if (masterSecret.length * 8 < slipHelper.MIN_ENTROPY_BITS) { - throw Error(`The length of the master secret (${masterSecret.length} bytes) must be at least ${slipHelper.bitsToBytes(slipHelper.MIN_ENTROPY_BITS)} bytes.`); - } - - if (masterSecret.length % 2 !== 0) { - throw Error('The length of the master secret in bytes must be an even number.'); - } - - if (!/^[\x20-\x7E]*$/.test(passphrase)) { - throw Error('The passphrase must contain only printable ASCII characters (code points 32-126).'); - } - - if (maybeJSBI.greaterThan(threshold, groups.length)) { - throw Error(`The requested group threshold (${threshold}) must not exceed the number of groups (${groups.length}).`); - } - - groups.forEach(item => { - if (item[0] === 1 && item[1] > 1) { - throw Error(`Creating multiple member shares with member threshold 1 is not allowed. Use 1-of-1 member sharing instead. ${groups.join()}`); - } - }); - const identifier = slipHelper.generateIdentifier(); - const slip = new Slip39({ - iterationExponent: iterationExponent, - identifier: identifier, - groupCount: groups.length, - groupThreshold: threshold - }); - const encryptedMasterSecret = slipHelper.crypt(masterSecret, passphrase, iterationExponent, slip.identifier); - const root = slip.buildRecursive(new Slip39Node(0, title), groups, encryptedMasterSecret, threshold); - slip.root = root; - return slip; - } - - buildRecursive(currentNode, nodes, secret, threshold, index) { - // It means it's a leaf. - if (nodes.length === 0) { - const mnemonic = slipHelper.encodeMnemonic(this.identifier, this.iterationExponent, index, this.groupThreshold, this.groupCount, currentNode.index, threshold, secret); - currentNode.mnemonic = mnemonic; - return currentNode; - } - - const secretShares = slipHelper.splitSecret(threshold, nodes.length, secret); - let children = []; - let idx = 0; - nodes.forEach(item => { - // n=threshold - const n = item[0]; // m=members - - const m = item[1]; // d=description - - const d = item[2] || ''; // Generate leaf members, means their `m` is `0` - - const members = Array().slip39Generate(m, () => [n, 0, d]); - const node = new Slip39Node(idx, d); - const branch = this.buildRecursive(node, members, secretShares[idx], n, currentNode.index); - children = children.concat(branch); - idx = idx + 1; - }); - currentNode.children = children; - return currentNode; - } - - static recoverSecret(mnemonics, passphrase) { - return slipHelper.combineMnemonics(mnemonics, passphrase); - } - - static validateMnemonic(mnemonic) { - return slipHelper.validateMnemonic(mnemonic); - } - - fromPath(path) { - this.validatePath(path); - const children = this.parseChildren(path); - - if (typeof children === 'undefined' || children.length === 0) { - return this.root; - } - - return children.reduce((prev, childNumber) => { - let childrenLen = prev.children.length; - - if (childNumber >= childrenLen) { - throw new Error(`The path index (${childNumber}) exceeds the children index (${childrenLen - 1}).`); - } - - return prev.children[childNumber]; - }, this.root); - } - - validatePath(path) { - if (!path.match(/(^r)(\/\d{1,2}){0,2}$/)) { - throw new Error('Expected valid path e.g. "r/0/0".'); - } - - const depth = path.split('/'); - const pathLength = depth.length - 1; - - if (pathLength > MAX_DEPTH) { - throw new Error(`Path\'s (${path}) max depth (${MAX_DEPTH}) is exceeded (${pathLength}).`); - } - } - - parseChildren(path) { - const splitted = path.split('/').slice(1); - const result = splitted.map(pathFragment => { - return parseInt(pathFragment); - }); - return result; - } - -} - -exports = module.exports = Slip39; \ No newline at end of file diff --git a/blue_modules/slip39/dist/slip39_helper.js b/blue_modules/slip39/dist/slip39_helper.js deleted file mode 100644 index e8a91a9ac..000000000 --- a/blue_modules/slip39/dist/slip39_helper.js +++ /dev/null @@ -1,686 +0,0 @@ -var maybeJSBI = { - BigInt: function BigInt(a) { - return JSBI.BigInt(a); - }, - toNumber: function toNumber(a) { - return typeof a === "object" ? JSBI.toNumber(a) : Number(a); - }, - add: function add(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.add(a, b) : a + b; - }, - subtract: function subtract(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.subtract(a, b) : a - b; - }, - multiply: function multiply(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.multiply(a, b) : a * b; - }, - divide: function divide(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.divide(a, b) : a / b; - }, - remainder: function remainder(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.remainder(a, b) : a % b; - }, - exponentiate: function exponentiate(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.exponentiate(a, b) : typeof a === "bigint" && typeof b === "bigint" ? new Function("a**b", "a", "b")(a, b) : Math.pow(a, b); - }, - leftShift: function leftShift(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.leftShift(a, b) : a << b; - }, - signedRightShift: function signedRightShift(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.signedRightShift(a, b) : a >> b; - }, - bitwiseAnd: function bitwiseAnd(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.bitwiseAnd(a, b) : a & b; - }, - bitwiseOr: function bitwiseOr(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.bitwiseOr(a, b) : a | b; - }, - bitwiseXor: function bitwiseXor(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.bitwiseXor(a, b) : a ^ b; - }, - lessThan: function lessThan(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.lessThan(a, b) : a < b; - }, - greaterThan: function greaterThan(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.greaterThan(a, b) : a > b; - }, - lessThanOrEqual: function lessOrEqualThan(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.lessThanOrEqual(a, b) : a <= b; - }, - greaterThanOrEqual: function greaterOrEqualThan(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.greaterThanOrEqual(a, b) : a >= b; - }, - equal: function equal(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.equal(a, b) : a === b; - }, - notEqual: function notEqual(a, b) { - return typeof a === "object" && typeof b === "object" ? JSBI.notEqual(a, b) : a !== b; - }, - unaryMinus: function unaryMinus(a) { - return typeof a === "object" ? JSBI.unaryMinus(a) : -a; - }, - bitwiseNot: function bitwiseNot(a) { - return typeof a === "object" ? JSBI.bitwiseNot(a) : ~a; - } -}; -const JSBI = require("jsbi/dist/jsbi-cjs.js"); - -/* eslint-disable no-array-constructor */ -const pbkdf2 = require('pbkdf2'); - -const createHmac = require('create-hmac'); - -const randombytes = require('randombytes'); // The length of the radix in bits. - - -const RADIX_BITS = 10; // The length of the random identifier in bits. - -const ID_BITS_LENGTH = 15; // The length of the iteration exponent in bits. - -const ITERATION_EXP_BITS_LENGTH = 5; // The length of the random identifier and iteration exponent in words. - -const ITERATION_EXP_WORDS_LENGTH = parseInt((ID_BITS_LENGTH + ITERATION_EXP_BITS_LENGTH + RADIX_BITS - 1) / RADIX_BITS, 10); // The maximum iteration exponent - -const MAX_ITERATION_EXP = Math.pow(2, ITERATION_EXP_BITS_LENGTH); // The maximum number of shares that can be created. - -const MAX_SHARE_COUNT = 16; // The length of the RS1024 checksum in words. - -const CHECKSUM_WORDS_LENGTH = 3; // The length of the digest of the shared secret in bytes. - -const DIGEST_LENGTH = 4; // The customization string used in the RS1024 checksum and in the PBKDF2 salt. - -const SALT_STRING = 'shamir'; // The minimum allowed entropy of the master secret. - -const MIN_ENTROPY_BITS = 128; // The minimum allowed length of the mnemonic in words. - -const METADATA_WORDS_LENGTH = ITERATION_EXP_WORDS_LENGTH + 2 + CHECKSUM_WORDS_LENGTH; // The length of the mnemonic in words without the share value. - -const MNEMONICS_WORDS_LENGTH = parseInt(METADATA_WORDS_LENGTH + (MIN_ENTROPY_BITS + RADIX_BITS - 1) / RADIX_BITS, 10); // The minimum number of iterations to use in PBKDF2. - -const ITERATION_COUNT = 10000; // The number of rounds to use in the Feistel cipher. - -const ROUND_COUNT = 4; // The index of the share containing the digest of the shared secret. - -const DIGEST_INDEX = 254; // The index of the share containing the shared secret. - -const SECRET_INDEX = 255; // -// Helper functions for SLIP39 implementation. -// - -String.prototype.slip39EncodeHex = function () { - let bytes = []; - - for (let i = 0; i < this.length; ++i) { - bytes.push(this.charCodeAt(i)); - } - - return bytes; -}; - -Array.prototype.slip39DecodeHex = function () { - let str = []; - const hex = this.toString().split(','); - - for (let i = 0; i < hex.length; i++) { - str.push(String.fromCharCode(hex[i])); - } - - return str.toString().replace(/,/g, ''); -}; - -Array.prototype.slip39Generate = function (m, v = _ => _) { - let n = m || this.length; - - for (let i = 0; i < n; i++) { - this[i] = v(i); - } - - return this; -}; - -Array.prototype.toHexString = function () { - return Array.prototype.map.call(this, function (byte) { - return ('0' + (byte & 0xFF).toString(16)).slice(-2); - }).join(''); -}; - -Array.prototype.toByteArray = function (hexString) { - for (let i = 0; i < hexString.length; i = i + 2) { - this.push(parseInt(hexString.substr(i, 2), 16)); - } - - return this; -}; - -const BIGINT_WORD_BITS = JSBI.BigInt(8); - -function decodeBigInt(bytes) { - let result = JSBI.BigInt(0); - - for (let i = 0; i < bytes.length; i++) { - let b = JSBI.BigInt(bytes[bytes.length - i - 1]); - result = JSBI.add(result, JSBI.leftShift(b, JSBI.multiply(BIGINT_WORD_BITS, JSBI.BigInt(i)))); - } - - return result; -} - -function encodeBigInt(number, paddedLength = 0) { - let num = number; - const BYTE_MASK = JSBI.BigInt(0xff); - const BIGINT_ZERO = JSBI.BigInt(0); - let result = new Array(0); - - while (maybeJSBI.greaterThan(num, BIGINT_ZERO)) { - let i = parseInt(maybeJSBI.bitwiseAnd(num, BYTE_MASK), 10); - result.unshift(i); - num = maybeJSBI.signedRightShift(num, BIGINT_WORD_BITS); - } // Zero padding to the length - - - for (let i = result.length; maybeJSBI.lessThan(i, paddedLength); _x = i, i = maybeJSBI.add(i, maybeJSBI.BigInt(1)), _x) { - var _x; - - result.unshift(0); - } - - if (paddedLength !== 0 && maybeJSBI.greaterThan(result.length, paddedLength)) { - throw new Error(`Error in encoding BigInt value, expected less than ${paddedLength} length value, got ${result.length}`); - } - - return result; -} - -function bitsToBytes(n) { - const res = (n + 7) / 8; - const b = parseInt(res, RADIX_BITS); - return b; -} - -function bitsToWords(n) { - const res = (n + RADIX_BITS - 1) / RADIX_BITS; - const b = parseInt(res, RADIX_BITS); - return b; -} // -// Returns a randomly generated integer in the range 0, ... , 2**ID_LENGTH_BITS - 1. -// - - -function randomBytes(length = 32) { - let randoms = randombytes(length); - return Array.prototype.slice.call(randoms, 0); -} // -// The round function used internally by the Feistel cipher. -// - - -function roundFunction(round, passphrase, exp, salt, secret) { - const saltedSecret = salt.concat(secret); - const roundedPhrase = [round].concat(passphrase); - const count = (ITERATION_COUNT << exp) / ROUND_COUNT; - const key = pbkdf2.pbkdf2Sync(Buffer.from(roundedPhrase), Buffer.from(saltedSecret), count, secret.length, 'sha256'); - return Array.prototype.slice.call(key, 0); -} - -function crypt(masterSecret, passphrase, iterationExponent, identifier, encrypt = true) { - // Iteration exponent validated here. - if (iterationExponent < 0 || iterationExponent > MAX_ITERATION_EXP) { - throw Error(`Invalid iteration exponent (${iterationExponent}). Expected between 0 and ${MAX_ITERATION_EXP}`); - } - - let IL = masterSecret.slice().slice(0, masterSecret.length / 2); - let IR = masterSecret.slice().slice(masterSecret.length / 2); - const pwd = passphrase.slip39EncodeHex(); - const salt = getSalt(identifier); - let range = Array().slip39Generate(ROUND_COUNT); - range = encrypt ? range : range.reverse(); - range.forEach(round => { - const f = roundFunction(round, pwd, iterationExponent, salt, IR); - const t = xor(IL, f); - IL = IR; - IR = t; - }); - return IR.concat(IL); -} - -function createDigest(randomData, sharedSecret) { - const hmac = createHmac('sha256', Buffer.from(randomData)); - hmac.update(Buffer.from(sharedSecret)); - let result = hmac.digest(); - result = result.slice(0, 4); - return Array.prototype.slice.call(result, 0); -} - -function splitSecret(threshold, shareCount, sharedSecret) { - if (threshold <= 0) { - throw Error(`The requested threshold (${threshold}) must be a positive integer.`); - } - - if (threshold > shareCount) { - throw Error(`The requested threshold (${threshold}) must not exceed the number of shares (${shareCount}).`); - } - - if (shareCount > MAX_SHARE_COUNT) { - throw Error(`The requested number of shares (${shareCount}) must not exceed ${MAX_SHARE_COUNT}.`); - } // If the threshold is 1, then the digest of the shared secret is not used. - - - if (threshold === 1) { - return Array().slip39Generate(shareCount, () => sharedSecret); - } - - const randomShareCount = threshold - 2; - const randomPart = randomBytes(sharedSecret.length - DIGEST_LENGTH); - const digest = createDigest(randomPart, sharedSecret); - let baseShares = new Map(); - let shares = []; - - if (randomShareCount) { - shares = Array().slip39Generate(randomShareCount, () => randomBytes(sharedSecret.length)); - shares.forEach((item, idx) => { - baseShares.set(idx, item); - }); - } - - baseShares.set(DIGEST_INDEX, digest.concat(randomPart)); - baseShares.set(SECRET_INDEX, sharedSecret); - - for (let i = randomShareCount; i < shareCount; i++) { - const rr = interpolate(baseShares, i); - shares.push(rr); - } - - return shares; -} // -// Returns a randomly generated integer in the range 0, ... , 2**ID_BITS_LENGTH - 1. -// - - -function generateIdentifier() { - const byte = bitsToBytes(ID_BITS_LENGTH); - const bits = ID_BITS_LENGTH % 8; - const identifier = randomBytes(byte); - identifier[0] = identifier[0] & (1 << bits) - 1; - return identifier; -} - -function xor(a, b) { - if (maybeJSBI.notEqual(a.length, b.length)) { - throw new Error(`Invalid padding in mnemonic or insufficient length of mnemonics (${a.length} or ${b.length})`); - } - - return Array().slip39Generate(a.length, i => maybeJSBI.bitwiseXor(a[i], b[i])); -} - -function getSalt(identifier) { - const salt = SALT_STRING.slip39EncodeHex(); - return salt.concat(identifier); -} - -function interpolate(shares, x) { - let xCoord = new Set(shares.keys()); - let arr = Array.from(shares.values(), v => v.length); - let sharesValueLengths = new Set(arr); - - if (sharesValueLengths.size !== 1) { - throw new Error('Invalid set of shares. All share values must have the same length.'); - } - - if (xCoord.has(x)) { - shares.forEach((v, k) => { - if (maybeJSBI.equal(k, x)) { - return v; - } - }); - } // Logarithm of the product of (x_i - x) for i = 1, ... , k. - - - let logProd = 0; - shares.forEach((v, k) => { - logProd = logProd + LOG_TABLE[maybeJSBI.bitwiseXor(k, x)]; - }); - let results = Array().slip39Generate(sharesValueLengths.values().next().value, () => 0); - shares.forEach((v, k) => { - // The logarithm of the Lagrange basis polynomial evaluated at x. - let sum = 0; - shares.forEach((vv, kk) => { - sum = sum + LOG_TABLE[maybeJSBI.bitwiseXor(k, kk)]; - }); // FIXME: -18 % 255 = 237. IT shoulud be 237 and not -18 as it's - // implemented in javascript. - - const basis = (logProd - LOG_TABLE[maybeJSBI.bitwiseXor(k, x)] - sum) % 255; - const logBasisEval = basis < 0 ? 255 + basis : basis; - v.forEach((item, idx) => { - const shareVal = item; - const intermediateSum = results[idx]; - const r = shareVal !== 0 ? EXP_TABLE[(LOG_TABLE[shareVal] + logBasisEval) % 255] : 0; - const res = maybeJSBI.bitwiseXor(intermediateSum, r); - results[idx] = res; - }); - }); - return results; -} - -function rs1024Polymod(data) { - const GEN = [0xE0E040, 0x1C1C080, 0x3838100, 0x7070200, 0xE0E0009, 0x1C0C2412, 0x38086C24, 0x3090FC48, 0x21B1F890, 0x3F3F120]; - let chk = 1; - data.forEach(byte => { - const b = chk >> 20; - chk = (chk & 0xFFFFF) << 10 ^ byte; - - for (let i = 0; i < 10; i++) { - let gen = (b >> i & 1) !== 0 ? GEN[i] : 0; - chk = chk ^ gen; - } - }); - return chk; -} - -function rs1024CreateChecksum(data) { - const values = SALT_STRING.slip39EncodeHex().concat(data).concat(Array().slip39Generate(CHECKSUM_WORDS_LENGTH, () => 0)); - const polymod = rs1024Polymod(values) ^ 1; - const result = Array().slip39Generate(CHECKSUM_WORDS_LENGTH, i => polymod >> 10 * i & 1023).reverse(); - return result; -} - -function rs1024VerifyChecksum(data) { - return rs1024Polymod(SALT_STRING.slip39EncodeHex().concat(data)) === 1; -} // -// Converts a list of base 1024 indices in big endian order to an integer value. -// - - -function intFromIndices(indices) { - let value = JSBI.BigInt(0); - const radix = JSBI.BigInt(Math.pow(2, RADIX_BITS)); - indices.forEach(index => { - value = JSBI.add(maybeJSBI.multiply(value, radix), JSBI.BigInt(index)); - }); - return value; -} // -// Converts a Big integer value to indices in big endian order. -// - - -function intToIndices(value, length, bits) { - const mask = JSBI.BigInt((1 << bits) - 1); - const result = Array().slip39Generate(length, i => parseInt(JSBI.bitwiseAnd(JSBI.signedRightShift(value, JSBI.multiply(JSBI.BigInt(i), JSBI.BigInt(bits))), mask), 10)); - return result.reverse(); -} - -function mnemonicFromIndices(indices) { - const result = indices.map(index => { - return WORD_LIST[index]; - }); - return result.toString().split(',').join(' '); -} - -function mnemonicToIndices(mnemonic) { - if (typeof mnemonic !== 'string') { - throw new Error(`Mnemonic expected to be typeof string with white space separated words. Instead found typeof ${typeof mnemonic}.`); - } - - const words = mnemonic.toLowerCase().split(' '); - const result = words.reduce((prev, item) => { - const index = WORD_LIST_MAP[item]; - - if (typeof index === 'undefined') { - throw new Error(`Invalid mnemonic word ${item}.`); - } - - return prev.concat(index); - }, []); - return result; -} - -function recoverSecret(threshold, shares) { - // If the threshold is 1, then the digest of the shared secret is not used. - if (threshold === 1) { - return shares.values().next().value; - } - - const sharedSecret = interpolate(shares, SECRET_INDEX); - const digestShare = interpolate(shares, DIGEST_INDEX); - const digest = digestShare.slice(0, DIGEST_LENGTH); - const randomPart = digestShare.slice(DIGEST_LENGTH); - const recoveredDigest = createDigest(randomPart, sharedSecret); - - if (!listsAreEqual(digest, recoveredDigest)) { - throw new Error('Invalid digest of the shared secret.'); - } - - return sharedSecret; -} // -// Combines mnemonic shares to obtain the master secret which was previously -// split using Shamir's secret sharing scheme. -// - - -function combineMnemonics(mnemonics, passphrase = '') { - if (mnemonics === null || mnemonics.length === 0) { - throw new Error('The list of mnemonics is empty.'); - } - - const decoded = decodeMnemonics(mnemonics); - const identifier = decoded.identifier; - const iterationExponent = decoded.iterationExponent; - const groupThreshold = decoded.groupThreshold; - const groupCount = decoded.groupCount; - const groups = decoded.groups; - - if (maybeJSBI.lessThan(groups.size, groupThreshold)) { - throw new Error(`Insufficient number of mnemonic groups (${groups.size}). The required number of groups is ${groupThreshold}.`); - } - - if (maybeJSBI.notEqual(groups.size, groupThreshold)) { - throw new Error(`Wrong number of mnemonic groups. Expected ${groupThreshold} groups, but ${groups.size} were provided.`); - } - - let allShares = new Map(); - groups.forEach((members, groupIndex) => { - const threshold = members.keys().next().value; - const shares = members.values().next().value; - - if (maybeJSBI.notEqual(shares.size, threshold)) { - const prefix = groupPrefix(identifier, iterationExponent, groupIndex, groupThreshold, groupCount); - throw new Error(`Wrong number of mnemonics. Expected ${threshold} mnemonics starting with "${mnemonicFromIndices(prefix)}", \n but ${shares.size} were provided.`); - } - - const recovered = recoverSecret(threshold, shares); - allShares.set(groupIndex, recovered); - }); - const ems = recoverSecret(groupThreshold, allShares); - const id = intToIndices(JSBI.BigInt(identifier), ITERATION_EXP_WORDS_LENGTH, 8); - const ms = crypt(ems, passphrase, iterationExponent, id, false); - return ms; -} - -function decodeMnemonics(mnemonics) { - if (!(mnemonics instanceof Array)) { - throw new Error('Mnemonics should be an array of strings'); - } - - const identifiers = new Set(); - const iterationExponents = new Set(); - const groupThresholds = new Set(); - const groupCounts = new Set(); - const groups = new Map(); - mnemonics.forEach(mnemonic => { - const decoded = decodeMnemonic(mnemonic); - identifiers.add(decoded.identifier); - iterationExponents.add(decoded.iterationExponent); - const groupIndex = decoded.groupIndex; - groupThresholds.add(decoded.groupThreshold); - groupCounts.add(decoded.groupCount); - const memberIndex = decoded.memberIndex; - const memberThreshold = decoded.memberThreshold; - const share = decoded.share; - const group = !groups.has(groupIndex) ? new Map() : groups.get(groupIndex); - const member = !group.has(memberThreshold) ? new Map() : group.get(memberThreshold); - member.set(memberIndex, share); - group.set(memberThreshold, member); - - if (group.size !== 1) { - throw new Error('Invalid set of mnemonics. All mnemonics in a group must have the same member threshold.'); - } - - groups.set(groupIndex, group); - }); - - if (identifiers.size !== 1 || iterationExponents.size !== 1) { - throw new Error(`Invalid set of mnemonics. All mnemonics must begin with the same ${ITERATION_EXP_WORDS_LENGTH} words.`); - } - - if (groupThresholds.size !== 1) { - throw new Error('Invalid set of mnemonics. All mnemonics must have the same group threshold.'); - } - - if (groupCounts.size !== 1) { - throw new Error('Invalid set of mnemonics. All mnemonics must have the same group count.'); - } - - return { - identifier: identifiers.values().next().value, - iterationExponent: iterationExponents.values().next().value, - groupThreshold: groupThresholds.values().next().value, - groupCount: groupCounts.values().next().value, - groups: groups - }; -} // -// Converts a share mnemonic to share data. -// - - -function decodeMnemonic(mnemonic) { - const data = mnemonicToIndices(mnemonic); - - if (maybeJSBI.lessThan(data.length, MNEMONICS_WORDS_LENGTH)) { - throw new Error(`Invalid mnemonic length. The length of each mnemonic must be at least ${MNEMONICS_WORDS_LENGTH} words.`); - } - - const paddingLen = RADIX_BITS * (data.length - METADATA_WORDS_LENGTH) % 16; - - if (paddingLen > 8) { - throw new Error('Invalid mnemonic length.'); - } - - if (!rs1024VerifyChecksum(data)) { - throw new Error('Invalid mnemonic checksum'); - } - - const idExpInt = parseInt(intFromIndices(data.slice(0, ITERATION_EXP_WORDS_LENGTH)), 10); - const identifier = idExpInt >> ITERATION_EXP_BITS_LENGTH; - const iterationExponent = idExpInt & (1 << ITERATION_EXP_BITS_LENGTH) - 1; - const tmp = intFromIndices(data.slice(ITERATION_EXP_WORDS_LENGTH, ITERATION_EXP_WORDS_LENGTH + 2)); - const indices = intToIndices(tmp, 5, 4); - const groupIndex = indices[0]; - const groupThreshold = indices[1]; - const groupCount = indices[2]; - const memberIndex = indices[3]; - const memberThreshold = indices[4]; - const valueData = data.slice(ITERATION_EXP_WORDS_LENGTH + 2, data.length - CHECKSUM_WORDS_LENGTH); - - if (groupCount < groupThreshold) { - throw new Error(`Invalid mnemonic: ${mnemonic}.\n Group threshold (${groupThreshold}) cannot be greater than group count (${groupCount}).`); - } - - const valueInt = intFromIndices(valueData); - - try { - const valueByteCount = bitsToBytes(RADIX_BITS * valueData.length - paddingLen); - const share = encodeBigInt(valueInt, valueByteCount); - return { - identifier: identifier, - iterationExponent: iterationExponent, - groupIndex: groupIndex, - groupThreshold: groupThreshold + 1, - groupCount: groupCount + 1, - memberIndex: memberIndex, - memberThreshold: memberThreshold + 1, - share: share - }; - } catch (e) { - throw new Error(`Invalid mnemonic padding (${e})`); - } -} - -function validateMnemonic(mnemonic) { - try { - decodeMnemonic(mnemonic); - return true; - } catch (error) { - return false; - } -} - -function groupPrefix(identifier, iterationExponent, groupIndex, groupThreshold, groupCount) { - const idExpInt = JSBI.BigInt((identifier << ITERATION_EXP_BITS_LENGTH) + iterationExponent); - const indc = intToIndices(idExpInt, ITERATION_EXP_WORDS_LENGTH, RADIX_BITS); - const indc2 = (groupIndex << 6) + (groupThreshold - 1 << 2) + (groupCount - 1 >> 2); - indc.push(indc2); - return indc; -} - -function listsAreEqual(a, b) { - if (a === null || b === null || maybeJSBI.notEqual(a.length, b.length)) { - return false; - } - - let i = 0; - return a.every(item => { - return maybeJSBI.equal(b[i++], item); - }); -} // -// Converts share data to a share mnemonic. -// - - -function encodeMnemonic(identifier, iterationExponent, groupIndex, groupThreshold, groupCount, memberIndex, memberThreshold, value) { - // Convert the share value from bytes to wordlist indices. - const valueWordCount = bitsToWords(value.length * 8); - const valueInt = decodeBigInt(value); - let newIdentifier = parseInt(decodeBigInt(identifier), 10); - const gp = groupPrefix(newIdentifier, iterationExponent, groupIndex, groupThreshold, groupCount); - const tp = intToIndices(valueInt, valueWordCount, RADIX_BITS); - const calc = ((groupCount - 1 & 3) << 8) + (memberIndex << 4) + (memberThreshold - 1); - gp.push(calc); - const shareData = gp.concat(tp); - const checksum = rs1024CreateChecksum(shareData); - return mnemonicFromIndices(shareData.concat(checksum)); -} // The precomputed exponent and log tables. -// ``` -// const exp = List.filled(255, 0) -// const log = List.filled(256, 0) -// const poly = 1 -// -// for (let i = 0; i < exp.length; i++) { -// exp[i] = poly -// log[poly] = i -// // Multiply poly by the polynomial x + 1. -// poly = (poly << 1) ^ poly -// // Reduce poly by x^8 + x^4 + x^3 + x + 1. -// if (poly & 0x100 === 0x100) poly ^= 0x11B -// } -// ``` - - -const EXP_TABLE = [1, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19, 53, 95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102, 170, 229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171, 230, 49, 83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178, 205, 76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120, 136, 131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154, 181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163, 254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, 96, 160, 251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63, 65, 195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191, 218, 117, 159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122, 142, 137, 128, 155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67, 197, 84, 252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70, 202, 69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81, 243, 14, 18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242, 13, 23, 57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82, 246]; -const LOG_TABLE = [0, 0, 25, 1, 50, 2, 26, 198, 75, 199, 27, 104, 51, 238, 223, 3, 100, 4, 224, 14, 52, 141, 129, 239, 76, 113, 8, 200, 248, 105, 28, 193, 125, 194, 29, 181, 249, 185, 39, 106, 77, 228, 166, 114, 154, 201, 9, 120, 101, 47, 138, 5, 33, 15, 225, 36, 18, 240, 130, 69, 53, 147, 218, 142, 150, 143, 219, 189, 54, 208, 206, 148, 19, 92, 210, 241, 64, 70, 131, 56, 102, 221, 253, 48, 191, 6, 139, 98, 179, 37, 226, 152, 34, 136, 145, 16, 126, 110, 72, 195, 163, 182, 30, 66, 58, 107, 40, 84, 250, 133, 61, 186, 43, 121, 10, 21, 155, 159, 94, 202, 78, 212, 172, 229, 243, 115, 167, 87, 175, 88, 168, 80, 244, 234, 214, 116, 79, 174, 233, 213, 231, 230, 173, 232, 44, 215, 117, 122, 235, 22, 11, 245, 89, 203, 95, 176, 156, 169, 81, 160, 127, 12, 246, 111, 23, 196, 73, 236, 216, 67, 31, 45, 164, 118, 123, 183, 204, 187, 62, 90, 251, 96, 177, 134, 59, 82, 161, 108, 170, 85, 41, 157, 151, 178, 135, 144, 97, 190, 220, 252, 188, 149, 207, 205, 55, 63, 91, 209, 83, 57, 132, 60, 65, 162, 109, 71, 20, 42, 158, 93, 86, 242, 211, 171, 68, 17, 146, 217, 35, 32, 46, 137, 180, 124, 184, 38, 119, 153, 227, 165, 103, 74, 237, 222, 197, 49, 254, 24, 13, 99, 140, 128, 192, 247, 112, 7]; // -// SLIP39 wordlist -// - -const WORD_LIST = ['academic', 'acid', 'acne', 'acquire', 'acrobat', 'activity', 'actress', 'adapt', 'adequate', 'adjust', 'admit', 'adorn', 'adult', 'advance', 'advocate', 'afraid', 'again', 'agency', 'agree', 'aide', 'aircraft', 'airline', 'airport', 'ajar', 'alarm', 'album', 'alcohol', 'alien', 'alive', 'alpha', 'already', 'alto', 'aluminum', 'always', 'amazing', 'ambition', 'amount', 'amuse', 'analysis', 'anatomy', 'ancestor', 'ancient', 'angel', 'angry', 'animal', 'answer', 'antenna', 'anxiety', 'apart', 'aquatic', 'arcade', 'arena', 'argue', 'armed', 'artist', 'artwork', 'aspect', 'auction', 'august', 'aunt', 'average', 'aviation', 'avoid', 'award', 'away', 'axis', 'axle', 'beam', 'beard', 'beaver', 'become', 'bedroom', 'behavior', 'being', 'believe', 'belong', 'benefit', 'best', 'beyond', 'bike', 'biology', 'birthday', 'bishop', 'black', 'blanket', 'blessing', 'blimp', 'blind', 'blue', 'body', 'bolt', 'boring', 'born', 'both', 'boundary', 'bracelet', 'branch', 'brave', 'breathe', 'briefing', 'broken', 'brother', 'browser', 'bucket', 'budget', 'building', 'bulb', 'bulge', 'bumpy', 'bundle', 'burden', 'burning', 'busy', 'buyer', 'cage', 'calcium', 'camera', 'campus', 'canyon', 'capacity', 'capital', 'capture', 'carbon', 'cards', 'careful', 'cargo', 'carpet', 'carve', 'category', 'cause', 'ceiling', 'center', 'ceramic', 'champion', 'change', 'charity', 'check', 'chemical', 'chest', 'chew', 'chubby', 'cinema', 'civil', 'class', 'clay', 'cleanup', 'client', 'climate', 'clinic', 'clock', 'clogs', 'closet', 'clothes', 'club', 'cluster', 'coal', 'coastal', 'coding', 'column', 'company', 'corner', 'costume', 'counter', 'course', 'cover', 'cowboy', 'cradle', 'craft', 'crazy', 'credit', 'cricket', 'criminal', 'crisis', 'critical', 'crowd', 'crucial', 'crunch', 'crush', 'crystal', 'cubic', 'cultural', 'curious', 'curly', 'custody', 'cylinder', 'daisy', 'damage', 'dance', 'darkness', 'database', 'daughter', 'deadline', 'deal', 'debris', 'debut', 'decent', 'decision', 'declare', 'decorate', 'decrease', 'deliver', 'demand', 'density', 'deny', 'depart', 'depend', 'depict', 'deploy', 'describe', 'desert', 'desire', 'desktop', 'destroy', 'detailed', 'detect', 'device', 'devote', 'diagnose', 'dictate', 'diet', 'dilemma', 'diminish', 'dining', 'diploma', 'disaster', 'discuss', 'disease', 'dish', 'dismiss', 'display', 'distance', 'dive', 'divorce', 'document', 'domain', 'domestic', 'dominant', 'dough', 'downtown', 'dragon', 'dramatic', 'dream', 'dress', 'drift', 'drink', 'drove', 'drug', 'dryer', 'duckling', 'duke', 'duration', 'dwarf', 'dynamic', 'early', 'earth', 'easel', 'easy', 'echo', 'eclipse', 'ecology', 'edge', 'editor', 'educate', 'either', 'elbow', 'elder', 'election', 'elegant', 'element', 'elephant', 'elevator', 'elite', 'else', 'email', 'emerald', 'emission', 'emperor', 'emphasis', 'employer', 'empty', 'ending', 'endless', 'endorse', 'enemy', 'energy', 'enforce', 'engage', 'enjoy', 'enlarge', 'entrance', 'envelope', 'envy', 'epidemic', 'episode', 'equation', 'equip', 'eraser', 'erode', 'escape', 'estate', 'estimate', 'evaluate', 'evening', 'evidence', 'evil', 'evoke', 'exact', 'example', 'exceed', 'exchange', 'exclude', 'excuse', 'execute', 'exercise', 'exhaust', 'exotic', 'expand', 'expect', 'explain', 'express', 'extend', 'extra', 'eyebrow', 'facility', 'fact', 'failure', 'faint', 'fake', 'false', 'family', 'famous', 'fancy', 'fangs', 'fantasy', 'fatal', 'fatigue', 'favorite', 'fawn', 'fiber', 'fiction', 'filter', 'finance', 'findings', 'finger', 'firefly', 'firm', 'fiscal', 'fishing', 'fitness', 'flame', 'flash', 'flavor', 'flea', 'flexible', 'flip', 'float', 'floral', 'fluff', 'focus', 'forbid', 'force', 'forecast', 'forget', 'formal', 'fortune', 'forward', 'founder', 'fraction', 'fragment', 'frequent', 'freshman', 'friar', 'fridge', 'friendly', 'frost', 'froth', 'frozen', 'fumes', 'funding', 'furl', 'fused', 'galaxy', 'game', 'garbage', 'garden', 'garlic', 'gasoline', 'gather', 'general', 'genius', 'genre', 'genuine', 'geology', 'gesture', 'glad', 'glance', 'glasses', 'glen', 'glimpse', 'goat', 'golden', 'graduate', 'grant', 'grasp', 'gravity', 'gray', 'greatest', 'grief', 'grill', 'grin', 'grocery', 'gross', 'group', 'grownup', 'grumpy', 'guard', 'guest', 'guilt', 'guitar', 'gums', 'hairy', 'hamster', 'hand', 'hanger', 'harvest', 'have', 'havoc', 'hawk', 'hazard', 'headset', 'health', 'hearing', 'heat', 'helpful', 'herald', 'herd', 'hesitate', 'hobo', 'holiday', 'holy', 'home', 'hormone', 'hospital', 'hour', 'huge', 'human', 'humidity', 'hunting', 'husband', 'hush', 'husky', 'hybrid', 'idea', 'identify', 'idle', 'image', 'impact', 'imply', 'improve', 'impulse', 'include', 'income', 'increase', 'index', 'indicate', 'industry', 'infant', 'inform', 'inherit', 'injury', 'inmate', 'insect', 'inside', 'install', 'intend', 'intimate', 'invasion', 'involve', 'iris', 'island', 'isolate', 'item', 'ivory', 'jacket', 'jerky', 'jewelry', 'join', 'judicial', 'juice', 'jump', 'junction', 'junior', 'junk', 'jury', 'justice', 'kernel', 'keyboard', 'kidney', 'kind', 'kitchen', 'knife', 'knit', 'laden', 'ladle', 'ladybug', 'lair', 'lamp', 'language', 'large', 'laser', 'laundry', 'lawsuit', 'leader', 'leaf', 'learn', 'leaves', 'lecture', 'legal', 'legend', 'legs', 'lend', 'length', 'level', 'liberty', 'library', 'license', 'lift', 'likely', 'lilac', 'lily', 'lips', 'liquid', 'listen', 'literary', 'living', 'lizard', 'loan', 'lobe', 'location', 'losing', 'loud', 'loyalty', 'luck', 'lunar', 'lunch', 'lungs', 'luxury', 'lying', 'lyrics', 'machine', 'magazine', 'maiden', 'mailman', 'main', 'makeup', 'making', 'mama', 'manager', 'mandate', 'mansion', 'manual', 'marathon', 'march', 'market', 'marvel', 'mason', 'material', 'math', 'maximum', 'mayor', 'meaning', 'medal', 'medical', 'member', 'memory', 'mental', 'merchant', 'merit', 'method', 'metric', 'midst', 'mild', 'military', 'mineral', 'minister', 'miracle', 'mixed', 'mixture', 'mobile', 'modern', 'modify', 'moisture', 'moment', 'morning', 'mortgage', 'mother', 'mountain', 'mouse', 'move', 'much', 'mule', 'multiple', 'muscle', 'museum', 'music', 'mustang', 'nail', 'national', 'necklace', 'negative', 'nervous', 'network', 'news', 'nuclear', 'numb', 'numerous', 'nylon', 'oasis', 'obesity', 'object', 'observe', 'obtain', 'ocean', 'often', 'olympic', 'omit', 'oral', 'orange', 'orbit', 'order', 'ordinary', 'organize', 'ounce', 'oven', 'overall', 'owner', 'paces', 'pacific', 'package', 'paid', 'painting', 'pajamas', 'pancake', 'pants', 'papa', 'paper', 'parcel', 'parking', 'party', 'patent', 'patrol', 'payment', 'payroll', 'peaceful', 'peanut', 'peasant', 'pecan', 'penalty', 'pencil', 'percent', 'perfect', 'permit', 'petition', 'phantom', 'pharmacy', 'photo', 'phrase', 'physics', 'pickup', 'picture', 'piece', 'pile', 'pink', 'pipeline', 'pistol', 'pitch', 'plains', 'plan', 'plastic', 'platform', 'playoff', 'pleasure', 'plot', 'plunge', 'practice', 'prayer', 'preach', 'predator', 'pregnant', 'premium', 'prepare', 'presence', 'prevent', 'priest', 'primary', 'priority', 'prisoner', 'privacy', 'prize', 'problem', 'process', 'profile', 'program', 'promise', 'prospect', 'provide', 'prune', 'public', 'pulse', 'pumps', 'punish', 'puny', 'pupal', 'purchase', 'purple', 'python', 'quantity', 'quarter', 'quick', 'quiet', 'race', 'racism', 'radar', 'railroad', 'rainbow', 'raisin', 'random', 'ranked', 'rapids', 'raspy', 'reaction', 'realize', 'rebound', 'rebuild', 'recall', 'receiver', 'recover', 'regret', 'regular', 'reject', 'relate', 'remember', 'remind', 'remove', 'render', 'repair', 'repeat', 'replace', 'require', 'rescue', 'research', 'resident', 'response', 'result', 'retailer', 'retreat', 'reunion', 'revenue', 'review', 'reward', 'rhyme', 'rhythm', 'rich', 'rival', 'river', 'robin', 'rocky', 'romantic', 'romp', 'roster', 'round', 'royal', 'ruin', 'ruler', 'rumor', 'sack', 'safari', 'salary', 'salon', 'salt', 'satisfy', 'satoshi', 'saver', 'says', 'scandal', 'scared', 'scatter', 'scene', 'scholar', 'science', 'scout', 'scramble', 'screw', 'script', 'scroll', 'seafood', 'season', 'secret', 'security', 'segment', 'senior', 'shadow', 'shaft', 'shame', 'shaped', 'sharp', 'shelter', 'sheriff', 'short', 'should', 'shrimp', 'sidewalk', 'silent', 'silver', 'similar', 'simple', 'single', 'sister', 'skin', 'skunk', 'slap', 'slavery', 'sled', 'slice', 'slim', 'slow', 'slush', 'smart', 'smear', 'smell', 'smirk', 'smith', 'smoking', 'smug', 'snake', 'snapshot', 'sniff', 'society', 'software', 'soldier', 'solution', 'soul', 'source', 'space', 'spark', 'speak', 'species', 'spelling', 'spend', 'spew', 'spider', 'spill', 'spine', 'spirit', 'spit', 'spray', 'sprinkle', 'square', 'squeeze', 'stadium', 'staff', 'standard', 'starting', 'station', 'stay', 'steady', 'step', 'stick', 'stilt', 'story', 'strategy', 'strike', 'style', 'subject', 'submit', 'sugar', 'suitable', 'sunlight', 'superior', 'surface', 'surprise', 'survive', 'sweater', 'swimming', 'swing', 'switch', 'symbolic', 'sympathy', 'syndrome', 'system', 'tackle', 'tactics', 'tadpole', 'talent', 'task', 'taste', 'taught', 'taxi', 'teacher', 'teammate', 'teaspoon', 'temple', 'tenant', 'tendency', 'tension', 'terminal', 'testify', 'texture', 'thank', 'that', 'theater', 'theory', 'therapy', 'thorn', 'threaten', 'thumb', 'thunder', 'ticket', 'tidy', 'timber', 'timely', 'ting', 'tofu', 'together', 'tolerate', 'total', 'toxic', 'tracks', 'traffic', 'training', 'transfer', 'trash', 'traveler', 'treat', 'trend', 'trial', 'tricycle', 'trip', 'triumph', 'trouble', 'true', 'trust', 'twice', 'twin', 'type', 'typical', 'ugly', 'ultimate', 'umbrella', 'uncover', 'undergo', 'unfair', 'unfold', 'unhappy', 'union', 'universe', 'unkind', 'unknown', 'unusual', 'unwrap', 'upgrade', 'upstairs', 'username', 'usher', 'usual', 'valid', 'valuable', 'vampire', 'vanish', 'various', 'vegan', 'velvet', 'venture', 'verdict', 'verify', 'very', 'veteran', 'vexed', 'victim', 'video', 'view', 'vintage', 'violence', 'viral', 'visitor', 'visual', 'vitamins', 'vocal', 'voice', 'volume', 'voter', 'voting', 'walnut', 'warmth', 'warn', 'watch', 'wavy', 'wealthy', 'weapon', 'webcam', 'welcome', 'welfare', 'western', 'width', 'wildlife', 'window', 'wine', 'wireless', 'wisdom', 'withdraw', 'wits', 'wolf', 'woman', 'work', 'worthy', 'wrap', 'wrist', 'writing', 'wrote', 'year', 'yelp', 'yield', 'yoga', 'zero']; -const WORD_LIST_MAP = WORD_LIST.reduce((obj, val, idx) => { - obj[val] = idx; - return obj; -}, {}); -exports = module.exports = { - MIN_ENTROPY_BITS, - generateIdentifier, - encodeMnemonic, - validateMnemonic, - splitSecret, - combineMnemonics, - crypt, - bitsToBytes -}; \ No newline at end of file diff --git a/blue_modules/slip39/example/main.js b/blue_modules/slip39/example/main.js deleted file mode 100644 index 19e1c0233..000000000 --- a/blue_modules/slip39/example/main.js +++ /dev/null @@ -1,122 +0,0 @@ -const slip39 = require('../src/slip39.js'); -const assert = require('assert'); -// threshold (N) number of group-shares required to reconstruct the master secret. -const groupThreshold = 2; -const masterSecret = 'ABCDEFGHIJKLMNOP'.slip39EncodeHex(); -const passphrase = 'TREZOR'; - -function recover(groupShares, pass) { - const recoveredSecret = slip39.recoverSecret(groupShares, pass); - console.log('\tMaster secret: ' + masterSecret.slip39DecodeHex()); - console.log('\tRecovered one: ' + recoveredSecret.slip39DecodeHex()); - assert(masterSecret.slip39DecodeHex() === recoveredSecret.slip39DecodeHex()); -} - -function printShares(shares) { - shares.forEach((s, i) => console.log(`\t${i + 1}) ${s}`)); -} - -/** - * 4 groups shares: - * = two for Alice - * = one for friends and - * = one for family members - * Any two (see threshold) of these four group-shares are required to reconstruct the master secret - * i.e. to recover the master secret the goal is to reconstruct any 2-of-4 group-shares. - * To reconstruct each group share, we need at least N of its M member-shares. - * Thus all possible master secret recovery combinations: - * Case 1) [requires 1 person: Alice] Alice alone with her 1-of-1 member-shares reconstructs both the 1st and 2nd group-shares - * Case 2) [requires 4 persons: Alice + any 3 of her 5 friends] Alice with her 1-of-1 member-shares reconstructs 1st (or 2nd) group-share + any 3-of-5 friend member-shares reconstruct the 3rd group-share - * Case 3) [requires 3 persons: Alice + any 2 of her 6 family relatives] Alice with her 1-of-1 member-shares reconstructs 1st (or 2nd) group-share + any 2-of-6 family member-shares reconstruct the 4th group-share - * Case 4) [requires 5 persons: any 3 of her 5 friends + any 2 of her 6 family relatives] any 3-of-5 friend member-shares reconstruct the 3rd group-share + any 2-of-6 family member-shares reconstruct the 4th group-share - */ -const groups = [ - // Alice group-shares. 1 is enough to reconstruct a group-share, - // therefore she needs at least two group-shares to reconstruct the master secret. - [1, 1, 'Alice personal group share 1'], - [1, 1, 'Alice personal group share 2'], - // 3 of 5 Friends' shares are required to reconstruct this group-share - [3, 5, 'Friends group share for Bob, Charlie, Dave, Frank and Grace'], - // 2 of 6 Family's shares are required to reconstruct this group-share - [2, 6, 'Family group share for mom, dad, brother, sister and wife'] -]; - -const slip = slip39.fromArray(masterSecret, { - passphrase: passphrase, - threshold: groupThreshold, - groups: groups, - title: 'Slip39 example for 2-level SSSS' -}); - -let requiredGroupShares; -let aliceBothGroupShares; -let aliceFirstGroupShare; -let aliceSecondGroupShare; -let friendGroupShares; -let familyGroupShares; - - -/* - * Example of Case 1 - */ -// The 1st, and only, member-share (member 0) of the 1st group-share (group 0) + the 1st, and only, member-share (member 0) of the 2nd group-share (group 1) -aliceBothGroupShares = slip.fromPath('r/0/0').mnemonics - .concat(slip.fromPath('r/1/0').mnemonics); - -requiredGroupShares = aliceBothGroupShares; - -console.log(`\n* Shares used by Alice alone for restoring the master secret (total of ${requiredGroupShares.length} member-shares):`); -printShares(requiredGroupShares); -recover(requiredGroupShares, passphrase); - -/* - * Example of Case 2 - */ -// The 1st, and only, member-share (member 0) of the 2nd group-share (group 1) -aliceSecondGroupShare = slip.fromPath('r/1/0').mnemonics; - -// ...plus the 3rd member-share (member 2) + the 4th member-share (member 3) + the 5th member-share (member 4) of the 3rd group-share (group 2) -friendGroupShares = slip.fromPath('r/2/2').mnemonics - .concat(slip.fromPath('r/2/3').mnemonics) - .concat(slip.fromPath('r/2/4').mnemonics); - -requiredGroupShares = aliceSecondGroupShare.concat(friendGroupShares); - -console.log(`\n* Shares used by Alice + 3 friends for restoring the master secret (total of ${requiredGroupShares.length} member-shares):`); -printShares(requiredGroupShares); -recover(requiredGroupShares, passphrase); - - -/* - * Example of Case 3 - */ -// The 1st, and only, member-share (member 0) of the 1st group-share (group 0) -aliceFirstGroupShare = slip.fromPath('r/0/0').mnemonics; - -// ...plus the 2nd member-share (member 1) + the 3rd member-share (member 2) of the 4th group-share (group 3) -familyGroupShares = slip.fromPath('r/3/1').mnemonics - .concat(slip.fromPath('r/3/2').mnemonics); - -requiredGroupShares = aliceFirstGroupShare.concat(familyGroupShares); - -console.log(`\n* Shares used by Alice + 2 family members for restoring the master secret (total of ${requiredGroupShares.length} member-shares):`); -printShares(requiredGroupShares); -recover(requiredGroupShares, passphrase); - -/* - * Example of Case 4 - */ -// The 3rd member-share (member 2) + the 4th member-share (member 3) + the 5th member-share (member 4) of the 3rd group-share (group 2) -friendGroupShares = slip.fromPath('r/2/2').mnemonics - .concat(slip.fromPath('r/2/3').mnemonics) - .concat(slip.fromPath('r/2/4').mnemonics); - -// ...plus the 2nd member-share (member 1) + the 3rd member-share (member 2) of the 4th group-share (group 3) -familyGroupShares = slip.fromPath('r/3/1').mnemonics - .concat(slip.fromPath('r/3/2').mnemonics); - -requiredGroupShares = friendGroupShares.concat(familyGroupShares); - -console.log(`\n* Shares used by 3 friends + 2 family members for restoring the master secret (total of ${requiredGroupShares.length} member-shares):`); -printShares(requiredGroupShares); -recover(requiredGroupShares, passphrase); diff --git a/blue_modules/slip39/jsbeautifyrc b/blue_modules/slip39/jsbeautifyrc deleted file mode 100644 index 7a3cb53df..000000000 --- a/blue_modules/slip39/jsbeautifyrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "indent_with_tabs": false, - "indent_size": 2, - "max_preserve_newlines": 2, - "preserve_newlines": true, - "keep_array_indentation": true, - "break_chained_methods": true, - "wrap_line_length": 120, - "end_with_newline": true, - "brace_style": "collapse,preserve-inline", - "unformatted": ["a", "abbr", "area", "audio", "b", "bdi", "bdo", "br", "button", "canvas", "cite", "code", "data", - "datalist", "del", "dfn", "em", "embed", "i", "iframe", "img", "input", "ins", "kbd", "keygen", "label", "map", - "mark", "math", "meter", "noscript", "object", "output", "progress", "q", "ruby", "s", "samp", "select", "small", - "span", "strong", "sub", "sup", "template", "textarea", "time", "u", "var", "video", "wbr", "text", "acronym", - "address", "big", "dt", "ins", "small", "strike", "tt", "pre", "h1", "h2", "h3", "h4", "h5", "h6"] -} diff --git a/blue_modules/slip39/jsconfig.json b/blue_modules/slip39/jsconfig.json deleted file mode 100644 index 98f25cc1e..000000000 --- a/blue_modules/slip39/jsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "exclude": [ - "node_modules", - "**/node_modules/*" - ], - "include": [ - "src/**/*" - ] -} diff --git a/blue_modules/slip39/package-lock.json b/blue_modules/slip39/package-lock.json deleted file mode 100644 index 4c63ed259..000000000 --- a/blue_modules/slip39/package-lock.json +++ /dev/null @@ -1,3001 +0,0 @@ -{ - "name": "slip39", - "version": "0.1.7", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/cli": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.13.14.tgz", - "integrity": "sha512-zmEFV8WBRsW+mPQumO1/4b34QNALBVReaiHJOkxhUsdo/AvYM62c+SKSuLi2aZ42t3ocK6OI0uwUXRvrIbREZw==", - "dev": true, - "requires": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", - "chokidar": "^3.4.0", - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "lodash": "^4.17.19", - "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - } - }, - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/compat-data": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", - "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==", - "dev": true - }, - "@babel/core": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.15.tgz", - "integrity": "sha512-6GXmNYeNjS2Uz+uls5jalOemgIhnTMeaXo+yBUA72kC2uX/8VW6XyhVIo2L8/q0goKQA3EVKx0KOQpVKSeWadQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-compilation-targets": "^7.13.13", - "@babel/helper-module-transforms": "^7.13.14", - "@babel/helpers": "^7.13.10", - "@babel/parser": "^7.13.15", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.14", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", - "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", - "dev": true, - "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" - } - }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz", - "integrity": "sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ==", - "dev": true - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.15.tgz", - "integrity": "sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.15", - "@babel/types": "^7.13.14", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", - "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz", - "integrity": "sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "optional": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "optional": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "optional": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "optional": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "optional": true - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "optional": true - }, - "babel-plugin-transform-bigint": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-bigint/-/babel-plugin-transform-bigint-1.0.9.tgz", - "integrity": "sha512-Lf4X2LssZpl3XwvU9xr7HLMtZozGBzrh/0P1qEFktbiz24RI2qG6QF8VhGoWPynbYHKKGHYCjYwprrTS5Z/kkw==", - "dev": true, - "requires": { - "@babel/plugin-syntax-bigint": "^7.2.0", - "big-integer": "^1.6.41" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "optional": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001228", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", - "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.737", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.737.tgz", - "integrity": "sha512-P/B84AgUSQXaum7a8m11HUsYL8tj9h/Pt5f7Hg7Ty6bm5DxlFq+e5+ouHUoNQMsKDJ7u4yGfI8mOErCmSH9wyg==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "optional": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "optional": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "optional": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "optional": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - }, - "dependencies": { - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - } - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "optional": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "optional": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.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==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "optional": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "optional": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "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==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "optional": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": 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" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true, - "optional": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "optional": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "optional": true, - "requires": { - "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" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "optional": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "optional": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" - } - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbi": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.1.4.tgz", - "integrity": "sha512-52QRRFSsi9impURE8ZUbzAMCLjPm4THO7H2fcuIvaaeFTbSysvkodbQQXIVsNgq/ypDbq6dJiuGKL0vZ/i9hUg==" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "optional": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "optional": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "optional": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mocha": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", - "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.4", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "optional": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "optional": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "optional": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "optional": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "optional": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true, - "optional": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true, - "optional": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "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" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": 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" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true, - "optional": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "optional": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "optional": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "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==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true, - "optional": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "optional": true - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.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==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "optional": true, - "requires": { - "ret": "~0.1.10" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "optional": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "optional": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "optional": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true, - "optional": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "optional": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "optional": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "optional": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "optional": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "optional": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "optional": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "optional": true - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true, - "optional": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "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==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "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" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - } - } - } -} diff --git a/blue_modules/slip39/package.json b/blue_modules/slip39/package.json deleted file mode 100644 index cffe252a3..000000000 --- a/blue_modules/slip39/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "slip39", - "version": "0.1.7", - "description": "The javascript implementation of the SLIP39 for Shamir's Secret-Sharing for Mnemonic Codes.", - "main": "dist/slip39.js", - "scripts": { - "build": "npx babel src --out-dir dist && ./sed.sh", - "test": "mocha" - }, - "author": "Pal Dorogi \"iLap\" ", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/ilap/slip39-js.git" - }, - "keywords": [ - "SLIP39", - "crypto", - "Shamir", - "Shamir's Secret Sharing", - "Shamir's secret-sharing scheme", - "SSS" - ], - "devDependencies": { - "@babel/cli": "^7.13.14", - "@babel/core": "^7.13.15", - "babel-plugin-transform-bigint": "^1.0.9", - "mocha": "^6.2.0" - }, - "dependencies": { - "create-hmac": "^1.1.3", - "jsbi": "^3.1.4", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - } -} diff --git a/blue_modules/slip39/scripts/test_publish.sh b/blue_modules/slip39/scripts/test_publish.sh deleted file mode 100755 index 4e1f96cac..000000000 --- a/blue_modules/slip39/scripts/test_publish.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -PROJ_DIR=`dirname $0`/.. - -cd "${PROJ_DIR}" - -sudo npm install . -g -sudo npm link - -mkdir ../pubtest -cd ../pubtest -cat > package.json << EOF -{ - "name": "test-slip39", - "version": "0.1.0", - "private": true -} -EOF - -npm install ../slip39-js - -cd - -sudo npm uninstall . -g -sudo npm unlink -rm -rf ../pubtest diff --git a/blue_modules/slip39/sed.sh b/blue_modules/slip39/sed.sh deleted file mode 100755 index c73523bdc..000000000 --- a/blue_modules/slip39/sed.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -sed -i '' 's/import JSBI from \"jsbi\"/const JSBI = require(\"jsbi\/dist\/jsbi-cjs.js\")/' dist/*.js diff --git a/blue_modules/slip39/src/slip39.js b/blue_modules/slip39/src/slip39.js deleted file mode 100644 index af284d265..000000000 --- a/blue_modules/slip39/src/slip39.js +++ /dev/null @@ -1,190 +0,0 @@ -/* eslint-disable radix */ -const slipHelper = require('./slip39_helper.js'); - -const MAX_DEPTH = 2; - -/** - * Slip39Node - * For root node, description refers to the whole set's title e.g. "Hardware wallet X SSSS shares" - * For children nodes, description refers to the group e.g. "Family group: mom, dad, sister, wife" - */ -class Slip39Node { - constructor(index = 0, description = '', mnemonic = '', children = []) { - this.index = index; - this.description = description; - this.mnemonic = mnemonic; - this.children = children; - } - - get mnemonics() { - if (this.children.length === 0) { - return [this.mnemonic]; - } - const result = this.children.reduce((prev, item) => { - return prev.concat(item.mnemonics); - }, []); - return result; - } -} - -// -// The javascript implementation of the SLIP-0039: Shamir's Secret-Sharing for Mnemonic Codes -// see: https://github.com/satoshilabs/slips/blob/master/slip-0039.md) -// -class Slip39 { - constructor({ - iterationExponent = 0, - identifier, - groupCount, - groupThreshold - } = {}) { - this.iterationExponent = iterationExponent; - this.identifier = identifier; - this.groupCount = groupCount; - this.groupThreshold = groupThreshold; - } - - static fromArray(masterSecret, { - passphrase = '', - threshold = 1, - groups = [ - [1, 1, 'Default 1-of-1 group share'] - ], - iterationExponent = 0, - title = 'My default slip39 shares' - } = {}) { - if (masterSecret.length * 8 < slipHelper.MIN_ENTROPY_BITS) { - throw Error(`The length of the master secret (${masterSecret.length} bytes) must be at least ${slipHelper.bitsToBytes(slipHelper.MIN_ENTROPY_BITS)} bytes.`); - } - - if (masterSecret.length % 2 !== 0) { - throw Error('The length of the master secret in bytes must be an even number.'); - } - - if (!/^[\x20-\x7E]*$/.test(passphrase)) { - throw Error('The passphrase must contain only printable ASCII characters (code points 32-126).'); - } - - if (threshold > groups.length) { - throw Error(`The requested group threshold (${threshold}) must not exceed the number of groups (${groups.length}).`); - } - - groups.forEach((item) => { - if (item[0] === 1 && item[1] > 1) { - throw Error(`Creating multiple member shares with member threshold 1 is not allowed. Use 1-of-1 member sharing instead. ${groups.join()}`); - } - }); - - const identifier = slipHelper.generateIdentifier(); - - const slip = new Slip39({ - iterationExponent: iterationExponent, - identifier: identifier, - groupCount: groups.length, - groupThreshold: threshold - }); - - const encryptedMasterSecret = slipHelper.crypt( - masterSecret, passphrase, iterationExponent, slip.identifier); - - const root = slip.buildRecursive( - new Slip39Node(0, title), - groups, - encryptedMasterSecret, - threshold - ); - - slip.root = root; - return slip; - } - - buildRecursive(currentNode, nodes, secret, threshold, index) { - // It means it's a leaf. - if (nodes.length === 0) { - const mnemonic = slipHelper.encodeMnemonic(this.identifier, this.iterationExponent, index, - this.groupThreshold, this.groupCount, currentNode.index, threshold, secret); - - currentNode.mnemonic = mnemonic; - return currentNode; - } - - const secretShares = slipHelper.splitSecret(threshold, nodes.length, secret); - let children = []; - let idx = 0; - - nodes.forEach((item) => { - // n=threshold - const n = item[0]; - // m=members - const m = item[1]; - // d=description - const d = item[2] || ''; - - // Generate leaf members, means their `m` is `0` - const members = Array().slip39Generate(m, () => [n, 0, d]); - - const node = new Slip39Node(idx, d); - const branch = this.buildRecursive( - node, - members, - secretShares[idx], - n, - currentNode.index); - - children = children.concat(branch); - idx = idx + 1; - }); - currentNode.children = children; - return currentNode; - } - - static recoverSecret(mnemonics, passphrase) { - return slipHelper.combineMnemonics(mnemonics, passphrase); - } - - static validateMnemonic(mnemonic) { - return slipHelper.validateMnemonic(mnemonic); - } - - fromPath(path) { - this.validatePath(path); - - const children = this.parseChildren(path); - - if (typeof children === 'undefined' || children.length === 0) { - return this.root; - } - - return children.reduce((prev, childNumber) => { - let childrenLen = prev.children.length; - if (childNumber >= childrenLen) { - throw new Error(`The path index (${childNumber}) exceeds the children index (${childrenLen - 1}).`); - } - - return prev.children[childNumber]; - }, this.root); - } - - validatePath(path) { - if (!path.match(/(^r)(\/\d{1,2}){0,2}$/)) { - throw new Error('Expected valid path e.g. "r/0/0".'); - } - - const depth = path.split('/'); - const pathLength = depth.length - 1; - if (pathLength > MAX_DEPTH) { - throw new Error(`Path\'s (${path}) max depth (${MAX_DEPTH}) is exceeded (${pathLength}).`); - } - } - - parseChildren(path) { - const splitted = path.split('/').slice(1); - - const result = splitted.map((pathFragment) => { - return parseInt(pathFragment); - }); - return result; - } -} - -exports = module.exports = Slip39; diff --git a/blue_modules/slip39/src/slip39_helper.js b/blue_modules/slip39/src/slip39_helper.js deleted file mode 100644 index ac3b2f286..000000000 --- a/blue_modules/slip39/src/slip39_helper.js +++ /dev/null @@ -1,2238 +0,0 @@ -/* eslint-disable no-array-constructor */ -const pbkdf2 = require('pbkdf2') -const createHmac = require('create-hmac') -const randombytes = require('randombytes'); - -// The length of the radix in bits. -const RADIX_BITS = 10; - -// The length of the random identifier in bits. -const ID_BITS_LENGTH = 15; - -// The length of the iteration exponent in bits. -const ITERATION_EXP_BITS_LENGTH = 5; - -// The length of the random identifier and iteration exponent in words. -const ITERATION_EXP_WORDS_LENGTH = - parseInt((ID_BITS_LENGTH + ITERATION_EXP_BITS_LENGTH + RADIX_BITS - 1) / RADIX_BITS, 10); - -// The maximum iteration exponent -const MAX_ITERATION_EXP = Math.pow(2, ITERATION_EXP_BITS_LENGTH); - -// The maximum number of shares that can be created. -const MAX_SHARE_COUNT = 16; - -// The length of the RS1024 checksum in words. -const CHECKSUM_WORDS_LENGTH = 3; - -// The length of the digest of the shared secret in bytes. -const DIGEST_LENGTH = 4; - -// The customization string used in the RS1024 checksum and in the PBKDF2 salt. -const SALT_STRING = 'shamir'; - -// The minimum allowed entropy of the master secret. -const MIN_ENTROPY_BITS = 128; - -// The minimum allowed length of the mnemonic in words. -const METADATA_WORDS_LENGTH = - ITERATION_EXP_WORDS_LENGTH + 2 + CHECKSUM_WORDS_LENGTH; - -// The length of the mnemonic in words without the share value. -const MNEMONICS_WORDS_LENGTH = parseInt( - METADATA_WORDS_LENGTH + (MIN_ENTROPY_BITS + RADIX_BITS - 1) / RADIX_BITS, 10); - -// The minimum number of iterations to use in PBKDF2. -const ITERATION_COUNT = 10000; - -// The number of rounds to use in the Feistel cipher. -const ROUND_COUNT = 4; - -// The index of the share containing the digest of the shared secret. -const DIGEST_INDEX = 254; - -// The index of the share containing the shared secret. -const SECRET_INDEX = 255; - -// -// Helper functions for SLIP39 implementation. -// -String.prototype.slip39EncodeHex = function () { - let bytes = []; - for (let i = 0; i < this.length; ++i) { - bytes.push(this.charCodeAt(i)); - } - return bytes; -}; - -Array.prototype.slip39DecodeHex = function () { - let str = []; - const hex = this.toString().split(','); - for (let i = 0; i < hex.length; i++) { - str.push(String.fromCharCode(hex[i])); - } - return str.toString().replace(/,/g, ''); -}; - -Array.prototype.slip39Generate = function (m, v = _ => _) { - let n = m || this.length; - for (let i = 0; i < n; i++) { - this[i] = v(i); - } - return this; -}; - -Array.prototype.toHexString = function () { - return Array.prototype.map.call(this, function (byte) { - return ('0' + (byte & 0xFF).toString(16)).slice(-2); - }).join(''); -}; - -Array.prototype.toByteArray = function (hexString) { - for (let i = 0; i < hexString.length; i = i + 2) { - this.push(parseInt(hexString.substr(i, 2), 16)); - } - return this; -}; - -const BIGINT_WORD_BITS = BigInt(8); - -function decodeBigInt(bytes) { - let result = BigInt(0); - for (let i = 0; i < bytes.length; i++) { - let b = BigInt(bytes[bytes.length - i - 1]); - result = result + (b << BIGINT_WORD_BITS * BigInt(i)); - } - return result; -} - -function encodeBigInt(number, paddedLength = 0) { - let num = number; - const BYTE_MASK = BigInt(0xff); - const BIGINT_ZERO = BigInt(0); - let result = new Array(0); - - while (num > BIGINT_ZERO) { - let i = parseInt(num & BYTE_MASK, 10); - result.unshift(i); - num = num >> BIGINT_WORD_BITS; - } - - // Zero padding to the length - for (let i = result.length; i < paddedLength; i++) { - result.unshift(0); - } - - if (paddedLength !== 0 && result.length > paddedLength) { - throw new Error(`Error in encoding BigInt value, expected less than ${paddedLength} length value, got ${result.length}`); - } - - return result; -} - -function bitsToBytes(n) { - const res = (n + 7) / 8; - const b = parseInt(res, RADIX_BITS); - return b; -} - -function bitsToWords(n) { - const res = (n + RADIX_BITS - 1) / RADIX_BITS; - const b = parseInt(res, RADIX_BITS); - return b; -} - -// -// Returns a randomly generated integer in the range 0, ... , 2**ID_LENGTH_BITS - 1. -// -function randomBytes(length = 32) { - let randoms = randombytes(length); - return Array.prototype.slice.call(randoms, 0); -} - -// -// The round function used internally by the Feistel cipher. -// -function roundFunction(round, passphrase, exp, salt, secret) { - const saltedSecret = salt.concat(secret); - const roundedPhrase = [round].concat(passphrase); - const count = (ITERATION_COUNT << exp) / ROUND_COUNT; - - const key = pbkdf2.pbkdf2Sync(Buffer.from(roundedPhrase), Buffer.from(saltedSecret), count, secret.length, 'sha256'); - return Array.prototype.slice.call(key, 0); -} - -function crypt(masterSecret, passphrase, iterationExponent, - identifier, - encrypt = true) { - // Iteration exponent validated here. - if (iterationExponent < 0 || iterationExponent > MAX_ITERATION_EXP) { - throw Error(`Invalid iteration exponent (${iterationExponent}). Expected between 0 and ${MAX_ITERATION_EXP}`); - } - - let IL = masterSecret.slice().slice(0, masterSecret.length / 2); - let IR = masterSecret.slice().slice(masterSecret.length / 2); - - const pwd = passphrase.slip39EncodeHex(); - - const salt = getSalt(identifier); - - let range = Array().slip39Generate(ROUND_COUNT); - range = encrypt ? range : range.reverse(); - - range.forEach((round) => { - const f = roundFunction(round, pwd, iterationExponent, salt, IR); - const t = xor(IL, f); - IL = IR; - IR = t; - }); - return IR.concat(IL); -} - -function createDigest(randomData, sharedSecret) { - const hmac = createHmac('sha256', Buffer.from(randomData)); - - hmac.update(Buffer.from(sharedSecret)); - - let result = hmac.digest(); - result = result.slice(0, 4); - return Array.prototype.slice.call(result, 0); -} - -function splitSecret(threshold, shareCount, sharedSecret) { - if (threshold <= 0) { - throw Error(`The requested threshold (${threshold}) must be a positive integer.`); - } - - if (threshold > shareCount) { - throw Error(`The requested threshold (${threshold}) must not exceed the number of shares (${shareCount}).`); - } - - if (shareCount > MAX_SHARE_COUNT) { - throw Error(`The requested number of shares (${shareCount}) must not exceed ${MAX_SHARE_COUNT}.`); - } - // If the threshold is 1, then the digest of the shared secret is not used. - if (threshold === 1) { - return Array().slip39Generate(shareCount, () => sharedSecret); - } - - const randomShareCount = threshold - 2; - - const randomPart = randomBytes(sharedSecret.length - DIGEST_LENGTH); - const digest = createDigest(randomPart, sharedSecret); - - let baseShares = new Map(); - let shares = []; - if (randomShareCount) { - shares = Array().slip39Generate( - randomShareCount, () => randomBytes(sharedSecret.length)); - shares.forEach((item, idx) => { - baseShares.set(idx, item); - }); - } - baseShares.set(DIGEST_INDEX, digest.concat(randomPart)); - baseShares.set(SECRET_INDEX, sharedSecret); - - for (let i = randomShareCount; i < shareCount; i++) { - const rr = interpolate(baseShares, i); - shares.push(rr); - } - - return shares; -} - -// -// Returns a randomly generated integer in the range 0, ... , 2**ID_BITS_LENGTH - 1. -// -function generateIdentifier() { - const byte = bitsToBytes(ID_BITS_LENGTH); - const bits = ID_BITS_LENGTH % 8; - const identifier = randomBytes(byte); - - identifier[0] = identifier[0] & (1 << bits) - 1; - - return identifier; -} - -function xor(a, b) { - if (a.length !== b.length) { - throw new Error(`Invalid padding in mnemonic or insufficient length of mnemonics (${a.length} or ${b.length})`); - } - return Array().slip39Generate(a.length, (i) => a[i] ^ b[i]); -} - -function getSalt(identifier) { - const salt = SALT_STRING.slip39EncodeHex(); - return salt.concat(identifier); -} - -function interpolate(shares, x) { - let xCoord = new Set(shares.keys()); - let arr = Array.from(shares.values(), (v) => v.length); - let sharesValueLengths = new Set(arr); - - if (sharesValueLengths.size !== 1) { - throw new Error('Invalid set of shares. All share values must have the same length.'); - } - - if (xCoord.has(x)) { - shares.forEach((v, k) => { - if (k === x) { - return v; - } - }); - } - - // Logarithm of the product of (x_i - x) for i = 1, ... , k. - let logProd = 0; - - shares.forEach((v, k) => { - logProd = logProd + LOG_TABLE[k ^ x]; - }); - - let results = Array().slip39Generate(sharesValueLengths.values().next().value, () => 0); - - shares.forEach((v, k) => { - // The logarithm of the Lagrange basis polynomial evaluated at x. - let sum = 0; - shares.forEach((vv, kk) => { - sum = sum + LOG_TABLE[k ^ kk]; - }); - - // FIXME: -18 % 255 = 237. IT shoulud be 237 and not -18 as it's - // implemented in javascript. - const basis = (logProd - LOG_TABLE[k ^ x] - sum) % 255; - - const logBasisEval = basis < 0 ? 255 + basis : basis; - - v.forEach((item, idx) => { - const shareVal = item; - const intermediateSum = results[idx]; - const r = shareVal !== 0 ? - EXP_TABLE[(LOG_TABLE[shareVal] + logBasisEval) % 255] : 0; - - const res = intermediateSum ^ r; - results[idx] = res; - }); - }); - return results; -} - -function rs1024Polymod(data) { - const GEN = [ - 0xE0E040, - 0x1C1C080, - 0x3838100, - 0x7070200, - 0xE0E0009, - 0x1C0C2412, - 0x38086C24, - 0x3090FC48, - 0x21B1F890, - 0x3F3F120 - ]; - let chk = 1; - - data.forEach((byte) => { - const b = chk >> 20; - chk = (chk & 0xFFFFF) << 10 ^ byte; - - for (let i = 0; i < 10; i++) { - let gen = (b >> i & 1) !== 0 ? GEN[i] : 0; - chk = chk ^ gen; - } - }); - - return chk; -} - -function rs1024CreateChecksum(data) { - const values = SALT_STRING.slip39EncodeHex() - .concat(data) - .concat(Array().slip39Generate(CHECKSUM_WORDS_LENGTH, () => 0)); - const polymod = rs1024Polymod(values) ^ 1; - const result = - Array().slip39Generate(CHECKSUM_WORDS_LENGTH, (i) => polymod >> 10 * i & 1023).reverse(); - - return result; -} - -function rs1024VerifyChecksum(data) { - return rs1024Polymod(SALT_STRING.slip39EncodeHex().concat(data)) === 1; -} - -// -// Converts a list of base 1024 indices in big endian order to an integer value. -// -function intFromIndices(indices) { - let value = BigInt(0); - const radix = BigInt(Math.pow(2, RADIX_BITS)); - indices.forEach((index) => { - value = value * radix + BigInt(index); - }); - - return value; -} - -// -// Converts a Big integer value to indices in big endian order. -// -function intToIndices(value, length, bits) { - const mask = BigInt((1 << bits) - 1); - const result = - Array().slip39Generate(length, (i) => parseInt(value >> BigInt(i) * BigInt(bits) & mask, 10)); - return result.reverse(); -} - -function mnemonicFromIndices(indices) { - const result = indices.map((index) => { - return WORD_LIST[index]; - }); - return result.toString().split(',').join(' '); -} - -function mnemonicToIndices(mnemonic) { - if (typeof mnemonic !== 'string') { - throw new Error(`Mnemonic expected to be typeof string with white space separated words. Instead found typeof ${typeof mnemonic}.`); - } - - const words = mnemonic.toLowerCase().split(' '); - const result = words.reduce((prev, item) => { - const index = WORD_LIST_MAP[item]; - if (typeof index === 'undefined') { - throw new Error(`Invalid mnemonic word ${item}.`); - } - return prev.concat(index); - }, []); - return result; -} - -function recoverSecret(threshold, shares) { - // If the threshold is 1, then the digest of the shared secret is not used. - if (threshold === 1) { - return shares.values().next().value; - } - - const sharedSecret = interpolate(shares, SECRET_INDEX); - const digestShare = interpolate(shares, DIGEST_INDEX); - const digest = digestShare.slice(0, DIGEST_LENGTH); - const randomPart = digestShare.slice(DIGEST_LENGTH); - - const recoveredDigest = createDigest( - randomPart, sharedSecret); - if (!listsAreEqual(digest, recoveredDigest)) { - throw new Error('Invalid digest of the shared secret.'); - } - return sharedSecret; -} - -// -// Combines mnemonic shares to obtain the master secret which was previously -// split using Shamir's secret sharing scheme. -// -function combineMnemonics(mnemonics, passphrase = '') { - if (mnemonics === null || mnemonics.length === 0) { - throw new Error('The list of mnemonics is empty.'); - } - - const decoded = decodeMnemonics(mnemonics); - const identifier = decoded.identifier; - const iterationExponent = decoded.iterationExponent; - const groupThreshold = decoded.groupThreshold; - const groupCount = decoded.groupCount; - const groups = decoded.groups; - - if (groups.size < groupThreshold) { - throw new Error(`Insufficient number of mnemonic groups (${groups.size}). The required number of groups is ${groupThreshold}.`); - } - - if (groups.size !== groupThreshold) { - throw new Error(`Wrong number of mnemonic groups. Expected ${groupThreshold} groups, but ${groups.size} were provided.`); - } - - let allShares = new Map(); - groups.forEach((members, groupIndex) => { - const threshold = members.keys().next().value; - const shares = members.values().next().value; - if (shares.size !== threshold) { - const prefix = groupPrefix( - identifier, - iterationExponent, - groupIndex, - groupThreshold, - groupCount - ); - throw new Error(`Wrong number of mnemonics. Expected ${threshold} mnemonics starting with "${mnemonicFromIndices(prefix)}", \n but ${shares.size} were provided.`); - } - - const recovered = recoverSecret(threshold, shares); - allShares.set(groupIndex, recovered); - }); - - const ems = recoverSecret(groupThreshold, allShares); - const id = intToIndices(BigInt(identifier), ITERATION_EXP_WORDS_LENGTH, 8); - const ms = crypt(ems, passphrase, iterationExponent, id, false); - - return ms; -} - -function decodeMnemonics(mnemonics) { - if (!(mnemonics instanceof Array)) { - throw new Error('Mnemonics should be an array of strings'); - } - const identifiers = new Set(); - const iterationExponents = new Set(); - const groupThresholds = new Set(); - const groupCounts = new Set(); - const groups = new Map(); - - mnemonics.forEach((mnemonic) => { - const decoded = decodeMnemonic(mnemonic); - - identifiers.add(decoded.identifier); - iterationExponents.add(decoded.iterationExponent); - const groupIndex = decoded.groupIndex; - groupThresholds.add(decoded.groupThreshold); - groupCounts.add(decoded.groupCount); - const memberIndex = decoded.memberIndex; - const memberThreshold = decoded.memberThreshold; - const share = decoded.share; - - const group = !groups.has(groupIndex) ? new Map() : groups.get(groupIndex); - const member = !group.has(memberThreshold) ? new Map() : group.get(memberThreshold); - member.set(memberIndex, share); - group.set(memberThreshold, member); - if (group.size !== 1) { - throw new Error('Invalid set of mnemonics. All mnemonics in a group must have the same member threshold.'); - } - groups.set(groupIndex, group); - }); - - if (identifiers.size !== 1 || iterationExponents.size !== 1) { - throw new Error(`Invalid set of mnemonics. All mnemonics must begin with the same ${ITERATION_EXP_WORDS_LENGTH} words.`); - } - - if (groupThresholds.size !== 1) { - throw new Error('Invalid set of mnemonics. All mnemonics must have the same group threshold.'); - } - - if (groupCounts.size !== 1) { - throw new Error('Invalid set of mnemonics. All mnemonics must have the same group count.'); - } - - return { - identifier: identifiers.values().next().value, - iterationExponent: iterationExponents.values().next().value, - groupThreshold: groupThresholds.values().next().value, - groupCount: groupCounts.values().next().value, - groups: groups - }; -} - -// -// Converts a share mnemonic to share data. -// -function decodeMnemonic(mnemonic) { - const data = mnemonicToIndices(mnemonic); - - if (data.length < MNEMONICS_WORDS_LENGTH) { - throw new Error(`Invalid mnemonic length. The length of each mnemonic must be at least ${MNEMONICS_WORDS_LENGTH} words.`); - } - - const paddingLen = RADIX_BITS * (data.length - METADATA_WORDS_LENGTH) % 16; - if (paddingLen > 8) { - throw new Error('Invalid mnemonic length.'); - } - - if (!rs1024VerifyChecksum(data)) { - throw new Error('Invalid mnemonic checksum'); - } - - const idExpInt = - parseInt(intFromIndices(data.slice(0, ITERATION_EXP_WORDS_LENGTH)), 10); - const identifier = idExpInt >> ITERATION_EXP_BITS_LENGTH; - const iterationExponent = idExpInt & (1 << ITERATION_EXP_BITS_LENGTH) - 1; - const tmp = intFromIndices( - data.slice(ITERATION_EXP_WORDS_LENGTH, ITERATION_EXP_WORDS_LENGTH + 2)); - - const indices = intToIndices(tmp, 5, 4); - - const groupIndex = indices[0]; - const groupThreshold = indices[1]; - const groupCount = indices[2]; - const memberIndex = indices[3]; - const memberThreshold = indices[4]; - - const valueData = data.slice( - ITERATION_EXP_WORDS_LENGTH + 2, data.length - CHECKSUM_WORDS_LENGTH); - - if (groupCount < groupThreshold) { - throw new Error(`Invalid mnemonic: ${mnemonic}.\n Group threshold (${groupThreshold}) cannot be greater than group count (${groupCount}).`); - } - - const valueInt = intFromIndices(valueData); - - try { - const valueByteCount = bitsToBytes(RADIX_BITS * valueData.length - paddingLen); - const share = encodeBigInt(valueInt, valueByteCount); - - return { - identifier: identifier, - iterationExponent: iterationExponent, - groupIndex: groupIndex, - groupThreshold: groupThreshold + 1, - groupCount: groupCount + 1, - memberIndex: memberIndex, - memberThreshold: memberThreshold + 1, - share: share - }; - } catch (e) { - throw new Error(`Invalid mnemonic padding (${e})`); - } -} - -function validateMnemonic(mnemonic) { - try { - decodeMnemonic(mnemonic); - return true; - } catch (error) { - return false; - } -} - -function groupPrefix( - identifier, iterationExponent, groupIndex, groupThreshold, groupCount) { - const idExpInt = BigInt( - (identifier << ITERATION_EXP_BITS_LENGTH) + iterationExponent); - - const indc = intToIndices(idExpInt, ITERATION_EXP_WORDS_LENGTH, RADIX_BITS); - - const indc2 = - (groupIndex << 6) + (groupThreshold - 1 << 2) + (groupCount - 1 >> 2); - - indc.push(indc2); - return indc; -} - -function listsAreEqual(a, b) { - if (a === null || b === null || a.length !== b.length) { - return false; - } - - let i = 0; - return a.every((item) => { - return b[i++] === item; - }); -} - -// -// Converts share data to a share mnemonic. -// -function encodeMnemonic( - identifier, - iterationExponent, - groupIndex, - groupThreshold, - groupCount, - memberIndex, - memberThreshold, - value -) { - // Convert the share value from bytes to wordlist indices. - const valueWordCount = bitsToWords(value.length * 8); - - const valueInt = decodeBigInt(value); - let newIdentifier = parseInt(decodeBigInt(identifier), 10); - - const gp = groupPrefix( - newIdentifier, iterationExponent, groupIndex, groupThreshold, groupCount); - const tp = intToIndices(valueInt, valueWordCount, RADIX_BITS); - - const calc = ((groupCount - 1 & 3) << 8) + - (memberIndex << 4) + - (memberThreshold - 1); - - gp.push(calc); - const shareData = gp.concat(tp); - - const checksum = rs1024CreateChecksum(shareData); - - return mnemonicFromIndices(shareData.concat(checksum)); -} - -// The precomputed exponent and log tables. -// ``` -// const exp = List.filled(255, 0) -// const log = List.filled(256, 0) -// const poly = 1 -// -// for (let i = 0; i < exp.length; i++) { -// exp[i] = poly -// log[poly] = i -// // Multiply poly by the polynomial x + 1. -// poly = (poly << 1) ^ poly -// // Reduce poly by x^8 + x^4 + x^3 + x + 1. -// if (poly & 0x100 === 0x100) poly ^= 0x11B -// } -// ``` -const EXP_TABLE = [ - 1, - 3, - 5, - 15, - 17, - 51, - 85, - 255, - 26, - 46, - 114, - 150, - 161, - 248, - 19, - 53, - 95, - 225, - 56, - 72, - 216, - 115, - 149, - 164, - 247, - 2, - 6, - 10, - 30, - 34, - 102, - 170, - 229, - 52, - 92, - 228, - 55, - 89, - 235, - 38, - 106, - 190, - 217, - 112, - 144, - 171, - 230, - 49, - 83, - 245, - 4, - 12, - 20, - 60, - 68, - 204, - 79, - 209, - 104, - 184, - 211, - 110, - 178, - 205, - 76, - 212, - 103, - 169, - 224, - 59, - 77, - 215, - 98, - 166, - 241, - 8, - 24, - 40, - 120, - 136, - 131, - 158, - 185, - 208, - 107, - 189, - 220, - 127, - 129, - 152, - 179, - 206, - 73, - 219, - 118, - 154, - 181, - 196, - 87, - 249, - 16, - 48, - 80, - 240, - 11, - 29, - 39, - 105, - 187, - 214, - 97, - 163, - 254, - 25, - 43, - 125, - 135, - 146, - 173, - 236, - 47, - 113, - 147, - 174, - 233, - 32, - 96, - 160, - 251, - 22, - 58, - 78, - 210, - 109, - 183, - 194, - 93, - 231, - 50, - 86, - 250, - 21, - 63, - 65, - 195, - 94, - 226, - 61, - 71, - 201, - 64, - 192, - 91, - 237, - 44, - 116, - 156, - 191, - 218, - 117, - 159, - 186, - 213, - 100, - 172, - 239, - 42, - 126, - 130, - 157, - 188, - 223, - 122, - 142, - 137, - 128, - 155, - 182, - 193, - 88, - 232, - 35, - 101, - 175, - 234, - 37, - 111, - 177, - 200, - 67, - 197, - 84, - 252, - 31, - 33, - 99, - 165, - 244, - 7, - 9, - 27, - 45, - 119, - 153, - 176, - 203, - 70, - 202, - 69, - 207, - 74, - 222, - 121, - 139, - 134, - 145, - 168, - 227, - 62, - 66, - 198, - 81, - 243, - 14, - 18, - 54, - 90, - 238, - 41, - 123, - 141, - 140, - 143, - 138, - 133, - 148, - 167, - 242, - 13, - 23, - 57, - 75, - 221, - 124, - 132, - 151, - 162, - 253, - 28, - 36, - 108, - 180, - 199, - 82, - 246 -]; -const LOG_TABLE = [ - 0, - 0, - 25, - 1, - 50, - 2, - 26, - 198, - 75, - 199, - 27, - 104, - 51, - 238, - 223, - 3, - 100, - 4, - 224, - 14, - 52, - 141, - 129, - 239, - 76, - 113, - 8, - 200, - 248, - 105, - 28, - 193, - 125, - 194, - 29, - 181, - 249, - 185, - 39, - 106, - 77, - 228, - 166, - 114, - 154, - 201, - 9, - 120, - 101, - 47, - 138, - 5, - 33, - 15, - 225, - 36, - 18, - 240, - 130, - 69, - 53, - 147, - 218, - 142, - 150, - 143, - 219, - 189, - 54, - 208, - 206, - 148, - 19, - 92, - 210, - 241, - 64, - 70, - 131, - 56, - 102, - 221, - 253, - 48, - 191, - 6, - 139, - 98, - 179, - 37, - 226, - 152, - 34, - 136, - 145, - 16, - 126, - 110, - 72, - 195, - 163, - 182, - 30, - 66, - 58, - 107, - 40, - 84, - 250, - 133, - 61, - 186, - 43, - 121, - 10, - 21, - 155, - 159, - 94, - 202, - 78, - 212, - 172, - 229, - 243, - 115, - 167, - 87, - 175, - 88, - 168, - 80, - 244, - 234, - 214, - 116, - 79, - 174, - 233, - 213, - 231, - 230, - 173, - 232, - 44, - 215, - 117, - 122, - 235, - 22, - 11, - 245, - 89, - 203, - 95, - 176, - 156, - 169, - 81, - 160, - 127, - 12, - 246, - 111, - 23, - 196, - 73, - 236, - 216, - 67, - 31, - 45, - 164, - 118, - 123, - 183, - 204, - 187, - 62, - 90, - 251, - 96, - 177, - 134, - 59, - 82, - 161, - 108, - 170, - 85, - 41, - 157, - 151, - 178, - 135, - 144, - 97, - 190, - 220, - 252, - 188, - 149, - 207, - 205, - 55, - 63, - 91, - 209, - 83, - 57, - 132, - 60, - 65, - 162, - 109, - 71, - 20, - 42, - 158, - 93, - 86, - 242, - 211, - 171, - 68, - 17, - 146, - 217, - 35, - 32, - 46, - 137, - 180, - 124, - 184, - 38, - 119, - 153, - 227, - 165, - 103, - 74, - 237, - 222, - 197, - 49, - 254, - 24, - 13, - 99, - 140, - 128, - 192, - 247, - 112, - 7 -]; - -// -// SLIP39 wordlist -// -const WORD_LIST = [ - 'academic', - 'acid', - 'acne', - 'acquire', - 'acrobat', - 'activity', - 'actress', - 'adapt', - 'adequate', - 'adjust', - 'admit', - 'adorn', - 'adult', - 'advance', - 'advocate', - 'afraid', - 'again', - 'agency', - 'agree', - 'aide', - 'aircraft', - 'airline', - 'airport', - 'ajar', - 'alarm', - 'album', - 'alcohol', - 'alien', - 'alive', - 'alpha', - 'already', - 'alto', - 'aluminum', - 'always', - 'amazing', - 'ambition', - 'amount', - 'amuse', - 'analysis', - 'anatomy', - 'ancestor', - 'ancient', - 'angel', - 'angry', - 'animal', - 'answer', - 'antenna', - 'anxiety', - 'apart', - 'aquatic', - 'arcade', - 'arena', - 'argue', - 'armed', - 'artist', - 'artwork', - 'aspect', - 'auction', - 'august', - 'aunt', - 'average', - 'aviation', - 'avoid', - 'award', - 'away', - 'axis', - 'axle', - 'beam', - 'beard', - 'beaver', - 'become', - 'bedroom', - 'behavior', - 'being', - 'believe', - 'belong', - 'benefit', - 'best', - 'beyond', - 'bike', - 'biology', - 'birthday', - 'bishop', - 'black', - 'blanket', - 'blessing', - 'blimp', - 'blind', - 'blue', - 'body', - 'bolt', - 'boring', - 'born', - 'both', - 'boundary', - 'bracelet', - 'branch', - 'brave', - 'breathe', - 'briefing', - 'broken', - 'brother', - 'browser', - 'bucket', - 'budget', - 'building', - 'bulb', - 'bulge', - 'bumpy', - 'bundle', - 'burden', - 'burning', - 'busy', - 'buyer', - 'cage', - 'calcium', - 'camera', - 'campus', - 'canyon', - 'capacity', - 'capital', - 'capture', - 'carbon', - 'cards', - 'careful', - 'cargo', - 'carpet', - 'carve', - 'category', - 'cause', - 'ceiling', - 'center', - 'ceramic', - 'champion', - 'change', - 'charity', - 'check', - 'chemical', - 'chest', - 'chew', - 'chubby', - 'cinema', - 'civil', - 'class', - 'clay', - 'cleanup', - 'client', - 'climate', - 'clinic', - 'clock', - 'clogs', - 'closet', - 'clothes', - 'club', - 'cluster', - 'coal', - 'coastal', - 'coding', - 'column', - 'company', - 'corner', - 'costume', - 'counter', - 'course', - 'cover', - 'cowboy', - 'cradle', - 'craft', - 'crazy', - 'credit', - 'cricket', - 'criminal', - 'crisis', - 'critical', - 'crowd', - 'crucial', - 'crunch', - 'crush', - 'crystal', - 'cubic', - 'cultural', - 'curious', - 'curly', - 'custody', - 'cylinder', - 'daisy', - 'damage', - 'dance', - 'darkness', - 'database', - 'daughter', - 'deadline', - 'deal', - 'debris', - 'debut', - 'decent', - 'decision', - 'declare', - 'decorate', - 'decrease', - 'deliver', - 'demand', - 'density', - 'deny', - 'depart', - 'depend', - 'depict', - 'deploy', - 'describe', - 'desert', - 'desire', - 'desktop', - 'destroy', - 'detailed', - 'detect', - 'device', - 'devote', - 'diagnose', - 'dictate', - 'diet', - 'dilemma', - 'diminish', - 'dining', - 'diploma', - 'disaster', - 'discuss', - 'disease', - 'dish', - 'dismiss', - 'display', - 'distance', - 'dive', - 'divorce', - 'document', - 'domain', - 'domestic', - 'dominant', - 'dough', - 'downtown', - 'dragon', - 'dramatic', - 'dream', - 'dress', - 'drift', - 'drink', - 'drove', - 'drug', - 'dryer', - 'duckling', - 'duke', - 'duration', - 'dwarf', - 'dynamic', - 'early', - 'earth', - 'easel', - 'easy', - 'echo', - 'eclipse', - 'ecology', - 'edge', - 'editor', - 'educate', - 'either', - 'elbow', - 'elder', - 'election', - 'elegant', - 'element', - 'elephant', - 'elevator', - 'elite', - 'else', - 'email', - 'emerald', - 'emission', - 'emperor', - 'emphasis', - 'employer', - 'empty', - 'ending', - 'endless', - 'endorse', - 'enemy', - 'energy', - 'enforce', - 'engage', - 'enjoy', - 'enlarge', - 'entrance', - 'envelope', - 'envy', - 'epidemic', - 'episode', - 'equation', - 'equip', - 'eraser', - 'erode', - 'escape', - 'estate', - 'estimate', - 'evaluate', - 'evening', - 'evidence', - 'evil', - 'evoke', - 'exact', - 'example', - 'exceed', - 'exchange', - 'exclude', - 'excuse', - 'execute', - 'exercise', - 'exhaust', - 'exotic', - 'expand', - 'expect', - 'explain', - 'express', - 'extend', - 'extra', - 'eyebrow', - 'facility', - 'fact', - 'failure', - 'faint', - 'fake', - 'false', - 'family', - 'famous', - 'fancy', - 'fangs', - 'fantasy', - 'fatal', - 'fatigue', - 'favorite', - 'fawn', - 'fiber', - 'fiction', - 'filter', - 'finance', - 'findings', - 'finger', - 'firefly', - 'firm', - 'fiscal', - 'fishing', - 'fitness', - 'flame', - 'flash', - 'flavor', - 'flea', - 'flexible', - 'flip', - 'float', - 'floral', - 'fluff', - 'focus', - 'forbid', - 'force', - 'forecast', - 'forget', - 'formal', - 'fortune', - 'forward', - 'founder', - 'fraction', - 'fragment', - 'frequent', - 'freshman', - 'friar', - 'fridge', - 'friendly', - 'frost', - 'froth', - 'frozen', - 'fumes', - 'funding', - 'furl', - 'fused', - 'galaxy', - 'game', - 'garbage', - 'garden', - 'garlic', - 'gasoline', - 'gather', - 'general', - 'genius', - 'genre', - 'genuine', - 'geology', - 'gesture', - 'glad', - 'glance', - 'glasses', - 'glen', - 'glimpse', - 'goat', - 'golden', - 'graduate', - 'grant', - 'grasp', - 'gravity', - 'gray', - 'greatest', - 'grief', - 'grill', - 'grin', - 'grocery', - 'gross', - 'group', - 'grownup', - 'grumpy', - 'guard', - 'guest', - 'guilt', - 'guitar', - 'gums', - 'hairy', - 'hamster', - 'hand', - 'hanger', - 'harvest', - 'have', - 'havoc', - 'hawk', - 'hazard', - 'headset', - 'health', - 'hearing', - 'heat', - 'helpful', - 'herald', - 'herd', - 'hesitate', - 'hobo', - 'holiday', - 'holy', - 'home', - 'hormone', - 'hospital', - 'hour', - 'huge', - 'human', - 'humidity', - 'hunting', - 'husband', - 'hush', - 'husky', - 'hybrid', - 'idea', - 'identify', - 'idle', - 'image', - 'impact', - 'imply', - 'improve', - 'impulse', - 'include', - 'income', - 'increase', - 'index', - 'indicate', - 'industry', - 'infant', - 'inform', - 'inherit', - 'injury', - 'inmate', - 'insect', - 'inside', - 'install', - 'intend', - 'intimate', - 'invasion', - 'involve', - 'iris', - 'island', - 'isolate', - 'item', - 'ivory', - 'jacket', - 'jerky', - 'jewelry', - 'join', - 'judicial', - 'juice', - 'jump', - 'junction', - 'junior', - 'junk', - 'jury', - 'justice', - 'kernel', - 'keyboard', - 'kidney', - 'kind', - 'kitchen', - 'knife', - 'knit', - 'laden', - 'ladle', - 'ladybug', - 'lair', - 'lamp', - 'language', - 'large', - 'laser', - 'laundry', - 'lawsuit', - 'leader', - 'leaf', - 'learn', - 'leaves', - 'lecture', - 'legal', - 'legend', - 'legs', - 'lend', - 'length', - 'level', - 'liberty', - 'library', - 'license', - 'lift', - 'likely', - 'lilac', - 'lily', - 'lips', - 'liquid', - 'listen', - 'literary', - 'living', - 'lizard', - 'loan', - 'lobe', - 'location', - 'losing', - 'loud', - 'loyalty', - 'luck', - 'lunar', - 'lunch', - 'lungs', - 'luxury', - 'lying', - 'lyrics', - 'machine', - 'magazine', - 'maiden', - 'mailman', - 'main', - 'makeup', - 'making', - 'mama', - 'manager', - 'mandate', - 'mansion', - 'manual', - 'marathon', - 'march', - 'market', - 'marvel', - 'mason', - 'material', - 'math', - 'maximum', - 'mayor', - 'meaning', - 'medal', - 'medical', - 'member', - 'memory', - 'mental', - 'merchant', - 'merit', - 'method', - 'metric', - 'midst', - 'mild', - 'military', - 'mineral', - 'minister', - 'miracle', - 'mixed', - 'mixture', - 'mobile', - 'modern', - 'modify', - 'moisture', - 'moment', - 'morning', - 'mortgage', - 'mother', - 'mountain', - 'mouse', - 'move', - 'much', - 'mule', - 'multiple', - 'muscle', - 'museum', - 'music', - 'mustang', - 'nail', - 'national', - 'necklace', - 'negative', - 'nervous', - 'network', - 'news', - 'nuclear', - 'numb', - 'numerous', - 'nylon', - 'oasis', - 'obesity', - 'object', - 'observe', - 'obtain', - 'ocean', - 'often', - 'olympic', - 'omit', - 'oral', - 'orange', - 'orbit', - 'order', - 'ordinary', - 'organize', - 'ounce', - 'oven', - 'overall', - 'owner', - 'paces', - 'pacific', - 'package', - 'paid', - 'painting', - 'pajamas', - 'pancake', - 'pants', - 'papa', - 'paper', - 'parcel', - 'parking', - 'party', - 'patent', - 'patrol', - 'payment', - 'payroll', - 'peaceful', - 'peanut', - 'peasant', - 'pecan', - 'penalty', - 'pencil', - 'percent', - 'perfect', - 'permit', - 'petition', - 'phantom', - 'pharmacy', - 'photo', - 'phrase', - 'physics', - 'pickup', - 'picture', - 'piece', - 'pile', - 'pink', - 'pipeline', - 'pistol', - 'pitch', - 'plains', - 'plan', - 'plastic', - 'platform', - 'playoff', - 'pleasure', - 'plot', - 'plunge', - 'practice', - 'prayer', - 'preach', - 'predator', - 'pregnant', - 'premium', - 'prepare', - 'presence', - 'prevent', - 'priest', - 'primary', - 'priority', - 'prisoner', - 'privacy', - 'prize', - 'problem', - 'process', - 'profile', - 'program', - 'promise', - 'prospect', - 'provide', - 'prune', - 'public', - 'pulse', - 'pumps', - 'punish', - 'puny', - 'pupal', - 'purchase', - 'purple', - 'python', - 'quantity', - 'quarter', - 'quick', - 'quiet', - 'race', - 'racism', - 'radar', - 'railroad', - 'rainbow', - 'raisin', - 'random', - 'ranked', - 'rapids', - 'raspy', - 'reaction', - 'realize', - 'rebound', - 'rebuild', - 'recall', - 'receiver', - 'recover', - 'regret', - 'regular', - 'reject', - 'relate', - 'remember', - 'remind', - 'remove', - 'render', - 'repair', - 'repeat', - 'replace', - 'require', - 'rescue', - 'research', - 'resident', - 'response', - 'result', - 'retailer', - 'retreat', - 'reunion', - 'revenue', - 'review', - 'reward', - 'rhyme', - 'rhythm', - 'rich', - 'rival', - 'river', - 'robin', - 'rocky', - 'romantic', - 'romp', - 'roster', - 'round', - 'royal', - 'ruin', - 'ruler', - 'rumor', - 'sack', - 'safari', - 'salary', - 'salon', - 'salt', - 'satisfy', - 'satoshi', - 'saver', - 'says', - 'scandal', - 'scared', - 'scatter', - 'scene', - 'scholar', - 'science', - 'scout', - 'scramble', - 'screw', - 'script', - 'scroll', - 'seafood', - 'season', - 'secret', - 'security', - 'segment', - 'senior', - 'shadow', - 'shaft', - 'shame', - 'shaped', - 'sharp', - 'shelter', - 'sheriff', - 'short', - 'should', - 'shrimp', - 'sidewalk', - 'silent', - 'silver', - 'similar', - 'simple', - 'single', - 'sister', - 'skin', - 'skunk', - 'slap', - 'slavery', - 'sled', - 'slice', - 'slim', - 'slow', - 'slush', - 'smart', - 'smear', - 'smell', - 'smirk', - 'smith', - 'smoking', - 'smug', - 'snake', - 'snapshot', - 'sniff', - 'society', - 'software', - 'soldier', - 'solution', - 'soul', - 'source', - 'space', - 'spark', - 'speak', - 'species', - 'spelling', - 'spend', - 'spew', - 'spider', - 'spill', - 'spine', - 'spirit', - 'spit', - 'spray', - 'sprinkle', - 'square', - 'squeeze', - 'stadium', - 'staff', - 'standard', - 'starting', - 'station', - 'stay', - 'steady', - 'step', - 'stick', - 'stilt', - 'story', - 'strategy', - 'strike', - 'style', - 'subject', - 'submit', - 'sugar', - 'suitable', - 'sunlight', - 'superior', - 'surface', - 'surprise', - 'survive', - 'sweater', - 'swimming', - 'swing', - 'switch', - 'symbolic', - 'sympathy', - 'syndrome', - 'system', - 'tackle', - 'tactics', - 'tadpole', - 'talent', - 'task', - 'taste', - 'taught', - 'taxi', - 'teacher', - 'teammate', - 'teaspoon', - 'temple', - 'tenant', - 'tendency', - 'tension', - 'terminal', - 'testify', - 'texture', - 'thank', - 'that', - 'theater', - 'theory', - 'therapy', - 'thorn', - 'threaten', - 'thumb', - 'thunder', - 'ticket', - 'tidy', - 'timber', - 'timely', - 'ting', - 'tofu', - 'together', - 'tolerate', - 'total', - 'toxic', - 'tracks', - 'traffic', - 'training', - 'transfer', - 'trash', - 'traveler', - 'treat', - 'trend', - 'trial', - 'tricycle', - 'trip', - 'triumph', - 'trouble', - 'true', - 'trust', - 'twice', - 'twin', - 'type', - 'typical', - 'ugly', - 'ultimate', - 'umbrella', - 'uncover', - 'undergo', - 'unfair', - 'unfold', - 'unhappy', - 'union', - 'universe', - 'unkind', - 'unknown', - 'unusual', - 'unwrap', - 'upgrade', - 'upstairs', - 'username', - 'usher', - 'usual', - 'valid', - 'valuable', - 'vampire', - 'vanish', - 'various', - 'vegan', - 'velvet', - 'venture', - 'verdict', - 'verify', - 'very', - 'veteran', - 'vexed', - 'victim', - 'video', - 'view', - 'vintage', - 'violence', - 'viral', - 'visitor', - 'visual', - 'vitamins', - 'vocal', - 'voice', - 'volume', - 'voter', - 'voting', - 'walnut', - 'warmth', - 'warn', - 'watch', - 'wavy', - 'wealthy', - 'weapon', - 'webcam', - 'welcome', - 'welfare', - 'western', - 'width', - 'wildlife', - 'window', - 'wine', - 'wireless', - 'wisdom', - 'withdraw', - 'wits', - 'wolf', - 'woman', - 'work', - 'worthy', - 'wrap', - 'wrist', - 'writing', - 'wrote', - 'year', - 'yelp', - 'yield', - 'yoga', - 'zero' -]; - -const WORD_LIST_MAP = WORD_LIST.reduce((obj, val, idx) => { - obj[val] = idx; - return obj; -}, {}); - -exports = module.exports = { - MIN_ENTROPY_BITS, - generateIdentifier, - encodeMnemonic, - validateMnemonic, - splitSecret, - combineMnemonics, - crypt, - bitsToBytes -}; diff --git a/blue_modules/slip39/test/test.js b/blue_modules/slip39/test/test.js deleted file mode 100644 index 341a3c2ce..000000000 --- a/blue_modules/slip39/test/test.js +++ /dev/null @@ -1,353 +0,0 @@ -const assert = require('assert'); -const slip39 = require('../dist/slip39'); - -const MASTERSECRET = 'ABCDEFGHIJKLMNOP'; -const MS = MASTERSECRET.slip39EncodeHex(); -const PASSPHRASE = 'TREZOR'; -const ONE_GROUP = [ - [5, 7] -]; - -const slip15 = slip39.fromArray(MS, { - passphrase: PASSPHRASE, - threshold: 1, - groups: ONE_GROUP -}); - -const slip15NoPW = slip39.fromArray(MS, { - threshold: 1, - groups: ONE_GROUP -}); - -// -// Shuffle -// -function shuffle(array) { - for (let i = array.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [array[i], array[j]] = [array[j], array[i]]; - } -} - -// -// Combination C(n, k) of the grooups -// -function getCombinations(array, k) { - let result = []; - let combinations = []; - - function helper(level, start) { - for (let i = start; i < array.length - k + level + 1; i++) { - combinations[level] = array[i]; - - if (level < k - 1) { - helper(level + 1, i + 1); - } else { - result.push(combinations.slice(0)); - } - } - } - - helper(0, 0); - return result; -} - -describe('Basic Tests', () => { - describe('Test threshold 1 with 5 of 7 shares of a group combinations', () => { - let mnemonics = slip15.fromPath('r/0').mnemonics; - - let combinations = getCombinations([0, 1, 2, 3, 4, 5, 6], 5); - combinations.forEach((item) => { - shuffle(item); - let description = `Test shuffled combination ${item.join(' ')}.`; - it(description, () => { - let shares = item.map((idx) => mnemonics[idx]); - assert(MS.slip39DecodeHex() === slip39.recoverSecret(shares, PASSPHRASE) - .slip39DecodeHex()); - }); - }); - }); - - describe('Test passhrase', () => { - let mnemonics = slip15.fromPath('r/0').mnemonics; - let nopwMnemonics = slip15NoPW.fromPath('r/0').mnemonics; - - it('should return valid mastersecret when user submits valid passphrase', () => { - assert(MS.slip39DecodeHex() === slip39.recoverSecret(mnemonics.slice(0, 5), PASSPHRASE) - .slip39DecodeHex()); - }); - it('should NOT return valid mastersecret when user submits invalid passphrse', () => { - assert(MS.slip39DecodeHex() !== slip39.recoverSecret(mnemonics.slice(0, 5)) - .slip39DecodeHex()); - }); - it('should return valid mastersecret when user does not submit passphrase', () => { - assert(MS.slip39DecodeHex() === slip39.recoverSecret(nopwMnemonics.slice(0, 5)) - .slip39DecodeHex()); - }); - }); - - describe('Test iteration exponent', () => { - const slip1 = slip39.fromArray(MS, { - iterationExponent: 1 - }); - - const slip2 = slip39.fromArray(MS, { - iterationExponent: 2 - }); - - it('should return valid mastersecret when user apply valid iteration exponent', () => { - assert(MS.slip39DecodeHex() === slip39.recoverSecret(slip1.fromPath('r/0').mnemonics) - .slip39DecodeHex()); - - assert(MS.slip39DecodeHex() === slip39.recoverSecret(slip2.fromPath('r/0').mnemonics) - .slip39DecodeHex()); - }); - /** - * assert.throws(() => x.y.z); - * assert.throws(() => x.y.z, ReferenceError); - * assert.throws(() => x.y.z, ReferenceError, /is not defined/); - * assert.throws(() => x.y.z, /is not defined/); - * assert.doesNotThrow(() => 42); - * assert.throws(() => x.y.z, Error); - * assert.throws(() => model.get.z, /Property does not exist in model schema./) - * Ref: https://stackoverflow.com/questions/21587122/mocha-chai-expect-to-throw-not-catching-thrown-errors - */ - it('should throw an Error when user submits invalid iteration exponent', () => { - assert.throws(() => slip39.fromArray(MS, { - iterationExponent: -1 - }), Error); - assert.throws(() => slip39.fromArray(MS, { - iterationExponent: 33 - }), Error); - }); - }); -}); - -// FIXME: finish it. -describe('Group Sharing Tests', () => { - describe('Test all valid combinations of mnemonics', () => { - const groups = [ - [3, 5, 'Group 0'], - [3, 3, 'Group 1'], - [2, 5, 'Group 2'], - [1, 1, 'Group 3'] - ]; - const slip = slip39.fromArray(MS, { - threshold: 2, - groups: groups, - title: 'Trezor one SSSS' - }); - - const group2Mnemonics = slip.fromPath('r/2').mnemonics; - const group3Mnemonic = slip.fromPath('r/3').mnemonics[0]; - - it('Should include overall split title', () => { - assert.equal(slip.fromPath('r').description, 'Trezor one SSSS'); - }); - it('Should include group descriptions', () => { - assert.equal(slip.fromPath('r/0').description, 'Group 0'); - assert.equal(slip.fromPath('r/1').description, 'Group 1'); - assert.equal(slip.fromPath('r/2').description, 'Group 2'); - assert.equal(slip.fromPath('r/3').description, 'Group 3'); - }); - it('Should return the valid master secret when it tested with minimal sets of mnemonics.', () => { - const mnemonics = group2Mnemonics.filter((_, index) => { - return index === 0 || index === 2; - }).concat(group3Mnemonic); - - assert(MS.slip39DecodeHex() === slip39.recoverSecret(mnemonics).slip39DecodeHex()); - }); - it('TODO: Should NOT return the valid master secret when one complete group and one incomplete group out of two groups required', () => { - assert(true); - }); - it('TODO: Should return the valid master secret when one group of two required but only one applied.', () => { - assert(true); - }); - }); -}); - -describe('Original test vectors Tests', () => { - let fs = require('fs'); - let path = require('path'); - let filePath = path.join(__dirname, 'vectors.json'); - - let content = fs.readFileSync(filePath, 'utf-8'); - - const tests = JSON.parse(content); - tests.forEach((item) => { - let description = item[0]; - let mnemonics = item[1]; - let masterSecret = Buffer.from(item[2], 'hex'); - - it(description, () => { - if (masterSecret.length !== 0) { - let ms = slip39.recoverSecret(mnemonics, PASSPHRASE); - assert(masterSecret.every((v, i) => v === ms[i])); - } else { - assert.throws(() => slip39.recoverSecret(mnemonics, PASSPHRASE), Error); - } - }); - }); -}); - -describe('Invalid Shares', () => { - const tests = [ - ['Short master secret', 1, [ - [2, 3] - ], MS.slice(0, 14)], - ['Odd length master secret', 1, [ - [2, 3] - ], MS.concat([55])], - ['Group threshold exceeds number of groups', 3, [ - [3, 5], - [2, 5] - ], MS], - ['Invalid group threshold.', 0, [ - [3, 5], - [2, 5] - ], MS], - ['Member threshold exceeds number of members', 2, [ - [3, 2], - [2, 5] - ], MS], - ['Invalid member threshold', 2, [ - [0, 2], - [2, 5] - ], MS], - ['Group with multiple members and threshold 1', 2, [ - [3, 5], - [1, 3], - [2, 5] - ], MS] - ]; - - tests.forEach((item) => { - let description = item[0]; - let threshold = item[1]; - - let groups = item[2]; - let secret = item[3]; - - it(description, () => { - assert.throws(() => - slip39.fromArray(secret, { - threshold: threshold, - groups: groups - }), Error); - }); - }); -}); - -describe('Mnemonic Validation', () => { - describe('Valid Mnemonics', () => { - let mnemonics = slip15.fromPath('r/0').mnemonics; - - mnemonics.forEach((mnemonic, index) => { - it(`Mnemonic at index ${index} should be valid`, () => { - const isValid = slip39.validateMnemonic(mnemonic); - - assert(isValid); - }); - }); - }); - - const vectors = [ - [ - '2. Mnemonic with invalid checksum (128 bits)', - [ - 'duckling enlarge academic academic agency result length solution fridge kidney coal piece deal husband erode duke ajar critical decision kidney' - ] - ], - [ - '21. Mnemonic with invalid checksum (256 bits)', - [ - 'theory painting academic academic armed sweater year military elder discuss acne wildlife boring employer fused large satoshi bundle carbon diagnose anatomy hamster leaves tracks paces beyond phantom capital marvel lips brave detect lunar' - ] - ], - [ - '3. Mnemonic with invalid padding (128 bits)', - [ - 'duckling enlarge academic academic email result length solution fridge kidney coal piece deal husband erode duke ajar music cargo fitness' - ] - ], - [ - '22. Mnemonic with invalid padding (256 bits)', - [ - 'theory painting academic academic campus sweater year military elder discuss acne wildlife boring employer fused large satoshi bundle carbon diagnose anatomy hamster leaves tracks paces beyond phantom capital marvel lips facility obtain sister' - ] - ], - [ - '10. Mnemonics with greater group threshold than group counts (128 bits)', - [ - 'music husband acrobat acid artist finance center either graduate swimming object bike medical clothes station aspect spider maiden bulb welcome', - 'music husband acrobat agency advance hunting bike corner density careful material civil evil tactics remind hawk discuss hobo voice rainbow', - 'music husband beard academic black tricycle clock mayor estimate level photo episode exclude ecology papa source amazing salt verify divorce' - ] - ], - [ - '29. Mnemonics with greater group threshold than group counts (256 bits)', - [ - 'smirk pink acrobat acid auction wireless impulse spine sprinkle fortune clogs elbow guest hush loyalty crush dictate tracks airport talent', - 'smirk pink acrobat agency dwarf emperor ajar organize legs slice harvest plastic dynamic style mobile float bulb health coding credit', - 'smirk pink beard academic alto strategy carve shame language rapids ruin smart location spray training acquire eraser endorse submit peaceful' - ] - ], - [ - '39. Mnemonic with insufficient length', - [ - 'junk necklace academic academic acne isolate join hesitate lunar roster dough calcium chemical ladybug amount mobile glasses verify cylinder' - ] - ], - [ - '40. Mnemonic with invalid master secret length', - [ - 'fraction necklace academic academic award teammate mouse regular testify coding building member verdict purchase blind camera duration email prepare spirit quarter' - ] - ] - ]; - - vectors.forEach((item) => { - const description = item[0]; - const mnemonics = item[1]; - - describe(description, () => { - mnemonics.forEach((mnemonic, index) => { - it(`Mnemonic at index ${index} should be invalid`, () => { - const isValid = slip39.validateMnemonic(mnemonic); - - assert(isValid === false); - }); - }); - }); - }); -}); - -function itTestArray(t, g, gs) { - it( - `recover master secret for ${t} shares (threshold=${t}) of ${g} '[1, 1,]' groups",`, - () => { - let slip = slip39.fromArray(MS, { - groups: gs.slice(0, g), - passphrase: PASSPHRASE, - threshold: t - }); - - let mnemonics = slip.fromPath('r').mnemonics.slice(0, t); - - let recoveredSecret = - slip39.recoverSecret(mnemonics, PASSPHRASE); - - assert(MASTERSECRET === String.fromCharCode(...recoveredSecret)); - }); -} - -describe('Groups test (T=1, N=1 e.g. [1,1]) - ', () => { - let totalGroups = 16; - let groups = Array.from(Array(totalGroups), () => [1, 1]); - - for (group = 1; group <= totalGroups; group++) { - for (threshold = 1; threshold <= group; threshold++) { - itTestArray(threshold, group, groups); - } - } -}); diff --git a/blue_modules/slip39/test/vectors.json b/blue_modules/slip39/test/vectors.json deleted file mode 100644 index ca83a10e9..000000000 --- a/blue_modules/slip39/test/vectors.json +++ /dev/null @@ -1,322 +0,0 @@ -[ - [ - "1. Valid mnemonic without sharing (128 bits)", - [ - "duckling enlarge academic academic agency result length solution fridge kidney coal piece deal husband erode duke ajar critical decision keyboard" - ], - "bb54aac4b89dc868ba37d9cc21b2cece" - ], - [ - "2. Mnemonic with invalid checksum (128 bits)", - [ - "duckling enlarge academic academic agency result length solution fridge kidney coal piece deal husband erode duke ajar critical decision kidney" - ], - "" - ], - [ - "3. Mnemonic with invalid padding (128 bits)", - [ - "duckling enlarge academic academic email result length solution fridge kidney coal piece deal husband erode duke ajar music cargo fitness" - ], - "" - ], - [ - "4. Basic sharing 2-of-3 (128 bits)", - [ - "shadow pistol academic always adequate wildlife fancy gross oasis cylinder mustang wrist rescue view short owner flip making coding armed", - "shadow pistol academic acid actress prayer class unknown daughter sweater depict flip twice unkind craft early superior advocate guest smoking" - ], - "b43ceb7e57a0ea8766221624d01b0864" - ], - [ - "5. Basic sharing 2-of-3 (128 bits)", - [ - "shadow pistol academic always adequate wildlife fancy gross oasis cylinder mustang wrist rescue view short owner flip making coding armed" - ], - "" - ], - [ - "6. Mnemonics with different identifiers (128 bits)", - [ - "adequate smoking academic acid debut wine petition glen cluster slow rhyme slow simple epidemic rumor junk tracks treat olympic tolerate", - "adequate stay academic agency agency formal party ting frequent learn upstairs remember smear leaf damage anatomy ladle market hush corner" - ], - "" - ], - [ - "7. Mnemonics with different iteration exponents (128 bits)", - [ - "peasant leaves academic acid desert exact olympic math alive axle trial tackle drug deny decent smear dominant desert bucket remind", - "peasant leader academic agency cultural blessing percent network envelope medal junk primary human pumps jacket fragment payroll ticket evoke voice" - ], - "" - ], - [ - "8. Mnemonics with mismatching group thresholds (128 bits)", - [ - "liberty category beard echo animal fawn temple briefing math username various wolf aviation fancy visual holy thunder yelp helpful payment", - "liberty category beard email beyond should fancy romp founder easel pink holy hairy romp loyalty material victim owner toxic custody", - "liberty category academic easy being hazard crush diminish oral lizard reaction cluster force dilemma deploy force club veteran expect photo" - ], - "" - ], - [ - "9. Mnemonics with mismatching group counts (128 bits)", - [ - "average senior academic leaf broken teacher expect surface hour capture obesity desire negative dynamic dominant pistol mineral mailman iris aide", - "average senior academic agency curious pants blimp spew clothes slice script dress wrap firm shaft regular slavery negative theater roster" - ], - "" - ], - [ - "10. Mnemonics with greater group threshold than group counts (128 bits)", - [ - "music husband acrobat acid artist finance center either graduate swimming object bike medical clothes station aspect spider maiden bulb welcome", - "music husband acrobat agency advance hunting bike corner density careful material civil evil tactics remind hawk discuss hobo voice rainbow", - "music husband beard academic black tricycle clock mayor estimate level photo episode exclude ecology papa source amazing salt verify divorce" - ], - "" - ], - [ - "11. Mnemonics with duplicate member indices (128 bits)", - [ - "device stay academic always dive coal antenna adult black exceed stadium herald advance soldier busy dryer daughter evaluate minister laser", - "device stay academic always dwarf afraid robin gravity crunch adjust soul branch walnut coastal dream costume scholar mortgage mountain pumps" - ], - "" - ], - [ - "12. Mnemonics with mismatching member thresholds (128 bits)", - [ - "hour painting academic academic device formal evoke guitar random modern justice filter withdraw trouble identify mailman insect general cover oven", - "hour painting academic agency artist again daisy capital beaver fiber much enjoy suitable symbolic identify photo editor romp float echo" - ], - "" - ], - [ - "13. Mnemonics giving an invalid digest (128 bits)", - [ - "guilt walnut academic acid deliver remove equip listen vampire tactics nylon rhythm failure husband fatigue alive blind enemy teaspoon rebound", - "guilt walnut academic agency brave hamster hobo declare herd taste alpha slim criminal mild arcade formal romp branch pink ambition" - ], - "" - ], - [ - "14. Insufficient number of groups (128 bits, case 1)", - [ - "eraser senior beard romp adorn nuclear spill corner cradle style ancient family general leader ambition exchange unusual garlic promise voice" - ], - "" - ], - [ - "15. Insufficient number of groups (128 bits, case 2)", - [ - "eraser senior decision scared cargo theory device idea deliver modify curly include pancake both news skin realize vitamins away join", - "eraser senior decision roster beard treat identify grumpy salt index fake aviation theater cubic bike cause research dragon emphasis counter" - ], - "" - ], - [ - "16. Threshold number of groups, but insufficient number of members in one group (128 bits)", - [ - "eraser senior decision shadow artist work morning estate greatest pipeline plan ting petition forget hormone flexible general goat admit surface", - "eraser senior beard romp adorn nuclear spill corner cradle style ancient family general leader ambition exchange unusual garlic promise voice" - ], - "" - ], - [ - "17. Threshold number of groups and members in each group (128 bits, case 1)", - [ - "eraser senior decision roster beard treat identify grumpy salt index fake aviation theater cubic bike cause research dragon emphasis counter", - "eraser senior ceramic snake clay various huge numb argue hesitate auction category timber browser greatest hanger petition script leaf pickup", - "eraser senior ceramic shaft dynamic become junior wrist silver peasant force math alto coal amazing segment yelp velvet image paces", - "eraser senior ceramic round column hawk trust auction smug shame alive greatest sheriff living perfect corner chest sled fumes adequate", - "eraser senior decision smug corner ruin rescue cubic angel tackle skin skunk program roster trash rumor slush angel flea amazing" - ], - "7c3397a292a5941682d7a4ae2d898d11" - ], - [ - "18. Threshold number of groups and members in each group (128 bits, case 2)", - [ - "eraser senior decision smug corner ruin rescue cubic angel tackle skin skunk program roster trash rumor slush angel flea amazing", - "eraser senior beard romp adorn nuclear spill corner cradle style ancient family general leader ambition exchange unusual garlic promise voice", - "eraser senior decision scared cargo theory device idea deliver modify curly include pancake both news skin realize vitamins away join" - ], - "7c3397a292a5941682d7a4ae2d898d11" - ], - [ - "19. Threshold number of groups and members in each group (128 bits, case 3)", - [ - "eraser senior beard romp adorn nuclear spill corner cradle style ancient family general leader ambition exchange unusual garlic promise voice", - "eraser senior acrobat romp bishop medical gesture pumps secret alive ultimate quarter priest subject class dictate spew material endless market" - ], - "7c3397a292a5941682d7a4ae2d898d11" - ], - [ - "20. Valid mnemonic without sharing (256 bits)", - [ - "theory painting academic academic armed sweater year military elder discuss acne wildlife boring employer fused large satoshi bundle carbon diagnose anatomy hamster leaves tracks paces beyond phantom capital marvel lips brave detect luck" - ], - "989baf9dcaad5b10ca33dfd8cc75e42477025dce88ae83e75a230086a0e00e92" - ], - [ - "21. Mnemonic with invalid checksum (256 bits)", - [ - "theory painting academic academic armed sweater year military elder discuss acne wildlife boring employer fused large satoshi bundle carbon diagnose anatomy hamster leaves tracks paces beyond phantom capital marvel lips brave detect lunar" - ], - "" - ], - [ - "22. Mnemonic with invalid padding (256 bits)", - [ - "theory painting academic academic campus sweater year military elder discuss acne wildlife boring employer fused large satoshi bundle carbon diagnose anatomy hamster leaves tracks paces beyond phantom capital marvel lips facility obtain sister" - ], - "" - ], - [ - "23. Basic sharing 2-of-3 (256 bits)", - [ - "humidity disease academic always aluminum jewelry energy woman receiver strategy amuse duckling lying evidence network walnut tactics forget hairy rebound impulse brother survive clothes stadium mailman rival ocean reward venture always armed unwrap", - "humidity disease academic agency actress jacket gross physics cylinder solution fake mortgage benefit public busy prepare sharp friar change work slow purchase ruler again tricycle involve viral wireless mixture anatomy desert cargo upgrade" - ], - "c938b319067687e990e05e0da0ecce1278f75ff58d9853f19dcaeed5de104aae" - ], - [ - "24. Basic sharing 2-of-3 (256 bits)", - [ - "humidity disease academic always aluminum jewelry energy woman receiver strategy amuse duckling lying evidence network walnut tactics forget hairy rebound impulse brother survive clothes stadium mailman rival ocean reward venture always armed unwrap" - ], - "" - ], - [ - "25. Mnemonics with different identifiers (256 bits)", - [ - "smear husband academic acid deadline scene venture distance dive overall parking bracelet elevator justice echo burning oven chest duke nylon", - "smear isolate academic agency alpha mandate decorate burden recover guard exercise fatal force syndrome fumes thank guest drift dramatic mule" - ], - "" - ], - [ - "26. Mnemonics with different iteration exponents (256 bits)", - [ - "finger trash academic acid average priority dish revenue academic hospital spirit western ocean fact calcium syndrome greatest plan losing dictate", - "finger traffic academic agency building lilac deny paces subject threaten diploma eclipse window unknown health slim piece dragon focus smirk" - ], - "" - ], - [ - "27. Mnemonics with mismatching group thresholds (256 bits)", - [ - "flavor pink beard echo depart forbid retreat become frost helpful juice unwrap reunion credit math burning spine black capital lair", - "flavor pink beard email diet teaspoon freshman identify document rebound cricket prune headset loyalty smell emission skin often square rebound", - "flavor pink academic easy credit cage raisin crazy closet lobe mobile become drink human tactics valuable hand capture sympathy finger" - ], - "" - ], - [ - "28. Mnemonics with mismatching group counts (256 bits)", - [ - "column flea academic leaf debut extra surface slow timber husky lawsuit game behavior husky swimming already paper episode tricycle scroll", - "column flea academic agency blessing garbage party software stadium verify silent umbrella therapy decorate chemical erode dramatic eclipse replace apart" - ], - "" - ], - [ - "29. Mnemonics with greater group threshold than group counts (256 bits)", - [ - "smirk pink acrobat acid auction wireless impulse spine sprinkle fortune clogs elbow guest hush loyalty crush dictate tracks airport talent", - "smirk pink acrobat agency dwarf emperor ajar organize legs slice harvest plastic dynamic style mobile float bulb health coding credit", - "smirk pink beard academic alto strategy carve shame language rapids ruin smart location spray training acquire eraser endorse submit peaceful" - ], - "" - ], - [ - "30. Mnemonics with duplicate member indices (256 bits)", - [ - "fishing recover academic always device craft trend snapshot gums skin downtown watch device sniff hour clock public maximum garlic born", - "fishing recover academic always aircraft view software cradle fangs amazing package plastic evaluate intend penalty epidemic anatomy quarter cage apart" - ], - "" - ], - [ - "31. Mnemonics with mismatching member thresholds (256 bits)", - [ - "evoke garden academic academic answer wolf scandal modern warmth station devote emerald market physics surface formal amazing aquatic gesture medical", - "evoke garden academic agency deal revenue knit reunion decrease magazine flexible company goat repair alarm military facility clogs aide mandate" - ], - "" - ], - [ - "32. Mnemonics giving an invalid digest (256 bits)", - [ - "river deal academic acid average forbid pistol peanut custody bike class aunt hairy merit valid flexible learn ajar very easel", - "river deal academic agency camera amuse lungs numb isolate display smear piece traffic worthy year patrol crush fact fancy emission" - ], - "" - ], - [ - "33. Insufficient number of groups (256 bits, case 1)", - [ - "wildlife deal beard romp alcohol space mild usual clothes union nuclear testify course research heat listen task location thank hospital slice smell failure fawn helpful priest ambition average recover lecture process dough stadium" - ], - "" - ], - [ - "34. Insufficient number of groups (256 bits, case 2)", - [ - "wildlife deal decision scared acne fatal snake paces obtain election dryer dominant romp tactics railroad marvel trust helpful flip peanut theory theater photo luck install entrance taxi step oven network dictate intimate listen", - "wildlife deal decision smug ancestor genuine move huge cubic strategy smell game costume extend swimming false desire fake traffic vegan senior twice timber submit leader payroll fraction apart exact forward pulse tidy install" - ], - "" - ], - [ - "35. Threshold number of groups, but insufficient number of members in one group (256 bits)", - [ - "wildlife deal decision shadow analysis adjust bulb skunk muscle mandate obesity total guitar coal gravity carve slim jacket ruin rebuild ancestor numerous hour mortgage require herd maiden public ceiling pecan pickup shadow club", - "wildlife deal beard romp alcohol space mild usual clothes union nuclear testify course research heat listen task location thank hospital slice smell failure fawn helpful priest ambition average recover lecture process dough stadium" - ], - "" - ], - [ - "36. Threshold number of groups and members in each group (256 bits, case 1)", - [ - "wildlife deal ceramic round aluminum pitch goat racism employer miracle percent math decision episode dramatic editor lily prospect program scene rebuild display sympathy have single mustang junction relate often chemical society wits estate", - "wildlife deal decision scared acne fatal snake paces obtain election dryer dominant romp tactics railroad marvel trust helpful flip peanut theory theater photo luck install entrance taxi step oven network dictate intimate listen", - "wildlife deal ceramic scatter argue equip vampire together ruin reject literary rival distance aquatic agency teammate rebound false argue miracle stay again blessing peaceful unknown cover beard acid island language debris industry idle", - "wildlife deal ceramic snake agree voter main lecture axis kitchen physics arcade velvet spine idea scroll promise platform firm sharp patrol divorce ancestor fantasy forbid goat ajar believe swimming cowboy symbolic plastic spelling", - "wildlife deal decision shadow analysis adjust bulb skunk muscle mandate obesity total guitar coal gravity carve slim jacket ruin rebuild ancestor numerous hour mortgage require herd maiden public ceiling pecan pickup shadow club" - ], - "5385577c8cfc6c1a8aa0f7f10ecde0a3318493262591e78b8c14c6686167123b" - ], - [ - "37. Threshold number of groups and members in each group (256 bits, case 2)", - [ - "wildlife deal decision scared acne fatal snake paces obtain election dryer dominant romp tactics railroad marvel trust helpful flip peanut theory theater photo luck install entrance taxi step oven network dictate intimate listen", - "wildlife deal beard romp alcohol space mild usual clothes union nuclear testify course research heat listen task location thank hospital slice smell failure fawn helpful priest ambition average recover lecture process dough stadium", - "wildlife deal decision smug ancestor genuine move huge cubic strategy smell game costume extend swimming false desire fake traffic vegan senior twice timber submit leader payroll fraction apart exact forward pulse tidy install" - ], - "5385577c8cfc6c1a8aa0f7f10ecde0a3318493262591e78b8c14c6686167123b" - ], - [ - "38. Threshold number of groups and members in each group (256 bits, case 3)", - [ - "wildlife deal beard romp alcohol space mild usual clothes union nuclear testify course research heat listen task location thank hospital slice smell failure fawn helpful priest ambition average recover lecture process dough stadium", - "wildlife deal acrobat romp anxiety axis starting require metric flexible geology game drove editor edge screw helpful have huge holy making pitch unknown carve holiday numb glasses survive already tenant adapt goat fangs" - ], - "5385577c8cfc6c1a8aa0f7f10ecde0a3318493262591e78b8c14c6686167123b" - ], - [ - "39. Mnemonic with insufficient length", - [ - "junk necklace academic academic acne isolate join hesitate lunar roster dough calcium chemical ladybug amount mobile glasses verify cylinder" - ], - "" - ], - [ - "40. Mnemonic with invalid master secret length", - [ - "fraction necklace academic academic award teammate mouse regular testify coding building member verdict purchase blind camera duration email prepare spirit quarter" - ], - "" - ] -] diff --git a/package-lock.json b/package-lock.json index 751e59918..47854cd8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14697,11 +14697,6 @@ "esprima": "^4.0.0" } }, - "jsbi": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.1.4.tgz", - "integrity": "sha512-52QRRFSsi9impURE8ZUbzAMCLjPm4THO7H2fcuIvaaeFTbSysvkodbQQXIVsNgq/ypDbq6dJiuGKL0vZ/i9hUg==" - }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -19843,13 +19838,8 @@ } }, "slip39": { - "version": "file:blue_modules/slip39", - "requires": { - "create-hmac": "^1.1.3", - "jsbi": "^3.1.4", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - } + "version": "git+https://github.com/BlueWallet/slip39-js.git#041e66bde9e6550096f51cfb6e3bc1c9803521c3", + "from": "git+https://github.com/BlueWallet/slip39-js.git" }, "snapdragon": { "version": "0.8.2", diff --git a/package.json b/package.json index e7929a3f8..11d7521ea 100644 --- a/package.json +++ b/package.json @@ -194,7 +194,7 @@ "rn-nodeify": "10.3.0", "scryptsy": "file:blue_modules/scryptsy", "secure-random": "1.1.2", - "slip39": "file:blue_modules/slip39", + "slip39": "https://github.com/BlueWallet/slip39-js", "stream-browserify": "2.0.2", "url": "0.11.0", "util": "0.12.4", From b6f10b7201fa11a212d2a2f0fb6c1e9fa28bc9e2 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Sat, 24 Jul 2021 09:37:19 +0100 Subject: [PATCH 272/327] REF --- screen/wallets/add.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/screen/wallets/add.js b/screen/wallets/add.js index aecfdbf36..95248ab99 100644 --- a/screen/wallets/add.js +++ b/screen/wallets/add.js @@ -75,7 +75,7 @@ const WalletsAdd = () => { useEffect(() => { AsyncStorage.getItem(AppStorage.LNDHUB) - .then(setWalletBaseURI) + .then(url => setWalletBaseURI(url || 'https://lndhub.io')) .catch(() => setWalletBaseURI('')); isAdancedModeEnabled() .then(setIsAdvancedOptionsEnabled) From 1204032b200e32943b80bb1451a7353580fe7a7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sat, 24 Jul 2021 11:01:11 -0400 Subject: [PATCH 273/327] ADD: onScrollToIndexFailed for Wallet Carousel --- components/WalletsCarousel.js | 15 ++++++++++++++- index.js | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/components/WalletsCarousel.js b/components/WalletsCarousel.js index 5b49cd4be..ec3288b0a 100644 --- a/components/WalletsCarousel.js +++ b/components/WalletsCarousel.js @@ -353,6 +353,17 @@ const WalletsCarousel = forwardRef((props, ref) => { }, })); + const onScrollToIndexFailed = error => { + console.log('onScrollToIndexFailed'); + console.log(error); + flatListRef.current.scrollToOffset({ offset: error.averageItemLength * error.index, animated: true }); + setTimeout(() => { + if (props.data.length !== 0 && flatListRef.current !== null) { + flatListRef.scrollToIndex({ index: error.index, animated: true }); + } + }, 100); + }; + const { width } = useWindowDimensions(); const sliderHeight = 190; const itemWidth = width * 0.82 > 375 ? 375 : width * 0.82; @@ -360,7 +371,7 @@ const WalletsCarousel = forwardRef((props, ref) => { index.toString()} showsVerticalScrollIndicator={false} pagingEnabled @@ -373,6 +384,7 @@ const WalletsCarousel = forwardRef((props, ref) => { initialNumToRender={10} ListHeaderComponent={ListHeaderComponent} style={props.horizontal ? { height: sliderHeight + 9 } : {}} + onScrollToIndexFailed={onScrollToIndexFailed} {...props} /> ); @@ -383,6 +395,7 @@ WalletsCarousel.propTypes = { selectedWallet: PropTypes.string, onPress: PropTypes.func.isRequired, handleLongPress: PropTypes.func.isRequired, + data: PropTypes.array, }; export default WalletsCarousel; diff --git a/index.js b/index.js index 0363db6f1..234e6826f 100644 --- a/index.js +++ b/index.js @@ -5,7 +5,7 @@ import App from './App'; import { BlueStorageProvider } from './blue_modules/storage-context'; import { enableScreens } from 'react-native-screens'; const A = require('./blue_modules/analytics'); -enableScreens(false) +enableScreens(false); if (!Error.captureStackTrace) { // captureStackTrace is only available when debugging Error.captureStackTrace = () => {}; From bb53b03faa5bfe7dbf932cd79f5285c828e5f124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sat, 24 Jul 2021 12:05:01 -0400 Subject: [PATCH 274/327] Update WalletsCarousel.js --- components/WalletsCarousel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/WalletsCarousel.js b/components/WalletsCarousel.js index ec3288b0a..4098a6a25 100644 --- a/components/WalletsCarousel.js +++ b/components/WalletsCarousel.js @@ -359,7 +359,7 @@ const WalletsCarousel = forwardRef((props, ref) => { flatListRef.current.scrollToOffset({ offset: error.averageItemLength * error.index, animated: true }); setTimeout(() => { if (props.data.length !== 0 && flatListRef.current !== null) { - flatListRef.scrollToIndex({ index: error.index, animated: true }); + flatListRef.current.scrollToIndex({ index: error.index, animated: true }); } }, 100); }; From 706c5f76340b43e3c1fb4f6ed939b00397376fa6 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Sun, 25 Jul 2021 16:06:16 +0100 Subject: [PATCH 275/327] REL: version bump to 6.2.2 --- android/app/build.gradle | 2 +- ios/BlueWallet.xcodeproj/project.pbxproj | 24 ++++++++++++------------ package-lock.json | 2 +- package.json | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 6e07ed6e5..20ca07f48 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -139,7 +139,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 - versionName "6.2.1" + versionName "6.2.2" multiDexEnabled true missingDimensionStrategy 'react-native-camera', 'general' testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index efce2c675..a7f9ee7c0 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -1344,7 +1344,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.2.1; + MARKETING_VERSION = 6.2.2; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1388,7 +1388,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.2.1; + MARKETING_VERSION = 6.2.2; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1429,7 +1429,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.1; + MARKETING_VERSION = 6.2.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; @@ -1468,7 +1468,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.1; + MARKETING_VERSION = 6.2.2; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; PRODUCT_NAME = "BlueWallet - Bitcoin Price"; @@ -1500,7 +1500,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.2.1; + MARKETING_VERSION = 6.2.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; @@ -1532,7 +1532,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.2.1; + MARKETING_VERSION = 6.2.2; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1570,7 +1570,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.1; + MARKETING_VERSION = 6.2.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; @@ -1615,7 +1615,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.1; + MARKETING_VERSION = 6.2.2; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1760,7 +1760,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.1; + MARKETING_VERSION = 6.2.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; @@ -1800,7 +1800,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.1; + MARKETING_VERSION = 6.2.2; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -1836,7 +1836,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.2.1; + MARKETING_VERSION = 6.2.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; @@ -1875,7 +1875,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.2.1; + MARKETING_VERSION = 6.2.2; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/package-lock.json b/package-lock.json index a92852bf3..8e8d4ae0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.2.1", + "version": "6.2.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 47e2e5d74..a43e761ea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.2.1", + "version": "6.2.2", "license": "MIT", "repository": { "type": "git", From 6648d1e6bb1ba781b7e5b8f60e2955d5696cf9bb Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 26 Jul 2021 07:19:14 +0000 Subject: [PATCH 276/327] Translate /loc/en.json in fr_FR review completed for the source file '/loc/en.json' on the 'fr_FR' language. --- loc/fr_fr.json | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/loc/fr_fr.json b/loc/fr_fr.json index 57e44ce04..1488214f3 100644 --- a/loc/fr_fr.json +++ b/loc/fr_fr.json @@ -4,7 +4,7 @@ "cancel": "Annuler", "continue": "Continuer", "enter_password": "Saisir le mot de passe", - "never": "jamais", + "never": "Jamais", "of": "{number} sur {total}", "ok": "OK", "storage_is_encrypted": "L'espace de stockage est chiffré. le mot de passe est requis pour le déchiffrer.", @@ -15,8 +15,13 @@ "save": "Enregistrer", "seed": "Graine", "success": "Succès", - "wallet_key": "Clé de portefeuille", - "invalid_animated_qr_code_fragment": "Fragment du QR Code animé invalide. Veuillez essayer encore.", + "wallet_key": "Clé du portefeuille", + "invalid_animated_qr_code_fragment" : "Fragment du QR Code animé invalide. Veuillez réessayer.", + "file_saved": "Le fichier {filePath} a été sauvegardé dans votre {destination}.", + "file_save_title": "Sauvegarder le fichier", + "file_save_location": "Sélectionner où sauvegarder {filePath}", + "downloads_folder": "Dossier des téléchargements", + "external_storage": "Stockage externe", "discard_changes": "Supprimer les changements ?", "discard_changes_detail": "Certaines modifications n'ont pas été enregistrées. Êtes-vous sûr de vouloir les supprimer et quitter cet écran ?" }, @@ -35,7 +40,7 @@ "undo": "Défaire" }, "errors": { - "broadcast": "La transmission a échoué", + "broadcast": "La transmission a échoué.", "error": "Erreur", "network": "Erreur réseau" }, @@ -43,17 +48,17 @@ "are_you_sure_you_want_to_logout": "Voulez-vraiment vous déconnecter de HodlHodl ?", "cont_address_escrow": "Séquestre", "cont_address_to": "À", - "cont_buying": "achète", + "cont_buying": "Achat", "cont_cancel": "Annuler le contrat", "cont_cancel_q": "Etes-vous sûr de vouloir annuler ce contrat ?", "cont_cancel_y": "Oui, annuler le contrat", "cont_chat": "Ouvrir la discussion avec la contrepartie", "cont_how": "Comment payer", "cont_no": "Vous n'avez aucun contrat en cours", - "cont_paid": "Marquer le contrat comme Payé", + "cont_paid": "Marquer le contrat comme payé", "cont_paid_e": "Ne le faites que si vous avez envoyé les fonds au vendeur par la méthode de paiement convenue", - "cont_paid_q": "Etes-vous sur de vouloir marquer ce contrat comme Payé ?", - "cont_selling": "vend", + "cont_paid_q": "Etes-vous sur de vouloir marquer ce contrat comme payé ?", + "cont_selling": "Vente", "cont_st_completed": "C'est tout bon !", "cont_st_in_progress_buyer": "Les bitcoins sous sous séquestre, veuillez payer le vendeur", "cont_st_paid_enought": "Les bitcoins sont sous séquestre ! Veuillez payer le vendeur\navec la méthode de paiement convenue", @@ -87,7 +92,7 @@ "offer_minmax": "min / max", "offer_minutes": "min", "offer_promt_fiat": "Combien de {currency} désirez-vous acheter ?", - "offer_promt_fiat_e": "Par example 100", + "offer_promt_fiat_e": "Par exemple 100", "offer_window": "fenêtre", "p2p": "Acheter du Bitcoin sur un échange pair à pair" }, @@ -304,7 +309,7 @@ "network_electrum": "Serveur Electrum", "not_a_valid_uri": "URI invalide", "notifications": "Notifications", - "open_link_in_explorer": "Ouvrir le lien dans l'explorateur", + "open_link_in_explorer" : "Ouvrir le lien dans l'explorateur", "password": "Mot de passe", "password_explain": "Créer le mot de passe utilisé pour déchiffrer l'espace de stockage principal", "passwords_do_not_match": "Les mots de passe ne correspondent pas", @@ -323,7 +328,7 @@ "selfTest": "Auto-test", "save": "Enregistrer", "saved": "Enregistré", - "success_transaction_broadcasted": "Succès! Votre transaction a été difusée!", + "success_transaction_broadcasted" : "Succès! Votre transaction a été difusée!", "total_balance": "Solde total", "total_balance_explanation": "Afficher le solde total de tous vos portefeuilles sur l'écran d'accueil.", "widgets": "Widgets", @@ -420,6 +425,8 @@ "enter_bip38_password": "Entrez le mots de passe de déchiffrement", "export_title": "export du portefeuille", "import_do_import": "Importer", + "import_passphrase_title": "Phrase secrète", + "import_passphrase_message": "Entrez la phrase secrète si vous en avez utilisée une", "import_error": "Échec de l'import. Merci, de vérifier que les données saisies sont valides.", "import_explanation": "Entrez ici votre mnémonique, clé privée, WIF, ou quoi que ce soit que vous ayez. BlueWallet fera de son mieux pour deviner le bon format et importer votre portefeuille", "import_file": "Importer le fichier", From 2bfdc925dec477801e1dc19372a97ac42ec1386b Mon Sep 17 00:00:00 2001 From: Ivan Vershigora Date: Mon, 26 Jul 2021 11:22:34 +0300 Subject: [PATCH 277/327] ADD: UI for import electrum wallet with passphrase --- class/wallet-import.js | 34 ++++++++++++++++++++++++-------- tests/integration/import.test.js | 18 +++++++++++++++++ 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/class/wallet-import.js b/class/wallet-import.js index d98688c60..eb5dd5f79 100644 --- a/class/wallet-import.js +++ b/class/wallet-import.js @@ -124,6 +124,22 @@ function WalletImport() { } } + // ELECTRUM segwit wallet password is optinal + const electrum1 = new HDSegwitElectrumSeedP2WPKHWallet(); + electrum1.setSecret(importText); + if (electrum1.validateMnemonic()) { + password = await prompt(loc.wallets.import_passphrase_title, loc.wallets.import_passphrase_message); + return { text, password }; + } + + // ELECTRUM legacy wallet password is optinal + const electrum2 = new HDLegacyElectrumSeedP2PKHWallet(); + electrum2.setSecret(importText); + if (electrum2.validateMnemonic()) { + password = await prompt(loc.wallets.import_passphrase_title, loc.wallets.import_passphrase_message); + return { text, password }; + } + return { text, password }; }; @@ -273,20 +289,22 @@ function WalletImport() { // nope, not watch-only try { - const hdElectrumSeedLegacy = new HDSegwitElectrumSeedP2WPKHWallet(); - hdElectrumSeedLegacy.setSecret(importText); - if (hdElectrumSeedLegacy.validateMnemonic()) { + const hdElectrum = new HDSegwitElectrumSeedP2WPKHWallet(); + hdElectrum.setSecret(importText); + hdElectrum.setPassphrase(password); + if (hdElectrum.validateMnemonic()) { // not fetching txs or balances, fuck it, yolo, life is too short - return WalletImport._saveWallet(hdElectrumSeedLegacy); + return WalletImport._saveWallet(hdElectrum); } } catch (_) {} try { - const hdElectrumSeedLegacy = new HDLegacyElectrumSeedP2PKHWallet(); - hdElectrumSeedLegacy.setSecret(importText); - if (hdElectrumSeedLegacy.validateMnemonic()) { + const hdElectrum = new HDLegacyElectrumSeedP2PKHWallet(); + hdElectrum.setSecret(importText); + hdElectrum.setPassphrase(password); + if (hdElectrum.validateMnemonic()) { // not fetching txs or balances, fuck it, yolo, life is too short - return WalletImport._saveWallet(hdElectrumSeedLegacy); + return WalletImport._saveWallet(hdElectrum); } } catch (_) {} diff --git a/tests/integration/import.test.js b/tests/integration/import.test.js index edf0fb685..f024828c2 100644 --- a/tests/integration/import.test.js +++ b/tests/integration/import.test.js @@ -129,6 +129,16 @@ describe('import procedure', function () { assert.strictEqual(lastImportedWallet.getLabel(), 'Imported HD Legacy Electrum (BIP32 P2PKH)'); }); + it('can import HD Legacy Electrum (BIP32 P2PKH) with passphrase', async () => { + await WalletImport.processImportText( + 'receive happy wash prosper update pet neck acid try profit proud hungry', + 'super secret passphrase', + ); + assert.strictEqual(lastImportedWallet.type, HDLegacyElectrumSeedP2PKHWallet.type); + assert.strictEqual(lastImportedWallet._getExternalAddressByIndex(0), '13sPvsrgRN8XibZNHtZXNqVDJPnNZLjTap'); + assert.strictEqual(lastImportedWallet.getLabel(), 'Imported HD Legacy Electrum (BIP32 P2PKH)'); + }); + it('can import BreadWallet', async () => { await WalletImport.processImportText( 'tired lesson alert attend giggle fancy nose enter ethics fashion fly dove dutch hidden toe argue save fish catch patient waste gift divorce whisper', @@ -145,6 +155,14 @@ describe('import procedure', function () { assert.strictEqual(lastImportedWallet.getLabel(), 'Imported HD Electrum (BIP32 P2WPKH)'); }); + it('can import HD Electrum (BIP32 P2WPKH) with passphrase', async () => { + const UNICODE_HORROR = '₿ 😀 😈 う けたま わる w͢͢͝h͡o͢͡ ̸͢k̵͟n̴͘ǫw̸̛s͘ ̀́w͘͢ḩ̵a҉̡͢t ̧̕h́o̵r͏̵rors̡ ̶͡͠lį̶e͟͟ ̶͝in͢ ͏t̕h̷̡͟e ͟͟d̛a͜r̕͡k̢̨ ͡h̴e͏a̷̢̡rt́͏ ̴̷͠ò̵̶f̸ u̧͘ní̛͜c͢͏o̷͏d̸͢e̡͝?͞'; + await WalletImport.processImportText('bitter grass shiver impose acquire brush forget axis eager alone wine silver', UNICODE_HORROR); + assert.strictEqual(lastImportedWallet.type, HDSegwitElectrumSeedP2WPKHWallet.type); + assert.strictEqual(lastImportedWallet._getExternalAddressByIndex(0), 'bc1qx94dutas7ysn2my645cyttujrms5d9p57f6aam'); + assert.strictEqual(lastImportedWallet.getLabel(), 'Imported HD Electrum (BIP32 P2WPKH)'); + }); + it('can import AEZEED', async () => { await WalletImport.processImportText( 'abstract rhythm weird food attract treat mosquito sight royal actor surround ride strike remove guilt catch filter summer mushroom protect poverty cruel chaos pattern', From 37d99089bb4c3649d12b72f0bd635e91c15f2001 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Mon, 26 Jul 2021 12:46:03 +0100 Subject: [PATCH 278/327] REF: better handling large transactions from electrum --- blue_modules/BlueElectrum.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blue_modules/BlueElectrum.js b/blue_modules/BlueElectrum.js index 0fe57391b..26482d949 100644 --- a/blue_modules/BlueElectrum.js +++ b/blue_modules/BlueElectrum.js @@ -597,7 +597,9 @@ module.exports.multiGetTransactionByTxid = async function (txids, batchsize, ver if (txdata.error && txdata.error.code === -32600) { // response too large // lets do single call, that should go through okay: - txdata.result = await mainClient.blockchainTransaction_get(txdata.param, verbose); + txdata.result = await mainClient.blockchainTransaction_get(txdata.param, false); + // since we used VERBOSE=false, server sent us plain txhex which we must decode on our end: + txdata.result = txhexToElectrumTransaction(txdata.result); } ret[txdata.param] = txdata.result; if (ret[txdata.param]) delete ret[txdata.param].hex; // compact From 8b35b5ba121d158fe46c6392ee1b450ca7fc15a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Mon, 26 Jul 2021 08:35:03 -0400 Subject: [PATCH 279/327] OPS: RNCamera patch for macOS --- .../maccatalystpatches/RCTCameraManagerDiff | 40 +++++++++++++++++++ .../applypatchesformaccatalyst.sh | 2 + 2 files changed, 42 insertions(+) create mode 100644 scripts/maccatalystpatches/RCTCameraManagerDiff diff --git a/scripts/maccatalystpatches/RCTCameraManagerDiff b/scripts/maccatalystpatches/RCTCameraManagerDiff new file mode 100644 index 000000000..3a1180748 --- /dev/null +++ b/scripts/maccatalystpatches/RCTCameraManagerDiff @@ -0,0 +1,40 @@ +9d8 +< #import +771,782d769 +< else if (target == RCTCameraCaptureTargetCameraRoll) { +< [[[ALAssetsLibrary alloc] init] writeImageDataToSavedPhotosAlbum:imageData metadata:metadata completionBlock:^(NSURL* url, NSError* error) { +< if (error == nil) { +< //path isn't really applicable here (this is an asset uri), but left it in for backward comparability +< resolve(@{@"path":[url absoluteString], @"mediaUri":[url absoluteString]}); +< } +< else { +< reject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); +< } +< }]; +< return; +< } +921,942c908 +< if (self.videoTarget == RCTCameraCaptureTargetCameraRoll) { +< ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; +< if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputFileURL]) { +< [library writeVideoAtPathToSavedPhotosAlbum:outputFileURL +< completionBlock:^(NSURL *assetURL, NSError *error) { +< if (error) { +< self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(error.description)); +< return; +< } else if (assetURL == nil) { +< //It's possible for writing to camera roll to fail, +< //without receiving an error message, but assetURL will be nil +< //Happens when disk is (almost) full +< self.videoReject(RCTErrorUnspecified, nil, RCTErrorWithMessage(@"Not enough storage")); +< return; +< } +< +< [videoInfo setObject:[assetURL absoluteString] forKey:@"path"]; +< self.videoResolve(videoInfo); +< }]; +< } +< } +< else if (self.videoTarget == RCTCameraCaptureTargetDisk) { +--- +> if (self.videoTarget == RCTCameraCaptureTargetDisk) { diff --git a/scripts/maccatalystpatches/applypatchesformaccatalyst.sh b/scripts/maccatalystpatches/applypatchesformaccatalyst.sh index e382abfb5..3821cecf3 100755 --- a/scripts/maccatalystpatches/applypatchesformaccatalyst.sh +++ b/scripts/maccatalystpatches/applypatchesformaccatalyst.sh @@ -5,6 +5,8 @@ echo "Re-installing node_modules" npm i echo "Applying patch for react-native-xcode.sh" sed -i '' 's/--platform "$BUNDLE_PLATFORM"/--platform "ios"/g' ./node_modules/react-native/scripts/react-native-xcode.sh +echo "Applying patch for RCTCameraManager.m" +patch node_modules/react-native-camera/ios/RCT/RCTCameraManager.m scripts/maccatalystpatches/RCTCameraManagerDiff echo "Deleting torrific.js content" echo > blue_modules/torrific.js echo "" From ab4e197284b54c10e6ff86f7802a9beb482f1a78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Mon, 26 Jul 2021 11:43:40 -0400 Subject: [PATCH 280/327] Update build.gradle --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 419884021..35fe0740c 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { - minSdkVersion = 26 + minSdkVersion = 28 supportLibVersion = "28.0.0" buildToolsVersion = "29.0.3" compileSdkVersion = 29 From b967d79f4494d2f5114c4e39485011d9a1d7cf07 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 26 Jul 2021 19:23:08 +0000 Subject: [PATCH 281/327] Translate /loc/en.json in es_ES review completed for the source file '/loc/en.json' on the 'es_ES' language. --- loc/es.json | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/loc/es.json b/loc/es.json index 11d370ac6..7d975a668 100644 --- a/loc/es.json +++ b/loc/es.json @@ -16,8 +16,12 @@ "seed": "Semilla", "success": "Completado", "wallet_key": "Llave de la cartera", - "invalid_animated_qr_code_fragment": "Fragmento de código QR inválido. Por favor inténtalo de nuevo.", - "file_saved": "El archivo ({filePath}) se ha guardado en su carpeta de Descargas.", + "invalid_animated_qr_code_fragment" : "Fragmento de código QR inválido. Por favor inténtalo de nuevo.", + "file_saved": "El archivo {filePath} se ha guardado en tu {destination}.", + "file_save_title": "Guardar el archivo", + "file_save_location": "Selecciona dónde guardar {filePath}", + "downloads_folder": "Carpeta de descargas", + "external_storage": "Almacenamiento externo", "discard_changes": "¿Descartar cambios? ", "discard_changes_detail": "Tienes cambios sin guardar. ¿Estás seguro que quieres descartarlos y salir?" }, @@ -186,6 +190,7 @@ "details_no_signed_tx": "El archivo seleccionado no contiene una transacción que se pueda importar.", "details_note_placeholder": "Nota personal", "details_scan": "Escanear", + "details_scan_hint": "Toca dos veces para escanear o importar un destino", "details_total_exceeds_balance": "El monto excede el balance disponible.", "details_unrecognized_file_format": "Formato no reconocido", "details_wallet_before_tx": "Antes de crear una transacción debes añadir una cartera de Bitcoin.", @@ -258,8 +263,8 @@ "electrum_connected_not": "Desconectado", "electrum_error_connect": "No se ha podido conectar al servidor de Electrum", "electrum_host": "p. ej. {example}", - "electrum_port": "Puerto TCP, normalmente {example}", - "electrum_port_ssl": "Puerto SSL, normalmente {example}", + "electrum_port": "Puerto, generalmente {example}", + "use_ssl": "Utiliza SSL", "electrum_saved": "Los cambios se han guardado. Puede que se requiera reiniciar la aplicación para que tomen efecto.", "set_electrum_server_as_default": "¿Establecer {server} como servidor Electrum por defecto?", "set_lndhub_as_default": "¿Establecer {url} como servidor LNDHub por defecto?", @@ -304,7 +309,7 @@ "network_electrum": "Servidor Electrum", "not_a_valid_uri": "URI no válida", "notifications": "Notificaciones", - "open_link_in_explorer": "Abrir enlace en el navegador", + "open_link_in_explorer" : "Abrir enlace en el navegador", "password": "Contraseña", "password_explain": "Crea la contraseña que usarás para descifrar el almacenamiento", "passwords_do_not_match": "Contraseñas deben ser iguales", @@ -323,7 +328,7 @@ "selfTest": "Self-Test", "save": "Guardar", "saved": "Guardado", - "success_transaction_broadcasted": "¡Listo! ¡Tu transacción ha sido emitida!", + "success_transaction_broadcasted" : "¡Listo! ¡Tu transacción ha sido emitida!", "total_balance": "Balance total", "total_balance_explanation": "Muestra el balance total de todas tus carteras en los widgets de tu pantalla principal.", "widgets": "Widgets", @@ -420,8 +425,10 @@ "enter_bip38_password": "Introduce el password para descifrar", "export_title": "Exportación de cartera", "import_do_import": "Importar", + "import_passphrase_title": "Passphrase", + "import_passphrase_message": "Introduce la passphrase si has usado una", "import_error": "Error al importar. Por favor, asegúrate de que los datos introducidos son correctos.", - "import_explanation": "Por favor, introduzca sus palabras semilla, llave pública, WIF, o cualquier otra cosa que tenga. BlueWallet hará lo posible para descifrar el formato correcto e importar su billetera. ", + "import_explanation": "Por favor, introduce tus palabra semilla, llave pública, WIF, o cualquier otra cosa que tengas. BlueWallet hará lo posible para descifrar el formato correcto e importar tu cartera. ", "import_file": "Importar archivo", "import_imported": "Importado", "import_placeholder_fail": "Importar cartera", @@ -578,10 +585,11 @@ "sign_placeholder_signature": "Firma", "sign_aopp_title": "AOPP", "sign_aopp_confirm": "¿Quieres enviar el mensaje firmado a {hostname}?", - "address_balance": "Balance: {balance} sats", "addresses_title": "Direcciones", "type_change": "Cambio", - "type_receive": "Recibir" + "type_receive": "Recibir", + "type_used": "Usado", + "transactions": "Transacciones" }, "aopp": { "title": "Selecciona la dirección", From 76f33ce3f0d217b984a8a70fb63265f1edc26d09 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 26 Jul 2021 20:26:56 +0000 Subject: [PATCH 282/327] Translate /loc/en.json in sl_SI review completed for the source file '/loc/en.json' on the 'sl_SI' language. --- loc/sl_SI.json | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/loc/sl_SI.json b/loc/sl_SI.json index 5e612922b..adf97e0df 100644 --- a/loc/sl_SI.json +++ b/loc/sl_SI.json @@ -83,7 +83,7 @@ "local_trader": "Lokalno trgovanje", "local_trader_new": "Novo", "login": "Prijava", - "logout": "odjava", + "logout": "Odjava", "mycont": "Moje pogodbe", "offer_accept": "Sprejmi ponudbo", "offer_account_finish": "Videti je, da še niste končali registracije računa na HodlHodl, ali želite končati registracijo zdaj?", @@ -94,7 +94,7 @@ "offer_promt_fiat": "Koliko {currency} želite kupiti?", "offer_promt_fiat_e": "Na primer 100", "offer_window": "okno", - "p2p": "P2P menjalnica" + "p2p": "Kupite Bitcoin na P2P menjalnici" }, "lnd": { "errorInvoiceExpired": "Račun je potekel", @@ -121,14 +121,14 @@ "open_direct_channel": "Odpri neposreden kanal s tem vozliščem:", "please_pay": "Prosim plačajte", "preimage": "Preimage", - "sats": "sats", + "sats": "sats.", "wasnt_paid_and_expired": "Ta račun ni bil plačan in je potekel." }, "plausibledeniability": { "create_fake_storage": "Ustvari šifrirano shrambo", "create_password": "Ustvarite geslo", "create_password_explanation": "Geslo za lažno shrambo se ne sme ujemati z geslom glavne shrambe.", - "help": "V določenih okoliščinah boste morda prisiljeni razkriti geslo. Da zavarujete vaša sredstva, lahko BlueWallet ustvari dodatno šifrirano shrambo z drugačnim geslom. Pod prisilo, lahko to geslo razkrijete tretji osebi. Če ga vnesete v BlueWallet, bo odklenilo 'lažno' shrambo. To se bo tretji osebi zdelo verodostojno, vaša skrivna glavna shramba s pravimi sredstvi pa bo ostala varna.", + "help": "V določenih okoliščinah boste morda prisiljeni razkriti geslo. Da zavarujete vaša sredstva, lahko BlueWallet ustvari dodatno šifrirano shrambo z drugačnim geslom. Pod prisilo, lahko to geslo razkrijete tretji osebi. Če ga vnesete v BlueWallet, se bo odklenila 'lažno' shramba. To se bo tretji osebi zdelo verodostojno, vaša skrivna glavna shramba s pravimi sredstvi pa bo ostala varna.", "help2": "Nova shramba bo popolnoma uporabna, za večjo verodostojnost lahko tam hranite manjši znesek.", "password_should_not_match": "Geslo je trenutno v uporabi. Prosimo, poskusite z drugim geslom.", "passwords_do_not_match": "Gesli se ne ujemata, prosimo poskusite ponovno.", @@ -236,7 +236,7 @@ "settings": { "about": "O aplikaciji", "about_awesome": "Zgrajeno z izjemnimi", - "about_backup": "Vedno varnostno kopirajte svoje ključe!", + "about_backup": "Vedno naredite varnostni kopijo vaših ključev!", "about_free": "BlueWallet je brezplačen in odprtokodni projekt. Ustvarili uporabniki Bitcoina.", "about_license": "Licenca MIT", "about_release_notes": "Opombe ob izdaji", @@ -425,6 +425,8 @@ "enter_bip38_password": "Vnesite geslo za dešifriranje", "export_title": "Izvoz denarnice", "import_do_import": "Uvozi", + "import_passphrase_title": "Dodatna beseda/niz (passphrase)", + "import_passphrase_message": "Vnesite dodatno besedo/niz (passphrase), če jo uporabljate", "import_error": "Napaka pri uvozu. Prosimo, preverite ali so podani podatki pravilni.", "import_explanation": "Napišite vaš seznam besed (mnemonično seme), javni ključ, WIF, ali karkoli drugega imate. BlueWallet se bo potrudil uganiti pravilno obliko in uvoziti vašo denarnico.", "import_file": "Uvozi datoteko", @@ -436,7 +438,7 @@ "import_title": "Uvozi", "list_create_a_button": "Ustvarite", "list_create_a_wallet": "Ustvarite denarnico", - "list_create_a_wallet_text": "Je brezplačno in lahko jih ustvarite\ntoliko, kot želite.", + "list_create_a_wallet_text": "Je brezplačno in lahko jih ustvarite\nkolikor želite.", "list_empty_txs1": "Tu bodo prikazane vaše transakcije", "list_empty_txs1_lightning": "Lightning denarnica je namenjena za vsakodnevne transakcije. Omogoča takojšnja plačila z nizkimi stroški.", "list_empty_txs2": "Začnite uporabljati denarnico.", @@ -502,8 +504,8 @@ "vault_advanced_customize": "Nastavitve trezorja", "needs": "Zahtevana sta", "what_is_vault_description_number_of_vault_keys": " {m} ključa trezorja, ", - "what_is_vault_description_to_spend": "tretji pa\npredstavlja rezervo.", - "what_is_vault_description_to_spend_other": "to spend.", + "what_is_vault_description_to_spend": "za zapravljanje, tretji pa\npredstavlja rezervo.", + "what_is_vault_description_to_spend_other": "za zapravljanje.", "quorum": "{m} od {n} kvorum", "quorum_header": "Kvorum", "of": "od", From 7be82fab6b5b515f1c33ee757799c682d6de302b Mon Sep 17 00:00:00 2001 From: Overtorment Date: Mon, 26 Jul 2021 21:59:49 +0100 Subject: [PATCH 283/327] Delete pull-request-reviewer-reminder.yml --- .../workflows/pull-request-reviewer-reminder.yml | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 .github/workflows/pull-request-reviewer-reminder.yml diff --git a/.github/workflows/pull-request-reviewer-reminder.yml b/.github/workflows/pull-request-reviewer-reminder.yml deleted file mode 100644 index 6e0faa464..000000000 --- a/.github/workflows/pull-request-reviewer-reminder.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: 'Pull request reviewer reminder' -on: - schedule: - # Check reviews every weekday, 10:00 and 17:00 - - cron: '0 10,17 * * 1-5' - -jobs: - pull-request-reviewer-reminder: - runs-on: ubuntu-latest - steps: - - uses: tommykw/pull-request-reviewer-reminder-action@v1 - with: - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - reminder_message: 'One business day has passed since the review started. Give priority to reviews as much as possible.' # Required. Messages to send to reviewers on Github. - review_turnaround_hours: 24 # Required. This is the deadline for reviews. If this time is exceeded, a reminder wil be send. \ No newline at end of file From 21bbec073d20de218974bc8833fca2ba50beb867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Tue, 27 Jul 2021 11:51:57 -0400 Subject: [PATCH 284/327] Update build.gradle --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 35fe0740c..48d2d949b 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -74,7 +74,7 @@ subprojects { android { compileSdkVersion 29 defaultConfig { - minSdkVersion 26 + minSdkVersion 28 } } } From 41a31b1fabf01cbfee18aacd1c3b2ea6e45d44e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Tue, 27 Jul 2021 18:54:14 -0400 Subject: [PATCH 285/327] OPS: Version bump and release notes --- android/app/build.gradle | 2 +- ios/BlueWallet.xcodeproj/project.pbxproj | 62 +++++++++---------- ios/fastlane/metadata/en-US/release_notes.txt | 7 +++ package-lock.json | 2 +- package.json | 2 +- 5 files changed, 41 insertions(+), 34 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 20ca07f48..975fd5c52 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -139,7 +139,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 - versionName "6.2.2" + versionName "6.2.3" multiDexEnabled true missingDimensionStrategy 'react-native-camera', 'general' testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index a7f9ee7c0..dd794759f 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -50,7 +50,7 @@ 6DD410BF266CB13D0087DE03 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; }; 6DD410C0266CB1460087DE03 /* MarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9946622555A660000E52E8 /* MarketWidget.swift */; }; 6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; }; - 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */; }; + 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* EFQRCode */; }; 6DFC807224EA2FA9007B8700 /* ViewQRCodefaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFC807124EA2FA9007B8700 /* ViewQRCodefaceController.swift */; }; 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; @@ -397,7 +397,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */, + 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -837,7 +837,7 @@ ); name = "BlueWalletWatch Extension"; packageProductDependencies = ( - 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */, + 6DFC806F24EA0B6C007B8700 /* EFQRCode */, ); productName = "BlueWalletWatch Extension"; productReference = B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */; @@ -921,7 +921,7 @@ ); mainGroup = 83CBB9F61A601CBA00E9B192; packageReferences = ( - 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */, + 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */, ); productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; projectDirPath = ""; @@ -1323,7 +1323,7 @@ CODE_SIGN_ENTITLEMENTS = BlueWallet/BlueWallet.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 604; + CURRENT_PROJECT_VERSION = 611; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; @@ -1344,7 +1344,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.2.2; + MARKETING_VERSION = 6.2.3; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1373,7 +1373,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 604; + CURRENT_PROJECT_VERSION = 611; DEVELOPMENT_TEAM = A7W54YZ4WU; ENABLE_BITCODE = NO; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; @@ -1388,7 +1388,7 @@ "$(inherited)", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 6.2.2; + MARKETING_VERSION = 6.2.3; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1418,7 +1418,7 @@ CODE_SIGN_ENTITLEMENTS = "TodayExtension/BlueWallet - Bitcoin Price.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 604; + CURRENT_PROJECT_VERSION = 611; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1429,7 +1429,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.2; + MARKETING_VERSION = 6.2.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; @@ -1457,7 +1457,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 604; + CURRENT_PROJECT_VERSION = 611; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1468,7 +1468,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.2; + MARKETING_VERSION = 6.2.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.TodayExtension; PRODUCT_NAME = "BlueWallet - Bitcoin Price"; @@ -1494,13 +1494,13 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 604; + CURRENT_PROJECT_VERSION = 611; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.2.2; + MARKETING_VERSION = 6.2.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; @@ -1526,13 +1526,13 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 604; + CURRENT_PROJECT_VERSION = 611; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Stickers/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MARKETING_VERSION = 6.2.2; + MARKETING_VERSION = 6.2.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.Stickers; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1559,7 +1559,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 604; + CURRENT_PROJECT_VERSION = 611; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1570,7 +1570,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.2; + MARKETING_VERSION = 6.2.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; @@ -1604,7 +1604,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 604; + CURRENT_PROJECT_VERSION = 611; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = A7W54YZ4WU; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1615,7 +1615,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.2; + MARKETING_VERSION = 6.2.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.MarketWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1750,7 +1750,7 @@ CODE_SIGN_ENTITLEMENTS = "BlueWalletWatch Extension/BlueWalletWatch Extension.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 604; + CURRENT_PROJECT_VERSION = 611; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1760,7 +1760,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.2; + MARKETING_VERSION = 6.2.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; @@ -1790,7 +1790,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 604; + CURRENT_PROJECT_VERSION = 611; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1800,7 +1800,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 6.2.2; + MARKETING_VERSION = 6.2.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch.extension; PRODUCT_NAME = "${TARGET_NAME}"; @@ -1830,13 +1830,13 @@ CODE_SIGN_ENTITLEMENTS = BlueWalletWatch/BlueWalletWatch.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 604; + CURRENT_PROJECT_VERSION = 611; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.2.2; + MARKETING_VERSION = 6.2.3; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; @@ -1869,13 +1869,13 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 604; + CURRENT_PROJECT_VERSION = 611; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; IBSC_MODULE = BlueWalletWatch_Extension; INFOPLIST_FILE = BlueWalletWatch/Info.plist; - MARKETING_VERSION = 6.2.2; + MARKETING_VERSION = 6.2.3; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = io.bluewallet.bluewallet.watch; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1960,7 +1960,7 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */ = { + 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/EFPrefix/EFQRCode.git"; requirement = { @@ -1971,9 +1971,9 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */ = { + 6DFC806F24EA0B6C007B8700 /* EFQRCode */ = { isa = XCSwiftPackageProductDependency; - package = 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */; + package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */; productName = EFQRCode; }; /* End XCSwiftPackageProductDependency section */ diff --git a/ios/fastlane/metadata/en-US/release_notes.txt b/ios/fastlane/metadata/en-US/release_notes.txt index b11b34649..f305f5511 100644 --- a/ios/fastlane/metadata/en-US/release_notes.txt +++ b/ios/fastlane/metadata/en-US/release_notes.txt @@ -1,3 +1,10 @@ +v6.2.2 +====== + +* ADD: UI for import electrum wallet with passphrase +* REF: better handling large transactions from electrum + + v6.1.9 ====== diff --git a/package-lock.json b/package-lock.json index 8e8d4ae0d..c594920b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.2.2", + "version": "6.2.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a43e761ea..9f7783522 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bluewallet", - "version": "6.2.2", + "version": "6.2.3", "license": "MIT", "repository": { "type": "git", From e085b328d576984c74b409c1a706c3ad46048e9e Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 28 Jul 2021 12:51:11 +0000 Subject: [PATCH 286/327] Translate /loc/en.json in sl_SI review completed for the source file '/loc/en.json' on the 'sl_SI' language. --- loc/sl_SI.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/loc/sl_SI.json b/loc/sl_SI.json index adf97e0df..8c1d89a85 100644 --- a/loc/sl_SI.json +++ b/loc/sl_SI.json @@ -128,7 +128,7 @@ "create_fake_storage": "Ustvari šifrirano shrambo", "create_password": "Ustvarite geslo", "create_password_explanation": "Geslo za lažno shrambo se ne sme ujemati z geslom glavne shrambe.", - "help": "V določenih okoliščinah boste morda prisiljeni razkriti geslo. Da zavarujete vaša sredstva, lahko BlueWallet ustvari dodatno šifrirano shrambo z drugačnim geslom. Pod prisilo, lahko to geslo razkrijete tretji osebi. Če ga vnesete v BlueWallet, se bo odklenila 'lažno' shramba. To se bo tretji osebi zdelo verodostojno, vaša skrivna glavna shramba s pravimi sredstvi pa bo ostala varna.", + "help": "V določenih okoliščinah boste morda prisiljeni razkriti geslo. Da zavarujete vaša sredstva, lahko BlueWallet ustvari dodatno šifrirano shrambo z drugačnim geslom. Pod prisilo, lahko to geslo razkrijete tretji osebi. Če ga vnesete v BlueWallet, se bo odklenila 'lažna' shramba. To se bo tretji osebi zdelo verodostojno, vaša skrivna glavna shramba s pravimi sredstvi pa bo ostala varna.", "help2": "Nova shramba bo popolnoma uporabna, za večjo verodostojnost lahko tam hranite manjši znesek.", "password_should_not_match": "Geslo je trenutno v uporabi. Prosimo, poskusite z drugim geslom.", "passwords_do_not_match": "Gesli se ne ujemata, prosimo poskusite ponovno.", @@ -236,7 +236,7 @@ "settings": { "about": "O aplikaciji", "about_awesome": "Zgrajeno z izjemnimi", - "about_backup": "Vedno naredite varnostni kopijo vaših ključev!", + "about_backup": "Vedno naredite varnostno kopijo vaših ključev!", "about_free": "BlueWallet je brezplačen in odprtokodni projekt. Ustvarili uporabniki Bitcoina.", "about_license": "Licenca MIT", "about_release_notes": "Opombe ob izdaji", From a78a34c1a90b6921e673e909f274a3b0b9f1b5af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Wed, 28 Jul 2021 16:37:15 -0400 Subject: [PATCH 287/327] FIX: Remove existing release notes when applying Catalyst patches. Builds would get release notes from old commits rather than the latest ones --- ios/BlueWallet.xcodeproj/project.pbxproj | 14 +++++++------- ios/Podfile.lock | 12 ++++++------ .../applypatchesformaccatalyst.sh | 2 ++ 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index dd794759f..a55b1dc7c 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -50,7 +50,7 @@ 6DD410BF266CB13D0087DE03 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Models.swift */; }; 6DD410C0266CB1460087DE03 /* MarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9946622555A660000E52E8 /* MarketWidget.swift */; }; 6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; }; - 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* EFQRCode */; }; + 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */; }; 6DFC807224EA2FA9007B8700 /* ViewQRCodefaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFC807124EA2FA9007B8700 /* ViewQRCodefaceController.swift */; }; 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; @@ -397,7 +397,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */, + 6DFC807024EA0B6C007B8700 /* BuildFile in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -837,7 +837,7 @@ ); name = "BlueWalletWatch Extension"; packageProductDependencies = ( - 6DFC806F24EA0B6C007B8700 /* EFQRCode */, + 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */, ); productName = "BlueWalletWatch Extension"; productReference = B40D4E3C225841ED00428FCC /* BlueWalletWatch Extension.appex */; @@ -921,7 +921,7 @@ ); mainGroup = 83CBB9F61A601CBA00E9B192; packageReferences = ( - 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */, + 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */, ); productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; projectDirPath = ""; @@ -1960,7 +1960,7 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */ = { + 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/EFPrefix/EFQRCode.git"; requirement = { @@ -1971,9 +1971,9 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 6DFC806F24EA0B6C007B8700 /* EFQRCode */ = { + 6DFC806F24EA0B6C007B8700 /* SwiftPackageProductDependency */ = { isa = XCSwiftPackageProductDependency; - package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */; + package = 6DFC806E24EA0B6C007B8700 /* RemoteSwiftPackageReference */; productName = EFQRCode; }; /* End XCSwiftPackageProductDependency section */ diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 4207c9994..75f6c32d5 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -267,13 +267,13 @@ PODS: - React - react-native-blur (0.8.0): - React - - react-native-camera (3.44.1): + - react-native-camera (3.44.3): - React-Core - - react-native-camera/RCT (= 3.44.1) - - react-native-camera/RN (= 3.44.1) - - react-native-camera/RCT (3.44.1): + - react-native-camera/RCT (= 3.44.3) + - react-native-camera/RN (= 3.44.3) + - react-native-camera/RCT (3.44.3): - React-Core - - react-native-camera/RN (3.44.1): + - react-native-camera/RN (3.44.3): - React-Core - react-native-document-picker (3.5.4): - React @@ -748,7 +748,7 @@ SPEC CHECKSUMS: React-jsinspector: cc614ec18a9ca96fd275100c16d74d62ee11f0ae react-native-blue-crypto: 23f1558ad3d38d7a2edb7e2f6ed1bc520ed93e56 react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c - react-native-camera: 6e6d25f6318980dd2837747760628b4442aac01a + react-native-camera: fefef39fcd20850d17c3780638b04f741e0ccaae react-native-document-picker: c5752781fbc0c126c627c1549b037c139444a4cf react-native-fingerprint-scanner: c68136ca57e3704d7bdf5faa554ea535ce15b1d0 react-native-idle-timer: 97b8283237d45146a7a5c25bdebe9e1e85f3687b diff --git a/scripts/maccatalystpatches/applypatchesformaccatalyst.sh b/scripts/maccatalystpatches/applypatchesformaccatalyst.sh index 3821cecf3..0fe350896 100755 --- a/scripts/maccatalystpatches/applypatchesformaccatalyst.sh +++ b/scripts/maccatalystpatches/applypatchesformaccatalyst.sh @@ -1,3 +1,5 @@ +echo "Removing existing release notes" +rm release-notes.txt release-notes.json echo "Applying patch for package.json" sed -i '' '/react-native-tor/d' ./package.json rm -fr node_modules From 6576b3ff93b80852fb4717755e0179618b50c51d Mon Sep 17 00:00:00 2001 From: N R Date: Wed, 28 Jul 2021 14:15:01 +0800 Subject: [PATCH 288/327] Make this message more explicit and in particular that the wallets already created are not impacted by the change of the parameter (and that a new wallet must therefore be created if we want to use these new parameters). Keyword: 'only'. Found this out after updating this parameter and wondering why I could still receive payments while my node hadn't got any active channel yet =) --- loc/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loc/en.json b/loc/en.json index a50afe462..8d755d54e 100644 --- a/loc/en.json +++ b/loc/en.json @@ -303,7 +303,7 @@ "lightning_saved": "Your changes have been saved successfully.", "lightning_settings": "Lightning Settings", "tor_settings": "Tor Settings", - "lightning_settings_explain": "To connect to your own LND node, please install LNDHub and put its URL here in settings. Leave blank to use BlueWallet’s LNDHub (lndhub.io). Wallets created after saving changes will connect to the specified LNDHub.", + "lightning_settings_explain": "To connect to your own LND node, please install LNDHub and put its URL here in settings. Leave blank to use BlueWallet’s LNDHub (lndhub.io). Please note that only wallets created after saving changes will connect to the specified LNDHub.", "network": "Network", "network_broadcast": "Broadcast Transaction", "network_electrum": "Electrum Server", From 3d91ad026e8cd640a350fd99b9bf54f5cf541457 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Thu, 29 Jul 2021 21:01:31 +0100 Subject: [PATCH 289/327] ADD: share button on sign/verify screen --- screen/wallets/signVerify.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/screen/wallets/signVerify.js b/screen/wallets/signVerify.js index 974ca826a..ca516bb89 100644 --- a/screen/wallets/signVerify.js +++ b/screen/wallets/signVerify.js @@ -20,6 +20,8 @@ import { FContainer, FButton } from '../../components/FloatButtons'; import { BlueStorageContext } from '../../blue_modules/storage-context'; import loc from '../../loc'; import confirm from '../../helpers/confirm'; +import { Icon } from 'react-native-elements'; +import Share from 'react-native-share'; const SignVerify = () => { const { colors } = useTheme(); @@ -32,6 +34,7 @@ const SignVerify = () => { const [signature, setSignature] = useState(''); const [loading, setLoading] = useState(false); const [messageHasFocus, setMessageHasFocus] = useState(false); + const [isShareVisible, setIsShareVisible] = useState(false); const wallet = wallets.find(w => w.getID() === params.walletID); const isToolbarVisibleForAndroid = Platform.OS === 'android' && messageHasFocus && isKeyboardVisible; @@ -57,6 +60,12 @@ const SignVerify = () => { }, }); + const handleShare = () => { + const baseUri = 'https://bluewallet.github.io/VerifySignature'; + const uri = `${baseUri}?a=${address}&m=${encodeURIComponent(message)}&s=${encodeURIComponent(signature)}`; + Share.open({ message: uri }).catch(error => console.log(error)); + }; + const handleSign = async () => { setLoading(true); await sleep(10); // wait for loading indicator to appear @@ -65,6 +74,7 @@ const SignVerify = () => { try { newSignature = wallet.signMessage(message, address, useSegwit); setSignature(newSignature); + setIsShareVisible(true); } catch (e) { ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); Alert.alert(loc.errors.error, e.message); @@ -190,6 +200,23 @@ const SignVerify = () => { /> + {isShareVisible && !isKeyboardVisible && ( + <> + + + + + } + /> + + + + )} + {!isKeyboardVisible && ( <> From 2e46970435d4f5cc283b2ae0433c112bc8deda40 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 29 Jul 2021 20:44:46 +0000 Subject: [PATCH 290/327] Translate /loc/en.json in de_DE review completed for the source file '/loc/en.json' on the 'de_DE' language. --- loc/de_de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loc/de_de.json b/loc/de_de.json index b21fba09d..2832427bf 100644 --- a/loc/de_de.json +++ b/loc/de_de.json @@ -303,7 +303,7 @@ "lightning_saved": "Deine Änderungen wurden gespeichert.", "lightning_settings": "Lightning-Einstellungen", "tor_settings": "Tor Einstellungen", - "lightning_settings_explain": "Zur Verbindung mit einem eigenen LND-Knoten ein LNDHub installieren und dessen URL hier eingeben. Das Feld leer lassen, um den LNDHub (lndhub.io) von BlueWallet zur verwenden. Nach dem Speichern werden sich neu erstellte Wallets mit dem angegebenen LNDHub verbinden.", + "lightning_settings_explain": "Zur Verbindung mit einem eigenen LND-Knoten LNDHub installieren und dessen URL hier eingeben. Das Feld leer lassen, um den LNDHub (lndhub.io) von BlueWallet zur verwenden. Nach dem Speichern werden sich neu erstellte Wallets mit dem angegebenen LNDHub verbinden.", "network": "Netzwerk", "network_broadcast": "Transaktion publizieren", "network_electrum": "Electrum Server", From b2997e482f1c5bef3a9b6a2a1ad2ba36ee5fcc96 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 30 Jul 2021 04:24:35 +0000 Subject: [PATCH 291/327] Translate /loc/en.json in fa_IR review completed for the source file '/loc/en.json' on the 'fa_IR' language. --- loc/fa.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loc/fa.json b/loc/fa.json index 93b8b1a60..dce965a7d 100644 --- a/loc/fa.json +++ b/loc/fa.json @@ -303,7 +303,7 @@ "lightning_saved": "تغییرات شما با موفقیت ذخیره شدند.", "lightning_settings": "تنظیمات لایتنینگ", "tor_settings": "تنظیمات تور", - "lightning_settings_explain": "برای اتصال به گره LND خود، لطفاً LNDHub را نصب کرده و آدرس آن را اینجا در تنظیمات قرار دهید. برای استفاده از LNDHub برنامهٔ BlueWallet (به آدرس lndhub.io)، خالی بگذارید. کیف پول‌های ایجادشده بعد از ذخیرهٔ تغییرات به LNDHub مشخص‌شده متصل خواهند شد.", + "lightning_settings_explain": "برای اتصال به گره LND خود، لطفاً LNDHub را نصب کرده و آدرس آن را اینجا در تنظیمات قرار دهید. برای استفاده از LNDHub برنامهٔ BlueWallet (به آدرس lndhub.io)، خالی بگذارید. لطفاً توجه داشته باشید که کیف پول‌های ایجادشده بعد از ذخیرهٔ تغییرات به LNDHub مشخص‌شده متصل خواهند شد.", "network": "شبکه", "network_broadcast": "انتشار تراکنش", "network_electrum": "سرور الکترام", From bc359eb54d817ae946c3dbae70258b81f06d591e Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 30 Jul 2021 06:57:41 +0000 Subject: [PATCH 292/327] fix: upgrade react-native-share from 6.2.1 to 6.2.3 Snyk has created this PR to upgrade react-native-share from 6.2.1 to 6.2.3. See this package in npm: https://www.npmjs.com/package/react-native-share See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index c594920b1..366b0c398 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18327,9 +18327,9 @@ "from": "git+https://github.com/BlueWallet/react-native-secure-key-store.git#63ab38c9d382a819844a086a69cc204c46aa93f9" }, "react-native-share": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-6.2.1.tgz", - "integrity": "sha512-LtT29le01c3k/1sWoumZDyAxigq/JrW4skv8Ri7eySgfIeXrjgnkk1SSR3bt4NrRO74knVngPwtb5xv/UCPP3w==" + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-6.2.3.tgz", + "integrity": "sha512-dVWCQLPF3B64/XNuCjQx/hnq8Hz+llQ17srrsO3QdguChi1FRnfVfv2wcfr3hgL8whEWCz9CyDDvbqsmhUagDQ==" }, "react-native-sortable-list": { "version": "git+https://github.com/BlueWallet/react-native-sortable-list.git#46e39a30ae0c4328e7c06c30b72b1af0b69e1aeb", diff --git a/package.json b/package.json index 9f7783522..27a36a748 100644 --- a/package.json +++ b/package.json @@ -176,7 +176,7 @@ "react-native-safe-area-context": "3.2.0", "react-native-screens": "3.4.0", "react-native-secure-key-store": "https://github.com/BlueWallet/react-native-secure-key-store#63ab38c9d382a819844a086a69cc204c46aa93f9", - "react-native-share": "6.2.1", + "react-native-share": "6.2.3", "react-native-sortable-list": "https://github.com/BlueWallet/react-native-sortable-list.git#46e39a30ae0c4328e7c06c30b72b1af0b69e1aeb", "react-native-svg": "12.1.1", "react-native-tcp-socket": "3.7.1", From b766ff96bdd4c6a7dcacb61191d0af1938cc1089 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 30 Jul 2021 06:57:46 +0000 Subject: [PATCH 293/327] fix: upgrade dayjs from 1.10.5 to 1.10.6 Snyk has created this PR to upgrade dayjs from 1.10.5 to 1.10.6. See this package in npm: https://www.npmjs.com/package/dayjs See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index c594920b1..c44a51efe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7091,9 +7091,9 @@ } }, "dayjs": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.5.tgz", - "integrity": "sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g==" + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", + "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" }, "debug": { "version": "4.3.1", diff --git a/package.json b/package.json index 9f7783522..9d9d544aa 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "buffer-reverse": "1.0.1", "coinselect": "3.1.12", "crypto-js": "4.0.0", - "dayjs": "1.10.5", + "dayjs": "1.10.6", "detox": "18.18.1", "ecurve": "1.0.6", "electrum-client": "https://github.com/BlueWallet/rn-electrum-client#99ebcc649d91a8dc39bea7964b02dd9ead464aa4", From 646ef2145ee1459d56b544be77b95af5164d40be Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 30 Jul 2021 12:10:13 +0000 Subject: [PATCH 294/327] Translate /loc/en.json in es_419 review completed for the source file '/loc/en.json' on the 'es_419' language. --- loc/es_419.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loc/es_419.json b/loc/es_419.json index f4059ceb6..ca9bf1fbe 100644 --- a/loc/es_419.json +++ b/loc/es_419.json @@ -303,7 +303,7 @@ "lightning_saved": "Tus cambios han sido guardados correctamente.", "lightning_settings": "Configuración de Lightning", "tor_settings": "Configuración de Tor", - "lightning_settings_explain": "Para conectarte a tu propio nodo LND, instala LNDHub y pon su URL aquí en la configuración. Déjalo en blanco para usar LNDHub de BlueWallet (lndhub.io). Las carteras creadas después de guardar los cambios se conectarán al LNDHub especificado.", + "lightning_settings_explain": "Para conectarte a tu propio nodo LND, instala LNDHub y pon su URL aquí en la configuración. Déjalo en blanco para usar LNDHub de BlueWallet (lndhub.io). Ten en cuenta que solo las carteras creadas después de guardar los cambios se conectarán al LNDHub especificado.", "network": "Red", "network_broadcast": "Publicar transacción", "network_electrum": "Servidor Electrum", From 8ef089b8a8a1d3b771260c1d55a03c4168fdbcc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Fri, 30 Jul 2021 14:25:52 -0400 Subject: [PATCH 295/327] FIX: OnePlus text cutoff --- loc/en.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/loc/en.json b/loc/en.json index 8d755d54e..4c1017f63 100644 --- a/loc/en.json +++ b/loc/en.json @@ -152,7 +152,7 @@ "details_label": "Description", "details_setAmount": "Receive with amount", "details_share": "Share", - "header": "Receive" + "header": "Receive " }, "send": { "broadcastButton": "Broadcast", @@ -202,13 +202,13 @@ "fee_10m": "10m", "fee_1d": "1d", "fee_3h": "3h", - "fee_custom": "Custom", + "fee_custom": "Custom ", "fee_fast": "Fast", - "fee_medium": "Medium", + "fee_medium": "Medium ", "fee_replace_min": "The total fee rate (satoshi per byte) you want to pay should be higher than {min} sat/byte.", "fee_satbyte": "in sat/byte", "fee_slow": "Slow", - "header": "Send", + "header": "Send ", "input_clear": "Clear", "input_done": "Done", "input_paste": "Paste", @@ -236,14 +236,14 @@ "settings": { "about": "About", "about_awesome": "Built with the awesome", - "about_backup": "Always backup your keys!", + "about_backup": "Always backup your keys! ", "about_free": "BlueWallet is a free and open-source project. Crafted by Bitcoin users.", "about_license": "MIT License", "about_release_notes": "Release notes", "about_review": "Leave us a review", "about_selftest": "Run self-test", "about_selftest_ok": "All internal tests have passed successfully. The wallet works well.", - "about_sm_github": "GitHub", + "about_sm_github": "GitHub ", "about_sm_discord": "Discord Server", "about_sm_telegram": "Telegram channel", "about_sm_twitter": "Follow us on Twitter", @@ -586,8 +586,8 @@ "sign_aopp_title": "AOPP", "sign_aopp_confirm": "Do you want to send signed message to {hostname}?", "addresses_title": "Addresses", - "type_change": "Change", - "type_receive": "Receive", + "type_change": "Change ", + "type_receive": "Receive ", "type_used": "Used", "transactions": "Transactions" }, From e360fa443f4add5555bb723ca6fa4811ef704b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sat, 31 Jul 2021 01:38:31 -0400 Subject: [PATCH 296/327] FIX: Issue: Apple Watch invoice gets stuck #1529 --- .../ReceiveInterfaceController.swift | 2 +- .../SpecifyInterfaceController.swift | 10 ++++++++-- .../WalletDetailsInterfaceController.swift | 9 ++++++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/ios/BlueWalletWatch Extension/ReceiveInterfaceController.swift b/ios/BlueWalletWatch Extension/ReceiveInterfaceController.swift index 07729bac4..8d759e45d 100644 --- a/ios/BlueWalletWatch Extension/ReceiveInterfaceController.swift +++ b/ios/BlueWalletWatch Extension/ReceiveInterfaceController.swift @@ -55,7 +55,7 @@ class ReceiveInterfaceController: WKInterfaceController { self?.toggleViewButtonPressed() WCSession.default.sendMessage(["message": "fetchTransactions"], replyHandler: nil, errorHandler: nil) } else { - self?.presentAlert(withTitle: "Error", message: "Unable to create invoice. Please, make sure your iPhone is paired and nearby.", preferredStyle: .alert, actions: [WKAlertAction(title: "OK", style: .default, handler: { [weak self] in + self?.presentAlert(withTitle: "Error", message: "Unable to create invoice. Please open BlueWallet on your iPhone and unlock your wallets.", preferredStyle: .alert, actions: [WKAlertAction(title: "OK", style: .default, handler: { [weak self] in self?.dismiss() self?.pop() })]) diff --git a/ios/BlueWalletWatch Extension/SpecifyInterfaceController.swift b/ios/BlueWalletWatch Extension/SpecifyInterfaceController.swift index b6116408f..daf6e75b0 100644 --- a/ios/BlueWalletWatch Extension/SpecifyInterfaceController.swift +++ b/ios/BlueWalletWatch Extension/SpecifyInterfaceController.swift @@ -89,8 +89,14 @@ class SpecifyInterfaceController: WKInterfaceController { } @IBAction func createButtonTapped() { - NotificationCenter.default.post(name: NotificationName.createQRCode, object: specifiedQRContent) - dismiss() + if (WCSession.default.activationState == .activated) { + NotificationCenter.default.post(name: NotificationName.createQRCode, object: specifiedQRContent) + dismiss() + } else { + presentAlert(withTitle: "Error", message: "Unable to create invoice. Please open BlueWallet on your iPhone and unlock your wallets.", preferredStyle: .alert, actions: [WKAlertAction(title: "OK", style: .default, handler: { [weak self] in + self?.dismiss() + })]) + } } override func contextForSegue(withIdentifier segueIdentifier: String) -> Any? { diff --git a/ios/BlueWalletWatch Extension/WalletDetailsInterfaceController.swift b/ios/BlueWalletWatch Extension/WalletDetailsInterfaceController.swift index 9af9af2ec..a1eac4a43 100644 --- a/ios/BlueWalletWatch Extension/WalletDetailsInterfaceController.swift +++ b/ios/BlueWalletWatch Extension/WalletDetailsInterfaceController.swift @@ -92,7 +92,6 @@ class WalletDetailsInterfaceController: WKInterfaceController { transactionsTable.setHidden(wallet?.transactions.isEmpty ?? true) noTransactionsLabel.setHidden(!(wallet?.transactions.isEmpty ?? false)) receiveButton.setHidden(wallet?.receiveAddress.isEmpty ?? true) - createInvoiceButton.setEnabled(WCSession.default.isReachable) } @IBAction func receiveMenuItemTapped() { @@ -116,9 +115,13 @@ class WalletDetailsInterfaceController: WKInterfaceController { } @IBAction func createInvoiceTapped() { - if (WCSession.default.isReachable) { + if (WCSession.default.activationState == .activated) { pushController(withName: ReceiveInterfaceController.identifier, context: (wallet?.identifier, "createInvoice")) - } + } else { + presentAlert(withTitle: "Error", message: "Unable to create invoice. Please open BlueWallet on your iPhone and unlock your wallets.", preferredStyle: .alert, actions: [WKAlertAction(title: "OK", style: .default, handler: { [weak self] in + self?.dismiss() + })]) + } } override func contextForSegue(withIdentifier segueIdentifier: String) -> Any? { From 319f50776872577edab3faaec7e70877d730f6db Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 31 Jul 2021 06:04:57 +0000 Subject: [PATCH 297/327] fix: upgrade metro-react-native-babel-preset from 0.66.0 to 0.66.1 Snyk has created this PR to upgrade metro-react-native-babel-preset from 0.66.0 to 0.66.1. See this package in npm: https://www.npmjs.com/package/metro-react-native-babel-preset See this project in Snyk: https://app.snyk.io/org/bluewallet/project/4d0df22a-0152-410a-8584-6df0d0a596d4?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 863e14993..28dd5765d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16109,11 +16109,11 @@ } }, "metro-react-native-babel-preset": { - "version": "0.66.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.66.0.tgz", - "integrity": "sha512-rO3yayxplLNxFDc7HyMShN+psgEb2mbw15EMreNvgV8QnXNYHmgU6e15tLbtEvC8LuftOLuSufEdSmR/ykm+aA==", + "version": "0.66.1", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.66.1.tgz", + "integrity": "sha512-iNY1CsnhXBJGHkjiq+rn17CVgd0OldTosagEiYLTRMoU1u+dGjPNh5BO6ldpGmyDJScG8Uwd0RuMQoAusDrjVw==", "requires": { - "@babel/core": "^7.0.0", + "@babel/core": "^7.14.0", "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-export-default-from": "^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", diff --git a/package.json b/package.json index 01a65aed5..54e6c7892 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ "junderw-crc32c": "1.2.0", "lottie-ios": "3.1.9", "lottie-react-native": "4.0.2", - "metro-react-native-babel-preset": "0.66.0", + "metro-react-native-babel-preset": "0.66.1", "path-browserify": "1.0.1", "payjoin-client": "1.0.0", "process": "0.11.10", From 2de745a0dd7456f28f4408d6f1e02d30698f0d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Rodriguez=20V=C3=A9lez?= Date: Sat, 31 Jul 2021 11:52:32 -0400 Subject: [PATCH 298/327] FIX: Update session state on app termination --- App.js | 2 +- WatchConnectivity.ios.js | 11 +++++++---- ios/BlueWallet/AppDelegate.m | 5 +++++ .../Objects/WatchDataSource.swift | 6 ++++++ .../SpecifyInterfaceController.swift | 2 +- .../WalletDetailsInterfaceController.swift | 2 +- ios/BlueWalletWatch/Base.lproj/Interface.storyboard | 8 ++++---- 7 files changed, 25 insertions(+), 11 deletions(-) diff --git a/App.js b/App.js index 4c8f510e8..6d7aeb36c 100644 --- a/App.js +++ b/App.js @@ -336,7 +336,7 @@ const App = () => { {renderClipboardContentModal()} - + {walletsInitialized && } diff --git a/WatchConnectivity.ios.js b/WatchConnectivity.ios.js index 142d25083..1ed1c29c5 100644 --- a/WatchConnectivity.ios.js +++ b/WatchConnectivity.ios.js @@ -45,6 +45,10 @@ function WatchConnectivity() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [walletsInitialized, wallets, isReachable, isInstalled]); + useEffect(() => { + updateApplicationContext({ isWalletsInitialized: walletsInitialized, randomID: Math.floor(Math.random() * 11) }); + }, [walletsInitialized]); + useEffect(() => { if (isInstalled && isReachable && walletsInitialized && preferredFiatCurrency) { const preferredFiatCurrencyParsed = JSON.parse(preferredFiatCurrency); @@ -116,12 +120,11 @@ function WatchConnectivity() { if (!Array.isArray(wallets)) { console.log('No Wallets set to sync with Watch app. Exiting...'); return; - } else if (walletsInitialized && wallets.length === 0) { - console.log('Wallets array is set. No Wallets set to sync with Watch app. Exiting...'); - updateApplicationContext({ wallets: [], randomID: Math.floor(Math.random() * 11) }); + } + if (!walletsInitialized) { + console.log('Wallets not initialized. Exiting...'); return; } - const walletsToProcess = []; for (const wallet of wallets) { diff --git a/ios/BlueWallet/AppDelegate.m b/ios/BlueWallet/AppDelegate.m index 4593aaf4c..685ef82a9 100644 --- a/ios/BlueWallet/AppDelegate.m +++ b/ios/BlueWallet/AppDelegate.m @@ -14,6 +14,7 @@ #import #import #import "EventEmitter.h" +@import WatchConnectivity; #if !TARGET_OS_MACCATALYST #ifdef FB_SONARKIT_ENABLED #import @@ -87,6 +88,10 @@ static void InitializeFlipper(UIApplication *application) { return NO; } +- (void)applicationWillTerminate:(UIApplication *)application { + [WCSession.defaultSession updateApplicationContext:@{@"isWalletsInitialized": @NO} error:nil]; +} + - (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL succeeded)) completionHandler { [RNQuickActionManager onQuickActionPress:shortcutItem completionHandler:completionHandler]; } diff --git a/ios/BlueWalletWatch Extension/Objects/WatchDataSource.swift b/ios/BlueWalletWatch Extension/Objects/WatchDataSource.swift index dbd25e23a..f9a4f2a80 100644 --- a/ios/BlueWalletWatch Extension/Objects/WatchDataSource.swift +++ b/ios/BlueWalletWatch Extension/Objects/WatchDataSource.swift @@ -20,6 +20,7 @@ class WatchDataSource: NSObject, WCSessionDelegate { static let shared = WatchDataSource() var wallets: [Wallet] = [Wallet]() + var companionWalletsInitialized = false private let keychain = KeychainSwift() override init() { @@ -108,6 +109,9 @@ class WatchDataSource: NSObject, WCSessionDelegate { UserDefaults.standard.set(preferredFiatCurrencyUnit.endPointKey, forKey: "preferredFiatCurrency") UserDefaults.standard.synchronize() ExtensionDelegate.preferredFiatCurrencyChanged() + } else if let isWalletsInitialized = data["isWalletsInitialized"] as? Bool { + companionWalletsInitialized = isWalletsInitialized + NotificationCenter.default.post(Notifications.dataUpdated) } else { WatchDataSource.shared.processWalletsData(walletsInfo: data) } @@ -128,6 +132,8 @@ class WatchDataSource: NSObject, WCSessionDelegate { }) { (error) in print(error) } + } else { + WatchDataSource.shared.companionWalletsInitialized = false } } diff --git a/ios/BlueWalletWatch Extension/SpecifyInterfaceController.swift b/ios/BlueWalletWatch Extension/SpecifyInterfaceController.swift index daf6e75b0..c98665498 100644 --- a/ios/BlueWalletWatch Extension/SpecifyInterfaceController.swift +++ b/ios/BlueWalletWatch Extension/SpecifyInterfaceController.swift @@ -89,7 +89,7 @@ class SpecifyInterfaceController: WKInterfaceController { } @IBAction func createButtonTapped() { - if (WCSession.default.activationState == .activated) { + if WatchDataSource.shared.companionWalletsInitialized { NotificationCenter.default.post(name: NotificationName.createQRCode, object: specifiedQRContent) dismiss() } else { diff --git a/ios/BlueWalletWatch Extension/WalletDetailsInterfaceController.swift b/ios/BlueWalletWatch Extension/WalletDetailsInterfaceController.swift index a1eac4a43..31e0df49c 100644 --- a/ios/BlueWalletWatch Extension/WalletDetailsInterfaceController.swift +++ b/ios/BlueWalletWatch Extension/WalletDetailsInterfaceController.swift @@ -115,7 +115,7 @@ class WalletDetailsInterfaceController: WKInterfaceController { } @IBAction func createInvoiceTapped() { - if (WCSession.default.activationState == .activated) { + if (WatchDataSource.shared.companionWalletsInitialized) { pushController(withName: ReceiveInterfaceController.identifier, context: (wallet?.identifier, "createInvoice")) } else { presentAlert(withTitle: "Error", message: "Unable to create invoice. Please open BlueWallet on your iPhone and unlock your wallets.", preferredStyle: .alert, actions: [WKAlertAction(title: "OK", style: .default, handler: { [weak self] in diff --git a/ios/BlueWalletWatch/Base.lproj/Interface.storyboard b/ios/BlueWalletWatch/Base.lproj/Interface.storyboard index 0d1e49864..18a09da65 100644 --- a/ios/BlueWalletWatch/Base.lproj/Interface.storyboard +++ b/ios/BlueWalletWatch/Base.lproj/Interface.storyboard @@ -1,10 +1,10 @@ - + - - + + @@ -80,7 +80,7 @@ -