@onekeyfe/hwk-adapter-core 1.2.8-alpha.11 → 1.2.8-alpha.13

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.
Files changed (37) hide show
  1. package/dist/{chunk-U63HTLGJ.mjs → chunk-3D45OEC2.mjs} +44 -12
  2. package/dist/chunk-3D45OEC2.mjs.map +1 -0
  3. package/dist/chunk-DB4JOPZO.mjs +74 -0
  4. package/dist/chunk-DB4JOPZO.mjs.map +1 -0
  5. package/dist/{chunk-YA4BWFTZ.mjs → chunk-KTRQZ5AJ.mjs} +155 -55
  6. package/dist/chunk-KTRQZ5AJ.mjs.map +1 -0
  7. package/dist/{chunk-SZZF623R.js → chunk-T5HIQPNG.js} +155 -55
  8. package/dist/chunk-T5HIQPNG.js.map +1 -0
  9. package/dist/{chunk-BAGEFFFY.js → chunk-YIQFVAFZ.js} +45 -13
  10. package/dist/chunk-YIQFVAFZ.js.map +1 -0
  11. package/dist/chunk-YLCHSNXO.js +74 -0
  12. package/dist/chunk-YLCHSNXO.js.map +1 -0
  13. package/dist/errors-BgJ4kzRx.d.mts +276 -0
  14. package/dist/errors-BgJ4kzRx.d.ts +276 -0
  15. package/dist/errors.d.mts +1 -207
  16. package/dist/errors.d.ts +1 -207
  17. package/dist/errors.js +8 -2
  18. package/dist/errors.js.map +1 -1
  19. package/dist/errors.mjs +9 -3
  20. package/dist/index.d.mts +610 -104
  21. package/dist/index.d.ts +610 -104
  22. package/dist/index.js +754 -86
  23. package/dist/index.js.map +1 -1
  24. package/dist/index.mjs +746 -78
  25. package/dist/index.mjs.map +1 -1
  26. package/dist/{ui-events-Cb7haAeE.d.ts → ui-events-29Va0fPc.d.mts} +57 -3
  27. package/dist/{ui-events-Cb7haAeE.d.mts → ui-events-29Va0fPc.d.ts} +57 -3
  28. package/dist/ui-events.d.mts +1 -1
  29. package/dist/ui-events.d.ts +1 -1
  30. package/dist/ui-events.js +3 -2
  31. package/dist/ui-events.js.map +1 -1
  32. package/dist/ui-events.mjs +2 -1
  33. package/package.json +2 -2
  34. package/dist/chunk-BAGEFFFY.js.map +0 -1
  35. package/dist/chunk-SZZF623R.js.map +0 -1
  36. package/dist/chunk-U63HTLGJ.mjs.map +0 -1
  37. package/dist/chunk-YA4BWFTZ.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/types/errors.ts
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/types/errors.ts
2
2
  var HardwareErrorCode = /* @__PURE__ */ ((HardwareErrorCode2) => {
3
3
  HardwareErrorCode2[HardwareErrorCode2["UnknownError"] = 1e4] = "UnknownError";
4
4
  HardwareErrorCode2[HardwareErrorCode2["UserRejected"] = 10001] = "UserRejected";
@@ -18,6 +18,9 @@ var HardwareErrorCode = /* @__PURE__ */ ((HardwareErrorCode2) => {
18
18
  HardwareErrorCode2[HardwareErrorCode2["DeviceOneDeviceOnly"] = 10109] = "DeviceOneDeviceOnly";
19
19
  HardwareErrorCode2[HardwareErrorCode2["DevicePathForbidden"] = 10110] = "DevicePathForbidden";
20
20
  HardwareErrorCode2[HardwareErrorCode2["DeviceBusyInternal"] = 10111] = "DeviceBusyInternal";
21
+ HardwareErrorCode2[HardwareErrorCode2["OperationNotFound"] = 10112] = "OperationNotFound";
22
+ HardwareErrorCode2[HardwareErrorCode2["OperationEnded"] = 10113] = "OperationEnded";
23
+ HardwareErrorCode2[HardwareErrorCode2["DeviceSearchMismatch"] = 10114] = "DeviceSearchMismatch";
21
24
  HardwareErrorCode2[HardwareErrorCode2["FirmwareTooOld"] = 10200] = "FirmwareTooOld";
22
25
  HardwareErrorCode2[HardwareErrorCode2["FirmwareUpdateRequired"] = 10201] = "FirmwareUpdateRequired";
23
26
  HardwareErrorCode2[HardwareErrorCode2["TransportError"] = 10300] = "TransportError";
@@ -31,6 +34,8 @@ var HardwareErrorCode = /* @__PURE__ */ ((HardwareErrorCode2) => {
31
34
  HardwareErrorCode2[HardwareErrorCode2["ThpPairingRequired"] = 10308] = "ThpPairingRequired";
32
35
  HardwareErrorCode2[HardwareErrorCode2["BleConnectFailed"] = 10309] = "BleConnectFailed";
33
36
  HardwareErrorCode2[HardwareErrorCode2["BlePairingCancelled"] = 10310] = "BlePairingCancelled";
37
+ HardwareErrorCode2[HardwareErrorCode2["LedgerSecureChannelError"] = 10311] = "LedgerSecureChannelError";
38
+ HardwareErrorCode2[HardwareErrorCode2["LedgerFirmwareMetadataError"] = 10312] = "LedgerFirmwareMetadataError";
34
39
  HardwareErrorCode2[HardwareErrorCode2["PinInvalid"] = 10400] = "PinInvalid";
35
40
  HardwareErrorCode2[HardwareErrorCode2["PinCancelled"] = 10401] = "PinCancelled";
36
41
  HardwareErrorCode2[HardwareErrorCode2["PassphraseRejected"] = 10402] = "PassphraseRejected";
@@ -41,6 +46,8 @@ var HardwareErrorCode = /* @__PURE__ */ ((HardwareErrorCode2) => {
41
46
  HardwareErrorCode2[HardwareErrorCode2["WrongApp"] = 10501] = "WrongApp";
42
47
  HardwareErrorCode2[HardwareErrorCode2["AppTooOld"] = 10502] = "AppTooOld";
43
48
  HardwareErrorCode2[HardwareErrorCode2["DeviceOutOfMemory"] = 10503] = "DeviceOutOfMemory";
49
+ HardwareErrorCode2[HardwareErrorCode2["AppAlreadyInstalled"] = 10504] = "AppAlreadyInstalled";
50
+ HardwareErrorCode2[HardwareErrorCode2["PayloadTooLarge"] = 10600] = "PayloadTooLarge";
44
51
  HardwareErrorCode2[HardwareErrorCode2["EvmBlindSigningRequired"] = 11e3] = "EvmBlindSigningRequired";
45
52
  HardwareErrorCode2[HardwareErrorCode2["EvmClearSignPluginMissing"] = 11001] = "EvmClearSignPluginMissing";
46
53
  HardwareErrorCode2[HardwareErrorCode2["EvmDataTooLarge"] = 11002] = "EvmDataTooLarge";
@@ -58,7 +65,10 @@ var ORPHAN_ELIGIBLE_ERROR_CODES = [
58
65
  10001 /* UserRejected */,
59
66
  10100 /* DeviceNotFound */,
60
67
  10101 /* DeviceDisconnected */,
68
+ 10112 /* OperationNotFound */,
69
+ 10113 /* OperationEnded */,
61
70
  10106 /* DeviceMismatch */,
71
+ 10114 /* DeviceSearchMismatch */,
62
72
  10107 /* DeviceAppStuck */,
63
73
  10109 /* DeviceOneDeviceOnly */,
64
74
  10300 /* TransportError */,
@@ -71,83 +81,173 @@ var ORPHAN_ELIGIBLE_ERROR_CODES = [
71
81
  10310 /* BlePairingCancelled */,
72
82
  10405 /* PassphraseAlwaysOnDevice */
73
83
  ];
74
- function createHwkError(payload) {
75
- return Object.assign(new Error(payload.message), {
76
- code: payload.code,
77
- ...payload._tag !== void 0 && { _tag: payload._tag },
78
- ...payload.appName !== void 0 && { appName: payload.appName },
79
- ...payload.params !== void 0 && { params: payload.params }
80
- });
84
+ var RECOVERY_SCOPES = /* @__PURE__ */ new Set([
85
+ "call",
86
+ "operation",
87
+ "search-target",
88
+ "transport",
89
+ "not-recoverable",
90
+ "unknown"
91
+ ]);
92
+ function isHwkRecoveryHint(value) {
93
+ if (!value || typeof value !== "object") return false;
94
+ const { scope } = value;
95
+ return typeof scope === "string" && RECOVERY_SCOPES.has(scope);
81
96
  }
82
-
83
- // src/utils/errorMessages.ts
84
- function enrichErrorMessage(code, originalMessage) {
97
+ var RECOVERY_CALL = Object.freeze({ scope: "call" });
98
+ var RECOVERY_OPERATION = Object.freeze({ scope: "operation" });
99
+ var RECOVERY_SEARCH_TARGET = Object.freeze({ scope: "search-target" });
100
+ var RECOVERY_TRANSPORT = Object.freeze({ scope: "transport" });
101
+ var RECOVERY_NOT_RECOVERABLE = Object.freeze({
102
+ scope: "not-recoverable"
103
+ });
104
+ var RECOVERY_UNKNOWN = Object.freeze({ scope: "unknown" });
105
+ function defaultRecoveryForCode(code) {
85
106
  switch (code) {
107
+ case 10001 /* UserRejected */:
108
+ case 10005 /* UserAborted */:
109
+ case 10102 /* DeviceBusy */:
110
+ case 10103 /* DeviceLocked */:
111
+ case 10104 /* DeviceNotInitialized */:
112
+ case 10105 /* DeviceInBootloader */:
113
+ case 10107 /* DeviceAppStuck */:
114
+ case 10111 /* DeviceBusyInternal */:
115
+ case 10305 /* NetworkError */:
116
+ case 10311 /* LedgerSecureChannelError */:
117
+ case 10312 /* LedgerFirmwareMetadataError */:
86
118
  case 10400 /* PinInvalid */:
87
- return `${originalMessage}. Please re-enter your PIN.`;
88
119
  case 10401 /* PinCancelled */:
89
- return `${originalMessage}. PIN entry was cancelled.`;
120
+ case 10402 /* PassphraseRejected */:
121
+ case 10403 /* PassphraseStateMismatch */:
90
122
  case 10404 /* PinMismatch */:
91
- return `${originalMessage}. The entered PINs do not match. Please try again.`;
92
- case 10102 /* DeviceBusy */:
93
- return `${originalMessage}. The device is in use by another application. Close other wallet apps and try again.`;
94
- case 10111 /* DeviceBusyInternal */:
95
- return `${originalMessage}. The device is busy. Please try again in a moment.`;
96
- case 10101 /* DeviceDisconnected */:
97
- return `${originalMessage}. Please reconnect the device and try again.`;
98
- case 10103 /* DeviceLocked */:
99
- return `${originalMessage}. Please unlock your device and try again.`;
100
- case 10109 /* DeviceOneDeviceOnly */:
101
- return `${originalMessage}. Disconnect the extra device and try again.`;
102
- case 10001 /* UserRejected */:
103
- return `${originalMessage}. The request was rejected on the device.`;
104
- case 10501 /* WrongApp */:
105
- return `${originalMessage}. Please open the correct app on your device.`;
123
+ case 10200 /* FirmwareTooOld */:
124
+ case 10201 /* FirmwareUpdateRequired */:
106
125
  case 10500 /* AppNotInstalled */:
107
- return `${originalMessage}. The required app is not installed on the device.`;
126
+ case 10501 /* WrongApp */:
127
+ case 10502 /* AppTooOld */:
108
128
  case 10503 /* DeviceOutOfMemory */:
109
- return `${originalMessage}. Not enough free space on the device. Please uninstall some apps and try again.`;
110
- case 10302 /* TransportNotAvailable */:
111
- return `${originalMessage}. Ensure the device bridge/transport is available and running.`;
112
- case 10305 /* NetworkError */:
113
- return `${originalMessage}. Network error \u2014 check your internet connection and try again.`;
114
- case 10200 /* FirmwareTooOld */:
115
- return `${originalMessage}. Please update your device firmware.`;
116
- case 10104 /* DeviceNotInitialized */:
117
- return `${originalMessage}. The device may need to be set up first.`;
118
- case 10003 /* OperationTimeout */:
119
- return `${originalMessage}. The operation timed out. Please try again.`;
129
+ case 10504 /* AppAlreadyInstalled */:
120
130
  case 11e3 /* EvmBlindSigningRequired */:
121
- return "Ledger: Blind signing not enabled in Ethereum app.";
122
131
  case 11001 /* EvmClearSignPluginMissing */:
123
- return "Ledger: Required plugin not installed (install via Ledger Live).";
124
132
  case 11002 /* EvmDataTooLarge */:
125
- return "Ledger: Transaction data too large for device memory.";
126
133
  case 11003 /* EvmTxTypeNotSupported */:
127
- return "Ledger: Transaction type not supported by current Ethereum app.";
128
- case 10502 /* AppTooOld */:
129
- return "Ledger: App out of date (update via Ledger Live).";
130
134
  case 11100 /* SolanaBlindSigningRequired */:
131
- return "Blind signing disabled in the Solana app.";
132
135
  case 11200 /* TronCustomContractRequired */:
133
- return "Custom Contracts setting disabled in the Tron app.";
134
136
  case 11201 /* TronDataSigningRequired */:
135
- return "Transactions Data setting disabled in the Tron app.";
136
137
  case 11202 /* TronSignByHashRequired */:
137
- return "Sign by Hash setting disabled in the Tron app.";
138
138
  case 11300 /* BtcWalletPolicyHmacMismatch */:
139
- return "Wallet policy not registered or HMAC mismatch.";
140
139
  case 11301 /* BtcUnexpectedState */:
141
- return "Signing aborted due to unexpected device state.";
140
+ return RECOVERY_CALL;
141
+ case 10100 /* DeviceNotFound */:
142
+ case 10101 /* DeviceDisconnected */:
143
+ case 10112 /* OperationNotFound */:
144
+ case 10113 /* OperationEnded */:
145
+ case 10300 /* TransportError */:
146
+ case 10304 /* BlePairingTimeout */:
147
+ case 10306 /* ThpPairingFailed */:
148
+ case 10308 /* ThpPairingRequired */:
149
+ case 10309 /* BleConnectFailed */:
150
+ case 10310 /* BlePairingCancelled */:
151
+ return RECOVERY_OPERATION;
152
+ case 10106 /* DeviceMismatch */:
153
+ case 10114 /* DeviceSearchMismatch */:
154
+ case 10109 /* DeviceOneDeviceOnly */:
155
+ case 10307 /* BleBondInvalid */:
156
+ return RECOVERY_SEARCH_TARGET;
157
+ case 10301 /* BridgeNotFound */:
158
+ case 10302 /* TransportNotAvailable */:
159
+ case 10303 /* DevicePermissionDenied */:
160
+ case 10600 /* PayloadTooLarge */:
161
+ return RECOVERY_TRANSPORT;
162
+ case 10002 /* InvalidParams */:
163
+ case 10004 /* MethodNotSupported */:
164
+ case 10108 /* ChainNotSupported */:
165
+ case 10110 /* DevicePathForbidden */:
166
+ return RECOVERY_NOT_RECOVERABLE;
167
+ case 1e4 /* UnknownError */:
168
+ case 10003 /* OperationTimeout */:
142
169
  default:
143
- return originalMessage;
170
+ return RECOVERY_UNKNOWN;
144
171
  }
145
172
  }
173
+ function defaultOriginForCode(code) {
174
+ if (code >= 11e3) return "device";
175
+ switch (code) {
176
+ case 10001 /* UserRejected */:
177
+ case 10103 /* DeviceLocked */:
178
+ case 10104 /* DeviceNotInitialized */:
179
+ case 10105 /* DeviceInBootloader */:
180
+ case 10106 /* DeviceMismatch */:
181
+ case 10114 /* DeviceSearchMismatch */:
182
+ case 10107 /* DeviceAppStuck */:
183
+ case 10110 /* DevicePathForbidden */:
184
+ case 10111 /* DeviceBusyInternal */:
185
+ case 10108 /* ChainNotSupported */:
186
+ case 10200 /* FirmwareTooOld */:
187
+ case 10201 /* FirmwareUpdateRequired */:
188
+ case 10400 /* PinInvalid */:
189
+ case 10404 /* PinMismatch */:
190
+ case 10402 /* PassphraseRejected */:
191
+ case 10403 /* PassphraseStateMismatch */:
192
+ case 10306 /* ThpPairingFailed */:
193
+ case 10308 /* ThpPairingRequired */:
194
+ case 10501 /* WrongApp */:
195
+ case 10500 /* AppNotInstalled */:
196
+ case 10502 /* AppTooOld */:
197
+ case 10503 /* DeviceOutOfMemory */:
198
+ case 10504 /* AppAlreadyInstalled */:
199
+ return "device";
200
+ case 10100 /* DeviceNotFound */:
201
+ case 10101 /* DeviceDisconnected */:
202
+ case 10300 /* TransportError */:
203
+ case 10301 /* BridgeNotFound */:
204
+ case 10302 /* TransportNotAvailable */:
205
+ case 10304 /* BlePairingTimeout */:
206
+ case 10305 /* NetworkError */:
207
+ case 10311 /* LedgerSecureChannelError */:
208
+ case 10312 /* LedgerFirmwareMetadataError */:
209
+ case 10307 /* BleBondInvalid */:
210
+ case 10309 /* BleConnectFailed */:
211
+ return "transport";
212
+ case 10303 /* DevicePermissionDenied */:
213
+ case 10005 /* UserAborted */:
214
+ case 10002 /* InvalidParams */:
215
+ case 10004 /* MethodNotSupported */:
216
+ case 10401 /* PinCancelled */:
217
+ case 10310 /* BlePairingCancelled */:
218
+ case 10600 /* PayloadTooLarge */:
219
+ case 10109 /* DeviceOneDeviceOnly */:
220
+ return "host";
221
+ default:
222
+ return void 0;
223
+ }
224
+ }
225
+ function operationMayHaveCompletedParams(method, params) {
226
+ return {
227
+ ...params,
228
+ operationMayHaveCompleted: true,
229
+ method
230
+ };
231
+ }
232
+ function createHwkError(payload) {
233
+ const recovery = _nullishCoalesce(payload.recovery, () => ( defaultRecoveryForCode(payload.code)));
234
+ return Object.assign(new Error(payload.message), {
235
+ code: payload.code,
236
+ ...payload.origin !== void 0 && { origin: payload.origin },
237
+ recovery,
238
+ ...payload._tag !== void 0 && { _tag: payload._tag },
239
+ ...payload.appName !== void 0 && { appName: payload.appName },
240
+ ...payload.params !== void 0 && { params: payload.params }
241
+ });
242
+ }
243
+
244
+
245
+
146
246
 
147
247
 
148
248
 
149
249
 
150
250
 
151
251
 
152
- exports.HardwareErrorCode = HardwareErrorCode; exports.ORPHAN_ELIGIBLE_ERROR_CODES = ORPHAN_ELIGIBLE_ERROR_CODES; exports.createHwkError = createHwkError; exports.enrichErrorMessage = enrichErrorMessage;
153
- //# sourceMappingURL=chunk-SZZF623R.js.map
252
+ exports.HardwareErrorCode = HardwareErrorCode; exports.ORPHAN_ELIGIBLE_ERROR_CODES = ORPHAN_ELIGIBLE_ERROR_CODES; exports.isHwkRecoveryHint = isHwkRecoveryHint; exports.defaultRecoveryForCode = defaultRecoveryForCode; exports.defaultOriginForCode = defaultOriginForCode; exports.operationMayHaveCompletedParams = operationMayHaveCompletedParams; exports.createHwkError = createHwkError;
253
+ //# sourceMappingURL=chunk-T5HIQPNG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/hardware-js-sdk/hardware-js-sdk/packages/hwk-adapter-core/dist/chunk-T5HIQPNG.js","../src/types/errors.ts"],"names":["HardwareErrorCode"],"mappings":"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","file":"/home/runner/work/hardware-js-sdk/hardware-js-sdk/packages/hwk-adapter-core/dist/chunk-T5HIQPNG.js","sourcesContent":[null,"/**\n * HWK HardwareErrorCode — independent namespace from the legacy\n * `@onekeyfe/shared` HardwareErrorCode (which occupies 0-902).\n *\n * All HWK codes are 5-digit (>= 10000) so the two tables never collide\n * even if either side grows. Each sub-category gets a 100-slot block.\n *\n * 10000-10099 Generic / cross-cutting primitives\n * 10100-10199 Device state\n * 10200-10299 Firmware\n * 10300-10399 Transport + OS-level permission\n * 10400-10499 PIN / Passphrase\n * 10500-10599 App lifecycle (wrong app, not open, too old)\n * 10600-10699 Payload / framing limits (adapter-level)\n * 10700-10999 RESERVED, future adapter-level categories\n *\n * 11000-11099 EVM APDU (reactive mapping)\n * 11100-11199 Solana APDU\n * 11200-11299 Tron APDU\n * 11300-11399 BTC APDU\n * 11400-11999 RESERVED — future chain APDU blocks (100 per chain)\n *\n * 12000-99999 RESERVED — future major categories\n */\nexport enum HardwareErrorCode {\n // --- 10000s Generic ---\n UnknownError = 10000,\n UserRejected = 10001,\n InvalidParams = 10002,\n OperationTimeout = 10003,\n MethodNotSupported = 10004,\n /** User dismissed in-app cancel UI. Distinct from UserRejected (on-device). */\n UserAborted = 10005,\n\n // --- 10100s Device state ---\n DeviceNotFound = 10100,\n DeviceDisconnected = 10101,\n DeviceBusy = 10102,\n DeviceLocked = 10103,\n DeviceNotInitialized = 10104,\n DeviceInBootloader = 10105,\n DeviceMismatch = 10106,\n /** Chain app wedged (e.g. Ledger BTC 0x6901). User must exit app on device. */\n DeviceAppStuck = 10107,\n /** Vendor (Ledger / Trezor) doesn't support the chain at all. */\n ChainNotSupported = 10108,\n /** Current operation supports only one connected device. */\n DeviceOneDeviceOnly = 10109,\n /**\n * The device rejected the requested derivation path (Trezor Failure_DataError\n * \"Forbidden key path\") — the path is non-standard or its index is outside the\n * range the device's safety checks allow. Distinct from ChainNotSupported\n * (whole chain) and MethodNotSupported (the operation/method itself).\n */\n DevicePathForbidden = 10110,\n /** Busy with our own in-flight request (queue guard / firmware Failure_Busy), not another app — wait and retry, don't close other apps. */\n DeviceBusyInternal = 10111,\n /** The supplied runtime-only operation id is unknown to this adapter instance. */\n OperationNotFound = 10112,\n /** The supplied operation ended and can never be resumed. */\n OperationEnded = 10113,\n /**\n * Discovery found devices but none is the expected wallet (wrong unit connected). DeviceMismatch\n * is for reaching the expected device and finding a different identity on it.\n */\n DeviceSearchMismatch = 10114,\n\n // --- 10200s Firmware ---\n FirmwareTooOld = 10200,\n FirmwareUpdateRequired = 10201,\n\n // --- 10300s Transport + permission ---\n TransportError = 10300,\n BridgeNotFound = 10301,\n TransportNotAvailable = 10302,\n /**\n * OS-level permission (Bluetooth / USB / etc.) — denied, blocked,\n * unavailable, or dismissed. Consumers surface a single \"please grant\n * permission\" toast and let the user retry manually.\n */\n DevicePermissionDenied = 10303,\n /**\n * BLE SMP pairing did not complete within the GATT bonding window.\n * GATT connected but the device didn't acknowledge SMP — typically\n * because the user didn't confirm the passkey on the device, or the\n * device went out of range mid-pairing. Distinct from OperationTimeout\n * (generic) and from DeviceLocked (Secure Element actually locked).\n */\n BlePairingTimeout = 10304,\n /** Remote network failure reaching a vendor's servers (HTTP/WS). Distinct from TransportError (local USB/BLE link). */\n NetworkError = 10305,\n /**\n * Host-managed pairing handshake failed (Trezor THP). The device rejected the\n * pairing exchange — e.g. CodeEntry: the user mistyped the code shown on the\n * device, so the CPace tag didn't match (\"Unexpected Code Entry Tag\").\n * Recoverable: the user re-pairs and re-enters the code. Distinct from\n * BlePairingTimeout (BLE SMP bonding window) and UserRejected (on-device\n * reject button).\n */\n ThpPairingFailed = 10306,\n /**\n * The OS-level BLE bond is stale/invalid, so the device rejected link\n * encryption: Android GATT_INSUF_AUTHENTICATION (status 5) or iOS \"Peer\n * removed pairing information\". Happens after the device is wiped/re-flashed\n * or unpaired elsewhere while the host still holds an old bond. The SDK cannot\n * remove an OS bond — the user must forget the device in system Bluetooth\n * settings and re-pair. Distinct from BlePairingTimeout (SMP window) and\n * ThpPairingFailed (THP code mismatch).\n */\n BleBondInvalid = 10307,\n /**\n * A stored THP pairing credential was rejected by the device during the\n * handshake (device returned completion `state=0`), so the autoconnect session\n * could not be established. The SDK discards the stale credential; recovery is\n * a fresh pairing. Distinct from ThpPairingFailed (user mistyped the code\n * during an *active* pairing) and BleBondInvalid (OS-level BLE bond).\n */\n ThpPairingRequired = 10308,\n /**\n * Generic BLE connect failure where the OS dropped the specific reason. On\n * macOS the noble native binding hardcodes \"connection failed\" (and a connect\n * timeout) and discards the CoreBluetooth NSError, so the SDK cannot tell a\n * stale bond from an out-of-range / unresponsive device. Surfaced as a\n * generic \"couldn't connect — check the device, re-pair if paired before\".\n * Distinct from BleBondInvalid (a *known* stale-bond signal, iOS/Android only)\n * and BlePairingTimeout (the SMP bonding window).\n */\n BleConnectFailed = 10309,\n /**\n * The user cancelled BLE pairing from the app while the connect was still\n * waiting on the OS pairing window. Not a failure to report — the flow ends\n * because they asked it to. Distinct from UserAborted (generic in-app cancel)\n * so the pairing UI can close quietly instead of surfacing a connect error,\n * and from BlePairingTimeout (the SMP window elapsed on its own).\n */\n BlePairingCancelled = 10310,\n /**\n * Ledger manager-api WebSocket (app install/uninstall, genuine check) broke while relaying APDUs.\n * The device link is fine, so retry; NetworkError never carried device traffic.\n */\n LedgerSecureChannelError = 10311,\n /**\n * Vendor metadata service returned an unusable payload (Ledger firmware metadata, app catalog).\n * The request succeeded, so callers must not treat it as a dropped link.\n */\n LedgerFirmwareMetadataError = 10312,\n\n // --- 10400s PIN / Passphrase ---\n PinInvalid = 10400,\n PinCancelled = 10401,\n PassphraseRejected = 10402,\n /**\n * The passphrase entered produced a different wallet (`passphraseState`) than\n * the one the caller asked to operate on. Trezor-only: the host pins a wallet\n * by its derived state and the SDK refuses to sign with a mismatched\n * passphrase session. Surfaced by TrezorAdapter.getPassphraseState.\n */\n PassphraseStateMismatch = 10403,\n /**\n * The two new-PIN entries did not match during set/change PIN. Only host-input\n * models (Trezor Model One matrix) surface this; on-device-input models show\n * the mismatch on the device and never return it.\n */\n PinMismatch = 10404,\n /** Standard wallet is unavailable while Trezor enforces on-device passphrase entry. */\n PassphraseAlwaysOnDevice = 10405,\n\n // --- 10500s App lifecycle ---\n /** Chain app NOT INSTALLED on device. User must install via Ledger Live. */\n AppNotInstalled = 10500,\n WrongApp = 10501,\n /** 0x911c Command code not supported — app predates current SDK. */\n AppTooOld = 10502,\n /** Not enough free storage for install/update; user must uninstall apps first. */\n DeviceOutOfMemory = 10503,\n /** Install refused, the app is already on the device; benign when the caller only needs it. */\n AppAlreadyInstalled = 10504,\n\n // --- 10600s Payload / framing limits ---\n /**\n * Payload exceeds a transport's framing cap (Keystone USB: ~12.5KB, 200 frames of 64 bytes).\n * Retrying on the same transport fails the same way; switch channel or shrink the payload.\n */\n PayloadTooLarge = 10600,\n\n // --- 11000s EVM (Ledger Ethereum App) APDU-specific ---\n /** 0x6a80 Invalid data — observed on blindSignTransactionFallback when the\n * user has not enabled Blind signing on the device. */\n EvmBlindSigningRequired = 11000,\n /** 0x6984 Plugin not installed */\n EvmClearSignPluginMissing = 11001,\n /** 0x6a84 Insufficient memory (typical on Nano S with large calldata) */\n EvmDataTooLarge = 11002,\n /** 0x6501 TransactionType not supported (app too old for EIP-1559 / blob / 7702) */\n EvmTxTypeNotSupported = 11003,\n\n // --- 11100s Solana ---\n /** 0x6808 Blind signing disabled for this instruction. */\n SolanaBlindSigningRequired = 11100,\n\n // --- 11200s Tron ---\n /** 0x6a8d Custom Contracts setting disabled (blocks TRC-20 etc.). */\n TronCustomContractRequired = 11200,\n /** 0x6a8b Transactions Data setting disabled. */\n TronDataSigningRequired = 11201,\n /** 0x6a8c Sign by Hash setting disabled (hash-signing fallback). */\n TronSignByHashRequired = 11202,\n\n // --- 11300s BTC ---\n /** 0xb008 Wallet policy HMAC mismatch or not registered. */\n BtcWalletPolicyHmacMismatch = 11300,\n /** 0xb007 Aborted due to unexpected state (malformed PSBT / missing UTXO). */\n BtcUnexpectedState = 11301,\n}\n\n/**\n * Device-level failures the SDK cannot self-recover from — affect the entire\n * batch (vs per-chain failures like AppNotInstalled / WrongApp which soft-\n * skip in onboarding). Combined with `accounts.length === 0`, signals\n * genuine orphan. Also reused as the batch-abort whitelist for HWK.\n * Single source of truth.\n *\n * UserRejected (device-side reject) is included: pressing reject is an\n * explicit \"I don't consent\" — continuing the batch to ask again on the\n * next chain is harassment, not helpful.\n */\nexport const ORPHAN_ELIGIBLE_ERROR_CODES: number[] = [\n HardwareErrorCode.UserAborted,\n HardwareErrorCode.UserRejected,\n HardwareErrorCode.DeviceNotFound,\n HardwareErrorCode.DeviceDisconnected,\n HardwareErrorCode.OperationNotFound,\n HardwareErrorCode.OperationEnded,\n HardwareErrorCode.DeviceMismatch,\n HardwareErrorCode.DeviceSearchMismatch,\n HardwareErrorCode.DeviceAppStuck,\n HardwareErrorCode.DeviceOneDeviceOnly,\n HardwareErrorCode.TransportError,\n HardwareErrorCode.DevicePermissionDenied,\n HardwareErrorCode.BlePairingTimeout,\n HardwareErrorCode.ThpPairingFailed,\n HardwareErrorCode.ThpPairingRequired,\n HardwareErrorCode.BleBondInvalid,\n HardwareErrorCode.BleConnectFailed,\n HardwareErrorCode.BlePairingCancelled,\n HardwareErrorCode.PassphraseAlwaysOnDevice,\n];\n\n// ---------------------------------------------------------------------------\n// Standard throwable for HWK adapters\n// ---------------------------------------------------------------------------\n\n/**\n * Where a failure came from; code ranges can't tell (UserRejected=10001 is the device,\n * DevicePermissionDenied=10303 is the host).\n * `device`: the firmware answered (rejection, locked, wrong PIN); surface verbatim, never\n * auto-reconnect, switch channels, or drop a healthy session.\n * `transport`: the pipe failed (cable pulled, bus reset); reconnecting is fair game.\n * `host`: the environment refused (permission, picker, bad params); fix it, not the link.\n * A mapper that can't tell leaves it unset so consumers fall back to code-based tables.\n */\nexport type HwkErrorOrigin = 'device' | 'transport' | 'host';\n\n/**\n * Smallest resource to replace before retrying; never permission to auto-replay a signing command.\n * `call`: nothing. `operation`: rebind from the target if its identity is persistent.\n * `search-target`: rediscover and reselect. `transport`: repair or switch transport.\n * `not-recoverable`: retrying cannot succeed. `unknown`: no safe claim.\n */\nexport type HwkRecoveryScope =\n | 'call'\n | 'operation'\n | 'search-target'\n | 'transport'\n | 'not-recoverable'\n | 'unknown';\n\nexport interface HwkRecoveryHint {\n scope: HwkRecoveryScope;\n}\n\nconst RECOVERY_SCOPES = new Set<HwkRecoveryScope>([\n 'call',\n 'operation',\n 'search-target',\n 'transport',\n 'not-recoverable',\n 'unknown',\n]);\n\nexport function isHwkRecoveryHint(value: unknown): value is HwkRecoveryHint {\n if (!value || typeof value !== 'object') return false;\n const { scope } = value as { scope?: unknown };\n return typeof scope === 'string' && RECOVERY_SCOPES.has(scope as HwkRecoveryScope);\n}\n\nconst RECOVERY_CALL: HwkRecoveryHint = Object.freeze({ scope: 'call' });\nconst RECOVERY_OPERATION: HwkRecoveryHint = Object.freeze({ scope: 'operation' });\nconst RECOVERY_SEARCH_TARGET: HwkRecoveryHint = Object.freeze({ scope: 'search-target' });\nconst RECOVERY_TRANSPORT: HwkRecoveryHint = Object.freeze({ scope: 'transport' });\nconst RECOVERY_NOT_RECOVERABLE: HwkRecoveryHint = Object.freeze({\n scope: 'not-recoverable',\n});\nconst RECOVERY_UNKNOWN: HwkRecoveryHint = Object.freeze({ scope: 'unknown' });\n\n/** Vendor-neutral fallback; adapters may stamp a narrower hint when session state is clear. */\nexport function defaultRecoveryForCode(code: HardwareErrorCode): HwkRecoveryHint {\n switch (code) {\n case HardwareErrorCode.UserRejected:\n case HardwareErrorCode.UserAborted:\n case HardwareErrorCode.DeviceBusy:\n case HardwareErrorCode.DeviceLocked:\n case HardwareErrorCode.DeviceNotInitialized:\n case HardwareErrorCode.DeviceInBootloader:\n case HardwareErrorCode.DeviceAppStuck:\n case HardwareErrorCode.DeviceBusyInternal:\n case HardwareErrorCode.NetworkError:\n case HardwareErrorCode.LedgerSecureChannelError:\n case HardwareErrorCode.LedgerFirmwareMetadataError:\n case HardwareErrorCode.PinInvalid:\n case HardwareErrorCode.PinCancelled:\n case HardwareErrorCode.PassphraseRejected:\n case HardwareErrorCode.PassphraseStateMismatch:\n case HardwareErrorCode.PinMismatch:\n case HardwareErrorCode.FirmwareTooOld:\n case HardwareErrorCode.FirmwareUpdateRequired:\n case HardwareErrorCode.AppNotInstalled:\n case HardwareErrorCode.WrongApp:\n case HardwareErrorCode.AppTooOld:\n case HardwareErrorCode.DeviceOutOfMemory:\n case HardwareErrorCode.AppAlreadyInstalled:\n case HardwareErrorCode.EvmBlindSigningRequired:\n case HardwareErrorCode.EvmClearSignPluginMissing:\n case HardwareErrorCode.EvmDataTooLarge:\n case HardwareErrorCode.EvmTxTypeNotSupported:\n case HardwareErrorCode.SolanaBlindSigningRequired:\n case HardwareErrorCode.TronCustomContractRequired:\n case HardwareErrorCode.TronDataSigningRequired:\n case HardwareErrorCode.TronSignByHashRequired:\n case HardwareErrorCode.BtcWalletPolicyHmacMismatch:\n case HardwareErrorCode.BtcUnexpectedState:\n return RECOVERY_CALL;\n case HardwareErrorCode.DeviceNotFound:\n case HardwareErrorCode.DeviceDisconnected:\n case HardwareErrorCode.OperationNotFound:\n case HardwareErrorCode.OperationEnded:\n case HardwareErrorCode.TransportError:\n case HardwareErrorCode.BlePairingTimeout:\n case HardwareErrorCode.ThpPairingFailed:\n case HardwareErrorCode.ThpPairingRequired:\n case HardwareErrorCode.BleConnectFailed:\n case HardwareErrorCode.BlePairingCancelled:\n return RECOVERY_OPERATION;\n case HardwareErrorCode.DeviceMismatch:\n case HardwareErrorCode.DeviceSearchMismatch:\n case HardwareErrorCode.DeviceOneDeviceOnly:\n case HardwareErrorCode.BleBondInvalid:\n return RECOVERY_SEARCH_TARGET;\n case HardwareErrorCode.BridgeNotFound:\n case HardwareErrorCode.TransportNotAvailable:\n case HardwareErrorCode.DevicePermissionDenied:\n case HardwareErrorCode.PayloadTooLarge:\n return RECOVERY_TRANSPORT;\n case HardwareErrorCode.InvalidParams:\n case HardwareErrorCode.MethodNotSupported:\n case HardwareErrorCode.ChainNotSupported:\n case HardwareErrorCode.DevicePathForbidden:\n return RECOVERY_NOT_RECOVERABLE;\n case HardwareErrorCode.UnknownError:\n case HardwareErrorCode.OperationTimeout:\n default:\n return RECOVERY_UNKNOWN;\n }\n}\n\n/**\n * Default code-to-origin table; vendors override only where their mapping knows better.\n * Context-dependent codes (UnknownError, OperationTimeout, DeviceBusy) return undefined.\n */\nexport function defaultOriginForCode(code: HardwareErrorCode): HwkErrorOrigin | undefined {\n // Chain APDU codes (11000+) are always the device's chain app refusing or qualifying a request.\n if (code >= 11_000) return 'device';\n switch (code) {\n case HardwareErrorCode.UserRejected:\n case HardwareErrorCode.DeviceLocked:\n case HardwareErrorCode.DeviceNotInitialized:\n case HardwareErrorCode.DeviceInBootloader:\n case HardwareErrorCode.DeviceMismatch:\n case HardwareErrorCode.DeviceSearchMismatch:\n case HardwareErrorCode.DeviceAppStuck:\n case HardwareErrorCode.DevicePathForbidden:\n case HardwareErrorCode.DeviceBusyInternal:\n case HardwareErrorCode.ChainNotSupported:\n case HardwareErrorCode.FirmwareTooOld:\n case HardwareErrorCode.FirmwareUpdateRequired:\n case HardwareErrorCode.PinInvalid:\n case HardwareErrorCode.PinMismatch:\n case HardwareErrorCode.PassphraseRejected:\n case HardwareErrorCode.PassphraseStateMismatch:\n case HardwareErrorCode.ThpPairingFailed:\n case HardwareErrorCode.ThpPairingRequired:\n case HardwareErrorCode.WrongApp:\n case HardwareErrorCode.AppNotInstalled:\n case HardwareErrorCode.AppTooOld:\n case HardwareErrorCode.DeviceOutOfMemory:\n case HardwareErrorCode.AppAlreadyInstalled:\n return 'device';\n case HardwareErrorCode.DeviceNotFound:\n case HardwareErrorCode.DeviceDisconnected:\n case HardwareErrorCode.TransportError:\n case HardwareErrorCode.BridgeNotFound:\n case HardwareErrorCode.TransportNotAvailable:\n case HardwareErrorCode.BlePairingTimeout:\n case HardwareErrorCode.NetworkError:\n case HardwareErrorCode.LedgerSecureChannelError:\n case HardwareErrorCode.LedgerFirmwareMetadataError:\n case HardwareErrorCode.BleBondInvalid:\n case HardwareErrorCode.BleConnectFailed:\n return 'transport';\n case HardwareErrorCode.DevicePermissionDenied:\n case HardwareErrorCode.UserAborted:\n case HardwareErrorCode.InvalidParams:\n case HardwareErrorCode.MethodNotSupported:\n case HardwareErrorCode.PinCancelled:\n case HardwareErrorCode.BlePairingCancelled:\n case HardwareErrorCode.PayloadTooLarge:\n case HardwareErrorCode.DeviceOneDeviceOnly:\n return 'host';\n default:\n return undefined;\n }\n}\n\nexport interface IHwkErrorPayload {\n code: HardwareErrorCode;\n message: string;\n origin?: HwkErrorOrigin;\n recovery?: HwkRecoveryHint;\n appName?: string;\n _tag?: string;\n params?: Record<string, unknown>;\n}\n\nexport interface IOperationMayHaveCompletedParams extends Record<string, unknown> {\n operationMayHaveCompleted: true;\n method: string;\n}\n\n/**\n * Marks an unsafe request whose response was lost after dispatch; the transport error is not proof\n * that the device rejected or skipped it.\n */\nexport function operationMayHaveCompletedParams(\n method: string,\n params?: Record<string, unknown>\n): IOperationMayHaveCompletedParams {\n return {\n ...params,\n operationMayHaveCompleted: true,\n method,\n };\n}\n\nexport type HwkError = Error & {\n code: HardwareErrorCode;\n /** See {@link HwkErrorOrigin}. Survives serializeConnectorError/rehydrate via `params`. */\n origin?: HwkErrorOrigin;\n recovery?: HwkRecoveryHint;\n appName?: string;\n _tag?: string;\n params?: Record<string, unknown>;\n};\n\n/**\n * Canonical throwable for HWK adapters. Plain Error + canonical extra fields,\n * shape-compatible with `rehydrateConnectorError` so locally-thrown and\n * cross-boundary errors are indistinguishable to downstream classifiers\n * (`err.code` / `err._tag` / `err.appName`). Do NOT mutate caught errors\n * with `Object.assign` — construct a fresh one via this factory.\n */\nexport function createHwkError(payload: IHwkErrorPayload): HwkError {\n const recovery = payload.recovery ?? defaultRecoveryForCode(payload.code);\n return Object.assign(new Error(payload.message), {\n code: payload.code,\n ...(payload.origin !== undefined && { origin: payload.origin }),\n recovery,\n ...(payload._tag !== undefined && { _tag: payload._tag }),\n ...(payload.appName !== undefined && { appName: payload.appName }),\n ...(payload.params !== undefined && { params: payload.params }),\n });\n}\n"]}
@@ -1,4 +1,8 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/events/ui-request.ts
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+ var _chunkT5HIQPNGjs = require('./chunk-T5HIQPNG.js');
4
+
5
+ // src/events/ui-request.ts
2
6
  var UI_EVENT = "UI_EVENT";
3
7
  var UI_REQUEST = {
4
8
  REQUEST_PIN: "ui-request-pin",
@@ -11,6 +15,8 @@ var UI_REQUEST = {
11
15
  REQUEST_QR_SCAN: "ui-request-qr-scan",
12
16
  REQUEST_DEVICE_PERMISSION: "ui-request-device-permission",
13
17
  REQUEST_SELECT_DEVICE: "ui-request-select-device",
18
+ REQUEST_SAVE_DEVICE_BINDING: "ui-request-save-device-binding",
19
+ DEVICE_BINDING_STATUS: "ui-device-binding-status",
14
20
  REQUEST_DEVICE_CONNECT: "ui-request-device-connect",
15
21
  // Ledger BTC App: account index >= 100 requires display=true. Adapter asks
16
22
  // the user once per session before promoting the call.
@@ -30,6 +36,7 @@ var UI_RESPONSE = {
30
36
  RECEIVE_PASSPHRASE: "receive-passphrase",
31
37
  RECEIVE_QR_RESPONSE: "receive-qr-response",
32
38
  RECEIVE_SELECT_DEVICE: "receive-select-device",
39
+ RECEIVE_SAVE_DEVICE_BINDING: "receive-save-device-binding",
33
40
  RECEIVE_DEVICE_CONNECT: "receive-device-connect",
34
41
  RECEIVE_DEVICE_PERMISSION: "receive-device-permission",
35
42
  RECEIVE_BTC_HIGH_INDEX_CONFIRM: "receive-btc-high-index-confirm",
@@ -45,6 +52,7 @@ var RESPONSE_TO_REQUEST = {
45
52
  [UI_RESPONSE.RECEIVE_PIN]: UI_REQUEST.REQUEST_PIN,
46
53
  [UI_RESPONSE.RECEIVE_PASSPHRASE]: UI_REQUEST.REQUEST_PASSPHRASE,
47
54
  [UI_RESPONSE.RECEIVE_SELECT_DEVICE]: UI_REQUEST.REQUEST_SELECT_DEVICE,
55
+ [UI_RESPONSE.RECEIVE_SAVE_DEVICE_BINDING]: UI_REQUEST.REQUEST_SAVE_DEVICE_BINDING,
48
56
  [UI_RESPONSE.RECEIVE_DEVICE_CONNECT]: UI_REQUEST.REQUEST_DEVICE_CONNECT,
49
57
  [UI_RESPONSE.RECEIVE_DEVICE_PERMISSION]: UI_REQUEST.REQUEST_DEVICE_PERMISSION,
50
58
  [UI_RESPONSE.RECEIVE_BTC_HIGH_INDEX_CONFIRM]: UI_REQUEST.REQUEST_BTC_HIGH_INDEX_CONFIRM,
@@ -56,10 +64,15 @@ var RESPONSE_TO_REQUEST = {
56
64
  var UI_REQUEST_PREEMPTED_TAG = "UiRequestPreempted";
57
65
  var UI_REQUEST_CANCELLED_TAG = "UiRequestCancelled";
58
66
  var UI_REQUEST_TIMEOUT_TAG = "UiRequestTimeout";
67
+ var requestSequence = 0;
59
68
  var UiRequestRegistry = class {
60
69
  constructor() {
61
70
  this.pending = /* @__PURE__ */ new Map();
62
71
  }
72
+ createRequestId() {
73
+ requestSequence += 1;
74
+ return `hwk-ui-${Date.now()}-${requestSequence}`;
75
+ }
63
76
  wait(requestType, options) {
64
77
  const existing = this.pending.get(requestType);
65
78
  if (existing) {
@@ -84,6 +97,8 @@ var UiRequestRegistry = class {
84
97
  }
85
98
  }, timeoutMs);
86
99
  this.pending.set(requestType, {
100
+ requestId: _optionalChain([options, 'optionalAccess', _6 => _6.requestId]),
101
+ operationId: _optionalChain([options, 'optionalAccess', _7 => _7.operationId]),
87
102
  resolve,
88
103
  reject,
89
104
  timer
@@ -102,32 +117,49 @@ var UiRequestRegistry = class {
102
117
  if (!requestType) return;
103
118
  const entry = this.pending.get(requestType);
104
119
  if (!entry) return;
120
+ const response = payload && typeof payload === "object" ? payload : void 0;
121
+ if (entry.requestId !== void 0 && _optionalChain([response, 'optionalAccess', _8 => _8.requestId]) !== entry.requestId) return;
105
122
  clearTimeout(entry.timer);
106
123
  this.pending.delete(requestType);
107
- entry.resolve(payload);
108
- }
109
- cancel(requestType) {
110
- if (requestType) {
111
- const entry = this.pending.get(requestType);
112
- if (!entry) return;
113
- clearTimeout(entry.timer);
114
- this.pending.delete(requestType);
124
+ if (requestType === UI_REQUEST.REQUEST_SELECT_DEVICE && _optionalChain([response, 'optionalAccess', _9 => _9.cancelled]) === true) {
115
125
  entry.reject(
116
- Object.assign(new Error(`UI request '${requestType}' was cancelled`), {
126
+ _chunkT5HIQPNGjs.createHwkError.call(void 0, {
127
+ code: 10005 /* UserAborted */,
128
+ message: "Device selection was cancelled",
117
129
  _tag: UI_REQUEST_CANCELLED_TAG
118
130
  })
119
131
  );
120
132
  return;
121
133
  }
122
- for (const [type, entry] of this.pending) {
134
+ entry.resolve(payload);
135
+ }
136
+ /**
137
+ * Each argument narrows the cancel: none rejects every waiter (teardown); an `operationId` alone
138
+ * rejects only that operation's prompts and leaves another operation's PIN or QR wait untouched.
139
+ */
140
+ cancel(requestType, requestId, operationId) {
141
+ const reject = (type, entry) => {
123
142
  clearTimeout(entry.timer);
143
+ this.pending.delete(type);
124
144
  entry.reject(
125
145
  Object.assign(new Error(`UI request '${type}' was cancelled`), {
126
146
  _tag: UI_REQUEST_CANCELLED_TAG
127
147
  })
128
148
  );
149
+ };
150
+ if (requestType) {
151
+ const entry = this.pending.get(requestType);
152
+ if (!entry) return;
153
+ if (requestId !== void 0 && entry.requestId !== requestId) return;
154
+ if (operationId !== void 0 && entry.operationId !== operationId) return;
155
+ reject(requestType, entry);
156
+ return;
157
+ }
158
+ for (const [type, entry] of [...this.pending]) {
159
+ if (operationId === void 0 || entry.operationId === operationId) {
160
+ reject(type, entry);
161
+ }
129
162
  }
130
- this.pending.clear();
131
163
  }
132
164
  reset() {
133
165
  this.cancel();
@@ -148,4 +180,4 @@ var UiRequestRegistry = class {
148
180
 
149
181
 
150
182
  exports.UI_EVENT = UI_EVENT; exports.UI_REQUEST = UI_REQUEST; exports.UI_RESPONSE = UI_RESPONSE; exports.UI_REQUEST_DEFAULT_TIMEOUT_MS = UI_REQUEST_DEFAULT_TIMEOUT_MS; exports.UI_REQUEST_PREEMPTED_TAG = UI_REQUEST_PREEMPTED_TAG; exports.UI_REQUEST_CANCELLED_TAG = UI_REQUEST_CANCELLED_TAG; exports.UI_REQUEST_TIMEOUT_TAG = UI_REQUEST_TIMEOUT_TAG; exports.UiRequestRegistry = UiRequestRegistry;
151
- //# sourceMappingURL=chunk-BAGEFFFY.js.map
183
+ //# sourceMappingURL=chunk-YIQFVAFZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/hardware-js-sdk/hardware-js-sdk/packages/hwk-adapter-core/dist/chunk-YIQFVAFZ.js","../src/events/ui-request.ts","../src/utils/UiRequestRegistry.ts"],"names":[],"mappings":"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","file":"/home/runner/work/hardware-js-sdk/hardware-js-sdk/packages/hwk-adapter-core/dist/chunk-YIQFVAFZ.js","sourcesContent":[null,"import type { QrResponseData } from '../types/qr';\n\nexport const UI_EVENT = 'UI_EVENT';\n\nexport const UI_REQUEST = {\n REQUEST_PIN: 'ui-request-pin',\n REQUEST_PASSPHRASE: 'ui-request-passphrase',\n // One-way UI notification: device is waiting for passphrase entry on-device.\n // The prompt response path remains RECEIVE_PASSPHRASE with passphraseOnDevice=true.\n REQUEST_PASSPHRASE_ON_DEVICE: 'ui-request-passphrase-on-device',\n REQUEST_BUTTON: 'ui-request-button',\n REQUEST_QR_DISPLAY: 'ui-request-qr-display',\n REQUEST_QR_SCAN: 'ui-request-qr-scan',\n REQUEST_DEVICE_PERMISSION: 'ui-request-device-permission',\n REQUEST_SELECT_DEVICE: 'ui-request-select-device',\n REQUEST_SAVE_DEVICE_BINDING: 'ui-request-save-device-binding',\n DEVICE_BINDING_STATUS: 'ui-device-binding-status',\n REQUEST_DEVICE_CONNECT: 'ui-request-device-connect',\n // Ledger BTC App: account index >= 100 requires display=true. Adapter asks\n // the user once per session before promoting the call.\n REQUEST_BTC_HIGH_INDEX_CONFIRM: 'ui-request-btc-high-index-confirm',\n // Required app is not installed; with autoInstallApp on, ask the user\n // whether to install it before retrying the operation.\n REQUEST_INSTALL_APP: 'ui-request-install-app',\n REQUEST_PREEMPTION: 'ui-request-preemption',\n REQUEST_TREZOR_THP_PAIRING: 'ui-request-trezor-thp-pairing',\n CLOSE_UI_WINDOW: 'ui-close',\n DEVICE_PROGRESS: 'ui-device_progress',\n FIRMWARE_PROGRESS: 'ui-firmware-progress',\n FIRMWARE_TIP: 'ui-firmware-tip',\n} as const;\n\nexport const UI_RESPONSE = {\n RECEIVE_PIN: 'receive-pin',\n RECEIVE_PASSPHRASE: 'receive-passphrase',\n RECEIVE_QR_RESPONSE: 'receive-qr-response',\n RECEIVE_SELECT_DEVICE: 'receive-select-device',\n RECEIVE_SAVE_DEVICE_BINDING: 'receive-save-device-binding',\n RECEIVE_DEVICE_CONNECT: 'receive-device-connect',\n RECEIVE_DEVICE_PERMISSION: 'receive-device-permission',\n RECEIVE_BTC_HIGH_INDEX_CONFIRM: 'receive-btc-high-index-confirm',\n RECEIVE_INSTALL_APP: 'receive-install-app',\n RECEIVE_PREEMPTION: 'receive-preemption',\n RECEIVE_TREZOR_THP_PAIRING: 'receive-trezor-thp-pairing',\n CANCEL: 'cancel',\n} as const;\n\n/**\n * The operation a UI request was opened under, so a cancel for one operation spares another's\n * prompts. Absent outside any operation (cold start, teardown).\n */\nexport type UiRequestOperationAttribution = {\n operationId?: string;\n};\n\nexport type DevicePermissionDeniedReason =\n | 'bluetoothTurnedOff'\n | 'permissionDenied'\n | (string & Record<never, never>);\n\nexport type DevicePermissionResponse = {\n granted: boolean;\n reason?: DevicePermissionDeniedReason;\n message?: string;\n};\n\n/**\n * `mismatch`: the host's own records do not match the selected device.\n * `skipped`: the host had nothing to bind, a host contract problem rather than a user action.\n *\n * Either way the binding is not saved and `DEVICE_BINDING_STATUS` reports `failed`. The SDK has\n * already checked the device itself, so a business call continues; an explicit `bindBleDevice`\n * fails because saving was its whole purpose. A host that must not use the result has to discard\n * it itself.\n */\nexport type SaveDeviceBindingDeclineReason = 'mismatch' | 'skipped';\n\nexport type UiResponseEvent =\n | {\n type: typeof UI_RESPONSE.RECEIVE_SAVE_DEVICE_BINDING;\n payload: {\n requestId: string;\n saved: boolean;\n reason?: SaveDeviceBindingDeclineReason;\n };\n }\n | {\n type: typeof UI_RESPONSE.RECEIVE_PIN;\n payload: string;\n }\n | {\n type: typeof UI_RESPONSE.RECEIVE_PASSPHRASE;\n payload: {\n value: string;\n passphraseOnDevice?: boolean;\n save?: boolean;\n };\n }\n | {\n type: typeof UI_RESPONSE.RECEIVE_QR_RESPONSE;\n payload: QrResponseData;\n }\n | {\n // sdkConnectId echoes one of the DeviceInfo.connectId values emitted in\n // the REQUEST_SELECT_DEVICE event's `devices` list. Scope is the current\n // search session; may be ephemeral (e.g. Ledger USB DMK UUID).\n type: typeof UI_RESPONSE.RECEIVE_SELECT_DEVICE;\n payload: { requestId?: string } & (\n | { sdkConnectId: string; cancelled?: false }\n | { cancelled: true }\n );\n }\n | {\n type: typeof UI_RESPONSE.RECEIVE_DEVICE_CONNECT;\n payload: { confirmed: boolean };\n }\n | {\n type: typeof UI_RESPONSE.RECEIVE_DEVICE_PERMISSION;\n payload: DevicePermissionResponse;\n }\n | {\n type: typeof UI_RESPONSE.RECEIVE_BTC_HIGH_INDEX_CONFIRM;\n payload: { confirmed: boolean };\n }\n | {\n type: typeof UI_RESPONSE.RECEIVE_INSTALL_APP;\n payload: { confirmed: boolean };\n }\n | {\n type: typeof UI_RESPONSE.RECEIVE_PREEMPTION;\n payload: { confirmed: boolean };\n }\n | {\n type: typeof UI_RESPONSE.RECEIVE_TREZOR_THP_PAIRING;\n payload: {\n selectedMethod?: number | string;\n tag?: string;\n };\n }\n | {\n type: typeof UI_RESPONSE.CANCEL;\n payload?: undefined;\n };\n","import { UI_REQUEST, UI_RESPONSE } from '../events/ui-request';\nimport { HardwareErrorCode, createHwkError } from '../types/errors';\n\n/** 10 min — every UI request is human-in-the-loop; bias toward \"wait long\". */\nexport const UI_REQUEST_DEFAULT_TIMEOUT_MS = 600_000;\n\nconst RESPONSE_TO_REQUEST: Record<string, string> = {\n [UI_RESPONSE.RECEIVE_PIN]: UI_REQUEST.REQUEST_PIN,\n [UI_RESPONSE.RECEIVE_PASSPHRASE]: UI_REQUEST.REQUEST_PASSPHRASE,\n [UI_RESPONSE.RECEIVE_SELECT_DEVICE]: UI_REQUEST.REQUEST_SELECT_DEVICE,\n [UI_RESPONSE.RECEIVE_SAVE_DEVICE_BINDING]: UI_REQUEST.REQUEST_SAVE_DEVICE_BINDING,\n [UI_RESPONSE.RECEIVE_DEVICE_CONNECT]: UI_REQUEST.REQUEST_DEVICE_CONNECT,\n [UI_RESPONSE.RECEIVE_DEVICE_PERMISSION]: UI_REQUEST.REQUEST_DEVICE_PERMISSION,\n [UI_RESPONSE.RECEIVE_BTC_HIGH_INDEX_CONFIRM]: UI_REQUEST.REQUEST_BTC_HIGH_INDEX_CONFIRM,\n [UI_RESPONSE.RECEIVE_INSTALL_APP]: UI_REQUEST.REQUEST_INSTALL_APP,\n [UI_RESPONSE.RECEIVE_PREEMPTION]: UI_REQUEST.REQUEST_PREEMPTION,\n [UI_RESPONSE.RECEIVE_TREZOR_THP_PAIRING]: UI_REQUEST.REQUEST_TREZOR_THP_PAIRING,\n // RECEIVE_QR_RESPONSE maps to QR_DISPLAY or QR_SCAN — resolved dynamically below.\n};\n\nexport const UI_REQUEST_PREEMPTED_TAG = 'UiRequestPreempted';\nexport const UI_REQUEST_CANCELLED_TAG = 'UiRequestCancelled';\nexport const UI_REQUEST_TIMEOUT_TAG = 'UiRequestTimeout';\n\nlet requestSequence = 0;\n\ntype PendingEntry = {\n requestId?: string;\n /** The operation this waiter belongs to, when it was opened under one. */\n operationId?: string;\n resolve: (payload: unknown) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n};\n\n/**\n * Per-type single-slot registry for adapter-level UI requests. A new `wait`\n * of the same type supersedes (rejects) the prior pending entry. With the\n * job queue running globally serially, cross-type collisions don't occur in\n * normal flow — same-type preemption is a defensive measure for callers\n * that fire the same request twice without waiting on the first.\n *\n * Unknown response types are dropped silently so the public `uiResponse`\n * entry never throws.\n */\nexport class UiRequestRegistry {\n private pending = new Map<string, PendingEntry>();\n\n createRequestId(): string {\n requestSequence += 1;\n return `hwk-ui-${Date.now()}-${requestSequence}`;\n }\n\n wait<T = unknown>(\n requestType: string,\n options?: { timeoutMs?: number; requestId?: string; operationId?: string }\n ): Promise<T> {\n const existing = this.pending.get(requestType);\n if (existing) {\n clearTimeout(existing.timer);\n this.pending.delete(requestType);\n existing.reject(\n Object.assign(new Error(`UI request '${requestType}' was superseded by a new request`), {\n _tag: UI_REQUEST_PREEMPTED_TAG,\n })\n );\n }\n\n const timeoutMs = options?.timeoutMs ?? UI_REQUEST_DEFAULT_TIMEOUT_MS;\n\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n if (this.pending.get(requestType)?.timer === timer) {\n this.pending.delete(requestType);\n reject(\n Object.assign(new Error(`UI request '${requestType}' timed out after ${timeoutMs}ms`), {\n _tag: UI_REQUEST_TIMEOUT_TAG,\n })\n );\n }\n }, timeoutMs);\n\n this.pending.set(requestType, {\n requestId: options?.requestId,\n operationId: options?.operationId,\n resolve: resolve as (payload: unknown) => void,\n reject,\n timer,\n });\n });\n }\n\n resolve(responseType: string, payload: unknown): void {\n let requestType = RESPONSE_TO_REQUEST[responseType];\n if (responseType === UI_RESPONSE.RECEIVE_QR_RESPONSE) {\n if (this.pending.has(UI_REQUEST.REQUEST_QR_DISPLAY)) {\n requestType = UI_REQUEST.REQUEST_QR_DISPLAY;\n } else if (this.pending.has(UI_REQUEST.REQUEST_QR_SCAN)) {\n requestType = UI_REQUEST.REQUEST_QR_SCAN;\n }\n }\n if (!requestType) return;\n\n const entry = this.pending.get(requestType);\n if (!entry) return;\n\n const response =\n payload && typeof payload === 'object'\n ? (payload as { requestId?: unknown; cancelled?: unknown })\n : undefined;\n // A late response must not resolve (or cancel) a newer request of the same type.\n if (entry.requestId !== undefined && response?.requestId !== entry.requestId) return;\n clearTimeout(entry.timer);\n this.pending.delete(requestType);\n if (requestType === UI_REQUEST.REQUEST_SELECT_DEVICE && response?.cancelled === true) {\n entry.reject(\n createHwkError({\n code: HardwareErrorCode.UserAborted,\n message: 'Device selection was cancelled',\n _tag: UI_REQUEST_CANCELLED_TAG,\n })\n );\n return;\n }\n entry.resolve(payload);\n }\n\n /**\n * Each argument narrows the cancel: none rejects every waiter (teardown); an `operationId` alone\n * rejects only that operation's prompts and leaves another operation's PIN or QR wait untouched.\n */\n cancel(requestType?: string, requestId?: string, operationId?: string): void {\n const reject = (type: string, entry: PendingEntry) => {\n clearTimeout(entry.timer);\n this.pending.delete(type);\n entry.reject(\n Object.assign(new Error(`UI request '${type}' was cancelled`), {\n _tag: UI_REQUEST_CANCELLED_TAG,\n })\n );\n };\n\n if (requestType) {\n const entry = this.pending.get(requestType);\n if (!entry) return;\n if (requestId !== undefined && entry.requestId !== requestId) return;\n if (operationId !== undefined && entry.operationId !== operationId) return;\n reject(requestType, entry);\n return;\n }\n\n for (const [type, entry] of [...this.pending]) {\n if (operationId === undefined || entry.operationId === operationId) {\n reject(type, entry);\n }\n }\n }\n\n reset(): void {\n this.cancel();\n }\n\n hasPending(requestType?: string): boolean {\n if (requestType) return this.pending.has(requestType);\n return this.pending.size > 0;\n }\n}\n"]}
@@ -0,0 +1,74 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/utils/errorMessages.ts
2
+ function enrichErrorMessage(code, originalMessage) {
3
+ switch (code) {
4
+ case 10400 /* PinInvalid */:
5
+ return `${originalMessage}. Please re-enter your PIN.`;
6
+ case 10401 /* PinCancelled */:
7
+ return `${originalMessage}. PIN entry was cancelled.`;
8
+ case 10404 /* PinMismatch */:
9
+ return `${originalMessage}. The entered PINs do not match. Please try again.`;
10
+ case 10102 /* DeviceBusy */:
11
+ return `${originalMessage}. The device is in use by another application. Close other wallet apps and try again.`;
12
+ case 10111 /* DeviceBusyInternal */:
13
+ return `${originalMessage}. The device is busy. Please try again in a moment.`;
14
+ case 10101 /* DeviceDisconnected */:
15
+ return `${originalMessage}. Please reconnect the device and try again.`;
16
+ case 10103 /* DeviceLocked */:
17
+ return `${originalMessage}. Please unlock your device and try again.`;
18
+ case 10109 /* DeviceOneDeviceOnly */:
19
+ return `${originalMessage}. Disconnect the extra device and try again.`;
20
+ case 10001 /* UserRejected */:
21
+ return `${originalMessage}. The request was rejected on the device.`;
22
+ case 10501 /* WrongApp */:
23
+ return `${originalMessage}. Please open the correct app on your device.`;
24
+ case 10500 /* AppNotInstalled */:
25
+ return `${originalMessage}. The required app is not installed on the device.`;
26
+ case 10503 /* DeviceOutOfMemory */:
27
+ return `${originalMessage}. Not enough free space on the device. Please uninstall some apps and try again.`;
28
+ case 10302 /* TransportNotAvailable */:
29
+ return `${originalMessage}. Ensure the device bridge/transport is available and running.`;
30
+ case 10305 /* NetworkError */:
31
+ return `${originalMessage}. Network error \u2014 check your internet connection and try again.`;
32
+ case 10311 /* LedgerSecureChannelError */:
33
+ return `${originalMessage}. The secure connection to Ledger's servers was interrupted. Keep the device unlocked on the dashboard and try again.`;
34
+ case 10312 /* LedgerFirmwareMetadataError */:
35
+ return `${originalMessage}. Ledger's app catalog returned an unusable response. Please try again later.`;
36
+ case 10504 /* AppAlreadyInstalled */:
37
+ return `${originalMessage}. The app is already installed on the device.`;
38
+ case 10200 /* FirmwareTooOld */:
39
+ return `${originalMessage}. Please update your device firmware.`;
40
+ case 10104 /* DeviceNotInitialized */:
41
+ return `${originalMessage}. The device may need to be set up first.`;
42
+ case 10003 /* OperationTimeout */:
43
+ return `${originalMessage}. The operation timed out. Please try again.`;
44
+ case 11e3 /* EvmBlindSigningRequired */:
45
+ return "Ledger: Blind signing not enabled in Ethereum app.";
46
+ case 11001 /* EvmClearSignPluginMissing */:
47
+ return "Ledger: Required plugin not installed (install via Ledger Live).";
48
+ case 11002 /* EvmDataTooLarge */:
49
+ return "Ledger: Transaction data too large for device memory.";
50
+ case 11003 /* EvmTxTypeNotSupported */:
51
+ return "Ledger: Transaction type not supported by current Ethereum app.";
52
+ case 10502 /* AppTooOld */:
53
+ return "Ledger: App out of date (update via Ledger Live).";
54
+ case 11100 /* SolanaBlindSigningRequired */:
55
+ return "Blind signing disabled in the Solana app.";
56
+ case 11200 /* TronCustomContractRequired */:
57
+ return "Custom Contracts setting disabled in the Tron app.";
58
+ case 11201 /* TronDataSigningRequired */:
59
+ return "Transactions Data setting disabled in the Tron app.";
60
+ case 11202 /* TronSignByHashRequired */:
61
+ return "Sign by Hash setting disabled in the Tron app.";
62
+ case 11300 /* BtcWalletPolicyHmacMismatch */:
63
+ return "Wallet policy not registered or HMAC mismatch.";
64
+ case 11301 /* BtcUnexpectedState */:
65
+ return "Signing aborted due to unexpected device state.";
66
+ default:
67
+ return originalMessage;
68
+ }
69
+ }
70
+
71
+
72
+
73
+ exports.enrichErrorMessage = enrichErrorMessage;
74
+ //# sourceMappingURL=chunk-YLCHSNXO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/hardware-js-sdk/hardware-js-sdk/packages/hwk-adapter-core/dist/chunk-YLCHSNXO.js","../src/utils/errorMessages.ts"],"names":[],"mappings":"AAAA;ACMO,SAAS,kBAAA,CAAmB,IAAA,EAAyB,eAAA,EAAiC;AAC3F,EAAA,OAAA,CAAQ,IAAA,EAAM;AAAA,IACZ,KAAA,sBAAA;AACE,MAAA,OAAO,CAAA,EAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACT,IAAA;AACS,MAAA;AACX,EAAA;AACF;ADJc;AACA;AACA;AACA","file":"/home/runner/work/hardware-js-sdk/hardware-js-sdk/packages/hwk-adapter-core/dist/chunk-YLCHSNXO.js","sourcesContent":[null,"import { HardwareErrorCode } from '../types/errors';\n\n/**\n * Enrich a hardware error message with actionable recovery hints.\n * Shared across adapters (Ledger, Trezor, etc.).\n */\nexport function enrichErrorMessage(code: HardwareErrorCode, originalMessage: string): string {\n switch (code) {\n case HardwareErrorCode.PinInvalid:\n return `${originalMessage}. Please re-enter your PIN.`;\n case HardwareErrorCode.PinCancelled:\n return `${originalMessage}. PIN entry was cancelled.`;\n case HardwareErrorCode.PinMismatch:\n return `${originalMessage}. The entered PINs do not match. Please try again.`;\n case HardwareErrorCode.DeviceBusy:\n return `${originalMessage}. The device is in use by another application. Close other wallet apps and try again.`;\n case HardwareErrorCode.DeviceBusyInternal:\n return `${originalMessage}. The device is busy. Please try again in a moment.`;\n case HardwareErrorCode.DeviceDisconnected:\n return `${originalMessage}. Please reconnect the device and try again.`;\n case HardwareErrorCode.DeviceLocked:\n return `${originalMessage}. Please unlock your device and try again.`;\n case HardwareErrorCode.DeviceOneDeviceOnly:\n return `${originalMessage}. Disconnect the extra device and try again.`;\n case HardwareErrorCode.UserRejected:\n return `${originalMessage}. The request was rejected on the device.`;\n case HardwareErrorCode.WrongApp:\n return `${originalMessage}. Please open the correct app on your device.`;\n case HardwareErrorCode.AppNotInstalled:\n return `${originalMessage}. The required app is not installed on the device.`;\n case HardwareErrorCode.DeviceOutOfMemory:\n return `${originalMessage}. Not enough free space on the device. Please uninstall some apps and try again.`;\n case HardwareErrorCode.TransportNotAvailable:\n return `${originalMessage}. Ensure the device bridge/transport is available and running.`;\n case HardwareErrorCode.NetworkError:\n return `${originalMessage}. Network error — check your internet connection and try again.`;\n case HardwareErrorCode.LedgerSecureChannelError:\n return `${originalMessage}. The secure connection to Ledger's servers was interrupted. Keep the device unlocked on the dashboard and try again.`;\n case HardwareErrorCode.LedgerFirmwareMetadataError:\n return `${originalMessage}. Ledger's app catalog returned an unusable response. Please try again later.`;\n case HardwareErrorCode.AppAlreadyInstalled:\n return `${originalMessage}. The app is already installed on the device.`;\n case HardwareErrorCode.FirmwareTooOld:\n return `${originalMessage}. Please update your device firmware.`;\n case HardwareErrorCode.DeviceNotInitialized:\n return `${originalMessage}. The device may need to be set up first.`;\n case HardwareErrorCode.OperationTimeout:\n return `${originalMessage}. The operation timed out. Please try again.`;\n case HardwareErrorCode.EvmBlindSigningRequired:\n return 'Ledger: Blind signing not enabled in Ethereum app.';\n case HardwareErrorCode.EvmClearSignPluginMissing:\n return 'Ledger: Required plugin not installed (install via Ledger Live).';\n case HardwareErrorCode.EvmDataTooLarge:\n return 'Ledger: Transaction data too large for device memory.';\n case HardwareErrorCode.EvmTxTypeNotSupported:\n return 'Ledger: Transaction type not supported by current Ethereum app.';\n case HardwareErrorCode.AppTooOld:\n return 'Ledger: App out of date (update via Ledger Live).';\n case HardwareErrorCode.SolanaBlindSigningRequired:\n return 'Blind signing disabled in the Solana app.';\n case HardwareErrorCode.TronCustomContractRequired:\n return 'Custom Contracts setting disabled in the Tron app.';\n case HardwareErrorCode.TronDataSigningRequired:\n return 'Transactions Data setting disabled in the Tron app.';\n case HardwareErrorCode.TronSignByHashRequired:\n return 'Sign by Hash setting disabled in the Tron app.';\n case HardwareErrorCode.BtcWalletPolicyHmacMismatch:\n return 'Wallet policy not registered or HMAC mismatch.';\n case HardwareErrorCode.BtcUnexpectedState:\n return 'Signing aborted due to unexpected device state.';\n default:\n return originalMessage;\n }\n}\n"]}