diff --git a/package.json b/package.json index 97e241d8..2b7c518d 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,11 @@ "@ledgerhq/hw-app-eth": "^1.1.2-beta.068e2a14", "@ledgerhq/hw-transport": "^1.1.2-beta.068e2a14", "@ledgerhq/hw-transport-node-hid": "^1.1.2-beta.068e2a14", + "axios": "^0.17.1", "bcryptjs": "^2.4.3", + "bitcoinjs-lib": "^3.3.2", "blockchain.info": "^2.11.0", + "bs58check": "^2.1.1", "color": "^2.0.1", "downshift": "^1.25.0", "electron-store": "^1.3.0", @@ -61,17 +64,17 @@ "redux-actions": "^2.2.1", "redux-thunk": "^2.2.0", "shortid": "^2.2.8", - "source-map-support": "^0.5.0", + "source-map-support": "^0.5.2", "styled-components": "^2.2.4", "styled-system": "^1.1.1" }, "devDependencies": { - "@storybook/addon-actions": "^3.3.9", - "@storybook/addon-knobs": "^3.3.9", - "@storybook/addon-links": "^3.3.9", - "@storybook/addon-options": "^3.3.9", - "@storybook/addons": "^3.3.9", - "@storybook/react": "^3.3.9", + "@storybook/addon-actions": "^3.3.10", + "@storybook/addon-knobs": "^3.3.10", + "@storybook/addon-links": "^3.3.10", + "@storybook/addon-options": "^3.3.10", + "@storybook/addons": "^3.3.10", + "@storybook/react": "^3.3.10", "babel-core": "^6.26.0", "babel-eslint": "^8.2.1", "babel-loader": "^7.1.2", @@ -85,7 +88,7 @@ "electron-builder": "^19.54.0", "electron-devtools-installer": "^2.2.3", "electron-webpack": "1.11.0", - "eslint": "^4.13.1", + "eslint": "^4.16.0", "eslint-config-airbnb": "^16.1.0", "eslint-config-prettier": "^2.9.0", "eslint-import-resolver-babel-module": "^4.0.0", diff --git a/src/components/modals/AddAccount.js b/src/components/modals/AddAccount.js index 2669b5dd..dd7ed1bf 100644 --- a/src/components/modals/AddAccount.js +++ b/src/components/modals/AddAccount.js @@ -127,16 +127,16 @@ class AddAccountModal extends PureComponent { return } - const { data: { data }, type } = sendSyncEvent('usb', 'wallet.infos.request', { + const { data: { data }, type } = sendSyncEvent('usb', 'wallet.request', { path: currentDevice.path, wallet: inputValue.wallet, }) - if (type === 'wallet.infos.fail') { + if (type === 'wallet.request.fail') { this._timeout = setTimeout(() => this.getWalletInfos(), 1e3) } - if (type === 'wallet.infos.success') { + if (type === 'wallet.request.success') { this.setState({ walletAddress: data.bitcoinAddress, step: 'confirmation', diff --git a/src/internals/usb/wallet.js b/src/internals/usb/wallet.js deleted file mode 100644 index 59433b89..00000000 --- a/src/internals/usb/wallet.js +++ /dev/null @@ -1,27 +0,0 @@ -// @flow - -import CommNodeHid from '@ledgerhq/hw-transport-node-hid' -import Btc from '@ledgerhq/hw-app-btc' - -async function getWalletInfos(path, wallet) { - if (wallet === 'btc') { - const comm = await CommNodeHid.open(path) - const btc = new Btc(comm) - const walletInfos = await btc.getWalletPublicKey(`44'/0'/0'/0`) - return walletInfos - } - throw new Error('invalid wallet') -} - -export default (sendEvent: Function) => ({ - infos: { - request: async ({ path, wallet }: { path: string, wallet: string }) => { - try { - const data = await getWalletInfos(path, wallet) - sendEvent('wallet.infos.success', { path, wallet, data }) - } catch (err) { - sendEvent('wallet.infos.fail', { path, wallet, err: err.stack || err }) - } - }, - }, -}) diff --git a/src/internals/usb/wallet/getAddresses.js b/src/internals/usb/wallet/getAddresses.js new file mode 100644 index 00000000..6978bfc8 --- /dev/null +++ b/src/internals/usb/wallet/getAddresses.js @@ -0,0 +1,148 @@ +/* eslint-disable no-bitwise */ + +import axios from 'axios' +import bitcoin from 'bitcoinjs-lib' +import bs58check from 'bs58check' +import Btc from '@ledgerhq/hw-app-btc' + +const networks = [ + { + ...bitcoin.networks.bitcoin, + family: 1, + }, + { + ...bitcoin.networks.testnet, + family: 1, + }, +] + +function getCompressPublicKey(publicKey) { + let compressedKeyIndex + if (parseInt(publicKey.substring(128, 130), 16) % 2 !== 0) { + compressedKeyIndex = '03' + } else { + compressedKeyIndex = '02' + } + const result = compressedKeyIndex + publicKey.substring(2, 66) + return result +} + +function parseHexString(str) { + const result = [] + while (str.length >= 2) { + result.push(parseInt(str.substring(0, 2), 16)) + str = str.substring(2, str.length) + } + return result +} + +function createXPUB({ depth, fingerprint, childnum, chainCode, publicKey, network }) { + return [ + network.toString(16).padStart(8, 0), + depth.toString(16).padStart(2, 0), + fingerprint.toString(16).padStart(8, 0), + childnum.toString(16).padStart(8, 0), + chainCode, + publicKey, + ].join('') +} + +function encodeBase58Check(vchIn) { + vchIn = parseHexString(vchIn) + return bs58check.encode(new Uint8Array(vchIn)) +} + +function getPath({ coin, account, segwit }) { + return `${segwit ? 49 : 44}'/${coin}'${account !== undefined ? `/${account}'` : ''}` +} + +function pubKeyToSegwitAddress(pubKey, scriptVersion) { + const script = [0x00, 0x14].concat(Array.from(bitcoin.crypto.hash160(pubKey))) + const hash160 = bitcoin.crypto.hash160(new Uint8Array(script)) + return bitcoin.address.toBase58Check(hash160, scriptVersion) +} + +function getPublicAddress(hdnode, path, script, segwit) { + hdnode = hdnode.derivePath(path) + if (!segwit) { + return hdnode.getAddress().toString() + } + return pubKeyToSegwitAddress(hdnode.getPublicKeyBuffer(), script) +} + +function getTransactions(addresses) { + return axios.get( + `http://api.ledgerwallet.com/blockchain/v2/btc_testnet/addresses/${addresses.join( + ',', + )}/transactions?noToken=true`, + ) +} + +export default async transport => { + const coin = 1 + const account = 0 + const segwit = true + + const network = networks[coin] + + const [p2pkh, p2sh, fam] = [network.pubKeyHash, network.scriptHash, network.family].map(v => + v.toString(16).padStart(4, 0), + ) + + await transport.exchange(`e014000005${p2pkh}${p2sh}${fam.substr(-2)}`, [0x9000]) + + const btc = new Btc(transport) + + const getPublicKey = path => btc.getWalletPublicKey(path) + + let result = bitcoin.crypto.sha256( + await getPublicKey(getPath({ segwit, coin })).then( + ({ publicKey }) => new Uint8Array(parseHexString(getCompressPublicKey(publicKey))), + ), + ) + result = bitcoin.crypto.ripemd160(result) + + const fingerprint = ((result[0] << 24) | (result[1] << 16) | (result[2] << 8) | result[3]) >>> 0 + + const { publicKey, chainCode } = await getPublicKey(getPath({ segwit, coin, account })) + const compressPublicKey = getCompressPublicKey(publicKey) + + const childnum = (0x80000000 | account) >>> 0 + const xpub = createXPUB({ + depth: 3, + fingerprint, + childnum, + chainCode, + publicKey: compressPublicKey, + network: network.bip32.public, + }) + + const xpub58 = encodeBase58Check(xpub) + + const hdnode = bitcoin.HDNode.fromBase58(xpub58, network) + + const script = segwit ? parseInt(network.scriptHash, 10) : parseInt(network.pubKeyHash, 10) + + const nextPath = async i => { + if (i <= 0x7fffffff) { + for (let j = 0; j < 2; j++) { + const path = `${j}/${i}` + + const address = getPublicAddress(hdnode, path, script, segwit) + console.log('address', address) + + const { data: { txs } } = await getTransactions(address) // eslint-disable-line no-await-in-loop + + console.log('txs', txs.length) + + if (j === 1 && i < 10) { + nextPath(++i) + } + } + } else { + console.log('meeeh') + } + } + + nextPath(0) +} diff --git a/src/internals/usb/wallet/index.js b/src/internals/usb/wallet/index.js new file mode 100644 index 00000000..aee8fe2a --- /dev/null +++ b/src/internals/usb/wallet/index.js @@ -0,0 +1,24 @@ +// @flow + +import CommNodeHid from '@ledgerhq/hw-transport-node-hid' +import getAddresses from './getAddresses' + +async function getWallet(path, wallet) { + const transport = await CommNodeHid.open(path) + console.log('getWallet', path) + if (wallet === 'btc') { + await getAddresses(transport) + } + throw new Error('invalid wallet') +} + +export default (sendEvent: Function) => ({ + request: async ({ path, wallet }: { path: string, wallet: string }) => { + try { + const data = await getWallet(path, wallet) + sendEvent('wallet.request.success', { path, wallet, data }) + } catch (err) { + sendEvent('wallet.request.fail', { path, wallet, err: err.stack || err }) + } + }, +}) diff --git a/yarn.lock b/yarn.lock index ddd2614e..84989a3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -104,9 +104,9 @@ events "^1.1.1" invariant "^2.2.0" -"@storybook/addon-actions@^3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-3.3.9.tgz#2b191548928467fe1dd26dcba606feafbf182d36" +"@storybook/addon-actions@^3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-3.3.10.tgz#f3e4b538d8260364c55a3ba1e301a2fab9d8d3f2" dependencies: deep-equal "^1.0.1" global "^4.3.2" @@ -115,9 +115,9 @@ react-inspector "^2.2.2" uuid "^3.1.0" -"@storybook/addon-knobs@^3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-3.3.9.tgz#855575557868a97c00ce8de8e2e6960f1580f21c" +"@storybook/addon-knobs@^3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-3.3.10.tgz#25f32cd3d32a1667dc9d8ae484ddfd6223fcffef" dependencies: babel-runtime "^6.26.0" deep-equal "^1.0.1" @@ -131,41 +131,41 @@ react-textarea-autosize "^5.2.1" util-deprecate "^1.0.2" -"@storybook/addon-links@^3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-3.3.9.tgz#13781ac1c21ddfe347ece6ceab8518c8d1f98a0f" +"@storybook/addon-links@^3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-3.3.10.tgz#4e6c1a0b0bf5b18101bc5001b858b33202ae8209" dependencies: - "@storybook/components" "^3.3.9" + "@storybook/components" "^3.3.10" global "^4.3.2" prop-types "^15.5.10" -"@storybook/addon-options@^3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@storybook/addon-options/-/addon-options-3.3.9.tgz#8dca85ae5c6713ca13bead0e8c39b23c7e2138c0" +"@storybook/addon-options@^3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@storybook/addon-options/-/addon-options-3.3.10.tgz#536796b6223616a4a8b3c2851c7efbe66036bc8a" -"@storybook/addons@^3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-3.3.9.tgz#356ce7f1de892d88ca4bc5f686d06e07dd8c2108" +"@storybook/addons@^3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-3.3.10.tgz#8753007d872013d2376ba71b14396eef3159673b" -"@storybook/channel-postmessage@^3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-3.3.9.tgz#a59220f9ecbdbe05deac6ac4339715aa587d41dd" +"@storybook/channel-postmessage@^3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-3.3.10.tgz#4f22b5a665d3c95eb61cf41bbb06872009ace7b5" dependencies: - "@storybook/channels" "^3.3.9" + "@storybook/channels" "^3.3.10" global "^4.3.2" json-stringify-safe "^5.0.1" -"@storybook/channels@^3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-3.3.9.tgz#3116a6c5e441fd057558870b254c34fe3a9fbfb0" +"@storybook/channels@^3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-3.3.10.tgz#0b15d47c2ea0cb1c7b735955d74e9d3ca99cdc42" -"@storybook/client-logger@^3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-3.3.9.tgz#a73e382c383c1bfa6d2ff7fa5cae77cd09efa524" +"@storybook/client-logger@^3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-3.3.10.tgz#6f8b85c3dfad229794fee88f930df59b163ee144" -"@storybook/components@^3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-3.3.9.tgz#1f7ced8b10a0e405c1d3fd6fe7ef7b8957ddf89f" +"@storybook/components@^3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-3.3.10.tgz#f213a129ed49de33cdaf116da2c2b662b8eb3ea0" dependencies: glamor "^2.20.40" glamorous "^4.11.2" @@ -179,9 +179,9 @@ "@storybook/react-simple-di" "^1.2.1" babel-runtime "6.x.x" -"@storybook/node-logger@^3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-3.3.9.tgz#c070ef5ced91b1b1aa7bb3e402855db277ed426b" +"@storybook/node-logger@^3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-3.3.10.tgz#d9c09a622713ec4726cdd292e798aa98c0503c15" dependencies: chalk "^2.3.0" npmlog "^4.1.2" @@ -211,17 +211,17 @@ dependencies: babel-runtime "^6.5.0" -"@storybook/react@^3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-3.3.9.tgz#2bd203a5b3c5e5fad4a756ca41d78e62cd49b160" - dependencies: - "@storybook/addon-actions" "^3.3.9" - "@storybook/addon-links" "^3.3.9" - "@storybook/addons" "^3.3.9" - "@storybook/channel-postmessage" "^3.3.9" - "@storybook/client-logger" "^3.3.9" - "@storybook/node-logger" "^3.3.9" - "@storybook/ui" "^3.3.9" +"@storybook/react@^3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-3.3.10.tgz#a55f8f804f3f01d76f1b7e8675e818ee4c107324" + dependencies: + "@storybook/addon-actions" "^3.3.10" + "@storybook/addon-links" "^3.3.10" + "@storybook/addons" "^3.3.10" + "@storybook/channel-postmessage" "^3.3.10" + "@storybook/client-logger" "^3.3.10" + "@storybook/node-logger" "^3.3.10" + "@storybook/ui" "^3.3.10" airbnb-js-shims "^1.4.0" autoprefixer "^7.2.3" babel-loader "^7.1.2" @@ -273,11 +273,11 @@ webpack-dev-middleware "^1.12.2" webpack-hot-middleware "^2.21.0" -"@storybook/ui@^3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-3.3.9.tgz#abb1df557131b174bf3c0879863a309ee85de8e3" +"@storybook/ui@^3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-3.3.10.tgz#99a83b988b01cde1df61b87a58227a50ed196dd1" dependencies: - "@storybook/components" "^3.3.9" + "@storybook/components" "^3.3.10" "@storybook/mantra-core" "^1.7.2" "@storybook/react-komposer" "^2.0.3" babel-runtime "^6.26.0" @@ -682,6 +682,13 @@ aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +axios@^0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.17.1.tgz#2d8e3e5d0bdbd7327f91bc814f5c57660f81824d" + dependencies: + follow-redirects "^1.2.5" + is-buffer "^1.1.5" + axobject-query@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" @@ -1671,6 +1678,12 @@ balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" +base-x@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.4.tgz#94c1788736da065edb1d68808869e357c977fa77" + dependencies: + safe-buffer "^5.0.1" + base64-js@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" @@ -1705,10 +1718,18 @@ bcryptjs@^2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" +bech32@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.3.tgz#bd47a8986bbb3eec34a56a097a84b8d3e9a2dfcd" + big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" +bigi@^1.1.0, bigi@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825" + binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" @@ -1724,6 +1745,36 @@ bindings@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" +bip66@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" + dependencies: + safe-buffer "^5.0.1" + +bitcoin-ops@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/bitcoin-ops/-/bitcoin-ops-1.4.0.tgz#90d9c95c067e9a34a6ccaa3dd324ffa84e31e3d8" + +bitcoinjs-lib@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/bitcoinjs-lib/-/bitcoinjs-lib-3.3.2.tgz#780c9c53ecb1222adb463b58bef26386067b609a" + dependencies: + bech32 "^1.1.2" + bigi "^1.4.0" + bip66 "^1.1.0" + bitcoin-ops "^1.3.0" + bs58check "^2.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.3" + ecurve "^1.0.0" + merkle-lib "^2.0.10" + pushdata-bitcoin "^1.0.1" + randombytes "^2.0.1" + safe-buffer "^5.0.1" + typeforce "^1.11.3" + varuint-bitcoin "^1.0.4" + wif "^2.0.1" + bl@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" @@ -1935,6 +1986,19 @@ browserslist@^2.1.2, browserslist@^2.11.1: caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + dependencies: + base-x "^3.0.2" + +bs58check@<3.0.0, bs58check@^2.0.0, bs58check@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.1.tgz#8a5d0e587af97b784bf9cbf1b29f454d82bc0222" + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + buffer-indexof@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" @@ -2583,7 +2647,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: ripemd160 "^2.0.0" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.3, create-hmac@^1.1.4: version "1.1.6" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" dependencies: @@ -2979,7 +3043,7 @@ doctrine@1.5.0: esutils "^2.0.2" isarray "^1.0.0" -doctrine@^2.0.0, doctrine@^2.0.2: +doctrine@^2.0.0, doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" dependencies: @@ -3080,6 +3144,13 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" +ecurve@^1.0.0: + version "1.0.6" + resolved "https://registry.yarnpkg.com/ecurve/-/ecurve-1.0.6.tgz#dfdabbb7149f8d8b78816be5a7d5b83fcf6de797" + dependencies: + bigi "^1.1.0" + safe-buffer "^5.0.1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -3556,9 +3627,9 @@ eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" -eslint@^4.13.1: - version "4.15.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.15.0.tgz#89ab38c12713eec3d13afac14e4a89e75ef08145" +eslint@^4.16.0: + version "4.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.16.0.tgz#934ada9e98715e1d7bbfd6f6f0519ed2fab35cc1" dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" @@ -3566,7 +3637,7 @@ eslint@^4.13.1: concat-stream "^1.6.0" cross-spawn "^5.1.0" debug "^3.1.0" - doctrine "^2.0.2" + doctrine "^2.1.0" eslint-scope "^3.7.1" eslint-visitor-keys "^1.0.0" espree "^3.5.2" @@ -4024,6 +4095,12 @@ flush-write-stream@^1.0.0: inherits "^2.0.1" readable-stream "^2.0.4" +follow-redirects@^1.2.5: + version "1.4.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.4.0.tgz#a146a3a5d402201c7a3e6128643f0e336d212b10" + dependencies: + debug "^3.1.0" + for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -5772,6 +5849,10 @@ merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" +merkle-lib@^2.0.10: + version "2.0.10" + resolved "https://registry.yarnpkg.com/merkle-lib/-/merkle-lib-2.0.10.tgz#82b8dbae75e27a7785388b73f9d7725d0f6f3326" + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -7064,6 +7145,12 @@ punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +pushdata-bitcoin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz#15931d3cd967ade52206f523aa7331aef7d43af7" + dependencies: + bitcoin-ops "^1.3.0" + q@^1.1.2, q@^1.4.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -8188,6 +8275,12 @@ source-map-support@^0.5.0, source-map-support@^0.5.1: dependencies: source-map "^0.6.0" +source-map-support@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.2.tgz#1a6297fd5b2e762b39688c7fc91233b60984f0a5" + dependencies: + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" @@ -8775,6 +8868,10 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +typeforce@^1.11.3: + version "1.12.0" + resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.12.0.tgz#ca40899919f1466d7819e37be039406beb912a2e" + ua-parser-js@^0.7.9: version "0.7.17" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" @@ -9028,6 +9125,12 @@ value-equal@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" +varuint-bitcoin@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/varuint-bitcoin/-/varuint-bitcoin-1.1.0.tgz#7a343f50537607af6a3059312b9782a170894540" + dependencies: + safe-buffer "^5.1.1" + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -9227,6 +9330,12 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" +wif@^2.0.1: + version "2.0.6" + resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704" + dependencies: + bs58check "<3.0.0" + window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"