@trezor/connect 9.3.0 → 9.3.1-beta.2

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 (60) hide show
  1. package/CHANGELOG.md +121 -8
  2. package/README.md +1 -1
  3. package/lib/api/checkFirmwareAuthenticity.d.ts +2 -1
  4. package/lib/api/checkFirmwareAuthenticity.js +34 -26
  5. package/lib/api/ethereum/api/ethereumSignTypedData.d.ts +1 -0
  6. package/lib/api/ethereum/api/ethereumSignTypedData.js +3 -1
  7. package/lib/api/ethereum/ethereumDefinitions.js +1 -0
  8. package/lib/api/firmware/getBinary.d.ts +4 -4
  9. package/lib/api/firmware/getBinary.js +4 -15
  10. package/lib/api/firmware/getBinaryForFirmwareUpgrade.d.ts +11 -0
  11. package/lib/api/firmware/getBinaryForFirmwareUpgrade.js +32 -0
  12. package/lib/api/firmware/index.d.ts +1 -0
  13. package/lib/api/firmware/index.js +3 -1
  14. package/lib/api/firmware/verifyAuthenticityProof.d.ts +1 -1
  15. package/lib/api/firmware/verifyAuthenticityProof.js +37 -2
  16. package/lib/api/firmware/x509certificate.d.ts +20 -6
  17. package/lib/api/firmware/x509certificate.js +82 -13
  18. package/lib/api/getCoinInfo.d.ts +3 -0
  19. package/lib/api/getFeatures.d.ts +1 -0
  20. package/lib/backend/Blockchain.js +10 -1
  21. package/lib/core/AbstractMethod.js +1 -0
  22. package/lib/core/index.d.ts +3 -3
  23. package/lib/core/index.js +93 -111
  24. package/lib/core/onCallFirmwareUpdate.js +25 -14
  25. package/lib/data/DataManager.d.ts +11 -0
  26. package/lib/data/DataManager.js +1 -1
  27. package/lib/data/coinInfo.d.ts +14 -0
  28. package/lib/data/config.d.ts +11 -0
  29. package/lib/data/config.js +17 -1
  30. package/lib/data/connectSettings.js +3 -2
  31. package/lib/data/deviceAuthenticityConfig.d.ts +1 -28
  32. package/lib/data/deviceAuthenticityConfig.js +25 -24
  33. package/lib/data/deviceAuthenticityConfigTypes.d.ts +38 -0
  34. package/lib/data/deviceAuthenticityConfigTypes.js +28 -0
  35. package/lib/data/models.d.ts +10 -0
  36. package/lib/data/models.js +12 -10
  37. package/lib/data/version.d.ts +2 -1
  38. package/lib/data/version.js +3 -2
  39. package/lib/device/Device.d.ts +2 -3
  40. package/lib/device/Device.js +15 -24
  41. package/lib/device/DeviceCommands.js +2 -27
  42. package/lib/device/DeviceList.d.ts +42 -27
  43. package/lib/device/DeviceList.js +249 -233
  44. package/lib/events/core.d.ts +2 -2
  45. package/lib/events/popup.d.ts +1 -0
  46. package/lib/events/transport.d.ts +5 -0
  47. package/lib/index.js +20 -20
  48. package/lib/types/api/authenticateDevice.d.ts +9 -0
  49. package/lib/types/api/authenticateDevice.js +2 -2
  50. package/lib/types/api/checkFirmwareAuthenticity.d.ts +4 -1
  51. package/lib/types/api/init.d.ts +2 -2
  52. package/lib/types/coinInfo.d.ts +7 -0
  53. package/lib/types/firmware.d.ts +2 -2
  54. package/lib/types/settings.d.ts +7 -3
  55. package/lib/utils/assetUtils.js +1 -0
  56. package/lib/utils/promiseUtils.d.ts +3 -3
  57. package/lib/utils/promiseUtils.js +7 -5
  58. package/package.json +16 -17
  59. package/lib/core/coreManager.d.ts +0 -16
  60. package/lib/core/coreManager.js +0 -55
@@ -15,6 +15,7 @@ export default class GetFeatures extends AbstractMethod<'getFeatures'> {
15
15
  language_version_matches?: boolean | undefined;
16
16
  unit_packaging?: number | undefined;
17
17
  recovery_type?: "NormalRecovery" | "DryRun" | "UnlockRepeatedBackup" | undefined;
18
+ optiga_sec?: number | undefined;
18
19
  flags: number | null;
19
20
  language: string | null;
20
21
  label: string | null;
@@ -22,6 +22,15 @@ const getWorker = (type) => {
22
22
  return null;
23
23
  }
24
24
  };
25
+ const getNormalizedShortcut = (shortcut) => {
26
+ if (shortcut === 'tXRP') {
27
+ return 'XRP';
28
+ }
29
+ if (shortcut.toLowerCase() === 'bsc') {
30
+ return 'bnb';
31
+ }
32
+ return shortcut;
33
+ };
25
34
  class Blockchain {
26
35
  constructor(options) {
27
36
  this.feeForBlock = [];
@@ -72,7 +81,7 @@ class Blockchain {
72
81
  throw constants_1.ERRORS.TypedError('Backend_Error', error.message);
73
82
  }
74
83
  this.serverInfo = info;
75
- const shortcut = this.coinInfo.shortcut === 'tXRP' ? 'XRP' : this.coinInfo.shortcut;
84
+ const shortcut = getNormalizedShortcut(this.coinInfo.shortcut);
76
85
  if (info.shortcut.toLowerCase() !== shortcut.toLowerCase()) {
77
86
  throw constants_1.ERRORS.TypedError('Backend_Invalid');
78
87
  }
@@ -11,6 +11,7 @@ exports.DEFAULT_FIRMWARE_RANGE = {
11
11
  T1B1: { min: '1.0.0', max: '0' },
12
12
  T2T1: { min: '2.0.0', max: '0' },
13
13
  T2B1: { min: '2.6.1', max: '0' },
14
+ T3B1: { min: '2.8.1', max: '0' },
14
15
  T3T1: { min: '2.7.1', max: '0' },
15
16
  };
16
17
  class AbstractMethod {
@@ -14,9 +14,9 @@ export declare class Core extends EventEmitter {
14
14
  init(settings: ConnectSettings, onCoreEvent: (message: CoreEventMessage) => void, logWriterFactory?: () => LogWriter | undefined): Promise<void>;
15
15
  }
16
16
  export declare const initCoreState: () => {
17
- getOrInitCore: (settings: ConnectSettings, onCoreEvent: (message: CoreEventMessage) => void, logWriterFactory?: (() => LogWriter | undefined) | undefined) => Promise<Core>;
18
- getCore: () => Core | undefined;
19
- getInitPromise: () => Promise<Core> | undefined;
17
+ get: () => Core | undefined;
18
+ getPending: () => Promise<Core> | undefined;
19
+ getOrInit: (settings: ConnectSettings, onCoreEvent: (message: CoreEventMessage) => void, logWriterFactory?: (() => LogWriter) | undefined) => Promise<Core>;
20
20
  dispose: () => void;
21
21
  };
22
22
  //# sourceMappingURL=index.d.ts.map
package/lib/core/index.js CHANGED
@@ -20,12 +20,11 @@ const debug_1 = require("../utils/debug");
20
20
  const BlockchainLink_1 = require("../backend/BlockchainLink");
21
21
  const interactionTimeout_1 = require("../utils/interactionTimeout");
22
22
  const onCallFirmwareUpdate_1 = require("./onCallFirmwareUpdate");
23
- const coreManager_1 = require("./coreManager");
24
23
  let _core;
25
24
  let _deviceList;
26
25
  const _callMethods = [];
27
26
  let _interactionTimeout;
28
- let _deviceListInitTimeout;
27
+ let _deviceListInitReject;
29
28
  let _overridePromise;
30
29
  const methodSynchronize = (0, utils_2.getSynchronize)();
31
30
  let waitForFirstMethod = (0, utils_1.createDeferred)();
@@ -52,13 +51,8 @@ const interactionTimeout = () => _interactionTimeout.start(() => {
52
51
  });
53
52
  const uiPromises = (0, uiPromiseManager_1.createUiPromiseManager)(interactionTimeout);
54
53
  const initDevice = async (devicePath) => {
55
- if (!_deviceList) {
56
- throw constants_1.ERRORS.TypedError('Transport_Missing');
57
- }
58
- await _deviceList.transportFirstEventPromise;
59
- if (!_deviceList) {
60
- throw constants_1.ERRORS.TypedError('Transport_Missing');
61
- }
54
+ await _deviceList.pendingConnection();
55
+ _deviceList.assertConnected();
62
56
  const isWebUsb = _deviceList.transportType() === 'WebUsbTransport';
63
57
  let device;
64
58
  let showDeviceSelection = isWebUsb;
@@ -92,9 +86,7 @@ const initDevice = async (devicePath) => {
92
86
  if (showDeviceSelection) {
93
87
  uiPromises.create(events_2.UI.RECEIVE_DEVICE);
94
88
  await waitForPopup();
95
- if (!_deviceList) {
96
- throw constants_1.ERRORS.TypedError('Transport_Missing');
97
- }
89
+ _deviceList.assertConnected();
98
90
  const devices = _deviceList.asArray();
99
91
  if (devices.length === 1 &&
100
92
  devices[0].type !== 'unreadable' &&
@@ -124,6 +116,9 @@ const initDevice = async (devicePath) => {
124
116
  }
125
117
  }
126
118
  }
119
+ else if (uiPromises.exists(events_2.UI.RECEIVE_DEVICE)) {
120
+ await uiPromises.get(events_2.UI.RECEIVE_DEVICE);
121
+ }
127
122
  if (!device) {
128
123
  throw constants_1.ERRORS.TypedError('Device_NotFound');
129
124
  }
@@ -246,7 +241,7 @@ const inner = async (method, device) => {
246
241
  const uiResp = await uiPromise.promise;
247
242
  if (uiResp.payload) {
248
243
  device.setInternalState(undefined);
249
- await device.initialize(method.useEmptyPassphrase, method.useCardanoDerivation);
244
+ await device.initialize(method.useCardanoDerivation);
250
245
  invalidDeviceState = await getInvalidDeviceState(device, method.preauthorized);
251
246
  }
252
247
  else {
@@ -333,8 +328,10 @@ const onCall = async (message) => {
333
328
  postMessage(messageResponse);
334
329
  return Promise.resolve();
335
330
  }
336
- if (!_deviceList && !DataManager_1.DataManager.getSettings('transportReconnect')) {
337
- await initDeviceList(false);
331
+ if (!_deviceList.isConnected() && !_deviceList.pendingConnection()) {
332
+ const { transports, pendingTransportEvent } = DataManager_1.DataManager.getSettings();
333
+ _deviceList.setTransports(transports);
334
+ await _deviceList.init({ pendingTransportEvent });
338
335
  }
339
336
  if (method.isManagementRestricted()) {
340
337
  postMessage((0, events_2.createPopupMessage)(events_2.POPUP.CANCEL_POPUP_REQUEST));
@@ -429,17 +426,17 @@ const onCall = async (message) => {
429
426
  });
430
427
  await device.run(innerAction, {
431
428
  keepSession: method.keepSession,
432
- useEmptyPassphrase: method.useEmptyPassphrase,
433
429
  skipFinalReload: method.skipFinalReload,
434
430
  useCardanoDerivation: method.useCardanoDerivation,
435
431
  });
436
432
  }
437
433
  catch (error) {
438
- if (_deviceList && error.code === 'Device_Disconnected') {
434
+ if (error.code === 'Device_Disconnected') {
439
435
  _deviceList.addAuthPenalty(device);
440
436
  }
441
437
  if (method) {
442
- if (_deviceList && error.message === transport_1.TRANSPORT_ERROR.SESSION_WRONG_PREVIOUS) {
438
+ if (_deviceList.isConnected() &&
439
+ error.message === transport_1.TRANSPORT_ERROR.SESSION_WRONG_PREVIOUS) {
443
440
  await _deviceList.enumerate();
444
441
  }
445
442
  messageResponse = (0, events_2.createResponseMessage)(method.responseID, false, { error });
@@ -468,10 +465,8 @@ const onCall = async (message) => {
468
465
  if (method) {
469
466
  method.dispose();
470
467
  }
471
- if (_deviceList) {
472
- if (response.success) {
473
- _deviceList.removeAuthPenalty(device);
474
- }
468
+ if (response.success) {
469
+ _deviceList.removeAuthPenalty(device);
475
470
  }
476
471
  if (!useCoreInPopup) {
477
472
  postMessage(response);
@@ -543,7 +538,7 @@ const onPopupClosed = (customErrorMessage) => {
543
538
  const error = customErrorMessage
544
539
  ? constants_1.ERRORS.TypedError('Method_Cancel', customErrorMessage)
545
540
  : constants_1.ERRORS.TypedError('Method_Interrupted');
546
- if (_deviceList && _deviceList.asArray().length > 0) {
541
+ if (_deviceList.isConnected() && _deviceList.asArray().length > 0) {
547
542
  _deviceList.allDevices().forEach(d => {
548
543
  d.keepSession = false;
549
544
  if (d.isUsedHere()) {
@@ -569,7 +564,7 @@ const onPopupClosed = (customErrorMessage) => {
569
564
  };
570
565
  const handleDeviceSelectionChanges = (interruptDevice) => {
571
566
  const promiseExists = uiPromises.exists(events_2.UI.RECEIVE_DEVICE);
572
- if (promiseExists && _deviceList) {
567
+ if (promiseExists && _deviceList.isConnected()) {
573
568
  const list = _deviceList.asArray();
574
569
  const isWebUsb = _deviceList.transportType() === 'WebUsbTransport';
575
570
  if (list.length === 1 && !isWebUsb) {
@@ -594,62 +589,29 @@ const handleDeviceSelectionChanges = (interruptDevice) => {
594
589
  }
595
590
  }
596
591
  };
597
- const initDeviceList = async (transportReconnect) => {
598
- try {
599
- _deviceList = new DeviceList_1.DeviceList({
600
- settings: DataManager_1.DataManager.getSettings(),
601
- messages: DataManager_1.DataManager.getProtobufMessages(),
602
- });
603
- _deviceList.on(events_2.DEVICE.CONNECT, device => {
604
- handleDeviceSelectionChanges();
605
- postMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.CONNECT, device));
606
- });
607
- _deviceList.on(events_2.DEVICE.CONNECT_UNACQUIRED, device => {
608
- handleDeviceSelectionChanges();
609
- postMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.CONNECT_UNACQUIRED, device));
610
- });
611
- _deviceList.on(events_2.DEVICE.DISCONNECT, device => {
612
- handleDeviceSelectionChanges(device);
613
- postMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.DISCONNECT, device));
614
- });
615
- _deviceList.on(events_2.DEVICE.CHANGED, device => {
616
- postMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.CHANGED, device));
617
- });
618
- _deviceList.on(transport_1.TRANSPORT.ERROR, error => {
619
- _log.warn('TRANSPORT.ERROR', error);
620
- if (_deviceList) {
621
- _deviceList.disconnectDevices();
622
- _deviceList.dispose();
623
- }
624
- _deviceList = undefined;
625
- postMessage((0, events_2.createTransportMessage)(transport_1.TRANSPORT.ERROR, { error }));
626
- if (transportReconnect) {
627
- const { promise, timeout } = (0, promiseUtils_1.resolveAfter)(1000, null);
628
- _deviceListInitTimeout = timeout;
629
- promise.then(() => {
630
- initDeviceList(transportReconnect);
631
- });
632
- }
633
- });
634
- _deviceList.on(transport_1.TRANSPORT.START, transportType => postMessage((0, events_2.createTransportMessage)(transport_1.TRANSPORT.START, transportType)));
635
- _deviceList.init();
636
- if (_deviceList) {
637
- await _deviceList.waitForTransportFirstEvent();
638
- }
639
- }
640
- catch (error) {
641
- _deviceList = undefined;
592
+ const createDeviceList = (params) => {
593
+ const deviceList = new DeviceList_1.DeviceList(params);
594
+ deviceList.on(events_2.DEVICE.CONNECT, device => {
595
+ handleDeviceSelectionChanges();
596
+ postMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.CONNECT, device));
597
+ });
598
+ deviceList.on(events_2.DEVICE.CONNECT_UNACQUIRED, device => {
599
+ handleDeviceSelectionChanges();
600
+ postMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.CONNECT_UNACQUIRED, device));
601
+ });
602
+ deviceList.on(events_2.DEVICE.DISCONNECT, device => {
603
+ handleDeviceSelectionChanges(device);
604
+ postMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.DISCONNECT, device));
605
+ });
606
+ deviceList.on(events_2.DEVICE.CHANGED, device => {
607
+ postMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.CHANGED, device));
608
+ });
609
+ deviceList.on(transport_1.TRANSPORT.START, transportType => postMessage((0, events_2.createTransportMessage)(transport_1.TRANSPORT.START, transportType)));
610
+ deviceList.on(transport_1.TRANSPORT.ERROR, error => {
611
+ _log.warn('TRANSPORT.ERROR', error);
642
612
  postMessage((0, events_2.createTransportMessage)(transport_1.TRANSPORT.ERROR, { error }));
643
- if (!transportReconnect) {
644
- throw error;
645
- }
646
- else {
647
- const { promise, timeout } = (0, promiseUtils_1.resolveAfter)(3000, null);
648
- _deviceListInitTimeout = timeout;
649
- await promise;
650
- await initDeviceList(transportReconnect);
651
- }
652
- }
613
+ });
614
+ return deviceList;
653
615
  };
654
616
  class Core extends events_1.default {
655
617
  constructor() {
@@ -670,7 +632,12 @@ class Core extends events_1.default {
670
632
  disableWebUSBTransport();
671
633
  break;
672
634
  case transport_1.TRANSPORT.REQUEST_DEVICE:
673
- _deviceList === null || _deviceList === void 0 ? void 0 : _deviceList.enumerate();
635
+ if (_deviceList.isConnected()) {
636
+ _deviceList.enumerate();
637
+ }
638
+ break;
639
+ case transport_1.TRANSPORT.GET_INFO:
640
+ postMessage((0, events_2.createResponseMessage)(message.id, true, this.getTransportInfo()));
674
641
  break;
675
642
  case events_2.UI.RECEIVE_DEVICE:
676
643
  case events_2.UI.RECEIVE_CONFIRMATION:
@@ -686,6 +653,7 @@ class Core extends events_1.default {
686
653
  break;
687
654
  case events_2.IFRAME.CALL:
688
655
  if (message.payload.method === 'firmwareUpdate') {
656
+ _deviceList.assertConnected();
689
657
  (0, onCallFirmwareUpdate_1.onCallFirmwareUpdate)({
690
658
  params: message.payload,
691
659
  context: {
@@ -713,30 +681,24 @@ class Core extends events_1.default {
713
681
  }
714
682
  dispose() {
715
683
  (0, BlockchainLink_1.dispose)();
716
- if (_deviceListInitTimeout) {
717
- clearTimeout(_deviceListInitTimeout);
718
- }
684
+ _deviceListInitReject === null || _deviceListInitReject === void 0 ? void 0 : _deviceListInitReject(new Error('Disposed during initialization'));
719
685
  this.removeAllListeners();
720
686
  this.abortController.abort();
721
- if (_deviceList) {
722
- _deviceList.dispose();
723
- }
687
+ _deviceList.dispose();
724
688
  }
725
689
  async getCurrentMethod() {
726
690
  await waitForFirstMethod.promise;
727
691
  return await methodSynchronize(() => _callMethods[0]);
728
692
  }
729
693
  getTransportInfo() {
730
- if (!_deviceList) {
731
- return undefined;
694
+ if (_deviceList.isConnected()) {
695
+ return _deviceList.getTransportInfo();
732
696
  }
733
- return _deviceList.getTransportInfo();
734
697
  }
735
698
  enumerate() {
736
- if (!_deviceList) {
737
- return;
699
+ if (_deviceList.isConnected()) {
700
+ _deviceList.enumerate();
738
701
  }
739
- _deviceList.enumerate();
740
702
  }
741
703
  async init(settings, onCoreEvent, logWriterFactory) {
742
704
  if (logWriterFactory) {
@@ -744,8 +706,11 @@ class Core extends events_1.default {
744
706
  }
745
707
  try {
746
708
  await DataManager_1.DataManager.load(settings);
747
- (0, debug_1.enableLog)(DataManager_1.DataManager.getSettings('debug'));
709
+ const { debug, priority } = DataManager_1.DataManager.getSettings();
710
+ const messages = DataManager_1.DataManager.getProtobufMessages();
711
+ (0, debug_1.enableLog)(debug);
748
712
  _core = this;
713
+ _deviceList = createDeviceList({ debug, messages, priority });
749
714
  _interactionTimeout = new interactionTimeout_1.InteractionTimeout(settings.popup ? settings.interactionTimeout : 0);
750
715
  this.on(events_2.CORE_EVENT, onCoreEvent);
751
716
  }
@@ -753,46 +718,63 @@ class Core extends events_1.default {
753
718
  _log.error('init', error);
754
719
  throw error;
755
720
  }
721
+ const { transports, pendingTransportEvent, transportReconnect, coreMode } = DataManager_1.DataManager.getSettings();
756
722
  try {
757
- if (!DataManager_1.DataManager.getSettings('transportReconnect')) {
758
- await initDeviceList(false);
759
- }
760
- else {
761
- initDeviceList(true);
762
- }
723
+ _deviceList.setTransports(transports);
763
724
  }
764
725
  catch (error) {
765
- _log.error('initTransport', error);
726
+ _log.error('setTransports', error);
727
+ postMessage((0, events_2.createTransportMessage)(transport_1.TRANSPORT.ERROR, { error }));
766
728
  throw error;
767
729
  }
730
+ _deviceList.init({ pendingTransportEvent, transportReconnect });
731
+ if (!transportReconnect || coreMode === 'auto') {
732
+ await _deviceList.pendingConnection();
733
+ }
768
734
  }
769
735
  }
770
736
  exports.Core = Core;
771
737
  const disableWebUSBTransport = async () => {
772
- var _a;
773
- if (!_deviceList)
738
+ if (!_deviceList.isConnected())
774
739
  return;
775
740
  if (_deviceList.transportType() !== 'WebUsbTransport')
776
741
  return;
777
- const settings = DataManager_1.DataManager.getSettings();
778
- if (settings.transports) {
779
- const transportStr = (_a = settings.transports) === null || _a === void 0 ? void 0 : _a.filter(transport => typeof transport !== 'object');
742
+ const { transports, pendingTransportEvent, transportReconnect } = DataManager_1.DataManager.getSettings();
743
+ if (transports) {
744
+ const transportStr = transports === null || transports === void 0 ? void 0 : transports.filter(transport => typeof transport !== 'object');
780
745
  if (transportStr.includes('WebUsbTransport')) {
781
- settings.transports.splice(settings.transports.indexOf('WebUsbTransport'), 1);
746
+ transports.splice(transports.indexOf('WebUsbTransport'), 1);
782
747
  }
783
748
  if (!transportStr.includes('BridgeTransport')) {
784
- settings.transports.unshift('BridgeTransport');
749
+ transports.unshift('BridgeTransport');
785
750
  }
786
751
  }
787
752
  try {
788
- _deviceList.dispose();
789
- await initDeviceList(settings.transportReconnect);
753
+ _deviceList.cleanup();
754
+ _deviceList.setTransports(transports);
755
+ await _deviceList.init({ pendingTransportEvent, transportReconnect });
790
756
  }
791
757
  catch (error) {
758
+ postMessage((0, events_2.createTransportMessage)(transport_1.TRANSPORT.ERROR, { error }));
792
759
  }
793
760
  };
794
- const initCoreState = () => {
795
- return (0, coreManager_1.initCoreManager)(new Core());
761
+ const initCore = async (settings, onCoreEvent, logWriterFactory) => {
762
+ const core = new Core();
763
+ let promise;
764
+ const eventThrottle = (...args) => promise
765
+ .then(() => {
766
+ setTimeout(() => onCoreEvent(...args), 0);
767
+ })
768
+ .catch(() => { });
769
+ promise = core.init(settings, eventThrottle, logWriterFactory);
770
+ await promise;
771
+ core.on(events_2.CORE_EVENT, onCoreEvent);
772
+ core.off(events_2.CORE_EVENT, eventThrottle);
773
+ return core;
774
+ };
775
+ const disposeCore = (core) => {
776
+ core.dispose();
796
777
  };
778
+ const initCoreState = () => (0, utils_1.createLazy)(initCore, disposeCore);
797
779
  exports.initCoreState = initCoreState;
798
780
  //# sourceMappingURL=index.js.map
@@ -71,24 +71,29 @@ const waitForReconnectedDevice = async ({ bootloader, method, intermediary }, {
71
71
  await reconnectedDevice.acquire();
72
72
  return reconnectedDevice;
73
73
  };
74
- const getInstallationParams = (device, binary) => {
75
- var _a;
74
+ const getInstallationParams = (device, params) => {
75
+ var _a, _b;
76
+ const btcOnly = (_a = params.btcOnly) !== null && _a !== void 0 ? _a : device.firmwareType === 'bitcoin-only';
76
77
  if (!device.features.bootloader_mode) {
77
- const version = binary ? (0, firmware_1.parseFirmwareHeaders)(Buffer.from(binary)).version : undefined;
78
+ const version = params.binary
79
+ ? (0, firmware_1.parseFirmwareHeaders)(Buffer.from(params.binary)).version
80
+ : undefined;
78
81
  const isUpdatingToNewerVersion = !version
79
- ? (_a = device.firmwareRelease) === null || _a === void 0 ? void 0 : _a.isNewer
82
+ ? (_b = device.firmwareRelease) === null || _b === void 0 ? void 0 : _b.isNewer
80
83
  : (0, versionUtils_1.isNewer)(version, [
81
84
  device.features.major_version,
82
85
  device.features.minor_version,
83
86
  device.features.patch_version,
84
87
  ]);
85
- const upgrade = device.atLeast('2.6.3') && isUpdatingToNewerVersion;
88
+ const isUpdatingToEqualFirmwareType = (device.firmwareType === 'bitcoin-only') === btcOnly;
89
+ const upgrade = device.atLeast('2.6.3') && isUpdatingToNewerVersion && isUpdatingToEqualFirmwareType;
86
90
  const manual = !device.atLeast(['1.10.0', '2.6.0']) && !upgrade;
87
91
  const language = device.atLeast('2.7.0');
88
92
  return {
89
93
  manual,
90
94
  upgrade,
91
95
  language,
96
+ btcOnly,
92
97
  };
93
98
  }
94
99
  else {
@@ -96,23 +101,23 @@ const getInstallationParams = (device, binary) => {
96
101
  manual: false,
97
102
  upgrade: false,
98
103
  language: false,
104
+ btcOnly,
99
105
  };
100
106
  }
101
107
  };
102
108
  const getFwHeader = (binary) => Buffer.from(binary.slice(0, 6000)).toString('hex');
103
- const getBinaryHelper = (device, params, log, postMessage, intermediaryVersion) => {
109
+ const getBinaryHelper = (device, params, log, postMessage, btcOnly, intermediaryVersion) => {
104
110
  var _a;
105
111
  if (!device.firmwareRelease) {
106
112
  throw constants_1.ERRORS.TypedError('Runtime', 'device.firmwareRelease is not set');
107
113
  }
108
- const btcOnly = params.btcOnly || (params.btcOnly === undefined && device.firmwareType === 'bitcoin-only');
109
114
  log.debug('onCallFirmwareUpdate loading binary', 'intermediaryVersion', intermediaryVersion, 'version', device.firmwareRelease.release.version, 'btcOnly', btcOnly);
110
115
  postMessage((0, events_1.createUiMessage)(events_1.UI.FIRMWARE_PROGRESS, {
111
116
  device: device.toMessageObject(),
112
117
  operation: 'downloading',
113
118
  progress: 0,
114
119
  }));
115
- return (0, firmware_1.getBinary)({
120
+ return (0, firmware_1.getBinaryForFirmwareUpgrade)({
116
121
  features: device.features,
117
122
  releases: (0, firmwareInfo_1.getReleases)((_a = device.features) === null || _a === void 0 ? void 0 : _a.internal_model),
118
123
  baseUrl: params.baseUrl || 'https://data.trezor.io',
@@ -166,10 +171,15 @@ const onCallFirmwareUpdate = async ({ params, context: { deviceList, postMessage
166
171
  }
167
172
  log.debug('onCallFirmwareUpdate', 'device', device);
168
173
  registerEvents(device, postMessage);
169
- const { manual, upgrade, language } = getInstallationParams(device, params.binary);
170
- log.debug('onCallFirmwareUpdate', 'installation params', { manual, upgrade, language });
174
+ const { manual, upgrade, language, btcOnly } = getInstallationParams(device, params);
175
+ log.debug('onCallFirmwareUpdate', 'installation params', {
176
+ manual,
177
+ upgrade,
178
+ language,
179
+ btcOnly,
180
+ });
171
181
  const binary = params.binary ||
172
- (await getBinaryHelper(device, params, log, postMessage, device.firmwareRelease.intermediaryVersion));
182
+ (await getBinaryHelper(device, params, log, postMessage, btcOnly, device.firmwareRelease.intermediaryVersion));
173
183
  const deviceInitiallyConnectedInBootloader = device.features.bootloader_mode;
174
184
  const deviceInitiallyConnectedWithoutFirmware = device.features.firmware_present === false;
175
185
  let reconnectedDevice = device;
@@ -194,6 +204,7 @@ const onCallFirmwareUpdate = async ({ params, context: { deviceList, postMessage
194
204
  language: targetLanguage,
195
205
  version: device.firmwareRelease.release.version,
196
206
  internal_model: device.features.internal_model,
207
+ }).catch(() => {
197
208
  })
198
209
  : null;
199
210
  if (!languageBlob) {
@@ -216,14 +227,14 @@ const onCallFirmwareUpdate = async ({ params, context: { deviceList, postMessage
216
227
  reconnectedDevice = await waitForReconnectedDevice({ bootloader: true, method: 'auto' }, { deviceList, device, log, postMessage, abortSignal });
217
228
  }
218
229
  const intermediary = !params.binary && device.firmwareRelease.intermediaryVersion;
219
- await reconnectedDevice.initialize(false, false);
230
+ await reconnectedDevice.initialize(false);
220
231
  let stripped = (0, firmware_1.stripFwHeaders)(binary);
221
232
  await (0, firmware_1.uploadFirmware)(reconnectedDevice.getCommands().typedCall.bind(reconnectedDevice.getCommands()), postMessage, reconnectedDevice, { payload: !intermediary && (0, firmware_1.shouldStripFwHeaders)(device.features) ? stripped : binary });
222
233
  await reconnectedDevice.release();
223
234
  if (intermediary) {
224
235
  reconnectedDevice = await waitForReconnectedDevice({ bootloader: true, method: 'manual', intermediary: true }, { deviceList, device: reconnectedDevice, log, postMessage, abortSignal });
225
- stripped = (0, firmware_1.stripFwHeaders)(await getBinaryHelper(reconnectedDevice, params, log, postMessage));
226
- await reconnectedDevice.initialize(false, false);
236
+ stripped = (0, firmware_1.stripFwHeaders)(await getBinaryHelper(reconnectedDevice, params, log, postMessage, btcOnly));
237
+ await reconnectedDevice.initialize(false);
227
238
  await (0, firmware_1.uploadFirmware)(reconnectedDevice.getCommands().typedCall.bind(reconnectedDevice.getCommands()), postMessage, reconnectedDevice, { payload: stripped });
228
239
  await reconnectedDevice.release();
229
240
  }
@@ -74,6 +74,7 @@ export declare class DataManager {
74
74
  T1B1: string;
75
75
  T2T1: string;
76
76
  T2B1?: undefined;
77
+ T3B1?: undefined;
77
78
  T3T1?: undefined;
78
79
  };
79
80
  max: undefined;
@@ -85,6 +86,7 @@ export declare class DataManager {
85
86
  T1B1: string;
86
87
  T2T1: string;
87
88
  T2B1?: undefined;
89
+ T3B1?: undefined;
88
90
  T3T1?: undefined;
89
91
  };
90
92
  comment: string[];
@@ -97,6 +99,7 @@ export declare class DataManager {
97
99
  T1B1: string;
98
100
  T2T1: string;
99
101
  T2B1?: undefined;
102
+ T3B1?: undefined;
100
103
  T3T1?: undefined;
101
104
  };
102
105
  comment: string[];
@@ -109,6 +112,7 @@ export declare class DataManager {
109
112
  T1B1: string;
110
113
  T2T1: string;
111
114
  T2B1?: undefined;
115
+ T3B1?: undefined;
112
116
  T3T1?: undefined;
113
117
  };
114
118
  comment: string[];
@@ -122,6 +126,7 @@ export declare class DataManager {
122
126
  T1B1: string;
123
127
  T2T1: string;
124
128
  T2B1?: undefined;
129
+ T3B1?: undefined;
125
130
  T3T1?: undefined;
126
131
  };
127
132
  comment: string[];
@@ -134,6 +139,7 @@ export declare class DataManager {
134
139
  T1B1: string;
135
140
  T2T1: string;
136
141
  T2B1?: undefined;
142
+ T3B1?: undefined;
137
143
  T3T1?: undefined;
138
144
  };
139
145
  coin?: undefined;
@@ -145,6 +151,7 @@ export declare class DataManager {
145
151
  T1B1: string;
146
152
  T2T1: string;
147
153
  T2B1: string;
154
+ T3B1?: undefined;
148
155
  T3T1?: undefined;
149
156
  };
150
157
  comment: string[];
@@ -157,6 +164,7 @@ export declare class DataManager {
157
164
  T1B1: string;
158
165
  T2T1: string;
159
166
  T2B1?: undefined;
167
+ T3B1?: undefined;
160
168
  T3T1?: undefined;
161
169
  };
162
170
  coin?: undefined;
@@ -169,6 +177,7 @@ export declare class DataManager {
169
177
  T1B1: string;
170
178
  T2T1: string;
171
179
  T2B1: string;
180
+ T3B1?: undefined;
172
181
  T3T1?: undefined;
173
182
  };
174
183
  coin?: undefined;
@@ -181,6 +190,7 @@ export declare class DataManager {
181
190
  T1B1: string;
182
191
  T2T1: string;
183
192
  T2B1: string;
193
+ T3B1?: undefined;
184
194
  T3T1?: undefined;
185
195
  };
186
196
  comment: string[];
@@ -193,6 +203,7 @@ export declare class DataManager {
193
203
  T1B1: string;
194
204
  T2T1: string;
195
205
  T2B1: string;
206
+ T3B1: string;
196
207
  T3T1: string;
197
208
  };
198
209
  coin?: undefined;
@@ -22,7 +22,7 @@ class DataManager {
22
22
  (0, transportInfo_1.parseBridgeJSON)(this.assets.bridge);
23
23
  (0, coinInfo_1.parseCoinsJson)({
24
24
  ...this.assets.coins,
25
- eth: this.assets.coinsEth,
25
+ ...this.assets.coinsEth,
26
26
  });
27
27
  for (const model in types_1.DeviceModelInternal) {
28
28
  const firmwareKey = `firmware-${model.toLowerCase()}`;