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