@exodus/hardware-wallets 3.6.0 → 3.6.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 +12 -0
- package/lib/index.d.ts +1 -1
- package/lib/module/hardware-wallets.d.ts +12 -8
- package/lib/module/hardware-wallets.js +15 -6
- package/lib/module/interfaces.d.ts +7 -4
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,18 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.6.2](https://github.com/ExodusMovement/exodus-hydra/compare/@exodus/hardware-wallets@3.6.1...@exodus/hardware-wallets@3.6.2) (2026-02-22)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- fix: always pass walletAccount for ensureDevice (#15327)
|
|
11
|
+
|
|
12
|
+
## [3.6.1](https://github.com/ExodusMovement/exodus-hydra/compare/@exodus/hardware-wallets@3.6.0...@exodus/hardware-wallets@3.6.1) (2026-02-09)
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
- fix(hardware-wallets): connect ledger evm from fresh wallets (#15201)
|
|
17
|
+
|
|
6
18
|
## [3.6.0](https://github.com/ExodusMovement/exodus-hydra/compare/@exodus/hardware-wallets@3.5.0...@exodus/hardware-wallets@3.6.0) (2026-01-21)
|
|
7
19
|
|
|
8
20
|
### Features
|
package/lib/index.d.ts
CHANGED
|
@@ -37,7 +37,7 @@ declare const hardwareWallets: () => {
|
|
|
37
37
|
readonly id: "hardwareWallets";
|
|
38
38
|
readonly type: "module";
|
|
39
39
|
readonly factory: (opts: import("./module/hardware-wallets.js").Dependencies) => import("./module/hardware-wallets.js").HardwareWallets;
|
|
40
|
-
readonly dependencies: readonly ["assetsModule", "logger", "ledgerDiscovery", "trezorDiscovery", "publicKeyStore", "hardwareWalletSigningRequestsAtom", "wallet", "walletAccountsAtom", "walletAccounts"];
|
|
40
|
+
readonly dependencies: readonly ["assetsModule", "logger", "ledgerDiscovery", "trezorDiscovery", "publicKeyStore", "hardwareWalletSigningRequestsAtom", "wallet", "walletAccountsAtom", "walletAccounts", "enabledAssets", "availableAssetNamesAtom"];
|
|
41
41
|
readonly public: true;
|
|
42
42
|
};
|
|
43
43
|
}, {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { WalletAccount } from '@exodus/models';
|
|
2
2
|
import Emitter from '@exodus/wild-emitter';
|
|
3
|
-
import type { HardwareSignerProvider, CanAccessAssetParams, CreateParams, StoreSyncedKeysParams, ScanParams, SyncParams, SignTransactionParams, ScanResult, SyncedKeysId, GetAddressParams,
|
|
4
|
-
import type { HardwareWalletDiscovery, HardwareWalletManufacturer
|
|
3
|
+
import type { HardwareSignerProvider, CanAccessAssetParams, CreateParams, StoreSyncedKeysParams, ScanParams, SyncParams, SignTransactionParams, ScanResult, SyncedKeysId, GetAddressParams, SignMessageParams, ProcessPairingCodeParams, SigningRequestState, SetPassphraseModeParams } from './interfaces.js';
|
|
4
|
+
import type { HardwareWalletDiscovery, HardwareWalletManufacturer } from '@exodus/hw-common';
|
|
5
5
|
import type { Atom } from '@exodus/atoms';
|
|
6
6
|
import type { IPublicKeyStore } from '@exodus/public-key-provider/lib/module/store/types';
|
|
7
7
|
import type { Logger } from '@exodus/logger';
|
|
@@ -21,15 +21,17 @@ export type Dependencies = {
|
|
|
21
21
|
walletAccounts: any;
|
|
22
22
|
txLogMonitors: any;
|
|
23
23
|
restoreProgressTracker: any;
|
|
24
|
+
enabledAssets: any;
|
|
25
|
+
availableAssetNamesAtom: Atom<string[]>;
|
|
24
26
|
};
|
|
25
27
|
export declare class HardwareWallets implements HardwareSignerProvider {
|
|
26
28
|
#private;
|
|
27
29
|
readonly events: Emitter<string, any>;
|
|
28
|
-
constructor({ assetsModule, ledgerDiscovery, trezorDiscovery, logger, hardwareWalletSigningRequestsAtom, publicKeyStore, wallet, walletAccountsAtom, walletAccounts, }: Dependencies);
|
|
30
|
+
constructor({ assetsModule, ledgerDiscovery, trezorDiscovery, logger, hardwareWalletSigningRequestsAtom, publicKeyStore, wallet, walletAccountsAtom, walletAccounts, enabledAssets, availableAssetNamesAtom, }: Dependencies);
|
|
29
31
|
retrySigningRequest: (id: string) => Promise<void>;
|
|
30
32
|
cancelSigningRequest: (id: string, fromUI: boolean) => Promise<void>;
|
|
31
33
|
signTransaction: ({ baseAssetName, unsignedTx, walletAccount, multisigData, }: SignTransactionParams) => Promise<any>;
|
|
32
|
-
signMessage: ({ assetName, derivationPath, message }: SignMessageParams) => Promise<any>;
|
|
34
|
+
signMessage: ({ assetName, derivationPath, message, walletAccount, }: SignMessageParams) => Promise<any>;
|
|
33
35
|
isDeviceConnected: () => Promise<boolean>;
|
|
34
36
|
scanForDevices: (deviceType?: HardwareWalletManufacturer) => Promise<void>;
|
|
35
37
|
getAvailableDevices: () => Promise<{
|
|
@@ -46,16 +48,18 @@ export declare class HardwareWallets implements HardwareSignerProvider {
|
|
|
46
48
|
clearPairingRequest: () => Promise<void>;
|
|
47
49
|
submitPairingCode: ({ code }: ProcessPairingCodeParams) => Promise<any>;
|
|
48
50
|
setPassphraseMode: ({ enabled }: SetPassphraseModeParams) => Promise<void>;
|
|
49
|
-
requireDeviceFor: (
|
|
50
|
-
signTransaction: ({ baseAssetName, unsignedTx,
|
|
51
|
-
|
|
51
|
+
requireDeviceFor: (walletAccount: WalletAccount) => Promise<{
|
|
52
|
+
signTransaction: ({ baseAssetName, unsignedTx, multisigData, }: Omit<SignTransactionParams, "walletAccount"> & {
|
|
53
|
+
walletAccount?: WalletAccount;
|
|
54
|
+
}) => Promise<any>;
|
|
55
|
+
signMessage: ({ assetName, derivationPath, message, }: Omit<SignMessageParams, "walletAccount">) => Promise<any>;
|
|
52
56
|
}>;
|
|
53
57
|
}
|
|
54
58
|
declare const hardwareWalletsModuleDefinition: {
|
|
55
59
|
readonly id: "hardwareWallets";
|
|
56
60
|
readonly type: "module";
|
|
57
61
|
readonly factory: (opts: Dependencies) => HardwareWallets;
|
|
58
|
-
readonly dependencies: readonly ["assetsModule", "logger", "ledgerDiscovery", "trezorDiscovery", "publicKeyStore", "hardwareWalletSigningRequestsAtom", "wallet", "walletAccountsAtom", "walletAccounts"];
|
|
62
|
+
readonly dependencies: readonly ["assetsModule", "logger", "ledgerDiscovery", "trezorDiscovery", "publicKeyStore", "hardwareWalletSigningRequestsAtom", "wallet", "walletAccountsAtom", "walletAccounts", "enabledAssets", "availableAssetNamesAtom"];
|
|
59
63
|
readonly public: true;
|
|
60
64
|
};
|
|
61
65
|
export default hardwareWalletsModuleDefinition;
|
|
@@ -16,6 +16,8 @@ export class HardwareWallets {
|
|
|
16
16
|
#wallet;
|
|
17
17
|
#walletAccountsAtom;
|
|
18
18
|
#walletAccounts;
|
|
19
|
+
#enabledAssets;
|
|
20
|
+
#availableAssetNamesAtom;
|
|
19
21
|
#syncedKeysMap = new Map();
|
|
20
22
|
#signingRequest;
|
|
21
23
|
#isRetrying = false;
|
|
@@ -29,7 +31,7 @@ export class HardwareWallets {
|
|
|
29
31
|
}
|
|
30
32
|
return device;
|
|
31
33
|
};
|
|
32
|
-
constructor({ assetsModule, ledgerDiscovery, trezorDiscovery, logger, hardwareWalletSigningRequestsAtom, publicKeyStore, wallet, walletAccountsAtom, walletAccounts, }) {
|
|
34
|
+
constructor({ assetsModule, ledgerDiscovery, trezorDiscovery, logger, hardwareWalletSigningRequestsAtom, publicKeyStore, wallet, walletAccountsAtom, walletAccounts, enabledAssets, availableAssetNamesAtom, }) {
|
|
33
35
|
this.#assetsModule = assetsModule;
|
|
34
36
|
this.#ledgerDiscovery = ledgerDiscovery;
|
|
35
37
|
this.#trezorDiscovery = trezorDiscovery;
|
|
@@ -39,6 +41,8 @@ export class HardwareWallets {
|
|
|
39
41
|
this.#wallet = wallet;
|
|
40
42
|
this.#walletAccountsAtom = walletAccountsAtom;
|
|
41
43
|
this.#walletAccounts = walletAccounts;
|
|
44
|
+
this.#enabledAssets = enabledAssets;
|
|
45
|
+
this.#availableAssetNamesAtom = availableAssetNamesAtom;
|
|
42
46
|
}
|
|
43
47
|
#listTrezorDevicesOrEmpty = async () => {
|
|
44
48
|
try {
|
|
@@ -204,7 +208,7 @@ export class HardwareWallets {
|
|
|
204
208
|
walletAccount,
|
|
205
209
|
});
|
|
206
210
|
};
|
|
207
|
-
signMessage = async ({ assetName, derivationPath, message }) => {
|
|
211
|
+
signMessage = async ({ assetName, derivationPath, message, walletAccount, }) => {
|
|
208
212
|
const baseAssetName = this.#assetsModule.getAsset(assetName).baseAsset.name;
|
|
209
213
|
const sign = async ({ device }) => {
|
|
210
214
|
return device.signMessage({
|
|
@@ -213,7 +217,7 @@ export class HardwareWallets {
|
|
|
213
217
|
message,
|
|
214
218
|
});
|
|
215
219
|
};
|
|
216
|
-
return this.#signGeneric({ baseAssetName, scenario: 'signMessage', sign });
|
|
220
|
+
return this.#signGeneric({ baseAssetName, scenario: 'signMessage', sign, walletAccount });
|
|
217
221
|
};
|
|
218
222
|
isDeviceConnected = async () => {
|
|
219
223
|
try {
|
|
@@ -417,6 +421,9 @@ export class HardwareWallets {
|
|
|
417
421
|
const { xpub, publicKey } = keys;
|
|
418
422
|
await this.#publicKeyStore.add({ walletAccount, keyIdentifier, xpub, publicKey });
|
|
419
423
|
}
|
|
424
|
+
const availableAssetNames = await this.#availableAssetNamesAtom.get();
|
|
425
|
+
const assetNamesToEnable = [...assetNames].filter((assetName) => availableAssetNames.includes(assetName));
|
|
426
|
+
await this.#enabledAssets.enable(assetNamesToEnable);
|
|
420
427
|
this.events.emit('syncAssets', { assetNames });
|
|
421
428
|
};
|
|
422
429
|
create = async ({ syncedKeysId, isMultisig }) => {
|
|
@@ -451,10 +458,10 @@ export class HardwareWallets {
|
|
|
451
458
|
const trezorDevice = this.#requireTrezorDevice(device);
|
|
452
459
|
trezorDevice.setPassphraseMode(enabled ? 'hidden' : 'standard');
|
|
453
460
|
};
|
|
454
|
-
requireDeviceFor = async (
|
|
461
|
+
requireDeviceFor = async (walletAccount) => {
|
|
455
462
|
return {
|
|
456
|
-
signTransaction: this.signTransaction,
|
|
457
|
-
signMessage: this.signMessage,
|
|
463
|
+
signTransaction: ({ baseAssetName, unsignedTx, multisigData, }) => this.signTransaction({ baseAssetName, unsignedTx, multisigData, walletAccount }),
|
|
464
|
+
signMessage: ({ assetName, derivationPath, message, }) => this.signMessage({ assetName, derivationPath, message, walletAccount }),
|
|
458
465
|
};
|
|
459
466
|
};
|
|
460
467
|
}
|
|
@@ -473,6 +480,8 @@ const hardwareWalletsModuleDefinition = {
|
|
|
473
480
|
'wallet',
|
|
474
481
|
'walletAccountsAtom',
|
|
475
482
|
'walletAccounts',
|
|
483
|
+
'enabledAssets',
|
|
484
|
+
'availableAssetNamesAtom',
|
|
476
485
|
],
|
|
477
486
|
public: true,
|
|
478
487
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { WalletAccount } from '@exodus/models';
|
|
2
|
-
import type { HardwareWalletDeviceModels, HardwareWalletDevice, HardwareWalletManufacturer, MultisigData, SignMessageParams } from '@exodus/hw-common';
|
|
2
|
+
import type { HardwareWalletDeviceModels, HardwareWalletDevice, HardwareWalletManufacturer, MultisigData, SignMessageParams as HwSignMessageParams } from '@exodus/hw-common';
|
|
3
3
|
import type KeyIdentifier from '@exodus/key-identifier';
|
|
4
4
|
export interface HardwareSignerProvider {
|
|
5
5
|
isDeviceConnected: () => Promise<boolean>;
|
|
@@ -11,7 +11,7 @@ export interface HardwareSignerProvider {
|
|
|
11
11
|
addPublicKeysToWalletAccount: ({ walletAccount, syncedKeysId, }: StoreSyncedKeysParams) => Promise<void>;
|
|
12
12
|
create: ({ syncedKeysId, isMultisig }: CreateParams) => Promise<WalletAccount>;
|
|
13
13
|
signTransaction: ({ baseAssetName, unsignedTx, walletAccount, }: SignTransactionParams) => Promise<any>;
|
|
14
|
-
signMessage: ({ assetName, derivationPath, message }: SignMessageParams) => Promise<any>;
|
|
14
|
+
signMessage: ({ assetName, derivationPath, message, walletAccount, }: SignMessageParams) => Promise<any>;
|
|
15
15
|
submitPairingCode: ({ code }: ProcessPairingCodeParams) => Promise<any>;
|
|
16
16
|
setPassphraseMode: ({ enabled }: SetPassphraseModeParams) => Promise<void>;
|
|
17
17
|
}
|
|
@@ -85,7 +85,7 @@ export interface GenericSignParams {
|
|
|
85
85
|
baseAssetName: string;
|
|
86
86
|
scenario: 'signTransaction' | 'signMessage';
|
|
87
87
|
sign: GenericSignCallback;
|
|
88
|
-
walletAccount
|
|
88
|
+
walletAccount: WalletAccount;
|
|
89
89
|
}
|
|
90
90
|
export interface SigningRequestState {
|
|
91
91
|
id: string;
|
|
@@ -96,7 +96,7 @@ export interface SigningRequestState {
|
|
|
96
96
|
export interface SigningRequest {
|
|
97
97
|
id: string;
|
|
98
98
|
baseAssetName?: string;
|
|
99
|
-
walletAccount
|
|
99
|
+
walletAccount: WalletAccount;
|
|
100
100
|
sign: GenericSignCallback;
|
|
101
101
|
resolve: (result: any) => void;
|
|
102
102
|
reject: (error: Error) => void;
|
|
@@ -146,6 +146,9 @@ export type FetchBalanceResult = any | null;
|
|
|
146
146
|
export interface RequireDeviceForParams {
|
|
147
147
|
walletAccount: WalletAccount;
|
|
148
148
|
}
|
|
149
|
+
export interface SignMessageParams extends HwSignMessageParams {
|
|
150
|
+
walletAccount: WalletAccount;
|
|
151
|
+
}
|
|
149
152
|
export interface ProcessPairingCodeParams {
|
|
150
153
|
code: string;
|
|
151
154
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exodus/hardware-wallets",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.2",
|
|
4
4
|
"description": "An Exodus SDK feature that provides a high level abstraction for interacting with hardware wallet devices",
|
|
5
5
|
"author": "Exodus Movement, Inc.",
|
|
6
6
|
"repository": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"@exodus/basic-utils": "^3.2.0",
|
|
33
33
|
"@exodus/bip32": "^4.0.2",
|
|
34
34
|
"@exodus/crypto": "^1.0.0-rc.14",
|
|
35
|
-
"@exodus/hw-common": "^3.4.
|
|
35
|
+
"@exodus/hw-common": "^3.4.1",
|
|
36
36
|
"@exodus/models": "^12.18.0",
|
|
37
37
|
"@exodus/redux-dependency-injection": "^4.0.0",
|
|
38
38
|
"@exodus/wild-emitter": "^1.1.0",
|
|
@@ -53,5 +53,5 @@
|
|
|
53
53
|
"access": "public",
|
|
54
54
|
"provenance": false
|
|
55
55
|
},
|
|
56
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "566a8da5fd2bdc2c0a0029d50937f1ed30362325"
|
|
57
57
|
}
|