@onekeyfe/hwk-ledger-adapter 1.2.6 → 1.2.8-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,10 +1,11 @@
1
1
  import * as _onekeyfe_hwk_adapter_core from '@onekeyfe/hwk-adapter-core';
2
- import { IHardwareWallet, IConnector, TransportType, UiResponseEvent, SearchDevicesOptions, DeviceInfo, Response, ChainCapability, NullableCallArg, IHardwareCallParams, EvmGetAddressParams, EvmAddress, EvmSignTxLedgerParams, EvmSignedTx, EvmSignMsgParams, EvmSignature, EvmSignTypedDataParams, BtcGetAddressParams, BtcAddress, BtcGetPublicKeyParams, BtcPublicKey, BtcSignTxParams, BtcSignedTx, BtcSignPsbtParams, BtcSignedPsbt, BtcSignMsgParams, BtcSignature, IHardwareCommonCallParams, SolGetAddressParams, SolAddress, SolSignTxParams, SolSignedTx, SolSignMsgParams, SolSignature, TronGetAddressParams, TronAddress, TronSignTxParams, TronSignedTx, TronSignMsgParams, TronSignature, DeviceAuthenticityParams, DeviceAuthenticityResult, HardwareEventMap, DeviceEventListener, ChainForFingerprint, DeviceDescriptor, DeviceChangeEvent, ConnectionType, ConnectorDevice, ConnectorSession, ConnectorCallResult, ConnectorEventType, ConnectorEventMap, ConnectorConfig, Failure, HardwareErrorCode } from '@onekeyfe/hwk-adapter-core';
2
+ import { IHardwareWallet, IConnector, TransportType, UiResponseEvent, SearchDevicesOptions, DeviceInfo, DeviceSearchTarget, ConnectionTarget, Response, BindBleDeviceParams, IHardwareConnectionContext, NullableCallArg, IHardwareCallParams, EvmGetAddressParams, EvmAddress, EvmSignTxLedgerParams, EvmSignedTx, EvmSignMsgParams, EvmSignature, EvmSignTypedDataParams, BtcGetAddressParams, BtcAddress, BtcGetPublicKeyParams, BtcPublicKey, BtcSignTxParams, BtcSignedTx, BtcSignPsbtParams, BtcSignedPsbt, BtcSignMsgParams, BtcSignature, IHardwareCommonCallParams, SolGetAddressParams, SolAddress, SolSignTxParams, SolSignedTx, SolSignMsgParams, SolSignature, TronGetAddressParams, TronAddress, TronSignTxParams, TronSignedTx, TronSignMsgParams, TronSignature, ZcashGetFullViewingKeyParams, ZcashFullViewingKey, ZcashGetShieldedAddressParams, ZcashShieldedAddress, DeviceAuthenticityParams, DeviceAuthenticityResult, HardwareEventMap, DeviceEventListener, ChainForFingerprint, DeviceDescriptor, DeviceChangeEvent, ConnectionType, ConnectorDevice, ConnectorSession, ConnectorCallResult, ConnectorEventType, ConnectorEventMap, ConnectorConfig, Failure, HardwareErrorCode, HwkErrorOrigin, HwkRecoveryHint } from '@onekeyfe/hwk-adapter-core';
3
3
  import { DeviceActionState as DeviceActionState$1, DiscoveredDevice, ExecuteDeviceActionReturnType, DeviceManagementKit } from '@ledgerhq/device-management-kit';
4
4
  import { Address, Signature, SignerEth as SignerEth$1, TypedData } from '@ledgerhq/device-signer-kit-ethereum';
5
5
  import { ContextModule } from '@ledgerhq/context-module';
6
6
  import { SignerBtc as SignerBtc$1 } from '@ledgerhq/device-signer-kit-bitcoin';
7
7
  import { SignerSolana } from '@ledgerhq/device-signer-kit-solana';
8
+ import { SignerZcash as SignerZcash$1, FullViewingKeyOptions, GetFullViewingKeyDAOutput, GetShieldedAddressDAOutput } from '@ledgerhq/device-signer-kit-zcash';
8
9
  import Transport from '@ledgerhq/hw-transport';
9
10
 
10
11
  /**
@@ -95,16 +96,34 @@ type LedgerCallParams<T> = NullableCallArg<IHardwareCallParams<T>>;
95
96
  type LedgerCommonParams = NullableCallArg<IHardwareCommonCallParams>;
96
97
  declare class LedgerAdapter implements IHardwareWallet {
97
98
  readonly vendor: "ledger";
99
+ readonly cancelCapability: "stops-waiting";
98
100
  private readonly connector;
99
101
  private readonly emitter;
102
+ private readonly _operations;
100
103
  private _discoveredDevices;
101
104
  private _sessions;
105
+ private readonly _pendingOperationBindings;
106
+ private readonly _pendingPickBindings;
107
+ private readonly _sessionTransports;
108
+ private readonly _selectedBleReconnectTargets;
102
109
  private readonly _uiRegistry;
103
110
  private _btcHighIndexConfirmedThisSession;
104
111
  private readonly _jobQueue;
105
112
  private _deviceAuthenticityQueueTail;
106
113
  private _doConnectAbortController;
114
+ private _connectingConnectId;
107
115
  private readonly _defaultAutoInstallApp;
116
+ private readonly _unsettledConnectorOperations;
117
+ private readonly _connectorIdleWaiters;
118
+ private _resetPromise;
119
+ private _stateGeneration;
120
+ private _connectorTeardownTail;
121
+ private _pendingConnectorTeardowns;
122
+ private _activeConnectionType;
123
+ private _bindingSelectionRequestId;
124
+ private _discardPendingBinding;
125
+ private _finishBleBinding;
126
+ private _isBleConnection;
108
127
  constructor(connector: IConnector, options?: {
109
128
  autoInstallApp?: boolean;
110
129
  });
@@ -118,23 +137,37 @@ declare class LedgerAdapter implements IHardwareWallet {
118
137
  * The next operation will re-discover and re-connect automatically.
119
138
  */
120
139
  resetState(): void;
140
+ private _resetStateAndDisconnectSessions;
121
141
  dispose(): Promise<void>;
122
142
  uiResponse(response: UiResponseEvent): void;
123
143
  searchDevices(options?: SearchDevicesOptions): Promise<DeviceInfo[]>;
144
+ private _searchDevices;
145
+ searchDeviceTargets(options?: SearchDevicesOptions): Promise<DeviceSearchTarget[]>;
146
+ listConnectionTargets(options?: SearchDevicesOptions): Promise<ConnectionTarget[]>;
124
147
  private _evictAllSessions;
125
148
  private static readonly MAX_BUSINESS_RETRY_BUDGET;
126
149
  private static readonly STUCK_APP_RETRY_DELAY_MS;
127
150
  private static readonly MAX_DOCONNECT_CONFIRMS;
128
151
  private _lastCancelReason;
152
+ private readonly _activeOperationJobs;
153
+ private readonly _pendingOperationDisconnects;
129
154
  private static readonly APP_INSTALL_PROGRESS_MIN_DELTA;
130
155
  private _installProgressLastEmittedValue;
131
156
  private _installProgressLastKey;
132
157
  private static _createDeviceBusyError;
133
- connectDevice(connectId: string): Promise<Response<string>>;
134
- disconnectDevice(connectId: string): Promise<void>;
135
- getDeviceInfo(connectId: string, deviceId: string): Promise<Response<DeviceInfo>>;
136
- getSupportedChains(): ChainCapability[];
158
+ connectDevice(searchTargetId: string): Promise<Response<string>>;
159
+ /** Binds the picked BLE device; with a recorded wallet identity it must match first. */
160
+ bindBleDevice(params: BindBleDeviceParams): Promise<Response<string>>;
161
+ acquireOperation(connectId: string, context: IHardwareConnectionContext): Promise<Response<string>>;
162
+ private _createOperation;
163
+ private _connectTarget;
164
+ releaseOperation(operationId: string): Promise<void>;
165
+ private _releaseOperationConnection;
166
+ private _releaseLostOperationConnection;
167
+ getDeviceInfo(connectIdOrOperationId: string, deviceId: string): Promise<Response<DeviceInfo>>;
137
168
  allNetworkGetAddress: (connectId: string, _deviceId: string, params: _onekeyfe_hwk_adapter_core.AllNetworkGetAddressParams) => Promise<Response<_onekeyfe_hwk_adapter_core.AllNetworkAddressResponse[]>>;
169
+ /** A bundle's BLE pick that no item got past the wallet check is not kept. */
170
+ private _dropUncheckedBundlePick;
138
171
  private callChain;
139
172
  private static normalizeCallArgs;
140
173
  private static splitCommonParams;
@@ -157,6 +190,8 @@ declare class LedgerAdapter implements IHardwareWallet {
157
190
  tronGetAddress(connectId?: string | null, deviceId?: string | null, params?: LedgerCallParams<TronGetAddressParams>): Promise<Response<TronAddress>>;
158
191
  tronSignTransaction(connectId?: string | null, deviceId?: string | null, params?: LedgerCallParams<TronSignTxParams>): Promise<Response<TronSignedTx>>;
159
192
  tronSignMessage(connectId?: string | null, deviceId?: string | null, params?: LedgerCallParams<TronSignMsgParams>): Promise<Response<TronSignature>>;
193
+ zcashGetFullViewingKey(connectId?: string | null, deviceId?: string | null, params?: LedgerCallParams<ZcashGetFullViewingKeyParams>): Promise<Response<ZcashFullViewingKey>>;
194
+ zcashGetShieldedAddress(connectId?: string | null, deviceId?: string | null, params?: LedgerCallParams<ZcashGetShieldedAddressParams>): Promise<Response<ZcashShieldedAddress>>;
160
195
  installApp(connectId: string, appName: string): Promise<Response<void>>;
161
196
  listInstalledApps(connectId: string): Promise<Response<AppMetadata[]>>;
162
197
  listInstalledNames(connectId: string): Promise<Response<string[]>>;
@@ -181,11 +216,12 @@ declare class LedgerAdapter implements IHardwareWallet {
181
216
  off<K extends keyof HardwareEventMap>(event: K, listener: (event: HardwareEventMap[K]) => void): void;
182
217
  off(event: string, listener: DeviceEventListener): void;
183
218
  cancel(connectId?: string): void;
219
+ /** A non-empty deviceId is an expected chain fingerprint, not a transport identifier. */
184
220
  getChainFingerprint(connectId: string, deviceId: string, chain: ChainForFingerprint): Promise<Response<string>>;
185
- /**
186
- * Verify fingerprint using an existing sessionId directly.
187
- * Safe to call inside connectorCall without causing queue deadlock.
188
- */
221
+ /** Saves a picked BLE endpoint; `identity` is set when its wallet was just checked. */
222
+ private _saveSelectedBleBinding;
223
+ private _dropSession;
224
+ /** Verify on the acquired session without re-entering the job queue. */
189
225
  private _verifyDeviceFingerprintWithSession;
190
226
  /**
191
227
  * Compute the chain fingerprint via a caller-supplied call strategy.
@@ -207,9 +243,14 @@ declare class LedgerAdapter implements IHardwareWallet {
207
243
  *
208
244
  * - If a session already exists for the given connectId, reuse it.
209
245
  * - If ANY session exists (Ledger IDs are ephemeral), reuse it.
210
- * - Otherwise: search → exactly 1 USB device auto-connects; multiple or none throws.
246
+ * - Otherwise: search → one USB device auto-connects; multiple asks the host to choose.
211
247
  */
212
248
  private _connectingPromise;
249
+ /**
250
+ * Operation owning the running job, so a mid-call UI request can name it.
251
+ * Undefined at cold start when no operation owns the job.
252
+ */
253
+ private _activeOperationId;
213
254
  private _waitForDeviceConnect;
214
255
  /**
215
256
  * Decide whether a BTC pubkey call needs `showOnDevice=true` because of
@@ -250,7 +291,13 @@ declare class LedgerAdapter implements IHardwareWallet {
250
291
  * lives in one place.
251
292
  */
252
293
  private _callConnector;
294
+ private _assertConnectorReady;
295
+ private _runConnectorTeardown;
296
+ private _waitForConnectorOperationsToDrain;
297
+ private _retainConnectorOperation;
253
298
  private connectorCall;
299
+ /** Hermes/RN polyfills don't always populate signal.reason; fall back. */
300
+ private _abortReason;
254
301
  /**
255
302
  * Race a promise against an abort signal. On abort, rejects with
256
303
  * signal.reason → instance _lastCancelReason → generic Error('Aborted').
@@ -260,35 +307,10 @@ declare class LedgerAdapter implements IHardwareWallet {
260
307
  private static _throwIfAborted;
261
308
  /** Actual work done under the job queue — connection, fingerprint, call, and recovery. */
262
309
  private _runConnectorCall;
263
- /**
264
- * Stuck-app recovery: pause for the device's UI transition, then retry once.
265
- *
266
- * Caller has already cleared the session + reset connector. We wait so Stax
267
- * finishes its post-CloseApp animation, then go through ensureConnected +
268
- * fingerprint check + call exactly once. Caller decides what to do on a
269
- * second stuck-app hit.
270
- */
271
- private _retryAfterStuckApp;
272
310
  private _sleepAbortable;
273
311
  /**
274
- * Clear stale session, reconnect, and retry the call.
275
- *
276
- * Timeout recovery starts with a full connector reset. After an APDU
277
- * timeout, DMK/transport state may still emit malformed responses; retrying
278
- * on the same DMK can poison the next chain switch.
279
- */
280
- private _retryWithFreshConnection;
281
- /**
282
- * Ensure OS-level device permission (Bluetooth / USB) before proceeding.
283
- *
284
- * Emits `REQUEST_DEVICE_PERMISSION` and awaits the consumer's
285
- * `RECEIVE_DEVICE_PERMISSION` reply (60s budget covers "probe → system
286
- * prompt → user tap" plus a generous margin). If the consumer never wires
287
- * a handler or never replies, the wait times out and the operation fails
288
- * fast so scanners/callers don't hang silently.
289
- *
290
- * - No connectId (searchDevices): environment-level permission
291
- * - With connectId (business methods): device-level permission
312
+ * Ensure OS-level Bluetooth/USB permission; times out after 60s if the host never
313
+ * replies. Without connectId the request is environment-level, else device-level.
292
314
  */
293
315
  private _ensureDevicePermission;
294
316
  /**
@@ -498,6 +520,11 @@ declare class LedgerConnectorBase implements IConnector {
498
520
  private _getSignerManager;
499
521
  private _getDeviceAppsManager;
500
522
  private _invalidateSession;
523
+ /**
524
+ * Fire the canceller so DMK closes the secure-channel WebSocket. The DMK device
525
+ * session is kept: unlock/retry recovery reuses it.
526
+ */
527
+ private _teardownSecureChannelSession;
501
528
  /**
502
529
  * Replace an old session with a new one after app switch.
503
530
  * Emits device-connect so the adapter updates its _sessions Map.
@@ -654,6 +681,25 @@ declare class SignerSol {
654
681
  }>;
655
682
  }
656
683
 
684
+ /**
685
+ * Wraps Ledger's Zcash SDK signer (Observable-based DeviceActions) into a
686
+ * simple async interface. Only the viewing-key and shielded-address reads are
687
+ * exposed; PCZT signing goes through a different host-side pipeline.
688
+ */
689
+ declare class SignerZcash {
690
+ private readonly _sdk;
691
+ onInteraction?: (interaction: string) => void;
692
+ onRegisterCanceller?: (cancel: (reason?: CancelReason) => void) => void;
693
+ constructor(_sdk: SignerZcash$1);
694
+ /** GET_VK: UFVK string (default) or raw 96-byte Orchard FVK. */
695
+ getFullViewingKey(derivationPath: string, options?: FullViewingKeyOptions): Promise<GetFullViewingKeyDAOutput>;
696
+ /** GET_SHIELDED_ADDRESS: single-Orchard-receiver UA for a 5-level transparent path. */
697
+ getShieldedAddress(derivationPath: string, options?: {
698
+ checkOnDevice?: boolean;
699
+ skipOpenApp?: boolean;
700
+ }): Promise<GetShieldedAddressDAOutput>;
701
+ }
702
+
657
703
  /**
658
704
  * Transport adapter that bridges Ledger's legacy hw-app-* SDKs to DMK's sendApdu.
659
705
  *
@@ -737,7 +783,7 @@ interface WrapErrorOptions {
737
783
  /** Fallback when err has no `appName` (DMK signer errors don't carry it). */
738
784
  defaultAppName?: string;
739
785
  }
740
- declare function ledgerFailure(code: HardwareErrorCode, error: string, appName?: string, tag?: string, params?: Record<string, unknown>): LedgerFailure;
786
+ declare function ledgerFailure(code: HardwareErrorCode, error: string, appName?: string, tag?: string, params?: Record<string, unknown>, origin?: HwkErrorOrigin, recovery?: HwkRecoveryHint): LedgerFailure;
741
787
  declare function isDeviceLockedError(err: unknown): boolean;
742
788
  /**
743
789
  * Map a Ledger DMK error to a HardwareErrorCode and human-readable message.
@@ -747,6 +793,7 @@ declare function isDeviceLockedError(err: unknown): boolean;
747
793
  declare function mapLedgerError(err: unknown, opts?: WrapErrorOptions): {
748
794
  code: HardwareErrorCode;
749
795
  message: string;
796
+ origin?: HwkErrorOrigin;
750
797
  appName?: string;
751
798
  };
752
799
 
@@ -782,4 +829,4 @@ declare function isLedgerDmkBleTransport(transport?: string): boolean;
782
829
  declare function isLedgerBleConnectionType(connectionType?: ConnectionType): boolean;
783
830
  declare function isLedgerBleDescriptor(connectionType: ConnectionType, descriptor: DeviceDescriptor): boolean;
784
831
 
785
- export { AppManager, type DeviceActionState, type DmkDiscoveredDevice, DmkTransport, LedgerAdapter, LedgerConnectorBase, type LedgerConnectorBaseOptions, LedgerDeviceManager, type LedgerFailure, type SdkEvent, type SdkEventListener, type SdkLogEvent, SignerBtc, type SignerBtcAddress, SignerEth, type SignerEvmAddress, type SignerEvmSignature, SignerManager, SignerSol, type TransportFactory, debugLog, deviceActionToPromise, isDeviceLockedError, isLedgerBleConnectionType, isLedgerBleDescriptor, isLedgerDmkBleTransport, ledgerFailure, mapLedgerError, offSdkEvent, onSdkEvent };
832
+ export { AppManager, type DeviceActionState, type DmkDiscoveredDevice, DmkTransport, LedgerAdapter, LedgerConnectorBase, type LedgerConnectorBaseOptions, LedgerDeviceManager, type LedgerFailure, type SdkEvent, type SdkEventListener, type SdkLogEvent, SignerBtc, type SignerBtcAddress, SignerEth, type SignerEvmAddress, type SignerEvmSignature, SignerManager, SignerSol, SignerZcash, type TransportFactory, debugLog, deviceActionToPromise, isDeviceLockedError, isLedgerBleConnectionType, isLedgerBleDescriptor, isLedgerDmkBleTransport, ledgerFailure, mapLedgerError, offSdkEvent, onSdkEvent };
package/dist/index.d.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  import * as _onekeyfe_hwk_adapter_core from '@onekeyfe/hwk-adapter-core';
2
- import { IHardwareWallet, IConnector, TransportType, UiResponseEvent, SearchDevicesOptions, DeviceInfo, Response, ChainCapability, NullableCallArg, IHardwareCallParams, EvmGetAddressParams, EvmAddress, EvmSignTxLedgerParams, EvmSignedTx, EvmSignMsgParams, EvmSignature, EvmSignTypedDataParams, BtcGetAddressParams, BtcAddress, BtcGetPublicKeyParams, BtcPublicKey, BtcSignTxParams, BtcSignedTx, BtcSignPsbtParams, BtcSignedPsbt, BtcSignMsgParams, BtcSignature, IHardwareCommonCallParams, SolGetAddressParams, SolAddress, SolSignTxParams, SolSignedTx, SolSignMsgParams, SolSignature, TronGetAddressParams, TronAddress, TronSignTxParams, TronSignedTx, TronSignMsgParams, TronSignature, DeviceAuthenticityParams, DeviceAuthenticityResult, HardwareEventMap, DeviceEventListener, ChainForFingerprint, DeviceDescriptor, DeviceChangeEvent, ConnectionType, ConnectorDevice, ConnectorSession, ConnectorCallResult, ConnectorEventType, ConnectorEventMap, ConnectorConfig, Failure, HardwareErrorCode } from '@onekeyfe/hwk-adapter-core';
2
+ import { IHardwareWallet, IConnector, TransportType, UiResponseEvent, SearchDevicesOptions, DeviceInfo, DeviceSearchTarget, ConnectionTarget, Response, BindBleDeviceParams, IHardwareConnectionContext, NullableCallArg, IHardwareCallParams, EvmGetAddressParams, EvmAddress, EvmSignTxLedgerParams, EvmSignedTx, EvmSignMsgParams, EvmSignature, EvmSignTypedDataParams, BtcGetAddressParams, BtcAddress, BtcGetPublicKeyParams, BtcPublicKey, BtcSignTxParams, BtcSignedTx, BtcSignPsbtParams, BtcSignedPsbt, BtcSignMsgParams, BtcSignature, IHardwareCommonCallParams, SolGetAddressParams, SolAddress, SolSignTxParams, SolSignedTx, SolSignMsgParams, SolSignature, TronGetAddressParams, TronAddress, TronSignTxParams, TronSignedTx, TronSignMsgParams, TronSignature, ZcashGetFullViewingKeyParams, ZcashFullViewingKey, ZcashGetShieldedAddressParams, ZcashShieldedAddress, DeviceAuthenticityParams, DeviceAuthenticityResult, HardwareEventMap, DeviceEventListener, ChainForFingerprint, DeviceDescriptor, DeviceChangeEvent, ConnectionType, ConnectorDevice, ConnectorSession, ConnectorCallResult, ConnectorEventType, ConnectorEventMap, ConnectorConfig, Failure, HardwareErrorCode, HwkErrorOrigin, HwkRecoveryHint } from '@onekeyfe/hwk-adapter-core';
3
3
  import { DeviceActionState as DeviceActionState$1, DiscoveredDevice, ExecuteDeviceActionReturnType, DeviceManagementKit } from '@ledgerhq/device-management-kit';
4
4
  import { Address, Signature, SignerEth as SignerEth$1, TypedData } from '@ledgerhq/device-signer-kit-ethereum';
5
5
  import { ContextModule } from '@ledgerhq/context-module';
6
6
  import { SignerBtc as SignerBtc$1 } from '@ledgerhq/device-signer-kit-bitcoin';
7
7
  import { SignerSolana } from '@ledgerhq/device-signer-kit-solana';
8
+ import { SignerZcash as SignerZcash$1, FullViewingKeyOptions, GetFullViewingKeyDAOutput, GetShieldedAddressDAOutput } from '@ledgerhq/device-signer-kit-zcash';
8
9
  import Transport from '@ledgerhq/hw-transport';
9
10
 
10
11
  /**
@@ -95,16 +96,34 @@ type LedgerCallParams<T> = NullableCallArg<IHardwareCallParams<T>>;
95
96
  type LedgerCommonParams = NullableCallArg<IHardwareCommonCallParams>;
96
97
  declare class LedgerAdapter implements IHardwareWallet {
97
98
  readonly vendor: "ledger";
99
+ readonly cancelCapability: "stops-waiting";
98
100
  private readonly connector;
99
101
  private readonly emitter;
102
+ private readonly _operations;
100
103
  private _discoveredDevices;
101
104
  private _sessions;
105
+ private readonly _pendingOperationBindings;
106
+ private readonly _pendingPickBindings;
107
+ private readonly _sessionTransports;
108
+ private readonly _selectedBleReconnectTargets;
102
109
  private readonly _uiRegistry;
103
110
  private _btcHighIndexConfirmedThisSession;
104
111
  private readonly _jobQueue;
105
112
  private _deviceAuthenticityQueueTail;
106
113
  private _doConnectAbortController;
114
+ private _connectingConnectId;
107
115
  private readonly _defaultAutoInstallApp;
116
+ private readonly _unsettledConnectorOperations;
117
+ private readonly _connectorIdleWaiters;
118
+ private _resetPromise;
119
+ private _stateGeneration;
120
+ private _connectorTeardownTail;
121
+ private _pendingConnectorTeardowns;
122
+ private _activeConnectionType;
123
+ private _bindingSelectionRequestId;
124
+ private _discardPendingBinding;
125
+ private _finishBleBinding;
126
+ private _isBleConnection;
108
127
  constructor(connector: IConnector, options?: {
109
128
  autoInstallApp?: boolean;
110
129
  });
@@ -118,23 +137,37 @@ declare class LedgerAdapter implements IHardwareWallet {
118
137
  * The next operation will re-discover and re-connect automatically.
119
138
  */
120
139
  resetState(): void;
140
+ private _resetStateAndDisconnectSessions;
121
141
  dispose(): Promise<void>;
122
142
  uiResponse(response: UiResponseEvent): void;
123
143
  searchDevices(options?: SearchDevicesOptions): Promise<DeviceInfo[]>;
144
+ private _searchDevices;
145
+ searchDeviceTargets(options?: SearchDevicesOptions): Promise<DeviceSearchTarget[]>;
146
+ listConnectionTargets(options?: SearchDevicesOptions): Promise<ConnectionTarget[]>;
124
147
  private _evictAllSessions;
125
148
  private static readonly MAX_BUSINESS_RETRY_BUDGET;
126
149
  private static readonly STUCK_APP_RETRY_DELAY_MS;
127
150
  private static readonly MAX_DOCONNECT_CONFIRMS;
128
151
  private _lastCancelReason;
152
+ private readonly _activeOperationJobs;
153
+ private readonly _pendingOperationDisconnects;
129
154
  private static readonly APP_INSTALL_PROGRESS_MIN_DELTA;
130
155
  private _installProgressLastEmittedValue;
131
156
  private _installProgressLastKey;
132
157
  private static _createDeviceBusyError;
133
- connectDevice(connectId: string): Promise<Response<string>>;
134
- disconnectDevice(connectId: string): Promise<void>;
135
- getDeviceInfo(connectId: string, deviceId: string): Promise<Response<DeviceInfo>>;
136
- getSupportedChains(): ChainCapability[];
158
+ connectDevice(searchTargetId: string): Promise<Response<string>>;
159
+ /** Binds the picked BLE device; with a recorded wallet identity it must match first. */
160
+ bindBleDevice(params: BindBleDeviceParams): Promise<Response<string>>;
161
+ acquireOperation(connectId: string, context: IHardwareConnectionContext): Promise<Response<string>>;
162
+ private _createOperation;
163
+ private _connectTarget;
164
+ releaseOperation(operationId: string): Promise<void>;
165
+ private _releaseOperationConnection;
166
+ private _releaseLostOperationConnection;
167
+ getDeviceInfo(connectIdOrOperationId: string, deviceId: string): Promise<Response<DeviceInfo>>;
137
168
  allNetworkGetAddress: (connectId: string, _deviceId: string, params: _onekeyfe_hwk_adapter_core.AllNetworkGetAddressParams) => Promise<Response<_onekeyfe_hwk_adapter_core.AllNetworkAddressResponse[]>>;
169
+ /** A bundle's BLE pick that no item got past the wallet check is not kept. */
170
+ private _dropUncheckedBundlePick;
138
171
  private callChain;
139
172
  private static normalizeCallArgs;
140
173
  private static splitCommonParams;
@@ -157,6 +190,8 @@ declare class LedgerAdapter implements IHardwareWallet {
157
190
  tronGetAddress(connectId?: string | null, deviceId?: string | null, params?: LedgerCallParams<TronGetAddressParams>): Promise<Response<TronAddress>>;
158
191
  tronSignTransaction(connectId?: string | null, deviceId?: string | null, params?: LedgerCallParams<TronSignTxParams>): Promise<Response<TronSignedTx>>;
159
192
  tronSignMessage(connectId?: string | null, deviceId?: string | null, params?: LedgerCallParams<TronSignMsgParams>): Promise<Response<TronSignature>>;
193
+ zcashGetFullViewingKey(connectId?: string | null, deviceId?: string | null, params?: LedgerCallParams<ZcashGetFullViewingKeyParams>): Promise<Response<ZcashFullViewingKey>>;
194
+ zcashGetShieldedAddress(connectId?: string | null, deviceId?: string | null, params?: LedgerCallParams<ZcashGetShieldedAddressParams>): Promise<Response<ZcashShieldedAddress>>;
160
195
  installApp(connectId: string, appName: string): Promise<Response<void>>;
161
196
  listInstalledApps(connectId: string): Promise<Response<AppMetadata[]>>;
162
197
  listInstalledNames(connectId: string): Promise<Response<string[]>>;
@@ -181,11 +216,12 @@ declare class LedgerAdapter implements IHardwareWallet {
181
216
  off<K extends keyof HardwareEventMap>(event: K, listener: (event: HardwareEventMap[K]) => void): void;
182
217
  off(event: string, listener: DeviceEventListener): void;
183
218
  cancel(connectId?: string): void;
219
+ /** A non-empty deviceId is an expected chain fingerprint, not a transport identifier. */
184
220
  getChainFingerprint(connectId: string, deviceId: string, chain: ChainForFingerprint): Promise<Response<string>>;
185
- /**
186
- * Verify fingerprint using an existing sessionId directly.
187
- * Safe to call inside connectorCall without causing queue deadlock.
188
- */
221
+ /** Saves a picked BLE endpoint; `identity` is set when its wallet was just checked. */
222
+ private _saveSelectedBleBinding;
223
+ private _dropSession;
224
+ /** Verify on the acquired session without re-entering the job queue. */
189
225
  private _verifyDeviceFingerprintWithSession;
190
226
  /**
191
227
  * Compute the chain fingerprint via a caller-supplied call strategy.
@@ -207,9 +243,14 @@ declare class LedgerAdapter implements IHardwareWallet {
207
243
  *
208
244
  * - If a session already exists for the given connectId, reuse it.
209
245
  * - If ANY session exists (Ledger IDs are ephemeral), reuse it.
210
- * - Otherwise: search → exactly 1 USB device auto-connects; multiple or none throws.
246
+ * - Otherwise: search → one USB device auto-connects; multiple asks the host to choose.
211
247
  */
212
248
  private _connectingPromise;
249
+ /**
250
+ * Operation owning the running job, so a mid-call UI request can name it.
251
+ * Undefined at cold start when no operation owns the job.
252
+ */
253
+ private _activeOperationId;
213
254
  private _waitForDeviceConnect;
214
255
  /**
215
256
  * Decide whether a BTC pubkey call needs `showOnDevice=true` because of
@@ -250,7 +291,13 @@ declare class LedgerAdapter implements IHardwareWallet {
250
291
  * lives in one place.
251
292
  */
252
293
  private _callConnector;
294
+ private _assertConnectorReady;
295
+ private _runConnectorTeardown;
296
+ private _waitForConnectorOperationsToDrain;
297
+ private _retainConnectorOperation;
253
298
  private connectorCall;
299
+ /** Hermes/RN polyfills don't always populate signal.reason; fall back. */
300
+ private _abortReason;
254
301
  /**
255
302
  * Race a promise against an abort signal. On abort, rejects with
256
303
  * signal.reason → instance _lastCancelReason → generic Error('Aborted').
@@ -260,35 +307,10 @@ declare class LedgerAdapter implements IHardwareWallet {
260
307
  private static _throwIfAborted;
261
308
  /** Actual work done under the job queue — connection, fingerprint, call, and recovery. */
262
309
  private _runConnectorCall;
263
- /**
264
- * Stuck-app recovery: pause for the device's UI transition, then retry once.
265
- *
266
- * Caller has already cleared the session + reset connector. We wait so Stax
267
- * finishes its post-CloseApp animation, then go through ensureConnected +
268
- * fingerprint check + call exactly once. Caller decides what to do on a
269
- * second stuck-app hit.
270
- */
271
- private _retryAfterStuckApp;
272
310
  private _sleepAbortable;
273
311
  /**
274
- * Clear stale session, reconnect, and retry the call.
275
- *
276
- * Timeout recovery starts with a full connector reset. After an APDU
277
- * timeout, DMK/transport state may still emit malformed responses; retrying
278
- * on the same DMK can poison the next chain switch.
279
- */
280
- private _retryWithFreshConnection;
281
- /**
282
- * Ensure OS-level device permission (Bluetooth / USB) before proceeding.
283
- *
284
- * Emits `REQUEST_DEVICE_PERMISSION` and awaits the consumer's
285
- * `RECEIVE_DEVICE_PERMISSION` reply (60s budget covers "probe → system
286
- * prompt → user tap" plus a generous margin). If the consumer never wires
287
- * a handler or never replies, the wait times out and the operation fails
288
- * fast so scanners/callers don't hang silently.
289
- *
290
- * - No connectId (searchDevices): environment-level permission
291
- * - With connectId (business methods): device-level permission
312
+ * Ensure OS-level Bluetooth/USB permission; times out after 60s if the host never
313
+ * replies. Without connectId the request is environment-level, else device-level.
292
314
  */
293
315
  private _ensureDevicePermission;
294
316
  /**
@@ -498,6 +520,11 @@ declare class LedgerConnectorBase implements IConnector {
498
520
  private _getSignerManager;
499
521
  private _getDeviceAppsManager;
500
522
  private _invalidateSession;
523
+ /**
524
+ * Fire the canceller so DMK closes the secure-channel WebSocket. The DMK device
525
+ * session is kept: unlock/retry recovery reuses it.
526
+ */
527
+ private _teardownSecureChannelSession;
501
528
  /**
502
529
  * Replace an old session with a new one after app switch.
503
530
  * Emits device-connect so the adapter updates its _sessions Map.
@@ -654,6 +681,25 @@ declare class SignerSol {
654
681
  }>;
655
682
  }
656
683
 
684
+ /**
685
+ * Wraps Ledger's Zcash SDK signer (Observable-based DeviceActions) into a
686
+ * simple async interface. Only the viewing-key and shielded-address reads are
687
+ * exposed; PCZT signing goes through a different host-side pipeline.
688
+ */
689
+ declare class SignerZcash {
690
+ private readonly _sdk;
691
+ onInteraction?: (interaction: string) => void;
692
+ onRegisterCanceller?: (cancel: (reason?: CancelReason) => void) => void;
693
+ constructor(_sdk: SignerZcash$1);
694
+ /** GET_VK: UFVK string (default) or raw 96-byte Orchard FVK. */
695
+ getFullViewingKey(derivationPath: string, options?: FullViewingKeyOptions): Promise<GetFullViewingKeyDAOutput>;
696
+ /** GET_SHIELDED_ADDRESS: single-Orchard-receiver UA for a 5-level transparent path. */
697
+ getShieldedAddress(derivationPath: string, options?: {
698
+ checkOnDevice?: boolean;
699
+ skipOpenApp?: boolean;
700
+ }): Promise<GetShieldedAddressDAOutput>;
701
+ }
702
+
657
703
  /**
658
704
  * Transport adapter that bridges Ledger's legacy hw-app-* SDKs to DMK's sendApdu.
659
705
  *
@@ -737,7 +783,7 @@ interface WrapErrorOptions {
737
783
  /** Fallback when err has no `appName` (DMK signer errors don't carry it). */
738
784
  defaultAppName?: string;
739
785
  }
740
- declare function ledgerFailure(code: HardwareErrorCode, error: string, appName?: string, tag?: string, params?: Record<string, unknown>): LedgerFailure;
786
+ declare function ledgerFailure(code: HardwareErrorCode, error: string, appName?: string, tag?: string, params?: Record<string, unknown>, origin?: HwkErrorOrigin, recovery?: HwkRecoveryHint): LedgerFailure;
741
787
  declare function isDeviceLockedError(err: unknown): boolean;
742
788
  /**
743
789
  * Map a Ledger DMK error to a HardwareErrorCode and human-readable message.
@@ -747,6 +793,7 @@ declare function isDeviceLockedError(err: unknown): boolean;
747
793
  declare function mapLedgerError(err: unknown, opts?: WrapErrorOptions): {
748
794
  code: HardwareErrorCode;
749
795
  message: string;
796
+ origin?: HwkErrorOrigin;
750
797
  appName?: string;
751
798
  };
752
799
 
@@ -782,4 +829,4 @@ declare function isLedgerDmkBleTransport(transport?: string): boolean;
782
829
  declare function isLedgerBleConnectionType(connectionType?: ConnectionType): boolean;
783
830
  declare function isLedgerBleDescriptor(connectionType: ConnectionType, descriptor: DeviceDescriptor): boolean;
784
831
 
785
- export { AppManager, type DeviceActionState, type DmkDiscoveredDevice, DmkTransport, LedgerAdapter, LedgerConnectorBase, type LedgerConnectorBaseOptions, LedgerDeviceManager, type LedgerFailure, type SdkEvent, type SdkEventListener, type SdkLogEvent, SignerBtc, type SignerBtcAddress, SignerEth, type SignerEvmAddress, type SignerEvmSignature, SignerManager, SignerSol, type TransportFactory, debugLog, deviceActionToPromise, isDeviceLockedError, isLedgerBleConnectionType, isLedgerBleDescriptor, isLedgerDmkBleTransport, ledgerFailure, mapLedgerError, offSdkEvent, onSdkEvent };
832
+ export { AppManager, type DeviceActionState, type DmkDiscoveredDevice, DmkTransport, LedgerAdapter, LedgerConnectorBase, type LedgerConnectorBaseOptions, LedgerDeviceManager, type LedgerFailure, type SdkEvent, type SdkEventListener, type SdkLogEvent, SignerBtc, type SignerBtcAddress, SignerEth, type SignerEvmAddress, type SignerEvmSignature, SignerManager, SignerSol, SignerZcash, type TransportFactory, debugLog, deviceActionToPromise, isDeviceLockedError, isLedgerBleConnectionType, isLedgerBleDescriptor, isLedgerDmkBleTransport, ledgerFailure, mapLedgerError, offSdkEvent, onSdkEvent };