@trezor/connect 9.2.3 → 9.2.4-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +77 -5
- package/README.md +1 -1
- package/lib/api/applyFlags.d.ts +8 -1
- package/lib/api/applyFlags.js +3 -8
- package/lib/api/applySettings.d.ts +8 -1
- package/lib/api/applySettings.js +3 -8
- package/lib/api/backupDevice.d.ts +10 -2
- package/lib/api/backupDevice.js +12 -9
- package/lib/api/binance/api/binanceGetAddress.d.ts +4 -3
- package/lib/api/binance/api/binanceGetAddress.js +8 -22
- package/lib/api/binance/api/binanceGetPublicKey.d.ts +4 -2
- package/lib/api/binance/api/binanceGetPublicKey.js +6 -18
- package/lib/api/blockchainGetCurrentFiatRates.d.ts +1 -1
- package/lib/api/blockchainGetFiatRatesForTimestamps.d.ts +1 -1
- package/lib/api/cardano/api/cardanoGetAddress.d.ts +4 -4
- package/lib/api/cardano/api/cardanoGetAddress.js +9 -39
- package/lib/api/cardano/api/cardanoGetPublicKey.d.ts +4 -3
- package/lib/api/cardano/api/cardanoGetPublicKey.js +9 -31
- package/lib/api/cardano/api/cardanoSignTransaction.d.ts +1 -13
- package/lib/api/cardano/api/cardanoSignTransaction.js +2 -75
- package/lib/api/cardano/cardanoAddressParameters.d.ts +1 -2
- package/lib/api/cardano/cardanoAddressParameters.js +4 -10
- package/lib/api/cardano/cardanoAuxiliaryData.d.ts +1 -2
- package/lib/api/cardano/cardanoAuxiliaryData.js +2 -2
- package/lib/api/changeLanguage.d.ts +8 -1
- package/lib/api/changeLanguage.js +3 -7
- package/lib/api/eos/api/eosGetPublicKey.d.ts +4 -2
- package/lib/api/eos/api/eosGetPublicKey.js +6 -18
- package/lib/api/ethereum/api/ethereumGetAddress.d.ts +4 -3
- package/lib/api/ethereum/api/ethereumGetAddress.js +4 -20
- package/lib/api/ethereum/api/ethereumGetPublicKey.d.ts +4 -2
- package/lib/api/ethereum/api/ethereumGetPublicKey.js +3 -10
- package/lib/api/firmware/index.d.ts +2 -0
- package/lib/api/firmware/index.js +5 -1
- package/lib/api/firmware/parseFirmwareHeaders.d.ts +5 -0
- package/lib/api/firmware/parseFirmwareHeaders.js +35 -0
- package/lib/api/firmware/uploadFirmware.d.ts +1 -1
- package/lib/api/firmware/uploadFirmware.js +9 -1
- package/lib/api/getAccountDescriptor.d.ts +5 -3
- package/lib/api/getAccountDescriptor.js +8 -21
- package/lib/api/getAccountInfo.d.ts +23 -7
- package/lib/api/getAccountInfo.js +12 -25
- package/lib/api/getAddress.d.ts +4 -3
- package/lib/api/getAddress.js +8 -22
- package/lib/api/getFeatures.d.ts +1 -0
- package/lib/api/getOwnershipId.d.ts +4 -2
- package/lib/api/getOwnershipId.js +4 -15
- package/lib/api/getOwnershipProof.d.ts +4 -2
- package/lib/api/getOwnershipProof.js +4 -15
- package/lib/api/getPublicKey.d.ts +5 -4
- package/lib/api/getPublicKey.js +12 -35
- package/lib/api/index.d.ts +0 -1
- package/lib/api/index.js +1 -3
- package/lib/api/nem/api/nemGetAddress.d.ts +4 -3
- package/lib/api/nem/api/nemGetAddress.js +4 -20
- package/lib/api/rebootToBootloader.d.ts +8 -2
- package/lib/api/rebootToBootloader.js +3 -10
- package/lib/api/recoveryDevice.d.ts +8 -1
- package/lib/api/recoveryDevice.js +3 -7
- package/lib/api/resetDevice.d.ts +4 -2
- package/lib/api/resetDevice.js +3 -10
- package/lib/api/ripple/api/rippleGetAddress.d.ts +4 -3
- package/lib/api/ripple/api/rippleGetAddress.js +4 -20
- package/lib/api/solana/api/solanaGetAddress.d.ts +4 -3
- package/lib/api/solana/api/solanaGetAddress.js +7 -28
- package/lib/api/solana/api/solanaGetPublicKey.d.ts +4 -3
- package/lib/api/solana/api/solanaGetPublicKey.js +7 -27
- package/lib/api/stellar/api/stellarGetAddress.d.ts +4 -3
- package/lib/api/stellar/api/stellarGetAddress.js +4 -20
- package/lib/api/tezos/api/tezosGetAddress.d.ts +4 -3
- package/lib/api/tezos/api/tezosGetAddress.js +4 -20
- package/lib/api/tezos/api/tezosGetPublicKey.d.ts +4 -2
- package/lib/api/tezos/api/tezosGetPublicKey.js +6 -18
- package/lib/api/wipeDevice.d.ts +8 -2
- package/lib/api/wipeDevice.js +3 -10
- package/lib/backend/Blockchain.d.ts +2 -2
- package/lib/constants/errors.d.ts +1 -0
- package/lib/constants/errors.js +1 -0
- package/lib/core/AbstractMethod.d.ts +4 -8
- package/lib/core/AbstractMethod.js +6 -28
- package/lib/core/index.d.ts +2 -1
- package/lib/core/index.js +258 -226
- package/lib/core/onCallFirmwareUpdate.d.ts +31 -0
- package/lib/core/onCallFirmwareUpdate.js +266 -0
- package/lib/data/DataManager.d.ts +10 -0
- package/lib/data/analyticsInfo.d.ts +2 -2
- package/lib/data/analyticsInfo.js +6 -7
- package/lib/data/config.d.ts +10 -0
- package/lib/data/config.js +15 -5
- package/lib/data/deviceAuthenticityConfig.js +8 -4
- package/lib/data/firmwareInfo.js +1 -1
- package/lib/data/version.d.ts +1 -1
- package/lib/data/version.js +5 -2
- package/lib/device/Device.d.ts +2 -2
- package/lib/device/Device.js +4 -4
- package/lib/device/DeviceCommands.d.ts +4 -16
- package/lib/device/DeviceCommands.js +10 -72
- package/lib/device/DeviceList.d.ts +7 -4
- package/lib/device/DeviceList.js +46 -40
- package/lib/events/blockchain.d.ts +2 -2
- package/lib/events/index.d.ts +1 -0
- package/lib/events/ui-request.d.ts +13 -1
- package/lib/events/ui-request.js +1 -0
- package/lib/index.js +2 -2
- package/lib/types/api/backupDevice.d.ts +2 -2
- package/lib/types/api/dispose.d.ts +1 -1
- package/lib/types/api/firmwareUpdate.d.ts +7 -6
- package/lib/types/api/firmwareUpdate.js +1 -3
- package/lib/types/index.d.ts +1 -1
- package/lib/types/settings.d.ts +1 -1
- package/lib/utils/popupPromiseManager.d.ts +8 -0
- package/lib/utils/popupPromiseManager.js +21 -0
- package/lib/utils/uiPromiseManager.d.ts +38 -0
- package/lib/utils/uiPromiseManager.js +47 -0
- package/lib/workers/workers-browser.d.ts +3 -1
- package/lib/workers/workers-browser.js +2 -2
- package/package.json +9 -9
- package/lib/api/firmwareUpdate.d.ts +0 -19
- package/lib/api/firmwareUpdate.js +0 -78
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { DeviceList } from '../device/DeviceList';
|
|
2
|
+
import { CoreEventMessage } from '../events';
|
|
3
|
+
import { CommonParams } from '../types';
|
|
4
|
+
import type { Log } from '../utils/debug';
|
|
5
|
+
import type { Device } from '../device/Device';
|
|
6
|
+
type PostMessage = (message: CoreEventMessage) => void;
|
|
7
|
+
export type Params = {
|
|
8
|
+
language?: string;
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
btcOnly?: boolean;
|
|
11
|
+
binary?: ArrayBuffer;
|
|
12
|
+
} & CommonParams;
|
|
13
|
+
type Context = {
|
|
14
|
+
deviceList: DeviceList;
|
|
15
|
+
postMessage: PostMessage;
|
|
16
|
+
initDevice: (path?: string) => Promise<Device>;
|
|
17
|
+
log: Log;
|
|
18
|
+
abortSignal: AbortSignal;
|
|
19
|
+
};
|
|
20
|
+
export declare const onCallFirmwareUpdate: ({ params, context: { deviceList, postMessage, initDevice, log, abortSignal }, }: {
|
|
21
|
+
params: Params;
|
|
22
|
+
context: Context;
|
|
23
|
+
}) => Promise<{
|
|
24
|
+
check: "other-error";
|
|
25
|
+
checkError: any;
|
|
26
|
+
} | {
|
|
27
|
+
check: string;
|
|
28
|
+
checkError?: undefined;
|
|
29
|
+
}>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=onCallFirmwareUpdate.d.ts.map
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.onCallFirmwareUpdate = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const utils_1 = require("@trezor/utils");
|
|
6
|
+
const events_1 = require("../events");
|
|
7
|
+
const firmware_1 = require("../api/firmware");
|
|
8
|
+
const firmwareInfo_1 = require("../data/firmwareInfo");
|
|
9
|
+
const constants_1 = require("../constants");
|
|
10
|
+
const versionUtils_1 = require("@trezor/utils/lib/versionUtils");
|
|
11
|
+
const registerEvents = (device, postMessage) => {
|
|
12
|
+
device.on(events_1.DEVICE.BUTTON, (_d, request) => {
|
|
13
|
+
postMessage((0, events_1.createDeviceMessage)(events_1.DEVICE.BUTTON, {
|
|
14
|
+
code: request.code,
|
|
15
|
+
device: device.toMessageObject(),
|
|
16
|
+
}));
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
const waitForReconnectedDevice = async ({ bootloader, method, intermediary }, { deviceList, device, postMessage, log, abortSignal }) => {
|
|
20
|
+
const target = intermediary || !bootloader ? 'normal' : 'bootloader';
|
|
21
|
+
let i = 0;
|
|
22
|
+
if (method !== 'auto') {
|
|
23
|
+
log.debug('onCallFirmwareUpdate', 'waiting for device to disconnect');
|
|
24
|
+
postMessage((0, events_1.createUiMessage)(events_1.UI.FIRMWARE_RECONNECT, {
|
|
25
|
+
device: device.toMessageObject(),
|
|
26
|
+
disconnected: false,
|
|
27
|
+
method,
|
|
28
|
+
target,
|
|
29
|
+
i,
|
|
30
|
+
}));
|
|
31
|
+
await new Promise(resolve => {
|
|
32
|
+
deviceList.once('device-disconnect', resolve);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
log.debug('onCallFirmwareUpdate', `waiting for device to reconnect in ${bootloader ? 'bootloader' : 'normal'} mode`);
|
|
36
|
+
let reconnectedDevice;
|
|
37
|
+
do {
|
|
38
|
+
postMessage((0, events_1.createUiMessage)(events_1.UI.FIRMWARE_RECONNECT, {
|
|
39
|
+
device: device.toMessageObject(),
|
|
40
|
+
disconnected: true,
|
|
41
|
+
method,
|
|
42
|
+
target,
|
|
43
|
+
i,
|
|
44
|
+
}));
|
|
45
|
+
await (0, utils_1.createTimeoutPromise)(2000);
|
|
46
|
+
try {
|
|
47
|
+
const path = deviceList.getFirstDevicePath();
|
|
48
|
+
reconnectedDevice = deviceList.getDevice(path);
|
|
49
|
+
}
|
|
50
|
+
catch { }
|
|
51
|
+
i++;
|
|
52
|
+
log.debug('onCallFirmwareUpdate', 'waiting for device to reconnect', i);
|
|
53
|
+
} while (!abortSignal.aborted &&
|
|
54
|
+
(!(reconnectedDevice === null || reconnectedDevice === void 0 ? void 0 : reconnectedDevice.features) ||
|
|
55
|
+
bootloader === !reconnectedDevice.features.bootloader_mode ||
|
|
56
|
+
(intermediary &&
|
|
57
|
+
!(0, versionUtils_1.isNewer)([
|
|
58
|
+
reconnectedDevice.features.major_version,
|
|
59
|
+
reconnectedDevice.features.minor_version,
|
|
60
|
+
reconnectedDevice.features.patch_version,
|
|
61
|
+
], [
|
|
62
|
+
device.features.major_version,
|
|
63
|
+
device.features.minor_version,
|
|
64
|
+
device.features.patch_version,
|
|
65
|
+
]))));
|
|
66
|
+
if (!reconnectedDevice) {
|
|
67
|
+
throw constants_1.ERRORS.TypedError('Method_Interrupted');
|
|
68
|
+
}
|
|
69
|
+
registerEvents(reconnectedDevice, postMessage);
|
|
70
|
+
await reconnectedDevice.waitForFirstRun();
|
|
71
|
+
await reconnectedDevice.acquire();
|
|
72
|
+
return reconnectedDevice;
|
|
73
|
+
};
|
|
74
|
+
const getInstallationParams = (device, binary) => {
|
|
75
|
+
var _a;
|
|
76
|
+
if (!device.features.bootloader_mode) {
|
|
77
|
+
const version = binary ? (0, firmware_1.parseFirmwareHeaders)(Buffer.from(binary)).version : undefined;
|
|
78
|
+
const isUpdatingToNewerVersion = !version
|
|
79
|
+
? (_a = device.firmwareRelease) === null || _a === void 0 ? void 0 : _a.isNewer
|
|
80
|
+
: (0, versionUtils_1.isNewer)(version, [
|
|
81
|
+
device.features.major_version,
|
|
82
|
+
device.features.minor_version,
|
|
83
|
+
device.features.patch_version,
|
|
84
|
+
]);
|
|
85
|
+
const upgrade = device.atLeast('2.6.3') && isUpdatingToNewerVersion;
|
|
86
|
+
const manual = !device.atLeast(['1.10.0', '2.6.0']) && !upgrade;
|
|
87
|
+
const language = device.atLeast('2.7.0');
|
|
88
|
+
return {
|
|
89
|
+
manual,
|
|
90
|
+
upgrade,
|
|
91
|
+
language,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
return {
|
|
96
|
+
manual: false,
|
|
97
|
+
upgrade: false,
|
|
98
|
+
language: false,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const getFwHeader = (binary) => Buffer.from(binary.slice(0, 6000)).toString('hex');
|
|
103
|
+
const getBinaryHelper = (device, params, log, postMessage, intermediaryVersion) => {
|
|
104
|
+
var _a;
|
|
105
|
+
if (!device.firmwareRelease) {
|
|
106
|
+
throw constants_1.ERRORS.TypedError('Runtime', 'device.firmwareRelease is not set');
|
|
107
|
+
}
|
|
108
|
+
const btcOnly = params.btcOnly || (params.btcOnly === undefined && device.firmwareType === 'bitcoin-only');
|
|
109
|
+
log.debug('onCallFirmwareUpdate loading binary', 'intermediaryVersion', intermediaryVersion, 'version', device.firmwareRelease.release.version, 'btcOnly', btcOnly);
|
|
110
|
+
postMessage((0, events_1.createUiMessage)(events_1.UI.FIRMWARE_PROGRESS, {
|
|
111
|
+
device: device.toMessageObject(),
|
|
112
|
+
operation: 'downloading',
|
|
113
|
+
progress: 0,
|
|
114
|
+
}));
|
|
115
|
+
return (0, firmware_1.getBinary)({
|
|
116
|
+
features: device.features,
|
|
117
|
+
releases: (0, firmwareInfo_1.getReleases)((_a = device.features) === null || _a === void 0 ? void 0 : _a.internal_model),
|
|
118
|
+
baseUrl: params.baseUrl || 'https://data.trezor.io',
|
|
119
|
+
version: device.firmwareRelease.release.version,
|
|
120
|
+
btcOnly,
|
|
121
|
+
intermediaryVersion,
|
|
122
|
+
})
|
|
123
|
+
.then(res => {
|
|
124
|
+
if (res.byteLength < 200) {
|
|
125
|
+
throw constants_1.ERRORS.TypedError('Runtime', 'Firmware binary is too small');
|
|
126
|
+
}
|
|
127
|
+
return res;
|
|
128
|
+
})
|
|
129
|
+
.then(res => {
|
|
130
|
+
postMessage((0, events_1.createUiMessage)(events_1.UI.FIRMWARE_PROGRESS, {
|
|
131
|
+
device: device.toMessageObject(),
|
|
132
|
+
operation: 'downloading',
|
|
133
|
+
progress: 100,
|
|
134
|
+
}));
|
|
135
|
+
return res;
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
const firmwareCheck = async (reconnectedDevice, device, stripped, postMessage) => {
|
|
139
|
+
postMessage((0, events_1.createUiMessage)(events_1.UI.FIRMWARE_PROGRESS, {
|
|
140
|
+
device: device.toMessageObject(),
|
|
141
|
+
operation: 'validating',
|
|
142
|
+
progress: 0,
|
|
143
|
+
}));
|
|
144
|
+
const { hash, challenge } = (0, firmware_1.calculateFirmwareHash)(device.features.major_version, stripped, (0, crypto_1.randomBytes)(32));
|
|
145
|
+
const getFirmwareHashResponse = await reconnectedDevice
|
|
146
|
+
.getCommands()
|
|
147
|
+
.typedCall('GetFirmwareHash', 'FirmwareHash', { challenge });
|
|
148
|
+
postMessage((0, events_1.createUiMessage)(events_1.UI.FIRMWARE_PROGRESS, {
|
|
149
|
+
device: device.toMessageObject(),
|
|
150
|
+
operation: 'validating',
|
|
151
|
+
progress: 100,
|
|
152
|
+
}));
|
|
153
|
+
return (getFirmwareHashResponse.message !== 'Unknown message' &&
|
|
154
|
+
getFirmwareHashResponse.message !== 'Unexpected message' &&
|
|
155
|
+
getFirmwareHashResponse.message.hash === hash);
|
|
156
|
+
};
|
|
157
|
+
const onCallFirmwareUpdate = async ({ params, context: { deviceList, postMessage, initDevice, log, abortSignal }, }) => {
|
|
158
|
+
var _a;
|
|
159
|
+
log.debug('onCallFirmwareUpdate with params: ', params);
|
|
160
|
+
const device = await initDevice((_a = params === null || params === void 0 ? void 0 : params.device) === null || _a === void 0 ? void 0 : _a.path);
|
|
161
|
+
if (!device.firmwareRelease) {
|
|
162
|
+
throw constants_1.ERRORS.TypedError('Runtime', 'device.firmwareRelease is not set');
|
|
163
|
+
}
|
|
164
|
+
if (deviceList.allDevices().length > 1) {
|
|
165
|
+
throw constants_1.ERRORS.TypedError('Device_MultipleNotSupported', 'Firmware update allowed with only 1 device connected');
|
|
166
|
+
}
|
|
167
|
+
log.debug('onCallFirmwareUpdate', 'device', device);
|
|
168
|
+
registerEvents(device, postMessage);
|
|
169
|
+
const { manual, upgrade, language } = getInstallationParams(device, params.binary);
|
|
170
|
+
log.debug('onCallFirmwareUpdate', 'installation params', { manual, upgrade, language });
|
|
171
|
+
const binary = params.binary ||
|
|
172
|
+
(await getBinaryHelper(device, params, log, postMessage, device.firmwareRelease.intermediaryVersion));
|
|
173
|
+
const deviceInitiallyConnectedInBootloader = device.features.bootloader_mode;
|
|
174
|
+
const deviceInitiallyConnectedWithoutFirmware = device.features.firmware_present === false;
|
|
175
|
+
let reconnectedDevice = device;
|
|
176
|
+
if (deviceInitiallyConnectedInBootloader) {
|
|
177
|
+
log.warn('onCallFirmwareUpdate', 'device is already in bootloader mode. language will not be updated');
|
|
178
|
+
await device.acquire();
|
|
179
|
+
}
|
|
180
|
+
else if (manual) {
|
|
181
|
+
reconnectedDevice = await waitForReconnectedDevice({ bootloader: true, method: 'manual' }, { deviceList, device, log, postMessage, abortSignal });
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
const rebootParams = upgrade
|
|
185
|
+
? {
|
|
186
|
+
boot_command: constants_1.PROTO.BootCommand.INSTALL_UPGRADE,
|
|
187
|
+
firmware_header: getFwHeader(binary),
|
|
188
|
+
}
|
|
189
|
+
: {};
|
|
190
|
+
await device.acquire();
|
|
191
|
+
const targetLanguage = params.language || device.features.language || 'en-US';
|
|
192
|
+
const languageBlob = language && targetLanguage !== 'en-US'
|
|
193
|
+
? await (0, firmware_1.getLanguage)({
|
|
194
|
+
language: targetLanguage,
|
|
195
|
+
version: device.firmwareRelease.release.version,
|
|
196
|
+
internal_model: device.features.internal_model,
|
|
197
|
+
})
|
|
198
|
+
: null;
|
|
199
|
+
if (!languageBlob) {
|
|
200
|
+
await device.getCommands().typedCall('RebootToBootloader', 'Success', rebootParams);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
let rebootResponse = await device.getCommands().typedCall('RebootToBootloader', ['TranslationDataRequest', 'Success'], { ...rebootParams, language_data_length: languageBlob === null || languageBlob === void 0 ? void 0 : languageBlob.byteLength });
|
|
204
|
+
log.debug('onCallFirmwareUpdate', 'RebootToBootloader response', rebootResponse.message);
|
|
205
|
+
while (languageBlob && rebootResponse.type !== 'Success') {
|
|
206
|
+
const start = rebootResponse.message.data_offset;
|
|
207
|
+
const end = rebootResponse.message.data_offset + rebootResponse.message.data_length;
|
|
208
|
+
const chunk = languageBlob.slice(start, end);
|
|
209
|
+
rebootResponse = await device.getCommands().typedCall('TranslationDataAck', ['TranslationDataRequest', 'Success'], { data_chunk: Buffer.from(chunk).toString('hex') });
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
await device.release();
|
|
213
|
+
if (device.features.major_version === 1) {
|
|
214
|
+
await (0, utils_1.createTimeoutPromise)(2000);
|
|
215
|
+
}
|
|
216
|
+
reconnectedDevice = await waitForReconnectedDevice({ bootloader: true, method: 'auto' }, { deviceList, device, log, postMessage, abortSignal });
|
|
217
|
+
}
|
|
218
|
+
const intermediary = !params.binary && device.firmwareRelease.intermediaryVersion;
|
|
219
|
+
await reconnectedDevice.initialize(false, false);
|
|
220
|
+
let stripped = (0, firmware_1.stripFwHeaders)(binary);
|
|
221
|
+
await (0, firmware_1.uploadFirmware)(reconnectedDevice.getCommands().typedCall.bind(reconnectedDevice.getCommands()), postMessage, reconnectedDevice, { payload: !intermediary && (0, firmware_1.shouldStripFwHeaders)(device.features) ? stripped : binary });
|
|
222
|
+
await reconnectedDevice.release();
|
|
223
|
+
if (intermediary) {
|
|
224
|
+
reconnectedDevice = await waitForReconnectedDevice({ bootloader: true, method: 'manual', intermediary: true }, { deviceList, device: reconnectedDevice, log, postMessage, abortSignal });
|
|
225
|
+
stripped = (0, firmware_1.stripFwHeaders)(await getBinaryHelper(reconnectedDevice, params, log, postMessage));
|
|
226
|
+
await reconnectedDevice.initialize(false, false);
|
|
227
|
+
await (0, firmware_1.uploadFirmware)(reconnectedDevice.getCommands().typedCall.bind(reconnectedDevice.getCommands()), postMessage, reconnectedDevice, { payload: stripped });
|
|
228
|
+
await reconnectedDevice.release();
|
|
229
|
+
}
|
|
230
|
+
reconnectedDevice = await waitForReconnectedDevice({ bootloader: false, method: 'wait' }, { deviceList, device: reconnectedDevice, log, postMessage, abortSignal });
|
|
231
|
+
if (reconnectedDevice.atLeast('2.7.0') &&
|
|
232
|
+
deviceInitiallyConnectedWithoutFirmware &&
|
|
233
|
+
params.language) {
|
|
234
|
+
try {
|
|
235
|
+
log.info('onCallFirmwareUpdate', 'changing language for fresh device to: ', params.language);
|
|
236
|
+
await reconnectedDevice.changeLanguage({ language: params.language });
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
log.error('onCallFirmwareUpdate', 'changeLanguage failed silently: ', err);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const checkSupported = reconnectedDevice.atLeast(['1.11.1', '2.5.1']) && !params.binary;
|
|
243
|
+
if (checkSupported) {
|
|
244
|
+
try {
|
|
245
|
+
log.debug('onCallFirmwareUpdate', 'getFirmwareHash supported, proceed with check', stripped);
|
|
246
|
+
const isValid = await firmwareCheck(reconnectedDevice, device, stripped, postMessage);
|
|
247
|
+
await reconnectedDevice.release();
|
|
248
|
+
if (isValid) {
|
|
249
|
+
log.debug('onCallFirmwareUpdate', 'installed fw hash and calculated hash match');
|
|
250
|
+
return { check: 'valid' };
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
return { check: 'mismatch' };
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch (err) {
|
|
257
|
+
return { check: 'other-error', checkError: err.message };
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
await reconnectedDevice.release();
|
|
262
|
+
return { check: 'omitted' };
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
exports.onCallFirmwareUpdate = onCallFirmwareUpdate;
|
|
266
|
+
//# sourceMappingURL=onCallFirmwareUpdate.js.map
|
|
@@ -56,6 +56,16 @@ export declare class DataManager {
|
|
|
56
56
|
download: string;
|
|
57
57
|
update: string;
|
|
58
58
|
};
|
|
59
|
+
brave: {
|
|
60
|
+
version: number;
|
|
61
|
+
download: string;
|
|
62
|
+
update: string;
|
|
63
|
+
};
|
|
64
|
+
edge: {
|
|
65
|
+
version: number;
|
|
66
|
+
download: string;
|
|
67
|
+
update: string;
|
|
68
|
+
};
|
|
59
69
|
};
|
|
60
70
|
supportedFirmware: ({
|
|
61
71
|
coin: string[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CoreEventMessage } from '../events';
|
|
2
2
|
import type { Device } from '../types';
|
|
3
|
-
export declare const
|
|
3
|
+
export declare const enhanceMessageWithAnalytics: (message: CoreEventMessage, data: {
|
|
4
4
|
device?: Device;
|
|
5
|
-
}) =>
|
|
5
|
+
}) => CoreEventMessage;
|
|
6
6
|
//# sourceMappingURL=analyticsInfo.d.ts.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.enhanceMessageWithAnalytics = void 0;
|
|
4
4
|
const events_1 = require("../events");
|
|
5
|
-
const
|
|
5
|
+
const enhanceMessageWithAnalytics = (message, data) => {
|
|
6
6
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
7
7
|
switch (message.type) {
|
|
8
8
|
case events_1.UI_REQUEST.REQUEST_CONFIRMATION:
|
|
9
9
|
const { device } = data;
|
|
10
|
-
|
|
10
|
+
return {
|
|
11
11
|
...message,
|
|
12
12
|
payload: {
|
|
13
13
|
...message.payload,
|
|
@@ -27,11 +27,10 @@ const enhancePostMessageWithAnalytics = (callback, message, data) => {
|
|
|
27
27
|
},
|
|
28
28
|
},
|
|
29
29
|
},
|
|
30
|
-
}
|
|
31
|
-
break;
|
|
30
|
+
};
|
|
32
31
|
default:
|
|
33
|
-
|
|
32
|
+
return message;
|
|
34
33
|
}
|
|
35
34
|
};
|
|
36
|
-
exports.
|
|
35
|
+
exports.enhanceMessageWithAnalytics = enhanceMessageWithAnalytics;
|
|
37
36
|
//# sourceMappingURL=analyticsInfo.js.map
|
package/lib/data/config.d.ts
CHANGED
|
@@ -44,6 +44,16 @@ export declare const config: {
|
|
|
44
44
|
download: string;
|
|
45
45
|
update: string;
|
|
46
46
|
};
|
|
47
|
+
brave: {
|
|
48
|
+
version: number;
|
|
49
|
+
download: string;
|
|
50
|
+
update: string;
|
|
51
|
+
};
|
|
52
|
+
edge: {
|
|
53
|
+
version: number;
|
|
54
|
+
download: string;
|
|
55
|
+
update: string;
|
|
56
|
+
};
|
|
47
57
|
};
|
|
48
58
|
supportedFirmware: ({
|
|
49
59
|
coin: string[];
|
package/lib/data/config.js
CHANGED
|
@@ -103,6 +103,16 @@ exports.config = {
|
|
|
103
103
|
download: 'https://www.mozilla.org/en-US/firefox/new/',
|
|
104
104
|
update: 'https://support.mozilla.org/en-US/kb/update-firefox-latest-version',
|
|
105
105
|
},
|
|
106
|
+
brave: {
|
|
107
|
+
version: 59,
|
|
108
|
+
download: 'https://brave.com/download/',
|
|
109
|
+
update: 'https://brave.com/download/',
|
|
110
|
+
},
|
|
111
|
+
edge: {
|
|
112
|
+
version: 79,
|
|
113
|
+
download: 'https://www.microsoft.com/en-us/edge',
|
|
114
|
+
update: 'https://www.microsoft.com/en-us/edge',
|
|
115
|
+
},
|
|
106
116
|
},
|
|
107
117
|
supportedFirmware: [
|
|
108
118
|
{
|
|
@@ -140,18 +150,18 @@ exports.config = {
|
|
|
140
150
|
},
|
|
141
151
|
{
|
|
142
152
|
methods: ['cardanoGetAddress', 'cardanoGetPublicKey'],
|
|
143
|
-
min: { T1B1: '0', T2T1: '2.3
|
|
144
|
-
comment: ['
|
|
153
|
+
min: { T1B1: '0', T2T1: '2.4.3' },
|
|
154
|
+
comment: ['Since 2.4.3 Cardano derivation behavior has changed'],
|
|
145
155
|
},
|
|
146
156
|
{
|
|
147
157
|
methods: ['cardanoSignTransaction'],
|
|
148
|
-
min: { T1B1: '0', T2T1: '2.
|
|
149
|
-
comment: ['
|
|
158
|
+
min: { T1B1: '0', T2T1: '2.6.0' },
|
|
159
|
+
comment: ['Before 2.6.0 not all Cardano transactions were supported'],
|
|
150
160
|
},
|
|
151
161
|
{
|
|
152
162
|
methods: ['cardanoGetNativeScriptHash'],
|
|
153
163
|
min: { T1B1: '0', T2T1: '2.4.3' },
|
|
154
|
-
comment: ['
|
|
164
|
+
comment: ['Since 2.4.3 Cardano derivation behavior has changed'],
|
|
155
165
|
},
|
|
156
166
|
{
|
|
157
167
|
methods: ['tezosSignTransaction'],
|
|
@@ -25,7 +25,7 @@ exports.DeviceAuthenticityConfig = schema_utils_1.Type.Intersect([
|
|
|
25
25
|
]);
|
|
26
26
|
exports.deviceAuthenticityConfig = {
|
|
27
27
|
version: 1,
|
|
28
|
-
timestamp: '
|
|
28
|
+
timestamp: '2024-05-10T12:00:00+00:00',
|
|
29
29
|
T2B1: {
|
|
30
30
|
rootPubKeys: [
|
|
31
31
|
'04ca97480ac0d7b1e6efafe518cd433cec2bf8ab9822d76eafd34363b55d63e60380bff20acc75cde03cffcb50ab6f8ce70c878e37ebc58ff7cca0a83b16b15fa5',
|
|
@@ -46,6 +46,12 @@ exports.deviceAuthenticityConfig = {
|
|
|
46
46
|
'04c99f57eaaca8db0245a46dba5288a4c0b0d6acdd1346feef7770ec6b88d28d6640ee19c3f6d984e8fcfceda11b1e4accefda32b950dcd1785fbd16c2e45493a3',
|
|
47
47
|
'049c288f4de8a239be83955ed260f40c1a4126fb7dc513601dde4cb11f7363d6a259e73cb1bd9283a450ae608d1832c5fd0cbd9526c0285e720fa45494cae981fd',
|
|
48
48
|
'04ac1815177cc1f07700e5f18c05522427413f404bacc987eb1cf9d86f96b9e0cc53ef5941eafd483102eea321205d7dd9271ac2d0fca75a9a43deb824b51f1596',
|
|
49
|
+
'049f91ac8c7dac26fa7eb82ff3fb8c6d24978bbaeed1adb0751342a8c4c88152817d50bd0b4c16d8fb85bf12f46dca0674a398aeecbb3d1a01236cd3eb39d24c55',
|
|
50
|
+
'04c5225b6d8b84401c408ad0a5aa47888e9087451a2ca4440e46efed5765fd2f5bf8f068e1cfea18dddfc5b47b19076ce0a84fbcf7269f9578d9b978679dea4189',
|
|
51
|
+
'04e349de85981f8e7d95ca4b44346924a9df62875971cfc5e21fc042c3a8fb3e1ddfeac139c15fcf3f7968242a418fc80e92c98f5aef39672b13b60d0b2335c84c',
|
|
52
|
+
'04d7ddaf7e17a678bef305950f0f9d74b90553d8502fd02c439f07ac7ea494e9e0519a1c5782bf23be058162e706057d3b241d507f89b9e5518e3696a92128fa6d',
|
|
53
|
+
'0488cf1dbadb18df0a094da837b3eeb0c85489cc21e7c2b94f8f4df207edccfddbb58e428d9a6ce1e42081c38665d134c7ee6f1f524688ce7444bc1d1340a8b1f1',
|
|
54
|
+
'04ff0c6e817d7c00a0912cf1d293e4d3a8c25403dca4e8ced5e7323352e34604725ad67739d1b4bf538a3864e95d8311ebc91d522b1603da94061e82535edced56',
|
|
49
55
|
],
|
|
50
56
|
debug: {
|
|
51
57
|
rootPubKeys: [
|
|
@@ -67,12 +73,10 @@ exports.deviceAuthenticityConfig = {
|
|
|
67
73
|
],
|
|
68
74
|
debug: {
|
|
69
75
|
rootPubKeys: [
|
|
70
|
-
'
|
|
76
|
+
'04e48b69cd7962068d3cca3bcc6b1747ef496c1e28b5529e34ad7295215ea161dbe8fb08ae0479568f9d2cb07630cb3e52f4af0692102da5873559e45e9fa72959',
|
|
71
77
|
],
|
|
72
78
|
caPubKeys: [
|
|
73
79
|
'04829e8965018feb542e9236c9b2ce08f864a55ed9183d0259564f0e05345b04676a0bef36c59d21d3c24868b5601f0b1193a6bfcf6d814e1cfb79c2256a05e953',
|
|
74
|
-
'046f64eff0dfa3ceeae9708a3881fc09a3dae62198559d022d120e96edc168f3991a9e9b016635a0d43997ee55d8c2b37d969e8abc84e75c791ec911108b52f3c7',
|
|
75
|
-
'041260c3c1fd4ddfc97ba19732d5dcbe6efab61d58af83281b95d6cdb30606bf08f0b817eb6db2825b5ce32d0cc2c275b7eadcedaa1805f00b3f5a11668b6c5cb5',
|
|
76
80
|
],
|
|
77
81
|
},
|
|
78
82
|
},
|
package/lib/data/firmwareInfo.js
CHANGED
|
@@ -117,7 +117,7 @@ const getInfo = ({ features, releases }) => {
|
|
|
117
117
|
isRequired: isRequired(changelog),
|
|
118
118
|
isNewer: isNewerResult,
|
|
119
119
|
intermediaryVersion,
|
|
120
|
-
translations: isNewerResult ? prevRelease.translations : release.translations,
|
|
120
|
+
translations: isNewerResult ? prevRelease === null || prevRelease === void 0 ? void 0 : prevRelease.translations : release === null || release === void 0 ? void 0 : release.translations,
|
|
121
121
|
};
|
|
122
122
|
};
|
|
123
123
|
exports.getInfo = getInfo;
|
package/lib/data/version.d.ts
CHANGED
package/lib/data/version.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DEFAULT_DOMAIN = exports.VERSION = void 0;
|
|
4
|
-
exports.VERSION = '9.2.
|
|
4
|
+
exports.VERSION = '9.2.4-beta.2';
|
|
5
5
|
const versionN = exports.VERSION.split('.').map(s => parseInt(s, 10));
|
|
6
|
-
|
|
6
|
+
const isBeta = exports.VERSION.includes('beta');
|
|
7
|
+
exports.DEFAULT_DOMAIN = isBeta
|
|
8
|
+
? `https://connect.trezor.io/${exports.VERSION}/`
|
|
9
|
+
: `https://connect.trezor.io/${versionN[0]}/`;
|
|
7
10
|
//# sourceMappingURL=version.js.map
|
package/lib/device/Device.d.ts
CHANGED
|
@@ -70,7 +70,7 @@ export declare class Device extends TypedEmitter<DeviceEvents> {
|
|
|
70
70
|
getInternalState(): string;
|
|
71
71
|
setExternalState(state?: string): void;
|
|
72
72
|
getExternalState(): string;
|
|
73
|
-
validateState(
|
|
73
|
+
validateState(preauthorized?: boolean): Promise<string | undefined>;
|
|
74
74
|
useLegacyPassphrase(): boolean;
|
|
75
75
|
initialize(useEmptyPassphrase: boolean, useCardanoDerivation: boolean): Promise<void>;
|
|
76
76
|
getFeatures(): Promise<void>;
|
|
@@ -102,7 +102,7 @@ export declare class Device extends TypedEmitter<DeviceEvents> {
|
|
|
102
102
|
getDevicePath(): string;
|
|
103
103
|
isT1(): boolean;
|
|
104
104
|
hasUnexpectedMode(allow: string[], require: string[]): "ui-device_bootloader_mode" | "ui-device_not_in_bootloader_mode" | "ui-device_not_initialized" | "ui-device_seedless" | null;
|
|
105
|
-
dispose(): import("@trezor/transport/lib/types").AbortableCall<void, "Network request failed" | "Wrong result type." | "device disconnected during action" | "unexpected error" | "Aborted by timeout" | "Aborted by signal" | "This transport can not be used in this environment" | "device not found" | "Unable to open device" | "wrong previous session" | "session not found"> | undefined
|
|
105
|
+
dispose(): Promise<import("@trezor/transport/lib/types").AbortableCall<void, "Network request failed" | "Wrong result type." | "device disconnected during action" | "unexpected error" | "Aborted by timeout" | "Aborted by signal" | "This transport can not be used in this environment" | "device not found" | "Unable to open device" | "wrong previous session" | "session not found"> | undefined>;
|
|
106
106
|
getMode(): "normal" | "bootloader" | "initialize" | "seedless";
|
|
107
107
|
toMessageObject(): DeviceTyped;
|
|
108
108
|
legacyForceRelease(): Promise<void>;
|
package/lib/device/Device.js
CHANGED
|
@@ -265,7 +265,7 @@ class Device extends utils_1.TypedEmitter {
|
|
|
265
265
|
getExternalState() {
|
|
266
266
|
return this.externalState[this.instance];
|
|
267
267
|
}
|
|
268
|
-
async validateState(
|
|
268
|
+
async validateState(preauthorized = false) {
|
|
269
269
|
if (!this.features)
|
|
270
270
|
return;
|
|
271
271
|
if (!this.features.unlocked && preauthorized) {
|
|
@@ -274,7 +274,7 @@ class Device extends utils_1.TypedEmitter {
|
|
|
274
274
|
}
|
|
275
275
|
}
|
|
276
276
|
const expectedState = this.getExternalState();
|
|
277
|
-
const state = await this.getCommands().getDeviceState(
|
|
277
|
+
const state = await this.getCommands().getDeviceState();
|
|
278
278
|
const uniqueState = `${state}@${this.features.device_id || 'device_id'}:${this.instance}`;
|
|
279
279
|
if (!this.useLegacyPassphrase() && this.features.session_id) {
|
|
280
280
|
this.setInternalState(this.features.session_id);
|
|
@@ -491,12 +491,12 @@ class Device extends utils_1.TypedEmitter {
|
|
|
491
491
|
}
|
|
492
492
|
return null;
|
|
493
493
|
}
|
|
494
|
-
dispose() {
|
|
494
|
+
async dispose() {
|
|
495
495
|
this.removeAllListeners();
|
|
496
496
|
if (this.isUsedHere() && this.activitySessionID) {
|
|
497
497
|
try {
|
|
498
498
|
if (this.commands) {
|
|
499
|
-
this.commands.cancel();
|
|
499
|
+
await this.commands.cancel();
|
|
500
500
|
}
|
|
501
501
|
return this.transport.release({
|
|
502
502
|
session: this.activitySessionID,
|
|
@@ -43,8 +43,8 @@ export declare class DeviceCommands {
|
|
|
43
43
|
};
|
|
44
44
|
xpub: string;
|
|
45
45
|
}>;
|
|
46
|
-
getHDNode(params: Messages.GetPublicKey, options
|
|
47
|
-
coinInfo
|
|
46
|
+
getHDNode(params: Messages.GetPublicKey, options: {
|
|
47
|
+
coinInfo: BitcoinNetworkInfo;
|
|
48
48
|
validation?: boolean;
|
|
49
49
|
unlockPath?: Messages.UnlockPath;
|
|
50
50
|
}): Promise<{
|
|
@@ -59,18 +59,6 @@ export declare class DeviceCommands {
|
|
|
59
59
|
childNum: number;
|
|
60
60
|
xpub: string;
|
|
61
61
|
}>;
|
|
62
|
-
getBitcoinHDNode(path: number[], coinInfo?: BitcoinNetworkInfo, validation?: boolean): Promise<{
|
|
63
|
-
xpubSegwit?: string | undefined;
|
|
64
|
-
descriptorChecksum?: string | undefined;
|
|
65
|
-
path: number[];
|
|
66
|
-
publicKey: string;
|
|
67
|
-
serializedPath: string;
|
|
68
|
-
depth: number;
|
|
69
|
-
fingerprint: number;
|
|
70
|
-
chainCode: string;
|
|
71
|
-
childNum: number;
|
|
72
|
-
xpub: string;
|
|
73
|
-
}>;
|
|
74
62
|
getAddress({ address_n, show_display, multisig, script_type, chunkify }: Messages.GetAddress, coinInfo: BitcoinNetworkInfo): Promise<{
|
|
75
63
|
path: number[];
|
|
76
64
|
serializedPath: string;
|
|
@@ -83,13 +71,13 @@ export declare class DeviceCommands {
|
|
|
83
71
|
}>;
|
|
84
72
|
ethereumGetPublicKey({ address_n, show_display, }: Messages.EthereumGetPublicKey): Promise<HDNodeResponse>;
|
|
85
73
|
preauthorize(throwError: boolean): Promise<boolean>;
|
|
86
|
-
getDeviceState(
|
|
74
|
+
getDeviceState(): Promise<string>;
|
|
87
75
|
private call;
|
|
88
76
|
typedCall<T extends MessageKey, R extends MessageKey[]>(type: T, resType: R, msg?: MessageType[T]): Promise<TypedCallResponseMap[R[number]]>;
|
|
89
77
|
typedCall<T extends MessageKey, R extends MessageKey>(type: T, resType: R, msg?: MessageType[T]): Promise<TypedResponseMessage<R>>;
|
|
90
78
|
_commonCall(type: MessageKey, msg?: DefaultMessageResponse['message']): Promise<DefaultMessageResponse>;
|
|
91
79
|
_filterCommonTypes(res: DefaultMessageResponse): Promise<DefaultMessageResponse>;
|
|
92
|
-
|
|
80
|
+
private _getAddress;
|
|
93
81
|
_promptPin(type?: Messages.PinMatrixRequestType): Promise<string>;
|
|
94
82
|
_promptPassphrase(): Promise<PassphrasePromptResponse>;
|
|
95
83
|
_promptWord(type: Messages.WordRequestType): Promise<string>;
|