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"