@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 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, RequireDeviceForParams, ProcessPairingCodeParams, SigningRequestState, SetPassphraseModeParams } from './interfaces.js';
4
- import type { HardwareWalletDiscovery, HardwareWalletManufacturer, SignMessageParams } from '@exodus/hw-common';
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: ({ walletAccount }: RequireDeviceForParams) => Promise<{
50
- signTransaction: ({ baseAssetName, unsignedTx, walletAccount, multisigData, }: SignTransactionParams) => Promise<any>;
51
- signMessage: ({ assetName, derivationPath, message }: SignMessageParams) => Promise<any>;
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 ({ walletAccount }) => {
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?: 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?: 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.0",
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.0",
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": "43e7fa9467acd5e681d99473eb54d9e790130e04"
56
+ "gitHead": "566a8da5fd2bdc2c0a0029d50937f1ed30362325"
57
57
  }