From c661dbabd0fe7ad65005951d08fac41df597b00b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Thu, 18 Apr 2019 17:53:40 +0200 Subject: [PATCH 1/3] Fixes crash when deleting an account --- src/screens/Account/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/screens/Account/index.js b/src/screens/Account/index.js index 5c4943fbf8..0800e6825c 100644 --- a/src/screens/Account/index.js +++ b/src/screens/Account/index.js @@ -255,10 +255,11 @@ class AccountScreen extends PureComponent { export default translate()( connect( (state, props) => { + const account = accountScreenSelector(state, props); + if (!account) return {}; const range = selectedTimeRangeSelector(state); const counterValueCurrency = counterValueCurrencySelector(state); const useCounterValue = countervalueFirstSelector(state); - const account = accountScreenSelector(state, props); const balanceHistoryWithCountervalue = balanceHistoryWithCountervalueSelector( state, { account }, From 8f7279674f86b11c9005d50e762a42643b752632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Tue, 16 Apr 2019 18:51:04 +0200 Subject: [PATCH 2/3] Bump live-common --- .flowconfig | 2 + .../project.pbxproj | 10 +- package.json | 42 +- scripts/Swipeable.patch | 13 + scripts/post.sh | 1 + src/api/network.js | 2 +- src/bridge/RNLibcoreAccountBridge.js | 28 +- src/components/DeviceJob/steps.js | 23 +- src/components/ErrorIcon.js | 2 +- src/context/AuthPass/AuthScreen.js | 2 +- src/experimental.js | 20 +- .../bitcoin/ScreenEditFeePerByte/index.js | 2 +- .../errorsImpl.js | 36 -- src/implement-react-native-libcore/index.js | 9 +- .../loadCoreImpl.js | 555 ------------------ src/locales/en/common.json | 4 + src/logic/accountModel.js | 72 +-- src/reducers/appstate.js | 2 +- src/screens/DebugIcons.js | 2 +- src/screens/Manager/FirmwareVersionRow.js | 2 +- src/screens/Manager/index.js | 5 +- src/screens/PairDevices/RenderError.js | 5 +- src/screens/ReceiveFunds/03-Confirmation.js | 12 +- src/screens/SendFunds/06-Validation.js | 2 +- .../Settings/General/ConfirmPassword.js | 2 +- .../Settings/General/PasswordRemove.js | 2 +- yarn.lock | 371 ++++++------ 27 files changed, 286 insertions(+), 942 deletions(-) create mode 100644 scripts/Swipeable.patch delete mode 100644 src/implement-react-native-libcore/errorsImpl.js delete mode 100644 src/implement-react-native-libcore/loadCoreImpl.js diff --git a/.flowconfig b/.flowconfig index 94b612d5a2..56fb426215 100644 --- a/.flowconfig +++ b/.flowconfig @@ -22,6 +22,8 @@ ; Ignore metro .*/node_modules/metro/.* +.*/node_modules/@ledgerhq/live-common/src/__tests__/.* + .*/TcpSocket.js .*/TcpServer.js diff --git a/ios/ledgerlivemobile.xcodeproj/project.pbxproj b/ios/ledgerlivemobile.xcodeproj/project.pbxproj index 710ffb5443..e7053f8b0f 100644 --- a/ios/ledgerlivemobile.xcodeproj/project.pbxproj +++ b/ios/ledgerlivemobile.xcodeproj/project.pbxproj @@ -71,9 +71,9 @@ B561934651654AF4ABB3DF57 /* libRNRandomBytes.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A659B2E3DBB64F1F920A5DCA /* libRNRandomBytes.a */; }; B91C45DF21665C1200E250AB /* ledger-core.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B91C45DE21665C1200E250AB /* ledger-core.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; B91C45E021665C3B00E250AB /* ledger-core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B91C45DE21665C1200E250AB /* ledger-core.framework */; }; + B91C46CC216812D800E250AB /* ledger-core.framework in Copy Files */ = {isa = PBXBuildFile; fileRef = B91C45DB2166562200E250AB /* ledger-core.framework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; B91C46CD216812DE00E250AB /* ledger-core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B91C45DB2166562200E250AB /* ledger-core.framework */; }; B9E5B9A72153F4490053D868 /* libRNLibLedgerCore.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 34A272772152A95200B97A07 /* libRNLibLedgerCore.a */; }; - B91C46CC216812D800E250AB /* ledger-core.framework in Copy Files */ = {isa = PBXBuildFile; fileRef = B91C45DB2166562200E250AB /* ledger-core.framework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; BF09D4F4214BF73D0040397B /* libReactNativeConfig.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 34BE1FF120092032009E8710 /* libReactNativeConfig.a */; }; BF09D4F5214BF7460040397B /* libRNSVG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 34654386200E4A94008E3CDD /* libRNSVG.a */; }; BF09D4F6214BF7500040397B /* libRCTLocale.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 34AB90C12046C203008783DA /* libRCTLocale.a */; }; @@ -598,13 +598,6 @@ remoteGlobalIDString = 274692C321B4414400BF91A8; remoteInfo = "RNSentry-tvOS"; }; - F8A31E45223A3BDF00F81049 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 64C6A31B337D471B93E32DCD /* RNSentry.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 274692C321B4414400BF91A8; - remoteInfo = "RNSentry-tvOS"; - }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -1371,6 +1364,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, Base, ); diff --git a/package.json b/package.json index ee2ed5e43d..29da8c0360 100644 --- a/package.json +++ b/package.json @@ -36,34 +36,34 @@ } }, "dependencies": { - "@ledgerhq/devices": "4.48.0", - "@ledgerhq/errors": "4.50.0", - "@ledgerhq/hw-app-btc": "4.48.0", - "@ledgerhq/hw-app-eth": "4.48.0", - "@ledgerhq/hw-app-xrp": "4.48.0", - "@ledgerhq/hw-transport": "4.48.0", - "@ledgerhq/hw-transport-http": "4.48.0", - "@ledgerhq/live-common": "4.42.0", - "@ledgerhq/react-native-hid": "4.48.0", - "@ledgerhq/react-native-hw-transport-ble": "4.48.0", + "@ledgerhq/devices": "4.54.0", + "@ledgerhq/errors": "4.54.0", + "@ledgerhq/hw-app-btc": "4.54.0", + "@ledgerhq/hw-app-eth": "4.54.0", + "@ledgerhq/hw-app-xrp": "4.54.0", + "@ledgerhq/hw-transport": "4.54.0", + "@ledgerhq/hw-transport-http": "4.54.0", + "@ledgerhq/live-common": "^5.0.0-alpha.18", + "@ledgerhq/react-native-hid": "4.54.0", + "@ledgerhq/react-native-hw-transport-ble": "4.54.0", "@ledgerhq/react-native-ledger-core": "^0.5.2-rc", "@ledgerhq/react-native-passcode-auth": "^2.0.0", "@segment/analytics-ios": "github:LedgerHQ/analytics-ios#efb4cd1771dab568422473fd680ffb748b102f07", "@segment/analytics-react-native": "^0.0.1-beta.2", "@tradle/react-native-http": "^2.0.0", "assert": "^1.4.1", - "async": "^2.6.1", + "async": "^2.6.2", "axios": "^0.18.0", - "bignumber.js": "^7.2.1", + "bignumber.js": "^8.1.1", "browserify-zlib": "~0.1.4", - "buffer": "5.2.0", + "buffer": "5.2.1", "color": "^3.0.0", "console-browserify": "^1.1.0", "constants-browserify": "^1.0.0", "d3-array": "^1.2.4", "d3-scale": "^2.1.2", "d3-shape": "^1.2.2", - "date-fns": "^1.29.0", + "date-fns": "^1.30.1", "dns.js": "^1.0.1", "domain-browser": "^1.1.1", "eip55": "^1.0.3", @@ -74,7 +74,7 @@ "i18next": "11.5.0", "invariant": "2.2.4", "jsc-android": "^236355.1.1", - "lodash": "4.17.10", + "lodash": "4.17.11", "lottie-react-native": "^2.5.11", "lru-cache": "^4.1.3", "numeral": "2.0.6", @@ -117,15 +117,15 @@ "react-native-version-number": "^0.3.4", "react-navigation": "^3.1.2", "react-navigation-tabs": "0.8.4", - "react-redux": "5.0.7", + "react-redux": "5.1.1", "readable-stream": "1.0.33", - "redux": "4.0.0", - "redux-actions": "2.6.1", + "redux": "4.0.1", + "redux-actions": "2.6.5", "redux-thunk": "2.3.0", "reselect": "3.0.1", "rn-snoopy": "^2.0.2", - "rxjs": "6.2.2", - "rxjs-compat": "^6.3.1", + "rxjs": "6.4.0", + "rxjs-compat": "^6.4.0", "stream-browserify": "^1.0.0", "string_decoder": "~0.10.25", "timers-browserify": "^1.0.1", @@ -152,7 +152,7 @@ "react-native-debugger-open": "^0.3.17", "react-test-renderer": "16.6.3", "rn-nodeify": "tradle/rn-nodeify", - "yarn-deduplicate": "^1.1.0" + "yarn-deduplicate": "^1.1.1" }, "react-native": { "zlib": "browserify-zlib", diff --git a/scripts/Swipeable.patch b/scripts/Swipeable.patch new file mode 100644 index 0000000000..24e6366877 --- /dev/null +++ b/scripts/Swipeable.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/react-native-gesture-handler/Swipeable.js b/Users/grenaudeau/Desktop/Swipeable.js +index ea88079a..f7189f6b 100644 +--- a/node_modules/react-native-gesture-handler/Swipeable.js ++++ b/Users/grenaudeau/Desktop/Swipeable.js +@@ -26,7 +26,7 @@ export type PropType = { + rightThreshold?: number, + overshootLeft?: boolean, + overshootRight?: boolean, +- overshootFriction?: number, ++ overshootFriction: number, + onSwipeableLeftOpen?: Function, + onSwipeableRightOpen?: Function, + onSwipeableOpen?: Function, \ No newline at end of file diff --git a/scripts/post.sh b/scripts/post.sh index 353e0fe4b0..98fcd5819b 100755 --- a/scripts/post.sh +++ b/scripts/post.sh @@ -9,6 +9,7 @@ cp node_modules/react-native-camera/postinstall_project/projectWithoutFaceDetect rm -f 'node_modules/@segment/analytics-ios/.clang-format' 'third-party/glog-0.3.5/test-driver' patch --forward -i scripts/rnc-RNCameraManager.patch node_modules/react-native-camera/ios/RN/RNCameraManager.m +patch --forward -i scripts/Swipeable.patch node_modules/react-native-gesture-handler/Swipeable.js rn-nodeify --hack diff --git a/src/api/network.js b/src/api/network.js index 83cd7923b9..2e670e7c32 100644 --- a/src/api/network.js +++ b/src/api/network.js @@ -4,7 +4,7 @@ import { LedgerAPIErrorWithMessage, LedgerAPIError, NetworkDown, -} from "@ledgerhq/live-common/lib/errors"; +} from "@ledgerhq/errors"; import { retry } from "@ledgerhq/live-common/lib/promise"; import { GET_CALLS_RETRY, GET_CALLS_TIMEOUT } from "../constants"; import anonymizer from "../logic/anonymizer"; diff --git a/src/bridge/RNLibcoreAccountBridge.js b/src/bridge/RNLibcoreAccountBridge.js index 8b4dd0cd0b..8e6838699e 100644 --- a/src/bridge/RNLibcoreAccountBridge.js +++ b/src/bridge/RNLibcoreAccountBridge.js @@ -1,7 +1,7 @@ // @flow import invariant from "invariant"; import { BigNumber } from "bignumber.js"; -import { FeeNotLoaded, InvalidAddress } from "@ledgerhq/live-common/lib/errors"; +import { FeeNotLoaded, InvalidAddress } from "@ledgerhq/errors"; import { getFeeItems } from "@ledgerhq/live-common/lib/api/FeesBitcoin"; import type { FeeItems } from "@ledgerhq/live-common/lib/api/FeesBitcoin"; import type { AccountBridge } from "@ledgerhq/live-common/lib/bridge/types"; @@ -18,15 +18,11 @@ export type Transaction = { networkInfo: ?{ feeItems: FeeItems }, }; -const serializeTransaction = t => { - // FIXME there is literally no need for serializeTransaction in mobile context - const { feePerByte } = t; - return { - recipient: t.recipient, - amount: t.amount.toString(), - feePerByte: (feePerByte && feePerByte.toString()) || "0", - }; -}; +const asLibcoreTransaction = ({ amount, recipient, feePerByte }) => ({ + amount, + recipient, + feePerByte, +}); const startSync = (initialAccount, _observation) => syncAccount(initialAccount); @@ -103,14 +99,8 @@ const getTransactionExtra = (a, t, field) => { const signAndBroadcast = (account, transaction, deviceId) => libcoreSignAndBroadcast({ - accountId: account.id, - blockHeight: account.blockHeight, - currencyId: account.currency.id, - derivationMode: account.derivationMode, - seedIdentifier: account.seedIdentifier, - xpub: account.xpub || "", - index: account.index, - transaction, + account, + transaction: asLibcoreTransaction(transaction), deviceId, }); @@ -124,7 +114,7 @@ const getFees = makeLRUCache( await checkValidRecipient(a, t.recipient); return getFeesForTransaction({ account: a, - transaction: serializeTransaction(t), + transaction: asLibcoreTransaction(t), }); }, (a, t) => diff --git a/src/components/DeviceJob/steps.js b/src/components/DeviceJob/steps.js index 51d348df68..3635a83739 100644 --- a/src/components/DeviceJob/steps.js +++ b/src/components/DeviceJob/steps.js @@ -7,10 +7,7 @@ import { map, first } from "rxjs/operators"; import type { CryptoCurrency, Account } from "@ledgerhq/live-common/lib/types"; import { getDeviceModel } from "@ledgerhq/devices"; import getAddress from "@ledgerhq/live-common/lib/hw/getAddress"; -import { - WrongDeviceForAccount, - CantOpenDevice, -} from "@ledgerhq/live-common/lib/errors"; +import { WrongDeviceForAccount, CantOpenDevice } from "@ledgerhq/errors"; import { getDerivationScheme, runDerivationScheme, @@ -192,14 +189,14 @@ export const currencyApp: CryptoCurrency => Step = currency => ({ addressInfo: { address: "" }, }, ] - : getAddress( - transport, + : getAddress(transport, { currency, - runDerivationScheme( + derivationMode: "", + path: runDerivationScheme( getDerivationScheme({ currency, derivationMode: "" }), currency, ), - ), + }), ), ).pipe( map(addressInfo => ({ @@ -246,11 +243,11 @@ export const accountApp: Account => Step = account => ({ addressInfo: { address: account.freshAddress }, }, ] - : getAddress( - transport, - account.currency, - account.freshAddressPath, - ).then(addressInfo => { + : getAddress(transport, { + derivationMode: account.derivationMode, + currency: account.currency, + path: account.freshAddressPath, + }).then(addressInfo => { if (addressInfo.address !== account.freshAddress) { throw new WrongDeviceForAccount("WrongDeviceForAccount", { accountName: account.name, diff --git a/src/components/ErrorIcon.js b/src/components/ErrorIcon.js index f56a3cceae..82b384ea84 100644 --- a/src/components/ErrorIcon.js +++ b/src/components/ErrorIcon.js @@ -6,7 +6,7 @@ import { CantOpenDevice, WrongDeviceForAccount, PairingFailed, -} from "@ledgerhq/live-common/lib/errors"; +} from "@ledgerhq/errors"; import Rounded from "./Rounded"; import IconNanoX from "../icons/NanoX"; import ErrorBadge from "./ErrorBadge"; diff --git a/src/context/AuthPass/AuthScreen.js b/src/context/AuthPass/AuthScreen.js index a1a18c1478..b3ef35472e 100644 --- a/src/context/AuthPass/AuthScreen.js +++ b/src/context/AuthPass/AuthScreen.js @@ -10,7 +10,7 @@ import { } from "react-native"; import { SafeAreaView } from "react-navigation"; import * as Keychain from "react-native-keychain"; -import { PasswordIncorrectError } from "@ledgerhq/live-common/lib/errors"; +import { PasswordIncorrectError } from "@ledgerhq/errors"; import type { T } from "../../types/common"; import type { Privacy } from "../../reducers/settings"; import { withReboot } from "../Reboot"; diff --git a/src/experimental.js b/src/experimental.js index 4d41406458..6c9fcb3da8 100644 --- a/src/experimental.js +++ b/src/experimental.js @@ -30,24 +30,8 @@ export const experimentalFeatures: Feature[] = [ { type: "toggle", name: "MANAGER_DEV_MODE", - title: "Dev mode", - description: "enables developer apps in manager", - }, - { - shadow: true, - type: "toggle", - name: "EXPERIMENTAL_EXPLORERS", - title: "Experimental explorers", - description: "switch to the new version of explorers", - }, - { - shadow: true, - type: "toggle", - name: "FORCE_PROVIDER", - valueOn: 4, - valueOff: 1, - title: "Manager test app provider=4", - description: "enables yet `unreleased` apps in manager", + title: "Developer mode", + description: "Show developer and testnet apps in the Manager.", }, ]; diff --git a/src/families/bitcoin/ScreenEditFeePerByte/index.js b/src/families/bitcoin/ScreenEditFeePerByte/index.js index 0b4a9799a5..e8bae1bf41 100644 --- a/src/families/bitcoin/ScreenEditFeePerByte/index.js +++ b/src/families/bitcoin/ScreenEditFeePerByte/index.js @@ -134,7 +134,7 @@ class BitcoinEditFeePerByte extends Component { } value={item.feePerByte} isSelected={item.key === focusedItemKey} onPress={this.onChangeFeeRow} diff --git a/src/implement-react-native-libcore/errorsImpl.js b/src/implement-react-native-libcore/errorsImpl.js deleted file mode 100644 index e44ded2b3e..0000000000 --- a/src/implement-react-native-libcore/errorsImpl.js +++ /dev/null @@ -1,36 +0,0 @@ -// @flow -import { - NotEnoughBalance, - NetworkDown, -} from "@ledgerhq/live-common/lib/errors"; - -export function remapLibcoreErrors(error: Error): Error { - if (!error || !error.message) return error; - // in the current effort of remapping libcore errors, we're console.logging it - if (__DEV__) console.log("remapLibcoreErrors", { error }); // eslint-disable-line no-console - const msg = error.message; - - if (msg.includes("Cannot gather enough funds")) { - return new NotEnoughBalance(); - } - - // TODO the part below this line is RN specifics, we'll need to move out - - if ( - msg.includes("The Internet connection appears to be offline") || - msg.includes( - '"explorers.api.live.ledger.com": No address associated with hostname', - ) - ) { - return new NetworkDown(); - } - - // Attempt to recover the human readable error from a verbose iOS trace - const pattern = /NS[\w]+Error.+Code.+"([\w .]+)"/; - const match = pattern.exec(msg); - if (match && match[1] !== "(null)") { - return new Error(match[1]); - } - - return error; -} diff --git a/src/implement-react-native-libcore/index.js b/src/implement-react-native-libcore/index.js index bc2b34ff2d..a5343069b9 100644 --- a/src/implement-react-native-libcore/index.js +++ b/src/implement-react-native-libcore/index.js @@ -1,8 +1,5 @@ // @flow -import { setLoadCoreImplementation } from "@ledgerhq/live-common/lib/libcore/access"; -import { setRemapLibcoreErrorsImplementation } from "@ledgerhq/live-common/lib/libcore/errors"; -import { loadCore } from "./loadCoreImpl"; -import { remapLibcoreErrors } from "./errorsImpl"; +import implementLibcore from "@ledgerhq/live-common/lib/libcore/platforms/react-native"; +import { getNativeModule } from "./specific"; -setLoadCoreImplementation(loadCore); -setRemapLibcoreErrorsImplementation(remapLibcoreErrors); +implementLibcore({ getNativeModule }); diff --git a/src/implement-react-native-libcore/loadCoreImpl.js b/src/implement-react-native-libcore/loadCoreImpl.js deleted file mode 100644 index b8bcc7b51b..0000000000 --- a/src/implement-react-native-libcore/loadCoreImpl.js +++ /dev/null @@ -1,555 +0,0 @@ -// @flow -import type { - Core, - CoreStatics, -} from "@ledgerhq/live-common/lib/libcore/types"; -import { getNativeModule } from "./specific"; - -export async function loadCore(): Promise { - // Abstract out the libcore interface into a higher level API. - - const mappings: Object = {}; - - const wrappers = { - // FIXME need to fix it in RN bindings - hex: value => value.replace(/[< >]/g, ""), - }; - - function wrap(id, ref) { - if (!ref) return ref; - if (Array.isArray(id)) { - const [actualId] = id; - return ref.map(ref => wrap(actualId, ref)); - } - if (id in wrappers) { - return wrappers[id](ref); - } - const Clz = mappings[id]; - if (!Clz) { - console.warn(`Unkown wrapping '${id}'`); - return ref; - } - return new Clz(ref); - } - - function unwrap(id, instance, ctx) { - if (!instance) return instance; - if (Array.isArray(id)) { - const [actualId] = id; - return instance.map(instance => unwrap(actualId, instance)); - } - if (__DEV__) { - const Clz = mappings[id]; - if (!Clz) { - throw new Error(`Unknown class '${String(id)}' in ${String(ctx)}`); - } - if (!(instance instanceof Clz)) { - throw new Error(`Expected '${String(id)}' instance in ${String(ctx)}`); - } - } - return instance.ref; - } - - type SpecMapF = { - params?: Array, - returns?: string | string[], - }; - type Spec = { - statics?: { - [_: string]: SpecMapF, - }, - methods?: { - [_: string]: SpecMapF, - }, - }; - - function declare(id: string, { methods, statics }: Spec) { - const native = getNativeModule(id); - - // There are lot of decoration done to abstract out libcore api. - // The plan is to make it converge to this API in the future - // so we have less runtime wrapping. - - const unwrapArgs = (args, params, ctx) => - params - ? [...args].map((value, i) => { - const spec = params[i]; - return spec ? unwrap(spec, value, ctx) : value; - }) - : args; - - const wrapResult = (r, returns) => { - let res = r; - if (res && typeof res === "object") { - if (res.then) { - return res.then(r => wrapResult(r, returns)); - } - if ("value" in res) { - res = res.value; - } - } - if (!returns) return res; - return wrap(returns, res); - }; - - const proto = {}; - if (methods) { - Object.keys(methods).forEach(method => { - const { returns, params } = methods[method]; - const f = native && native[method]; - if (!f) { - console.warn( - `LibCore: module '${id}' method '${method}' is missing in native side`, - ); - } - const ctx = `${id}#${method}`; - proto[method] = function fn(...args) { - const unwrapped = unwrapArgs(args, params, ctx); - const r = f.call(native, unwrap(id, this, ctx), ...unwrapped); - return wrapResult(r, returns); - }; - }); - } - - function constructor(ref) { - // $FlowFixMe - this.ref = ref; - } - - constructor.name = id; - constructor.prototype = proto; - - if (statics) { - Object.keys(statics).forEach(method => { - const { returns, params } = statics[method]; - const f = native && native[method]; - if (!f) { - console.warn( - `LibCore: module '${id}' static method '${method}' is missing in native side`, - ); - } - const ctx = `${id}.${method}`; - constructor[method] = (...args) => { - const unwrapped = unwrapArgs(args, params, ctx); - const r = f.call(native, ...unwrapped); - return wrapResult(r, returns); - }; - }); - } - - if (id in mappings) { - console.warn("LibCore: Already declared " + id); - } - - mappings[id] = constructor; - } - - declare("WalletPool", { - statics: { - newInstance: { - params: [ - null, - null, - "HttpClient", - "WebSocketClient", - "PathResolver", - "LogPrinter", - "ThreadDispatcher", - "RandomNumberGenerator", - "DatabaseBackend", - "DynamicObject", - ], - returns: "WalletPool", - }, - }, - methods: { - getWallet: { - returns: "Wallet", - }, - getCurrency: { - returns: "Currency", - }, - createWallet: { - params: [null, "Currency", "DynamicObject"], - returns: "Wallet", - }, - }, - }); - - declare("Wallet", { - methods: { - getAccountCreationInfo: { - returns: "AccountCreationInfo", - }, - getNextAccountCreationInfo: { - returns: "AccountCreationInfo", - }, - newAccountWithInfo: { - params: ["AccountCreationInfo"], - returns: "Account", - }, - getCurrency: { - returns: "Currency", - }, - getAccount: { - returns: "Account", - }, - getExtendedKeyAccountCreationInfo: { - returns: "ExtendedKeyAccountCreationInfo", - }, - newAccountWithExtendedKeyInfo: { - params: ["ExtendedKeyAccountCreationInfo"], - returns: "Account", - }, - }, - }); - - declare("Account", { - methods: { - getBalance: { - returns: "Amount", - }, - getLastBlock: { - returns: "Block", - }, - getFreshPublicAddresses: { - returns: ["Address"], - }, - getRestoreKey: {}, - asBitcoinLikeAccount: { - returns: "BitcoinLikeAccount", - }, - synchronize: { - returns: "EventBus", - }, - queryOperations: { - returns: "OperationQuery", - }, - }, - }); - - declare("Operation", { - methods: { - getDate: {}, - asBitcoinLikeOperation: { - returns: "BitcoinLikeOperation", - }, - getOperationType: {}, - getAmount: { returns: "Amount" }, - getFees: { returns: "Amount" }, - getBlockHeight: {}, - getRecipients: {}, - getSenders: {}, - }, - }); - - declare("Currency", { - methods: { - getBitcoinLikeNetworkParameters: { - returns: "BitcoinLikeNetworkParameters", - }, - }, - }); - - declare("BigInt", { - methods: { - toString: {}, - }, - }); - - declare("Amount", { - statics: { - fromHex: { - params: ["Currency"], - returns: "Amount", - }, - }, - methods: { - toBigInt: { - returns: "BigInt", - }, - }, - }); - - declare("Block", { - methods: { - getHeight: {}, - }, - }); - - declare("DerivationPath", { - methods: { - toString: {}, - isNull: {}, - }, - }); - - declare("BitcoinLikeInput", { - methods: { - getPreviousTransaction: { - returns: "hex", - }, - getPreviousOutputIndex: {}, - getSequence: {}, - getDerivationPath: { returns: ["DerivationPath"] }, - getAddress: {}, - }, - }); - - declare("BitcoinLikeOutput", { - methods: { - getDerivationPath: { - returns: "DerivationPath", - }, - getAddress: {}, - }, - }); - - declare("BitcoinLikeTransaction", { - methods: { - getHash: {}, - getFees: { - returns: "Amount", - }, - getInputs: { - returns: ["BitcoinLikeInput"], - }, - getOutputs: { - returns: ["BitcoinLikeOutput"], - }, - serializeOutputs: { - returns: "hex", - }, - getTimestamp: {}, - }, - }); - - declare("BitcoinLikeOperation", { - methods: { - getTransaction: { - returns: "BitcoinLikeTransaction", - }, - }, - }); - - declare("Address", { - statics: { - isValid: { - params: [null, "Currency"], - }, - }, - methods: { - toString: {}, - getDerivationPath: {}, - }, - }); - - declare("BitcoinLikeTransactionBuilder", { - methods: { - sendToAddress: { - params: ["Amount"], - }, - pickInputs: {}, - setFeesPerByte: { - params: ["Amount"], - }, - build: { returns: "BitcoinLikeTransaction" }, - }, - }); - - declare("BitcoinLikeAccount", { - methods: { - buildTransaction: { - returns: "BitcoinLikeTransactionBuilder", - }, - broadcastRawTransaction: {}, - }, - }); - - declare("OperationQuery", { - methods: { - complete: { returns: "OperationQuery" }, - addOrder: { returns: "OperationQuery" }, - execute: { returns: ["Operation"] }, - }, - }); - - declare("AccountCreationInfo", { - statics: { - init: { - returns: "AccountCreationInfo", - }, - }, - methods: { - getDerivations: {}, - getChainCodes: {}, - getPublicKeys: {}, - getOwners: {}, - getIndex: {}, - }, - }); - - declare("BitcoinLikeNetworkParameters", { - methods: { - getSigHash: { - returns: "hex", - }, - getUsesTimestampedTransaction: {}, - }, - }); - - declare("ExtendedKeyAccountCreationInfo", { - statics: { - init: { - returns: "ExtendedKeyAccountCreationInfo", - }, - }, - methods: { - getIndex: {}, - getExtendedKeys: {}, - getOwners: {}, - getDerivations: {}, - }, - }); - - declare("DynamicObject", { - statics: { - flush: {}, - newInstance: { - returns: "DynamicObject", - }, - }, - methods: { - putString: {}, - }, - }); - - declare("SerialContext", {}); - - declare("ThreadDispatcher", { - statics: { - newInstance: { - returns: "ThreadDispatcher", - }, - }, - methods: { - getMainExecutionContext: { - returns: "SerialContext", - }, - }, - }); - - declare("EventBus", { - methods: { - subscribe: { - params: ["SerialContext", "EventReceiver"], - }, - }, - }); - - declare("EventReceiver", { - statics: { - newInstance: { - returns: "EventReceiver", - }, - }, - }); - - declare("HttpClient", { - statics: { - newInstance: { - returns: "HttpClient", - }, - flush: {}, - }, - }); - - declare("WebSocketClient", { - statics: { - newInstance: { - returns: "WebSocketClient", - }, - flush: {}, - }, - }); - - declare("PathResolver", { - statics: { - newInstance: { - returns: "PathResolver", - }, - flush: {}, - }, - }); - - declare("LogPrinter", { - statics: { - newInstance: { - returns: "LogPrinter", - }, - flush: {}, - }, - }); - - declare("RandomNumberGenerator", { - statics: { - newInstance: { - returns: "RandomNumberGenerator", - }, - flush: {}, - }, - }); - - declare("DatabaseBackend", { - statics: { - flush: {}, - getSqlite3Backend: { - returns: "DatabaseBackend", - }, - }, - }); - - const cs: CoreStatics = mappings; - - const threadDispatcher = await cs.ThreadDispatcher.newInstance(); - const httpClient = await cs.HttpClient.newInstance(); - const webSocket = await cs.WebSocketClient.newInstance(); - const pathResolver = await cs.PathResolver.newInstance(); - const logPrinter = await cs.LogPrinter.newInstance(); - const rng = await cs.RandomNumberGenerator.newInstance(); - const backend = await cs.DatabaseBackend.getSqlite3Backend(); - const walletDynObject = await cs.DynamicObject.newInstance(); - const walletPoolInstance = await cs.WalletPool.newInstance( - "ledger_live_mobile", - "", - httpClient, - webSocket, - pathResolver, - logPrinter, - threadDispatcher, - rng, - backend, - walletDynObject, - ); - - const core: Core = { - ...cs, - - flush: () => - Promise.all([ - cs.HttpClient.flush(), - cs.WebSocketClient.flush(), - cs.PathResolver.flush(), - cs.LogPrinter.flush(), - cs.RandomNumberGenerator.flush(), - cs.DynamicObject.flush(), - cs.DatabaseBackend.flush(), - ]).then(() => undefined), - - getPoolInstance: () => walletPoolInstance, - - getThreadDispatcher: () => threadDispatcher, - }; - - return core; -} diff --git a/src/locales/en/common.json b/src/locales/en/common.json index 20fef99f84..64db19a23a 100644 --- a/src/locales/en/common.json +++ b/src/locales/en/common.json @@ -71,6 +71,10 @@ "title": "Sorry, try again (genuine-close)", "description": null }, + "DeviceHalted": { + "title": "Please restart your Ledger device and retry", + "description": "An unexpected error occurred, so please try again" + }, "DeviceNotGenuine": { "title": "Possibly not genuine", "description": "Request Ledger Support assistance." diff --git a/src/logic/accountModel.js b/src/logic/accountModel.js index eeb2b4badd..a96515805c 100644 --- a/src/logic/accountModel.js +++ b/src/logic/accountModel.js @@ -1,6 +1,4 @@ // @flow -import { BigNumber } from "bignumber.js"; -import { getCryptoCurrencyById } from "@ledgerhq/live-common/lib/currencies"; import { createDataModel } from "@ledgerhq/live-common/lib/DataModel"; import type { DataModel } from "@ledgerhq/live-common/lib/DataModel"; import type { @@ -8,6 +6,10 @@ import type { AccountRaw, Operation, } from "@ledgerhq/live-common/lib/types"; +import { + fromAccountRaw, + toAccountRaw, +} from "@ledgerhq/live-common/lib/account"; /** * @memberof models/account @@ -22,67 +24,13 @@ const opRetentionFilter = opRetentionStategy(366, 100); const accountModel: DataModel = createDataModel({ migrations: [], + decode: fromAccountRaw, - decode: (rawAccount: AccountRaw): Account => { - const { - currencyId, - unitMagnitude, - operations, - pendingOperations, - lastSyncDate, - balance, - tokenAccounts, - ...acc - } = rawAccount; - const currency = getCryptoCurrencyById(currencyId); - const unit = - currency.units.find(u => u.magnitude === unitMagnitude) || - currency.units[0]; - const convertOperation = ({ date, value, fee, ...op }) => ({ - ...op, - accountId: acc.id, - date: new Date(date), - value: BigNumber(value), - fee: BigNumber(fee), - }); - return { - ...acc, - balance: BigNumber(balance), - operations: operations.map(convertOperation), - pendingOperations: pendingOperations.map(convertOperation), - unit, - currency, - lastSyncDate: new Date(lastSyncDate), - }; - }, - - encode: ({ - currency, - operations, - pendingOperations, - unit, - lastSyncDate, - balance, - tokenAccounts, - ...acc - }: Account): AccountRaw => { - const convertOperation = ({ date, value, fee, ...op }) => ({ - ...op, - date: date.toISOString(), - value: value.toString(), - fee: fee.toString(), - }); - - return { - ...acc, - operations: operations.filter(opRetentionFilter).map(convertOperation), - pendingOperations: pendingOperations.map(convertOperation), - currencyId: currency.id, - unitMagnitude: unit.magnitude, - lastSyncDate: lastSyncDate.toISOString(), - balance: balance.toString(), - }; - }, + encode: (account: Account): AccountRaw => + toAccountRaw({ + ...account, + operations: account.operations.filter(opRetentionFilter), + }), }); export default accountModel; diff --git a/src/reducers/appstate.js b/src/reducers/appstate.js index 33044e598c..378a67c792 100644 --- a/src/reducers/appstate.js +++ b/src/reducers/appstate.js @@ -2,7 +2,7 @@ /* eslint import/no-cycle: 0 */ import { handleActions } from "redux-actions"; import { createSelector } from "reselect"; -import { NetworkDown } from "@ledgerhq/live-common/lib/errors"; +import { NetworkDown } from "@ledgerhq/errors"; import type { State } from "."; export type AsyncState = { diff --git a/src/screens/DebugIcons.js b/src/screens/DebugIcons.js index 96351e9835..3f53d88936 100644 --- a/src/screens/DebugIcons.js +++ b/src/screens/DebugIcons.js @@ -3,7 +3,7 @@ import React, { Component } from "react"; import { StyleSheet } from "react-native"; import { SafeAreaView, ScrollView } from "react-navigation"; -import { UserRefusedAddress } from "@ledgerhq/live-common/lib/errors"; +import { UserRefusedAddress } from "@ledgerhq/errors"; import colors from "../colors"; import DeviceNanoAction from "../components/DeviceNanoAction"; diff --git a/src/screens/Manager/FirmwareVersionRow.js b/src/screens/Manager/FirmwareVersionRow.js index 6134af59e6..d97b22e2d3 100644 --- a/src/screens/Manager/FirmwareVersionRow.js +++ b/src/screens/Manager/FirmwareVersionRow.js @@ -25,7 +25,7 @@ class FirmwareVersionRow extends PureComponent { bottom > - {deviceInfo.seVersion} + {deviceInfo.version} ); diff --git a/src/screens/Manager/index.js b/src/screens/Manager/index.js index 63c5a351c2..2323ff5372 100644 --- a/src/screens/Manager/index.js +++ b/src/screens/Manager/index.js @@ -109,10 +109,9 @@ class ChooseDevice extends Component< }; onSelect = (meta: Object) => { - const { fullVersion, seVersion, mcuVersion } = meta.deviceInfo; + const { version, mcuVersion } = meta.deviceInfo; track("ManagerDeviceEntered", { - fullVersion, - seVersion, + version, mcuVersion, }); this.props.navigation.navigate("ManagerMain", { diff --git a/src/screens/PairDevices/RenderError.js b/src/screens/PairDevices/RenderError.js index 490a61f8be..59c3bbe42d 100644 --- a/src/screens/PairDevices/RenderError.js +++ b/src/screens/PairDevices/RenderError.js @@ -4,10 +4,7 @@ import React, { Component } from "react"; import { StyleSheet, View } from "react-native"; import { BleErrorCode } from "react-native-ble-plx"; import { Trans } from "react-i18next"; -import { - PairingFailed, - GenuineCheckFailed, -} from "@ledgerhq/live-common/lib/errors"; +import { PairingFailed, GenuineCheckFailed } from "@ledgerhq/errors"; import LocationRequired from "../LocationRequired"; import { TrackScreen } from "../../analytics"; import Touchable from "../../components/Touchable"; diff --git a/src/screens/ReceiveFunds/03-Confirmation.js b/src/screens/ReceiveFunds/03-Confirmation.js index d5fbd7a25a..7b3c396676 100644 --- a/src/screens/ReceiveFunds/03-Confirmation.js +++ b/src/screens/ReceiveFunds/03-Confirmation.js @@ -133,12 +133,12 @@ class ReceiveConfirmation extends Component { rejectionOp(), ) : from( - getAddress( - transport, - account.currency, - account.freshAddressPath, - true, - ), + getAddress(transport, { + derivationMode: account.derivationMode, + currency: account.currency, + path: account.freshAddressPath, + verify: true, + }), ), ).subscribe({ complete: () => { diff --git a/src/screens/SendFunds/06-Validation.js b/src/screens/SendFunds/06-Validation.js index c03b180582..02c708cc98 100644 --- a/src/screens/SendFunds/06-Validation.js +++ b/src/screens/SendFunds/06-Validation.js @@ -6,7 +6,7 @@ import { SafeAreaView } from "react-navigation"; import type { NavigationScreenProp } from "react-navigation"; import { translate } from "react-i18next"; import i18next from "i18next"; -import { UserRefusedOnDevice } from "@ledgerhq/live-common/lib/errors"; +import { UserRefusedOnDevice } from "@ledgerhq/errors"; import type { Account } from "@ledgerhq/live-common/lib/types"; import { updateAccountWithUpdater } from "../../actions/accounts"; diff --git a/src/screens/Settings/General/ConfirmPassword.js b/src/screens/Settings/General/ConfirmPassword.js index 822effece9..2cdbb48877 100644 --- a/src/screens/Settings/General/ConfirmPassword.js +++ b/src/screens/Settings/General/ConfirmPassword.js @@ -6,7 +6,7 @@ import { connect } from "react-redux"; import { compose } from "redux"; import { translate } from "react-i18next"; import i18next from "i18next"; -import { PasswordsDontMatchError } from "@ledgerhq/live-common/lib/errors"; +import { PasswordsDontMatchError } from "@ledgerhq/errors"; import { Vibration } from "react-native"; import { setPrivacy } from "../../../actions/settings"; import type { Privacy } from "../../../reducers/settings"; diff --git a/src/screens/Settings/General/PasswordRemove.js b/src/screens/Settings/General/PasswordRemove.js index 2623958228..d66e6bf21c 100644 --- a/src/screens/Settings/General/PasswordRemove.js +++ b/src/screens/Settings/General/PasswordRemove.js @@ -6,7 +6,7 @@ import { connect } from "react-redux"; import { compose } from "redux"; import { translate } from "react-i18next"; import i18next from "i18next"; -import { PasswordsDontMatchError } from "@ledgerhq/live-common/lib/errors"; +import { PasswordsDontMatchError } from "@ledgerhq/errors"; import { Vibration } from "react-native"; import { disablePrivacy } from "../../../actions/settings"; import type { T } from "../../../types/common"; diff --git a/yarn.lock b/yarn.lock index fe57dcd622..a75203b42e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -746,83 +746,91 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@ledgerhq/devices@4.48.0", "@ledgerhq/devices@^4.48.0": - version "4.48.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-4.48.0.tgz#b62cce08dd49a8bd4cbf0eda0e09bf8610e42b56" - integrity sha512-Rs0zhkjzJTps1hoHlwGLhPM8Poo8EzE55QGLWk4Q6oXoO/Nk6MRUrFaz2UuCBVQU5RaI2JPhDbwO9bPd9cVH1Q== +"@ledgerhq/devices@4.54.0", "@ledgerhq/devices@^4.54.0": + version "4.54.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-4.54.0.tgz#6345f6c0e6cf8fc16ac1a476df610e69d273cd76" + integrity sha512-v6E4PK6bej/CmMSMVasFWWy1iyh42XaHmUpp5i992/n+PiVQQL5qnQlgXpCq2ZoFinfpnFc7y2lv3qSxAqQimQ== dependencies: - "@ledgerhq/errors" "^4.48.0" + "@ledgerhq/errors" "^4.54.0" -"@ledgerhq/errors@4.50.0", "@ledgerhq/errors@^4.48.0", "@ledgerhq/errors@^4.50.0": - version "4.50.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-4.50.0.tgz#d330e396d47bbbe474fe0adfa087eeb7edd76912" - integrity sha512-Xg5GTDUWprVJ5zCWtfESLfI1qyr09JQH8pLtWDCkz3GxlwnFPtMAvKB9qUoc2Ou4zJ9DfsZdS8KaZ/2VKXkYGA== +"@ledgerhq/errors@4.54.0", "@ledgerhq/errors@^4.54.0": + version "4.54.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-4.54.0.tgz#e0655188714ca3750d3964faa0f01ebf76ecd455" + integrity sha512-BbAiJHzw/EtIp/HBhDUTbAGj+1cYGGmnrlXSccIxt/MFwcgrX2KgPFbTIAiJJYmPkUSdY4eucyrB9YohzfGCkw== -"@ledgerhq/hw-app-btc@4.48.0", "@ledgerhq/hw-app-btc@^4.48.0": - version "4.48.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-btc/-/hw-app-btc-4.48.0.tgz#d04080845ecb55474f3faa09411cb1f793467d77" - integrity sha512-7W09kHtYi/AN/lirAJW8uGnFKL4uBEtQe+zlToT8952O9WoNpO5d14HrLPQaBOMK20xENiVxk9j7De6qgNhzqQ== +"@ledgerhq/hw-app-btc@4.54.0", "@ledgerhq/hw-app-btc@^4.54.0": + version "4.54.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-btc/-/hw-app-btc-4.54.0.tgz#664d4b7778c96befdbe58cc6f76246ff4ee388f9" + integrity sha512-vh5yMkB27AhmxH9GB+Auu911KHAJB6yDhjNv917F/EPXYygyoX+YhBjGe5VGavEf2brnb0h+Ut9ShuBk5La5Cw== dependencies: - "@ledgerhq/hw-transport" "^4.48.0" + "@ledgerhq/hw-transport" "^4.54.0" create-hash "^1.1.3" -"@ledgerhq/hw-app-eth@4.48.0", "@ledgerhq/hw-app-eth@^4.48.0": - version "4.48.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-4.48.0.tgz#230f67c2c06ba6bd4176b7b2b1ad46e5efdde505" - integrity sha512-lNdQOFDeAda8f/X6qP27FCtfhUX5eMuaL23aqfqu5Pfp92/FiHTkE2SOTcO0bjQK3/KsIF/ZSDzxtWvv8vkgkA== +"@ledgerhq/hw-app-eth@4.54.0": + version "4.54.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-4.54.0.tgz#e0603eece9284dab6f981b84d7ca8adf570299b1" + integrity sha512-uWavxpcQ2S/HcGoSehAyvMY92b3lrSANc1gQ2umqBbAZCi7RNhM3KnIbtzvq2gPkqHF1xJyT2cf1QEvYrMGmCg== dependencies: - "@ledgerhq/hw-transport" "^4.48.0" + "@ledgerhq/errors" "^4.54.0" + "@ledgerhq/hw-transport" "^4.54.0" -"@ledgerhq/hw-app-xrp@4.48.0", "@ledgerhq/hw-app-xrp@^4.48.0": - version "4.48.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-xrp/-/hw-app-xrp-4.48.0.tgz#21504114111a7c62b83256b548d193043c39b4b8" - integrity sha512-NpELCzeRFu6ZkqAE+7y1GF+sJv2hESdlEtA3I+d+abrlsRi9ferhN3BofQliThYnkCkgYsACmnmHhbzo7QDXgg== +"@ledgerhq/hw-app-xrp@4.54.0", "@ledgerhq/hw-app-xrp@^4.54.0": + version "4.54.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-xrp/-/hw-app-xrp-4.54.0.tgz#4a111bdf3c5430cfbf163958657ab5680337fe33" + integrity sha512-W0iyuK3jmE6rSuFgyDJ2F5Sg6//uauurP61ktjy1cCk+gT61ijBS4J6MiJVxgzotcDoyD8xDO9+WI0q64NhCIg== dependencies: - "@ledgerhq/hw-transport" "^4.48.0" + "@ledgerhq/hw-transport" "^4.54.0" bip32-path "0.4.2" -"@ledgerhq/hw-transport-http@4.48.0": - version "4.48.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-http/-/hw-transport-http-4.48.0.tgz#07b58f352631c61a5e24e55fcae4d888d9175982" - integrity sha512-8TtrxIZBXVFbA++EjJW5Z7+citNilxhDKfzhZkHX+ZXAHTFVPOH996b6WYipSv+DqOBPV3wlwT05HIrIUL/7pA== +"@ledgerhq/hw-transport-http@4.54.0": + version "4.54.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-http/-/hw-transport-http-4.54.0.tgz#14673422510d3e0f7de97e84a0ee909d529ba71e" + integrity sha512-XHTM2/OiDqT9lSGqX3ZxzyKHqBMnmFE3XjKB9ZHVmltoS8Vqo+szmQv3BCotMIw4wAHMyKrx92tZOrM9RLr2vA== dependencies: - "@ledgerhq/errors" "^4.48.0" - "@ledgerhq/hw-transport" "^4.48.0" + "@ledgerhq/errors" "^4.54.0" + "@ledgerhq/hw-transport" "^4.54.0" axios "^0.18.0" ws "^6.1.4" -"@ledgerhq/hw-transport@4.48.0", "@ledgerhq/hw-transport@^4.48.0": - version "4.48.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-4.48.0.tgz#8fa09e46d9d9aab35db5679e0970e7fed2ee73bf" - integrity sha512-dZH/3dTXlhe3IFl+MRFePcC0TnSeQcaBuiq5t3yDA68qw7WZCbON9GKSO5Rex4yNx5v6BCHyzz1myBFJ7895iw== +"@ledgerhq/hw-transport-mocker@^4.54.0": + version "4.54.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-mocker/-/hw-transport-mocker-4.54.0.tgz#2bd8532a44bcf1731c726d83bb37af3a052d7557" + integrity sha512-zMjxxVyjwzAhEzm0ft53cWHtpKTSL9qZ1TOZExIi8xK8ABNbHnTt3PyJ43YSx94ZsnRzT4d/xEzp5hoq5azUBA== dependencies: - "@ledgerhq/devices" "^4.48.0" - "@ledgerhq/errors" "^4.48.0" + "@ledgerhq/hw-transport" "^4.54.0" + +"@ledgerhq/hw-transport@4.54.0", "@ledgerhq/hw-transport@^4.54.0": + version "4.54.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-4.54.0.tgz#befa14a4a3ba5810ca6b7ffbd6b94bce861ddf88" + integrity sha512-9UCr35O0Fn7ib0R9BsgY9jXHL/bGCQF66GYOD2GCwLWDVnK5eVewS6J+ljxhWOIsV75OcqJtylRO0mAGOD6tWg== + dependencies: + "@ledgerhq/devices" "^4.54.0" + "@ledgerhq/errors" "^4.54.0" events "^3.0.0" -"@ledgerhq/live-common@4.42.0": - version "4.42.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/live-common/-/live-common-4.42.0.tgz#06d667d72631c966e2511c7f9befadc02ec07114" - integrity sha512-Tc28UIoS6BRi+XXYpUbdIt4YDG/xasVKUEKnaE8o8DV44ArkjU/SbFM7wINr4pxJrm4S1s0LtId3ID5ZyqPCbw== - dependencies: - "@ledgerhq/errors" "^4.50.0" - "@ledgerhq/hw-app-btc" "^4.48.0" - "@ledgerhq/hw-app-eth" "^4.48.0" - "@ledgerhq/hw-app-xrp" "^4.48.0" - "@ledgerhq/hw-transport" "^4.48.0" - bignumber.js "^7.2.1" +"@ledgerhq/live-common@^5.0.0-alpha.18": + version "5.0.0-alpha.18" + resolved "https://registry.yarnpkg.com/@ledgerhq/live-common/-/live-common-5.0.0-alpha.18.tgz#a042e1bc001d662cf19e3d4c98fce47f97f7d99b" + integrity sha512-fT+9PTETVeyV8IH940M7ZYABoAW0yOOgyVBQDrmnhsQ/eGECRq/J7AzzgGjQ47vQvg/Ji6ovJknXlIK+gxgphA== + dependencies: + "@ledgerhq/errors" "^4.54.0" + "@ledgerhq/hw-app-btc" "^4.54.0" + "@ledgerhq/hw-app-eth" "4.54.0" + "@ledgerhq/hw-app-xrp" "^4.54.0" + "@ledgerhq/hw-transport" "^4.54.0" + "@ledgerhq/hw-transport-mocker" "^4.54.0" + bignumber.js "^8.1.1" compressjs gre/compressjs#hermit eip55 "^1.0.3" ethereumjs-tx "^1.3.7" invariant "^2.2.2" lodash "^4.17.11" numeral "^2.0.6" - prando "^3.0.1" + prando "^5.1.0" react "*" - react-i18next "^8.0.7" - react-redux "^5.0.7" + react-redux "5" redux "^4.0.0" - reselect "^3.0.1" + reselect "^4.0.0" ripple-binary-codec "^0.2.0" ripple-bs58check "^2.0.2" ripple-hashes "^0.3.1" @@ -830,24 +838,24 @@ rxjs "^6.3.3" rxjs-compat "^6.3.3" -"@ledgerhq/react-native-hid@4.48.0": - version "4.48.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/react-native-hid/-/react-native-hid-4.48.0.tgz#cf7447ae92ebfa42baa664fb2d5e1e8f5a4c8305" - integrity sha512-2MtfY2FU6lfLKX9nLTkYDFrmPhcqqHwa3p1HMX18kwc0WdKEHzHDNs28kK1YIReI5nPy/aYgSSUXDmFHNmDK8Q== +"@ledgerhq/react-native-hid@4.54.0": + version "4.54.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/react-native-hid/-/react-native-hid-4.54.0.tgz#7349b0493a66c0bf12a1d0aec698eb1e539d140e" + integrity sha512-E0QnsRhchpehXIdya7iVjXeROTOTRe4EwE/OwOxFJ5eCaU0g+7h4gthp7U7BV53MZc60AN1vT3e1Z2XXes1EAA== dependencies: - "@ledgerhq/devices" "^4.48.0" - "@ledgerhq/errors" "^4.48.0" - "@ledgerhq/hw-transport" "^4.48.0" + "@ledgerhq/devices" "^4.54.0" + "@ledgerhq/errors" "^4.54.0" + "@ledgerhq/hw-transport" "^4.54.0" rxjs "^6.4.0" -"@ledgerhq/react-native-hw-transport-ble@4.48.0": - version "4.48.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/react-native-hw-transport-ble/-/react-native-hw-transport-ble-4.48.0.tgz#c3ade558193716e1ff977cba5e6aaccd0ea5da3c" - integrity sha512-RouKKDR/fY1XttDq6bDeYAQZjnWzXpZFhLKS0e/sCrMaNQjcQ7HdBhglVPx5sAe3MzJycdKpc2LClYJD4MvkGw== +"@ledgerhq/react-native-hw-transport-ble@4.54.0": + version "4.54.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/react-native-hw-transport-ble/-/react-native-hw-transport-ble-4.54.0.tgz#929210c94abbb990cc9b7c00a4ffd60a3b00450b" + integrity sha512-AE4Xh5k40dTsn15LzwJ94IdV9pB+wIAJiWI0qHd87wAihCyr1d3KFPtig9dO2IbT3XUJKzqgYe7A2Di8KvbrqQ== dependencies: - "@ledgerhq/devices" "^4.48.0" - "@ledgerhq/errors" "^4.48.0" - "@ledgerhq/hw-transport" "^4.48.0" + "@ledgerhq/devices" "^4.54.0" + "@ledgerhq/errors" "^4.54.0" + "@ledgerhq/hw-transport" "^4.54.0" invariant "^2.2.4" rxjs "^6.4.0" uuid "^3.3.2" @@ -1367,13 +1375,20 @@ async@^1.4.0: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.1.4, async@^2.4.0, async@^2.6.1: +async@^2.1.4, async@^2.4.0: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== dependencies: lodash "^4.17.10" +async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + dependencies: + lodash "^4.17.11" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1761,10 +1776,10 @@ bignumber.js@^4.1.0: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" integrity sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA== -bignumber.js@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" - integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== +bignumber.js@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.1.1.tgz#4b072ae5aea9c20f6730e4e5d529df1271c4d885" + integrity sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ== binary@~0.3.0: version "0.3.0" @@ -1968,10 +1983,10 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= -buffer@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.0.tgz#53cf98241100099e9eeae20ee6d51d21b16e541e" - integrity sha512-nUJyfChH7PMJy75eRDCCKtszSEFokUNXC1hNVSe+o+VdcgvDPLs20k3v8UXI8ruRYAJiYtyRea8mYyqPxoHWDw== +buffer@5.2.1, buffer@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -1985,14 +2000,6 @@ buffer@^4.9.1: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" - integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - buffers@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" @@ -2628,10 +2635,10 @@ data-urls@^1.0.0: whatwg-mimetype "^2.0.0" whatwg-url "^6.4.0" -date-fns@^1.29.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" - integrity sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw== +date-fns@^1.30.1: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== date-now@^0.1.4: version "0.1.4" @@ -4140,6 +4147,13 @@ hoist-non-react-statics@^3.0.1: dependencies: react-is "^16.3.2" +hoist-non-react-statics@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" + integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== + dependencies: + react-is "^16.7.0" + home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -4350,7 +4364,7 @@ inquirer@^6.2.0: strip-ansi "^5.0.0" through "^2.3.6" -invariant@2.2.4, invariant@^2.0.0, invariant@^2.2.0, invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: +invariant@2.2.4, invariant@^2.2.0, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -5274,6 +5288,11 @@ jsx-ast-utils@^2.0.1: dependencies: array-includes "^3.0.3" +just-curry-it@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/just-curry-it/-/just-curry-it-3.1.0.tgz#ab59daed308a58b847ada166edd0a2d40766fbc5" + integrity sha512-mjzgSOFzlrurlURaHVjnQodyPNvrHrf1TbQP2XU9NSqBtHQPuHZ+Eb6TAJP7ASeJN9h9K0KXoRTs8u6ouHBKvg== + keccak@^1.0.2, keccak@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" @@ -5472,26 +5491,11 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash-es@^4.17.5: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.10.tgz#62cd7104cdf5dd87f235a837f0ede0e8e5117e05" - integrity sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg== - lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -lodash.curry@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" - integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= - lodash.merge@4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" @@ -5522,27 +5526,27 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= -lodash@4.17.10, lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.6.1: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== +lodash@4.17.11, lodash@^4.12.0, lodash@^4.17.11, lodash@^4.17.4: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== lodash@^3.10.0: version "3.10.1" resolved "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.12.0, lodash@^4.17.11, lodash@^4.17.4: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.6.1: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -6760,11 +6764,16 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -prando@^3.0.1, prando@^3.0.3: +prando@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/prando/-/prando-3.0.3.tgz#1248d6d3c07e70bd645ef7bdaaa21c35d0d6d2e0" integrity sha512-IH0vTSR3ErVGEJt7QQLWRay6n3CVbHX7gB8NITB5X0uxAWd236hdLYVOZ49V/seQuNRqhbqE0igqtERTho7zNQ== +prando@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/prando/-/prando-5.1.0.tgz#f0aab737ba0c356e2f2f9e3088b9118e42b05f51" + integrity sha512-UkXcaSqEoMz2S5O/uhb9emINjP1qM9vClszDSPCIVhI7s696tVCNS5qbm5b7qSwMlpLS3rih4NHFZdPzwHTtSQ== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -6843,7 +6852,7 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2: +prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== @@ -7013,7 +7022,7 @@ react-devtools-core@^3.4.2: shell-quote "^1.6.1" ws "^3.3.1" -react-i18next@8, react-i18next@^8.0.7: +react-i18next@8: version "8.4.0" resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-8.4.0.tgz#e9f0c5b9938b155eaa6051360614719c08cae72f" integrity sha512-zIO/bc1L0UUGdaws2y40cTiSQHuQud5e9SSodYM6MTzhJTI3iayxCCdgvotblOLM4taOD77Ct2/fUbheQIhyeg== @@ -7023,12 +7032,12 @@ react-i18next@8, react-i18next@^8.0.7: hoist-non-react-statics "3.0.1" html-parse-stringify2 "2.0.1" -react-is@^16.3.2, react-is@^16.5.2, react-is@^16.6.3: - version "16.8.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.1.tgz#a80141e246eb894824fb4f2901c0c50ef31d4cdb" - integrity sha512-ioMCzVDWvCvKD8eeT+iukyWrBGrA3DiFYkXfBsVYIRdaREZuBjENG+KjrikavCLasozqRWTwFUagU/O4vPpRMA== +react-is@^16.3.2, react-is@^16.5.2, react-is@^16.6.0, react-is@^16.6.3, react-is@^16.7.0: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" + integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== -react-lifecycles-compat@^3.0.4: +react-lifecycles-compat@^3.0.0, 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" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== @@ -7369,17 +7378,18 @@ react-proxy@^1.1.7: lodash "^4.6.1" react-deep-force-update "^1.0.0" -react-redux@5.0.7, react-redux@^5.0.7: - version "5.0.7" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8" - integrity sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg== +react-redux@5, react-redux@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.1.tgz#88e368682c7fa80e34e055cd7ac56f5936b0f52f" + integrity sha512-LE7Ned+cv5qe7tMV5BPYkGQ5Lpg8gzgItK07c67yHvJ8t0iaD9kPFPAli/mYkiyJYrs2pJgExR2ZgsGqlrOApg== dependencies: - hoist-non-react-statics "^2.5.0" - invariant "^2.0.0" - lodash "^4.17.5" - lodash-es "^4.17.5" + "@babel/runtime" "^7.1.2" + hoist-non-react-statics "^3.1.0" + invariant "^2.2.4" loose-envify "^1.1.0" - prop-types "^15.6.0" + prop-types "^15.6.1" + react-is "^16.6.0" + react-lifecycles-compat "^3.0.0" react-test-renderer@16.6.3: version "16.6.3" @@ -7518,32 +7528,33 @@ realpath-native@^1.0.0: dependencies: util.promisify "^1.0.0" -reduce-reducers@^0.1.0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-0.1.5.tgz#ff77ca8068ff41007319b8b4b91533c7e0e54576" - integrity sha512-uoVmQnZQ+BtKKDKpBdbBri5SLNyIK9ULZGOA504++VbHcwouWE+fJDIo8AuESPF9/EYSkI0v05LDEQK6stCbTA== +reduce-reducers@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-0.4.3.tgz#8e052618801cd8fc2714b4915adaa8937eb6d66c" + integrity sha512-+CNMnI8QhgVMtAt54uQs3kUxC3Sybpa7Y63HR14uGLgI9/QR5ggHvpxwhGGe3wmx5V91YwqQIblN9k5lspAmGw== -redux-actions@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/redux-actions/-/redux-actions-2.6.1.tgz#42c06e94739fbe6db35db3605abb105bdb3724d8" - integrity sha1-QsBulHOfvm2zXbNgWrsQW9s3JNg= +redux-actions@2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/redux-actions/-/redux-actions-2.6.5.tgz#bdca548768ee99832a63910c276def85e821a27e" + integrity sha512-pFhEcWFTYNk7DhQgxMGnbsB1H2glqhQJRQrtPb96kD3hWiZRzXHwwmFPswg6V2MjraXRXWNmuP9P84tvdLAJmw== dependencies: - invariant "^2.2.1" - lodash.camelcase "^4.3.0" - lodash.curry "^4.1.1" - reduce-reducers "^0.1.0" + invariant "^2.2.4" + just-curry-it "^3.1.0" + loose-envify "^1.4.0" + reduce-reducers "^0.4.3" + to-camel-case "^1.0.0" redux-thunk@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== -redux@4.0.0, redux@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.0.tgz#aa698a92b729315d22b34a0553d7e6533555cc03" - integrity sha512-NnnHF0h0WVE/hXyrB6OlX67LYRuaf/rJcbWvnHHEPCF/Xa/AZpwhs/20WyqzQae5x4SD2F9nPObgBh2rxAgLiA== +redux@4.0.1, redux@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5" + integrity sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg== dependencies: - loose-envify "^1.1.0" + loose-envify "^1.4.0" symbol-observable "^1.2.0" regenerate-unicode-properties@^7.0.0: @@ -7706,11 +7717,16 @@ require-uncached@^1.0.3: caller-path "^0.1.0" resolve-from "^1.0.0" -reselect@3.0.1, reselect@^3.0.1: +reselect@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= +reselect@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" + integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -7941,15 +7957,10 @@ rx-lite@*, rx-lite@^4.0.8: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= -rxjs-compat@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/rxjs-compat/-/rxjs-compat-6.3.1.tgz#9ad8a76110bb0f37fa7906be377909970135b909" - integrity sha512-WK5N7xfx4sbOUAg5r47DUQdjZKvxb5dfRFId6QHbSlA6uQs22N7vlVvodnItotz2dDWgLLqhzO9ByyZofQ2MZg== - -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-compat@^6.3.3, rxjs-compat@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/rxjs-compat/-/rxjs-compat-6.4.0.tgz#800923c15697948e1f30f18c531b12b49451c75c" + integrity sha512-eo/O8RS83hJdJukCtA+IF6qnqa8FPOuVo+OPCzgVi+dbTle9KCdNv97IcQO0WwNVik7DJLKmf0F8uwzc0q40vw== rxjs@5.5.2: version "5.5.2" @@ -7958,28 +7969,7 @@ rxjs@5.5.2: dependencies: symbol-observable "^1.0.1" -rxjs@6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" - integrity sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ== - dependencies: - tslib "^1.9.0" - -rxjs@^6.1.0: - version "6.3.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f" - integrity sha512-hV7criqbR0pe7EeL3O66UYVg92IR0XsA97+9y+BWTePK9SKmEI5Qd3Zj6uPnGkNzXsBywBQWTvujPl+1Kn9Zjw== - 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" - -rxjs@^6.4.0: +rxjs@6.4.0, rxjs@^6.1.0, rxjs@^6.3.3, rxjs@^6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== @@ -8641,6 +8631,13 @@ tmpl@1.0.x: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= +to-camel-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-camel-case/-/to-camel-case-1.0.0.tgz#1a56054b2f9d696298ce66a60897322b6f423e46" + integrity sha1-GlYFSy+daWKYzmamCJcyK29CPkY= + dependencies: + to-space-case "^1.0.0" + to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -8651,6 +8648,11 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= +to-no-case@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a" + integrity sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo= + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -8676,6 +8678,13 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +to-space-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-1.0.0.tgz#b052daafb1b2b29dc770cea0163e5ec0ebc9fc17" + integrity sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc= + dependencies: + to-no-case "^1.0.0" + tough-cookie@>=2.3.3, tough-cookie@^2.3.4: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -9379,10 +9388,10 @@ yargs@~3.10.0: decamelize "^1.0.0" window-size "0.1.0" -yarn-deduplicate@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/yarn-deduplicate/-/yarn-deduplicate-1.1.0.tgz#bdfdcc5a2473556c0232996424dfe039293f2f44" - integrity sha512-YTZzmzzUgDK7IllsKxgnTQ7zAGbTVnj3bnH3nxoqZ2dE0IY7NpaFpFYXR+BuBeDtxIgMhwJJvH1LTWm3k3fWpg== +yarn-deduplicate@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/yarn-deduplicate/-/yarn-deduplicate-1.1.1.tgz#19b4a87654b66f55bf3a4bd6b153b4e4ab1b6e6d" + integrity sha512-2FDJ1dFmtvqhRmfja89ohYzpaheCYg7BFBSyaUq+kxK0y61C9oHv1XaQovCWGJtP2WU8PksQOgzMVV7oQOobzw== dependencies: "@yarnpkg/lockfile" "^1.1.0" commander "^2.10.0" From 038595edca9793203ef6e6c2317e14811efaf0df Mon Sep 17 00:00:00 2001 From: ledger-bot <37080477+ledger-bot@users.noreply.github.com> Date: Tue, 23 Apr 2019 16:48:59 +0200 Subject: [PATCH 3/3] New Crowdin translations (#878) * New translations common.json (French) * New translations common.json (Spanish) * New translations common.json (Japanese) * New translations common.json (Korean) * New translations common.json (Russian) * New translations common.json (Chinese Simplified) --- src/locales/es/common.json | 4 ++++ src/locales/fr/common.json | 4 ++++ src/locales/ja/common.json | 4 ++++ src/locales/ko/common.json | 4 ++++ src/locales/ru/common.json | 4 ++++ src/locales/zh/common.json | 4 ++++ 6 files changed, 24 insertions(+) diff --git a/src/locales/es/common.json b/src/locales/es/common.json index a9c90f3577..91e0906ac6 100644 --- a/src/locales/es/common.json +++ b/src/locales/es/common.json @@ -71,6 +71,10 @@ "title": "Sorry, try again (genuine-close)", "description": null }, + "DeviceHalted": { + "title": "Please restart your Ledger device and retry", + "description": "An unexpected error occurred, so please try again" + }, "DeviceNotGenuine": { "title": "Possibly not genuine", "description": "Request Ledger Support assistance." diff --git a/src/locales/fr/common.json b/src/locales/fr/common.json index df6b1e248d..a865f9e61f 100644 --- a/src/locales/fr/common.json +++ b/src/locales/fr/common.json @@ -71,6 +71,10 @@ "title": "Sorry, try again (genuine-close)", "description": null }, + "DeviceHalted": { + "title": "Please restart your Ledger device and retry", + "description": "An unexpected error occurred, so please try again" + }, "DeviceNotGenuine": { "title": "Possibly not genuine", "description": "Request Ledger Support assistance." diff --git a/src/locales/ja/common.json b/src/locales/ja/common.json index c114a23120..943fce88ca 100644 --- a/src/locales/ja/common.json +++ b/src/locales/ja/common.json @@ -71,6 +71,10 @@ "title": "Sorry, try again (genuine-close)", "description": null }, + "DeviceHalted": { + "title": "Please restart your Ledger device and retry", + "description": "An unexpected error occurred, so please try again" + }, "DeviceNotGenuine": { "title": "Possibly not genuine", "description": "Request Ledger Support assistance." diff --git a/src/locales/ko/common.json b/src/locales/ko/common.json index c114a23120..943fce88ca 100644 --- a/src/locales/ko/common.json +++ b/src/locales/ko/common.json @@ -71,6 +71,10 @@ "title": "Sorry, try again (genuine-close)", "description": null }, + "DeviceHalted": { + "title": "Please restart your Ledger device and retry", + "description": "An unexpected error occurred, so please try again" + }, "DeviceNotGenuine": { "title": "Possibly not genuine", "description": "Request Ledger Support assistance." diff --git a/src/locales/ru/common.json b/src/locales/ru/common.json index c114a23120..943fce88ca 100644 --- a/src/locales/ru/common.json +++ b/src/locales/ru/common.json @@ -71,6 +71,10 @@ "title": "Sorry, try again (genuine-close)", "description": null }, + "DeviceHalted": { + "title": "Please restart your Ledger device and retry", + "description": "An unexpected error occurred, so please try again" + }, "DeviceNotGenuine": { "title": "Possibly not genuine", "description": "Request Ledger Support assistance." diff --git a/src/locales/zh/common.json b/src/locales/zh/common.json index c114a23120..943fce88ca 100644 --- a/src/locales/zh/common.json +++ b/src/locales/zh/common.json @@ -71,6 +71,10 @@ "title": "Sorry, try again (genuine-close)", "description": null }, + "DeviceHalted": { + "title": "Please restart your Ledger device and retry", + "description": "An unexpected error occurred, so please try again" + }, "DeviceNotGenuine": { "title": "Possibly not genuine", "description": "Request Ledger Support assistance."