diff --git a/.eslintrc.js b/.eslintrc.js
index 47b3af2f5e..b16ae63f26 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -22,7 +22,7 @@ module.exports = {
rules: {
curly: ["warn", "multi-line", "consistent"],
"no-bitwise": "warn",
- "no-console": ["warn", { allow: ["error", "info", "warn"] }],
+ "no-console": ["warn", { allow: ["error", "info", "table", "warn"] }],
"no-param-reassign": "warn",
"no-shadow": "warn",
"no-unused-vars": "off", // disabled in favour of @typescript-eslint/no-unused-vars, see https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-unused-vars.md
diff --git a/packages/launchpad-ledger/README.md b/packages/launchpad-ledger/README.md
index 4cd9ca242f..0d2f1b409b 100644
--- a/packages/launchpad-ledger/README.md
+++ b/packages/launchpad-ledger/README.md
@@ -4,14 +4,38 @@
## Supported platforms
-We use the
+This library works with Node.js as well as certain browsers. We use the
[@ledgerhq/hw-transport-webusb](https://github.com/LedgerHQ/ledgerjs/tree/master/packages/hw-transport-webusb)
library to connect to Ledger devices from the browser via USB. You can check the
support status of this library
[here](https://github.com/LedgerHQ/ledgerjs/tree/master/packages/hw-transport-webusb#support-status).
+Note the optional dependencies:
+
+```json
+"optionalDependencies": {
+ "@ledgerhq/hw-transport-node-hid": "^5.23.2",
+ "@ledgerhq/hw-transport-webusb": "^5.23.0"
+}
+```
+
+If you are using this library with Node.js you must install
+`@ledgerhq/hw-transport-node-hid`. You’ll need `@ledgerhq/hw-transport-webusb`
+for the browser.
+
## Running the demo
+### Node.js
+
+Connect the Ledger device via USB, open the Cosmos app, then run the demo (this
+will also build the package):
+
+```sh
+yarn demo-node
+```
+
+### Browser
+
Build the package for web:
```sh
diff --git a/packages/launchpad-ledger/demo/index.html b/packages/launchpad-ledger/demo/index.html
index 1575c6bd55..7a04b1cd25 100644
--- a/packages/launchpad-ledger/demo/index.html
+++ b/packages/launchpad-ledger/demo/index.html
@@ -24,9 +24,13 @@
+
+
+
+
-
+
diff --git a/packages/launchpad-ledger/demo/node.js b/packages/launchpad-ledger/demo/node.js
new file mode 100644
index 0000000000..86c7e904fe
--- /dev/null
+++ b/packages/launchpad-ledger/demo/node.js
@@ -0,0 +1,25 @@
+const demo = require("../build/demo/node");
+
+async function run() {
+ const accountNumbers = [0, 1, 2, 10];
+ const accounts = await demo.getAccounts();
+ console.info("Accounts from Ledger device:");
+ console.table(accounts.map((account, i) => ({ ...account, accountNumber: accountNumbers[i] })));
+
+ const accountNumber0 = 0;
+ const address0 = accounts[accountNumber0].address;
+ const signature0 = await demo.sign(accountNumber0, address0, address0);
+ console.info(`Signature from Ledger device for account number 0 (${address0}):`);
+ console.info(signature0);
+
+ // It seems the Ledger device needs a bit of time to recover
+ await new Promise((resolve) => setTimeout(resolve, 1000));
+
+ const accountNumber10 = 10;
+ const address10 = accounts[accountNumbers.findIndex((n) => n === accountNumber10)].address;
+ const signature1 = await demo.sign(accountNumber10, address10, address10);
+ console.info(`Signature from Ledger device for account number 10 (${address10}):`);
+ console.info(signature1);
+}
+
+run().catch(console.error);
diff --git a/packages/launchpad-ledger/package.json b/packages/launchpad-ledger/package.json
index 0d6a3185d6..85ddd4d04f 100644
--- a/packages/launchpad-ledger/package.json
+++ b/packages/launchpad-ledger/package.json
@@ -35,17 +35,24 @@
"postbuild": "yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"test": "echo 'Please check README for information on how to manually run the demo'",
+ "demo-node": "yarn build-or-skip && node ./demo/node.js",
"coverage": "nyc --reporter=text --reporter=lcov yarn test --quiet",
"pack-web": "yarn build-or-skip && webpack --mode development --config webpack.demo.config.js"
},
"dependencies": {
"@cosmjs/launchpad": "^0.22.2",
"@cosmjs/utils": "^0.22.2",
- "@ledgerhq/hw-transport-webusb": "^5.23.0",
"ledger-cosmos-js": "^2.1.7",
"semver": "^7.3.2"
},
+ "optionalDependencies": {
+ "@ledgerhq/hw-transport-node-hid": "^5.23.2",
+ "@ledgerhq/hw-transport-webusb": "^5.23.0"
+ },
"devDependencies": {
+ "@ledgerhq/hw-transport-node-hid": "^5.23.2",
+ "@ledgerhq/hw-transport-webusb": "^5.23.0",
+ "@types/ledgerhq__hw-transport-node-hid": "^4.22.1",
"@types/ledgerhq__hw-transport-webusb": "^4.70.0",
"@types/semver": "^7.3.3"
}
diff --git a/packages/launchpad-ledger/src/demo/node.ts b/packages/launchpad-ledger/src/demo/node.ts
new file mode 100644
index 0000000000..ef3b3bb16e
--- /dev/null
+++ b/packages/launchpad-ledger/src/demo/node.ts
@@ -0,0 +1,60 @@
+/* eslint-disable @typescript-eslint/naming-convention */
+import { toBase64 } from "@cosmjs/encoding";
+import { makeCosmoshubPath, makeSignBytes, StdFee, StdSignature } from "@cosmjs/launchpad";
+
+import { LedgerSigner } from "../ledgersigner";
+
+const defaultChainId = "testing";
+const defaultFee: StdFee = {
+ amount: [{ amount: "100", denom: "ucosm" }],
+ gas: "250",
+};
+const defaultMemo = "Some memo";
+const defaultSequence = "0";
+
+const signer = new LedgerSigner({
+ testModeAllowed: true,
+ hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1), makeCosmoshubPath(2), makeCosmoshubPath(10)],
+});
+
+export async function getAccounts(): Promise<
+ ReadonlyArray<{
+ readonly algo: string;
+ readonly address: string;
+ readonly pubkey: string;
+ }>
+> {
+ const accounts = await signer.getAccounts();
+ return accounts.map((account) => ({ ...account, pubkey: toBase64(account.pubkey) }));
+}
+
+export async function sign(
+ accountNumber: number,
+ fromAddress: string,
+ toAddress: string,
+): Promise {
+ const msgs = [
+ {
+ type: "cosmos-sdk/MsgSend",
+ value: {
+ amount: [
+ {
+ amount: "1234567",
+ denom: "ucosm",
+ },
+ ],
+ from_address: fromAddress,
+ to_address: toAddress,
+ },
+ },
+ ];
+ const signBytes = makeSignBytes(
+ msgs,
+ defaultFee,
+ defaultChainId,
+ defaultMemo,
+ accountNumber,
+ defaultSequence,
+ );
+ return signer.sign(fromAddress, signBytes);
+}
diff --git a/packages/launchpad-ledger/src/demo/index.ts b/packages/launchpad-ledger/src/demo/web.ts
similarity index 55%
rename from packages/launchpad-ledger/src/demo/index.ts
rename to packages/launchpad-ledger/src/demo/web.ts
index 8269c3a3e2..e656a871bb 100644
--- a/packages/launchpad-ledger/src/demo/index.ts
+++ b/packages/launchpad-ledger/src/demo/web.ts
@@ -1,13 +1,16 @@
-import { toHex, toUtf8 } from "@cosmjs/encoding";
+import { toBase64, toUtf8 } from "@cosmjs/encoding";
+import { AccountData, makeCosmoshubPath } from "@cosmjs/launchpad";
import { LedgerSigner } from "../ledgersigner";
declare const window: any;
declare const document: any;
-function createMessage(address: string): string {
+let accounts: readonly AccountData[] = [];
+
+function createMessage(accountNumber: number, address: string): string {
return `{
- "account_number": 0,
+ "account_number": ${accountNumber},
"chain_id": "testing",
"fee": {
"amount": [{ "amount": 100, "denom": "ucosm" }],
@@ -29,21 +32,44 @@ function createMessage(address: string): string {
}`;
}
-const signer = new LedgerSigner({ testModeAllowed: true });
+const signer = new LedgerSigner({
+ testModeAllowed: true,
+ hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1), makeCosmoshubPath(2)],
+});
+
+window.updateMessage = (accountNumber: number) => {
+ const account = accounts[accountNumber];
+ if (account === undefined) {
+ return;
+ }
+
+ const address = accounts[accountNumber].address;
+ const addressInput = document.getElementById("address");
+ addressInput.value = address;
+ const messageTextArea = document.getElementById("message");
+ messageTextArea.textContent = createMessage(accountNumber, address);
+};
window.getAccounts = async function getAccounts(): Promise {
+ const accountNumberInput = document.getElementById("account-number");
const addressInput = document.getElementById("address");
const accountsDiv = document.getElementById("accounts");
const messageTextArea = document.getElementById("message");
accountsDiv.textContent = "Loading...";
try {
- const accounts = await signer.getAccounts();
- const prettyAccounts = accounts.map((account) => ({ ...account, pubkey: toHex(account.pubkey) }));
- accountsDiv.textContent = JSON.stringify(prettyAccounts, null, "\t");
+ accounts = await signer.getAccounts();
+ const prettyAccounts = accounts.map((account: AccountData) => ({
+ ...account,
+ pubkey: toBase64(account.pubkey),
+ }));
+ accountsDiv.textContent = JSON.stringify(prettyAccounts, null, "\n");
+ const accountNumber = 0;
+ accountNumberInput.max = accounts.length - 1;
+ accountNumberInput.value = accountNumber;
const address = accounts[0].address;
addressInput.value = address;
- messageTextArea.textContent = createMessage(address);
+ messageTextArea.textContent = createMessage(accountNumber, address);
} catch (error) {
accountsDiv.textContent = error;
}
diff --git a/packages/launchpad-ledger/src/launchpadledger.ts b/packages/launchpad-ledger/src/launchpadledger.ts
index d781ea9519..4d027ce07e 100644
--- a/packages/launchpad-ledger/src/launchpadledger.ts
+++ b/packages/launchpad-ledger/src/launchpadledger.ts
@@ -3,7 +3,6 @@ import { fromUtf8 } from "@cosmjs/encoding";
import { makeCosmoshubPath } from "@cosmjs/launchpad";
import { assert } from "@cosmjs/utils";
import Transport from "@ledgerhq/hw-transport";
-import TransportWebUsb from "@ledgerhq/hw-transport-webusb";
import CosmosApp, {
AppInfoResponse,
PublicKeyResponse,
@@ -26,46 +25,17 @@ function isWindows(platform: string): boolean {
return platform.indexOf("Win") > -1;
}
-function verifyBrowserIsSupported(platform: string, userAgent: string): void {
+function verifyBrowserIsSupported(platform: string, userAgent: string | null): void {
if (isWindows(platform)) {
throw new Error("Windows is not currently supported.");
}
- const isChromeOrBrave = /chrome|crios/i.test(userAgent) && !/edge|opr\//i.test(userAgent);
+ const isChromeOrBrave = userAgent && /chrome|crios/i.test(userAgent) && !/edge|opr\//i.test(userAgent);
if (!isChromeOrBrave) {
throw new Error("Your browser does not support Ledger devices.");
}
}
-async function createTransport(timeout: number): Promise {
- try {
- const transport = await TransportWebUsb.create(timeout * 1000);
- return transport;
- } catch (error) {
- const trimmedErrorMessage = error.message.trim();
- if (trimmedErrorMessage.startsWith("No WebUSB interface found for your Ledger device")) {
- throw new Error(
- "Could not connect to a Ledger device. Please use Ledger Live to upgrade the Ledger firmware to version 1.5.5 or later.",
- );
- }
- if (trimmedErrorMessage.startsWith("Unable to claim interface")) {
- throw new Error("Could not access Ledger device. Is it being used in another tab?");
- }
- if (trimmedErrorMessage.startsWith("Not supported")) {
- throw new Error(
- "Your browser does not seem to support WebUSB yet. Try updating it to the latest version.",
- );
- }
- if (trimmedErrorMessage.startsWith("No device selected")) {
- throw new Error(
- "You did not select a Ledger device. If you did not see your Ledger, check if the Ledger is plugged in and unlocked.",
- );
- }
-
- throw error;
- }
-}
-
function unharden(hdPath: HdPath): number[] {
return hdPath.map((n) => (n.isHardened() ? n.toNumber() - 2 ** 31 : n.toNumber()));
}
@@ -85,7 +55,7 @@ export class LaunchpadLedger {
private readonly prefix: string;
private cosmosApp: CosmosApp | null;
public readonly platform: string;
- public readonly userAgent: string;
+ public readonly userAgent: string | null;
constructor(options: LaunchpadLedgerOptions = {}) {
const defaultOptions = {
@@ -101,8 +71,14 @@ export class LaunchpadLedger {
this.hdPaths = hdPaths;
this.prefix = prefix;
this.cosmosApp = null;
- this.platform = navigator.platform;
- this.userAgent = navigator.userAgent;
+
+ try {
+ this.platform = navigator.platform;
+ this.userAgent = navigator.userAgent;
+ } catch (error) {
+ this.platform = "node";
+ this.userAgent = null;
+ }
}
async connect(timeout = defaultInteractionTimeout): Promise {
@@ -111,9 +87,11 @@ export class LaunchpadLedger {
return this;
}
- verifyBrowserIsSupported(this.platform, this.userAgent);
+ if (this.platform !== "node") {
+ verifyBrowserIsSupported(this.platform, this.userAgent);
+ }
- const transport = await createTransport(timeout * 1000);
+ const transport = await this.createTransport(timeout * 1000);
this.cosmosApp = new CosmosApp(transport);
await this.verifyDeviceIsReady();
@@ -144,7 +122,11 @@ export class LaunchpadLedger {
}
async getPubkeys(): Promise {
- return Promise.all(this.hdPaths.map(async (hdPath) => this.getPubkey(hdPath)));
+ return this.hdPaths.reduce(
+ (promise: Promise, hdPath) =>
+ promise.then(async (pubkeys) => [...pubkeys, await this.getPubkey(hdPath)]),
+ Promise.resolve([]),
+ );
}
async getCosmosAddress(pubkey?: Uint8Array): Promise {
@@ -163,6 +145,43 @@ export class LaunchpadLedger {
return Secp256k1Signature.fromDer((response as SignResponse).signature).toFixedLength();
}
+ private async createTransport(timeout: number): Promise {
+ // HACK: Use a variable to get webpack to ignore this
+ const nodeJsTransportPackageName = "@ledgerhq/hw-transport-node-hid";
+ /* eslint-disable-next-line @typescript-eslint/naming-convention */
+ const { default: TransportClass } =
+ this.platform === "node"
+ ? await import(nodeJsTransportPackageName)
+ : await import("@ledgerhq/hw-transport-webusb");
+
+ try {
+ const transport = await TransportClass.create(timeout * 1000);
+ return transport;
+ } catch (error) {
+ const trimmedErrorMessage = error.message.trim();
+ if (trimmedErrorMessage.startsWith("No WebUSB interface found for your Ledger device")) {
+ throw new Error(
+ "Could not connect to a Ledger device. Please use Ledger Live to upgrade the Ledger firmware to version 1.5.5 or later.",
+ );
+ }
+ if (trimmedErrorMessage.startsWith("Unable to claim interface")) {
+ throw new Error("Could not access Ledger device. Is it being used in another tab?");
+ }
+ if (trimmedErrorMessage.startsWith("Not supported")) {
+ throw new Error(
+ "Your browser does not seem to support WebUSB yet. Try updating it to the latest version.",
+ );
+ }
+ if (trimmedErrorMessage.startsWith("No device selected")) {
+ throw new Error(
+ "You did not select a Ledger device. If you did not see your Ledger, check if the Ledger is plugged in and unlocked.",
+ );
+ }
+
+ throw error;
+ }
+ }
+
private verifyAppMode(testMode: boolean): void {
if (testMode && !this.testModeAllowed) {
throw new Error(`DANGER: The Cosmos Ledger app is in test mode and should not be used on mainnet!`);
diff --git a/packages/launchpad-ledger/src/ledgersigner.ts b/packages/launchpad-ledger/src/ledgersigner.ts
index 836c748032..da6892ae03 100644
--- a/packages/launchpad-ledger/src/ledgersigner.ts
+++ b/packages/launchpad-ledger/src/ledgersigner.ts
@@ -1,18 +1,25 @@
-import { AccountData, encodeSecp256k1Signature, OfflineSigner, StdSignature } from "@cosmjs/launchpad";
+import { HdPath } from "@cosmjs/crypto";
+import {
+ AccountData,
+ encodeSecp256k1Signature,
+ makeCosmoshubPath,
+ OfflineSigner,
+ StdSignature,
+} from "@cosmjs/launchpad";
import { LaunchpadLedger, LaunchpadLedgerOptions } from "./launchpadledger";
export class LedgerSigner implements OfflineSigner {
private readonly ledger: LaunchpadLedger;
+ private readonly hdPaths: readonly HdPath[];
private accounts?: readonly AccountData[];
- constructor(options?: LaunchpadLedgerOptions) {
+ constructor(options: LaunchpadLedgerOptions = {}) {
+ this.hdPaths = options.hdPaths || [makeCosmoshubPath(0)];
this.ledger = new LaunchpadLedger(options);
}
public async getAccounts(): Promise {
- await this.ledger.connect();
-
if (!this.accounts) {
const pubkeys = await this.ledger.getPubkeys();
this.accounts = await Promise.all(
@@ -28,16 +35,16 @@ export class LedgerSigner implements OfflineSigner {
}
public async sign(address: string, message: Uint8Array): Promise {
- await this.ledger.connect();
-
const accounts = this.accounts || (await this.getAccounts());
- const accountForAddress = accounts.find((account) => account.address === address);
+ const accountIndex = accounts.findIndex((account) => account.address === address);
- if (!accountForAddress) {
+ if (accountIndex === -1) {
throw new Error(`Address ${address} not found in wallet`);
}
- const signature = await this.ledger.sign(message);
+ const accountForAddress = accounts[accountIndex];
+ const hdPath = this.hdPaths[accountIndex];
+ const signature = await this.ledger.sign(message, hdPath);
return encodeSecp256k1Signature(accountForAddress.pubkey, signature);
}
}
diff --git a/packages/launchpad-ledger/types/launchpadledger.d.ts b/packages/launchpad-ledger/types/launchpadledger.d.ts
index 6eda113d4d..2cc42f18d8 100644
--- a/packages/launchpad-ledger/types/launchpadledger.d.ts
+++ b/packages/launchpad-ledger/types/launchpadledger.d.ts
@@ -14,7 +14,7 @@ export declare class LaunchpadLedger {
private readonly prefix;
private cosmosApp;
readonly platform: string;
- readonly userAgent: string;
+ readonly userAgent: string | null;
constructor(options?: LaunchpadLedgerOptions);
connect(timeout?: number): Promise;
getCosmosAppVersion(): Promise;
@@ -22,6 +22,7 @@ export declare class LaunchpadLedger {
getPubkeys(): Promise;
getCosmosAddress(pubkey?: Uint8Array): Promise;
sign(message: Uint8Array, hdPath?: HdPath): Promise;
+ private createTransport;
private verifyAppMode;
private getOpenAppName;
private verifyAppVersion;
diff --git a/packages/launchpad-ledger/types/ledgersigner.d.ts b/packages/launchpad-ledger/types/ledgersigner.d.ts
index dc4c4e49a7..1ebfdcdd51 100644
--- a/packages/launchpad-ledger/types/ledgersigner.d.ts
+++ b/packages/launchpad-ledger/types/ledgersigner.d.ts
@@ -2,6 +2,7 @@ import { AccountData, OfflineSigner, StdSignature } from "@cosmjs/launchpad";
import { LaunchpadLedgerOptions } from "./launchpadledger";
export declare class LedgerSigner implements OfflineSigner {
private readonly ledger;
+ private readonly hdPaths;
private accounts?;
constructor(options?: LaunchpadLedgerOptions);
getAccounts(): Promise;
diff --git a/packages/launchpad-ledger/webpack.demo.config.js b/packages/launchpad-ledger/webpack.demo.config.js
index e16bea23b8..534338d511 100644
--- a/packages/launchpad-ledger/webpack.demo.config.js
+++ b/packages/launchpad-ledger/webpack.demo.config.js
@@ -8,7 +8,7 @@ module.exports = [
{
// bundle used for Ledger demo
target: target,
- entry: glob.sync("./build/demo/index.js"),
+ entry: glob.sync("./build/demo/web.js"),
output: {
path: demodir,
filename: "ledger.js",
diff --git a/packages/launchpad/src/encoding.ts b/packages/launchpad/src/encoding.ts
index 17f8de77c1..3c09e77528 100644
--- a/packages/launchpad/src/encoding.ts
+++ b/packages/launchpad/src/encoding.ts
@@ -28,7 +28,7 @@ function sortJson(json: any): any {
*
* @see https://docs.cosmos.network/master/modules/auth/03_types.html#stdsigndoc
*/
-interface StdSignDoc {
+export interface StdSignDoc {
readonly account_number: string;
readonly chain_id: string;
readonly fee: StdFee;
diff --git a/packages/launchpad/src/index.ts b/packages/launchpad/src/index.ts
index 49a0ea91b0..3701ab3357 100644
--- a/packages/launchpad/src/index.ts
+++ b/packages/launchpad/src/index.ts
@@ -28,7 +28,7 @@ export {
isSearchBySentFromOrToQuery,
isSearchByTagsQuery,
} from "./cosmosclient";
-export { makeSignBytes } from "./encoding";
+export { makeSignBytes, StdSignDoc } from "./encoding";
export { buildFeeTable, FeeTable, GasLimits, GasPrice } from "./gas";
export {
AuthAccountsResponse,
diff --git a/packages/launchpad/types/encoding.d.ts b/packages/launchpad/types/encoding.d.ts
index 35885e4d27..51c2c0c4c7 100644
--- a/packages/launchpad/types/encoding.d.ts
+++ b/packages/launchpad/types/encoding.d.ts
@@ -1,5 +1,18 @@
import { Msg } from "./msgs";
import { StdFee } from "./types";
+/**
+ * The document to be signed
+ *
+ * @see https://docs.cosmos.network/master/modules/auth/03_types.html#stdsigndoc
+ */
+export interface StdSignDoc {
+ readonly account_number: string;
+ readonly chain_id: string;
+ readonly fee: StdFee;
+ readonly memo: string;
+ readonly msgs: readonly Msg[];
+ readonly sequence: string;
+}
export declare function makeSignBytes(
msgs: readonly Msg[],
fee: StdFee,
diff --git a/packages/launchpad/types/index.d.ts b/packages/launchpad/types/index.d.ts
index 17332cf298..9d137f0b59 100644
--- a/packages/launchpad/types/index.d.ts
+++ b/packages/launchpad/types/index.d.ts
@@ -26,7 +26,7 @@ export {
isSearchBySentFromOrToQuery,
isSearchByTagsQuery,
} from "./cosmosclient";
-export { makeSignBytes } from "./encoding";
+export { makeSignBytes, StdSignDoc } from "./encoding";
export { buildFeeTable, FeeTable, GasLimits, GasPrice } from "./gas";
export {
AuthAccountsResponse,
diff --git a/yarn.lock b/yarn.lock
index c0c33ea5e1..1bd753174d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -325,6 +325,31 @@
resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.23.0.tgz#30a0338dafba8264556011604abed08bf24979f3"
integrity sha512-qtpX8aFrUUlYfOMu7BxTvxqUa8CniE+tEBpVEjYUhVbFdVJjM4ouwJD++RtQkMAU2c5jE7xb12WnUnf5BlAgLQ==
+"@ledgerhq/hw-transport-node-hid-noevents@^5.23.2":
+ version "5.23.2"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-5.23.2.tgz#0ee4b54c62d23b0f0cce258fe2c612f71b8d454a"
+ integrity sha512-8LiF87iIZWJaXMptXJ64ZnMb5T8Sjq66E6AkjnthCuBCPpz6oex50h5vNLVNNNpa/jGv0na7CADOkQkxyBQKmQ==
+ dependencies:
+ "@ledgerhq/devices" "^5.23.0"
+ "@ledgerhq/errors" "^5.23.0"
+ "@ledgerhq/hw-transport" "^5.23.0"
+ "@ledgerhq/logs" "^5.23.0"
+ node-hid "1.3.0"
+
+"@ledgerhq/hw-transport-node-hid@^5.23.2":
+ version "5.23.2"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-5.23.2.tgz#436d624334146c8a818e3270d7508e4dbb1a5b1c"
+ integrity sha512-u0oBoKFltMk05T5ySnemLKoUtUXmB25196PuDe8C+vdA34usoESiNZb49Ookp1vAw7BHzImZYo1moF+IlLGVZQ==
+ dependencies:
+ "@ledgerhq/devices" "^5.23.0"
+ "@ledgerhq/errors" "^5.23.0"
+ "@ledgerhq/hw-transport" "^5.23.0"
+ "@ledgerhq/hw-transport-node-hid-noevents" "^5.23.2"
+ "@ledgerhq/logs" "^5.23.0"
+ lodash "^4.17.20"
+ node-hid "1.3.0"
+ usb "^1.6.3"
+
"@ledgerhq/hw-transport-webusb@^5.23.0":
version "5.23.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-5.23.0.tgz#f374415ab1bda6ba55898c0e74097f2005fd06f7"
@@ -1374,6 +1399,15 @@
dependencies:
"@types/koa" "*"
+"@types/ledgerhq__hw-transport-node-hid@^4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@types/ledgerhq__hw-transport-node-hid/-/ledgerhq__hw-transport-node-hid-4.22.1.tgz#0f075f8965c7234126eb19bc8d569b73cc9a6f8e"
+ integrity sha512-EVdR5HWKUsuQOeg8DUqyhAtCooPsYpA3q+xvEdcZsgXxD/R8XNuYxSDCKNVyl0nEfobfJisb7f3Ta+Shf58izw==
+ dependencies:
+ "@types/ledgerhq__hw-transport" "*"
+ "@types/node" "*"
+ "@types/node-hid" "*"
+
"@types/ledgerhq__hw-transport-webusb@^4.70.0":
version "4.70.0"
resolved "https://registry.yarnpkg.com/@types/ledgerhq__hw-transport-webusb/-/ledgerhq__hw-transport-webusb-4.70.0.tgz#8e03b1f8bec52a8291ef41b00470b07f28285788"
@@ -1414,6 +1448,13 @@
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6"
integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=
+"@types/node-hid@*":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@types/node-hid/-/node-hid-1.3.0.tgz#fe021af9df739871c3cb60e7efaa4adfe91d58e6"
+ integrity sha512-jQ9Z8PegPENPlzR/7fziAF6yqcdYYcIfeJOiN1wnk2zf/Y8yFpprf6uEp1OWPdzhM9dBgv/K5MQ5WFHwK22Gbg==
+ dependencies:
+ "@types/node" "*"
+
"@types/node@*", "@types/node@>= 8":
version "13.9.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.2.tgz#ace1880c03594cc3e80206d96847157d8e7fa349"
@@ -2176,7 +2217,7 @@ binary-extensions@^2.0.0:
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==
-bindings@^1.5.0:
+bindings@^1.4.0, bindings@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
@@ -2193,6 +2234,15 @@ bip39@^3.0.2:
pbkdf2 "^3.0.9"
randombytes "^2.0.1"
+bl@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489"
+ integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==
+ dependencies:
+ buffer "^5.5.0"
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+
blob@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683"
@@ -2343,6 +2393,14 @@ buffer@^4.3.0:
ieee754 "^1.1.4"
isarray "^1.0.0"
+buffer@^5.5.0:
+ version "5.6.0"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786"
+ integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+
builtin-status-codes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
@@ -3137,6 +3195,13 @@ decode-uri-component@^0.2.0:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+decompress-response@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
+ integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
+ dependencies:
+ mimic-response "^2.0.0"
+
dedent@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
@@ -3147,6 +3212,11 @@ deep-equal@~1.0.1:
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
deep-is@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
@@ -3243,6 +3313,11 @@ detect-indent@^5.0.0:
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=
+detect-libc@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+ integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
+
dezalgo@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
@@ -3389,7 +3464,7 @@ encoding@^0.1.11:
dependencies:
iconv-lite "~0.4.13"
-end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -3792,6 +3867,11 @@ expand-brackets@^2.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
+expand-template@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
+ integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
+
expand-tilde@^2.0.0, expand-tilde@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
@@ -4089,6 +4169,11 @@ fromentries@^1.2.0:
resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.0.tgz#e6aa06f240d6267f913cea422075ef88b63e7897"
integrity sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==
+fs-constants@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+ integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
fs-extra@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
@@ -4271,6 +4356,11 @@ gitconfiglocal@^1.0.0:
dependencies:
ini "^1.3.2"
+github-from-package@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
+ integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
+
glob-parent@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
@@ -4709,7 +4799,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -4724,7 +4814,7 @@ inherits@2.0.3:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
-ini@^1.3.2, ini@^1.3.4, ini@^1.3.5:
+ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
@@ -5600,6 +5690,11 @@ lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
+lodash@^4.17.20:
+ version "4.17.20"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
+
log4js@^6.2.1:
version "6.3.0"
resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb"
@@ -5866,6 +5961,11 @@ mimic-fn@^1.0.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
+mimic-response@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43"
+ integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
+
min-indent@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
@@ -5905,7 +6005,7 @@ minimist-options@^4.0.2:
is-plain-obj "^1.1.0"
kind-of "^6.0.3"
-minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
+minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@@ -5949,6 +6049,11 @@ mixin-deep@^1.2.0:
for-in "^1.0.2"
is-extendable "^1.0.1"
+mkdirp-classic@^0.5.2:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
+ integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
+
mkdirp-promise@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
@@ -6031,11 +6136,21 @@ mz@^2.5.0:
object-assign "^4.0.1"
thenify-all "^1.0.0"
+nan@2.13.2:
+ version "2.13.2"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7"
+ integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==
+
nan@^2.12.1:
version "2.14.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
+nan@^2.14.0:
+ version "2.14.1"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
+ integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
+
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@@ -6053,6 +6168,11 @@ nanomatch@^1.2.9:
snapdragon "^0.8.1"
to-regex "^3.0.1"
+napi-build-utils@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
+ integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
+
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@@ -6073,6 +6193,13 @@ nice-try@^1.0.4:
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+node-abi@^2.18.0, node-abi@^2.7.0:
+ version "2.19.1"
+ resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.19.1.tgz#6aa32561d0a5e2fdb6810d8c25641b657a8cea85"
+ integrity sha512-HbtmIuByq44yhAzK7b9j/FelKlHYISKQn0mtvcBrU5QBkhoCMp5bu8Hv5AI34DcKfOAcJBcOEMwLlwO62FFu9A==
+ dependencies:
+ semver "^5.4.1"
+
node-fetch-npm@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.3.tgz#efae4aacb0500444e449a51fc1467397775ebc38"
@@ -6104,6 +6231,16 @@ node-gyp@^5.0.2:
tar "^4.4.12"
which "^1.3.1"
+node-hid@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-1.3.0.tgz#346a468505cee13d69ccd760052cbaf749f66a41"
+ integrity sha512-BA6G4V84kiNd1uAChub/Z/5s/xS3EHBCxotQ0nyYrUG65mXewUDHE1tWOSqA2dp3N+mV0Ffq9wo2AW9t4p/G7g==
+ dependencies:
+ bindings "^1.5.0"
+ nan "^2.14.0"
+ node-abi "^2.18.0"
+ prebuild-install "^5.3.4"
+
node-libs-browser@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
@@ -6140,6 +6277,11 @@ node-preload@^0.2.1:
dependencies:
process-on-spawn "^1.0.0"
+noop-logger@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
+ integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=
+
nopt@^4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
@@ -6236,7 +6378,7 @@ npm-run-path@^2.0.0:
dependencies:
path-key "^2.0.0"
-npmlog@^4.1.2:
+npmlog@^4.0.1, npmlog@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
@@ -6796,6 +6938,27 @@ 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=
+prebuild-install@^5.3.3, prebuild-install@^5.3.4:
+ version "5.3.5"
+ resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.5.tgz#e7e71e425298785ea9d22d4f958dbaccf8bb0e1b"
+ integrity sha512-YmMO7dph9CYKi5IR/BzjOJlRzpxGGVo1EsLSUZ0mt/Mq0HWZIHOKHHcHdT69yG54C9m6i45GpItwRHpk0Py7Uw==
+ dependencies:
+ detect-libc "^1.0.3"
+ expand-template "^2.0.3"
+ github-from-package "0.0.0"
+ minimist "^1.2.3"
+ mkdirp "^0.5.1"
+ napi-build-utils "^1.0.1"
+ node-abi "^2.7.0"
+ noop-logger "^0.1.1"
+ npmlog "^4.0.1"
+ pump "^3.0.0"
+ rc "^1.2.7"
+ simple-get "^3.0.3"
+ tar-fs "^2.0.0"
+ tunnel-agent "^0.6.0"
+ which-pm-runs "^1.0.0"
+
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -7043,6 +7206,16 @@ raw-body@^2.3.3:
iconv-lite "0.4.24"
unpipe "1.0.0"
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
read-cmd-shim@^1.0.1:
version "1.0.5"
resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16"
@@ -7161,7 +7334,7 @@ read@1, read@~1.0.1:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
-"readable-stream@2 || 3", readable-stream@^3.0.2:
+"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -7601,6 +7774,20 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3"
+ integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
+ dependencies:
+ decompress-response "^4.2.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
slash@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
@@ -8051,6 +8238,11 @@ strip-json-comments@^3.1.0:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
strong-log-transformer@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10"
@@ -8101,6 +8293,27 @@ tapable@^1.0.0, tapable@^1.1.3:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
+tar-fs@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.0.tgz#d1cdd121ab465ee0eb9ccde2d35049d3f3daf0d5"
+ integrity sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==
+ dependencies:
+ chownr "^1.1.1"
+ mkdirp-classic "^0.5.2"
+ pump "^3.0.0"
+ tar-stream "^2.0.0"
+
+tar-stream@^2.0.0:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa"
+ integrity sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==
+ dependencies:
+ bl "^4.0.3"
+ end-of-stream "^1.4.1"
+ fs-constants "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^3.1.1"
+
tar@^4.4.10, tar@^4.4.12, tar@^4.4.8:
version "4.4.13"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
@@ -8560,6 +8773,15 @@ url@^0.11.0:
punycode "1.3.2"
querystring "0.2.0"
+usb@^1.6.3:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/usb/-/usb-1.6.3.tgz#c0bc14994e8f9cb16f9602ec0dbadaa57cb919f5"
+ integrity sha512-23KYMjaWydACd8wgGKMQ4MNwFspAT6Xeim4/9Onqe5Rz/nMb4TM/WHL+qPT0KNFxzNKzAs63n1xQWGEtgaQ2uw==
+ dependencies:
+ bindings "^1.4.0"
+ nan "2.13.2"
+ prebuild-install "^5.3.3"
+
use@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
@@ -8748,6 +8970,11 @@ which-module@^2.0.0:
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+which-pm-runs@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb"
+ integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=
+
which@^1.2.1, which@^1.2.14, which@^1.2.9, which@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"