@trezor/connect 9.5.1 → 9.5.2-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 (48) hide show
  1. package/CHANGELOG.md +30 -6
  2. package/README.md +1 -1
  3. package/lib/api/ethereum/api/ethereumSignTypedData.js +2 -1
  4. package/lib/api/firmware/getBinaryForFirmwareUpgrade.d.ts +2 -1
  5. package/lib/api/firmware/parseFirmwareHeaders.d.ts +1 -1
  6. package/lib/api/firmware/uploadFirmware.js +1 -1
  7. package/lib/api/getFeatures.d.ts +1 -1
  8. package/lib/api/resetDevice.js +16 -10
  9. package/lib/api/solana/solanaUtils.d.ts +4 -4
  10. package/lib/api/solana/solanaUtils.js +1 -1
  11. package/lib/api/wipeDevice.js +4 -1
  12. package/lib/core/index.js +31 -20
  13. package/lib/core/method.js +1 -1
  14. package/lib/core/onCallFirmwareUpdate.d.ts +2 -1
  15. package/lib/core/onCallFirmwareUpdate.js +10 -16
  16. package/lib/data/DataManager.js +4 -4
  17. package/lib/data/deviceAuthenticityConfig.js +4 -1
  18. package/lib/data/firmwareInfo.d.ts +4 -3
  19. package/lib/data/firmwareInfo.js +10 -6
  20. package/lib/data/models.d.ts +1 -1
  21. package/lib/data/transportInfo.d.ts +0 -1
  22. package/lib/data/transportInfo.js +2 -3
  23. package/lib/data/version.d.ts +1 -1
  24. package/lib/data/version.js +1 -1
  25. package/lib/device/Device.d.ts +22 -8
  26. package/lib/device/Device.js +17 -10
  27. package/lib/device/DeviceCommands.d.ts +3 -3
  28. package/lib/device/DeviceCommands.js +17 -13
  29. package/lib/device/TransportList.js +1 -5
  30. package/lib/device/calculateRevisionForDevice.d.ts +1 -1
  31. package/lib/device/checkFirmwareRevision.js +8 -4
  32. package/lib/device/prompts.d.ts +26 -12
  33. package/lib/device/prompts.js +19 -13
  34. package/lib/events/device.d.ts +1 -1
  35. package/lib/types/api/device.d.ts +1 -0
  36. package/lib/types/api/device.js +2 -0
  37. package/lib/types/api/firmwareUpdate.d.ts +1 -1
  38. package/lib/types/coinInfo.js +2 -2
  39. package/lib/types/device.d.ts +3 -41
  40. package/lib/types/device.js +1 -8
  41. package/lib/types/firmware.d.ts +1 -2
  42. package/lib/types/index.d.ts +1 -0
  43. package/lib/types/index.js +3 -0
  44. package/lib/utils/assetUtils.d.ts +1 -1
  45. package/lib/utils/assetUtils.js +9 -9
  46. package/lib/utils/deviceFeaturesUtils.d.ts +2 -1
  47. package/lib/utils/deviceFeaturesUtils.js +4 -4
  48. package/package.json +17 -16
package/CHANGELOG.md CHANGED
@@ -1,16 +1,40 @@
1
1
  | Package | Stable | Canary |
2
2
  | :------------------------------: | :----: | :----------: |
3
- | npm @trezor/connect | 9.5.1 | - |
4
- | npm @trezor/connect-web | 9.5.1 | - |
5
- | npm @trezor/connect-webextension | 9.5.1 | - |
3
+ | npm @trezor/connect | 9.5.1 | 9.5.2-beta.2 |
4
+ | npm @trezor/connect-web | 9.5.1 | 9.5.2-beta.2 |
5
+ | npm @trezor/connect-webextension | 9.5.1 | 9.5.2-beta.2 |
6
6
  | npm @trezor/connect-mobile | - | 0.0.1-beta.1 |
7
7
 
8
- | Deployment | Stable | Canary |
9
- | :----------------: | :----: | :----: |
10
- | connect.trezor.io/ | 9.5.1 | - |
8
+ | Deployment | Stable | Canary |
9
+ | :----------------: | :----: | :----------: |
10
+ | connect.trezor.io/ | 9.5.1 | 9.5.2-beta.2 |
11
11
 
12
12
  Use the persistent link [connect.trezor.io/9](https://connect.trezor.io/9/) to access the latest stable version of Connect Explorer.
13
13
 
14
+ # 9.5.2-beta.2
15
+
16
+ Replace @solana/web3.js with @solana/kit
17
+
18
+ # 9.5.2-beta.1
19
+
20
+ ## Feature
21
+
22
+ - feat(connect-web): forward device events in popup mode (8589d27). From now on you may listen for device events even if you are using core logic loaded into connect.trezor.io/9/popup.html. This feature was previously available only in @trezor/connect or in @trezor/connect-web using iframe.
23
+ - feat(connect-web): enable coreMode auto by default (061b28a). From now on (applies for @trezor/connect-web) if you don't pass `coreMode` in TrezorConnect.init, TrezorConnect would automatically fallback to loading connect-core into popup.html instead loading it into the injected iframe. This fallback happens
24
+ in cases when iframe can't be injected or trezor-bridge is not running.
25
+
26
+ ## Chores
27
+
28
+ - chore(connect): update device authenticity config (ecc04a4)
29
+ - chore(connect-common): add fw binaries for 2.8.9 (63a69af)
30
+ - stop exporting DeviceModelInternal enum (0ad5a37, 0bcf666, 465f40a). We believe that this was only used internally.
31
+ - chore(connect-popup): bump deprecation warning to 9.4.0 (2d8d78d)
32
+
33
+ ## Fixes
34
+
35
+ - feat(connect): add errorPayload to FW revision check other-error (afe36df)
36
+ - fix(connect): assign object instead of mutating (a09a669)
37
+
14
38
  # 9.5.1
15
39
 
16
40
  ## Feature
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @trezor/connect
2
2
 
3
- API version 9.5.1
3
+ API version 9.5.2-beta.2
4
4
 
5
5
  [![Build Status](https://github.com/trezor/trezor-suite/actions/workflows/test-connect.yml/badge.svg)](https://github.com/trezor/trezor-suite/actions/workflows/test-connect.yml)
6
6
  [![NPM](https://img.shields.io/npm/v/@trezor/connect.svg)](https://www.npmjs.org/package/@trezor/connect)
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const device_utils_1 = require("@trezor/device-utils");
3
4
  const protobuf_1 = require("@trezor/protobuf");
4
5
  const schema_utils_1 = require("@trezor/schema-utils");
5
6
  const constants_1 = require("../../../constants");
@@ -76,7 +77,7 @@ class EthereumSignTypedData extends AbstractMethod_1.AbstractMethod {
76
77
  async run() {
77
78
  const cmd = this.device.getCommands();
78
79
  const { address_n, definitions } = this.params;
79
- if (this.device.features.internal_model === types_1.DeviceModelInternal.T1B1) {
80
+ if (this.device.features.internal_model === device_utils_1.DeviceModelInternal.T1B1) {
80
81
  (0, schema_utils_1.Assert)(schema_utils_1.Type.Object({
81
82
  domain_separator_hash: schema_utils_1.Type.String(),
82
83
  message_hash: schema_utils_1.Type.Optional(schema_utils_1.Type.String()),
@@ -1,5 +1,6 @@
1
+ import { VersionArray } from '@trezor/device-utils';
1
2
  import { GetInfoProps } from '../../data/firmwareInfo';
2
- import { IntermediaryVersion, VersionArray } from '../../types';
3
+ import { IntermediaryVersion } from '../../types';
3
4
  interface GetBinaryForFirmwareUpgradeProps extends GetInfoProps {
4
5
  baseUrl: string;
5
6
  btcOnly?: boolean;
@@ -1,4 +1,4 @@
1
- import type { VersionArray } from '../../types/firmware';
1
+ import type { VersionArray } from '@trezor/device-utils';
2
2
  export declare const parseFirmwareHeaders: (buff: Buffer) => {
3
3
  version: VersionArray;
4
4
  };
@@ -5,7 +5,7 @@ const constants_1 = require("../../constants");
5
5
  const events_1 = require("../../events");
6
6
  const postConfirmationMessage = (device) => {
7
7
  if (device.features.firmware_present) {
8
- device.emit(events_1.DEVICE.BUTTON, device, { code: 'ButtonRequest_FirmwareUpdate' });
8
+ device.emit(events_1.DEVICE.BUTTON, { device, payload: { code: 'ButtonRequest_FirmwareUpdate' } });
9
9
  }
10
10
  };
11
11
  const postProgressMessage = (device, progress, postMessage) => {
@@ -53,7 +53,7 @@ export default class GetFeatures extends AbstractMethod<'getFeatures'> {
53
53
  auto_lock_delay_ms: number | null;
54
54
  display_rotation: "North" | "East" | "South" | "West" | null;
55
55
  experimental_features: boolean | null;
56
- internal_model: import("@trezor/protobuf").DeviceModelInternal;
56
+ internal_model: import("@trezor/protobuf/lib/messages-schema").DeviceModelInternal;
57
57
  }>;
58
58
  }
59
59
  //# sourceMappingURL=getFeatures.d.ts.map
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const schema_utils_1 = require("@trezor/schema-utils");
4
+ const errors_groups_1 = require("@trezor/transport/lib/errors-groups");
4
5
  const utils_1 = require("@trezor/utils");
5
6
  const verifyEntropy_1 = require("../api/firmware/verifyEntropy");
6
7
  const constants_1 = require("../constants");
@@ -69,7 +70,8 @@ class ResetDevice extends AbstractMethod_1.AbstractMethod {
69
70
  xpubs,
70
71
  });
71
72
  if (res.error) {
72
- await (0, prompts_1.cancelPrompt)(this.device);
73
+ await (0, prompts_1.cancelPrompt)(this.device).catch(() => {
74
+ });
73
75
  throw new Error(res.error);
74
76
  }
75
77
  return currentData;
@@ -79,18 +81,22 @@ class ResetDevice extends AbstractMethod_1.AbstractMethod {
79
81
  if (this.params.entropy_check && this.device.unavailableCapabilities['entropyCheck']) {
80
82
  this.params.entropy_check = false;
81
83
  }
82
- let entropyData = await this.getEntropyData('ResetDevice');
83
- if (this.params.entropy_check) {
84
- const tries = (0, utils_1.getRandomInt)(1, 5);
85
- for (let i = 0; i < tries; i++) {
86
- try {
84
+ try {
85
+ let entropyData = await this.getEntropyData('ResetDevice');
86
+ if (this.params.entropy_check) {
87
+ const tries = (0, utils_1.getRandomInt)(1, 5);
88
+ for (let i = 0; i < tries; i++) {
87
89
  entropyData = await this.entropyCheck(entropyData);
88
90
  }
89
- catch (error) {
90
- throw constants_1.ERRORS.TypedError('Failure_EntropyCheck', error.message);
91
- }
91
+ await cmd.typedCall('EntropyCheckContinue', 'Success', { finish: true });
92
+ }
93
+ }
94
+ catch (error) {
95
+ if (error.cause === 'transport-error' &&
96
+ errors_groups_1.ERRORS_WITHOUT_DEVICE_INTERACTION.includes(error.message)) {
97
+ throw error;
92
98
  }
93
- await cmd.typedCall('EntropyCheckContinue', 'Success', { finish: true });
99
+ throw constants_1.ERRORS.TypedError('Failure_EntropyCheck', error.message);
94
100
  }
95
101
  return { message: 'Success' };
96
102
  }
@@ -1,4 +1,4 @@
1
- import { type CompilableTransactionMessage } from '@solana/web3.js';
1
+ import { type CompilableTransactionMessage } from '@solana/kit';
2
2
  import type { TokenAccount } from '@trezor/blockchain-link-types';
3
3
  import type { TokenProgramName } from '@trezor/blockchain-link-utils/lib/solana';
4
4
  import { BigNumber } from '@trezor/utils/lib/bigNumber';
@@ -24,9 +24,9 @@ export declare const buildTransferTransaction: (fromAddress: string, toAddress:
24
24
  serializeMessage(): string;
25
25
  serialize(): string;
26
26
  }>;
27
- export declare const buildTokenTransferInstruction: (from: string, to: string, owner: string, amount: BigNumber, mint: string, decimals: number, tokenProgramName: TokenProgramName) => Promise<import("@solana-program/token").TransferCheckedInstruction<import("@solana/web3.js").Address<"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA">, string, string, string, string, []> | import("@solana-program/token-2022").TransferCheckedInstruction<import("@solana/web3.js").Address<"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA">, string, string, string, string, []>>;
28
- export declare const getAssociatedTokenAccountAddress: (baseAddress: string, tokenMintAddress: string, tokenProgramName: TokenProgramName) => Promise<import("@solana/web3.js").Address<string>>;
29
- export declare const buildCreateAssociatedTokenAccountInstruction: (funderAddress: string, newOwnerAddress: string, tokenMintAddress: string, tokenProgramName: TokenProgramName) => Promise<readonly [import("@solana-program/token").CreateAssociatedTokenInstruction<import("@solana/web3.js").Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">, string, string, string, string, string, string, []>, import("@solana/web3.js").Address<string>]>;
27
+ export declare const buildTokenTransferInstruction: (from: string, to: string, owner: string, amount: BigNumber, mint: string, decimals: number, tokenProgramName: TokenProgramName) => Promise<import("@solana-program/token").TransferCheckedInstruction<import("@solana/kit").Address<"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA">, string, string, string, string, []> | import("@solana-program/token-2022").TransferCheckedInstruction<import("@solana/kit").Address<"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA">, string, string, string, string, []>>;
28
+ export declare const getAssociatedTokenAccountAddress: (baseAddress: string, tokenMintAddress: string, tokenProgramName: TokenProgramName) => Promise<import("@solana/kit").Address<string>>;
29
+ export declare const buildCreateAssociatedTokenAccountInstruction: (funderAddress: string, newOwnerAddress: string, tokenMintAddress: string, tokenProgramName: TokenProgramName) => Promise<readonly [import("@solana-program/token").CreateAssociatedTokenInstruction<import("@solana/kit").Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">, string, string, string, string, string, string, []>, import("@solana/kit").Address<string>]>;
30
30
  type TokenTransferTxWithDestinationAddress = {
31
31
  transaction: {
32
32
  addSignature(signerPubKey: string, signatureHex: string): void;
@@ -30,7 +30,7 @@ const ts_belt_1 = require("@mobily/ts-belt");
30
30
  const blockchain_link_utils_1 = require("@trezor/blockchain-link-utils");
31
31
  const bigNumber_1 = require("@trezor/utils/lib/bigNumber");
32
32
  const { SYSTEM_PROGRAM_PUBLIC_KEY, tokenProgramsInfo } = blockchain_link_utils_1.solanaUtils;
33
- const loadSolanaLib = async () => await Promise.resolve().then(() => __importStar(require('@solana/web3.js')));
33
+ const loadSolanaLib = async () => await Promise.resolve().then(() => __importStar(require('@solana/kit')));
34
34
  const loadSolanaComputeBudgetProgramLib = async () => await Promise.resolve().then(() => __importStar(require('@solana-program/compute-budget')));
35
35
  const loadSolanaSystemProgramLib = async () => await Promise.resolve().then(() => __importStar(require('@solana-program/system')));
36
36
  const loadSolanaTokenProgramLib = async (tokenProgramName) => {
@@ -26,7 +26,10 @@ class WipeDevice extends AbstractMethod_1.AbstractMethod {
26
26
  async run() {
27
27
  const cmd = this.device.getCommands();
28
28
  if (this.device.isBootloader()) {
29
- this.device.emit(events_1.DEVICE.BUTTON, this.device, { code: 'ButtonRequest_WipeDevice' });
29
+ this.device.emit(events_1.DEVICE.BUTTON, {
30
+ device: this.device,
31
+ payload: { code: 'ButtonRequest_WipeDevice' },
32
+ });
30
33
  }
31
34
  const response = await cmd.typedCall('WipeDevice', 'Success');
32
35
  return response.message;
package/lib/core/index.js CHANGED
@@ -383,16 +383,7 @@ const onCallDevice = async (context, message, method) => {
383
383
  if (method.hasExpectedDeviceState) {
384
384
  device.setState(method.deviceState);
385
385
  }
386
- device.on(events_2.DEVICE.BUTTON, onDeviceButtonHandler(context, method));
387
- device.on(events_2.DEVICE.PIN, onDevicePinHandler(context));
388
- device.on(events_2.DEVICE.WORD, onDeviceWordHandler(context));
389
- device.on(events_2.DEVICE.PASSPHRASE, (method.useEmptyPassphrase ? onEmptyPassphraseHandler : onDevicePassphraseHandler)(context));
390
- device.on(events_2.DEVICE.PASSPHRASE_ON_DEVICE, () => {
391
- sendCoreMessage((0, events_2.createUiMessage)(events_2.UI.REQUEST_PASSPHRASE_ON_DEVICE, { device: device.toMessageObject() }));
392
- });
393
- device.on(events_2.DEVICE.FIRMWARE_VERSION_CHANGED, payload => {
394
- sendCoreMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.FIRMWARE_VERSION_CHANGED, payload));
395
- });
386
+ registerDeviceEvents(context, method)(device);
396
387
  if (useCoreInPopup && env === 'webextension' && origin) {
397
388
  device.initStorage(new StateStorage_1.WebextensionStateStorage(origin));
398
389
  }
@@ -411,6 +402,9 @@ const onCallDevice = async (context, message, method) => {
411
402
  });
412
403
  }
413
404
  catch (error) {
405
+ if (error.cause) {
406
+ _log.debug('device.run error caught, caused by:', error.cause);
407
+ }
414
408
  if (error.code === 'Device_Disconnected') {
415
409
  deviceList.addAuthPenalty(device);
416
410
  }
@@ -466,14 +460,14 @@ const closePopup = ({ popupPromise, sendCoreMessage }) => {
466
460
  }
467
461
  sendCoreMessage((0, events_2.createUiMessage)(events_2.UI.CLOSE_UI_WINDOW));
468
462
  };
469
- const onDeviceButtonHandler = (context, method) => async (...[device, request]) => {
463
+ const onDeviceButtonHandler = (context, method) => async ({ device, payload: request }) => {
470
464
  const { sendCoreMessage } = context;
471
465
  const addressRequest = request.code === 'ButtonRequest_Address';
472
- if (!addressRequest || (addressRequest && method.useUi)) {
466
+ if (!addressRequest || (addressRequest && method?.useUi)) {
473
467
  await waitForPopup(context);
474
468
  }
475
- const data = typeof method.getButtonRequestData === 'function' && request.code
476
- ? method.getButtonRequestData(request.code)
469
+ const data = typeof method?.getButtonRequestData === 'function' && request.code
470
+ ? method?.getButtonRequestData(request.code)
477
471
  : undefined;
478
472
  startInteractionTimeout(context);
479
473
  sendCoreMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.BUTTON, { ...request, device: device.toMessageObject() }));
@@ -482,11 +476,11 @@ const onDeviceButtonHandler = (context, method) => async (...[device, request])
482
476
  device: device.toMessageObject(),
483
477
  data,
484
478
  }));
485
- if (addressRequest && !method.useUi) {
479
+ if (addressRequest && !method?.useUi) {
486
480
  sendCoreMessage((0, events_2.createUiMessage)(events_2.UI.ADDRESS_VALIDATION, data));
487
481
  }
488
482
  };
489
- const onDevicePinHandler = (context) => async (...[device, type, callback]) => {
483
+ const onDevicePinHandler = (context) => async ({ device, type, callback }) => {
490
484
  const { uiPromises, sendCoreMessage } = context;
491
485
  await waitForPopup(context);
492
486
  const uiPromise = uiPromises.create(events_2.UI.RECEIVE_PIN, device);
@@ -499,7 +493,7 @@ const onDevicePinHandler = (context) => async (...[device, type, callback]) => {
499
493
  callback(null, error);
500
494
  }
501
495
  };
502
- const onDeviceWordHandler = (context) => async (...[device, type, callback]) => {
496
+ const onDeviceWordHandler = (context) => async ({ device, type, callback }) => {
503
497
  const { uiPromises, sendCoreMessage } = context;
504
498
  await waitForPopup(context);
505
499
  const uiPromise = uiPromises.create(events_2.UI.RECEIVE_WORD, device);
@@ -512,7 +506,7 @@ const onDeviceWordHandler = (context) => async (...[device, type, callback]) =>
512
506
  callback(null, error);
513
507
  }
514
508
  };
515
- const onDevicePassphraseHandler = (context) => async (...[device, callback]) => {
509
+ const onDevicePassphraseHandler = (context) => async ({ device, callback }) => {
516
510
  const { uiPromises, sendCoreMessage } = context;
517
511
  await waitForPopup(context);
518
512
  const uiPromise = uiPromises.create(events_2.UI.RECEIVE_PASSPHRASE, device);
@@ -525,9 +519,24 @@ const onDevicePassphraseHandler = (context) => async (...[device, callback]) =>
525
519
  callback(null, error);
526
520
  }
527
521
  };
528
- const onEmptyPassphraseHandler = () => (...[_, callback]) => {
522
+ const onEmptyPassphraseHandler = () => ({ callback }) => {
529
523
  callback({ value: '' });
530
524
  };
525
+ const registerDeviceEvents = (context, method) => (device) => {
526
+ device.removeAllListeners();
527
+ device.on(events_2.DEVICE.BUTTON, onDeviceButtonHandler(context, method));
528
+ device.on(events_2.DEVICE.PIN, onDevicePinHandler(context));
529
+ device.on(events_2.DEVICE.WORD, onDeviceWordHandler(context));
530
+ device.on(events_2.DEVICE.PASSPHRASE, (method?.useEmptyPassphrase ? onEmptyPassphraseHandler : onDevicePassphraseHandler)(context));
531
+ device.on(events_2.DEVICE.PASSPHRASE_ON_DEVICE, () => {
532
+ context.sendCoreMessage((0, events_2.createUiMessage)(events_2.UI.REQUEST_PASSPHRASE_ON_DEVICE, {
533
+ device: device.toMessageObject(),
534
+ }));
535
+ });
536
+ device.on(events_2.DEVICE.FIRMWARE_VERSION_CHANGED, payload => {
537
+ context.sendCoreMessage((0, events_2.createDeviceMessage)(events_2.DEVICE.FIRMWARE_VERSION_CHANGED, payload));
538
+ });
539
+ };
531
540
  const onPopupClosed = (context, customErrorMessage) => {
532
541
  const { uiPromises, popupPromise, deviceList, callMethods, resetWaitForFirstMethod, setOverridePromise, sendCoreMessage, } = context;
533
542
  const error = customErrorMessage
@@ -704,14 +713,16 @@ class Core extends events_1.default {
704
713
  case events_2.IFRAME.CALL:
705
714
  if (message.payload.method === 'firmwareUpdate') {
706
715
  (0, DeviceList_1.assertDeviceListConnected)(this.deviceList);
716
+ const coreContext = this.getCoreContext();
707
717
  (0, onCallFirmwareUpdate_1.onCallFirmwareUpdate)({
708
718
  params: message.payload,
709
719
  context: {
710
720
  deviceList: this.deviceList,
711
721
  postMessage: this.sendCoreMessage.bind(this),
712
- initDevice: path => initDevice(this.getCoreContext(), { path }),
722
+ initDevice: path => initDevice(coreContext, { path }),
713
723
  log: _log,
714
724
  abortSignal: this.abortController.signal,
725
+ registerEvents: registerDeviceEvents(coreContext),
715
726
  },
716
727
  })
717
728
  .then(payload => {
@@ -13,7 +13,7 @@ const getMethod = async (message) => {
13
13
  }
14
14
  const methodModule = getMethodModule(method);
15
15
  const methods = methodModule
16
- ? await Promise.resolve(`${`../api/${methodModule}/api`}`).then(s => tslib_1.__importStar(require(s)))
16
+ ? await Promise.resolve(`${`../api/${methodModule}/api/index.ts`}`).then(s => tslib_1.__importStar(require(s)))
17
17
  : Methods;
18
18
  const MethodConstructor = methods[method];
19
19
  if (MethodConstructor) {
@@ -13,6 +13,7 @@ export type Params = {
13
13
  } & CommonParams;
14
14
  type Context = {
15
15
  deviceList: DeviceList;
16
+ registerEvents: (device: Device) => void;
16
17
  postMessage: PostMessage;
17
18
  initDevice: (path?: DeviceUniquePath) => Promise<Device>;
18
19
  log: Log;
@@ -22,6 +23,6 @@ type OnCallFirmwareUpdateParams = {
22
23
  params: Params;
23
24
  context: Context;
24
25
  };
25
- export declare const onCallFirmwareUpdate: ({ params, context: { deviceList, postMessage, initDevice, log, abortSignal }, }: OnCallFirmwareUpdateParams) => Promise<FirmwareUpdateResponse>;
26
+ export declare const onCallFirmwareUpdate: ({ params, context, }: OnCallFirmwareUpdateParams) => Promise<FirmwareUpdateResponse>;
26
27
  export {};
27
28
  //# sourceMappingURL=onCallFirmwareUpdate.d.ts.map
@@ -7,15 +7,7 @@ const firmware_1 = require("../api/firmware");
7
7
  const constants_1 = require("../constants");
8
8
  const firmwareInfo_1 = require("../data/firmwareInfo");
9
9
  const events_1 = require("../events");
10
- const registerEvents = (device, postMessage) => {
11
- device.on(events_1.DEVICE.BUTTON, (_d, request) => {
12
- postMessage((0, events_1.createDeviceMessage)(events_1.DEVICE.BUTTON, {
13
- code: request.code,
14
- device: device.toMessageObject(),
15
- }));
16
- });
17
- };
18
- const waitForReconnectedDevice = async ({ bootloader, method, intermediary }, { deviceList, device, postMessage, log, abortSignal }) => {
10
+ const waitForReconnectedDevice = async ({ bootloader, method, intermediary }, { deviceList, device, registerEvents, postMessage, log, abortSignal }) => {
19
11
  const target = intermediary || !bootloader ? 'normal' : 'bootloader';
20
12
  let i = 0;
21
13
  if (method !== 'auto') {
@@ -52,6 +44,7 @@ const waitForReconnectedDevice = async ({ bootloader, method, intermediary }, {
52
44
  reconnectedDevice.handshakeFinished) {
53
45
  log.debug('onCallFirmwareUpdate', 'we were unable to read device.features on the first interaction after seeing it, retrying...');
54
46
  try {
47
+ registerEvents(reconnectedDevice);
55
48
  await reconnectedDevice.run(undefined, {
56
49
  skipFirmwareChecks: true,
57
50
  skipLanguageChecks: true,
@@ -78,7 +71,7 @@ const waitForReconnectedDevice = async ({ bootloader, method, intermediary }, {
78
71
  if (!reconnectedDevice) {
79
72
  throw constants_1.ERRORS.TypedError('Method_Interrupted');
80
73
  }
81
- registerEvents(reconnectedDevice, postMessage);
74
+ registerEvents(reconnectedDevice);
82
75
  await reconnectedDevice.waitForFirstRun();
83
76
  if (!reconnectedDevice.isUsedHere()) {
84
77
  await reconnectedDevice.acquire();
@@ -165,14 +158,15 @@ const getBinaryHelper = (device, params, log, postMessage, btcOnly) => {
165
158
  };
166
159
  });
167
160
  };
168
- const onCallFirmwareUpdate = async ({ params, context: { deviceList, postMessage, initDevice, log, abortSignal }, }) => {
161
+ const onCallFirmwareUpdate = async ({ params, context, }) => {
162
+ const { deviceList, registerEvents, postMessage, initDevice, log } = context;
169
163
  log.debug('onCallFirmwareUpdate with params: ', params);
170
164
  const device = await initDevice(params?.device?.path);
171
165
  if (deviceList.getDeviceCount() > 1) {
172
166
  throw constants_1.ERRORS.TypedError('Device_MultipleNotSupported', 'Firmware update allowed with only 1 device connected');
173
167
  }
174
168
  log.debug('onCallFirmwareUpdate', 'device', device);
175
- registerEvents(device, postMessage);
169
+ registerEvents(device);
176
170
  const { manual, upgrade, language, btcOnly } = getInstallationParams(device, params);
177
171
  log.debug('onCallFirmwareUpdate', 'installation params', {
178
172
  manual,
@@ -190,7 +184,7 @@ const onCallFirmwareUpdate = async ({ params, context: { deviceList, postMessage
190
184
  await device.acquire();
191
185
  }
192
186
  else if (manual) {
193
- reconnectedDevice = await waitForReconnectedDevice({ bootloader: true, method: 'manual' }, { deviceList, device, log, postMessage, abortSignal });
187
+ reconnectedDevice = await waitForReconnectedDevice({ bootloader: true, method: 'manual' }, { ...context, device });
194
188
  }
195
189
  else {
196
190
  const rebootParams = upgrade
@@ -230,7 +224,7 @@ const onCallFirmwareUpdate = async ({ params, context: { deviceList, postMessage
230
224
  if (device.features.major_version === 1) {
231
225
  await (0, utils_1.resolveAfter)(2000);
232
226
  }
233
- reconnectedDevice = await waitForReconnectedDevice({ bootloader: true, method: 'auto' }, { deviceList, device, log, postMessage, abortSignal });
227
+ reconnectedDevice = await waitForReconnectedDevice({ bootloader: true, method: 'auto' }, { ...context, device });
234
228
  }
235
229
  const intermediary = !params.binary && device.firmwareRelease?.intermediaryVersion;
236
230
  const bootloaderVersion = reconnectedDevice.getVersion();
@@ -240,13 +234,13 @@ const onCallFirmwareUpdate = async ({ params, context: { deviceList, postMessage
240
234
  log.info('onCallFirmwareUpdate', 'firmware uploaded');
241
235
  if (intermediary) {
242
236
  log.info('onCallFirmwareUpdate', '...but it was the intermediary firmware, so one more go');
243
- reconnectedDevice = await waitForReconnectedDevice({ bootloader: true, method: 'manual', intermediary: true }, { deviceList, device: reconnectedDevice, log, postMessage, abortSignal });
237
+ reconnectedDevice = await waitForReconnectedDevice({ bootloader: true, method: 'manual', intermediary: true }, { ...context, device: reconnectedDevice });
244
238
  binaryInfo = await getBinaryHelper(reconnectedDevice, params, log, postMessage, btcOnly);
245
239
  stripped = (0, firmware_1.stripFwHeaders)(binaryInfo.binary);
246
240
  await reconnectedDevice.initialize(false);
247
241
  await (0, firmware_1.uploadFirmware)(reconnectedDevice.getCommands().typedCall.bind(reconnectedDevice.getCommands()), postMessage, reconnectedDevice, { payload: stripped });
248
242
  }
249
- reconnectedDevice = await waitForReconnectedDevice({ bootloader: false, method: 'wait' }, { deviceList, device: reconnectedDevice, log, postMessage, abortSignal });
243
+ reconnectedDevice = await waitForReconnectedDevice({ bootloader: false, method: 'wait' }, { ...context, device: reconnectedDevice });
250
244
  if (reconnectedDevice.atLeast('2.7.0') &&
251
245
  deviceInitiallyConnectedWithoutFirmware &&
252
246
  params.language) {
@@ -4,10 +4,10 @@ exports.DataManager = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const coins_eth_json_1 = tslib_1.__importDefault(require("@trezor/connect-common/files/coins-eth.json"));
6
6
  const coins_json_1 = tslib_1.__importDefault(require("@trezor/connect-common/files/coins.json"));
7
+ const device_utils_1 = require("@trezor/device-utils");
7
8
  const messages_json_1 = tslib_1.__importDefault(require("@trezor/protobuf/messages.json"));
8
9
  const coinInfo_1 = require("./coinInfo");
9
10
  const firmwareInfo_1 = require("./firmwareInfo");
10
- const types_1 = require("../types");
11
11
  const assetUtils_1 = require("../utils/assetUtils");
12
12
  class DataManager {
13
13
  static assets = {};
@@ -30,11 +30,11 @@ class DataManager {
30
30
  ...this.assets.coins,
31
31
  ...this.assets.coinsEth,
32
32
  });
33
- for (const model in types_1.DeviceModelInternal) {
33
+ for (const model in device_utils_1.DeviceModelInternal) {
34
34
  const firmwareKey = `firmware-${model.toLowerCase()}`;
35
- const modelType = types_1.DeviceModelInternal[model];
35
+ const modelType = device_utils_1.DeviceModelInternal[model];
36
36
  if (this.assets[firmwareKey]) {
37
- (0, firmwareInfo_1.parseFirmware)(this.assets[firmwareKey], modelType);
37
+ (0, firmwareInfo_1.parseFirmwareReleases)(this.assets[firmwareKey], modelType);
38
38
  }
39
39
  }
40
40
  }
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.deviceAuthenticityConfig = void 0;
4
4
  exports.deviceAuthenticityConfig = {
5
5
  version: 1,
6
- timestamp: '2025-02-06T12:00:00.000Z',
6
+ timestamp: '2025-03-05T12:00:00.000Z',
7
7
  T2B1: {
8
8
  rootPubKeys: [
9
9
  '04ca97480ac0d7b1e6efafe518cd433cec2bf8ab9822d76eafd34363b55d63e60380bff20acc75cde03cffcb50ab6f8ce70c878e37ebc58ff7cca0a83b16b15fa5',
@@ -81,6 +81,9 @@ exports.deviceAuthenticityConfig = {
81
81
  '04476f0184085862bd38a7f39ef03be6915d7c1b0626c263f6f6c9bc5575c41f81f77d9c69eb16ce8ad7b0d11f3de937931adc9f35ea1f007b81a571ae036ef8c3',
82
82
  '046ecbbc4316c0a1247b91103a6f2a3bbd746c04bf47c9ea52dce3735c8ba04df088d3ce66cc8fea0063c344268e03f9d7cce35c8381747d4df4ba4491a178c382',
83
83
  '04c341d6af7e960f4c2926035d1f7f8164be244e87742924ef0dddf430e89521846673ed009884146042b79b02dd00c7a2d708f6dc33d43cc6d5073edc17a71376',
84
+ '04221f144939e3201538d02b61a4b419b12678dc27ccd3813bfda29f181ba7160807e7a3c6f3938b12e6a9e7e76314fd13757a39454b93e3d1a28c633cbf475c0f',
85
+ '0471515c2c4b94274ec0b3b1d799378730010fb6b5b738d9ef2087e930d0f75d53b1e5284ed51335f45b7b30973af848a40ad86dbe34962dfee6a019d32f5b21dd',
86
+ '04f9f46d57a7bb9d2ac2e9121eb85f6e9a2a7e2b395ec6e7f93660e5caac2f64483dae074bd5b7e7d8057b2732b3dff5d861eefc5ab86059483d3374d527c877f1',
84
87
  ],
85
88
  debug: {
86
89
  rootPubKeys: [],
@@ -1,6 +1,6 @@
1
+ import { DeviceModelInternal, VersionArray } from '@trezor/device-utils';
1
2
  import type { Features, FirmwareRelease, ReleaseInfo } from '../types';
2
- import { DeviceModelInternal } from '../types';
3
- export declare const parseFirmware: (json: any, deviceModel: DeviceModelInternal) => void;
3
+ export declare const parseFirmwareReleases: (json: any, deviceModel: DeviceModelInternal) => void;
4
4
  export declare const getReleases: (deviceModel: DeviceModelInternal) => FirmwareRelease[];
5
5
  export interface GetInfoProps {
6
6
  features: Features;
@@ -8,5 +8,6 @@ export interface GetInfoProps {
8
8
  }
9
9
  export declare const getInfo: ({ features, releases }: GetInfoProps) => ReleaseInfo | null;
10
10
  export declare const getFirmwareStatus: (features: Features) => "valid" | "outdated" | "required" | "unknown" | "custom" | "none";
11
- export declare const getRelease: (features: Features) => ReleaseInfo | null;
11
+ export declare const getReleaseInfo: (features: Features) => ReleaseInfo | null;
12
+ export declare const getRelease: (internalModel: DeviceModelInternal, firmwareVersion: VersionArray | undefined) => FirmwareRelease | undefined;
12
13
  //# sourceMappingURL=firmwareInfo.d.ts.map
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getRelease = exports.getFirmwareStatus = exports.getInfo = exports.getReleases = exports.parseFirmware = void 0;
3
+ exports.getRelease = exports.getReleaseInfo = exports.getFirmwareStatus = exports.getInfo = exports.getReleases = exports.parseFirmwareReleases = void 0;
4
+ const device_utils_1 = require("@trezor/device-utils");
4
5
  const utils_1 = require("@trezor/utils");
5
- const types_1 = require("../types");
6
6
  const firmwareUtils_1 = require("../utils/firmwareUtils");
7
- const releases = Object.values(types_1.DeviceModelInternal).reduce((acc, key) => ({ ...acc, [key]: [] }), {});
8
- const parseFirmware = (json, deviceModel) => {
7
+ const releases = Object.values(device_utils_1.DeviceModelInternal).reduce((acc, key) => ({ ...acc, [key]: [] }), {});
8
+ const parseFirmwareReleases = (json, deviceModel) => {
9
9
  Object.keys(json).forEach(key => {
10
10
  const release = json[key];
11
11
  releases[deviceModel]?.push({
@@ -13,7 +13,7 @@ const parseFirmware = (json, deviceModel) => {
13
13
  });
14
14
  });
15
15
  };
16
- exports.parseFirmware = parseFirmware;
16
+ exports.parseFirmwareReleases = parseFirmwareReleases;
17
17
  const getReleases = (deviceModel) => releases[deviceModel] || [];
18
18
  exports.getReleases = getReleases;
19
19
  const getChangelog = (releases2, features) => {
@@ -143,9 +143,13 @@ const getFirmwareStatus = (features) => {
143
143
  return 'valid';
144
144
  };
145
145
  exports.getFirmwareStatus = getFirmwareStatus;
146
- const getRelease = (features) => (0, exports.getInfo)({
146
+ const getReleaseInfo = (features) => (0, exports.getInfo)({
147
147
  features,
148
148
  releases: (0, exports.getReleases)(features?.internal_model),
149
149
  });
150
+ exports.getReleaseInfo = getReleaseInfo;
151
+ const getRelease = (internalModel, firmwareVersion) => (0, exports.getReleases)(internalModel).find(r => firmwareVersion &&
152
+ utils_1.versionUtils.isVersionArray(firmwareVersion) &&
153
+ utils_1.versionUtils.isEqual(r.version, firmwareVersion));
150
154
  exports.getRelease = getRelease;
151
155
  //# sourceMappingURL=firmwareInfo.js.map
@@ -1,4 +1,4 @@
1
- import { DeviceModelInternal } from '@trezor/protobuf';
1
+ import { DeviceModelInternal } from '@trezor/device-utils';
2
2
  type ModelConfig = {
3
3
  name: string;
4
4
  colors: Record<string, string>;
@@ -1,4 +1,3 @@
1
1
  import type { BridgeInfo } from '../events/transport';
2
- export declare const getBridgeInfo: () => BridgeInfo;
3
2
  export declare const suggestBridgeInstaller: (platform?: string) => BridgeInfo;
4
3
  //# sourceMappingURL=transportInfo.d.ts.map
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.suggestBridgeInstaller = exports.getBridgeInfo = void 0;
3
+ exports.suggestBridgeInstaller = void 0;
4
4
  const info = {
5
5
  version: [2, 0, 27],
6
6
  packages: [
@@ -40,9 +40,8 @@ const info = {
40
40
  changelog: '',
41
41
  };
42
42
  const getBridgeInfo = () => info;
43
- exports.getBridgeInfo = getBridgeInfo;
44
43
  const suggestBridgeInstaller = (platform) => {
45
- const info2 = (0, exports.getBridgeInfo)();
44
+ const info2 = getBridgeInfo();
46
45
  if (platform) {
47
46
  info2.packages = info2.packages.map(p => ({
48
47
  ...p,
@@ -1,4 +1,4 @@
1
- export declare const VERSION = "9.5.1";
1
+ export declare const VERSION = "9.5.2-beta.2";
2
2
  export declare const DEFAULT_DOMAIN: string;
3
3
  export declare const CONTENT_SCRIPT_VERSION = 1;
4
4
  export declare const DEEPLINK_VERSION = 1;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DEEPLINK_VERSION = exports.CONTENT_SCRIPT_VERSION = exports.DEFAULT_DOMAIN = exports.VERSION = void 0;
4
- exports.VERSION = '9.5.1';
4
+ exports.VERSION = '9.5.2-beta.2';
5
5
  const versionN = exports.VERSION.split('.').map(s => parseInt(s, 10));
6
6
  const isBeta = exports.VERSION.includes('beta');
7
7
  exports.DEFAULT_DOMAIN = isBeta