diff --git a/__mocks__/react-native-camera.js b/__mocks__/react-native-camera.js
new file mode 100644
index 0000000..36712e8
--- /dev/null
+++ b/__mocks__/react-native-camera.js
@@ -0,0 +1,2 @@
+const Camera = {}
+export default Camera;
diff --git a/__mocks__/react-native-keychain.js b/__mocks__/react-native-keychain.js
new file mode 100644
index 0000000..ae3fd1d
--- /dev/null
+++ b/__mocks__/react-native-keychain.js
@@ -0,0 +1,7 @@
+export async function getGenericPassword() {
+ return {
+ password: 'password',
+ };
+}
+
+export async function setGenericPassword() {}
diff --git a/__mocks__/react-native-splash-screen.js b/__mocks__/react-native-splash-screen.js
new file mode 100644
index 0000000..f734a74
--- /dev/null
+++ b/__mocks__/react-native-splash-screen.js
@@ -0,0 +1,5 @@
+const SplashScreen = {
+ hide: jest.fn(),
+}
+
+export default SplashScreen;
diff --git a/__mocks__/react-native.js b/__mocks__/react-native.js
new file mode 100644
index 0000000..62e5d5f
--- /dev/null
+++ b/__mocks__/react-native.js
@@ -0,0 +1,29 @@
+const rn = require('react-native');
+
+jest.useFakeTimers();
+
+jest.mock('Alert', () => ({ alert: jest.fn() }));
+
+jest.mock('NativeModules', () => ({
+ RNRandomBytes: {
+ seed: '123',
+ },
+ P2PTransferBLECentralModule: {
+ addListener: jest.fn(),
+ },
+ P2PTransferBLEPeripheralModule: {},
+ KeyboardObserver: {
+ addListener: jest.fn(),
+ },
+ StatusBarManager: {
+ HEIGHT: 42,
+ setColor: jest.fn(),
+ setStyle: jest.fn(),
+ setHidden: jest.fn(),
+ setNetworkActivityIndicatorVisible: jest.fn(),
+ setBackgroundColor: jest.fn(),
+ setTranslucent: jest.fn(),
+ },
+}));
+
+module.exports = rn;
diff --git a/__tests__/App.js b/__tests__/App.js
deleted file mode 100644
index d0b9ee3..0000000
--- a/__tests__/App.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import 'react-native';
-import React from 'react';
-import App from '../App';
-
-// Note: test renderer must be required after react-native.
-import renderer from 'react-test-renderer';
-
-it('renders correctly', () => {
- const tree = renderer.create(
-
- );
-});
diff --git a/__tests__/__snapshots__/coinid-private-test.js.snap b/__tests__/__snapshots__/coinid-private-test.js.snap
new file mode 100644
index 0000000..3a4b621
--- /dev/null
+++ b/__tests__/__snapshots__/coinid-private-test.js.snap
@@ -0,0 +1,2599 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`bitcoin COINiDPrivate PUB generates correct return data 1`] = `"49-*0-*0-$xpub6CkbGcMGuz8YPkzfL9r3MrGjazWJYL8rFXKafGTdkFmeMHyLidvaFgWGvkwDTy9ze429K8AiEEoukhyJMw5AvwzwiBH9gjGEk636cnKKKGT"`;
+
+exports[`bitcoin COINiDPrivate PUB generates correct return data 2`] = `"44-*0-*0-$xpub6DP26N4oFK3btF9VGJmG4Dbco1hAu7hwg4TaMvdB3i7FptjZMJYad1iAEi6YTsE9au5CwoLXUwsurDoXeQS9TV6iLES7w74VCei4RpUsf44"`;
+
+exports[`bitcoin COINiDPrivate PUB generates correct return data 3`] = `"84-*0-*0-$xpub6BwV1bP9VZZzMFPpzBx8vcC8QvQdbVjLarcgQxX68Bj5oVTThfecDm9LPQwxzjMqTrie53pmLP2Yaag8H7H5GzsqBJVZxEKZg4sPgAHzRQR"`;
+
+exports[`bitcoin COINiDPrivate PUB parses info correct 1`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/49'/0'/0'",
+ ],
+ "network": Object {
+ "bech32": "bc",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 0,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://btc-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 0,
+ "qrScheme": "bitcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "BTC",
+ "title": "Bitcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "",
+ "ticker": "BTC",
+ "type": "pub",
+}
+`;
+
+exports[`bitcoin COINiDPrivate PUB parses info correct 2`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/44'/0'/0'",
+ ],
+ "network": Object {
+ "bech32": "bc",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 0,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://btc-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 0,
+ "qrScheme": "bitcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "BTC",
+ "title": "Bitcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "",
+ "ticker": "BTC",
+ "type": "pub",
+}
+`;
+
+exports[`bitcoin COINiDPrivate PUB parses info correct 3`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/84'/0'/0'",
+ ],
+ "network": Object {
+ "bech32": "bc",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 0,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://btc-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 0,
+ "qrScheme": "bitcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "BTC",
+ "title": "Bitcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "",
+ "ticker": "BTC",
+ "type": "pub",
+}
+`;
+
+exports[`bitcoin COINiDPrivate SAH generates correct return data 1`] = `"unlock wallet 05ic9gZoNv2xCc6BbmzvWw=="`;
+
+exports[`bitcoin COINiDPrivate SAH generates correct return data 2`] = `"coinid-btc://SAH/unlock wallet 05ic9gZoNv2xCc6BbmzvWw=="`;
+
+exports[`bitcoin COINiDPrivate SAH parses info correct 1`] = `
+Object {
+ "derivationPath": "m/49'/0'/0'/1/1",
+ "message": "unlock wallet 05ic9gZoNv2xCc6BbmzvWw==",
+ "network": Object {
+ "bech32": "bc",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 0,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://btc-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 0,
+ "qrScheme": "bitcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "BTC",
+ "title": "Bitcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "49-*0-*0-*0*5+3GO7JP",
+ "ticker": "BTC",
+ "type": "sah",
+}
+`;
+
+exports[`bitcoin COINiDPrivate SWP generates correct return data 1`] = `"P2SH-P2WPKH*3CZrwqWma9hnDiC3sS1eDuA4wJuUtbmQ9f*1+P2PKH*1HfeuDqRZtEtrCoU57svi9NzogYtEe3VvG*1+P2WPKH*bc1qkmghf6a4guw5yj4cp0d6xarlg5k67y7tut62w8*1"`;
+
+exports[`bitcoin COINiDPrivate SWP generates correct return data 2`] = `"coinid-btc://SWP/P2SH-P2WPKH*3CZrwqWma9hnDiC3sS1eDuA4wJuUtbmQ9f*1+P2PKH*1HfeuDqRZtEtrCoU57svi9NzogYtEe3VvG*1+P2WPKH*bc1qkmghf6a4guw5yj4cp0d6xarlg5k67y7tut62w8*1"`;
+
+exports[`bitcoin COINiDPrivate SWP parses info correct 1`] = `
+Object {
+ "network": Object {
+ "bech32": "bc",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 0,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://btc-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 0,
+ "qrScheme": "bitcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "BTC",
+ "title": "Bitcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "49-*0-*0-*0*5+3GO7JP",
+ "ticker": "BTC",
+ "type": "swp",
+}
+`;
+
+exports[`bitcoin COINiDPrivate SWP parses sweep data correct 1`] = `
+Object {
+ "addresses": Array [
+ Object {
+ "address": "3CZrwqWma9hnDiC3sS1eDuA4wJuUtbmQ9f",
+ "type": "P2SH-P2WPKH",
+ },
+ Object {
+ "address": "1HfeuDqRZtEtrCoU57svi9NzogYtEe3VvG",
+ "type": "P2PKH",
+ },
+ Object {
+ "address": "bc1qkmghf6a4guw5yj4cp0d6xarlg5k67y7tut62w8",
+ "type": "P2WPKH",
+ },
+ ],
+ "compressed": true,
+ "decryptedWif": "KzqJS7fj8LQuvuydtpxUD4BTKwb3BnzQUWtM1vk4pKfJVGogq2b3",
+ "encryptedWif": undefined,
+ "params": Object {},
+}
+`;
+
+exports[`bitcoin COINiDPrivate SWPTX generates correct return data 1`] = `"0100000000010156054AE5990EAE038E00372954FEE8B130ACCEEE98936A69BED23A45E7A084AD0100000017160014B6D174EBB5471D424AB80BDBA3747F452DAF13CBFFFFFFFF01B8410F000000000017A914A5B0E07FB61346E58E0AA143F4E103DC505793B2870247304402206F8412DD5D7CB1494FE1D0A75B1BF82793563761D91BCA74F2267A4142672EC80220564EC981617C26795A6581E6849992EBC9AEBD827EAA385C81DB28D39AE12CB20121028EDFBACA39BD77E100721B521FD87D3111640F069418AEBBA6FE6DC7112EE7DD00000000"`;
+
+exports[`bitcoin COINiDPrivate SWPTX generates correct return data 2`] = `"coinid-btc://SWPTX/0100000000010156054AE5990EAE038E00372954FEE8B130ACCEEE98936A69BED23A45E7A084AD0100000017160014B6D174EBB5471D424AB80BDBA3747F452DAF13CBFFFFFFFF01B8410F000000000017A914A5B0E07FB61346E58E0AA143F4E103DC505793B2870247304402206F8412DD5D7CB1494FE1D0A75B1BF82793563761D91BCA74F2267A4142672EC80220564EC981617C26795A6581E6849992EBC9AEBD827EAA385C81DB28D39AE12CB20121028EDFBACA39BD77E100721B521FD87D3111640F069418AEBBA6FE6DC7112EE7DD00000000"`;
+
+exports[`bitcoin COINiDPrivate SWPTX parses info correct 1`] = `
+Object {
+ "inputInfoArr": Array [
+ Object {
+ "address": "2N14MWFaFKfFcsMgTXKZeRhPZunNUWFzWGy",
+ "hash": "ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556",
+ "index": 1,
+ "satValue": 1000000,
+ "type": "P2SH-P2WPKH",
+ },
+ ],
+ "network": Object {
+ "bech32": "bc",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 0,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://btc-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 0,
+ "qrScheme": "bitcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "BTC",
+ "title": "Bitcoin",
+ "wif": 128,
+ },
+ "outputInfo": Object {
+ "address": "3Go7JpcBu7XdYa93EUfvTD4hFbECWRr1Ew",
+ "derivationPath": "m/49'/0'/0'/0/5",
+ "satValue": 999864,
+ },
+ "ownerCheck": "49-*0-*0-*0*5+3GO7JP",
+ "ticker": "BTC",
+ "type": "swptx",
+}
+`;
+
+exports[`bitcoin COINiDPrivate SWPTX parses transaction info correct 1`] = `
+Object {
+ "fee": 136,
+ "inputs": Array [
+ Object {
+ "address": "2N14MWFaFKfFcsMgTXKZeRhPZunNUWFzWGy",
+ "hash": "ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556",
+ "index": 1,
+ "satValue": 1000000,
+ "type": "P2SH-P2WPKH",
+ },
+ ],
+ "outputSat": 999864,
+ "receiveAddress": "3Go7JpcBu7XdYa93EUfvTD4hFbECWRr1Ew",
+ "receiveDerivationPath": "m/49'/0'/0'/0/5",
+ "total": 1000000,
+}
+`;
+
+exports[`bitcoin COINiDPrivate TX generates correct return data 1`] = `"01000000000102A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C02000000171600146A238081E804BB0E48EC782BBF692A7E4D283D9300000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C01000000171600142B9E46C08C2AE35BD22AFD5D2F9C40BCA4C99CE00000000005400D03000000000017A914A89F3493631D141E847A15CB3BA68234CC6ACC2E87B08F0600000000001976A9147E6257D509CCDD623F4AB33416F17A44A0A5F7BC88AC10270000000000001600147E6257D509CCDD623F4AB33416F17A44A0A5F7BC307500000000000017A91461F05801F6931D95CD0180917B6CACF84C767E818738FA01000000000017A914CD05CE4F0D4B88D2E00A9FE7CF3AA8FEEAF77362870247304402201C3253F5F64232A64F33FF36861FCB910D5C62A2C1DB89B80025D2EEF71A5D8D0220273FC6D74BE88B5BFDC9D840B9F3F710E17FBCE86E836C15D016AD3296CCCFF2012103E0E694A6DC947AA79B7758A0FC25EB71B14CE1275B84D9EC22449C5C0CEDAB1902473044022032C26F213BF72A8BC366CE77C011D9A0CCF43CF710969A6AF3AD9C2FA63453EA022024E8F027E6F593D5E3A1437D1ED0496F9672A5BEAEA0A9E88CBCE03FCE5B752F012103368A7B7CF24663D3E8C1311E681D946F9BB9EFAE982FEC96D91F708547E2725D00000000"`;
+
+exports[`bitcoin COINiDPrivate TX generates correct return data 2`] = `"coinid-btc://TX/01000000000102A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C02000000171600146A238081E804BB0E48EC782BBF692A7E4D283D9300000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C01000000171600142B9E46C08C2AE35BD22AFD5D2F9C40BCA4C99CE00000000005400D03000000000017A914A89F3493631D141E847A15CB3BA68234CC6ACC2E87B08F0600000000001976A9147E6257D509CCDD623F4AB33416F17A44A0A5F7BC88AC10270000000000001600147E6257D509CCDD623F4AB33416F17A44A0A5F7BC307500000000000017A91461F05801F6931D95CD0180917B6CACF84C767E818738FA01000000000017A914CD05CE4F0D4B88D2E00A9FE7CF3AA8FEEAF77362870247304402201C3253F5F64232A64F33FF36861FCB910D5C62A2C1DB89B80025D2EEF71A5D8D0220273FC6D74BE88B5BFDC9D840B9F3F710E17FBCE86E836C15D016AD3296CCCFF2012103E0E694A6DC947AA79B7758A0FC25EB71B14CE1275B84D9EC22449C5C0CEDAB1902473044022032C26F213BF72A8BC366CE77C011D9A0CCF43CF710969A6AF3AD9C2FA63453EA022024E8F027E6F593D5E3A1437D1ED0496F9672A5BEAEA0A9E88CBCE03FCE5B752F012103368A7B7CF24663D3E8C1311E681D946F9BB9EFAE982FEC96D91F708547E2725D00000000"`;
+
+exports[`bitcoin COINiDPrivate TX parses info correct 1`] = `
+Object {
+ "changeOutputIndexArr": Array [
+ 4,
+ ],
+ "inputDerivationPathArr": Array [
+ "m/49'/0'/0'/0/5",
+ "m/49'/0'/0'/1/2",
+ ],
+ "inputValueArr": Array [
+ 369796,
+ 430000,
+ ],
+ "network": Object {
+ "bech32": "bc",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 0,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://btc-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 0,
+ "qrScheme": "bitcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "BTC",
+ "title": "Bitcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "49-*0-*0-*0*5+3GO7JP",
+ "ticker": "BTC",
+ "txHex": "0100000002A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C020000000000000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C01000000000000000005400D03000000000017A914A89F3493631D141E847A15CB3BA68234CC6ACC2E87B08F0600000000001976A9147E6257D509CCDD623F4AB33416F17A44A0A5F7BC88AC10270000000000001600147E6257D509CCDD623F4AB33416F17A44A0A5F7BC307500000000000017A91461F05801F6931D95CD0180917B6CACF84C767E818738FA01000000000017A914CD05CE4F0D4B88D2E00A9FE7CF3AA8FEEAF773628700000000",
+ "type": "tx",
+}
+`;
+
+exports[`bitcoin COINiDPrivate TX parses transaction info correct 1`] = `
+Object {
+ "allInputTotal": 799796,
+ "allOutputTotal": 799592,
+ "allOutputs": Array [
+ Object {
+ "address": "3H4cAZ7qPd4HcgSQzad9oX4AbSVxs9hMS5",
+ "amount": 200000,
+ },
+ Object {
+ "address": "1CXFxAnFzeCa61ChFB7iHnFe2NekG74YZE",
+ "amount": 430000,
+ },
+ Object {
+ "address": "bc1q0e3904gfenwky062kv6pdut6gjs2taauu4hum2",
+ "amount": 10000,
+ },
+ Object {
+ "address": "3AcsPXgpehJ1y8zQfzU93yTF1gdDiYJHU6",
+ "amount": 30000,
+ },
+ Object {
+ "address": "3LP5QGb3oeb2jJNEecGKy8mLrLXsN9EVEV",
+ "amount": 129592,
+ },
+ ],
+ "changeOutputs": Array [
+ Object {
+ "address": "3LP5QGb3oeb2jJNEecGKy8mLrLXsN9EVEV",
+ "amount": 129592,
+ },
+ ],
+ "changeTotal": 129592,
+ "externalOutputs": Array [
+ Object {
+ "address": "3H4cAZ7qPd4HcgSQzad9oX4AbSVxs9hMS5",
+ "amount": 200000,
+ },
+ Object {
+ "address": "1CXFxAnFzeCa61ChFB7iHnFe2NekG74YZE",
+ "amount": 430000,
+ },
+ Object {
+ "address": "bc1q0e3904gfenwky062kv6pdut6gjs2taauu4hum2",
+ "amount": 10000,
+ },
+ Object {
+ "address": "3AcsPXgpehJ1y8zQfzU93yTF1gdDiYJHU6",
+ "amount": 30000,
+ },
+ ],
+ "externalTotal": 670000,
+ "fee": 204,
+}
+`;
+
+exports[`bitcoin COINiDPrivate VAL generates correct return data 1`] = `"31uZbEJCc3aA73Th94P1fTFcsb3UwKXKtX"`;
+
+exports[`bitcoin COINiDPrivate VAL parses info correct 1`] = `
+Object {
+ "derivationPath": "m/49'/0'/0'/0/2",
+ "network": Object {
+ "bech32": "bc",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 0,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://btc-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://btc-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 0,
+ "qrScheme": "bitcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "BTC",
+ "title": "Bitcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "49-*0-*0-*0*5+3GO7JP",
+ "ticker": "BTC",
+ "type": "val",
+}
+`;
+
+exports[`groestlcoin COINiDPrivate PUB generates correct return data 1`] = `"49-*17-*0-$xpub6C2to84hFLdu4JMxvaoaSiJ1r9buS5Y7nXQGPSuRRYPWX1ATTwB4zdvZq9XeS3C1Bkv1EJp3zQpW7hLN7N2ZjU2cbD1bHMP1NQ2HaAaFo4S"`;
+
+exports[`groestlcoin COINiDPrivate PUB generates correct return data 2`] = `"44-*17-*0-$xpub6DBEGvvZFPMwFakEFPZ9Xf3MPvVXiBgHrGZrJMwRSoAtKWhUyMSHQsrRYvdftodqdENyoiVXPE9Y2insgH823cXu7sPbLPvVv822VA9nR1Y"`;
+
+exports[`groestlcoin COINiDPrivate PUB generates correct return data 3`] = `"84-*17-*0-$xpub6CDFmeMKBS8snYzUYhYPVgnto3oJgw5DthZhA1q8ABfnFLgXAaFqLFtUphLrYmdsajWVJGZ91puqADSc9nxcj9D9RLTTmNNqbEVJJhNbDNM"`;
+
+exports[`groestlcoin COINiDPrivate PUB parses info correct 1`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/49'/17'/0'",
+ ],
+ "network": Object {
+ "bech32": "grs",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 17,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 36,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "GRS",
+ "title": "Groestlcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "",
+ "ticker": "GRS",
+ "type": "pub",
+}
+`;
+
+exports[`groestlcoin COINiDPrivate PUB parses info correct 2`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/44'/17'/0'",
+ ],
+ "network": Object {
+ "bech32": "grs",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 17,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 36,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "GRS",
+ "title": "Groestlcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "",
+ "ticker": "GRS",
+ "type": "pub",
+}
+`;
+
+exports[`groestlcoin COINiDPrivate PUB parses info correct 3`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/84'/17'/0'",
+ ],
+ "network": Object {
+ "bech32": "grs",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 17,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 36,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "GRS",
+ "title": "Groestlcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "",
+ "ticker": "GRS",
+ "type": "pub",
+}
+`;
+
+exports[`groestlcoin COINiDPrivate SAH generates correct return data 1`] = `"unlock wallet 05ic9gZoNv2xCc6BbmzvWw=="`;
+
+exports[`groestlcoin COINiDPrivate SAH generates correct return data 2`] = `"coinid-grs://SAH/unlock wallet 05ic9gZoNv2xCc6BbmzvWw=="`;
+
+exports[`groestlcoin COINiDPrivate SAH parses info correct 1`] = `
+Object {
+ "derivationPath": "m/49'/17'/0'/1/1",
+ "message": "unlock wallet 05ic9gZoNv2xCc6BbmzvWw==",
+ "network": Object {
+ "bech32": "grs",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 17,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 36,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "GRS",
+ "title": "Groestlcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "49-*17-*0-*0*3+3HMJUS",
+ "ticker": "GRS",
+ "type": "sah",
+}
+`;
+
+exports[`groestlcoin COINiDPrivate SWP generates correct return data 1`] = `"P2PKH*FtS9MQRCk4XXJMXUX9C8nN4UScLcNAk22v*0"`;
+
+exports[`groestlcoin COINiDPrivate SWP generates correct return data 2`] = `"coinid-grs://SWP/P2PKH*FtS9MQRCk4XXJMXUX9C8nN4UScLcNAk22v*0"`;
+
+exports[`groestlcoin COINiDPrivate SWP parses info correct 1`] = `
+Object {
+ "network": Object {
+ "bech32": "grs",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 17,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 36,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "GRS",
+ "title": "Groestlcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "49-*17-*0-*0*3+3HMJUS",
+ "ticker": "GRS",
+ "type": "swp",
+}
+`;
+
+exports[`groestlcoin COINiDPrivate SWP parses sweep data correct 1`] = `
+Object {
+ "addresses": Array [
+ Object {
+ "address": "FtS9MQRCk4XXJMXUX9C8nN4UScLcNAk22v",
+ "type": "P2PKH",
+ },
+ ],
+ "compressed": false,
+ "decryptedWif": "5KehPPuBBYK4kLSxpjVbL7N1VrDTshVn4iezXkwdnoBRQHtbfaw",
+ "encryptedWif": undefined,
+ "params": Object {},
+}
+`;
+
+exports[`groestlcoin COINiDPrivate SWPTX generates correct return data 1`] = `"010000000156054AE5990EAE038E00372954FEE8B130ACCEEE98936A69BED23A45E7A084AD010000008B483045022100BC8CB6998ABF18F8C168A1DECDEA11F2B20517C24F1BD67A51783E5E9B90DDC0022043FAF56C56C32CD539FC6EB1CE78CBEBAA504D26FE3762DA739DC1C2169834AB014104F28519581797D8CFDB897F328D34EA6B228C7CE942997436EA3F2DB2A9950B817B042954F63AF1B5A84F8D14D659A810D359EA3642460CF870BE2653B4763259FFFFFFFF01B8410F000000000017A914B066BA0457F02BE9C67E84BDBF3596E8A7A85F418700000000"`;
+
+exports[`groestlcoin COINiDPrivate SWPTX generates correct return data 2`] = `"coinid-grs://SWPTX/010000000156054AE5990EAE038E00372954FEE8B130ACCEEE98936A69BED23A45E7A084AD010000008B483045022100BC8CB6998ABF18F8C168A1DECDEA11F2B20517C24F1BD67A51783E5E9B90DDC0022043FAF56C56C32CD539FC6EB1CE78CBEBAA504D26FE3762DA739DC1C2169834AB014104F28519581797D8CFDB897F328D34EA6B228C7CE942997436EA3F2DB2A9950B817B042954F63AF1B5A84F8D14D659A810D359EA3642460CF870BE2653B4763259FFFFFFFF01B8410F000000000017A914B066BA0457F02BE9C67E84BDBF3596E8A7A85F418700000000"`;
+
+exports[`groestlcoin COINiDPrivate SWPTX parses info correct 1`] = `
+Object {
+ "inputInfoArr": Array [
+ Object {
+ "address": "FtS9MQRCk4XXJMXUX9C8nN4UScLcNAk22v",
+ "hash": "ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556",
+ "index": 1,
+ "satValue": 1000000,
+ "type": "P2PKH",
+ },
+ ],
+ "network": Object {
+ "bech32": "grs",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 17,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 36,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "GRS",
+ "title": "Groestlcoin",
+ "wif": 128,
+ },
+ "outputInfo": Object {
+ "address": "3HmjusqAu6EtPPSpKW88w5tsjf2tx6236S",
+ "derivationPath": "m/49'/17'/0'/0/3",
+ "satValue": 999864,
+ },
+ "ownerCheck": "49-*17-*0-*0*3+3HMJUS",
+ "ticker": "GRS",
+ "type": "swptx",
+}
+`;
+
+exports[`groestlcoin COINiDPrivate SWPTX parses transaction info correct 1`] = `
+Object {
+ "fee": 136,
+ "inputs": Array [
+ Object {
+ "address": "FtS9MQRCk4XXJMXUX9C8nN4UScLcNAk22v",
+ "hash": "ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556",
+ "index": 1,
+ "satValue": 1000000,
+ "type": "P2PKH",
+ },
+ ],
+ "outputSat": 999864,
+ "receiveAddress": "3HmjusqAu6EtPPSpKW88w5tsjf2tx6236S",
+ "receiveDerivationPath": "m/49'/17'/0'/0/3",
+ "total": 1000000,
+}
+`;
+
+exports[`groestlcoin COINiDPrivate TX generates correct return data 1`] = `"01000000000102A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C0200000017160014E881092F1C764E99EB266A2BF0C04A42599EE41D00000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C0100000017160014BB3562F4A72F121C8566513910A74501C801EF860000000005400D03000000000017A914C50D589AE0965FBB3484D51AF1271A6BC2851E8987B08F0600000000001976A914EF20271534095EA2A69064620164F248997D64CB88AC1027000000000000160014EF20271534095EA2A69064620164F248997D64CB307500000000000017A914609796DC6E5DFFB0948A3D268ACE1FCFE2B4A96B8738FA01000000000017A914263482828E92FF4510191F10A3FA2CDBC1D04711870247304402205D6147768478B2BBDEB7CAC18C4DFB3D1D4707CC7F47B943F73CC82F711FABA0022031F99A3C511D8AEF151D42ABFF53C87E37D0096D8E0C5A9988B4B12B60C532CE01210346F8BFBF63E1D7B1CBC98BB73D539E65A1859C871931F1D6563F76418F85644B02483045022100E568A56B95AC20D1C87FCD857C657F501FDE93CC5724E951335FC3A613F055D5022020E46EBE02418D51709A7111A3E2605DE3A4E15E3F63224CABC8945AB411AB2001210228FC4FCF93F43235AAAB57358075A0C9B70443D8858B839E4CFEFF42EDCF3A2A00000000"`;
+
+exports[`groestlcoin COINiDPrivate TX generates correct return data 2`] = `"coinid-grs://TX/01000000000102A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C0200000017160014E881092F1C764E99EB266A2BF0C04A42599EE41D00000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C0100000017160014BB3562F4A72F121C8566513910A74501C801EF860000000005400D03000000000017A914C50D589AE0965FBB3484D51AF1271A6BC2851E8987B08F0600000000001976A914EF20271534095EA2A69064620164F248997D64CB88AC1027000000000000160014EF20271534095EA2A69064620164F248997D64CB307500000000000017A914609796DC6E5DFFB0948A3D268ACE1FCFE2B4A96B8738FA01000000000017A914263482828E92FF4510191F10A3FA2CDBC1D04711870247304402205D6147768478B2BBDEB7CAC18C4DFB3D1D4707CC7F47B943F73CC82F711FABA0022031F99A3C511D8AEF151D42ABFF53C87E37D0096D8E0C5A9988B4B12B60C532CE01210346F8BFBF63E1D7B1CBC98BB73D539E65A1859C871931F1D6563F76418F85644B02483045022100E568A56B95AC20D1C87FCD857C657F501FDE93CC5724E951335FC3A613F055D5022020E46EBE02418D51709A7111A3E2605DE3A4E15E3F63224CABC8945AB411AB2001210228FC4FCF93F43235AAAB57358075A0C9B70443D8858B839E4CFEFF42EDCF3A2A00000000"`;
+
+exports[`groestlcoin COINiDPrivate TX parses info correct 1`] = `
+Object {
+ "changeOutputIndexArr": Array [
+ 4,
+ ],
+ "inputDerivationPathArr": Array [
+ "m/49'/17'/0'/0/3",
+ "m/49'/17'/0'/1/1",
+ ],
+ "inputValueArr": Array [
+ 369796,
+ 430000,
+ ],
+ "network": Object {
+ "bech32": "grs",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 17,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 36,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "GRS",
+ "title": "Groestlcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "49-*17-*0-*0*3+3HMJUS",
+ "ticker": "GRS",
+ "txHex": "0100000002A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C020000000000000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C01000000000000000005400D03000000000017A914C50D589AE0965FBB3484D51AF1271A6BC2851E8987B08F0600000000001976A914EF20271534095EA2A69064620164F248997D64CB88AC1027000000000000160014EF20271534095EA2A69064620164F248997D64CB307500000000000017A914609796DC6E5DFFB0948A3D268ACE1FCFE2B4A96B8738FA01000000000017A914263482828E92FF4510191F10A3FA2CDBC1D047118700000000",
+ "type": "tx",
+}
+`;
+
+exports[`groestlcoin COINiDPrivate TX parses transaction info correct 1`] = `
+Object {
+ "allInputTotal": 799796,
+ "allOutputTotal": 799592,
+ "allOutputs": Array [
+ Object {
+ "address": "3Kew2dzLeMDUMchRrVse1e1SVYW3odQM3w",
+ "amount": 200000,
+ },
+ Object {
+ "address": "Fry6TmG62wfuFP4JKhjuKNjKv8wmjiTVou",
+ "amount": 430000,
+ },
+ Object {
+ "address": "grs1qauszw9f5p9029f5sv33qze8jfzvh6extzjr2wm",
+ "amount": 10000,
+ },
+ Object {
+ "address": "3AVkPZwZ4XGKpKjboxgi6C4qqZGaMqqd4v",
+ "amount": 30000,
+ },
+ Object {
+ "address": "35B2WH77uY2y27X7gfdWBjh6VbjtZoumNE",
+ "amount": 129592,
+ },
+ ],
+ "changeOutputs": Array [
+ Object {
+ "address": "35B2WH77uY2y27X7gfdWBjh6VbjtZoumNE",
+ "amount": 129592,
+ },
+ ],
+ "changeTotal": 129592,
+ "externalOutputs": Array [
+ Object {
+ "address": "3Kew2dzLeMDUMchRrVse1e1SVYW3odQM3w",
+ "amount": 200000,
+ },
+ Object {
+ "address": "Fry6TmG62wfuFP4JKhjuKNjKv8wmjiTVou",
+ "amount": 430000,
+ },
+ Object {
+ "address": "grs1qauszw9f5p9029f5sv33qze8jfzvh6extzjr2wm",
+ "amount": 10000,
+ },
+ Object {
+ "address": "3AVkPZwZ4XGKpKjboxgi6C4qqZGaMqqd4v",
+ "amount": 30000,
+ },
+ ],
+ "externalTotal": 670000,
+ "fee": 204,
+}
+`;
+
+exports[`groestlcoin COINiDPrivate VAL generates correct return data 1`] = `"3LPCpJLLDd77kgNdm38t4tQqcCJoimAzAB"`;
+
+exports[`groestlcoin COINiDPrivate VAL parses info correct 1`] = `
+Object {
+ "derivationPath": "m/49'/17'/0'/0/2",
+ "network": Object {
+ "bech32": "grs",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 17,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 36,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 5,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "GRS",
+ "title": "Groestlcoin",
+ "wif": 128,
+ },
+ "ownerCheck": "49-*17-*0-*0*3+3HMJUS",
+ "ticker": "GRS",
+ "type": "val",
+}
+`;
+
+exports[`groestlcoin-testnet COINiDPrivate PUB generates correct return data 1`] = `"49-*1-*0-$tpubDDJYTZ5AfXWqpqguxVxCES2gszSiGbei96C5hcvecimptwhM6oTnQPFuiuCmBjAKVAamR1P9M4RD2rU74XrcfVy3Kbn8J5FgnLkSD8ZGWQh"`;
+
+exports[`groestlcoin-testnet COINiDPrivate PUB generates correct return data 2`] = `"44-*1-*0-$tpubDDebpBUs3pCHeXVsPgLHBBbPL76cwdEihX6Sdf5TFCheqK8j3WvDQs7SERyzhJXstJAGeryxipbR5BtsRXBy9GrrhJMYnYcxjFhU5nXZXb5"`;
+
+exports[`groestlcoin-testnet COINiDPrivate PUB generates correct return data 3`] = `"84-*1-*0-$tpubDDiKkNcbGp51ctUrNYrt32UQZSCS6QcZFUeAUPsYLHcUDWmPVir696ps7PoY8gfciEpsisHHyLtpF7P2y2sLF1gf3Rby3KzwHio1JW13h3u"`;
+
+exports[`groestlcoin-testnet COINiDPrivate PUB parses info correct 1`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/49'/1'/0'",
+ ],
+ "network": Object {
+ "bech32": "tgrs",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook-test.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tGRS",
+ "title": "GRS Testnet",
+ "wif": 239,
+ },
+ "ownerCheck": "",
+ "ticker": "TGRS",
+ "type": "pub",
+}
+`;
+
+exports[`groestlcoin-testnet COINiDPrivate PUB parses info correct 2`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/44'/1'/0'",
+ ],
+ "network": Object {
+ "bech32": "tgrs",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook-test.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tGRS",
+ "title": "GRS Testnet",
+ "wif": 239,
+ },
+ "ownerCheck": "",
+ "ticker": "TGRS",
+ "type": "pub",
+}
+`;
+
+exports[`groestlcoin-testnet COINiDPrivate PUB parses info correct 3`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/84'/1'/0'",
+ ],
+ "network": Object {
+ "bech32": "tgrs",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook-test.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tGRS",
+ "title": "GRS Testnet",
+ "wif": 239,
+ },
+ "ownerCheck": "",
+ "ticker": "TGRS",
+ "type": "pub",
+}
+`;
+
+exports[`groestlcoin-testnet COINiDPrivate SAH generates correct return data 1`] = `"unlock wallet 05ic9gZoNv2xCc6BbmzvWw=="`;
+
+exports[`groestlcoin-testnet COINiDPrivate SAH generates correct return data 2`] = `"coinid-tgrs://SAH/unlock wallet 05ic9gZoNv2xCc6BbmzvWw=="`;
+
+exports[`groestlcoin-testnet COINiDPrivate SAH parses info correct 1`] = `
+Object {
+ "derivationPath": "m/49'/1'/0'/1/1",
+ "message": "unlock wallet 05ic9gZoNv2xCc6BbmzvWw==",
+ "network": Object {
+ "bech32": "tgrs",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook-test.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tGRS",
+ "title": "GRS Testnet",
+ "wif": 239,
+ },
+ "ownerCheck": "49-*1-*0-*0*2+2NA5BU",
+ "ticker": "TGRS",
+ "type": "sah",
+}
+`;
+
+exports[`groestlcoin-testnet COINiDPrivate SWP generates correct return data 1`] = `"P2PKH*mnrYq7qJsD2hXgpbPLAmYAQebzyi68wqZ8*0"`;
+
+exports[`groestlcoin-testnet COINiDPrivate SWP generates correct return data 2`] = `"coinid-tgrs://SWP/P2PKH*mnrYq7qJsD2hXgpbPLAmYAQebzyi68wqZ8*0"`;
+
+exports[`groestlcoin-testnet COINiDPrivate SWP parses info correct 1`] = `
+Object {
+ "network": Object {
+ "bech32": "tgrs",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook-test.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tGRS",
+ "title": "GRS Testnet",
+ "wif": 239,
+ },
+ "ownerCheck": "49-*1-*0-*0*2+2NA5BU",
+ "ticker": "TGRS",
+ "type": "swp",
+}
+`;
+
+exports[`groestlcoin-testnet COINiDPrivate SWP parses sweep data correct 1`] = `
+Object {
+ "addresses": Array [
+ Object {
+ "address": "mnrYq7qJsD2hXgpbPLAmYAQebzyi68wqZ8",
+ "type": "P2PKH",
+ },
+ ],
+ "compressed": false,
+ "decryptedWif": "92y1U1qogasK3EqvPndXy3nCG3tFbvgsT9QyF7PVW1JbCjVeyQH",
+ "encryptedWif": undefined,
+ "params": Object {},
+}
+`;
+
+exports[`groestlcoin-testnet COINiDPrivate SWPTX generates correct return data 1`] = `"010000000156054AE5990EAE038E00372954FEE8B130ACCEEE98936A69BED23A45E7A084AD010000008A4730440220207DA5B74D078A36ED7D896183CB7C1FDCAEB455926B889FA077104C713278F9022005C469E8B52B80A647EA1F8D941BED290777A44010F878664C49CB4582A74CBE014104B3A11DD9CBC821E380DBE4E9FA48C1B5E780970D208B592DC3FAFBA56453BF65E47918A039F8406885E365B1EC1CFBAB4F66D46D75526DAFB6DAEFBBDA9987DBFFFFFFFF01B8410F000000000017A914B8A7EA488D894C7E57C52698D5D0EE97695F63F78700000000"`;
+
+exports[`groestlcoin-testnet COINiDPrivate SWPTX generates correct return data 2`] = `"coinid-tgrs://SWPTX/010000000156054AE5990EAE038E00372954FEE8B130ACCEEE98936A69BED23A45E7A084AD010000008A4730440220207DA5B74D078A36ED7D896183CB7C1FDCAEB455926B889FA077104C713278F9022005C469E8B52B80A647EA1F8D941BED290777A44010F878664C49CB4582A74CBE014104B3A11DD9CBC821E380DBE4E9FA48C1B5E780970D208B592DC3FAFBA56453BF65E47918A039F8406885E365B1EC1CFBAB4F66D46D75526DAFB6DAEFBBDA9987DBFFFFFFFF01B8410F000000000017A914B8A7EA488D894C7E57C52698D5D0EE97695F63F78700000000"`;
+
+exports[`groestlcoin-testnet COINiDPrivate SWPTX parses info correct 1`] = `
+Object {
+ "inputInfoArr": Array [
+ Object {
+ "address": "mnrYq7qJsD2hXgpbPLAmYAQebzyi68wqZ8",
+ "hash": "ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556",
+ "index": 1,
+ "satValue": 1000000,
+ "type": "P2PKH",
+ },
+ ],
+ "network": Object {
+ "bech32": "tgrs",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook-test.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tGRS",
+ "title": "GRS Testnet",
+ "wif": 239,
+ },
+ "outputInfo": Object {
+ "address": "2NA5bUXmS96csYzmVJJs828MJehYm2zgQBr",
+ "derivationPath": "m/49'/1'/0'/0/2",
+ "satValue": 999864,
+ },
+ "ownerCheck": "49-*1-*0-*0*2+2NA5BU",
+ "ticker": "TGRS",
+ "type": "swptx",
+}
+`;
+
+exports[`groestlcoin-testnet COINiDPrivate SWPTX parses transaction info correct 1`] = `
+Object {
+ "fee": 136,
+ "inputs": Array [
+ Object {
+ "address": "mnrYq7qJsD2hXgpbPLAmYAQebzyi68wqZ8",
+ "hash": "ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556",
+ "index": 1,
+ "satValue": 1000000,
+ "type": "P2PKH",
+ },
+ ],
+ "outputSat": 999864,
+ "receiveAddress": "2NA5bUXmS96csYzmVJJs828MJehYm2zgQBr",
+ "receiveDerivationPath": "m/49'/1'/0'/0/2",
+ "total": 1000000,
+}
+`;
+
+exports[`groestlcoin-testnet COINiDPrivate TX generates correct return data 1`] = `"01000000000102A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C02000000171600149CC41CFED67454E3CA28C12CAD9AAAC9CD38F65100000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C010000001716001415E7F24BB26FAF3AAAE2A13B9691D567EB30FF640000000005400D03000000000017A914D7EF101DAA78E7656CA3C49B30B854E8C4D7A2BF87B08F0600000000001976A9147E8EB917EAB0DA74EE21769044B8E36562BF5D3288AC10270000000000001600147E8EB917EAB0DA74EE21769044B8E36562BF5D32307500000000000017A914E1BCEA2765A83B1D688CF113A93F78E2D119EA2A8738FA01000000000017A9142E95CFDD61B2F735E6BEDF5291B6F0873E4F1D0087024730440220793BB1EB7FF1899DE73959FEC6255770C749BD205601B771AC4F147558BF74ED02202FD06D3B042C3702D99C03642EAD920CB71DE7A3DD0BC18D5EB7E4F295B9E339012103DE94033563E65540E31866CB19BB8719279EA1CAD0301EE19D4F9F7F7034EF2602483045022100B4ABBA3E57DE274A6073333BA4436B0530C1C3A9E26C332CBDB696B15F5E48E0022070D6BEAB5F287E5550937B55E101C184110A2AB3D2098CEC84D7DA68F8698EBC012103BC68669A007AAD9D683918E7AFF193A1A6151013E86871A0B4A36F8D8032D37A00000000"`;
+
+exports[`groestlcoin-testnet COINiDPrivate TX generates correct return data 2`] = `"coinid-tgrs://TX/01000000000102A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C02000000171600149CC41CFED67454E3CA28C12CAD9AAAC9CD38F65100000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C010000001716001415E7F24BB26FAF3AAAE2A13B9691D567EB30FF640000000005400D03000000000017A914D7EF101DAA78E7656CA3C49B30B854E8C4D7A2BF87B08F0600000000001976A9147E8EB917EAB0DA74EE21769044B8E36562BF5D3288AC10270000000000001600147E8EB917EAB0DA74EE21769044B8E36562BF5D32307500000000000017A914E1BCEA2765A83B1D688CF113A93F78E2D119EA2A8738FA01000000000017A9142E95CFDD61B2F735E6BEDF5291B6F0873E4F1D0087024730440220793BB1EB7FF1899DE73959FEC6255770C749BD205601B771AC4F147558BF74ED02202FD06D3B042C3702D99C03642EAD920CB71DE7A3DD0BC18D5EB7E4F295B9E339012103DE94033563E65540E31866CB19BB8719279EA1CAD0301EE19D4F9F7F7034EF2602483045022100B4ABBA3E57DE274A6073333BA4436B0530C1C3A9E26C332CBDB696B15F5E48E0022070D6BEAB5F287E5550937B55E101C184110A2AB3D2098CEC84D7DA68F8698EBC012103BC68669A007AAD9D683918E7AFF193A1A6151013E86871A0B4A36F8D8032D37A00000000"`;
+
+exports[`groestlcoin-testnet COINiDPrivate TX parses info correct 1`] = `
+Object {
+ "changeOutputIndexArr": Array [
+ 4,
+ ],
+ "inputDerivationPathArr": Array [
+ "m/49'/1'/0'/0/2",
+ "m/49'/1'/0'/1/1",
+ ],
+ "inputValueArr": Array [
+ 369796,
+ 430000,
+ ],
+ "network": Object {
+ "bech32": "tgrs",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook-test.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tGRS",
+ "title": "GRS Testnet",
+ "wif": 239,
+ },
+ "ownerCheck": "49-*1-*0-*0*2+2NA5BU",
+ "ticker": "TGRS",
+ "txHex": "0100000002A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C020000000000000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C01000000000000000005400D03000000000017A914D7EF101DAA78E7656CA3C49B30B854E8C4D7A2BF87B08F0600000000001976A9147E8EB917EAB0DA74EE21769044B8E36562BF5D3288AC10270000000000001600147E8EB917EAB0DA74EE21769044B8E36562BF5D32307500000000000017A914E1BCEA2765A83B1D688CF113A93F78E2D119EA2A8738FA01000000000017A9142E95CFDD61B2F735E6BEDF5291B6F0873E4F1D008700000000",
+ "type": "tx",
+}
+`;
+
+exports[`groestlcoin-testnet COINiDPrivate TX parses transaction info correct 1`] = `
+Object {
+ "allInputTotal": 799796,
+ "allOutputTotal": 799592,
+ "allOutputs": Array [
+ Object {
+ "address": "2NCvyeutPLBED5fVbPtydrvGX2dUjvaBvUP",
+ "amount": 200000,
+ },
+ Object {
+ "address": "ms48Qo1Kb8qQEb5A7UNSLf16pTmdsSWju1",
+ "amount": 430000,
+ },
+ Object {
+ "address": "tgrs1q068tj9l2krd8fm3pw6gyfw8rv43t7hfjcyczyg",
+ "amount": 10000,
+ },
+ Object {
+ "address": "2NDppLU2NbjiXiiPCoiLZ3n8taoSsU7xjc9",
+ "amount": 30000,
+ },
+ Object {
+ "address": "2MwVYYE5yeb4UqYcoGHRzWHnuPPqLEZXG4b",
+ "amount": 129592,
+ },
+ ],
+ "changeOutputs": Array [
+ Object {
+ "address": "2MwVYYE5yeb4UqYcoGHRzWHnuPPqLEZXG4b",
+ "amount": 129592,
+ },
+ ],
+ "changeTotal": 129592,
+ "externalOutputs": Array [
+ Object {
+ "address": "2NCvyeutPLBED5fVbPtydrvGX2dUjvaBvUP",
+ "amount": 200000,
+ },
+ Object {
+ "address": "ms48Qo1Kb8qQEb5A7UNSLf16pTmdsSWju1",
+ "amount": 430000,
+ },
+ Object {
+ "address": "tgrs1q068tj9l2krd8fm3pw6gyfw8rv43t7hfjcyczyg",
+ "amount": 10000,
+ },
+ Object {
+ "address": "2NDppLU2NbjiXiiPCoiLZ3n8taoSsU7xjc9",
+ "amount": 30000,
+ },
+ ],
+ "externalTotal": 670000,
+ "fee": 204,
+}
+`;
+
+exports[`groestlcoin-testnet COINiDPrivate VAL generates correct return data 1`] = `"2NA5bUXmS96csYzmVJJs828MJehYm2zgQBr"`;
+
+exports[`groestlcoin-testnet COINiDPrivate VAL parses info correct 1`] = `
+Object {
+ "derivationPath": "m/49'/1'/0'/0/2",
+ "network": Object {
+ "bech32": "tgrs",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://blockbook-test.groestlcoin.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "GroestlCoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "groestlcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tGRS",
+ "title": "GRS Testnet",
+ "wif": 239,
+ },
+ "ownerCheck": "49-*1-*0-*0*2+2NA5BU",
+ "ticker": "TGRS",
+ "type": "val",
+}
+`;
+
+exports[`myriad COINiDPrivate PUB generates correct return data 1`] = `"49-*90-*0-$xpub6CLcS66ooFPGSmHTjTJsMWHEQFX3gNgXuE8aQSxJtpo4BrjpVRqcx3s7uwvqnWDuirsT81c62gaAaWdY5oNSzCaNRxUbSyGpQ9SbQrNRtDu"`;
+
+exports[`myriad COINiDPrivate PUB generates correct return data 2`] = `"44-*90-*0-$xpub6CHoWiY52in9RiM2WXoeDajSrcUF9nGDbw3J2wijcodZqynKQFDWzhjNWWF4B5m2TGQyaY9xCVrUKit7nUyogK94WNfNA2DMSrJgAa4LSFb"`;
+
+exports[`myriad COINiDPrivate PUB generates correct return data 3`] = `"84-*90-*0-$xpub6D7Po26pEeV5EifhhxdfTmNnbTPjsHDj9LrYsWj9TJTM7HLaACT7xUjPTa3Gso1yTCpNMeHbTHJhuwmMRz4TNurcvcXZajb2MrQ9gvwQKUR"`;
+
+exports[`myriad COINiDPrivate PUB parses info correct 1`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/49'/90'/0'",
+ ],
+ "network": Object {
+ "bech32": "my",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 90,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Myriadcoin Signed Message:
+",
+ "pubKeyHash": 50,
+ "qrScheme": "myriadcoin",
+ "scriptHash": 9,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "XMY",
+ "title": "Myriad",
+ "wif": 178,
+ },
+ "ownerCheck": "",
+ "ticker": "XMY",
+ "type": "pub",
+}
+`;
+
+exports[`myriad COINiDPrivate PUB parses info correct 2`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/44'/90'/0'",
+ ],
+ "network": Object {
+ "bech32": "my",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 90,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Myriadcoin Signed Message:
+",
+ "pubKeyHash": 50,
+ "qrScheme": "myriadcoin",
+ "scriptHash": 9,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "XMY",
+ "title": "Myriad",
+ "wif": 178,
+ },
+ "ownerCheck": "",
+ "ticker": "XMY",
+ "type": "pub",
+}
+`;
+
+exports[`myriad COINiDPrivate PUB parses info correct 3`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/84'/90'/0'",
+ ],
+ "network": Object {
+ "bech32": "my",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 90,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Myriadcoin Signed Message:
+",
+ "pubKeyHash": 50,
+ "qrScheme": "myriadcoin",
+ "scriptHash": 9,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "XMY",
+ "title": "Myriad",
+ "wif": 178,
+ },
+ "ownerCheck": "",
+ "ticker": "XMY",
+ "type": "pub",
+}
+`;
+
+exports[`myriad COINiDPrivate SAH generates correct return data 1`] = `"unlock wallet 05ic9gZoNv2xCc6BbmzvWw=="`;
+
+exports[`myriad COINiDPrivate SAH generates correct return data 2`] = `"coinid-xmy://SAH/unlock wallet 05ic9gZoNv2xCc6BbmzvWw=="`;
+
+exports[`myriad COINiDPrivate SAH parses info correct 1`] = `
+Object {
+ "derivationPath": "m/49'/90'/0'/1/1",
+ "message": "unlock wallet 05ic9gZoNv2xCc6BbmzvWw==",
+ "network": Object {
+ "bech32": "my",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 90,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Myriadcoin Signed Message:
+",
+ "pubKeyHash": 50,
+ "qrScheme": "myriadcoin",
+ "scriptHash": 9,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "XMY",
+ "title": "Myriad",
+ "wif": 178,
+ },
+ "ownerCheck": "49-*90-*0-*0*2+4FY57D",
+ "ticker": "XMY",
+ "type": "sah",
+}
+`;
+
+exports[`myriad COINiDPrivate SWP generates correct return data 1`] = `"P2PKH*MJhP4bpwaqTS53ADmjAscnt6Jv8AXyVx93*0"`;
+
+exports[`myriad COINiDPrivate SWP generates correct return data 2`] = `"coinid-xmy://SWP/P2PKH*MJhP4bpwaqTS53ADmjAscnt6Jv8AXyVx93*0"`;
+
+exports[`myriad COINiDPrivate SWP parses info correct 1`] = `
+Object {
+ "network": Object {
+ "bech32": "my",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 90,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Myriadcoin Signed Message:
+",
+ "pubKeyHash": 50,
+ "qrScheme": "myriadcoin",
+ "scriptHash": 9,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "XMY",
+ "title": "Myriad",
+ "wif": 178,
+ },
+ "ownerCheck": "49-*90-*0-*0*2+4FY57D",
+ "ticker": "XMY",
+ "type": "swp",
+}
+`;
+
+exports[`myriad COINiDPrivate SWP parses sweep data correct 1`] = `
+Object {
+ "addresses": Array [
+ Object {
+ "address": "MJhP4bpwaqTS53ADmjAscnt6Jv8AXyVx93",
+ "type": "P2PKH",
+ },
+ ],
+ "compressed": false,
+ "decryptedWif": "6zMgHHh5aXYZwEFvAxeHYDzwK2ZA2ibLecsfeK6GBYGdiL1tVa2",
+ "encryptedWif": undefined,
+ "params": Object {},
+}
+`;
+
+exports[`myriad COINiDPrivate SWPTX generates correct return data 1`] = `"010000000156054AE5990EAE038E00372954FEE8B130ACCEEE98936A69BED23A45E7A084AD010000008B483045022100C4258649A880DEE27C4F7877654622ADE8B67630B965B41414233573649AD1BF022045E82B42AB0561A9367FB0FB259FC620E8A683D764AD7758D49DCC5B79FE89690141043E45A5BB3AD933EA0C8BE2A92B715B6633497D28F0732D28DA609FFD803E49504675365B0C6146E1842A34B44CB9137D7BFE3D33331F8CAE186E8157B5BA1EEFFFFFFFFF01B8410F000000000017A914201564F4F7355D54E8CBDD6A3BDF33E550A30A0F8700000000"`;
+
+exports[`myriad COINiDPrivate SWPTX generates correct return data 2`] = `"coinid-xmy://SWPTX/010000000156054AE5990EAE038E00372954FEE8B130ACCEEE98936A69BED23A45E7A084AD010000008B483045022100C4258649A880DEE27C4F7877654622ADE8B67630B965B41414233573649AD1BF022045E82B42AB0561A9367FB0FB259FC620E8A683D764AD7758D49DCC5B79FE89690141043E45A5BB3AD933EA0C8BE2A92B715B6633497D28F0732D28DA609FFD803E49504675365B0C6146E1842A34B44CB9137D7BFE3D33331F8CAE186E8157B5BA1EEFFFFFFFFF01B8410F000000000017A914201564F4F7355D54E8CBDD6A3BDF33E550A30A0F8700000000"`;
+
+exports[`myriad COINiDPrivate SWPTX parses info correct 1`] = `
+Object {
+ "inputInfoArr": Array [
+ Object {
+ "address": "MV7AERJ7BA8nDuftiPoCNsYvGrB1V3koew",
+ "hash": "ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556",
+ "index": 1,
+ "satValue": 1000000,
+ "type": "P2PKH",
+ },
+ ],
+ "network": Object {
+ "bech32": "my",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 90,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Myriadcoin Signed Message:
+",
+ "pubKeyHash": 50,
+ "qrScheme": "myriadcoin",
+ "scriptHash": 9,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "XMY",
+ "title": "Myriad",
+ "wif": 178,
+ },
+ "outputInfo": Object {
+ "address": "4fy57d6G6L16DDJgUXPLEy2GBJ3DwmFpTT",
+ "derivationPath": "m/49'/90'/0'/0/2",
+ "satValue": 999864,
+ },
+ "ownerCheck": "49-*90-*0-*0*2+4FY57D",
+ "ticker": "XMY",
+ "type": "swptx",
+}
+`;
+
+exports[`myriad COINiDPrivate SWPTX parses transaction info correct 1`] = `
+Object {
+ "fee": 136,
+ "inputs": Array [
+ Object {
+ "address": "MV7AERJ7BA8nDuftiPoCNsYvGrB1V3koew",
+ "hash": "ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556",
+ "index": 1,
+ "satValue": 1000000,
+ "type": "P2PKH",
+ },
+ ],
+ "outputSat": 999864,
+ "receiveAddress": "4fy57d6G6L16DDJgUXPLEy2GBJ3DwmFpTT",
+ "receiveDerivationPath": "m/49'/90'/0'/0/2",
+ "total": 1000000,
+}
+`;
+
+exports[`myriad COINiDPrivate TX generates correct return data 1`] = `"010000000001010D4E4F1E87B9F1D14727A9472640F74F4A18BA448CB063ED3574D21FCF7467380000000017160014967645EB3841190E7661362EF90AF44EDDC2D3A10000000004400D0300000000001976A9149E9DCD04CF375691FDFA2D19A52AE404B9EF03DE88ACB08F06000000000017A914594F6D51146D61F84C7027A466069E47DE69712C871027000000000000160014293DBC2B6B7CED3D7F363496A4E00B332F209B94E9645E2C0100000017A914556AA879860E42C377B13639C27350469972A71B8702483045022100E9C6F92EA1EACC0594DCE48146451F9424BE1498FB433C03C4A1867D3B080E7E022025DD6E95AEF85E45CB0ACBB6A4BCC65B5BEE2022065F60D92A14785F02B460680121029AD93137AD0355DCF41E75DAECA5E2947A0125F3B20D6685F684D98FA92E77F200000000"`;
+
+exports[`myriad COINiDPrivate TX generates correct return data 2`] = `"coinid-xmy://TX/010000000001010D4E4F1E87B9F1D14727A9472640F74F4A18BA448CB063ED3574D21FCF7467380000000017160014967645EB3841190E7661362EF90AF44EDDC2D3A10000000004400D0300000000001976A9149E9DCD04CF375691FDFA2D19A52AE404B9EF03DE88ACB08F06000000000017A914594F6D51146D61F84C7027A466069E47DE69712C871027000000000000160014293DBC2B6B7CED3D7F363496A4E00B332F209B94E9645E2C0100000017A914556AA879860E42C377B13639C27350469972A71B8702483045022100E9C6F92EA1EACC0594DCE48146451F9424BE1498FB433C03C4A1867D3B080E7E022025DD6E95AEF85E45CB0ACBB6A4BCC65B5BEE2022065F60D92A14785F02B460680121029AD93137AD0355DCF41E75DAECA5E2947A0125F3B20D6685F684D98FA92E77F200000000"`;
+
+exports[`myriad COINiDPrivate TX parses info correct 1`] = `
+Object {
+ "changeOutputIndexArr": Array [
+ 3,
+ ],
+ "inputDerivationPathArr": Array [
+ "m/49'/90'/0'/0/2",
+ ],
+ "inputValueArr": Array [
+ 5039991221,
+ ],
+ "network": Object {
+ "bech32": "my",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 90,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Myriadcoin Signed Message:
+",
+ "pubKeyHash": 50,
+ "qrScheme": "myriadcoin",
+ "scriptHash": 9,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "XMY",
+ "title": "Myriad",
+ "wif": 178,
+ },
+ "ownerCheck": "49-*90-*0-*0*2+4FY57D",
+ "ticker": "XMY",
+ "txHex": "01000000010D4E4F1E87B9F1D14727A9472640F74F4A18BA448CB063ED3574D21FCF74673800000000000000000004400D0300000000001976A9149E9DCD04CF375691FDFA2D19A52AE404B9EF03DE88ACB08F06000000000017A914594F6D51146D61F84C7027A466069E47DE69712C871027000000000000160014293DBC2B6B7CED3D7F363496A4E00B332F209B94E9645E2C0100000017A914556AA879860E42C377B13639C27350469972A71B8700000000",
+ "type": "tx",
+}
+`;
+
+exports[`myriad COINiDPrivate TX parses transaction info correct 1`] = `
+Object {
+ "allInputTotal": 5039991221,
+ "allOutputTotal": 5039991017,
+ "allOutputs": Array [
+ Object {
+ "address": "MNMr2wBZNHXpqXJKfwqFzHxNhUNa3PFvPG",
+ "amount": 200000,
+ },
+ Object {
+ "address": "4mBf9jhXHGNP2PY22uoGo4FQL5dErYxcJr",
+ "amount": 430000,
+ },
+ Object {
+ "address": "my1q9y7mc2mt0nkn6lekxjt2fcqtxvhjpxu5thhhqj",
+ "amount": 10000,
+ },
+ Object {
+ "address": "4kq55239JRFoZ9T2ZtdznVHmctygYcUm9F",
+ "amount": 5039351017,
+ },
+ ],
+ "changeOutputs": Array [
+ Object {
+ "address": "4kq55239JRFoZ9T2ZtdznVHmctygYcUm9F",
+ "amount": 5039351017,
+ },
+ ],
+ "changeTotal": 5039351017,
+ "externalOutputs": Array [
+ Object {
+ "address": "MNMr2wBZNHXpqXJKfwqFzHxNhUNa3PFvPG",
+ "amount": 200000,
+ },
+ Object {
+ "address": "4mBf9jhXHGNP2PY22uoGo4FQL5dErYxcJr",
+ "amount": 430000,
+ },
+ Object {
+ "address": "my1q9y7mc2mt0nkn6lekxjt2fcqtxvhjpxu5thhhqj",
+ "amount": 10000,
+ },
+ ],
+ "externalTotal": 640000,
+ "fee": 204,
+}
+`;
+
+exports[`myriad COINiDPrivate VAL generates correct return data 1`] = `"4fy57d6G6L16DDJgUXPLEy2GBJ3DwmFpTT"`;
+
+exports[`myriad COINiDPrivate VAL parses info correct 1`] = `
+Object {
+ "derivationPath": "m/49'/90'/0'/0/2",
+ "network": Object {
+ "bech32": "my",
+ "bip32": Object {
+ "private": 76066276,
+ "public": 76067358,
+ },
+ "bip44Derivation": 90,
+ "blockTime": 1,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://xmy-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 12,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Myriadcoin Signed Message:
+",
+ "pubKeyHash": 50,
+ "qrScheme": "myriadcoin",
+ "scriptHash": 9,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "XMY",
+ "title": "Myriad",
+ "wif": 178,
+ },
+ "ownerCheck": "49-*90-*0-*0*2+4FY57D",
+ "ticker": "XMY",
+ "type": "val",
+}
+`;
+
+exports[`testnet COINiDPrivate PUB generates correct return data 1`] = `"49-*1-*0-$tpubDDJYTZ5AfXWqpqguxVxCES2gszSiGbei96C5hcvecimptwhM6oTnQPFuiuCmBjAKVAamR1P9M4RD2rU74XrcfVy3Kbn8J5FgnLkSD6gEPxD"`;
+
+exports[`testnet COINiDPrivate PUB generates correct return data 2`] = `"44-*1-*0-$tpubDDebpBUs3pCHeXVsPgLHBBbPL76cwdEihX6Sdf5TFCheqK8j3WvDQs7SERyzhJXstJAGeryxipbR5BtsRXBy9GrrhJMYnYcxjFhU5r5ANde"`;
+
+exports[`testnet COINiDPrivate PUB generates correct return data 3`] = `"84-*1-*0-$tpubDDiKkNcbGp51ctUrNYrt32UQZSCS6QcZFUeAUPsYLHcUDWmPVir696ps7PoY8gfciEpsisHHyLtpF7P2y2sLF1gf3Rby3KzwHio1JWctyV2"`;
+
+exports[`testnet COINiDPrivate PUB parses info correct 1`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/49'/1'/0'",
+ ],
+ "network": Object {
+ "bech32": "tb",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "bitcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tBTC",
+ "title": "Bitcoin",
+ "wif": 239,
+ },
+ "ownerCheck": "",
+ "ticker": "tBTC",
+ "type": "pub",
+}
+`;
+
+exports[`testnet COINiDPrivate PUB parses info correct 2`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/44'/1'/0'",
+ ],
+ "network": Object {
+ "bech32": "tb",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "bitcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tBTC",
+ "title": "Bitcoin",
+ "wif": 239,
+ },
+ "ownerCheck": "",
+ "ticker": "tBTC",
+ "type": "pub",
+}
+`;
+
+exports[`testnet COINiDPrivate PUB parses info correct 3`] = `
+Object {
+ "derivationPathArr": Array [
+ "m/84'/1'/0'",
+ ],
+ "network": Object {
+ "bech32": "tb",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "bitcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tBTC",
+ "title": "Bitcoin",
+ "wif": 239,
+ },
+ "ownerCheck": "",
+ "ticker": "tBTC",
+ "type": "pub",
+}
+`;
+
+exports[`testnet COINiDPrivate SAH generates correct return data 1`] = `"unlock wallet 05ic9gZoNv2xCc6BbmzvWw=="`;
+
+exports[`testnet COINiDPrivate SAH generates correct return data 2`] = `"coinid-tbtc://SAH/unlock wallet 05ic9gZoNv2xCc6BbmzvWw=="`;
+
+exports[`testnet COINiDPrivate SAH parses info correct 1`] = `
+Object {
+ "derivationPath": "m/49'/1'/0'/1/1",
+ "message": "unlock wallet 05ic9gZoNv2xCc6BbmzvWw==",
+ "network": Object {
+ "bech32": "tb",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "bitcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tBTC",
+ "title": "Bitcoin",
+ "wif": 239,
+ },
+ "ownerCheck": "49-*1-*0-*1*0+2MTRGW",
+ "ticker": "tBTC",
+ "type": "sah",
+}
+`;
+
+exports[`testnet COINiDPrivate SWP generates correct return data 1`] = `"P2SH-P2WPKH*2N14MWFaFKfFcsMgTXKZeRhPZunNUWFzWGy*1+P2PKH*mvsCywbc3ARm5difJJLyZUgNFZP9XoHVWg*1+P2WPKH*tb1q4p08w782h8qgpfdpye3d2uv8t0wq940su04k09*1"`;
+
+exports[`testnet COINiDPrivate SWP generates correct return data 2`] = `"coinid-tbtc://SWP/P2SH-P2WPKH*2N14MWFaFKfFcsMgTXKZeRhPZunNUWFzWGy*1+P2PKH*mvsCywbc3ARm5difJJLyZUgNFZP9XoHVWg*1+P2WPKH*tb1q4p08w782h8qgpfdpye3d2uv8t0wq940su04k09*1"`;
+
+exports[`testnet COINiDPrivate SWP parses info correct 1`] = `
+Object {
+ "network": Object {
+ "bech32": "tb",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "bitcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tBTC",
+ "title": "Bitcoin",
+ "wif": 239,
+ },
+ "ownerCheck": "49-*1-*0-*1*0+2MTRGW",
+ "ticker": "tBTC",
+ "type": "swp",
+}
+`;
+
+exports[`testnet COINiDPrivate SWP parses sweep data correct 1`] = `
+Object {
+ "addresses": Array [
+ Object {
+ "address": "2N14MWFaFKfFcsMgTXKZeRhPZunNUWFzWGy",
+ "type": "P2SH-P2WPKH",
+ },
+ Object {
+ "address": "mvsCywbc3ARm5difJJLyZUgNFZP9XoHVWg",
+ "type": "P2PKH",
+ },
+ Object {
+ "address": "tb1q4p08w782h8qgpfdpye3d2uv8t0wq940su04k09",
+ "type": "P2WPKH",
+ },
+ ],
+ "compressed": true,
+ "decryptedWif": "cS3muNLM1GJye3x3Xa7J8zn8eqyQYg542UDHwHJNFnodJvu1pas4",
+ "encryptedWif": undefined,
+ "params": Object {},
+}
+`;
+
+exports[`testnet COINiDPrivate SWPTX generates correct return data 1`] = `"0100000000010156054AE5990EAE038E00372954FEE8B130ACCEEE98936A69BED23A45E7A084AD0100000017160014A85E7778EAB9C080A5A12662D571875BDC02D5F0FFFFFFFF01B8410F000000000017A914EF7242FAEC29933B37316EECA949E51A725415E18702483045022100BD2BFE8478E54E855BA6766D940343689E16FB03D97D37276FEF19FBBAEC1832022010093C5EEC24199CE0484310D3D6A0AD2B5A9F42AD081B765A3ADACBB8484175012102846DC62B2812B8C73C777E57C1ED6720538C6D3C46976916A9A884FC1446098000000000"`;
+
+exports[`testnet COINiDPrivate SWPTX generates correct return data 2`] = `"coinid-tbtc://SWPTX/0100000000010156054AE5990EAE038E00372954FEE8B130ACCEEE98936A69BED23A45E7A084AD0100000017160014A85E7778EAB9C080A5A12662D571875BDC02D5F0FFFFFFFF01B8410F000000000017A914EF7242FAEC29933B37316EECA949E51A725415E18702483045022100BD2BFE8478E54E855BA6766D940343689E16FB03D97D37276FEF19FBBAEC1832022010093C5EEC24199CE0484310D3D6A0AD2B5A9F42AD081B765A3ADACBB8484175012102846DC62B2812B8C73C777E57C1ED6720538C6D3C46976916A9A884FC1446098000000000"`;
+
+exports[`testnet COINiDPrivate SWPTX parses info correct 1`] = `
+Object {
+ "inputInfoArr": Array [
+ Object {
+ "address": "2N14MWFaFKfFcsMgTXKZeRhPZunNUWFzWGy",
+ "hash": "ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556",
+ "index": 1,
+ "satValue": 1000000,
+ "type": "P2SH-P2WPKH",
+ },
+ ],
+ "network": Object {
+ "bech32": "tb",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "bitcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tBTC",
+ "title": "Bitcoin",
+ "wif": 239,
+ },
+ "outputInfo": Object {
+ "address": "2NF5JNAnFEjW5XagJoEsND8kcNoSJyEdRj6",
+ "derivationPath": "m/49'/1'/0'/0/0",
+ "satValue": 999864,
+ },
+ "ownerCheck": "49-*1-*0-*0*0+2NF5JN",
+ "ticker": "tBTC",
+ "type": "swptx",
+}
+`;
+
+exports[`testnet COINiDPrivate SWPTX parses transaction info correct 1`] = `
+Object {
+ "fee": 136,
+ "inputs": Array [
+ Object {
+ "address": "2N14MWFaFKfFcsMgTXKZeRhPZunNUWFzWGy",
+ "hash": "ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556",
+ "index": 1,
+ "satValue": 1000000,
+ "type": "P2SH-P2WPKH",
+ },
+ ],
+ "outputSat": 999864,
+ "receiveAddress": "2NF5JNAnFEjW5XagJoEsND8kcNoSJyEdRj6",
+ "receiveDerivationPath": "m/49'/1'/0'/0/0",
+ "total": 1000000,
+}
+`;
+
+exports[`testnet COINiDPrivate TX generates correct return data 1`] = `"01000000000102A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C0200000017160014F9F2A3CCB09576A5B3051875696C76CCD336D9E000000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C0100000017160014CD1C06EAFD6CA35AE3BAA29D16EA9068929F8C210000000005400D03000000000017A91466A8A442F12B2B8A9C45D3D4CB1CCBDCA952D9A387B08F06000000000017A914D170EE37EA45FBB9DC81598C8445237EC47E8A678710270000000000001976A914F12F2C6E408B3CDFF1991B8783D1EB428F57814B88AC307500000000000016001408C3E3704FC510BEE9F2F05686CBF2A9F541E23F38FA01000000000017A9142E95CFDD61B2F735E6BEDF5291B6F0873E4F1D008702473044022077C2841BAC6048B11AFA84FD37387F4472BF26E38FB41EEA42FC5F03B0A37C4802202331CC8D8BD7C361DA74C73A16F15F00FFB25FF7008CB060A20563B3C95F914E012102BF72F7CC25C362B93849BEA9FC6647ABC2A57F1A09B96E5CD1A744DD5F48DF240247304402207EA3C82A3800EBBFB8E4153CC265F314A2578DBED00E3F1571779125B2A9E54402206CE3207827A11640369440453D958A5CA44FD1A753F1F29C1D226CF49CE4F16901210385B8C3935CBB69AC947782DB09C1B3E7E2681A7A82458C14EB4F7304F1EBFA9A00000000"`;
+
+exports[`testnet COINiDPrivate TX generates correct return data 2`] = `"coinid-tbtc://TX/01000000000102A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C0200000017160014F9F2A3CCB09576A5B3051875696C76CCD336D9E000000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C0100000017160014CD1C06EAFD6CA35AE3BAA29D16EA9068929F8C210000000005400D03000000000017A91466A8A442F12B2B8A9C45D3D4CB1CCBDCA952D9A387B08F06000000000017A914D170EE37EA45FBB9DC81598C8445237EC47E8A678710270000000000001976A914F12F2C6E408B3CDFF1991B8783D1EB428F57814B88AC307500000000000016001408C3E3704FC510BEE9F2F05686CBF2A9F541E23F38FA01000000000017A9142E95CFDD61B2F735E6BEDF5291B6F0873E4F1D008702473044022077C2841BAC6048B11AFA84FD37387F4472BF26E38FB41EEA42FC5F03B0A37C4802202331CC8D8BD7C361DA74C73A16F15F00FFB25FF7008CB060A20563B3C95F914E012102BF72F7CC25C362B93849BEA9FC6647ABC2A57F1A09B96E5CD1A744DD5F48DF240247304402207EA3C82A3800EBBFB8E4153CC265F314A2578DBED00E3F1571779125B2A9E54402206CE3207827A11640369440453D958A5CA44FD1A753F1F29C1D226CF49CE4F16901210385B8C3935CBB69AC947782DB09C1B3E7E2681A7A82458C14EB4F7304F1EBFA9A00000000"`;
+
+exports[`testnet COINiDPrivate TX parses info correct 1`] = `
+Object {
+ "changeOutputIndexArr": Array [
+ 4,
+ ],
+ "inputDerivationPathArr": Array [
+ "m/49'/1'/0'/1/0",
+ "m/49'/1'/0'/0/5",
+ ],
+ "inputValueArr": Array [
+ 369796,
+ 430000,
+ ],
+ "network": Object {
+ "bech32": "tb",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "bitcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tBTC",
+ "title": "Bitcoin",
+ "wif": 239,
+ },
+ "ownerCheck": "49-*1-*0-*1*0+2MTRGW",
+ "ticker": "TBTC",
+ "txHex": "0100000002A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C020000000000000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C01000000000000000005400D03000000000017A91466A8A442F12B2B8A9C45D3D4CB1CCBDCA952D9A387B08F06000000000017A914D170EE37EA45FBB9DC81598C8445237EC47E8A678710270000000000001976A914F12F2C6E408B3CDFF1991B8783D1EB428F57814B88AC307500000000000016001408C3E3704FC510BEE9F2F05686CBF2A9F541E23F38FA01000000000017A9142E95CFDD61B2F735E6BEDF5291B6F0873E4F1D008700000000",
+ "type": "tx",
+}
+`;
+
+exports[`testnet COINiDPrivate TX parses transaction info correct 1`] = `
+Object {
+ "allInputTotal": 799796,
+ "allOutputTotal": 799592,
+ "allOutputs": Array [
+ Object {
+ "address": "2N2c2wH4LcxhRjGXxggzmDL2iXsVBQEjwsK",
+ "amount": 200000,
+ },
+ Object {
+ "address": "2NCLeVvnAoXZou3LrZv9bJMcykSrXnjcRR1",
+ "amount": 430000,
+ },
+ Object {
+ "address": "n3WDexiKdJ7RA2xW1Zxx16UpBtuy276Los",
+ "amount": 10000,
+ },
+ Object {
+ "address": "tb1qprp7xuz0c5gta60j7ptgdjlj4865rc3l8gthfl",
+ "amount": 30000,
+ },
+ Object {
+ "address": "2MwVYYE5yeb4UqYcoGHRzWHnuPPqLBAFJk8",
+ "amount": 129592,
+ },
+ ],
+ "changeOutputs": Array [
+ Object {
+ "address": "2MwVYYE5yeb4UqYcoGHRzWHnuPPqLBAFJk8",
+ "amount": 129592,
+ },
+ ],
+ "changeTotal": 129592,
+ "externalOutputs": Array [
+ Object {
+ "address": "2N2c2wH4LcxhRjGXxggzmDL2iXsVBQEjwsK",
+ "amount": 200000,
+ },
+ Object {
+ "address": "2NCLeVvnAoXZou3LrZv9bJMcykSrXnjcRR1",
+ "amount": 430000,
+ },
+ Object {
+ "address": "n3WDexiKdJ7RA2xW1Zxx16UpBtuy276Los",
+ "amount": 10000,
+ },
+ Object {
+ "address": "tb1qprp7xuz0c5gta60j7ptgdjlj4865rc3l8gthfl",
+ "amount": 30000,
+ },
+ ],
+ "externalTotal": 670000,
+ "fee": 204,
+}
+`;
+
+exports[`testnet COINiDPrivate VAL generates correct return data 1`] = `"2NA5bUXmS96csYzmVJJs828MJehYm5j9K61"`;
+
+exports[`testnet COINiDPrivate VAL parses info correct 1`] = `
+Object {
+ "derivationPath": "m/49'/1'/0'/0/2",
+ "network": Object {
+ "bech32": "tb",
+ "bip32": Object {
+ "private": 70615956,
+ "public": 70617039,
+ },
+ "bip44Derivation": 1,
+ "blockTime": 10,
+ "bridgeParameterArr": Array [
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook1.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook2.coinid.org",
+ ],
+ Array [
+ "blockbook",
+ "wss://testnet-blockbook3.coinid.org",
+ ],
+ ],
+ "confirmations": 6,
+ "hashFunctions": Object {
+ "address": [Function],
+ "transaction": [Function],
+ },
+ "messagePrefix": "Bitcoin Signed Message:
+",
+ "pubKeyHash": 111,
+ "qrScheme": "bitcoin",
+ "scriptHash": 196,
+ "supportedAddressTypes": Array [
+ "P2SH-P2WPKH",
+ "P2PKH",
+ "P2WPKH",
+ ],
+ "ticker": "tBTC",
+ "title": "Bitcoin",
+ "wif": 239,
+ },
+ "ownerCheck": "49-*1-*0-*1*0+2MTRGW",
+ "ticker": "tBTC",
+ "type": "val",
+}
+`;
diff --git a/__tests__/coinid-private-test.js b/__tests__/coinid-private-test.js
new file mode 100644
index 0000000..ab05ba0
--- /dev/null
+++ b/__tests__/coinid-private-test.js
@@ -0,0 +1,146 @@
+import COINiDPrivate from 'coinid-private';
+import { getCoinIdDataFromUrl } from '../src/utils/coinid';
+
+const coinArray = ['testnet', 'myriad', 'bitcoin', 'groestlcoin', 'groestlcoin-testnet'];
+
+coinArray.forEach((coin) => {
+ describe(coin, () => {
+ const { COINiDUrls, sweepedWIF } = require(`./data/${coin}.json`);
+
+ const mnemonic = 'inspire book cream witness surface knee melody duck benefit echo tunnel barrel';
+
+ const getCOINiDFromUrl = (url) => {
+ const { returnScheme, coinIdData, variant } = getCoinIdDataFromUrl(url);
+ return { coinid: COINiDPrivate(coinIdData), variant, returnScheme };
+ };
+
+ describe('COINiDPrivate PUB', () => {
+ const { coinid } = getCOINiDFromUrl(COINiDUrls.pubP2SHP2WPKH);
+
+ it('parses info correct', () => {
+ expect(getCOINiDFromUrl(COINiDUrls.pubP2SHP2WPKH).coinid.getInfo()).toMatchSnapshot();
+ expect(getCOINiDFromUrl(COINiDUrls.pubP2PKH).coinid.getInfo()).toMatchSnapshot();
+ expect(getCOINiDFromUrl(COINiDUrls.pubP2WPKH).coinid.getInfo()).toMatchSnapshot();
+ });
+
+ it('generates correct return data', async () => {
+ expect(
+ await getCOINiDFromUrl(COINiDUrls.pubP2SHP2WPKH).coinid.getReturnData(mnemonic),
+ ).toMatchSnapshot();
+ expect(
+ await getCOINiDFromUrl(COINiDUrls.pubP2PKH).coinid.getReturnData(mnemonic),
+ ).toMatchSnapshot();
+ expect(
+ await getCOINiDFromUrl(COINiDUrls.pubP2WPKH).coinid.getReturnData(mnemonic),
+ ).toMatchSnapshot();
+ });
+ });
+
+ describe('COINiDPrivate VAL', () => {
+ const { coinid } = getCOINiDFromUrl(COINiDUrls.val);
+
+ it('parses info correct', () => {
+ expect(coinid.getInfo()).toMatchSnapshot();
+ });
+
+ it('generates correct return data', async () => {
+ const returnData = await coinid.getReturnData(mnemonic);
+ expect(returnData).toMatchSnapshot();
+ });
+ });
+
+ describe('COINiDPrivate TX', () => {
+ const { coinid, variant, returnScheme } = getCOINiDFromUrl(COINiDUrls.tx);
+
+ it('parses info correct', () => {
+ expect(coinid.getInfo()).toMatchSnapshot();
+ });
+
+ it('parses transaction info correct', () => {
+ expect(coinid.getTxInfo()).toMatchSnapshot();
+ });
+
+ it('generates correct return data', async () => {
+ const returnData = await coinid.getReturnData(mnemonic);
+ expect(returnData).toMatchSnapshot();
+
+ const returnUrl = coinid.buildReturnUrl({
+ data: returnData,
+ variant,
+ returnScheme,
+ });
+ expect(returnUrl).toMatchSnapshot();
+ });
+ });
+
+ describe('COINiDPrivate SWPTX', () => {
+ const { coinid, variant, returnScheme } = getCOINiDFromUrl(COINiDUrls.swptx);
+
+ it('parses info correct', () => {
+ expect(coinid.getInfo()).toMatchSnapshot();
+ });
+
+ it('parses transaction info correct', () => {
+ expect(coinid.getSwpTxInfo()).toMatchSnapshot();
+ });
+
+ it('generates correct return data', async () => {
+ const returnData = await coinid.getReturnData(mnemonic, { wif: sweepedWIF });
+ expect(returnData).toMatchSnapshot();
+
+ const returnUrl = coinid.buildReturnUrl({
+ data: returnData,
+ variant,
+ returnScheme,
+ });
+ expect(returnUrl).toMatchSnapshot();
+ });
+ });
+
+ describe('COINiDPrivate SAH', () => {
+ const { coinid, variant, returnScheme } = getCOINiDFromUrl(COINiDUrls.sah);
+
+ it('parses info correct', () => {
+ expect(coinid.getInfo()).toMatchSnapshot();
+ });
+
+ it('generates correct return data', async () => {
+ const returnData = await coinid.getReturnData(mnemonic);
+ expect(returnData).toMatchSnapshot();
+
+ const returnUrl = coinid.buildReturnUrl({
+ data: returnData,
+ variant,
+ returnScheme,
+ });
+ expect(returnUrl).toMatchSnapshot();
+ });
+ });
+
+ describe('COINiDPrivate SWP', () => {
+ const { coinid, variant, returnScheme } = getCOINiDFromUrl(COINiDUrls.swp);
+
+ it('parses info correct', () => {
+ expect(coinid.getInfo()).toMatchSnapshot();
+ });
+
+ it('parses sweep data correct', async () => {
+ const sweepData = await coinid.parseSweepData(sweepedWIF);
+ expect(sweepData).toMatchSnapshot();
+ });
+
+ it('generates correct return data', async () => {
+ const sweepData = await coinid.parseSweepData(sweepedWIF);
+ const returnData = coinid.getSweepReturnData(sweepData);
+ expect(returnData).toMatchSnapshot();
+
+ const returnUrl = coinid.buildReturnUrl({
+ data: returnData,
+ variant,
+ returnScheme,
+ });
+ expect(returnUrl).toMatchSnapshot();
+ });
+ });
+ });
+});
diff --git a/__tests__/data/bitcoin.json b/__tests__/data/bitcoin.json
new file mode 100644
index 0000000..3751ad3
--- /dev/null
+++ b/__tests__/data/bitcoin.json
@@ -0,0 +1,13 @@
+{
+ "sweepedWIF": "KzqJS7fj8LQuvuydtpxUD4BTKwb3BnzQUWtM1vk4pKfJVGogq2b3",
+ "COINiDUrls": {
+ "pubP2SHP2WPKH": "coinid://coinid-btc/PUB/BTC::49-*0-*0-",
+ "pubP2PKH": "coinid://coinid-btc/PUB/BTC::44-*0-*0-",
+ "pubP2WPKH": "coinid://coinid-btc/PUB/BTC::84-*0-*0-",
+ "val": "coinid://coinid-btc/VAL/BTC:49-*0-*0-*0*5+3GO7JP:49-*0-*0-*0*2",
+ "swp": "coinid://coinid-btc/SWP/BTC:49-*0-*0-*0*5+3GO7JP:49-*0-*0-*0*2",
+ "tx": "coinid://coinid-btc/TX/BTC:49-*0-*0-*0*5+3GO7JP:49-*0-*0-*0*5+49-*0-*0-*1*2:0100000002A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C020000000000000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C01000000000000000005400D03000000000017A914A89F3493631D141E847A15CB3BA68234CC6ACC2E87B08F0600000000001976A9147E6257D509CCDD623F4AB33416F17A44A0A5F7BC88AC10270000000000001600147E6257D509CCDD623F4AB33416F17A44A0A5F7BC307500000000000017A91461F05801F6931D95CD0180917B6CACF84C767E818738FA01000000000017A914CD05CE4F0D4B88D2E00A9FE7CF3AA8FEEAF773628700000000:4:369796+430000",
+ "swptx": "coinid://coinid-btc/SWPTX/BTC:49-*0-*0-*0*5+3GO7JP:3Go7JpcBu7XdYa93EUfvTD4hFbECWRr1Ew+49-*0-*0-*0*5+999864:P2SH-P2WPKH*2N14MWFaFKfFcsMgTXKZeRhPZunNUWFzWGy*ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556*1*1000000",
+ "sah": "coinid://coinid-btc/SAH/BTC:49-*0-*0-*0*5+3GO7JP:49-*0-*0-*1*1:unlock%20wallet%2005ic9gZoNv2xCc6BbmzvWw%3D%3D"
+ }
+}
diff --git a/__tests__/data/groestlcoin-testnet.json b/__tests__/data/groestlcoin-testnet.json
new file mode 100644
index 0000000..5577e7e
--- /dev/null
+++ b/__tests__/data/groestlcoin-testnet.json
@@ -0,0 +1,13 @@
+{
+ "sweepedWIF": "92y1U1qogasK3EqvPndXy3nCG3tFbvgsT9QyF7PVW1JbCjVeyQH",
+ "COINiDUrls": {
+ "pubP2SHP2WPKH": "coinid://coinid-tgrs/PUB/TGRS::49-*1-*0-",
+ "pubP2PKH": "coinid://coinid-tgrs/PUB/TGRS::44-*1-*0-",
+ "pubP2WPKH": "coinid://coinid-tgrs/PUB/TGRS::84-*1-*0-",
+ "val": "coinid://coinid-tgrs/VAL/TGRS:49-*1-*0-*0*2+2NA5BU:49-*1-*0-*0*2",
+ "swp": "coinid://coinid-tgrs/SWP/TGRS:49-*1-*0-*0*2+2NA5BU:49-*1-*0-*0*2",
+ "tx": "coinid://coinid-tgrs/TX/TGRS:49-*1-*0-*0*2+2NA5BU:49-*1-*0-*0*2+49-*1-*0-*1*1:0100000002A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C020000000000000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C01000000000000000005400D03000000000017A914D7EF101DAA78E7656CA3C49B30B854E8C4D7A2BF87B08F0600000000001976A9147E8EB917EAB0DA74EE21769044B8E36562BF5D3288AC10270000000000001600147E8EB917EAB0DA74EE21769044B8E36562BF5D32307500000000000017A914E1BCEA2765A83B1D688CF113A93F78E2D119EA2A8738FA01000000000017A9142E95CFDD61B2F735E6BEDF5291B6F0873E4F1D008700000000:4:369796+430000",
+ "swptx": "coinid://coinid-tgrs/SWPTX/TGRS:49-*1-*0-*0*2+2NA5BU:2NA5bUXmS96csYzmVJJs828MJehYm2zgQBr+49-*1-*0-*0*2+999864:P2PKH*mnrYq7qJsD2hXgpbPLAmYAQebzyi68wqZ8*ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556*1*1000000",
+ "sah": "coinid://coinid-tgrs/SAH/TGRS:49-*1-*0-*0*2+2NA5BU:49-*1-*0-*1*1:unlock%20wallet%2005ic9gZoNv2xCc6BbmzvWw%3D%3D"
+ }
+}
diff --git a/__tests__/data/groestlcoin.json b/__tests__/data/groestlcoin.json
new file mode 100644
index 0000000..fd360b3
--- /dev/null
+++ b/__tests__/data/groestlcoin.json
@@ -0,0 +1,13 @@
+{
+ "sweepedWIF": "5KehPPuBBYK4kLSxpjVbL7N1VrDTshVn4iezXkwdnoBRQHtbfaw",
+ "COINiDUrls": {
+ "pubP2SHP2WPKH": "coinid://coinid-grs/PUB/GRS::49-*17-*0-",
+ "pubP2PKH": "coinid://coinid-grs/PUB/GRS::44-*17-*0-",
+ "pubP2WPKH": "coinid://coinid-grs/PUB/GRS::84-*17-*0-",
+ "val": "coinid://coinid-grs/VAL/GRS:49-*17-*0-*0*3+3HMJUS:49-*17-*0-*0*2",
+ "swp": "coinid://coinid-grs/SWP/GRS:49-*17-*0-*0*3+3HMJUS:49-*17-*0-*0*2",
+ "tx": "coinid://coinid-grs/TX/GRS:49-*17-*0-*0*3+3HMJUS:49-*17-*0-*0*3+49-*17-*0-*1*1:0100000002A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C020000000000000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C01000000000000000005400D03000000000017A914C50D589AE0965FBB3484D51AF1271A6BC2851E8987B08F0600000000001976A914EF20271534095EA2A69064620164F248997D64CB88AC1027000000000000160014EF20271534095EA2A69064620164F248997D64CB307500000000000017A914609796DC6E5DFFB0948A3D268ACE1FCFE2B4A96B8738FA01000000000017A914263482828E92FF4510191F10A3FA2CDBC1D047118700000000:4:369796+430000",
+ "swptx": "coinid://coinid-grs/SWPTX/GRS:49-*17-*0-*0*3+3HMJUS:3HmjusqAu6EtPPSpKW88w5tsjf2tx6236S+49-*17-*0-*0*3+999864:P2PKH*FtS9MQRCk4XXJMXUX9C8nN4UScLcNAk22v*ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556*1*1000000",
+ "sah": "coinid://coinid-grs/SAH/GRS:49-*17-*0-*0*3+3HMJUS:49-*17-*0-*1*1:unlock%20wallet%2005ic9gZoNv2xCc6BbmzvWw%3D%3D"
+ }
+}
diff --git a/__tests__/data/myriad.json b/__tests__/data/myriad.json
new file mode 100644
index 0000000..d109700
--- /dev/null
+++ b/__tests__/data/myriad.json
@@ -0,0 +1,13 @@
+{
+ "sweepedWIF": "6zMgHHh5aXYZwEFvAxeHYDzwK2ZA2ibLecsfeK6GBYGdiL1tVa2",
+ "COINiDUrls": {
+ "pubP2SHP2WPKH": "coinid://coinid-xmy/PUB/XMY::49-*90-*0-",
+ "pubP2PKH": "coinid://coinid-xmy/PUB/XMY::44-*90-*0-",
+ "pubP2WPKH": "coinid://coinid-xmy/PUB/XMY::84-*90-*0-",
+ "val": "coinid://coinid-xmy/VAL/XMY:49-*90-*0-*0*2+4FY57D:49-*90-*0-*0*2",
+ "swp": "coinid://coinid-xmy/SWP/XMY:49-*90-*0-*0*2+4FY57D:49-*90-*0-*0*2",
+ "tx": "coinid://coinid-xmy/TX/XMY:49-*90-*0-*0*2+4FY57D:49-*90-*0-*0*2:01000000010D4E4F1E87B9F1D14727A9472640F74F4A18BA448CB063ED3574D21FCF74673800000000000000000004400D0300000000001976A9149E9DCD04CF375691FDFA2D19A52AE404B9EF03DE88ACB08F06000000000017A914594F6D51146D61F84C7027A466069E47DE69712C871027000000000000160014293DBC2B6B7CED3D7F363496A4E00B332F209B94E9645E2C0100000017A914556AA879860E42C377B13639C27350469972A71B8700000000:3:5039991221",
+ "swptx": "coinid://coinid-xmy/SWPTX/XMY:49-*90-*0-*0*2+4FY57D:4fy57d6G6L16DDJgUXPLEy2GBJ3DwmFpTT+49-*90-*0-*0*2+999864:P2PKH*MV7AERJ7BA8nDuftiPoCNsYvGrB1V3koew*ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556*1*1000000",
+ "sah": "coinid://coinid-xmy/SAH/XMY:49-*90-*0-*0*2+4FY57D:49-*90-*0-*1*1:unlock%20wallet%2005ic9gZoNv2xCc6BbmzvWw%3D%3D"
+ }
+}
diff --git a/__tests__/data/testnet.json b/__tests__/data/testnet.json
new file mode 100644
index 0000000..1d6ed98
--- /dev/null
+++ b/__tests__/data/testnet.json
@@ -0,0 +1,13 @@
+{
+ "sweepedWIF": "cS3muNLM1GJye3x3Xa7J8zn8eqyQYg542UDHwHJNFnodJvu1pas4",
+ "COINiDUrls": {
+ "pubP2SHP2WPKH": "coinid://coinid-tbtc/PUB/tBTC::49-*1-*0-",
+ "pubP2PKH": "coinid://coinid-tbtc/PUB/tBTC::44-*1-*0-",
+ "pubP2WPKH": "coinid://coinid-tbtc/PUB/tBTC::84-*1-*0-",
+ "val": "coinid://coinid-tbtc/VAL/tBTC:49-*1-*0-*1*0+2MTRGW:49-*1-*0-*0*2",
+ "swp": "coinid://coinid-tbtc/SWP/tBTC:49-*1-*0-*1*0+2MTRGW:49-*1-*0-*0*2",
+ "tx": "coinid://coinid-tbtc/TX/TBTC:49-*1-*0-*1*0+2MTRGW:49-*1-*0-*1*0+49-*1-*0-*0*5:0100000002A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C020000000000000000A06364D80225EA2181D41AD469B2D5560E594F2C783BBB41CAAA652B493A104C01000000000000000005400D03000000000017A91466A8A442F12B2B8A9C45D3D4CB1CCBDCA952D9A387B08F06000000000017A914D170EE37EA45FBB9DC81598C8445237EC47E8A678710270000000000001976A914F12F2C6E408B3CDFF1991B8783D1EB428F57814B88AC307500000000000016001408C3E3704FC510BEE9F2F05686CBF2A9F541E23F38FA01000000000017A9142E95CFDD61B2F735E6BEDF5291B6F0873E4F1D008700000000:4:369796+430000",
+ "swptx": "coinid://coinid-tbtc/SWPTX/tBTC:49-*1-*0-*0*0+2NF5JN:2NF5JNAnFEjW5XagJoEsND8kcNoSJyEdRj6+49-*1-*0-*0*0+999864:P2SH-P2WPKH*2N14MWFaFKfFcsMgTXKZeRhPZunNUWFzWGy*ad84a0e7453ad2be696a9398eeceac30b1e8fe542937008e03ae0e99e54a0556*1*1000000",
+ "sah": "coinid://coinid-tbtc/SAH/tBTC:49-*1-*0-*1*0+2MTRGW:49-*1-*0-*1*1:unlock%20wallet%2005ic9gZoNv2xCc6BbmzvWw%3D%3D"
+ }
+}
diff --git a/android/app/build.gradle b/android/app/build.gradle
index eb871fe..76f9f6e 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -127,8 +127,8 @@ android {
applicationId "org.coinid.vault"
minSdkVersion 16
targetSdkVersion 27
- versionCode 44
- versionName "1.2"
+ versionCode 60
+ versionName "1.4"
ndk {
abiFilters "armeabi-v7a", "x86"
}
@@ -172,6 +172,7 @@ android {
}
dependencies {
+ compile project(':react-native-keep-awake')
compile project(':react-native-camera')
compile project(':react-native-splash-screen')
compile project(':react-native-touch-id')
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 5993aec..a1d2d30 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -9,6 +9,8 @@
+
+
-
\ No newline at end of file
+
diff --git a/android/app/src/main/java/org/coinid/vault/MainApplication.java b/android/app/src/main/java/org/coinid/vault/MainApplication.java
index f908e19..f2de9c7 100644
--- a/android/app/src/main/java/org/coinid/vault/MainApplication.java
+++ b/android/app/src/main/java/org/coinid/vault/MainApplication.java
@@ -3,6 +3,7 @@
import android.app.Application;
import com.facebook.react.ReactApplication;
+import com.corbt.keepawake.KCKeepAwakePackage;
import org.reactnative.camera.RNCameraPackage;
import org.devio.rn.splashscreen.SplashScreenReactPackage;
import com.rnfingerprint.FingerprintAuthPackage;
@@ -33,6 +34,7 @@ public boolean getUseDeveloperSupport() {
protected List getPackages() {
return Arrays.asList(
new MainReactPackage(),
+ new KCKeepAwakePackage(),
new RNCameraPackage(),
new SplashScreenReactPackage(),
new FingerprintAuthPackage(),
diff --git a/android/fastlane/Fastfile b/android/fastlane/Fastfile
index 4a96894..4c15f88 100644
--- a/android/fastlane/Fastfile
+++ b/android/fastlane/Fastfile
@@ -22,20 +22,30 @@ platform :android do
FileUtils.mv("#{shRootDir}/android/app/build/outputs/apk/release/app-release.apk", "#{shRootDir}/#{buildDir}/latest/latest-coinid-vault.apk")
FileUtils.cp("#{shRootDir}/#{buildDir}/latest/latest-coinid-vault.apk", "#{shRootDir}/#{buildDir}/#{options[:time]}/#{options[:time]}-coinid-vault.apk")
- #upload_to_play_store(
- # apk: "#{rootDir}/#{buildDir}/latest/latest-coinid-vault.apk"
- #)
-#
- #slack(
- # message: "Ny Vault på väg till Google Play!",
- # default_payloads: [],
- # slack_url: 'https://hooks.slack.com/services/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'
- #)
+ upload_to_play_store(
+ package_name: (options[:package_name]).to_s,
+ apk: "#{rootDir}/#{buildDir}/latest/latest-coinid-vault.apk",
+ skip_upload_metadata: true,
+ skip_upload_images: true,
+ skip_upload_screenshots: true,
+ track: "beta",
+ )
+
+ message_slack(options)
+ end
+
+
+ lane :message_slack do |options|
+ slack(
+ message: "New #{options[:coin]} Vault coming to Play Store!",
+ default_payloads: [],
+ slack_url: ENV['SLACK_URL']
+ )
end
lane :bump_version_code do
path = '../app/build.gradle'
- re = /versionCode\s+(\d+)/
+ re = /versionCode\s+(\d+)/
s = File.read(path)
versionCode = s[re, 1].to_i
diff --git a/android/fastlane/README.md b/android/fastlane/README.md
index 171dcb4..aa026b4 100644
--- a/android/fastlane/README.md
+++ b/android/fastlane/README.md
@@ -21,6 +21,11 @@ or alternatively using `brew cask install fastlane`
fastlane android beta
```
+### android message_slack
+```
+fastlane android message_slack
+```
+
### android bump_version_code
```
fastlane android bump_version_code
diff --git a/android/settings.gradle b/android/settings.gradle
index ac88657..3335f62 100644
--- a/android/settings.gradle
+++ b/android/settings.gradle
@@ -1,4 +1,6 @@
rootProject.name = 'COINiD'
+include ':react-native-keep-awake'
+project(':react-native-keep-awake').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-keep-awake/android')
include ':react-native-camera'
project(':react-native-camera').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-camera/android')
include ':react-native-splash-screen'
diff --git a/bin/betaBuild b/bin/betaBuild
index 8574208..bedbfc5 100755
--- a/bin/betaBuild
+++ b/bin/betaBuild
@@ -4,34 +4,58 @@ const { execSync } = require('child_process');
const rootDir = `${__dirname}/..`;
const prefix = process.argv[2];
-let time = new Date().toISOString().replace(/\D/g, '').substr(0, 12);
+let time = new Date()
+ .toISOString()
+ .replace(/\D/g, '')
+ .substr(0, 12);
if (prefix !== undefined) {
time = prefix + time;
}
-const doBuilds = (platform) => {
- execSync(`cd ${rootDir}/${platform}; fastlane beta time:${time}`, { stdio: 'inherit' });
+const runTests = () => {
+ try {
+ execSync(`cd ${rootDir}; yarn test`, { stdio: 'inherit' });
+ } catch (err) {
+ return false;
+ }
+ return true;
};
-const createSHA256SUMS = (dir) => {
- execSync(`
+const doBuilds = platform => {
+ execSync(`cd ${rootDir}/${platform}; fastlane beta time:${time} package_name:org.coinid.vault`, {
+ stdio: 'inherit',
+ });
+};
+
+const createSHA256SUMS = dir => {
+ execSync(
+ `
cd ${rootDir}/builds/vault/${dir};
shasum -a256 *.apk > SHA256SUMS;
gpg --yes --digest-algo sha256 --clearsign SHA256SUMS;
rm SHA256SUMS;
- `, { stdio: 'inherit' });
+ `,
+ { stdio: 'inherit' },
+ );
};
-const pause = (text) => {
- execSync(`
+const pause = text => {
+ execSync(
+ `
read -p "${text}" nothing;
- `, { stdio: 'inherit' });
+ `,
+ { stdio: 'inherit' },
+ );
};
-doBuilds('ios');
-doBuilds('android');
+if (runTests()) {
+ doBuilds('ios');
+ doBuilds('android');
-pause('Prepare to sign builds... Press enter to continue.');
+ pause('Prepare to sign builds... Press enter to continue.');
-createSHA256SUMS(time);
-createSHA256SUMS('latest');
+ createSHA256SUMS(time);
+ createSHA256SUMS('latest');
+} else {
+ console.log('Tests failed!');
+}
diff --git a/ios/COINiD.xcodeproj/project.pbxproj b/ios/COINiD.xcodeproj/project.pbxproj
index ddff279..eb29427 100644
--- a/ios/COINiD.xcodeproj/project.pbxproj
+++ b/ios/COINiD.xcodeproj/project.pbxproj
@@ -45,6 +45,7 @@
9CA44808205EF2D500C4741E /* Lottie.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9CA447FB205EF1C400C4741E /* Lottie.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
9CA44826205F02B200C4741E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9CA44825205F02B200C4741E /* LaunchScreen.storyboard */; };
ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };
+ B8FE0C20C6B04A209E502316 /* libKCKeepAwake.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 46735EBDC76B4D6DA1F3EF16 /* libKCKeepAwake.a */; };
C0C6FCD521CE462B82229DE0 /* libSplashScreen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F632531344FE4D639EB1A524 /* libSplashScreen.a */; };
C4BDADCC11914D73811A361A /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 03E8C0B4AB5541CABFB5219E /* Zocial.ttf */; };
C7FF056BB1CB4BCBBCDD7DC4 /* libRCTP2PTransferBLEPeripheralModule.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 12973CE62D8B45D3BC6BD752 /* libRCTP2PTransferBLEPeripheralModule.a */; };
@@ -333,6 +334,13 @@
remoteGlobalIDString = 9936F32F1F5F2E5B0010BF04;
remoteInfo = "privatedata-tvOS";
};
+ 7CFF6058221465E60009A73C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 26E60091AB434DECA2DC819F /* KCKeepAwake.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 134814201AA4EA6300B7C361;
+ remoteInfo = KCKeepAwake;
+ };
822F2BC1218476AB00B42230 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BC70634EA66C48D29680A6A1 /* RNCamera.xcodeproj */;
@@ -485,6 +493,7 @@
177653E38CD6499B83A06585 /* Inter-UI-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-UI-Bold.ttf"; path = "../src/assets/fonts/Inter-UI-Bold.ttf"; sourceTree = ""; };
1D463F62CC8948E3BFDDA85A /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; };
23EE73D483F146A18D6E3AC3 /* Inter-UI-Black.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-UI-Black.ttf"; path = "../src/assets/fonts/Inter-UI-Black.ttf"; sourceTree = ""; };
+ 26E60091AB434DECA2DC819F /* KCKeepAwake.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = KCKeepAwake.xcodeproj; path = "../node_modules/react-native-keep-awake/ios/KCKeepAwake.xcodeproj"; sourceTree = ""; };
271AC47D7A784BC5AFDFBFFE /* libRNRandomBytes.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNRandomBytes.a; sourceTree = ""; };
2772C169CBC64B4ABD751211 /* RNOS.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNOS.xcodeproj; path = "../node_modules/react-native-os/ios/RNOS.xcodeproj"; sourceTree = ""; };
3B219A8DFFBF435EAE814C9C /* libRNKeychain.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNKeychain.a; sourceTree = ""; };
@@ -493,6 +502,7 @@
41BA3E3ED6114B8DA75020F1 /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; };
427A67BD366B4BA8A136BF1F /* Inter-UI-BoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-UI-BoldItalic.ttf"; path = "../src/assets/fonts/Inter-UI-BoldItalic.ttf"; sourceTree = ""; };
46277B877DC04916972C7056 /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = SimpleLineIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"; sourceTree = ""; };
+ 46735EBDC76B4D6DA1F3EF16 /* libKCKeepAwake.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libKCKeepAwake.a; sourceTree = ""; };
4737BDA3E7534F80B2581E99 /* MaterialIcons-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "MaterialIcons-Regular.ttf"; path = "../src/assets/fonts/MaterialIcons-Regular.ttf"; sourceTree = ""; };
484686093C104249BEB4E123 /* Feather.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Feather.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Feather.ttf"; sourceTree = ""; };
48DE90E92E7C4E29B1CE6612 /* libRNSVG.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSVG.a; sourceTree = ""; };
@@ -560,6 +570,7 @@
C0C6FCD521CE462B82229DE0 /* libSplashScreen.a in Frameworks */,
65DB3714B5ED4A5CA57DE6B9 /* libRNCamera.a in Frameworks */,
D07C9803550D4EE595C663F9 /* libReactNativePermissions.a in Frameworks */,
+ B8FE0C20C6B04A209E502316 /* libKCKeepAwake.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -741,10 +752,19 @@
F632531344FE4D639EB1A524 /* libSplashScreen.a */,
953EC86396A2492694C0CE69 /* libRNCamera.a */,
D3415062E4C44F40A2FF4A18 /* libReactNativePermissions.a */,
+ 46735EBDC76B4D6DA1F3EF16 /* libKCKeepAwake.a */,
);
name = "Recovered References";
sourceTree = "";
};
+ 7CFF6055221465E60009A73C /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 7CFF6059221465E60009A73C /* libKCKeepAwake.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
822F2BBE218476AB00B42230 /* Products */ = {
isa = PBXGroup;
children = (
@@ -812,6 +832,7 @@
539A511C43B741F8B0C76A83 /* SplashScreen.xcodeproj */,
BC70634EA66C48D29680A6A1 /* RNCamera.xcodeproj */,
F54961DE741F42FEBC471488 /* ReactNativePermissions.xcodeproj */,
+ 26E60091AB434DECA2DC819F /* KCKeepAwake.xcodeproj */,
);
name = Libraries;
sourceTree = "";
@@ -935,8 +956,9 @@
ORGANIZATIONNAME = Facebook;
TargetAttributes = {
13B07F861A680F5B00A75B9A = {
- DevelopmentTeam = RTXAQQG73Y;
+ DevelopmentTeam = GC88SQF2BV;
LastSwiftMigration = 920;
+ ProvisioningStyle = Automatic;
SystemCapabilities = {
com.apple.DataProtection = {
enabled = 1;
@@ -960,6 +982,10 @@
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
projectDirPath = "";
projectReferences = (
+ {
+ ProductGroup = 7CFF6055221465E60009A73C /* Products */;
+ ProjectRef = 26E60091AB434DECA2DC819F /* KCKeepAwake.xcodeproj */;
+ },
{
ProductGroup = 9CA447F4205EF1C400C4741E /* Products */;
ProjectRef = 7F77DC592B574B4C9EDADCF8 /* Lottie.xcodeproj */;
@@ -1338,6 +1364,13 @@
remoteRef = 7CB2E4661FDC74BE00BB17E3 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
+ 7CFF6059221465E60009A73C /* libKCKeepAwake.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libKCKeepAwake.a;
+ remoteRef = 7CFF6058221465E60009A73C /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
822F2BC2218476AB00B42230 /* libRNCamera.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@@ -1521,9 +1554,11 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = COINiD/COINiD.entitlements;
- CURRENT_PROJECT_VERSION = 105;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 130;
DEAD_CODE_STRIPPING = NO;
- DEVELOPMENT_TEAM = RTXAQQG73Y;
+ DEVELOPMENT_TEAM = GC88SQF2BV;
FRAMEWORK_SEARCH_PATHS = "";
HEADER_SEARCH_PATHS = (
"$(inherited)",
@@ -1545,6 +1580,7 @@
"$(SRCROOT)/../node_modules/react-native-splash-screen/ios",
"$(SRCROOT)/../node_modules/react-native-camera/ios/**",
"$(SRCROOT)/../node_modules/react-native-permissions/ios/**",
+ "$(SRCROOT)/../node_modules/react-native-keep-awake/ios",
);
INFOPLIST_FILE = COINiD/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
@@ -1552,6 +1588,7 @@
"$(inherited)",
"\"$(SRCROOT)/COINiD\"",
"\"$(SRCROOT)/COINiD\"",
+ "\"$(SRCROOT)/COINiD\"",
);
OTHER_LDFLAGS = (
"$(inherited)",
@@ -1560,6 +1597,7 @@
);
PRODUCT_BUNDLE_IDENTIFIER = org.coinid;
PRODUCT_NAME = COINiD;
+ PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "COINiD-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0;
@@ -1574,8 +1612,10 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = COINiD/COINiD.entitlements;
- CURRENT_PROJECT_VERSION = 105;
- DEVELOPMENT_TEAM = RTXAQQG73Y;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 130;
+ DEVELOPMENT_TEAM = GC88SQF2BV;
FRAMEWORK_SEARCH_PATHS = "";
HEADER_SEARCH_PATHS = (
"$(inherited)",
@@ -1597,6 +1637,7 @@
"$(SRCROOT)/../node_modules/react-native-splash-screen/ios",
"$(SRCROOT)/../node_modules/react-native-camera/ios/**",
"$(SRCROOT)/../node_modules/react-native-permissions/ios/**",
+ "$(SRCROOT)/../node_modules/react-native-keep-awake/ios",
);
INFOPLIST_FILE = COINiD/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
@@ -1604,6 +1645,7 @@
"$(inherited)",
"\"$(SRCROOT)/COINiD\"",
"\"$(SRCROOT)/COINiD\"",
+ "\"$(SRCROOT)/COINiD\"",
);
OTHER_LDFLAGS = (
"$(inherited)",
@@ -1612,6 +1654,7 @@
);
PRODUCT_BUNDLE_IDENTIFIER = org.coinid;
PRODUCT_NAME = COINiD;
+ PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "COINiD-Bridging-Header.h";
SWIFT_VERSION = 3.0;
TARGETED_DEVICE_FAMILY = "1,2";
diff --git a/ios/COINiD/Info.plist b/ios/COINiD/Info.plist
index f810fed..b5179bf 100644
--- a/ios/COINiD/Info.plist
+++ b/ios/COINiD/Info.plist
@@ -17,7 +17,7 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 1.2
+ 1.4
CFBundleSignature
????
CFBundleURLTypes
@@ -32,7 +32,7 @@
CFBundleVersion
- 105
+ 130
ITSAppUsesNonExemptEncryption
LSApplicationQueriesSchemes
diff --git a/ios/fastlane/Appfile b/ios/fastlane/Appfile
index e53de56..88c1903 100644
--- a/ios/fastlane/Appfile
+++ b/ios/fastlane/Appfile
@@ -1,7 +1,7 @@
app_identifier("org.coinid") # The bundle identifier of your app
-itc_team_id("119026247") # iTunes Connect Team ID
-team_id("RTXAQQG73Y") # Developer Portal Team ID
+itc_team_id("119545920") # iTunes Connect Team ID
+team_id("GC88SQF2BV") # Developer Portal Team ID
# For more information about the Appfile, see:
# https://docs.fastlane.tools/advanced/#appfile
diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile
index 720a794..1780278 100644
--- a/ios/fastlane/Fastfile
+++ b/ios/fastlane/Fastfile
@@ -17,10 +17,11 @@ platform :ios do
increment_build_number(xcodeproj: "COINiD.xcodeproj")
build_app(scheme: "COINiD")
upload_to_testflight(skip_waiting_for_build_processing: true)
+
slack(
- message: "Ny Vault på väg till TestFlight!",
- default_payloads: [],
- slack_url: 'https://hooks.slack.com/services/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'
+ message: "New Vault coming to Testflight!",
+ default_payloads: [],
+ slack_url: ENV['SLACK_URL']
)
end
end
diff --git a/package.json b/package.json
index ca6addf..29aa65a 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,8 @@
"assert": "^1.4.1",
"babel-core": "^6.26.0",
"buffer": "^4.9.1",
- "coinid-private": "https://github.com/wlc-/coinid-private.git",
+ "buffer-reverse": "^1.0.1",
+ "coinid-private": "https://github.com/wlc-/coinid-private",
"events": "^1.1.1",
"lottie-react-native": "^2.5.6",
"moment": "^2.22.2",
@@ -29,11 +30,13 @@
"react-native-crypto": "^2.1.1",
"react-native-elements": "^0.18.5",
"react-native-iphone-x-helper": "^1.2.0",
+ "react-native-keep-awake": "3",
"react-native-keychain": "^3.0.0",
"react-native-os": "^1.1.0",
"react-native-p2p-transfer-ble-peripheral": "https://github.com/COINiD/react-native-p2p-transfer-ble-peripheral.git",
"react-native-qr-data-transfer-receiver": "https://github.com/COINiD/react-native-qr-data-transfer-receiver",
"react-native-qr-data-transfer-sender": "https://github.com/COINiD/react-native-qr-data-transfer-sender",
+ "react-native-qrcode-scanner": "^1.1.2",
"react-native-randombytes": "3.0.0",
"react-native-splash-screen": "^3.1.1",
"react-native-svg": "^5.4.1",
@@ -52,12 +55,15 @@
"eslint-plugin-import": "^2.11.0",
"eslint-plugin-jsx-a11y": "^6.0.3",
"eslint-plugin-react": "^7.7.0",
- "jest": "21.2.1",
+ "jest": "^23.6.0",
"react-native-version": "^2.4.1",
- "react-test-renderer": "16.0.0"
+ "react-test-renderer": "16.3.1"
},
"jest": {
- "preset": "react-native"
+ "preset": "react-native",
+ "transformIgnorePatterns": [
+ "node_modules/(?!(react-native|react-navigation|coinid-private|coinid-address-functions|coinid-address-types))"
+ ]
},
"react-native": {
"_stream_transform": "readable-stream/transform",
diff --git a/shim.js b/shim.js
index 65d986e..f5d8663 100644
--- a/shim.js
+++ b/shim.js
@@ -12,7 +12,15 @@ if (typeof process === 'undefined') {
}
process.browser = false
-if (typeof Buffer === 'undefined') global.Buffer = require('buffer').Buffer
+if (typeof Buffer === 'undefined') global.Buffer = require('safe-buffer').Buffer
+
+if (typeof Buffer.prototype.reverse === 'undefined') {
+ var bufferReverse = require('buffer-reverse');
+
+ Buffer.prototype.reverse = function () {
+ return bufferReverse(this);
+ };
+}
// global.location = global.location || { port: 80 }
const isDev = typeof __DEV__ === 'boolean' && __DEV__
@@ -20,3 +28,7 @@ process.env['NODE_ENV'] = isDev ? 'development' : 'production'
if (typeof localStorage !== 'undefined') {
localStorage.debug = isDev ? '*' : ''
}
+
+// If using the crypto shim, uncomment the following line to ensure
+// crypto is loaded first, so it can populate global.crypto
+require('crypto')
diff --git a/src/components/DetailsModal/DetailsModal.js b/src/components/DetailsModal/DetailsModal.js
index e07fd90..131ec8f 100644
--- a/src/components/DetailsModal/DetailsModal.js
+++ b/src/components/DetailsModal/DetailsModal.js
@@ -1,5 +1,3 @@
-
-
import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
import {
@@ -9,42 +7,49 @@ import { DialogTitle, Modal } from '..';
import styles from './styles';
export default class DetailsModal extends PureComponent {
- constructor(props) {
- super(props);
- }
-
_open = () => {
this.elModal._open();
- }
+ };
_close = () => {
this.elModal._close();
- }
+ };
_setKeyboardOffset = (offset) => {
this.elModal._setKeyboardOffset(offset);
- }
+ };
render() {
- const { showMoreOptions, onMoreOptions, title, children } = this.props;
+ const {
+ showMoreOptions,
+ onMoreOptions,
+ hideCloseIcon,
+ title,
+ children,
+ dialogStyle,
+ } = this.props;
return (
this.elModal = c}
+ ref={(c) => {
+ this.elModal = c;
+ }}
>
-
+
-
{children}
diff --git a/src/components/DialogTitle/DialogTitle.js b/src/components/DialogTitle/DialogTitle.js
index 29a491c..6210448 100644
--- a/src/components/DialogTitle/DialogTitle.js
+++ b/src/components/DialogTitle/DialogTitle.js
@@ -1,5 +1,3 @@
-
-
import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { View } from 'react-native';
@@ -14,7 +12,7 @@ export default class DialogTitle extends PureComponent {
render() {
const {
- title, closeFunc, showMoreOptions, onMoreOptions,
+ title, closeFunc, showMoreOptions, hideCloseIcon, onMoreOptions,
} = this.props;
const renderMoreOptions = () => {
@@ -29,24 +27,41 @@ export default class DialogTitle extends PureComponent {
onPress={onMoreOptions}
name="more-vert"
hitSlop={{
- top: 20, left: 20, right: 20, bottom: 20,
+ top: 20,
+ left: 20,
+ right: 20,
+ bottom: 20,
}}
/>
);
};
- return (
-
- { renderMoreOptions() }
+ const renderCloseIcon = () => {
+ if (hideCloseIcon) {
+ return null;
+ }
+
+ return (
+ );
+ };
+
+ return (
+
+ {renderMoreOptions()}
+ {renderCloseIcon()}
+
{title}
);
diff --git a/src/components/Modal/Modal.js b/src/components/Modal/Modal.js
index 4bd6875..9f24dfe 100644
--- a/src/components/Modal/Modal.js
+++ b/src/components/Modal/Modal.js
@@ -12,8 +12,8 @@ import {
Platform,
Keyboard,
} from 'react-native';
-import styles from './styles';
import { getBottomSpace, getStatusBarHeight } from 'react-native-iphone-x-helper';
+import styles from './styles';
const BackButton = BackHandler || BackAndroid;
@@ -32,7 +32,9 @@ export default class Modal extends PureComponent {
this.subscriptions = [];
if (Platform.OS === 'ios') {
- this.subscriptions.push(Keyboard.addListener('keyboardWillChangeFrame', this._onKeyboardChange));
+ this.subscriptions.push(
+ Keyboard.addListener('keyboardWillChangeFrame', this._onKeyboardChange),
+ );
}
}
@@ -63,7 +65,7 @@ export default class Modal extends PureComponent {
]).start(() => {
this.props.onOpened();
});
- }
+ };
_close = () => {
if (Platform.OS === 'android') {
@@ -87,16 +89,31 @@ export default class Modal extends PureComponent {
this.setState({ isOpen: false });
this.props.onClosed();
});
- }
+ };
_onBackPress = () => {
+ const { preventClosing } = this.props;
+ if (preventClosing) {
+ return false;
+ }
+
this._close();
return true;
- }
+ };
+
+ _onTouchOutside = () => {
+ const { preventClosing } = this.props;
+ if (preventClosing) {
+ return false;
+ }
+
+ this._close();
+ return true;
+ };
_onKeyboardChange = (e) => {
this.keyBoardEvent = e;
- }
+ };
_setKeyboardOffset = (offset) => {
if (Platform.OS === 'ios') {
@@ -104,11 +121,11 @@ export default class Modal extends PureComponent {
this.keyboardAvoid._onKeyboardChange(this.keyBoardEvent);
});
}
- }
+ };
render() {
const {
- verticalPosition, children, avoidKeyboard, avoidKeyboardOffset, onLayout
+ verticalPosition, children, avoidKeyboard, avoidKeyboardOffset, onLayout,
} = this.props;
const {
isOpen, overlayOpacity, scale, top, keyboardOffset,
@@ -119,17 +136,19 @@ export default class Modal extends PureComponent {
}
const renderView = () => {
- if( Platform.OS === 'ios' ) {
+ if (Platform.OS === 'ios') {
return (
{ this.keyboardAvoid = c; }}
+ ref={(c) => {
+ this.keyboardAvoid = c;
+ }}
behavior="position"
enabled={avoidKeyboard}
keyboardVerticalOffset={avoidKeyboardOffset + keyboardOffset + getStatusBarHeight(true)}
style={{ width: '100%' }}
>
- { children}
+ {children}
);
@@ -137,7 +156,7 @@ export default class Modal extends PureComponent {
return (
- { children}
+ {children}
);
};
@@ -147,14 +166,15 @@ export default class Modal extends PureComponent {
style={[
styles.container,
isOpen ? styles.visible : styles.hidden,
- { justifyContent: verticalPosition }]}
+ { justifyContent: verticalPosition },
+ ]}
onLayout={onLayout}
>
-
+
- { renderView() }
+ {renderView()}
);
}
diff --git a/src/components/PinInput/PinInput.js b/src/components/PinInput/PinInput.js
index a821d8d..1c56f84 100644
--- a/src/components/PinInput/PinInput.js
+++ b/src/components/PinInput/PinInput.js
@@ -1,46 +1,38 @@
-import React, {PureComponent} from 'react';
+import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
-import { View, TextInput, TouchableWithoutFeedback } from 'react-native';
-import { Button, Text } from '../../components';
-
-import styles from './styles';
+import { View, TouchableWithoutFeedback } from 'react-native';
import * as Animatable from 'react-native-animatable';
+import styles from './styles';
class PinInput extends PureComponent {
- constructor(props): void {
- super(props);
- }
-
render() {
- let {props, context} = this;
- let themeStyle = styles(context.theme ||Â '');
+ const { props, context } = this;
+ const themeStyle = styles(context.theme || '');
const getPins = (numPins) => {
- var pinArr = [];
+ const pinArr = [];
- for (var i = 0; i < numPins; i++) {
- var pinStyle = [themeStyle.pin];
+ for (let i = 0; i < numPins; i += 1) {
+ const pinStyle = [themeStyle.pin];
- if(props.value.length > i) {
+ if (props.value.length > i) {
pinStyle.push(themeStyle.filled);
pinStyle.push(props.filledStyle);
}
pinStyle.push(props.pinStyle);
- pinArr.push()
+ pinArr.push();
}
return pinArr;
- }
+ };
return (
-
- {getPins(props.numPins)}
-
+ {getPins(props.numPins)}
);
}
@@ -52,8 +44,6 @@ PinInput.defaultProps = {
onPress: () => {},
};
+const AnimatablePinInput = Animatable.createAnimatableComponent(PinInput);
-PinInput = Animatable.createAnimatableComponent(PinInput);
-
-
-export default PinInput;
\ No newline at end of file
+export default AnimatablePinInput;
diff --git a/src/components/PinKeyboard/PinKeyboard.js b/src/components/PinKeyboard/PinKeyboard.js
index 206d856..aefa52f 100644
--- a/src/components/PinKeyboard/PinKeyboard.js
+++ b/src/components/PinKeyboard/PinKeyboard.js
@@ -1,24 +1,17 @@
import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
-import {
- Animated,
- View,
- TextInput,
- TouchableOpacity,
- TouchableWithoutFeedback,
-} from 'react-native';
+import { View, TouchableOpacity, TouchableWithoutFeedback } from 'react-native';
import { Icon } from 'react-native-elements';
import { ifIphoneX } from 'react-native-iphone-x-helper';
import LottieView from 'lottie-react-native';
import moment from 'moment';
import TouchID from 'react-native-touch-id';
-import { Button, Text } from '..';
+import { Text } from '..';
import styles from './styles';
-
const lottieFiles = {
faceid: require('../../animations/faceid.json'),
pinlock: require('../../animations/pinlock.json'),
@@ -43,11 +36,7 @@ class PinKeyboard extends PureComponent {
integratedInput = () => {
if (this.props.children) {
- return (
-
- {this.props.children}
-
- );
+ return {this.props.children};
}
return null;
};
@@ -242,8 +231,10 @@ class PinKeyboard extends PureComponent {
marginBottom: 16,
}}
/>
- PIN input has been disabled
- {`try again ${moment.duration(pinLockoutTime).humanize(true)}`}
+ PIN input has been disabled
+
+ {`try again ${moment.duration(pinLockoutTime).humanize(true)}`}
+
);
}
@@ -253,12 +244,7 @@ class PinKeyboard extends PureComponent {
return (
-
+
{this.integratedInput()}
{renderKeyboardArea()}
diff --git a/src/components/ProgressBar.js b/src/components/ProgressBar.js
new file mode 100644
index 0000000..36db995
--- /dev/null
+++ b/src/components/ProgressBar.js
@@ -0,0 +1,123 @@
+import React, { PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { View, StyleSheet } from 'react-native';
+import * as Animatable from 'react-native-animatable';
+
+import { fontSize, fontWeight, colors } from '../config/styling';
+import { Text } from '.';
+
+const customShake = {
+ 0: {
+ transform: [{ translateX: 0 }],
+ },
+ 0.2: {
+ transform: [{ translateX: -10 }],
+ },
+ 0.4: {
+ transform: [{ translateX: 10 }],
+ },
+ 0.6: {
+ transform: [{ translateX: -10 }],
+ },
+ 0.8: {
+ transform: [{ translateX: 10 }],
+ },
+ 1: {
+ transform: [{ translateX: 0 }],
+ },
+};
+
+Animatable.initializeRegistryWithDefinitions({ customShake });
+
+const styles = StyleSheet.create({
+ containerBase: {
+ height: 48,
+ borderRadius: 8,
+ overflow: 'hidden',
+ },
+ container: {
+ backgroundColor: colors.anotherGray,
+ },
+ filledContainer: {
+ position: 'absolute',
+ left: 0,
+ width: 0,
+ backgroundColor: colors.green,
+ },
+ percentText: {
+ fontSize: fontSize.base,
+ fontWeight: fontWeight.medium,
+ color: colors.black,
+ },
+ centerInnards: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ filledPercentText: {
+ color: colors.white,
+ },
+ errorFill: {
+ backgroundColor: colors.orange,
+ },
+});
+
+export default class ProgressBar extends PureComponent {
+ static propTypes = {
+ percent: PropTypes.number.isRequired,
+ customStatus: PropTypes.string,
+ };
+
+ static defaultProps = {
+ customStatus: '',
+ };
+
+ state = {
+ containerWidth: 0,
+ error: false,
+ };
+
+ _onLayout = ({ nativeEvent: { layout } }) => {
+ const { width } = layout;
+ this.setState({ containerWidth: width });
+ };
+
+ _wrongPassword = () => {
+ this.setState({ error: true });
+ this.errorText.customShake(600);
+ };
+
+ render() {
+ const { percent, customStatus } = this.props;
+ const { containerWidth, error } = this.state;
+
+ const displayPercent = percent.toFixed(0);
+ const displayedText = customStatus !== '' ? customStatus : `${displayPercent}%`;
+
+ return (
+ {
+ this.errorText = c;
+ }}
+ useNativeDriver
+ >
+ {displayedText}
+
+
+
+ {displayedText}
+
+
+
+ );
+ }
+}
diff --git a/src/components/SetPin/SetPin.js b/src/components/SetPin/SetPin.js
index bfcae3f..86731c8 100644
--- a/src/components/SetPin/SetPin.js
+++ b/src/components/SetPin/SetPin.js
@@ -1,22 +1,14 @@
import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
-import {
- View,
-} from 'react-native';
+import { View } from 'react-native';
import * as Animatable from 'react-native-animatable';
import {
- Button,
- Text,
- PinInput,
- KeyboardWrapper,
+ Button, Text, PinInput, KeyboardWrapper,
} from '..';
-import { colors } from '../../config/styling';
-import styles from './styles';
-
const customShake = {
0: {
transform: [{ translateX: 0 }],
@@ -84,7 +76,7 @@ class SetPin extends PureComponent {
setTimeout(() => {
try {
this.errorText.fadeOut(800);
- } catch (err) { }
+ } catch (err) {}
}, 2000);
});
@@ -105,9 +97,7 @@ class SetPin extends PureComponent {
render() {
const themeStyle = this.themeStyle;
- const returnFunc = this.state.confirmPIN
- ? this._submitConfirmPin
- : this._submitSetPin;
+ const returnFunc = this.state.confirmPIN ? this._submitConfirmPin : this._submitSetPin;
const pinChange = (pin) => {
pin = pin.replace(/\D/g, ''); // remove all non numeric
@@ -116,7 +106,7 @@ class SetPin extends PureComponent {
if (pin.length === 6) {
this.timer = setTimeout(() => {
returnFunc(pin);
- }, 200);
+ }, 100);
} else {
this.setState({ pinDiffers: false });
}
@@ -133,9 +123,7 @@ class SetPin extends PureComponent {
Cancel
{this.props.title}
-
- {this.state.confirmPIN ? 'Confirm new PIN' : 'Enter a new PIN'}
-
+ {this.state.confirmPIN ? 'Confirm new PIN' : 'Enter a new PIN'}
{this.state.pinDiffers ? (
this.errorText = c}
+ ref={c => (this.errorText = c)}
useNativeDriver
style={{ fontSize: 16, marginTop: 6 }}
>
@@ -156,7 +144,9 @@ class SetPin extends PureComponent {
{ this._p2pKeyboard = c; }}
+ ref={(c) => {
+ this._p2pKeyboard = c;
+ }}
onValueChange={pinChange}
isLocked
/>,
diff --git a/src/components/TxInfoRow/TxInfoRow.js b/src/components/TxInfoRow/TxInfoRow.js
index 3e644c0..300c015 100644
--- a/src/components/TxInfoRow/TxInfoRow.js
+++ b/src/components/TxInfoRow/TxInfoRow.js
@@ -1,39 +1,38 @@
-'use strict';
-
import React, { Component } from 'react';
import PropTypes from 'prop-types';
-import { Text } from '../';
+import { View } from 'react-native';
+import { Text } from '..';
import styles from './styles';
import createStyleArr from '../../utils/createStyleArr';
-import { View } from 'react-native';
class TxInfoRow extends Component {
- constructor(props) {
- super(props);
- }
-
render() {
- let { props, context } = this;
- let themeStyle = styles(context.theme || '');
- let styleArr = createStyleArr(themeStyle.row, props.style);
- let labelStyleArr = createStyleArr(themeStyle.text);
+ const { props, context } = this;
+ const themeStyle = styles(context.theme || '');
+ const styleArr = createStyleArr(themeStyle.row, props.style);
+ const labelStyleArr = createStyleArr(themeStyle.text);
if (!this.props.dark) {
labelStyleArr.push(themeStyle.label);
}
- const trimStrLength = str => {
+ const trimStrLength = (str) => {
if (str.length > 26) {
- return str.substr(0, 10) + '...' + str.substr(-13);
+ return `${str.substr(0, 10)}...${str.substr(-13)}`;
}
return str;
};
return (
- {props.label}
-
- {trimStrLength(props.children)}
+ {props.label}
+
+ {props.children}
);
diff --git a/src/components/TxInfoRow/styles.js b/src/components/TxInfoRow/styles.js
index 6868fb7..9b3e779 100644
--- a/src/components/TxInfoRow/styles.js
+++ b/src/components/TxInfoRow/styles.js
@@ -1,17 +1,22 @@
import { StyleSheet } from 'react-native';
-import { colors, fontSize, fontStack } from '../../config/styling';
+import { colors, fontSize } from '../../config/styling';
-export default theme =>
- StyleSheet.create({
- row: {
- justifyContent: 'space-between',
- flexDirection: 'row',
- marginTop: 16,
- },
- label: {
- color: colors.getTheme(theme).label,
- },
- text: {
- fontSize: fontSize.smallest,
- },
- });
+export default theme => StyleSheet.create({
+ row: {
+ justifyContent: 'space-between',
+ flexDirection: 'row',
+ marginTop: 16,
+ },
+ label: {
+ color: colors.getTheme(theme).label,
+ flexShrink: 1,
+ },
+ text: {
+ fontSize: fontSize.smallest,
+ },
+ value: {
+ textAlign: 'right',
+ flex: 1,
+ },
+ valueContainer: {},
+});
diff --git a/src/components/index.js b/src/components/index.js
index 1dbea4e..5dc00a8 100644
--- a/src/components/index.js
+++ b/src/components/index.js
@@ -1,14 +1,15 @@
-export {default as Text} from './Text';
-export {default as Loading} from './Loading';
-export {default as Button} from './Button';
-export {default as SetPin} from './SetPin';
-export {default as TxInfoRow} from './TxInfoRow';
-export {default as PinKeyboard} from './PinKeyboard';
-export {default as PinInput} from './PinInput';
-export {default as AuthKeyboard} from './AuthKeyboard';
-export {default as KeyboardWrapper} from './KeyboardWrapper';
-export {default as P2PKeyboard} from './P2PKeyboard';
-export {default as Modal} from './Modal';
-export {default as DetailsModal} from './DetailsModal';
-export {default as DialogTitle} from './DialogTitle';
-export {default as CheckBoxSelect} from './CheckBoxSelect';
\ No newline at end of file
+export { default as Text } from './Text';
+export { default as Loading } from './Loading';
+export { default as Button } from './Button';
+export { default as SetPin } from './SetPin';
+export { default as TxInfoRow } from './TxInfoRow';
+export { default as PinKeyboard } from './PinKeyboard';
+export { default as PinInput } from './PinInput';
+export { default as AuthKeyboard } from './AuthKeyboard';
+export { default as KeyboardWrapper } from './KeyboardWrapper';
+export { default as P2PKeyboard } from './P2PKeyboard';
+export { default as Modal } from './Modal';
+export { default as DetailsModal } from './DetailsModal';
+export { default as DialogTitle } from './DialogTitle';
+export { default as CheckBoxSelect } from './CheckBoxSelect';
+export { default as ProgressBar } from './ProgressBar';
diff --git a/src/config/routes.js b/src/config/routes.js
index 08598cc..361e5f7 100644
--- a/src/config/routes.js
+++ b/src/config/routes.js
@@ -12,6 +12,7 @@ import {
UpdatePIN,
QRDataReceiver,
QRDataSender,
+ QRSweeper,
} from '../screens';
export const HomeStack = createStackNavigator(
@@ -22,9 +23,18 @@ export const HomeStack = createStackNavigator(
Settings: { screen: Settings },
Backup: { screen: Backup },
Sign: { screen: Sign },
+ QRSweeper: { screen: QRSweeper },
UpdatePIN: { screen: UpdatePIN },
QRDataReceiver: { screen: QRDataReceiver },
QRDataSender: { screen: QRDataSender },
+ COINiDtx: { screen: Sign },
+ COINiDpub: { screen: Sign },
+ COINiDval: { screen: Sign },
+ COINiDmsg: { screen: Sign },
+ COINiD2fa: { screen: Sign },
+ COINiDsah: { screen: Sign },
+ COINiDswp: { screen: QRSweeper },
+ COINiDswptx: { screen: Sign },
},
{
headerMode: 'none',
diff --git a/src/config/styling.js b/src/config/styling.js
index 5ae679a..c310b94 100644
--- a/src/config/styling.js
+++ b/src/config/styling.js
@@ -10,12 +10,13 @@ export const colors = {
green: '#00D6B0',
lightGray: '#D8D8D8',
mediumGray: '#8A8A8F',
+ anotherGray: '#F5F5F5',
orange: '#FA503C',
pink: '#EC4E74',
purple: '#617AF7',
white: '#FFFFFF',
- getTheme: theme => {
+ getTheme: (theme) => {
if (theme === 'dark') {
return {
background: colors.purple,
@@ -104,9 +105,6 @@ export const layout = {
paddingHorizontal: 24,
...ifSmallDevice(
{ paddingTop: 38, paddingBottom: 16 },
- ifIphoneX(
- { paddingTop: 100, paddingBottom: 58 },
- { paddingTop: 80, paddingBottom: 24 },
- ),
+ ifIphoneX({ paddingTop: 100, paddingBottom: 58 }, { paddingTop: 80, paddingBottom: 24 }),
),
};
diff --git a/src/dialogs/PrivateKeyPassword.js b/src/dialogs/PrivateKeyPassword.js
new file mode 100644
index 0000000..8d23bac
--- /dev/null
+++ b/src/dialogs/PrivateKeyPassword.js
@@ -0,0 +1,347 @@
+import React, { PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import {
+ TouchableOpacity, View, StyleSheet, TextInput,
+} from 'react-native';
+import KeepAwake from 'react-native-keep-awake';
+
+import { fontSize, fontWeight, colors } from '../config/styling';
+import {
+ DetailsModal, Text, Button, ProgressBar,
+} from '../components';
+
+import { findSweepedKeyInStore } from '../utils/sweepkey';
+
+const styles = StyleSheet.create({
+ modalContent: {
+ padding: 16,
+ maxHeight: 400,
+ },
+ passwordLabel: {
+ fontSize: fontSize.smallest,
+ color: colors.mediumGray,
+ fontWeight: fontWeight.medium,
+ },
+ passwordInputWrapper: {
+ borderBottomWidth: 1,
+ borderColor: colors.mediumGray,
+ marginBottom: 16,
+ },
+ passwordInput: {
+ fontSize: fontSize.smallest,
+ color: colors.black,
+ paddingTop: 4,
+ paddingBottom: 4,
+ },
+ passwordHintWrapper: {
+ marginBottom: 16,
+ },
+ passwordHintLink: {
+ color: colors.purple,
+ fontSize: fontSize.smallest,
+ fontWeight: fontWeight.medium,
+ },
+ passwordHint: {
+ fontSize: fontSize.smallest,
+ fontWeight: fontWeight.normal,
+ },
+ passwordHintHeader: {
+ fontSize: fontSize.smallest,
+ fontWeight: fontWeight.normal,
+ },
+ error: {
+ color: colors.orange,
+ fontSize: fontSize.smallest,
+ fontWeight: fontWeight.book,
+ marginBottom: 16,
+ },
+ button: {
+ marginTop: 8,
+ height: 48,
+ },
+ decryptingContent: {
+ paddingHorizontal: 16,
+ paddingTop: 8,
+ paddingBottom: 24,
+ },
+ decryptingDialog: {},
+});
+
+export default class PrivateKeyPassword extends PureComponent {
+ static propTypes = {};
+
+ static defaultProps = {};
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ inputPassword: '',
+ hint: '',
+ error: '',
+ decryptPercent: 0,
+ showPasswordHint: false,
+ foundKeyInStore: false,
+ };
+ }
+
+ _open = ({
+ sweepData, hint, parseSweepData, onParsedCb, ticker,
+ }) => {
+ this.setState({
+ hint,
+ inputPassword: '',
+ error: '',
+ showPasswordHint: false,
+ foundKeyInStore: false,
+ });
+
+ this.sweepData = sweepData;
+ this.ticker = ticker;
+
+ this.parseSweepData = parseSweepData;
+ this.onParsedCb = onParsedCb;
+
+ this.notReturning = false;
+ this.refModal._open();
+ };
+
+ _close = () => {
+ this.refModal._close();
+ };
+
+ _onClosed = () => {
+ if (!this.notReturning) {
+ this._onReturn();
+ }
+ };
+
+ _onReturn = () => {
+ const { onClosed } = this.props;
+ onClosed();
+ };
+
+ _statusCb = ({ percent }) => new Promise((resolve) => {
+ const decryptPercent = Number(percent);
+ this.setState({ decryptPercent }, () => setTimeout(resolve, 0));
+ });
+
+ _getFromStore = async (sweepData, password, ticker) => {
+ const { encryptedWif } = await this.parseSweepData(sweepData);
+
+ if (encryptedWif) {
+ const foundKey = await findSweepedKeyInStore({
+ encryptedWif,
+ password,
+ ticker: ticker.toLowerCase(),
+ });
+
+ if (foundKey) {
+ return foundKey;
+ }
+ }
+
+ return false;
+ };
+
+ _decryptOrFetch = async (sweepData, password, ticker) => {
+ const {
+ addresses, encryptedWif, decryptedWif, compressed,
+ } = await this._getFromStore(
+ sweepData,
+ password,
+ ticker,
+ );
+
+ if (decryptedWif && addresses.length) {
+ this.setState({
+ foundKeyInStore: true,
+ });
+
+ setTimeout(
+ () => this.onParsedCb({
+ addresses,
+ encryptedWif,
+ decryptedWif,
+ compressed,
+ password,
+ }),
+ 500,
+ );
+ } else {
+ this._decryptData(sweepData, password);
+ }
+ };
+
+ _decryptData = async (sweepData, password) => {
+ const {
+ addresses, encryptedWif, decryptedWif, compressed,
+ } = await this.parseSweepData(
+ sweepData,
+ password,
+ this._statusCb,
+ );
+
+ if (decryptedWif && addresses.length) {
+ this.onParsedCb({
+ addresses,
+ encryptedWif,
+ decryptedWif,
+ compressed,
+ password,
+ });
+ } else {
+ this.progressBar._wrongPassword();
+
+ setTimeout(() => {
+ this.setState({
+ error: 'Entered password was not correct',
+ inputPassword: '',
+ decryptPercent: 0,
+ });
+
+ this.refDecrypting._close();
+ this.refModal._open();
+ this.notReturning = false;
+ }, 1000);
+ }
+ };
+
+ _continue = () => {
+ const { inputPassword } = this.state;
+
+ if (inputPassword && this.sweepData) {
+ this.notReturning = true;
+ this.refModal._close();
+ this.refDecrypting._open();
+ setTimeout(() => this._decryptOrFetch(this.sweepData, inputPassword, this.ticker), 500);
+ } else {
+ if (!inputPassword) {
+ this.setState({ error: 'Password cannot be empty' });
+ }
+ if (!this.sweepData) {
+ this.setState({ error: 'Data seems weird' });
+ }
+ }
+ };
+
+ _onChangeText = (inputPassword) => {
+ this.setState({ inputPassword, error: '' });
+ };
+
+ _onSubmitEditing = () => {
+ this._continue();
+ };
+
+ _showPasswordHint = () => {
+ this.setState({
+ showPasswordHint: true,
+ });
+ };
+
+ _renderHint = () => {
+ const { hint, showPasswordHint } = this.state;
+
+ if (!hint) {
+ return null;
+ }
+
+ if (showPasswordHint) {
+ return (
+
+ Password hint:
+ {hint}
+
+ );
+ }
+
+ return (
+
+ Show password hint
+
+ );
+ };
+
+ _renderError = () => {
+ const { error } = this.state;
+
+ if (!error) {
+ return null;
+ }
+
+ return {error};
+ };
+
+ render() {
+ const { inputPassword, decryptPercent, foundKeyInStore } = this.state;
+
+ return (
+
+ {
+ this.refModal = c;
+ }}
+ title="Enter Private Key Password"
+ onClosed={this._onClosed}
+ avoidKeyboard
+ avoidKeyboardOffset={16}
+ >
+ {
+ this.refContHeight = e.nativeEvent.layout.height;
+ }}
+ >
+ Password
+
+ {
+ this.refModal._setKeyboardOffset(this.refToBottom - this.refContHeight);
+ }}
+ onLayout={(e) => {
+ this.refToBottom = e.nativeEvent.layout.y + e.nativeEvent.layout.height;
+ }}
+ value={inputPassword}
+ />
+
+
+ {this._renderError()}
+
+ {this._renderHint()}
+
+
+
+
+ {
+ this.refDecrypting = c;
+ }}
+ title="Decrypting Private Key"
+ dialogStyle={styles.decryptingDialog}
+ hideCloseIcon
+ preventClosing
+ >
+
+
+ {
+ this.progressBar = ref;
+ }}
+ percent={foundKeyInStore ? 100 : decryptPercent}
+ customStatus={foundKeyInStore ? 'Previously decrypted key' : ''}
+ />
+
+
+
+ );
+ }
+}
diff --git a/src/dialogs/index.js b/src/dialogs/index.js
index 908af7b..8b29c02 100644
--- a/src/dialogs/index.js
+++ b/src/dialogs/index.js
@@ -1 +1,2 @@
export { default as SelectColdTransportType } from './SelectColdTransportType';
+export { default as PrivateKeyPassword } from './PrivateKeyPassword';
diff --git a/src/screens/Create/Create.js b/src/screens/Create/Create.js
index 656b55d..adb23cf 100644
--- a/src/screens/Create/Create.js
+++ b/src/screens/Create/Create.js
@@ -1,9 +1,9 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
-import { View, TextInput } from 'react-native';
+import { View } from 'react-native';
import { Icon } from 'react-native-elements';
-import { Button, Loading, Text, SetPin } from '../../components';
+import { Button, Text, SetPin } from '../../components';
import styles from './styles';
import { colors } from '../../config/styling';
@@ -12,10 +12,12 @@ import { generateMnemonic, saveMnemonic } from '../../utils/mnemonic';
class Screen extends Component {
themeStyle = '';
+
theme = '';
+
mnemonicArr = [];
- constructor(props): void {
+ constructor(props) {
super(props);
const { theme } = this.props.navigation.state.params || {};
@@ -29,11 +31,11 @@ class Screen extends Component {
setPin: false,
};
- generateMnemonic().then(mnemonic => {
+ generateMnemonic().then((mnemonic) => {
this.mnemonicArr = mnemonic.split(' ');
this.setState({
- mnemonic: mnemonic,
+ mnemonic,
mnemonicCount: 0,
mnemonicWord: this.mnemonicArr[0],
setPin: false,
@@ -44,7 +46,7 @@ class Screen extends Component {
getChildContext = () => ({ theme: this.theme });
prevWord = () => {
- var i = this.state.mnemonicCount - 1;
+ const i = this.state.mnemonicCount - 1;
if (i >= 0) {
this.setState({
@@ -55,7 +57,7 @@ class Screen extends Component {
};
nextWord = () => {
- var i = this.state.mnemonicCount + 1;
+ const i = this.state.mnemonicCount + 1;
if (i < this.mnemonicArr.length) {
this.setState({
@@ -70,8 +72,8 @@ class Screen extends Component {
}
};
- saveMnemonic = pin => {
- var mnemonic = this.mnemonicArr
+ saveMnemonic = (pin) => {
+ const mnemonic = this.mnemonicArr
.join(' ')
.trim()
.toLowerCase();
@@ -81,7 +83,7 @@ class Screen extends Component {
});
};
- pinSuccess = pin => {
+ pinSuccess = (pin) => {
this.saveMnemonic(pin);
};
@@ -91,18 +93,18 @@ class Screen extends Component {
});
};
- _return() {
+ _return = () => {
this.props.navigation.state.params.onReady();
this.props.navigation.goBack();
- }
+ };
- render = function() {
+ render() {
const themeStyle = this.themeStyle;
if (this.state.setPin) {
return (
Create COINiD Vault
- Write down the following 12 word recovery phrase exactly as they
- appear and in this order.
+ Write down the following 12 word recovery phrase exactly as they appear and in this
+ order.
- {this.state.mnemonicCount + 1} of {this.mnemonicArr.length}
+ {this.state.mnemonicCount + 1}
+ {' '}
+of
+ {this.mnemonicArr.length}
{this.state.mnemonicWord}
@@ -145,21 +155,19 @@ class Screen extends Component {
]}
>
);
- };
+ }
}
Screen.childContextTypes = {
diff --git a/src/screens/Main/Main.js b/src/screens/Main/Main.js
index cc3877d..3bfe8d9 100644
--- a/src/screens/Main/Main.js
+++ b/src/screens/Main/Main.js
@@ -7,22 +7,20 @@ import {
import { Icon } from 'react-native-elements';
import LottieView from 'lottie-react-native';
import SplashScreen from 'react-native-splash-screen';
-import blePeripheral from 'react-native-p2p-transfer-ble-peripheral';
import styles from './styles';
import {
Button, Loading, Text, KeyboardWrapper,
} from '../../components';
-import {
- SelectColdTransportType,
-} from '../../dialogs';
+import { SelectColdTransportType } from '../../dialogs';
import { colors } from '../../config/styling';
import { hasMnemonic } from '../../utils/mnemonic';
-import { validateCoinIdDataFromUrl } from '../../utils/coinid';
+import { validateCoinIdDataFromUrl, getInfoFromCoinIdUrl } from '../../utils/coinid';
import { p2pClient } from '../../utils/p2p-ble-peripheral';
+import { getSweepedKeysFromStore } from '../../utils/sweepkey';
const lottieFiles = {
logo: require('../../animations/logo.json'),
@@ -51,6 +49,10 @@ class Screen extends Component {
AppState.addEventListener('change', this._handleAppStateChange);
+ getSweepedKeysFromStore().then((storedKeys) => {
+ console.log({ storedKeys });
+ });
+
/*
blePeripheral.isSupported().then((isBLESupported) => {
this.setState({isBLESupported});
@@ -74,9 +76,12 @@ class Screen extends Component {
};
_handleOpenURL = (url) => {
+ console.log({ url });
+
if (url) {
this._handleOpenURLPromise(url)
.then((returnUrl) => {
+ console.log({ returnUrl });
if (returnUrl !== null) {
Linking.openURL(returnUrl);
}
@@ -93,22 +98,25 @@ class Screen extends Component {
.then(() => {
this.queuedUrl = '';
- const signingDone = ({ variant, returnUrl }) => resolve(returnUrl);
+ const signingDone = ({ returnUrl }) => resolve(returnUrl);
const signingError = error => reject(error);
try {
if (validateCoinIdDataFromUrl(url)) {
- const { navigation: { navigate, goBack } } = this.props;
+ const { type } = getInfoFromCoinIdUrl(url);
+ const {
+ navigation: { navigate, goBack },
+ } = this.props;
goBack('sign-123'); // remove old sign modal if active..
navigate({
- routeName: 'Sign',
+ routeName: `COINiD${type}`,
params: {
theme: 'white',
url,
- onSigned: signingDone,
+ onDone: signingDone,
onError: signingError,
},
key: 'sign-123',
@@ -231,24 +239,25 @@ class Screen extends Component {
}
if (transportType === 'qr') {
- const { navigation: { navigate } } = this.props;
+ const {
+ navigation: { navigate },
+ } = this.props;
navigate('QRDataReceiver', {
onComplete: (data) => {
- this._handleOpenURLPromise(data)
- .then((signedData) => {
- if (signedData) {
- navigate('QRDataSender', {
- data: signedData,
- theme: 'darkblue',
- });
- }
- });
+ this._handleOpenURLPromise(data).then((signedData) => {
+ if (signedData) {
+ navigate('QRDataSender', {
+ data: signedData,
+ theme: 'darkblue',
+ });
+ }
+ });
},
});
}
});
- }
+ };
_showP2PKeyboard = () => {
this._p2pKeyboard._showKeyboard();
@@ -288,7 +297,9 @@ class Screen extends Component {
const renderExternalButton = () => {
if (!isBLESupported) {
return (
- This device only supports hot wallet signing
+
+ This device only supports hot wallet signing
+
);
}
@@ -315,21 +326,25 @@ class Screen extends Component {
name="settings"
color={colors.getTheme().highlight}
iconStyle={{
- padding: 0, margin: 0, height: 24, width: 24,
+ padding: 0,
+ margin: 0,
+ height: 24,
+ width: 24,
}}
containerStyle={themeStyle.topIcon}
onPress={() => navigate('Settings', { onReady, theme: 'light' })}
hitSlop={{
- top: 20, bottom: 20, left: 20, right: 20,
+ top: 20,
+ bottom: 20,
+ left: 20,
+ right: 20,
}}
/>
-
- COINiD Vault is all set
-
+ COINiD Vault is all set
Ready to sign COINiD requests
- { renderExternalButton() }
+ {renderExternalButton()}
,
{ this.coldTransportModal = c; }}
+ ref={(c) => {
+ this.coldTransportModal = c;
+ }}
/>,
];
}
diff --git a/src/screens/QRDataReceiver/QRDataReceiver.js b/src/screens/QRDataReceiver/QRDataReceiver.js
index aa96d18..7860411 100644
--- a/src/screens/QRDataReceiver/QRDataReceiver.js
+++ b/src/screens/QRDataReceiver/QRDataReceiver.js
@@ -96,6 +96,7 @@ class QRDataReceiver extends PureComponent {
return (
{
+ const {
+ navigation: {
+ goBack,
+ state: {
+ params: { onDone, onError, url },
+ },
+ },
+ } = this.props;
+
+ const { coinIdData, variant, returnScheme } = getCoinIdDataFromUrl(url);
+ const coinId = require('coinid-private')(coinIdData);
+ const { ticker } = coinId.getInfo();
+
+ const returnUrl = coinId.buildReturnUrl({
+ data: coinId.getSweepReturnData({ addresses, compressed }),
+ returnScheme,
+ variant,
+ });
+
+ addSweepedKeyToStore({
+ encryptedWif,
+ decryptedWif,
+ addresses,
+ compressed,
+ password,
+ ticker: ticker.toLowerCase(),
+ });
+
+ goBack();
+ setTimeout(() => onDone({ variant, returnUrl }), 400);
+ };
+
+ _passwordModalClosed = () => {
+ this.setState({
+ deactivateCamera: false,
+ });
+ };
+
+ _reactivateScanner = () => {
+ setTimeout(() => {
+ if (this.scanner) {
+ this.scanner.reactivate();
+ }
+ }, 1000);
+ };
+
+ _parseData = (sweepData) => {
+ const {
+ navigation: {
+ state: {
+ params: { url },
+ },
+ },
+ } = this.props;
+ const { coinIdData } = getCoinIdDataFromUrl(url);
+ const coinId = require('coinid-private')(coinIdData);
+ const { ticker } = coinId.getInfo();
+
+ coinId
+ .parseSweepData(sweepData)
+ .then(({
+ addresses, encryptedWif, decryptedWif, compressed, password, params: { hint },
+ }) => {
+ this.setState({
+ deactivateCamera: true,
+ });
+
+ if (!decryptedWif && encryptedWif) {
+ // Open input password dialog with encryptedWif as input.
+ this.refPasswordModal._open({
+ sweepData,
+ hint,
+ parseSweepData: coinId.parseSweepData,
+ onParsedCb: this._onParsed,
+ ticker,
+ });
+ }
+
+ if (decryptedWif && addresses.length) {
+ this._onParsed({
+ addresses,
+ encryptedWif,
+ decryptedWif,
+ compressed,
+ password,
+ });
+ }
+ })
+ .catch((err) => {
+ // show warning but continue scanning reactivate.
+ Alert.alert('Not valid Private Key', `${err}`);
+ this._reactivateScanner();
+ });
+ };
+
+ _onRead = ({ data }) => {
+ const [cleanData] = data.match(/\S{1,}/) || [];
+ const [, encrypted] = cleanData.match(/COINIDSWP:\/\/(.{1,})/i) || [];
+
+ if (encrypted) {
+ const decrypted = decrypt(encrypted.toLowerCase(), sweepEncryptSecret, 'hex');
+ this._parseData(decrypted);
+ } else {
+ this._parseData(cleanData);
+ }
+ };
+
+ _goBack = () => {
+ const {
+ navigation: { goBack },
+ } = this.props;
+ goBack();
+ };
+
+ _flipCamera = () => {
+ const { cameraType } = this.state;
+ this.setState({
+ cameraType: cameraType === 'back' ? 'front' : 'back',
+ });
+ };
+
+ _renderCustomMarker = () => (
+
+
+
+
+
+
+ );
+
+ render() {
+ const { cameraType, deactivateCamera } = this.state;
+
+ const renderCamera = () => {
+ if (deactivateCamera) {
+ return ;
+ }
+
+ return (
+ {
+ this.scanner = node;
+ }}
+ cameraType={cameraType}
+ onRead={this._onRead}
+ containerStyle={styles.containerWrapper}
+ cameraStyle={styles.container}
+ topViewStyle={styles.topView}
+ bottomViewStyle={styles.bottomView}
+ customMarker={this._renderCustomMarker()}
+ reactivate={false}
+ showMarker
+ fadeIn
+ topContent={(
+
+
+ Scan QR Code of Private Key
+
+)}
+ bottomContent={(
+
+)}
+ />
+ );
+ };
+
+ return (
+
+ {renderCamera()}
+ {
+ this.refPasswordModal = e;
+ }}
+ onClosed={this._passwordModalClosed}
+ />
+
+ );
+ }
+}
+
+QRSweeper.propTypes = {};
+
+export default QRSweeper;
diff --git a/src/screens/QRSweeper/index.js b/src/screens/QRSweeper/index.js
new file mode 100644
index 0000000..3c8d35b
--- /dev/null
+++ b/src/screens/QRSweeper/index.js
@@ -0,0 +1,3 @@
+import QRSweeper from './QRSweeper';
+
+export default QRSweeper;
diff --git a/src/screens/QRSweeper/styles.js b/src/screens/QRSweeper/styles.js
new file mode 100644
index 0000000..2b068ec
--- /dev/null
+++ b/src/screens/QRSweeper/styles.js
@@ -0,0 +1,178 @@
+import { StyleSheet } from 'react-native';
+import { colors, fontWeight, fontSize } from '../../config/styling';
+import { ifSmallDevice } from '../../utils/device';
+
+export default StyleSheet.create({
+ container: {
+ justifyContent: 'center',
+ alignItems: 'center',
+ backgroundColor: colors.black,
+ position: 'relative',
+ height: '100%',
+ },
+ containerWrapper: {
+ flex: 1,
+ backgroundColor: colors.black,
+ },
+ firstBlock: {
+ marginLeft: 0,
+ },
+ block: {
+ backgroundColor: '#DADADA',
+ height: 6,
+ flex: 1,
+ marginLeft: 3,
+ },
+ activeBlock: {
+ backgroundColor: '#617AF7',
+ },
+ activeCameraBlock: {
+ backgroundColor: '#00D6B0',
+ },
+ blockContainer: {
+ marginLeft: -3,
+ flexDirection: 'row',
+ },
+ noBlockMargin: {
+ marginLeft: 0,
+ },
+ completedItemsWrapper: {
+ position: 'absolute',
+ width: '100%',
+ padding: 24,
+ top: -68,
+ },
+ boxShadow: {
+ shadowRadius: 12,
+ shadowOpacity: 1,
+ shadowOffset: {
+ width: 0,
+ height: 2,
+ },
+ shadowColor: 'rgba(0,0,0,0.35)',
+ },
+ completedItemsShadow: {
+ width: '100%',
+ },
+ completedItemsInner: {
+ backgroundColor: colors.white,
+ flexDirection: 'row',
+ width: '100%',
+ borderRadius: 8,
+ overflow: 'hidden',
+ },
+ completedItemsText: {
+ color: colors.white,
+ fontWeight: fontWeight.bold,
+ fontSize: fontSize.base,
+ textAlign: 'center',
+ marginBottom: 16,
+ textShadowRadius: 12,
+ textShadowColor: 'rgba(0,0,0,0.35)',
+ textShadowOffset: {
+ width: 0,
+ height: 2,
+ },
+ },
+ title: {
+ color: colors.white,
+ fontWeight: fontWeight.bold,
+ fontSize: fontSize.base,
+ textAlign: 'center',
+ position: 'absolute',
+ top: 100,
+ },
+ textShadow: {
+ textShadowRadius: 12,
+ textShadowColor: 'rgba(0,0,0,0.35)',
+ textShadowOffset: {
+ width: 0,
+ height: 2,
+ },
+ },
+ topView: {
+ position: 'absolute',
+ zIndex: 1000,
+ margin: 0,
+ padding: 0,
+ height: 200,
+ },
+
+ bottomView: {
+ bottom: 0,
+ flex: 0,
+ height: 100,
+ padding: 0,
+ position: 'absolute',
+ flexDirection: 'row',
+ },
+
+ iconContainer: {
+ padding: 20,
+ marginLeft: 8,
+ marginRight: 8,
+ },
+
+ closeIconContainer: {
+ position: 'absolute',
+ right: 16,
+ top: 28,
+ backgroundColor: colors.darkGray,
+ borderRadius: 8,
+ width: 48,
+ height: 48,
+ margin: 0,
+ },
+
+ markerContainer: {
+ position: 'relative',
+ overflow: 'visible',
+ ...ifSmallDevice(
+ {
+ width: 177,
+ height: 177,
+ },
+ {
+ width: 264,
+ height: 264,
+ },
+ ),
+ },
+
+ markerCorner: {
+ position: 'absolute',
+ borderColor: colors.white,
+ borderWidth: 3,
+ width: 12.5,
+ height: 12.5,
+ overflow: 'visible',
+ },
+
+ markerTopLeft: {
+ top: 0,
+ left: 0,
+ borderBottomWidth: 0,
+ borderRightWidth: 0,
+ },
+
+ markerTopRight: {
+ top: 0,
+ right: 0,
+ borderBottomWidth: 0,
+ borderLeftWidth: 0,
+ },
+
+ markerBottomLeft: {
+ bottom: 0,
+ left: 0,
+ borderTopWidth: 0,
+ borderRightWidth: 0,
+ },
+
+ markerBottomRight: {
+ bottom: 0,
+ right: 0,
+ borderTopWidth: 0,
+ borderLeftWidth: 0,
+ },
+});
diff --git a/src/screens/Recover/Recover.js b/src/screens/Recover/Recover.js
index 9462904..5f77d23 100644
--- a/src/screens/Recover/Recover.js
+++ b/src/screens/Recover/Recover.js
@@ -18,7 +18,9 @@ import { ifAndroid, ifSmallDevice, isSmallDevice } from '../../utils/device';
class Screen extends Component {
themeStyle = '';
+
theme = '';
+
mnemonicArr = [];
constructor(props): void {
@@ -42,7 +44,7 @@ class Screen extends Component {
getChildContext = () => ({ theme: this.theme });
prevWord = () => {
- var i = this.state.mnemonicCount - 1;
+ const i = this.state.mnemonicCount - 1;
if (i >= 0) {
this.setState({
mnemonicWord: this.mnemonicArr[i],
@@ -58,7 +60,7 @@ class Screen extends Component {
this.mnemonicArr[this.state.mnemonicCount] = this.state.mnemonicWord;
- var i = this.state.mnemonicCount + 1;
+ const i = this.state.mnemonicCount + 1;
if (i < 12) {
this.setState({
mnemonicWord: this.mnemonicArr[i] || '',
@@ -69,8 +71,8 @@ class Screen extends Component {
}
};
- validateMnemonic = ignoreValidation => {
- var mnemonic = this.mnemonicArr
+ validateMnemonic = (ignoreValidation) => {
+ const mnemonic = this.mnemonicArr
.join(' ')
.trim()
.toLowerCase();
@@ -87,8 +89,8 @@ class Screen extends Component {
}
};
- saveMnemonic = pin => {
- var mnemonic = this.mnemonicArr
+ saveMnemonic = (pin) => {
+ const mnemonic = this.mnemonicArr
.join(' ')
.trim()
.toLowerCase();
@@ -98,7 +100,7 @@ class Screen extends Component {
});
};
- pinSuccess = pin => {
+ pinSuccess = (pin) => {
this.saveMnemonic(pin);
};
@@ -120,37 +122,30 @@ class Screen extends Component {
});
};
- _return() {
+ _return = () => {
this.props.navigation.state.params.onReady();
this.props.navigation.goBack();
- }
+ };
- _onFocus() {
+ _onFocus = () => {
this.setState({
inputFocusStyle: this.themeStyle.inputFocused,
inputFocused: true,
});
- }
+ };
- _onBlur() {
+ _onBlur = () => {
this.setState({
inputFocusStyle: this.themeStyle.inputBlurred,
inputFocused: false,
});
- }
+ };
- _nextDisabled() {
- return (
- this.state.mnemonicWord.length < 1 &&
- !(this.state.mnemonicCount == 12 - 1)
- );
- }
+ _nextDisabled = () => this.state.mnemonicWord.length < 1 && !(this.state.mnemonicCount == 12 - 1);
- _prevDisabled() {
- return this.state.mnemonicCount == 0;
- }
+ _prevDisabled = () => this.state.mnemonicCount == 0;
- render = function() {
+ render() {
const { theme } = this.props.navigation.state.params || {};
const themeStyle = this.themeStyle;
const {
@@ -165,7 +160,7 @@ class Screen extends Component {
if (setPin) {
return (
Invalid Mnemonic
- The phrase you have just entered is not something that have been
- generated with this app. Are you sure you wish to recover it?
+ The phrase you have just entered is not something that have been generated with this
+ app. Are you sure you wish to recover it?
@@ -201,8 +196,8 @@ class Screen extends Component {
{...ifAndroid(
{},
{
- behavior: ifSmallDevice('position', 'height'),
- }
+ behavior: ifSmallDevice('position', 'padding'),
+ },
)}
>
@@ -213,34 +208,35 @@ class Screen extends Component {
name="close"
color={colors.getTheme().text}
containerStyle={themeStyle.topIcon}
- onPress={this._return.bind(this)}
+ onPress={this._return}
underlayColor="transparent"
- hitSlop={{ top: 20, bottom: 20, left: 20, right: 20 }}
+ hitSlop={{
+ top: 20,
+ bottom: 20,
+ left: 20,
+ right: 20,
+ }}
/>
Recover COINiD Vault
Enter the 12 word recovery phrase.
-
- {mnemonicCount + 1} of 12
-
+ {`${mnemonicCount + 1} of 12`}
this._onBlur()}
onFocus={() => this._onFocus()}
@@ -262,7 +258,7 @@ class Screen extends Component {
style={themeStyle.prevNextBtn}
onPress={this.nextWord}
>
- {mnemonicCount == 12 - 1 ? 'Save' : 'Next Word'}
+ {mnemonicCount === 12 - 1 ? 'Save' : 'Next Word'}
@@ -270,7 +266,7 @@ class Screen extends Component {
);
- };
+ }
}
Screen.childContextTypes = {
diff --git a/src/screens/Recover/styles.js b/src/screens/Recover/styles.js
index d4581d2..a703047 100644
--- a/src/screens/Recover/styles.js
+++ b/src/screens/Recover/styles.js
@@ -3,22 +3,21 @@ import parentStyles from '../styles';
import styleMerge from '../../utils/styleMerge';
import { fontStack, fontWeight } from '../../config/styling';
-export default theme =>
- styleMerge(
- parentStyles(theme),
- StyleSheet.create({
- mnemonicWord: {
- fontSize: 42,
- lineHeight: 59,
- textDecorationLine: 'underline',
- ...(Platform.OS === 'android'
- ? {
- fontFamily: fontStack.bold,
- }
- : {
- fontFamily: fontStack.primary,
- fontWeight: fontWeight.bold,
- }),
- },
- })
- );
+export default theme => styleMerge(
+ parentStyles(theme),
+ StyleSheet.create({
+ mnemonicWord: {
+ fontSize: 42,
+ lineHeight: 59,
+ textDecorationLine: 'underline',
+ ...(Platform.OS === 'android'
+ ? {
+ fontFamily: fontStack.bold,
+ }
+ : {
+ fontFamily: fontStack.primary,
+ fontWeight: fontWeight.bold,
+ }),
+ },
+ }),
+);
diff --git a/src/screens/Sign/Sign.js b/src/screens/Sign/Sign.js
index 38e9ef6..92a0f81 100644
--- a/src/screens/Sign/Sign.js
+++ b/src/screens/Sign/Sign.js
@@ -2,26 +2,21 @@ import React, { Component } from 'react';
import PropTypes from 'prop-types';
import {
- Alert,
- View,
- Platform,
- ScrollView,
+ Alert, View, Platform, ScrollView,
} from 'react-native';
import styles from './styles';
import { fontStack, fontWeight } from '../../config/styling';
import {
- Button,
- Text,
- TxInfoRow,
- KeyboardWrapper,
+ Button, Text, TxInfoRow, KeyboardWrapper,
} from '../../components';
import { loadMnemonic } from '../../utils/mnemonic';
import { getCoinIdDataFromUrl } from '../../utils/coinid';
import { numFormat } from '../../utils/numFormat';
import createStyleArr from '../../utils/createStyleArr';
+import { findSweepedKeyInStore } from '../../utils/sweepkey';
class Screen extends Component {
themeStyle = '';
@@ -33,7 +28,13 @@ class Screen extends Component {
constructor(props): void {
super(props);
- const { navigation: { state: { params: { theme, url } } } } = this.props;
+ const {
+ navigation: {
+ state: {
+ params: { theme, url },
+ },
+ },
+ } = this.props;
this.theme = theme;
this.themeStyle = styles(theme);
this.url = url;
@@ -67,6 +68,8 @@ class Screen extends Component {
return 'Myriad Wallet for COINiD';
case 'coinid-grs':
return 'Groestlcoin Wallet for COINiD';
+ case 'coinid-tgrs':
+ return 'GRS Testnet Wallet for COINiD';
default:
return 'Unknown';
}
@@ -99,11 +102,34 @@ class Screen extends Component {
this.setState({
isLoadingText: 'Signing',
txOutputs: txInfo.externalOutputs,
- txTo: txInfo.externalOutputs[0].address,
- txAmount: txInfo.externalOutputs[0].amount,
txFee: txInfo.fee,
txTotal: txInfo.externalTotal + txInfo.fee,
- txTicker: info.ticker.toUpperCase(),
+ txTicker: info.network.ticker,
+ });
+ }
+
+ if (info.type === 'swptx') {
+ const swpTxInfo = coinId.getSwpTxInfo();
+
+ const swpTxAddressGroups = swpTxInfo.inputs.reduce((a, { address, satValue }) => {
+ const acc = { ...a };
+ if (!acc[address]) {
+ acc[address] = { address, satValue };
+ } else {
+ acc[address].satValue += satValue;
+ }
+
+ return acc;
+ }, {});
+
+ this.setState({
+ isLoadingText: 'Signing',
+ swpTxReceiveAddress: swpTxInfo.receiveAddress,
+ swpTxInputs: swpTxInfo.inputs,
+ swpTxFee: swpTxInfo.fee,
+ swpTxTotal: swpTxInfo.total - swpTxInfo.fee,
+ swpTxTicker: info.network.ticker,
+ swpTxAddressGroups: Object.values(swpTxAddressGroups),
});
}
@@ -141,23 +167,33 @@ class Screen extends Component {
this._keyboard._showKeyboard();
};
- _sign = (pin) => {
- const { navigation: { goBack, state: { params: { onSigned, onError } } } } = this.props;
+ _sign = async (pin) => {
+ const {
+ navigation: {
+ goBack,
+ state: {
+ params: { onDone, onError },
+ },
+ },
+ } = this.props;
const {
coinId, returnScheme, type, variant,
} = this.state;
- const buildReturnUrl = (data) => {
- const getReturnScheme = () => {
- if (variant.toLowerCase() === 'p2p') {
- return returnScheme.toUpperCase();
- }
- return returnScheme;
- };
+ const extraData = {};
+ if (type === 'swptx') {
+ const { ticker } = coinId.getInfo();
+ const { swpTxAddressGroups } = this.state;
+ const { address: sweepAddress } = swpTxAddressGroups[0];
- return `${getReturnScheme()}://${type.toUpperCase()}/${data}`;
- };
+ const foundKey = await findSweepedKeyInStore({
+ address: sweepAddress,
+ ticker: ticker.toLowerCase(),
+ });
+
+ extraData.wif = foundKey.decryptedWif;
+ }
this.setState({
isLoading: true,
@@ -167,9 +203,9 @@ class Screen extends Component {
loadMnemonic(pin).then((mnemonic) => {
if (mnemonic) {
coinId
- .getReturnData(mnemonic)
+ .getReturnData(mnemonic, extraData)
.then((data) => {
- let returnUrl = buildReturnUrl(data);
+ let returnUrl = coinId.buildReturnUrl({ data, returnScheme, variant });
if (type === 'val') {
Alert.alert('Validated address', data);
@@ -177,7 +213,7 @@ class Screen extends Component {
}
goBack();
- setTimeout(() => onSigned({ variant, returnUrl }), 400);
+ setTimeout(() => onDone({ variant, returnUrl }), 400);
})
.catch((error) => {
Alert.alert('Signing error', `${error}`);
@@ -194,7 +230,22 @@ class Screen extends Component {
const { themeStyle } = this;
const {
- openKeyboardOnShow, txOutputs, txTicker, type, schemeOwner, txFee, txTotal, msgMessage, isLoading, isLoadingText,
+ openKeyboardOnShow,
+ txOutputs,
+ txTicker,
+ type,
+ schemeOwner,
+ txFee,
+ txTotal,
+ msgMessage,
+ isLoading,
+ isLoadingText,
+ swpTxReceiveAddress,
+ swpTxInputs,
+ swpTxFee,
+ swpTxTotal,
+ swpTxTicker,
+ swpTxAddressGroups,
} = this.state;
const getOutputs = () => {
@@ -208,8 +259,10 @@ class Screen extends Component {
return (
- {output.address}
-
+
+ {output.address}
+
+
{`${numFormat(output.amount / 1e8, txTicker)} ${txTicker}`}
@@ -229,24 +282,15 @@ class Screen extends Component {
case 'tx':
return (
-
+
Confirm and sign this transaction from
-
+
{schemeOwner}
-
- {getOutputs()}
-
+ {getOutputs()}
{`${numFormat(txFee / 1e8, txTicker)} ${txTicker}`}
@@ -258,20 +302,56 @@ class Screen extends Component {
);
+ case 'swptx':
+ return (
+
+
+ Confirm private key sweep to
+
+ {schemeOwner}
+
+
+
+
+
+ {swpTxReceiveAddress}
+
+
+
+ {swpTxAddressGroups.map(({ address, satValue }) => (
+
+
+ {address}
+
+
+ {`${numFormat(satValue / 1e8, swpTxTicker)} ${swpTxTicker}`}
+
+
+ ))}
+
+
+
+ {`${numFormat(swpTxFee / 1e8, swpTxTicker)} ${swpTxTicker}`}
+
+
+ {`${numFormat(swpTxTotal / 1e8, swpTxTicker)} ${swpTxTicker}`}
+
+
+
+ );
+
case 'pub':
return (
Confirm checkout of public keys to
-
- {schemeOwner}
-
+ {schemeOwner}
- By signing you agree to send your public keys to the requesting
- party.
+ By signing you agree to send your public keys to the requesting party.
- Your public keys can only be used to derive addresses and NOT to
- send funds.
+ Your public keys can only be used to derive addresses and NOT to send funds.
);
@@ -280,17 +360,14 @@ class Screen extends Component {
return (
Validate address from
-
- {schemeOwner}
-
+ {schemeOwner}
- By signing we will lookup a valid receive address. You should do
- a manual check to see that the same address is displayed on the
- wallet.
+ By signing we will lookup a valid receive address. You should do a manual check to
+ ensure that the same address is displayed in the wallet.
- Address validation is an extra security measure to ensure that
- the wallet generates correct receive addresses.
+ Address validation is an extra security measure to ensure that the wallet generates
+ correct receive addresses.
);
@@ -299,9 +376,7 @@ class Screen extends Component {
return (
Confirm and sign this message from
-
- {schemeOwner}
-
+ {schemeOwner}
Message:
Confirm that you want to authenticate with
-
- {schemeOwner}
-
+ {schemeOwner}
By signing you will login to your wallet.
@@ -336,9 +409,7 @@ class Screen extends Component {
return (
Confirm that you want to authenticate with
-
- {schemeOwner}
-
+ {schemeOwner}
By signing you will login to your wallet.
@@ -348,32 +419,55 @@ class Screen extends Component {
default:
return (
- Confirm and sign this
+ Unsupported request from
+ {schemeOwner}
+
+ Please update to the latest version of the COINiD Vault to handle this request.
+
);
}
};
- const getFooter = () => (
-
-
-
- );
+ const getFooter = () => {
+ switch (type) {
+ case 'swptx':
+ case 'tx':
+ case 'pub':
+ case 'val':
+ case '2fa':
+ case 'sah':
+ case 'msg':
+ return (
+
+
+
+ );
+ default:
+ return ;
+ }
+ };
const getReason = () => {
switch (type) {
case 'tx':
return 'Sign Transaction';
+ case 'swptx':
+ return 'Sign Sweep Transaction';
case 'pub':
return 'Checkout Public Keys';
case '2fa':
@@ -382,6 +476,8 @@ class Screen extends Component {
return 'Sign Login Request';
case 'msg':
return 'Sign Message';
+ case 'val':
+ return 'Validate Address';
default:
return 'Sign';
}
@@ -394,7 +490,9 @@ class Screen extends Component {
,
{ this._keyboard = c; }}
+ ref={(c) => {
+ this._keyboard = c;
+ }}
type="auth"
openOnShow={openKeyboardOnShow}
showTouchId
diff --git a/src/screens/Sign/styles.js b/src/screens/Sign/styles.js
index 56c744a..88e6955 100644
--- a/src/screens/Sign/styles.js
+++ b/src/screens/Sign/styles.js
@@ -3,28 +3,30 @@ import parentStyles from '../styles';
import styleMerge from '../../utils/styleMerge';
import { colors, fontWeight, layout } from '../../config/styling';
-export default theme =>
- styleMerge(
- parentStyles(theme),
- StyleSheet.create({
- schemeOwner: {
- marginTop: 24,
- marginBottom: 8,
- },
- outputsContainer: {
- overflow: 'visible',
- marginHorizontal: -layout.paddingHorizontal,
- paddingHorizontal: layout.paddingHorizontal,
- },
- txRow: {
- marginBottom: 8,
- borderBottomWidth: 1,
- borderBottomColor: colors.getTheme(theme).border,
- paddingBottom: 24,
- },
- txRowLast: {
- marginBottom: 0,
- borderBottomWidth: 0,
- },
- })
- );
+export default theme => styleMerge(
+ parentStyles(theme),
+ StyleSheet.create({
+ schemeOwner: {
+ marginTop: 24,
+ marginBottom: 8,
+ },
+ outputsContainer: {
+ overflow: 'visible',
+ marginHorizontal: -layout.paddingHorizontal,
+ paddingHorizontal: layout.paddingHorizontal,
+ },
+ labelStyle: {
+ width: 68,
+ },
+ txRow: {
+ marginBottom: 8,
+ borderBottomWidth: 1,
+ borderBottomColor: colors.getTheme(theme).border,
+ paddingBottom: 24,
+ },
+ txRowLast: {
+ marginBottom: 0,
+ borderBottomWidth: 0,
+ },
+ }),
+);
diff --git a/src/screens/index.js b/src/screens/index.js
index f5cc105..914903c 100644
--- a/src/screens/index.js
+++ b/src/screens/index.js
@@ -7,3 +7,4 @@ export { default as Backup } from './Backup';
export { default as Sign } from './Sign';
export { default as QRDataReceiver } from './QRDataReceiver';
export { default as QRDataSender } from './QRDataSender';
+export { default as QRSweeper } from './QRSweeper';
diff --git a/src/screens/styles.js b/src/screens/styles.js
index 0ee2bc6..9106d96 100644
--- a/src/screens/styles.js
+++ b/src/screens/styles.js
@@ -2,93 +2,100 @@ import { StyleSheet } from 'react-native';
import { ifSmallDevice } from '../utils/device';
import { colors, layout } from '../config/styling';
-export default theme =>
- StyleSheet.create({
- container: {
- flex: 1,
- paddingTop: layout.paddingTop,
- paddingBottom: layout.paddingBottom,
- paddingHorizontal: layout.paddingHorizontal,
- backgroundColor: colors.getTheme(theme).background,
- },
- topContainer: {
- flex: 1,
- },
- supportText: {
- textAlign: 'center',
- color: colors.getTheme(theme).disabled,
- },
- bottomContainer: {},
- bottomButtons: {
- flexDirection: 'row',
- justifyContent: 'space-between',
- marginHorizontal: -10,
- paddingTop: 18,
- },
- spaceBetween: {
- flex: 2,
- paddingTop: 32,
- flexDirection: 'column',
- justifyContent: 'space-between',
- },
- flexEnd: {
- flex: 2,
- paddingBottom: 32,
- flexDirection: 'column',
- justifyContent: 'flex-end',
- },
- highlightText: {
- color: colors.getTheme(theme).highlight,
- },
- warningText: {
- color: colors.orange,
- },
- opacityBackground: {
- backgroundColor: 'rgba(255, 255, 255, 0.95)',
- zIndex: 100,
- },
- borderTop: {
- borderTopWidth: 1,
- borderTopColor: colors.getTheme(theme).border,
- },
- topIcon: {
- position: 'absolute',
- right: -8,
- zIndex: 10,
- width: 32,
- height: 32,
- margin: 0,
- ...ifSmallDevice({ top: -12 }, { top: -36 }),
- },
- topIconLeft: {
- left: -8,
- },
- topButton: {
- position: 'absolute',
- right: -5,
- top: -68,
- ...ifSmallDevice({ top: -44 }, { top: -68 }),
- },
- prevNextBtn: {
- flex: 1,
- marginHorizontal: 10,
- marginTop: 0,
- flexBasis: 23,
- },
- wordInput: {
- marginTop: 32,
- height: 52,
- lineHeight: 38,
- fontSize: 32,
- color: colors.getTheme(theme).text,
- borderColor: colors.getTheme(theme).text,
- paddingBottom: 6,
- borderBottomWidth: 3,
- },
- inputFocused: {
- borderColor: 'rgba(10, 15, 23, 1)',
- },
- inputBlurred: {
- borderColor: 'rgba(10, 15, 23, 0.25)',
- },
- });
+export default theme => StyleSheet.create({
+ container: {
+ flex: 1,
+ paddingTop: layout.paddingTop,
+ paddingBottom: layout.paddingBottom,
+ paddingHorizontal: layout.paddingHorizontal,
+ backgroundColor: colors.getTheme(theme).background,
+ },
+ topContainer: {
+ flex: 1,
+ },
+ supportText: {
+ textAlign: 'center',
+ color: colors.getTheme(theme).disabled,
+ },
+ bottomContainer: {},
+ bottomButtons: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ marginHorizontal: -10,
+ paddingTop: 18,
+ },
+ spaceBetween: {
+ flex: 2,
+ paddingTop: 32,
+ flexDirection: 'column',
+ justifyContent: 'space-between',
+ },
+ flexEnd: {
+ flex: 2,
+ paddingBottom: 32,
+ flexDirection: 'column',
+ justifyContent: 'flex-end',
+ },
+ highlightText: {
+ color: colors.getTheme(theme).highlight,
+ },
+ warningText: {
+ color: colors.orange,
+ },
+ opacityBackground: {
+ backgroundColor: 'rgba(255, 255, 255, 0.95)',
+ zIndex: 100,
+ },
+ marginToPaddingTop: {
+ marginTop: -100,
+ paddingTop: 100,
+ },
+ marginToPaddingBottom: {
+ marginBottom: -100,
+ paddingBottom: 100,
+ },
+ borderTop: {
+ borderTopWidth: 1,
+ borderTopColor: colors.getTheme(theme).border,
+ },
+ topIcon: {
+ position: 'absolute',
+ right: -8,
+ zIndex: 10,
+ width: 32,
+ height: 32,
+ margin: 0,
+ ...ifSmallDevice({ top: -12 }, { top: -36 }),
+ },
+ topIconLeft: {
+ left: -8,
+ },
+ topButton: {
+ position: 'absolute',
+ right: -5,
+ top: -68,
+ ...ifSmallDevice({ top: -44 }, { top: -68 }),
+ },
+ prevNextBtn: {
+ flex: 1,
+ marginHorizontal: 10,
+ marginTop: 0,
+ flexBasis: 23,
+ },
+ wordInput: {
+ marginTop: 32,
+ height: 52,
+ lineHeight: 38,
+ fontSize: 32,
+ color: colors.getTheme(theme).text,
+ borderColor: colors.getTheme(theme).text,
+ paddingBottom: 6,
+ borderBottomWidth: 3,
+ },
+ inputFocused: {
+ borderColor: 'rgba(10, 15, 23, 1)',
+ },
+ inputBlurred: {
+ borderColor: 'rgba(10, 15, 23, 0.25)',
+ },
+});
diff --git a/src/utils/coinid.js b/src/utils/coinid.js
index 01eea81..9e8a44b 100644
--- a/src/utils/coinid.js
+++ b/src/utils/coinid.js
@@ -2,6 +2,8 @@
* COINiD Helper
*/
+ const coinidPrivate = require('coinid-private');
+
export const getCoinIdDataFromUrl = (url) => {
try {
const data = url.split('://')[1];
@@ -10,11 +12,11 @@ export const getCoinIdDataFromUrl = (url) => {
const coinIdData = splitData.splice(1).join('/');
if (!returnScheme) {
- throw('Return scheme is missing...');
+ throw ('Return scheme is missing...');
}
if (!coinIdData) {
- throw('COINiD data is missing...');
+ throw ('COINiD data is missing...');
}
return {
@@ -22,28 +24,30 @@ export const getCoinIdDataFromUrl = (url) => {
coinIdData,
variant: variant || '',
};
- }
- catch (err) {
+ } catch (err) {
return {
returnScheme: '',
coinIdData: '',
variant: '',
};
}
-}
+};
-export const validateCoinIdDataFromUrl = (url) => {
- var { returnScheme, coinIdData }Â = getCoinIdDataFromUrl(url);
- return validateCoinIdData(coinIdData);
-}
+export const getInfoFromCoinIdUrl = (url) => {
+ const { coinIdData } = getCoinIdDataFromUrl(url);
+ return coinidPrivate(coinIdData).getInfo();
+};
export const validateCoinIdData = (coinIdData) => {
try {
- const coinId = require('coinid-private')(coinIdData);
- return true;
+ const coinId = coinidPrivate(coinIdData);
+ return coinId;
+ } catch (err) {
+ throw (err);
}
- catch(err) {
- throw(err);
- return false;
- }
-}
\ No newline at end of file
+};
+
+export const validateCoinIdDataFromUrl = (url) => {
+ const { coinIdData } = getCoinIdDataFromUrl(url);
+ return validateCoinIdData(coinIdData);
+};
diff --git a/src/utils/mnemonic.js b/src/utils/mnemonic.js
index 37c2278..53a911b 100644
--- a/src/utils/mnemonic.js
+++ b/src/utils/mnemonic.js
@@ -8,60 +8,54 @@ import { encrypt, decrypt } from './encrypt';
import { savePin } from './pin';
export const loadMnemonic = (pin) => {
- if(!pin) {
- throw('No pin entered')
+ if (!pin) {
+ throw 'No pin entered';
}
- return Keychain
- .getGenericPassword('mnemonic.coinid.org')
- .then((credentials) => {
- var encryptedMnemonic = credentials.password;
- var mnemonic = decrypt(encryptedMnemonic, pin);
+ return Keychain.getGenericPassword('mnemonic.coinid.org').then((credentials) => {
+ const encryptedMnemonic = credentials.password;
+ const mnemonic = decrypt(encryptedMnemonic, pin);
return mnemonic;
});
-}
+};
-export const hasMnemonic = () => {
- return Keychain
- .getGenericPassword('mnemonic.coinid.org')
- .then((credentials) => {
- if(!credentials.password) {
- throw('No Mnemonic');
- }
- return true;
- });
-}
+export const hasMnemonic = () => Keychain.getGenericPassword('mnemonic.coinid.org').then((credentials) => {
+ if (!credentials.password) {
+ throw 'No Mnemonic';
+ }
+ return true;
+});
export const saveMnemonic = (mnemonic, pin) => {
- if(!mnemonic) {
- throw('No Mnemonic entered')
+ if (!mnemonic) {
+ throw 'No Mnemonic entered';
}
- if(!pin) {
- throw('No Pin entered')
+ if (!pin) {
+ throw 'No Pin entered';
}
- var encryptedMnemonic = encrypt(mnemonic, pin);
+ const encryptedMnemonic = encrypt(mnemonic, pin);
return Promise.all([
savePin(pin),
- Keychain.setGenericPassword('mnemonic', encryptedMnemonic, 'mnemonic.coinid.org')
+ Keychain.setGenericPassword('mnemonic', encryptedMnemonic, 'mnemonic.coinid.org'),
]);
-}
+};
-export const removeMnemonic = () => {
- return Keychain.resetGenericPassword('mnemonic.coinid.org')
- .then(Keychain.resetGenericPassword('pin.coinid.org'));
-}
+export const removeMnemonic = async () => {
+ await Keychain.resetGenericPassword('mnemonic.coinid.org');
+ await Keychain.resetGenericPassword('pin.coinid.org');
+ await Keychain.resetGenericPassword('sweepedkeys.coinid.org');
+ return true;
+};
export const generateMnemonic = () => {
try {
- return bip39.generateMnemonic(128) // default to 128
- } catch(e) {
- return false
+ return bip39.generateMnemonic(128); // default to 128
+ } catch (e) {
+ return false;
}
-}
+};
-export const validateMnemonic = (mnemonic) => {
- return bip39.validateMnemonic(mnemonic);
-}
\ No newline at end of file
+export const validateMnemonic = mnemonic => bip39.validateMnemonic(mnemonic);
diff --git a/src/utils/numFormat.js b/src/utils/numFormat.js
index 5b6d122..ed2c78c 100644
--- a/src/utils/numFormat.js
+++ b/src/utils/numFormat.js
@@ -1,5 +1,3 @@
-
-
import numbro from 'numbro';
const initLocale = () => {
@@ -21,9 +19,10 @@ const validCryptoCurrencies = {
LTC: true,
XMY: true,
GRS: true,
+ TGRS: true,
};
-const isCryptoCurrency = currency => (!!(currency && validCryptoCurrencies[currency]));
+export const isCryptoCurrency = currency => (!!(currency && validCryptoCurrencies[currency.toUpperCase()]));
export const numFormat = (value, currency, decimals, variableDecimals) => {
value = Number(value);
diff --git a/src/utils/sweepkey.js b/src/utils/sweepkey.js
new file mode 100644
index 0000000..7e763e4
--- /dev/null
+++ b/src/utils/sweepkey.js
@@ -0,0 +1,118 @@
+/**
+ * Utilities for sweeped keys
+ */
+
+import * as Keychain from 'react-native-keychain';
+import { encrypt, decrypt } from './encrypt';
+import { sweepStoreSecret } from '../config/secrets.js';
+
+export const getSweepedKeysFromStore = async () => {
+ try {
+ const { password: encryptedSweepKeyData } = await Keychain.getGenericPassword(
+ 'sweepedkeys.coinid.org',
+ );
+
+ if (!encryptedSweepKeyData) {
+ return [];
+ }
+
+ const decryptedSweepKeyData = decrypt(encryptedSweepKeyData, sweepStoreSecret);
+ const storedKeys = JSON.parse(decryptedSweepKeyData);
+
+ return storedKeys;
+ } catch (error) {
+ console.log(`Error getting sweepkeydata... ${error}`);
+ }
+
+ return [];
+};
+
+export const findSweepedKeyInStore = async ({
+ address,
+ decryptedWif,
+ encryptedWif,
+ password,
+ ticker,
+}) => {
+ const savedKeys = await getSweepedKeysFromStore();
+
+ if (address && ticker) {
+ const [foundKey] = savedKeys.filter((e) => {
+ if (e.ticker !== ticker) {
+ return false;
+ }
+ const [filteredAddress] = e.addresses.filter(a => a.address === address);
+ return !!filteredAddress;
+ });
+
+ return foundKey;
+ }
+
+ if (decryptedWif && ticker) {
+ const [foundKey] = savedKeys.filter(
+ e => e.decryptedWif === decryptedWif && e.ticker === ticker,
+ );
+ return foundKey;
+ }
+
+ if (encryptedWif && password && ticker) {
+ const [foundKey] = savedKeys.filter(
+ e => e.encryptedWif === encryptedWif && e.password === password && e.ticker === ticker,
+ );
+ return foundKey;
+ }
+
+ return false;
+};
+
+export const addSweepedKeyToStore = async ({
+ ticker,
+ decryptedWif,
+ encryptedWif,
+ addresses,
+ compressed,
+ password,
+}) => {
+ const storedKeys = await getSweepedKeysFromStore();
+
+ if (!ticker || !decryptedWif) {
+ throw 'Missing required parameters';
+ }
+
+ let isUpdated = false;
+ const updatedKeys = storedKeys.map((keyObj) => {
+ if (keyObj.ticker === ticker && keyObj.decryptedWif === decryptedWif) {
+ isUpdated = true;
+
+ return {
+ ...keyObj,
+ ...(encryptedWif !== undefined ? { encryptedWif } : {}),
+ ...(addresses !== undefined ? { addresses } : {}),
+ ...(compressed !== undefined ? { compressed } : {}),
+ ...(password !== undefined ? { password } : {}),
+ };
+ }
+
+ return keyObj;
+ });
+
+ if (!isUpdated) {
+ updatedKeys.push({
+ ticker,
+ decryptedWif,
+ encryptedWif,
+ addresses,
+ compressed,
+ password,
+ });
+ }
+
+ const decryptedSweepKeyData = JSON.stringify(updatedKeys);
+ const encryptedSweepKeyData = encrypt(decryptedSweepKeyData, sweepStoreSecret);
+
+ return Keychain.setGenericPassword(
+ 'sweepedkeys',
+ encryptedSweepKeyData,
+ 'sweepedkeys.coinid.org',
+ );
+};
diff --git a/yarn.lock b/yarn.lock
index 1b49e48..04801e3 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -14,7 +14,7 @@
dependencies:
"@babel/highlight" "7.0.0-rc.1"
-"@babel/code-frame@^7.0.0":
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8"
dependencies:
@@ -526,9 +526,10 @@
version "1.0.0"
resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.0.0.tgz#33d1dbb659a23b81f87f048762b35a446172add3"
-abab@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
+abab@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f"
+ integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==
abbrev@1:
version "1.1.1"
@@ -545,11 +546,13 @@ accepts@~1.3.3, accepts@~1.3.5:
mime-types "~2.1.18"
negotiator "0.6.1"
-acorn-globals@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
+acorn-globals@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103"
+ integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==
dependencies:
- acorn "^4.0.4"
+ acorn "^6.0.1"
+ acorn-walk "^6.0.1"
acorn-jsx@^4.1.1:
version "4.1.1"
@@ -557,14 +560,25 @@ acorn-jsx@^4.1.1:
dependencies:
acorn "^5.0.3"
-acorn@^4.0.4:
- version "4.0.13"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+acorn-walk@^6.0.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
+ integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==
acorn@^5.0.3, acorn@^5.6.0:
version "5.7.2"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.2.tgz#91fa871883485d06708800318404e72bfb26dcc5"
+acorn@^5.5.3:
+ version "5.7.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
+ integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
+
+acorn@^6.0.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f"
+ integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==
+
ajv-keywords@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
@@ -576,15 +590,6 @@ ajv@^4.9.1:
co "^4.6.0"
json-stable-stringify "^1.0.1"
-ajv@^5.1.0:
- version "5.5.2"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
- dependencies:
- co "^4.6.0"
- fast-deep-equal "^1.0.0"
- fast-json-stable-stringify "^2.0.0"
- json-schema-traverse "^0.3.0"
-
ajv@^6.0.1, ajv@^6.5.3:
version "6.5.3"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9"
@@ -594,6 +599,16 @@ ajv@^6.0.1, ajv@^6.5.3:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
+ajv@^6.5.5:
+ version "6.10.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1"
+ integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==
+ dependencies:
+ fast-deep-equal "^2.0.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
align-text@^0.1.1, align-text@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
@@ -786,6 +801,11 @@ astral-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+async-limiter@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
+ integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==
+
async@^1.4.0:
version "1.5.2"
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
@@ -808,10 +828,15 @@ aws-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
-aws4@^1.2.1, aws4@^1.6.0:
+aws4@^1.2.1:
version "1.6.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+aws4@^1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
+ integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
+
axobject-query@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.1.tgz#05dfa705ada8ad9db993fa6896f22d395b0b0a07"
@@ -983,12 +1008,13 @@ babel-helpers@^6.24.1:
babel-runtime "^6.22.0"
babel-template "^6.24.1"
-babel-jest@^21.2.0:
- version "21.2.0"
- resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-21.2.0.tgz#2ce059519a9374a2c46f2455b6fbef5ad75d863e"
+babel-jest@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1"
+ integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==
dependencies:
- babel-plugin-istanbul "^4.0.0"
- babel-preset-jest "^21.2.0"
+ babel-plugin-istanbul "^4.1.6"
+ babel-preset-jest "^23.2.0"
babel-messages@^6.23.0:
version "6.23.0"
@@ -1008,17 +1034,20 @@ babel-plugin-external-helpers@^6.22.0:
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-istanbul@^4.0.0:
- version "4.1.5"
- resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e"
+babel-plugin-istanbul@^4.1.6:
+ version "4.1.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45"
+ integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==
dependencies:
+ babel-plugin-syntax-object-rest-spread "^6.13.0"
find-up "^2.1.0"
- istanbul-lib-instrument "^1.7.5"
- test-exclude "^4.1.1"
+ istanbul-lib-instrument "^1.10.1"
+ test-exclude "^4.2.1"
-babel-plugin-jest-hoist@^21.2.0:
- version "21.2.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz#2cef637259bd4b628a6cace039de5fcd14dbb006"
+babel-plugin-jest-hoist@^23.2.0:
+ version "23.2.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167"
+ integrity sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=
babel-plugin-react-transform@^3.0.0:
version "3.0.0"
@@ -1335,11 +1364,12 @@ babel-preset-fbjs@^2.1.2, babel-preset-fbjs@^2.1.4:
babel-plugin-transform-react-display-name "^6.8.0"
babel-plugin-transform-react-jsx "^6.8.0"
-babel-preset-jest@^21.2.0:
- version "21.2.0"
- resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz#ff9d2bce08abd98e8a36d9a8a5189b9173b85638"
+babel-preset-jest@^23.2.0:
+ version "23.2.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46"
+ integrity sha1-jsegOhOPABoaj7HoETZSvxpV2kY=
dependencies:
- babel-plugin-jest-hoist "^21.2.0"
+ babel-plugin-jest-hoist "^23.2.0"
babel-plugin-syntax-object-rest-spread "^6.13.0"
babel-preset-react-native@^4.0.0:
@@ -1407,7 +1437,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
babylon "^6.18.0"
lodash "^4.17.4"
-babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
dependencies:
@@ -1421,7 +1451,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
invariant "^2.2.2"
lodash "^4.17.4"
-babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
dependencies:
@@ -1492,7 +1522,7 @@ big-integer@^1.6.7:
version "1.6.26"
resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.26.tgz#3af1672fa62daf2d5ecafacf6e5aa0d25e02c1c8"
-bigi@^1.1.0, bigi@^1.4.0:
+bigi@^1.1.0, bigi@^1.2.0, bigi@^1.4.0:
version "1.4.2"
resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825"
@@ -1504,6 +1534,18 @@ bindings@^1.2.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7"
+"bip38-async@https://github.com/COINiD/bip38-async":
+ version "2.0.2"
+ resolved "https://github.com/COINiD/bip38-async#84de91f6d5516e0fa6a9b7b351bf951c7047992d"
+ dependencies:
+ bigi "^1.2.0"
+ browserify-aes "^1.0.1"
+ bs58check "<3.0.0"
+ buffer-xor "^1.0.2"
+ create-hash "^1.1.1"
+ ecurve "^1.0.0"
+ scryptsy-async "https://github.com/COINiD/scryptsy-async"
+
bip39@^2.4.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235"
@@ -1526,7 +1568,7 @@ bitcoin-ops@^1.3.0:
"bitcoinjs-lib@https://github.com/wlc-/bitcoinjs-lib":
version "3.3.0"
- resolved "https://github.com/wlc-/bitcoinjs-lib#5d62efa49eb1e3cb52cca561171fa8b2d15ebe23"
+ resolved "https://github.com/wlc-/bitcoinjs-lib#be52a2da0f56beb67a5f502d2ccd4aee9f851618"
dependencies:
bech32 "0.0.3"
bigi "^1.4.0"
@@ -1543,7 +1585,7 @@ bitcoin-ops@^1.3.0:
safe-buffer "^5.0.1"
typeforce "^1.11.3"
varuint-bitcoin "^1.0.4"
- wif "^2.0.1"
+ wif "https://github.com/COINiD/wif.git"
bitcoinjs-message@^2.0.0:
version "2.0.0"
@@ -1575,18 +1617,6 @@ boom@2.x.x:
dependencies:
hoek "2.x.x"
-boom@4.x.x:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
- dependencies:
- hoek "4.x.x"
-
-boom@5.x.x:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
- dependencies:
- hoek "4.x.x"
-
bplist-creator@0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.7.tgz#37df1536092824b87c42f957b01344117372ae45"
@@ -1618,9 +1648,15 @@ brorand@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
-browser-resolve@^1.11.2:
- version "1.11.2"
- resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+browser-process-hrtime@^0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4"
+ integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==
+
+browser-resolve@^1.11.3:
+ version "1.11.3"
+ resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
+ integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==
dependencies:
resolve "1.1.7"
@@ -1635,6 +1671,18 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6:
inherits "^2.0.1"
safe-buffer "^5.0.1"
+browserify-aes@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
browserify-cipher@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
@@ -1693,7 +1741,17 @@ buffer-equals@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/buffer-equals/-/buffer-equals-1.0.4.tgz#0353b54fd07fd9564170671ae6f66b9cf10d27f5"
-buffer-xor@^1.0.3:
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-reverse@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60"
+ integrity sha1-SSg8jvpvkBvAH6MwTQYCeXGuL2A=
+
+buffer-xor@^1.0.2, buffer-xor@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
@@ -1835,6 +1893,15 @@ cliui@^3.2.0:
strip-ansi "^3.0.1"
wrap-ansi "^2.0.0"
+cliui@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
+ integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==
+ dependencies:
+ string-width "^2.1.1"
+ strip-ansi "^4.0.0"
+ wrap-ansi "^2.0.0"
+
clone-stats@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
@@ -1853,18 +1920,19 @@ code-point-at@^1.0.0:
"coinid-address-functions@https://github.com/wlc-/coinid-address-functions.git":
version "1.0.0"
- resolved "https://github.com/wlc-/coinid-address-functions.git#9586117837bd6fd85ac7497c7d6bf994ce1514e6"
+ resolved "https://github.com/wlc-/coinid-address-functions.git#f97e21ff3bc8b78b98754455eaff885c0196784f"
"coinid-address-types@https://github.com/wlc-/coinid-address-types.git":
version "1.0.0"
- resolved "https://github.com/wlc-/coinid-address-types.git#1cf8460743eae62f3a31a08cd6051415af1adcbd"
+ resolved "https://github.com/wlc-/coinid-address-types.git#03291bbae55ffe86b9fcff795338f9b5c7f9b791"
dependencies:
coinid-address-functions "https://github.com/wlc-/coinid-address-functions.git"
-"coinid-private@https://github.com/wlc-/coinid-private.git":
+"coinid-private@https://github.com/wlc-/coinid-private":
version "1.0.1"
- resolved "https://github.com/wlc-/coinid-private.git#a08e863020db6ae5cfab528d001a9d177d714fe1"
+ resolved "https://github.com/wlc-/coinid-private#88d8c6982e2d73da32405de4e3b6a22cbd5ad43a"
dependencies:
+ bip38-async "https://github.com/COINiD/bip38-async"
bip39 "^2.4.0"
bitcoinjs-lib "https://github.com/wlc-/bitcoinjs-lib"
bitcoinjs-message "^2.0.0"
@@ -1905,6 +1973,13 @@ combined-stream@^1.0.5, combined-stream@~1.0.5:
dependencies:
delayed-stream "~1.0.0"
+combined-stream@^1.0.6, combined-stream@~1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
+ integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==
+ dependencies:
+ delayed-stream "~1.0.0"
+
commander@^2.11.0:
version "2.17.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
@@ -1981,10 +2056,6 @@ contains-path@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
-content-type-parser@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7"
-
convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0:
version "1.5.1"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
@@ -2029,6 +2100,17 @@ create-hash@^1.1.0, create-hash@^1.1.2:
ripemd160 "^2.0.0"
sha.js "^2.4.0"
+create-hash@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ 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@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.3, create-hmac@^1.1.4:
version "1.1.6"
resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
@@ -2083,19 +2165,14 @@ cryptiles@2.x.x:
dependencies:
boom "2.x.x"
-cryptiles@3.x.x:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
- dependencies:
- boom "5.x.x"
-
cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
version "0.3.2"
resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
-"cssstyle@>= 0.2.37 < 0.3.0":
- version "0.2.37"
- resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
+cssstyle@^1.0.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.1.tgz#3aceb2759eaf514ac1a21628d723d6043a819495"
+ integrity sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==
dependencies:
cssom "0.3.x"
@@ -2109,6 +2186,15 @@ dashdash@^1.12.0:
dependencies:
assert-plus "^1.0.0"
+data-urls@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe"
+ integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==
+ dependencies:
+ abab "^2.0.0"
+ whatwg-mimetype "^2.2.0"
+ whatwg-url "^7.0.0"
+
dateformat@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062"
@@ -2251,6 +2337,13 @@ dom-walk@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
+domexception@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
+ integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
+ dependencies:
+ webidl-conversions "^4.0.2"
+
drbg.js@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b"
@@ -2328,12 +2421,6 @@ envinfo@^3.0.0:
os-name "^2.0.1"
which "^1.2.14"
-errno@^0.1.4:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026"
- dependencies:
- prr "~1.0.1"
-
error-ex@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
@@ -2347,6 +2434,18 @@ errorhandler@^1.5.0:
accepts "~1.3.3"
escape-html "~1.0.3"
+es-abstract@^1.5.1:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
+ integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
+ dependencies:
+ es-to-primitive "^1.2.0"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ is-callable "^1.1.4"
+ is-regex "^1.0.4"
+ object-keys "^1.0.12"
+
es-abstract@^1.6.1, es-abstract@^1.7.0:
version "1.12.0"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
@@ -2365,6 +2464,15 @@ es-to-primitive@^1.1.1:
is-date-object "^1.0.1"
is-symbol "^1.0.1"
+es-to-primitive@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
+ integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -2373,16 +2481,17 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
-escodegen@^1.6.1:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852"
+escodegen@^1.9.1:
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510"
+ integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==
dependencies:
esprima "^3.1.3"
estraverse "^4.2.0"
esutils "^2.0.2"
optionator "^0.8.1"
optionalDependencies:
- source-map "~0.5.6"
+ source-map "~0.6.1"
eslint-config-airbnb-base@^13.1.0:
version "13.1.0"
@@ -2607,6 +2716,11 @@ execa@^0.7.0:
signal-exit "^3.0.0"
strip-eof "^1.0.0"
+exit@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+ integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
+
expand-brackets@^0.1.4:
version "0.1.5"
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
@@ -2619,21 +2733,27 @@ expand-range@^1.8.1:
dependencies:
fill-range "^2.1.0"
-expect@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/expect/-/expect-21.2.1.tgz#003ac2ac7005c3c29e73b38a272d4afadd6d1d7b"
+expect@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98"
+ integrity sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==
dependencies:
ansi-styles "^3.2.0"
- jest-diff "^21.2.1"
- jest-get-type "^21.2.0"
- jest-matcher-utils "^21.2.1"
- jest-message-util "^21.2.1"
- jest-regex-util "^21.2.0"
+ jest-diff "^23.6.0"
+ jest-get-type "^22.1.0"
+ jest-matcher-utils "^23.6.0"
+ jest-message-util "^23.4.0"
+ jest-regex-util "^23.3.0"
-extend@~3.0.0, extend@~3.0.1:
+extend@~3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
external-editor@^2.0.1, external-editor@^2.0.4:
version "2.1.0"
resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48"
@@ -2672,10 +2792,6 @@ fancy-log@^1.1.0:
color-support "^1.1.3"
time-stamp "^1.0.0"
-fast-deep-equal@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
-
fast-deep-equal@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
@@ -2833,12 +2949,13 @@ form-data@~2.1.1:
combined-stream "^1.0.5"
mime-types "^2.1.12"
-form-data@~2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf"
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
dependencies:
asynckit "^0.4.0"
- combined-stream "^1.0.5"
+ combined-stream "^1.0.6"
mime-types "^2.1.12"
fresh@0.5.2:
@@ -3060,11 +3177,12 @@ har-validator@~4.2.1:
ajv "^4.9.1"
har-schema "^1.0.5"
-har-validator@~5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
+har-validator@~5.1.0:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
+ integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
dependencies:
- ajv "^5.1.0"
+ ajv "^6.5.5"
har-schema "^2.0.0"
has-ansi@^2.0.0:
@@ -3134,15 +3252,6 @@ hawk@3.1.3, hawk@~3.1.3:
hoek "2.x.x"
sntp "1.x.x"
-hawk@~6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
- dependencies:
- boom "4.x.x"
- cryptiles "3.x.x"
- hoek "4.x.x"
- sntp "2.x.x"
-
hmac-drbg@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@@ -3155,10 +3264,6 @@ hoek@2.x.x:
version "2.16.3"
resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
-hoek@4.x.x:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d"
-
hoist-non-react-statics@^2.2.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz#343db84c6018c650778898240135a1420ee22ce0"
@@ -3186,9 +3291,10 @@ hosted-git-info@^2.1.4:
version "2.5.0"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
-html-encoding-sniffer@^1.0.1:
+html-encoding-sniffer@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
+ integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==
dependencies:
whatwg-encoding "^1.0.1"
@@ -3221,7 +3327,7 @@ iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@^0.4.8, iconv-lite@~0.4.13:
version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
-iconv-lite@^0.4.24:
+iconv-lite@0.4.24, iconv-lite@^0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
dependencies:
@@ -3239,6 +3345,14 @@ image-size@^0.6.0:
version "0.6.2"
resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.2.tgz#8ee316d4298b028b965091b673d5f1537adee5b4"
+import-local@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
+ integrity sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==
+ dependencies:
+ pkg-dir "^2.0.0"
+ resolve-cwd "^2.0.0"
+
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
@@ -3321,7 +3435,7 @@ inquirer@^6.1.0:
strip-ansi "^4.0.0"
through "^2.3.6"
-invariant@^2.2.0:
+invariant@^2.2.0, invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
dependencies:
@@ -3351,7 +3465,7 @@ is-builtin-module@^1.0.0:
dependencies:
builtin-modules "^1.0.0"
-is-callable@^1.1.1, is-callable@^1.1.3:
+is-callable@^1.1.1, is-callable@^1.1.3, is-callable@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
@@ -3399,6 +3513,11 @@ is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+is-generator-fn@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a"
+ integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=
+
is-glob@^2.0.0, is-glob@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@@ -3463,6 +3582,13 @@ is-symbol@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+is-symbol@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
+ integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==
+ dependencies:
+ has-symbols "^1.0.0"
+
is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
@@ -3508,133 +3634,154 @@ isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
-istanbul-api@^1.1.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620"
+istanbul-api@^1.3.1:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa"
+ integrity sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==
dependencies:
async "^2.1.4"
fileset "^2.0.2"
- istanbul-lib-coverage "^1.1.1"
- istanbul-lib-hook "^1.1.0"
- istanbul-lib-instrument "^1.9.1"
- istanbul-lib-report "^1.1.2"
- istanbul-lib-source-maps "^1.2.2"
- istanbul-reports "^1.1.3"
+ istanbul-lib-coverage "^1.2.1"
+ istanbul-lib-hook "^1.2.2"
+ istanbul-lib-instrument "^1.10.2"
+ istanbul-lib-report "^1.1.5"
+ istanbul-lib-source-maps "^1.2.6"
+ istanbul-reports "^1.5.1"
js-yaml "^3.7.0"
mkdirp "^0.5.1"
once "^1.4.0"
-istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
+istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0"
+ integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==
-istanbul-lib-hook@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b"
+istanbul-lib-hook@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86"
+ integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==
dependencies:
append-transform "^0.4.0"
-istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.9.1:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e"
+istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca"
+ integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==
dependencies:
babel-generator "^6.18.0"
babel-template "^6.16.0"
babel-traverse "^6.18.0"
babel-types "^6.18.0"
babylon "^6.18.0"
- istanbul-lib-coverage "^1.1.1"
+ istanbul-lib-coverage "^1.2.1"
semver "^5.3.0"
-istanbul-lib-report@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425"
+istanbul-lib-report@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c"
+ integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==
dependencies:
- istanbul-lib-coverage "^1.1.1"
+ istanbul-lib-coverage "^1.2.1"
mkdirp "^0.5.1"
path-parse "^1.0.5"
supports-color "^3.1.2"
-istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c"
+istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f"
+ integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==
dependencies:
debug "^3.1.0"
- istanbul-lib-coverage "^1.1.1"
+ istanbul-lib-coverage "^1.2.1"
mkdirp "^0.5.1"
rimraf "^2.6.1"
source-map "^0.5.3"
-istanbul-reports@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10"
+istanbul-reports@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a"
+ integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==
dependencies:
handlebars "^4.0.3"
-jest-changed-files@^21.2.0:
- version "21.2.0"
- resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-21.2.0.tgz#5dbeecad42f5d88b482334902ce1cba6d9798d29"
+jest-changed-files@^23.4.2:
+ version "23.4.2"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83"
+ integrity sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==
dependencies:
throat "^4.0.0"
-jest-cli@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-21.2.1.tgz#9c528b6629d651911138d228bdb033c157ec8c00"
+jest-cli@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4"
+ integrity sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==
dependencies:
ansi-escapes "^3.0.0"
chalk "^2.0.1"
+ exit "^0.1.2"
glob "^7.1.2"
graceful-fs "^4.1.11"
+ import-local "^1.0.0"
is-ci "^1.0.10"
- istanbul-api "^1.1.1"
- istanbul-lib-coverage "^1.0.1"
- istanbul-lib-instrument "^1.4.2"
- istanbul-lib-source-maps "^1.1.0"
- jest-changed-files "^21.2.0"
- jest-config "^21.2.1"
- jest-environment-jsdom "^21.2.1"
- jest-haste-map "^21.2.0"
- jest-message-util "^21.2.1"
- jest-regex-util "^21.2.0"
- jest-resolve-dependencies "^21.2.0"
- jest-runner "^21.2.1"
- jest-runtime "^21.2.1"
- jest-snapshot "^21.2.1"
- jest-util "^21.2.1"
+ istanbul-api "^1.3.1"
+ istanbul-lib-coverage "^1.2.0"
+ istanbul-lib-instrument "^1.10.1"
+ istanbul-lib-source-maps "^1.2.4"
+ jest-changed-files "^23.4.2"
+ jest-config "^23.6.0"
+ jest-environment-jsdom "^23.4.0"
+ jest-get-type "^22.1.0"
+ jest-haste-map "^23.6.0"
+ jest-message-util "^23.4.0"
+ jest-regex-util "^23.3.0"
+ jest-resolve-dependencies "^23.6.0"
+ jest-runner "^23.6.0"
+ jest-runtime "^23.6.0"
+ jest-snapshot "^23.6.0"
+ jest-util "^23.4.0"
+ jest-validate "^23.6.0"
+ jest-watcher "^23.4.0"
+ jest-worker "^23.2.0"
micromatch "^2.3.11"
- node-notifier "^5.0.2"
- pify "^3.0.0"
+ node-notifier "^5.2.1"
+ prompts "^0.1.9"
+ realpath-native "^1.0.0"
+ rimraf "^2.5.4"
slash "^1.0.0"
string-length "^2.0.0"
strip-ansi "^4.0.0"
which "^1.2.12"
- worker-farm "^1.3.1"
- yargs "^9.0.0"
+ yargs "^11.0.0"
-jest-config@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-21.2.1.tgz#c7586c79ead0bcc1f38c401e55f964f13bf2a480"
+jest-config@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d"
+ integrity sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==
dependencies:
+ babel-core "^6.0.0"
+ babel-jest "^23.6.0"
chalk "^2.0.1"
glob "^7.1.1"
- jest-environment-jsdom "^21.2.1"
- jest-environment-node "^21.2.1"
- jest-get-type "^21.2.0"
- jest-jasmine2 "^21.2.1"
- jest-regex-util "^21.2.0"
- jest-resolve "^21.2.0"
- jest-util "^21.2.1"
- jest-validate "^21.2.1"
- pretty-format "^21.2.1"
-
-jest-diff@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-21.2.1.tgz#46cccb6cab2d02ce98bc314011764bb95b065b4f"
+ jest-environment-jsdom "^23.4.0"
+ jest-environment-node "^23.4.0"
+ jest-get-type "^22.1.0"
+ jest-jasmine2 "^23.6.0"
+ jest-regex-util "^23.3.0"
+ jest-resolve "^23.6.0"
+ jest-util "^23.4.0"
+ jest-validate "^23.6.0"
+ micromatch "^2.3.11"
+ pretty-format "^23.6.0"
+
+jest-diff@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d"
+ integrity sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==
dependencies:
chalk "^2.0.1"
diff "^3.2.0"
- jest-get-type "^21.2.0"
- pretty-format "^21.2.1"
+ jest-get-type "^22.1.0"
+ pretty-format "^23.6.0"
jest-docblock@22.4.0:
version "22.4.0"
@@ -3642,34 +3789,48 @@ jest-docblock@22.4.0:
dependencies:
detect-newline "^2.1.0"
-jest-docblock@^21.2.0:
- version "21.2.0"
- resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414"
-
jest-docblock@^22.4.0:
version "22.4.3"
resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.4.3.tgz#50886f132b42b280c903c592373bb6e93bb68b19"
dependencies:
detect-newline "^2.1.0"
-jest-environment-jsdom@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz#38d9980c8259b2a608ec232deee6289a60d9d5b4"
+jest-docblock@^23.2.0:
+ version "23.2.0"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7"
+ integrity sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=
+ dependencies:
+ detect-newline "^2.1.0"
+
+jest-each@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575"
+ integrity sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==
+ dependencies:
+ chalk "^2.0.1"
+ pretty-format "^23.6.0"
+
+jest-environment-jsdom@^23.4.0:
+ version "23.4.0"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023"
+ integrity sha1-BWp5UrP+pROsYqFAosNox52eYCM=
dependencies:
- jest-mock "^21.2.0"
- jest-util "^21.2.1"
- jsdom "^9.12.0"
+ jest-mock "^23.2.0"
+ jest-util "^23.4.0"
+ jsdom "^11.5.1"
-jest-environment-node@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-21.2.1.tgz#98c67df5663c7fbe20f6e792ac2272c740d3b8c8"
+jest-environment-node@^23.4.0:
+ version "23.4.0"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10"
+ integrity sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=
dependencies:
- jest-mock "^21.2.0"
- jest-util "^21.2.1"
+ jest-mock "^23.2.0"
+ jest-util "^23.4.0"
-jest-get-type@^21.2.0:
- version "21.2.0"
- resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23"
+jest-get-type@^22.1.0:
+ version "22.4.3"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4"
+ integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==
jest-haste-map@22.4.2:
version "22.4.2"
@@ -3683,140 +3844,195 @@ jest-haste-map@22.4.2:
micromatch "^2.3.11"
sane "^2.0.0"
-jest-haste-map@^21.2.0:
- version "21.2.0"
- resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-21.2.0.tgz#1363f0a8bb4338f24f001806571eff7a4b2ff3d8"
+jest-haste-map@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16"
+ integrity sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==
dependencies:
fb-watchman "^2.0.0"
graceful-fs "^4.1.11"
- jest-docblock "^21.2.0"
+ invariant "^2.2.4"
+ jest-docblock "^23.2.0"
+ jest-serializer "^23.0.1"
+ jest-worker "^23.2.0"
micromatch "^2.3.11"
sane "^2.0.0"
- worker-farm "^1.3.1"
-jest-jasmine2@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz#9cc6fc108accfa97efebce10c4308548a4ea7592"
+jest-jasmine2@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0"
+ integrity sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==
dependencies:
+ babel-traverse "^6.0.0"
chalk "^2.0.1"
- expect "^21.2.1"
- graceful-fs "^4.1.11"
- jest-diff "^21.2.1"
- jest-matcher-utils "^21.2.1"
- jest-message-util "^21.2.1"
- jest-snapshot "^21.2.1"
- p-cancelable "^0.3.0"
-
-jest-matcher-utils@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz#72c826eaba41a093ac2b4565f865eb8475de0f64"
+ co "^4.6.0"
+ expect "^23.6.0"
+ is-generator-fn "^1.0.0"
+ jest-diff "^23.6.0"
+ jest-each "^23.6.0"
+ jest-matcher-utils "^23.6.0"
+ jest-message-util "^23.4.0"
+ jest-snapshot "^23.6.0"
+ jest-util "^23.4.0"
+ pretty-format "^23.6.0"
+
+jest-leak-detector@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de"
+ integrity sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==
+ dependencies:
+ pretty-format "^23.6.0"
+
+jest-matcher-utils@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80"
+ integrity sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==
dependencies:
chalk "^2.0.1"
- jest-get-type "^21.2.0"
- pretty-format "^21.2.1"
+ jest-get-type "^22.1.0"
+ pretty-format "^23.6.0"
-jest-message-util@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-21.2.1.tgz#bfe5d4692c84c827d1dcf41823795558f0a1acbe"
+jest-message-util@^23.4.0:
+ version "23.4.0"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f"
+ integrity sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=
dependencies:
+ "@babel/code-frame" "^7.0.0-beta.35"
chalk "^2.0.1"
micromatch "^2.3.11"
slash "^1.0.0"
+ stack-utils "^1.0.1"
-jest-mock@^21.2.0:
- version "21.2.0"
- resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-21.2.0.tgz#7eb0770e7317968165f61ea2a7281131534b3c0f"
+jest-mock@^23.2.0:
+ version "23.2.0"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134"
+ integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=
-jest-regex-util@^21.2.0:
- version "21.2.0"
- resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-21.2.0.tgz#1b1e33e63143babc3e0f2e6c9b5ba1eb34b2d530"
+jest-regex-util@^23.3.0:
+ version "23.3.0"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5"
+ integrity sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=
-jest-resolve-dependencies@^21.2.0:
- version "21.2.0"
- resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz#9e231e371e1a736a1ad4e4b9a843bc72bfe03d09"
+jest-resolve-dependencies@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d"
+ integrity sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==
dependencies:
- jest-regex-util "^21.2.0"
+ jest-regex-util "^23.3.0"
+ jest-snapshot "^23.6.0"
-jest-resolve@^21.2.0:
- version "21.2.0"
- resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-21.2.0.tgz#068913ad2ba6a20218e5fd32471f3874005de3a6"
+jest-resolve@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae"
+ integrity sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==
dependencies:
- browser-resolve "^1.11.2"
+ browser-resolve "^1.11.3"
chalk "^2.0.1"
- is-builtin-module "^1.0.0"
+ realpath-native "^1.0.0"
-jest-runner@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-21.2.1.tgz#194732e3e518bfb3d7cbfc0fd5871246c7e1a467"
- dependencies:
- jest-config "^21.2.1"
- jest-docblock "^21.2.0"
- jest-haste-map "^21.2.0"
- jest-jasmine2 "^21.2.1"
- jest-message-util "^21.2.1"
- jest-runtime "^21.2.1"
- jest-util "^21.2.1"
- pify "^3.0.0"
+jest-runner@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38"
+ integrity sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==
+ dependencies:
+ exit "^0.1.2"
+ graceful-fs "^4.1.11"
+ jest-config "^23.6.0"
+ jest-docblock "^23.2.0"
+ jest-haste-map "^23.6.0"
+ jest-jasmine2 "^23.6.0"
+ jest-leak-detector "^23.6.0"
+ jest-message-util "^23.4.0"
+ jest-runtime "^23.6.0"
+ jest-util "^23.4.0"
+ jest-worker "^23.2.0"
+ source-map-support "^0.5.6"
throat "^4.0.0"
- worker-farm "^1.3.1"
-jest-runtime@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-21.2.1.tgz#99dce15309c670442eee2ebe1ff53a3cbdbbb73e"
+jest-runtime@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082"
+ integrity sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==
dependencies:
babel-core "^6.0.0"
- babel-jest "^21.2.0"
- babel-plugin-istanbul "^4.0.0"
+ babel-plugin-istanbul "^4.1.6"
chalk "^2.0.1"
convert-source-map "^1.4.0"
+ exit "^0.1.2"
+ fast-json-stable-stringify "^2.0.0"
graceful-fs "^4.1.11"
- jest-config "^21.2.1"
- jest-haste-map "^21.2.0"
- jest-regex-util "^21.2.0"
- jest-resolve "^21.2.0"
- jest-util "^21.2.1"
- json-stable-stringify "^1.0.1"
+ jest-config "^23.6.0"
+ jest-haste-map "^23.6.0"
+ jest-message-util "^23.4.0"
+ jest-regex-util "^23.3.0"
+ jest-resolve "^23.6.0"
+ jest-snapshot "^23.6.0"
+ jest-util "^23.4.0"
+ jest-validate "^23.6.0"
micromatch "^2.3.11"
+ realpath-native "^1.0.0"
slash "^1.0.0"
strip-bom "3.0.0"
write-file-atomic "^2.1.0"
- yargs "^9.0.0"
+ yargs "^11.0.0"
jest-serializer@^22.4.0:
version "22.4.3"
resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-22.4.3.tgz#a679b81a7f111e4766235f4f0c46d230ee0f7436"
-jest-snapshot@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-21.2.1.tgz#29e49f16202416e47343e757e5eff948c07fd7b0"
+jest-serializer@^23.0.1:
+ version "23.0.1"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165"
+ integrity sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=
+
+jest-snapshot@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a"
+ integrity sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==
dependencies:
+ babel-types "^6.0.0"
chalk "^2.0.1"
- jest-diff "^21.2.1"
- jest-matcher-utils "^21.2.1"
+ jest-diff "^23.6.0"
+ jest-matcher-utils "^23.6.0"
+ jest-message-util "^23.4.0"
+ jest-resolve "^23.6.0"
mkdirp "^0.5.1"
natural-compare "^1.4.0"
- pretty-format "^21.2.1"
+ pretty-format "^23.6.0"
+ semver "^5.5.0"
-jest-util@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-21.2.1.tgz#a274b2f726b0897494d694a6c3d6a61ab819bb78"
+jest-util@^23.4.0:
+ version "23.4.0"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561"
+ integrity sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=
dependencies:
callsites "^2.0.0"
chalk "^2.0.1"
graceful-fs "^4.1.11"
- jest-message-util "^21.2.1"
- jest-mock "^21.2.0"
- jest-validate "^21.2.1"
+ is-ci "^1.0.10"
+ jest-message-util "^23.4.0"
mkdirp "^0.5.1"
+ slash "^1.0.0"
+ source-map "^0.6.0"
-jest-validate@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7"
+jest-validate@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474"
+ integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==
dependencies:
chalk "^2.0.1"
- jest-get-type "^21.2.0"
+ jest-get-type "^22.1.0"
leven "^2.1.0"
- pretty-format "^21.2.1"
+ pretty-format "^23.6.0"
+
+jest-watcher@^23.4.0:
+ version "23.4.0"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c"
+ integrity sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=
+ dependencies:
+ ansi-escapes "^3.0.0"
+ chalk "^2.0.1"
+ string-length "^2.0.0"
jest-worker@22.2.2:
version "22.2.2"
@@ -3830,11 +4046,20 @@ jest-worker@^22.2.2:
dependencies:
merge-stream "^1.0.1"
-jest@21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/jest/-/jest-21.2.1.tgz#c964e0b47383768a1438e3ccf3c3d470327604e1"
+jest-worker@^23.2.0:
+ version "23.2.0"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9"
+ integrity sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=
dependencies:
- jest-cli "^21.2.1"
+ merge-stream "^1.0.1"
+
+jest@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d"
+ integrity sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==
+ dependencies:
+ import-local "^1.0.0"
+ jest-cli "^23.6.0"
js-beautify@^1.7.4:
version "1.7.5"
@@ -3871,29 +4096,37 @@ jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
-jsdom@^9.12.0:
- version "9.12.0"
- resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4"
+jsdom@^11.5.1:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8"
+ integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==
dependencies:
- abab "^1.0.3"
- acorn "^4.0.4"
- acorn-globals "^3.1.0"
+ abab "^2.0.0"
+ acorn "^5.5.3"
+ acorn-globals "^4.1.0"
array-equal "^1.0.0"
- content-type-parser "^1.0.1"
cssom ">= 0.3.2 < 0.4.0"
- cssstyle ">= 0.2.37 < 0.3.0"
- escodegen "^1.6.1"
- html-encoding-sniffer "^1.0.1"
- nwmatcher ">= 1.3.9 < 2.0.0"
- parse5 "^1.5.1"
- request "^2.79.0"
- sax "^1.2.1"
- symbol-tree "^3.2.1"
- tough-cookie "^2.3.2"
- webidl-conversions "^4.0.0"
- whatwg-encoding "^1.0.1"
- whatwg-url "^4.3.0"
- xml-name-validator "^2.0.1"
+ cssstyle "^1.0.0"
+ data-urls "^1.0.0"
+ domexception "^1.0.1"
+ escodegen "^1.9.1"
+ html-encoding-sniffer "^1.0.2"
+ left-pad "^1.3.0"
+ nwsapi "^2.0.7"
+ parse5 "4.0.0"
+ pn "^1.1.0"
+ request "^2.87.0"
+ request-promise-native "^1.0.5"
+ sax "^1.2.4"
+ symbol-tree "^3.2.2"
+ tough-cookie "^2.3.4"
+ w3c-hr-time "^1.0.1"
+ webidl-conversions "^4.0.2"
+ whatwg-encoding "^1.0.3"
+ whatwg-mimetype "^2.1.0"
+ whatwg-url "^6.4.1"
+ ws "^5.2.0"
+ xml-name-validator "^3.0.0"
jsesc@^1.3.0:
version "1.3.0"
@@ -3907,10 +4140,6 @@ jsesc@~0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
-json-schema-traverse@^0.3.0:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
-
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
@@ -3984,6 +4213,11 @@ klaw@^1.0.0:
optionalDependencies:
graceful-fs "^4.1.9"
+kleur@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300"
+ integrity sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==
+
lazy-cache@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
@@ -3998,6 +4232,11 @@ left-pad@^1.1.3:
version "1.2.0"
resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee"
+left-pad@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
+ integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==
+
leven@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
@@ -4117,6 +4356,11 @@ lodash.restparam@^3.0.0:
version "3.6.1"
resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
+lodash.sortby@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+ integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
+
lodash.template@^3.0.0:
version "3.6.2"
resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
@@ -4162,6 +4406,11 @@ lodash@^4.17.10, lodash@^4.17.5, lodash@^4.2.0:
version "4.17.10"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+lodash@^4.17.11:
+ version "4.17.11"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
+ integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
+
longest@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
@@ -4412,13 +4661,18 @@ mime-db@~1.30.0:
version "1.30.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
+mime-db@~1.38.0:
+ version "1.38.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad"
+ integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==
+
mime-types@2.1.11:
version "2.1.11"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c"
dependencies:
mime-db "~1.23.0"
-mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7:
+mime-types@^2.1.12, mime-types@~2.1.7:
version "2.1.17"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
dependencies:
@@ -4430,6 +4684,13 @@ mime-types@~2.1.18:
dependencies:
mime-db "~1.35.0"
+mime-types@~2.1.19:
+ version "2.1.22"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd"
+ integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==
+ dependencies:
+ mime-db "~1.38.0"
+
mime@1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
@@ -4550,15 +4811,6 @@ node-modules-regexp@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
-node-notifier@^5.0.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff"
- dependencies:
- growly "^1.3.0"
- semver "^5.3.0"
- shellwords "^0.1.0"
- which "^1.2.12"
-
node-notifier@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea"
@@ -4645,14 +4897,20 @@ numbro@^2.1.0:
dependencies:
bignumber.js "^4.0.4"
-"nwmatcher@>= 1.3.9 < 2.0.0":
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c"
+nwsapi@^2.0.7:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.1.tgz#08d6d75e69fd791bdea31507ffafe8c843b67e9c"
+ integrity sha512-T5GaA1J/d34AC8mkrFD2O0DR17kwJ702ZOtJOsS8RpbsQZVOC2/xYFb1i/cw+xdM54JIlMuojjDOYct8GIWtwg==
-oauth-sign@~0.8.1, oauth-sign@~0.8.2:
+oauth-sign@~0.8.1:
version "0.8.2"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
object-assign@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
@@ -4683,6 +4941,14 @@ object.entries@^1.0.4:
function-bind "^1.1.0"
has "^1.0.1"
+object.getownpropertydescriptors@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
+ integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.5.1"
+
object.omit@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
@@ -4794,10 +5060,6 @@ osenv@^0.1.4:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
-p-cancelable@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
-
p-finally@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
@@ -4847,9 +5109,10 @@ parse-json@^2.2.0:
dependencies:
error-ex "^1.2.0"
-parse5@^1.5.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94"
+parse5@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
+ integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==
parseurl@~1.3.2:
version "1.3.2"
@@ -4998,6 +5261,11 @@ pluralize@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+pn@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
+ integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
+
pngjs@^3.3.0:
version "3.3.3"
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b"
@@ -5010,9 +5278,10 @@ preserve@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
-pretty-format@^21.2.1:
- version "21.2.1"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36"
+pretty-format@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760"
+ integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==
dependencies:
ansi-regex "^3.0.0"
ansi-styles "^3.2.0"
@@ -5043,6 +5312,14 @@ promise@^7.1.1:
dependencies:
asap "~2.0.3"
+prompts@^0.1.9:
+ version "0.1.14"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2"
+ integrity sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==
+ dependencies:
+ kleur "^2.0.1"
+ sisteransi "^0.1.1"
+
prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0:
version "15.6.0"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856"
@@ -5062,14 +5339,15 @@ proto-list@~1.2.1:
version "1.2.4"
resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
-prr@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
-
pseudomap@^1.0.1, pseudomap@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+psl@^1.1.24, psl@^1.1.28:
+ version "1.1.31"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184"
+ integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==
+
public-encrypt@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
@@ -5084,7 +5362,7 @@ punycode@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
-punycode@^2.1.0:
+punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
@@ -5108,9 +5386,10 @@ qs@~6.4.0:
version "6.4.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
-qs@~6.5.1:
- version "6.5.1"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
query-string@^6.1.0:
version "6.1.0"
@@ -5166,6 +5445,11 @@ react-devtools-core@3.1.0:
shell-quote "^1.6.1"
ws "^2.0.3"
+react-is@^16.3.1:
+ version "16.8.4"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.4.tgz#90f336a68c3a29a096a3d648ab80e87ec61482a2"
+ integrity sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==
+
react-lifecycles-compat@^3, react-lifecycles-compat@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
@@ -5234,6 +5518,11 @@ react-native-iphone-x-helper@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.2.0.tgz#9f8a376eb00bc712115abff4420318a0063fa796"
+react-native-keep-awake@3:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/react-native-keep-awake/-/react-native-keep-awake-3.2.0.tgz#2f025fe0bd2ac63b5e61c18ef9cad240f203df1f"
+ integrity sha512-0AuCp9oAoXH244hbUOeHgcJ4e/t+dEweTasNrp52ytA1nvCD69eAjbBL5B3aJhPSKUqwlUO9II5M26DtKd71bg==
+
react-native-keychain@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/react-native-keychain/-/react-native-keychain-3.0.0.tgz#29da1dfa43c2581f76bf9420914fd38a1558cf18"
@@ -5271,6 +5560,14 @@ react-native-qrcode-scanner@^1.1.0:
prop-types "^15.5.10"
react-native-permissions "^1.1.1"
+react-native-qrcode-scanner@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/react-native-qrcode-scanner/-/react-native-qrcode-scanner-1.1.2.tgz#5b6dfb4efd267a810bedb1f09b7c9ccb6d321e20"
+ integrity sha512-ID/s6za6N1m+V5dgzGZYr+rf9txuTYEnqqkowR8hujm9ddPRJEkXXGkoR6Y18WnpDGS7eDEt2BNPLXFkLLYhvQ==
+ dependencies:
+ prop-types "^15.5.10"
+ react-native-permissions "^1.1.1"
+
react-native-qrcode-svg@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/react-native-qrcode-svg/-/react-native-qrcode-svg-5.1.1.tgz#f7dc136cb9de2b7b488a51e27048f6bb3c1ed94c"
@@ -5473,12 +5770,15 @@ react-proxy@^1.1.7:
lodash "^4.6.1"
react-deep-force-update "^1.0.0"
-react-test-renderer@16.0.0:
- version "16.0.0"
- resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.0.0.tgz#9fe7b8308f2f71f29fc356d4102086f131c9cb15"
+react-test-renderer@16.3.1:
+ version "16.3.1"
+ resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.3.1.tgz#d9257936d8535bd40f57f3d5a84e7b0452fb17f2"
+ integrity sha512-emEcIPUowMjT5EQ+rrb0FAwVCzuJ+LKDweoYDh073v2/jHxrBDPUk8nzI5dofG3R+140+Bb9TMcT2Ez5OP6pQw==
dependencies:
fbjs "^0.8.16"
object-assign "^4.1.1"
+ prop-types "^15.6.0"
+ react-is "^16.3.1"
react-timer-mixin@^0.13.2:
version "0.13.3"
@@ -5551,6 +5851,13 @@ readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.1.4, readable
string_decoder "~1.0.3"
util-deprecate "~1.0.1"
+realpath-native@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c"
+ integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==
+ dependencies:
+ util.promisify "^1.0.0"
+
regenerate@^1.2.1:
version "1.3.3"
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
@@ -5627,6 +5934,22 @@ replace-ext@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
+request-promise-core@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346"
+ integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==
+ dependencies:
+ lodash "^4.17.11"
+
+request-promise-native@^1.0.5:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59"
+ integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==
+ dependencies:
+ request-promise-core "1.1.2"
+ stealthy-require "^1.1.1"
+ tough-cookie "^2.3.3"
+
request@2.81.0:
version "2.81.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
@@ -5654,32 +5977,31 @@ request@2.81.0:
tunnel-agent "^0.6.0"
uuid "^3.0.0"
-request@^2.79.0:
- version "2.83.0"
- resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
+request@^2.87.0:
+ version "2.88.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
+ integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
dependencies:
aws-sign2 "~0.7.0"
- aws4 "^1.6.0"
+ aws4 "^1.8.0"
caseless "~0.12.0"
- combined-stream "~1.0.5"
- extend "~3.0.1"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
forever-agent "~0.6.1"
- form-data "~2.3.1"
- har-validator "~5.0.3"
- hawk "~6.0.2"
+ form-data "~2.3.2"
+ har-validator "~5.1.0"
http-signature "~1.2.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
json-stringify-safe "~5.0.1"
- mime-types "~2.1.17"
- oauth-sign "~0.8.2"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
performance-now "^2.1.0"
- qs "~6.5.1"
- safe-buffer "^5.1.1"
- stringstream "~0.0.5"
- tough-cookie "~2.3.3"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.4.3"
tunnel-agent "^0.6.0"
- uuid "^3.1.0"
+ uuid "^3.3.2"
require-directory@^2.1.1:
version "2.1.1"
@@ -5696,10 +6018,22 @@ require-uncached@^1.0.3:
caller-path "^0.1.0"
resolve-from "^1.0.0"
+resolve-cwd@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+ integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
+ dependencies:
+ resolve-from "^3.0.0"
+
resolve-from@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+resolve-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+ integrity sha1-six699nWiBvItuZTM17rywoYh0g=
+
resolve@1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
@@ -5788,7 +6122,7 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s
version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
-safe-buffer@5.1.2:
+safe-buffer@5.1.2, safe-buffer@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@@ -5814,14 +6148,19 @@ sane@^2.0.0:
optionalDependencies:
fsevents "^1.1.1"
-sax@^1.2.1:
+sax@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
sax@~1.1.1:
version "1.1.6"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240"
+"scryptsy-async@https://github.com/COINiD/scryptsy-async":
+ version "2.0.0"
+ resolved "https://github.com/COINiD/scryptsy-async#ad47ddcc7da820cd520183f2607ca242b82b84c9"
+
secp256k1@^3.0.1:
version "3.5.0"
resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.5.0.tgz#677d3b8a8e04e1a5fa381a1ae437c54207b738d0"
@@ -5912,7 +6251,7 @@ shell-quote@1.6.1, shell-quote@^1.6.1:
array-reduce "~0.0.0"
jsonify "~0.0.0"
-shellwords@^0.1.0, shellwords@^0.1.1:
+shellwords@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
@@ -5932,6 +6271,11 @@ simple-plist@^0.2.1:
bplist-parser "0.1.1"
plist "2.0.1"
+sisteransi@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce"
+ integrity sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==
+
sjcl@^1.0.3:
version "1.0.7"
resolved "https://registry.yarnpkg.com/sjcl/-/sjcl-1.0.7.tgz#32b365a50dc9bba26b88ba3c9df8ea34217d9f45"
@@ -5956,29 +6300,31 @@ sntp@1.x.x:
dependencies:
hoek "2.x.x"
-sntp@2.x.x:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
- dependencies:
- hoek "4.x.x"
-
source-map-support@^0.4.15, source-map-support@^0.4.2:
version "0.4.18"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
dependencies:
source-map "^0.5.6"
+source-map-support@^0.5.6:
+ version "0.5.10"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c"
+ integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
source-map@^0.4.4:
version "0.4.4"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
dependencies:
amdefine ">=0.0.4"
-source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.6:
+source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
-source-map@~0.6.1:
+source-map@^0.6.0, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
@@ -6018,6 +6364,11 @@ sshpk@^1.7.0:
jsbn "~0.1.0"
tweetnacl "~0.14.0"
+stack-utils@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
+ integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
+
stacktrace-parser@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.4.tgz#01397922e5f62ecf30845522c95c4fe1d25e7d4e"
@@ -6034,6 +6385,11 @@ statuses@~1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+stealthy-require@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+ integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
+
stream-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-1.0.0.tgz#bf9b4abfb42b274d751479e44e0ff2656b6f1193"
@@ -6081,7 +6437,7 @@ string_decoder@~1.0.3:
dependencies:
safe-buffer "~5.1.0"
-stringstream@~0.0.4, stringstream@~0.0.5:
+stringstream@~0.0.4:
version "0.0.5"
resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
@@ -6137,9 +6493,10 @@ supports-color@^5.3.0:
dependencies:
has-flag "^3.0.0"
-symbol-tree@^3.2.1:
+symbol-tree@^3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
+ integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=
sync-exec@~0.6.x:
version "0.6.2"
@@ -6184,9 +6541,10 @@ temp@0.8.3:
os-tmpdir "^1.0.0"
rimraf "~2.2.6"
-test-exclude@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26"
+test-exclude@^4.2.1:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20"
+ integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==
dependencies:
arrify "^1.0.1"
micromatch "^2.3.11"
@@ -6235,15 +6593,34 @@ to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
-tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3:
+tough-cookie@^2.3.3, tough-cookie@^2.3.4:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+tough-cookie@~2.3.0:
version "2.3.3"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
dependencies:
punycode "^1.4.1"
-tr46@~0.0.3:
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+tough-cookie@~2.4.3:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
+ integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
+ dependencies:
+ psl "^1.1.24"
+ punycode "^1.4.1"
+
+tr46@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+ integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=
+ dependencies:
+ punycode "^2.1.0"
trim-right@^1.0.1:
version "1.0.1"
@@ -6335,6 +6712,14 @@ util-deprecate@1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+util.promisify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+ integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
+ dependencies:
+ define-properties "^1.1.2"
+ object.getownpropertydescriptors "^2.0.3"
+
util@0.10.3:
version "0.10.3"
resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
@@ -6349,10 +6734,15 @@ uuid@3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
-uuid@^3.0.0, uuid@^3.1.0:
+uuid@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
+uuid@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+ integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
+
validate-npm-package-license@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
@@ -6392,6 +6782,13 @@ vm-browserify@0.0.4:
dependencies:
indexof "0.0.1"
+w3c-hr-time@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
+ integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=
+ dependencies:
+ browser-process-hrtime "^0.1.2"
+
walker@~1.0.5:
version "1.0.7"
resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
@@ -6405,13 +6802,10 @@ watch@~0.18.0:
exec-sh "^0.2.0"
minimist "^1.2.0"
-webidl-conversions@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
-
-webidl-conversions@^4.0.0:
+webidl-conversions@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+ integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
whatwg-encoding@^1.0.1:
version "1.0.3"
@@ -6419,6 +6813,13 @@ whatwg-encoding@^1.0.1:
dependencies:
iconv-lite "0.4.19"
+whatwg-encoding@^1.0.3:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
+ integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
+ dependencies:
+ iconv-lite "0.4.24"
+
whatwg-fetch@>=0.10.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
@@ -6427,12 +6828,28 @@ whatwg-fetch@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.1.1.tgz#ac3c9d39f320c6dce5339969d054ef43dd333319"
-whatwg-url@^4.3.0:
- version "4.8.0"
- resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0"
+whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
+ integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+
+whatwg-url@^6.4.1:
+ version "6.5.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8"
+ integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==
dependencies:
- tr46 "~0.0.3"
- webidl-conversions "^3.0.0"
+ lodash.sortby "^4.7.0"
+ tr46 "^1.0.1"
+ webidl-conversions "^4.0.2"
+
+whatwg-url@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd"
+ integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==
+ dependencies:
+ lodash.sortby "^4.7.0"
+ tr46 "^1.0.1"
+ webidl-conversions "^4.0.2"
which-module@^2.0.0:
version "2.0.0"
@@ -6456,11 +6873,12 @@ wide-align@^1.1.0:
dependencies:
string-width "^1.0.2"
-wif@^2.0.1:
+"wif@https://github.com/COINiD/wif.git":
version "2.0.6"
- resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704"
+ resolved "https://github.com/COINiD/wif.git#6193f3b40f64d813d02638a652894d0530e41b32"
dependencies:
bs58check "<3.0.0"
+ safe-buffer "^5.1.1"
win-release@^1.0.0:
version "1.1.1"
@@ -6488,13 +6906,6 @@ wordwrap@~0.0.2:
version "0.0.3"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
-worker-farm@^1.3.1:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae"
- dependencies:
- errno "^0.1.4"
- xtend "^4.0.1"
-
wrap-ansi@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
@@ -6542,6 +6953,13 @@ ws@^2.0.3:
safe-buffer "~5.0.1"
ultron "~1.1.0"
+ws@^5.2.0:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
+ integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==
+ dependencies:
+ async-limiter "~1.0.0"
+
xcode@^0.9.1:
version "0.9.3"
resolved "https://registry.yarnpkg.com/xcode/-/xcode-0.9.3.tgz#910a89c16aee6cc0b42ca805a6d0b4cf87211cf3"
@@ -6550,9 +6968,10 @@ xcode@^0.9.1:
simple-plist "^0.2.1"
uuid "3.0.1"
-xml-name-validator@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
+xml-name-validator@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+ integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
xmlbuilder@4.0.0:
version "4.0.0"
@@ -6578,7 +6997,7 @@ xpipe@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.5.tgz#8dd8bf45fc3f7f55f0e054b878f43a62614dafdf"
-xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
+xtend@^4.0.0, xtend@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
@@ -6596,6 +7015,31 @@ yargs-parser@^7.0.0:
dependencies:
camelcase "^4.1.0"
+yargs-parser@^9.0.2:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
+ integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=
+ dependencies:
+ camelcase "^4.1.0"
+
+yargs@^11.0.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
+ integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==
+ dependencies:
+ cliui "^4.0.0"
+ decamelize "^1.1.1"
+ find-up "^2.1.0"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ 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"
+ yargs-parser "^9.0.2"
+
yargs@^8.0.2:
version "8.0.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"