@trezor/connect 9.6.2-beta.3 → 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.
- package/CHANGELOG.md +15 -6
- package/README.md +1 -1
- package/lib/api/applySettings.js +16 -1
- package/lib/api/bitcoin/signtx.d.ts +2 -2
- package/lib/api/bitcoin/signtx.js +1 -1
- package/lib/api/bleUnpair.js +0 -1
- package/lib/api/cardano/api/cardanoGetAddress.d.ts +1 -0
- package/lib/api/cardano/api/cardanoSignMessage.d.ts +25 -0
- package/lib/api/cardano/api/cardanoSignMessage.js +97 -0
- package/lib/api/cardano/api/index.d.ts +1 -0
- package/lib/api/cardano/api/index.js +3 -1
- package/lib/api/cardano/cardanoUtils.d.ts +1 -1
- package/lib/api/cardano/cardanoUtils.js +2 -2
- package/lib/api/discoverAccounts.js +61 -33
- package/lib/api/ethereum/api/ethereumGetAddress.js +1 -0
- package/lib/api/ethereum/api/ethereumSignTransaction.js +22 -4
- package/lib/api/ethereum/ethereumSignTx.d.ts +3 -2
- package/lib/api/ethereum/ethereumSignTx.js +4 -2
- package/lib/api/evoluGetNode.d.ts +11 -0
- package/lib/api/evoluGetNode.js +26 -0
- package/lib/api/firmware/calculateFirmwareHash.d.ts +2 -1
- package/lib/api/firmware/calculateFirmwareHash.js +17 -4
- package/lib/api/firmware/getBinary.d.ts +7 -6
- package/lib/api/firmware/getBinary.js +18 -6
- package/lib/api/firmware/index.d.ts +0 -2
- package/lib/api/firmware/index.js +1 -5
- package/lib/api/firmware/uploadFirmware.d.ts +10 -1
- package/lib/api/firmware/uploadFirmware.js +8 -7
- package/lib/api/getFeatures.d.ts +2 -1
- package/lib/api/index.d.ts +3 -0
- package/lib/api/index.js +8 -2
- package/lib/api/nem/nemSignTx.d.ts +1 -1
- package/lib/api/pushTransaction.d.ts +2 -1
- package/lib/api/pushTransaction.js +2 -1
- package/lib/api/resetDevice.js +2 -1
- package/lib/api/ripple/api/rippleGetAddress.d.ts +1 -0
- package/lib/api/signMessage.js +1 -1
- package/lib/api/signTransaction.d.ts +1 -1
- package/lib/api/solana/api/solanaGetAddress.d.ts +1 -0
- package/lib/api/solana/api/solanaGetPublicKey.d.ts +2 -0
- package/lib/api/solana/api/solanaGetPublicKey.js +3 -0
- package/lib/api/stellar/api/stellarGetAddress.d.ts +1 -0
- package/lib/api/tezos/api/tezosGetAddress.d.ts +1 -0
- package/lib/api/tezos/tezosSignTx.d.ts +1 -1
- package/lib/api/thpGetCredentials.d.ts +10 -0
- package/lib/api/thpGetCredentials.js +31 -0
- package/lib/api/thpRemoveCredentials.d.ts +8 -0
- package/lib/api/thpRemoveCredentials.js +32 -0
- package/lib/api/wipeDevice.js +6 -2
- package/lib/backend/Blockchain.d.ts +4 -4
- package/lib/backend/Blockchain.js +12 -11
- package/lib/constants/cardano.d.ts +3 -0
- package/lib/constants/cardano.js +5 -1
- package/lib/constants/errors.d.ts +12 -9
- package/lib/constants/errors.js +18 -24
- package/lib/core/AbstractMethod.d.ts +5 -24
- package/lib/core/AbstractMethod.js +2 -2
- package/lib/core/index.js +5 -1
- package/lib/core/onCallFirmwareUpdate.d.ts +13 -1
- package/lib/core/onCallFirmwareUpdate.js +158 -94
- package/lib/data/DataManager.d.ts +13 -1
- package/lib/data/DataManager.js +44 -14
- package/lib/data/coinInfo.d.ts +8 -84
- package/lib/data/coinInfo.js +6 -9
- package/lib/data/config.d.ts +26 -192
- package/lib/data/config.js +37 -1
- package/lib/data/connectSettings.js +7 -0
- package/lib/data/defaultFeeLevels.js +2 -1
- package/lib/data/deviceAuthenticityConfig.js +10 -1
- package/lib/data/firmwareInfo.d.ts +44 -11
- package/lib/data/firmwareInfo.js +360 -122
- package/lib/data/thpSettings.js +5 -2
- package/lib/data/version.d.ts +2 -1
- package/lib/data/version.js +4 -3
- package/lib/device/Device.d.ts +17 -7
- package/lib/device/Device.js +72 -115
- package/lib/device/DeviceCommands.d.ts +1 -0
- package/lib/device/DeviceCurrentSession.d.ts +41 -20
- package/lib/device/DeviceCurrentSession.js +18 -22
- package/lib/device/TransportList.js +10 -5
- package/lib/device/checkFirmwareRevision.d.ts +3 -2
- package/lib/device/checkFirmwareRevision.js +6 -11
- package/lib/device/thp/handshake.d.ts +4 -0
- package/lib/device/thp/handshake.js +88 -0
- package/lib/device/thp/index.d.ts +4 -1
- package/lib/device/thp/index.js +24 -6
- package/lib/device/thp/pairing.d.ts +16 -0
- package/lib/device/thp/pairing.js +230 -0
- package/lib/device/thp/session.d.ts +3 -0
- package/lib/device/thp/session.js +27 -0
- package/lib/device/thp/thpCall.d.ts +41 -0
- package/lib/device/thp/thpCall.js +57 -0
- package/lib/device/workflow/checkFirmwareHash.d.ts +10 -0
- package/lib/device/workflow/checkFirmwareHash.js +79 -0
- package/lib/device/workflow/checkFirmwareHashWithRetries.d.ts +9 -0
- package/lib/device/workflow/checkFirmwareHashWithRetries.js +41 -0
- package/lib/device/workflow/handshake.js +7 -6
- package/lib/device/workflow/validateState.js +53 -10
- package/lib/events/ui-request.d.ts +1 -1
- package/lib/factory.js +4 -0
- package/lib/tsconfig.lib.tsbuildinfo +1 -1
- package/lib/types/api/bitcoin/index.d.ts +1 -1
- package/lib/types/api/cardano/index.d.ts +62 -1
- package/lib/types/api/cardano/index.js +30 -1
- package/lib/types/api/cardanoSignMessage.d.ts +4 -0
- package/lib/types/api/cardanoSignMessage.js +3 -0
- package/lib/types/api/discoverAccounts.d.ts +17 -12
- package/lib/types/api/ethereum/index.d.ts +108 -0
- package/lib/types/api/ethereum/index.js +3 -0
- package/lib/types/api/evoluGetNode.d.ts +4 -0
- package/lib/types/api/evoluGetNode.js +3 -0
- package/lib/types/api/index.d.ts +8 -0
- package/lib/types/api/pushTransaction.d.ts +4 -1
- package/lib/types/api/pushTransaction.js +7 -1
- package/lib/types/api/solana/index.d.ts +3 -0
- package/lib/types/api/solana/index.js +2 -0
- package/lib/types/api/thpGetCredentials.d.ts +4 -0
- package/lib/types/api/thpGetCredentials.js +3 -0
- package/lib/types/api/thpRemoveCredentials.d.ts +7 -0
- package/lib/types/api/thpRemoveCredentials.js +3 -0
- package/lib/types/device.d.ts +9 -9
- package/lib/types/firmware.d.ts +15 -12
- package/lib/types/firmware.js +0 -3
- package/lib/types/params.d.ts +1 -0
- package/lib/types/settings.d.ts +7 -0
- package/lib/utils/assetUtils.d.ts +5 -2
- package/lib/utils/assetUtils.js +14 -18
- package/lib/utils/assets.native.js +0 -2
- package/lib/utils/firmwareReleaseConfigUtils.d.ts +8 -5
- package/lib/utils/firmwareReleaseConfigUtils.js +74 -59
- package/lib/utils/firmwareUtils.d.ts +8 -4
- package/lib/utils/firmwareUtils.js +62 -20
- package/lib/utils/formatUtils.d.ts +1 -0
- package/lib/utils/formatUtils.js +3 -2
- package/package.json +19 -18
- package/lib/api/firmware/getBinaryForFirmwareUpgrade.d.ts +0 -12
- package/lib/api/firmware/getBinaryForFirmwareUpgrade.js +0 -32
- package/lib/data/getLanguage.d.ts +0 -6
- package/lib/data/getLanguage.js +0 -10
package/lib/utils/assetUtils.js
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.tryLocalAssetRequire = exports.firmwareReleaseConfigAssets = exports.
|
|
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
|
|
6
|
-
const
|
|
7
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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.
|
|
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
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
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(),
|
|
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.
|
|
24
|
+
throw new Error(`Fetching error with status: ${response.status}`);
|
|
34
25
|
}
|
|
35
|
-
const
|
|
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
|
|
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
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
66
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const
|
|
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.
|
|
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
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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.
|
|
26
|
-
const
|
|
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-${
|
|
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.
|
|
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>;
|
package/lib/utils/formatUtils.js
CHANGED
|
@@ -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.
|
|
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.
|
|
82
|
-
"@trezor/blockchain-link": "2.5.
|
|
83
|
-
"@trezor/blockchain-link-types": "1.4.
|
|
84
|
-
"@trezor/blockchain-link-utils": "1.4.
|
|
85
|
-
"@trezor/connect-analytics": "1.3.5
|
|
86
|
-
"@trezor/connect-common": "0.4.
|
|
87
|
-
"@trezor/crypto-utils": "1.1.4
|
|
88
|
-
"@trezor/device-utils": "1.1.
|
|
89
|
-
"@trezor/env-utils": "^1.4.
|
|
90
|
-
"@trezor/protobuf": "1.4.
|
|
91
|
-
"@trezor/protocol": "1.2.
|
|
92
|
-
"@trezor/schema-utils": "1.3.4
|
|
93
|
-
"@trezor/transport": "1.5.
|
|
94
|
-
"@trezor/type-utils": "1.1.
|
|
95
|
-
"@trezor/utils": "9.4.
|
|
96
|
-
"@trezor/utxo-lib": "2.4.
|
|
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
|
+
"@trezor/connect-analytics": "1.3.5",
|
|
86
|
+
"@trezor/connect-common": "0.4.3-beta.1",
|
|
87
|
+
"@trezor/crypto-utils": "1.1.4",
|
|
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
|
+
"@trezor/schema-utils": "1.3.4",
|
|
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.
|
|
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
|
package/lib/data/getLanguage.js
DELETED
|
@@ -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
|