@bytezhang/hardware-trezor-adapter 0.0.29 → 0.0.30

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,4 +1,4 @@
1
- import { IHardwareWallet, IConnector, TransportType, IUiHandler, DeviceInfo, Response, ChainCapability, HardwareEventMap, DeviceEventListener, ChainForFingerprint, EvmGetAddressParams, EvmAddress, ProgressCallback, EvmGetPublicKeyParams, EvmPublicKey, EvmSignTxParams, EvmSignedTx, EvmSignMsgParams, EvmSignature, EvmSignTypedDataParams, BtcGetAddressParams, BtcAddress, BtcGetPublicKeyParams, BtcPublicKey, BtcSignTxParams, BtcSignedTx, BtcSignMsgParams, BtcSignature, SolGetAddressParams, SolAddress, SolGetPublicKeyParams, SolPublicKey, SolSignTxParams, SolSignedTx, SolSignMsgParams, SolSignature, TronGetAddressParams, TronAddress, TronSignTxParams, TronSignedTx, TronSignMsgParams, TronSignature } from '@bytezhang/hardware-wallet-core';
1
+ import { IHardwareWallet, IConnector, TransportType, IUiHandler, DeviceInfo, Response, ChainCapability, HardwareEventMap, DeviceEventListener, ChainForFingerprint, IEvmMethods, IBtcMethods, ISolMethods, ITronMethods } from '@bytezhang/hardware-wallet-core';
2
2
  import { AbstractProxyClient } from '@bytezhang/hardware-transport-core';
3
3
 
4
4
  /**
@@ -40,29 +40,30 @@ declare class TrezorAdapter implements IHardwareWallet {
40
40
  * Trezor has a persistent device identity, so no address derivation is needed.
41
41
  */
42
42
  getChainFingerprint(connectId: string, deviceId: string, _chain: ChainForFingerprint): Promise<Response<string>>;
43
- evmGetAddress(connectId: string, _deviceId: string, params: EvmGetAddressParams): Promise<Response<EvmAddress>>;
44
- evmGetAddresses(connectId: string, deviceId: string, params: EvmGetAddressParams[], onProgress?: ProgressCallback): Promise<Response<EvmAddress[]>>;
45
- evmGetPublicKey(connectId: string, _deviceId: string, params: EvmGetPublicKeyParams): Promise<Response<EvmPublicKey>>;
46
- evmSignTransaction(connectId: string, _deviceId: string, params: EvmSignTxParams): Promise<Response<EvmSignedTx>>;
47
- evmSignMessage(connectId: string, _deviceId: string, params: EvmSignMsgParams): Promise<Response<EvmSignature>>;
48
- evmSignTypedData(connectId: string, _deviceId: string, params: EvmSignTypedDataParams): Promise<Response<EvmSignature>>;
49
- btcGetAddress(connectId: string, _deviceId: string, params: BtcGetAddressParams): Promise<Response<BtcAddress>>;
50
- btcGetAddresses(connectId: string, deviceId: string, params: BtcGetAddressParams[], onProgress?: ProgressCallback): Promise<Response<BtcAddress[]>>;
51
- btcGetPublicKey(connectId: string, _deviceId: string, params: BtcGetPublicKeyParams): Promise<Response<BtcPublicKey>>;
52
- btcSignTransaction(connectId: string, _deviceId: string, params: BtcSignTxParams): Promise<Response<BtcSignedTx>>;
53
- btcSignMessage(connectId: string, _deviceId: string, params: BtcSignMsgParams): Promise<Response<BtcSignature>>;
54
- btcGetMasterFingerprint(connectId: string, _deviceId: string): Promise<Response<{
55
- masterFingerprint: string;
56
- }>>;
57
- solGetAddress(connectId: string, _deviceId: string, params: SolGetAddressParams): Promise<Response<SolAddress>>;
58
- solGetAddresses(connectId: string, deviceId: string, params: SolGetAddressParams[], onProgress?: ProgressCallback): Promise<Response<SolAddress[]>>;
59
- solGetPublicKey(connectId: string, _deviceId: string, params: SolGetPublicKeyParams): Promise<Response<SolPublicKey>>;
60
- solSignTransaction(connectId: string, _deviceId: string, params: SolSignTxParams): Promise<Response<SolSignedTx>>;
61
- solSignMessage(_connectId: string, _deviceId: string, _params: SolSignMsgParams): Promise<Response<SolSignature>>;
62
- tronGetAddress(_connectId: string, _deviceId: string, _params: TronGetAddressParams): Promise<Response<TronAddress>>;
63
- tronGetAddresses(_connectId: string, _deviceId: string, _params: TronGetAddressParams[], _onProgress?: ProgressCallback): Promise<Response<TronAddress[]>>;
64
- tronSignTransaction(_connectId: string, _deviceId: string, _params: TronSignTxParams): Promise<Response<TronSignedTx>>;
65
- tronSignMessage(_connectId: string, _deviceId: string, _params: TronSignMsgParams): Promise<Response<TronSignature>>;
43
+ private _evmMethods;
44
+ private _btcMethods;
45
+ private _solMethods;
46
+ evm(): IEvmMethods | null;
47
+ btc(): IBtcMethods | null;
48
+ sol(): ISolMethods | null;
49
+ tron(): ITronMethods | null;
50
+ private _evmGetAddress;
51
+ private _evmGetAddresses;
52
+ private _evmGetPublicKey;
53
+ private _evmSignTransaction;
54
+ private _evmSignMessage;
55
+ private _evmSignTypedData;
56
+ private _btcGetAddress;
57
+ private _btcGetAddresses;
58
+ private _btcGetPublicKey;
59
+ private _btcSignTransaction;
60
+ private _btcSignMessage;
61
+ private _btcGetMasterFingerprint;
62
+ private _solGetAddress;
63
+ private _solGetAddresses;
64
+ private _solGetPublicKey;
65
+ private _solSignTransaction;
66
+ private _solSignMessage;
66
67
  /**
67
68
  * Call the connector with session resolution.
68
69
  * Looks up sessionId from connectId, falls back to connectId itself.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { IHardwareWallet, IConnector, TransportType, IUiHandler, DeviceInfo, Response, ChainCapability, HardwareEventMap, DeviceEventListener, ChainForFingerprint, EvmGetAddressParams, EvmAddress, ProgressCallback, EvmGetPublicKeyParams, EvmPublicKey, EvmSignTxParams, EvmSignedTx, EvmSignMsgParams, EvmSignature, EvmSignTypedDataParams, BtcGetAddressParams, BtcAddress, BtcGetPublicKeyParams, BtcPublicKey, BtcSignTxParams, BtcSignedTx, BtcSignMsgParams, BtcSignature, SolGetAddressParams, SolAddress, SolGetPublicKeyParams, SolPublicKey, SolSignTxParams, SolSignedTx, SolSignMsgParams, SolSignature, TronGetAddressParams, TronAddress, TronSignTxParams, TronSignedTx, TronSignMsgParams, TronSignature } from '@bytezhang/hardware-wallet-core';
1
+ import { IHardwareWallet, IConnector, TransportType, IUiHandler, DeviceInfo, Response, ChainCapability, HardwareEventMap, DeviceEventListener, ChainForFingerprint, IEvmMethods, IBtcMethods, ISolMethods, ITronMethods } from '@bytezhang/hardware-wallet-core';
2
2
  import { AbstractProxyClient } from '@bytezhang/hardware-transport-core';
3
3
 
4
4
  /**
@@ -40,29 +40,30 @@ declare class TrezorAdapter implements IHardwareWallet {
40
40
  * Trezor has a persistent device identity, so no address derivation is needed.
41
41
  */
42
42
  getChainFingerprint(connectId: string, deviceId: string, _chain: ChainForFingerprint): Promise<Response<string>>;
43
- evmGetAddress(connectId: string, _deviceId: string, params: EvmGetAddressParams): Promise<Response<EvmAddress>>;
44
- evmGetAddresses(connectId: string, deviceId: string, params: EvmGetAddressParams[], onProgress?: ProgressCallback): Promise<Response<EvmAddress[]>>;
45
- evmGetPublicKey(connectId: string, _deviceId: string, params: EvmGetPublicKeyParams): Promise<Response<EvmPublicKey>>;
46
- evmSignTransaction(connectId: string, _deviceId: string, params: EvmSignTxParams): Promise<Response<EvmSignedTx>>;
47
- evmSignMessage(connectId: string, _deviceId: string, params: EvmSignMsgParams): Promise<Response<EvmSignature>>;
48
- evmSignTypedData(connectId: string, _deviceId: string, params: EvmSignTypedDataParams): Promise<Response<EvmSignature>>;
49
- btcGetAddress(connectId: string, _deviceId: string, params: BtcGetAddressParams): Promise<Response<BtcAddress>>;
50
- btcGetAddresses(connectId: string, deviceId: string, params: BtcGetAddressParams[], onProgress?: ProgressCallback): Promise<Response<BtcAddress[]>>;
51
- btcGetPublicKey(connectId: string, _deviceId: string, params: BtcGetPublicKeyParams): Promise<Response<BtcPublicKey>>;
52
- btcSignTransaction(connectId: string, _deviceId: string, params: BtcSignTxParams): Promise<Response<BtcSignedTx>>;
53
- btcSignMessage(connectId: string, _deviceId: string, params: BtcSignMsgParams): Promise<Response<BtcSignature>>;
54
- btcGetMasterFingerprint(connectId: string, _deviceId: string): Promise<Response<{
55
- masterFingerprint: string;
56
- }>>;
57
- solGetAddress(connectId: string, _deviceId: string, params: SolGetAddressParams): Promise<Response<SolAddress>>;
58
- solGetAddresses(connectId: string, deviceId: string, params: SolGetAddressParams[], onProgress?: ProgressCallback): Promise<Response<SolAddress[]>>;
59
- solGetPublicKey(connectId: string, _deviceId: string, params: SolGetPublicKeyParams): Promise<Response<SolPublicKey>>;
60
- solSignTransaction(connectId: string, _deviceId: string, params: SolSignTxParams): Promise<Response<SolSignedTx>>;
61
- solSignMessage(_connectId: string, _deviceId: string, _params: SolSignMsgParams): Promise<Response<SolSignature>>;
62
- tronGetAddress(_connectId: string, _deviceId: string, _params: TronGetAddressParams): Promise<Response<TronAddress>>;
63
- tronGetAddresses(_connectId: string, _deviceId: string, _params: TronGetAddressParams[], _onProgress?: ProgressCallback): Promise<Response<TronAddress[]>>;
64
- tronSignTransaction(_connectId: string, _deviceId: string, _params: TronSignTxParams): Promise<Response<TronSignedTx>>;
65
- tronSignMessage(_connectId: string, _deviceId: string, _params: TronSignMsgParams): Promise<Response<TronSignature>>;
43
+ private _evmMethods;
44
+ private _btcMethods;
45
+ private _solMethods;
46
+ evm(): IEvmMethods | null;
47
+ btc(): IBtcMethods | null;
48
+ sol(): ISolMethods | null;
49
+ tron(): ITronMethods | null;
50
+ private _evmGetAddress;
51
+ private _evmGetAddresses;
52
+ private _evmGetPublicKey;
53
+ private _evmSignTransaction;
54
+ private _evmSignMessage;
55
+ private _evmSignTypedData;
56
+ private _btcGetAddress;
57
+ private _btcGetAddresses;
58
+ private _btcGetPublicKey;
59
+ private _btcSignTransaction;
60
+ private _btcSignMessage;
61
+ private _btcGetMasterFingerprint;
62
+ private _solGetAddress;
63
+ private _solGetAddresses;
64
+ private _solGetPublicKey;
65
+ private _solSignTransaction;
66
+ private _solSignMessage;
66
67
  /**
67
68
  * Call the connector with session resolution.
68
69
  * Looks up sessionId from connectId, falls back to connectId itself.
package/dist/index.js CHANGED
@@ -36,6 +36,30 @@ var TrezorAdapter = class {
36
36
  this._discoveredDevices = /* @__PURE__ */ new Map();
37
37
  // Session tracking: maps connectId -> sessionId
38
38
  this._sessions = /* @__PURE__ */ new Map();
39
+ // ─── Chain capability accessors ────────────────────────────
40
+ this._evmMethods = {
41
+ evmGetAddress: (connectId, deviceId, params) => this._evmGetAddress(connectId, deviceId, params),
42
+ evmGetAddresses: (connectId, deviceId, params, onProgress) => this._evmGetAddresses(connectId, deviceId, params, onProgress),
43
+ evmGetPublicKey: (connectId, deviceId, params) => this._evmGetPublicKey(connectId, deviceId, params),
44
+ evmSignTransaction: (connectId, deviceId, params) => this._evmSignTransaction(connectId, deviceId, params),
45
+ evmSignMessage: (connectId, deviceId, params) => this._evmSignMessage(connectId, deviceId, params),
46
+ evmSignTypedData: (connectId, deviceId, params) => this._evmSignTypedData(connectId, deviceId, params)
47
+ };
48
+ this._btcMethods = {
49
+ btcGetAddress: (connectId, deviceId, params) => this._btcGetAddress(connectId, deviceId, params),
50
+ btcGetAddresses: (connectId, deviceId, params, onProgress) => this._btcGetAddresses(connectId, deviceId, params, onProgress),
51
+ btcGetPublicKey: (connectId, deviceId, params) => this._btcGetPublicKey(connectId, deviceId, params),
52
+ btcSignTransaction: (connectId, deviceId, params) => this._btcSignTransaction(connectId, deviceId, params),
53
+ btcSignMessage: (connectId, deviceId, params) => this._btcSignMessage(connectId, deviceId, params),
54
+ btcGetMasterFingerprint: (connectId, deviceId) => this._btcGetMasterFingerprint(connectId, deviceId)
55
+ };
56
+ this._solMethods = {
57
+ solGetAddress: (connectId, deviceId, params) => this._solGetAddress(connectId, deviceId, params),
58
+ solGetAddresses: (connectId, deviceId, params, onProgress) => this._solGetAddresses(connectId, deviceId, params, onProgress),
59
+ solGetPublicKey: (connectId, deviceId, params) => this._solGetPublicKey(connectId, deviceId, params),
60
+ solSignTransaction: (connectId, deviceId, params) => this._solSignTransaction(connectId, deviceId, params),
61
+ solSignMessage: (connectId, deviceId, params) => this._solSignMessage(connectId, deviceId, params)
62
+ };
39
63
  // ─── Event translation ────────────────────────────────────
40
64
  this.deviceConnectHandler = (data) => {
41
65
  const deviceInfo = this.connectorDeviceToDeviceInfo(data.device);
@@ -171,8 +195,20 @@ var TrezorAdapter = class {
171
195
  "Could not determine Trezor device identity. Ensure the device is connected."
172
196
  );
173
197
  }
174
- // ─── EVM methods ──────────────────────────────────────────
175
- async evmGetAddress(connectId, _deviceId, params) {
198
+ evm() {
199
+ return this._evmMethods;
200
+ }
201
+ btc() {
202
+ return this._btcMethods;
203
+ }
204
+ sol() {
205
+ return this._solMethods;
206
+ }
207
+ tron() {
208
+ return null;
209
+ }
210
+ // ─── EVM methods (private) ────────────────────────────────
211
+ async _evmGetAddress(connectId, _deviceId, params) {
176
212
  await this._ensureDevicePermission(connectId, _deviceId);
177
213
  try {
178
214
  const result = await this.connectorCall(connectId, "evmGetAddress", {
@@ -188,14 +224,14 @@ var TrezorAdapter = class {
188
224
  return this.errorToFailure(err);
189
225
  }
190
226
  }
191
- async evmGetAddresses(connectId, deviceId, params, onProgress) {
227
+ async _evmGetAddresses(connectId, deviceId, params, onProgress) {
192
228
  return this.batchCall(
193
229
  params,
194
- (p) => this.evmGetAddress(connectId, deviceId, p),
230
+ (p) => this._evmGetAddress(connectId, deviceId, p),
195
231
  onProgress
196
232
  );
197
233
  }
198
- async evmGetPublicKey(connectId, _deviceId, params) {
234
+ async _evmGetPublicKey(connectId, _deviceId, params) {
199
235
  await this._ensureDevicePermission(connectId, _deviceId);
200
236
  try {
201
237
  const result = await this.connectorCall(connectId, "evmGetPublicKey", {
@@ -210,7 +246,7 @@ var TrezorAdapter = class {
210
246
  return this.errorToFailure(err);
211
247
  }
212
248
  }
213
- async evmSignTransaction(connectId, _deviceId, params) {
249
+ async _evmSignTransaction(connectId, _deviceId, params) {
214
250
  await this._ensureDevicePermission(connectId, _deviceId);
215
251
  try {
216
252
  const result = await this.connectorCall(connectId, "evmSignTransaction", {
@@ -238,7 +274,7 @@ var TrezorAdapter = class {
238
274
  return this.errorToFailure(err);
239
275
  }
240
276
  }
241
- async evmSignMessage(connectId, _deviceId, params) {
277
+ async _evmSignMessage(connectId, _deviceId, params) {
242
278
  await this._ensureDevicePermission(connectId, _deviceId);
243
279
  try {
244
280
  const result = await this.connectorCall(connectId, "evmSignMessage", {
@@ -254,7 +290,7 @@ var TrezorAdapter = class {
254
290
  return this.errorToFailure(err);
255
291
  }
256
292
  }
257
- async evmSignTypedData(connectId, _deviceId, params) {
293
+ async _evmSignTypedData(connectId, _deviceId, params) {
258
294
  await this._ensureDevicePermission(connectId, _deviceId);
259
295
  try {
260
296
  const callParams = {
@@ -278,8 +314,8 @@ var TrezorAdapter = class {
278
314
  return this.errorToFailure(err);
279
315
  }
280
316
  }
281
- // ─── BTC methods ──────────────────────────────────────────
282
- async btcGetAddress(connectId, _deviceId, params) {
317
+ // ─── BTC methods (private) ─────────────────────────────────
318
+ async _btcGetAddress(connectId, _deviceId, params) {
283
319
  await this._ensureDevicePermission(connectId, _deviceId);
284
320
  try {
285
321
  const result = await this.connectorCall(connectId, "btcGetAddress", {
@@ -296,14 +332,14 @@ var TrezorAdapter = class {
296
332
  return this.errorToFailure(err);
297
333
  }
298
334
  }
299
- async btcGetAddresses(connectId, deviceId, params, onProgress) {
335
+ async _btcGetAddresses(connectId, deviceId, params, onProgress) {
300
336
  return this.batchCall(
301
337
  params,
302
- (p) => this.btcGetAddress(connectId, deviceId, p),
338
+ (p) => this._btcGetAddress(connectId, deviceId, p),
303
339
  onProgress
304
340
  );
305
341
  }
306
- async btcGetPublicKey(connectId, _deviceId, params) {
342
+ async _btcGetPublicKey(connectId, _deviceId, params) {
307
343
  await this._ensureDevicePermission(connectId, _deviceId);
308
344
  try {
309
345
  const result = await this.connectorCall(connectId, "btcGetPublicKey", {
@@ -323,7 +359,7 @@ var TrezorAdapter = class {
323
359
  return this.errorToFailure(err);
324
360
  }
325
361
  }
326
- async btcSignTransaction(connectId, _deviceId, params) {
362
+ async _btcSignTransaction(connectId, _deviceId, params) {
327
363
  await this._ensureDevicePermission(connectId, _deviceId);
328
364
  try {
329
365
  const result = await this.connectorCall(connectId, "btcSignTransaction", {
@@ -343,7 +379,7 @@ var TrezorAdapter = class {
343
379
  return this.errorToFailure(err);
344
380
  }
345
381
  }
346
- async btcSignMessage(connectId, _deviceId, params) {
382
+ async _btcSignMessage(connectId, _deviceId, params) {
347
383
  await this._ensureDevicePermission(connectId, _deviceId);
348
384
  try {
349
385
  const result = await this.connectorCall(connectId, "btcSignMessage", {
@@ -359,7 +395,7 @@ var TrezorAdapter = class {
359
395
  return this.errorToFailure(err);
360
396
  }
361
397
  }
362
- async btcGetMasterFingerprint(connectId, _deviceId) {
398
+ async _btcGetMasterFingerprint(connectId, _deviceId) {
363
399
  await this._ensureDevicePermission(connectId, _deviceId);
364
400
  try {
365
401
  const result = await this.connectorCall(connectId, "btcGetPublicKey", {
@@ -372,8 +408,8 @@ var TrezorAdapter = class {
372
408
  return this.errorToFailure(err);
373
409
  }
374
410
  }
375
- // ─── Solana methods ───────────────────────────────────────
376
- async solGetAddress(connectId, _deviceId, params) {
411
+ // ─── Solana methods (private) ──────────────────────────────
412
+ async _solGetAddress(connectId, _deviceId, params) {
377
413
  await this._ensureDevicePermission(connectId, _deviceId);
378
414
  try {
379
415
  const result = await this.connectorCall(connectId, "solGetAddress", {
@@ -388,14 +424,14 @@ var TrezorAdapter = class {
388
424
  return this.errorToFailure(err);
389
425
  }
390
426
  }
391
- async solGetAddresses(connectId, deviceId, params, onProgress) {
427
+ async _solGetAddresses(connectId, deviceId, params, onProgress) {
392
428
  return this.batchCall(
393
429
  params,
394
- (p) => this.solGetAddress(connectId, deviceId, p),
430
+ (p) => this._solGetAddress(connectId, deviceId, p),
395
431
  onProgress
396
432
  );
397
433
  }
398
- async solGetPublicKey(connectId, _deviceId, params) {
434
+ async _solGetPublicKey(connectId, _deviceId, params) {
399
435
  await this._ensureDevicePermission(connectId, _deviceId);
400
436
  try {
401
437
  const result = await this.connectorCall(connectId, "solGetAddress", {
@@ -410,7 +446,7 @@ var TrezorAdapter = class {
410
446
  return this.errorToFailure(err);
411
447
  }
412
448
  }
413
- async solSignTransaction(connectId, _deviceId, params) {
449
+ async _solSignTransaction(connectId, _deviceId, params) {
414
450
  await this._ensureDevicePermission(connectId, _deviceId);
415
451
  try {
416
452
  const result = await this.connectorCall(connectId, "solSignTransaction", {
@@ -425,38 +461,12 @@ var TrezorAdapter = class {
425
461
  return this.errorToFailure(err);
426
462
  }
427
463
  }
428
- async solSignMessage(_connectId, _deviceId, _params) {
464
+ async _solSignMessage(_connectId, _deviceId, _params) {
429
465
  return (0, import_hardware_wallet_core.failure)(
430
466
  import_hardware_wallet_core.HardwareErrorCode.MethodNotSupported,
431
467
  "Solana signMessage is not supported by Trezor Connect"
432
468
  );
433
469
  }
434
- // ─── TRON methods ─────────────────────────────────────────
435
- // TRON is not supported by Trezor. All methods return MethodNotSupported.
436
- async tronGetAddress(_connectId, _deviceId, _params) {
437
- return (0, import_hardware_wallet_core.failure)(
438
- import_hardware_wallet_core.HardwareErrorCode.MethodNotSupported,
439
- "TRON is not supported by Trezor"
440
- );
441
- }
442
- async tronGetAddresses(_connectId, _deviceId, _params, _onProgress) {
443
- return (0, import_hardware_wallet_core.failure)(
444
- import_hardware_wallet_core.HardwareErrorCode.MethodNotSupported,
445
- "TRON is not supported by Trezor"
446
- );
447
- }
448
- async tronSignTransaction(_connectId, _deviceId, _params) {
449
- return (0, import_hardware_wallet_core.failure)(
450
- import_hardware_wallet_core.HardwareErrorCode.MethodNotSupported,
451
- "TRON is not supported by Trezor"
452
- );
453
- }
454
- async tronSignMessage(_connectId, _deviceId, _params) {
455
- return (0, import_hardware_wallet_core.failure)(
456
- import_hardware_wallet_core.HardwareErrorCode.MethodNotSupported,
457
- "TRON is not supported by Trezor"
458
- );
459
- }
460
470
  // ─── Private helpers ──────────────────────────────────────
461
471
  /**
462
472
  * Call the connector with session resolution.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/TrezorAdapter.ts","../src/TrezorProxyClient.ts"],"sourcesContent":["export { TrezorAdapter } from './TrezorAdapter';\nexport type { ConnectorCallError } from './types';\n\n// Legacy exports for backward compatibility.\n// These are used by trezor-transport-ext and trezor-transport-electron\n// which still extend TrezorProxyClient. They are NOT used by TrezorAdapter.\nexport { TrezorProxyClient } from './TrezorProxyClient';\nexport type { ITrezorConnect, TrezorConnectResponse } from './types';\n","import {\n type IHardwareWallet,\n type IUiHandler,\n type IConnector,\n type ConnectorDevice,\n type ChainCapability,\n type DeviceEventListener,\n type ConnectionType,\n type DeviceInfo,\n type TransportType,\n type Response,\n type EvmGetAddressParams,\n type EvmAddress,\n type EvmGetPublicKeyParams,\n type EvmPublicKey,\n type EvmSignTxParams,\n type EvmSignedTx,\n type EvmSignMsgParams,\n type EvmSignTypedDataParams,\n type EvmSignature,\n type ProgressCallback,\n type BtcGetAddressParams,\n type BtcAddress,\n type BtcGetPublicKeyParams,\n type BtcPublicKey,\n type BtcSignTxParams,\n type BtcSignedTx,\n type BtcSignMsgParams,\n type BtcSignature,\n type SolGetAddressParams,\n type SolAddress,\n type SolGetPublicKeyParams,\n type SolPublicKey,\n type SolSignTxParams,\n type SolSignedTx,\n type SolSignMsgParams,\n type SolSignature,\n type TronGetAddressParams,\n type TronAddress,\n type TronSignTxParams,\n type TronSignedTx,\n type TronSignMsgParams,\n type TronSignature,\n type HardwareEventMap,\n type ChainForFingerprint,\n HardwareErrorCode,\n success,\n failure,\n DEVICE,\n UI_REQUEST,\n TypedEventEmitter,\n} from '@bytezhang/hardware-wallet-core';\n\n/**\n * Trezor hardware wallet adapter that delegates to an IConnector.\n *\n * This is a thin translation layer that:\n * - Accepts a pre-configured IConnector (transport decisions are made at connector creation time)\n * - Translates IHardwareWallet method calls to connector.call() invocations\n * - Maps connector results/errors to our Response<T> format with enriched error messages\n * - Translates connector events to HardwareEventMap events\n * - Integrates with IUiHandler for interactive flows (PIN, passphrase)\n */\nexport class TrezorAdapter implements IHardwareWallet {\n readonly vendor = 'trezor' as const;\n\n private readonly connector: IConnector;\n private readonly emitter = new TypedEventEmitter<HardwareEventMap>();\n\n private _uiHandler: Partial<IUiHandler> | null = null;\n\n // Device cache: tracks discovered devices from connector events\n private _discoveredDevices = new Map<string, DeviceInfo>();\n\n // Session tracking: maps connectId -> sessionId\n private _sessions = new Map<string, string>();\n\n constructor(connector: IConnector) {\n this.connector = connector;\n this.registerEventListeners();\n }\n\n // ─── Transport ──────────────────────────────────────────\n // Transport is decided at connector creation time. These methods\n // satisfy the IHardwareWallet interface with sensible defaults.\n\n get activeTransport(): TransportType | null {\n return 'usb';\n }\n\n getAvailableTransports(): TransportType[] {\n return ['usb'];\n }\n\n async switchTransport(_type: TransportType): Promise<void> {\n // Transport is fixed at connector creation time.\n // To switch transport, create a new TrezorAdapter with a different connector.\n }\n\n // ─── UI handler ────────────────────────────────────────────\n\n setUiHandler(handler: Partial<IUiHandler>): void {\n this._uiHandler = handler;\n }\n\n // ─── Lifecycle ────────────────────────────────────────────\n\n async init(_config?: unknown): Promise<void> {\n // Connector is injected via constructor, already initialized.\n // Nothing to do here.\n }\n\n async dispose(): Promise<void> {\n this.unregisterEventListeners();\n this.connector.reset();\n this._uiHandler = null;\n this._discoveredDevices.clear();\n this._sessions.clear();\n this.emitter.removeAllListeners();\n }\n\n // ─── Device management ────────────────────────────────────\n\n async searchDevices(): Promise<DeviceInfo[]> {\n await this._ensureDevicePermission();\n\n const devices = await this.connector.searchDevices();\n\n for (const d of devices) {\n if (d.connectId && !this._discoveredDevices.has(d.connectId)) {\n this._discoveredDevices.set(d.connectId, this.connectorDeviceToDeviceInfo(d));\n }\n }\n\n // If no devices found, ensure permission (no connectId = search context)\n if (this._discoveredDevices.size === 0) {\n await this._ensureDevicePermission();\n }\n\n return Array.from(this._discoveredDevices.values());\n }\n\n async connectDevice(connectId: string): Promise<Response<string>> {\n try {\n const session = await this.connector.connect(connectId);\n this._sessions.set(connectId, session.sessionId);\n\n // Update device cache with richer info from session\n if (session.deviceInfo) {\n this._discoveredDevices.set(connectId, session.deviceInfo);\n }\n\n return success(connectId);\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async disconnectDevice(connectId: string): Promise<void> {\n const sessionId = this._sessions.get(connectId);\n if (sessionId) {\n await this.connector.disconnect(sessionId);\n this._sessions.delete(connectId);\n }\n }\n\n async getDeviceInfo(\n connectId: string,\n deviceId: string,\n ): Promise<Response<DeviceInfo>> {\n await this._ensureDevicePermission(connectId, deviceId);\n\n // Look up the device in the cache populated by event handlers / searchDevices.\n // Try connectId first (the USB path), then fall back to scanning by deviceId.\n const cached =\n this._discoveredDevices.get(connectId) ??\n Array.from(this._discoveredDevices.values()).find(\n (d) => d.deviceId === deviceId,\n );\n\n if (cached) {\n return success(cached);\n }\n\n return failure(\n HardwareErrorCode.DeviceNotFound,\n 'Device not found in cache. Call searchDevices() or wait for a device-connected event first.',\n );\n }\n\n getSupportedChains(): ChainCapability[] {\n return ['evm', 'btc', 'sol'];\n }\n\n // ─── Event handling ───────────────────────────────────────\n\n on<K extends keyof HardwareEventMap>(event: K, listener: (event: HardwareEventMap[K]) => void): void;\n on(event: string, listener: DeviceEventListener): void;\n on(event: string, listener: (event: any) => void): void {\n this.emitter.on(event, listener);\n }\n\n off<K extends keyof HardwareEventMap>(event: K, listener: (event: HardwareEventMap[K]) => void): void;\n off(event: string, listener: DeviceEventListener): void;\n off(event: string, listener: (event: any) => void): void {\n this.emitter.off(event, listener);\n }\n\n cancel(connectId: string): void {\n const sessionId = this._sessions.get(connectId) ?? connectId;\n void this.connector.cancel(sessionId);\n }\n\n // ─── Chain fingerprint ────────────────────────────────────\n\n /**\n * For Trezor, the chain fingerprint is the hardware device_id from firmware.\n * Trezor has a persistent device identity, so no address derivation is needed.\n */\n async getChainFingerprint(\n connectId: string,\n deviceId: string,\n _chain: ChainForFingerprint,\n ): Promise<Response<string>> {\n await this._ensureDevicePermission(connectId, deviceId);\n\n // Look up the device in cache to get the firmware device_id\n const cached =\n this._discoveredDevices.get(connectId) ??\n Array.from(this._discoveredDevices.values()).find(\n (d) => d.deviceId === deviceId,\n );\n\n if (cached?.deviceId) {\n return success(cached.deviceId);\n }\n\n // Fall back: try to get device info from the connector\n try {\n const result = await this.connectorCall(connectId, 'getFeatures', {}) as {\n device_id?: string;\n };\n if (result.device_id) {\n return success(result.device_id);\n }\n } catch {\n // Ignore — fall through to error\n }\n\n return failure(\n HardwareErrorCode.DeviceNotFound,\n 'Could not determine Trezor device identity. Ensure the device is connected.',\n );\n }\n\n // ─── EVM methods ──────────────────────────────────────────\n\n async evmGetAddress(\n connectId: string,\n _deviceId: string,\n params: EvmGetAddressParams,\n ): Promise<Response<EvmAddress>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmGetAddress', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n chainId: params.chainId,\n }) as { address: string; path: string };\n\n return success({\n address: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async evmGetAddresses(\n connectId: string,\n deviceId: string,\n params: EvmGetAddressParams[],\n onProgress?: ProgressCallback,\n ): Promise<Response<EvmAddress[]>> {\n return this.batchCall(\n params,\n (p) => this.evmGetAddress(connectId, deviceId, p),\n onProgress,\n );\n }\n\n async evmGetPublicKey(\n connectId: string,\n _deviceId: string,\n params: EvmGetPublicKeyParams,\n ): Promise<Response<EvmPublicKey>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmGetPublicKey', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n }) as { publicKey: string; path: string };\n\n return success({\n publicKey: result.publicKey,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async evmSignTransaction(\n connectId: string,\n _deviceId: string,\n params: EvmSignTxParams,\n ): Promise<Response<EvmSignedTx>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmSignTransaction', {\n path: params.path,\n transaction: {\n to: params.to,\n value: params.value,\n chainId: params.chainId,\n nonce: params.nonce,\n gasLimit: params.gasLimit,\n gasPrice: params.gasPrice,\n maxFeePerGas: params.maxFeePerGas,\n maxPriorityFeePerGas: params.maxPriorityFeePerGas,\n accessList: params.accessList,\n data: params.data,\n },\n }) as { v: string; r: string; s: string; serializedTx?: string };\n\n return success({\n v: this.ensure0x(result.v),\n r: this.padHex64(result.r),\n s: this.padHex64(result.s),\n serializedTx: result.serializedTx,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async evmSignMessage(\n connectId: string,\n _deviceId: string,\n params: EvmSignMsgParams,\n ): Promise<Response<EvmSignature>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmSignMessage', {\n path: params.path,\n message: params.message,\n hex: params.hex,\n }) as { signature: string; address?: string };\n\n return success({\n signature: this.ensure0x(result.signature),\n address: result.address,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async evmSignTypedData(\n connectId: string,\n _deviceId: string,\n params: EvmSignTypedDataParams,\n ): Promise<Response<EvmSignature>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const callParams: Record<string, unknown> = {\n path: params.path,\n };\n\n if (params.mode !== 'hash') {\n callParams['mode'] = params.mode ?? 'full';\n callParams['data'] = params.data;\n callParams['metamaskV4Compat'] = params.metamaskV4Compat ?? true;\n } else {\n callParams['mode'] = 'hash';\n callParams['domainSeparatorHash'] = params.domainSeparatorHash;\n callParams['messageHash'] = params.messageHash;\n }\n\n const result = await this.connectorCall(connectId, 'evmSignTypedData', callParams) as {\n signature: string;\n address?: string;\n };\n\n return success({\n signature: this.ensure0x(result.signature),\n address: result.address,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n // ─── BTC methods ──────────────────────────────────────────\n\n async btcGetAddress(\n connectId: string,\n _deviceId: string,\n params: BtcGetAddressParams,\n ): Promise<Response<BtcAddress>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcGetAddress', {\n path: params.path,\n coin: params.coin,\n showOnDevice: params.showOnDevice,\n scriptType: params.scriptType,\n }) as { address: string; path: string };\n\n return success({\n address: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async btcGetAddresses(\n connectId: string,\n deviceId: string,\n params: BtcGetAddressParams[],\n onProgress?: ProgressCallback,\n ): Promise<Response<BtcAddress[]>> {\n return this.batchCall(\n params,\n (p) => this.btcGetAddress(connectId, deviceId, p),\n onProgress,\n );\n }\n\n async btcGetPublicKey(\n connectId: string,\n _deviceId: string,\n params: BtcGetPublicKeyParams,\n ): Promise<Response<BtcPublicKey>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcGetPublicKey', {\n path: params.path,\n coin: params.coin,\n showOnDevice: params.showOnDevice,\n }) as {\n xpub: string;\n publicKey: string;\n fingerprint: number;\n chainCode: string;\n path: string;\n depth: number;\n };\n\n return success({\n xpub: result.xpub,\n publicKey: result.publicKey,\n fingerprint: result.fingerprint,\n chainCode: result.chainCode,\n path: params.path,\n depth: result.depth,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async btcSignTransaction(\n connectId: string,\n _deviceId: string,\n params: BtcSignTxParams,\n ): Promise<Response<BtcSignedTx>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcSignTransaction', {\n inputs: params.inputs ?? [],\n outputs: params.outputs ?? [],\n refTxs: params.refTxs,\n coin: params.coin,\n locktime: params.locktime,\n version: params.version,\n }) as { signatures: string[]; serializedTx: string; txid?: string };\n\n return success({\n signatures: result.signatures,\n serializedTx: result.serializedTx,\n txid: result.txid,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async btcSignMessage(\n connectId: string,\n _deviceId: string,\n params: BtcSignMsgParams,\n ): Promise<Response<BtcSignature>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcSignMessage', {\n path: params.path,\n message: params.message,\n coin: params.coin,\n }) as { signature: string; address: string };\n\n return success({\n signature: result.signature,\n address: result.address,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async btcGetMasterFingerprint(\n connectId: string,\n _deviceId: string,\n ): Promise<Response<{ masterFingerprint: string }>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n // The parent fingerprint of a child of \"m\" IS the master fingerprint.\n // Query \"m/0'\" and read its `fingerprint` field (parent key fingerprint).\n const result = await this.connectorCall(connectId, 'btcGetPublicKey', {\n path: \"m/0'\",\n }) as { fingerprint: number };\n\n const fp = (result.fingerprint) >>> 0;\n const hex = fp.toString(16).padStart(8, '0');\n return success({ masterFingerprint: hex });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n // ─── Solana methods ───────────────────────────────────────\n\n async solGetAddress(\n connectId: string,\n _deviceId: string,\n params: SolGetAddressParams,\n ): Promise<Response<SolAddress>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'solGetAddress', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n }) as { address: string; path: string };\n\n return success({\n address: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async solGetAddresses(\n connectId: string,\n deviceId: string,\n params: SolGetAddressParams[],\n onProgress?: ProgressCallback,\n ): Promise<Response<SolAddress[]>> {\n return this.batchCall(\n params,\n (p) => this.solGetAddress(connectId, deviceId, p),\n onProgress,\n );\n }\n\n async solGetPublicKey(\n connectId: string,\n _deviceId: string,\n params: SolGetPublicKeyParams,\n ): Promise<Response<SolPublicKey>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n // Solana address IS the public key\n const result = await this.connectorCall(connectId, 'solGetAddress', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n }) as { address: string; path: string };\n\n return success({\n publicKey: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async solSignTransaction(\n connectId: string,\n _deviceId: string,\n params: SolSignTxParams,\n ): Promise<Response<SolSignedTx>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'solSignTransaction', {\n path: params.path,\n serializedTx: params.serializedTx,\n additionalInfo: params.additionalInfo,\n }) as { signature: string };\n\n return success({\n signature: result.signature,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async solSignMessage(\n _connectId: string,\n _deviceId: string,\n _params: SolSignMsgParams,\n ): Promise<Response<SolSignature>> {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Solana signMessage is not supported by Trezor Connect',\n );\n }\n\n // ─── TRON methods ─────────────────────────────────────────\n // TRON is not supported by Trezor. All methods return MethodNotSupported.\n\n async tronGetAddress(\n _connectId: string,\n _deviceId: string,\n _params: TronGetAddressParams,\n ): Promise<Response<TronAddress>> {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'TRON is not supported by Trezor',\n );\n }\n\n async tronGetAddresses(\n _connectId: string,\n _deviceId: string,\n _params: TronGetAddressParams[],\n _onProgress?: ProgressCallback,\n ): Promise<Response<TronAddress[]>> {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'TRON is not supported by Trezor',\n );\n }\n\n async tronSignTransaction(\n _connectId: string,\n _deviceId: string,\n _params: TronSignTxParams,\n ): Promise<Response<TronSignedTx>> {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'TRON is not supported by Trezor',\n );\n }\n\n async tronSignMessage(\n _connectId: string,\n _deviceId: string,\n _params: TronSignMsgParams,\n ): Promise<Response<TronSignature>> {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'TRON is not supported by Trezor',\n );\n }\n\n // ─── Private helpers ──────────────────────────────────────\n\n /**\n * Call the connector with session resolution.\n * Looks up sessionId from connectId, falls back to connectId itself.\n */\n private async connectorCall(\n connectId: string,\n method: string,\n params: unknown,\n ): Promise<unknown> {\n const sessionId = this._sessions.get(connectId) ?? connectId;\n return this.connector.call(sessionId, method, params);\n }\n\n /**\n * Ensure device permission before proceeding.\n * - No connectId (searchDevices): check environment-level permission\n * - With connectId (business methods): check device-level permission\n * If not granted, calls onDevicePermission so the consumer can request access.\n */\n private async _ensureDevicePermission(connectId?: string, deviceId?: string): Promise<void> {\n const transportType: TransportType = 'usb';\n let granted = false;\n let context: Record<string, unknown> | undefined;\n\n if (this._uiHandler?.checkDevicePermission) {\n try {\n const result = await this._uiHandler.checkDevicePermission({ transportType, connectId, deviceId });\n granted = result.granted;\n context = result.context;\n } catch {\n granted = false;\n }\n }\n\n if (!granted) {\n try {\n await this._uiHandler?.onDevicePermission?.({ transportType, context });\n } catch {\n // UI handler cancelled or failed\n }\n }\n }\n\n /**\n * Convert a thrown error to a Response failure.\n * Parses TrezorConnect error strings to map to HardwareErrorCode values.\n */\n private errorToFailure<T>(err: unknown): Response<T> {\n const message = err instanceof Error ? err.message : String(err);\n const code = this.parseErrorCode(message);\n const enriched = this.enrichErrorMessage(code, message);\n return failure(code, enriched);\n }\n\n /**\n * Parse TrezorConnect error codes from error message strings.\n * The connector throws errors with messages like \"Trezor ethereumGetAddress failed: <error>\".\n * We also check for embedded code patterns.\n */\n private parseErrorCode(message: string): HardwareErrorCode {\n // Check for known error patterns in the message\n if (message.includes('Failure_ActionCancelled') || message.includes('Failure_Cancel')) {\n return HardwareErrorCode.UserRejected;\n }\n if (message.includes('Failure_PinInvalid') || message.includes('Failure_PinMismatch')) {\n return HardwareErrorCode.PinInvalid;\n }\n if (message.includes('Failure_PinCancelled')) {\n return HardwareErrorCode.PinCancelled;\n }\n if (message.includes('Failure_PassphraseRejected')) {\n return HardwareErrorCode.PassphraseRejected;\n }\n if (message.includes('Device_UsedElsewhere')) {\n return HardwareErrorCode.DeviceBusy;\n }\n if (message.includes('Device_NotFound')) {\n return HardwareErrorCode.DeviceNotFound;\n }\n if (message.includes('Device_InvalidState')) {\n return HardwareErrorCode.DeviceNotInitialized;\n }\n if (message.includes('Transport_Missing')) {\n return HardwareErrorCode.TransportNotAvailable;\n }\n if (message.includes('Transport_DeviceDisconnected')) {\n return HardwareErrorCode.DeviceDisconnected;\n }\n if (message.includes('Failure_FirmwareError')) {\n return HardwareErrorCode.FirmwareTooOld;\n }\n if (message.includes('Method_InvalidParameter') || message.includes('Method_InvalidParams')) {\n return HardwareErrorCode.InvalidParams;\n }\n if (message.includes('Method_NotAllowed')) {\n return HardwareErrorCode.MethodNotSupported;\n }\n return HardwareErrorCode.UnknownError;\n }\n\n /**\n * Enrich error messages with actionable recovery info for the caller.\n */\n private enrichErrorMessage(code: HardwareErrorCode, originalMessage: string): string {\n switch (code) {\n case HardwareErrorCode.PinInvalid:\n return `${originalMessage}. Please re-enter your PIN.`;\n case HardwareErrorCode.PinCancelled:\n return `${originalMessage}. PIN entry was cancelled.`;\n case HardwareErrorCode.DeviceBusy:\n return `${originalMessage}. The device is in use by another application. Close other wallet apps and try again.`;\n case HardwareErrorCode.DeviceDisconnected:\n return `${originalMessage}. Please reconnect the device and try again.`;\n case HardwareErrorCode.TransportNotAvailable:\n return `${originalMessage}. Ensure Trezor Bridge is installed and running, or connect via USB.`;\n case HardwareErrorCode.FirmwareTooOld:\n return `${originalMessage}. Please update your Trezor firmware via Trezor Suite.`;\n case HardwareErrorCode.DeviceNotInitialized:\n return `${originalMessage}. The device may need to be set up first via Trezor Suite.`;\n default:\n return originalMessage;\n }\n }\n\n /**\n * Generic batch call with progress reporting.\n * If any single call fails, returns the failure immediately.\n */\n private async batchCall<TParam, TResult>(\n params: TParam[],\n callFn: (p: TParam) => Promise<Response<TResult>>,\n onProgress?: ProgressCallback,\n ): Promise<Response<TResult[]>> {\n const results: TResult[] = [];\n for (let i = 0; i < params.length; i++) {\n const result = await callFn(params[i]);\n if (!result.success) {\n return result;\n }\n results.push(result.payload);\n onProgress?.({ index: i, total: params.length });\n }\n return success(results);\n }\n\n // ─── Hex formatting ──────────────────────────────────────\n\n /** Ensure a hex string has the `0x` prefix. */\n private ensure0x(hex: string): string {\n return hex.startsWith('0x') ? hex : `0x${hex}`;\n }\n\n /** Ensure a hex string is `0x`-prefixed and zero-padded to 64 hex chars (32 bytes). */\n private padHex64(hex: string): string {\n const stripped = hex.startsWith('0x') ? hex.slice(2) : hex;\n return `0x${stripped.padStart(64, '0')}`;\n }\n\n // ─── Event translation ────────────────────────────────────\n\n private deviceConnectHandler = (data: { device: ConnectorDevice }): void => {\n const deviceInfo = this.connectorDeviceToDeviceInfo(data.device);\n this._discoveredDevices.set(deviceInfo.connectId, deviceInfo);\n this.emitter.emit(DEVICE.CONNECT, {\n type: DEVICE.CONNECT,\n payload: deviceInfo,\n });\n };\n\n private deviceDisconnectHandler = (data: { connectId: string }): void => {\n this._discoveredDevices.delete(data.connectId);\n this.emitter.emit(DEVICE.DISCONNECT, {\n type: DEVICE.DISCONNECT,\n payload: { connectId: data.connectId },\n });\n };\n\n private uiRequestHandler = (data: { type: string; payload?: unknown }): void => {\n this.handleUiEvent(data);\n };\n\n private uiEventHandler = (data: { type: string; payload?: unknown }): void => {\n this.handleUiEvent(data);\n };\n\n private registerEventListeners(): void {\n this.connector.on('device-connect', this.deviceConnectHandler);\n this.connector.on('device-disconnect', this.deviceDisconnectHandler);\n this.connector.on('ui-request', this.uiRequestHandler);\n this.connector.on('ui-event', this.uiEventHandler);\n }\n\n private unregisterEventListeners(): void {\n this.connector.off('device-connect', this.deviceConnectHandler);\n this.connector.off('device-disconnect', this.deviceDisconnectHandler);\n this.connector.off('ui-request', this.uiRequestHandler);\n this.connector.off('ui-event', this.uiEventHandler);\n }\n\n private handleUiEvent(event: { type: string; payload?: unknown }): void {\n if (!event.type) return;\n\n const payload = event.payload as Record<string, unknown> | undefined;\n const devicePayload = (payload?.['device'] as Record<string, unknown>) ?? payload;\n const deviceInfo = devicePayload ? this.extractDeviceInfoFromPayload(devicePayload) : this.unknownDevice();\n\n switch (event.type) {\n case 'ui-request_pin':\n this.emitter.emit(UI_REQUEST.REQUEST_PIN, {\n type: UI_REQUEST.REQUEST_PIN,\n payload: { device: deviceInfo },\n });\n if (this._uiHandler?.onPinRequest) {\n this._uiHandler.onPinRequest(deviceInfo).then((pin) => {\n this.connector.uiResponse({\n type: 'receive-pin',\n payload: pin,\n });\n }).catch(() => {\n // User cancelled -- no response sent\n });\n }\n break;\n case 'ui-request_passphrase':\n this.emitter.emit(UI_REQUEST.REQUEST_PASSPHRASE, {\n type: UI_REQUEST.REQUEST_PASSPHRASE,\n payload: { device: deviceInfo },\n });\n if (this._uiHandler?.onPassphraseRequest) {\n this._uiHandler.onPassphraseRequest(deviceInfo).then((result) => {\n const response = typeof result === 'string'\n ? { passphrase: result, onDevice: false }\n : result ?? { passphrase: '', onDevice: false };\n if (response.onDevice) {\n this.connector.uiResponse({\n type: 'receive-passphrase',\n payload: {\n value: '',\n passphraseOnDevice: true,\n save: false,\n },\n });\n } else {\n this.connector.uiResponse({\n type: 'receive-passphrase',\n payload: {\n value: response.passphrase,\n passphraseOnDevice: false,\n save: false,\n },\n });\n }\n }).catch(() => {\n // User cancelled -- no response sent\n });\n }\n break;\n case 'ui-request_confirmation':\n this.emitter.emit(UI_REQUEST.REQUEST_BUTTON, {\n type: UI_REQUEST.REQUEST_BUTTON,\n payload: { device: deviceInfo },\n });\n break;\n }\n }\n\n private connectorDeviceToDeviceInfo(device: ConnectorDevice): DeviceInfo {\n return {\n vendor: 'trezor',\n model: device.model ?? 'unknown',\n firmwareVersion: '',\n deviceId: device.deviceId,\n connectId: device.connectId,\n label: device.name,\n connectionType: 'usb' as ConnectionType,\n };\n }\n\n private extractDeviceInfoFromPayload(payload: Record<string, unknown>): DeviceInfo {\n const features = payload['features'] as Record<string, unknown> | undefined;\n return {\n vendor: 'trezor',\n model: (features?.['model'] as string) ?? (payload['model'] as string) ?? 'unknown',\n firmwareVersion: features\n ? `${features['major_version'] ?? 0}.${features['minor_version'] ?? 0}.${features['patch_version'] ?? 0}`\n : '',\n deviceId: (features?.['device_id'] as string) ?? (payload['id'] as string) ?? '',\n connectId: (payload['path'] as string) ?? '',\n label: (features?.['label'] as string) ?? (payload['label'] as string),\n connectionType: 'usb' as ConnectionType,\n };\n }\n\n private unknownDevice(): DeviceInfo {\n return {\n vendor: 'trezor',\n model: 'unknown',\n firmwareVersion: '',\n deviceId: '',\n connectId: '',\n connectionType: 'usb',\n };\n }\n}\n","import { AbstractProxyClient } from '@bytezhang/hardware-transport-core';\nimport type { ITrezorConnect, TrezorConnectResponse } from './types';\n\n/**\n * Trezor method stubs on top of AbstractProxyClient.\n *\n * All cross-process Trezor proxy clients (Electron IPC, Extension messaging)\n * extend this class. They only need to implement:\n * - `sendCall()` — the transport channel\n * - `dispose()` / `cancel()` / `uiResponse()` — lifecycle\n *\n * The 11 TrezorConnect method stubs are defined here once.\n */\nexport abstract class TrezorProxyClient extends AbstractProxyClient implements ITrezorConnect {\n abstract dispose(): void;\n abstract cancel(reason?: string): void;\n abstract uiResponse(response: { type: string; payload: unknown }): void;\n\n // ─── TrezorConnect method stubs — all delegate to call() ────\n ethereumGetAddress(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumGetAddress', params) as Promise<TrezorConnectResponse>;\n }\n ethereumGetPublicKey(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumGetPublicKey', params) as Promise<TrezorConnectResponse>;\n }\n ethereumSignTransaction(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumSignTransaction', params) as Promise<TrezorConnectResponse>;\n }\n ethereumSignMessage(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumSignMessage', params) as Promise<TrezorConnectResponse>;\n }\n ethereumSignTypedData(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumSignTypedData', params) as Promise<TrezorConnectResponse>;\n }\n getAddress(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('getAddress', params) as Promise<TrezorConnectResponse>;\n }\n getPublicKey(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('getPublicKey', params) as Promise<TrezorConnectResponse>;\n }\n signTransaction(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('signTransaction', params) as Promise<TrezorConnectResponse>;\n }\n signMessage(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('signMessage', params) as Promise<TrezorConnectResponse>;\n }\n solanaGetAddress(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('solanaGetAddress', params) as Promise<TrezorConnectResponse>;\n }\n solanaSignTransaction(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('solanaSignTransaction', params) as Promise<TrezorConnectResponse>;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/TrezorAdapter.ts","../src/TrezorProxyClient.ts"],"sourcesContent":["export { TrezorAdapter } from './TrezorAdapter';\nexport type { ConnectorCallError } from './types';\n\n// Legacy exports for backward compatibility.\n// These are used by trezor-transport-ext and trezor-transport-electron\n// which still extend TrezorProxyClient. They are NOT used by TrezorAdapter.\nexport { TrezorProxyClient } from './TrezorProxyClient';\nexport type { ITrezorConnect, TrezorConnectResponse } from './types';\n","import {\n type IHardwareWallet,\n type IUiHandler,\n type IConnector,\n type ConnectorDevice,\n type ChainCapability,\n type DeviceEventListener,\n type ConnectionType,\n type DeviceInfo,\n type TransportType,\n type Response,\n type IEvmMethods,\n type IBtcMethods,\n type ISolMethods,\n type ITronMethods,\n type EvmGetAddressParams,\n type EvmAddress,\n type EvmGetPublicKeyParams,\n type EvmPublicKey,\n type EvmSignTxParams,\n type EvmSignedTx,\n type EvmSignMsgParams,\n type EvmSignTypedDataParams,\n type EvmSignature,\n type ProgressCallback,\n type BtcGetAddressParams,\n type BtcAddress,\n type BtcGetPublicKeyParams,\n type BtcPublicKey,\n type BtcSignTxParams,\n type BtcSignedTx,\n type BtcSignMsgParams,\n type BtcSignature,\n type SolGetAddressParams,\n type SolAddress,\n type SolGetPublicKeyParams,\n type SolPublicKey,\n type SolSignTxParams,\n type SolSignedTx,\n type SolSignMsgParams,\n type SolSignature,\n type HardwareEventMap,\n type ChainForFingerprint,\n HardwareErrorCode,\n success,\n failure,\n DEVICE,\n UI_REQUEST,\n TypedEventEmitter,\n} from '@bytezhang/hardware-wallet-core';\n\n/**\n * Trezor hardware wallet adapter that delegates to an IConnector.\n *\n * This is a thin translation layer that:\n * - Accepts a pre-configured IConnector (transport decisions are made at connector creation time)\n * - Translates IHardwareWallet method calls to connector.call() invocations\n * - Maps connector results/errors to our Response<T> format with enriched error messages\n * - Translates connector events to HardwareEventMap events\n * - Integrates with IUiHandler for interactive flows (PIN, passphrase)\n */\nexport class TrezorAdapter implements IHardwareWallet {\n readonly vendor = 'trezor' as const;\n\n private readonly connector: IConnector;\n private readonly emitter = new TypedEventEmitter<HardwareEventMap>();\n\n private _uiHandler: Partial<IUiHandler> | null = null;\n\n // Device cache: tracks discovered devices from connector events\n private _discoveredDevices = new Map<string, DeviceInfo>();\n\n // Session tracking: maps connectId -> sessionId\n private _sessions = new Map<string, string>();\n\n constructor(connector: IConnector) {\n this.connector = connector;\n this.registerEventListeners();\n }\n\n // ─── Transport ──────────────────────────────────────────\n // Transport is decided at connector creation time. These methods\n // satisfy the IHardwareWallet interface with sensible defaults.\n\n get activeTransport(): TransportType | null {\n return 'usb';\n }\n\n getAvailableTransports(): TransportType[] {\n return ['usb'];\n }\n\n async switchTransport(_type: TransportType): Promise<void> {\n // Transport is fixed at connector creation time.\n // To switch transport, create a new TrezorAdapter with a different connector.\n }\n\n // ─── UI handler ────────────────────────────────────────────\n\n setUiHandler(handler: Partial<IUiHandler>): void {\n this._uiHandler = handler;\n }\n\n // ─── Lifecycle ────────────────────────────────────────────\n\n async init(_config?: unknown): Promise<void> {\n // Connector is injected via constructor, already initialized.\n // Nothing to do here.\n }\n\n async dispose(): Promise<void> {\n this.unregisterEventListeners();\n this.connector.reset();\n this._uiHandler = null;\n this._discoveredDevices.clear();\n this._sessions.clear();\n this.emitter.removeAllListeners();\n }\n\n // ─── Device management ────────────────────────────────────\n\n async searchDevices(): Promise<DeviceInfo[]> {\n await this._ensureDevicePermission();\n\n const devices = await this.connector.searchDevices();\n\n for (const d of devices) {\n if (d.connectId && !this._discoveredDevices.has(d.connectId)) {\n this._discoveredDevices.set(d.connectId, this.connectorDeviceToDeviceInfo(d));\n }\n }\n\n // If no devices found, ensure permission (no connectId = search context)\n if (this._discoveredDevices.size === 0) {\n await this._ensureDevicePermission();\n }\n\n return Array.from(this._discoveredDevices.values());\n }\n\n async connectDevice(connectId: string): Promise<Response<string>> {\n try {\n const session = await this.connector.connect(connectId);\n this._sessions.set(connectId, session.sessionId);\n\n // Update device cache with richer info from session\n if (session.deviceInfo) {\n this._discoveredDevices.set(connectId, session.deviceInfo);\n }\n\n return success(connectId);\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async disconnectDevice(connectId: string): Promise<void> {\n const sessionId = this._sessions.get(connectId);\n if (sessionId) {\n await this.connector.disconnect(sessionId);\n this._sessions.delete(connectId);\n }\n }\n\n async getDeviceInfo(\n connectId: string,\n deviceId: string,\n ): Promise<Response<DeviceInfo>> {\n await this._ensureDevicePermission(connectId, deviceId);\n\n // Look up the device in the cache populated by event handlers / searchDevices.\n // Try connectId first (the USB path), then fall back to scanning by deviceId.\n const cached =\n this._discoveredDevices.get(connectId) ??\n Array.from(this._discoveredDevices.values()).find(\n (d) => d.deviceId === deviceId,\n );\n\n if (cached) {\n return success(cached);\n }\n\n return failure(\n HardwareErrorCode.DeviceNotFound,\n 'Device not found in cache. Call searchDevices() or wait for a device-connected event first.',\n );\n }\n\n getSupportedChains(): ChainCapability[] {\n return ['evm', 'btc', 'sol'];\n }\n\n // ─── Event handling ───────────────────────────────────────\n\n on<K extends keyof HardwareEventMap>(event: K, listener: (event: HardwareEventMap[K]) => void): void;\n on(event: string, listener: DeviceEventListener): void;\n on(event: string, listener: (event: any) => void): void {\n this.emitter.on(event, listener);\n }\n\n off<K extends keyof HardwareEventMap>(event: K, listener: (event: HardwareEventMap[K]) => void): void;\n off(event: string, listener: DeviceEventListener): void;\n off(event: string, listener: (event: any) => void): void {\n this.emitter.off(event, listener);\n }\n\n cancel(connectId: string): void {\n const sessionId = this._sessions.get(connectId) ?? connectId;\n void this.connector.cancel(sessionId);\n }\n\n // ─── Chain fingerprint ────────────────────────────────────\n\n /**\n * For Trezor, the chain fingerprint is the hardware device_id from firmware.\n * Trezor has a persistent device identity, so no address derivation is needed.\n */\n async getChainFingerprint(\n connectId: string,\n deviceId: string,\n _chain: ChainForFingerprint,\n ): Promise<Response<string>> {\n await this._ensureDevicePermission(connectId, deviceId);\n\n // Look up the device in cache to get the firmware device_id\n const cached =\n this._discoveredDevices.get(connectId) ??\n Array.from(this._discoveredDevices.values()).find(\n (d) => d.deviceId === deviceId,\n );\n\n if (cached?.deviceId) {\n return success(cached.deviceId);\n }\n\n // Fall back: try to get device info from the connector\n try {\n const result = await this.connectorCall(connectId, 'getFeatures', {}) as {\n device_id?: string;\n };\n if (result.device_id) {\n return success(result.device_id);\n }\n } catch {\n // Ignore — fall through to error\n }\n\n return failure(\n HardwareErrorCode.DeviceNotFound,\n 'Could not determine Trezor device identity. Ensure the device is connected.',\n );\n }\n\n // ─── Chain capability accessors ────────────────────────────\n\n private _evmMethods: IEvmMethods = {\n evmGetAddress: (connectId, deviceId, params) =>\n this._evmGetAddress(connectId, deviceId, params),\n evmGetAddresses: (connectId, deviceId, params, onProgress) =>\n this._evmGetAddresses(connectId, deviceId, params, onProgress),\n evmGetPublicKey: (connectId, deviceId, params) =>\n this._evmGetPublicKey(connectId, deviceId, params),\n evmSignTransaction: (connectId, deviceId, params) =>\n this._evmSignTransaction(connectId, deviceId, params),\n evmSignMessage: (connectId, deviceId, params) =>\n this._evmSignMessage(connectId, deviceId, params),\n evmSignTypedData: (connectId, deviceId, params) =>\n this._evmSignTypedData(connectId, deviceId, params),\n };\n\n private _btcMethods: IBtcMethods = {\n btcGetAddress: (connectId, deviceId, params) =>\n this._btcGetAddress(connectId, deviceId, params),\n btcGetAddresses: (connectId, deviceId, params, onProgress) =>\n this._btcGetAddresses(connectId, deviceId, params, onProgress),\n btcGetPublicKey: (connectId, deviceId, params) =>\n this._btcGetPublicKey(connectId, deviceId, params),\n btcSignTransaction: (connectId, deviceId, params) =>\n this._btcSignTransaction(connectId, deviceId, params),\n btcSignMessage: (connectId, deviceId, params) =>\n this._btcSignMessage(connectId, deviceId, params),\n btcGetMasterFingerprint: (connectId, deviceId) =>\n this._btcGetMasterFingerprint(connectId, deviceId),\n };\n\n private _solMethods: ISolMethods = {\n solGetAddress: (connectId, deviceId, params) =>\n this._solGetAddress(connectId, deviceId, params),\n solGetAddresses: (connectId, deviceId, params, onProgress) =>\n this._solGetAddresses(connectId, deviceId, params, onProgress),\n solGetPublicKey: (connectId, deviceId, params) =>\n this._solGetPublicKey(connectId, deviceId, params),\n solSignTransaction: (connectId, deviceId, params) =>\n this._solSignTransaction(connectId, deviceId, params),\n solSignMessage: (connectId, deviceId, params) =>\n this._solSignMessage(connectId, deviceId, params),\n };\n\n evm(): IEvmMethods | null { return this._evmMethods; }\n btc(): IBtcMethods | null { return this._btcMethods; }\n sol(): ISolMethods | null { return this._solMethods; }\n tron(): ITronMethods | null { return null; }\n\n // ─── EVM methods (private) ────────────────────────────────\n\n private async _evmGetAddress(\n connectId: string,\n _deviceId: string,\n params: EvmGetAddressParams,\n ): Promise<Response<EvmAddress>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmGetAddress', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n chainId: params.chainId,\n }) as { address: string; path: string };\n\n return success({\n address: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _evmGetAddresses(\n connectId: string,\n deviceId: string,\n params: EvmGetAddressParams[],\n onProgress?: ProgressCallback,\n ): Promise<Response<EvmAddress[]>> {\n return this.batchCall(\n params,\n (p) => this._evmGetAddress(connectId, deviceId, p),\n onProgress,\n );\n }\n\n private async _evmGetPublicKey(\n connectId: string,\n _deviceId: string,\n params: EvmGetPublicKeyParams,\n ): Promise<Response<EvmPublicKey>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmGetPublicKey', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n }) as { publicKey: string; path: string };\n\n return success({\n publicKey: result.publicKey,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _evmSignTransaction(\n connectId: string,\n _deviceId: string,\n params: EvmSignTxParams,\n ): Promise<Response<EvmSignedTx>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmSignTransaction', {\n path: params.path,\n transaction: {\n to: params.to,\n value: params.value,\n chainId: params.chainId,\n nonce: params.nonce,\n gasLimit: params.gasLimit,\n gasPrice: params.gasPrice,\n maxFeePerGas: params.maxFeePerGas,\n maxPriorityFeePerGas: params.maxPriorityFeePerGas,\n accessList: params.accessList,\n data: params.data,\n },\n }) as { v: string; r: string; s: string; serializedTx?: string };\n\n return success({\n v: this.ensure0x(result.v),\n r: this.padHex64(result.r),\n s: this.padHex64(result.s),\n serializedTx: result.serializedTx,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _evmSignMessage(\n connectId: string,\n _deviceId: string,\n params: EvmSignMsgParams,\n ): Promise<Response<EvmSignature>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmSignMessage', {\n path: params.path,\n message: params.message,\n hex: params.hex,\n }) as { signature: string; address?: string };\n\n return success({\n signature: this.ensure0x(result.signature),\n address: result.address,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _evmSignTypedData(\n connectId: string,\n _deviceId: string,\n params: EvmSignTypedDataParams,\n ): Promise<Response<EvmSignature>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const callParams: Record<string, unknown> = {\n path: params.path,\n };\n\n if (params.mode !== 'hash') {\n callParams['mode'] = params.mode ?? 'full';\n callParams['data'] = params.data;\n callParams['metamaskV4Compat'] = params.metamaskV4Compat ?? true;\n } else {\n callParams['mode'] = 'hash';\n callParams['domainSeparatorHash'] = params.domainSeparatorHash;\n callParams['messageHash'] = params.messageHash;\n }\n\n const result = await this.connectorCall(connectId, 'evmSignTypedData', callParams) as {\n signature: string;\n address?: string;\n };\n\n return success({\n signature: this.ensure0x(result.signature),\n address: result.address,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n // ─── BTC methods (private) ─────────────────────────────────\n\n private async _btcGetAddress(\n connectId: string,\n _deviceId: string,\n params: BtcGetAddressParams,\n ): Promise<Response<BtcAddress>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcGetAddress', {\n path: params.path,\n coin: params.coin,\n showOnDevice: params.showOnDevice,\n scriptType: params.scriptType,\n }) as { address: string; path: string };\n\n return success({\n address: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _btcGetAddresses(\n connectId: string,\n deviceId: string,\n params: BtcGetAddressParams[],\n onProgress?: ProgressCallback,\n ): Promise<Response<BtcAddress[]>> {\n return this.batchCall(\n params,\n (p) => this._btcGetAddress(connectId, deviceId, p),\n onProgress,\n );\n }\n\n private async _btcGetPublicKey(\n connectId: string,\n _deviceId: string,\n params: BtcGetPublicKeyParams,\n ): Promise<Response<BtcPublicKey>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcGetPublicKey', {\n path: params.path,\n coin: params.coin,\n showOnDevice: params.showOnDevice,\n }) as {\n xpub: string;\n publicKey: string;\n fingerprint: number;\n chainCode: string;\n path: string;\n depth: number;\n };\n\n return success({\n xpub: result.xpub,\n publicKey: result.publicKey,\n fingerprint: result.fingerprint,\n chainCode: result.chainCode,\n path: params.path,\n depth: result.depth,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _btcSignTransaction(\n connectId: string,\n _deviceId: string,\n params: BtcSignTxParams,\n ): Promise<Response<BtcSignedTx>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcSignTransaction', {\n inputs: params.inputs ?? [],\n outputs: params.outputs ?? [],\n refTxs: params.refTxs,\n coin: params.coin,\n locktime: params.locktime,\n version: params.version,\n }) as { signatures: string[]; serializedTx: string; txid?: string };\n\n return success({\n signatures: result.signatures,\n serializedTx: result.serializedTx,\n txid: result.txid,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _btcSignMessage(\n connectId: string,\n _deviceId: string,\n params: BtcSignMsgParams,\n ): Promise<Response<BtcSignature>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcSignMessage', {\n path: params.path,\n message: params.message,\n coin: params.coin,\n }) as { signature: string; address: string };\n\n return success({\n signature: result.signature,\n address: result.address,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _btcGetMasterFingerprint(\n connectId: string,\n _deviceId: string,\n ): Promise<Response<{ masterFingerprint: string }>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n // The parent fingerprint of a child of \"m\" IS the master fingerprint.\n // Query \"m/0'\" and read its `fingerprint` field (parent key fingerprint).\n const result = await this.connectorCall(connectId, 'btcGetPublicKey', {\n path: \"m/0'\",\n }) as { fingerprint: number };\n\n const fp = (result.fingerprint) >>> 0;\n const hex = fp.toString(16).padStart(8, '0');\n return success({ masterFingerprint: hex });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n // ─── Solana methods (private) ──────────────────────────────\n\n private async _solGetAddress(\n connectId: string,\n _deviceId: string,\n params: SolGetAddressParams,\n ): Promise<Response<SolAddress>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'solGetAddress', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n }) as { address: string; path: string };\n\n return success({\n address: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _solGetAddresses(\n connectId: string,\n deviceId: string,\n params: SolGetAddressParams[],\n onProgress?: ProgressCallback,\n ): Promise<Response<SolAddress[]>> {\n return this.batchCall(\n params,\n (p) => this._solGetAddress(connectId, deviceId, p),\n onProgress,\n );\n }\n\n private async _solGetPublicKey(\n connectId: string,\n _deviceId: string,\n params: SolGetPublicKeyParams,\n ): Promise<Response<SolPublicKey>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n // Solana address IS the public key\n const result = await this.connectorCall(connectId, 'solGetAddress', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n }) as { address: string; path: string };\n\n return success({\n publicKey: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _solSignTransaction(\n connectId: string,\n _deviceId: string,\n params: SolSignTxParams,\n ): Promise<Response<SolSignedTx>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'solSignTransaction', {\n path: params.path,\n serializedTx: params.serializedTx,\n additionalInfo: params.additionalInfo,\n }) as { signature: string };\n\n return success({\n signature: result.signature,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _solSignMessage(\n _connectId: string,\n _deviceId: string,\n _params: SolSignMsgParams,\n ): Promise<Response<SolSignature>> {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Solana signMessage is not supported by Trezor Connect',\n );\n }\n\n // ─── Private helpers ──────────────────────────────────────\n\n /**\n * Call the connector with session resolution.\n * Looks up sessionId from connectId, falls back to connectId itself.\n */\n private async connectorCall(\n connectId: string,\n method: string,\n params: unknown,\n ): Promise<unknown> {\n const sessionId = this._sessions.get(connectId) ?? connectId;\n return this.connector.call(sessionId, method, params);\n }\n\n /**\n * Ensure device permission before proceeding.\n * - No connectId (searchDevices): check environment-level permission\n * - With connectId (business methods): check device-level permission\n * If not granted, calls onDevicePermission so the consumer can request access.\n */\n private async _ensureDevicePermission(connectId?: string, deviceId?: string): Promise<void> {\n const transportType: TransportType = 'usb';\n let granted = false;\n let context: Record<string, unknown> | undefined;\n\n if (this._uiHandler?.checkDevicePermission) {\n try {\n const result = await this._uiHandler.checkDevicePermission({ transportType, connectId, deviceId });\n granted = result.granted;\n context = result.context;\n } catch {\n granted = false;\n }\n }\n\n if (!granted) {\n try {\n await this._uiHandler?.onDevicePermission?.({ transportType, context });\n } catch {\n // UI handler cancelled or failed\n }\n }\n }\n\n /**\n * Convert a thrown error to a Response failure.\n * Parses TrezorConnect error strings to map to HardwareErrorCode values.\n */\n private errorToFailure<T>(err: unknown): Response<T> {\n const message = err instanceof Error ? err.message : String(err);\n const code = this.parseErrorCode(message);\n const enriched = this.enrichErrorMessage(code, message);\n return failure(code, enriched);\n }\n\n /**\n * Parse TrezorConnect error codes from error message strings.\n * The connector throws errors with messages like \"Trezor ethereumGetAddress failed: <error>\".\n * We also check for embedded code patterns.\n */\n private parseErrorCode(message: string): HardwareErrorCode {\n // Check for known error patterns in the message\n if (message.includes('Failure_ActionCancelled') || message.includes('Failure_Cancel')) {\n return HardwareErrorCode.UserRejected;\n }\n if (message.includes('Failure_PinInvalid') || message.includes('Failure_PinMismatch')) {\n return HardwareErrorCode.PinInvalid;\n }\n if (message.includes('Failure_PinCancelled')) {\n return HardwareErrorCode.PinCancelled;\n }\n if (message.includes('Failure_PassphraseRejected')) {\n return HardwareErrorCode.PassphraseRejected;\n }\n if (message.includes('Device_UsedElsewhere')) {\n return HardwareErrorCode.DeviceBusy;\n }\n if (message.includes('Device_NotFound')) {\n return HardwareErrorCode.DeviceNotFound;\n }\n if (message.includes('Device_InvalidState')) {\n return HardwareErrorCode.DeviceNotInitialized;\n }\n if (message.includes('Transport_Missing')) {\n return HardwareErrorCode.TransportNotAvailable;\n }\n if (message.includes('Transport_DeviceDisconnected')) {\n return HardwareErrorCode.DeviceDisconnected;\n }\n if (message.includes('Failure_FirmwareError')) {\n return HardwareErrorCode.FirmwareTooOld;\n }\n if (message.includes('Method_InvalidParameter') || message.includes('Method_InvalidParams')) {\n return HardwareErrorCode.InvalidParams;\n }\n if (message.includes('Method_NotAllowed')) {\n return HardwareErrorCode.MethodNotSupported;\n }\n return HardwareErrorCode.UnknownError;\n }\n\n /**\n * Enrich error messages with actionable recovery info for the caller.\n */\n private enrichErrorMessage(code: HardwareErrorCode, originalMessage: string): string {\n switch (code) {\n case HardwareErrorCode.PinInvalid:\n return `${originalMessage}. Please re-enter your PIN.`;\n case HardwareErrorCode.PinCancelled:\n return `${originalMessage}. PIN entry was cancelled.`;\n case HardwareErrorCode.DeviceBusy:\n return `${originalMessage}. The device is in use by another application. Close other wallet apps and try again.`;\n case HardwareErrorCode.DeviceDisconnected:\n return `${originalMessage}. Please reconnect the device and try again.`;\n case HardwareErrorCode.TransportNotAvailable:\n return `${originalMessage}. Ensure Trezor Bridge is installed and running, or connect via USB.`;\n case HardwareErrorCode.FirmwareTooOld:\n return `${originalMessage}. Please update your Trezor firmware via Trezor Suite.`;\n case HardwareErrorCode.DeviceNotInitialized:\n return `${originalMessage}. The device may need to be set up first via Trezor Suite.`;\n default:\n return originalMessage;\n }\n }\n\n /**\n * Generic batch call with progress reporting.\n * If any single call fails, returns the failure immediately.\n */\n private async batchCall<TParam, TResult>(\n params: TParam[],\n callFn: (p: TParam) => Promise<Response<TResult>>,\n onProgress?: ProgressCallback,\n ): Promise<Response<TResult[]>> {\n const results: TResult[] = [];\n for (let i = 0; i < params.length; i++) {\n const result = await callFn(params[i]);\n if (!result.success) {\n return result;\n }\n results.push(result.payload);\n onProgress?.({ index: i, total: params.length });\n }\n return success(results);\n }\n\n // ─── Hex formatting ──────────────────────────────────────\n\n /** Ensure a hex string has the `0x` prefix. */\n private ensure0x(hex: string): string {\n return hex.startsWith('0x') ? hex : `0x${hex}`;\n }\n\n /** Ensure a hex string is `0x`-prefixed and zero-padded to 64 hex chars (32 bytes). */\n private padHex64(hex: string): string {\n const stripped = hex.startsWith('0x') ? hex.slice(2) : hex;\n return `0x${stripped.padStart(64, '0')}`;\n }\n\n // ─── Event translation ────────────────────────────────────\n\n private deviceConnectHandler = (data: { device: ConnectorDevice }): void => {\n const deviceInfo = this.connectorDeviceToDeviceInfo(data.device);\n this._discoveredDevices.set(deviceInfo.connectId, deviceInfo);\n this.emitter.emit(DEVICE.CONNECT, {\n type: DEVICE.CONNECT,\n payload: deviceInfo,\n });\n };\n\n private deviceDisconnectHandler = (data: { connectId: string }): void => {\n this._discoveredDevices.delete(data.connectId);\n this.emitter.emit(DEVICE.DISCONNECT, {\n type: DEVICE.DISCONNECT,\n payload: { connectId: data.connectId },\n });\n };\n\n private uiRequestHandler = (data: { type: string; payload?: unknown }): void => {\n this.handleUiEvent(data);\n };\n\n private uiEventHandler = (data: { type: string; payload?: unknown }): void => {\n this.handleUiEvent(data);\n };\n\n private registerEventListeners(): void {\n this.connector.on('device-connect', this.deviceConnectHandler);\n this.connector.on('device-disconnect', this.deviceDisconnectHandler);\n this.connector.on('ui-request', this.uiRequestHandler);\n this.connector.on('ui-event', this.uiEventHandler);\n }\n\n private unregisterEventListeners(): void {\n this.connector.off('device-connect', this.deviceConnectHandler);\n this.connector.off('device-disconnect', this.deviceDisconnectHandler);\n this.connector.off('ui-request', this.uiRequestHandler);\n this.connector.off('ui-event', this.uiEventHandler);\n }\n\n private handleUiEvent(event: { type: string; payload?: unknown }): void {\n if (!event.type) return;\n\n const payload = event.payload as Record<string, unknown> | undefined;\n const devicePayload = (payload?.['device'] as Record<string, unknown>) ?? payload;\n const deviceInfo = devicePayload ? this.extractDeviceInfoFromPayload(devicePayload) : this.unknownDevice();\n\n switch (event.type) {\n case 'ui-request_pin':\n this.emitter.emit(UI_REQUEST.REQUEST_PIN, {\n type: UI_REQUEST.REQUEST_PIN,\n payload: { device: deviceInfo },\n });\n if (this._uiHandler?.onPinRequest) {\n this._uiHandler.onPinRequest(deviceInfo).then((pin) => {\n this.connector.uiResponse({\n type: 'receive-pin',\n payload: pin,\n });\n }).catch(() => {\n // User cancelled -- no response sent\n });\n }\n break;\n case 'ui-request_passphrase':\n this.emitter.emit(UI_REQUEST.REQUEST_PASSPHRASE, {\n type: UI_REQUEST.REQUEST_PASSPHRASE,\n payload: { device: deviceInfo },\n });\n if (this._uiHandler?.onPassphraseRequest) {\n this._uiHandler.onPassphraseRequest(deviceInfo).then((result) => {\n const response = typeof result === 'string'\n ? { passphrase: result, onDevice: false }\n : result ?? { passphrase: '', onDevice: false };\n if (response.onDevice) {\n this.connector.uiResponse({\n type: 'receive-passphrase',\n payload: {\n value: '',\n passphraseOnDevice: true,\n save: false,\n },\n });\n } else {\n this.connector.uiResponse({\n type: 'receive-passphrase',\n payload: {\n value: response.passphrase,\n passphraseOnDevice: false,\n save: false,\n },\n });\n }\n }).catch(() => {\n // User cancelled -- no response sent\n });\n }\n break;\n case 'ui-request_confirmation':\n this.emitter.emit(UI_REQUEST.REQUEST_BUTTON, {\n type: UI_REQUEST.REQUEST_BUTTON,\n payload: { device: deviceInfo },\n });\n break;\n }\n }\n\n private connectorDeviceToDeviceInfo(device: ConnectorDevice): DeviceInfo {\n return {\n vendor: 'trezor',\n model: device.model ?? 'unknown',\n firmwareVersion: '',\n deviceId: device.deviceId,\n connectId: device.connectId,\n label: device.name,\n connectionType: 'usb' as ConnectionType,\n };\n }\n\n private extractDeviceInfoFromPayload(payload: Record<string, unknown>): DeviceInfo {\n const features = payload['features'] as Record<string, unknown> | undefined;\n return {\n vendor: 'trezor',\n model: (features?.['model'] as string) ?? (payload['model'] as string) ?? 'unknown',\n firmwareVersion: features\n ? `${features['major_version'] ?? 0}.${features['minor_version'] ?? 0}.${features['patch_version'] ?? 0}`\n : '',\n deviceId: (features?.['device_id'] as string) ?? (payload['id'] as string) ?? '',\n connectId: (payload['path'] as string) ?? '',\n label: (features?.['label'] as string) ?? (payload['label'] as string),\n connectionType: 'usb' as ConnectionType,\n };\n }\n\n private unknownDevice(): DeviceInfo {\n return {\n vendor: 'trezor',\n model: 'unknown',\n firmwareVersion: '',\n deviceId: '',\n connectId: '',\n connectionType: 'usb',\n };\n }\n}\n","import { AbstractProxyClient } from '@bytezhang/hardware-transport-core';\nimport type { ITrezorConnect, TrezorConnectResponse } from './types';\n\n/**\n * Trezor method stubs on top of AbstractProxyClient.\n *\n * All cross-process Trezor proxy clients (Electron IPC, Extension messaging)\n * extend this class. They only need to implement:\n * - `sendCall()` — the transport channel\n * - `dispose()` / `cancel()` / `uiResponse()` — lifecycle\n *\n * The 11 TrezorConnect method stubs are defined here once.\n */\nexport abstract class TrezorProxyClient extends AbstractProxyClient implements ITrezorConnect {\n abstract dispose(): void;\n abstract cancel(reason?: string): void;\n abstract uiResponse(response: { type: string; payload: unknown }): void;\n\n // ─── TrezorConnect method stubs — all delegate to call() ────\n ethereumGetAddress(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumGetAddress', params) as Promise<TrezorConnectResponse>;\n }\n ethereumGetPublicKey(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumGetPublicKey', params) as Promise<TrezorConnectResponse>;\n }\n ethereumSignTransaction(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumSignTransaction', params) as Promise<TrezorConnectResponse>;\n }\n ethereumSignMessage(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumSignMessage', params) as Promise<TrezorConnectResponse>;\n }\n ethereumSignTypedData(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumSignTypedData', params) as Promise<TrezorConnectResponse>;\n }\n getAddress(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('getAddress', params) as Promise<TrezorConnectResponse>;\n }\n getPublicKey(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('getPublicKey', params) as Promise<TrezorConnectResponse>;\n }\n signTransaction(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('signTransaction', params) as Promise<TrezorConnectResponse>;\n }\n signMessage(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('signMessage', params) as Promise<TrezorConnectResponse>;\n }\n solanaGetAddress(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('solanaGetAddress', params) as Promise<TrezorConnectResponse>;\n }\n solanaSignTransaction(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('solanaSignTransaction', params) as Promise<TrezorConnectResponse>;\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -16,6 +16,30 @@ var TrezorAdapter = class {
16
16
  this._discoveredDevices = /* @__PURE__ */ new Map();
17
17
  // Session tracking: maps connectId -> sessionId
18
18
  this._sessions = /* @__PURE__ */ new Map();
19
+ // ─── Chain capability accessors ────────────────────────────
20
+ this._evmMethods = {
21
+ evmGetAddress: (connectId, deviceId, params) => this._evmGetAddress(connectId, deviceId, params),
22
+ evmGetAddresses: (connectId, deviceId, params, onProgress) => this._evmGetAddresses(connectId, deviceId, params, onProgress),
23
+ evmGetPublicKey: (connectId, deviceId, params) => this._evmGetPublicKey(connectId, deviceId, params),
24
+ evmSignTransaction: (connectId, deviceId, params) => this._evmSignTransaction(connectId, deviceId, params),
25
+ evmSignMessage: (connectId, deviceId, params) => this._evmSignMessage(connectId, deviceId, params),
26
+ evmSignTypedData: (connectId, deviceId, params) => this._evmSignTypedData(connectId, deviceId, params)
27
+ };
28
+ this._btcMethods = {
29
+ btcGetAddress: (connectId, deviceId, params) => this._btcGetAddress(connectId, deviceId, params),
30
+ btcGetAddresses: (connectId, deviceId, params, onProgress) => this._btcGetAddresses(connectId, deviceId, params, onProgress),
31
+ btcGetPublicKey: (connectId, deviceId, params) => this._btcGetPublicKey(connectId, deviceId, params),
32
+ btcSignTransaction: (connectId, deviceId, params) => this._btcSignTransaction(connectId, deviceId, params),
33
+ btcSignMessage: (connectId, deviceId, params) => this._btcSignMessage(connectId, deviceId, params),
34
+ btcGetMasterFingerprint: (connectId, deviceId) => this._btcGetMasterFingerprint(connectId, deviceId)
35
+ };
36
+ this._solMethods = {
37
+ solGetAddress: (connectId, deviceId, params) => this._solGetAddress(connectId, deviceId, params),
38
+ solGetAddresses: (connectId, deviceId, params, onProgress) => this._solGetAddresses(connectId, deviceId, params, onProgress),
39
+ solGetPublicKey: (connectId, deviceId, params) => this._solGetPublicKey(connectId, deviceId, params),
40
+ solSignTransaction: (connectId, deviceId, params) => this._solSignTransaction(connectId, deviceId, params),
41
+ solSignMessage: (connectId, deviceId, params) => this._solSignMessage(connectId, deviceId, params)
42
+ };
19
43
  // ─── Event translation ────────────────────────────────────
20
44
  this.deviceConnectHandler = (data) => {
21
45
  const deviceInfo = this.connectorDeviceToDeviceInfo(data.device);
@@ -151,8 +175,20 @@ var TrezorAdapter = class {
151
175
  "Could not determine Trezor device identity. Ensure the device is connected."
152
176
  );
153
177
  }
154
- // ─── EVM methods ──────────────────────────────────────────
155
- async evmGetAddress(connectId, _deviceId, params) {
178
+ evm() {
179
+ return this._evmMethods;
180
+ }
181
+ btc() {
182
+ return this._btcMethods;
183
+ }
184
+ sol() {
185
+ return this._solMethods;
186
+ }
187
+ tron() {
188
+ return null;
189
+ }
190
+ // ─── EVM methods (private) ────────────────────────────────
191
+ async _evmGetAddress(connectId, _deviceId, params) {
156
192
  await this._ensureDevicePermission(connectId, _deviceId);
157
193
  try {
158
194
  const result = await this.connectorCall(connectId, "evmGetAddress", {
@@ -168,14 +204,14 @@ var TrezorAdapter = class {
168
204
  return this.errorToFailure(err);
169
205
  }
170
206
  }
171
- async evmGetAddresses(connectId, deviceId, params, onProgress) {
207
+ async _evmGetAddresses(connectId, deviceId, params, onProgress) {
172
208
  return this.batchCall(
173
209
  params,
174
- (p) => this.evmGetAddress(connectId, deviceId, p),
210
+ (p) => this._evmGetAddress(connectId, deviceId, p),
175
211
  onProgress
176
212
  );
177
213
  }
178
- async evmGetPublicKey(connectId, _deviceId, params) {
214
+ async _evmGetPublicKey(connectId, _deviceId, params) {
179
215
  await this._ensureDevicePermission(connectId, _deviceId);
180
216
  try {
181
217
  const result = await this.connectorCall(connectId, "evmGetPublicKey", {
@@ -190,7 +226,7 @@ var TrezorAdapter = class {
190
226
  return this.errorToFailure(err);
191
227
  }
192
228
  }
193
- async evmSignTransaction(connectId, _deviceId, params) {
229
+ async _evmSignTransaction(connectId, _deviceId, params) {
194
230
  await this._ensureDevicePermission(connectId, _deviceId);
195
231
  try {
196
232
  const result = await this.connectorCall(connectId, "evmSignTransaction", {
@@ -218,7 +254,7 @@ var TrezorAdapter = class {
218
254
  return this.errorToFailure(err);
219
255
  }
220
256
  }
221
- async evmSignMessage(connectId, _deviceId, params) {
257
+ async _evmSignMessage(connectId, _deviceId, params) {
222
258
  await this._ensureDevicePermission(connectId, _deviceId);
223
259
  try {
224
260
  const result = await this.connectorCall(connectId, "evmSignMessage", {
@@ -234,7 +270,7 @@ var TrezorAdapter = class {
234
270
  return this.errorToFailure(err);
235
271
  }
236
272
  }
237
- async evmSignTypedData(connectId, _deviceId, params) {
273
+ async _evmSignTypedData(connectId, _deviceId, params) {
238
274
  await this._ensureDevicePermission(connectId, _deviceId);
239
275
  try {
240
276
  const callParams = {
@@ -258,8 +294,8 @@ var TrezorAdapter = class {
258
294
  return this.errorToFailure(err);
259
295
  }
260
296
  }
261
- // ─── BTC methods ──────────────────────────────────────────
262
- async btcGetAddress(connectId, _deviceId, params) {
297
+ // ─── BTC methods (private) ─────────────────────────────────
298
+ async _btcGetAddress(connectId, _deviceId, params) {
263
299
  await this._ensureDevicePermission(connectId, _deviceId);
264
300
  try {
265
301
  const result = await this.connectorCall(connectId, "btcGetAddress", {
@@ -276,14 +312,14 @@ var TrezorAdapter = class {
276
312
  return this.errorToFailure(err);
277
313
  }
278
314
  }
279
- async btcGetAddresses(connectId, deviceId, params, onProgress) {
315
+ async _btcGetAddresses(connectId, deviceId, params, onProgress) {
280
316
  return this.batchCall(
281
317
  params,
282
- (p) => this.btcGetAddress(connectId, deviceId, p),
318
+ (p) => this._btcGetAddress(connectId, deviceId, p),
283
319
  onProgress
284
320
  );
285
321
  }
286
- async btcGetPublicKey(connectId, _deviceId, params) {
322
+ async _btcGetPublicKey(connectId, _deviceId, params) {
287
323
  await this._ensureDevicePermission(connectId, _deviceId);
288
324
  try {
289
325
  const result = await this.connectorCall(connectId, "btcGetPublicKey", {
@@ -303,7 +339,7 @@ var TrezorAdapter = class {
303
339
  return this.errorToFailure(err);
304
340
  }
305
341
  }
306
- async btcSignTransaction(connectId, _deviceId, params) {
342
+ async _btcSignTransaction(connectId, _deviceId, params) {
307
343
  await this._ensureDevicePermission(connectId, _deviceId);
308
344
  try {
309
345
  const result = await this.connectorCall(connectId, "btcSignTransaction", {
@@ -323,7 +359,7 @@ var TrezorAdapter = class {
323
359
  return this.errorToFailure(err);
324
360
  }
325
361
  }
326
- async btcSignMessage(connectId, _deviceId, params) {
362
+ async _btcSignMessage(connectId, _deviceId, params) {
327
363
  await this._ensureDevicePermission(connectId, _deviceId);
328
364
  try {
329
365
  const result = await this.connectorCall(connectId, "btcSignMessage", {
@@ -339,7 +375,7 @@ var TrezorAdapter = class {
339
375
  return this.errorToFailure(err);
340
376
  }
341
377
  }
342
- async btcGetMasterFingerprint(connectId, _deviceId) {
378
+ async _btcGetMasterFingerprint(connectId, _deviceId) {
343
379
  await this._ensureDevicePermission(connectId, _deviceId);
344
380
  try {
345
381
  const result = await this.connectorCall(connectId, "btcGetPublicKey", {
@@ -352,8 +388,8 @@ var TrezorAdapter = class {
352
388
  return this.errorToFailure(err);
353
389
  }
354
390
  }
355
- // ─── Solana methods ───────────────────────────────────────
356
- async solGetAddress(connectId, _deviceId, params) {
391
+ // ─── Solana methods (private) ──────────────────────────────
392
+ async _solGetAddress(connectId, _deviceId, params) {
357
393
  await this._ensureDevicePermission(connectId, _deviceId);
358
394
  try {
359
395
  const result = await this.connectorCall(connectId, "solGetAddress", {
@@ -368,14 +404,14 @@ var TrezorAdapter = class {
368
404
  return this.errorToFailure(err);
369
405
  }
370
406
  }
371
- async solGetAddresses(connectId, deviceId, params, onProgress) {
407
+ async _solGetAddresses(connectId, deviceId, params, onProgress) {
372
408
  return this.batchCall(
373
409
  params,
374
- (p) => this.solGetAddress(connectId, deviceId, p),
410
+ (p) => this._solGetAddress(connectId, deviceId, p),
375
411
  onProgress
376
412
  );
377
413
  }
378
- async solGetPublicKey(connectId, _deviceId, params) {
414
+ async _solGetPublicKey(connectId, _deviceId, params) {
379
415
  await this._ensureDevicePermission(connectId, _deviceId);
380
416
  try {
381
417
  const result = await this.connectorCall(connectId, "solGetAddress", {
@@ -390,7 +426,7 @@ var TrezorAdapter = class {
390
426
  return this.errorToFailure(err);
391
427
  }
392
428
  }
393
- async solSignTransaction(connectId, _deviceId, params) {
429
+ async _solSignTransaction(connectId, _deviceId, params) {
394
430
  await this._ensureDevicePermission(connectId, _deviceId);
395
431
  try {
396
432
  const result = await this.connectorCall(connectId, "solSignTransaction", {
@@ -405,38 +441,12 @@ var TrezorAdapter = class {
405
441
  return this.errorToFailure(err);
406
442
  }
407
443
  }
408
- async solSignMessage(_connectId, _deviceId, _params) {
444
+ async _solSignMessage(_connectId, _deviceId, _params) {
409
445
  return failure(
410
446
  HardwareErrorCode.MethodNotSupported,
411
447
  "Solana signMessage is not supported by Trezor Connect"
412
448
  );
413
449
  }
414
- // ─── TRON methods ─────────────────────────────────────────
415
- // TRON is not supported by Trezor. All methods return MethodNotSupported.
416
- async tronGetAddress(_connectId, _deviceId, _params) {
417
- return failure(
418
- HardwareErrorCode.MethodNotSupported,
419
- "TRON is not supported by Trezor"
420
- );
421
- }
422
- async tronGetAddresses(_connectId, _deviceId, _params, _onProgress) {
423
- return failure(
424
- HardwareErrorCode.MethodNotSupported,
425
- "TRON is not supported by Trezor"
426
- );
427
- }
428
- async tronSignTransaction(_connectId, _deviceId, _params) {
429
- return failure(
430
- HardwareErrorCode.MethodNotSupported,
431
- "TRON is not supported by Trezor"
432
- );
433
- }
434
- async tronSignMessage(_connectId, _deviceId, _params) {
435
- return failure(
436
- HardwareErrorCode.MethodNotSupported,
437
- "TRON is not supported by Trezor"
438
- );
439
- }
440
450
  // ─── Private helpers ──────────────────────────────────────
441
451
  /**
442
452
  * Call the connector with session resolution.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TrezorAdapter.ts","../src/TrezorProxyClient.ts"],"sourcesContent":["import {\n type IHardwareWallet,\n type IUiHandler,\n type IConnector,\n type ConnectorDevice,\n type ChainCapability,\n type DeviceEventListener,\n type ConnectionType,\n type DeviceInfo,\n type TransportType,\n type Response,\n type EvmGetAddressParams,\n type EvmAddress,\n type EvmGetPublicKeyParams,\n type EvmPublicKey,\n type EvmSignTxParams,\n type EvmSignedTx,\n type EvmSignMsgParams,\n type EvmSignTypedDataParams,\n type EvmSignature,\n type ProgressCallback,\n type BtcGetAddressParams,\n type BtcAddress,\n type BtcGetPublicKeyParams,\n type BtcPublicKey,\n type BtcSignTxParams,\n type BtcSignedTx,\n type BtcSignMsgParams,\n type BtcSignature,\n type SolGetAddressParams,\n type SolAddress,\n type SolGetPublicKeyParams,\n type SolPublicKey,\n type SolSignTxParams,\n type SolSignedTx,\n type SolSignMsgParams,\n type SolSignature,\n type TronGetAddressParams,\n type TronAddress,\n type TronSignTxParams,\n type TronSignedTx,\n type TronSignMsgParams,\n type TronSignature,\n type HardwareEventMap,\n type ChainForFingerprint,\n HardwareErrorCode,\n success,\n failure,\n DEVICE,\n UI_REQUEST,\n TypedEventEmitter,\n} from '@bytezhang/hardware-wallet-core';\n\n/**\n * Trezor hardware wallet adapter that delegates to an IConnector.\n *\n * This is a thin translation layer that:\n * - Accepts a pre-configured IConnector (transport decisions are made at connector creation time)\n * - Translates IHardwareWallet method calls to connector.call() invocations\n * - Maps connector results/errors to our Response<T> format with enriched error messages\n * - Translates connector events to HardwareEventMap events\n * - Integrates with IUiHandler for interactive flows (PIN, passphrase)\n */\nexport class TrezorAdapter implements IHardwareWallet {\n readonly vendor = 'trezor' as const;\n\n private readonly connector: IConnector;\n private readonly emitter = new TypedEventEmitter<HardwareEventMap>();\n\n private _uiHandler: Partial<IUiHandler> | null = null;\n\n // Device cache: tracks discovered devices from connector events\n private _discoveredDevices = new Map<string, DeviceInfo>();\n\n // Session tracking: maps connectId -> sessionId\n private _sessions = new Map<string, string>();\n\n constructor(connector: IConnector) {\n this.connector = connector;\n this.registerEventListeners();\n }\n\n // ─── Transport ──────────────────────────────────────────\n // Transport is decided at connector creation time. These methods\n // satisfy the IHardwareWallet interface with sensible defaults.\n\n get activeTransport(): TransportType | null {\n return 'usb';\n }\n\n getAvailableTransports(): TransportType[] {\n return ['usb'];\n }\n\n async switchTransport(_type: TransportType): Promise<void> {\n // Transport is fixed at connector creation time.\n // To switch transport, create a new TrezorAdapter with a different connector.\n }\n\n // ─── UI handler ────────────────────────────────────────────\n\n setUiHandler(handler: Partial<IUiHandler>): void {\n this._uiHandler = handler;\n }\n\n // ─── Lifecycle ────────────────────────────────────────────\n\n async init(_config?: unknown): Promise<void> {\n // Connector is injected via constructor, already initialized.\n // Nothing to do here.\n }\n\n async dispose(): Promise<void> {\n this.unregisterEventListeners();\n this.connector.reset();\n this._uiHandler = null;\n this._discoveredDevices.clear();\n this._sessions.clear();\n this.emitter.removeAllListeners();\n }\n\n // ─── Device management ────────────────────────────────────\n\n async searchDevices(): Promise<DeviceInfo[]> {\n await this._ensureDevicePermission();\n\n const devices = await this.connector.searchDevices();\n\n for (const d of devices) {\n if (d.connectId && !this._discoveredDevices.has(d.connectId)) {\n this._discoveredDevices.set(d.connectId, this.connectorDeviceToDeviceInfo(d));\n }\n }\n\n // If no devices found, ensure permission (no connectId = search context)\n if (this._discoveredDevices.size === 0) {\n await this._ensureDevicePermission();\n }\n\n return Array.from(this._discoveredDevices.values());\n }\n\n async connectDevice(connectId: string): Promise<Response<string>> {\n try {\n const session = await this.connector.connect(connectId);\n this._sessions.set(connectId, session.sessionId);\n\n // Update device cache with richer info from session\n if (session.deviceInfo) {\n this._discoveredDevices.set(connectId, session.deviceInfo);\n }\n\n return success(connectId);\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async disconnectDevice(connectId: string): Promise<void> {\n const sessionId = this._sessions.get(connectId);\n if (sessionId) {\n await this.connector.disconnect(sessionId);\n this._sessions.delete(connectId);\n }\n }\n\n async getDeviceInfo(\n connectId: string,\n deviceId: string,\n ): Promise<Response<DeviceInfo>> {\n await this._ensureDevicePermission(connectId, deviceId);\n\n // Look up the device in the cache populated by event handlers / searchDevices.\n // Try connectId first (the USB path), then fall back to scanning by deviceId.\n const cached =\n this._discoveredDevices.get(connectId) ??\n Array.from(this._discoveredDevices.values()).find(\n (d) => d.deviceId === deviceId,\n );\n\n if (cached) {\n return success(cached);\n }\n\n return failure(\n HardwareErrorCode.DeviceNotFound,\n 'Device not found in cache. Call searchDevices() or wait for a device-connected event first.',\n );\n }\n\n getSupportedChains(): ChainCapability[] {\n return ['evm', 'btc', 'sol'];\n }\n\n // ─── Event handling ───────────────────────────────────────\n\n on<K extends keyof HardwareEventMap>(event: K, listener: (event: HardwareEventMap[K]) => void): void;\n on(event: string, listener: DeviceEventListener): void;\n on(event: string, listener: (event: any) => void): void {\n this.emitter.on(event, listener);\n }\n\n off<K extends keyof HardwareEventMap>(event: K, listener: (event: HardwareEventMap[K]) => void): void;\n off(event: string, listener: DeviceEventListener): void;\n off(event: string, listener: (event: any) => void): void {\n this.emitter.off(event, listener);\n }\n\n cancel(connectId: string): void {\n const sessionId = this._sessions.get(connectId) ?? connectId;\n void this.connector.cancel(sessionId);\n }\n\n // ─── Chain fingerprint ────────────────────────────────────\n\n /**\n * For Trezor, the chain fingerprint is the hardware device_id from firmware.\n * Trezor has a persistent device identity, so no address derivation is needed.\n */\n async getChainFingerprint(\n connectId: string,\n deviceId: string,\n _chain: ChainForFingerprint,\n ): Promise<Response<string>> {\n await this._ensureDevicePermission(connectId, deviceId);\n\n // Look up the device in cache to get the firmware device_id\n const cached =\n this._discoveredDevices.get(connectId) ??\n Array.from(this._discoveredDevices.values()).find(\n (d) => d.deviceId === deviceId,\n );\n\n if (cached?.deviceId) {\n return success(cached.deviceId);\n }\n\n // Fall back: try to get device info from the connector\n try {\n const result = await this.connectorCall(connectId, 'getFeatures', {}) as {\n device_id?: string;\n };\n if (result.device_id) {\n return success(result.device_id);\n }\n } catch {\n // Ignore — fall through to error\n }\n\n return failure(\n HardwareErrorCode.DeviceNotFound,\n 'Could not determine Trezor device identity. Ensure the device is connected.',\n );\n }\n\n // ─── EVM methods ──────────────────────────────────────────\n\n async evmGetAddress(\n connectId: string,\n _deviceId: string,\n params: EvmGetAddressParams,\n ): Promise<Response<EvmAddress>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmGetAddress', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n chainId: params.chainId,\n }) as { address: string; path: string };\n\n return success({\n address: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async evmGetAddresses(\n connectId: string,\n deviceId: string,\n params: EvmGetAddressParams[],\n onProgress?: ProgressCallback,\n ): Promise<Response<EvmAddress[]>> {\n return this.batchCall(\n params,\n (p) => this.evmGetAddress(connectId, deviceId, p),\n onProgress,\n );\n }\n\n async evmGetPublicKey(\n connectId: string,\n _deviceId: string,\n params: EvmGetPublicKeyParams,\n ): Promise<Response<EvmPublicKey>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmGetPublicKey', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n }) as { publicKey: string; path: string };\n\n return success({\n publicKey: result.publicKey,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async evmSignTransaction(\n connectId: string,\n _deviceId: string,\n params: EvmSignTxParams,\n ): Promise<Response<EvmSignedTx>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmSignTransaction', {\n path: params.path,\n transaction: {\n to: params.to,\n value: params.value,\n chainId: params.chainId,\n nonce: params.nonce,\n gasLimit: params.gasLimit,\n gasPrice: params.gasPrice,\n maxFeePerGas: params.maxFeePerGas,\n maxPriorityFeePerGas: params.maxPriorityFeePerGas,\n accessList: params.accessList,\n data: params.data,\n },\n }) as { v: string; r: string; s: string; serializedTx?: string };\n\n return success({\n v: this.ensure0x(result.v),\n r: this.padHex64(result.r),\n s: this.padHex64(result.s),\n serializedTx: result.serializedTx,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async evmSignMessage(\n connectId: string,\n _deviceId: string,\n params: EvmSignMsgParams,\n ): Promise<Response<EvmSignature>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmSignMessage', {\n path: params.path,\n message: params.message,\n hex: params.hex,\n }) as { signature: string; address?: string };\n\n return success({\n signature: this.ensure0x(result.signature),\n address: result.address,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async evmSignTypedData(\n connectId: string,\n _deviceId: string,\n params: EvmSignTypedDataParams,\n ): Promise<Response<EvmSignature>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const callParams: Record<string, unknown> = {\n path: params.path,\n };\n\n if (params.mode !== 'hash') {\n callParams['mode'] = params.mode ?? 'full';\n callParams['data'] = params.data;\n callParams['metamaskV4Compat'] = params.metamaskV4Compat ?? true;\n } else {\n callParams['mode'] = 'hash';\n callParams['domainSeparatorHash'] = params.domainSeparatorHash;\n callParams['messageHash'] = params.messageHash;\n }\n\n const result = await this.connectorCall(connectId, 'evmSignTypedData', callParams) as {\n signature: string;\n address?: string;\n };\n\n return success({\n signature: this.ensure0x(result.signature),\n address: result.address,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n // ─── BTC methods ──────────────────────────────────────────\n\n async btcGetAddress(\n connectId: string,\n _deviceId: string,\n params: BtcGetAddressParams,\n ): Promise<Response<BtcAddress>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcGetAddress', {\n path: params.path,\n coin: params.coin,\n showOnDevice: params.showOnDevice,\n scriptType: params.scriptType,\n }) as { address: string; path: string };\n\n return success({\n address: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async btcGetAddresses(\n connectId: string,\n deviceId: string,\n params: BtcGetAddressParams[],\n onProgress?: ProgressCallback,\n ): Promise<Response<BtcAddress[]>> {\n return this.batchCall(\n params,\n (p) => this.btcGetAddress(connectId, deviceId, p),\n onProgress,\n );\n }\n\n async btcGetPublicKey(\n connectId: string,\n _deviceId: string,\n params: BtcGetPublicKeyParams,\n ): Promise<Response<BtcPublicKey>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcGetPublicKey', {\n path: params.path,\n coin: params.coin,\n showOnDevice: params.showOnDevice,\n }) as {\n xpub: string;\n publicKey: string;\n fingerprint: number;\n chainCode: string;\n path: string;\n depth: number;\n };\n\n return success({\n xpub: result.xpub,\n publicKey: result.publicKey,\n fingerprint: result.fingerprint,\n chainCode: result.chainCode,\n path: params.path,\n depth: result.depth,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async btcSignTransaction(\n connectId: string,\n _deviceId: string,\n params: BtcSignTxParams,\n ): Promise<Response<BtcSignedTx>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcSignTransaction', {\n inputs: params.inputs ?? [],\n outputs: params.outputs ?? [],\n refTxs: params.refTxs,\n coin: params.coin,\n locktime: params.locktime,\n version: params.version,\n }) as { signatures: string[]; serializedTx: string; txid?: string };\n\n return success({\n signatures: result.signatures,\n serializedTx: result.serializedTx,\n txid: result.txid,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async btcSignMessage(\n connectId: string,\n _deviceId: string,\n params: BtcSignMsgParams,\n ): Promise<Response<BtcSignature>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcSignMessage', {\n path: params.path,\n message: params.message,\n coin: params.coin,\n }) as { signature: string; address: string };\n\n return success({\n signature: result.signature,\n address: result.address,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async btcGetMasterFingerprint(\n connectId: string,\n _deviceId: string,\n ): Promise<Response<{ masterFingerprint: string }>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n // The parent fingerprint of a child of \"m\" IS the master fingerprint.\n // Query \"m/0'\" and read its `fingerprint` field (parent key fingerprint).\n const result = await this.connectorCall(connectId, 'btcGetPublicKey', {\n path: \"m/0'\",\n }) as { fingerprint: number };\n\n const fp = (result.fingerprint) >>> 0;\n const hex = fp.toString(16).padStart(8, '0');\n return success({ masterFingerprint: hex });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n // ─── Solana methods ───────────────────────────────────────\n\n async solGetAddress(\n connectId: string,\n _deviceId: string,\n params: SolGetAddressParams,\n ): Promise<Response<SolAddress>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'solGetAddress', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n }) as { address: string; path: string };\n\n return success({\n address: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async solGetAddresses(\n connectId: string,\n deviceId: string,\n params: SolGetAddressParams[],\n onProgress?: ProgressCallback,\n ): Promise<Response<SolAddress[]>> {\n return this.batchCall(\n params,\n (p) => this.solGetAddress(connectId, deviceId, p),\n onProgress,\n );\n }\n\n async solGetPublicKey(\n connectId: string,\n _deviceId: string,\n params: SolGetPublicKeyParams,\n ): Promise<Response<SolPublicKey>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n // Solana address IS the public key\n const result = await this.connectorCall(connectId, 'solGetAddress', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n }) as { address: string; path: string };\n\n return success({\n publicKey: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async solSignTransaction(\n connectId: string,\n _deviceId: string,\n params: SolSignTxParams,\n ): Promise<Response<SolSignedTx>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'solSignTransaction', {\n path: params.path,\n serializedTx: params.serializedTx,\n additionalInfo: params.additionalInfo,\n }) as { signature: string };\n\n return success({\n signature: result.signature,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async solSignMessage(\n _connectId: string,\n _deviceId: string,\n _params: SolSignMsgParams,\n ): Promise<Response<SolSignature>> {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Solana signMessage is not supported by Trezor Connect',\n );\n }\n\n // ─── TRON methods ─────────────────────────────────────────\n // TRON is not supported by Trezor. All methods return MethodNotSupported.\n\n async tronGetAddress(\n _connectId: string,\n _deviceId: string,\n _params: TronGetAddressParams,\n ): Promise<Response<TronAddress>> {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'TRON is not supported by Trezor',\n );\n }\n\n async tronGetAddresses(\n _connectId: string,\n _deviceId: string,\n _params: TronGetAddressParams[],\n _onProgress?: ProgressCallback,\n ): Promise<Response<TronAddress[]>> {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'TRON is not supported by Trezor',\n );\n }\n\n async tronSignTransaction(\n _connectId: string,\n _deviceId: string,\n _params: TronSignTxParams,\n ): Promise<Response<TronSignedTx>> {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'TRON is not supported by Trezor',\n );\n }\n\n async tronSignMessage(\n _connectId: string,\n _deviceId: string,\n _params: TronSignMsgParams,\n ): Promise<Response<TronSignature>> {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'TRON is not supported by Trezor',\n );\n }\n\n // ─── Private helpers ──────────────────────────────────────\n\n /**\n * Call the connector with session resolution.\n * Looks up sessionId from connectId, falls back to connectId itself.\n */\n private async connectorCall(\n connectId: string,\n method: string,\n params: unknown,\n ): Promise<unknown> {\n const sessionId = this._sessions.get(connectId) ?? connectId;\n return this.connector.call(sessionId, method, params);\n }\n\n /**\n * Ensure device permission before proceeding.\n * - No connectId (searchDevices): check environment-level permission\n * - With connectId (business methods): check device-level permission\n * If not granted, calls onDevicePermission so the consumer can request access.\n */\n private async _ensureDevicePermission(connectId?: string, deviceId?: string): Promise<void> {\n const transportType: TransportType = 'usb';\n let granted = false;\n let context: Record<string, unknown> | undefined;\n\n if (this._uiHandler?.checkDevicePermission) {\n try {\n const result = await this._uiHandler.checkDevicePermission({ transportType, connectId, deviceId });\n granted = result.granted;\n context = result.context;\n } catch {\n granted = false;\n }\n }\n\n if (!granted) {\n try {\n await this._uiHandler?.onDevicePermission?.({ transportType, context });\n } catch {\n // UI handler cancelled or failed\n }\n }\n }\n\n /**\n * Convert a thrown error to a Response failure.\n * Parses TrezorConnect error strings to map to HardwareErrorCode values.\n */\n private errorToFailure<T>(err: unknown): Response<T> {\n const message = err instanceof Error ? err.message : String(err);\n const code = this.parseErrorCode(message);\n const enriched = this.enrichErrorMessage(code, message);\n return failure(code, enriched);\n }\n\n /**\n * Parse TrezorConnect error codes from error message strings.\n * The connector throws errors with messages like \"Trezor ethereumGetAddress failed: <error>\".\n * We also check for embedded code patterns.\n */\n private parseErrorCode(message: string): HardwareErrorCode {\n // Check for known error patterns in the message\n if (message.includes('Failure_ActionCancelled') || message.includes('Failure_Cancel')) {\n return HardwareErrorCode.UserRejected;\n }\n if (message.includes('Failure_PinInvalid') || message.includes('Failure_PinMismatch')) {\n return HardwareErrorCode.PinInvalid;\n }\n if (message.includes('Failure_PinCancelled')) {\n return HardwareErrorCode.PinCancelled;\n }\n if (message.includes('Failure_PassphraseRejected')) {\n return HardwareErrorCode.PassphraseRejected;\n }\n if (message.includes('Device_UsedElsewhere')) {\n return HardwareErrorCode.DeviceBusy;\n }\n if (message.includes('Device_NotFound')) {\n return HardwareErrorCode.DeviceNotFound;\n }\n if (message.includes('Device_InvalidState')) {\n return HardwareErrorCode.DeviceNotInitialized;\n }\n if (message.includes('Transport_Missing')) {\n return HardwareErrorCode.TransportNotAvailable;\n }\n if (message.includes('Transport_DeviceDisconnected')) {\n return HardwareErrorCode.DeviceDisconnected;\n }\n if (message.includes('Failure_FirmwareError')) {\n return HardwareErrorCode.FirmwareTooOld;\n }\n if (message.includes('Method_InvalidParameter') || message.includes('Method_InvalidParams')) {\n return HardwareErrorCode.InvalidParams;\n }\n if (message.includes('Method_NotAllowed')) {\n return HardwareErrorCode.MethodNotSupported;\n }\n return HardwareErrorCode.UnknownError;\n }\n\n /**\n * Enrich error messages with actionable recovery info for the caller.\n */\n private enrichErrorMessage(code: HardwareErrorCode, originalMessage: string): string {\n switch (code) {\n case HardwareErrorCode.PinInvalid:\n return `${originalMessage}. Please re-enter your PIN.`;\n case HardwareErrorCode.PinCancelled:\n return `${originalMessage}. PIN entry was cancelled.`;\n case HardwareErrorCode.DeviceBusy:\n return `${originalMessage}. The device is in use by another application. Close other wallet apps and try again.`;\n case HardwareErrorCode.DeviceDisconnected:\n return `${originalMessage}. Please reconnect the device and try again.`;\n case HardwareErrorCode.TransportNotAvailable:\n return `${originalMessage}. Ensure Trezor Bridge is installed and running, or connect via USB.`;\n case HardwareErrorCode.FirmwareTooOld:\n return `${originalMessage}. Please update your Trezor firmware via Trezor Suite.`;\n case HardwareErrorCode.DeviceNotInitialized:\n return `${originalMessage}. The device may need to be set up first via Trezor Suite.`;\n default:\n return originalMessage;\n }\n }\n\n /**\n * Generic batch call with progress reporting.\n * If any single call fails, returns the failure immediately.\n */\n private async batchCall<TParam, TResult>(\n params: TParam[],\n callFn: (p: TParam) => Promise<Response<TResult>>,\n onProgress?: ProgressCallback,\n ): Promise<Response<TResult[]>> {\n const results: TResult[] = [];\n for (let i = 0; i < params.length; i++) {\n const result = await callFn(params[i]);\n if (!result.success) {\n return result;\n }\n results.push(result.payload);\n onProgress?.({ index: i, total: params.length });\n }\n return success(results);\n }\n\n // ─── Hex formatting ──────────────────────────────────────\n\n /** Ensure a hex string has the `0x` prefix. */\n private ensure0x(hex: string): string {\n return hex.startsWith('0x') ? hex : `0x${hex}`;\n }\n\n /** Ensure a hex string is `0x`-prefixed and zero-padded to 64 hex chars (32 bytes). */\n private padHex64(hex: string): string {\n const stripped = hex.startsWith('0x') ? hex.slice(2) : hex;\n return `0x${stripped.padStart(64, '0')}`;\n }\n\n // ─── Event translation ────────────────────────────────────\n\n private deviceConnectHandler = (data: { device: ConnectorDevice }): void => {\n const deviceInfo = this.connectorDeviceToDeviceInfo(data.device);\n this._discoveredDevices.set(deviceInfo.connectId, deviceInfo);\n this.emitter.emit(DEVICE.CONNECT, {\n type: DEVICE.CONNECT,\n payload: deviceInfo,\n });\n };\n\n private deviceDisconnectHandler = (data: { connectId: string }): void => {\n this._discoveredDevices.delete(data.connectId);\n this.emitter.emit(DEVICE.DISCONNECT, {\n type: DEVICE.DISCONNECT,\n payload: { connectId: data.connectId },\n });\n };\n\n private uiRequestHandler = (data: { type: string; payload?: unknown }): void => {\n this.handleUiEvent(data);\n };\n\n private uiEventHandler = (data: { type: string; payload?: unknown }): void => {\n this.handleUiEvent(data);\n };\n\n private registerEventListeners(): void {\n this.connector.on('device-connect', this.deviceConnectHandler);\n this.connector.on('device-disconnect', this.deviceDisconnectHandler);\n this.connector.on('ui-request', this.uiRequestHandler);\n this.connector.on('ui-event', this.uiEventHandler);\n }\n\n private unregisterEventListeners(): void {\n this.connector.off('device-connect', this.deviceConnectHandler);\n this.connector.off('device-disconnect', this.deviceDisconnectHandler);\n this.connector.off('ui-request', this.uiRequestHandler);\n this.connector.off('ui-event', this.uiEventHandler);\n }\n\n private handleUiEvent(event: { type: string; payload?: unknown }): void {\n if (!event.type) return;\n\n const payload = event.payload as Record<string, unknown> | undefined;\n const devicePayload = (payload?.['device'] as Record<string, unknown>) ?? payload;\n const deviceInfo = devicePayload ? this.extractDeviceInfoFromPayload(devicePayload) : this.unknownDevice();\n\n switch (event.type) {\n case 'ui-request_pin':\n this.emitter.emit(UI_REQUEST.REQUEST_PIN, {\n type: UI_REQUEST.REQUEST_PIN,\n payload: { device: deviceInfo },\n });\n if (this._uiHandler?.onPinRequest) {\n this._uiHandler.onPinRequest(deviceInfo).then((pin) => {\n this.connector.uiResponse({\n type: 'receive-pin',\n payload: pin,\n });\n }).catch(() => {\n // User cancelled -- no response sent\n });\n }\n break;\n case 'ui-request_passphrase':\n this.emitter.emit(UI_REQUEST.REQUEST_PASSPHRASE, {\n type: UI_REQUEST.REQUEST_PASSPHRASE,\n payload: { device: deviceInfo },\n });\n if (this._uiHandler?.onPassphraseRequest) {\n this._uiHandler.onPassphraseRequest(deviceInfo).then((result) => {\n const response = typeof result === 'string'\n ? { passphrase: result, onDevice: false }\n : result ?? { passphrase: '', onDevice: false };\n if (response.onDevice) {\n this.connector.uiResponse({\n type: 'receive-passphrase',\n payload: {\n value: '',\n passphraseOnDevice: true,\n save: false,\n },\n });\n } else {\n this.connector.uiResponse({\n type: 'receive-passphrase',\n payload: {\n value: response.passphrase,\n passphraseOnDevice: false,\n save: false,\n },\n });\n }\n }).catch(() => {\n // User cancelled -- no response sent\n });\n }\n break;\n case 'ui-request_confirmation':\n this.emitter.emit(UI_REQUEST.REQUEST_BUTTON, {\n type: UI_REQUEST.REQUEST_BUTTON,\n payload: { device: deviceInfo },\n });\n break;\n }\n }\n\n private connectorDeviceToDeviceInfo(device: ConnectorDevice): DeviceInfo {\n return {\n vendor: 'trezor',\n model: device.model ?? 'unknown',\n firmwareVersion: '',\n deviceId: device.deviceId,\n connectId: device.connectId,\n label: device.name,\n connectionType: 'usb' as ConnectionType,\n };\n }\n\n private extractDeviceInfoFromPayload(payload: Record<string, unknown>): DeviceInfo {\n const features = payload['features'] as Record<string, unknown> | undefined;\n return {\n vendor: 'trezor',\n model: (features?.['model'] as string) ?? (payload['model'] as string) ?? 'unknown',\n firmwareVersion: features\n ? `${features['major_version'] ?? 0}.${features['minor_version'] ?? 0}.${features['patch_version'] ?? 0}`\n : '',\n deviceId: (features?.['device_id'] as string) ?? (payload['id'] as string) ?? '',\n connectId: (payload['path'] as string) ?? '',\n label: (features?.['label'] as string) ?? (payload['label'] as string),\n connectionType: 'usb' as ConnectionType,\n };\n }\n\n private unknownDevice(): DeviceInfo {\n return {\n vendor: 'trezor',\n model: 'unknown',\n firmwareVersion: '',\n deviceId: '',\n connectId: '',\n connectionType: 'usb',\n };\n }\n}\n","import { AbstractProxyClient } from '@bytezhang/hardware-transport-core';\nimport type { ITrezorConnect, TrezorConnectResponse } from './types';\n\n/**\n * Trezor method stubs on top of AbstractProxyClient.\n *\n * All cross-process Trezor proxy clients (Electron IPC, Extension messaging)\n * extend this class. They only need to implement:\n * - `sendCall()` — the transport channel\n * - `dispose()` / `cancel()` / `uiResponse()` — lifecycle\n *\n * The 11 TrezorConnect method stubs are defined here once.\n */\nexport abstract class TrezorProxyClient extends AbstractProxyClient implements ITrezorConnect {\n abstract dispose(): void;\n abstract cancel(reason?: string): void;\n abstract uiResponse(response: { type: string; payload: unknown }): void;\n\n // ─── TrezorConnect method stubs — all delegate to call() ────\n ethereumGetAddress(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumGetAddress', params) as Promise<TrezorConnectResponse>;\n }\n ethereumGetPublicKey(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumGetPublicKey', params) as Promise<TrezorConnectResponse>;\n }\n ethereumSignTransaction(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumSignTransaction', params) as Promise<TrezorConnectResponse>;\n }\n ethereumSignMessage(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumSignMessage', params) as Promise<TrezorConnectResponse>;\n }\n ethereumSignTypedData(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumSignTypedData', params) as Promise<TrezorConnectResponse>;\n }\n getAddress(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('getAddress', params) as Promise<TrezorConnectResponse>;\n }\n getPublicKey(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('getPublicKey', params) as Promise<TrezorConnectResponse>;\n }\n signTransaction(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('signTransaction', params) as Promise<TrezorConnectResponse>;\n }\n signMessage(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('signMessage', params) as Promise<TrezorConnectResponse>;\n }\n solanaGetAddress(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('solanaGetAddress', params) as Promise<TrezorConnectResponse>;\n }\n solanaSignTransaction(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('solanaSignTransaction', params) as Promise<TrezorConnectResponse>;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/TrezorAdapter.ts","../src/TrezorProxyClient.ts"],"sourcesContent":["import {\n type IHardwareWallet,\n type IUiHandler,\n type IConnector,\n type ConnectorDevice,\n type ChainCapability,\n type DeviceEventListener,\n type ConnectionType,\n type DeviceInfo,\n type TransportType,\n type Response,\n type IEvmMethods,\n type IBtcMethods,\n type ISolMethods,\n type ITronMethods,\n type EvmGetAddressParams,\n type EvmAddress,\n type EvmGetPublicKeyParams,\n type EvmPublicKey,\n type EvmSignTxParams,\n type EvmSignedTx,\n type EvmSignMsgParams,\n type EvmSignTypedDataParams,\n type EvmSignature,\n type ProgressCallback,\n type BtcGetAddressParams,\n type BtcAddress,\n type BtcGetPublicKeyParams,\n type BtcPublicKey,\n type BtcSignTxParams,\n type BtcSignedTx,\n type BtcSignMsgParams,\n type BtcSignature,\n type SolGetAddressParams,\n type SolAddress,\n type SolGetPublicKeyParams,\n type SolPublicKey,\n type SolSignTxParams,\n type SolSignedTx,\n type SolSignMsgParams,\n type SolSignature,\n type HardwareEventMap,\n type ChainForFingerprint,\n HardwareErrorCode,\n success,\n failure,\n DEVICE,\n UI_REQUEST,\n TypedEventEmitter,\n} from '@bytezhang/hardware-wallet-core';\n\n/**\n * Trezor hardware wallet adapter that delegates to an IConnector.\n *\n * This is a thin translation layer that:\n * - Accepts a pre-configured IConnector (transport decisions are made at connector creation time)\n * - Translates IHardwareWallet method calls to connector.call() invocations\n * - Maps connector results/errors to our Response<T> format with enriched error messages\n * - Translates connector events to HardwareEventMap events\n * - Integrates with IUiHandler for interactive flows (PIN, passphrase)\n */\nexport class TrezorAdapter implements IHardwareWallet {\n readonly vendor = 'trezor' as const;\n\n private readonly connector: IConnector;\n private readonly emitter = new TypedEventEmitter<HardwareEventMap>();\n\n private _uiHandler: Partial<IUiHandler> | null = null;\n\n // Device cache: tracks discovered devices from connector events\n private _discoveredDevices = new Map<string, DeviceInfo>();\n\n // Session tracking: maps connectId -> sessionId\n private _sessions = new Map<string, string>();\n\n constructor(connector: IConnector) {\n this.connector = connector;\n this.registerEventListeners();\n }\n\n // ─── Transport ──────────────────────────────────────────\n // Transport is decided at connector creation time. These methods\n // satisfy the IHardwareWallet interface with sensible defaults.\n\n get activeTransport(): TransportType | null {\n return 'usb';\n }\n\n getAvailableTransports(): TransportType[] {\n return ['usb'];\n }\n\n async switchTransport(_type: TransportType): Promise<void> {\n // Transport is fixed at connector creation time.\n // To switch transport, create a new TrezorAdapter with a different connector.\n }\n\n // ─── UI handler ────────────────────────────────────────────\n\n setUiHandler(handler: Partial<IUiHandler>): void {\n this._uiHandler = handler;\n }\n\n // ─── Lifecycle ────────────────────────────────────────────\n\n async init(_config?: unknown): Promise<void> {\n // Connector is injected via constructor, already initialized.\n // Nothing to do here.\n }\n\n async dispose(): Promise<void> {\n this.unregisterEventListeners();\n this.connector.reset();\n this._uiHandler = null;\n this._discoveredDevices.clear();\n this._sessions.clear();\n this.emitter.removeAllListeners();\n }\n\n // ─── Device management ────────────────────────────────────\n\n async searchDevices(): Promise<DeviceInfo[]> {\n await this._ensureDevicePermission();\n\n const devices = await this.connector.searchDevices();\n\n for (const d of devices) {\n if (d.connectId && !this._discoveredDevices.has(d.connectId)) {\n this._discoveredDevices.set(d.connectId, this.connectorDeviceToDeviceInfo(d));\n }\n }\n\n // If no devices found, ensure permission (no connectId = search context)\n if (this._discoveredDevices.size === 0) {\n await this._ensureDevicePermission();\n }\n\n return Array.from(this._discoveredDevices.values());\n }\n\n async connectDevice(connectId: string): Promise<Response<string>> {\n try {\n const session = await this.connector.connect(connectId);\n this._sessions.set(connectId, session.sessionId);\n\n // Update device cache with richer info from session\n if (session.deviceInfo) {\n this._discoveredDevices.set(connectId, session.deviceInfo);\n }\n\n return success(connectId);\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n async disconnectDevice(connectId: string): Promise<void> {\n const sessionId = this._sessions.get(connectId);\n if (sessionId) {\n await this.connector.disconnect(sessionId);\n this._sessions.delete(connectId);\n }\n }\n\n async getDeviceInfo(\n connectId: string,\n deviceId: string,\n ): Promise<Response<DeviceInfo>> {\n await this._ensureDevicePermission(connectId, deviceId);\n\n // Look up the device in the cache populated by event handlers / searchDevices.\n // Try connectId first (the USB path), then fall back to scanning by deviceId.\n const cached =\n this._discoveredDevices.get(connectId) ??\n Array.from(this._discoveredDevices.values()).find(\n (d) => d.deviceId === deviceId,\n );\n\n if (cached) {\n return success(cached);\n }\n\n return failure(\n HardwareErrorCode.DeviceNotFound,\n 'Device not found in cache. Call searchDevices() or wait for a device-connected event first.',\n );\n }\n\n getSupportedChains(): ChainCapability[] {\n return ['evm', 'btc', 'sol'];\n }\n\n // ─── Event handling ───────────────────────────────────────\n\n on<K extends keyof HardwareEventMap>(event: K, listener: (event: HardwareEventMap[K]) => void): void;\n on(event: string, listener: DeviceEventListener): void;\n on(event: string, listener: (event: any) => void): void {\n this.emitter.on(event, listener);\n }\n\n off<K extends keyof HardwareEventMap>(event: K, listener: (event: HardwareEventMap[K]) => void): void;\n off(event: string, listener: DeviceEventListener): void;\n off(event: string, listener: (event: any) => void): void {\n this.emitter.off(event, listener);\n }\n\n cancel(connectId: string): void {\n const sessionId = this._sessions.get(connectId) ?? connectId;\n void this.connector.cancel(sessionId);\n }\n\n // ─── Chain fingerprint ────────────────────────────────────\n\n /**\n * For Trezor, the chain fingerprint is the hardware device_id from firmware.\n * Trezor has a persistent device identity, so no address derivation is needed.\n */\n async getChainFingerprint(\n connectId: string,\n deviceId: string,\n _chain: ChainForFingerprint,\n ): Promise<Response<string>> {\n await this._ensureDevicePermission(connectId, deviceId);\n\n // Look up the device in cache to get the firmware device_id\n const cached =\n this._discoveredDevices.get(connectId) ??\n Array.from(this._discoveredDevices.values()).find(\n (d) => d.deviceId === deviceId,\n );\n\n if (cached?.deviceId) {\n return success(cached.deviceId);\n }\n\n // Fall back: try to get device info from the connector\n try {\n const result = await this.connectorCall(connectId, 'getFeatures', {}) as {\n device_id?: string;\n };\n if (result.device_id) {\n return success(result.device_id);\n }\n } catch {\n // Ignore — fall through to error\n }\n\n return failure(\n HardwareErrorCode.DeviceNotFound,\n 'Could not determine Trezor device identity. Ensure the device is connected.',\n );\n }\n\n // ─── Chain capability accessors ────────────────────────────\n\n private _evmMethods: IEvmMethods = {\n evmGetAddress: (connectId, deviceId, params) =>\n this._evmGetAddress(connectId, deviceId, params),\n evmGetAddresses: (connectId, deviceId, params, onProgress) =>\n this._evmGetAddresses(connectId, deviceId, params, onProgress),\n evmGetPublicKey: (connectId, deviceId, params) =>\n this._evmGetPublicKey(connectId, deviceId, params),\n evmSignTransaction: (connectId, deviceId, params) =>\n this._evmSignTransaction(connectId, deviceId, params),\n evmSignMessage: (connectId, deviceId, params) =>\n this._evmSignMessage(connectId, deviceId, params),\n evmSignTypedData: (connectId, deviceId, params) =>\n this._evmSignTypedData(connectId, deviceId, params),\n };\n\n private _btcMethods: IBtcMethods = {\n btcGetAddress: (connectId, deviceId, params) =>\n this._btcGetAddress(connectId, deviceId, params),\n btcGetAddresses: (connectId, deviceId, params, onProgress) =>\n this._btcGetAddresses(connectId, deviceId, params, onProgress),\n btcGetPublicKey: (connectId, deviceId, params) =>\n this._btcGetPublicKey(connectId, deviceId, params),\n btcSignTransaction: (connectId, deviceId, params) =>\n this._btcSignTransaction(connectId, deviceId, params),\n btcSignMessage: (connectId, deviceId, params) =>\n this._btcSignMessage(connectId, deviceId, params),\n btcGetMasterFingerprint: (connectId, deviceId) =>\n this._btcGetMasterFingerprint(connectId, deviceId),\n };\n\n private _solMethods: ISolMethods = {\n solGetAddress: (connectId, deviceId, params) =>\n this._solGetAddress(connectId, deviceId, params),\n solGetAddresses: (connectId, deviceId, params, onProgress) =>\n this._solGetAddresses(connectId, deviceId, params, onProgress),\n solGetPublicKey: (connectId, deviceId, params) =>\n this._solGetPublicKey(connectId, deviceId, params),\n solSignTransaction: (connectId, deviceId, params) =>\n this._solSignTransaction(connectId, deviceId, params),\n solSignMessage: (connectId, deviceId, params) =>\n this._solSignMessage(connectId, deviceId, params),\n };\n\n evm(): IEvmMethods | null { return this._evmMethods; }\n btc(): IBtcMethods | null { return this._btcMethods; }\n sol(): ISolMethods | null { return this._solMethods; }\n tron(): ITronMethods | null { return null; }\n\n // ─── EVM methods (private) ────────────────────────────────\n\n private async _evmGetAddress(\n connectId: string,\n _deviceId: string,\n params: EvmGetAddressParams,\n ): Promise<Response<EvmAddress>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmGetAddress', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n chainId: params.chainId,\n }) as { address: string; path: string };\n\n return success({\n address: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _evmGetAddresses(\n connectId: string,\n deviceId: string,\n params: EvmGetAddressParams[],\n onProgress?: ProgressCallback,\n ): Promise<Response<EvmAddress[]>> {\n return this.batchCall(\n params,\n (p) => this._evmGetAddress(connectId, deviceId, p),\n onProgress,\n );\n }\n\n private async _evmGetPublicKey(\n connectId: string,\n _deviceId: string,\n params: EvmGetPublicKeyParams,\n ): Promise<Response<EvmPublicKey>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmGetPublicKey', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n }) as { publicKey: string; path: string };\n\n return success({\n publicKey: result.publicKey,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _evmSignTransaction(\n connectId: string,\n _deviceId: string,\n params: EvmSignTxParams,\n ): Promise<Response<EvmSignedTx>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmSignTransaction', {\n path: params.path,\n transaction: {\n to: params.to,\n value: params.value,\n chainId: params.chainId,\n nonce: params.nonce,\n gasLimit: params.gasLimit,\n gasPrice: params.gasPrice,\n maxFeePerGas: params.maxFeePerGas,\n maxPriorityFeePerGas: params.maxPriorityFeePerGas,\n accessList: params.accessList,\n data: params.data,\n },\n }) as { v: string; r: string; s: string; serializedTx?: string };\n\n return success({\n v: this.ensure0x(result.v),\n r: this.padHex64(result.r),\n s: this.padHex64(result.s),\n serializedTx: result.serializedTx,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _evmSignMessage(\n connectId: string,\n _deviceId: string,\n params: EvmSignMsgParams,\n ): Promise<Response<EvmSignature>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'evmSignMessage', {\n path: params.path,\n message: params.message,\n hex: params.hex,\n }) as { signature: string; address?: string };\n\n return success({\n signature: this.ensure0x(result.signature),\n address: result.address,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _evmSignTypedData(\n connectId: string,\n _deviceId: string,\n params: EvmSignTypedDataParams,\n ): Promise<Response<EvmSignature>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const callParams: Record<string, unknown> = {\n path: params.path,\n };\n\n if (params.mode !== 'hash') {\n callParams['mode'] = params.mode ?? 'full';\n callParams['data'] = params.data;\n callParams['metamaskV4Compat'] = params.metamaskV4Compat ?? true;\n } else {\n callParams['mode'] = 'hash';\n callParams['domainSeparatorHash'] = params.domainSeparatorHash;\n callParams['messageHash'] = params.messageHash;\n }\n\n const result = await this.connectorCall(connectId, 'evmSignTypedData', callParams) as {\n signature: string;\n address?: string;\n };\n\n return success({\n signature: this.ensure0x(result.signature),\n address: result.address,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n // ─── BTC methods (private) ─────────────────────────────────\n\n private async _btcGetAddress(\n connectId: string,\n _deviceId: string,\n params: BtcGetAddressParams,\n ): Promise<Response<BtcAddress>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcGetAddress', {\n path: params.path,\n coin: params.coin,\n showOnDevice: params.showOnDevice,\n scriptType: params.scriptType,\n }) as { address: string; path: string };\n\n return success({\n address: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _btcGetAddresses(\n connectId: string,\n deviceId: string,\n params: BtcGetAddressParams[],\n onProgress?: ProgressCallback,\n ): Promise<Response<BtcAddress[]>> {\n return this.batchCall(\n params,\n (p) => this._btcGetAddress(connectId, deviceId, p),\n onProgress,\n );\n }\n\n private async _btcGetPublicKey(\n connectId: string,\n _deviceId: string,\n params: BtcGetPublicKeyParams,\n ): Promise<Response<BtcPublicKey>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcGetPublicKey', {\n path: params.path,\n coin: params.coin,\n showOnDevice: params.showOnDevice,\n }) as {\n xpub: string;\n publicKey: string;\n fingerprint: number;\n chainCode: string;\n path: string;\n depth: number;\n };\n\n return success({\n xpub: result.xpub,\n publicKey: result.publicKey,\n fingerprint: result.fingerprint,\n chainCode: result.chainCode,\n path: params.path,\n depth: result.depth,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _btcSignTransaction(\n connectId: string,\n _deviceId: string,\n params: BtcSignTxParams,\n ): Promise<Response<BtcSignedTx>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcSignTransaction', {\n inputs: params.inputs ?? [],\n outputs: params.outputs ?? [],\n refTxs: params.refTxs,\n coin: params.coin,\n locktime: params.locktime,\n version: params.version,\n }) as { signatures: string[]; serializedTx: string; txid?: string };\n\n return success({\n signatures: result.signatures,\n serializedTx: result.serializedTx,\n txid: result.txid,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _btcSignMessage(\n connectId: string,\n _deviceId: string,\n params: BtcSignMsgParams,\n ): Promise<Response<BtcSignature>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'btcSignMessage', {\n path: params.path,\n message: params.message,\n coin: params.coin,\n }) as { signature: string; address: string };\n\n return success({\n signature: result.signature,\n address: result.address,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _btcGetMasterFingerprint(\n connectId: string,\n _deviceId: string,\n ): Promise<Response<{ masterFingerprint: string }>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n // The parent fingerprint of a child of \"m\" IS the master fingerprint.\n // Query \"m/0'\" and read its `fingerprint` field (parent key fingerprint).\n const result = await this.connectorCall(connectId, 'btcGetPublicKey', {\n path: \"m/0'\",\n }) as { fingerprint: number };\n\n const fp = (result.fingerprint) >>> 0;\n const hex = fp.toString(16).padStart(8, '0');\n return success({ masterFingerprint: hex });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n // ─── Solana methods (private) ──────────────────────────────\n\n private async _solGetAddress(\n connectId: string,\n _deviceId: string,\n params: SolGetAddressParams,\n ): Promise<Response<SolAddress>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'solGetAddress', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n }) as { address: string; path: string };\n\n return success({\n address: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _solGetAddresses(\n connectId: string,\n deviceId: string,\n params: SolGetAddressParams[],\n onProgress?: ProgressCallback,\n ): Promise<Response<SolAddress[]>> {\n return this.batchCall(\n params,\n (p) => this._solGetAddress(connectId, deviceId, p),\n onProgress,\n );\n }\n\n private async _solGetPublicKey(\n connectId: string,\n _deviceId: string,\n params: SolGetPublicKeyParams,\n ): Promise<Response<SolPublicKey>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n // Solana address IS the public key\n const result = await this.connectorCall(connectId, 'solGetAddress', {\n path: params.path,\n showOnDevice: params.showOnDevice,\n }) as { address: string; path: string };\n\n return success({\n publicKey: result.address,\n path: params.path,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _solSignTransaction(\n connectId: string,\n _deviceId: string,\n params: SolSignTxParams,\n ): Promise<Response<SolSignedTx>> {\n await this._ensureDevicePermission(connectId, _deviceId);\n try {\n const result = await this.connectorCall(connectId, 'solSignTransaction', {\n path: params.path,\n serializedTx: params.serializedTx,\n additionalInfo: params.additionalInfo,\n }) as { signature: string };\n\n return success({\n signature: result.signature,\n });\n } catch (err) {\n return this.errorToFailure(err);\n }\n }\n\n private async _solSignMessage(\n _connectId: string,\n _deviceId: string,\n _params: SolSignMsgParams,\n ): Promise<Response<SolSignature>> {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Solana signMessage is not supported by Trezor Connect',\n );\n }\n\n // ─── Private helpers ──────────────────────────────────────\n\n /**\n * Call the connector with session resolution.\n * Looks up sessionId from connectId, falls back to connectId itself.\n */\n private async connectorCall(\n connectId: string,\n method: string,\n params: unknown,\n ): Promise<unknown> {\n const sessionId = this._sessions.get(connectId) ?? connectId;\n return this.connector.call(sessionId, method, params);\n }\n\n /**\n * Ensure device permission before proceeding.\n * - No connectId (searchDevices): check environment-level permission\n * - With connectId (business methods): check device-level permission\n * If not granted, calls onDevicePermission so the consumer can request access.\n */\n private async _ensureDevicePermission(connectId?: string, deviceId?: string): Promise<void> {\n const transportType: TransportType = 'usb';\n let granted = false;\n let context: Record<string, unknown> | undefined;\n\n if (this._uiHandler?.checkDevicePermission) {\n try {\n const result = await this._uiHandler.checkDevicePermission({ transportType, connectId, deviceId });\n granted = result.granted;\n context = result.context;\n } catch {\n granted = false;\n }\n }\n\n if (!granted) {\n try {\n await this._uiHandler?.onDevicePermission?.({ transportType, context });\n } catch {\n // UI handler cancelled or failed\n }\n }\n }\n\n /**\n * Convert a thrown error to a Response failure.\n * Parses TrezorConnect error strings to map to HardwareErrorCode values.\n */\n private errorToFailure<T>(err: unknown): Response<T> {\n const message = err instanceof Error ? err.message : String(err);\n const code = this.parseErrorCode(message);\n const enriched = this.enrichErrorMessage(code, message);\n return failure(code, enriched);\n }\n\n /**\n * Parse TrezorConnect error codes from error message strings.\n * The connector throws errors with messages like \"Trezor ethereumGetAddress failed: <error>\".\n * We also check for embedded code patterns.\n */\n private parseErrorCode(message: string): HardwareErrorCode {\n // Check for known error patterns in the message\n if (message.includes('Failure_ActionCancelled') || message.includes('Failure_Cancel')) {\n return HardwareErrorCode.UserRejected;\n }\n if (message.includes('Failure_PinInvalid') || message.includes('Failure_PinMismatch')) {\n return HardwareErrorCode.PinInvalid;\n }\n if (message.includes('Failure_PinCancelled')) {\n return HardwareErrorCode.PinCancelled;\n }\n if (message.includes('Failure_PassphraseRejected')) {\n return HardwareErrorCode.PassphraseRejected;\n }\n if (message.includes('Device_UsedElsewhere')) {\n return HardwareErrorCode.DeviceBusy;\n }\n if (message.includes('Device_NotFound')) {\n return HardwareErrorCode.DeviceNotFound;\n }\n if (message.includes('Device_InvalidState')) {\n return HardwareErrorCode.DeviceNotInitialized;\n }\n if (message.includes('Transport_Missing')) {\n return HardwareErrorCode.TransportNotAvailable;\n }\n if (message.includes('Transport_DeviceDisconnected')) {\n return HardwareErrorCode.DeviceDisconnected;\n }\n if (message.includes('Failure_FirmwareError')) {\n return HardwareErrorCode.FirmwareTooOld;\n }\n if (message.includes('Method_InvalidParameter') || message.includes('Method_InvalidParams')) {\n return HardwareErrorCode.InvalidParams;\n }\n if (message.includes('Method_NotAllowed')) {\n return HardwareErrorCode.MethodNotSupported;\n }\n return HardwareErrorCode.UnknownError;\n }\n\n /**\n * Enrich error messages with actionable recovery info for the caller.\n */\n private enrichErrorMessage(code: HardwareErrorCode, originalMessage: string): string {\n switch (code) {\n case HardwareErrorCode.PinInvalid:\n return `${originalMessage}. Please re-enter your PIN.`;\n case HardwareErrorCode.PinCancelled:\n return `${originalMessage}. PIN entry was cancelled.`;\n case HardwareErrorCode.DeviceBusy:\n return `${originalMessage}. The device is in use by another application. Close other wallet apps and try again.`;\n case HardwareErrorCode.DeviceDisconnected:\n return `${originalMessage}. Please reconnect the device and try again.`;\n case HardwareErrorCode.TransportNotAvailable:\n return `${originalMessage}. Ensure Trezor Bridge is installed and running, or connect via USB.`;\n case HardwareErrorCode.FirmwareTooOld:\n return `${originalMessage}. Please update your Trezor firmware via Trezor Suite.`;\n case HardwareErrorCode.DeviceNotInitialized:\n return `${originalMessage}. The device may need to be set up first via Trezor Suite.`;\n default:\n return originalMessage;\n }\n }\n\n /**\n * Generic batch call with progress reporting.\n * If any single call fails, returns the failure immediately.\n */\n private async batchCall<TParam, TResult>(\n params: TParam[],\n callFn: (p: TParam) => Promise<Response<TResult>>,\n onProgress?: ProgressCallback,\n ): Promise<Response<TResult[]>> {\n const results: TResult[] = [];\n for (let i = 0; i < params.length; i++) {\n const result = await callFn(params[i]);\n if (!result.success) {\n return result;\n }\n results.push(result.payload);\n onProgress?.({ index: i, total: params.length });\n }\n return success(results);\n }\n\n // ─── Hex formatting ──────────────────────────────────────\n\n /** Ensure a hex string has the `0x` prefix. */\n private ensure0x(hex: string): string {\n return hex.startsWith('0x') ? hex : `0x${hex}`;\n }\n\n /** Ensure a hex string is `0x`-prefixed and zero-padded to 64 hex chars (32 bytes). */\n private padHex64(hex: string): string {\n const stripped = hex.startsWith('0x') ? hex.slice(2) : hex;\n return `0x${stripped.padStart(64, '0')}`;\n }\n\n // ─── Event translation ────────────────────────────────────\n\n private deviceConnectHandler = (data: { device: ConnectorDevice }): void => {\n const deviceInfo = this.connectorDeviceToDeviceInfo(data.device);\n this._discoveredDevices.set(deviceInfo.connectId, deviceInfo);\n this.emitter.emit(DEVICE.CONNECT, {\n type: DEVICE.CONNECT,\n payload: deviceInfo,\n });\n };\n\n private deviceDisconnectHandler = (data: { connectId: string }): void => {\n this._discoveredDevices.delete(data.connectId);\n this.emitter.emit(DEVICE.DISCONNECT, {\n type: DEVICE.DISCONNECT,\n payload: { connectId: data.connectId },\n });\n };\n\n private uiRequestHandler = (data: { type: string; payload?: unknown }): void => {\n this.handleUiEvent(data);\n };\n\n private uiEventHandler = (data: { type: string; payload?: unknown }): void => {\n this.handleUiEvent(data);\n };\n\n private registerEventListeners(): void {\n this.connector.on('device-connect', this.deviceConnectHandler);\n this.connector.on('device-disconnect', this.deviceDisconnectHandler);\n this.connector.on('ui-request', this.uiRequestHandler);\n this.connector.on('ui-event', this.uiEventHandler);\n }\n\n private unregisterEventListeners(): void {\n this.connector.off('device-connect', this.deviceConnectHandler);\n this.connector.off('device-disconnect', this.deviceDisconnectHandler);\n this.connector.off('ui-request', this.uiRequestHandler);\n this.connector.off('ui-event', this.uiEventHandler);\n }\n\n private handleUiEvent(event: { type: string; payload?: unknown }): void {\n if (!event.type) return;\n\n const payload = event.payload as Record<string, unknown> | undefined;\n const devicePayload = (payload?.['device'] as Record<string, unknown>) ?? payload;\n const deviceInfo = devicePayload ? this.extractDeviceInfoFromPayload(devicePayload) : this.unknownDevice();\n\n switch (event.type) {\n case 'ui-request_pin':\n this.emitter.emit(UI_REQUEST.REQUEST_PIN, {\n type: UI_REQUEST.REQUEST_PIN,\n payload: { device: deviceInfo },\n });\n if (this._uiHandler?.onPinRequest) {\n this._uiHandler.onPinRequest(deviceInfo).then((pin) => {\n this.connector.uiResponse({\n type: 'receive-pin',\n payload: pin,\n });\n }).catch(() => {\n // User cancelled -- no response sent\n });\n }\n break;\n case 'ui-request_passphrase':\n this.emitter.emit(UI_REQUEST.REQUEST_PASSPHRASE, {\n type: UI_REQUEST.REQUEST_PASSPHRASE,\n payload: { device: deviceInfo },\n });\n if (this._uiHandler?.onPassphraseRequest) {\n this._uiHandler.onPassphraseRequest(deviceInfo).then((result) => {\n const response = typeof result === 'string'\n ? { passphrase: result, onDevice: false }\n : result ?? { passphrase: '', onDevice: false };\n if (response.onDevice) {\n this.connector.uiResponse({\n type: 'receive-passphrase',\n payload: {\n value: '',\n passphraseOnDevice: true,\n save: false,\n },\n });\n } else {\n this.connector.uiResponse({\n type: 'receive-passphrase',\n payload: {\n value: response.passphrase,\n passphraseOnDevice: false,\n save: false,\n },\n });\n }\n }).catch(() => {\n // User cancelled -- no response sent\n });\n }\n break;\n case 'ui-request_confirmation':\n this.emitter.emit(UI_REQUEST.REQUEST_BUTTON, {\n type: UI_REQUEST.REQUEST_BUTTON,\n payload: { device: deviceInfo },\n });\n break;\n }\n }\n\n private connectorDeviceToDeviceInfo(device: ConnectorDevice): DeviceInfo {\n return {\n vendor: 'trezor',\n model: device.model ?? 'unknown',\n firmwareVersion: '',\n deviceId: device.deviceId,\n connectId: device.connectId,\n label: device.name,\n connectionType: 'usb' as ConnectionType,\n };\n }\n\n private extractDeviceInfoFromPayload(payload: Record<string, unknown>): DeviceInfo {\n const features = payload['features'] as Record<string, unknown> | undefined;\n return {\n vendor: 'trezor',\n model: (features?.['model'] as string) ?? (payload['model'] as string) ?? 'unknown',\n firmwareVersion: features\n ? `${features['major_version'] ?? 0}.${features['minor_version'] ?? 0}.${features['patch_version'] ?? 0}`\n : '',\n deviceId: (features?.['device_id'] as string) ?? (payload['id'] as string) ?? '',\n connectId: (payload['path'] as string) ?? '',\n label: (features?.['label'] as string) ?? (payload['label'] as string),\n connectionType: 'usb' as ConnectionType,\n };\n }\n\n private unknownDevice(): DeviceInfo {\n return {\n vendor: 'trezor',\n model: 'unknown',\n firmwareVersion: '',\n deviceId: '',\n connectId: '',\n connectionType: 'usb',\n };\n }\n}\n","import { AbstractProxyClient } from '@bytezhang/hardware-transport-core';\nimport type { ITrezorConnect, TrezorConnectResponse } from './types';\n\n/**\n * Trezor method stubs on top of AbstractProxyClient.\n *\n * All cross-process Trezor proxy clients (Electron IPC, Extension messaging)\n * extend this class. They only need to implement:\n * - `sendCall()` — the transport channel\n * - `dispose()` / `cancel()` / `uiResponse()` — lifecycle\n *\n * The 11 TrezorConnect method stubs are defined here once.\n */\nexport abstract class TrezorProxyClient extends AbstractProxyClient implements ITrezorConnect {\n abstract dispose(): void;\n abstract cancel(reason?: string): void;\n abstract uiResponse(response: { type: string; payload: unknown }): void;\n\n // ─── TrezorConnect method stubs — all delegate to call() ────\n ethereumGetAddress(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumGetAddress', params) as Promise<TrezorConnectResponse>;\n }\n ethereumGetPublicKey(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumGetPublicKey', params) as Promise<TrezorConnectResponse>;\n }\n ethereumSignTransaction(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumSignTransaction', params) as Promise<TrezorConnectResponse>;\n }\n ethereumSignMessage(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumSignMessage', params) as Promise<TrezorConnectResponse>;\n }\n ethereumSignTypedData(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('ethereumSignTypedData', params) as Promise<TrezorConnectResponse>;\n }\n getAddress(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('getAddress', params) as Promise<TrezorConnectResponse>;\n }\n getPublicKey(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('getPublicKey', params) as Promise<TrezorConnectResponse>;\n }\n signTransaction(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('signTransaction', params) as Promise<TrezorConnectResponse>;\n }\n signMessage(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('signMessage', params) as Promise<TrezorConnectResponse>;\n }\n solanaGetAddress(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('solanaGetAddress', params) as Promise<TrezorConnectResponse>;\n }\n solanaSignTransaction(params: Record<string, unknown>): Promise<TrezorConnectResponse> {\n return this.call('solanaSignTransaction', params) as Promise<TrezorConnectResponse>;\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bytezhang/hardware-trezor-adapter",
3
- "version": "0.0.29",
3
+ "version": "0.0.30",
4
4
  "description": "Trezor hardware wallet adapter using IConnector abstraction",
5
5
  "author": "OneKey",
6
6
  "license": "MIT",
@@ -29,8 +29,8 @@
29
29
  "test": "vitest run"
30
30
  },
31
31
  "dependencies": {
32
- "@bytezhang/hardware-wallet-core": "0.0.29",
33
- "@bytezhang/hardware-transport-core": "0.0.29"
32
+ "@bytezhang/hardware-wallet-core": "0.0.30",
33
+ "@bytezhang/hardware-transport-core": "0.0.30"
34
34
  },
35
35
  "devDependencies": {
36
36
  "rimraf": "^5.0.0"