@onekeyfe/hwk-ledger-adapter 1.2.0-alpha.2 → 1.2.0-alpha.3
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/dist/index.d.mts +0 -6
- package/dist/index.d.ts +0 -6
- package/dist/index.js +220 -723
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +151 -655
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -53,7 +53,7 @@ __export(index_exports, {
|
|
|
53
53
|
module.exports = __toCommonJS(index_exports);
|
|
54
54
|
|
|
55
55
|
// src/adapter/LedgerAdapter.ts
|
|
56
|
-
var
|
|
56
|
+
var import_hwk_adapter_core2 = require("@onekeyfe/hwk-adapter-core");
|
|
57
57
|
|
|
58
58
|
// src/errors.ts
|
|
59
59
|
var import_hwk_adapter_core = require("@onekeyfe/hwk-adapter-core");
|
|
@@ -75,37 +75,30 @@ var USER_REJECTED_CODES = /* @__PURE__ */ new Set(["6985", "27013"]);
|
|
|
75
75
|
var WRONG_APP_CODES = /* @__PURE__ */ new Set(["6e00", "28160", "6d00", "27904", "6a83", "27267"]);
|
|
76
76
|
var APP_NOT_INSTALLED_CODES = /* @__PURE__ */ new Set(["6807", "26631"]);
|
|
77
77
|
var STEP_BLIND_SIGN_TRANSACTION_FALLBACK = "signer.eth.steps.blindSignTransactionFallback";
|
|
78
|
-
var STEP_DETECT_BLIND_SIGNING = "signer.eth.steps.detectBlindSigning";
|
|
79
|
-
var BLIND_SIGNING_STEPS = /* @__PURE__ */ new Set([
|
|
80
|
-
STEP_BLIND_SIGN_TRANSACTION_FALLBACK,
|
|
81
|
-
STEP_DETECT_BLIND_SIGNING
|
|
82
|
-
]);
|
|
83
|
-
function normalizeApduHex(value) {
|
|
84
|
-
if (typeof value === "number" && Number.isInteger(value) && value >= 0 && value <= 65535) {
|
|
85
|
-
return value.toString(16).padStart(4, "0");
|
|
86
|
-
}
|
|
87
|
-
if (typeof value !== "string") return null;
|
|
88
|
-
const raw = value.toLowerCase().replace(/^0x/, "");
|
|
89
|
-
return /^[0-9a-f]{1,4}$/i.test(raw) ? raw.padStart(4, "0") : null;
|
|
90
|
-
}
|
|
91
78
|
function getEthAppErrorCode(err) {
|
|
92
79
|
if (!err || typeof err !== "object") return null;
|
|
93
80
|
const e = err;
|
|
94
|
-
if (e._tag === ERROR_TAG.EthAppCommand) {
|
|
95
|
-
|
|
96
|
-
if (code) return code;
|
|
81
|
+
if (e._tag === ERROR_TAG.EthAppCommand && typeof e.errorCode === "string") {
|
|
82
|
+
return e.errorCode.toLowerCase();
|
|
97
83
|
}
|
|
98
84
|
const orig = e.originalError;
|
|
99
|
-
if (orig?._tag === ERROR_TAG.EthAppCommand) {
|
|
100
|
-
return
|
|
85
|
+
if (orig?._tag === ERROR_TAG.EthAppCommand && typeof orig.errorCode === "string") {
|
|
86
|
+
return orig.errorCode.toLowerCase();
|
|
101
87
|
}
|
|
102
88
|
return null;
|
|
103
89
|
}
|
|
104
90
|
function extractApduHex(err) {
|
|
105
91
|
if (!err || typeof err !== "object") return null;
|
|
106
92
|
const e = err;
|
|
107
|
-
|
|
108
|
-
|
|
93
|
+
if (typeof e.errorCode === "string" && /^[0-9a-f]+$/i.test(e.errorCode)) {
|
|
94
|
+
return e.errorCode.toLowerCase();
|
|
95
|
+
}
|
|
96
|
+
if (typeof e.statusCode === "number" && Number.isFinite(e.statusCode)) {
|
|
97
|
+
return e.statusCode.toString(16).padStart(4, "0");
|
|
98
|
+
}
|
|
99
|
+
if (typeof e.statusCode === "string" && /^[0-9a-f]+$/i.test(e.statusCode)) {
|
|
100
|
+
return e.statusCode.toLowerCase();
|
|
101
|
+
}
|
|
109
102
|
if (e.originalError != null) {
|
|
110
103
|
const nested = extractApduHex(e.originalError);
|
|
111
104
|
if (nested) return nested;
|
|
@@ -164,15 +157,10 @@ function classifyEthAppError(err) {
|
|
|
164
157
|
const ethCode = getEthAppErrorCode(err);
|
|
165
158
|
if (!ethCode) return null;
|
|
166
159
|
if (ethCode === "6a80") {
|
|
167
|
-
return
|
|
160
|
+
return hasBlindSignFallbackStep(err) ? import_hwk_adapter_core.HardwareErrorCode.EvmBlindSigningRequired : null;
|
|
168
161
|
}
|
|
169
162
|
return mapEthAppErrorCode(ethCode);
|
|
170
163
|
}
|
|
171
|
-
function classifyBlindSigningDetectionError(err) {
|
|
172
|
-
if (!hasBlindSigningStep(err)) return null;
|
|
173
|
-
if (hasInvalidArgumentCode(err)) return import_hwk_adapter_core.HardwareErrorCode.EvmBlindSigningRequired;
|
|
174
|
-
return null;
|
|
175
|
-
}
|
|
176
164
|
var ERROR_TAG = {
|
|
177
165
|
// SDK-mint
|
|
178
166
|
DeviceNotAdvertising: "DeviceNotAdvertisingError",
|
|
@@ -188,10 +176,6 @@ var ERROR_TAG = {
|
|
|
188
176
|
// chain app wedged (APDU 0x6901)
|
|
189
177
|
DeviceTransportStuck: "DeviceTransportStuck",
|
|
190
178
|
// DMK transport queue wedged
|
|
191
|
-
// installApp resolved success but the app is still missing on device —
|
|
192
|
-
// DMK quirk. Surfaced as a distinct tag so callers can tell it apart from
|
|
193
|
-
// the original DMK-thrown AppNotInstalled.
|
|
194
|
-
AppInstallVerifyFailed: "AppInstallVerifyFailedError",
|
|
195
179
|
// DMK-reuse (DMK throws same string; we synthesize too)
|
|
196
180
|
DeviceLocked: "DeviceLockedError",
|
|
197
181
|
DeviceNotRecognized: "DeviceNotRecognizedError",
|
|
@@ -217,11 +201,7 @@ var ERROR_TAG = {
|
|
|
217
201
|
// ble-plx surfaces this when GATT notification setup fails — typical
|
|
218
202
|
// outcome when the user doesn't confirm pairing on the device, or the
|
|
219
203
|
// existing bond is invalid. Observed in production after ~30s.
|
|
220
|
-
PairingRefused: "PairingRefusedError"
|
|
221
|
-
// DMK remote-network failures (manager-api HTTP / secure-channel WS).
|
|
222
|
-
WebSocketConnection: "WebSocketConnectionError",
|
|
223
|
-
HttpFetch: "FetchError",
|
|
224
|
-
InvalidFirmwareMetadataResponse: "InvalidGetFirmwareMetadataResponseError"
|
|
204
|
+
PairingRefused: "PairingRefusedError"
|
|
225
205
|
};
|
|
226
206
|
function isDeviceLockedError(err) {
|
|
227
207
|
if (!err || typeof err !== "object") return false;
|
|
@@ -309,30 +289,15 @@ function hasStatusCode(err, codeSet) {
|
|
|
309
289
|
if (e.error != null && e._tag && hasStatusCode(e.error, codeSet)) return true;
|
|
310
290
|
return false;
|
|
311
291
|
}
|
|
312
|
-
function
|
|
292
|
+
function hasBlindSignFallbackStep(err) {
|
|
313
293
|
if (!err || typeof err !== "object") return false;
|
|
314
294
|
const e = err;
|
|
315
|
-
if (e._lastStep ===
|
|
316
|
-
if (Array.isArray(e._deviceActionSteps) && e._deviceActionSteps.includes(
|
|
295
|
+
if (e._lastStep === STEP_BLIND_SIGN_TRANSACTION_FALLBACK) return true;
|
|
296
|
+
if (Array.isArray(e._deviceActionSteps) && e._deviceActionSteps.includes(STEP_BLIND_SIGN_TRANSACTION_FALLBACK)) {
|
|
317
297
|
return true;
|
|
318
298
|
}
|
|
319
|
-
if (e.originalError != null &&
|
|
320
|
-
if (e.error != null && e._tag &&
|
|
321
|
-
return false;
|
|
322
|
-
}
|
|
323
|
-
function hasBlindSigningStep(err) {
|
|
324
|
-
for (const step of BLIND_SIGNING_STEPS) {
|
|
325
|
-
if (hasDeviceActionStep(err, step)) return true;
|
|
326
|
-
}
|
|
327
|
-
return false;
|
|
328
|
-
}
|
|
329
|
-
function hasInvalidArgumentCode(err) {
|
|
330
|
-
if (!err || typeof err !== "object") return false;
|
|
331
|
-
const e = err;
|
|
332
|
-
if (e.code === "INVALID_ARGUMENT") return true;
|
|
333
|
-
if (typeof e.message === "string" && e.message.includes("code=INVALID_ARGUMENT")) return true;
|
|
334
|
-
if (e.originalError != null && hasInvalidArgumentCode(e.originalError)) return true;
|
|
335
|
-
if (e.error != null && e._tag && hasInvalidArgumentCode(e.error)) return true;
|
|
299
|
+
if (e.originalError != null && hasBlindSignFallbackStep(e.originalError)) return true;
|
|
300
|
+
if (e.error != null && e._tag && hasBlindSignFallbackStep(e.error)) return true;
|
|
336
301
|
return false;
|
|
337
302
|
}
|
|
338
303
|
function isDeviceNotFoundError(err) {
|
|
@@ -361,11 +326,6 @@ function isUserRejectedError(err) {
|
|
|
361
326
|
if (hasStatusCode(err, USER_REJECTED_CODES)) return true;
|
|
362
327
|
return false;
|
|
363
328
|
}
|
|
364
|
-
function isUserAbortedError(err) {
|
|
365
|
-
if (!err || typeof err !== "object") return false;
|
|
366
|
-
const e = err;
|
|
367
|
-
return e._tag === ERROR_TAG.UserAborted;
|
|
368
|
-
}
|
|
369
329
|
function isWrongAppError(err) {
|
|
370
330
|
if (!err || typeof err !== "object") return false;
|
|
371
331
|
const e = err;
|
|
@@ -392,20 +352,6 @@ function isOutOfMemoryError(err) {
|
|
|
392
352
|
const e = err;
|
|
393
353
|
return e._tag === "OutOfMemoryDAError";
|
|
394
354
|
}
|
|
395
|
-
var NETWORK_ERROR_TAGS = /* @__PURE__ */ new Set([
|
|
396
|
-
ERROR_TAG.WebSocketConnection,
|
|
397
|
-
ERROR_TAG.HttpFetch,
|
|
398
|
-
ERROR_TAG.InvalidFirmwareMetadataResponse
|
|
399
|
-
]);
|
|
400
|
-
function isNetworkError(err) {
|
|
401
|
-
if (!err || typeof err !== "object") return false;
|
|
402
|
-
const e = err;
|
|
403
|
-
const tag = e._tag;
|
|
404
|
-
if (typeof tag === "string" && NETWORK_ERROR_TAGS.has(tag)) return true;
|
|
405
|
-
if (e.originalError != null && isNetworkError(e.originalError)) return true;
|
|
406
|
-
if (e.error != null && isNetworkError(e.error)) return true;
|
|
407
|
-
return false;
|
|
408
|
-
}
|
|
409
355
|
function isDeviceDisconnectedError(err) {
|
|
410
356
|
if (!err || typeof err !== "object") return false;
|
|
411
357
|
const e = err;
|
|
@@ -462,8 +408,6 @@ function mapLedgerError(err, opts) {
|
|
|
462
408
|
code = import_hwk_adapter_core.HardwareErrorCode.DeviceBusy;
|
|
463
409
|
} else if (isBlePairingFailureError(err)) {
|
|
464
410
|
code = import_hwk_adapter_core.HardwareErrorCode.BlePairingTimeout;
|
|
465
|
-
} else if (isUserAbortedError(err)) {
|
|
466
|
-
code = import_hwk_adapter_core.HardwareErrorCode.UserAborted;
|
|
467
411
|
} else if (isUserRejectedError(err)) {
|
|
468
412
|
code = import_hwk_adapter_core.HardwareErrorCode.UserRejected;
|
|
469
413
|
} else if (isWrongAppError(err)) {
|
|
@@ -472,14 +416,12 @@ function mapLedgerError(err, opts) {
|
|
|
472
416
|
code = import_hwk_adapter_core.HardwareErrorCode.AppNotInstalled;
|
|
473
417
|
} else if (isOutOfMemoryError(err)) {
|
|
474
418
|
code = import_hwk_adapter_core.HardwareErrorCode.DeviceOutOfMemory;
|
|
475
|
-
} else if (isNetworkError(err)) {
|
|
476
|
-
code = import_hwk_adapter_core.HardwareErrorCode.NetworkError;
|
|
477
419
|
} else if (isDeviceDisconnectedError(err)) {
|
|
478
420
|
code = import_hwk_adapter_core.HardwareErrorCode.DeviceDisconnected;
|
|
479
421
|
} else if (isTimeoutError(err)) {
|
|
480
422
|
code = import_hwk_adapter_core.HardwareErrorCode.OperationTimeout;
|
|
481
423
|
} else {
|
|
482
|
-
const ethMapped = classifyEthAppError(err)
|
|
424
|
+
const ethMapped = classifyEthAppError(err);
|
|
483
425
|
const apduHex = ethMapped ? null : extractApduHex(err);
|
|
484
426
|
const chainMapped = apduHex ? mapSolanaAppError(apduHex) ?? mapTronAppError(apduHex) ?? mapBtcAppError(apduHex) : null;
|
|
485
427
|
code = ethMapped ?? chainMapped ?? import_hwk_adapter_core.HardwareErrorCode.UnknownError;
|
|
@@ -489,8 +431,17 @@ function mapLedgerError(err, opts) {
|
|
|
489
431
|
return { code, message: (0, import_hwk_adapter_core.enrichErrorMessage)(code, originalMessage), appName };
|
|
490
432
|
}
|
|
491
433
|
|
|
492
|
-
// src/
|
|
493
|
-
|
|
434
|
+
// src/utils/ledgerDmkTransport.ts
|
|
435
|
+
function isLedgerDmkBleTransport(transport) {
|
|
436
|
+
const normalized = transport?.toUpperCase();
|
|
437
|
+
return normalized === "BLE" || normalized?.endsWith("_BLE") === true;
|
|
438
|
+
}
|
|
439
|
+
function isLedgerBleConnectionType(connectionType) {
|
|
440
|
+
return connectionType === "ble";
|
|
441
|
+
}
|
|
442
|
+
function isLedgerBleDescriptor(connectionType, descriptor) {
|
|
443
|
+
return isLedgerBleConnectionType(connectionType) || isLedgerDmkBleTransport(descriptor.transport);
|
|
444
|
+
}
|
|
494
445
|
|
|
495
446
|
// src/utils/sdkEventBus.ts
|
|
496
447
|
var listeners = /* @__PURE__ */ new Set();
|
|
@@ -537,252 +488,6 @@ function debugError(...args) {
|
|
|
537
488
|
emitLog("error", ...args);
|
|
538
489
|
}
|
|
539
490
|
|
|
540
|
-
// src/adapter/methods/allNetworkGetAddress.ts
|
|
541
|
-
var LEDGER_BTC_NETWORK_COIN_MAP = {
|
|
542
|
-
tbtc: "Testnet",
|
|
543
|
-
bch: "Bcash",
|
|
544
|
-
doge: "Dogecoin",
|
|
545
|
-
ltc: "Litecoin",
|
|
546
|
-
neurai: "Neurai"
|
|
547
|
-
};
|
|
548
|
-
function createAllNetworkGetAddress({
|
|
549
|
-
callChain,
|
|
550
|
-
getChainFingerprint
|
|
551
|
-
}) {
|
|
552
|
-
return async function allNetworkGetAddress(connectId, _deviceId, params) {
|
|
553
|
-
debugLog("[LedgerAdapter][REQ]", { method: "allNetworkGetAddress", connectId, params });
|
|
554
|
-
const installContext = {};
|
|
555
|
-
const commonParams = {
|
|
556
|
-
autoInstallApp: params.autoInstallApp
|
|
557
|
-
};
|
|
558
|
-
const responses = [];
|
|
559
|
-
const chainFingerprints = /* @__PURE__ */ new Map();
|
|
560
|
-
for (const item of params.bundle) {
|
|
561
|
-
const method = getAllNetworkMethod(item);
|
|
562
|
-
if (!method) {
|
|
563
|
-
responses.push(buildUnsupportedMethodResponse(item));
|
|
564
|
-
} else {
|
|
565
|
-
const chain = getFingerprintChain(method);
|
|
566
|
-
const itemDeviceId = getItemDeviceId(item) ?? chainFingerprints.get(chain) ?? "";
|
|
567
|
-
const normalizedItem = normalizeLedgerAllNetworkItem(method, item);
|
|
568
|
-
const response = await callAllNetworkItem(
|
|
569
|
-
callChain,
|
|
570
|
-
getChainFingerprint,
|
|
571
|
-
connectId,
|
|
572
|
-
itemDeviceId,
|
|
573
|
-
chain,
|
|
574
|
-
method,
|
|
575
|
-
normalizedItem,
|
|
576
|
-
commonParams,
|
|
577
|
-
installContext,
|
|
578
|
-
chainFingerprints
|
|
579
|
-
);
|
|
580
|
-
if (isTopLevelAllNetworkFailure(response)) {
|
|
581
|
-
const code = response.payload?.code ?? import_hwk_adapter_core2.HardwareErrorCode.DeviceMismatch;
|
|
582
|
-
const result2 = (0, import_hwk_adapter_core2.failure)(
|
|
583
|
-
code,
|
|
584
|
-
response.payload?.error ?? "All-network get-address aborted",
|
|
585
|
-
response.payload?.params
|
|
586
|
-
);
|
|
587
|
-
debugLog("[LedgerAdapter][RES]", {
|
|
588
|
-
method: "allNetworkGetAddress",
|
|
589
|
-
success: false,
|
|
590
|
-
payload: result2
|
|
591
|
-
});
|
|
592
|
-
return result2;
|
|
593
|
-
}
|
|
594
|
-
responses.push(response);
|
|
595
|
-
}
|
|
596
|
-
}
|
|
597
|
-
const result = (0, import_hwk_adapter_core2.success)(responses);
|
|
598
|
-
debugLog("[LedgerAdapter][RES]", {
|
|
599
|
-
method: "allNetworkGetAddress",
|
|
600
|
-
success: true,
|
|
601
|
-
payload: result
|
|
602
|
-
});
|
|
603
|
-
return result;
|
|
604
|
-
};
|
|
605
|
-
}
|
|
606
|
-
function isTopLevelAllNetworkFailure(response) {
|
|
607
|
-
if (response.success) {
|
|
608
|
-
return false;
|
|
609
|
-
}
|
|
610
|
-
const code = response.payload?.code;
|
|
611
|
-
return code === import_hwk_adapter_core2.HardwareErrorCode.DeviceMismatch || code === import_hwk_adapter_core2.HardwareErrorCode.UserAborted || code === import_hwk_adapter_core2.HardwareErrorCode.UserRejected;
|
|
612
|
-
}
|
|
613
|
-
function getItemDeviceId(item) {
|
|
614
|
-
const { deviceId } = item;
|
|
615
|
-
return typeof deviceId === "string" && deviceId.length > 0 ? deviceId : void 0;
|
|
616
|
-
}
|
|
617
|
-
function getAllNetworkMethod(item) {
|
|
618
|
-
switch (item.methodName) {
|
|
619
|
-
case "evmGetAddress":
|
|
620
|
-
case "btcGetAddress":
|
|
621
|
-
case "btcGetPublicKey":
|
|
622
|
-
case "solGetAddress":
|
|
623
|
-
case "tronGetAddress":
|
|
624
|
-
return item.methodName;
|
|
625
|
-
default:
|
|
626
|
-
return void 0;
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
function buildUnsupportedMethodResponse(item) {
|
|
630
|
-
return {
|
|
631
|
-
...item,
|
|
632
|
-
success: false,
|
|
633
|
-
payload: {
|
|
634
|
-
code: import_hwk_adapter_core2.HardwareErrorCode.InvalidParams,
|
|
635
|
-
error: `Unsupported allNetwork method: ${String(item.methodName)}`
|
|
636
|
-
}
|
|
637
|
-
};
|
|
638
|
-
}
|
|
639
|
-
function normalizeLedgerAllNetworkItem(method, item) {
|
|
640
|
-
if (method !== "btcGetAddress" && method !== "btcGetPublicKey") {
|
|
641
|
-
return item;
|
|
642
|
-
}
|
|
643
|
-
const itemWithCoin = item;
|
|
644
|
-
if (itemWithCoin.coin) {
|
|
645
|
-
return item;
|
|
646
|
-
}
|
|
647
|
-
const coin = LEDGER_BTC_NETWORK_COIN_MAP[item.network];
|
|
648
|
-
return coin ? { ...item, coin } : item;
|
|
649
|
-
}
|
|
650
|
-
async function callAllNetworkItem(callChain, getChainFingerprint, connectId, deviceId, chain, method, item, commonParams, installContext, chainFingerprints) {
|
|
651
|
-
const response = await callAllNetworkMethod(
|
|
652
|
-
callChain,
|
|
653
|
-
connectId,
|
|
654
|
-
deviceId,
|
|
655
|
-
method,
|
|
656
|
-
item,
|
|
657
|
-
commonParams,
|
|
658
|
-
installContext
|
|
659
|
-
);
|
|
660
|
-
if (!response.success) {
|
|
661
|
-
return { ...item, success: false, payload: response.payload };
|
|
662
|
-
}
|
|
663
|
-
const payload = response.payload;
|
|
664
|
-
const fingerprint = deviceId || chainFingerprints.get(chain) || await bootstrapChainFingerprint(getChainFingerprint, connectId, chain);
|
|
665
|
-
if (!fingerprint) {
|
|
666
|
-
return buildFingerprintBootstrapFailure(item, chain);
|
|
667
|
-
}
|
|
668
|
-
chainFingerprints.set(chain, fingerprint);
|
|
669
|
-
return {
|
|
670
|
-
...item,
|
|
671
|
-
success: true,
|
|
672
|
-
payload: {
|
|
673
|
-
...payload,
|
|
674
|
-
chainFingerprint: fingerprint,
|
|
675
|
-
chainFingerprintChain: chain
|
|
676
|
-
}
|
|
677
|
-
};
|
|
678
|
-
}
|
|
679
|
-
async function bootstrapChainFingerprint(getChainFingerprint, connectId, chain) {
|
|
680
|
-
const response = await getChainFingerprint(connectId, chain);
|
|
681
|
-
return response.success ? response.payload : "";
|
|
682
|
-
}
|
|
683
|
-
function buildFingerprintBootstrapFailure(item, chain) {
|
|
684
|
-
return {
|
|
685
|
-
...item,
|
|
686
|
-
success: false,
|
|
687
|
-
payload: {
|
|
688
|
-
code: import_hwk_adapter_core2.HardwareErrorCode.DeviceMismatch,
|
|
689
|
-
error: `Could not establish chain fingerprint for ${chain} after device call; refusing to return unverifiable result. Please retry.`
|
|
690
|
-
}
|
|
691
|
-
};
|
|
692
|
-
}
|
|
693
|
-
function getFingerprintChain(method) {
|
|
694
|
-
switch (method) {
|
|
695
|
-
case "evmGetAddress":
|
|
696
|
-
return "evm";
|
|
697
|
-
case "btcGetAddress":
|
|
698
|
-
case "btcGetPublicKey":
|
|
699
|
-
return "btc";
|
|
700
|
-
case "solGetAddress":
|
|
701
|
-
return "sol";
|
|
702
|
-
case "tronGetAddress":
|
|
703
|
-
return "tron";
|
|
704
|
-
default:
|
|
705
|
-
throw Object.assign(new Error(`Unsupported allNetwork method: ${method}`), {
|
|
706
|
-
code: import_hwk_adapter_core2.HardwareErrorCode.InvalidParams
|
|
707
|
-
});
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
async function callAllNetworkMethod(callChain, connectId, deviceId, method, item, commonParams, installContext) {
|
|
711
|
-
switch (method) {
|
|
712
|
-
case "evmGetAddress":
|
|
713
|
-
return callChain(
|
|
714
|
-
connectId,
|
|
715
|
-
deviceId,
|
|
716
|
-
"evm",
|
|
717
|
-
"evmGetAddress",
|
|
718
|
-
item,
|
|
719
|
-
commonParams,
|
|
720
|
-
false,
|
|
721
|
-
installContext
|
|
722
|
-
);
|
|
723
|
-
case "btcGetAddress":
|
|
724
|
-
return callChain(
|
|
725
|
-
connectId,
|
|
726
|
-
deviceId,
|
|
727
|
-
"btc",
|
|
728
|
-
"btcGetAddress",
|
|
729
|
-
item,
|
|
730
|
-
commonParams,
|
|
731
|
-
false,
|
|
732
|
-
installContext
|
|
733
|
-
);
|
|
734
|
-
case "btcGetPublicKey":
|
|
735
|
-
return callChain(
|
|
736
|
-
connectId,
|
|
737
|
-
deviceId,
|
|
738
|
-
"btc",
|
|
739
|
-
"btcGetPublicKey",
|
|
740
|
-
item,
|
|
741
|
-
commonParams,
|
|
742
|
-
false,
|
|
743
|
-
installContext
|
|
744
|
-
);
|
|
745
|
-
case "solGetAddress":
|
|
746
|
-
return callChain(
|
|
747
|
-
connectId,
|
|
748
|
-
deviceId,
|
|
749
|
-
"sol",
|
|
750
|
-
"solGetAddress",
|
|
751
|
-
item,
|
|
752
|
-
commonParams,
|
|
753
|
-
false,
|
|
754
|
-
installContext
|
|
755
|
-
);
|
|
756
|
-
case "tronGetAddress":
|
|
757
|
-
return callChain(
|
|
758
|
-
connectId,
|
|
759
|
-
deviceId,
|
|
760
|
-
"tron",
|
|
761
|
-
"tronGetAddress",
|
|
762
|
-
item,
|
|
763
|
-
commonParams,
|
|
764
|
-
false,
|
|
765
|
-
installContext
|
|
766
|
-
);
|
|
767
|
-
default:
|
|
768
|
-
throw Object.assign(new Error(`Unsupported allNetwork method: ${method}`), {
|
|
769
|
-
code: import_hwk_adapter_core2.HardwareErrorCode.InvalidParams
|
|
770
|
-
});
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
// src/utils/ledgerDmkTransport.ts
|
|
775
|
-
function isLedgerDmkBleTransport(transport) {
|
|
776
|
-
const normalized = transport?.toUpperCase();
|
|
777
|
-
return normalized === "BLE" || normalized?.endsWith("_BLE") === true;
|
|
778
|
-
}
|
|
779
|
-
function isLedgerBleConnectionType(connectionType) {
|
|
780
|
-
return connectionType === "ble";
|
|
781
|
-
}
|
|
782
|
-
function isLedgerBleDescriptor(connectionType, descriptor) {
|
|
783
|
-
return isLedgerBleConnectionType(connectionType) || isLedgerDmkBleTransport(descriptor.transport);
|
|
784
|
-
}
|
|
785
|
-
|
|
786
491
|
// src/adapter/LedgerAdapter.ts
|
|
787
492
|
function formatDeviceMismatchError(expected, actual) {
|
|
788
493
|
return `Wrong device: expected ${expected}, got ${actual}`;
|
|
@@ -798,10 +503,10 @@ function btcAccountIndexFromPath(path) {
|
|
|
798
503
|
var _LedgerAdapter = class _LedgerAdapter {
|
|
799
504
|
constructor(connector, options) {
|
|
800
505
|
this.vendor = "ledger";
|
|
801
|
-
this.emitter = new
|
|
506
|
+
this.emitter = new import_hwk_adapter_core2.TypedEventEmitter();
|
|
802
507
|
this._discoveredDevices = /* @__PURE__ */ new Map();
|
|
803
508
|
this._sessions = /* @__PURE__ */ new Map();
|
|
804
|
-
this._uiRegistry = new
|
|
509
|
+
this._uiRegistry = new import_hwk_adapter_core2.UiRequestRegistry();
|
|
805
510
|
// BTC App rejects account index >= 100 unless display=true. Cached per
|
|
806
511
|
// adapter instance: first 100+ path asks the user once via UI request,
|
|
807
512
|
// subsequent 100+ paths in the same session auto-promote silently.
|
|
@@ -810,11 +515,6 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
810
515
|
this._btcHighIndexConfirmedThisSession = false;
|
|
811
516
|
// Shared across concurrent callers — only `cancel()` aborts.
|
|
812
517
|
this._doConnectAbortController = null;
|
|
813
|
-
this._installProgressLastEmittedValue = -Infinity;
|
|
814
|
-
this.allNetworkGetAddress = createAllNetworkGetAddress({
|
|
815
|
-
callChain: this.callChain.bind(this),
|
|
816
|
-
getChainFingerprint: (connectId, chain) => this.getChainFingerprint(connectId, "", chain)
|
|
817
|
-
});
|
|
818
518
|
// ---------------------------------------------------------------------------
|
|
819
519
|
// Private helpers
|
|
820
520
|
// ---------------------------------------------------------------------------
|
|
@@ -834,16 +534,16 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
834
534
|
const deviceInfo = this.connectorDeviceToDeviceInfo(data.device);
|
|
835
535
|
this._discoveredDevices.set(deviceInfo.connectId, deviceInfo);
|
|
836
536
|
this._sessions.delete(deviceInfo.connectId);
|
|
837
|
-
this.emitter.emit(
|
|
838
|
-
type:
|
|
537
|
+
this.emitter.emit(import_hwk_adapter_core2.DEVICE.CONNECT, {
|
|
538
|
+
type: import_hwk_adapter_core2.DEVICE.CONNECT,
|
|
839
539
|
payload: deviceInfo
|
|
840
540
|
});
|
|
841
541
|
};
|
|
842
542
|
this.deviceDisconnectHandler = (data) => {
|
|
843
543
|
this._discoveredDevices.delete(data.connectId);
|
|
844
544
|
this._sessions.delete(data.connectId);
|
|
845
|
-
this.emitter.emit(
|
|
846
|
-
type:
|
|
545
|
+
this.emitter.emit(import_hwk_adapter_core2.DEVICE.DISCONNECT, {
|
|
546
|
+
type: import_hwk_adapter_core2.DEVICE.DISCONNECT,
|
|
847
547
|
payload: { connectId: data.connectId }
|
|
848
548
|
});
|
|
849
549
|
};
|
|
@@ -853,7 +553,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
853
553
|
// exists (race during teardown) we drop. All other variants pass through
|
|
854
554
|
// unchanged.
|
|
855
555
|
this.uiEventForwarder = (event) => {
|
|
856
|
-
if (event.type ===
|
|
556
|
+
if (event.type === import_hwk_adapter_core2.EConnectorInteraction.AppInstallProgress) {
|
|
857
557
|
let connectId;
|
|
858
558
|
for (const [cid, sid] of this._sessions) {
|
|
859
559
|
if (sid === event.payload.sessionId) {
|
|
@@ -868,23 +568,12 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
868
568
|
);
|
|
869
569
|
return;
|
|
870
570
|
}
|
|
871
|
-
const { appName, progress } = event.payload;
|
|
872
|
-
const key = `${connectId}:${appName}`;
|
|
873
|
-
if (this._installProgressLastKey !== key || this._installProgressLastEmittedValue >= 1) {
|
|
874
|
-
this._installProgressLastEmittedValue = -Infinity;
|
|
875
|
-
this._installProgressLastKey = key;
|
|
876
|
-
}
|
|
877
|
-
const delta = progress - this._installProgressLastEmittedValue;
|
|
878
|
-
if (delta < _LedgerAdapter.APP_INSTALL_PROGRESS_MIN_DELTA && progress < 1) {
|
|
879
|
-
return;
|
|
880
|
-
}
|
|
881
|
-
this._installProgressLastEmittedValue = progress;
|
|
882
571
|
this.emitter.emit("ui-event", {
|
|
883
|
-
type:
|
|
572
|
+
type: import_hwk_adapter_core2.EConnectorInteraction.AppInstallProgress,
|
|
884
573
|
payload: {
|
|
885
574
|
connectId,
|
|
886
|
-
appName,
|
|
887
|
-
progress
|
|
575
|
+
appName: event.payload.appName,
|
|
576
|
+
progress: event.payload.progress
|
|
888
577
|
}
|
|
889
578
|
});
|
|
890
579
|
return;
|
|
@@ -893,7 +582,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
893
582
|
};
|
|
894
583
|
this.connector = connector;
|
|
895
584
|
this._defaultAutoInstallApp = options?.autoInstallApp ?? false;
|
|
896
|
-
this._jobQueue = new
|
|
585
|
+
this._jobQueue = new import_hwk_adapter_core2.DeviceJobQueue();
|
|
897
586
|
this.registerEventListeners();
|
|
898
587
|
}
|
|
899
588
|
// Transport
|
|
@@ -941,42 +630,30 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
941
630
|
// Device management
|
|
942
631
|
// ---------------------------------------------------------------------------
|
|
943
632
|
async searchDevices(options) {
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
633
|
+
if (options?.resetSession) {
|
|
634
|
+
this._doConnectAbortController?.abort();
|
|
635
|
+
this._sessions.clear();
|
|
636
|
+
this._connectingPromise = null;
|
|
637
|
+
this._doConnectAbortController = null;
|
|
638
|
+
this._btcHighIndexConfirmedThisSession = false;
|
|
639
|
+
}
|
|
640
|
+
await this._ensureDevicePermission();
|
|
641
|
+
const devices = await this.connector.searchDevices();
|
|
642
|
+
this._discoveredDevices.clear();
|
|
643
|
+
for (const d of devices) {
|
|
644
|
+
if (d.connectId) {
|
|
645
|
+
this._discoveredDevices.set(d.connectId, this.connectorDeviceToDeviceInfo(d));
|
|
952
646
|
}
|
|
647
|
+
}
|
|
648
|
+
if (this._discoveredDevices.size === 0) {
|
|
953
649
|
await this._ensureDevicePermission();
|
|
954
|
-
const devices = await this.connector.searchDevices();
|
|
955
|
-
this._discoveredDevices.clear();
|
|
956
|
-
for (const d of devices) {
|
|
957
|
-
if (d.connectId) {
|
|
958
|
-
this._discoveredDevices.set(d.connectId, this.connectorDeviceToDeviceInfo(d));
|
|
959
|
-
}
|
|
960
|
-
}
|
|
961
|
-
if (this._discoveredDevices.size === 0) {
|
|
962
|
-
await this._ensureDevicePermission();
|
|
963
|
-
}
|
|
964
|
-
const result = Array.from(this._discoveredDevices.values());
|
|
965
|
-
debugLog("[LedgerAdapter][RES]", {
|
|
966
|
-
method: "searchDevices",
|
|
967
|
-
success: true,
|
|
968
|
-
payload: result
|
|
969
|
-
});
|
|
970
|
-
return result;
|
|
971
|
-
} catch (err) {
|
|
972
|
-
const e = err;
|
|
973
|
-
debugLog("[LedgerAdapter][RES]", {
|
|
974
|
-
method: "searchDevices",
|
|
975
|
-
success: false,
|
|
976
|
-
error: { message: e?.message, _tag: e?._tag, code: e?.code ?? e?.errorCode }
|
|
977
|
-
});
|
|
978
|
-
throw err;
|
|
979
650
|
}
|
|
651
|
+
debugLog(
|
|
652
|
+
`[LedgerAdapter] searchDevices() return count=${this._discoveredDevices.size} ids=[${[
|
|
653
|
+
...this._discoveredDevices.keys()
|
|
654
|
+
].join(",")}]`
|
|
655
|
+
);
|
|
656
|
+
return Array.from(this._discoveredDevices.values());
|
|
980
657
|
}
|
|
981
658
|
// USB single-session invariant: evict all sessions, best-effort (see connectDevice).
|
|
982
659
|
async _evictAllSessions() {
|
|
@@ -992,15 +669,14 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
992
669
|
}
|
|
993
670
|
static _createDeviceBusyError(method) {
|
|
994
671
|
return Object.assign(new Error(`Ledger device is busy while calling ${method}`), {
|
|
995
|
-
code:
|
|
672
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.DeviceBusy
|
|
996
673
|
});
|
|
997
674
|
}
|
|
998
675
|
async connectDevice(connectId) {
|
|
999
|
-
debugLog("[LedgerAdapter][REQ]", { method: "connectDevice", connectId, params: { connectId } });
|
|
1000
676
|
try {
|
|
1001
677
|
if (isLedgerBleConnectionType(this.connector.connectionType) && !connectId) {
|
|
1002
678
|
throw Object.assign(new Error("Ledger BLE connectId is required."), {
|
|
1003
|
-
code:
|
|
679
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.DeviceNotFound
|
|
1004
680
|
});
|
|
1005
681
|
}
|
|
1006
682
|
if (!isLedgerBleConnectionType(this.connector.connectionType)) {
|
|
@@ -1012,79 +688,28 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1012
688
|
if (session.deviceInfo) {
|
|
1013
689
|
this._discoveredDevices.set(connectId, session.deviceInfo);
|
|
1014
690
|
}
|
|
1015
|
-
|
|
1016
|
-
debugLog("[LedgerAdapter][RES]", { method: "connectDevice", success: true, payload: result });
|
|
1017
|
-
return result;
|
|
691
|
+
return (0, import_hwk_adapter_core2.success)(connectId);
|
|
1018
692
|
} catch (err) {
|
|
1019
|
-
|
|
1020
|
-
debugLog("[LedgerAdapter][RES]", {
|
|
1021
|
-
method: "connectDevice",
|
|
1022
|
-
success: false,
|
|
1023
|
-
payload: failureResult
|
|
1024
|
-
});
|
|
1025
|
-
return failureResult;
|
|
693
|
+
return this.errorToFailure(err);
|
|
1026
694
|
}
|
|
1027
695
|
}
|
|
1028
696
|
async disconnectDevice(connectId) {
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
});
|
|
1034
|
-
try {
|
|
1035
|
-
const sessionId = this._sessions.get(connectId);
|
|
1036
|
-
if (sessionId) {
|
|
1037
|
-
await this.connector.disconnect(sessionId);
|
|
1038
|
-
this._sessions.delete(connectId);
|
|
1039
|
-
}
|
|
1040
|
-
debugLog("[LedgerAdapter][RES]", { method: "disconnectDevice", success: true });
|
|
1041
|
-
} catch (err) {
|
|
1042
|
-
const e = err;
|
|
1043
|
-
debugLog("[LedgerAdapter][RES]", {
|
|
1044
|
-
method: "disconnectDevice",
|
|
1045
|
-
success: false,
|
|
1046
|
-
error: { message: e?.message, _tag: e?._tag, code: e?.code ?? e?.errorCode }
|
|
1047
|
-
});
|
|
1048
|
-
throw err;
|
|
697
|
+
const sessionId = this._sessions.get(connectId);
|
|
698
|
+
if (sessionId) {
|
|
699
|
+
await this.connector.disconnect(sessionId);
|
|
700
|
+
this._sessions.delete(connectId);
|
|
1049
701
|
}
|
|
1050
702
|
}
|
|
1051
703
|
async getDeviceInfo(connectId, deviceId) {
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
});
|
|
1057
|
-
try {
|
|
1058
|
-
await this._ensureDevicePermission(connectId, deviceId);
|
|
1059
|
-
const cached = this._discoveredDevices.get(connectId) ?? Array.from(this._discoveredDevices.values()).find((d) => d.deviceId === deviceId);
|
|
1060
|
-
if (cached) {
|
|
1061
|
-
const result = (0, import_hwk_adapter_core3.success)(cached);
|
|
1062
|
-
debugLog("[LedgerAdapter][RES]", {
|
|
1063
|
-
method: "getDeviceInfo",
|
|
1064
|
-
success: true,
|
|
1065
|
-
payload: result
|
|
1066
|
-
});
|
|
1067
|
-
return result;
|
|
1068
|
-
}
|
|
1069
|
-
const notFound = (0, import_hwk_adapter_core3.failure)(
|
|
1070
|
-
import_hwk_adapter_core3.HardwareErrorCode.DeviceNotFound,
|
|
1071
|
-
"Device not found in cache. Call searchDevices() or wait for a device-connected event first."
|
|
1072
|
-
);
|
|
1073
|
-
debugLog("[LedgerAdapter][RES]", {
|
|
1074
|
-
method: "getDeviceInfo",
|
|
1075
|
-
success: false,
|
|
1076
|
-
payload: notFound
|
|
1077
|
-
});
|
|
1078
|
-
return notFound;
|
|
1079
|
-
} catch (err) {
|
|
1080
|
-
const e = err;
|
|
1081
|
-
debugLog("[LedgerAdapter][RES]", {
|
|
1082
|
-
method: "getDeviceInfo",
|
|
1083
|
-
success: false,
|
|
1084
|
-
error: { message: e?.message, _tag: e?._tag, code: e?.code ?? e?.errorCode }
|
|
1085
|
-
});
|
|
1086
|
-
throw err;
|
|
704
|
+
await this._ensureDevicePermission(connectId, deviceId);
|
|
705
|
+
const cached = this._discoveredDevices.get(connectId) ?? Array.from(this._discoveredDevices.values()).find((d) => d.deviceId === deviceId);
|
|
706
|
+
if (cached) {
|
|
707
|
+
return (0, import_hwk_adapter_core2.success)(cached);
|
|
1087
708
|
}
|
|
709
|
+
return (0, import_hwk_adapter_core2.failure)(
|
|
710
|
+
import_hwk_adapter_core2.HardwareErrorCode.DeviceNotFound,
|
|
711
|
+
"Device not found in cache. Call searchDevices() or wait for a device-connected event first."
|
|
712
|
+
);
|
|
1088
713
|
}
|
|
1089
714
|
getSupportedChains() {
|
|
1090
715
|
return ["evm", "btc", "sol", "tron"];
|
|
@@ -1092,7 +717,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1092
717
|
// ---------------------------------------------------------------------------
|
|
1093
718
|
// Chain call helper
|
|
1094
719
|
// ---------------------------------------------------------------------------
|
|
1095
|
-
async callChain(connectId, deviceId, chain, method, params, commonParams, skipFingerprint = false
|
|
720
|
+
async callChain(connectId, deviceId, chain, method, params, commonParams, skipFingerprint = false) {
|
|
1096
721
|
try {
|
|
1097
722
|
const result = await this.connectorCall(
|
|
1098
723
|
connectId,
|
|
@@ -1104,10 +729,9 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1104
729
|
skipFingerprint
|
|
1105
730
|
},
|
|
1106
731
|
void 0,
|
|
1107
|
-
commonParams
|
|
1108
|
-
installContext
|
|
732
|
+
commonParams
|
|
1109
733
|
);
|
|
1110
|
-
return (0,
|
|
734
|
+
return (0, import_hwk_adapter_core2.success)(result);
|
|
1111
735
|
} catch (err) {
|
|
1112
736
|
return this.errorToFailure(err);
|
|
1113
737
|
}
|
|
@@ -1292,7 +916,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1292
916
|
async installApp(connectId, appName) {
|
|
1293
917
|
try {
|
|
1294
918
|
await this.connectorCall(connectId, "installApp", { appName });
|
|
1295
|
-
return (0,
|
|
919
|
+
return (0, import_hwk_adapter_core2.success)(void 0);
|
|
1296
920
|
} catch (err) {
|
|
1297
921
|
return this.errorToFailure(err);
|
|
1298
922
|
}
|
|
@@ -1300,16 +924,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1300
924
|
async listInstalledApps(connectId) {
|
|
1301
925
|
try {
|
|
1302
926
|
const result = await this.connectorCall(connectId, "listInstalledApps", {});
|
|
1303
|
-
return (0,
|
|
1304
|
-
} catch (err) {
|
|
1305
|
-
return this.errorToFailure(err);
|
|
1306
|
-
}
|
|
1307
|
-
}
|
|
1308
|
-
// Offline app-presence + unlock probe. No manager-api catalog (unlike listInstalledApps).
|
|
1309
|
-
async listInstalledNames(connectId) {
|
|
1310
|
-
try {
|
|
1311
|
-
const result = await this.connectorCall(connectId, "listInstalledNames", {});
|
|
1312
|
-
return (0, import_hwk_adapter_core3.success)(result);
|
|
927
|
+
return (0, import_hwk_adapter_core2.success)(result);
|
|
1313
928
|
} catch (err) {
|
|
1314
929
|
return this.errorToFailure(err);
|
|
1315
930
|
}
|
|
@@ -1317,7 +932,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1317
932
|
async listAvailableApps(connectId) {
|
|
1318
933
|
try {
|
|
1319
934
|
const result = await this.connectorCall(connectId, "listAvailableApps", {});
|
|
1320
|
-
return (0,
|
|
935
|
+
return (0, import_hwk_adapter_core2.success)(result);
|
|
1321
936
|
} catch (err) {
|
|
1322
937
|
return this.errorToFailure(err);
|
|
1323
938
|
}
|
|
@@ -1325,7 +940,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1325
940
|
async getLedgerFirmwareVersion(connectId) {
|
|
1326
941
|
try {
|
|
1327
942
|
const result = await this.connectorCall(connectId, "getFirmwareVersion", {});
|
|
1328
|
-
return (0,
|
|
943
|
+
return (0, import_hwk_adapter_core2.success)(result);
|
|
1329
944
|
} catch (err) {
|
|
1330
945
|
return this.errorToFailure(err);
|
|
1331
946
|
}
|
|
@@ -1333,7 +948,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1333
948
|
async getLedgerDeviceInfo(connectId) {
|
|
1334
949
|
try {
|
|
1335
950
|
const result = await this.connectorCall(connectId, "getDeviceInfo", {});
|
|
1336
|
-
return (0,
|
|
951
|
+
return (0, import_hwk_adapter_core2.success)(result);
|
|
1337
952
|
} catch (err) {
|
|
1338
953
|
return this.errorToFailure(err);
|
|
1339
954
|
}
|
|
@@ -1346,7 +961,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1346
961
|
}
|
|
1347
962
|
cancel(connectId) {
|
|
1348
963
|
const userAbortReason = Object.assign(new Error("User aborted operation"), {
|
|
1349
|
-
code:
|
|
964
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.UserAborted,
|
|
1350
965
|
_tag: ERROR_TAG.UserAborted
|
|
1351
966
|
});
|
|
1352
967
|
this._lastCancelReason = userAbortReason;
|
|
@@ -1380,7 +995,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1380
995
|
chain,
|
|
1381
996
|
(method, params) => this.connectorCall(connectId, method, params, void 0, deviceId)
|
|
1382
997
|
);
|
|
1383
|
-
return (0,
|
|
998
|
+
return (0, import_hwk_adapter_core2.success)(fingerprint);
|
|
1384
999
|
} catch (err) {
|
|
1385
1000
|
debugError("[LedgerAdapter] getChainFingerprint error:", chain, err);
|
|
1386
1001
|
return this.errorToFailure(err);
|
|
@@ -1403,7 +1018,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1403
1018
|
return { success: false, expected: deviceId, actual: fingerprint };
|
|
1404
1019
|
} catch (err) {
|
|
1405
1020
|
const mapped = mapLedgerError(err);
|
|
1406
|
-
if (mapped.code ===
|
|
1021
|
+
if (mapped.code === import_hwk_adapter_core2.HardwareErrorCode.WrongApp || mapped.code === import_hwk_adapter_core2.HardwareErrorCode.DeviceLocked) {
|
|
1407
1022
|
return { success: true };
|
|
1408
1023
|
}
|
|
1409
1024
|
throw err;
|
|
@@ -1428,7 +1043,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1428
1043
|
const result = await callMethod("btcGetMasterFingerprint", {});
|
|
1429
1044
|
return result.masterFingerprint;
|
|
1430
1045
|
}
|
|
1431
|
-
const path =
|
|
1046
|
+
const path = import_hwk_adapter_core2.CHAIN_FINGERPRINT_PATHS[chain];
|
|
1432
1047
|
let address;
|
|
1433
1048
|
if (chain === "evm") {
|
|
1434
1049
|
address = (await callMethod("evmGetAddress", { path, showOnDevice: false })).address.toLowerCase();
|
|
@@ -1439,7 +1054,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1439
1054
|
} else {
|
|
1440
1055
|
throw new Error(`Unsupported chain for fingerprint: ${chain}`);
|
|
1441
1056
|
}
|
|
1442
|
-
return (0,
|
|
1057
|
+
return (0, import_hwk_adapter_core2.deriveDeviceFingerprint)(address);
|
|
1443
1058
|
}
|
|
1444
1059
|
// Ledger WebUSB won't expose a locked device, so we can't auto-detect unlock.
|
|
1445
1060
|
// The user must press Confirm after unlocking, which triggers a search retry.
|
|
@@ -1451,10 +1066,10 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1451
1066
|
_LedgerAdapter._throwIfAborted(signal);
|
|
1452
1067
|
}
|
|
1453
1068
|
const waitPromise = this._uiRegistry.wait(
|
|
1454
|
-
|
|
1069
|
+
import_hwk_adapter_core2.UI_REQUEST.REQUEST_DEVICE_CONNECT
|
|
1455
1070
|
);
|
|
1456
|
-
this.emitter.emit(
|
|
1457
|
-
type:
|
|
1071
|
+
this.emitter.emit(import_hwk_adapter_core2.UI_REQUEST.REQUEST_DEVICE_CONNECT, {
|
|
1072
|
+
type: import_hwk_adapter_core2.UI_REQUEST.REQUEST_DEVICE_CONNECT,
|
|
1458
1073
|
payload: {
|
|
1459
1074
|
vendor: "ledger",
|
|
1460
1075
|
reason: "device-not-found",
|
|
@@ -1465,7 +1080,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1465
1080
|
try {
|
|
1466
1081
|
if (signal) {
|
|
1467
1082
|
const onAbort = () => {
|
|
1468
|
-
this._uiRegistry.cancel(
|
|
1083
|
+
this._uiRegistry.cancel(import_hwk_adapter_core2.UI_REQUEST.REQUEST_DEVICE_CONNECT);
|
|
1469
1084
|
};
|
|
1470
1085
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
1471
1086
|
try {
|
|
@@ -1477,20 +1092,20 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1477
1092
|
payload = await waitPromise;
|
|
1478
1093
|
}
|
|
1479
1094
|
} catch (err) {
|
|
1480
|
-
this.emitter.emit(
|
|
1481
|
-
type:
|
|
1095
|
+
this.emitter.emit(import_hwk_adapter_core2.UI_REQUEST.CLOSE_UI_WINDOW, {
|
|
1096
|
+
type: import_hwk_adapter_core2.UI_REQUEST.CLOSE_UI_WINDOW,
|
|
1482
1097
|
payload: {}
|
|
1483
1098
|
});
|
|
1484
1099
|
throw Object.assign(new Error("User cancelled Ledger connection"), {
|
|
1485
1100
|
_tag: ERROR_TAG.UserAborted,
|
|
1486
|
-
code:
|
|
1101
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.UserAborted,
|
|
1487
1102
|
cause: err
|
|
1488
1103
|
});
|
|
1489
1104
|
}
|
|
1490
1105
|
if (!payload?.confirmed) {
|
|
1491
1106
|
throw Object.assign(new Error("User cancelled Ledger connection"), {
|
|
1492
1107
|
_tag: ERROR_TAG.UserAborted,
|
|
1493
|
-
code:
|
|
1108
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.UserAborted
|
|
1494
1109
|
});
|
|
1495
1110
|
}
|
|
1496
1111
|
await new Promise((resolve) => {
|
|
@@ -1520,10 +1135,10 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1520
1135
|
}
|
|
1521
1136
|
async _waitForBtcHighIndexConfirm(path, accountIndex) {
|
|
1522
1137
|
const waitPromise = this._uiRegistry.wait(
|
|
1523
|
-
|
|
1138
|
+
import_hwk_adapter_core2.UI_REQUEST.REQUEST_BTC_HIGH_INDEX_CONFIRM
|
|
1524
1139
|
);
|
|
1525
|
-
this.emitter.emit(
|
|
1526
|
-
type:
|
|
1140
|
+
this.emitter.emit(import_hwk_adapter_core2.UI_REQUEST.REQUEST_BTC_HIGH_INDEX_CONFIRM, {
|
|
1141
|
+
type: import_hwk_adapter_core2.UI_REQUEST.REQUEST_BTC_HIGH_INDEX_CONFIRM,
|
|
1527
1142
|
payload: {
|
|
1528
1143
|
vendor: "ledger",
|
|
1529
1144
|
path,
|
|
@@ -1534,8 +1149,8 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1534
1149
|
const payload = await waitPromise;
|
|
1535
1150
|
return !!payload?.confirmed;
|
|
1536
1151
|
} catch (err) {
|
|
1537
|
-
this.emitter.emit(
|
|
1538
|
-
type:
|
|
1152
|
+
this.emitter.emit(import_hwk_adapter_core2.UI_REQUEST.CLOSE_UI_WINDOW, {
|
|
1153
|
+
type: import_hwk_adapter_core2.UI_REQUEST.CLOSE_UI_WINDOW,
|
|
1539
1154
|
payload: {}
|
|
1540
1155
|
});
|
|
1541
1156
|
return false;
|
|
@@ -1545,18 +1160,18 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1545
1160
|
// Same register-then-emit ordering as the BTC high-index gate.
|
|
1546
1161
|
async _waitForInstallAppConfirm(appName) {
|
|
1547
1162
|
const waitPromise = this._uiRegistry.wait(
|
|
1548
|
-
|
|
1163
|
+
import_hwk_adapter_core2.UI_REQUEST.REQUEST_INSTALL_APP
|
|
1549
1164
|
);
|
|
1550
|
-
this.emitter.emit(
|
|
1551
|
-
type:
|
|
1165
|
+
this.emitter.emit(import_hwk_adapter_core2.UI_REQUEST.REQUEST_INSTALL_APP, {
|
|
1166
|
+
type: import_hwk_adapter_core2.UI_REQUEST.REQUEST_INSTALL_APP,
|
|
1552
1167
|
payload: { vendor: "ledger", appName }
|
|
1553
1168
|
});
|
|
1554
1169
|
try {
|
|
1555
1170
|
const payload = await waitPromise;
|
|
1556
1171
|
return !!payload?.confirmed;
|
|
1557
1172
|
} catch (err) {
|
|
1558
|
-
this.emitter.emit(
|
|
1559
|
-
type:
|
|
1173
|
+
this.emitter.emit(import_hwk_adapter_core2.UI_REQUEST.CLOSE_UI_WINDOW, {
|
|
1174
|
+
type: import_hwk_adapter_core2.UI_REQUEST.CLOSE_UI_WINDOW,
|
|
1560
1175
|
payload: {}
|
|
1561
1176
|
});
|
|
1562
1177
|
return false;
|
|
@@ -1569,7 +1184,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1569
1184
|
if (signal.aborted) _LedgerAdapter._throwIfAborted(signal);
|
|
1570
1185
|
if (isLedgerBleConnectionType(this.connector.connectionType) && !connectId) {
|
|
1571
1186
|
throw Object.assign(new Error("Ledger BLE connectId is required."), {
|
|
1572
|
-
code:
|
|
1187
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.DeviceNotFound
|
|
1573
1188
|
});
|
|
1574
1189
|
}
|
|
1575
1190
|
if (connectId && this._sessions.has(connectId)) return connectId;
|
|
@@ -1579,7 +1194,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1579
1194
|
new Error(
|
|
1580
1195
|
"Ledger USB session invariant violated: more than one session is active. Please reconnect the device."
|
|
1581
1196
|
),
|
|
1582
|
-
{ code:
|
|
1197
|
+
{ code: import_hwk_adapter_core2.HardwareErrorCode.DeviceOneDeviceOnly }
|
|
1583
1198
|
);
|
|
1584
1199
|
}
|
|
1585
1200
|
return this._sessions.keys().next().value;
|
|
@@ -1621,7 +1236,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1621
1236
|
let confirms = 0;
|
|
1622
1237
|
while (!internalSignal.aborted) {
|
|
1623
1238
|
this.emitter.emit("ui-event", {
|
|
1624
|
-
type:
|
|
1239
|
+
type: import_hwk_adapter_core2.EConnectorInteraction.Searching,
|
|
1625
1240
|
payload: { sessionId: "" }
|
|
1626
1241
|
});
|
|
1627
1242
|
let devices = await this.searchDevices();
|
|
@@ -1659,7 +1274,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1659
1274
|
new Error(
|
|
1660
1275
|
"Device not connected after multiple attempts. Please ensure your Ledger is awake, unlocked, and in range, then try again."
|
|
1661
1276
|
),
|
|
1662
|
-
{ code:
|
|
1277
|
+
{ code: import_hwk_adapter_core2.HardwareErrorCode.DeviceNotFound }
|
|
1663
1278
|
);
|
|
1664
1279
|
}
|
|
1665
1280
|
await this._waitForDeviceConnect(internalSignal);
|
|
@@ -1683,7 +1298,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1683
1298
|
return this._connectDeviceOrThrow(devices[0].connectId);
|
|
1684
1299
|
}
|
|
1685
1300
|
const err = Object.assign(new Error(`Target Ledger unavailable: ${targetConnectId}`), {
|
|
1686
|
-
code:
|
|
1301
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.DeviceNotFound
|
|
1687
1302
|
});
|
|
1688
1303
|
if (isLedgerBleConnectionType(this.connector.connectionType)) {
|
|
1689
1304
|
err._tag = ERROR_TAG.DeviceNotAdvertising;
|
|
@@ -1692,7 +1307,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1692
1307
|
}
|
|
1693
1308
|
if (isLedgerBleConnectionType(this.connector.connectionType)) {
|
|
1694
1309
|
throw Object.assign(new Error("Ledger BLE connectId is required."), {
|
|
1695
|
-
code:
|
|
1310
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.DeviceNotFound
|
|
1696
1311
|
});
|
|
1697
1312
|
}
|
|
1698
1313
|
if (devices.length > 1) {
|
|
@@ -1700,7 +1315,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1700
1315
|
}
|
|
1701
1316
|
if (devices.length !== 1) {
|
|
1702
1317
|
throw Object.assign(new Error("Ledger device not found."), {
|
|
1703
|
-
code:
|
|
1318
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.DeviceNotFound
|
|
1704
1319
|
});
|
|
1705
1320
|
}
|
|
1706
1321
|
return this._connectDeviceOrThrow(devices[0].connectId);
|
|
@@ -1738,7 +1353,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1738
1353
|
*/
|
|
1739
1354
|
_unwrapConnectorResult(result) {
|
|
1740
1355
|
if (result.success) return result.payload;
|
|
1741
|
-
throw (0,
|
|
1356
|
+
throw (0, import_hwk_adapter_core2.rehydrateConnectorError)(result.error);
|
|
1742
1357
|
}
|
|
1743
1358
|
/**
|
|
1744
1359
|
* `connector.call` + result unwrap, optionally raced against an abort
|
|
@@ -1751,43 +1366,26 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1751
1366
|
const result = signal ? await this._abortable(signal, promise) : await promise;
|
|
1752
1367
|
return this._unwrapConnectorResult(result);
|
|
1753
1368
|
}
|
|
1754
|
-
async connectorCall(connectId, method, params, fingerprint, permissionDeviceId, commonParams
|
|
1755
|
-
debugLog("[LedgerAdapter]
|
|
1369
|
+
async connectorCall(connectId, method, params, fingerprint, permissionDeviceId, commonParams) {
|
|
1370
|
+
debugLog("[LedgerAdapter] connectorCall:", method, "connectId:", connectId || "(empty)");
|
|
1756
1371
|
const queueKey = connectId || "__ledger_default__";
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
connectId,
|
|
1762
|
-
method,
|
|
1763
|
-
params,
|
|
1764
|
-
signal,
|
|
1765
|
-
fingerprint,
|
|
1766
|
-
permissionDeviceId,
|
|
1767
|
-
commonParams,
|
|
1768
|
-
installContext
|
|
1769
|
-
),
|
|
1770
|
-
{
|
|
1771
|
-
label: method,
|
|
1772
|
-
rejectIfBusy: true,
|
|
1773
|
-
busyError: _LedgerAdapter._createDeviceBusyError(method)
|
|
1774
|
-
}
|
|
1775
|
-
);
|
|
1776
|
-
debugLog("[LedgerAdapter][RES]", { method, success: true, payload: result });
|
|
1777
|
-
return result;
|
|
1778
|
-
} catch (err) {
|
|
1779
|
-
const e = err;
|
|
1780
|
-
debugLog("[LedgerAdapter][RES]", {
|
|
1372
|
+
return this._jobQueue.enqueue(
|
|
1373
|
+
queueKey,
|
|
1374
|
+
async (signal) => this._runConnectorCall(
|
|
1375
|
+
connectId,
|
|
1781
1376
|
method,
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1377
|
+
params,
|
|
1378
|
+
signal,
|
|
1379
|
+
fingerprint,
|
|
1380
|
+
permissionDeviceId,
|
|
1381
|
+
commonParams
|
|
1382
|
+
),
|
|
1383
|
+
{
|
|
1384
|
+
label: method,
|
|
1385
|
+
rejectIfBusy: true,
|
|
1386
|
+
busyError: _LedgerAdapter._createDeviceBusyError(method)
|
|
1387
|
+
}
|
|
1388
|
+
);
|
|
1791
1389
|
}
|
|
1792
1390
|
/**
|
|
1793
1391
|
* Race a promise against an abort signal. On abort, rejects with
|
|
@@ -1822,7 +1420,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1822
1420
|
}
|
|
1823
1421
|
}
|
|
1824
1422
|
/** Actual work done under the job queue — connection, fingerprint, call, and recovery. */
|
|
1825
|
-
async _runConnectorCall(connectId, method, params, signal, fingerprint, permissionDeviceId, commonParams
|
|
1423
|
+
async _runConnectorCall(connectId, method, params, signal, fingerprint, permissionDeviceId, commonParams) {
|
|
1826
1424
|
_LedgerAdapter._throwIfAborted(signal);
|
|
1827
1425
|
await this._ensureDevicePermission(
|
|
1828
1426
|
connectId,
|
|
@@ -1836,7 +1434,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1836
1434
|
if (gatedParams === null) {
|
|
1837
1435
|
throw Object.assign(new Error("User cancelled BTC high-index confirmation"), {
|
|
1838
1436
|
_tag: ERROR_TAG.UserAborted,
|
|
1839
|
-
code:
|
|
1437
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.UserAborted
|
|
1840
1438
|
});
|
|
1841
1439
|
}
|
|
1842
1440
|
effectiveParams = gatedParams;
|
|
@@ -1865,7 +1463,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1865
1463
|
);
|
|
1866
1464
|
if (!fp.success) {
|
|
1867
1465
|
throw Object.assign(new Error(formatDeviceMismatchError(fp.expected, fp.actual)), {
|
|
1868
|
-
code:
|
|
1466
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.DeviceMismatch
|
|
1869
1467
|
});
|
|
1870
1468
|
}
|
|
1871
1469
|
}
|
|
@@ -1884,62 +1482,22 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
1884
1482
|
isStuckApp: isStuckAppStateError(err)
|
|
1885
1483
|
});
|
|
1886
1484
|
const autoInstallApp = commonParams?.autoInstallApp ?? this._defaultAutoInstallApp;
|
|
1887
|
-
const isAppMissing = isAppNotInstalledError(err) || err?.code ===
|
|
1485
|
+
const isAppMissing = isAppNotInstalledError(err) || err?.code === import_hwk_adapter_core2.HardwareErrorCode.AppNotInstalled;
|
|
1888
1486
|
if (autoInstallApp && isAppMissing) {
|
|
1889
|
-
if (installContext?.deviceOutOfMemoryError) {
|
|
1890
|
-
throw installContext.deviceOutOfMemoryError;
|
|
1891
|
-
}
|
|
1892
1487
|
const appName = err?.appName ?? mapLedgerError(err).appName;
|
|
1893
1488
|
if (appName) {
|
|
1894
|
-
if (installContext?.installAttemptedAppNames?.has(appName)) {
|
|
1895
|
-
throw (0, import_hwk_adapter_core3.createHwkError)({
|
|
1896
|
-
code: import_hwk_adapter_core3.HardwareErrorCode.AppNotInstalled,
|
|
1897
|
-
message: `${appName} install reported success but the app is still missing on device`,
|
|
1898
|
-
_tag: ERROR_TAG.AppInstallVerifyFailed,
|
|
1899
|
-
appName
|
|
1900
|
-
});
|
|
1901
|
-
}
|
|
1902
1489
|
const confirmed = await this._waitForInstallAppConfirm(appName);
|
|
1903
|
-
if (!confirmed)
|
|
1904
|
-
throw (0, import_hwk_adapter_core3.createHwkError)({
|
|
1905
|
-
code: import_hwk_adapter_core3.HardwareErrorCode.UserAborted,
|
|
1906
|
-
message: `User declined to install ${appName}`,
|
|
1907
|
-
_tag: ERROR_TAG.UserAborted,
|
|
1908
|
-
appName
|
|
1909
|
-
});
|
|
1910
|
-
}
|
|
1490
|
+
if (!confirmed) throw err;
|
|
1911
1491
|
this.emitter.emit("ui-event", {
|
|
1912
|
-
type:
|
|
1492
|
+
type: import_hwk_adapter_core2.EConnectorInteraction.AppInstallProgress,
|
|
1913
1493
|
payload: { connectId: resolvedConnectId, appName, progress: 0 }
|
|
1914
1494
|
});
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
if (mapLedgerError(installErr).code === import_hwk_adapter_core3.HardwareErrorCode.DeviceOutOfMemory) {
|
|
1919
|
-
if (installContext) {
|
|
1920
|
-
installContext.deviceOutOfMemoryError = installErr;
|
|
1921
|
-
}
|
|
1922
|
-
}
|
|
1923
|
-
throw installErr;
|
|
1924
|
-
}
|
|
1925
|
-
if (installContext) {
|
|
1926
|
-
installContext.installAttemptedAppNames = installContext.installAttemptedAppNames ?? /* @__PURE__ */ new Set();
|
|
1927
|
-
installContext.installAttemptedAppNames.add(appName);
|
|
1928
|
-
}
|
|
1929
|
-
this.emitter.emit(import_hwk_adapter_core3.UI_REQUEST.CLOSE_UI_WINDOW, {
|
|
1930
|
-
type: import_hwk_adapter_core3.UI_REQUEST.CLOSE_UI_WINDOW,
|
|
1495
|
+
await this._callConnector(sessionId, "installApp", { appName }, signal);
|
|
1496
|
+
this.emitter.emit(import_hwk_adapter_core2.UI_REQUEST.CLOSE_UI_WINDOW, {
|
|
1497
|
+
type: import_hwk_adapter_core2.UI_REQUEST.CLOSE_UI_WINDOW,
|
|
1931
1498
|
payload: {}
|
|
1932
1499
|
});
|
|
1933
|
-
return await this.
|
|
1934
|
-
resolvedConnectId,
|
|
1935
|
-
method,
|
|
1936
|
-
effectiveParams,
|
|
1937
|
-
signal,
|
|
1938
|
-
fingerprint,
|
|
1939
|
-
permissionDeviceId,
|
|
1940
|
-
commonParams,
|
|
1941
|
-
installContext
|
|
1942
|
-
);
|
|
1500
|
+
return await this._callConnector(sessionId, method, effectiveParams, signal);
|
|
1943
1501
|
}
|
|
1944
1502
|
}
|
|
1945
1503
|
if (isStuckAppStateError(err)) {
|
|
@@ -2014,7 +1572,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
2014
1572
|
);
|
|
2015
1573
|
if (!fp.success) {
|
|
2016
1574
|
throw Object.assign(new Error(formatDeviceMismatchError(fp.expected, fp.actual)), {
|
|
2017
|
-
code:
|
|
1575
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.DeviceMismatch
|
|
2018
1576
|
});
|
|
2019
1577
|
}
|
|
2020
1578
|
}
|
|
@@ -2049,7 +1607,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
2049
1607
|
this.connector.reset();
|
|
2050
1608
|
const codeNum = err?.code;
|
|
2051
1609
|
throw Object.assign(err, {
|
|
2052
|
-
code: codeNum ??
|
|
1610
|
+
code: codeNum ?? import_hwk_adapter_core2.HardwareErrorCode.DeviceDisconnected
|
|
2053
1611
|
});
|
|
2054
1612
|
}
|
|
2055
1613
|
throw err;
|
|
@@ -2083,7 +1641,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
2083
1641
|
);
|
|
2084
1642
|
if (!fp.success) {
|
|
2085
1643
|
throw Object.assign(new Error(formatDeviceMismatchError(fp.expected, fp.actual)), {
|
|
2086
|
-
code:
|
|
1644
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.DeviceMismatch
|
|
2087
1645
|
});
|
|
2088
1646
|
}
|
|
2089
1647
|
}
|
|
@@ -2140,7 +1698,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
2140
1698
|
);
|
|
2141
1699
|
if (!fp.success) {
|
|
2142
1700
|
throw Object.assign(new Error(formatDeviceMismatchError(fp.expected, fp.actual)), {
|
|
2143
|
-
code:
|
|
1701
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.DeviceMismatch
|
|
2144
1702
|
});
|
|
2145
1703
|
}
|
|
2146
1704
|
}
|
|
@@ -2181,7 +1739,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
2181
1739
|
);
|
|
2182
1740
|
if (!fp.success) {
|
|
2183
1741
|
throw Object.assign(new Error(formatDeviceMismatchError(fp.expected, fp.actual)), {
|
|
2184
|
-
code:
|
|
1742
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.DeviceMismatch
|
|
2185
1743
|
});
|
|
2186
1744
|
}
|
|
2187
1745
|
}
|
|
@@ -2206,16 +1764,16 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
2206
1764
|
}
|
|
2207
1765
|
const transportType = this.activeTransport ?? "hid";
|
|
2208
1766
|
const waitPromise = this._uiRegistry.wait(
|
|
2209
|
-
|
|
1767
|
+
import_hwk_adapter_core2.UI_REQUEST.REQUEST_DEVICE_PERMISSION,
|
|
2210
1768
|
{ timeoutMs: 6e4 }
|
|
2211
1769
|
);
|
|
2212
|
-
this.emitter.emit(
|
|
2213
|
-
type:
|
|
1770
|
+
this.emitter.emit(import_hwk_adapter_core2.UI_REQUEST.REQUEST_DEVICE_PERMISSION, {
|
|
1771
|
+
type: import_hwk_adapter_core2.UI_REQUEST.REQUEST_DEVICE_PERMISSION,
|
|
2214
1772
|
payload: { transportType, connectId, deviceId }
|
|
2215
1773
|
});
|
|
2216
1774
|
let response;
|
|
2217
1775
|
const onAbort = () => {
|
|
2218
|
-
this._uiRegistry.cancel(
|
|
1776
|
+
this._uiRegistry.cancel(import_hwk_adapter_core2.UI_REQUEST.REQUEST_DEVICE_PERMISSION);
|
|
2219
1777
|
};
|
|
2220
1778
|
try {
|
|
2221
1779
|
signal?.addEventListener("abort", onAbort, { once: true });
|
|
@@ -2224,14 +1782,14 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
2224
1782
|
if (signal?.aborted) {
|
|
2225
1783
|
_LedgerAdapter._throwIfAborted(signal);
|
|
2226
1784
|
}
|
|
2227
|
-
if (err?._tag ===
|
|
2228
|
-
this.emitter.emit(
|
|
2229
|
-
type:
|
|
1785
|
+
if (err?._tag === import_hwk_adapter_core2.UI_REQUEST_PREEMPTED_TAG) {
|
|
1786
|
+
this.emitter.emit(import_hwk_adapter_core2.UI_REQUEST.CLOSE_UI_WINDOW, {
|
|
1787
|
+
type: import_hwk_adapter_core2.UI_REQUEST.CLOSE_UI_WINDOW,
|
|
2230
1788
|
payload: {}
|
|
2231
1789
|
});
|
|
2232
1790
|
throw Object.assign(new Error("Device permission request superseded"), {
|
|
2233
1791
|
_tag: ERROR_TAG.UserAborted,
|
|
2234
|
-
code:
|
|
1792
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.UserAborted,
|
|
2235
1793
|
cause: err
|
|
2236
1794
|
});
|
|
2237
1795
|
}
|
|
@@ -2242,7 +1800,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
2242
1800
|
const { granted, reason, message } = response;
|
|
2243
1801
|
if (!granted) {
|
|
2244
1802
|
throw Object.assign(new Error(message ?? "Device permission denied"), {
|
|
2245
|
-
code:
|
|
1803
|
+
code: import_hwk_adapter_core2.HardwareErrorCode.DevicePermissionDenied,
|
|
2246
1804
|
reason
|
|
2247
1805
|
});
|
|
2248
1806
|
}
|
|
@@ -2256,7 +1814,7 @@ var _LedgerAdapter = class _LedgerAdapter {
|
|
|
2256
1814
|
const tag = err && typeof err === "object" ? err._tag : void 0;
|
|
2257
1815
|
if (err && typeof err === "object" && "code" in err && typeof err.code === "number") {
|
|
2258
1816
|
const e = err;
|
|
2259
|
-
const params = e.code ===
|
|
1817
|
+
const params = e.code === import_hwk_adapter_core2.HardwareErrorCode.DevicePermissionDenied && e.reason ? { permissionDeniedReason: e.reason } : e.params;
|
|
2260
1818
|
return ledgerFailure(e.code, e.message ?? "Unknown error", e.appName, tag, params);
|
|
2261
1819
|
}
|
|
2262
1820
|
const mapped = mapLedgerError(err);
|
|
@@ -2303,13 +1861,10 @@ _LedgerAdapter.STUCK_APP_RETRY_DELAY_MS = 500;
|
|
|
2303
1861
|
// Confirm but device never shows up / never unlocks), throw DeviceNotFound
|
|
2304
1862
|
// instead of looping forever.
|
|
2305
1863
|
_LedgerAdapter.MAX_DOCONNECT_CONFIRMS = 3;
|
|
2306
|
-
// Throttle AppInstallProgress by progress delta — DMK streams much faster
|
|
2307
|
-
// than UIs need. Final frame (progress >= 1) always passes.
|
|
2308
|
-
_LedgerAdapter.APP_INSTALL_PROGRESS_MIN_DELTA = 0.05;
|
|
2309
1864
|
var LedgerAdapter = _LedgerAdapter;
|
|
2310
1865
|
|
|
2311
1866
|
// src/connector/LedgerConnectorBase.ts
|
|
2312
|
-
var
|
|
1867
|
+
var import_hwk_adapter_core12 = require("@onekeyfe/hwk-adapter-core");
|
|
2313
1868
|
|
|
2314
1869
|
// src/device/LedgerDeviceManager.ts
|
|
2315
1870
|
var LedgerDeviceManager = class {
|
|
@@ -2582,7 +2137,7 @@ var import_device_signer_kit_ethereum = require("@ledgerhq/device-signer-kit-eth
|
|
|
2582
2137
|
var import_context_module = require("@ledgerhq/context-module");
|
|
2583
2138
|
|
|
2584
2139
|
// src/signer/SignerEth.ts
|
|
2585
|
-
var
|
|
2140
|
+
var import_hwk_adapter_core3 = require("@onekeyfe/hwk-adapter-core");
|
|
2586
2141
|
|
|
2587
2142
|
// src/signer/deviceActionToPromise.ts
|
|
2588
2143
|
var import_device_management_kit = require("@ledgerhq/device-management-kit");
|
|
@@ -2795,7 +2350,7 @@ var SignerEth = class {
|
|
|
2795
2350
|
);
|
|
2796
2351
|
}
|
|
2797
2352
|
async signTransaction(derivationPath, serializedTxHex) {
|
|
2798
|
-
const action = this._sdk.signTransaction(derivationPath, (0,
|
|
2353
|
+
const action = this._sdk.signTransaction(derivationPath, (0, import_hwk_adapter_core3.hexToBytes)(serializedTxHex));
|
|
2799
2354
|
return deviceActionToPromise(
|
|
2800
2355
|
action,
|
|
2801
2356
|
this.onInteraction,
|
|
@@ -2804,7 +2359,7 @@ var SignerEth = class {
|
|
|
2804
2359
|
);
|
|
2805
2360
|
}
|
|
2806
2361
|
async signMessage(derivationPath, message) {
|
|
2807
|
-
const action = this._sdk.signMessage(derivationPath, (0,
|
|
2362
|
+
const action = this._sdk.signMessage(derivationPath, (0, import_hwk_adapter_core3.hexToBytes)(message));
|
|
2808
2363
|
return deviceActionToPromise(
|
|
2809
2364
|
action,
|
|
2810
2365
|
this.onInteraction,
|
|
@@ -2864,23 +2419,23 @@ var SignerManager = class _SignerManager {
|
|
|
2864
2419
|
};
|
|
2865
2420
|
|
|
2866
2421
|
// src/connector/chains/evm.ts
|
|
2867
|
-
var
|
|
2422
|
+
var import_hwk_adapter_core5 = require("@onekeyfe/hwk-adapter-core");
|
|
2868
2423
|
|
|
2869
2424
|
// src/connector/chains/utils.ts
|
|
2870
|
-
var
|
|
2425
|
+
var import_hwk_adapter_core4 = require("@onekeyfe/hwk-adapter-core");
|
|
2871
2426
|
function normalizePath(path) {
|
|
2872
2427
|
return path.startsWith("m/") ? path.slice(2) : path;
|
|
2873
2428
|
}
|
|
2874
2429
|
function collapseSignerInteraction(interaction) {
|
|
2875
2430
|
switch (interaction) {
|
|
2876
2431
|
case "confirm-open-app":
|
|
2877
|
-
return
|
|
2432
|
+
return import_hwk_adapter_core4.EConnectorInteraction.ConfirmOpenApp;
|
|
2878
2433
|
case "unlock-device":
|
|
2879
|
-
return
|
|
2434
|
+
return import_hwk_adapter_core4.EConnectorInteraction.UnlockDevice;
|
|
2880
2435
|
case "interaction-complete":
|
|
2881
|
-
return
|
|
2436
|
+
return import_hwk_adapter_core4.EConnectorInteraction.InteractionComplete;
|
|
2882
2437
|
default:
|
|
2883
|
-
return
|
|
2438
|
+
return import_hwk_adapter_core4.EConnectorInteraction.ConfirmOnDevice;
|
|
2884
2439
|
}
|
|
2885
2440
|
}
|
|
2886
2441
|
|
|
@@ -2906,7 +2461,7 @@ async function evmSignTransaction(ctx, sessionId, params) {
|
|
|
2906
2461
|
new Error(
|
|
2907
2462
|
"Ledger requires a pre-serialized transaction (serializedTx). Provide an RLP-encoded hex string."
|
|
2908
2463
|
),
|
|
2909
|
-
{ code:
|
|
2464
|
+
{ code: import_hwk_adapter_core5.HardwareErrorCode.InvalidParams }
|
|
2910
2465
|
);
|
|
2911
2466
|
}
|
|
2912
2467
|
const signer = await _getEthSigner(ctx, sessionId);
|
|
@@ -2915,8 +2470,8 @@ async function evmSignTransaction(ctx, sessionId, params) {
|
|
|
2915
2470
|
const result = await signer.signTransaction(path, params.serializedTx);
|
|
2916
2471
|
return {
|
|
2917
2472
|
v: `0x${result.v.toString(16)}`,
|
|
2918
|
-
r: (0,
|
|
2919
|
-
s: (0,
|
|
2473
|
+
r: (0, import_hwk_adapter_core5.padHex64)(result.r),
|
|
2474
|
+
s: (0, import_hwk_adapter_core5.padHex64)(result.s)
|
|
2920
2475
|
};
|
|
2921
2476
|
} catch (err) {
|
|
2922
2477
|
ctx.invalidateSession(sessionId);
|
|
@@ -2930,8 +2485,8 @@ async function evmSignMessage(ctx, sessionId, params) {
|
|
|
2930
2485
|
const path = normalizePath(params.path);
|
|
2931
2486
|
try {
|
|
2932
2487
|
const result = await signer.signMessage(path, params.message);
|
|
2933
|
-
const rHex = (0,
|
|
2934
|
-
const sHex = (0,
|
|
2488
|
+
const rHex = (0, import_hwk_adapter_core5.stripHex)(result.r).padStart(64, "0");
|
|
2489
|
+
const sHex = (0, import_hwk_adapter_core5.stripHex)(result.s).padStart(64, "0");
|
|
2935
2490
|
const vHex = result.v.toString(16).padStart(2, "0");
|
|
2936
2491
|
return { signature: `0x${rHex}${sHex}${vHex}` };
|
|
2937
2492
|
} catch (err) {
|
|
@@ -2947,15 +2502,15 @@ async function evmSignTypedData(ctx, sessionId, params) {
|
|
|
2947
2502
|
new Error(
|
|
2948
2503
|
'Ledger does not support hash-only EIP-712 signing. Use mode "full" with the complete typed data structure.'
|
|
2949
2504
|
),
|
|
2950
|
-
{ code:
|
|
2505
|
+
{ code: import_hwk_adapter_core5.HardwareErrorCode.MethodNotSupported }
|
|
2951
2506
|
);
|
|
2952
2507
|
}
|
|
2953
2508
|
const signer = await _getEthSigner(ctx, sessionId);
|
|
2954
2509
|
const path = normalizePath(params.path);
|
|
2955
2510
|
try {
|
|
2956
2511
|
const result = await signer.signTypedData(path, params.data);
|
|
2957
|
-
const rHex = (0,
|
|
2958
|
-
const sHex = (0,
|
|
2512
|
+
const rHex = (0, import_hwk_adapter_core5.stripHex)(result.r).padStart(64, "0");
|
|
2513
|
+
const sHex = (0, import_hwk_adapter_core5.stripHex)(result.s).padStart(64, "0");
|
|
2959
2514
|
const vHex = result.v.toString(16).padStart(2, "0");
|
|
2960
2515
|
return { signature: `0x${rHex}${sHex}${vHex}` };
|
|
2961
2516
|
} catch (err) {
|
|
@@ -2982,13 +2537,13 @@ async function _getEthSigner(ctx, sessionId) {
|
|
|
2982
2537
|
}
|
|
2983
2538
|
|
|
2984
2539
|
// src/connector/chains/btc.ts
|
|
2985
|
-
var
|
|
2540
|
+
var import_hwk_adapter_core7 = require("@onekeyfe/hwk-adapter-core");
|
|
2986
2541
|
var import_bitcoinjs_lib = require("bitcoinjs-lib");
|
|
2987
2542
|
|
|
2988
2543
|
// src/signer/SignerBtc.ts
|
|
2989
|
-
var
|
|
2544
|
+
var import_hwk_adapter_core6 = require("@onekeyfe/hwk-adapter-core");
|
|
2990
2545
|
function hexToUtf8(hex) {
|
|
2991
|
-
return new TextDecoder().decode((0,
|
|
2546
|
+
return new TextDecoder().decode((0, import_hwk_adapter_core6.hexToBytes)(hex));
|
|
2992
2547
|
}
|
|
2993
2548
|
var INTERACTIVE_TIMEOUT_MS2 = 5 * 6e4;
|
|
2994
2549
|
var SignerBtc = class {
|
|
@@ -3103,7 +2658,7 @@ function _purposeToTemplate(purpose, DDT) {
|
|
|
3103
2658
|
return DDT.TAPROOT;
|
|
3104
2659
|
default:
|
|
3105
2660
|
throw Object.assign(new Error(`Unsupported BTC purpose: m/${purpose ?? "<undefined>"}'`), {
|
|
3106
|
-
code:
|
|
2661
|
+
code: import_hwk_adapter_core7.HardwareErrorCode.InvalidParams
|
|
3107
2662
|
});
|
|
3108
2663
|
}
|
|
3109
2664
|
}
|
|
@@ -3159,7 +2714,7 @@ async function btcSignTransaction(ctx, sessionId, params) {
|
|
|
3159
2714
|
if (!params.psbt) {
|
|
3160
2715
|
throw Object.assign(
|
|
3161
2716
|
new Error("Ledger requires PSBT format for BTC transaction signing. Provide params.psbt."),
|
|
3162
|
-
{ code:
|
|
2717
|
+
{ code: import_hwk_adapter_core7.HardwareErrorCode.InvalidParams }
|
|
3163
2718
|
);
|
|
3164
2719
|
}
|
|
3165
2720
|
const btcSigner = await _createBtcSigner(ctx, sessionId);
|
|
@@ -3173,7 +2728,7 @@ async function btcSignTransaction(ctx, sessionId, params) {
|
|
|
3173
2728
|
debugLog("[LedgerConnector] btcSignTransaction wallet:", { path, purpose, template });
|
|
3174
2729
|
const wallet = new DefaultWallet(path, template);
|
|
3175
2730
|
const signedTxHex = await btcSigner.signTransaction(wallet, params.psbt);
|
|
3176
|
-
return { serializedTx: (0,
|
|
2731
|
+
return { serializedTx: (0, import_hwk_adapter_core7.stripHex)(signedTxHex) };
|
|
3177
2732
|
} catch (err) {
|
|
3178
2733
|
ctx.invalidateSession(sessionId);
|
|
3179
2734
|
throw ctx.wrapError(err);
|
|
@@ -3184,7 +2739,7 @@ async function btcSignTransaction(ctx, sessionId, params) {
|
|
|
3184
2739
|
async function btcSignPsbt(ctx, sessionId, params) {
|
|
3185
2740
|
if (!params.psbt) {
|
|
3186
2741
|
throw Object.assign(new Error("btcSignPsbt requires params.psbt"), {
|
|
3187
|
-
code:
|
|
2742
|
+
code: import_hwk_adapter_core7.HardwareErrorCode.InvalidParams
|
|
3188
2743
|
});
|
|
3189
2744
|
}
|
|
3190
2745
|
const btcSigner = await _createBtcSigner(ctx, sessionId);
|
|
@@ -3214,8 +2769,8 @@ async function btcSignMessage(ctx, sessionId, params) {
|
|
|
3214
2769
|
try {
|
|
3215
2770
|
const result = await btcSigner.signMessage(path, params.message);
|
|
3216
2771
|
const vHex = result.v.toString(16).padStart(2, "0");
|
|
3217
|
-
const rHex = (0,
|
|
3218
|
-
const sHex = (0,
|
|
2772
|
+
const rHex = (0, import_hwk_adapter_core7.stripHex)(result.r).padStart(64, "0");
|
|
2773
|
+
const sHex = (0, import_hwk_adapter_core7.stripHex)(result.s).padStart(64, "0");
|
|
3219
2774
|
return { signature: `${vHex}${rHex}${sHex}` };
|
|
3220
2775
|
} catch (err) {
|
|
3221
2776
|
ctx.invalidateSession(sessionId);
|
|
@@ -3315,7 +2870,7 @@ function _applySignaturesToPsbt(psbtHex, signatures) {
|
|
|
3315
2870
|
}
|
|
3316
2871
|
|
|
3317
2872
|
// src/connector/chains/sol.ts
|
|
3318
|
-
var
|
|
2873
|
+
var import_hwk_adapter_core8 = require("@onekeyfe/hwk-adapter-core");
|
|
3319
2874
|
|
|
3320
2875
|
// src/signer/SignerSol.ts
|
|
3321
2876
|
var SignerSol = class {
|
|
@@ -3383,10 +2938,10 @@ async function solGetAddress(ctx, sessionId, params) {
|
|
|
3383
2938
|
async function solSignTransaction(ctx, sessionId, params) {
|
|
3384
2939
|
const solSigner = await _createSolSigner(ctx, sessionId);
|
|
3385
2940
|
const path = normalizePath(params.path);
|
|
3386
|
-
const txBytes = (0,
|
|
2941
|
+
const txBytes = (0, import_hwk_adapter_core8.hexToBytes)(params.serializedTx);
|
|
3387
2942
|
try {
|
|
3388
2943
|
const result = await solSigner.signTransaction(path, txBytes);
|
|
3389
|
-
return { signature: (0,
|
|
2944
|
+
return { signature: (0, import_hwk_adapter_core8.bytesToHex)(result) };
|
|
3390
2945
|
} catch (err) {
|
|
3391
2946
|
ctx.invalidateSession(sessionId);
|
|
3392
2947
|
throw ctx.wrapError(err);
|
|
@@ -3397,7 +2952,7 @@ async function solSignTransaction(ctx, sessionId, params) {
|
|
|
3397
2952
|
async function solSignMessage(ctx, sessionId, params) {
|
|
3398
2953
|
const solSigner = await _createSolSigner(ctx, sessionId);
|
|
3399
2954
|
const path = normalizePath(params.path);
|
|
3400
|
-
const messageBytes = (0,
|
|
2955
|
+
const messageBytes = (0, import_hwk_adapter_core8.hexToBytes)(params.message);
|
|
3401
2956
|
try {
|
|
3402
2957
|
const result = await solSigner.signMessage(path, messageBytes);
|
|
3403
2958
|
return { signature: result.signature };
|
|
@@ -3429,15 +2984,15 @@ async function _createSolSigner(ctx, sessionId) {
|
|
|
3429
2984
|
}
|
|
3430
2985
|
|
|
3431
2986
|
// src/connector/chains/tron.ts
|
|
3432
|
-
var
|
|
2987
|
+
var import_hwk_adapter_core11 = require("@onekeyfe/hwk-adapter-core");
|
|
3433
2988
|
var import_hw_app_trx = __toESM(require("@ledgerhq/hw-app-trx"));
|
|
3434
2989
|
|
|
3435
2990
|
// src/connector/chains/legacyChainCall.ts
|
|
3436
|
-
var
|
|
2991
|
+
var import_hwk_adapter_core10 = require("@onekeyfe/hwk-adapter-core");
|
|
3437
2992
|
|
|
3438
2993
|
// src/app/AppManager.ts
|
|
3439
2994
|
var import_device_management_kit2 = require("@ledgerhq/device-management-kit");
|
|
3440
|
-
var
|
|
2995
|
+
var import_hwk_adapter_core9 = require("@onekeyfe/hwk-adapter-core");
|
|
3441
2996
|
var APP_NAME_MAP = {
|
|
3442
2997
|
ETH: "Ethereum",
|
|
3443
2998
|
BTC: "Bitcoin",
|
|
@@ -3541,30 +3096,15 @@ var AppManager = class {
|
|
|
3541
3096
|
command: new import_device_management_kit2.OpenAppCommand({ appName })
|
|
3542
3097
|
});
|
|
3543
3098
|
if (!(0, import_device_management_kit2.isSuccessCommandResult)(result)) {
|
|
3544
|
-
const
|
|
3545
|
-
const
|
|
3546
|
-
|
|
3547
|
-
debugLog(
|
|
3548
|
-
"[AppManager] openApp failed:",
|
|
3549
|
-
appName,
|
|
3550
|
-
"errorCode:",
|
|
3551
|
-
errorCode,
|
|
3552
|
-
"tag:",
|
|
3553
|
-
dmkErr._tag
|
|
3554
|
-
);
|
|
3555
|
-
let code;
|
|
3556
|
-
if (errorCode === "6807" || /unknown application/i.test(message)) {
|
|
3557
|
-
code = import_hwk_adapter_core10.HardwareErrorCode.AppNotInstalled;
|
|
3558
|
-
} else if (errorCode === "5501" || dmkErr._tag === "ActionRefusedError") {
|
|
3559
|
-
code = import_hwk_adapter_core10.HardwareErrorCode.UserRejected;
|
|
3560
|
-
}
|
|
3099
|
+
const { statusCode } = result;
|
|
3100
|
+
const hasStatusCode2 = statusCode != null && statusCode !== "";
|
|
3101
|
+
debugLog("[AppManager] openApp failed:", appName, "statusCode:", statusCode);
|
|
3561
3102
|
throw Object.assign(new Error(`Failed to open "${appName}"`), {
|
|
3562
3103
|
_tag: ERROR_TAG.OpenAppCommand,
|
|
3563
|
-
code,
|
|
3564
|
-
errorCode,
|
|
3565
|
-
statusCode
|
|
3566
|
-
appName
|
|
3567
|
-
originalError: dmkErr
|
|
3104
|
+
code: hasStatusCode2 ? void 0 : import_hwk_adapter_core9.HardwareErrorCode.AppNotInstalled,
|
|
3105
|
+
errorCode: String(statusCode ?? ""),
|
|
3106
|
+
statusCode,
|
|
3107
|
+
appName
|
|
3568
3108
|
});
|
|
3569
3109
|
}
|
|
3570
3110
|
}
|
|
@@ -3617,14 +3157,14 @@ async function withLegacyChainCall(ctx, sessionId, options, action) {
|
|
|
3617
3157
|
const onAppOpenPrompt = () => {
|
|
3618
3158
|
openAppPromptShown = true;
|
|
3619
3159
|
ctx.emit("ui-event", {
|
|
3620
|
-
type:
|
|
3160
|
+
type: import_hwk_adapter_core10.EConnectorInteraction.ConfirmOpenApp,
|
|
3621
3161
|
payload: { sessionId }
|
|
3622
3162
|
});
|
|
3623
3163
|
};
|
|
3624
3164
|
const closeOpenAppUiIfShown = () => {
|
|
3625
3165
|
if (openAppPromptShown) {
|
|
3626
3166
|
ctx.emit("ui-event", {
|
|
3627
|
-
type:
|
|
3167
|
+
type: import_hwk_adapter_core10.EConnectorInteraction.InteractionComplete,
|
|
3628
3168
|
payload: { sessionId }
|
|
3629
3169
|
});
|
|
3630
3170
|
openAppPromptShown = false;
|
|
@@ -3645,7 +3185,7 @@ async function withLegacyChainCall(ctx, sessionId, options, action) {
|
|
|
3645
3185
|
let confirmEmitted = false;
|
|
3646
3186
|
if (needsConfirmation) {
|
|
3647
3187
|
ctx.emit("ui-event", {
|
|
3648
|
-
type:
|
|
3188
|
+
type: import_hwk_adapter_core10.EConnectorInteraction.ConfirmOnDevice,
|
|
3649
3189
|
payload: { sessionId }
|
|
3650
3190
|
});
|
|
3651
3191
|
confirmEmitted = true;
|
|
@@ -3655,7 +3195,7 @@ async function withLegacyChainCall(ctx, sessionId, options, action) {
|
|
|
3655
3195
|
} finally {
|
|
3656
3196
|
if (confirmEmitted || openAppPromptShown) {
|
|
3657
3197
|
ctx.emit("ui-event", {
|
|
3658
|
-
type:
|
|
3198
|
+
type: import_hwk_adapter_core10.EConnectorInteraction.InteractionComplete,
|
|
3659
3199
|
payload: { sessionId }
|
|
3660
3200
|
});
|
|
3661
3201
|
openAppPromptShown = false;
|
|
@@ -3743,7 +3283,7 @@ async function tronSignTransaction(ctx, sessionId, params) {
|
|
|
3743
3283
|
if (!params.rawTxHex) {
|
|
3744
3284
|
throw Object.assign(
|
|
3745
3285
|
new Error("TRON signing requires a protobuf-encoded raw transaction hex (rawTxHex)."),
|
|
3746
|
-
{ code:
|
|
3286
|
+
{ code: import_hwk_adapter_core11.HardwareErrorCode.InvalidParams }
|
|
3747
3287
|
);
|
|
3748
3288
|
}
|
|
3749
3289
|
const path = normalizePath(params.path);
|
|
@@ -3904,22 +3444,6 @@ var DeviceApps = class {
|
|
|
3904
3444
|
);
|
|
3905
3445
|
return result.filter((a) => a !== null).map(applicationToMetadata);
|
|
3906
3446
|
}
|
|
3907
|
-
/** Installed app names via ListApps APDU. Offline (no manager-api), but still requires unlock + dashboard. */
|
|
3908
|
-
async listInstalledNames(options) {
|
|
3909
|
-
const action = this._dmk.executeDeviceAction({
|
|
3910
|
-
sessionId: this._sessionId,
|
|
3911
|
-
deviceAction: new this._ledgerKit.ListAppsDeviceAction({
|
|
3912
|
-
input: { unlockTimeout: options?.unlockTimeout }
|
|
3913
|
-
})
|
|
3914
|
-
});
|
|
3915
|
-
const result = await deviceActionToPromise(
|
|
3916
|
-
action,
|
|
3917
|
-
this.onInteraction,
|
|
3918
|
-
void 0,
|
|
3919
|
-
this.onRegisterCanceller
|
|
3920
|
-
);
|
|
3921
|
-
return result.map((entry) => entry?.appName).filter((name) => typeof name === "string" && name.length > 0);
|
|
3922
|
-
}
|
|
3923
3447
|
// Catalog lookup via custom device action — DMK has no typed wrapper for this.
|
|
3924
3448
|
async listAvailable() {
|
|
3925
3449
|
const customAction = new ListAvailableAppsDeviceAction({
|
|
@@ -3983,22 +3507,6 @@ var DeviceApps = class {
|
|
|
3983
3507
|
async install(appName, onProgress, options) {
|
|
3984
3508
|
if (!appName) throw new Error("DeviceApps.install: appName is required");
|
|
3985
3509
|
debugLog("[DeviceApps] install:", appName);
|
|
3986
|
-
const refreshAction = this._dmk.executeDeviceAction({
|
|
3987
|
-
sessionId: this._sessionId,
|
|
3988
|
-
deviceAction: new this._ledgerKit.GetDeviceMetadataDeviceAction({
|
|
3989
|
-
input: {
|
|
3990
|
-
useSecureChannel: true,
|
|
3991
|
-
forceUpdate: true,
|
|
3992
|
-
unlockTimeout: options?.unlockTimeout
|
|
3993
|
-
}
|
|
3994
|
-
})
|
|
3995
|
-
});
|
|
3996
|
-
await deviceActionToPromise(
|
|
3997
|
-
refreshAction,
|
|
3998
|
-
this.onInteraction,
|
|
3999
|
-
INSTALL_TIMEOUT_MS,
|
|
4000
|
-
this.onRegisterCanceller
|
|
4001
|
-
);
|
|
4002
3510
|
const action = this._dmk.executeDeviceAction({
|
|
4003
3511
|
sessionId: this._sessionId,
|
|
4004
3512
|
deviceAction: new this._ledgerKit.InstallOrUpdateAppsDeviceAction({
|
|
@@ -4076,7 +3584,7 @@ var METHOD_PREFIX_TO_APP_NAME = {
|
|
|
4076
3584
|
tron: "Tron"
|
|
4077
3585
|
};
|
|
4078
3586
|
var HARDWARE_ERROR_CODE_VALUES = new Set(
|
|
4079
|
-
Object.values(
|
|
3587
|
+
Object.values(import_hwk_adapter_core12.HardwareErrorCode).filter((value) => typeof value === "number")
|
|
4080
3588
|
);
|
|
4081
3589
|
var BLE_CONNECT_SCAN_TIMEOUT_MS = 1500;
|
|
4082
3590
|
async function defaultLedgerKitImporter(pkg) {
|
|
@@ -4247,7 +3755,7 @@ var LedgerConnectorBase = class {
|
|
|
4247
3755
|
`Ledger BLE connect did not return within ${HANG_CEILING_MS / 6e4}min \u2014 DMK hang fallback.`
|
|
4248
3756
|
);
|
|
4249
3757
|
err._tag = ERROR_TAG.BlePairingTimeout;
|
|
4250
|
-
err.code =
|
|
3758
|
+
err.code = import_hwk_adapter_core12.HardwareErrorCode.BlePairingTimeout;
|
|
4251
3759
|
reject(err);
|
|
4252
3760
|
}, HANG_CEILING_MS);
|
|
4253
3761
|
});
|
|
@@ -4280,7 +3788,7 @@ var LedgerConnectorBase = class {
|
|
|
4280
3788
|
"Ledger device is not currently advertising. Wake up and unlock the device, keep it nearby, then try again."
|
|
4281
3789
|
);
|
|
4282
3790
|
err._tag = ERROR_TAG.DeviceNotAdvertising;
|
|
4283
|
-
err.code =
|
|
3791
|
+
err.code = import_hwk_adapter_core12.HardwareErrorCode.DeviceNotFound;
|
|
4284
3792
|
throw err;
|
|
4285
3793
|
};
|
|
4286
3794
|
const doConnect = async (path) => {
|
|
@@ -4344,7 +3852,7 @@ var LedgerConnectorBase = class {
|
|
|
4344
3852
|
"Ledger Bluetooth pairing failed. Make sure the device is unlocked and nearby, then try again."
|
|
4345
3853
|
);
|
|
4346
3854
|
wrapped._tag = ERROR_TAG.BleGattBondingFailed;
|
|
4347
|
-
wrapped.code =
|
|
3855
|
+
wrapped.code = import_hwk_adapter_core12.HardwareErrorCode.BlePairingTimeout;
|
|
4348
3856
|
wrapped.originalError = err;
|
|
4349
3857
|
throw wrapped;
|
|
4350
3858
|
}
|
|
@@ -4422,7 +3930,7 @@ var LedgerConnectorBase = class {
|
|
|
4422
3930
|
this._unwatchSessionState(sessionId);
|
|
4423
3931
|
this._signerManager?.invalidate(sessionId);
|
|
4424
3932
|
this._cancellers.get(sessionId)?.({
|
|
4425
|
-
code:
|
|
3933
|
+
code: import_hwk_adapter_core12.HardwareErrorCode.DeviceDisconnected,
|
|
4426
3934
|
tag: "DeviceDisconnected",
|
|
4427
3935
|
message: "Device disconnected"
|
|
4428
3936
|
});
|
|
@@ -4446,9 +3954,9 @@ var LedgerConnectorBase = class {
|
|
|
4446
3954
|
if (isAppStuckByApdu(err)) {
|
|
4447
3955
|
return {
|
|
4448
3956
|
success: false,
|
|
4449
|
-
error: (0,
|
|
3957
|
+
error: (0, import_hwk_adapter_core12.serializeConnectorError)(
|
|
4450
3958
|
Object.assign(new Error("Ledger app is unresponsive"), {
|
|
4451
|
-
code:
|
|
3959
|
+
code: import_hwk_adapter_core12.HardwareErrorCode.DeviceAppStuck,
|
|
4452
3960
|
_tag: ERROR_TAG.DeviceAppStuck,
|
|
4453
3961
|
originalError: err
|
|
4454
3962
|
})
|
|
@@ -4458,16 +3966,16 @@ var LedgerConnectorBase = class {
|
|
|
4458
3966
|
if (isTransportStuck(err)) {
|
|
4459
3967
|
return {
|
|
4460
3968
|
success: false,
|
|
4461
|
-
error: (0,
|
|
3969
|
+
error: (0, import_hwk_adapter_core12.serializeConnectorError)(
|
|
4462
3970
|
Object.assign(new Error("Device communication interrupted, please retry"), {
|
|
4463
|
-
code:
|
|
3971
|
+
code: import_hwk_adapter_core12.HardwareErrorCode.TransportError,
|
|
4464
3972
|
_tag: ERROR_TAG.DeviceTransportStuck,
|
|
4465
3973
|
originalError: err
|
|
4466
3974
|
})
|
|
4467
3975
|
)
|
|
4468
3976
|
};
|
|
4469
3977
|
}
|
|
4470
|
-
return { success: false, error: (0,
|
|
3978
|
+
return { success: false, error: (0, import_hwk_adapter_core12.serializeConnectorError)(err) };
|
|
4471
3979
|
}
|
|
4472
3980
|
}
|
|
4473
3981
|
async _dispatch(sessionId, method, params) {
|
|
@@ -4530,7 +4038,7 @@ var LedgerConnectorBase = class {
|
|
|
4530
4038
|
try {
|
|
4531
4039
|
return await apps.install(p.appName, ({ progress }) => {
|
|
4532
4040
|
ctx.emit("ui-event", {
|
|
4533
|
-
type:
|
|
4041
|
+
type: import_hwk_adapter_core12.EConnectorInteraction.AppInstallProgress,
|
|
4534
4042
|
payload: {
|
|
4535
4043
|
sessionId,
|
|
4536
4044
|
appName: p.appName,
|
|
@@ -4556,17 +4064,6 @@ var LedgerConnectorBase = class {
|
|
|
4556
4064
|
ctx.clearCanceller(sessionId);
|
|
4557
4065
|
}
|
|
4558
4066
|
}
|
|
4559
|
-
case "listInstalledNames": {
|
|
4560
|
-
const apps = await _getDeviceApps(ctx, sessionId);
|
|
4561
|
-
try {
|
|
4562
|
-
return await apps.listInstalledNames(params);
|
|
4563
|
-
} catch (err) {
|
|
4564
|
-
ctx.invalidateSession(sessionId);
|
|
4565
|
-
throw ctx.wrapError(err);
|
|
4566
|
-
} finally {
|
|
4567
|
-
ctx.clearCanceller(sessionId);
|
|
4568
|
-
}
|
|
4569
|
-
}
|
|
4570
4067
|
case "listAvailableApps": {
|
|
4571
4068
|
const apps = await _getDeviceApps(ctx, sessionId);
|
|
4572
4069
|
try {
|