@onekeyfe/hd-core 1.2.0-alpha.3 → 1.2.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/__tests__/preInitialize.test.ts +33 -0
  2. package/__tests__/protocol-v2.test.ts +1377 -480
  3. package/dist/api/FileRead.d.ts.map +1 -1
  4. package/dist/api/FileWrite.d.ts.map +1 -1
  5. package/dist/api/FirmwareUpdateV4.d.ts +20 -2
  6. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  7. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  8. package/dist/api/firmware/getBinary.d.ts +4 -0
  9. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  10. package/dist/api/index.d.ts +5 -10
  11. package/dist/api/index.d.ts.map +1 -1
  12. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts +6 -0
  13. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts.map +1 -0
  14. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts +7 -0
  15. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts.map +1 -0
  16. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts +1 -1
  17. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts.map +1 -1
  18. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts +1 -1
  19. package/dist/api/protocol-v2/{DeviceGetDeviceInfo.d.ts → DeviceInfoGet.d.ts} +10 -10
  20. package/dist/api/protocol-v2/DeviceInfoGet.d.ts.map +1 -0
  21. package/dist/api/protocol-v2/{FilesystemFixPermission.d.ts → FilesystemPermissionFix.d.ts} +2 -2
  22. package/dist/api/protocol-v2/FilesystemPermissionFix.d.ts.map +1 -0
  23. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts +6 -0
  24. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -0
  25. package/dist/api/protocol-v2/helpers.d.ts +24 -18
  26. package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
  27. package/dist/api/ton/TonSignData.d.ts +1 -5
  28. package/dist/api/ton/TonSignData.d.ts.map +1 -1
  29. package/dist/core/index.d.ts.map +1 -1
  30. package/dist/data-manager/DataManager.d.ts +1 -1
  31. package/dist/data-manager/DataManager.d.ts.map +1 -1
  32. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  33. package/dist/device/Device.d.ts +4 -1
  34. package/dist/device/Device.d.ts.map +1 -1
  35. package/dist/deviceProfile/buildDeviceFeatures.d.ts.map +1 -1
  36. package/dist/deviceProfile/buildDeviceProfile.d.ts.map +1 -1
  37. package/dist/index.d.ts +79 -54
  38. package/dist/index.js +1537 -1528
  39. package/dist/inject.d.ts.map +1 -1
  40. package/dist/protocols/protocol-v2/features.d.ts +12 -14
  41. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  42. package/dist/protocols/protocol-v2/firmware.d.ts +10 -9
  43. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
  44. package/dist/types/api/firmwareUpdate.d.ts +1 -6
  45. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  46. package/dist/types/api/getDeviceInfo.d.ts +2 -0
  47. package/dist/types/api/getDeviceInfo.d.ts.map +1 -1
  48. package/dist/types/api/index.d.ts +6 -11
  49. package/dist/types/api/index.d.ts.map +1 -1
  50. package/dist/types/api/protocolV2.d.ts +12 -17
  51. package/dist/types/api/protocolV2.d.ts.map +1 -1
  52. package/dist/types/device.d.ts +1 -0
  53. package/dist/types/device.d.ts.map +1 -1
  54. package/dist/types/params.d.ts +1 -0
  55. package/dist/types/params.d.ts.map +1 -1
  56. package/dist/types/settings.d.ts +29 -2
  57. package/dist/types/settings.d.ts.map +1 -1
  58. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  59. package/dist/utils/patch.d.ts +1 -1
  60. package/dist/utils/patch.d.ts.map +1 -1
  61. package/package.json +4 -4
  62. package/src/api/FileRead.ts +14 -1
  63. package/src/api/FileWrite.ts +14 -1
  64. package/src/api/FirmwareUpdateV4.ts +933 -197
  65. package/src/api/GetOnekeyFeatures.ts +1 -1
  66. package/src/api/device/DeviceRebootToBoardloader.ts +4 -4
  67. package/src/api/device/DeviceRebootToBootloader.ts +4 -4
  68. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +11 -4
  69. package/src/api/index.ts +5 -10
  70. package/src/api/protocol-v2/{FactoryGetDeviceInfo.ts → DeviceFactoryInfoGet.ts} +3 -3
  71. package/src/api/protocol-v2/DeviceFactoryInfoSet.ts +32 -0
  72. package/src/api/protocol-v2/DeviceFirmwareUpdate.ts +3 -5
  73. package/src/api/protocol-v2/DeviceGetFirmwareUpdateStatus.ts +2 -2
  74. package/src/api/protocol-v2/{DeviceGetDeviceInfo.ts → DeviceInfoGet.ts} +52 -22
  75. package/src/api/protocol-v2/DeviceReboot.ts +1 -1
  76. package/src/api/protocol-v2/{FilesystemFixPermission.ts → FilesystemPermissionFix.ts} +2 -2
  77. package/src/api/protocol-v2/{GetProtoVersion.ts → ProtocolInfoRequest.ts} +2 -2
  78. package/src/api/protocol-v2/helpers.ts +59 -43
  79. package/src/api/ton/TonSignData.ts +1 -5
  80. package/src/core/index.ts +19 -5
  81. package/src/data/messages/messages-protocol-v2.json +486 -1072
  82. package/src/data-manager/DataManager.ts +7 -0
  83. package/src/data-manager/connectSettings.ts +0 -6
  84. package/src/device/Device.ts +25 -14
  85. package/src/deviceProfile/buildDeviceFeatures.ts +60 -63
  86. package/src/deviceProfile/buildDeviceProfile.ts +77 -58
  87. package/src/inject.ts +10 -16
  88. package/src/protocols/protocol-v2/features.ts +26 -63
  89. package/src/protocols/protocol-v2/firmware.ts +11 -36
  90. package/src/types/api/firmwareUpdate.ts +10 -20
  91. package/src/types/api/getDeviceInfo.ts +2 -0
  92. package/src/types/api/index.ts +10 -20
  93. package/src/types/api/protocolV2.ts +22 -42
  94. package/src/types/device.ts +1 -0
  95. package/src/types/params.ts +4 -0
  96. package/src/types/settings.ts +44 -35
  97. package/src/utils/deviceFeaturesUtils.ts +45 -10
  98. package/dist/api/protocol-v2/DevReboot.d.ts +0 -7
  99. package/dist/api/protocol-v2/DevReboot.d.ts.map +0 -1
  100. package/dist/api/protocol-v2/DeviceGetDeviceInfo.d.ts.map +0 -1
  101. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts +0 -6
  102. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts.map +0 -1
  103. package/dist/api/protocol-v2/FactoryDeviceInfoSettings.d.ts +0 -7
  104. package/dist/api/protocol-v2/FactoryDeviceInfoSettings.d.ts.map +0 -1
  105. package/dist/api/protocol-v2/FactoryGetDeviceInfo.d.ts +0 -6
  106. package/dist/api/protocol-v2/FactoryGetDeviceInfo.d.ts.map +0 -1
  107. package/dist/api/protocol-v2/FilesystemFixPermission.d.ts.map +0 -1
  108. package/dist/api/protocol-v2/GetProtoVersion.d.ts +0 -6
  109. package/dist/api/protocol-v2/GetProtoVersion.d.ts.map +0 -1
  110. package/src/api/protocol-v2/DevReboot.ts +0 -24
  111. package/src/api/protocol-v2/DeviceGetOnboardingStatus.ts +0 -16
  112. package/src/api/protocol-v2/FactoryDeviceInfoSettings.ts +0 -29
@@ -34,6 +34,7 @@ const Log = getLogger(LoggerNames.Core);
34
34
 
35
35
  export const FIRMWARE_FIELDS = [
36
36
  'firmware',
37
+ 'firmware-v1',
37
38
  'firmware-v2',
38
39
  'firmware-v8',
39
40
  'firmware-btc-v8',
@@ -46,6 +47,7 @@ export type ProtobufMessageSchema = ProtocolV1MessageSchema | 'v2Schema';
46
47
 
47
48
  const FIRMWARE_FIELD_TYPE_MAP: Readonly<Record<IFirmwareField, EFirmwareType>> = {
48
49
  firmware: EFirmwareType.Universal,
50
+ 'firmware-v1': EFirmwareType.Universal,
49
51
  'firmware-v2': EFirmwareType.Universal,
50
52
  'firmware-v8': EFirmwareType.Universal,
51
53
  'firmware-btc-v8': EFirmwareType.BitcoinOnly,
@@ -87,6 +89,10 @@ export default class DataManager {
87
89
  firmware: [],
88
90
  ble: [],
89
91
  },
92
+ [EDeviceType.Pro2]: {
93
+ firmware: [],
94
+ ble: [],
95
+ },
90
96
  [EDeviceType.ClassicPure]: {
91
97
  firmware: [],
92
98
  ble: [],
@@ -447,6 +453,7 @@ export default class DataManager {
447
453
  [EDeviceType.Mini]: this.enrichFirmwareReleaseInfo(data.mini),
448
454
  [EDeviceType.Touch]: this.enrichFirmwareReleaseInfo(data.touch),
449
455
  [EDeviceType.Pro]: this.enrichFirmwareReleaseInfo(data.pro),
456
+ [EDeviceType.Pro2]: this.enrichFirmwareReleaseInfo(data.pro2),
450
457
  };
451
458
  this.assets = {
452
459
  bridge: data.bridge,
@@ -27,8 +27,6 @@ const initialSettings: ConnectSettings = {
27
27
  env: 'web',
28
28
  lazyLoad: false,
29
29
  timestamp: new Date().getTime(),
30
- // 临时开关:仅用于本地/测试固件兼容;正式链路默认调用真实 DevGetDeviceInfo。
31
- protocolV2DeviceInfoMockEnabled: false,
32
30
  };
33
31
 
34
32
  export const getEnv = () => {
@@ -117,10 +115,6 @@ export const parseConnectSettings = (input: Partial<ConnectSettings> = {}) => {
117
115
  settings.fetchConfig = input.fetchConfig;
118
116
  }
119
117
 
120
- if (typeof input.protocolV2DeviceInfoMockEnabled === 'boolean') {
121
- settings.protocolV2DeviceInfoMockEnabled = input.protocolV2DeviceInfoMockEnabled;
122
- }
123
-
124
118
  return settings;
125
119
  };
126
120
 
@@ -76,6 +76,7 @@ export type InitOptions = {
76
76
  passphraseState?: string;
77
77
  deriveCardano?: boolean;
78
78
  connectProtocol?: HardwareConnectProtocol;
79
+ protocolV2DeviceInfoTimeoutMs?: number;
79
80
  };
80
81
 
81
82
  export type RunOptions = {
@@ -187,7 +188,7 @@ export class Device extends EventEmitter {
187
188
  /**
188
189
  * 唯一设备状态缓存。
189
190
  *
190
- * V1 直接保存原生 Features;V2 保存由 DevGetDeviceInfo 映射出的
191
+ * V1 直接保存原生 Features;V2 保存由 DeviceInfoGet 映射出的
191
192
  * Features 视图。Device 不再保存 profile,结构化 DeviceProfile 只作为
192
193
  * getDeviceInfo() 的 API 返回值存在。
193
194
  */
@@ -197,7 +198,7 @@ export class Device extends EventEmitter {
197
198
  * 是否需要更新设备信息。
198
199
  *
199
200
  * 历史名称保留用于兼容现有调用语义;对 V2 表示 features 需要由
200
- * DevGetDeviceInfo 刷新。
201
+ * DeviceInfoGet 刷新。
201
202
  */
202
203
  featuresNeedsReload = false;
203
204
 
@@ -326,7 +327,10 @@ export class Device extends EventEmitter {
326
327
  });
327
328
  }
328
329
 
329
- async acquire(connectProtocol?: HardwareConnectProtocol) {
330
+ async acquire(
331
+ connectProtocol?: HardwareConnectProtocol,
332
+ options?: { throwOnRunPromiseError?: boolean }
333
+ ) {
330
334
  const env = DataManager.getSettings('env');
331
335
  const mainIdKey = DataManager.isBleConnect(env) ? 'id' : 'session';
332
336
  const expectedProtocol = connectProtocol ?? this.originalDescriptor.protocolType;
@@ -375,6 +379,9 @@ export class Device extends EventEmitter {
375
379
 
376
380
  this.commands = new DeviceCommands(this, this.mainId ?? '');
377
381
  } catch (error) {
382
+ if (options?.throwOnRunPromiseError) {
383
+ throw error;
384
+ }
378
385
  if (this.runPromise) {
379
386
  this.runPromise.reject(error);
380
387
  } else {
@@ -477,7 +484,7 @@ export class Device extends EventEmitter {
477
484
  /**
478
485
  * 唯一协议判别器。
479
486
  *
480
- * descriptor.protocolType 是协议探测后的结果;V2 features 由 DevGetDeviceInfo
487
+ * descriptor.protocolType 是协议探测后的结果;V2 features 由 DeviceInfoGet
481
488
  * 映射产生。
482
489
  * 全 SDK 的协议分支都必须走这里,不要直接读 originalDescriptor.protocolType
483
490
  * 或从 features 反推。
@@ -506,9 +513,8 @@ export class Device extends EventEmitter {
506
513
  const serialNo = this.getCurrentSerialNo();
507
514
  if (serialNo) return serialNo;
508
515
 
509
- // connectId 是 SDK 内部连接路由 key;Protocol V2 早期固件/mock
510
- // 可能还没有 serial_no,此时用 transport descriptor 兜底,不改变
511
- // features.serialNo / deviceId 的业务语义。
516
+ // connectId 是 SDK 内部连接路由 key。这里兜底到 transport descriptor,
517
+ // 不改变 features.serialNo / deviceId 的业务语义。
512
518
  return this.originalDescriptor.path || this.originalDescriptor.id || '';
513
519
  }
514
520
 
@@ -741,13 +747,16 @@ export class Device extends EventEmitter {
741
747
  if (this.isProtocolV2()) {
742
748
  this.passphraseState = options?.passphraseState;
743
749
  if (this.features && !this.featuresNeedsReload && !options?.initSession) {
750
+ if (this.features.bootloaderMode) {
751
+ return;
752
+ }
744
753
  // 不能直接信任缓存 features:设备端 wipe / 完成初始化 / 改 label 后
745
754
  // features 会永久陈旧。每次 run 做一次轻量 status 刷新(不含 fw/SE),
746
755
  // 用字段级合并保留已有版本和 SE 信息。
747
- await this._refreshProtocolV2Status();
756
+ await this._refreshProtocolV2Status(options);
748
757
  return;
749
758
  }
750
- await this._initializeProtocolV2();
759
+ await this._initializeProtocolV2(options);
751
760
  return;
752
761
  }
753
762
 
@@ -797,10 +806,10 @@ export class Device extends EventEmitter {
797
806
  /**
798
807
  * Device initialization over Protocol V2.
799
808
  *
800
- * Protocol V2 不走传统 Initialize/GetFeatures;直接用 DevGetDeviceInfo
809
+ * Protocol V2 不走传统 Initialize/GetFeatures;直接用 DeviceInfoGet
801
810
  * 生成唯一的 features 状态。
802
811
  */
803
- private async _initializeProtocolV2() {
812
+ private async _initializeProtocolV2(options?: InitOptions) {
804
813
  Log.debug('Initialize device via Protocol V2 features adapter');
805
814
 
806
815
  try {
@@ -809,6 +818,7 @@ export class Device extends EventEmitter {
809
818
  // 且 reject 后底层调用仍会残留。
810
819
  const deviceInfo = await requestProtocolV2DeviceInfo({
811
820
  commands: this.commands,
821
+ timeoutMs: options?.protocolV2DeviceInfoTimeoutMs,
812
822
  });
813
823
  // 默认请求不含 SE/hash 数据,scope 如实标注为 basic;
814
824
  // 完整数据由 getDeviceInfo(scope:'verify'|'full') 获取。
@@ -824,15 +834,16 @@ export class Device extends EventEmitter {
824
834
  /**
825
835
  * Protocol V2 的轻量状态刷新(每次 run 前调用)。
826
836
  *
827
- * 请求 hw + bt + status(不含 fw/SE target):status 提供 init_states / label /
828
- * passphrase_protection 等会在设备端变化的字段;hw/bt 提供 serialNo / bleName。
837
+ * 请求 hw + coprocessor + status(不含 fw/SE target):status 提供 init_states / label /
838
+ * passphrase_enabled 等会在设备端变化的字段;hw/coprocessor 提供 serialNo / bleName。
829
839
  * versions 为空时按字段级合并保留旧值,verify 数据不会被降级。
830
840
  */
831
- private async _refreshProtocolV2Status() {
841
+ private async _refreshProtocolV2Status(options?: InitOptions) {
832
842
  try {
833
843
  const deviceInfo = await requestProtocolV2DeviceInfo({
834
844
  commands: this.commands,
835
845
  request: PROTOCOL_V2_STATUS_DEVICE_INFO_REQUEST,
846
+ timeoutMs: options?.protocolV2DeviceInfoTimeoutMs,
836
847
  });
837
848
  const features = this.updateProtocolV2Features(deviceInfo);
838
849
  Log.debug('Protocol V2 features (status refresh):', features);
@@ -2,22 +2,8 @@ import { EDeviceType, EFirmwareType } from '@onekeyfe/hd-shared';
2
2
 
3
3
  import type { Features } from '../types';
4
4
  import type { PROTO } from '../constants';
5
- import type { DevFirmwareImageInfo, ProtocolV2DeviceInfo } from '@onekeyfe/hd-transport';
6
-
7
- type ProtocolV2DeviceInfoCompat = ProtocolV2DeviceInfo & {
8
- fw?: ProtocolV2DeviceInfo['fw'] & {
9
- application?: DevFirmwareImageInfo | null;
10
- application_data?: DevFirmwareImageInfo | null;
11
- bootloader?: DevFirmwareImageInfo | null;
12
- romloader?: DevFirmwareImageInfo | null;
13
- };
14
- coprocessor?: {
15
- application?: DevFirmwareImageInfo | null;
16
- bootloader?: DevFirmwareImageInfo | null;
17
- bt_adv_name?: string | null;
18
- bt_mac?: unknown;
19
- } | null;
20
- };
5
+ import type { DeviceFirmwareImageInfo, ProtocolV2DeviceInfo } from '@onekeyfe/hd-transport';
6
+ import { isProtocolV2BootloaderDeviceInfo } from '../protocols/protocol-v2/features';
21
7
 
22
8
  type ProtocolV1FeaturesCompat = PROTO.Features &
23
9
  Partial<PROTO.OnekeyFeatures> & {
@@ -26,7 +12,7 @@ type ProtocolV1FeaturesCompat = PROTO.Features &
26
12
  onekey_serial?: string;
27
13
  };
28
14
 
29
- const getImageVersion = (image?: DevFirmwareImageInfo | null) => image?.version ?? null;
15
+ const getImageVersion = (image?: DeviceFirmwareImageInfo | null) => image?.version ?? null;
30
16
 
31
17
  const bytesToHex = (value: unknown): string | undefined => {
32
18
  if (!value) return undefined;
@@ -42,9 +28,9 @@ const bytesToHex = (value: unknown): string | undefined => {
42
28
  return undefined;
43
29
  };
44
30
 
45
- const getImageBuildId = (image?: DevFirmwareImageInfo | null) => image?.build_id ?? undefined;
31
+ const getImageBuildId = (image?: DeviceFirmwareImageInfo | null) => image?.build_id ?? undefined;
46
32
 
47
- const getImageHash = (image?: DevFirmwareImageInfo | null) => bytesToHex(image?.hash);
33
+ const getImageHash = (image?: DeviceFirmwareImageInfo | null) => bytesToHex(image?.hash);
48
34
 
49
35
  const firstValue = <T>(...values: Array<T | null | undefined>) =>
50
36
  values.find(value => value !== undefined && value !== null);
@@ -226,7 +212,7 @@ export const buildProtocolV1FeaturesPayload = (
226
212
  /**
227
213
  * Protocol V2 的结构化 `Features` 构建器。
228
214
  *
229
- * 这是 Device 内部唯一缓存状态。字段只来自 DevGetDeviceInfo 或前一次 features
215
+ * 这是 Device 内部唯一缓存状态。字段只来自 DeviceInfoGet 或前一次 features
230
216
  * 缓存的同名字段级合并;不存在协议等价语义的字段保持 null/空值,不再通过
231
217
  * DeviceProfile 或 transport path 做身份兜底。
232
218
  */
@@ -234,11 +220,12 @@ export const buildProtocolV2FeaturesPayload = (
234
220
  deviceInfo?: ProtocolV2DeviceInfo,
235
221
  previous?: Features
236
222
  ): Features => {
237
- const info = deviceInfo as ProtocolV2DeviceInfoCompat | undefined;
238
- const fwApplication = firstValue(info?.fw?.application, info?.fw?.app);
239
- const fwBootloader = firstValue(info?.fw?.bootloader, info?.fw?.boot);
240
- const fwBoard = firstValue(info?.fw?.application_data, info?.fw?.board);
241
- const bleApplication = firstValue(info?.coprocessor?.application, info?.bt?.app);
223
+ const info = deviceInfo;
224
+ const fwApplication = info?.fw?.application;
225
+ const fwBootloader = info?.fw?.bootloader;
226
+ const fwBoard = firstValue(info?.fw?.application_data, info?.fw?.romloader);
227
+ const bleApplication = info?.coprocessor?.application;
228
+ const status = info?.status;
242
229
 
243
230
  const firmwareVersion = firstMeaningfulVersion(
244
231
  getImageVersion(fwApplication),
@@ -250,17 +237,26 @@ export const buildProtocolV2FeaturesPayload = (
250
237
  );
251
238
  const boardVersion = firstMeaningfulVersion(getImageVersion(fwBoard), previous?.boardVersion);
252
239
  const bleVersion = firstMeaningfulVersion(getImageVersion(bleApplication), previous?.bleVersion);
253
- const deviceId = firstValue(info?.hw?.device_id, previous?.deviceId) ?? null;
240
+ const deviceId = status?.device_id ?? null;
254
241
  const serialNo = firstValue(info?.hw?.serial_no, previous?.serialNo) ?? '';
255
- const label = firstValue(deviceInfo?.status?.label, previous?.label) ?? null;
256
- const bleName = firstValue(info?.coprocessor?.bt_adv_name, info?.bt?.adv_name, previous?.bleName);
257
- const initialized = firstValue(deviceInfo?.status?.init_states, previous?.initialized) ?? null;
258
- const passphraseProtection =
259
- firstValue(deviceInfo?.status?.passphrase_protection, previous?.passphraseProtection) ?? null;
260
- const language = firstValue(deviceInfo?.status?.language, previous?.language) ?? null;
261
- const backupRequired =
262
- firstValue(deviceInfo?.status?.backup_required, previous?.backupRequired) ?? null;
263
- const bleEnabled = firstValue(deviceInfo?.status?.bt_enable, previous?.bleEnabled);
242
+ const label = previous?.label ?? null;
243
+ const bleName = firstValue(info?.coprocessor?.bt_adv_name, previous?.bleName);
244
+ const initialized = firstValue(status?.init_states, previous?.initialized) ?? null;
245
+ const passphraseProtection = status?.passphrase_enabled ?? null;
246
+ const language = previous?.language ?? null;
247
+ const backupRequired = firstValue(status?.backup_required, previous?.backupRequired) ?? null;
248
+ const bleEnabled = previous?.bleEnabled;
249
+ const unlocked = firstValue(status?.unlocked, previous?.unlocked) ?? null;
250
+ const attachToPinEnabled = status?.attach_to_pin_enabled ?? null;
251
+ const unlockedAttachPin = status?.unlocked_by_attach_to_pin ?? undefined;
252
+ const bootloaderMode = isProtocolV2BootloaderDeviceInfo(info);
253
+ const mode = bootloaderMode
254
+ ? 'bootloader'
255
+ : initialized === false
256
+ ? 'notInitialized'
257
+ : initialized === true
258
+ ? 'normal'
259
+ : 'unknown';
264
260
 
265
261
  return {
266
262
  protocol: 'V2',
@@ -274,10 +270,10 @@ export const buildProtocolV2FeaturesPayload = (
274
270
  label,
275
271
  bleName: bleName ?? null,
276
272
  capabilities: [],
277
- mode: initialized === false ? 'notInitialized' : initialized === true ? 'normal' : 'unknown',
273
+ mode,
278
274
  initialized,
279
- bootloaderMode: false,
280
- unlocked: previous?.unlocked ?? null,
275
+ bootloaderMode,
276
+ unlocked,
281
277
  firmwarePresent: previous?.firmwarePresent ?? null,
282
278
  passphraseProtection,
283
279
  pinProtection: null,
@@ -291,6 +287,7 @@ export const buildProtocolV2FeaturesPayload = (
291
287
  sdProtection: null,
292
288
  wipeCodeProtection: null,
293
289
  passphraseAlwaysOnDevice: null,
290
+ attachToPinEnabled,
294
291
  safetyChecks: null,
295
292
  autoLockDelayMs: null,
296
293
  displayRotation: null,
@@ -300,35 +297,35 @@ export const buildProtocolV2FeaturesPayload = (
300
297
  boardVersion,
301
298
  bleVersion,
302
299
  se01Version: firstMeaningfulVersion(
303
- getImageVersion(deviceInfo?.se1?.app),
300
+ getImageVersion(info?.se1?.application),
304
301
  previous?.se01Version
305
302
  ),
306
303
  se02Version: firstMeaningfulVersion(
307
- getImageVersion(deviceInfo?.se2?.app),
304
+ getImageVersion(info?.se2?.application),
308
305
  previous?.se02Version
309
306
  ),
310
307
  se03Version: firstMeaningfulVersion(
311
- getImageVersion(deviceInfo?.se3?.app),
308
+ getImageVersion(info?.se3?.application),
312
309
  previous?.se03Version
313
310
  ),
314
311
  se04Version: firstMeaningfulVersion(
315
- getImageVersion(deviceInfo?.se4?.app),
312
+ getImageVersion(info?.se4?.application),
316
313
  previous?.se04Version
317
314
  ),
318
315
  se01BootVersion: firstMeaningfulVersion(
319
- getImageVersion(deviceInfo?.se1?.boot),
316
+ getImageVersion(info?.se1?.bootloader),
320
317
  previous?.se01BootVersion
321
318
  ),
322
319
  se02BootVersion: firstMeaningfulVersion(
323
- getImageVersion(deviceInfo?.se2?.boot),
320
+ getImageVersion(info?.se2?.bootloader),
324
321
  previous?.se02BootVersion
325
322
  ),
326
323
  se03BootVersion: firstMeaningfulVersion(
327
- getImageVersion(deviceInfo?.se3?.boot),
324
+ getImageVersion(info?.se3?.bootloader),
328
325
  previous?.se03BootVersion
329
326
  ),
330
327
  se04BootVersion: firstMeaningfulVersion(
331
- getImageVersion(deviceInfo?.se4?.boot),
328
+ getImageVersion(info?.se4?.bootloader),
332
329
  previous?.se04BootVersion
333
330
  ),
334
331
  seVersion: previous?.seVersion ?? null,
@@ -341,26 +338,26 @@ export const buildProtocolV2FeaturesPayload = (
341
338
  boardHash: getImageHash(fwBoard) ?? previous?.verify?.boardHash,
342
339
  bleBuildId: getImageBuildId(bleApplication) ?? previous?.verify?.bleBuildId,
343
340
  bleHash: getImageHash(bleApplication) ?? previous?.verify?.bleHash,
344
- se01BuildId: getImageBuildId(deviceInfo?.se1?.app) ?? previous?.verify?.se01BuildId,
345
- se01Hash: getImageHash(deviceInfo?.se1?.app) ?? previous?.verify?.se01Hash,
346
- se02BuildId: getImageBuildId(deviceInfo?.se2?.app) ?? previous?.verify?.se02BuildId,
347
- se02Hash: getImageHash(deviceInfo?.se2?.app) ?? previous?.verify?.se02Hash,
348
- se03BuildId: getImageBuildId(deviceInfo?.se3?.app) ?? previous?.verify?.se03BuildId,
349
- se03Hash: getImageHash(deviceInfo?.se3?.app) ?? previous?.verify?.se03Hash,
350
- se04BuildId: getImageBuildId(deviceInfo?.se4?.app) ?? previous?.verify?.se04BuildId,
351
- se04Hash: getImageHash(deviceInfo?.se4?.app) ?? previous?.verify?.se04Hash,
352
- se01BootBuildId: getImageBuildId(deviceInfo?.se1?.boot) ?? previous?.verify?.se01BootBuildId,
353
- se01BootHash: getImageHash(deviceInfo?.se1?.boot) ?? previous?.verify?.se01BootHash,
354
- se02BootBuildId: getImageBuildId(deviceInfo?.se2?.boot) ?? previous?.verify?.se02BootBuildId,
355
- se02BootHash: getImageHash(deviceInfo?.se2?.boot) ?? previous?.verify?.se02BootHash,
356
- se03BootBuildId: getImageBuildId(deviceInfo?.se3?.boot) ?? previous?.verify?.se03BootBuildId,
357
- se03BootHash: getImageHash(deviceInfo?.se3?.boot) ?? previous?.verify?.se03BootHash,
358
- se04BootBuildId: getImageBuildId(deviceInfo?.se4?.boot) ?? previous?.verify?.se04BootBuildId,
359
- se04BootHash: getImageHash(deviceInfo?.se4?.boot) ?? previous?.verify?.se04BootHash,
341
+ se01BuildId: getImageBuildId(info?.se1?.application) ?? previous?.verify?.se01BuildId,
342
+ se01Hash: getImageHash(info?.se1?.application) ?? previous?.verify?.se01Hash,
343
+ se02BuildId: getImageBuildId(info?.se2?.application) ?? previous?.verify?.se02BuildId,
344
+ se02Hash: getImageHash(info?.se2?.application) ?? previous?.verify?.se02Hash,
345
+ se03BuildId: getImageBuildId(info?.se3?.application) ?? previous?.verify?.se03BuildId,
346
+ se03Hash: getImageHash(info?.se3?.application) ?? previous?.verify?.se03Hash,
347
+ se04BuildId: getImageBuildId(info?.se4?.application) ?? previous?.verify?.se04BuildId,
348
+ se04Hash: getImageHash(info?.se4?.application) ?? previous?.verify?.se04Hash,
349
+ se01BootBuildId: getImageBuildId(info?.se1?.bootloader) ?? previous?.verify?.se01BootBuildId,
350
+ se01BootHash: getImageHash(info?.se1?.bootloader) ?? previous?.verify?.se01BootHash,
351
+ se02BootBuildId: getImageBuildId(info?.se2?.bootloader) ?? previous?.verify?.se02BootBuildId,
352
+ se02BootHash: getImageHash(info?.se2?.bootloader) ?? previous?.verify?.se02BootHash,
353
+ se03BootBuildId: getImageBuildId(info?.se3?.bootloader) ?? previous?.verify?.se03BootBuildId,
354
+ se03BootHash: getImageHash(info?.se3?.bootloader) ?? previous?.verify?.se03BootHash,
355
+ se04BootBuildId: getImageBuildId(info?.se4?.bootloader) ?? previous?.verify?.se04BootBuildId,
356
+ se04BootHash: getImageHash(info?.se4?.bootloader) ?? previous?.verify?.se04BootHash,
360
357
  },
361
358
  sessionId: previous?.sessionId ?? null,
362
359
  passphraseState: previous?.passphraseState,
363
- unlockedAttachPin: previous?.unlockedAttachPin,
360
+ unlockedAttachPin,
364
361
  raw: {
365
362
  protocolV2DeviceInfo: deviceInfo,
366
363
  },
@@ -25,7 +25,8 @@ import type {
25
25
  GetDeviceInfoParams,
26
26
  } from '../types/api/getDeviceInfo';
27
27
  import type { Features, OnekeyFeatures } from '../types';
28
- import type { DevFirmwareImageInfo, ProtocolV2DeviceInfo } from '@onekeyfe/hd-transport';
28
+ import type { DeviceFirmwareImageInfo, ProtocolV2DeviceInfo } from '@onekeyfe/hd-transport';
29
+ import { isProtocolV2BootloaderDeviceInfo } from '../protocols/protocol-v2/features';
29
30
 
30
31
  type BuildProtocolV1ProfileParams = {
31
32
  protocol?: DeviceInfoProtocol;
@@ -68,11 +69,11 @@ const bytesToHex = (value: unknown): string | undefined => {
68
69
  return undefined;
69
70
  };
70
71
 
71
- const getImageVersion = (image?: DevFirmwareImageInfo | null) => image?.version ?? null;
72
+ const getImageVersion = (image?: DeviceFirmwareImageInfo | null) => image?.version ?? null;
72
73
 
73
- const getImageBuildId = (image?: DevFirmwareImageInfo | null) => image?.build_id ?? undefined;
74
+ const getImageBuildId = (image?: DeviceFirmwareImageInfo | null) => image?.build_id ?? undefined;
74
75
 
75
- const getImageHash = (image?: DevFirmwareImageInfo | null) => bytesToHex(image?.hash);
76
+ const getImageHash = (image?: DeviceFirmwareImageInfo | null) => bytesToHex(image?.hash);
76
77
 
77
78
  const shouldIncludeVerify = (scope?: GetDeviceInfoParams['scope']) =>
78
79
  scope === 'verify' || scope === 'full';
@@ -86,6 +87,7 @@ const getDeviceMode = (features?: Features): DeviceInfoStatus['mode'] => {
86
87
  };
87
88
 
88
89
  const getProtocolV2Mode = (deviceInfo?: ProtocolV2DeviceInfo): DeviceInfoStatus['mode'] => {
90
+ if (isProtocolV2BootloaderDeviceInfo(deviceInfo)) return 'bootloader';
89
91
  const initialized = deviceInfo?.status?.init_states;
90
92
  if (initialized === false) return 'notInitialized';
91
93
  if (initialized === true) return 'normal';
@@ -147,20 +149,25 @@ const normalizeV1Versions = (
147
149
  ),
148
150
  });
149
151
 
150
- const normalizeV2Versions = (deviceInfo?: ProtocolV2DeviceInfo): DeviceProfileVersions => ({
151
- firmware: firstMeaningfulVersion(getImageVersion(deviceInfo?.fw?.app)),
152
- bootloader: firstMeaningfulVersion(getImageVersion(deviceInfo?.fw?.boot)),
153
- board: firstMeaningfulVersion(getImageVersion(deviceInfo?.fw?.board)),
154
- ble: firstMeaningfulVersion(getImageVersion(deviceInfo?.bt?.app)),
155
- se01: firstMeaningfulVersion(getImageVersion(deviceInfo?.se1?.app)),
156
- se02: firstMeaningfulVersion(getImageVersion(deviceInfo?.se2?.app)),
157
- se03: firstMeaningfulVersion(getImageVersion(deviceInfo?.se3?.app)),
158
- se04: firstMeaningfulVersion(getImageVersion(deviceInfo?.se4?.app)),
159
- se01Boot: firstMeaningfulVersion(getImageVersion(deviceInfo?.se1?.boot)),
160
- se02Boot: firstMeaningfulVersion(getImageVersion(deviceInfo?.se2?.boot)),
161
- se03Boot: firstMeaningfulVersion(getImageVersion(deviceInfo?.se3?.boot)),
162
- se04Boot: firstMeaningfulVersion(getImageVersion(deviceInfo?.se4?.boot)),
163
- });
152
+ const normalizeV2Versions = (deviceInfo?: ProtocolV2DeviceInfo): DeviceProfileVersions => {
153
+ const info = deviceInfo;
154
+ return {
155
+ firmware: firstMeaningfulVersion(getImageVersion(info?.fw?.application)),
156
+ bootloader: firstMeaningfulVersion(getImageVersion(info?.fw?.bootloader)),
157
+ board: firstMeaningfulVersion(
158
+ getImageVersion(info?.fw?.application_data ?? info?.fw?.romloader)
159
+ ),
160
+ ble: firstMeaningfulVersion(getImageVersion(info?.coprocessor?.application)),
161
+ se01: firstMeaningfulVersion(getImageVersion(info?.se1?.application)),
162
+ se02: firstMeaningfulVersion(getImageVersion(info?.se2?.application)),
163
+ se03: firstMeaningfulVersion(getImageVersion(info?.se3?.application)),
164
+ se04: firstMeaningfulVersion(getImageVersion(info?.se4?.application)),
165
+ se01Boot: firstMeaningfulVersion(getImageVersion(info?.se1?.bootloader)),
166
+ se02Boot: firstMeaningfulVersion(getImageVersion(info?.se2?.bootloader)),
167
+ se03Boot: firstMeaningfulVersion(getImageVersion(info?.se3?.bootloader)),
168
+ se04Boot: firstMeaningfulVersion(getImageVersion(info?.se4?.bootloader)),
169
+ };
170
+ };
164
171
 
165
172
  // V2 状态由 normalizeV2Status 处理,这里只服务 buildProfileFromProtocolV1 的 V1 路径。
166
173
  const normalizeV1Status = (features?: Features): DeviceInfoStatus => ({
@@ -169,23 +176,31 @@ const normalizeV1Status = (features?: Features): DeviceInfoStatus => ({
169
176
  bootloaderMode: features?.bootloaderMode ?? null,
170
177
  unlocked: features?.unlocked ?? null,
171
178
  passphraseProtection: features?.passphraseProtection ?? null,
179
+ attachToPinEnabled: features?.attachToPinEnabled ?? null,
180
+ unlockedAttachPin: features?.unlockedAttachPin ?? null,
172
181
  backupRequired: features?.backupRequired ?? null,
173
182
  noBackup: features?.noBackup ?? null,
174
183
  language: features?.language ?? null,
175
184
  bleEnabled: features?.bleEnabled ?? null,
176
185
  });
177
186
 
178
- const normalizeV2Status = (deviceInfo?: ProtocolV2DeviceInfo): DeviceInfoStatus => ({
179
- mode: getProtocolV2Mode(deviceInfo),
180
- initialized: deviceInfo?.status?.init_states ?? null,
181
- bootloaderMode: false,
182
- unlocked: null,
183
- passphraseProtection: deviceInfo?.status?.passphrase_protection ?? null,
184
- backupRequired: deviceInfo?.status?.backup_required ?? null,
185
- noBackup: null,
186
- language: deviceInfo?.status?.language ?? null,
187
- bleEnabled: deviceInfo?.status?.bt_enable ?? null,
188
- });
187
+ const normalizeV2Status = (deviceInfo?: ProtocolV2DeviceInfo): DeviceInfoStatus => {
188
+ const status = deviceInfo?.status;
189
+ const bootloaderMode = isProtocolV2BootloaderDeviceInfo(deviceInfo);
190
+ return {
191
+ mode: getProtocolV2Mode(deviceInfo),
192
+ initialized: status?.init_states ?? null,
193
+ bootloaderMode,
194
+ unlocked: status?.unlocked ?? null,
195
+ passphraseProtection: status?.passphrase_enabled ?? null,
196
+ attachToPinEnabled: status?.attach_to_pin_enabled ?? null,
197
+ unlockedAttachPin: status?.unlocked_by_attach_to_pin ?? null,
198
+ backupRequired: status?.backup_required ?? null,
199
+ noBackup: null,
200
+ language: null,
201
+ bleEnabled: null,
202
+ };
203
+ };
189
204
 
190
205
  const normalizeV1Verify = (
191
206
  features?: Features,
@@ -223,32 +238,35 @@ const normalizeV1Verify = (
223
238
  se04BootHash: protocolV1OneKeyFeatures?.onekey_se04_boot_hash ?? features?.verify?.se04BootHash,
224
239
  });
225
240
 
226
- const normalizeV2Verify = (deviceInfo?: ProtocolV2DeviceInfo): DeviceProfileVerify => ({
227
- firmwareBuildId: getImageBuildId(deviceInfo?.fw?.app),
228
- firmwareHash: getImageHash(deviceInfo?.fw?.app),
229
- bootloaderBuildId: getImageBuildId(deviceInfo?.fw?.boot),
230
- bootloaderHash: getImageHash(deviceInfo?.fw?.boot),
231
- boardBuildId: getImageBuildId(deviceInfo?.fw?.board),
232
- boardHash: getImageHash(deviceInfo?.fw?.board),
233
- bleBuildId: getImageBuildId(deviceInfo?.bt?.app),
234
- bleHash: getImageHash(deviceInfo?.bt?.app),
235
- se01BuildId: getImageBuildId(deviceInfo?.se1?.app),
236
- se01Hash: getImageHash(deviceInfo?.se1?.app),
237
- se02BuildId: getImageBuildId(deviceInfo?.se2?.app),
238
- se02Hash: getImageHash(deviceInfo?.se2?.app),
239
- se03BuildId: getImageBuildId(deviceInfo?.se3?.app),
240
- se03Hash: getImageHash(deviceInfo?.se3?.app),
241
- se04BuildId: getImageBuildId(deviceInfo?.se4?.app),
242
- se04Hash: getImageHash(deviceInfo?.se4?.app),
243
- se01BootBuildId: getImageBuildId(deviceInfo?.se1?.boot),
244
- se01BootHash: getImageHash(deviceInfo?.se1?.boot),
245
- se02BootBuildId: getImageBuildId(deviceInfo?.se2?.boot),
246
- se02BootHash: getImageHash(deviceInfo?.se2?.boot),
247
- se03BootBuildId: getImageBuildId(deviceInfo?.se3?.boot),
248
- se03BootHash: getImageHash(deviceInfo?.se3?.boot),
249
- se04BootBuildId: getImageBuildId(deviceInfo?.se4?.boot),
250
- se04BootHash: getImageHash(deviceInfo?.se4?.boot),
251
- });
241
+ const normalizeV2Verify = (deviceInfo?: ProtocolV2DeviceInfo): DeviceProfileVerify => {
242
+ const info = deviceInfo;
243
+ return {
244
+ firmwareBuildId: getImageBuildId(info?.fw?.application),
245
+ firmwareHash: getImageHash(info?.fw?.application),
246
+ bootloaderBuildId: getImageBuildId(info?.fw?.bootloader),
247
+ bootloaderHash: getImageHash(info?.fw?.bootloader),
248
+ boardBuildId: getImageBuildId(info?.fw?.application_data ?? info?.fw?.romloader),
249
+ boardHash: getImageHash(info?.fw?.application_data ?? info?.fw?.romloader),
250
+ bleBuildId: getImageBuildId(info?.coprocessor?.application),
251
+ bleHash: getImageHash(info?.coprocessor?.application),
252
+ se01BuildId: getImageBuildId(info?.se1?.application),
253
+ se01Hash: getImageHash(info?.se1?.application),
254
+ se02BuildId: getImageBuildId(info?.se2?.application),
255
+ se02Hash: getImageHash(info?.se2?.application),
256
+ se03BuildId: getImageBuildId(info?.se3?.application),
257
+ se03Hash: getImageHash(info?.se3?.application),
258
+ se04BuildId: getImageBuildId(info?.se4?.application),
259
+ se04Hash: getImageHash(info?.se4?.application),
260
+ se01BootBuildId: getImageBuildId(info?.se1?.bootloader),
261
+ se01BootHash: getImageHash(info?.se1?.bootloader),
262
+ se02BootBuildId: getImageBuildId(info?.se2?.bootloader),
263
+ se02BootHash: getImageHash(info?.se2?.bootloader),
264
+ se03BootBuildId: getImageBuildId(info?.se3?.bootloader),
265
+ se03BootHash: getImageHash(info?.se3?.bootloader),
266
+ se04BootBuildId: getImageBuildId(info?.se4?.bootloader),
267
+ se04BootHash: getImageHash(info?.se4?.bootloader),
268
+ };
269
+ };
252
270
 
253
271
  const normalizeRaw = ({
254
272
  features,
@@ -304,10 +322,11 @@ export function buildProfileFromProtocolV2({
304
322
  scope = 'basic',
305
323
  includeRaw = false,
306
324
  }: BuildProtocolV2ProfileParams): DeviceProfile {
307
- const deviceId = deviceInfo?.hw?.device_id || '';
325
+ const info = deviceInfo;
326
+ const deviceId = info?.status?.device_id || '';
308
327
  const serialNo = deviceInfo?.hw?.serial_no || '';
309
- const label = deviceInfo?.status?.label ?? null;
310
- const bleName = deviceInfo?.bt?.adv_name ?? null;
328
+ const label = null;
329
+ const bleName = info?.coprocessor?.bt_adv_name ?? null;
311
330
  const verify = normalizeV2Verify(deviceInfo);
312
331
 
313
332
  return {
package/src/inject.ts CHANGED
@@ -151,28 +151,22 @@ export const createCoreApi = (
151
151
  deviceRebootToBootloader: connectId => call({ connectId, method: 'deviceRebootToBootloader' }),
152
152
 
153
153
  // File system & device control API (Protocol V2 only)
154
- getProtoVersion: (connectId, params) => call({ ...params, connectId, method: 'getProtoVersion' }),
154
+ protocolInfoRequest: (connectId, params) =>
155
+ call({ ...params, connectId, method: 'protocolInfoRequest' }),
155
156
  ping: (connectId, params) => call({ ...params, connectId, method: 'ping' }),
156
157
  deviceReboot: (connectId, params) => call({ ...params, connectId, method: 'deviceReboot' }),
157
- deviceGetDeviceInfo: (connectId, params) =>
158
- call({ ...params, connectId, method: 'deviceGetDeviceInfo' }),
159
- deviceGetOnboardingStatus: (connectId, params) =>
160
- call({ ...params, connectId, method: 'deviceGetOnboardingStatus' }),
158
+ deviceInfoGet: (connectId, params) =>
159
+ call({ ...params, connectId, method: 'deviceInfoGet' }),
161
160
  deviceFirmwareUpdate: (connectId, params) =>
162
161
  call({ ...params, connectId, method: 'deviceFirmwareUpdate' }),
163
162
  deviceGetFirmwareUpdateStatus: (connectId, params) =>
164
163
  call({ ...params, connectId, method: 'deviceGetFirmwareUpdateStatus' }),
165
- devReboot: (connectId, params) => call({ ...params, connectId, method: 'devReboot' }),
166
- devGetDeviceInfo: (connectId, params) =>
167
- call({ ...params, connectId, method: 'devGetDeviceInfo' }),
168
- devFirmwareUpdate: (connectId, params) =>
169
- call({ ...params, connectId, method: 'devFirmwareUpdate' }),
170
- devGetFirmwareUpdateStatus: (connectId, params) =>
171
- call({ ...params, connectId, method: 'devGetFirmwareUpdateStatus' }),
172
- factoryDeviceInfoSettings: (connectId, params) =>
173
- call({ ...params, connectId, method: 'factoryDeviceInfoSettings' }),
174
- factoryGetDeviceInfo: connectId => call({ connectId, method: 'factoryGetDeviceInfo' }),
175
- filesystemFixPermission: connectId => call({ connectId, method: 'filesystemFixPermission' }),
164
+ deviceFactoryInfoSet: (connectId, params) =>
165
+ call({ ...params, connectId, method: 'deviceFactoryInfoSet' }),
166
+ deviceFactoryInfoGet: (connectId, params) =>
167
+ call({ ...params, connectId, method: 'deviceFactoryInfoGet' }),
168
+ filesystemPermissionFix: (connectId, params) =>
169
+ call({ ...params, connectId, method: 'filesystemPermissionFix' }),
176
170
  fileRead: (connectId, params) => call({ ...params, connectId, method: 'fileRead' }),
177
171
  fileWrite: (connectId, params) => call({ ...params, connectId, method: 'fileWrite' }),
178
172
  fileDelete: (connectId, params) => call({ ...params, connectId, method: 'fileDelete' }),