@shapeshiftoss/hdwallet-ledger-webhid 1.18.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2019 ShapeShift
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,14 @@
1
+ /// <reference types="w3c-web-hid" />
2
+ import * as core from "@shapeshiftoss/hdwallet-core";
3
+ export declare class WebHIDLedgerAdapter {
4
+ keyring: core.Keyring;
5
+ currentEventTimestamp: number;
6
+ constructor(keyring: core.Keyring);
7
+ static useKeyring(keyring: core.Keyring): WebHIDLedgerAdapter;
8
+ private handleConnectWebHIDLedger;
9
+ private handleDisconnectWebHIDLedger;
10
+ get(): core.HDWallet;
11
+ initialize(device?: HIDDevice): Promise<number>;
12
+ pairDevice(): Promise<core.HDWallet>;
13
+ }
14
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,IAAI,MAAM,8BAA8B,CAAC;AAQrD,qBAAa,mBAAmB;IAC9B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAK;gBAEtB,OAAO,EAAE,IAAI,CAAC,OAAO;WASnB,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO;YAIhC,yBAAyB;YAgBzB,4BAA4B;IAqBnC,GAAG,IAAI,IAAI,CAAC,QAAQ;IAKd,UAAU,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB/C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;CASlD"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
28
+ });
29
+ };
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.WebHIDLedgerAdapter = void 0;
32
+ const core = __importStar(require("@shapeshiftoss/hdwallet-core"));
33
+ const ledger = __importStar(require("@shapeshiftoss/hdwallet-ledger"));
34
+ const transport_1 = require("./transport");
35
+ const VENDOR_ID = 11415;
36
+ const APP_NAVIGATION_DELAY = 3000;
37
+ class WebHIDLedgerAdapter {
38
+ constructor(keyring) {
39
+ this.currentEventTimestamp = 0;
40
+ this.keyring = keyring;
41
+ if (window && window.navigator.hid) {
42
+ window.navigator.hid.addEventListener("connect", this.handleConnectWebHIDLedger.bind(this));
43
+ window.navigator.hid.addEventListener("disconnect", this.handleDisconnectWebHIDLedger.bind(this));
44
+ }
45
+ }
46
+ static useKeyring(keyring) {
47
+ return new WebHIDLedgerAdapter(keyring);
48
+ }
49
+ handleConnectWebHIDLedger(e) {
50
+ var _a, _b;
51
+ return __awaiter(this, void 0, void 0, function* () {
52
+ if (e.device.vendorId !== VENDOR_ID)
53
+ return;
54
+ this.currentEventTimestamp = Date.now();
55
+ try {
56
+ yield this.initialize(e.device);
57
+ this.keyring.emit(["Ledger", (_a = e.device.productName) !== null && _a !== void 0 ? _a : "", core.Events.CONNECT], transport_1.MOCK_SERIAL_NUMBER);
58
+ }
59
+ catch (error) {
60
+ this.keyring.emit(["Ledger", (_b = e.device.productName) !== null && _b !== void 0 ? _b : "", core.Events.FAILURE], [transport_1.MOCK_SERIAL_NUMBER, { message: Object.assign({ code: error.type }, error) }]);
61
+ }
62
+ });
63
+ }
64
+ handleDisconnectWebHIDLedger(e) {
65
+ return __awaiter(this, void 0, void 0, function* () {
66
+ if (e.device.vendorId !== VENDOR_ID)
67
+ return;
68
+ const ts = Date.now();
69
+ this.currentEventTimestamp = ts;
70
+ // timeout gives time to detect if it is an app navigation based disconnect/connect event
71
+ // discard disconnect event if it is not the most recent event received
72
+ setTimeout(() => __awaiter(this, void 0, void 0, function* () {
73
+ var _a;
74
+ if (ts !== this.currentEventTimestamp)
75
+ return;
76
+ try {
77
+ yield this.keyring.remove(transport_1.MOCK_SERIAL_NUMBER);
78
+ }
79
+ catch (e) {
80
+ console.error(e);
81
+ }
82
+ finally {
83
+ this.keyring.emit(["Ledger", (_a = e.device.productName) !== null && _a !== void 0 ? _a : "", core.Events.DISCONNECT], transport_1.MOCK_SERIAL_NUMBER);
84
+ }
85
+ }), APP_NAVIGATION_DELAY);
86
+ });
87
+ }
88
+ get() {
89
+ return core.mustBeDefined(this.keyring.get(transport_1.MOCK_SERIAL_NUMBER));
90
+ }
91
+ // without unique device identifiers, we should only ever have one HID ledger device on the keyring at a time
92
+ initialize(device) {
93
+ var _a;
94
+ return __awaiter(this, void 0, void 0, function* () {
95
+ device = (_a = device !== null && device !== void 0 ? device : (yield transport_1.getFirstLedgerDevice())) !== null && _a !== void 0 ? _a : undefined;
96
+ if (device) {
97
+ yield this.keyring.remove(transport_1.MOCK_SERIAL_NUMBER);
98
+ const ledgerTransport = yield transport_1.openTransport(device);
99
+ const wallet = ledger.create(new transport_1.LedgerWebHIDTransport(device, ledgerTransport, this.keyring));
100
+ this.keyring.add(wallet, transport_1.MOCK_SERIAL_NUMBER);
101
+ }
102
+ return Object.keys(this.keyring.wallets).length;
103
+ });
104
+ }
105
+ pairDevice() {
106
+ return __awaiter(this, void 0, void 0, function* () {
107
+ const ledgerTransport = yield transport_1.getTransport();
108
+ const device = ledgerTransport.device;
109
+ yield this.initialize(device);
110
+ return core.mustBeDefined(this.keyring.get(transport_1.MOCK_SERIAL_NUMBER));
111
+ });
112
+ }
113
+ }
114
+ exports.WebHIDLedgerAdapter = WebHIDLedgerAdapter;
115
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./adapter";
2
+ export * from "./transport";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./adapter"), exports);
14
+ __exportStar(require("./transport"), exports);
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAA0B;AAC1B,8CAA4B"}
@@ -0,0 +1,18 @@
1
+ /// <reference types="w3c-web-hid" />
2
+ import Transport from "@ledgerhq/hw-transport";
3
+ import TransportWebHID from "@ledgerhq/hw-transport-webhid";
4
+ import * as core from "@shapeshiftoss/hdwallet-core";
5
+ import * as ledger from "@shapeshiftoss/hdwallet-ledger";
6
+ import { LedgerResponse, LedgerTransportCoinType, LedgerTransportMethod, LedgerTransportMethodName } from "hdwallet-ledger/src/transport";
7
+ export declare const MOCK_SERIAL_NUMBER = "ledger-webhid-device";
8
+ export declare function getFirstLedgerDevice(): Promise<HIDDevice | null>;
9
+ export declare function openTransport(device: HIDDevice): Promise<TransportWebHID>;
10
+ export declare function getTransport(): Promise<TransportWebHID>;
11
+ export declare function translateCoinAndMethod<T extends LedgerTransportCoinType, U extends LedgerTransportMethodName<T>>(transport: Transport, coin: T, method: U): LedgerTransportMethod<T, U>;
12
+ export declare class LedgerWebHIDTransport extends ledger.LedgerTransport {
13
+ device: HIDDevice;
14
+ constructor(device: HIDDevice, transport: Transport, keyring: core.Keyring);
15
+ getDeviceID(): Promise<string>;
16
+ call<T extends LedgerTransportCoinType, U extends LedgerTransportMethodName<T>>(coin: T, method: U, ...args: Parameters<LedgerTransportMethod<T, U>>): Promise<LedgerResponse<T, U>>;
17
+ }
18
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":";AAEA,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAC/C,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAI5D,OAAO,KAAK,IAAI,MAAM,8BAA8B,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,gCAAgC,CAAC;AACzD,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EAC1B,MAAM,+BAA+B,CAAC;AAIvC,eAAO,MAAM,kBAAkB,yBAAyB,CAAA;AAExD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAMtE;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,CAY/E;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,CAY7D;AAED,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,uBAAuB,EAAE,CAAC,SAAS,yBAAyB,CAAC,CAAC,CAAC,EAC9G,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,CAAC,GACR,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAwC7B;AAED,qBAAa,qBAAsB,SAAQ,MAAM,CAAC,eAAe;IAC/D,MAAM,EAAE,SAAS,CAAC;gBAEN,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO;IAM7D,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAI9B,IAAI,CAAC,CAAC,SAAS,uBAAuB,EAAE,CAAC,SAAS,yBAAyB,CAAC,CAAC,CAAC,EACzF,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,CAAC,EACT,GAAG,IAAI,EAAE,UAAU,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAC/C,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAwCjC"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
28
+ });
29
+ };
30
+ var __importDefault = (this && this.__importDefault) || function (mod) {
31
+ return (mod && mod.__esModule) ? mod : { "default": mod };
32
+ };
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.LedgerWebHIDTransport = exports.translateCoinAndMethod = exports.getTransport = exports.openTransport = exports.getFirstLedgerDevice = exports.MOCK_SERIAL_NUMBER = void 0;
35
+ const hw_app_btc_1 = __importDefault(require("@ledgerhq/hw-app-btc"));
36
+ const hw_app_eth_1 = __importDefault(require("@ledgerhq/hw-app-eth"));
37
+ const hw_transport_webhid_1 = __importDefault(require("@ledgerhq/hw-transport-webhid"));
38
+ const getAppAndVersion_1 = __importDefault(require("@ledgerhq/live-common/lib/hw/getAppAndVersion"));
39
+ const getDeviceInfo_1 = __importDefault(require("@ledgerhq/live-common/lib/hw/getDeviceInfo"));
40
+ const openApp_1 = __importDefault(require("@ledgerhq/live-common/lib/hw/openApp"));
41
+ const core = __importStar(require("@shapeshiftoss/hdwallet-core"));
42
+ const ledger = __importStar(require("@shapeshiftoss/hdwallet-ledger"));
43
+ const RECORD_CONFORMANCE_MOCKS = false;
44
+ exports.MOCK_SERIAL_NUMBER = "ledger-webhid-device"; // WebHID devices do not have serialNumbers
45
+ function getFirstLedgerDevice() {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ if (!(window && window.navigator.hid))
48
+ throw new core.WebHIDNotAvailable();
49
+ const existingDevices = yield hw_transport_webhid_1.default.list();
50
+ return existingDevices.length > 0 ? existingDevices[0] : null;
51
+ });
52
+ }
53
+ exports.getFirstLedgerDevice = getFirstLedgerDevice;
54
+ function openTransport(device) {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ if (!(window && window.navigator.hid))
57
+ throw new core.WebHIDNotAvailable();
58
+ try {
59
+ return yield hw_transport_webhid_1.default.open(device);
60
+ }
61
+ catch (err) {
62
+ if (core.isIndexable(err) && err.name === "TransportInterfaceNotAvailable") {
63
+ throw new core.ConflictingApp("Ledger");
64
+ }
65
+ throw new core.WebHIDCouldNotInitialize("Ledger", String(core.isIndexable(err) ? err.message : err));
66
+ }
67
+ });
68
+ }
69
+ exports.openTransport = openTransport;
70
+ function getTransport() {
71
+ return __awaiter(this, void 0, void 0, function* () {
72
+ if (!(window && window.navigator.hid))
73
+ throw new core.WebHIDNotAvailable();
74
+ try {
75
+ return (yield hw_transport_webhid_1.default.request());
76
+ }
77
+ catch (err) {
78
+ if (core.isIndexable(err) && err.name === "TransportInterfaceNotAvailable") {
79
+ throw new core.ConflictingApp("Ledger");
80
+ }
81
+ throw new core.WebHIDCouldNotPair("Ledger", String(core.isIndexable(err) ? err.message : err));
82
+ }
83
+ });
84
+ }
85
+ exports.getTransport = getTransport;
86
+ function translateCoinAndMethod(transport, coin, method) {
87
+ switch (coin) {
88
+ case "Btc": {
89
+ const btc = new hw_app_btc_1.default(transport);
90
+ const methodInstance = btc[method].bind(btc);
91
+ return methodInstance;
92
+ }
93
+ case "Eth": {
94
+ const eth = new hw_app_eth_1.default(transport);
95
+ const methodInstance = eth[method].bind(eth);
96
+ return methodInstance;
97
+ }
98
+ case null: {
99
+ switch (method) {
100
+ case "decorateAppAPIMethods": {
101
+ const out = transport.decorateAppAPIMethods.bind(transport);
102
+ return out;
103
+ }
104
+ case "getAppAndVersion": {
105
+ const out = getAppAndVersion_1.default.bind(undefined, transport);
106
+ return out;
107
+ }
108
+ case "getDeviceInfo": {
109
+ const out = getDeviceInfo_1.default.bind(undefined, transport);
110
+ return out;
111
+ }
112
+ case "openApp": {
113
+ const out = openApp_1.default.bind(undefined, transport);
114
+ return out;
115
+ }
116
+ default: {
117
+ throw new TypeError("method");
118
+ }
119
+ }
120
+ }
121
+ default: {
122
+ throw new TypeError("coin");
123
+ }
124
+ }
125
+ }
126
+ exports.translateCoinAndMethod = translateCoinAndMethod;
127
+ class LedgerWebHIDTransport extends ledger.LedgerTransport {
128
+ constructor(device, transport, keyring) {
129
+ super(transport, keyring);
130
+ this.device = device;
131
+ }
132
+ // WebHID has no device.serialNumber. Use "0001" for Ledger WebUSBDevices and "0002" for Ledger WebHIDDevices
133
+ getDeviceID() {
134
+ return __awaiter(this, void 0, void 0, function* () {
135
+ return exports.MOCK_SERIAL_NUMBER;
136
+ });
137
+ }
138
+ call(coin, method, ...args) {
139
+ return __awaiter(this, void 0, void 0, function* () {
140
+ this.emit(`ledger.${coin}.${method}.call`, core.makeEvent({
141
+ message_type: method,
142
+ from_wallet: false,
143
+ message: {},
144
+ }));
145
+ try {
146
+ const methodInstance = translateCoinAndMethod(this.transport, coin, method);
147
+ const response = yield methodInstance(...args);
148
+ const result = {
149
+ success: true,
150
+ payload: response,
151
+ coin,
152
+ method,
153
+ };
154
+ if (RECORD_CONFORMANCE_MOCKS) {
155
+ // May need a slight amount of cleanup on escaping `'`s.
156
+ console.log(`this.memoize('${coin}', '${method}',\n JSON.parse('${JSON.stringify(args)}'),\n JSON.parse('${JSON.stringify(result)}'))`);
157
+ }
158
+ return result;
159
+ }
160
+ catch (e) {
161
+ console.error(e);
162
+ return {
163
+ success: false,
164
+ payload: { error: String(e) },
165
+ coin,
166
+ method,
167
+ };
168
+ }
169
+ });
170
+ }
171
+ }
172
+ exports.LedgerWebHIDTransport = LedgerWebHIDTransport;
173
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@shapeshiftoss/hdwallet-ledger-webhid",
3
+ "version": "1.18.4",
4
+ "license": "MIT",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "main": "dist/index.js",
9
+ "source": "src/index.ts",
10
+ "types": "dist/index.d.ts",
11
+ "scripts": {
12
+ "build": "tsc --build",
13
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
14
+ "prepublishOnly": "yarn clean && yarn build"
15
+ },
16
+ "dependencies": {
17
+ "@ledgerhq/hw-app-btc": "^6.7.0",
18
+ "@ledgerhq/hw-app-eth": "^6.9.0",
19
+ "@ledgerhq/hw-transport": "^6.7.0",
20
+ "@ledgerhq/hw-transport-webhid": "^6.7.0",
21
+ "@ledgerhq/live-common": "^21.8.2",
22
+ "@shapeshiftoss/hdwallet-core": "1.18.4",
23
+ "@shapeshiftoss/hdwallet-ledger": "1.18.4",
24
+ "@types/w3c-web-hid": "^1.0.2",
25
+ "typescript": "^4.3.2"
26
+ },
27
+ "devDependencies": {
28
+ "@types/ledgerhq__hw-transport": "^4.21.3"
29
+ },
30
+ "gitHead": "cc9716f335a7b6820bda5d7a0fc3ef07dd09d185"
31
+ }