@onekeyfe/hd-core 1.1.18 → 1.1.19-alpha.1

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 (102) hide show
  1. package/dist/api/BaseMethod.d.ts +9 -4
  2. package/dist/api/BaseMethod.d.ts.map +1 -1
  3. package/dist/api/CheckAllFirmwareRelease.d.ts +1 -1
  4. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  5. package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
  6. package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
  7. package/dist/api/FirmwareUpdate.d.ts +1 -1
  8. package/dist/api/FirmwareUpdate.d.ts.map +1 -1
  9. package/dist/api/FirmwareUpdateV2.d.ts +3 -2
  10. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  11. package/dist/api/FirmwareUpdateV3.d.ts +2 -2
  12. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  13. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts +2 -2
  14. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  15. package/dist/api/device/DeviceFullyUploadResource.d.ts.map +1 -1
  16. package/dist/api/device/DeviceUpdateBootloader.d.ts +6 -1
  17. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  18. package/dist/api/firmware/getBinary.d.ts +6 -3
  19. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  20. package/dist/api/firmware/releaseHelper.d.ts +7 -2
  21. package/dist/api/firmware/releaseHelper.d.ts.map +1 -1
  22. package/dist/api/firmware/updateBootloader.d.ts +7 -2
  23. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  24. package/dist/api/firmware/uploadFirmware.d.ts +4 -4
  25. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  26. package/dist/api/sui/SuiSignTransaction.d.ts +1 -1
  27. package/dist/api/sui/SuiSignTransaction.d.ts.map +1 -1
  28. package/dist/core/index.d.ts +3 -0
  29. package/dist/core/index.d.ts.map +1 -1
  30. package/dist/data-manager/DataManager.d.ts +16 -9
  31. package/dist/data-manager/DataManager.d.ts.map +1 -1
  32. package/dist/device/Device.d.ts +5 -2
  33. package/dist/device/Device.d.ts.map +1 -1
  34. package/dist/device/DeviceCommands.d.ts +6 -4
  35. package/dist/device/DeviceCommands.d.ts.map +1 -1
  36. package/dist/events/device.d.ts +2 -2
  37. package/dist/events/device.d.ts.map +1 -1
  38. package/dist/index.d.ts +96 -28
  39. package/dist/index.js +543 -132
  40. package/dist/types/api/checkAllFirmwareRelease.d.ts +5 -1
  41. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  42. package/dist/types/api/checkBootloaderRelease.d.ts +5 -2
  43. package/dist/types/api/checkBootloaderRelease.d.ts.map +1 -1
  44. package/dist/types/api/checkFirmwareRelease.d.ts +6 -2
  45. package/dist/types/api/checkFirmwareRelease.d.ts.map +1 -1
  46. package/dist/types/api/deviceFullyUploadResource.d.ts +6 -1
  47. package/dist/types/api/deviceFullyUploadResource.d.ts.map +1 -1
  48. package/dist/types/api/deviceUpdateBootloader.d.ts +6 -3
  49. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  50. package/dist/types/api/firmwareUpdate.d.ts +3 -1
  51. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  52. package/dist/types/api/index.d.ts +128 -128
  53. package/dist/types/api/index.d.ts.map +1 -1
  54. package/dist/types/device.d.ts +4 -1
  55. package/dist/types/device.d.ts.map +1 -1
  56. package/dist/types/settings.d.ts +3 -0
  57. package/dist/types/settings.d.ts.map +1 -1
  58. package/dist/utils/deviceFeaturesUtils.d.ts +7 -5
  59. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  60. package/dist/utils/index.d.ts +1 -0
  61. package/dist/utils/index.d.ts.map +1 -1
  62. package/dist/utils/patch.d.ts +1 -1
  63. package/dist/utils/patch.d.ts.map +1 -1
  64. package/dist/utils/release.d.ts +1 -1
  65. package/dist/utils/release.d.ts.map +1 -1
  66. package/dist/utils/tracing.d.ts +34 -0
  67. package/dist/utils/tracing.d.ts.map +1 -0
  68. package/package.json +4 -4
  69. package/src/api/BaseMethod.ts +55 -8
  70. package/src/api/CheckAllFirmwareRelease.ts +14 -6
  71. package/src/api/CheckBootloaderRelease.ts +13 -2
  72. package/src/api/CheckFirmwareRelease.ts +9 -2
  73. package/src/api/FirmwareUpdate.ts +7 -5
  74. package/src/api/FirmwareUpdateV2.ts +26 -14
  75. package/src/api/FirmwareUpdateV3.ts +31 -18
  76. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +56 -26
  77. package/src/api/device/DeviceFullyUploadResource.ts +8 -2
  78. package/src/api/device/DeviceUpdateBootloader.ts +21 -5
  79. package/src/api/firmware/getBinary.ts +15 -4
  80. package/src/api/firmware/releaseHelper.ts +22 -11
  81. package/src/api/firmware/updateBootloader.ts +17 -9
  82. package/src/api/firmware/uploadFirmware.ts +51 -15
  83. package/src/api/sui/SuiSignTransaction.ts +7 -1
  84. package/src/core/index.ts +111 -8
  85. package/src/data/messages/messages.json +11 -1
  86. package/src/data-manager/DataManager.ts +126 -22
  87. package/src/device/Device.ts +24 -3
  88. package/src/device/DeviceCommands.ts +42 -8
  89. package/src/events/device.ts +2 -2
  90. package/src/types/api/checkAllFirmwareRelease.ts +5 -1
  91. package/src/types/api/checkBootloaderRelease.ts +7 -3
  92. package/src/types/api/checkFirmwareRelease.ts +10 -2
  93. package/src/types/api/deviceFullyUploadResource.ts +7 -1
  94. package/src/types/api/deviceUpdateBootloader.ts +8 -4
  95. package/src/types/api/firmwareUpdate.ts +4 -1
  96. package/src/types/api/index.ts +128 -161
  97. package/src/types/device.ts +7 -1
  98. package/src/types/settings.ts +37 -0
  99. package/src/utils/deviceFeaturesUtils.ts +22 -10
  100. package/src/utils/index.ts +1 -0
  101. package/src/utils/release.ts +2 -1
  102. package/src/utils/tracing.ts +251 -0
@@ -1,16 +1,17 @@
1
1
  import ByteBuffer from 'bytebuffer';
2
2
  import semver from 'semver';
3
+ import type { EFirmwareType } from '@onekeyfe/hd-shared';
3
4
  import { DeviceModelToTypes, Features } from '../../types';
4
5
  import { getDeviceType, getDeviceBootloaderVersion, getDeviceFirmwareVersion } from '../../utils';
5
6
  import { DataManager } from '../../data-manager';
6
7
  import { shouldUpdateBootloaderForClassicAndMini } from './bootloaderHelper';
7
8
 
8
- export function checkNeedUpdateBootForTouch(features: Features) {
9
+ export function checkNeedUpdateBootForTouch(features: Features, firmwareType: EFirmwareType) {
9
10
  const deviceType = getDeviceType(features);
10
11
  if (!DeviceModelToTypes.model_touch.includes(deviceType)) return false;
11
12
  const currentVersion = getDeviceFirmwareVersion(features).join('.');
12
13
  const bootloaderVersion = getDeviceBootloaderVersion(features).join('.');
13
- const targetBootloaderVersion = DataManager.getBootloaderTargetVersion(features);
14
+ const targetBootloaderVersion = DataManager.getBootloaderTargetVersion(features, firmwareType);
14
15
  if (!targetBootloaderVersion) return false;
15
16
 
16
17
  return (
@@ -23,22 +24,29 @@ export function checkNeedUpdateBootForTouch(features: Features) {
23
24
  );
24
25
  }
25
26
 
26
- export function checkNeedUpdateBootForClassicAndMini(
27
- features: Features,
28
- willUpdateFirmware?: string
29
- ) {
27
+ export function checkNeedUpdateBootForClassicAndMini({
28
+ features,
29
+ willUpdateFirmware,
30
+ firmwareType,
31
+ }: {
32
+ features: Features;
33
+ willUpdateFirmware?: string;
34
+ firmwareType: EFirmwareType;
35
+ }) {
30
36
  const deviceType = getDeviceType(features);
31
37
  if (!DeviceModelToTypes.model_mini.includes(deviceType)) return false;
32
38
  if (!willUpdateFirmware) return false;
33
39
  const currentVersion = getDeviceFirmwareVersion(features).join('.');
34
40
  const bootloaderVersion = getDeviceBootloaderVersion(features).join('.');
35
- const targetBootloaderVersion = DataManager.getBootloaderTargetVersion(features);
41
+ const targetBootloaderVersion = DataManager.getBootloaderTargetVersion(features, firmwareType);
36
42
  if (targetBootloaderVersion && semver.gte(bootloaderVersion, targetBootloaderVersion.join('.'))) {
37
43
  return false;
38
44
  }
39
45
 
40
- const bootloaderRelatedFirmwareVersion =
41
- DataManager.getBootloaderRelatedFirmwareVersion(features);
46
+ const bootloaderRelatedFirmwareVersion = DataManager.getBootloaderRelatedFirmwareVersion(
47
+ features,
48
+ firmwareType
49
+ );
42
50
  if (!bootloaderRelatedFirmwareVersion) return false;
43
51
 
44
52
  return shouldUpdateBootloaderForClassicAndMini({
@@ -2,29 +2,27 @@ import semver from 'semver';
2
2
  import { blake2s } from '@noble/hashes/blake2s';
3
3
  import JSZip from 'jszip';
4
4
  import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
5
- import { Success } from '@onekeyfe/hd-transport';
5
+
6
6
  import {
7
- wait,
7
+ LoggerNames,
8
8
  getDeviceBootloaderVersion,
9
9
  getDeviceType,
10
- LoggerNames,
11
10
  getLogger,
11
+ wait,
12
12
  } from '../../utils';
13
- import {
14
- DEVICE,
15
- CoreMessage,
16
- createUiMessage,
17
- UI_REQUEST,
18
- IFirmwareUpdateProgressType,
19
- } from '../../events';
20
- import { PROTO } from '../../constants';
21
- import type { Device } from '../../device/Device';
22
- import type { TypedCall, TypedResponseMessage } from '../../device/DeviceCommands';
23
- import { DeviceModelToTypes, KnownDevice } from '../../types';
13
+ import { DEVICE, UI_REQUEST, createUiMessage } from '../../events';
14
+ import { DeviceModelToTypes } from '../../types';
24
15
  import { bytesToHex } from '../helpers/hexUtils';
25
16
  import { DataManager } from '../../data-manager';
26
17
  import { DevicePool } from '../../device/DevicePool';
27
18
 
19
+ import type { KnownDevice } from '../../types';
20
+ import type { TypedCall, TypedResponseMessage } from '../../device/DeviceCommands';
21
+ import type { PROTO } from '../../constants';
22
+ import type { CoreMessage, IFirmwareUpdateProgressType } from '../../events';
23
+ import type { Success } from '@onekeyfe/hd-transport';
24
+ import type { Device } from '../../device/Device';
25
+
28
26
  const NEW_BOOT_UPRATE_FIRMWARE_VERSION = '2.4.5';
29
27
  const SESSION_ERROR = 'session not found';
30
28
  const FIRMWARE_UPDATE_CONFIRM = 'Firmware install confirmed';
@@ -111,7 +109,45 @@ export const uploadFirmware = async (
111
109
  if (DeviceModelToTypes.model_mini.includes(deviceType)) {
112
110
  postConfirmationMessage(device);
113
111
  postProgressTip(device, 'ConfirmOnDevice', postMessage);
114
- const eraseCommand = updateType === 'firmware' ? 'FirmwareErase' : 'FirmwareErase_ex';
112
+ const isFirmware = updateType === 'firmware';
113
+
114
+ const deviceBootloaderVersion = getDeviceBootloaderVersion(device.features).join('.');
115
+ const supportUpgradeFileHeader = semver.gt(deviceBootloaderVersion, '2.1.0');
116
+
117
+ Log.debug(
118
+ 'supportUpgradeFileHeader:',
119
+ supportUpgradeFileHeader,
120
+ 'deviceBootloaderVersion:',
121
+ deviceBootloaderVersion
122
+ );
123
+ if (isFirmware && supportUpgradeFileHeader) {
124
+ // Extract and validate firmware header (first 1KB)
125
+ const HEADER_SIZE = 1024;
126
+ if (payload.byteLength < HEADER_SIZE) {
127
+ throw ERRORS.TypedError(
128
+ HardwareErrorCode.RuntimeError,
129
+ `firmware payload too small: ${payload.byteLength} bytes, expected at least ${HEADER_SIZE} bytes`
130
+ );
131
+ }
132
+
133
+ Log.debug('Uploading firmware header:', { size: HEADER_SIZE, totalSize: payload.byteLength });
134
+ postProgressTip(device, 'UploadingFirmwareHeader', postMessage);
135
+
136
+ const header = new Uint8Array(payload.slice(0, HEADER_SIZE));
137
+ const headerRes = (await typedCall('UpgradeFileHeader', 'Success', {
138
+ data: bytesToHex(header),
139
+ })) as TypedResponseMessage<'Success'>;
140
+
141
+ const isUnexpectedMessage = headerRes.message?.message?.includes('Failure_UnexpectedMessage');
142
+ if (headerRes.type !== 'Success' && !isUnexpectedMessage) {
143
+ Log.error('Firmware header upload failed:', headerRes);
144
+ throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'failed to upload firmware header');
145
+ }
146
+
147
+ Log.debug('Firmware header uploaded successfully, isUnexpectedMessage:', isUnexpectedMessage);
148
+ }
149
+
150
+ const eraseCommand = isFirmware ? 'FirmwareErase' : 'FirmwareErase_ex';
115
151
  const eraseRes = await typedCall(eraseCommand as unknown as any, 'Success', {});
116
152
  if (eraseRes.type !== 'Success') {
117
153
  throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'erase firmware error');
@@ -1,6 +1,6 @@
1
- import { SuiSignTx as HardwareSuiSignTx, TypedCall, SuiSignedTx } from '@onekeyfe/hd-transport';
2
1
  import semver from 'semver';
3
2
  import { bytesToHex } from '@noble/hashes/utils';
3
+
4
4
  import { UI_REQUEST } from '../../constants/ui-request';
5
5
  import { validatePath } from '../helpers/pathUtils';
6
6
  import { BaseMethod } from '../BaseMethod';
@@ -8,6 +8,12 @@ import { validateParams } from '../helpers/paramsValidator';
8
8
  import { formatAnyHex } from '../helpers/hexUtils';
9
9
  import { getDeviceFirmwareVersion, getDeviceType } from '../../utils';
10
10
  import { DeviceModelToTypes } from '../../types';
11
+
12
+ import type {
13
+ SuiSignTx as HardwareSuiSignTx,
14
+ SuiSignedTx,
15
+ TypedCall,
16
+ } from '@onekeyfe/hd-transport';
11
17
  import type { TypedResponseMessage } from '../../device/DeviceCommands';
12
18
 
13
19
  type SuiSignTx = Omit<HardwareSuiSignTx, 'data_initial_chunk' | 'data_length'> & HardwareSuiSignTx;
package/src/core/index.ts CHANGED
@@ -22,12 +22,23 @@ import {
22
22
  setLoggerPostMessage,
23
23
  wait,
24
24
  getMethodVersionRange,
25
+ getFirmwareType,
25
26
  } from '../utils';
26
27
  import {
27
28
  findDefectiveBatchDevice,
28
29
  getDefectiveDeviceInfo,
29
30
  } from '../utils/findDefectiveBatchDevice';
30
31
  import { supportNewPassphrase } from '../utils/deviceFeaturesUtils';
32
+ import {
33
+ completeRequestContext,
34
+ createRequestContext,
35
+ createSdkTracingContext,
36
+ formatRequestContext,
37
+ getActiveRequestsByDeviceInstance,
38
+ SdkTracingContext,
39
+ updateRequestContext,
40
+ cleanupSdkInstance,
41
+ } from '../utils/tracing';
31
42
  import { Device, DeviceEvents, InitOptions, RunOptions } from '../device/Device';
32
43
  import { DeviceList } from '../device/DeviceList';
33
44
  import { DevicePool } from '../device/DevicePool';
@@ -96,6 +107,30 @@ let preConnectCache: {
96
107
  passphraseState: undefined,
97
108
  };
98
109
 
110
+ const toError = (error: unknown): Error | undefined => {
111
+ if (error instanceof Error) return error;
112
+ if (error == null) return undefined;
113
+ if (typeof error === 'string') return new Error(error);
114
+ try {
115
+ return new Error(JSON.stringify(error));
116
+ } catch {
117
+ return new Error(String(error));
118
+ }
119
+ };
120
+
121
+ const updateMethodRequestContext = (method: BaseMethod, updates: any) => {
122
+ if (method.requestContext) {
123
+ updateRequestContext(method.requestContext.responseID, updates);
124
+ }
125
+ };
126
+
127
+ const completeMethodRequestContext = (method: BaseMethod, error?: unknown) => {
128
+ if (!method.requestContext) {
129
+ return;
130
+ }
131
+ completeRequestContext(method.requestContext.responseID, toError(error));
132
+ };
133
+
99
134
  export const callAPI = async (context: CoreContext, message: CoreMessage) => {
100
135
  if (!message.id || !message.payload || message.type !== IFRAME.CALL) {
101
136
  return Promise.reject(ERRORS.TypedError('on call: message.id or message.payload is missing'));
@@ -107,6 +142,15 @@ export const callAPI = async (context: CoreContext, message: CoreMessage) => {
107
142
  method = findMethod(message as IFrameCallMessage);
108
143
  method.connector = _connector;
109
144
  method.postMessage = postMessage;
145
+ method.setContext?.(context);
146
+
147
+ method.requestContext = createRequestContext(method.responseID, method.name, {
148
+ sdkInstanceId: context.sdkInstanceId,
149
+ connectId: method.connectId,
150
+ });
151
+
152
+ Log.debug(`[${context.sdkInstanceId}] callAPI: ${formatRequestContext(method.requestContext)}`);
153
+
110
154
  method.init();
111
155
  } catch (error) {
112
156
  return Promise.reject(error);
@@ -115,10 +159,13 @@ export const callAPI = async (context: CoreContext, message: CoreMessage) => {
115
159
  DevicePool.emitter.on(DEVICE.CONNECT, onDeviceConnectHandler);
116
160
 
117
161
  if (!method.useDevice) {
162
+ updateMethodRequestContext(method, { status: 'running' });
118
163
  try {
119
164
  const response = await method.run();
165
+ completeMethodRequestContext(method);
120
166
  return createResponseMessage(method.responseID, true, response);
121
167
  } catch (error) {
168
+ completeMethodRequestContext(method, error);
122
169
  return createResponseMessage(method.responseID, false, { error });
123
170
  }
124
171
  }
@@ -190,6 +237,8 @@ const onCallDevice = async (
190
237
 
191
238
  const { requestQueue, getPrePendingCallPromise, setPrePendingCallPromise } = context;
192
239
 
240
+ updateMethodRequestContext(method, { status: 'running' });
241
+
193
242
  const connectStateChange = preConnectCache.passphraseState !== method.payload.passphraseState;
194
243
 
195
244
  preConnectCache = {
@@ -224,6 +273,8 @@ const onCallDevice = async (
224
273
  } catch (e) {
225
274
  console.log('ensureConnected error: ', e);
226
275
 
276
+ completeMethodRequestContext(method, e);
277
+
227
278
  if (e.name === 'AbortError' || e.message === 'Request aborted') {
228
279
  requestQueue.releaseTask(method.responseID);
229
280
  return createResponseMessage(method.responseID, false, {
@@ -238,6 +289,19 @@ const onCallDevice = async (
238
289
  method.setDevice?.(device);
239
290
  method.context = context;
240
291
 
292
+ updateMethodRequestContext(method, {
293
+ deviceInstanceId: device.instanceId,
294
+ commandsInstanceId: device.commands?.instanceId,
295
+ });
296
+
297
+ const activeRequests = getActiveRequestsByDeviceInstance(device.instanceId);
298
+ if (activeRequests.length > 0) {
299
+ Log.warn(
300
+ `[${method.instanceId}] Device ${device.instanceId} has ${activeRequests.length} active requests:`,
301
+ activeRequests.map(formatRequestContext)
302
+ );
303
+ }
304
+
241
305
  device.on(DEVICE.PIN, onDevicePinHandler);
242
306
  device.on(DEVICE.BUTTON, onDeviceButtonHandler);
243
307
  device.on(
@@ -282,7 +346,8 @@ const onCallDevice = async (
282
346
  }
283
347
  }
284
348
 
285
- const newVersionStatus = DataManager.getFirmwareStatus(device.features);
349
+ const deviceFirmwareType = getFirmwareType(device.features);
350
+ const newVersionStatus = DataManager.getFirmwareStatus(device.features, deviceFirmwareType);
286
351
  const bleVersionStatus = DataManager.getBLEFirmwareStatus(device.features);
287
352
 
288
353
  const currentFirmwareVersion = getDeviceFirmwareVersion(device.features).join('.');
@@ -450,10 +515,12 @@ const onCallDevice = async (
450
515
  Log.debug('Call API - Inner Method Run: ');
451
516
  messageResponse = createResponseMessage(method.responseID, true, response);
452
517
  requestQueue.resolveRequest(method.responseID, messageResponse);
518
+ completeMethodRequestContext(method);
453
519
  } catch (error) {
454
- Log.debug('Call API - Inner Method Run Error: ', error);
520
+ Log.debug(`Call API - Inner Method Run Error`, error);
455
521
  messageResponse = createResponseMessage(method.responseID, false, { error });
456
522
  requestQueue.resolveRequest(method.responseID, messageResponse);
523
+ completeMethodRequestContext(method, error);
457
524
  }
458
525
  };
459
526
  Log.debug('Call API - Device Run: ', device.mainId);
@@ -469,6 +536,7 @@ const onCallDevice = async (
469
536
  return await task.callPromise.promise;
470
537
  } catch (e) {
471
538
  Log.debug('Device Run Error: ', e);
539
+ completeMethodRequestContext(method, e);
472
540
  return createResponseMessage(method.responseID, false, { error: e });
473
541
  }
474
542
  } catch (error) {
@@ -478,6 +546,7 @@ const onCallDevice = async (
478
546
  ERRORS.TypedError(HardwareErrorCode.CallMethodError, error.message)
479
547
  );
480
548
  Log.debug('Call API - Run Error: ', error);
549
+ completeMethodRequestContext(method, error);
481
550
  } finally {
482
551
  const response = messageResponse;
483
552
 
@@ -505,7 +574,20 @@ const onCallDevice = async (
505
574
 
506
575
  cleanup();
507
576
 
508
- removeDeviceListener(device);
577
+ if (device) {
578
+ const stillActive = getActiveRequestsByDeviceInstance(device.instanceId);
579
+ if (stillActive.length > 1) {
580
+ Log.warn(
581
+ `[${method.instanceId}] Removing listeners while ${stillActive.length} requests are active!`,
582
+ {
583
+ deviceInstanceId: device.instanceId,
584
+ activeRequests: stillActive.map(formatRequestContext),
585
+ pinListeners: device.listenerCount(DEVICE.PIN),
586
+ }
587
+ );
588
+ }
589
+ removeDeviceListener(device);
590
+ }
509
591
  }
510
592
  };
511
593
 
@@ -585,7 +667,10 @@ function initDeviceForBle(method: BaseMethod) {
585
667
  if (deviceCacheMap.has(method.connectId)) {
586
668
  device = deviceCacheMap.get(method.connectId) as Device;
587
669
  } else {
588
- device = Device.fromDescriptor({ id: method.connectId } as OneKeyDeviceInfo);
670
+ device = Device.fromDescriptor(
671
+ { id: method.connectId } as OneKeyDeviceInfo,
672
+ method.sdkInstanceId
673
+ );
589
674
  deviceCacheMap.set(method.connectId, device);
590
675
  }
591
676
  device.deviceConnector = _connector;
@@ -640,7 +725,7 @@ const ensureConnected = async (
640
725
  if (timer) {
641
726
  clearTimeout(timer);
642
727
  }
643
- reject(ERRORS.TypedError(HardwareErrorCode.ActionCancelled));
728
+ reject(ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled));
644
729
  return true;
645
730
  }
646
731
  return false;
@@ -804,7 +889,7 @@ export const cancel = (context: CoreContext, connectId?: string) => {
804
889
  }
805
890
  requestQueue.rejectRequest(
806
891
  requestId,
807
- ERRORS.TypedError(HardwareErrorCode.ActionCancelled)
892
+ ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled)
808
893
  );
809
894
  }
810
895
  }
@@ -829,7 +914,7 @@ export const cancel = (context: CoreContext, connectId?: string) => {
829
914
 
830
915
  requestQueue.rejectRequest(
831
916
  requestId,
832
- ERRORS.TypedError(HardwareErrorCode.ActionCancelled)
917
+ ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled)
833
918
  );
834
919
  }
835
920
  }
@@ -842,7 +927,10 @@ export const cancel = (context: CoreContext, connectId?: string) => {
842
927
  });
843
928
 
844
929
  requestQueue.getRequestTasksId().forEach(requestId => {
845
- requestQueue.rejectRequest(requestId, ERRORS.TypedError(HardwareErrorCode.ActionCancelled));
930
+ requestQueue.rejectRequest(
931
+ requestId,
932
+ ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled)
933
+ );
846
934
  });
847
935
  }
848
936
  }
@@ -1021,6 +1109,10 @@ const removeUiPromise = (promise: Deferred<any>) => {
1021
1109
  };
1022
1110
 
1023
1111
  export default class Core extends EventEmitter {
1112
+ private tracingContext: SdkTracingContext;
1113
+
1114
+ public readonly sdkInstanceId: string;
1115
+
1024
1116
  private requestQueue = new RequestQueue();
1025
1117
 
1026
1118
  // background task
@@ -1028,8 +1120,17 @@ export default class Core extends EventEmitter {
1028
1120
 
1029
1121
  private methodSynchronize = getSynchronize();
1030
1122
 
1123
+ constructor() {
1124
+ super();
1125
+ this.tracingContext = createSdkTracingContext();
1126
+ this.sdkInstanceId = this.tracingContext.sdkInstanceId;
1127
+ Log.debug(`[Core] Created SDK instance: ${this.sdkInstanceId}`);
1128
+ }
1129
+
1031
1130
  private getCoreContext() {
1032
1131
  return {
1132
+ sdkInstanceId: this.sdkInstanceId,
1133
+ tracingContext: this.tracingContext,
1033
1134
  requestQueue: this.requestQueue,
1034
1135
  methodSynchronize: this.methodSynchronize,
1035
1136
  getPrePendingCallPromise: () => this.prePendingCallPromise,
@@ -1107,6 +1208,8 @@ export default class Core extends EventEmitter {
1107
1208
  dispose() {
1108
1209
  _deviceList = undefined;
1109
1210
  _connector = undefined;
1211
+ Log.debug(`[Core] Disposing SDK instance: ${this.sdkInstanceId}`);
1212
+ cleanupSdkInstance(this.sdkInstanceId);
1110
1213
  }
1111
1214
  }
1112
1215
 
@@ -1997,6 +1997,15 @@
1997
1997
  }
1998
1998
  }
1999
1999
  },
2000
+ "UpgradeFileHeader": {
2001
+ "fields": {
2002
+ "data": {
2003
+ "rule": "required",
2004
+ "type": "bytes",
2005
+ "id": 1
2006
+ }
2007
+ }
2008
+ },
2000
2009
  "CardanoDerivationType": {
2001
2010
  "values": {
2002
2011
  "LEDGER": 0,
@@ -12397,7 +12406,8 @@
12397
12406
  "MessageType_GetPassphraseState": 10028,
12398
12407
  "MessageType_PassphraseState": 10029,
12399
12408
  "MessageType_UnLockDevice": 10030,
12400
- "MessageType_UnLockDeviceResponse": 10031
12409
+ "MessageType_UnLockDeviceResponse": 10031,
12410
+ "MessageType_UpgradeFileHeader": 10050
12401
12411
  }
12402
12412
  },
12403
12413
  "google": {