@bytezhang/hardware-trezor-connector 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,92 @@
1
+ import { IConnector, ConnectorDevice, ConnectorSession, ConnectorEventType, ConnectorEventMap } from '@bytezhang/hardware-wallet-core';
2
+
3
+ type ITrezorConnectResponse<T = Record<string, unknown>> = {
4
+ success: true;
5
+ payload: T;
6
+ } | {
7
+ success: false;
8
+ payload: {
9
+ error: string;
10
+ code?: string;
11
+ };
12
+ };
13
+ /**
14
+ * Minimal duck-typed interface for a @trezor/connect instance.
15
+ *
16
+ * Consumers pass in an already-initialized instance (connect-web,
17
+ * connect-webextension, or connect for Node). We only declare the
18
+ * methods this connector actually calls.
19
+ */
20
+ interface ITrezorConnectLike {
21
+ getFeatures(params?: Record<string, unknown>): Promise<ITrezorConnectResponse>;
22
+ ethereumGetAddress(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
23
+ ethereumGetPublicKey(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
24
+ ethereumSignTransaction(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
25
+ ethereumSignMessage(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
26
+ ethereumSignTypedData(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
27
+ getAddress(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
28
+ getPublicKey(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
29
+ signTransaction(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
30
+ signMessage(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
31
+ solanaGetAddress(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
32
+ solanaSignTransaction(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
33
+ uiResponse(response: {
34
+ type: string;
35
+ payload: unknown;
36
+ }): void;
37
+ }
38
+ /**
39
+ * IConnector implementation backed by a @trezor/connect instance.
40
+ *
41
+ * This is a low-level connector that translates generic `call(method, params)`
42
+ * invocations into the appropriate TrezorConnect API calls. It is used by the
43
+ * higher-level TrezorAdapter (via its transport/connector layer) or can be
44
+ * used standalone for simpler integrations.
45
+ */
46
+ declare class TrezorDirectConnector implements IConnector {
47
+ private readonly tc;
48
+ private cachedFeatures;
49
+ private readonly eventHandlers;
50
+ constructor(trezorConnect: ITrezorConnectLike);
51
+ searchDevices(): Promise<ConnectorDevice[]>;
52
+ connect(deviceId?: string): Promise<ConnectorSession>;
53
+ disconnect(_sessionId: string): Promise<void>;
54
+ call(_sessionId: string, method: string, params: unknown): Promise<unknown>;
55
+ cancel(_sessionId: string): Promise<void>;
56
+ uiResponse(response: {
57
+ type: string;
58
+ payload: unknown;
59
+ }): void;
60
+ on<K extends ConnectorEventType>(event: K, handler: (data: ConnectorEventMap[K]) => void): void;
61
+ off<K extends ConnectorEventType>(event: K, handler: (data: ConnectorEventMap[K]) => void): void;
62
+ reset(): void;
63
+ private callEvmGetAddress;
64
+ private callEvmGetPublicKey;
65
+ private callEvmSignTransaction;
66
+ private callEvmSignMessage;
67
+ private callEvmSignTypedData;
68
+ private callBtcGetAddress;
69
+ private callBtcGetPublicKey;
70
+ private callBtcSignTransaction;
71
+ private callBtcSignMessage;
72
+ private callSolGetAddress;
73
+ private callSolSignTransaction;
74
+ private buildFirmwareVersion;
75
+ /** Emit an event to all registered handlers. */
76
+ protected emit<K extends ConnectorEventType>(event: K, data: ConnectorEventMap[K]): void;
77
+ }
78
+
79
+ /**
80
+ * Factory: create a TrezorDirectConnector from a pre-initialized
81
+ * @trezor/connect-* instance.
82
+ *
83
+ * Usage:
84
+ * ```ts
85
+ * import TrezorConnect from '@trezor/connect-web';
86
+ * await TrezorConnect.init({ manifest: { ... } });
87
+ * const connector = createTrezorConnector(TrezorConnect);
88
+ * ```
89
+ */
90
+ declare function createTrezorConnector(trezorConnect: ITrezorConnectLike): IConnector;
91
+
92
+ export { type ITrezorConnectLike, TrezorDirectConnector, createTrezorConnector };
@@ -0,0 +1,92 @@
1
+ import { IConnector, ConnectorDevice, ConnectorSession, ConnectorEventType, ConnectorEventMap } from '@bytezhang/hardware-wallet-core';
2
+
3
+ type ITrezorConnectResponse<T = Record<string, unknown>> = {
4
+ success: true;
5
+ payload: T;
6
+ } | {
7
+ success: false;
8
+ payload: {
9
+ error: string;
10
+ code?: string;
11
+ };
12
+ };
13
+ /**
14
+ * Minimal duck-typed interface for a @trezor/connect instance.
15
+ *
16
+ * Consumers pass in an already-initialized instance (connect-web,
17
+ * connect-webextension, or connect for Node). We only declare the
18
+ * methods this connector actually calls.
19
+ */
20
+ interface ITrezorConnectLike {
21
+ getFeatures(params?: Record<string, unknown>): Promise<ITrezorConnectResponse>;
22
+ ethereumGetAddress(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
23
+ ethereumGetPublicKey(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
24
+ ethereumSignTransaction(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
25
+ ethereumSignMessage(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
26
+ ethereumSignTypedData(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
27
+ getAddress(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
28
+ getPublicKey(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
29
+ signTransaction(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
30
+ signMessage(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
31
+ solanaGetAddress(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
32
+ solanaSignTransaction(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;
33
+ uiResponse(response: {
34
+ type: string;
35
+ payload: unknown;
36
+ }): void;
37
+ }
38
+ /**
39
+ * IConnector implementation backed by a @trezor/connect instance.
40
+ *
41
+ * This is a low-level connector that translates generic `call(method, params)`
42
+ * invocations into the appropriate TrezorConnect API calls. It is used by the
43
+ * higher-level TrezorAdapter (via its transport/connector layer) or can be
44
+ * used standalone for simpler integrations.
45
+ */
46
+ declare class TrezorDirectConnector implements IConnector {
47
+ private readonly tc;
48
+ private cachedFeatures;
49
+ private readonly eventHandlers;
50
+ constructor(trezorConnect: ITrezorConnectLike);
51
+ searchDevices(): Promise<ConnectorDevice[]>;
52
+ connect(deviceId?: string): Promise<ConnectorSession>;
53
+ disconnect(_sessionId: string): Promise<void>;
54
+ call(_sessionId: string, method: string, params: unknown): Promise<unknown>;
55
+ cancel(_sessionId: string): Promise<void>;
56
+ uiResponse(response: {
57
+ type: string;
58
+ payload: unknown;
59
+ }): void;
60
+ on<K extends ConnectorEventType>(event: K, handler: (data: ConnectorEventMap[K]) => void): void;
61
+ off<K extends ConnectorEventType>(event: K, handler: (data: ConnectorEventMap[K]) => void): void;
62
+ reset(): void;
63
+ private callEvmGetAddress;
64
+ private callEvmGetPublicKey;
65
+ private callEvmSignTransaction;
66
+ private callEvmSignMessage;
67
+ private callEvmSignTypedData;
68
+ private callBtcGetAddress;
69
+ private callBtcGetPublicKey;
70
+ private callBtcSignTransaction;
71
+ private callBtcSignMessage;
72
+ private callSolGetAddress;
73
+ private callSolSignTransaction;
74
+ private buildFirmwareVersion;
75
+ /** Emit an event to all registered handlers. */
76
+ protected emit<K extends ConnectorEventType>(event: K, data: ConnectorEventMap[K]): void;
77
+ }
78
+
79
+ /**
80
+ * Factory: create a TrezorDirectConnector from a pre-initialized
81
+ * @trezor/connect-* instance.
82
+ *
83
+ * Usage:
84
+ * ```ts
85
+ * import TrezorConnect from '@trezor/connect-web';
86
+ * await TrezorConnect.init({ manifest: { ... } });
87
+ * const connector = createTrezorConnector(TrezorConnect);
88
+ * ```
89
+ */
90
+ declare function createTrezorConnector(trezorConnect: ITrezorConnectLike): IConnector;
91
+
92
+ export { type ITrezorConnectLike, TrezorDirectConnector, createTrezorConnector };
package/dist/index.js ADDED
@@ -0,0 +1,369 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ TrezorDirectConnector: () => TrezorDirectConnector,
24
+ createTrezorConnector: () => createTrezorConnector
25
+ });
26
+ module.exports = __toCommonJS(index_exports);
27
+
28
+ // src/TrezorDirectConnector.ts
29
+ var TrezorDirectConnector = class {
30
+ constructor(trezorConnect) {
31
+ this.cachedFeatures = null;
32
+ this.eventHandlers = /* @__PURE__ */ new Map();
33
+ this.tc = trezorConnect;
34
+ }
35
+ // ─── IConnector: device discovery ──────────────────────────
36
+ async searchDevices() {
37
+ const result = await this.tc.getFeatures();
38
+ if (!result.success) {
39
+ return [];
40
+ }
41
+ const features = result.payload;
42
+ const deviceId = features.device_id ?? "trezor";
43
+ this.cachedFeatures = features;
44
+ return [
45
+ {
46
+ connectId: deviceId,
47
+ deviceId,
48
+ name: features.label ?? "Trezor",
49
+ model: features.model
50
+ }
51
+ ];
52
+ }
53
+ // ─── IConnector: session management ────────────────────────
54
+ async connect(deviceId) {
55
+ let features = this.cachedFeatures;
56
+ if (!features) {
57
+ const result = await this.tc.getFeatures();
58
+ if (!result.success) {
59
+ throw new Error(`Trezor connect failed: ${result.payload.error}`);
60
+ }
61
+ features = result.payload;
62
+ this.cachedFeatures = features;
63
+ }
64
+ const id = features.device_id ?? "trezor";
65
+ const firmwareVersion = this.buildFirmwareVersion(features);
66
+ return {
67
+ sessionId: deviceId ?? id,
68
+ deviceInfo: {
69
+ vendor: "trezor",
70
+ connectId: id,
71
+ deviceId: id,
72
+ model: features.model ?? "unknown",
73
+ firmwareVersion,
74
+ label: features.label,
75
+ connectionType: "usb"
76
+ }
77
+ };
78
+ }
79
+ async disconnect(_sessionId) {
80
+ }
81
+ // ─── IConnector: method dispatch ───────────────────────────
82
+ async call(_sessionId, method, params) {
83
+ const p = params;
84
+ switch (method) {
85
+ // ── EVM ──
86
+ case "evmGetAddress":
87
+ return this.callEvmGetAddress(p);
88
+ case "evmGetPublicKey":
89
+ return this.callEvmGetPublicKey(p);
90
+ case "evmSignTransaction":
91
+ return this.callEvmSignTransaction(p);
92
+ case "evmSignMessage":
93
+ return this.callEvmSignMessage(p);
94
+ case "evmSignTypedData":
95
+ return this.callEvmSignTypedData(p);
96
+ // ── BTC ──
97
+ case "btcGetAddress":
98
+ return this.callBtcGetAddress(p);
99
+ case "btcGetPublicKey":
100
+ return this.callBtcGetPublicKey(p);
101
+ case "btcSignTransaction":
102
+ return this.callBtcSignTransaction(p);
103
+ case "btcSignMessage":
104
+ return this.callBtcSignMessage(p);
105
+ // ── Solana ──
106
+ case "solGetAddress":
107
+ return this.callSolGetAddress(p);
108
+ case "solSignTransaction":
109
+ return this.callSolSignTransaction(p);
110
+ default:
111
+ throw new Error(`TrezorDirectConnector: unknown method "${method}"`);
112
+ }
113
+ }
114
+ async cancel(_sessionId) {
115
+ }
116
+ // ─── IConnector: UI response ────────────────────────────────
117
+ uiResponse(response) {
118
+ this.tc.uiResponse(response);
119
+ }
120
+ // ─── IConnector: events ────────────────────────────────────
121
+ on(event, handler) {
122
+ if (!this.eventHandlers.has(event)) {
123
+ this.eventHandlers.set(event, /* @__PURE__ */ new Set());
124
+ }
125
+ this.eventHandlers.get(event).add(handler);
126
+ }
127
+ off(event, handler) {
128
+ this.eventHandlers.get(event)?.delete(handler);
129
+ }
130
+ // ─── IConnector: reset ─────────────────────────────────────
131
+ reset() {
132
+ this.cachedFeatures = null;
133
+ this.eventHandlers.clear();
134
+ }
135
+ // ─── Private: EVM method implementations ───────────────────
136
+ async callEvmGetAddress(params) {
137
+ const result = await this.tc.ethereumGetAddress({
138
+ path: params["path"],
139
+ showOnTrezor: params["showOnDevice"] ?? false
140
+ });
141
+ if (!result.success) {
142
+ throw new Error(
143
+ `Trezor ethereumGetAddress failed: ${result.payload.error}`
144
+ );
145
+ }
146
+ return {
147
+ address: result.payload["address"],
148
+ path: params["path"]
149
+ };
150
+ }
151
+ async callEvmGetPublicKey(params) {
152
+ const result = await this.tc.ethereumGetPublicKey({
153
+ path: params["path"],
154
+ showOnTrezor: params["showOnDevice"] ?? false
155
+ });
156
+ if (!result.success) {
157
+ throw new Error(
158
+ `Trezor ethereumGetPublicKey failed: ${result.payload.error}`
159
+ );
160
+ }
161
+ return {
162
+ publicKey: result.payload["publicKey"],
163
+ path: params["path"]
164
+ };
165
+ }
166
+ async callEvmSignTransaction(params) {
167
+ const tx = params["transaction"];
168
+ const isEip1559 = tx.maxFeePerGas !== void 0 && tx.maxPriorityFeePerGas !== void 0;
169
+ const transaction = isEip1559 ? {
170
+ to: tx.to,
171
+ value: tx.value,
172
+ gasLimit: tx.gasLimit,
173
+ nonce: tx.nonce,
174
+ data: tx.data ?? "0x",
175
+ chainId: tx.chainId,
176
+ maxFeePerGas: tx.maxFeePerGas,
177
+ maxPriorityFeePerGas: tx.maxPriorityFeePerGas
178
+ } : {
179
+ to: tx.to,
180
+ value: tx.value,
181
+ gasPrice: tx.gasPrice ?? "0x0",
182
+ gasLimit: tx.gasLimit,
183
+ nonce: tx.nonce,
184
+ data: tx.data ?? "0x",
185
+ chainId: tx.chainId
186
+ };
187
+ const result = await this.tc.ethereumSignTransaction({
188
+ path: params["path"],
189
+ transaction
190
+ });
191
+ if (!result.success) {
192
+ throw new Error(
193
+ `Trezor ethereumSignTransaction failed: ${result.payload.error}`
194
+ );
195
+ }
196
+ return {
197
+ v: result.payload["v"],
198
+ r: result.payload["r"],
199
+ s: result.payload["s"]
200
+ };
201
+ }
202
+ async callEvmSignMessage(params) {
203
+ const result = await this.tc.ethereumSignMessage({
204
+ path: params["path"],
205
+ message: params["message"]
206
+ });
207
+ if (!result.success) {
208
+ throw new Error(
209
+ `Trezor ethereumSignMessage failed: ${result.payload.error}`
210
+ );
211
+ }
212
+ return { signature: result.payload["signature"] };
213
+ }
214
+ async callEvmSignTypedData(params) {
215
+ const mode = params["mode"];
216
+ const connectParams = {
217
+ path: params["path"]
218
+ };
219
+ if (mode === "hash") {
220
+ connectParams["domain_separator_hash"] = params["domainSeparatorHash"];
221
+ connectParams["message_hash"] = params["messageHash"];
222
+ connectParams["metamask_v4_compat"] = true;
223
+ } else {
224
+ connectParams["data"] = params["data"];
225
+ connectParams["metamask_v4_compat"] = params["metamaskV4Compat"] ?? true;
226
+ }
227
+ const result = await this.tc.ethereumSignTypedData(connectParams);
228
+ if (!result.success) {
229
+ throw new Error(
230
+ `Trezor ethereumSignTypedData failed: ${result.payload.error}`
231
+ );
232
+ }
233
+ return {
234
+ signature: result.payload["signature"],
235
+ address: result.payload["address"]
236
+ };
237
+ }
238
+ // ─── Private: BTC method implementations ───────────────────
239
+ async callBtcGetAddress(params) {
240
+ const result = await this.tc.getAddress({
241
+ path: params["path"],
242
+ coin: params["coin"],
243
+ showOnTrezor: params["showOnDevice"] ?? false,
244
+ scriptType: params["scriptType"]
245
+ });
246
+ if (!result.success) {
247
+ throw new Error(
248
+ `Trezor getAddress (BTC) failed: ${result.payload.error}`
249
+ );
250
+ }
251
+ return {
252
+ address: result.payload["address"],
253
+ path: params["path"]
254
+ };
255
+ }
256
+ async callBtcGetPublicKey(params) {
257
+ const result = await this.tc.getPublicKey({
258
+ path: params["path"],
259
+ coin: params["coin"],
260
+ showOnTrezor: params["showOnDevice"] ?? false
261
+ });
262
+ if (!result.success) {
263
+ throw new Error(
264
+ `Trezor getPublicKey (BTC) failed: ${result.payload.error}`
265
+ );
266
+ }
267
+ return {
268
+ xpub: result.payload["xpub"],
269
+ publicKey: result.payload["publicKey"],
270
+ fingerprint: result.payload["fingerprint"],
271
+ chainCode: result.payload["chainCode"],
272
+ path: params["path"]
273
+ };
274
+ }
275
+ async callBtcSignTransaction(params) {
276
+ const result = await this.tc.signTransaction({
277
+ inputs: params["inputs"],
278
+ outputs: params["outputs"],
279
+ refTxs: params["refTxs"],
280
+ coin: params["coin"],
281
+ locktime: params["locktime"],
282
+ version: params["version"]
283
+ });
284
+ if (!result.success) {
285
+ throw new Error(
286
+ `Trezor signTransaction (BTC) failed: ${result.payload.error}`
287
+ );
288
+ }
289
+ return {
290
+ signatures: result.payload["signatures"],
291
+ serializedTx: result.payload["serializedTx"],
292
+ txid: result.payload["txid"]
293
+ };
294
+ }
295
+ async callBtcSignMessage(params) {
296
+ const result = await this.tc.signMessage({
297
+ path: params["path"],
298
+ message: params["message"],
299
+ coin: params["coin"]
300
+ });
301
+ if (!result.success) {
302
+ throw new Error(
303
+ `Trezor signMessage (BTC) failed: ${result.payload.error}`
304
+ );
305
+ }
306
+ return {
307
+ signature: result.payload["signature"],
308
+ address: result.payload["address"]
309
+ };
310
+ }
311
+ // ─── Private: Solana method implementations ────────────────
312
+ async callSolGetAddress(params) {
313
+ const result = await this.tc.solanaGetAddress({
314
+ path: params["path"],
315
+ showOnTrezor: params["showOnDevice"] ?? false
316
+ });
317
+ if (!result.success) {
318
+ throw new Error(
319
+ `Trezor solanaGetAddress failed: ${result.payload.error}`
320
+ );
321
+ }
322
+ return {
323
+ address: result.payload["address"],
324
+ path: params["path"]
325
+ };
326
+ }
327
+ async callSolSignTransaction(params) {
328
+ const result = await this.tc.solanaSignTransaction({
329
+ path: params["path"],
330
+ serializedTx: params["serializedTx"],
331
+ additionalInfo: params["additionalInfo"]
332
+ });
333
+ if (!result.success) {
334
+ throw new Error(
335
+ `Trezor solanaSignTransaction failed: ${result.payload.error}`
336
+ );
337
+ }
338
+ return { signature: result.payload["signature"] };
339
+ }
340
+ // ─── Private: helpers ──────────────────────────────────────
341
+ buildFirmwareVersion(features) {
342
+ if (features.major_version != null) {
343
+ return `${features.major_version}.${features.minor_version ?? 0}.${features.patch_version ?? 0}`;
344
+ }
345
+ return "";
346
+ }
347
+ /** Emit an event to all registered handlers. */
348
+ emit(event, data) {
349
+ const handlers = this.eventHandlers.get(event);
350
+ if (!handlers) return;
351
+ for (const handler of handlers) {
352
+ try {
353
+ handler(data);
354
+ } catch {
355
+ }
356
+ }
357
+ }
358
+ };
359
+
360
+ // src/index.ts
361
+ function createTrezorConnector(trezorConnect) {
362
+ return new TrezorDirectConnector(trezorConnect);
363
+ }
364
+ // Annotate the CommonJS export names for ESM import in node:
365
+ 0 && (module.exports = {
366
+ TrezorDirectConnector,
367
+ createTrezorConnector
368
+ });
369
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/TrezorDirectConnector.ts"],"sourcesContent":["import type { IConnector } from '@bytezhang/hardware-wallet-core';\n\nimport { TrezorDirectConnector } from './TrezorDirectConnector';\nimport type { ITrezorConnectLike } from './TrezorDirectConnector';\n\nexport { TrezorDirectConnector };\nexport type { ITrezorConnectLike };\n\n/**\n * Factory: create a TrezorDirectConnector from a pre-initialized\n * @trezor/connect-* instance.\n *\n * Usage:\n * ```ts\n * import TrezorConnect from '@trezor/connect-web';\n * await TrezorConnect.init({ manifest: { ... } });\n * const connector = createTrezorConnector(TrezorConnect);\n * ```\n */\nexport function createTrezorConnector(\n trezorConnect: ITrezorConnectLike,\n): IConnector {\n return new TrezorDirectConnector(trezorConnect);\n}\n","import type {\n IConnector,\n ConnectorDevice,\n ConnectorSession,\n ConnectorEventType,\n ConnectorEventMap,\n} from '@bytezhang/hardware-wallet-core';\n\n// ─── Duck-typed TrezorConnect surface ────────────────────────────────\n// We define only the methods we actually call so consumers can supply any\n// @trezor/connect-* flavour without a hard import dependency.\n\ntype ITrezorConnectResponse<T = Record<string, unknown>> =\n | { success: true; payload: T }\n | { success: false; payload: { error: string; code?: string } };\n\n/**\n * Minimal duck-typed interface for a @trezor/connect instance.\n *\n * Consumers pass in an already-initialized instance (connect-web,\n * connect-webextension, or connect for Node). We only declare the\n * methods this connector actually calls.\n */\nexport interface ITrezorConnectLike {\n getFeatures(params?: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n\n // EVM\n ethereumGetAddress(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n ethereumGetPublicKey(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n ethereumSignTransaction(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n ethereumSignMessage(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n ethereumSignTypedData(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n\n // BTC\n getAddress(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n getPublicKey(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n signTransaction(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n signMessage(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n\n // Solana\n solanaGetAddress(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n solanaSignTransaction(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n\n // UI interaction\n uiResponse(response: { type: string; payload: unknown }): void;\n}\n\n// ─── Internal types ──────────────────────────────────────────────────\n\ninterface ITrezorFeatures {\n device_id?: string;\n label?: string;\n model?: string;\n major_version?: number;\n minor_version?: number;\n patch_version?: number;\n}\n\ntype IEventHandler<K extends ConnectorEventType = ConnectorEventType> =\n (data: ConnectorEventMap[K]) => void;\n\n// ─── Connector ───────────────────────────────────────────────────────\n\n/**\n * IConnector implementation backed by a @trezor/connect instance.\n *\n * This is a low-level connector that translates generic `call(method, params)`\n * invocations into the appropriate TrezorConnect API calls. It is used by the\n * higher-level TrezorAdapter (via its transport/connector layer) or can be\n * used standalone for simpler integrations.\n */\nexport class TrezorDirectConnector implements IConnector {\n private readonly tc: ITrezorConnectLike;\n\n private cachedFeatures: ITrezorFeatures | null = null;\n\n private readonly eventHandlers = new Map<string, Set<IEventHandler<ConnectorEventType>>>();\n\n constructor(trezorConnect: ITrezorConnectLike) {\n this.tc = trezorConnect;\n }\n\n // ─── IConnector: device discovery ──────────────────────────\n\n async searchDevices(): Promise<ConnectorDevice[]> {\n const result = await this.tc.getFeatures();\n\n if (!result.success) {\n return [];\n }\n\n const features = result.payload as unknown as ITrezorFeatures;\n const deviceId = features.device_id ?? 'trezor';\n this.cachedFeatures = features;\n\n return [\n {\n connectId: deviceId,\n deviceId,\n name: features.label ?? 'Trezor',\n model: features.model,\n },\n ];\n }\n\n // ─── IConnector: session management ────────────────────────\n\n async connect(deviceId?: string): Promise<ConnectorSession> {\n let features = this.cachedFeatures;\n if (!features) {\n const result = await this.tc.getFeatures();\n if (!result.success) {\n throw new Error(`Trezor connect failed: ${result.payload.error}`);\n }\n features = result.payload as unknown as ITrezorFeatures;\n this.cachedFeatures = features;\n }\n\n const id = features.device_id ?? 'trezor';\n const firmwareVersion = this.buildFirmwareVersion(features);\n\n return {\n sessionId: deviceId ?? id,\n deviceInfo: {\n vendor: 'trezor',\n connectId: id,\n deviceId: id,\n model: features.model ?? 'unknown',\n firmwareVersion,\n label: features.label,\n connectionType: 'usb',\n },\n };\n }\n\n async disconnect(_sessionId: string): Promise<void> {\n // TrezorConnect manages its own connection lifecycle; nothing to do here.\n }\n\n // ─── IConnector: method dispatch ───────────────────────────\n\n async call(\n _sessionId: string,\n method: string,\n params: unknown,\n ): Promise<unknown> {\n const p = params as Record<string, unknown>;\n\n switch (method) {\n // ── EVM ──\n case 'evmGetAddress':\n return this.callEvmGetAddress(p);\n case 'evmGetPublicKey':\n return this.callEvmGetPublicKey(p);\n case 'evmSignTransaction':\n return this.callEvmSignTransaction(p);\n case 'evmSignMessage':\n return this.callEvmSignMessage(p);\n case 'evmSignTypedData':\n return this.callEvmSignTypedData(p);\n\n // ── BTC ──\n case 'btcGetAddress':\n return this.callBtcGetAddress(p);\n case 'btcGetPublicKey':\n return this.callBtcGetPublicKey(p);\n case 'btcSignTransaction':\n return this.callBtcSignTransaction(p);\n case 'btcSignMessage':\n return this.callBtcSignMessage(p);\n\n // ── Solana ──\n case 'solGetAddress':\n return this.callSolGetAddress(p);\n case 'solSignTransaction':\n return this.callSolSignTransaction(p);\n\n default:\n throw new Error(`TrezorDirectConnector: unknown method \"${method}\"`);\n }\n }\n\n async cancel(_sessionId: string): Promise<void> {\n // TrezorConnect handles cancellation through its own popup/UI flow.\n }\n\n // ─── IConnector: UI response ────────────────────────────────\n\n uiResponse(response: { type: string; payload: unknown }): void {\n this.tc.uiResponse(response);\n }\n\n // ─── IConnector: events ────────────────────────────────────\n\n on<K extends ConnectorEventType>(\n event: K,\n handler: (data: ConnectorEventMap[K]) => void,\n ): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler as IEventHandler);\n }\n\n off<K extends ConnectorEventType>(\n event: K,\n handler: (data: ConnectorEventMap[K]) => void,\n ): void {\n this.eventHandlers.get(event)?.delete(handler as IEventHandler);\n }\n\n // ─── IConnector: reset ─────────────────────────────────────\n\n reset(): void {\n this.cachedFeatures = null;\n this.eventHandlers.clear();\n }\n\n // ─── Private: EVM method implementations ───────────────────\n\n private async callEvmGetAddress(\n params: Record<string, unknown>,\n ): Promise<{ address: string; path: string }> {\n const result = await this.tc.ethereumGetAddress({\n path: params['path'] as string,\n showOnTrezor: (params['showOnDevice'] as boolean) ?? false,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor ethereumGetAddress failed: ${result.payload.error}`,\n );\n }\n\n return {\n address: result.payload['address'] as string,\n path: params['path'] as string,\n };\n }\n\n private async callEvmGetPublicKey(\n params: Record<string, unknown>,\n ): Promise<{ publicKey: string; path: string }> {\n const result = await this.tc.ethereumGetPublicKey({\n path: params['path'] as string,\n showOnTrezor: (params['showOnDevice'] as boolean) ?? false,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor ethereumGetPublicKey failed: ${result.payload.error}`,\n );\n }\n\n return {\n publicKey: result.payload['publicKey'] as string,\n path: params['path'] as string,\n };\n }\n\n private async callEvmSignTransaction(\n params: Record<string, unknown>,\n ): Promise<{ v: string; r: string; s: string }> {\n const tx = params['transaction'] as {\n to: string;\n value: string;\n gasPrice?: string;\n gasLimit: string;\n nonce: string;\n data?: string;\n chainId: number;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n };\n\n const isEip1559 =\n tx.maxFeePerGas !== undefined &&\n tx.maxPriorityFeePerGas !== undefined;\n\n const transaction = isEip1559\n ? {\n to: tx.to,\n value: tx.value,\n gasLimit: tx.gasLimit,\n nonce: tx.nonce,\n data: tx.data ?? '0x',\n chainId: tx.chainId,\n maxFeePerGas: tx.maxFeePerGas!,\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas!,\n }\n : {\n to: tx.to,\n value: tx.value,\n gasPrice: tx.gasPrice ?? '0x0',\n gasLimit: tx.gasLimit,\n nonce: tx.nonce,\n data: tx.data ?? '0x',\n chainId: tx.chainId,\n };\n\n const result = await this.tc.ethereumSignTransaction({\n path: params['path'] as string,\n transaction,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor ethereumSignTransaction failed: ${result.payload.error}`,\n );\n }\n\n return {\n v: result.payload['v'] as string,\n r: result.payload['r'] as string,\n s: result.payload['s'] as string,\n };\n }\n\n private async callEvmSignMessage(\n params: Record<string, unknown>,\n ): Promise<{ signature: string }> {\n const result = await this.tc.ethereumSignMessage({\n path: params['path'] as string,\n message: params['message'] as string,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor ethereumSignMessage failed: ${result.payload.error}`,\n );\n }\n\n return { signature: result.payload['signature'] as string };\n }\n\n private async callEvmSignTypedData(\n params: Record<string, unknown>,\n ): Promise<{ signature: string; address?: string }> {\n const mode = params['mode'] as string | undefined;\n\n const connectParams: Record<string, unknown> = {\n path: params['path'] as string,\n };\n\n if (mode === 'hash') {\n connectParams['domain_separator_hash'] = params['domainSeparatorHash'];\n connectParams['message_hash'] = params['messageHash'];\n connectParams['metamask_v4_compat'] = true;\n } else {\n connectParams['data'] = params['data'];\n connectParams['metamask_v4_compat'] =\n (params['metamaskV4Compat'] as boolean) ?? true;\n }\n\n const result = await this.tc.ethereumSignTypedData(connectParams);\n\n if (!result.success) {\n throw new Error(\n `Trezor ethereumSignTypedData failed: ${result.payload.error}`,\n );\n }\n\n return {\n signature: result.payload['signature'] as string,\n address: result.payload['address'] as string | undefined,\n };\n }\n\n // ─── Private: BTC method implementations ───────────────────\n\n private async callBtcGetAddress(\n params: Record<string, unknown>,\n ): Promise<{ address: string; path: string }> {\n const result = await this.tc.getAddress({\n path: params['path'] as string,\n coin: params['coin'] as string | undefined,\n showOnTrezor: (params['showOnDevice'] as boolean) ?? false,\n scriptType: params['scriptType'] as string | undefined,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor getAddress (BTC) failed: ${result.payload.error}`,\n );\n }\n\n return {\n address: result.payload['address'] as string,\n path: params['path'] as string,\n };\n }\n\n private async callBtcGetPublicKey(\n params: Record<string, unknown>,\n ): Promise<{\n xpub: string;\n publicKey: string;\n fingerprint: number;\n chainCode: string;\n path: string;\n }> {\n const result = await this.tc.getPublicKey({\n path: params['path'] as string,\n coin: params['coin'] as string | undefined,\n showOnTrezor: (params['showOnDevice'] as boolean) ?? false,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor getPublicKey (BTC) failed: ${result.payload.error}`,\n );\n }\n\n return {\n xpub: result.payload['xpub'] as string,\n publicKey: result.payload['publicKey'] as string,\n fingerprint: result.payload['fingerprint'] as number,\n chainCode: result.payload['chainCode'] as string,\n path: params['path'] as string,\n };\n }\n\n private async callBtcSignTransaction(\n params: Record<string, unknown>,\n ): Promise<{ signatures: string[]; serializedTx: string; txid?: string }> {\n const result = await this.tc.signTransaction({\n inputs: params['inputs'] as unknown[],\n outputs: params['outputs'] as unknown[],\n refTxs: params['refTxs'] as unknown[] | undefined,\n coin: params['coin'] as string | undefined,\n locktime: params['locktime'] as number | undefined,\n version: params['version'] as number | undefined,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor signTransaction (BTC) failed: ${result.payload.error}`,\n );\n }\n\n return {\n signatures: result.payload['signatures'] as string[],\n serializedTx: result.payload['serializedTx'] as string,\n txid: result.payload['txid'] as string | undefined,\n };\n }\n\n private async callBtcSignMessage(\n params: Record<string, unknown>,\n ): Promise<{ signature: string; address: string }> {\n const result = await this.tc.signMessage({\n path: params['path'] as string,\n message: params['message'] as string,\n coin: params['coin'] as string | undefined,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor signMessage (BTC) failed: ${result.payload.error}`,\n );\n }\n\n return {\n signature: result.payload['signature'] as string,\n address: result.payload['address'] as string,\n };\n }\n\n // ─── Private: Solana method implementations ────────────────\n\n private async callSolGetAddress(\n params: Record<string, unknown>,\n ): Promise<{ address: string; path: string }> {\n const result = await this.tc.solanaGetAddress({\n path: params['path'] as string,\n showOnTrezor: (params['showOnDevice'] as boolean) ?? false,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor solanaGetAddress failed: ${result.payload.error}`,\n );\n }\n\n return {\n address: result.payload['address'] as string,\n path: params['path'] as string,\n };\n }\n\n private async callSolSignTransaction(\n params: Record<string, unknown>,\n ): Promise<{ signature: string }> {\n const result = await this.tc.solanaSignTransaction({\n path: params['path'] as string,\n serializedTx: params['serializedTx'] as string,\n additionalInfo: params['additionalInfo'] as Record<string, unknown> | undefined,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor solanaSignTransaction failed: ${result.payload.error}`,\n );\n }\n\n return { signature: result.payload['signature'] as string };\n }\n\n // ─── Private: helpers ──────────────────────────────────────\n\n private buildFirmwareVersion(features: ITrezorFeatures): string {\n if (features.major_version != null) {\n return `${features.major_version}.${features.minor_version ?? 0}.${features.patch_version ?? 0}`;\n }\n return '';\n }\n\n /** Emit an event to all registered handlers. */\n protected emit<K extends ConnectorEventType>(\n event: K,\n data: ConnectorEventMap[K],\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (!handlers) return;\n for (const handler of handlers) {\n try {\n handler(data as ConnectorEventMap[ConnectorEventType]);\n } catch {\n // Do not let a faulty handler break the emit loop.\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1,341 @@
1
+ // src/TrezorDirectConnector.ts
2
+ var TrezorDirectConnector = class {
3
+ constructor(trezorConnect) {
4
+ this.cachedFeatures = null;
5
+ this.eventHandlers = /* @__PURE__ */ new Map();
6
+ this.tc = trezorConnect;
7
+ }
8
+ // ─── IConnector: device discovery ──────────────────────────
9
+ async searchDevices() {
10
+ const result = await this.tc.getFeatures();
11
+ if (!result.success) {
12
+ return [];
13
+ }
14
+ const features = result.payload;
15
+ const deviceId = features.device_id ?? "trezor";
16
+ this.cachedFeatures = features;
17
+ return [
18
+ {
19
+ connectId: deviceId,
20
+ deviceId,
21
+ name: features.label ?? "Trezor",
22
+ model: features.model
23
+ }
24
+ ];
25
+ }
26
+ // ─── IConnector: session management ────────────────────────
27
+ async connect(deviceId) {
28
+ let features = this.cachedFeatures;
29
+ if (!features) {
30
+ const result = await this.tc.getFeatures();
31
+ if (!result.success) {
32
+ throw new Error(`Trezor connect failed: ${result.payload.error}`);
33
+ }
34
+ features = result.payload;
35
+ this.cachedFeatures = features;
36
+ }
37
+ const id = features.device_id ?? "trezor";
38
+ const firmwareVersion = this.buildFirmwareVersion(features);
39
+ return {
40
+ sessionId: deviceId ?? id,
41
+ deviceInfo: {
42
+ vendor: "trezor",
43
+ connectId: id,
44
+ deviceId: id,
45
+ model: features.model ?? "unknown",
46
+ firmwareVersion,
47
+ label: features.label,
48
+ connectionType: "usb"
49
+ }
50
+ };
51
+ }
52
+ async disconnect(_sessionId) {
53
+ }
54
+ // ─── IConnector: method dispatch ───────────────────────────
55
+ async call(_sessionId, method, params) {
56
+ const p = params;
57
+ switch (method) {
58
+ // ── EVM ──
59
+ case "evmGetAddress":
60
+ return this.callEvmGetAddress(p);
61
+ case "evmGetPublicKey":
62
+ return this.callEvmGetPublicKey(p);
63
+ case "evmSignTransaction":
64
+ return this.callEvmSignTransaction(p);
65
+ case "evmSignMessage":
66
+ return this.callEvmSignMessage(p);
67
+ case "evmSignTypedData":
68
+ return this.callEvmSignTypedData(p);
69
+ // ── BTC ──
70
+ case "btcGetAddress":
71
+ return this.callBtcGetAddress(p);
72
+ case "btcGetPublicKey":
73
+ return this.callBtcGetPublicKey(p);
74
+ case "btcSignTransaction":
75
+ return this.callBtcSignTransaction(p);
76
+ case "btcSignMessage":
77
+ return this.callBtcSignMessage(p);
78
+ // ── Solana ──
79
+ case "solGetAddress":
80
+ return this.callSolGetAddress(p);
81
+ case "solSignTransaction":
82
+ return this.callSolSignTransaction(p);
83
+ default:
84
+ throw new Error(`TrezorDirectConnector: unknown method "${method}"`);
85
+ }
86
+ }
87
+ async cancel(_sessionId) {
88
+ }
89
+ // ─── IConnector: UI response ────────────────────────────────
90
+ uiResponse(response) {
91
+ this.tc.uiResponse(response);
92
+ }
93
+ // ─── IConnector: events ────────────────────────────────────
94
+ on(event, handler) {
95
+ if (!this.eventHandlers.has(event)) {
96
+ this.eventHandlers.set(event, /* @__PURE__ */ new Set());
97
+ }
98
+ this.eventHandlers.get(event).add(handler);
99
+ }
100
+ off(event, handler) {
101
+ this.eventHandlers.get(event)?.delete(handler);
102
+ }
103
+ // ─── IConnector: reset ─────────────────────────────────────
104
+ reset() {
105
+ this.cachedFeatures = null;
106
+ this.eventHandlers.clear();
107
+ }
108
+ // ─── Private: EVM method implementations ───────────────────
109
+ async callEvmGetAddress(params) {
110
+ const result = await this.tc.ethereumGetAddress({
111
+ path: params["path"],
112
+ showOnTrezor: params["showOnDevice"] ?? false
113
+ });
114
+ if (!result.success) {
115
+ throw new Error(
116
+ `Trezor ethereumGetAddress failed: ${result.payload.error}`
117
+ );
118
+ }
119
+ return {
120
+ address: result.payload["address"],
121
+ path: params["path"]
122
+ };
123
+ }
124
+ async callEvmGetPublicKey(params) {
125
+ const result = await this.tc.ethereumGetPublicKey({
126
+ path: params["path"],
127
+ showOnTrezor: params["showOnDevice"] ?? false
128
+ });
129
+ if (!result.success) {
130
+ throw new Error(
131
+ `Trezor ethereumGetPublicKey failed: ${result.payload.error}`
132
+ );
133
+ }
134
+ return {
135
+ publicKey: result.payload["publicKey"],
136
+ path: params["path"]
137
+ };
138
+ }
139
+ async callEvmSignTransaction(params) {
140
+ const tx = params["transaction"];
141
+ const isEip1559 = tx.maxFeePerGas !== void 0 && tx.maxPriorityFeePerGas !== void 0;
142
+ const transaction = isEip1559 ? {
143
+ to: tx.to,
144
+ value: tx.value,
145
+ gasLimit: tx.gasLimit,
146
+ nonce: tx.nonce,
147
+ data: tx.data ?? "0x",
148
+ chainId: tx.chainId,
149
+ maxFeePerGas: tx.maxFeePerGas,
150
+ maxPriorityFeePerGas: tx.maxPriorityFeePerGas
151
+ } : {
152
+ to: tx.to,
153
+ value: tx.value,
154
+ gasPrice: tx.gasPrice ?? "0x0",
155
+ gasLimit: tx.gasLimit,
156
+ nonce: tx.nonce,
157
+ data: tx.data ?? "0x",
158
+ chainId: tx.chainId
159
+ };
160
+ const result = await this.tc.ethereumSignTransaction({
161
+ path: params["path"],
162
+ transaction
163
+ });
164
+ if (!result.success) {
165
+ throw new Error(
166
+ `Trezor ethereumSignTransaction failed: ${result.payload.error}`
167
+ );
168
+ }
169
+ return {
170
+ v: result.payload["v"],
171
+ r: result.payload["r"],
172
+ s: result.payload["s"]
173
+ };
174
+ }
175
+ async callEvmSignMessage(params) {
176
+ const result = await this.tc.ethereumSignMessage({
177
+ path: params["path"],
178
+ message: params["message"]
179
+ });
180
+ if (!result.success) {
181
+ throw new Error(
182
+ `Trezor ethereumSignMessage failed: ${result.payload.error}`
183
+ );
184
+ }
185
+ return { signature: result.payload["signature"] };
186
+ }
187
+ async callEvmSignTypedData(params) {
188
+ const mode = params["mode"];
189
+ const connectParams = {
190
+ path: params["path"]
191
+ };
192
+ if (mode === "hash") {
193
+ connectParams["domain_separator_hash"] = params["domainSeparatorHash"];
194
+ connectParams["message_hash"] = params["messageHash"];
195
+ connectParams["metamask_v4_compat"] = true;
196
+ } else {
197
+ connectParams["data"] = params["data"];
198
+ connectParams["metamask_v4_compat"] = params["metamaskV4Compat"] ?? true;
199
+ }
200
+ const result = await this.tc.ethereumSignTypedData(connectParams);
201
+ if (!result.success) {
202
+ throw new Error(
203
+ `Trezor ethereumSignTypedData failed: ${result.payload.error}`
204
+ );
205
+ }
206
+ return {
207
+ signature: result.payload["signature"],
208
+ address: result.payload["address"]
209
+ };
210
+ }
211
+ // ─── Private: BTC method implementations ───────────────────
212
+ async callBtcGetAddress(params) {
213
+ const result = await this.tc.getAddress({
214
+ path: params["path"],
215
+ coin: params["coin"],
216
+ showOnTrezor: params["showOnDevice"] ?? false,
217
+ scriptType: params["scriptType"]
218
+ });
219
+ if (!result.success) {
220
+ throw new Error(
221
+ `Trezor getAddress (BTC) failed: ${result.payload.error}`
222
+ );
223
+ }
224
+ return {
225
+ address: result.payload["address"],
226
+ path: params["path"]
227
+ };
228
+ }
229
+ async callBtcGetPublicKey(params) {
230
+ const result = await this.tc.getPublicKey({
231
+ path: params["path"],
232
+ coin: params["coin"],
233
+ showOnTrezor: params["showOnDevice"] ?? false
234
+ });
235
+ if (!result.success) {
236
+ throw new Error(
237
+ `Trezor getPublicKey (BTC) failed: ${result.payload.error}`
238
+ );
239
+ }
240
+ return {
241
+ xpub: result.payload["xpub"],
242
+ publicKey: result.payload["publicKey"],
243
+ fingerprint: result.payload["fingerprint"],
244
+ chainCode: result.payload["chainCode"],
245
+ path: params["path"]
246
+ };
247
+ }
248
+ async callBtcSignTransaction(params) {
249
+ const result = await this.tc.signTransaction({
250
+ inputs: params["inputs"],
251
+ outputs: params["outputs"],
252
+ refTxs: params["refTxs"],
253
+ coin: params["coin"],
254
+ locktime: params["locktime"],
255
+ version: params["version"]
256
+ });
257
+ if (!result.success) {
258
+ throw new Error(
259
+ `Trezor signTransaction (BTC) failed: ${result.payload.error}`
260
+ );
261
+ }
262
+ return {
263
+ signatures: result.payload["signatures"],
264
+ serializedTx: result.payload["serializedTx"],
265
+ txid: result.payload["txid"]
266
+ };
267
+ }
268
+ async callBtcSignMessage(params) {
269
+ const result = await this.tc.signMessage({
270
+ path: params["path"],
271
+ message: params["message"],
272
+ coin: params["coin"]
273
+ });
274
+ if (!result.success) {
275
+ throw new Error(
276
+ `Trezor signMessage (BTC) failed: ${result.payload.error}`
277
+ );
278
+ }
279
+ return {
280
+ signature: result.payload["signature"],
281
+ address: result.payload["address"]
282
+ };
283
+ }
284
+ // ─── Private: Solana method implementations ────────────────
285
+ async callSolGetAddress(params) {
286
+ const result = await this.tc.solanaGetAddress({
287
+ path: params["path"],
288
+ showOnTrezor: params["showOnDevice"] ?? false
289
+ });
290
+ if (!result.success) {
291
+ throw new Error(
292
+ `Trezor solanaGetAddress failed: ${result.payload.error}`
293
+ );
294
+ }
295
+ return {
296
+ address: result.payload["address"],
297
+ path: params["path"]
298
+ };
299
+ }
300
+ async callSolSignTransaction(params) {
301
+ const result = await this.tc.solanaSignTransaction({
302
+ path: params["path"],
303
+ serializedTx: params["serializedTx"],
304
+ additionalInfo: params["additionalInfo"]
305
+ });
306
+ if (!result.success) {
307
+ throw new Error(
308
+ `Trezor solanaSignTransaction failed: ${result.payload.error}`
309
+ );
310
+ }
311
+ return { signature: result.payload["signature"] };
312
+ }
313
+ // ─── Private: helpers ──────────────────────────────────────
314
+ buildFirmwareVersion(features) {
315
+ if (features.major_version != null) {
316
+ return `${features.major_version}.${features.minor_version ?? 0}.${features.patch_version ?? 0}`;
317
+ }
318
+ return "";
319
+ }
320
+ /** Emit an event to all registered handlers. */
321
+ emit(event, data) {
322
+ const handlers = this.eventHandlers.get(event);
323
+ if (!handlers) return;
324
+ for (const handler of handlers) {
325
+ try {
326
+ handler(data);
327
+ } catch {
328
+ }
329
+ }
330
+ }
331
+ };
332
+
333
+ // src/index.ts
334
+ function createTrezorConnector(trezorConnect) {
335
+ return new TrezorDirectConnector(trezorConnect);
336
+ }
337
+ export {
338
+ TrezorDirectConnector,
339
+ createTrezorConnector
340
+ };
341
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/TrezorDirectConnector.ts","../src/index.ts"],"sourcesContent":["import type {\n IConnector,\n ConnectorDevice,\n ConnectorSession,\n ConnectorEventType,\n ConnectorEventMap,\n} from '@bytezhang/hardware-wallet-core';\n\n// ─── Duck-typed TrezorConnect surface ────────────────────────────────\n// We define only the methods we actually call so consumers can supply any\n// @trezor/connect-* flavour without a hard import dependency.\n\ntype ITrezorConnectResponse<T = Record<string, unknown>> =\n | { success: true; payload: T }\n | { success: false; payload: { error: string; code?: string } };\n\n/**\n * Minimal duck-typed interface for a @trezor/connect instance.\n *\n * Consumers pass in an already-initialized instance (connect-web,\n * connect-webextension, or connect for Node). We only declare the\n * methods this connector actually calls.\n */\nexport interface ITrezorConnectLike {\n getFeatures(params?: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n\n // EVM\n ethereumGetAddress(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n ethereumGetPublicKey(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n ethereumSignTransaction(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n ethereumSignMessage(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n ethereumSignTypedData(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n\n // BTC\n getAddress(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n getPublicKey(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n signTransaction(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n signMessage(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n\n // Solana\n solanaGetAddress(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n solanaSignTransaction(params: Record<string, unknown>): Promise<ITrezorConnectResponse>;\n\n // UI interaction\n uiResponse(response: { type: string; payload: unknown }): void;\n}\n\n// ─── Internal types ──────────────────────────────────────────────────\n\ninterface ITrezorFeatures {\n device_id?: string;\n label?: string;\n model?: string;\n major_version?: number;\n minor_version?: number;\n patch_version?: number;\n}\n\ntype IEventHandler<K extends ConnectorEventType = ConnectorEventType> =\n (data: ConnectorEventMap[K]) => void;\n\n// ─── Connector ───────────────────────────────────────────────────────\n\n/**\n * IConnector implementation backed by a @trezor/connect instance.\n *\n * This is a low-level connector that translates generic `call(method, params)`\n * invocations into the appropriate TrezorConnect API calls. It is used by the\n * higher-level TrezorAdapter (via its transport/connector layer) or can be\n * used standalone for simpler integrations.\n */\nexport class TrezorDirectConnector implements IConnector {\n private readonly tc: ITrezorConnectLike;\n\n private cachedFeatures: ITrezorFeatures | null = null;\n\n private readonly eventHandlers = new Map<string, Set<IEventHandler<ConnectorEventType>>>();\n\n constructor(trezorConnect: ITrezorConnectLike) {\n this.tc = trezorConnect;\n }\n\n // ─── IConnector: device discovery ──────────────────────────\n\n async searchDevices(): Promise<ConnectorDevice[]> {\n const result = await this.tc.getFeatures();\n\n if (!result.success) {\n return [];\n }\n\n const features = result.payload as unknown as ITrezorFeatures;\n const deviceId = features.device_id ?? 'trezor';\n this.cachedFeatures = features;\n\n return [\n {\n connectId: deviceId,\n deviceId,\n name: features.label ?? 'Trezor',\n model: features.model,\n },\n ];\n }\n\n // ─── IConnector: session management ────────────────────────\n\n async connect(deviceId?: string): Promise<ConnectorSession> {\n let features = this.cachedFeatures;\n if (!features) {\n const result = await this.tc.getFeatures();\n if (!result.success) {\n throw new Error(`Trezor connect failed: ${result.payload.error}`);\n }\n features = result.payload as unknown as ITrezorFeatures;\n this.cachedFeatures = features;\n }\n\n const id = features.device_id ?? 'trezor';\n const firmwareVersion = this.buildFirmwareVersion(features);\n\n return {\n sessionId: deviceId ?? id,\n deviceInfo: {\n vendor: 'trezor',\n connectId: id,\n deviceId: id,\n model: features.model ?? 'unknown',\n firmwareVersion,\n label: features.label,\n connectionType: 'usb',\n },\n };\n }\n\n async disconnect(_sessionId: string): Promise<void> {\n // TrezorConnect manages its own connection lifecycle; nothing to do here.\n }\n\n // ─── IConnector: method dispatch ───────────────────────────\n\n async call(\n _sessionId: string,\n method: string,\n params: unknown,\n ): Promise<unknown> {\n const p = params as Record<string, unknown>;\n\n switch (method) {\n // ── EVM ──\n case 'evmGetAddress':\n return this.callEvmGetAddress(p);\n case 'evmGetPublicKey':\n return this.callEvmGetPublicKey(p);\n case 'evmSignTransaction':\n return this.callEvmSignTransaction(p);\n case 'evmSignMessage':\n return this.callEvmSignMessage(p);\n case 'evmSignTypedData':\n return this.callEvmSignTypedData(p);\n\n // ── BTC ──\n case 'btcGetAddress':\n return this.callBtcGetAddress(p);\n case 'btcGetPublicKey':\n return this.callBtcGetPublicKey(p);\n case 'btcSignTransaction':\n return this.callBtcSignTransaction(p);\n case 'btcSignMessage':\n return this.callBtcSignMessage(p);\n\n // ── Solana ──\n case 'solGetAddress':\n return this.callSolGetAddress(p);\n case 'solSignTransaction':\n return this.callSolSignTransaction(p);\n\n default:\n throw new Error(`TrezorDirectConnector: unknown method \"${method}\"`);\n }\n }\n\n async cancel(_sessionId: string): Promise<void> {\n // TrezorConnect handles cancellation through its own popup/UI flow.\n }\n\n // ─── IConnector: UI response ────────────────────────────────\n\n uiResponse(response: { type: string; payload: unknown }): void {\n this.tc.uiResponse(response);\n }\n\n // ─── IConnector: events ────────────────────────────────────\n\n on<K extends ConnectorEventType>(\n event: K,\n handler: (data: ConnectorEventMap[K]) => void,\n ): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler as IEventHandler);\n }\n\n off<K extends ConnectorEventType>(\n event: K,\n handler: (data: ConnectorEventMap[K]) => void,\n ): void {\n this.eventHandlers.get(event)?.delete(handler as IEventHandler);\n }\n\n // ─── IConnector: reset ─────────────────────────────────────\n\n reset(): void {\n this.cachedFeatures = null;\n this.eventHandlers.clear();\n }\n\n // ─── Private: EVM method implementations ───────────────────\n\n private async callEvmGetAddress(\n params: Record<string, unknown>,\n ): Promise<{ address: string; path: string }> {\n const result = await this.tc.ethereumGetAddress({\n path: params['path'] as string,\n showOnTrezor: (params['showOnDevice'] as boolean) ?? false,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor ethereumGetAddress failed: ${result.payload.error}`,\n );\n }\n\n return {\n address: result.payload['address'] as string,\n path: params['path'] as string,\n };\n }\n\n private async callEvmGetPublicKey(\n params: Record<string, unknown>,\n ): Promise<{ publicKey: string; path: string }> {\n const result = await this.tc.ethereumGetPublicKey({\n path: params['path'] as string,\n showOnTrezor: (params['showOnDevice'] as boolean) ?? false,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor ethereumGetPublicKey failed: ${result.payload.error}`,\n );\n }\n\n return {\n publicKey: result.payload['publicKey'] as string,\n path: params['path'] as string,\n };\n }\n\n private async callEvmSignTransaction(\n params: Record<string, unknown>,\n ): Promise<{ v: string; r: string; s: string }> {\n const tx = params['transaction'] as {\n to: string;\n value: string;\n gasPrice?: string;\n gasLimit: string;\n nonce: string;\n data?: string;\n chainId: number;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n };\n\n const isEip1559 =\n tx.maxFeePerGas !== undefined &&\n tx.maxPriorityFeePerGas !== undefined;\n\n const transaction = isEip1559\n ? {\n to: tx.to,\n value: tx.value,\n gasLimit: tx.gasLimit,\n nonce: tx.nonce,\n data: tx.data ?? '0x',\n chainId: tx.chainId,\n maxFeePerGas: tx.maxFeePerGas!,\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas!,\n }\n : {\n to: tx.to,\n value: tx.value,\n gasPrice: tx.gasPrice ?? '0x0',\n gasLimit: tx.gasLimit,\n nonce: tx.nonce,\n data: tx.data ?? '0x',\n chainId: tx.chainId,\n };\n\n const result = await this.tc.ethereumSignTransaction({\n path: params['path'] as string,\n transaction,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor ethereumSignTransaction failed: ${result.payload.error}`,\n );\n }\n\n return {\n v: result.payload['v'] as string,\n r: result.payload['r'] as string,\n s: result.payload['s'] as string,\n };\n }\n\n private async callEvmSignMessage(\n params: Record<string, unknown>,\n ): Promise<{ signature: string }> {\n const result = await this.tc.ethereumSignMessage({\n path: params['path'] as string,\n message: params['message'] as string,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor ethereumSignMessage failed: ${result.payload.error}`,\n );\n }\n\n return { signature: result.payload['signature'] as string };\n }\n\n private async callEvmSignTypedData(\n params: Record<string, unknown>,\n ): Promise<{ signature: string; address?: string }> {\n const mode = params['mode'] as string | undefined;\n\n const connectParams: Record<string, unknown> = {\n path: params['path'] as string,\n };\n\n if (mode === 'hash') {\n connectParams['domain_separator_hash'] = params['domainSeparatorHash'];\n connectParams['message_hash'] = params['messageHash'];\n connectParams['metamask_v4_compat'] = true;\n } else {\n connectParams['data'] = params['data'];\n connectParams['metamask_v4_compat'] =\n (params['metamaskV4Compat'] as boolean) ?? true;\n }\n\n const result = await this.tc.ethereumSignTypedData(connectParams);\n\n if (!result.success) {\n throw new Error(\n `Trezor ethereumSignTypedData failed: ${result.payload.error}`,\n );\n }\n\n return {\n signature: result.payload['signature'] as string,\n address: result.payload['address'] as string | undefined,\n };\n }\n\n // ─── Private: BTC method implementations ───────────────────\n\n private async callBtcGetAddress(\n params: Record<string, unknown>,\n ): Promise<{ address: string; path: string }> {\n const result = await this.tc.getAddress({\n path: params['path'] as string,\n coin: params['coin'] as string | undefined,\n showOnTrezor: (params['showOnDevice'] as boolean) ?? false,\n scriptType: params['scriptType'] as string | undefined,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor getAddress (BTC) failed: ${result.payload.error}`,\n );\n }\n\n return {\n address: result.payload['address'] as string,\n path: params['path'] as string,\n };\n }\n\n private async callBtcGetPublicKey(\n params: Record<string, unknown>,\n ): Promise<{\n xpub: string;\n publicKey: string;\n fingerprint: number;\n chainCode: string;\n path: string;\n }> {\n const result = await this.tc.getPublicKey({\n path: params['path'] as string,\n coin: params['coin'] as string | undefined,\n showOnTrezor: (params['showOnDevice'] as boolean) ?? false,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor getPublicKey (BTC) failed: ${result.payload.error}`,\n );\n }\n\n return {\n xpub: result.payload['xpub'] as string,\n publicKey: result.payload['publicKey'] as string,\n fingerprint: result.payload['fingerprint'] as number,\n chainCode: result.payload['chainCode'] as string,\n path: params['path'] as string,\n };\n }\n\n private async callBtcSignTransaction(\n params: Record<string, unknown>,\n ): Promise<{ signatures: string[]; serializedTx: string; txid?: string }> {\n const result = await this.tc.signTransaction({\n inputs: params['inputs'] as unknown[],\n outputs: params['outputs'] as unknown[],\n refTxs: params['refTxs'] as unknown[] | undefined,\n coin: params['coin'] as string | undefined,\n locktime: params['locktime'] as number | undefined,\n version: params['version'] as number | undefined,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor signTransaction (BTC) failed: ${result.payload.error}`,\n );\n }\n\n return {\n signatures: result.payload['signatures'] as string[],\n serializedTx: result.payload['serializedTx'] as string,\n txid: result.payload['txid'] as string | undefined,\n };\n }\n\n private async callBtcSignMessage(\n params: Record<string, unknown>,\n ): Promise<{ signature: string; address: string }> {\n const result = await this.tc.signMessage({\n path: params['path'] as string,\n message: params['message'] as string,\n coin: params['coin'] as string | undefined,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor signMessage (BTC) failed: ${result.payload.error}`,\n );\n }\n\n return {\n signature: result.payload['signature'] as string,\n address: result.payload['address'] as string,\n };\n }\n\n // ─── Private: Solana method implementations ────────────────\n\n private async callSolGetAddress(\n params: Record<string, unknown>,\n ): Promise<{ address: string; path: string }> {\n const result = await this.tc.solanaGetAddress({\n path: params['path'] as string,\n showOnTrezor: (params['showOnDevice'] as boolean) ?? false,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor solanaGetAddress failed: ${result.payload.error}`,\n );\n }\n\n return {\n address: result.payload['address'] as string,\n path: params['path'] as string,\n };\n }\n\n private async callSolSignTransaction(\n params: Record<string, unknown>,\n ): Promise<{ signature: string }> {\n const result = await this.tc.solanaSignTransaction({\n path: params['path'] as string,\n serializedTx: params['serializedTx'] as string,\n additionalInfo: params['additionalInfo'] as Record<string, unknown> | undefined,\n });\n\n if (!result.success) {\n throw new Error(\n `Trezor solanaSignTransaction failed: ${result.payload.error}`,\n );\n }\n\n return { signature: result.payload['signature'] as string };\n }\n\n // ─── Private: helpers ──────────────────────────────────────\n\n private buildFirmwareVersion(features: ITrezorFeatures): string {\n if (features.major_version != null) {\n return `${features.major_version}.${features.minor_version ?? 0}.${features.patch_version ?? 0}`;\n }\n return '';\n }\n\n /** Emit an event to all registered handlers. */\n protected emit<K extends ConnectorEventType>(\n event: K,\n data: ConnectorEventMap[K],\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (!handlers) return;\n for (const handler of handlers) {\n try {\n handler(data as ConnectorEventMap[ConnectorEventType]);\n } catch {\n // Do not let a faulty handler break the emit loop.\n }\n }\n }\n}\n","import type { IConnector } from '@bytezhang/hardware-wallet-core';\n\nimport { TrezorDirectConnector } from './TrezorDirectConnector';\nimport type { ITrezorConnectLike } from './TrezorDirectConnector';\n\nexport { TrezorDirectConnector };\nexport type { ITrezorConnectLike };\n\n/**\n * Factory: create a TrezorDirectConnector from a pre-initialized\n * @trezor/connect-* instance.\n *\n * Usage:\n * ```ts\n * import TrezorConnect from '@trezor/connect-web';\n * await TrezorConnect.init({ manifest: { ... } });\n * const connector = createTrezorConnector(TrezorConnect);\n * ```\n */\nexport function createTrezorConnector(\n trezorConnect: ITrezorConnectLike,\n): IConnector {\n return new TrezorDirectConnector(trezorConnect);\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@bytezhang/hardware-trezor-connector",
3
+ "version": "0.0.1",
4
+ "description": "IConnector implementation for Trezor hardware wallets via @trezor/connect",
5
+ "author": "OneKey",
6
+ "license": "MIT",
7
+ "main": "dist/index.js",
8
+ "module": "dist/index.mjs",
9
+ "types": "dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": { "types": "./dist/index.d.mts", "default": "./dist/index.mjs" },
13
+ "require": { "types": "./dist/index.d.ts", "default": "./dist/index.js" }
14
+ }
15
+ },
16
+ "files": ["dist"],
17
+ "scripts": {
18
+ "build": "tsup",
19
+ "dev": "tsup --watch",
20
+ "clean": "rimraf dist",
21
+ "test": "vitest run"
22
+ },
23
+ "dependencies": {
24
+ "@bytezhang/hardware-wallet-core": "0.0.1"
25
+ },
26
+ "peerDependencies": {
27
+ "@trezor/connect-web": "^9.0.0"
28
+ },
29
+ "peerDependenciesMeta": {
30
+ "@trezor/connect-web": { "optional": true }
31
+ },
32
+ "devDependencies": {
33
+ "rimraf": "^5.0.0"
34
+ }
35
+ }