@onekeyfe/hd-shared 1.1.32-alpha.4 → 1.1.34-alpha.0

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.
@@ -115,6 +115,7 @@ export declare const HardwareErrorCode: {
115
115
  readonly DeviceSettingsLanguageNotSupport: 826;
116
116
  readonly TooManyInputs: 827;
117
117
  readonly PinMismatch: 828;
118
+ readonly KaspaPrevTxIdMismatch: 829;
118
119
  readonly LowlevelTrasnportConnectError: 900;
119
120
  readonly WebDeviceNotFoundOrNeedsPermission: 901;
120
121
  readonly WebDevicePromptAccessError: 902;
@@ -1 +1 @@
1
- {"version":3,"file":"HardwareError.d.ts","sourceRoot":"","sources":["../src/HardwareError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,KAAK,OAAO,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAE5C,KAAK,+BAA+B,GAAG;KAAG,CAAC,IAAI,OAAO,CAAC,OAAO,iBAAiB,CAAC,GAAG,MAAM;CAAE,CAAC;AAE5F,KAAK,cAAc,GAAG,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAsCxD,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAS,EAAE,cAAc,CAAkC;IAE3D,OAAO,SAAM;IAEb,MAAM,EAAE,GAAG,CAAM;gBAEL,aAAa,EAAE,cAAc,GAAG,MAAM;CAmBnD;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsapB,CAAC;AAEX,eAAO,MAAM,wBAAwB,EAAE,+BAgJ7B,CAAC;AAEX,eAAO,MAAM,UAAU,kBACN,cAAc,GAAG,MAAM,YAC5B,MAAM,WACP,GAAG,kBAMb,CAAC;AAEF,eAAO,MAAM,cAAc,YAAa,GAAG,QAe1C,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAa,MAAM,KAAG,aAOtD,CAAC;AAGF,eAAO,MAAM,gCAAgC,QAAS,MAAM,KAAG,aAQ9D,CAAC;AAEF,QAAA,MAAM,uCAAuC;oBAM3B,MAAM;oBACN,MAAM;;;mBAcvB,CAAC;AAEF,QAAA,MAAM,sCAAsC;oBAM1B,MAAM;oBACN,MAAM;;;mBAcvB,CAAC;AAEF,QAAA,MAAM,yCAAyC,cAClC,MAAM,GAAG,SAAS,YACnB,MAAM,GAAG,SAAS,iBACb,CAAC,UAAU,GAAG,KAAK,CAAC,EAAE,oBACnB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,kBAsBF,CAAC;AAEF,QAAA,MAAM,6BAA6B,mBACjB,MAAM,qBACH,MAAM,eACZ,MAAM,kBAQpB,CAAC;AAEF,QAAA,MAAM,4BAA4B,aACtB,MAAM,aACL,MAAM,cACL,MAAM,cACN,MAAM,aACP,MAAM,kBAWlB,CAAC;AAEF,QAAA,MAAM,iCAAiC,eAAgB,MAAM,gBAAgB,aAAa,kBAItF,CAAC;AAEL,OAAO,EACL,uCAAuC,EACvC,sCAAsC,EACtC,yCAAyC,EACzC,6BAA6B,EAC7B,4BAA4B,EAC5B,iCAAiC,GAClC,CAAC"}
1
+ {"version":3,"file":"HardwareError.d.ts","sourceRoot":"","sources":["../src/HardwareError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,KAAK,OAAO,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAE5C,KAAK,+BAA+B,GAAG;KAAG,CAAC,IAAI,OAAO,CAAC,OAAO,iBAAiB,CAAC,GAAG,MAAM;CAAE,CAAC;AAE5F,KAAK,cAAc,GAAG,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAsCxD,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAS,EAAE,cAAc,CAAkC;IAE3D,OAAO,SAAM;IAEb,MAAM,EAAE,GAAG,CAAM;gBAEL,aAAa,EAAE,cAAc,GAAG,MAAM;CAmBnD;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2apB,CAAC;AAEX,eAAO,MAAM,wBAAwB,EAAE,+BAiJ7B,CAAC;AAEX,eAAO,MAAM,UAAU,kBACN,cAAc,GAAG,MAAM,YAC5B,MAAM,WACP,GAAG,kBAMb,CAAC;AAEF,eAAO,MAAM,cAAc,YAAa,GAAG,QAe1C,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAa,MAAM,KAAG,aAOtD,CAAC;AAGF,eAAO,MAAM,gCAAgC,QAAS,MAAM,KAAG,aAQ9D,CAAC;AAEF,QAAA,MAAM,uCAAuC;oBAM3B,MAAM;oBACN,MAAM;;;mBAcvB,CAAC;AAEF,QAAA,MAAM,sCAAsC;oBAM1B,MAAM;oBACN,MAAM;;;mBAcvB,CAAC;AAEF,QAAA,MAAM,yCAAyC,cAClC,MAAM,GAAG,SAAS,YACnB,MAAM,GAAG,SAAS,iBACb,CAAC,UAAU,GAAG,KAAK,CAAC,EAAE,oBACnB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,kBAsBF,CAAC;AAEF,QAAA,MAAM,6BAA6B,mBACjB,MAAM,qBACH,MAAM,eACZ,MAAM,kBAQpB,CAAC;AAEF,QAAA,MAAM,4BAA4B,aACtB,MAAM,aACL,MAAM,cACL,MAAM,cACN,MAAM,aACP,MAAM,kBAWlB,CAAC;AAEF,QAAA,MAAM,iCAAiC,eAAgB,MAAM,gBAAgB,aAAa,kBAItF,CAAC;AAEL,OAAO,EACL,uCAAuC,EACvC,sCAAsC,EACtC,yCAAyC,EACzC,6BAA6B,EAC7B,4BAA4B,EAC5B,iCAAiC,GAClC,CAAC"}
@@ -3,6 +3,12 @@ export declare const ONEKEY_WEBUSB_FILTER: {
3
3
  vendorId: number;
4
4
  productId: number;
5
5
  }[];
6
+ type WebUsbIdentityDescriptor = {
7
+ vendorId?: number;
8
+ productId?: number;
9
+ manufacturerName?: string | null;
10
+ };
11
+ export declare const isKnownTrezorWebUsbDevice: (descriptor: WebUsbIdentityDescriptor) => boolean;
6
12
  export declare const ERROR_CODES_REQUIRE_RELEASE: readonly [106, 107, 109, 112, 805, 801, 802, 812];
7
13
  export declare const ERROR_CODES_REQUIRE_DISCONNECT: readonly [106, 805];
8
14
  export declare enum EOneKeyBleMessageKeys {
@@ -34,4 +40,5 @@ export declare const ONEKEY_WRITE_CHARACTERISTIC_UUID = "00000002-0000-1000-8000
34
40
  export declare const ONEKEY_NOTIFY_CHARACTERISTIC_UUID = "00000003-0000-1000-8000-00805f9b34fb";
35
41
  export declare const isHeaderChunk: (chunk: Buffer | Uint8Array) => boolean;
36
42
  export declare const isOnekeyDevice: (name: string | null, id?: string) => boolean;
43
+ export {};
37
44
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";AAEA,eAAO,MAAM,oBAAoB;;;GAOhC,CAAC;AAMF,eAAO,MAAM,2BAA2B,mDAS9B,CAAC;AAMX,eAAO,MAAM,8BAA8B,qBAGjC,CAAC;AAGX,oBAAY,qBAAqB;IAE/B,UAAU,uBAAuB;IACjC,iBAAiB,8BAA8B;IAC/C,aAAa,0BAA0B;IACvC,kBAAkB,+BAA+B;IACjD,cAAc,2BAA2B;IACzC,oBAAoB,iCAAiC;IAGrD,mBAAmB,gCAAgC;IACnD,oBAAoB,iCAAiC;IAGrD,aAAa,0BAA0B;IACvC,oBAAoB,iCAAiC;IAGrD,uBAAuB,oCAAoC;IAC3D,sBAAsB,mCAAmC;IAGzD,mBAAmB,gCAAgC;IACnD,mBAAmB,gCAAgC;IACnD,oBAAoB,iCAAiC;IACrD,iBAAiB,8BAA8B;IAC/C,oBAAoB,iCAAiC;IACrD,eAAe,4BAA4B;IAC3C,mBAAmB,gCAAgC;IACnD,qBAAqB,kCAAkC;IACvD,sBAAsB,mCAAmC;IACzD,wBAAwB,qCAAqC;CAC9D;AAED,eAAO,MAAM,mBAAmB,yCAAyC,CAAC;AAC1E,eAAO,MAAM,gCAAgC,yCAAyC,CAAC;AACvF,eAAO,MAAM,iCAAiC,yCAAyC,CAAC;AAIxF,eAAO,MAAM,aAAa,UAAW,MAAM,GAAG,UAAU,KAAG,OAa1D,CAAC;AAEF,eAAO,MAAM,cAAc,SAAU,MAAM,GAAG,IAAI,OAAO,MAAM,KAAG,OAYjE,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";AAEA,eAAO,MAAM,oBAAoB;;;GAOhC,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAIF,eAAO,MAAM,yBAAyB,eAAgB,wBAAwB,KAAG,OAQhF,CAAC;AAMF,eAAO,MAAM,2BAA2B,mDAS9B,CAAC;AAMX,eAAO,MAAM,8BAA8B,qBAGjC,CAAC;AAGX,oBAAY,qBAAqB;IAE/B,UAAU,uBAAuB;IACjC,iBAAiB,8BAA8B;IAC/C,aAAa,0BAA0B;IACvC,kBAAkB,+BAA+B;IACjD,cAAc,2BAA2B;IACzC,oBAAoB,iCAAiC;IAGrD,mBAAmB,gCAAgC;IACnD,oBAAoB,iCAAiC;IAGrD,aAAa,0BAA0B;IACvC,oBAAoB,iCAAiC;IAGrD,uBAAuB,oCAAoC;IAC3D,sBAAsB,mCAAmC;IAGzD,mBAAmB,gCAAgC;IACnD,mBAAmB,gCAAgC;IACnD,oBAAoB,iCAAiC;IACrD,iBAAiB,8BAA8B;IAC/C,oBAAoB,iCAAiC;IACrD,eAAe,4BAA4B;IAC3C,mBAAmB,gCAAgC;IACnD,qBAAqB,kCAAkC;IACvD,sBAAsB,mCAAmC;IACzD,wBAAwB,qCAAqC;CAC9D;AAED,eAAO,MAAM,mBAAmB,yCAAyC,CAAC;AAC1E,eAAO,MAAM,gCAAgC,yCAAyC,CAAC;AACvF,eAAO,MAAM,iCAAiC,yCAAyC,CAAC;AAIxF,eAAO,MAAM,aAAa,UAAW,MAAM,GAAG,UAAU,KAAG,OAa1D,CAAC;AAkBF,eAAO,MAAM,cAAc,SAAU,MAAM,GAAG,IAAI,OAAO,MAAM,KAAG,OAgBjE,CAAC"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,12 @@ declare const ONEKEY_WEBUSB_FILTER: {
2
2
  vendorId: number;
3
3
  productId: number;
4
4
  }[];
5
+ type WebUsbIdentityDescriptor = {
6
+ vendorId?: number;
7
+ productId?: number;
8
+ manufacturerName?: string | null;
9
+ };
10
+ declare const isKnownTrezorWebUsbDevice: (descriptor: WebUsbIdentityDescriptor) => boolean;
5
11
  declare const ERROR_CODES_REQUIRE_RELEASE: readonly [106, 107, 109, 112, 805, 801, 802, 812];
6
12
  declare const ERROR_CODES_REQUIRE_DISCONNECT: readonly [106, 805];
7
13
  declare enum EOneKeyBleMessageKeys {
@@ -164,6 +170,7 @@ declare const HardwareErrorCode: {
164
170
  readonly DeviceSettingsLanguageNotSupport: 826;
165
171
  readonly TooManyInputs: 827;
166
172
  readonly PinMismatch: 828;
173
+ readonly KaspaPrevTxIdMismatch: 829;
167
174
  readonly LowlevelTrasnportConnectError: 900;
168
175
  readonly WebDeviceNotFoundOrNeedsPermission: 901;
169
176
  readonly WebDevicePromptAccessError: 902;
@@ -239,4 +246,4 @@ declare enum EDeviceType {
239
246
  Pro = "pro"
240
247
  }
241
248
 
242
- export { CreateErrorByMessage, CreateHardwareErrorByBridgeError, Deferred, EDeviceType, EFirmwareType, EOneKeyBleMessageKeys, HardwareError$1 as ERRORS, ERROR_CODES_REQUIRE_DISCONNECT, ERROR_CODES_REQUIRE_RELEASE, HardwareError, HardwareErrorCode, HardwareErrorCodeMessage, IHardwareError, ONEKEY_NOTIFY_CHARACTERISTIC_UUID, ONEKEY_SERVICE_UUID, ONEKEY_WEBUSB_FILTER, ONEKEY_WRITE_CHARACTERISTIC_UUID, TypedError, createDefectiveFirmwareError, createDeferred, createDeprecatedHardwareError, createDeviceNotSupportMethodError, createNeedUpgradeFirmwareHardwareError, createNewFirmwareForceUpdateHardwareError, createNewFirmwareUnReleaseHardwareError, isHeaderChunk, isOnekeyDevice, serializeError, wait };
249
+ export { CreateErrorByMessage, CreateHardwareErrorByBridgeError, Deferred, EDeviceType, EFirmwareType, EOneKeyBleMessageKeys, HardwareError$1 as ERRORS, ERROR_CODES_REQUIRE_DISCONNECT, ERROR_CODES_REQUIRE_RELEASE, HardwareError, HardwareErrorCode, HardwareErrorCodeMessage, IHardwareError, ONEKEY_NOTIFY_CHARACTERISTIC_UUID, ONEKEY_SERVICE_UUID, ONEKEY_WEBUSB_FILTER, ONEKEY_WRITE_CHARACTERISTIC_UUID, TypedError, createDefectiveFirmwareError, createDeferred, createDeprecatedHardwareError, createDeviceNotSupportMethodError, createNeedUpgradeFirmwareHardwareError, createNewFirmwareForceUpdateHardwareError, createNewFirmwareUnReleaseHardwareError, isHeaderChunk, isKnownTrezorWebUsbDevice, isOnekeyDevice, serializeError, wait };
package/dist/index.js CHANGED
@@ -164,6 +164,7 @@ const HardwareErrorCode = {
164
164
  DeviceSettingsLanguageNotSupport: 826,
165
165
  TooManyInputs: 827,
166
166
  PinMismatch: 828,
167
+ KaspaPrevTxIdMismatch: 829,
167
168
  LowlevelTrasnportConnectError: 900,
168
169
  WebDeviceNotFoundOrNeedsPermission: 901,
169
170
  WebDevicePromptAccessError: 902,
@@ -268,6 +269,7 @@ const HardwareErrorCodeMessage = {
268
269
  [HardwareErrorCode.DeviceSettingsLanguageNotSupport]: 'Language not supported',
269
270
  [HardwareErrorCode.TooManyInputs]: 'Too many inputs',
270
271
  [HardwareErrorCode.PinMismatch]: 'PIN mismatch',
272
+ [HardwareErrorCode.KaspaPrevTxIdMismatch]: 'Kaspa previous transaction id mismatch',
271
273
  [HardwareErrorCode.LowlevelTrasnportConnectError]: 'Lowlevel transport connect error',
272
274
  [HardwareErrorCode.WebDeviceNotFoundOrNeedsPermission]: 'Web-USB or Web-Bluetooth device not found or needs permission',
273
275
  [HardwareErrorCode.WebDevicePromptAccessError]: 'Web-USB or Web-Bluetooth device prompt access error',
@@ -386,6 +388,15 @@ const ONEKEY_WEBUSB_FILTER = [
386
388
  { vendorId: 0x1209, productId: 0x4f4a },
387
389
  { vendorId: 0x1209, productId: 0x4f4b },
388
390
  ];
391
+ const TREZOR_WEBUSB_MANUFACTURER_NAMES = new Set(['trezor', 'trezor company', 'satoshilabs']);
392
+ const isKnownTrezorWebUsbDevice = (descriptor) => {
393
+ var _a;
394
+ const isSharedWebUsbId = ONEKEY_WEBUSB_FILTER.some(filter => descriptor.vendorId === filter.vendorId && descriptor.productId === filter.productId);
395
+ if (!isSharedWebUsbId)
396
+ return false;
397
+ const manufacturerName = (_a = descriptor.manufacturerName) === null || _a === void 0 ? void 0 : _a.trim().toLowerCase();
398
+ return manufacturerName != null && TREZOR_WEBUSB_MANUFACTURER_NAMES.has(manufacturerName);
399
+ };
389
400
  const ERROR_CODES_REQUIRE_RELEASE = [
390
401
  HardwareErrorCode.DeviceInitializeFailed,
391
402
  HardwareErrorCode.DeviceInterruptedFromOutside,
@@ -441,16 +452,37 @@ const isHeaderChunk = (chunk) => {
441
452
  }
442
453
  return false;
443
454
  };
444
- const isOnekeyDevice = (name, id) => {
445
- var _a;
446
- if ((_a = id === null || id === void 0 ? void 0 : id.startsWith) === null || _a === void 0 ? void 0 : _a.call(id, 'MI')) {
455
+ const isKnownNonOneKeyDeviceName = (normalizedName) => normalizedName.startsWith('trezor') ||
456
+ normalizedName.startsWith('ledger') ||
457
+ normalizedName.startsWith('nano ') ||
458
+ normalizedName.startsWith('stax') ||
459
+ normalizedName.startsWith('flex');
460
+ const ONEKEY_EXACT_SHORT_NAMES = new Set(['s8']);
461
+ const isOneKeyShortName = (normalizedName) => {
462
+ if (ONEKEY_EXACT_SHORT_NAMES.has(normalizedName))
447
463
  return true;
464
+ if (normalizedName.length !== 5)
465
+ return false;
466
+ const firstChar = normalizedName[0];
467
+ return (firstChar === 'k' || firstChar === 't') && /^\d{4}$/.test(normalizedName.slice(1));
468
+ };
469
+ const isOnekeyDevice = (name, id) => {
470
+ var _a, _b;
471
+ const normalizedName = (_a = name === null || name === void 0 ? void 0 : name.trim().toLowerCase()) !== null && _a !== void 0 ? _a : '';
472
+ if (isKnownNonOneKeyDeviceName(normalizedName)) {
473
+ return false;
448
474
  }
449
- const re = /(BixinKey\d{10})|(K\d{4})|(T\d{4})|(Touch\s\w{4})|(Pro\s\w{4})/i;
450
- if (name && re.exec(name)) {
475
+ if ((_b = id === null || id === void 0 ? void 0 : id.startsWith) === null || _b === void 0 ? void 0 : _b.call(id, 'MI')) {
451
476
  return true;
452
477
  }
453
- return false;
478
+ if (!name) {
479
+ return false;
480
+ }
481
+ if (normalizedName.startsWith('onekey') || normalizedName.startsWith('bixinkey'))
482
+ return true;
483
+ if (normalizedName.startsWith('touch ') || normalizedName.startsWith('pro '))
484
+ return true;
485
+ return isOneKeyShortName(normalizedName);
454
486
  };
455
487
 
456
488
  /******************************************************************************
@@ -546,6 +578,7 @@ exports.createNeedUpgradeFirmwareHardwareError = createNeedUpgradeFirmwareHardwa
546
578
  exports.createNewFirmwareForceUpdateHardwareError = createNewFirmwareForceUpdateHardwareError;
547
579
  exports.createNewFirmwareUnReleaseHardwareError = createNewFirmwareUnReleaseHardwareError;
548
580
  exports.isHeaderChunk = isHeaderChunk;
581
+ exports.isKnownTrezorWebUsbDevice = isKnownTrezorWebUsbDevice;
549
582
  exports.isOnekeyDevice = isOnekeyDevice;
550
583
  exports.serializeError = serializeError;
551
584
  exports.wait = wait;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onekeyfe/hd-shared",
3
- "version": "1.1.32-alpha.4",
3
+ "version": "1.1.34-alpha.0",
4
4
  "description": "Hardware SDK's shared tool library",
5
5
  "keywords": [
6
6
  "Hardware-SDK",
@@ -25,5 +25,5 @@
25
25
  "lint": "eslint .",
26
26
  "lint:fix": "eslint . --fix"
27
27
  },
28
- "gitHead": "fc3bd904e2d35e9185d34c11460b53d558644009"
28
+ "gitHead": "178851631a3d06dd52c8dd9df24cbaaff7aa6390"
29
29
  }
@@ -484,6 +484,11 @@ export const HardwareErrorCode = {
484
484
  */
485
485
  PinMismatch: 828,
486
486
 
487
+ /**
488
+ * Device refused to sign: refTxs don't match the spent input's outpoint
489
+ */
490
+ KaspaPrevTxIdMismatch: 829,
491
+
487
492
  /**
488
493
  * Lowlevel transport connect error
489
494
  */
@@ -635,6 +640,7 @@ export const HardwareErrorCodeMessage: HardwareErrorCodeMessageMapping = {
635
640
  [HardwareErrorCode.DeviceSettingsLanguageNotSupport]: 'Language not supported',
636
641
  [HardwareErrorCode.TooManyInputs]: 'Too many inputs',
637
642
  [HardwareErrorCode.PinMismatch]: 'PIN mismatch',
643
+ [HardwareErrorCode.KaspaPrevTxIdMismatch]: 'Kaspa previous transaction id mismatch',
638
644
 
639
645
  /**
640
646
  * Lowlevel transport
@@ -0,0 +1,60 @@
1
+ import { isKnownTrezorWebUsbDevice, isOnekeyDevice } from './constants';
2
+
3
+ describe('hardware device identity filters', () => {
4
+ it('accepts known OneKey BLE names', () => {
5
+ expect(isOnekeyDevice('Touch A1B2')).toBe(true);
6
+ expect(isOnekeyDevice('Pro A1B2')).toBe(true);
7
+ expect(isOnekeyDevice('K1234')).toBe(true);
8
+ expect(isOnekeyDevice('S8')).toBe(true);
9
+ });
10
+
11
+ it('rejects known Trezor and Ledger BLE names from OneKey discovery', () => {
12
+ expect(isOnekeyDevice('Trezor Safe 7')).toBe(false);
13
+ expect(isOnekeyDevice('Ledger Nano X')).toBe(false);
14
+ });
15
+
16
+ it('only filters WebUSB descriptors that are explicitly identified as Trezor', () => {
17
+ expect(
18
+ isKnownTrezorWebUsbDevice({
19
+ vendorId: 0x1209,
20
+ productId: 0x53c1,
21
+ manufacturerName: 'Trezor Company',
22
+ })
23
+ ).toBe(true);
24
+ expect(
25
+ isKnownTrezorWebUsbDevice({
26
+ vendorId: 0x1209,
27
+ productId: 0x53c1,
28
+ manufacturerName: 'Trezor',
29
+ })
30
+ ).toBe(true);
31
+ expect(
32
+ isKnownTrezorWebUsbDevice({
33
+ vendorId: 0x1209,
34
+ productId: 0x53c1,
35
+ manufacturerName: 'SatoshiLabs',
36
+ })
37
+ ).toBe(true);
38
+
39
+ expect(
40
+ isKnownTrezorWebUsbDevice({
41
+ vendorId: 0x1209,
42
+ productId: 0x53c1,
43
+ manufacturerName: 'OneKey',
44
+ })
45
+ ).toBe(false);
46
+ expect(
47
+ isKnownTrezorWebUsbDevice({
48
+ vendorId: 0x1209,
49
+ productId: 0x53c1,
50
+ })
51
+ ).toBe(false);
52
+ expect(
53
+ isKnownTrezorWebUsbDevice({
54
+ vendorId: 0x1209,
55
+ productId: 0x53c1,
56
+ productName: 'Trezor Safe 7',
57
+ })
58
+ ).toBe(false);
59
+ });
60
+ });
package/src/constants.ts CHANGED
@@ -9,6 +9,24 @@ export const ONEKEY_WEBUSB_FILTER = [
9
9
  // { vendorId: 0x1209, productId: 0x4f50 }, // Touch Board
10
10
  ];
11
11
 
12
+ type WebUsbIdentityDescriptor = {
13
+ vendorId?: number;
14
+ productId?: number;
15
+ manufacturerName?: string | null;
16
+ };
17
+
18
+ const TREZOR_WEBUSB_MANUFACTURER_NAMES = new Set(['trezor', 'trezor company', 'satoshilabs']);
19
+
20
+ export const isKnownTrezorWebUsbDevice = (descriptor: WebUsbIdentityDescriptor): boolean => {
21
+ const isSharedWebUsbId = ONEKEY_WEBUSB_FILTER.some(
22
+ filter => descriptor.vendorId === filter.vendorId && descriptor.productId === filter.productId
23
+ );
24
+ if (!isSharedWebUsbId) return false;
25
+
26
+ const manufacturerName = descriptor.manufacturerName?.trim().toLowerCase();
27
+ return manufacturerName != null && TREZOR_WEBUSB_MANUFACTURER_NAMES.has(manufacturerName);
28
+ };
29
+
12
30
  /**
13
31
  * Error codes that require device release after occurrence
14
32
  * These errors indicate the device is in an invalid state and needs to be released
@@ -89,16 +107,36 @@ export const isHeaderChunk = (chunk: Buffer | Uint8Array): boolean => {
89
107
  return false;
90
108
  };
91
109
 
110
+ const isKnownNonOneKeyDeviceName = (normalizedName: string): boolean =>
111
+ normalizedName.startsWith('trezor') ||
112
+ normalizedName.startsWith('ledger') ||
113
+ normalizedName.startsWith('nano ') ||
114
+ normalizedName.startsWith('stax') ||
115
+ normalizedName.startsWith('flex');
116
+
117
+ const ONEKEY_EXACT_SHORT_NAMES = new Set(['s8']);
118
+
119
+ const isOneKeyShortName = (normalizedName: string): boolean => {
120
+ if (ONEKEY_EXACT_SHORT_NAMES.has(normalizedName)) return true;
121
+ if (normalizedName.length !== 5) return false;
122
+ const firstChar = normalizedName[0];
123
+ return (firstChar === 'k' || firstChar === 't') && /^\d{4}$/.test(normalizedName.slice(1));
124
+ };
125
+
92
126
  export const isOnekeyDevice = (name: string | null, id?: string): boolean => {
127
+ const normalizedName = name?.trim().toLowerCase() ?? '';
128
+ if (isKnownNonOneKeyDeviceName(normalizedName)) {
129
+ return false;
130
+ }
131
+
93
132
  if (id?.startsWith?.('MI')) {
94
133
  return true;
95
134
  }
96
135
 
97
- // 过滤 BixinKeyxxx 和 Kxxxx 和 Txxxx
98
- // i 忽略大小写模式
99
- const re = /(BixinKey\d{10})|(K\d{4})|(T\d{4})|(Touch\s\w{4})|(Pro\s\w{4})/i;
100
- if (name && re.exec(name)) {
101
- return true;
136
+ if (!name) {
137
+ return false;
102
138
  }
103
- return false;
139
+ if (normalizedName.startsWith('onekey') || normalizedName.startsWith('bixinkey')) return true;
140
+ if (normalizedName.startsWith('touch ') || normalizedName.startsWith('pro ')) return true;
141
+ return isOneKeyShortName(normalizedName);
104
142
  };