@bytezhang/hardware-trezor-connector 0.0.30 → 0.0.32
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.js +11 -33
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +11 -33
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -23
package/dist/index.js
CHANGED
|
@@ -139,9 +139,7 @@ var TrezorDirectConnector = class {
|
|
|
139
139
|
showOnTrezor: params["showOnDevice"] ?? false
|
|
140
140
|
});
|
|
141
141
|
if (!result.success) {
|
|
142
|
-
throw new Error(
|
|
143
|
-
`Trezor ethereumGetAddress failed: ${result.payload.error}`
|
|
144
|
-
);
|
|
142
|
+
throw new Error(`Trezor ethereumGetAddress failed: ${result.payload.error}`);
|
|
145
143
|
}
|
|
146
144
|
return {
|
|
147
145
|
address: result.payload["address"],
|
|
@@ -154,9 +152,7 @@ var TrezorDirectConnector = class {
|
|
|
154
152
|
showOnTrezor: params["showOnDevice"] ?? false
|
|
155
153
|
});
|
|
156
154
|
if (!result.success) {
|
|
157
|
-
throw new Error(
|
|
158
|
-
`Trezor ethereumGetPublicKey failed: ${result.payload.error}`
|
|
159
|
-
);
|
|
155
|
+
throw new Error(`Trezor ethereumGetPublicKey failed: ${result.payload.error}`);
|
|
160
156
|
}
|
|
161
157
|
return {
|
|
162
158
|
publicKey: result.payload["publicKey"],
|
|
@@ -189,9 +185,7 @@ var TrezorDirectConnector = class {
|
|
|
189
185
|
transaction
|
|
190
186
|
});
|
|
191
187
|
if (!result.success) {
|
|
192
|
-
throw new Error(
|
|
193
|
-
`Trezor ethereumSignTransaction failed: ${result.payload.error}`
|
|
194
|
-
);
|
|
188
|
+
throw new Error(`Trezor ethereumSignTransaction failed: ${result.payload.error}`);
|
|
195
189
|
}
|
|
196
190
|
return {
|
|
197
191
|
v: result.payload["v"],
|
|
@@ -205,9 +199,7 @@ var TrezorDirectConnector = class {
|
|
|
205
199
|
message: params["message"]
|
|
206
200
|
});
|
|
207
201
|
if (!result.success) {
|
|
208
|
-
throw new Error(
|
|
209
|
-
`Trezor ethereumSignMessage failed: ${result.payload.error}`
|
|
210
|
-
);
|
|
202
|
+
throw new Error(`Trezor ethereumSignMessage failed: ${result.payload.error}`);
|
|
211
203
|
}
|
|
212
204
|
return { signature: result.payload["signature"] };
|
|
213
205
|
}
|
|
@@ -226,9 +218,7 @@ var TrezorDirectConnector = class {
|
|
|
226
218
|
}
|
|
227
219
|
const result = await this.tc.ethereumSignTypedData(connectParams);
|
|
228
220
|
if (!result.success) {
|
|
229
|
-
throw new Error(
|
|
230
|
-
`Trezor ethereumSignTypedData failed: ${result.payload.error}`
|
|
231
|
-
);
|
|
221
|
+
throw new Error(`Trezor ethereumSignTypedData failed: ${result.payload.error}`);
|
|
232
222
|
}
|
|
233
223
|
return {
|
|
234
224
|
signature: result.payload["signature"],
|
|
@@ -244,9 +234,7 @@ var TrezorDirectConnector = class {
|
|
|
244
234
|
scriptType: params["scriptType"]
|
|
245
235
|
});
|
|
246
236
|
if (!result.success) {
|
|
247
|
-
throw new Error(
|
|
248
|
-
`Trezor getAddress (BTC) failed: ${result.payload.error}`
|
|
249
|
-
);
|
|
237
|
+
throw new Error(`Trezor getAddress (BTC) failed: ${result.payload.error}`);
|
|
250
238
|
}
|
|
251
239
|
return {
|
|
252
240
|
address: result.payload["address"],
|
|
@@ -260,9 +248,7 @@ var TrezorDirectConnector = class {
|
|
|
260
248
|
showOnTrezor: params["showOnDevice"] ?? false
|
|
261
249
|
});
|
|
262
250
|
if (!result.success) {
|
|
263
|
-
throw new Error(
|
|
264
|
-
`Trezor getPublicKey (BTC) failed: ${result.payload.error}`
|
|
265
|
-
);
|
|
251
|
+
throw new Error(`Trezor getPublicKey (BTC) failed: ${result.payload.error}`);
|
|
266
252
|
}
|
|
267
253
|
return {
|
|
268
254
|
xpub: result.payload["xpub"],
|
|
@@ -282,9 +268,7 @@ var TrezorDirectConnector = class {
|
|
|
282
268
|
version: params["version"]
|
|
283
269
|
});
|
|
284
270
|
if (!result.success) {
|
|
285
|
-
throw new Error(
|
|
286
|
-
`Trezor signTransaction (BTC) failed: ${result.payload.error}`
|
|
287
|
-
);
|
|
271
|
+
throw new Error(`Trezor signTransaction (BTC) failed: ${result.payload.error}`);
|
|
288
272
|
}
|
|
289
273
|
return {
|
|
290
274
|
signatures: result.payload["signatures"],
|
|
@@ -299,9 +283,7 @@ var TrezorDirectConnector = class {
|
|
|
299
283
|
coin: params["coin"]
|
|
300
284
|
});
|
|
301
285
|
if (!result.success) {
|
|
302
|
-
throw new Error(
|
|
303
|
-
`Trezor signMessage (BTC) failed: ${result.payload.error}`
|
|
304
|
-
);
|
|
286
|
+
throw new Error(`Trezor signMessage (BTC) failed: ${result.payload.error}`);
|
|
305
287
|
}
|
|
306
288
|
return {
|
|
307
289
|
signature: result.payload["signature"],
|
|
@@ -315,9 +297,7 @@ var TrezorDirectConnector = class {
|
|
|
315
297
|
showOnTrezor: params["showOnDevice"] ?? false
|
|
316
298
|
});
|
|
317
299
|
if (!result.success) {
|
|
318
|
-
throw new Error(
|
|
319
|
-
`Trezor solanaGetAddress failed: ${result.payload.error}`
|
|
320
|
-
);
|
|
300
|
+
throw new Error(`Trezor solanaGetAddress failed: ${result.payload.error}`);
|
|
321
301
|
}
|
|
322
302
|
return {
|
|
323
303
|
address: result.payload["address"],
|
|
@@ -331,9 +311,7 @@ var TrezorDirectConnector = class {
|
|
|
331
311
|
additionalInfo: params["additionalInfo"]
|
|
332
312
|
});
|
|
333
313
|
if (!result.success) {
|
|
334
|
-
throw new Error(
|
|
335
|
-
`Trezor solanaSignTransaction failed: ${result.payload.error}`
|
|
336
|
-
);
|
|
314
|
+
throw new Error(`Trezor solanaSignTransaction failed: ${result.payload.error}`);
|
|
337
315
|
}
|
|
338
316
|
return { signature: result.payload["signature"] };
|
|
339
317
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACuEO,IAAM,wBAAN,MAAkD;AAAA,EAOvD,YAAY,eAAmC;AAJ/C,SAAQ,iBAAyC;AAEjD,SAAiB,gBAAgB,oBAAI,IAAoD;AAGvF,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA,EAIA,MAAM,gBAA4C;AAChD,UAAM,SAAS,MAAM,KAAK,GAAG,YAAY;AAEzC,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,WAAW,OAAO;AACxB,UAAM,WAAW,SAAS,aAAa;AACvC,SAAK,iBAAiB;AAEtB,WAAO;AAAA,MACL;AAAA,QACE,WAAW;AAAA,QACX;AAAA,QACA,MAAM,SAAS,SAAS;AAAA,QACxB,OAAO,SAAS;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,QAAQ,UAA8C;AAC1D,QAAI,WAAW,KAAK;AACpB,QAAI,CAAC,UAAU;AACb,YAAM,SAAS,MAAM,KAAK,GAAG,YAAY;AACzC,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,IAAI,MAAM,0BAA0B,OAAO,QAAQ,KAAK,EAAE;AAAA,MAClE;AACA,iBAAW,OAAO;AAClB,WAAK,iBAAiB;AAAA,IACxB;AAEA,UAAM,KAAK,SAAS,aAAa;AACjC,UAAM,kBAAkB,KAAK,qBAAqB,QAAQ;AAE1D,WAAO;AAAA,MACL,WAAW,YAAY;AAAA,MACvB,YAAY;AAAA,QACV,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,OAAO,SAAS,SAAS;AAAA,QACzB;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,YAAmC;AAAA,EAEpD;AAAA;AAAA,EAIA,MAAM,KACJ,YACA,QACA,QACkB;AAClB,UAAM,IAAI;AAEV,YAAQ,QAAQ;AAAA;AAAA,MAEd,KAAK;AACH,eAAO,KAAK,kBAAkB,CAAC;AAAA,MACjC,KAAK;AACH,eAAO,KAAK,oBAAoB,CAAC;AAAA,MACnC,KAAK;AACH,eAAO,KAAK,uBAAuB,CAAC;AAAA,MACtC,KAAK;AACH,eAAO,KAAK,mBAAmB,CAAC;AAAA,MAClC,KAAK;AACH,eAAO,KAAK,qBAAqB,CAAC;AAAA;AAAA,MAGpC,KAAK;AACH,eAAO,KAAK,kBAAkB,CAAC;AAAA,MACjC,KAAK;AACH,eAAO,KAAK,oBAAoB,CAAC;AAAA,MACnC,KAAK;AACH,eAAO,KAAK,uBAAuB,CAAC;AAAA,MACtC,KAAK;AACH,eAAO,KAAK,mBAAmB,CAAC;AAAA;AAAA,MAGlC,KAAK;AACH,eAAO,KAAK,kBAAkB,CAAC;AAAA,MACjC,KAAK;AACH,eAAO,KAAK,uBAAuB,CAAC;AAAA,MAEtC;AACE,cAAM,IAAI,MAAM,0CAA0C,MAAM,GAAG;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,YAAmC;AAAA,EAEhD;AAAA;AAAA,EAIA,WAAW,UAAoD;AAC7D,SAAK,GAAG,WAAW,QAAQ;AAAA,EAC7B;AAAA;AAAA,EAIA,GACE,OACA,SACM;AACN,QAAI,CAAC,KAAK,cAAc,IAAI,KAAK,GAAG;AAClC,WAAK,cAAc,IAAI,OAAO,oBAAI,IAAI,CAAC;AAAA,IACzC;AACA,SAAK,cAAc,IAAI,KAAK,EAAG,IAAI,OAAwB;AAAA,EAC7D;AAAA,EAEA,IACE,OACA,SACM;AACN,SAAK,cAAc,IAAI,KAAK,GAAG,OAAO,OAAwB;AAAA,EAChE;AAAA;AAAA,EAIA,QAAc;AACZ,SAAK,iBAAiB;AACtB,SAAK,cAAc,MAAM;AAAA,EAC3B;AAAA;AAAA,EAIA,MAAc,kBACZ,QAC4C;AAC5C,UAAM,SAAS,MAAM,KAAK,GAAG,mBAAmB;AAAA,MAC9C,MAAM,OAAO,MAAM;AAAA,MACnB,cAAe,OAAO,cAAc,KAAiB;AAAA,IACvD,CAAC;AAED,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,qCAAqC,OAAO,QAAQ,KAAK;AAAA,MAC3D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS,OAAO,QAAQ,SAAS;AAAA,MACjC,MAAM,OAAO,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAc,oBACZ,QAC8C;AAC9C,UAAM,SAAS,MAAM,KAAK,GAAG,qBAAqB;AAAA,MAChD,MAAM,OAAO,MAAM;AAAA,MACnB,cAAe,OAAO,cAAc,KAAiB;AAAA,IACvD,CAAC;AAED,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,uCAAuC,OAAO,QAAQ,KAAK;AAAA,MAC7D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,OAAO,QAAQ,WAAW;AAAA,MACrC,MAAM,OAAO,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAc,uBACZ,QAC8C;AAC9C,UAAM,KAAK,OAAO,aAAa;AAY/B,UAAM,YACJ,GAAG,iBAAiB,UACpB,GAAG,yBAAyB;AAE9B,UAAM,cAAc,YAChB;AAAA,MACE,IAAI,GAAG;AAAA,MACP,OAAO,GAAG;AAAA,MACV,UAAU,GAAG;AAAA,MACb,OAAO,GAAG;AAAA,MACV,MAAM,GAAG,QAAQ;AAAA,MACjB,SAAS,GAAG;AAAA,MACZ,cAAc,GAAG;AAAA,MACjB,sBAAsB,GAAG;AAAA,IAC3B,IACA;AAAA,MACE,IAAI,GAAG;AAAA,MACP,OAAO,GAAG;AAAA,MACV,UAAU,GAAG,YAAY;AAAA,MACzB,UAAU,GAAG;AAAA,MACb,OAAO,GAAG;AAAA,MACV,MAAM,GAAG,QAAQ;AAAA,MACjB,SAAS,GAAG;AAAA,IACd;AAEJ,UAAM,SAAS,MAAM,KAAK,GAAG,wBAAwB;AAAA,MACnD,MAAM,OAAO,MAAM;AAAA,MACnB;AAAA,IACF,CAAC;AAED,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,0CAA0C,OAAO,QAAQ,KAAK;AAAA,MAChE;AAAA,IACF;AAEA,WAAO;AAAA,MACL,GAAG,OAAO,QAAQ,GAAG;AAAA,MACrB,GAAG,OAAO,QAAQ,GAAG;AAAA,MACrB,GAAG,OAAO,QAAQ,GAAG;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAc,mBACZ,QACgC;AAChC,UAAM,SAAS,MAAM,KAAK,GAAG,oBAAoB;AAAA,MAC/C,MAAM,OAAO,MAAM;AAAA,MACnB,SAAS,OAAO,SAAS;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,sCAAsC,OAAO,QAAQ,KAAK;AAAA,MAC5D;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,OAAO,QAAQ,WAAW,EAAY;AAAA,EAC5D;AAAA,EAEA,MAAc,qBACZ,QACkD;AAClD,UAAM,OAAO,OAAO,MAAM;AAE1B,UAAM,gBAAyC;AAAA,MAC7C,MAAM,OAAO,MAAM;AAAA,IACrB;AAEA,QAAI,SAAS,QAAQ;AACnB,oBAAc,uBAAuB,IAAI,OAAO,qBAAqB;AACrE,oBAAc,cAAc,IAAI,OAAO,aAAa;AACpD,oBAAc,oBAAoB,IAAI;AAAA,IACxC,OAAO;AACL,oBAAc,MAAM,IAAI,OAAO,MAAM;AACrC,oBAAc,oBAAoB,IAC/B,OAAO,kBAAkB,KAAiB;AAAA,IAC/C;AAEA,UAAM,SAAS,MAAM,KAAK,GAAG,sBAAsB,aAAa;AAEhE,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,wCAAwC,OAAO,QAAQ,KAAK;AAAA,MAC9D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,OAAO,QAAQ,WAAW;AAAA,MACrC,SAAS,OAAO,QAAQ,SAAS;AAAA,IACnC;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,kBACZ,QAC4C;AAC5C,UAAM,SAAS,MAAM,KAAK,GAAG,WAAW;AAAA,MACtC,MAAM,OAAO,MAAM;AAAA,MACnB,MAAM,OAAO,MAAM;AAAA,MACnB,cAAe,OAAO,cAAc,KAAiB;AAAA,MACrD,YAAY,OAAO,YAAY;AAAA,IACjC,CAAC;AAED,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,mCAAmC,OAAO,QAAQ,KAAK;AAAA,MACzD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS,OAAO,QAAQ,SAAS;AAAA,MACjC,MAAM,OAAO,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAc,oBACZ,QAOC;AACD,UAAM,SAAS,MAAM,KAAK,GAAG,aAAa;AAAA,MACxC,MAAM,OAAO,MAAM;AAAA,MACnB,MAAM,OAAO,MAAM;AAAA,MACnB,cAAe,OAAO,cAAc,KAAiB;AAAA,IACvD,CAAC;AAED,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,qCAAqC,OAAO,QAAQ,KAAK;AAAA,MAC3D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM,OAAO,QAAQ,MAAM;AAAA,MAC3B,WAAW,OAAO,QAAQ,WAAW;AAAA,MACrC,aAAa,OAAO,QAAQ,aAAa;AAAA,MACzC,WAAW,OAAO,QAAQ,WAAW;AAAA,MACrC,MAAM,OAAO,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAc,uBACZ,QACwE;AACxE,UAAM,SAAS,MAAM,KAAK,GAAG,gBAAgB;AAAA,MAC3C,QAAQ,OAAO,QAAQ;AAAA,MACvB,SAAS,OAAO,SAAS;AAAA,MACzB,QAAQ,OAAO,QAAQ;AAAA,MACvB,MAAM,OAAO,MAAM;AAAA,MACnB,UAAU,OAAO,UAAU;AAAA,MAC3B,SAAS,OAAO,SAAS;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,wCAAwC,OAAO,QAAQ,KAAK;AAAA,MAC9D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,YAAY,OAAO,QAAQ,YAAY;AAAA,MACvC,cAAc,OAAO,QAAQ,cAAc;AAAA,MAC3C,MAAM,OAAO,QAAQ,MAAM;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAc,mBACZ,QACiD;AACjD,UAAM,SAAS,MAAM,KAAK,GAAG,YAAY;AAAA,MACvC,MAAM,OAAO,MAAM;AAAA,MACnB,SAAS,OAAO,SAAS;AAAA,MACzB,MAAM,OAAO,MAAM;AAAA,IACrB,CAAC;AAED,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,oCAAoC,OAAO,QAAQ,KAAK;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,OAAO,QAAQ,WAAW;AAAA,MACrC,SAAS,OAAO,QAAQ,SAAS;AAAA,IACnC;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,kBACZ,QAC4C;AAC5C,UAAM,SAAS,MAAM,KAAK,GAAG,iBAAiB;AAAA,MAC5C,MAAM,OAAO,MAAM;AAAA,MACnB,cAAe,OAAO,cAAc,KAAiB;AAAA,IACvD,CAAC;AAED,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,mCAAmC,OAAO,QAAQ,KAAK;AAAA,MACzD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS,OAAO,QAAQ,SAAS;AAAA,MACjC,MAAM,OAAO,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAc,uBACZ,QACgC;AAChC,UAAM,SAAS,MAAM,KAAK,GAAG,sBAAsB;AAAA,MACjD,MAAM,OAAO,MAAM;AAAA,MACnB,cAAc,OAAO,cAAc;AAAA,MACnC,gBAAgB,OAAO,gBAAgB;AAAA,IACzC,CAAC;AAED,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,wCAAwC,OAAO,QAAQ,KAAK;AAAA,MAC9D;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,OAAO,QAAQ,WAAW,EAAY;AAAA,EAC5D;AAAA;AAAA,EAIQ,qBAAqB,UAAmC;AAC9D,QAAI,SAAS,iBAAiB,MAAM;AAClC,aAAO,GAAG,SAAS,aAAa,IAAI,SAAS,iBAAiB,CAAC,IAAI,SAAS,iBAAiB,CAAC;AAAA,IAChG;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGU,KACR,OACA,MACM;AACN,UAAM,WAAW,KAAK,cAAc,IAAI,KAAK;AAC7C,QAAI,CAAC,SAAU;AACf,eAAW,WAAW,UAAU;AAC9B,UAAI;AACF,gBAAQ,IAA6C;AAAA,MACvD,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;;;ADjgBO,SAAS,sBACd,eACY;AACZ,SAAO,IAAI,sBAAsB,aAAa;AAChD;","names":[]}
|
|
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(trezorConnect: ITrezorConnectLike): 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]\n) => 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(_sessionId: string, method: string, params: unknown): 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>(event: K, handler: (data: ConnectorEventMap[K]) => void): 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>(event: K, handler: (data: ConnectorEventMap[K]) => void): 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(`Trezor ethereumGetAddress failed: ${result.payload.error}`);\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(`Trezor ethereumGetPublicKey failed: ${result.payload.error}`);\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 = tx.maxFeePerGas !== undefined && 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(`Trezor ethereumSignTransaction failed: ${result.payload.error}`);\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(`Trezor ethereumSignMessage failed: ${result.payload.error}`);\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'] = (params['metamaskV4Compat'] as boolean) ?? true;\n }\n\n const result = await this.tc.ethereumSignTypedData(connectParams);\n\n if (!result.success) {\n throw new Error(`Trezor ethereumSignTypedData failed: ${result.payload.error}`);\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(`Trezor getAddress (BTC) failed: ${result.payload.error}`);\n }\n\n return {\n address: result.payload['address'] as string,\n path: params['path'] as string,\n };\n }\n\n private async callBtcGetPublicKey(params: Record<string, unknown>): 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(`Trezor getPublicKey (BTC) failed: ${result.payload.error}`);\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(`Trezor signTransaction (BTC) failed: ${result.payload.error}`);\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(`Trezor signMessage (BTC) failed: ${result.payload.error}`);\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(`Trezor solanaGetAddress failed: ${result.payload.error}`);\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(`Trezor solanaSignTransaction failed: ${result.payload.error}`);\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>(event: K, data: ConnectorEventMap[K]): 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
CHANGED
|
@@ -112,9 +112,7 @@ var TrezorDirectConnector = class {
|
|
|
112
112
|
showOnTrezor: params["showOnDevice"] ?? false
|
|
113
113
|
});
|
|
114
114
|
if (!result.success) {
|
|
115
|
-
throw new Error(
|
|
116
|
-
`Trezor ethereumGetAddress failed: ${result.payload.error}`
|
|
117
|
-
);
|
|
115
|
+
throw new Error(`Trezor ethereumGetAddress failed: ${result.payload.error}`);
|
|
118
116
|
}
|
|
119
117
|
return {
|
|
120
118
|
address: result.payload["address"],
|
|
@@ -127,9 +125,7 @@ var TrezorDirectConnector = class {
|
|
|
127
125
|
showOnTrezor: params["showOnDevice"] ?? false
|
|
128
126
|
});
|
|
129
127
|
if (!result.success) {
|
|
130
|
-
throw new Error(
|
|
131
|
-
`Trezor ethereumGetPublicKey failed: ${result.payload.error}`
|
|
132
|
-
);
|
|
128
|
+
throw new Error(`Trezor ethereumGetPublicKey failed: ${result.payload.error}`);
|
|
133
129
|
}
|
|
134
130
|
return {
|
|
135
131
|
publicKey: result.payload["publicKey"],
|
|
@@ -162,9 +158,7 @@ var TrezorDirectConnector = class {
|
|
|
162
158
|
transaction
|
|
163
159
|
});
|
|
164
160
|
if (!result.success) {
|
|
165
|
-
throw new Error(
|
|
166
|
-
`Trezor ethereumSignTransaction failed: ${result.payload.error}`
|
|
167
|
-
);
|
|
161
|
+
throw new Error(`Trezor ethereumSignTransaction failed: ${result.payload.error}`);
|
|
168
162
|
}
|
|
169
163
|
return {
|
|
170
164
|
v: result.payload["v"],
|
|
@@ -178,9 +172,7 @@ var TrezorDirectConnector = class {
|
|
|
178
172
|
message: params["message"]
|
|
179
173
|
});
|
|
180
174
|
if (!result.success) {
|
|
181
|
-
throw new Error(
|
|
182
|
-
`Trezor ethereumSignMessage failed: ${result.payload.error}`
|
|
183
|
-
);
|
|
175
|
+
throw new Error(`Trezor ethereumSignMessage failed: ${result.payload.error}`);
|
|
184
176
|
}
|
|
185
177
|
return { signature: result.payload["signature"] };
|
|
186
178
|
}
|
|
@@ -199,9 +191,7 @@ var TrezorDirectConnector = class {
|
|
|
199
191
|
}
|
|
200
192
|
const result = await this.tc.ethereumSignTypedData(connectParams);
|
|
201
193
|
if (!result.success) {
|
|
202
|
-
throw new Error(
|
|
203
|
-
`Trezor ethereumSignTypedData failed: ${result.payload.error}`
|
|
204
|
-
);
|
|
194
|
+
throw new Error(`Trezor ethereumSignTypedData failed: ${result.payload.error}`);
|
|
205
195
|
}
|
|
206
196
|
return {
|
|
207
197
|
signature: result.payload["signature"],
|
|
@@ -217,9 +207,7 @@ var TrezorDirectConnector = class {
|
|
|
217
207
|
scriptType: params["scriptType"]
|
|
218
208
|
});
|
|
219
209
|
if (!result.success) {
|
|
220
|
-
throw new Error(
|
|
221
|
-
`Trezor getAddress (BTC) failed: ${result.payload.error}`
|
|
222
|
-
);
|
|
210
|
+
throw new Error(`Trezor getAddress (BTC) failed: ${result.payload.error}`);
|
|
223
211
|
}
|
|
224
212
|
return {
|
|
225
213
|
address: result.payload["address"],
|
|
@@ -233,9 +221,7 @@ var TrezorDirectConnector = class {
|
|
|
233
221
|
showOnTrezor: params["showOnDevice"] ?? false
|
|
234
222
|
});
|
|
235
223
|
if (!result.success) {
|
|
236
|
-
throw new Error(
|
|
237
|
-
`Trezor getPublicKey (BTC) failed: ${result.payload.error}`
|
|
238
|
-
);
|
|
224
|
+
throw new Error(`Trezor getPublicKey (BTC) failed: ${result.payload.error}`);
|
|
239
225
|
}
|
|
240
226
|
return {
|
|
241
227
|
xpub: result.payload["xpub"],
|
|
@@ -255,9 +241,7 @@ var TrezorDirectConnector = class {
|
|
|
255
241
|
version: params["version"]
|
|
256
242
|
});
|
|
257
243
|
if (!result.success) {
|
|
258
|
-
throw new Error(
|
|
259
|
-
`Trezor signTransaction (BTC) failed: ${result.payload.error}`
|
|
260
|
-
);
|
|
244
|
+
throw new Error(`Trezor signTransaction (BTC) failed: ${result.payload.error}`);
|
|
261
245
|
}
|
|
262
246
|
return {
|
|
263
247
|
signatures: result.payload["signatures"],
|
|
@@ -272,9 +256,7 @@ var TrezorDirectConnector = class {
|
|
|
272
256
|
coin: params["coin"]
|
|
273
257
|
});
|
|
274
258
|
if (!result.success) {
|
|
275
|
-
throw new Error(
|
|
276
|
-
`Trezor signMessage (BTC) failed: ${result.payload.error}`
|
|
277
|
-
);
|
|
259
|
+
throw new Error(`Trezor signMessage (BTC) failed: ${result.payload.error}`);
|
|
278
260
|
}
|
|
279
261
|
return {
|
|
280
262
|
signature: result.payload["signature"],
|
|
@@ -288,9 +270,7 @@ var TrezorDirectConnector = class {
|
|
|
288
270
|
showOnTrezor: params["showOnDevice"] ?? false
|
|
289
271
|
});
|
|
290
272
|
if (!result.success) {
|
|
291
|
-
throw new Error(
|
|
292
|
-
`Trezor solanaGetAddress failed: ${result.payload.error}`
|
|
293
|
-
);
|
|
273
|
+
throw new Error(`Trezor solanaGetAddress failed: ${result.payload.error}`);
|
|
294
274
|
}
|
|
295
275
|
return {
|
|
296
276
|
address: result.payload["address"],
|
|
@@ -304,9 +284,7 @@ var TrezorDirectConnector = class {
|
|
|
304
284
|
additionalInfo: params["additionalInfo"]
|
|
305
285
|
});
|
|
306
286
|
if (!result.success) {
|
|
307
|
-
throw new Error(
|
|
308
|
-
`Trezor solanaSignTransaction failed: ${result.payload.error}`
|
|
309
|
-
);
|
|
287
|
+
throw new Error(`Trezor solanaSignTransaction failed: ${result.payload.error}`);
|
|
310
288
|
}
|
|
311
289
|
return { signature: result.payload["signature"] };
|
|
312
290
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +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":[]}
|
|
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]\n) => 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(_sessionId: string, method: string, params: unknown): 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>(event: K, handler: (data: ConnectorEventMap[K]) => void): 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>(event: K, handler: (data: ConnectorEventMap[K]) => void): 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(`Trezor ethereumGetAddress failed: ${result.payload.error}`);\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(`Trezor ethereumGetPublicKey failed: ${result.payload.error}`);\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 = tx.maxFeePerGas !== undefined && 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(`Trezor ethereumSignTransaction failed: ${result.payload.error}`);\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(`Trezor ethereumSignMessage failed: ${result.payload.error}`);\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'] = (params['metamaskV4Compat'] as boolean) ?? true;\n }\n\n const result = await this.tc.ethereumSignTypedData(connectParams);\n\n if (!result.success) {\n throw new Error(`Trezor ethereumSignTypedData failed: ${result.payload.error}`);\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(`Trezor getAddress (BTC) failed: ${result.payload.error}`);\n }\n\n return {\n address: result.payload['address'] as string,\n path: params['path'] as string,\n };\n }\n\n private async callBtcGetPublicKey(params: Record<string, unknown>): 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(`Trezor getPublicKey (BTC) failed: ${result.payload.error}`);\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(`Trezor signTransaction (BTC) failed: ${result.payload.error}`);\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(`Trezor signMessage (BTC) failed: ${result.payload.error}`);\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(`Trezor solanaGetAddress failed: ${result.payload.error}`);\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(`Trezor solanaSignTransaction failed: ${result.payload.error}`);\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>(event: K, data: ConnectorEventMap[K]): 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(trezorConnect: ITrezorConnectLike): IConnector {\n return new TrezorDirectConnector(trezorConnect);\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bytezhang/hardware-trezor-connector",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "IConnector implementation for Trezor hardware wallets via @trezor/connect",
|
|
5
|
-
"author": "OneKey",
|
|
6
|
-
"license": "MIT",
|
|
3
|
+
"version": "0.0.32",
|
|
7
4
|
"main": "dist/index.js",
|
|
8
5
|
"module": "dist/index.mjs",
|
|
9
6
|
"types": "dist/index.d.ts",
|
|
@@ -19,27 +16,10 @@
|
|
|
19
16
|
}
|
|
20
17
|
}
|
|
21
18
|
},
|
|
22
|
-
"files": [
|
|
23
|
-
"dist"
|
|
24
|
-
],
|
|
25
|
-
"scripts": {
|
|
26
|
-
"build": "tsup",
|
|
27
|
-
"dev": "tsup --watch",
|
|
28
|
-
"clean": "rimraf dist",
|
|
29
|
-
"test": "vitest run"
|
|
30
|
-
},
|
|
31
|
-
"dependencies": {
|
|
32
|
-
"@bytezhang/hardware-wallet-core": "0.0.30"
|
|
33
|
-
},
|
|
34
19
|
"peerDependencies": {
|
|
35
20
|
"@trezor/connect-web": "^9.0.0"
|
|
36
21
|
},
|
|
37
|
-
"
|
|
38
|
-
"@
|
|
39
|
-
"optional": true
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
"devDependencies": {
|
|
43
|
-
"rimraf": "^5.0.0"
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@bytezhang/hardware-wallet-core": "0.0.32"
|
|
44
24
|
}
|
|
45
25
|
}
|