@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 +25 -24
- package/dist/index.d.ts +25 -24
- package/dist/index.js +59 -49
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +59 -49
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IHardwareWallet, IConnector, TransportType, IUiHandler, DeviceInfo, Response, ChainCapability, HardwareEventMap, DeviceEventListener, ChainForFingerprint,
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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,
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
175
|
-
|
|
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
|
|
227
|
+
async _evmGetAddresses(connectId, deviceId, params, onProgress) {
|
|
192
228
|
return this.batchCall(
|
|
193
229
|
params,
|
|
194
|
-
(p) => this.
|
|
230
|
+
(p) => this._evmGetAddress(connectId, deviceId, p),
|
|
195
231
|
onProgress
|
|
196
232
|
);
|
|
197
233
|
}
|
|
198
|
-
async
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
335
|
+
async _btcGetAddresses(connectId, deviceId, params, onProgress) {
|
|
300
336
|
return this.batchCall(
|
|
301
337
|
params,
|
|
302
|
-
(p) => this.
|
|
338
|
+
(p) => this._btcGetAddress(connectId, deviceId, p),
|
|
303
339
|
onProgress
|
|
304
340
|
);
|
|
305
341
|
}
|
|
306
|
-
async
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
427
|
+
async _solGetAddresses(connectId, deviceId, params, onProgress) {
|
|
392
428
|
return this.batchCall(
|
|
393
429
|
params,
|
|
394
|
-
(p) => this.
|
|
430
|
+
(p) => this._solGetAddress(connectId, deviceId, p),
|
|
395
431
|
onProgress
|
|
396
432
|
);
|
|
397
433
|
}
|
|
398
|
-
async
|
|
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
|
|
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
|
|
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
|
-
|
|
155
|
-
|
|
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
|
|
207
|
+
async _evmGetAddresses(connectId, deviceId, params, onProgress) {
|
|
172
208
|
return this.batchCall(
|
|
173
209
|
params,
|
|
174
|
-
(p) => this.
|
|
210
|
+
(p) => this._evmGetAddress(connectId, deviceId, p),
|
|
175
211
|
onProgress
|
|
176
212
|
);
|
|
177
213
|
}
|
|
178
|
-
async
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
315
|
+
async _btcGetAddresses(connectId, deviceId, params, onProgress) {
|
|
280
316
|
return this.batchCall(
|
|
281
317
|
params,
|
|
282
|
-
(p) => this.
|
|
318
|
+
(p) => this._btcGetAddress(connectId, deviceId, p),
|
|
283
319
|
onProgress
|
|
284
320
|
);
|
|
285
321
|
}
|
|
286
|
-
async
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
407
|
+
async _solGetAddresses(connectId, deviceId, params, onProgress) {
|
|
372
408
|
return this.batchCall(
|
|
373
409
|
params,
|
|
374
|
-
(p) => this.
|
|
410
|
+
(p) => this._solGetAddress(connectId, deviceId, p),
|
|
375
411
|
onProgress
|
|
376
412
|
);
|
|
377
413
|
}
|
|
378
|
-
async
|
|
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
|
|
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
|
|
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.
|
package/dist/index.mjs.map
CHANGED
|
@@ -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.
|
|
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.
|
|
33
|
-
"@bytezhang/hardware-transport-core": "0.0.
|
|
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"
|