@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,170 +1,408 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getRelease = exports.getReleaseInfo = exports.getFirmwareStatus = exports.getInfo = exports.getOnlineReleases = exports.getReleases = exports.parseFirmwareReleases = void 0;
3
+ exports.getFirmwareLocation = exports.getFirmwareStatus = exports.getFirmwareReleaseConfigInfo = exports.getReleaseInfo = exports.getLanguage = exports.initializeFirmwareConfig = exports.createRemoteFirmwareConfig = exports.createLocalFirmwareConfig = exports.getReleaseByVersion = exports.getReleaseConfig = exports.getOnlineReleaseByVersion = exports.getBundledRelease = exports.getOnlineFirmwareBaseUrl = void 0;
4
4
  const device_utils_1 = require("@trezor/device-utils");
5
5
  const utils_1 = require("@trezor/utils");
6
+ const types_1 = require("../types");
7
+ const DataManager_1 = require("./DataManager");
8
+ const assetUtils_1 = require("../utils/assetUtils");
6
9
  const assets_1 = require("../utils/assets");
7
10
  const firmwareUtils_1 = require("../utils/firmwareUtils");
8
- const releases = Object.values(device_utils_1.DeviceModelInternal).reduce((acc, key) => ({ ...acc, [key]: [] }), {});
9
- const bundledReleases = {};
10
- const parseFirmwareReleases = (modelReleases, deviceModel) => {
11
- const [latestRelease] = modelReleases;
12
- bundledReleases[deviceModel] = latestRelease;
13
- modelReleases.forEach(release => {
14
- releases[deviceModel]?.push({
15
- ...release,
16
- });
17
- });
11
+ const RELEASES_URL_REMOTE_BASE = {
12
+ BASE_URL: 'https://data.trezor.io',
13
+ MIDDLE_PATH: 'firmware',
14
+ };
15
+ const UNSIGNED_URL_REMOTE_BASE = {
16
+ BASE_URL: 'https://data.trezor.io',
17
+ MIDDLE_PATH: 'dev/firmware/releases/unsigned',
18
+ };
19
+ const SIGNED_URL_REMOTE_BASE = {
20
+ BASE_URL: 'https://suite.corp.sldev.cz',
21
+ MIDDLE_PATH: 'firmware/signed',
22
+ };
23
+ const SIGNED_LOCALHOST = {
24
+ BASE_URL: 'http://localhost:3000',
25
+ MIDDLE_PATH: 'firmware/signed',
26
+ };
27
+ const UNSIGNED_LOCALHOST = {
28
+ BASE_URL: 'http://localhost:3000',
29
+ MIDDLE_PATH: 'firmware/unsigned',
30
+ };
31
+ const FIRMWARE_REMOTE_BASE_URLS = {
32
+ production: RELEASES_URL_REMOTE_BASE,
33
+ 'test-unsigned': UNSIGNED_URL_REMOTE_BASE,
34
+ 'test-signed': SIGNED_URL_REMOTE_BASE,
35
+ 'localhost-unsigned': UNSIGNED_LOCALHOST,
36
+ 'localhost-signed': SIGNED_LOCALHOST,
18
37
  };
19
- exports.parseFirmwareReleases = parseFirmwareReleases;
20
- const getReleases = (deviceModel) => releases[deviceModel] || [];
21
- exports.getReleases = getReleases;
22
- const getOnlineReleases = async (internalModel) => {
23
- const url = `https://data.trezor.io/firmware/${internalModel.toLowerCase()}/releases.json`;
38
+ const getOnlineFirmwareBaseUrl = () => {
39
+ const firmwareUpdateSource = DataManager_1.DataManager.getSettings('firmwareUpdateSource');
40
+ if (!firmwareUpdateSource) {
41
+ return {
42
+ ...FIRMWARE_REMOTE_BASE_URLS['production'],
43
+ env: 'production',
44
+ };
45
+ }
46
+ return {
47
+ ...FIRMWARE_REMOTE_BASE_URLS[firmwareUpdateSource],
48
+ env: firmwareUpdateSource,
49
+ };
50
+ };
51
+ exports.getOnlineFirmwareBaseUrl = getOnlineFirmwareBaseUrl;
52
+ const getBundledFirmwareVersion = (deviceModel, firmwareType) => {
53
+ const localFirmwareReleaseConfig = DataManager_1.DataManager.getLocalFirmwareReleaseConfig();
54
+ const modelReleases = localFirmwareReleaseConfig.releases[deviceModel];
55
+ const bundledRelease = modelReleases?.[firmwareType];
56
+ if (!bundledRelease) {
57
+ return;
58
+ }
59
+ const bundledVersion = bundledRelease.releasePath.match(/(\d+\.\d+\.\d+)/);
60
+ if (!bundledVersion) {
61
+ throw new Error('Fimrware bundled version was not found.');
62
+ }
63
+ return bundledVersion[0];
64
+ };
65
+ const getBundledRelease = (deviceModel, firmwareType) => {
66
+ const version = getBundledFirmwareVersion(deviceModel, firmwareType);
67
+ if (!version) {
68
+ return;
69
+ }
70
+ const versionArray = utils_1.versionUtils.tryParse(version);
71
+ if (!versionArray) {
72
+ throw new Error('There was error parsing bundled release.');
73
+ }
74
+ return (0, assetUtils_1.getReleaseAsset)(deviceModel, versionArray, firmwareType);
75
+ };
76
+ exports.getBundledRelease = getBundledRelease;
77
+ const getOnlineReleaseByPath = async (releasePath) => {
78
+ const onlineFirmwareBaseUrl = (0, exports.getOnlineFirmwareBaseUrl)();
79
+ const url = `${onlineFirmwareBaseUrl.BASE_URL}/${releasePath}`;
24
80
  const response = await (0, assets_1.httpRequest)(url, 'json', {
25
81
  signal: AbortSignal.timeout(10000),
26
82
  skipLocalForceDownload: true,
27
83
  });
28
- if ((0, firmwareUtils_1.isValidReleases)(response)) {
29
- return response;
84
+ return response;
85
+ };
86
+ const getOnlineReleaseByVersion = async (deviceModel, firmwareVersion, firmwareType) => {
87
+ const onlineFirmwareBaseUrl = (0, exports.getOnlineFirmwareBaseUrl)();
88
+ const firmwareTypeFileString = firmwareType === types_1.FirmwareType.BitcoinOnly ? 'bitcoinonly' : 'universal';
89
+ const relaseJsonFilename = `${deviceModel.toLowerCase()}-${firmwareVersion.join('.')}-${firmwareTypeFileString}.json`;
90
+ const origin = `${onlineFirmwareBaseUrl.MIDDLE_PATH}/${deviceModel.toLowerCase()}/${firmwareTypeFileString}`;
91
+ const releasePath = `${origin}/${relaseJsonFilename}`;
92
+ const onlineRelease = await getOnlineReleaseByPath(releasePath);
93
+ if (!onlineRelease || !utils_1.versionUtils.isEqual(onlineRelease.version, firmwareVersion)) {
94
+ return;
30
95
  }
31
- return [];
96
+ return onlineRelease;
32
97
  };
33
- exports.getOnlineReleases = getOnlineReleases;
34
- const getChangelog = (releases2, features) => {
35
- if (features.bootloader_mode) {
36
- if (features.firmware_present && features.major_version === 1) {
98
+ exports.getOnlineReleaseByVersion = getOnlineReleaseByVersion;
99
+ const getReleaseConfig = (features, firmwareType) => {
100
+ const { internal_model } = features;
101
+ if (internal_model === device_utils_1.DeviceModelInternal.UNKNOWN) {
102
+ return undefined;
103
+ }
104
+ const firmwareReleaseConfig = DataManager_1.DataManager.getFirmwareReleaseConfig();
105
+ if (!firmwareReleaseConfig) {
106
+ throw new Error('Firmware release config not loaded.');
107
+ }
108
+ const deviceMessageRelease = firmwareReleaseConfig[internal_model];
109
+ if (!deviceMessageRelease) {
110
+ return;
111
+ }
112
+ return deviceMessageRelease[firmwareType];
113
+ };
114
+ exports.getReleaseConfig = getReleaseConfig;
115
+ const getReleaseByVersion = async (features, firmwareVersion, firmwareType) => {
116
+ const deviceModel = features.internal_model;
117
+ const tryGetRelease = async (getter) => {
118
+ try {
119
+ return await getter();
120
+ }
121
+ catch {
122
+ return;
123
+ }
124
+ };
125
+ const releaseFromConfig = (0, exports.getReleaseConfig)(features, firmwareType)?.release;
126
+ if (releaseFromConfig && utils_1.versionUtils.isEqual(firmwareVersion, releaseFromConfig.version)) {
127
+ return releaseFromConfig;
128
+ }
129
+ const release = (await tryGetRelease(() => (0, assetUtils_1.getReleaseAsset)(deviceModel, firmwareVersion, firmwareType))) ||
130
+ (await tryGetRelease(() => (0, exports.getOnlineReleaseByVersion)(deviceModel, firmwareVersion, firmwareType)));
131
+ if (release && utils_1.versionUtils.isEqual(release.version, firmwareVersion)) {
132
+ return release;
133
+ }
134
+ return;
135
+ };
136
+ exports.getReleaseByVersion = getReleaseByVersion;
137
+ const createLocalFirmwareConfig = (baseConfig) => {
138
+ const releaseEntries = Object.entries(baseConfig.releases)
139
+ .map(([deviceModel, modelReleases]) => {
140
+ const modelKey = deviceModel;
141
+ if (modelKey === device_utils_1.DeviceModelInternal.UNKNOWN)
37
142
  return null;
143
+ const { 'bitcoin-only': bitcoinOnlyConfig, universal: universalConfig } = modelReleases ?? {};
144
+ if (!bitcoinOnlyConfig?.releasePath || !universalConfig?.releasePath)
145
+ return null;
146
+ const btcOnlyRelease = (0, exports.getBundledRelease)(modelKey, types_1.FirmwareType.BitcoinOnly);
147
+ const universalRelease = (0, exports.getBundledRelease)(modelKey, types_1.FirmwareType.Universal);
148
+ if (!btcOnlyRelease || !universalRelease)
149
+ return null;
150
+ const releases = {
151
+ [types_1.FirmwareType.BitcoinOnly]: { ...bitcoinOnlyConfig, release: btcOnlyRelease },
152
+ [types_1.FirmwareType.Universal]: { ...universalConfig, release: universalRelease },
153
+ };
154
+ return [modelKey, releases];
155
+ })
156
+ .filter(entry => entry !== null);
157
+ return Object.fromEntries(releaseEntries);
158
+ };
159
+ exports.createLocalFirmwareConfig = createLocalFirmwareConfig;
160
+ const createRemoteFirmwareConfig = async (config) => {
161
+ const releaseEntryPromises = Object.entries(config.releases).map(async ([deviceModel, modelReleases]) => {
162
+ const modelKey = deviceModel;
163
+ if (modelKey === device_utils_1.DeviceModelInternal.UNKNOWN)
164
+ return null;
165
+ const { 'bitcoin-only': bitcoinOnlyConfig, universal: universalConfig } = modelReleases ?? {};
166
+ if (!bitcoinOnlyConfig?.releasePath || !universalConfig?.releasePath)
167
+ return null;
168
+ const [bitcoinOnlyRelease, universalRelease] = await Promise.all([
169
+ getOnlineReleaseByPath(bitcoinOnlyConfig.releasePath),
170
+ getOnlineReleaseByPath(universalConfig.releasePath),
171
+ ]);
172
+ if (!universalRelease || !bitcoinOnlyRelease)
173
+ return null;
174
+ const releases = {
175
+ [types_1.FirmwareType.BitcoinOnly]: {
176
+ ...bitcoinOnlyConfig,
177
+ release: bitcoinOnlyRelease,
178
+ },
179
+ [types_1.FirmwareType.Universal]: { ...universalConfig, release: universalRelease },
180
+ };
181
+ return [modelKey, releases];
182
+ });
183
+ const validEntries = (await Promise.all(releaseEntryPromises)).filter(entry => entry !== null);
184
+ return Object.fromEntries(validEntries);
185
+ };
186
+ exports.createRemoteFirmwareConfig = createRemoteFirmwareConfig;
187
+ const initializeFirmwareConfig = async (config, isRemote) => {
188
+ if (isRemote) {
189
+ try {
190
+ const remoteReleases = await (0, exports.createRemoteFirmwareConfig)(config);
191
+ return {
192
+ releases: remoteReleases,
193
+ intermediaries: config.intermediaries,
194
+ };
38
195
  }
39
- if (features.firmware_present && features.major_version === 2) {
40
- return releases2.filter(r => utils_1.versionUtils.isNewer(r.version, [
41
- features.fw_major,
42
- features.fw_minor,
43
- features.fw_patch,
44
- ]));
196
+ catch {
45
197
  }
46
- return releases2;
47
198
  }
48
- return releases2.filter(r => utils_1.versionUtils.isNewer(r.version, [
49
- features.major_version,
50
- features.minor_version,
51
- features.patch_version,
52
- ]));
199
+ const localFirmwareReleaseConfig = DataManager_1.DataManager.getLocalFirmwareReleaseConfig();
200
+ const localReleases = (0, exports.createLocalFirmwareConfig)(localFirmwareReleaseConfig);
201
+ return {
202
+ releases: localReleases,
203
+ intermediaries: localFirmwareReleaseConfig.intermediaries,
204
+ };
53
205
  };
54
- const isNewer = (release, features) => {
55
- if (features.major_version === 1 && features.bootloader_mode) {
56
- return null;
57
- }
58
- return utils_1.versionUtils.isNewer(release.version, [
59
- features.major_version,
60
- features.minor_version,
61
- features.patch_version,
62
- ]);
63
- };
64
- const isRequired = (changelog) => {
65
- if (!changelog || !changelog.length)
66
- return null;
67
- return changelog.some(item => item.required);
68
- };
69
- const isEqual = (release, latest) => utils_1.versionUtils.isEqual(release.version, latest.version);
70
- const getT1BootloaderVersion = (releases2, features) => {
71
- const { bootloader_mode, major_version, minor_version, patch_version } = features;
72
- const versionArray = [major_version, minor_version, patch_version];
73
- if (bootloader_mode) {
74
- return versionArray;
75
- }
76
- const release = releases2.find(({ version }) => utils_1.versionUtils.isEqual(version, versionArray));
77
- return release?.bootloader_version || [1, 0, 0];
78
- };
79
- const getIntermediaryVersion = (releases2, features, offerLatest) => {
80
- if (features.major_version !== 1 || offerLatest) {
81
- return;
206
+ exports.initializeFirmwareConfig = initializeFirmwareConfig;
207
+ const getLanguage = (languageBinPath) => {
208
+ const baseUrl = (0, exports.getOnlineFirmwareBaseUrl)();
209
+ const url = `${baseUrl.BASE_URL}/${languageBinPath}`;
210
+ return (0, assets_1.httpRequest)(url, 'binary');
211
+ };
212
+ exports.getLanguage = getLanguage;
213
+ const getCurrentVersion = (features) => {
214
+ if (!(0, firmwareUtils_1.isStrictFeatures)(features)) {
215
+ throw new Error('Features of unexpected shape provided.');
216
+ }
217
+ const { bootloader_mode, major_version, minor_version, patch_version, fw_major, fw_minor, fw_patch, } = features;
218
+ const fw_version = [fw_major, fw_minor, fw_patch];
219
+ const version = [major_version, minor_version, patch_version];
220
+ const bootloaderVersion = bootloader_mode ? version : null;
221
+ const fwVersion = bootloader_mode ? fw_version : version;
222
+ return {
223
+ bootloaderVersion,
224
+ firmwareVersion: fwVersion.includes(null) ? null : fwVersion,
225
+ };
226
+ };
227
+ const getIntermediaryMessageRelease = (features) => {
228
+ const config = DataManager_1.DataManager.getFirmwareIntermediaryReleaseConfig();
229
+ if (!config) {
230
+ throw new Error('Firmware release config not loaded.');
82
231
  }
83
- const bootloaderVersion = getT1BootloaderVersion(releases2, features);
84
- if (utils_1.versionUtils.isNewerOrEqual(bootloaderVersion, [1, 12, 0])) {
85
- return 3;
232
+ const deviceIntermediaryReleases = config[features.internal_model];
233
+ if (!deviceIntermediaryReleases || deviceIntermediaryReleases.length === 0) {
234
+ return;
86
235
  }
87
- if (utils_1.versionUtils.isNewerOrEqual(bootloaderVersion, [1, 8, 0])) {
88
- return 2;
236
+ const { bootloaderVersion, firmwareVersion } = getCurrentVersion(features);
237
+ const currentVersion = features.bootloader_mode ? bootloaderVersion : firmwareVersion;
238
+ const minVersionKey = features.bootloader_mode
239
+ ? 'min_bootloader_version'
240
+ : 'min_firmware_version';
241
+ if (!currentVersion) {
242
+ return undefined;
89
243
  }
90
- return 1;
244
+ return deviceIntermediaryReleases.find(release => utils_1.versionUtils.isNewer(release[minVersionKey], currentVersion));
91
245
  };
92
- const getSafeReleases = ({ features, releases }) => {
93
- const { bootloader_mode, major_version, minor_version, patch_version, fw_major, fw_minor, fw_patch, } = features;
94
- const firmwareVersion = [major_version, minor_version, patch_version];
95
- if (!utils_1.versionUtils.isVersionArray(firmwareVersion)) {
96
- return [];
97
- }
98
- if (major_version === 2 && bootloader_mode) {
99
- const fwVersion = [fw_major, fw_minor, fw_patch];
100
- if (utils_1.versionUtils.isVersionArray(fwVersion)) {
101
- return (0, firmwareUtils_1.filterSafeListByFirmware)(releases, fwVersion);
102
- }
103
- return (0, firmwareUtils_1.filterSafeListByBootloader)(releases, firmwareVersion);
246
+ const getIsBitcoinOnlyAvailable = (features) => {
247
+ const { internal_model } = features;
248
+ if (internal_model === device_utils_1.DeviceModelInternal.UNKNOWN) {
249
+ return false;
104
250
  }
105
- if (major_version === 1 && bootloader_mode) {
106
- return (0, firmwareUtils_1.filterSafeListByBootloader)(releases, firmwareVersion);
251
+ const firmwareReleaseConfig = DataManager_1.DataManager.getFirmwareReleaseConfig();
252
+ if (!firmwareReleaseConfig) {
253
+ throw new Error('Firmware release config not loaded.');
107
254
  }
108
- return (0, firmwareUtils_1.filterSafeListByFirmware)(releases, firmwareVersion);
255
+ const deviceMessageRelease = firmwareReleaseConfig[internal_model];
256
+ return !!deviceMessageRelease && !!deviceMessageRelease[types_1.FirmwareType.BitcoinOnly];
109
257
  };
110
- const getInfo = ({ features, releases }) => {
111
- if (!Array.isArray(releases) || releases.length < 1) {
112
- return null;
258
+ const isValidConditionalRelease = (release) => !!(release.version && release.min_firmware_version && release.min_bootloader_version);
259
+ const calculateShouldOfferRelease = (rolloutProbability, deviceId) => {
260
+ if (rolloutProbability < 0 || rolloutProbability > 100) {
261
+ throw new Error('Probability must be between 0 and 100.');
262
+ }
263
+ if (deviceId === null) {
264
+ return rolloutProbability > 0;
265
+ }
266
+ else {
267
+ const deterministicValueToCompare = (0, utils_1.getIntegerInRangeFromString)(deviceId, 101);
268
+ return deterministicValueToCompare < rolloutProbability;
113
269
  }
270
+ };
271
+ const getReleaseInfo = ({ features, release, conditions, intermediary, firmwareType, isBitcoinOnlyAvailable, }) => {
114
272
  if (!(0, firmwareUtils_1.isStrictFeatures)(features)) {
115
273
  throw new Error('Features of unexpected shape provided.');
116
274
  }
117
- if (!(0, firmwareUtils_1.isValidReleases)(releases)) {
275
+ if (!isValidConditionalRelease(release)) {
118
276
  throw new Error(`Release object in unexpected shape.`);
119
277
  }
120
- const latest = releases[0];
121
- const releasesSafe = getSafeReleases({ features, releases });
122
- if (!releasesSafe.length) {
123
- return null;
124
- }
125
- const releasesParsed = features.major_version === 1 ? releases : releasesSafe;
126
- const changelog = getChangelog(releasesParsed, features);
127
- const release = releasesParsed[0];
128
- const prevRelease = releasesParsed[1];
129
- const intermediaryVersion = getIntermediaryVersion(releases, features, isEqual(releasesSafe[0], latest));
130
- const isNewerResult = isNewer(latest, features);
278
+ const { min_firmware_version, min_bootloader_version, required } = release;
279
+ let isNewer = false;
280
+ let requiresIntermediary = false;
281
+ if (features.bootloader_mode && release.bootloader_version) {
282
+ const { bootloaderVersion, firmwareVersion } = getCurrentVersion(features);
283
+ if (utils_1.versionUtils.isVersionArray(firmwareVersion)) {
284
+ isNewer = utils_1.versionUtils.isNewer(release.version, firmwareVersion);
285
+ requiresIntermediary = utils_1.versionUtils.isNewer(min_firmware_version, firmwareVersion);
286
+ }
287
+ else if (utils_1.versionUtils.isVersionArray(bootloaderVersion)) {
288
+ isNewer = utils_1.versionUtils.isNewer(release.bootloader_version, bootloaderVersion);
289
+ requiresIntermediary = utils_1.versionUtils.isNewer(min_bootloader_version, bootloaderVersion);
290
+ }
291
+ else {
292
+ throw new Error('Version is not version array.');
293
+ }
294
+ }
295
+ else {
296
+ const { firmwareVersion } = getCurrentVersion(features);
297
+ if (!utils_1.versionUtils.isVersionArray(firmwareVersion)) {
298
+ throw new Error('Firmware version is not version array.');
299
+ }
300
+ isNewer = utils_1.versionUtils.isNewer(release.version, firmwareVersion);
301
+ requiresIntermediary = utils_1.versionUtils.isNewer(min_firmware_version, firmwareVersion);
302
+ }
303
+ const { rollout_probability } = conditions;
304
+ const shouldBeOffered = calculateShouldOfferRelease(rollout_probability, features.device_id);
305
+ if (requiresIntermediary && intermediary) {
306
+ isNewer = true;
307
+ }
131
308
  return {
132
- changelog,
309
+ firmwareType,
310
+ isBitcoinOnlyAvailable,
311
+ releaseConditions: {
312
+ ...conditions,
313
+ shouldBeOffered,
314
+ },
133
315
  release,
134
- isRequired: isRequired(changelog),
135
- isNewer: isNewerResult,
136
- intermediaryVersion,
137
- translations: isNewerResult ? prevRelease?.translations : release?.translations,
316
+ intermediary: requiresIntermediary ? intermediary : undefined,
317
+ isRequired: required,
318
+ isNewer,
319
+ translations: release.translations,
138
320
  };
139
321
  };
140
- exports.getInfo = getInfo;
141
- const getFirmwareStatus = (features) => {
322
+ exports.getReleaseInfo = getReleaseInfo;
323
+ const getFirmwareReleaseConfigInfo = (features, firmwareType) => {
324
+ const deviceMessageRelease = (0, exports.getReleaseConfig)(features, firmwareType);
325
+ if (!deviceMessageRelease?.release) {
326
+ return;
327
+ }
328
+ const { release, conditions, firmware_type } = deviceMessageRelease;
329
+ const currentVersion = getCurrentVersion(features);
330
+ const inBootloaderMode = features.bootloader_mode && !!currentVersion.bootloaderVersion;
331
+ const versionContext = inBootloaderMode
332
+ ? {
333
+ version: currentVersion.bootloaderVersion,
334
+ minVersionKey: 'min_bootloader_version',
335
+ }
336
+ : {
337
+ version: currentVersion.firmwareVersion,
338
+ minVersionKey: 'min_firmware_version',
339
+ };
340
+ const isCompatible = versionContext.version &&
341
+ utils_1.versionUtils.isNewerOrEqual(versionContext.version, release[versionContext.minVersionKey]);
342
+ let suitableRelease = release;
343
+ if (!isCompatible) {
344
+ const alternativeRelease = (0, firmwareUtils_1.findBestCompatibleRelease)((0, assetUtils_1.getReleasesAssetByDeviceModelAndFirmwareType)(features.internal_model, firmwareType), currentVersion, versionContext.minVersionKey);
345
+ if (alternativeRelease) {
346
+ suitableRelease = alternativeRelease;
347
+ }
348
+ }
349
+ const intermediary = getIntermediaryMessageRelease(features);
350
+ const finalTargetRelease = intermediary ? release : suitableRelease;
351
+ return (0, exports.getReleaseInfo)({
352
+ isBitcoinOnlyAvailable: getIsBitcoinOnlyAvailable(features),
353
+ features,
354
+ release: finalTargetRelease,
355
+ conditions,
356
+ intermediary,
357
+ firmwareType: firmware_type,
358
+ });
359
+ };
360
+ exports.getFirmwareReleaseConfigInfo = getFirmwareReleaseConfigInfo;
361
+ const getFirmwareStatus = (features, firmwareType) => {
142
362
  if (features.firmware_present === false) {
143
363
  return 'none';
144
364
  }
145
365
  if (features.major_version === 1 && features.bootloader_mode) {
146
366
  return 'unknown';
147
367
  }
148
- const info = (0, exports.getInfo)({
149
- features,
150
- releases: (0, exports.getReleases)(features?.internal_model),
151
- });
152
- if (!info)
368
+ const releaseInfo = (0, exports.getFirmwareReleaseConfigInfo)(features, firmwareType);
369
+ if (!releaseInfo)
153
370
  return 'custom';
154
- if (info.isRequired)
371
+ if (releaseInfo.isRequired)
155
372
  return 'required';
156
- if (info.isNewer)
373
+ if (releaseInfo.isNewer)
157
374
  return 'outdated';
158
375
  return 'valid';
159
376
  };
160
377
  exports.getFirmwareStatus = getFirmwareStatus;
161
- const getReleaseInfo = (features) => (0, exports.getInfo)({
162
- features,
163
- releases: (0, exports.getReleases)(features?.internal_model),
164
- });
165
- exports.getReleaseInfo = getReleaseInfo;
166
- const getRelease = (internalModel, firmwareVersion) => (0, exports.getReleases)(internalModel).find(r => firmwareVersion &&
167
- utils_1.versionUtils.isVersionArray(firmwareVersion) &&
168
- utils_1.versionUtils.isEqual(r.version, firmwareVersion));
169
- exports.getRelease = getRelease;
378
+ const getFirmwareLocation = ({ firmwareVersion, remotePath, deviceModel, firmwareType, intermediaryVersion, }) => {
379
+ const firmwareName = intermediaryVersion
380
+ ? (0, firmwareUtils_1.buildIntermediaryFirmwareFileName)(deviceModel, intermediaryVersion)
381
+ : (0, firmwareUtils_1.buildLocalFirmwareFileName)(firmwareType, deviceModel, firmwareVersion);
382
+ const versionString = firmwareVersion.join('.');
383
+ const bundledBaseUrl = (0, utils_1.removeTrailingSlashes)(DataManager_1.DataManager.getSettings('binFilesBaseUrl'));
384
+ const isRealBundled = !bundledBaseUrl.includes('data.trezor.io');
385
+ const bundledVersion = getBundledFirmwareVersion(deviceModel, firmwareType);
386
+ const isIntermediary = bundledBaseUrl && intermediaryVersion;
387
+ const isMatchingBundledVersion = bundledBaseUrl && isRealBundled && bundledVersion === versionString;
388
+ if (isIntermediary || isMatchingBundledVersion) {
389
+ return {
390
+ baseUrl: bundledBaseUrl,
391
+ path: `firmware/${deviceModel.toLowerCase()}/${firmwareName}`,
392
+ };
393
+ }
394
+ const { firmwareDir, firmwareList } = DataManager_1.DataManager.getLocalFirmwares();
395
+ if (firmwareList.includes(firmwareName)) {
396
+ return {
397
+ baseUrl: firmwareDir,
398
+ path: firmwareName,
399
+ };
400
+ }
401
+ const onlineBaseUrl = (0, exports.getOnlineFirmwareBaseUrl)();
402
+ return {
403
+ baseUrl: onlineBaseUrl.BASE_URL,
404
+ path: remotePath,
405
+ };
406
+ };
407
+ exports.getFirmwareLocation = getFirmwareLocation;
170
408
  //# sourceMappingURL=firmwareInfo.js.map
@@ -14,8 +14,11 @@ const parseThpSettings = ({ manifest, thp }) => {
14
14
  if (typeof thp?.hostName === 'string') {
15
15
  settings.hostName = thp.hostName;
16
16
  }
17
+ if (typeof thp?.appName === 'string') {
18
+ settings.appName = thp.appName;
19
+ }
17
20
  else if (typeof manifest?.appName === 'string') {
18
- settings.hostName = manifest?.appName;
21
+ settings.appName = manifest?.appName;
19
22
  }
20
23
  if (typeof thp?.staticKey === 'string') {
21
24
  settings.staticKey = thp.staticKey;
@@ -25,7 +28,7 @@ const parseThpSettings = ({ manifest, thp }) => {
25
28
  if (k &&
26
29
  typeof k === 'object' &&
27
30
  typeof k.credential === 'string' &&
28
- typeof k.trezor_static_pubkey === 'string') {
31
+ typeof k.trezor_static_public_key === 'string') {
29
32
  return k;
30
33
  }
31
34
  return [];
@@ -1,4 +1,5 @@
1
- export declare const VERSION = "9.6.2";
1
+ export declare const VERSION = "9.6.3-beta.1";
2
+ export declare const DEFAULT_DOMAIN_MAJOR_VER: string;
2
3
  export declare const DEFAULT_DOMAIN: string;
3
4
  export declare const CONTENT_SCRIPT_VERSION = 1;
4
5
  export declare const DEEPLINK_VERSION = 1;
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEEPLINK_VERSION = exports.CONTENT_SCRIPT_VERSION = exports.DEFAULT_DOMAIN = exports.VERSION = void 0;
4
- exports.VERSION = '9.6.2';
3
+ exports.DEEPLINK_VERSION = exports.CONTENT_SCRIPT_VERSION = exports.DEFAULT_DOMAIN = exports.DEFAULT_DOMAIN_MAJOR_VER = exports.VERSION = void 0;
4
+ exports.VERSION = '9.6.3-beta.1';
5
5
  const versionN = exports.VERSION.split('.').map(s => parseInt(s, 10));
6
6
  const isBeta = exports.VERSION.includes('beta');
7
+ exports.DEFAULT_DOMAIN_MAJOR_VER = `https://connect.trezor.io/${versionN[0]}/`;
7
8
  exports.DEFAULT_DOMAIN = isBeta
8
9
  ? `https://connect.trezor.io/${exports.VERSION}/`
9
- : `https://connect.trezor.io/${versionN[0]}/`;
10
+ : exports.DEFAULT_DOMAIN_MAJOR_VER;
10
11
  exports.CONTENT_SCRIPT_VERSION = 1;
11
12
  exports.DEEPLINK_VERSION = 1;
12
13
  //# sourceMappingURL=version.js.map