@onekeyfe/hd-core 1.1.16 → 1.1.18-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 (74) hide show
  1. package/dist/api/BaseMethod.d.ts +4 -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/sui/SuiSignTransaction.d.ts +1 -1
  25. package/dist/api/sui/SuiSignTransaction.d.ts.map +1 -1
  26. package/dist/core/index.d.ts.map +1 -1
  27. package/dist/data-manager/DataManager.d.ts +16 -9
  28. package/dist/data-manager/DataManager.d.ts.map +1 -1
  29. package/dist/index.d.ts +43 -21
  30. package/dist/index.js +199 -70
  31. package/dist/types/api/checkAllFirmwareRelease.d.ts +3 -1
  32. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  33. package/dist/types/api/checkBootloaderRelease.d.ts +5 -2
  34. package/dist/types/api/checkBootloaderRelease.d.ts.map +1 -1
  35. package/dist/types/api/checkFirmwareRelease.d.ts +6 -2
  36. package/dist/types/api/checkFirmwareRelease.d.ts.map +1 -1
  37. package/dist/types/api/deviceFullyUploadResource.d.ts +6 -1
  38. package/dist/types/api/deviceFullyUploadResource.d.ts.map +1 -1
  39. package/dist/types/api/deviceUpdateBootloader.d.ts +6 -3
  40. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  41. package/dist/types/api/firmwareUpdate.d.ts +3 -1
  42. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  43. package/dist/types/settings.d.ts +3 -0
  44. package/dist/types/settings.d.ts.map +1 -1
  45. package/dist/utils/deviceFeaturesUtils.d.ts +7 -5
  46. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  47. package/dist/utils/release.d.ts +1 -1
  48. package/dist/utils/release.d.ts.map +1 -1
  49. package/package.json +4 -4
  50. package/src/api/BaseMethod.ts +17 -7
  51. package/src/api/CheckAllFirmwareRelease.ts +13 -6
  52. package/src/api/CheckBootloaderRelease.ts +13 -2
  53. package/src/api/CheckFirmwareRelease.ts +9 -2
  54. package/src/api/FirmwareUpdate.ts +7 -5
  55. package/src/api/FirmwareUpdateV2.ts +26 -14
  56. package/src/api/FirmwareUpdateV3.ts +29 -18
  57. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +10 -11
  58. package/src/api/device/DeviceFullyUploadResource.ts +8 -2
  59. package/src/api/device/DeviceUpdateBootloader.ts +21 -5
  60. package/src/api/firmware/getBinary.ts +15 -4
  61. package/src/api/firmware/releaseHelper.ts +22 -11
  62. package/src/api/firmware/updateBootloader.ts +17 -9
  63. package/src/api/sui/SuiSignTransaction.ts +7 -1
  64. package/src/core/index.ts +3 -1
  65. package/src/data-manager/DataManager.ts +126 -22
  66. package/src/types/api/checkAllFirmwareRelease.ts +3 -1
  67. package/src/types/api/checkBootloaderRelease.ts +7 -3
  68. package/src/types/api/checkFirmwareRelease.ts +10 -2
  69. package/src/types/api/deviceFullyUploadResource.ts +7 -1
  70. package/src/types/api/deviceUpdateBootloader.ts +8 -4
  71. package/src/types/api/firmwareUpdate.ts +4 -1
  72. package/src/types/settings.ts +37 -0
  73. package/src/utils/deviceFeaturesUtils.ts +22 -10
  74. package/src/utils/release.ts +2 -1
@@ -1,15 +1,19 @@
1
1
  import axios from 'axios';
2
2
  import semver from 'semver';
3
- import { EDeviceType } from '@onekeyfe/hd-shared';
3
+ import { EDeviceType, EFirmwareType } from '@onekeyfe/hd-shared';
4
+
4
5
  import MessagesJSON from '../data/messages/messages.json';
5
6
  import MessagesLegacyV1JSON from '../data/messages/messages_legacy_v1.json';
6
7
  import {
7
- getTimeStamp,
8
8
  getDeviceBLEFirmwareVersion,
9
9
  getDeviceFirmwareVersion,
10
10
  getDeviceType,
11
+ getFirmwareType,
11
12
  getFirmwareUpdateField,
13
+ getTimeStamp,
12
14
  } from '../utils';
15
+ import { DeviceModelToTypes } from '../types';
16
+ import { findLatestRelease, getReleaseChangelog, getReleaseStatus } from '../utils/release';
13
17
 
14
18
  import type {
15
19
  AssetsMap,
@@ -22,13 +26,37 @@ import type {
22
26
  IVersionArray,
23
27
  RemoteConfigResponse,
24
28
  } from '../types';
25
- import { DeviceModelToTypes } from '../types';
26
- import { findLatestRelease, getReleaseChangelog, getReleaseStatus } from '../utils/release';
27
29
 
28
- export type IFirmwareField = 'firmware' | 'firmware-v2' | 'firmware-v7';
30
+ export const FIRMWARE_FIELDS = [
31
+ 'firmware',
32
+ 'firmware-v2',
33
+ 'firmware-v7',
34
+ 'firmware-btc-v7',
35
+ ] as const;
36
+
37
+ export type IFirmwareField = (typeof FIRMWARE_FIELDS)[number];
29
38
 
30
39
  export type MessageVersion = 'latest' | 'v1';
31
40
 
41
+ const FIRMWARE_FIELD_TYPE_MAP: Readonly<Record<IFirmwareField, EFirmwareType>> = {
42
+ firmware: EFirmwareType.Universal,
43
+ 'firmware-v2': EFirmwareType.Universal,
44
+ 'firmware-v7': EFirmwareType.Universal,
45
+ 'firmware-btc-v7': EFirmwareType.BitcoinOnly,
46
+ } as const;
47
+
48
+ function getFirmwareTypeFromField(firmwareField: IFirmwareField): EFirmwareType {
49
+ const firmwareType = FIRMWARE_FIELD_TYPE_MAP[firmwareField];
50
+
51
+ // Explicit check for type safety
52
+ if (firmwareType === undefined) {
53
+ // Fallback to Universal for safety
54
+ return EFirmwareType.Universal;
55
+ }
56
+
57
+ return firmwareType;
58
+ }
59
+
32
60
  export default class DataManager {
33
61
  static deviceMap: DeviceTypeMap = {
34
62
  [EDeviceType.Classic]: {
@@ -68,10 +96,14 @@ export default class DataManager {
68
96
 
69
97
  static lastCheckTimestamp = 0;
70
98
 
71
- static getFirmwareStatus = (features: Features): IDeviceFirmwareStatus => {
99
+ static getFirmwareStatus = (
100
+ features: Features,
101
+ firmwareType: EFirmwareType
102
+ ): IDeviceFirmwareStatus => {
72
103
  const deviceType = getDeviceType(features);
73
104
  if (deviceType === EDeviceType.Unknown) return 'unknown';
74
105
 
106
+ const deviceFirmwareType = getFirmwareType(features);
75
107
  const deviceFirmwareVersion = getDeviceFirmwareVersion(features);
76
108
  if (features.firmware_present === false) {
77
109
  return 'none';
@@ -81,9 +113,16 @@ export default class DataManager {
81
113
  return 'unknown';
82
114
  }
83
115
 
84
- const firmwareUpdateField = getFirmwareUpdateField({ features, updateType: 'firmware' });
116
+ const firmwareUpdateField = getFirmwareUpdateField({
117
+ features,
118
+ updateType: 'firmware',
119
+ firmwareType,
120
+ });
85
121
  const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
86
- const currentVersion = deviceFirmwareVersion.join('.');
122
+ let currentVersion = deviceFirmwareVersion.join('.');
123
+ if (targetDeviceConfigList.length > 0 && deviceFirmwareType !== firmwareType) {
124
+ currentVersion = '0.0.0';
125
+ }
87
126
  return getReleaseStatus(targetDeviceConfigList, currentVersion);
88
127
  };
89
128
 
@@ -91,7 +130,15 @@ export default class DataManager {
91
130
  * Touch、Pro System UI Resource Update
92
131
  * ** Interval upgrade is not considered **
93
132
  */
94
- static getSysResourcesLatestRelease = (features: Features, forcedUpdateRes?: boolean) => {
133
+ static getSysResourcesLatestRelease = ({
134
+ features,
135
+ forcedUpdateRes,
136
+ firmwareType,
137
+ }: {
138
+ features: Features;
139
+ forcedUpdateRes?: boolean;
140
+ firmwareType: EFirmwareType;
141
+ }) => {
95
142
  const deviceType = getDeviceType(features);
96
143
  const deviceFirmwareVersion = getDeviceFirmwareVersion(features);
97
144
 
@@ -100,6 +147,7 @@ export default class DataManager {
100
147
  const firmwareUpdateField = getFirmwareUpdateField({
101
148
  features,
102
149
  updateType: 'firmware',
150
+ firmwareType,
103
151
  }) as IFirmwareField;
104
152
  const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
105
153
  const currentVersion = deviceFirmwareVersion.join('.');
@@ -116,7 +164,7 @@ export default class DataManager {
116
164
  * Touch、Pro System full UI Resource Update
117
165
  * ** Interval upgrade is not considered **
118
166
  */
119
- static getSysFullResource = (features: Features) => {
167
+ static getSysFullResource = (features: Features, firmwareType: EFirmwareType) => {
120
168
  const deviceType = getDeviceType(features);
121
169
  if (deviceType === EDeviceType.Unknown) return undefined;
122
170
 
@@ -125,6 +173,7 @@ export default class DataManager {
125
173
  const firmwareUpdateField = getFirmwareUpdateField({
126
174
  features,
127
175
  updateType: 'firmware',
176
+ firmwareType,
128
177
  }) as IFirmwareField;
129
178
  const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
130
179
  const targetDeviceConfig = targetDeviceConfigList.filter(item => !!item.fullResource);
@@ -132,7 +181,7 @@ export default class DataManager {
132
181
  return findLatestRelease(targetDeviceConfig)?.fullResource;
133
182
  };
134
183
 
135
- static getBootloaderResource = (features: Features) => {
184
+ static getBootloaderResource = (features: Features, firmwareType: EFirmwareType) => {
136
185
  const deviceType = getDeviceType(features);
137
186
  if (deviceType === EDeviceType.Unknown) throw new Error('Device type is unknown');
138
187
 
@@ -140,6 +189,7 @@ export default class DataManager {
140
189
  const firmwareUpdateField = getFirmwareUpdateField({
141
190
  features,
142
191
  updateType: 'firmware',
192
+ firmwareType,
143
193
  }) as IFirmwareField;
144
194
  const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
145
195
  if (targetDeviceConfigList.length === 0) {
@@ -152,13 +202,17 @@ export default class DataManager {
152
202
  return findLatestRelease(targetDeviceConfig)?.bootloaderResource;
153
203
  };
154
204
 
155
- static getBootloaderTargetVersion = (features: Features): IVersionArray | undefined => {
205
+ static getBootloaderTargetVersion = (
206
+ features: Features,
207
+ firmwareType: EFirmwareType
208
+ ): IVersionArray | undefined => {
156
209
  const deviceType = getDeviceType(features);
157
210
  if (deviceType === EDeviceType.Unknown) return undefined;
158
211
 
159
212
  const firmwareUpdateField = getFirmwareUpdateField({
160
213
  features,
161
214
  updateType: 'firmware',
215
+ firmwareType,
162
216
  }) as IFirmwareField;
163
217
  const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
164
218
  const targetDeviceConfig = targetDeviceConfigList.filter(item => !!item.bootloaderResource);
@@ -166,7 +220,10 @@ export default class DataManager {
166
220
  return targetDeviceConfig?.[0]?.bootloaderVersion ?? undefined;
167
221
  };
168
222
 
169
- static getBootloaderRelatedFirmwareVersion = (features: Features): IVersionArray | undefined => {
223
+ static getBootloaderRelatedFirmwareVersion = (
224
+ features: Features,
225
+ firmwareType: EFirmwareType
226
+ ): IVersionArray | undefined => {
170
227
  const deviceType = getDeviceType(features);
171
228
  if (deviceType === EDeviceType.Unknown) return undefined;
172
229
 
@@ -174,6 +231,7 @@ export default class DataManager {
174
231
  const firmwareUpdateField = getFirmwareUpdateField({
175
232
  features,
176
233
  updateType: 'firmware',
234
+ firmwareType,
177
235
  }) as IFirmwareField;
178
236
  const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
179
237
  const targetDeviceConfig = targetDeviceConfigList.filter(
@@ -183,7 +241,7 @@ export default class DataManager {
183
241
  return targetDeviceConfig?.[0]?.bootloaderRelatedFirmwareVersion ?? undefined;
184
242
  };
185
243
 
186
- static getFirmwareChangelog = (features: Features) => {
244
+ static getFirmwareChangelog = (features: Features, firmwareType: EFirmwareType) => {
187
245
  const deviceType = getDeviceType(features);
188
246
  if (deviceType === EDeviceType.Unknown) return [];
189
247
 
@@ -192,6 +250,7 @@ export default class DataManager {
192
250
  const firmwareUpdateField = getFirmwareUpdateField({
193
251
  features,
194
252
  updateType: 'firmware',
253
+ firmwareType,
195
254
  }) as IFirmwareField;
196
255
  const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
197
256
 
@@ -207,13 +266,14 @@ export default class DataManager {
207
266
  return getReleaseChangelog(targetDeviceConfigList, currentVersion);
208
267
  };
209
268
 
210
- static getFirmwareLatestRelease = (features: Features) => {
269
+ static getFirmwareLatestRelease = (features: Features, firmwareType: EFirmwareType) => {
211
270
  const deviceType = getDeviceType(features);
212
271
  if (deviceType === EDeviceType.Unknown) return undefined;
213
272
 
214
273
  const firmwareUpdateField = getFirmwareUpdateField({
215
274
  features,
216
275
  updateType: 'firmware',
276
+ firmwareType,
217
277
  }) as IFirmwareField;
218
278
  const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
219
279
 
@@ -221,7 +281,7 @@ export default class DataManager {
221
281
  if (!target) return target;
222
282
 
223
283
  if (!target.resource) {
224
- const resource = this.getSysResourcesLatestRelease(features);
284
+ const resource = this.getSysResourcesLatestRelease({ features, firmwareType });
225
285
  return {
226
286
  ...target,
227
287
  resource,
@@ -278,6 +338,50 @@ export default class DataManager {
278
338
 
279
339
  static getBridgeChangelog = () => this.assets?.bridge.changelog;
280
340
 
341
+ private static enrichFirmwareReleaseInfo(
342
+ deviceData: DeviceTypeMap[keyof DeviceTypeMap] | undefined
343
+ ): DeviceTypeMap[keyof DeviceTypeMap] {
344
+ // Safety check: return default structure if input is undefined/null
345
+ if (!deviceData || typeof deviceData !== 'object') {
346
+ return {
347
+ firmware: [],
348
+ ble: [],
349
+ };
350
+ }
351
+
352
+ // Create a shallow copy to avoid mutating original data
353
+ const enrichedData = { ...deviceData };
354
+
355
+ FIRMWARE_FIELDS.forEach(field => {
356
+ const releases = enrichedData[field];
357
+
358
+ if (!releases || !Array.isArray(releases) || releases.length === 0) {
359
+ return; // Skip this field
360
+ }
361
+
362
+ // Add firmwareType to each release in this field
363
+ try {
364
+ enrichedData[field] = releases.map(release => {
365
+ // Safety checks:
366
+ if (!release || typeof release !== 'object' || !!release.firmwareType) {
367
+ return release; // Return as-is if invalid or already has firmwareType
368
+ }
369
+
370
+ const firmwareType = getFirmwareTypeFromField(field);
371
+
372
+ return {
373
+ ...release,
374
+ firmwareType,
375
+ };
376
+ });
377
+ } catch (error) {
378
+ console.error(`Error enriching firmware field "${field}":`, error);
379
+ }
380
+ });
381
+
382
+ return enrichedData;
383
+ }
384
+
281
385
  static async load(settings: ConnectSettings) {
282
386
  this.settings = settings;
283
387
  if (!settings.fetchConfig) {
@@ -296,12 +400,12 @@ export default class DataManager {
296
400
  }
297
401
  );
298
402
  this.deviceMap = {
299
- [EDeviceType.Classic]: data.classic,
300
- [EDeviceType.Classic1s]: data.classic1s,
301
- [EDeviceType.ClassicPure]: data.classicpure,
302
- [EDeviceType.Mini]: data.mini,
303
- [EDeviceType.Touch]: data.touch,
304
- [EDeviceType.Pro]: data.pro,
403
+ [EDeviceType.Classic]: this.enrichFirmwareReleaseInfo(data.classic),
404
+ [EDeviceType.Classic1s]: this.enrichFirmwareReleaseInfo(data.classic1s),
405
+ [EDeviceType.ClassicPure]: this.enrichFirmwareReleaseInfo(data.classicpure),
406
+ [EDeviceType.Mini]: this.enrichFirmwareReleaseInfo(data.mini),
407
+ [EDeviceType.Touch]: this.enrichFirmwareReleaseInfo(data.touch),
408
+ [EDeviceType.Pro]: this.enrichFirmwareReleaseInfo(data.pro),
305
409
  };
306
410
  this.assets = {
307
411
  bridge: data.bridge,
@@ -1,6 +1,7 @@
1
+ import type { IBLEFirmwareReleaseInfo } from '../settings';
2
+ import type { EFirmwareType } from '@onekeyfe/hd-shared';
1
3
  import type { CommonParams, Response } from '../params';
2
4
  import type { IDeviceBLEFirmwareStatus, IDeviceFirmwareStatus } from '../device';
3
- import { IBLEFirmwareReleaseInfo } from '../settings';
4
5
 
5
6
  export type FirmwareRelease = {
6
7
  shouldUpdate?: boolean;
@@ -22,6 +23,7 @@ export type AllFirmwareRelease = {
22
23
 
23
24
  export type CheckAllFirmwareReleaseParams = {
24
25
  checkBridgeRelease?: boolean;
26
+ firmwareType?: EFirmwareType;
25
27
  };
26
28
 
27
29
  export declare function checkAllFirmwareRelease(
@@ -1,3 +1,4 @@
1
+ import type { EFirmwareType } from '@onekeyfe/hd-shared';
1
2
  import type { CommonParams, Response } from '../params';
2
3
 
3
4
  export type CheckBootloaderReleaseResponse = {
@@ -7,9 +8,12 @@ export type CheckBootloaderReleaseResponse = {
7
8
  bootloaderMode: boolean;
8
9
  } | null;
9
10
 
11
+ export type CheckBootloaderReleaseParams = {
12
+ willUpdateFirmwareVersion?: string;
13
+ firmwareType?: EFirmwareType;
14
+ };
15
+
10
16
  export declare function checkBootloaderRelease(
11
17
  connectId?: string,
12
- params?: CommonParams & {
13
- willUpdateFirmwareVersion?: string;
14
- }
18
+ params?: CommonParams & CheckBootloaderReleaseParams
15
19
  ): Response<CheckBootloaderReleaseResponse>;
@@ -1,6 +1,7 @@
1
+ import type { IFirmwareReleaseInfo } from '../settings';
2
+ import type { EFirmwareType } from '@onekeyfe/hd-shared';
1
3
  import type { Response } from '../params';
2
4
  import type { IDeviceFirmwareStatus } from '../device';
3
- import { IFirmwareReleaseInfo } from '../settings';
4
5
 
5
6
  type FirmwareRelease = {
6
7
  status: IDeviceFirmwareStatus;
@@ -12,4 +13,11 @@ type FirmwareRelease = {
12
13
  bootloaderMode: boolean;
13
14
  };
14
15
 
15
- export declare function checkFirmwareRelease(connectId?: string): Response<FirmwareRelease>;
16
+ export type CheckFirmwareReleaseParams = {
17
+ firmwareType?: EFirmwareType;
18
+ };
19
+
20
+ export declare function checkFirmwareRelease(
21
+ connectId?: string,
22
+ params?: CheckFirmwareReleaseParams
23
+ ): Response<FirmwareRelease>;
@@ -1,6 +1,12 @@
1
- import { Success } from '@onekeyfe/hd-transport';
1
+ import type { Success } from '@onekeyfe/hd-transport';
2
+ import type { EFirmwareType } from '@onekeyfe/hd-shared';
2
3
  import type { CommonParams, Response } from '../params';
3
4
 
5
+ export type DeviceFullyUploadResourceParams = {
6
+ binary?: ArrayBuffer;
7
+ firmwareType?: EFirmwareType;
8
+ };
9
+
4
10
  export declare function deviceFullyUploadResource(
5
11
  connectId: string,
6
12
  params: CommonParams & {
@@ -1,9 +1,13 @@
1
- import { Success } from '@onekeyfe/hd-transport';
1
+ import type { Success } from '@onekeyfe/hd-transport';
2
+ import type { EFirmwareType } from '@onekeyfe/hd-shared';
2
3
  import type { Response } from '../params';
3
4
 
5
+ export type DeviceUpdateBootloaderParams = {
6
+ binary?: ArrayBuffer;
7
+ firmwareType?: EFirmwareType;
8
+ };
9
+
4
10
  export declare function deviceUpdateBootloader(
5
11
  connectId: string,
6
- params?: {
7
- binary?: ArrayBuffer;
8
- }
12
+ params?: DeviceUpdateBootloaderParams
9
13
  ): Response<Success>;
@@ -1,3 +1,4 @@
1
+ import type { EFirmwareType } from '@onekeyfe/hd-shared';
1
2
  import type { PROTO } from '../../constants';
2
3
  import type { Params, Response } from '../params';
3
4
 
@@ -10,10 +11,10 @@ export interface FirmwareUpdateBinaryParams {
10
11
 
11
12
  export interface FirmwareUpdateParams {
12
13
  version?: number[];
13
- btcOnly?: boolean;
14
14
  updateType: IUpdateType;
15
15
  forcedUpdateRes?: boolean;
16
16
  isUpdateBootloader?: boolean;
17
+ firmwareType?: EFirmwareType;
17
18
  }
18
19
 
19
20
  export declare function firmwareUpdate(
@@ -50,6 +51,8 @@ export interface FirmwareUpdateV3Params {
50
51
  resourceBinary?: ArrayBuffer;
51
52
  forcedUpdateRes?: boolean;
52
53
 
54
+ firmwareType?: EFirmwareType;
55
+
53
56
  platform: IPlatform;
54
57
  }
55
58
 
@@ -1,3 +1,4 @@
1
+ import type { EFirmwareType } from '@onekeyfe/hd-shared';
1
2
  import type { IDeviceType } from './device';
2
3
 
3
4
  export type transportEnv =
@@ -40,6 +41,11 @@ export type ILocale = 'zh-CN' | 'en-US';
40
41
  export type IFirmwareReleaseInfo = {
41
42
  required: boolean;
42
43
  url: string;
44
+ /**
45
+ * Firmware type (bitcoinonly or universal)
46
+ * This field is not present in the remote config, but will be inferred from the firmware field name
47
+ */
48
+ firmwareType?: EFirmwareType;
43
49
  /** Firmware UI resource */
44
50
  resource?: string;
45
51
  /** Firmware full UI resource */
@@ -75,11 +81,42 @@ export type IBLEFirmwareReleaseInfo = {
75
81
  };
76
82
 
77
83
  type IKnownDevice = Exclude<IDeviceType, 'unknown'>;
84
+
85
+ /**
86
+ * Device firmware configuration map
87
+ *
88
+ * IMPORTANT: This type is used for firmware update logic.
89
+ * - DO NOT remove existing firmware fields
90
+ * - Only ADD new optional firmware fields for new versions
91
+ * - 'firmware' field is required for backward compatibility
92
+ * - 'ble' field is required for BLE firmware updates
93
+ *
94
+ * @example
95
+ * // When adding firmware-v8:
96
+ * // {
97
+ * // firmware: IFirmwareReleaseInfo[];
98
+ * // 'firmware-v2'?: IFirmwareReleaseInfo[];
99
+ * // 'firmware-v7'?: IFirmwareReleaseInfo[];
100
+ * // 'firmware-v8'?: IFirmwareReleaseInfo[]; // New
101
+ * // 'firmware-btc-v7'?: IFirmwareReleaseInfo[];
102
+ * // 'firmware-btc-v8'?: IFirmwareReleaseInfo[]; // New
103
+ * // ble: IBLEFirmwareReleaseInfo[];
104
+ * // }
105
+ */
78
106
  export type DeviceTypeMap = {
79
107
  [k in IKnownDevice]: {
108
+ /** Base firmware field (required for backward compatibility) */
80
109
  firmware: IFirmwareReleaseInfo[];
110
+ /** Firmware v2 (Touch/Pro specific) */
81
111
  'firmware-v2'?: IFirmwareReleaseInfo[];
112
+ /** Universal firmware v7 */
82
113
  'firmware-v7'?: IFirmwareReleaseInfo[];
114
+ /** Bitcoin-only firmware v7 */
115
+ 'firmware-btc-v7'?: IFirmwareReleaseInfo[];
116
+ // Future firmware versions should be added here as optional fields:
117
+ // 'firmware-v8'?: IFirmwareReleaseInfo[];
118
+ // 'firmware-btc-v8'?: IFirmwareReleaseInfo[];
119
+ /** BLE firmware (required) */
83
120
  ble: IBLEFirmwareReleaseInfo[];
84
121
  };
85
122
  };
@@ -1,18 +1,20 @@
1
1
  import semver from 'semver';
2
2
  import { isNaN } from 'lodash';
3
- import { EDeviceType, ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
3
+ import { EDeviceType, type EFirmwareType, ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
4
4
  import { Enum_Capability } from '@onekeyfe/hd-transport';
5
+
5
6
  import { toHardened } from '../api/helpers/pathUtils';
6
- import { DeviceCommands } from '../device/DeviceCommands';
7
- import type { Features, SupportFeatureType } from '../types';
8
7
  import { DeviceModelToTypes, DeviceTypeToModels } from '../types';
9
- import DataManager, { IFirmwareField, MessageVersion } from '../data-manager/DataManager';
8
+ import DataManager, { type IFirmwareField, type MessageVersion } from '../data-manager/DataManager';
10
9
  import { PROTOBUF_MESSAGE_CONFIG } from '../data-manager/MessagesConfig';
11
- import { Device } from '../device/Device';
12
10
  import { getDeviceType } from './deviceInfoUtils';
13
11
  import { getDeviceFirmwareVersion } from './deviceVersionUtils';
14
12
  import { existCapability } from './capabilitieUtils';
15
13
 
14
+ import type { Device } from '../device/Device';
15
+ import type { DeviceCommands } from '../device/DeviceCommands';
16
+ import type { Features, SupportFeatureType } from '../types';
17
+
16
18
  export const getSupportMessageVersion = (
17
19
  features: Features | undefined
18
20
  ): { messages: JSON; messageVersion: MessageVersion } => {
@@ -231,6 +233,13 @@ export const supportModifyHomescreen = (features?: Features): SupportFeatureType
231
233
  return { support: semver.gte(currentVersion, '3.4.0') };
232
234
  };
233
235
 
236
+ const getLatestFirmwareField = (firmwareType?: EFirmwareType): IFirmwareField => {
237
+ if (firmwareType === 'bitcoinonly') {
238
+ return `firmware-btc-v7`;
239
+ }
240
+ return `firmware-v7`;
241
+ };
242
+
234
243
  /**
235
244
  * Since 3.5.0, Touch uses the firmware-v3 field to get firmware release info
236
245
  */
@@ -238,33 +247,36 @@ export const getFirmwareUpdateField = ({
238
247
  features,
239
248
  updateType,
240
249
  targetVersion,
250
+ firmwareType,
241
251
  }: {
242
252
  features: Features;
243
253
  updateType: 'firmware' | 'ble';
244
254
  targetVersion?: string;
255
+ firmwareType: EFirmwareType;
245
256
  }): 'ble' | IFirmwareField => {
246
257
  const deviceType = getDeviceType(features);
247
258
  const deviceFirmwareVersion = getDeviceFirmwareVersion(features);
248
259
  if (updateType === 'ble') {
249
260
  return 'ble';
250
261
  }
262
+ const latestFirmwareField = getLatestFirmwareField(firmwareType);
251
263
 
252
264
  if (DeviceModelToTypes.model_mini.includes(deviceType)) {
253
- return 'firmware-v7';
265
+ return latestFirmwareField;
254
266
  }
255
267
 
256
268
  if (deviceType === EDeviceType.Touch) {
257
269
  if (targetVersion) {
258
270
  if (semver.eq(targetVersion, '4.0.0')) return 'firmware-v2';
259
- if (semver.gt(targetVersion, '4.0.0')) return 'firmware-v7';
271
+ if (semver.gt(targetVersion, '4.0.0')) return latestFirmwareField;
260
272
  }
261
273
 
262
274
  if (semver.lt(deviceFirmwareVersion.join('.'), '3.4.0')) return 'firmware';
263
275
 
264
- return 'firmware-v7';
276
+ return latestFirmwareField;
265
277
  }
266
278
  if (deviceType === EDeviceType.Pro) {
267
- return 'firmware-v7';
279
+ return latestFirmwareField;
268
280
  }
269
281
  return 'firmware';
270
282
  };
@@ -276,7 +288,7 @@ export const getFirmwareUpdateField = ({
276
288
  export const getFirmwareUpdateFieldArray = (
277
289
  features: Features,
278
290
  updateType: 'firmware' | 'ble' | 'bootloader'
279
- ): ('firmware' | 'ble' | 'firmware-v2' | 'firmware-v7')[] => {
291
+ ): ('ble' | IFirmwareField)[] => {
280
292
  const deviceType = getDeviceType(features);
281
293
  if (updateType === 'ble') {
282
294
  return ['ble'];
@@ -1,5 +1,6 @@
1
1
  import semver from 'semver';
2
- import {
2
+
3
+ import type {
3
4
  IBLEFirmwareReleaseInfo,
4
5
  IDeviceFirmwareStatus,
5
6
  IFirmwareReleaseInfo,