@onekeyfe/hd-core 1.2.0-alpha.101 → 1.2.0-alpha.103

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 (63) hide show
  1. package/__tests__/base64Data.test.ts +70 -0
  2. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +2 -0
  3. package/__tests__/device-pool-state.test.ts +29 -0
  4. package/__tests__/deviceUploadNft.test.ts +33 -4
  5. package/__tests__/get-device-state.test.ts +102 -13
  6. package/__tests__/protocol-v2-legacy-recovery.test.ts +29 -0
  7. package/__tests__/protocol-v2.test.ts +309 -17
  8. package/__tests__/refresh-device-state.test.ts +4 -1
  9. package/__tests__/resourceBase64Boundary.test.ts +48 -0
  10. package/__tests__/search-devices.test.ts +2 -0
  11. package/__tests__/ton-sign-message.test.ts +84 -0
  12. package/dist/api/FirmwareUpdateV4.d.ts +3 -0
  13. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  14. package/dist/api/GetDeviceState.d.ts.map +1 -1
  15. package/dist/api/SearchDevices.d.ts.map +1 -1
  16. package/dist/api/UploadPortfolio.d.ts +1 -1
  17. package/dist/api/UploadPortfolio.d.ts.map +1 -1
  18. package/dist/api/firmware/protocolV2Release.d.ts.map +1 -1
  19. package/dist/api/helpers/base64Data.d.ts +16 -0
  20. package/dist/api/helpers/base64Data.d.ts.map +1 -0
  21. package/dist/api/protocol-v2/DeviceUploadNft.d.ts +2 -3
  22. package/dist/api/protocol-v2/DeviceUploadNft.d.ts.map +1 -1
  23. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts +2 -3
  24. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts.map +1 -1
  25. package/dist/api/ton/TonSignMessage.d.ts.map +1 -1
  26. package/dist/core/index.d.ts.map +1 -1
  27. package/dist/core/protocolV2LegacyRecovery.d.ts +5 -0
  28. package/dist/core/protocolV2LegacyRecovery.d.ts.map +1 -0
  29. package/dist/device/Device.d.ts +9 -2
  30. package/dist/device/Device.d.ts.map +1 -1
  31. package/dist/device/DevicePool.d.ts +1 -1
  32. package/dist/device/DevicePool.d.ts.map +1 -1
  33. package/dist/index.d.ts +16 -14
  34. package/dist/index.js +266 -86
  35. package/dist/protocols/protocol-v2/features.d.ts +8 -0
  36. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  37. package/dist/protocols/protocol-v2/index.d.ts +2 -2
  38. package/dist/protocols/protocol-v2/index.d.ts.map +1 -1
  39. package/dist/types/api/getDeviceState.d.ts +1 -0
  40. package/dist/types/api/getDeviceState.d.ts.map +1 -1
  41. package/dist/types/api/protocolV2.d.ts +1 -1
  42. package/dist/types/api/protocolV2.d.ts.map +1 -1
  43. package/dist/utils/pro2Nft.d.ts +7 -0
  44. package/dist/utils/pro2Nft.d.ts.map +1 -1
  45. package/package.json +6 -4
  46. package/src/api/FirmwareUpdateV4.ts +70 -23
  47. package/src/api/GetDeviceState.ts +1 -0
  48. package/src/api/SearchDevices.ts +2 -0
  49. package/src/api/UploadPortfolio.ts +9 -2
  50. package/src/api/firmware/protocolV2Release.ts +1 -0
  51. package/src/api/helpers/base64Data.ts +85 -0
  52. package/src/api/protocol-v2/DeviceUploadNft.ts +56 -8
  53. package/src/api/protocol-v2/DeviceUploadWallpaper.ts +37 -18
  54. package/src/api/ton/TonSignMessage.ts +5 -3
  55. package/src/core/index.ts +4 -0
  56. package/src/core/protocolV2LegacyRecovery.ts +12 -0
  57. package/src/device/Device.ts +78 -20
  58. package/src/device/DevicePool.ts +17 -5
  59. package/src/protocols/protocol-v2/features.ts +10 -0
  60. package/src/protocols/protocol-v2/index.ts +2 -0
  61. package/src/types/api/getDeviceState.ts +2 -0
  62. package/src/types/api/protocolV2.ts +1 -1
  63. package/src/utils/pro2Nft.ts +31 -8
@@ -1,7 +1,10 @@
1
+ import { Buffer } from 'buffer';
2
+
1
3
  import { EFirmwareType, ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
2
4
  import { sha256 } from '@noble/hashes/sha256';
3
5
  import { bytesToHex } from '@noble/hashes/utils';
4
6
  import JSZip from 'jszip';
7
+ import { encode as encodeJpeg } from 'jpeg-js';
5
8
  import {
6
9
  DeviceRebootType,
7
10
  DeviceSessionPinType,
@@ -123,6 +126,18 @@ jest.mock('../src/data/config', () => ({
123
126
  DEFAULT_DOMAIN: 'https://jssdk.onekey.so/1.0.0/',
124
127
  }));
125
128
 
129
+ const jpegBase64Cache = new Map<string, string>();
130
+
131
+ const createJpegBase64 = (width: number, height: number) => {
132
+ const key = `${width}x${height}`;
133
+ const cached = jpegBase64Cache.get(key);
134
+ if (cached) return cached;
135
+ const rgba = new Uint8Array(width * height * 4).fill(0xff);
136
+ const value = encodeJpeg({ width, height, data: rgba }, 80).data.toString('base64');
137
+ jpegBase64Cache.set(key, value);
138
+ return value;
139
+ };
140
+
126
141
  const createProtocolV2OkppBinary = ({
127
142
  version = [1, 2, 3],
128
143
  payloadHashByte = 0x11,
@@ -160,8 +175,18 @@ const createWalletSessionTypedCall = (
160
175
  });
161
176
 
162
177
  describe('DeviceUploadWallpaper', () => {
178
+ const wallpaperProtocolInfo = {
179
+ version: 2,
180
+ supported_messages: [60412, 60805, 60809],
181
+ };
182
+
183
+ const stubWallpaperDevice = <T extends Record<string, any>>(device: T) =>
184
+ stubDevice({
185
+ ...device,
186
+ ensureProtocolV2RuntimeContext: jest.fn().mockResolvedValue(wallpaperProtocolInfo),
187
+ });
188
+
163
189
  test('encodes, uploads and applies a Pro2 wallpaper', async () => {
164
- const rgba = new Uint8Array(604 * 1024 * 4).fill(255);
165
190
  const typedCall = jest.fn().mockImplementation((request, _response, params) => {
166
191
  if (request === 'FilesystemDirMake') return { message: { message: 'directory ready' } };
167
192
  if (request === 'FilesystemFileWrite') {
@@ -175,9 +200,12 @@ describe('DeviceUploadWallpaper', () => {
175
200
  });
176
201
  const method = new DeviceUploadWallpaper({
177
202
  id: 1,
178
- payload: { method: 'deviceUploadWallpaper', width: 604, height: 1024, rgba },
203
+ payload: {
204
+ method: 'deviceUploadWallpaper',
205
+ jpegBase64: createJpegBase64(604, 1024),
206
+ },
179
207
  });
180
- (method as any).device = stubDevice({ commands: { typedCall } });
208
+ (method as any).device = stubWallpaperDevice({ commands: { typedCall } });
181
209
  method.postMessage = jest.fn();
182
210
 
183
211
  method.init();
@@ -225,12 +253,10 @@ describe('DeviceUploadWallpaper', () => {
225
253
  id: 1,
226
254
  payload: {
227
255
  method: 'deviceUploadWallpaper',
228
- width: 604,
229
- height: 1024,
230
- rgba: new Uint8Array(604 * 1024 * 4),
256
+ jpegBase64: createJpegBase64(604, 1024),
231
257
  },
232
258
  });
233
- (method as any).device = stubDevice({ commands: { typedCall } });
259
+ (method as any).device = stubWallpaperDevice({ commands: { typedCall } });
234
260
  method.init();
235
261
 
236
262
  await expect(method.run()).rejects.toThrow('write failed');
@@ -242,15 +268,37 @@ describe('DeviceUploadWallpaper', () => {
242
268
  id: 1,
243
269
  payload: {
244
270
  method: 'deviceUploadWallpaper',
245
- width: 604,
246
- height: 1024,
247
- rgba: new Uint8Array(604 * 1024 * 4),
271
+ jpegBase64: createJpegBase64(604, 1024),
248
272
  fileName: '../wallpaper.bin',
249
273
  },
250
274
  });
251
275
 
252
276
  expect(() => method.init()).toThrow('fileName');
253
277
  });
278
+
279
+ test('rejects unsupported firmware before creating or writing files', async () => {
280
+ const typedCall = jest.fn();
281
+ const method = new DeviceUploadWallpaper({
282
+ id: 1,
283
+ payload: {
284
+ method: 'deviceUploadWallpaper',
285
+ jpegBase64: createJpegBase64(604, 1024),
286
+ },
287
+ });
288
+ (method as any).device = stubDevice({
289
+ commands: { typedCall },
290
+ ensureProtocolV2RuntimeContext: jest.fn().mockResolvedValue({
291
+ version: 2,
292
+ supported_messages: [60805, 60809],
293
+ }),
294
+ });
295
+ method.init();
296
+
297
+ await expect(method.run()).rejects.toMatchObject({
298
+ errorCode: HardwareErrorCode.DeviceNotSupportMethod,
299
+ });
300
+ expect(typedCall).not.toHaveBeenCalled();
301
+ });
254
302
  });
255
303
 
256
304
  describe('UploadPortfolio', () => {
@@ -266,7 +314,6 @@ describe('UploadPortfolio', () => {
266
314
  });
267
315
 
268
316
  test('writes and applies the portfolio while the device is locked without unlocking', async () => {
269
- const packageBytes = new Uint8Array([1, 2, 3]);
270
317
  const typedCall = jest
271
318
  .fn()
272
319
  .mockResolvedValueOnce({ message: { processed_byte: 3 } })
@@ -282,7 +329,7 @@ describe('UploadPortfolio', () => {
282
329
  id: 1,
283
330
  payload: {
284
331
  method: 'uploadPortfolio',
285
- packageBytes,
332
+ packageBase64: 'AQID',
286
333
  },
287
334
  });
288
335
  (method as any).device = device;
@@ -314,7 +361,7 @@ describe('UploadPortfolio', () => {
314
361
  id: 1,
315
362
  payload: {
316
363
  method: 'uploadPortfolio',
317
- packageBytes,
364
+ packageBase64: 'AQID',
318
365
  },
319
366
  });
320
367
  (method as any).device = stubPortfolioDevice({ commands: { typedCall } });
@@ -362,7 +409,7 @@ describe('UploadPortfolio', () => {
362
409
  id: 1,
363
410
  payload: {
364
411
  method: 'uploadPortfolio',
365
- packageBytes: new Uint8Array([1]),
412
+ packageBase64: 'AQ==',
366
413
  },
367
414
  });
368
415
  (method as any).device = stubPortfolioDevice({ commands: { typedCall } });
@@ -384,7 +431,7 @@ describe('UploadPortfolio', () => {
384
431
  id: 1,
385
432
  payload: {
386
433
  method: 'uploadPortfolio',
387
- packageBytes,
434
+ packageBase64: Buffer.from(packageBytes).toString('base64'),
388
435
  },
389
436
  });
390
437
  method.abortSignal = abortController.signal;
@@ -405,7 +452,7 @@ describe('UploadPortfolio', () => {
405
452
  id: 1,
406
453
  payload: {
407
454
  method: 'uploadPortfolio',
408
- packageBytes: new Uint8Array([1]),
455
+ packageBase64: 'AQ==',
409
456
  },
410
457
  });
411
458
  (method as any).device = stubDevice({
@@ -423,6 +470,18 @@ describe('UploadPortfolio', () => {
423
470
  });
424
471
  expect(typedCall).not.toHaveBeenCalled();
425
472
  });
473
+
474
+ test('rejects non-canonical Base64 before device communication', () => {
475
+ const method = new UploadPortfolio({
476
+ id: 1,
477
+ payload: {
478
+ method: 'uploadPortfolio',
479
+ packageBase64: 'data:application/octet-stream;base64,AQID',
480
+ },
481
+ });
482
+
483
+ expect(() => method.init()).toThrow('canonical Base64');
484
+ });
426
485
  });
427
486
 
428
487
  const descriptor = {
@@ -3194,6 +3253,125 @@ describe('Protocol V2 feature adapter', () => {
3194
3253
  expect(typedCall).toHaveBeenCalledTimes(1);
3195
3254
  });
3196
3255
 
3256
+ test('rejects a cached legacy ProtocolInfo outside discovery and firmware recovery', async () => {
3257
+ const device = Device.fromDescriptor({
3258
+ path: 'usb-path',
3259
+ protocolType: 'V2',
3260
+ } as any);
3261
+ const typedCall = jest.fn().mockResolvedValue({
3262
+ type: 'ProtocolInfo',
3263
+ message: {
3264
+ version: 1,
3265
+ build_fingerprint: '',
3266
+ supported_messages: [],
3267
+ protobuf_definition: null,
3268
+ },
3269
+ });
3270
+ (device as any).commands = { typedCall };
3271
+
3272
+ await expect(
3273
+ device.probeProtocolV2RuntimeState({
3274
+ hw: { Device_type: DeviceType.PRO2, serial_no: 'PR2SERIAL' },
3275
+ fw: { application: { version: '1.2.3' } },
3276
+ })
3277
+ ).rejects.toMatchObject({ errorCode: HardwareErrorCode.DeviceInitializeFailed });
3278
+
3279
+ expect(typedCall).toHaveBeenCalledTimes(1);
3280
+ });
3281
+
3282
+ test('uses DeviceStatusGet to identify App mode for an allowed legacy ProtocolInfo', async () => {
3283
+ const device = Device.fromDescriptor({
3284
+ path: 'usb-path',
3285
+ protocolType: 'V2',
3286
+ } as any);
3287
+ const typedCall = jest
3288
+ .fn()
3289
+ .mockResolvedValueOnce({
3290
+ type: 'ProtocolInfo',
3291
+ message: {
3292
+ version: 1,
3293
+ build_fingerprint: '',
3294
+ supported_messages: [],
3295
+ protobuf_definition: null,
3296
+ },
3297
+ })
3298
+ .mockResolvedValueOnce({
3299
+ type: 'DeviceStatus',
3300
+ message: { init_states: true, unlocked: true },
3301
+ });
3302
+ (device as any).commands = { typedCall };
3303
+
3304
+ await device.probeProtocolV2RuntimeState(
3305
+ {
3306
+ hw: { Device_type: DeviceType.PRO2, serial_no: 'PR2SERIAL' },
3307
+ fw: { application: { version: '1.2.3' } },
3308
+ },
3309
+ 5000,
3310
+ { allowLegacyProtocolV2ProtocolInfo: true }
3311
+ );
3312
+
3313
+ expect(typedCall).toHaveBeenNthCalledWith(
3314
+ 1,
3315
+ 'ProtocolInfoRequest',
3316
+ 'ProtocolInfo',
3317
+ { eventless_wallet_session: true },
3318
+ { timeoutMs: 5000 }
3319
+ );
3320
+ expect(typedCall).toHaveBeenNthCalledWith(
3321
+ 2,
3322
+ 'DeviceStatusGet',
3323
+ 'DeviceStatus',
3324
+ {},
3325
+ { timeoutMs: 5000 }
3326
+ );
3327
+ expect(device.features).toMatchObject({
3328
+ mode: 'normal',
3329
+ bootloaderMode: false,
3330
+ initialized: true,
3331
+ unlocked: true,
3332
+ });
3333
+ });
3334
+
3335
+ test('maps an allowed legacy loader to bootloader only after an explicit unsupported status', async () => {
3336
+ const device = Device.fromDescriptor({
3337
+ path: 'usb-path',
3338
+ protocolType: 'V2',
3339
+ } as any);
3340
+ const typedCall = jest
3341
+ .fn()
3342
+ .mockResolvedValueOnce({
3343
+ type: 'ProtocolInfo',
3344
+ message: {
3345
+ version: 1,
3346
+ build_fingerprint: '',
3347
+ supported_messages: [],
3348
+ protobuf_definition: null,
3349
+ },
3350
+ })
3351
+ .mockRejectedValueOnce(new Error('Failure_UnexpectedMessage,Unknown message'));
3352
+ (device as any).commands = { typedCall };
3353
+
3354
+ await device.probeProtocolV2RuntimeState(
3355
+ {
3356
+ hw: { Device_type: DeviceType.NEO, serial_no: 'NEOSERIAL' },
3357
+ fw: { bootloader: { version: '0.2.0' } },
3358
+ },
3359
+ undefined,
3360
+ { allowLegacyProtocolV2ProtocolInfo: true }
3361
+ );
3362
+
3363
+ expect(typedCall).toHaveBeenNthCalledWith(1, 'ProtocolInfoRequest', 'ProtocolInfo', {
3364
+ eventless_wallet_session: true,
3365
+ });
3366
+ expect(typedCall).toHaveBeenNthCalledWith(2, 'DeviceStatusGet', 'DeviceStatus', {});
3367
+ expect(device.features).toMatchObject({
3368
+ deviceType: 'neo',
3369
+ mode: 'bootloader',
3370
+ bootloaderMode: true,
3371
+ initialized: null,
3372
+ });
3373
+ });
3374
+
3197
3375
  test('does not reinterpret a state update error as runtime detection failure', async () => {
3198
3376
  const device = Device.fromDescriptor({
3199
3377
  path: 'usb-path',
@@ -4249,6 +4427,43 @@ describe('Protocol V2 firmware update targets', () => {
4249
4427
  expect(method.postTipMessage).toHaveBeenCalledWith('GoToBootloaderSuccess');
4250
4428
  });
4251
4429
 
4430
+ test('keeps an ambiguous legacy runtime on the direct loader update path', async () => {
4431
+ const method = new FirmwareUpdateV4({
4432
+ id: 1,
4433
+ payload: {
4434
+ method: 'firmwareUpdateV4',
4435
+ },
4436
+ });
4437
+ (method as any).device = stubDevice({
4438
+ originalDescriptor: { id: 'usb-id', path: 'legacy-path', protocolType: 'V2' },
4439
+ state: {
4440
+ raw: {
4441
+ protocolV2ProtocolInfo: {
4442
+ version: 1,
4443
+ build_fingerprint: '',
4444
+ supported_messages: [],
4445
+ protobuf_definition: null,
4446
+ },
4447
+ },
4448
+ },
4449
+ features: {
4450
+ deviceType: 'pro2',
4451
+ mode: 'bootloader',
4452
+ bootloaderMode: true,
4453
+ capabilities: [],
4454
+ },
4455
+ isBootloader: () => true,
4456
+ isRomloader: () => false,
4457
+ });
4458
+ (method as any).protocolV2Reboot = jest.fn();
4459
+ method.postTipMessage = jest.fn();
4460
+
4461
+ await expect((method as any).enterProtocolV2BootloaderMode()).resolves.toBe(false);
4462
+
4463
+ expect((method as any).protocolV2LegacyDirectUpdate).toBe(true);
4464
+ expect((method as any).protocolV2Reboot).not.toHaveBeenCalled();
4465
+ });
4466
+
4252
4467
  test('keeps Protocol V2 romloader active before firmware transfer', async () => {
4253
4468
  const method = new FirmwareUpdateV4({
4254
4469
  id: 1,
@@ -4881,6 +5096,81 @@ describe('Protocol V2 firmware update targets', () => {
4881
5096
  expect(method.postProgressMessage).not.toHaveBeenCalled();
4882
5097
  });
4883
5098
 
5099
+ test('reboots a legacy App only after the direct update endpoint is explicitly unavailable', async () => {
5100
+ const method = new FirmwareUpdateV4({
5101
+ id: 1,
5102
+ payload: {
5103
+ method: 'firmwareUpdateV4',
5104
+ },
5105
+ });
5106
+ const targets = [{ target_id: 4, path: 'vol0:/application_p1.bin' }];
5107
+ const typedCall = jest
5108
+ .fn()
5109
+ .mockRejectedValueOnce(new Error('Failure_InvalidMessage,Handler not registered'))
5110
+ .mockResolvedValueOnce({ type: 'Success', message: { message: '' } });
5111
+
5112
+ (method as any).device = stubDevice({
5113
+ getCommands: () => ({ typedCall }),
5114
+ });
5115
+ (method as any).protocolV2LegacyDirectUpdate = true;
5116
+ (method as any).rebootProtocolV2ToBootloader = jest.fn().mockResolvedValue(true);
5117
+ method.postTipMessage = jest.fn();
5118
+ method.postProgressMessage = jest.fn();
5119
+
5120
+ await expect((method as any).protocolV2StartFirmwareUpdate({ targets })).resolves.toEqual({
5121
+ type: 'Success',
5122
+ message: { message: '' },
5123
+ });
5124
+
5125
+ expect(typedCall).toHaveBeenCalledTimes(2);
5126
+ expect(typedCall).toHaveBeenNthCalledWith(
5127
+ 1,
5128
+ 'DeviceFirmwareUpdateRequest',
5129
+ 'Success',
5130
+ { targets },
5131
+ { timeoutMs: 180000 }
5132
+ );
5133
+ expect(typedCall).toHaveBeenNthCalledWith(
5134
+ 2,
5135
+ 'DeviceFirmwareUpdateRequest',
5136
+ 'Success',
5137
+ { targets },
5138
+ { timeoutMs: 180000 }
5139
+ );
5140
+ expect((method as any).rebootProtocolV2ToBootloader).toHaveBeenCalledTimes(1);
5141
+ expect(method.postTipMessage).toHaveBeenCalledWith('FirmwareUpdating');
5142
+ expect(method.postProgressMessage).toHaveBeenCalledWith(0, 'installingFirmware');
5143
+ });
5144
+
5145
+ test('does not replay a legacy direct update after a link failure', async () => {
5146
+ const method = new FirmwareUpdateV4({
5147
+ id: 1,
5148
+ payload: {
5149
+ method: 'firmwareUpdateV4',
5150
+ },
5151
+ });
5152
+ const typedCall = jest.fn().mockRejectedValue(new Error('LIBUSB_TRANSFER_TIMED_OUT'));
5153
+
5154
+ (method as any).device = stubDevice({
5155
+ getCommands: () => ({ typedCall }),
5156
+ });
5157
+ (method as any).protocolV2LegacyDirectUpdate = true;
5158
+ (method as any).rebootProtocolV2ToBootloader = jest.fn();
5159
+ method.postTipMessage = jest.fn();
5160
+ method.postProgressMessage = jest.fn();
5161
+
5162
+ await expect(
5163
+ (method as any).protocolV2StartFirmwareUpdate({
5164
+ targets: [{ target_id: 4, path: 'vol0:/application_p1.bin' }],
5165
+ })
5166
+ ).rejects.toThrow('LIBUSB_TRANSFER_TIMED_OUT');
5167
+
5168
+ expect(typedCall).toHaveBeenCalledTimes(1);
5169
+ expect((method as any).rebootProtocolV2ToBootloader).not.toHaveBeenCalled();
5170
+ expect(method.postTipMessage).not.toHaveBeenCalled();
5171
+ expect(method.postProgressMessage).not.toHaveBeenCalled();
5172
+ });
5173
+
4884
5174
  test('polls only firmware status while Protocol V2 bootloader is installing', async () => {
4885
5175
  const method = new FirmwareUpdateV4({
4886
5176
  id: 1,
@@ -5009,7 +5299,9 @@ describe('Protocol V2 firmware update targets', () => {
5009
5299
  (method as any).device = stubDevice({ probeProtocolV2RuntimeState });
5010
5300
 
5011
5301
  await expect((method as any).probeProtocolV2NormalMode(deviceInfo)).resolves.toBe(expected);
5012
- expect(probeProtocolV2RuntimeState).toHaveBeenCalledWith(deviceInfo, 5000);
5302
+ expect(probeProtocolV2RuntimeState).toHaveBeenCalledWith(deviceInfo, 5000, {
5303
+ allowLegacyProtocolV2ProtocolInfo: true,
5304
+ });
5013
5305
  });
5014
5306
 
5015
5307
  test('keeps polling when the firmware status handler is missing in loader mode', async () => {
@@ -48,7 +48,10 @@ describe('live device state reads', () => {
48
48
 
49
49
  await method.run();
50
50
 
51
- expect(getDeviceState).toHaveBeenCalledWith({ refreshSections: [...refreshSections] });
51
+ expect(getDeviceState).toHaveBeenCalledWith({
52
+ refreshSections: [...refreshSections],
53
+ ...(scope === 'firmware' ? { allowLegacyProtocolV2ProtocolInfo: true } : {}),
54
+ });
52
55
  });
53
56
 
54
57
  test.each(['bootloader', 'romloader'] as const)(
@@ -0,0 +1,48 @@
1
+ import { HardwareTopLevelSdk } from '../src';
2
+ import { findMethod } from '../src/api/utils';
3
+
4
+ import type { LowLevelCoreApi } from '../src';
5
+
6
+ jest.mock('../src/data/config', () => ({
7
+ DEFAULT_DOMAIN: 'https://example.com/',
8
+ getSDKVersion: () => '0.0.0-test',
9
+ }));
10
+
11
+ const crossJsonOnlyBridge = (value: unknown): unknown => JSON.parse(JSON.stringify(value));
12
+
13
+ describe('Base64 resource boundary', () => {
14
+ test('keeps Portfolio, wallpaper and NFT payloads JSON-safe across TopLevel and LowLevel', async () => {
15
+ const restoredPayloads: Array<Record<string, any>> = [];
16
+ const lowLevelApi = {
17
+ call: jest.fn(params => {
18
+ const method = findMethod({ id: 1, payload: crossJsonOnlyBridge(params) } as any);
19
+ restoredPayloads.push(method.payload);
20
+ return Promise.resolve({ success: true, payload: {} });
21
+ }),
22
+ init: jest.fn(() => Promise.resolve(true)),
23
+ } as unknown as LowLevelCoreApi;
24
+ const sdk = HardwareTopLevelSdk();
25
+ await sdk.init({}, lowLevelApi);
26
+
27
+ await sdk.uploadPortfolio('connect-id', { packageBase64: 'AQID' });
28
+ await sdk.deviceUploadWallpaper('connect-id', { jpegBase64: '/9j/' });
29
+ await sdk.deviceUploadNft('connect-id', {
30
+ imageJpegBase64: '/9j/',
31
+ thumbnailJpegBase64: '/9j/',
32
+ title: 'NFT',
33
+ subtitle: '',
34
+ });
35
+
36
+ expect(restoredPayloads.map(payload => payload.method)).toEqual([
37
+ 'uploadPortfolio',
38
+ 'deviceUploadWallpaper',
39
+ 'deviceUploadNft',
40
+ ]);
41
+ expect(restoredPayloads[0].packageBase64).toBe('AQID');
42
+ expect(restoredPayloads[1].jpegBase64).toBe('/9j/');
43
+ expect(restoredPayloads[2]).toMatchObject({
44
+ imageJpegBase64: '/9j/',
45
+ thumbnailJpegBase64: '/9j/',
46
+ });
47
+ });
48
+ });
@@ -94,6 +94,7 @@ describe('SearchDevices', () => {
94
94
  connectProtocol: undefined,
95
95
  forceProtocolDetection: true,
96
96
  refreshRuntimeState: true,
97
+ allowLegacyProtocolV2ProtocolInfo: true,
97
98
  }
98
99
  );
99
100
  expect(mockGetDevices).toHaveBeenNthCalledWith(
@@ -104,6 +105,7 @@ describe('SearchDevices', () => {
104
105
  connectProtocol: undefined,
105
106
  forceProtocolDetection: true,
106
107
  refreshRuntimeState: true,
108
+ allowLegacyProtocolV2ProtocolInfo: true,
107
109
  }
108
110
  );
109
111
  });
@@ -0,0 +1,84 @@
1
+ import { EDeviceType } from '@onekeyfe/hd-shared';
2
+
3
+ import TonSignMessage from '../src/api/ton/TonSignMessage';
4
+
5
+ jest.mock('../src/data/config', () => ({
6
+ getSDKVersion: jest.fn(() => '1.0.0'),
7
+ DEFAULT_DOMAIN: 'https://jssdk.onekey.so/1.0.0/',
8
+ }));
9
+
10
+ const createMethod = (deviceType: EDeviceType) => {
11
+ const method = new TonSignMessage({
12
+ id: 1,
13
+ payload: {
14
+ method: 'tonSignMessage',
15
+ },
16
+ });
17
+
18
+ Object.defineProperty(method, 'device', {
19
+ value: {
20
+ getCurrentDeviceType: () => deviceType,
21
+ },
22
+ });
23
+
24
+ return method;
25
+ };
26
+
27
+ describe('TonSignMessage response compatibility', () => {
28
+ test.each([EDeviceType.Pro2, EDeviceType.Neo])(
29
+ 'uses the corrected signing_message field for %s',
30
+ async deviceType => {
31
+ const method = createMethod(deviceType);
32
+
33
+ await expect(
34
+ method.processTxRequest(
35
+ {
36
+ signature: 'signature',
37
+ signing_message: 'serialized-message',
38
+ },
39
+ ''
40
+ )
41
+ ).resolves.toEqual({
42
+ signature: 'signature',
43
+ signing_message: 'serialized-message',
44
+ skip_validate: false,
45
+ });
46
+ }
47
+ );
48
+
49
+ test('normalizes the legacy Protocol V1 field without removing it', async () => {
50
+ const method = createMethod(EDeviceType.Classic1s);
51
+
52
+ await expect(
53
+ method.processTxRequest(
54
+ {
55
+ signature: 'signature',
56
+ signning_message: 'message-hash',
57
+ },
58
+ ''
59
+ )
60
+ ).resolves.toEqual({
61
+ signature: 'signature',
62
+ signning_message: 'message-hash',
63
+ signing_message: 'message-hash',
64
+ skip_validate: true,
65
+ });
66
+ });
67
+
68
+ test('skips validation when blind signing omits the signing message', async () => {
69
+ const method = createMethod(EDeviceType.Pro2);
70
+
71
+ await expect(
72
+ method.processTxRequest(
73
+ {
74
+ signature: 'signature',
75
+ },
76
+ ''
77
+ )
78
+ ).resolves.toEqual({
79
+ signature: 'signature',
80
+ signing_message: undefined,
81
+ skip_validate: true,
82
+ });
83
+ });
84
+ });
@@ -11,6 +11,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
11
11
  getSupportedProtocols(): readonly ["V2"];
12
12
  private protocolV2PreparedSources;
13
13
  private protocolV2ExecutionInLoader;
14
+ private protocolV2LegacyDirectUpdate;
14
15
  private protocolV2BootResourceStagingSafe;
15
16
  private protocolV2CompletedTargetVersions;
16
17
  private protocolV2LatestFinalFeatures?;
@@ -58,6 +59,8 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
58
59
  private isProtocolV2ResourceBundleUpToDate;
59
60
  private isProtocolV2BootloaderMode;
60
61
  private isProtocolV2RomloaderMode;
62
+ private isLegacyProtocolV2Runtime;
63
+ private rebootProtocolV2ToBootloader;
61
64
  enterProtocolV2BootloaderMode(): Promise<boolean>;
62
65
  private waitForProtocolV2BootloaderMode;
63
66
  private collectExplicitTargetBinaries;
@@ -1 +1 @@
1
- {"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkD,MAAM,qBAAqB,CAAC;AAyBlG,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAkC/E,OAAO,KAAK,EAEV,sBAAsB,EAEvB,MAAM,6BAA6B,CAAC;AA2ErC,wBAAgB,wCAAwC,CACtD,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,EAC5C,MAAM,EAAE,sBAAsB,EAC9B,0BAA0B,UAAQ,QAiCnC;AAmWD,eAAO,MAAM,oCAAoC,WACvC,WAAW,GAAG,UAAU,eACnB,MAAM,GAAG,SAAS,YAKhC,CAAC;AAEF,eAAO,MAAM,iCAAiC,0BACrB,MAAM,uBACR,MAAM,iBACZ,MAAM,eACR,MAAM,SAsBpB,CAAC;AAUF,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,wBAAwB,CAAC,sBAAsB,CAAC;IAC5F,OAAO,CAAC,8BAA8B,CAAC,CAAS;IAEhD,OAAO,CAAC,sBAAsB,CAAC,CAAS;IAExC,OAAO,CAAC,oCAAoC,CAAS;IAErD,qBAAqB;IAIrB,OAAO,CAAC,yBAAyB,CAA4B;IAE7D,OAAO,CAAC,2BAA2B,CAAS;IAE5C,OAAO,CAAC,iCAAiC,CAAS;IAElD,OAAO,CAAC,iCAAiC,CAA6B;IAEtE,OAAO,CAAC,6BAA6B,CAAC,CAAW;IAEjD,OAAO,CAAC,6BAA6B,CAAS;IAE9C,IAAI;IA0LJ,OAAO,CAAC,8BAA8B;IAwBhC,GAAG;;;;;YAKK,aAAa;YAqIb,4BAA4B;YAkB5B,0BAA0B;YAY1B,8BAA8B;YAK9B,+BAA+B;YAqG/B,gCAAgC;YAgIhC,qCAAqC;YAmJrC,gCAAgC;YAgBhC,uCAAuC;YAmJvC,8BAA8B;IAsB5C,OAAO,CAAC,8BAA8B;IA0BtC,OAAO,CAAC,kCAAkC;IAc1C,OAAO,CAAC,gCAAgC;IAsDxC,OAAO,CAAC,6BAA6B;YAsBvB,2BAA2B;IAWzC,OAAO,CAAC,yBAAyB;IAKjC,OAAO,CAAC,oCAAoC;IAY5C,OAAO,CAAC,4BAA4B;IAUpC,OAAO,CAAC,kCAAkC;IAS1C,OAAO,CAAC,8BAA8B;YAMxB,iCAAiC;YAOjC,iCAAiC;YAmBjC,iCAAiC;IAM/C,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,mCAAmC;IAe3C,OAAO,CAAC,iCAAiC;IAWzC,OAAO,CAAC,2BAA2B;IAsBnC,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,wBAAwB;YAkBlB,iCAAiC;YAuDjC,+BAA+B;IA6E7C,OAAO,CAAC,6BAA6B;YAMvB,8BAA8B;YA+C9B,kCAAkC;IA+BhD,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,yBAAyB;IAc3B,6BAA6B;YAgCrB,+BAA+B;IAkD7C,OAAO,CAAC,6BAA6B;IAkCrC,OAAO,CAAC,8BAA8B;YA6DxB,uBAAuB;YA0CvB,0CAA0C;YA6B1C,6BAA6B;YAa7B,uBAAuB;YAiCvB,8BAA8B;YAqE9B,6BAA6B;IAuE3C,OAAO,CAAC,mCAAmC;YAI7B,0BAA0B;IAaxC,OAAO,CAAC,4BAA4B;IAyGpC,OAAO,CAAC,6BAA6B;YAcvB,uCAAuC;YA0JvC,gCAAgC;YAehC,yBAAyB;YAQzB,8BAA8B;IAQ5C,OAAO,CAAC,0BAA0B;YAkBpB,mCAAmC;YAWnC,qCAAqC;YAgDrC,yBAAyB;YA8DzB,8BAA8B;IAU5C,OAAO,CAAC,kCAAkC;YAQ5B,cAAc;YAuCd,6BAA6B;YAW7B,0BAA0B;YAS1B,6BAA6B;YAmB7B,gBAAgB;IAiB9B,OAAO,CAAC,qBAAqB;CAM9B"}
1
+ {"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GetDeviceState.d.ts","sourceRoot":"","sources":["../../src/api/GetDeviceState.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,KAAK,EAAoB,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAU1F,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,UAAU,CACpD,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAC9C;IACC,qBAAqB;IAIrB,IAAI;IAmBE,GAAG;CAgBV"}
1
+ {"version":3,"file":"GetDeviceState.d.ts","sourceRoot":"","sources":["../../src/api/GetDeviceState.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,KAAK,EAAoB,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAU1F,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,UAAU,CACpD,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAC9C;IACC,qBAAqB;IAIrB,IAAI;IAmBE,GAAG;CAiBV"}
@@ -1 +1 @@
1
- {"version":3,"file":"SearchDevices.d.ts","sourceRoot":"","sources":["../../src/api/SearchDevices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM1C,OAAO,KAAK,eAAe,MAAM,2BAA2B,CAAC;AAI7D,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,UAAU;IACnD,SAAS,CAAC,EAAE,eAAe,CAAC;IAE5B,IAAI;IAME,GAAG;;;;;;;;;;;;;;;CA8DV"}
1
+ {"version":3,"file":"SearchDevices.d.ts","sourceRoot":"","sources":["../../src/api/SearchDevices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM1C,OAAO,KAAK,eAAe,MAAM,2BAA2B,CAAC;AAI7D,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,UAAU;IACnD,SAAS,CAAC,EAAE,eAAe,CAAC;IAE5B,IAAI;IAME,GAAG;;;;;;;;;;;;;;;CAgEV"}
@@ -1,6 +1,6 @@
1
1
  import FileWrite from './FileWrite';
2
2
  export type UploadPortfolioParams = {
3
- packageBytes: ArrayBuffer | Uint8Array | Blob;
3
+ packageBase64: string;
4
4
  timeoutMs?: number | string;
5
5
  };
6
6
  export default class UploadPortfolio extends FileWrite {
@@ -1 +1 @@
1
- {"version":3,"file":"UploadPortfolio.d.ts","sourceRoot":"","sources":["../../src/api/UploadPortfolio.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,EAAE,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B,CAAC;AAOF,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,SAAS;IACpD,IAAI;IAmBE,GAAG;;;;;;;;CAsBV"}
1
+ {"version":3,"file":"UploadPortfolio.d.ts","sourceRoot":"","sources":["../../src/api/UploadPortfolio.ts"],"names":[],"mappings":"AAIA,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,MAAM,MAAM,qBAAqB,GAAG;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B,CAAC;AAQF,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,SAAS;IACpD,IAAI;IAwBE,GAAG;;;;;;;;CAsBV"}
@@ -1 +1 @@
1
- {"version":3,"file":"protocolV2Release.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/protocolV2Release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAI/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,kCAAkC,EACnC,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,0BAA0B,EAC1B,8BAA8B,EAE/B,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAEhF,eAAO,MAAM,iCAAiC,EAAE,SAAS,kCAAkC,EAO1F,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,SAAS,kCAAkC,EAEhF,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,SAAS,kCAAkC,EAEvF,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG;QACrC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,GAAG;YACtD,UAAU,EAAE,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC;SAChD,CAAC;KACH,CAAC;IACF,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,aAAa,CAAC;IAC5B,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEF,wBAAsB,oCAAoC,CAAC,EACzD,MAAM,EACN,YAAY,EAAE,iBAAiB,EAC/B,iBAAyB,EACzB,UAAU,GACX,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,gCAAgC,CAAC,CA4B5C;AAED,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,6BAA6B,EACnC,gBAAgB,EAAE,SAAS,kCAAkC,EAAE,GAC9D,6BAA6B,CAiC/B;AAED,wBAAgB,+BAA+B,CAAC,EAC9C,IAAI,EACJ,KAAK,EACL,OAAO,GACR,EAAE;IACD,IAAI,EAAE,6BAA6B,CAAC;IACpC,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAC;CAChD,GAAG,0BAA0B,CAU7B;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,6BAA6B,EACnC,eAAe,EAAE,kCAAkC,GAClD,8BAA8B,GAAG,SAAS,CAmB5C"}
1
+ {"version":3,"file":"protocolV2Release.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/protocolV2Release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAI/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,kCAAkC,EACnC,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,0BAA0B,EAC1B,8BAA8B,EAE/B,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAEhF,eAAO,MAAM,iCAAiC,EAAE,SAAS,kCAAkC,EAO1F,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,SAAS,kCAAkC,EAEhF,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,SAAS,kCAAkC,EAEvF,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG;QACrC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,GAAG;YACtD,UAAU,EAAE,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC;SAChD,CAAC;KACH,CAAC;IACF,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,aAAa,CAAC;IAC5B,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEF,wBAAsB,oCAAoC,CAAC,EACzD,MAAM,EACN,YAAY,EAAE,iBAAiB,EAC/B,iBAAyB,EACzB,UAAU,GACX,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,gCAAgC,CAAC,CA6B5C;AAED,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,6BAA6B,EACnC,gBAAgB,EAAE,SAAS,kCAAkC,EAAE,GAC9D,6BAA6B,CAiC/B;AAED,wBAAgB,+BAA+B,CAAC,EAC9C,IAAI,EACJ,KAAK,EACL,OAAO,GACR,EAAE;IACD,IAAI,EAAE,6BAA6B,CAAC;IACpC,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAC;CAChD,GAAG,0BAA0B,CAU7B;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,6BAA6B,EACnC,eAAe,EAAE,kCAAkC,GAClD,8BAA8B,GAAG,SAAS,CAmB5C"}