@trezor/connect 9.6.2 → 9.6.3-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/CHANGELOG.md +18 -9
  2. package/README.md +1 -1
  3. package/lib/api/applySettings.js +16 -1
  4. package/lib/api/bitcoin/signtx.d.ts +2 -2
  5. package/lib/api/bitcoin/signtx.js +1 -1
  6. package/lib/api/bleUnpair.js +0 -1
  7. package/lib/api/cardano/api/cardanoGetAddress.d.ts +1 -0
  8. package/lib/api/cardano/api/cardanoSignMessage.d.ts +25 -0
  9. package/lib/api/cardano/api/cardanoSignMessage.js +97 -0
  10. package/lib/api/cardano/api/index.d.ts +1 -0
  11. package/lib/api/cardano/api/index.js +3 -1
  12. package/lib/api/cardano/cardanoUtils.d.ts +1 -1
  13. package/lib/api/cardano/cardanoUtils.js +2 -2
  14. package/lib/api/discoverAccounts.js +61 -33
  15. package/lib/api/ethereum/api/ethereumGetAddress.js +1 -0
  16. package/lib/api/ethereum/api/ethereumSignTransaction.js +22 -4
  17. package/lib/api/ethereum/ethereumSignTx.d.ts +3 -2
  18. package/lib/api/ethereum/ethereumSignTx.js +4 -2
  19. package/lib/api/evoluGetNode.d.ts +11 -0
  20. package/lib/api/evoluGetNode.js +26 -0
  21. package/lib/api/firmware/calculateFirmwareHash.d.ts +2 -1
  22. package/lib/api/firmware/calculateFirmwareHash.js +17 -4
  23. package/lib/api/firmware/getBinary.d.ts +7 -6
  24. package/lib/api/firmware/getBinary.js +18 -6
  25. package/lib/api/firmware/index.d.ts +0 -2
  26. package/lib/api/firmware/index.js +1 -5
  27. package/lib/api/firmware/uploadFirmware.d.ts +10 -1
  28. package/lib/api/firmware/uploadFirmware.js +8 -7
  29. package/lib/api/getFeatures.d.ts +2 -1
  30. package/lib/api/index.d.ts +3 -0
  31. package/lib/api/index.js +8 -2
  32. package/lib/api/nem/nemSignTx.d.ts +1 -1
  33. package/lib/api/pushTransaction.d.ts +2 -1
  34. package/lib/api/pushTransaction.js +2 -1
  35. package/lib/api/resetDevice.js +2 -1
  36. package/lib/api/ripple/api/rippleGetAddress.d.ts +1 -0
  37. package/lib/api/signMessage.js +1 -1
  38. package/lib/api/signTransaction.d.ts +1 -1
  39. package/lib/api/solana/api/solanaGetAddress.d.ts +1 -0
  40. package/lib/api/solana/api/solanaGetPublicKey.d.ts +2 -0
  41. package/lib/api/solana/api/solanaGetPublicKey.js +3 -0
  42. package/lib/api/stellar/api/stellarGetAddress.d.ts +1 -0
  43. package/lib/api/tezos/api/tezosGetAddress.d.ts +1 -0
  44. package/lib/api/tezos/tezosSignTx.d.ts +1 -1
  45. package/lib/api/thpGetCredentials.d.ts +10 -0
  46. package/lib/api/thpGetCredentials.js +31 -0
  47. package/lib/api/thpRemoveCredentials.d.ts +8 -0
  48. package/lib/api/thpRemoveCredentials.js +32 -0
  49. package/lib/api/wipeDevice.js +6 -2
  50. package/lib/backend/Blockchain.d.ts +4 -4
  51. package/lib/backend/Blockchain.js +12 -11
  52. package/lib/constants/cardano.d.ts +3 -0
  53. package/lib/constants/cardano.js +5 -1
  54. package/lib/constants/errors.d.ts +12 -9
  55. package/lib/constants/errors.js +18 -24
  56. package/lib/core/AbstractMethod.d.ts +5 -24
  57. package/lib/core/AbstractMethod.js +2 -2
  58. package/lib/core/index.js +5 -1
  59. package/lib/core/onCallFirmwareUpdate.d.ts +13 -1
  60. package/lib/core/onCallFirmwareUpdate.js +158 -94
  61. package/lib/data/DataManager.d.ts +13 -1
  62. package/lib/data/DataManager.js +44 -14
  63. package/lib/data/coinInfo.d.ts +8 -84
  64. package/lib/data/coinInfo.js +6 -9
  65. package/lib/data/config.d.ts +26 -192
  66. package/lib/data/config.js +37 -1
  67. package/lib/data/connectSettings.js +7 -0
  68. package/lib/data/defaultFeeLevels.js +2 -1
  69. package/lib/data/deviceAuthenticityConfig.js +10 -1
  70. package/lib/data/firmwareInfo.d.ts +44 -11
  71. package/lib/data/firmwareInfo.js +360 -122
  72. package/lib/data/thpSettings.js +5 -2
  73. package/lib/data/version.d.ts +2 -1
  74. package/lib/data/version.js +4 -3
  75. package/lib/device/Device.d.ts +17 -7
  76. package/lib/device/Device.js +72 -115
  77. package/lib/device/DeviceCommands.d.ts +1 -0
  78. package/lib/device/DeviceCurrentSession.d.ts +41 -20
  79. package/lib/device/DeviceCurrentSession.js +18 -22
  80. package/lib/device/TransportList.js +10 -5
  81. package/lib/device/checkFirmwareRevision.d.ts +3 -2
  82. package/lib/device/checkFirmwareRevision.js +6 -11
  83. package/lib/device/thp/handshake.d.ts +4 -0
  84. package/lib/device/thp/handshake.js +88 -0
  85. package/lib/device/thp/index.d.ts +4 -1
  86. package/lib/device/thp/index.js +24 -6
  87. package/lib/device/thp/pairing.d.ts +16 -0
  88. package/lib/device/thp/pairing.js +230 -0
  89. package/lib/device/thp/session.d.ts +3 -0
  90. package/lib/device/thp/session.js +27 -0
  91. package/lib/device/thp/thpCall.d.ts +41 -0
  92. package/lib/device/thp/thpCall.js +57 -0
  93. package/lib/device/workflow/checkFirmwareHash.d.ts +10 -0
  94. package/lib/device/workflow/checkFirmwareHash.js +79 -0
  95. package/lib/device/workflow/checkFirmwareHashWithRetries.d.ts +9 -0
  96. package/lib/device/workflow/checkFirmwareHashWithRetries.js +41 -0
  97. package/lib/device/workflow/handshake.js +7 -6
  98. package/lib/device/workflow/validateState.js +53 -10
  99. package/lib/events/ui-request.d.ts +1 -1
  100. package/lib/factory.js +4 -0
  101. package/lib/tsconfig.lib.tsbuildinfo +1 -1
  102. package/lib/types/api/bitcoin/index.d.ts +1 -1
  103. package/lib/types/api/cardano/index.d.ts +62 -1
  104. package/lib/types/api/cardano/index.js +30 -1
  105. package/lib/types/api/cardanoSignMessage.d.ts +4 -0
  106. package/lib/types/api/cardanoSignMessage.js +3 -0
  107. package/lib/types/api/discoverAccounts.d.ts +17 -12
  108. package/lib/types/api/ethereum/index.d.ts +108 -0
  109. package/lib/types/api/ethereum/index.js +3 -0
  110. package/lib/types/api/evoluGetNode.d.ts +4 -0
  111. package/lib/types/api/evoluGetNode.js +3 -0
  112. package/lib/types/api/index.d.ts +8 -0
  113. package/lib/types/api/pushTransaction.d.ts +4 -1
  114. package/lib/types/api/pushTransaction.js +7 -1
  115. package/lib/types/api/solana/index.d.ts +3 -0
  116. package/lib/types/api/solana/index.js +2 -0
  117. package/lib/types/api/thpGetCredentials.d.ts +4 -0
  118. package/lib/types/api/thpGetCredentials.js +3 -0
  119. package/lib/types/api/thpRemoveCredentials.d.ts +7 -0
  120. package/lib/types/api/thpRemoveCredentials.js +3 -0
  121. package/lib/types/device.d.ts +9 -9
  122. package/lib/types/firmware.d.ts +15 -12
  123. package/lib/types/firmware.js +0 -3
  124. package/lib/types/params.d.ts +1 -0
  125. package/lib/types/settings.d.ts +7 -0
  126. package/lib/utils/assetUtils.d.ts +5 -2
  127. package/lib/utils/assetUtils.js +14 -18
  128. package/lib/utils/assets.native.js +0 -2
  129. package/lib/utils/firmwareReleaseConfigUtils.d.ts +8 -5
  130. package/lib/utils/firmwareReleaseConfigUtils.js +74 -59
  131. package/lib/utils/firmwareUtils.d.ts +8 -4
  132. package/lib/utils/firmwareUtils.js +62 -20
  133. package/lib/utils/formatUtils.d.ts +1 -0
  134. package/lib/utils/formatUtils.js +3 -2
  135. package/package.json +16 -15
  136. package/lib/api/firmware/getBinaryForFirmwareUpgrade.d.ts +0 -12
  137. package/lib/api/firmware/getBinaryForFirmwareUpgrade.js +0 -32
  138. package/lib/data/getLanguage.d.ts +0 -6
  139. package/lib/data/getLanguage.js +0 -10
@@ -1,18 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.tryLocalAssetRequire = exports.firmwareReleaseConfigAssets = exports.firmwareAssets = void 0;
3
+ exports.tryLocalAssetRequire = exports.firmwareReleaseConfigAssets = exports.getReleaseAsset = exports.getReleasesAssetByDeviceModelAndFirmwareType = void 0;
4
+ const firmware_1 = require("@trezor/connect-common/files/firmware");
4
5
  const device_utils_1 = require("@trezor/device-utils");
5
- const utils_1 = require("@trezor/utils");
6
- const isDeviceModel = (model) => (0, utils_1.isArrayMember)(model, Object.values(device_utils_1.DeviceModelInternal));
7
- exports.firmwareAssets = {
8
- [device_utils_1.DeviceModelInternal.UNKNOWN]: {},
9
- [device_utils_1.DeviceModelInternal.T1B1]: require('@trezor/connect-common/files/firmware/t1b1/releases.json'),
10
- [device_utils_1.DeviceModelInternal.T2T1]: require('@trezor/connect-common/files/firmware/t2t1/releases.json'),
11
- [device_utils_1.DeviceModelInternal.T2B1]: require('@trezor/connect-common/files/firmware/t2b1/releases.json'),
12
- [device_utils_1.DeviceModelInternal.T3B1]: require('@trezor/connect-common/files/firmware/t3b1/releases.json'),
13
- [device_utils_1.DeviceModelInternal.T3T1]: require('@trezor/connect-common/files/firmware/t3t1/releases.json'),
14
- [device_utils_1.DeviceModelInternal.T3W1]: require('@trezor/connect-common/files/firmware/t3w1/releases.json'),
6
+ const getReleasesAssetByDeviceModelAndFirmwareType = (deviceModel, firmwareType) => {
7
+ const firmwareTypeInFileName = firmwareType === device_utils_1.FirmwareType.BitcoinOnly ? 'bitcoinonly' : 'universal';
8
+ return firmware_1.firmwareAssets[deviceModel.toLowerCase()][firmwareTypeInFileName];
15
9
  };
10
+ exports.getReleasesAssetByDeviceModelAndFirmwareType = getReleasesAssetByDeviceModelAndFirmwareType;
11
+ const getReleaseAsset = (deviceModel, version, firmwareType) => {
12
+ const firmwareTypeInFileName = firmwareType === device_utils_1.FirmwareType.BitcoinOnly ? 'bitcoinonly' : 'universal';
13
+ const fileName = `${deviceModel.toLowerCase()}-${version.join('.')}-${firmwareTypeInFileName}`;
14
+ const deviceModelLower = deviceModel.toLowerCase();
15
+ const asset = firmware_1.firmwareAssets?.[deviceModelLower]?.[firmwareTypeInFileName]?.[fileName];
16
+ return asset;
17
+ };
18
+ exports.getReleaseAsset = getReleaseAsset;
16
19
  exports.firmwareReleaseConfigAssets = require('@trezor/connect-common/files/firmware/release/releases.v1.json');
17
20
  const tryLocalAssetRequire = (url) => {
18
21
  const fileUrl = url.split('?')[0];
@@ -24,13 +27,6 @@ const tryLocalAssetRequire = (url) => {
24
27
  case './data/messages/messages.json':
25
28
  return require('@trezor/protobuf/messages.json');
26
29
  }
27
- const firmwareMatch = fileUrl.match(/\/firmware\/(\w+)\/releases\.json$/);
28
- if (firmwareMatch) {
29
- const modelKey = firmwareMatch[1].toUpperCase();
30
- if (isDeviceModel(modelKey)) {
31
- return exports.firmwareAssets[modelKey];
32
- }
33
- }
34
30
  return null;
35
31
  };
36
32
  exports.tryLocalAssetRequire = tryLocalAssetRequire;
@@ -10,7 +10,6 @@ function httpRequest(url, type, options) {
10
10
  })
11
11
  .then(response => {
12
12
  if (!response.ok) {
13
- console.error('HTTP request failed', response);
14
13
  throw new Error(`HTTP request failed with status ${response.status} ${response.statusText}`);
15
14
  }
16
15
  if (type === 'binary') {
@@ -22,7 +21,6 @@ function httpRequest(url, type, options) {
22
21
  return response.text();
23
22
  })
24
23
  .catch(error => {
25
- console.error('HTTP request failed', error);
26
24
  throw error;
27
25
  });
28
26
  }
@@ -1,7 +1,10 @@
1
1
  import { FirmwareReleaseConfig } from '@trezor/device-utils';
2
- type FirmwareUpdateSource = 'production' | 'test-unsigned' | 'test-signed';
3
- export declare const RELEASES_URL_REMOTE_BASE = "https://data.trezor.io/suite/firmware";
4
- export declare const RELEASES_URL_REMOTE: Record<FirmwareUpdateSource, string>;
5
- export declare const getFirmwareReleaseConfig: () => Promise<FirmwareReleaseConfig>;
6
- export {};
2
+ export declare const getFirmwareReleaseConfig: () => Promise<{
3
+ config: any;
4
+ isRemote: boolean;
5
+ }>;
6
+ export declare const getOnlyLocalFirmwareReleaseConfig: () => {
7
+ config: FirmwareReleaseConfig;
8
+ isRemote: false;
9
+ };
7
10
  //# sourceMappingURL=firmwareReleaseConfigUtils.d.ts.map
@@ -1,83 +1,98 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getFirmwareReleaseConfig = exports.RELEASES_URL_REMOTE = exports.RELEASES_URL_REMOTE_BASE = void 0;
3
+ exports.getOnlyLocalFirmwareReleaseConfig = exports.getFirmwareReleaseConfig = void 0;
4
4
  const jws_1 = require("jws");
5
5
  const env_utils_1 = require("@trezor/env-utils");
6
6
  const assetUtils_1 = require("./assetUtils");
7
- const JWS_SIGN_ALGORITHM = 'ES256';
8
- const VERSION = 1;
9
- const JWS_RELEASES_FILENAME_REMOTE = `releases.v${VERSION}.jws`;
10
- exports.RELEASES_URL_REMOTE_BASE = 'https://data.trezor.io/suite/firmware';
11
- exports.RELEASES_URL_REMOTE = {
12
- production: `${exports.RELEASES_URL_REMOTE_BASE}/production/${JWS_RELEASES_FILENAME_REMOTE}`,
13
- 'test-unsigned': `${exports.RELEASES_URL_REMOTE_BASE}/unsigned/${JWS_RELEASES_FILENAME_REMOTE}`,
14
- 'test-signed': `${exports.RELEASES_URL_REMOTE_BASE}/signed/${JWS_RELEASES_FILENAME_REMOTE}`,
7
+ const firmwareInfo_1 = require("../data/firmwareInfo");
8
+ const JWS_CONFIG = {
9
+ SIGN_ALGORITHM: 'ES256',
10
+ VERSION: 1,
11
+ REMOTE_FILENAME: 'releases.v1.json',
12
+ REQUEST_TIMEOUT_MS: 5000,
15
13
  };
16
- const FORCE_LOCAL_JWS = true;
17
- const getReleaseJWS = async (firmwareUpdateSource = 'production') => {
18
- if (FORCE_LOCAL_JWS) {
19
- return {
20
- releasesJws: assetUtils_1.firmwareReleaseConfigAssets.jws,
21
- isRemote: false,
22
- };
23
- }
24
- const remoteReleasesUrl = exports.RELEASES_URL_REMOTE[firmwareUpdateSource];
14
+ const fetchRemoteJWS = async () => {
15
+ const { BASE_URL, MIDDLE_PATH, env } = (0, firmwareInfo_1.getOnlineFirmwareBaseUrl)();
16
+ const remoteReleasesUrl = new URL(BASE_URL);
17
+ remoteReleasesUrl.pathname = `${MIDDLE_PATH}/${env === 'production' ? 'config/' : ''}${JWS_CONFIG.REMOTE_FILENAME}`;
25
18
  try {
26
19
  const controller = new AbortController();
27
- const timeoutId = setTimeout(() => controller.abort(), 5000);
28
- const response = await fetch(remoteReleasesUrl, {
29
- signal: controller.signal,
30
- });
20
+ const timeoutId = setTimeout(() => controller.abort(), JWS_CONFIG.REQUEST_TIMEOUT_MS);
21
+ const response = await fetch(remoteReleasesUrl.toString(), { signal: controller.signal });
31
22
  clearTimeout(timeoutId);
32
23
  if (!response.ok) {
33
- throw new Error(response.statusText);
24
+ throw new Error(`Fetching error with status: ${response.status}`);
34
25
  }
35
- const releasesJws = await response.text();
36
- return {
37
- releasesJws,
38
- isRemote: true,
39
- };
26
+ const data = await response.json();
27
+ return { jws: data.jws, source: 'remote', env };
40
28
  }
41
29
  catch (error) {
42
- console.error(`Fetching of remote JWS config failed: ${error}`);
43
- return {
44
- releasesJws: assetUtils_1.firmwareReleaseConfigAssets.jws,
45
- isRemote: false,
46
- };
30
+ console.error(`Fetching remote firmware release failed: ${error}. Falling back to local config.`);
31
+ return { jws: assetUtils_1.firmwareReleaseConfigAssets.jws, source: 'local', env };
47
32
  }
48
33
  };
49
- const getFirmwareReleaseConfig = async () => {
50
- const { releasesJws, isRemote } = await getReleaseJWS();
51
- const decodedJws = (0, jws_1.decode)(releasesJws);
52
- if (!decodedJws) {
53
- throw new Error('Decoding of releases failed.');
54
- }
55
- if (isRemote) {
56
- const decodedJwsLocal = (0, jws_1.decode)(assetUtils_1.firmwareReleaseConfigAssets.jws);
57
- if (decodedJwsLocal && decodedJwsLocal.payload.sequence > decodedJws.payload.sequence) {
58
- throw new Error('Local firmware release config cannot have greater sequence than remote.');
59
- }
34
+ const decodeJwsPayload = (jws) => {
35
+ const decoded = (0, jws_1.decode)(jws);
36
+ if (!decoded || !decoded.payload) {
37
+ throw new Error('Failed to decode JWS or payload is missing.');
60
38
  }
61
- const algorithmInHeader = decodedJws?.header.alg;
62
- if (algorithmInHeader !== JWS_SIGN_ALGORITHM) {
63
- throw Error(`Wrong algorithm in JWS config header: ${algorithmInHeader}`);
39
+ return JSON.parse(decoded.payload);
40
+ };
41
+ const verifyJwsSignature = (jws, publicKey) => {
42
+ const decoded = (0, jws_1.decode)(jws);
43
+ if (decoded?.header.alg !== JWS_CONFIG.SIGN_ALGORITHM) {
44
+ throw new Error(`Invalid JWS algorithm: expected ${JWS_CONFIG.SIGN_ALGORITHM}, got ${decoded?.header.alg}`);
64
45
  }
65
- const JWSPublicKey = (0, env_utils_1.getJWSPublicKey)('firmware-release');
66
- if (!JWSPublicKey) {
67
- throw new Error('JWS public key is not defined!');
46
+ if (!(0, jws_1.verify)(jws, JWS_CONFIG.SIGN_ALGORITHM, publicKey)) {
47
+ throw new Error('JWS signature is invalid.');
68
48
  }
69
- try {
70
- const isAuthenticityValid = (0, jws_1.verify)(releasesJws, JWS_SIGN_ALGORITHM, JWSPublicKey);
71
- if (!isAuthenticityValid) {
72
- throw new Error('Config authenticity is invalid');
49
+ };
50
+ const getFirmwareReleaseConfig = async () => {
51
+ const { jws: remoteJws, source: initialSource, env } = await fetchRemoteJWS();
52
+ let finalJws = remoteJws;
53
+ let finalSource = initialSource;
54
+ let config;
55
+ if (initialSource === 'remote') {
56
+ try {
57
+ const remotePayload = decodeJwsPayload(remoteJws);
58
+ const localPayload = decodeJwsPayload(assetUtils_1.firmwareReleaseConfigAssets.jws);
59
+ if (localPayload.version !== JWS_CONFIG.VERSION) {
60
+ throw new Error(`Local config has mismatched version: ${localPayload.version}`);
61
+ }
62
+ if (localPayload.sequence >= remotePayload.sequence) {
63
+ finalJws = assetUtils_1.firmwareReleaseConfigAssets.jws;
64
+ finalSource = 'local';
65
+ config = localPayload;
66
+ }
67
+ else {
68
+ config = remotePayload;
69
+ }
70
+ }
71
+ catch (error) {
72
+ console.error(`Error comparing remote/local JWS: ${error}. Using remote as is.`);
73
73
  }
74
- const releases = JSON.parse(decodedJws.payload);
75
- return releases;
76
74
  }
77
- catch (error) {
78
- console.error('Error validating:', error);
79
- throw new Error(`Failed to validate release message: ${error.message}`);
75
+ const useProductionKey = ['test-signed', 'production'].includes(env) || finalSource === 'local';
76
+ const publicKey = (0, env_utils_1.getFirmwareReleaseJwsPublicKey)(useProductionKey);
77
+ verifyJwsSignature(finalJws, publicKey);
78
+ if (!config) {
79
+ config = decodeJwsPayload(finalJws);
80
80
  }
81
+ return {
82
+ config,
83
+ isRemote: finalSource === 'remote',
84
+ };
81
85
  };
82
86
  exports.getFirmwareReleaseConfig = getFirmwareReleaseConfig;
87
+ const getOnlyLocalFirmwareReleaseConfig = () => {
88
+ const localJws = assetUtils_1.firmwareReleaseConfigAssets.jws;
89
+ const publicKey = (0, env_utils_1.getFirmwareReleaseJwsPublicKey)(true);
90
+ verifyJwsSignature(localJws, publicKey);
91
+ const config = decodeJwsPayload(localJws);
92
+ return {
93
+ config,
94
+ isRemote: false,
95
+ };
96
+ };
97
+ exports.getOnlyLocalFirmwareReleaseConfig = getOnlyLocalFirmwareReleaseConfig;
83
98
  //# sourceMappingURL=firmwareReleaseConfigUtils.js.map
@@ -1,8 +1,12 @@
1
1
  import type { DeviceModelInternal, FirmwareRelease } from '@trezor/device-utils';
2
+ import { CurrentVersion } from '../data/firmwareInfo';
2
3
  import { Features, FirmwareType, StrictFeatures, VersionArray } from '../types';
3
4
  export declare const isStrictFeatures: (extFeatures: Features) => extFeatures is StrictFeatures;
4
- export declare const isValidReleases: (extReleases: any) => extReleases is FirmwareRelease[];
5
- export declare const filterSafeListByBootloader: (releasesList: FirmwareRelease[], bootloaderVersion: VersionArray) => FirmwareRelease[];
6
- export declare const filterSafeListByFirmware: (releasesList: FirmwareRelease[], firmwareVersion: VersionArray) => FirmwareRelease[];
7
- export declare const buildFirmwareFileName: (firmwareType: FirmwareType, internalModel: DeviceModelInternal, version: VersionArray) => string;
5
+ type VersionCheckProperty = 'min_firmware_version' | 'min_bootloader_version';
6
+ export declare const findBestCompatibleRelease: (releasesOfDevice: Record<string, FirmwareRelease>, currentVesion: CurrentVersion, checkProperty: VersionCheckProperty) => FirmwareRelease | undefined;
7
+ export declare const buildLocalFirmwareFileName: (firmwareType: FirmwareType, deviceModel: DeviceModelInternal, version: VersionArray) => string;
8
+ export declare const buildIntermediaryFirmwareFileName: (internalModel: DeviceModelInternal, version: number) => string;
9
+ export declare const getFirmwareMode: (features: Features) => "normal" | "bootloader" | "initialize" | "seedless";
10
+ export declare const getFirmwareType: (features: Features) => FirmwareType;
11
+ export {};
8
12
  //# sourceMappingURL=firmwareUtils.d.ts.map
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildFirmwareFileName = exports.filterSafeListByFirmware = exports.filterSafeListByBootloader = exports.isValidReleases = exports.isStrictFeatures = void 0;
3
+ exports.getFirmwareType = exports.getFirmwareMode = exports.buildIntermediaryFirmwareFileName = exports.buildLocalFirmwareFileName = exports.findBestCompatibleRelease = exports.isStrictFeatures = void 0;
4
4
  const utils_1 = require("@trezor/utils");
5
5
  const types_1 = require("../types");
6
6
  const isStrictFeatures = (extFeatures) => [1, 2].includes(extFeatures.major_version) &&
@@ -8,26 +8,68 @@ const isStrictFeatures = (extFeatures) => [1, 2].includes(extFeatures.major_vers
8
8
  extFeatures.bootloader_mode == null ||
9
9
  extFeatures.bootloader_mode === true);
10
10
  exports.isStrictFeatures = isStrictFeatures;
11
- const isValidReleases = (extReleases) => Array.isArray(extReleases) &&
12
- extReleases.every(release => release.version && release.min_firmware_version && release.min_bootloader_version);
13
- exports.isValidReleases = isValidReleases;
14
- const filterSafeListByBootloader = (releasesList, bootloaderVersion) => {
15
- const bootloaderVersions = releasesList.flatMap(item => item.bootloader_version ? [item.bootloader_version] : []);
16
- const compatibleRelease = bootloaderVersions.find(item => utils_1.versionUtils.isNewerOrEqual(item, bootloaderVersion));
17
- if (bootloaderVersions.length > 0 && !compatibleRelease) {
18
- return [];
19
- }
20
- return releasesList.filter(item => (!item.min_bootloader_version ||
21
- utils_1.versionUtils.isNewerOrEqual(bootloaderVersion, item.min_bootloader_version)) &&
22
- (!item.bootloader_version ||
23
- utils_1.versionUtils.isNewerOrEqual(item.bootloader_version, bootloaderVersion)));
11
+ const findBestCompatibleRelease = (releasesOfDevice, currentVesion, checkProperty) => {
12
+ if (!releasesOfDevice || Object.keys(releasesOfDevice).length === 0) {
13
+ return;
14
+ }
15
+ const availableFirmwares = Object.values(releasesOfDevice);
16
+ const currentFirmwareVersion = currentVesion.firmwareVersion;
17
+ const currentBootloaderVersion = currentVesion.bootloaderVersion;
18
+ let versionToCompare = currentFirmwareVersion;
19
+ if (checkProperty === 'min_bootloader_version' && currentBootloaderVersion) {
20
+ versionToCompare = currentBootloaderVersion;
21
+ }
22
+ else if (checkProperty === 'min_bootloader_version' && currentFirmwareVersion) {
23
+ const currentRelease = availableFirmwares.find(fw => utils_1.versionUtils.isEqual(currentFirmwareVersion, fw.version));
24
+ if (!currentRelease?.bootloader_version) {
25
+ return;
26
+ }
27
+ }
28
+ if (!versionToCompare) {
29
+ return;
30
+ }
31
+ const sortedFirmwares = availableFirmwares.sort((a, b) => utils_1.versionUtils.isNewer(b.version, a.version) ? 1 : -1);
32
+ const compatibleFirmware = sortedFirmwares.find(fw => utils_1.versionUtils.isNewerOrEqual(versionToCompare, fw[checkProperty]));
33
+ return compatibleFirmware;
24
34
  };
25
- exports.filterSafeListByBootloader = filterSafeListByBootloader;
26
- const filterSafeListByFirmware = (releasesList, firmwareVersion) => releasesList.filter(item => utils_1.versionUtils.isNewerOrEqual(firmwareVersion, item.min_firmware_version));
27
- exports.filterSafeListByFirmware = filterSafeListByFirmware;
28
- const buildFirmwareFileName = (firmwareType, internalModel, version) => {
35
+ exports.findBestCompatibleRelease = findBestCompatibleRelease;
36
+ const buildLocalFirmwareFileName = (firmwareType, deviceModel, version) => {
29
37
  const firmwareTypeFileString = firmwareType === types_1.FirmwareType.BitcoinOnly ? '-bitcoinonly' : '';
30
- return `trezor-${internalModel.toLocaleLowerCase()}-${version.join('.')}${firmwareTypeFileString}.bin`;
38
+ return `trezor-${deviceModel.toLowerCase()}-${version.join('.')}${firmwareTypeFileString}.bin`;
39
+ };
40
+ exports.buildLocalFirmwareFileName = buildLocalFirmwareFileName;
41
+ const buildIntermediaryFirmwareFileName = (internalModel, version) => `trezor-${internalModel.toLowerCase()}-inter-v${version}.bin`;
42
+ exports.buildIntermediaryFirmwareFileName = buildIntermediaryFirmwareFileName;
43
+ const getFirmwareMode = (features) => {
44
+ if (features.bootloader_mode)
45
+ return 'bootloader';
46
+ if (!features.initialized)
47
+ return 'initialize';
48
+ if (features.no_backup)
49
+ return 'seedless';
50
+ return 'normal';
51
+ };
52
+ exports.getFirmwareMode = getFirmwareMode;
53
+ const getFirmwareType = (features) => {
54
+ let type = types_1.FirmwareType.Universal;
55
+ if (features.fw_vendor === 'Trezor Bitcoin-only') {
56
+ type = types_1.FirmwareType.BitcoinOnly;
57
+ }
58
+ else if (features.fw_vendor === 'Trezor') {
59
+ type = types_1.FirmwareType.Universal;
60
+ }
61
+ else if ((0, exports.getFirmwareMode)(features) !== 'bootloader') {
62
+ type =
63
+ features.capabilities &&
64
+ features.capabilities.length > 0 &&
65
+ !features.capabilities.includes('Capability_Bitcoin_like')
66
+ ? types_1.FirmwareType.BitcoinOnly
67
+ : types_1.FirmwareType.Universal;
68
+ }
69
+ else if ((0, exports.getFirmwareMode)(features) === 'bootloader' && features.unit_btconly) {
70
+ type = types_1.FirmwareType.BitcoinOnly;
71
+ }
72
+ return type;
31
73
  };
32
- exports.buildFirmwareFileName = buildFirmwareFileName;
74
+ exports.getFirmwareType = getFirmwareType;
33
75
  //# sourceMappingURL=firmwareUtils.js.map
@@ -5,6 +5,7 @@ export declare const btckb2satoshib: (n: string) => string;
5
5
  export declare const hasHexPrefix: (str: string) => boolean;
6
6
  export declare const stripHexPrefix: (str: string) => string;
7
7
  export declare const addHexPrefix: (str: string) => `0x${string}`;
8
+ export declare const isHexString: (value: string, length?: number) => boolean;
8
9
  export declare const messageToHex: (message: string) => string;
9
10
  export declare const hexToText: (hex: string) => string;
10
11
  export declare const deepTransform: <V>(transform: (str: string) => V) => <T>(value: T) => DeepTransformed<T, V>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.deepTransform = exports.hexToText = exports.messageToHex = exports.addHexPrefix = exports.stripHexPrefix = exports.hasHexPrefix = exports.btckb2satoshib = exports.formatTime = exports.formatAmount = void 0;
3
+ exports.deepTransform = exports.hexToText = exports.messageToHex = exports.isHexString = exports.addHexPrefix = exports.stripHexPrefix = exports.hasHexPrefix = exports.btckb2satoshib = exports.formatTime = exports.formatAmount = void 0;
4
4
  const bigNumber_1 = require("@trezor/utils/lib/bigNumber");
5
5
  const formatAmount = (n, coinInfo) => `${new bigNumber_1.BigNumber(n).div(10 ** coinInfo.decimals).toString(10)} ${coinInfo.shortcut}`;
6
6
  exports.formatAmount = formatAmount;
@@ -40,9 +40,10 @@ const isHexString = (value, length) => {
40
40
  }
41
41
  return true;
42
42
  };
43
+ exports.isHexString = isHexString;
43
44
  const messageToHex = (message) => {
44
45
  let buffer;
45
- if (isHexString(message)) {
46
+ if ((0, exports.isHexString)(message)) {
46
47
  let clean = (0, exports.stripHexPrefix)(message);
47
48
  if (clean.length % 2 !== 0) {
48
49
  clean = `0${clean}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trezor/connect",
3
- "version": "9.6.2",
3
+ "version": "9.6.3-beta.1",
4
4
  "author": "Trezor <info@trezor.io>",
5
5
  "homepage": "https://github.com/trezor/trezor-suite/tree/develop/packages/connect",
6
6
  "description": "High-level javascript interface for Trezor hardware wallet.",
@@ -78,25 +78,26 @@
78
78
  "@solana-program/system": "^0.7.0",
79
79
  "@solana-program/token": "^0.5.1",
80
80
  "@solana-program/token-2022": "^0.4.2",
81
- "@solana/kit": "^2.1.1",
82
- "@trezor/blockchain-link": "2.5.2",
83
- "@trezor/blockchain-link-types": "1.4.2",
84
- "@trezor/blockchain-link-utils": "1.4.2",
81
+ "@solana/kit": "^2.3.0",
82
+ "@trezor/blockchain-link": "2.5.3-beta.1",
83
+ "@trezor/blockchain-link-types": "1.4.3-beta.1",
84
+ "@trezor/blockchain-link-utils": "1.4.3-beta.1",
85
85
  "@trezor/connect-analytics": "1.3.5",
86
- "@trezor/connect-common": "0.4.2",
86
+ "@trezor/connect-common": "0.4.3-beta.1",
87
87
  "@trezor/crypto-utils": "1.1.4",
88
- "@trezor/device-utils": "1.1.2",
89
- "@trezor/env-utils": "^1.4.2",
90
- "@trezor/protobuf": "1.4.2",
91
- "@trezor/protocol": "1.2.8",
88
+ "@trezor/device-utils": "1.1.3-beta.1",
89
+ "@trezor/env-utils": "^1.4.3-beta.1",
90
+ "@trezor/protobuf": "1.4.3-beta.1",
91
+ "@trezor/protocol": "1.2.9-beta.1",
92
92
  "@trezor/schema-utils": "1.3.4",
93
- "@trezor/transport": "1.5.2",
94
- "@trezor/type-utils": "1.1.8",
95
- "@trezor/utils": "9.4.2",
96
- "@trezor/utxo-lib": "2.4.2",
93
+ "@trezor/transport": "1.5.3-beta.1",
94
+ "@trezor/type-utils": "1.1.9-beta.1",
95
+ "@trezor/utils": "9.4.3-beta.1",
96
+ "@trezor/utxo-lib": "2.4.3-beta.1",
97
97
  "blakejs": "^1.2.1",
98
98
  "bs58": "^6.0.0",
99
99
  "bs58check": "^4.0.0",
100
+ "cbor": "^10.0.10",
100
101
  "cross-fetch": "^4.0.0",
101
102
  "jws": "^4.0.0"
102
103
  },
@@ -120,7 +121,7 @@
120
121
  "ts-node": "^10.9.2",
121
122
  "tsx": "^4.20.3",
122
123
  "web3-utils": "^4.3.2",
123
- "webpack": "5.99.9",
124
+ "webpack": "5.100.0",
124
125
  "ws": "^8.18.0"
125
126
  },
126
127
  "peerDependencies": {
@@ -1,12 +0,0 @@
1
- import { VersionArray } from '@trezor/device-utils';
2
- import { GetInfoProps } from '../../data/firmwareInfo';
3
- import { IntermediaryVersion } from '../../types';
4
- interface GetBinaryForFirmwareUpgradeProps extends GetInfoProps {
5
- baseUrl: string;
6
- btcOnly?: boolean;
7
- version?: VersionArray;
8
- intermediaryVersion?: IntermediaryVersion;
9
- }
10
- export declare const getBinaryForFirmwareUpgrade: ({ releases, baseUrl, version, btcOnly, intermediaryVersion, features, }: GetBinaryForFirmwareUpgradeProps) => Promise<ArrayBuffer | Buffer<ArrayBufferLike>>;
11
- export {};
12
- //# sourceMappingURL=getBinaryForFirmwareUpgrade.d.ts.map
@@ -1,32 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getBinaryForFirmwareUpgrade = void 0;
4
- const utils_1 = require("@trezor/utils");
5
- const getBinary_1 = require("./getBinary");
6
- const firmwareInfo_1 = require("../../data/firmwareInfo");
7
- const assets_1 = require("../../utils/assets");
8
- const firmwareUtils_1 = require("../../utils/firmwareUtils");
9
- const getBinaryForFirmwareUpgrade = ({ releases, baseUrl, version, btcOnly, intermediaryVersion, features, }) => {
10
- if (!(0, firmwareUtils_1.isStrictFeatures)(features)) {
11
- throw new Error('Features of unexpected shape provided');
12
- }
13
- if (intermediaryVersion) {
14
- return (0, assets_1.httpRequest)(`${baseUrl}/firmware/t1b1/trezor-t1b1-inter-v${intermediaryVersion}.bin`, 'binary');
15
- }
16
- const infoByBootloader = (0, firmwareInfo_1.getInfo)({ features, releases });
17
- const releaseByFirmware = releases.find(r => version &&
18
- utils_1.versionUtils.isVersionArray(version) &&
19
- utils_1.versionUtils.isEqual(r.version, version));
20
- if (!infoByBootloader || !releaseByFirmware) {
21
- throw new Error('no firmware found for this device');
22
- }
23
- if (btcOnly && !releaseByFirmware.url_bitcoinonly) {
24
- throw new Error(`firmware version ${version} does not exist in btc only variant`);
25
- }
26
- if (!utils_1.versionUtils.isEqual(releaseByFirmware.version, infoByBootloader.release.version)) {
27
- throw new Error(`version provided as param (${releaseByFirmware.version}) does not match firmware version found by features in bootloader (${infoByBootloader.release.version})`);
28
- }
29
- return (0, getBinary_1.getBinary)({ release: releaseByFirmware, baseUrl, btcOnly });
30
- };
31
- exports.getBinaryForFirmwareUpgrade = getBinaryForFirmwareUpgrade;
32
- //# sourceMappingURL=getBinaryForFirmwareUpgrade.js.map
@@ -1,6 +0,0 @@
1
- export declare const getLanguage: ({ language, version, internal_model, }: {
2
- language: string;
3
- version: number[];
4
- internal_model: string;
5
- }) => Promise<ArrayBuffer | Buffer<ArrayBufferLike>>;
6
- //# sourceMappingURL=getLanguage.d.ts.map
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getLanguage = void 0;
4
- const assets_1 = require("../utils/assets");
5
- const getLanguage = ({ language, version, internal_model, }) => {
6
- const url = `https://data.trezor.io/firmware/translations/${internal_model.toLowerCase()}/translation-${internal_model.toUpperCase()}-${language}-${version.join('.')}.bin`;
7
- return (0, assets_1.httpRequest)(url, 'binary');
8
- };
9
- exports.getLanguage = getLanguage;
10
- //# sourceMappingURL=getLanguage.js.map