@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 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":"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","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
  }
@@ -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":";AAwEO,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,KAAK,YAAoB,QAAgB,QAAmC;AAChF,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,GAAiC,OAAU,SAAqD;AAC9F,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,IAAkC,OAAU,SAAqD;AAC/F,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,MAAM,qCAAqC,OAAO,QAAQ,KAAK,EAAE;AAAA,IAC7E;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,MAAM,uCAAuC,OAAO,QAAQ,KAAK,EAAE;AAAA,IAC/E;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,YAAY,GAAG,iBAAiB,UAAa,GAAG,yBAAyB;AAE/E,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,MAAM,0CAA0C,OAAO,QAAQ,KAAK,EAAE;AAAA,IAClF;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,MAAM,sCAAsC,OAAO,QAAQ,KAAK,EAAE;AAAA,IAC9E;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,IAAK,OAAO,kBAAkB,KAAiB;AAAA,IACnF;AAEA,UAAM,SAAS,MAAM,KAAK,GAAG,sBAAsB,aAAa;AAEhE,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI,MAAM,wCAAwC,OAAO,QAAQ,KAAK,EAAE;AAAA,IAChF;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,MAAM,mCAAmC,OAAO,QAAQ,KAAK,EAAE;AAAA,IAC3E;AAEA,WAAO;AAAA,MACL,SAAS,OAAO,QAAQ,SAAS;AAAA,MACjC,MAAM,OAAO,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,QAM/B;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,MAAM,qCAAqC,OAAO,QAAQ,KAAK,EAAE;AAAA,IAC7E;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,MAAM,wCAAwC,OAAO,QAAQ,KAAK,EAAE;AAAA,IAChF;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,MAAM,oCAAoC,OAAO,QAAQ,KAAK,EAAE;AAAA,IAC5E;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,MAAM,mCAAmC,OAAO,QAAQ,KAAK,EAAE;AAAA,IAC3E;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,MAAM,wCAAwC,OAAO,QAAQ,KAAK,EAAE;AAAA,IAChF;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,KAAmC,OAAU,MAAkC;AACvF,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;;;AC1dO,SAAS,sBAAsB,eAA+C;AACnF,SAAO,IAAI,sBAAsB,aAAa;AAChD;","names":[]}
package/package.json CHANGED
@@ -1,9 +1,6 @@
1
1
  {
2
2
  "name": "@bytezhang/hardware-trezor-connector",
3
- "version": "0.0.30",
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
- "peerDependenciesMeta": {
38
- "@trezor/connect-web": {
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
  }