@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.
- package/dist/api/BaseMethod.d.ts +4 -4
- package/dist/api/BaseMethod.d.ts.map +1 -1
- package/dist/api/CheckAllFirmwareRelease.d.ts +1 -1
- package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
- package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
- package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
- package/dist/api/FirmwareUpdate.d.ts +1 -1
- package/dist/api/FirmwareUpdate.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV2.d.ts +3 -2
- package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV3.d.ts +2 -2
- package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
- package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts +2 -2
- package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
- package/dist/api/device/DeviceFullyUploadResource.d.ts.map +1 -1
- package/dist/api/device/DeviceUpdateBootloader.d.ts +6 -1
- package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
- package/dist/api/firmware/getBinary.d.ts +6 -3
- package/dist/api/firmware/getBinary.d.ts.map +1 -1
- package/dist/api/firmware/releaseHelper.d.ts +7 -2
- package/dist/api/firmware/releaseHelper.d.ts.map +1 -1
- package/dist/api/firmware/updateBootloader.d.ts +7 -2
- package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
- package/dist/api/sui/SuiSignTransaction.d.ts +1 -1
- package/dist/api/sui/SuiSignTransaction.d.ts.map +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/data-manager/DataManager.d.ts +16 -9
- package/dist/data-manager/DataManager.d.ts.map +1 -1
- package/dist/index.d.ts +43 -21
- package/dist/index.js +199 -70
- package/dist/types/api/checkAllFirmwareRelease.d.ts +3 -1
- package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
- package/dist/types/api/checkBootloaderRelease.d.ts +5 -2
- package/dist/types/api/checkBootloaderRelease.d.ts.map +1 -1
- package/dist/types/api/checkFirmwareRelease.d.ts +6 -2
- package/dist/types/api/checkFirmwareRelease.d.ts.map +1 -1
- package/dist/types/api/deviceFullyUploadResource.d.ts +6 -1
- package/dist/types/api/deviceFullyUploadResource.d.ts.map +1 -1
- package/dist/types/api/deviceUpdateBootloader.d.ts +6 -3
- package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdate.d.ts +3 -1
- package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
- package/dist/types/settings.d.ts +3 -0
- package/dist/types/settings.d.ts.map +1 -1
- package/dist/utils/deviceFeaturesUtils.d.ts +7 -5
- package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
- package/dist/utils/release.d.ts +1 -1
- package/dist/utils/release.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/api/BaseMethod.ts +17 -7
- package/src/api/CheckAllFirmwareRelease.ts +13 -6
- package/src/api/CheckBootloaderRelease.ts +13 -2
- package/src/api/CheckFirmwareRelease.ts +9 -2
- package/src/api/FirmwareUpdate.ts +7 -5
- package/src/api/FirmwareUpdateV2.ts +26 -14
- package/src/api/FirmwareUpdateV3.ts +29 -18
- package/src/api/allnetwork/AllNetworkGetAddressBase.ts +10 -11
- package/src/api/device/DeviceFullyUploadResource.ts +8 -2
- package/src/api/device/DeviceUpdateBootloader.ts +21 -5
- package/src/api/firmware/getBinary.ts +15 -4
- package/src/api/firmware/releaseHelper.ts +22 -11
- package/src/api/firmware/updateBootloader.ts +17 -9
- package/src/api/sui/SuiSignTransaction.ts +7 -1
- package/src/core/index.ts +3 -1
- package/src/data-manager/DataManager.ts +126 -22
- package/src/types/api/checkAllFirmwareRelease.ts +3 -1
- package/src/types/api/checkBootloaderRelease.ts +7 -3
- package/src/types/api/checkFirmwareRelease.ts +10 -2
- package/src/types/api/deviceFullyUploadResource.ts +7 -1
- package/src/types/api/deviceUpdateBootloader.ts +8 -4
- package/src/types/api/firmwareUpdate.ts +4 -1
- package/src/types/settings.ts +37 -0
- package/src/utils/deviceFeaturesUtils.ts +22 -10
- 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
|
|
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 = (
|
|
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({
|
|
116
|
+
const firmwareUpdateField = getFirmwareUpdateField({
|
|
117
|
+
features,
|
|
118
|
+
updateType: 'firmware',
|
|
119
|
+
firmwareType,
|
|
120
|
+
});
|
|
85
121
|
const targetDeviceConfigList = this.deviceMap[deviceType]?.[firmwareUpdateField] ?? [];
|
|
86
|
-
|
|
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 = (
|
|
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 = (
|
|
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 = (
|
|
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
|
|
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
|
|
package/src/types/settings.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
276
|
+
return latestFirmwareField;
|
|
265
277
|
}
|
|
266
278
|
if (deviceType === EDeviceType.Pro) {
|
|
267
|
-
return
|
|
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
|
-
): ('
|
|
291
|
+
): ('ble' | IFirmwareField)[] => {
|
|
280
292
|
const deviceType = getDeviceType(features);
|
|
281
293
|
if (updateType === 'ble') {
|
|
282
294
|
return ['ble'];
|