Browse Source

Use deviceAccess from incoming live-common

gre-patch-1
Gaëtan Renaudeau 6 years ago
parent
commit
d2b76a4acb
No known key found for this signature in database GPG Key ID: 7B66B85F042E5451
  1. 12
      package.json
  2. 10
      src/commands/debugAppInfosForCurrency.js
  3. 34
      src/commands/getAddress.js
  4. 6
      src/commands/getDeviceInfo.js
  5. 6
      src/commands/getIsGenuine.js
  6. 6
      src/commands/getMemInfo.js
  7. 6
      src/commands/installApp.js
  8. 6
      src/commands/installFinalFirmware.js
  9. 6
      src/commands/installMcu.js
  10. 8
      src/commands/installOsuFirmware.js
  11. 6
      src/commands/isDashboardOpen.js
  12. 40
      src/commands/libcoreSignAndBroadcast.js
  13. 10
      src/commands/signTransaction.js
  14. 15
      src/commands/testApdu.js
  15. 6
      src/commands/uninstallApp.js
  16. 64
      src/helpers/deviceAccess.js
  17. 15
      src/helpers/libcore.js
  18. 50
      src/helpers/live-common-setup-internal-hw.js
  19. 8
      src/helpers/live-common-setup.js
  20. 7
      src/internals/index.js
  21. 2
      src/main/app.js
  22. 2
      src/renderer/init.js
  23. 95
      yarn.lock

12
package.json

@ -35,13 +35,13 @@
}
},
"dependencies": {
"@ledgerhq/hw-app-btc": "^v4.30.0",
"@ledgerhq/hw-app-eth": "^4.24.0",
"@ledgerhq/hw-app-xrp": "^4.25.0",
"@ledgerhq/hw-transport": "^4.24.0",
"@ledgerhq/hw-transport-node-hid": "4.24.0",
"@ledgerhq/hw-app-btc": "^4.32.0",
"@ledgerhq/hw-app-eth": "^4.32.0",
"@ledgerhq/hw-app-xrp": "^4.32.0",
"@ledgerhq/hw-transport": "^4.32.0",
"@ledgerhq/hw-transport-node-hid": "^4.32.0",
"@ledgerhq/ledger-core": "2.0.0-rc.12",
"@ledgerhq/live-common": "4.6.0",
"@ledgerhq/live-common": "4.8.0-beta.3",
"animated": "^0.2.2",
"async": "^2.6.1",
"axios": "^0.18.0",

10
src/commands/debugAppInfosForCurrency.js

@ -2,8 +2,8 @@
import { getCryptoCurrencyById } from '@ledgerhq/live-common/lib/currencies'
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import { withDevice } from 'helpers/deviceAccess'
import { from } from 'rxjs'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
import debugAppInfosForCurrency from 'helpers/debugAppInfosForCurrency'
type Input = {
@ -18,10 +18,8 @@ type Result = {
const cmd: Command<Input, Result> = createCommand(
'debugAppInfosForCurrency',
({ currencyId, devicePath }) =>
fromPromise(
withDevice(devicePath)(transport =>
debugAppInfosForCurrency(transport, getCryptoCurrencyById(currencyId)),
),
withDevice(devicePath)(transport =>
from(debugAppInfosForCurrency(transport, getCryptoCurrencyById(currencyId))),
),
)

34
src/commands/getAddress.js

@ -2,8 +2,8 @@
import { getCryptoCurrencyById } from '@ledgerhq/live-common/lib/currencies'
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import { withDevice } from 'helpers/deviceAccess'
import { from } from 'rxjs'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
import getAddressForCurrency from 'helpers/getAddressForCurrency'
import { DeviceAppVerifyNotSupported, UserRefusedAddress } from 'config/errors'
@ -25,20 +25,22 @@ type Result = {
const cmd: Command<Input, Result> = createCommand(
'getAddress',
({ currencyId, devicePath, path, ...options }) =>
fromPromise(
withDevice(devicePath)(transport =>
getAddressForCurrency(transport, getCryptoCurrencyById(currencyId), path, options),
).catch(e => {
if (e && e.name === 'TransportStatusError') {
if (e.statusCode === 0x6b00 && options.verify) {
throw new DeviceAppVerifyNotSupported()
}
if (e.statusCode === 0x6985) {
throw new UserRefusedAddress()
}
}
throw e
}),
withDevice(devicePath)(transport =>
from(
getAddressForCurrency(transport, getCryptoCurrencyById(currencyId), path, options).catch(
e => {
if (e && e.name === 'TransportStatusError') {
if (e.statusCode === 0x6b00 && options.verify) {
throw new DeviceAppVerifyNotSupported()
}
if (e.statusCode === 0x6985) {
throw new UserRefusedAddress()
}
}
throw e
},
),
),
),
)

6
src/commands/getDeviceInfo.js

@ -1,8 +1,8 @@
// @flow
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import { withDevice } from 'helpers/deviceAccess'
import { from } from 'rxjs'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
import getDeviceInfo from 'helpers/devices/getDeviceInfo'
import type { DeviceInfo } from 'helpers/types'
@ -14,7 +14,7 @@ type Input = {
type Result = DeviceInfo
const cmd: Command<Input, Result> = createCommand('getDeviceInfo', ({ devicePath }) =>
fromPromise(withDevice(devicePath)(transport => getDeviceInfo(transport))),
withDevice(devicePath)(transport => from(getDeviceInfo(transport))),
)
export default cmd

6
src/commands/getIsGenuine.js

@ -1,11 +1,11 @@
// @flow
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import { from } from 'rxjs'
import type { DeviceInfo } from 'helpers/types'
import getIsGenuine from 'helpers/devices/getIsGenuine'
import { withDevice } from 'helpers/deviceAccess'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
type Input = {
devicePath: string,
@ -14,7 +14,7 @@ type Input = {
type Result = string
const cmd: Command<Input, Result> = createCommand('getIsGenuine', ({ devicePath, deviceInfo }) =>
fromPromise(withDevice(devicePath)(transport => getIsGenuine(transport, deviceInfo))),
withDevice(devicePath)(transport => from(getIsGenuine(transport, deviceInfo))),
)
export default cmd

6
src/commands/getMemInfo.js

@ -1,9 +1,9 @@
// @flow
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import { from } from 'rxjs'
import { withDevice } from 'helpers/deviceAccess'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
import getMemInfo from 'helpers/devices/getMemInfo'
type Input = {
@ -13,7 +13,7 @@ type Input = {
type Result = *
const cmd: Command<Input, Result> = createCommand('getMemInfo', ({ devicePath }) =>
fromPromise(withDevice(devicePath)(transport => getMemInfo(transport))),
withDevice(devicePath)(transport => from(getMemInfo(transport))),
)
export default cmd

6
src/commands/installApp.js

@ -1,9 +1,9 @@
// @flow
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import { from } from 'rxjs'
import { withDevice } from 'helpers/deviceAccess'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
import installApp from 'helpers/apps/installApp'
import type { ApplicationVersion } from 'helpers/types'
@ -19,7 +19,7 @@ type Result = void
const cmd: Command<Input, Result> = createCommand(
'installApp',
({ devicePath, targetId, ...app }) =>
fromPromise(withDevice(devicePath)(transport => installApp(transport, targetId, app))),
withDevice(devicePath)(transport => from(installApp(transport, targetId, app))),
)
export default cmd

6
src/commands/installFinalFirmware.js

@ -1,8 +1,8 @@
// @flow
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import { withDevice } from 'helpers/deviceAccess'
import { from } from 'rxjs'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
import installFinalFirmware from 'helpers/firmware/installFinalFirmware'
@ -15,7 +15,7 @@ type Result = {
}
const cmd: Command<Input, Result> = createCommand('installFinalFirmware', ({ devicePath }) =>
fromPromise(withDevice(devicePath)(transport => installFinalFirmware(transport))),
withDevice(devicePath)(transport => from(installFinalFirmware(transport))),
)
export default cmd

6
src/commands/installMcu.js

@ -1,9 +1,9 @@
// @flow
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import { from } from 'rxjs'
import { withDevice } from 'helpers/deviceAccess'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
import installMcu from 'helpers/firmware/installMcu'
type Input = {
@ -13,7 +13,7 @@ type Input = {
type Result = void
const cmd: Command<Input, Result> = createCommand('installMcu', ({ devicePath }) =>
fromPromise(withDevice(devicePath)(transport => installMcu(transport))),
withDevice(devicePath)(transport => from(installMcu(transport))),
)
export default cmd

8
src/commands/installOsuFirmware.js

@ -1,9 +1,9 @@
// @flow
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import { from } from 'rxjs'
import { withDevice } from 'helpers/deviceAccess'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
import installOsuFirmware from 'helpers/firmware/installOsuFirmware'
import type { Firmware } from 'components/modals/UpdateFirmware'
@ -19,9 +19,7 @@ type Result = { success: boolean }
const cmd: Command<Input, Result> = createCommand(
'installOsuFirmware',
({ devicePath, firmware, targetId }) =>
fromPromise(
withDevice(devicePath)(transport => installOsuFirmware(transport, targetId, firmware)),
),
withDevice(devicePath)(transport => from(installOsuFirmware(transport, targetId, firmware))),
)
export default cmd

6
src/commands/isDashboardOpen.js

@ -1,8 +1,8 @@
// @flow
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import { withDevice } from 'helpers/deviceAccess'
import { from } from 'rxjs'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
import isDashboardOpen from '../helpers/devices/isDashboardOpen'
@ -13,7 +13,7 @@ type Input = {
type Result = boolean
const cmd: Command<Input, Result> = createCommand('isDashboardOpen', ({ devicePath }) =>
fromPromise(withDevice(devicePath)(transport => isDashboardOpen(transport))),
withDevice(devicePath)(transport => from(isDashboardOpen(transport))),
)
export default cmd

40
src/commands/libcoreSignAndBroadcast.js

@ -4,7 +4,7 @@ import logger from 'logger'
import { BigNumber } from 'bignumber.js'
import { StatusCodes } from '@ledgerhq/hw-transport'
import Btc from '@ledgerhq/hw-app-btc'
import { Observable } from 'rxjs'
import { Observable, from } from 'rxjs'
import { isSegwitDerivationMode } from '@ledgerhq/live-common/lib/derivation'
import { getCryptoCurrencyById } from '@ledgerhq/live-common/lib/currencies'
import type { OperationRaw, DerivationMode, CryptoCurrency } from '@ledgerhq/live-common/lib/types'
@ -18,7 +18,7 @@ import { UpdateYourApp } from 'config/errors'
import withLibcore from 'helpers/withLibcore'
import { createCommand, Command } from 'helpers/ipc'
import { withDevice } from 'helpers/deviceAccess'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
type BitcoinLikeTransaction = {
amount: string,
@ -245,22 +245,26 @@ export async function doSignAndBroadcast({
const hasTimestamp = !!njsWalletCurrency.bitcoinLikeNetworkParameters.UsesTimestampedTransaction
// TODO: const timestampDelay = njsWalletCurrency.bitcoinLikeNetworkParameters.TimestampDelay
const signedTransaction = await withDevice(deviceId)(async transport =>
signTransaction({
hwApp: new Btc(transport),
currency,
blockHeight,
transaction: builded,
sigHashType: parseInt(sigHashType, 16),
hasTimestamp,
derivationMode,
}),
).catch(e => {
if (e && e.statusCode === StatusCodes.INCORRECT_P1_P2) {
throw new UpdateYourApp(`UpdateYourApp ${currency.id}`, currency)
}
throw e
})
const signedTransaction = await withDevice(deviceId)(transport =>
from(
signTransaction({
hwApp: new Btc(transport),
currency,
blockHeight,
transaction: builded,
sigHashType: parseInt(sigHashType, 16),
hasTimestamp,
derivationMode,
}),
),
)
.toPromise()
.catch(e => {
if (e && e.statusCode === StatusCodes.INCORRECT_P1_P2) {
throw new UpdateYourApp(`UpdateYourApp ${currency.id}`, currency)
}
throw e
})
if (!signedTransaction || isCancelled() || !njsAccount) return
onSigned()

10
src/commands/signTransaction.js

@ -1,8 +1,8 @@
// @flow
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import { withDevice } from 'helpers/deviceAccess'
import { from } from 'rxjs'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
import signTransactionForCurrency from 'helpers/signTransactionForCurrency'
type Input = {
@ -17,10 +17,8 @@ type Result = string
const cmd: Command<Input, Result> = createCommand(
'signTransaction',
({ currencyId, devicePath, path, transaction }) =>
fromPromise(
withDevice(devicePath)(transport =>
signTransactionForCurrency(currencyId)(transport, currencyId, path, transaction),
),
withDevice(devicePath)(transport =>
from(signTransactionForCurrency(currencyId)(transport, currencyId, path, transaction)),
),
)

15
src/commands/testApdu.js

@ -3,8 +3,8 @@
// This is a test example for dev testing purpose.
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import { withDevice } from 'helpers/deviceAccess'
import { from } from 'rxjs'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
type Input = {
devicePath: string,
@ -15,11 +15,12 @@ type Result = {
}
const cmd: Command<Input, Result> = createCommand('testApdu', ({ apduHex, devicePath }) =>
fromPromise(
withDevice(devicePath)(async transport => {
const res = await transport.exchange(Buffer.from(apduHex, 'hex'))
return { responseHex: res.toString('hex') }
}),
withDevice(devicePath)(transport =>
from(
transport
.exchange(Buffer.from(apduHex, 'hex'))
.then(res => ({ responseHex: res.toString('hex') })),
),
),
)

6
src/commands/uninstallApp.js

@ -1,8 +1,8 @@
// @flow
import { createCommand, Command } from 'helpers/ipc'
import { fromPromise } from 'rxjs/observable/fromPromise'
import { withDevice } from 'helpers/deviceAccess'
import { from } from 'rxjs'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
import uninstallApp from 'helpers/apps/uninstallApp'
@ -19,7 +19,7 @@ type Result = void
const cmd: Command<Input, Result> = createCommand(
'uninstallApp',
({ devicePath, targetId, ...app }) =>
fromPromise(withDevice(devicePath)(transport => uninstallApp(transport, targetId, app))),
withDevice(devicePath)(transport => from(uninstallApp(transport, targetId, app))),
)
export default cmd

64
src/helpers/deviceAccess.js

@ -1,64 +0,0 @@
// @flow
import logger from 'logger'
import throttle from 'lodash/throttle'
import type Transport from '@ledgerhq/hw-transport'
import TransportNodeHid from '@ledgerhq/hw-transport-node-hid'
import { DisconnectedDevice, CantOpenDevice } from 'config/errors'
import { retry } from './promise'
// all open to device must use openDevice so we can prevent race conditions
// and guarantee we do one device access at a time. It also will handle the .close()
// NOTE optim: in the future we can debounce the close & reuse the same transport instance.
type WithDevice = (devicePath: string) => <T>(job: (Transport<*>) => Promise<*>) => Promise<T>
const mapError = e => {
if (e && e.message && e.message.indexOf('cannot open device with path') >= 0) {
throw new CantOpenDevice(e.message)
}
if (e && e.message && e.message.indexOf('HID') >= 0) {
throw new DisconnectedDevice(e.message)
}
throw e
}
let queue = Promise.resolve()
let busy = false
TransportNodeHid.setListenDevicesPollingSkip(() => busy)
const refreshBusyUIState = throttle(() => {
if (process.env.CLI) return
process.send({
type: 'setDeviceBusy',
busy,
})
}, 100)
export const withDevice: WithDevice = devicePath => job => {
const p = queue.then(async () => {
busy = true
refreshBusyUIState()
try {
// $FlowFixMe not sure what's wrong
const t = await retry(() => TransportNodeHid.open(devicePath), { maxRetry: 2 }).catch(
mapError,
)
t.setDebugMode(logger.apdu)
try {
const res = await job(t).catch(mapError)
return res
} finally {
await t.close()
}
} finally {
busy = false
refreshBusyUIState()
}
})
queue = p.catch(() => null)
return p
}

15
src/helpers/libcore.js

@ -5,7 +5,8 @@
import logger from 'logger'
import { BigNumber } from 'bignumber.js'
import Btc from '@ledgerhq/hw-app-btc'
import { withDevice } from 'helpers/deviceAccess'
import { from } from 'rxjs'
import { withDevice } from '@ledgerhq/live-common/lib/hw/deviceAccess'
import {
getDerivationModesForCurrency,
getDerivationScheme,
@ -99,9 +100,9 @@ async function scanAccountsOnDeviceBySegwit({
const { coinType } = unsplitFork ? getCryptoCurrencyById(unsplitFork) : currency
const path = `${isSegwit ? '49' : '44'}'/${coinType}'`
const { publicKey: seedIdentifier } = await withDevice(devicePath)(async transport =>
new Btc(transport).getWalletPublicKey(path, false, isSegwit),
)
const { publicKey: seedIdentifier } = await withDevice(devicePath)(transport =>
from(new Btc(transport).getWalletPublicKey(path, false, isSegwit)),
).toPromise()
if (isUnsubscribed()) return []
@ -141,9 +142,9 @@ const createAccount = async (wallet, devicePath) => {
await accountCreationInfos.derivations.reduce(
(promise, derivation) =>
promise.then(async () => {
const { publicKey, chainCode } = await withDevice(devicePath)(async transport =>
new Btc(transport).getWalletPublicKey(derivation),
)
const { publicKey, chainCode } = await withDevice(devicePath)(transport =>
from(new Btc(transport).getWalletPublicKey(derivation)),
).toPromise()
accountCreationInfos.publicKeys.push(hexToBytes(publicKey))
accountCreationInfos.chainCodes.push(hexToBytes(chainCode))
}),

50
src/helpers/live-common-setup-internal-hw.js

@ -0,0 +1,50 @@
// @flow
import logger from 'logger'
import { throwError } from 'rxjs'
import { registerTransportModule } from '@ledgerhq/live-common/lib/hw'
import { addAccessHook, setErrorRemapping } from '@ledgerhq/live-common/lib/hw/deviceAccess'
import throttle from 'lodash/throttle'
import type Transport from '@ledgerhq/hw-transport'
import TransportNodeHid from '@ledgerhq/hw-transport-node-hid'
import { DisconnectedDevice, CantOpenDevice } from 'config/errors'
import { retry } from './promise'
let busy = false
TransportNodeHid.setListenDevicesPollingSkip(() => busy)
const refreshBusyUIState = throttle(() => {
if (process.env.CLI) return
process.send({
type: 'setDeviceBusy',
busy,
})
}, 100)
addAccessHook(() => {
busy = true
refreshBusyUIState()
return () => {
busy = false
refreshBusyUIState()
}
})
setErrorRemapping(e => {
// NB ideally we should solve it in ledgerjs
if (e && e.message && e.message.indexOf('HID') >= 0) {
return throwError(new DisconnectedDevice(e.message))
}
return throwError(e)
})
registerTransportModule({
id: 'hid',
open: async devicePath => {
// $FlowFixMe
const t = await retry(() => TransportNodeHid.open(devicePath), { maxRetry: 2 })
t.setDebugMode(logger.apdu)
return t
},
disconnect: () => Promise.resolve(),
})

8
src/helpers/live-common-setup.js

@ -0,0 +1,8 @@
// @flow
import { setNetwork } from '@ledgerhq/live-common/lib/network'
import { setEnv } from '@ledgerhq/live-common/lib/env'
import network from 'api/network'
import * as constants from 'config/constants'
setNetwork(network)
setEnv('FORCE_PROVIDER', constants.FORCE_PROVIDER)

7
src/internals/index.js

@ -1,5 +1,8 @@
// @flow
import '@babel/polyfill'
import 'helpers/live-common-setup'
import 'helpers/live-common-setup-internal-hw'
import commands from 'commands'
import logger from 'logger'
import LoggerTransport from 'logger/logger-transport-internal'
@ -9,10 +12,10 @@ import sentry from 'sentry/node'
import { EXPERIMENTAL_HTTP_ON_RENDERER } from 'config/constants'
import { serializeError } from 'helpers/errors'
logger.add(new LoggerTransport())
require('../env')
logger.add(new LoggerTransport())
process.title = 'Ledger Live Internal'
process.on('uncaughtException', err => {

2
src/main/app.js

@ -1,5 +1,7 @@
// @flow
import 'helpers/live-common-setup'
import { app, BrowserWindow, Menu, screen } from 'electron'
import debounce from 'lodash/debounce'
import {

2
src/renderer/init.js

@ -1,5 +1,7 @@
// @flow
import 'helpers/live-common-setup'
import logger from 'logger'
import LoggerTransport from 'logger/logger-transport-renderer'
import React from 'react'

95
yarn.lock

@ -1677,12 +1677,12 @@
camelcase "^5.0.0"
prettier "^1.13.7"
"@ledgerhq/hw-app-btc@^4.24.0":
version "4.27.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-btc/-/hw-app-btc-4.27.0.tgz#11fc822bd34a47a39b1a7ae03ced69cf1d432796"
integrity sha512-7Ck48wCBb6nd9UXarNeGOsOqbOTi2cs4AxFhbDNrVLvPiBSH0yEiNQEF95J6u5BxKkAdM1GV9LoRumR4KhZGqQ==
"@ledgerhq/hw-app-btc@^4.32.0":
version "4.32.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-btc/-/hw-app-btc-4.32.0.tgz#e883dcaa3ebb4aca1e2cb27acfc47b8db4e85f3f"
integrity sha512-N/RxtkPVjTDwU+lDPQQE7+4YQMXaXStDrpufQbDn0NXoaJ8KgY+QGkOH6bkuwV+LQvc7rEaM7E3p7/t58KJpMg==
dependencies:
"@ledgerhq/hw-transport" "^4.24.0"
"@ledgerhq/hw-transport" "^4.32.0"
create-hash "^1.1.3"
"@ledgerhq/hw-app-btc@^4.7.3":
@ -1693,43 +1693,27 @@
"@ledgerhq/hw-transport" "^4.15.0"
create-hash "^1.1.3"
"@ledgerhq/hw-app-btc@^v4.30.0":
version "4.30.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-btc/-/hw-app-btc-4.30.0.tgz#50cef544c361072ce12b12b1e8166d7a8b0d9dbd"
integrity sha512-xVXcI4cvBZiqx2o6fB+3tt0HhzJwGH17EoGP3PRJoFvIRi3Mnf3R0CU5k8Y7xFzISvmBEO2GKcetjg4dfgqDKw==
"@ledgerhq/hw-app-eth@^4.32.0":
version "4.32.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-4.32.0.tgz#7d43ca2c7952f1fb726e02c3b4485be10af481a2"
integrity sha512-d22WinjcsqJNoZSI+6UpTWZ7hl+UhL2dFeVeliCwtBWSj40z6F25MpoviGxPsv0WC7IUjayw+a9jIRcOJ5kkIw==
dependencies:
"@ledgerhq/hw-transport" "^4.24.0"
create-hash "^1.1.3"
"@ledgerhq/hw-transport" "^4.32.0"
"@ledgerhq/hw-app-eth@^4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-4.24.0.tgz#b62514e0d18672d6d35d76dfbeaf93b67d2e5324"
integrity sha512-x8qFHN+JUsLgtm4GI3E1OxwL/7LVIaUfGkKs53a2Zr89h5YFp2GZvFcHdwbEypQAWS8cs+4vEqaEYFwQ9bSwlQ==
dependencies:
"@ledgerhq/hw-transport" "^4.24.0"
"@ledgerhq/hw-app-xrp@^4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-xrp/-/hw-app-xrp-4.24.0.tgz#cb41975597ac43d6f95dfb6ef52ff3ce5376ab80"
integrity sha512-KWxqnf4Ci3pF/2RsavDLNXHwh7iG2xBkUBD5iYgui9WaWCJfTv+F5zBYeeDeULfTSj9+WAtNcPXFHyiKLYPTfw==
"@ledgerhq/hw-app-xrp@^4.32.0":
version "4.32.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-xrp/-/hw-app-xrp-4.32.0.tgz#260daafa9de1073598ea91ddfeb168dc437edd50"
integrity sha512-MNmLAGUp7Bnj/mjg1Lo5bK1v+q/QPYw7RJAbI4Vl1A4Fsqj6oiZspnSK+BTHGp+CRJavCwumjKuf5y3X5Dp8cA==
dependencies:
"@ledgerhq/hw-transport" "^4.24.0"
"@ledgerhq/hw-transport" "^4.32.0"
bip32-path "0.4.2"
"@ledgerhq/hw-app-xrp@^4.25.0":
version "4.25.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-xrp/-/hw-app-xrp-4.25.0.tgz#d97d7e85290dd2d1ec99f85747a26145e7a7383e"
integrity sha512-kG9S8CxUFMG1hbLBiKtoPMquzlTigndDsxhoXB8oywAdbGsoCi2cufMHV2p5Bek6YlGfn5J5p49Hx5iNIf2y5Q==
dependencies:
"@ledgerhq/hw-transport" "^4.24.0"
bip32-path "0.4.2"
"@ledgerhq/hw-transport-node-hid@4.24.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-4.24.0.tgz#8457969d66819e8f7f50d5dd96527ab26cd3787d"
integrity sha512-RA3ZlRM+6y/XL/sAFKUpuLIU5tsmEpDBwJEBKC+qdzG508Vl/kBJDMuQyo6pmx/YcKZrtjfKiXXQEXP9Fgk75w==
"@ledgerhq/hw-transport-node-hid@^4.32.0":
version "4.32.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-4.32.0.tgz#75fec81c44e9f8fbe0f918080e2b70e99de2a346"
integrity sha512-uZO+52TBxaYVhGIULHbhvyZWx+uLjvflDwfLicQR1eYxbYACB6xLXwq4sz9gL5He966t637Zx9iPsLi87rtqvQ==
dependencies:
"@ledgerhq/hw-transport" "^4.24.0"
"@ledgerhq/hw-transport" "^4.32.0"
lodash "^4.17.11"
node-hid "^0.7.2"
usb "^1.3.3"
@ -1749,13 +1733,20 @@
dependencies:
events "^2.0.0"
"@ledgerhq/hw-transport@^4.21.0", "@ledgerhq/hw-transport@^4.24.0":
"@ledgerhq/hw-transport@^4.21.0":
version "4.24.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-4.24.0.tgz#8def925d8c2e1f73d15128d9e27ead729870be58"
integrity sha512-L34TG1Ss7goRB+5BxtvBwUuu0CmDSIxS33oUqkpEy6rCs31k7XicV48iUGAnRnt8hNY2DvJ9WFyaOroUE9h6wQ==
dependencies:
events "^3.0.0"
"@ledgerhq/hw-transport@^4.32.0":
version "4.32.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-4.32.0.tgz#592b9dc51459cb1cd31ce9444cf943f627bc4beb"
integrity sha512-Wgsk9UHC4RShqYoDeIEeKgHZOvNCtB0WWIG0xqlVPzS+IcKDkIxtXQw7hTA7GQSuDuGeauVtlbTQ5yat6+2/BA==
dependencies:
events "^3.0.0"
"@ledgerhq/ledger-core@2.0.0-rc.12":
version "2.0.0-rc.12"
resolved "https://registry.yarnpkg.com/@ledgerhq/ledger-core/-/ledger-core-2.0.0-rc.12.tgz#bdd3e4b601acb0c74c640f40bea2609bb5e4b0f4"
@ -1768,16 +1759,16 @@
bindings "^1.3.0"
nan "^2.6.2"
"@ledgerhq/live-common@4.6.0":
version "4.6.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/live-common/-/live-common-4.6.0.tgz#d99b82123e5275affebded1001ace6e1e98d117e"
integrity sha512-kyKa4o7fR0DrGmu2GxlgMEkVE4aA9BJujr+q5bTpRhO5xDv2jSHT52NOPdhB6H7EfbHChaBaKv/C6wW7Q37Xyw==
"@ledgerhq/live-common@4.8.0-beta.3":
version "4.8.0-beta.3"
resolved "https://registry.yarnpkg.com/@ledgerhq/live-common/-/live-common-4.8.0-beta.3.tgz#eca9a9cb55f28523696fb76c7682a8705c1fb123"
integrity sha512-GBi4V0eeu9WQA2eFK0RwTrSI9r6ZWPjkU2d9pTptVCNlHUAOl/9aFZdc2nDVWobfbNFCchWwA636XJj80bF6ZA==
dependencies:
"@aeternity/ledger-app-api" "0.0.4"
"@ledgerhq/hw-app-btc" "^4.24.0"
"@ledgerhq/hw-app-eth" "^4.24.0"
"@ledgerhq/hw-app-xrp" "^4.24.0"
"@ledgerhq/hw-transport" "^4.24.0"
"@ledgerhq/hw-app-btc" "^4.32.0"
"@ledgerhq/hw-app-eth" "^4.32.0"
"@ledgerhq/hw-app-xrp" "^4.32.0"
"@ledgerhq/hw-transport" "^4.32.0"
bignumber.js "^7.2.1"
compressjs gre/compressjs#hermit
eip55 "^1.0.3"
@ -1790,6 +1781,8 @@
react-redux "^5.0.7"
redux "^4.0.0"
reselect "^3.0.1"
rxjs "^6.3.3"
rxjs-compat "^6.3.3"
"@mrmlnc/readdir-enhanced@^2.2.1":
version "2.2.1"
@ -14214,6 +14207,11 @@ rxjs-compat@^6.2.1:
resolved "https://registry.yarnpkg.com/rxjs-compat/-/rxjs-compat-6.2.1.tgz#f5a5e4bd700db414e82aa7cb34e5c9222c6d3756"
integrity sha512-Pst0lkAwVodBbBOIZic9aM1vY9asJ2u8GfKN115+goIH83PAlizJDyvixuxPAuQ1UtkmBuro7+0PqKQ3PSkhEg==
rxjs-compat@^6.3.3:
version "6.3.3"
resolved "https://registry.yarnpkg.com/rxjs-compat/-/rxjs-compat-6.3.3.tgz#2ab3b9ac0dac0c073749d55fef9c03ea1df2045c"
integrity sha512-caGN7ixiabHpOofginKEquuHk7GgaCrC7UpUQ9ZqGp80tMc68msadOeP/2AKy2R4YJsT1+TX5GZCtxO82qWkyA==
rxjs@^5.1.1, rxjs@^5.5.2:
version "5.5.11"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87"
@ -14228,6 +14226,13 @@ rxjs@^6.1.0, rxjs@^6.2.1:
dependencies:
tslib "^1.9.0"
rxjs@^6.3.3:
version "6.3.3"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55"
integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==
dependencies:
tslib "^1.9.0"
safe-buffer@5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"

Loading…
Cancel
Save