@onekeyfe/hd-core 1.2.8-alpha.10 → 1.2.8-alpha.101

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.
Files changed (69) hide show
  1. package/__tests__/DeviceCommands.test.ts +66 -13
  2. package/__tests__/core-dispose.test.ts +114 -1
  3. package/__tests__/core-error-output.test.ts +55 -3
  4. package/__tests__/device-connector-protocol.test.ts +5 -2
  5. package/__tests__/device-lifecycle-events.test.ts +44 -20
  6. package/__tests__/logBlockEvent.test.ts +43 -0
  7. package/__tests__/protocol-v2-bootloader-mode.test.ts +43 -2
  8. package/__tests__/protocol-v2.test.ts +0 -47
  9. package/__tests__/refresh-device-state.test.ts +19 -17
  10. package/__tests__/usb-identity-probe.test.ts +358 -0
  11. package/__tests__/zcash-protobuf.test.ts +141 -0
  12. package/__tests__/zcash-sign-pczt.test.ts +387 -0
  13. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  14. package/dist/api/GetDeviceState.d.ts.map +1 -1
  15. package/dist/api/SearchDevices.d.ts +21 -1
  16. package/dist/api/SearchDevices.d.ts.map +1 -1
  17. package/dist/api/index.d.ts +2 -0
  18. package/dist/api/index.d.ts.map +1 -1
  19. package/dist/api/protocol-v2/DeviceReboot.d.ts.map +1 -1
  20. package/dist/api/zcash/ZcashGetAddress.d.ts +12 -0
  21. package/dist/api/zcash/ZcashGetAddress.d.ts.map +1 -0
  22. package/dist/api/zcash/ZcashSignPczt.d.ts +16 -0
  23. package/dist/api/zcash/ZcashSignPczt.d.ts.map +1 -0
  24. package/dist/core/index.d.ts +3 -2
  25. package/dist/core/index.d.ts.map +1 -1
  26. package/dist/device/DeviceCommands.d.ts +4 -4
  27. package/dist/device/DeviceCommands.d.ts.map +1 -1
  28. package/dist/events/logBlockEvent.d.ts.map +1 -1
  29. package/dist/index.d.ts +71 -6
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +3369 -2887
  32. package/dist/inject.d.ts.map +1 -1
  33. package/dist/types/api/export.d.ts +2 -0
  34. package/dist/types/api/export.d.ts.map +1 -1
  35. package/dist/types/api/index.d.ts +4 -0
  36. package/dist/types/api/index.d.ts.map +1 -1
  37. package/dist/types/api/zcashGetAddress.d.ts +22 -0
  38. package/dist/types/api/zcashGetAddress.d.ts.map +1 -0
  39. package/dist/types/api/zcashSignPczt.d.ts +9 -0
  40. package/dist/types/api/zcashSignPczt.d.ts.map +1 -0
  41. package/dist/types/device.d.ts +9 -0
  42. package/dist/types/device.d.ts.map +1 -1
  43. package/dist/types/params.d.ts +1 -0
  44. package/dist/types/params.d.ts.map +1 -1
  45. package/dist/utils/patch.d.ts +1 -1
  46. package/dist/utils/patch.d.ts.map +1 -1
  47. package/package.json +4 -4
  48. package/src/api/FirmwareUpdateV4.ts +12 -32
  49. package/src/api/GetDeviceState.ts +2 -5
  50. package/src/api/SearchDevices.ts +172 -7
  51. package/src/api/index.ts +2 -0
  52. package/src/api/protocol-v2/DeviceReboot.ts +2 -0
  53. package/src/api/zcash/ZcashGetAddress.ts +121 -0
  54. package/src/api/zcash/ZcashSignPczt.ts +155 -0
  55. package/src/core/index.ts +47 -20
  56. package/src/data/messages/messages-protocol-v2.json +138 -1
  57. package/src/device/Device.ts +1 -1
  58. package/src/device/DeviceCommands.ts +15 -1
  59. package/src/device/DeviceConnector.ts +4 -4
  60. package/src/events/core.ts +2 -2
  61. package/src/events/logBlockEvent.ts +4 -2
  62. package/src/index.ts +1 -0
  63. package/src/inject.ts +4 -0
  64. package/src/types/api/export.ts +2 -0
  65. package/src/types/api/index.ts +8 -0
  66. package/src/types/api/zcashGetAddress.ts +36 -0
  67. package/src/types/api/zcashSignPczt.ts +18 -0
  68. package/src/types/device.ts +12 -0
  69. package/src/types/params.ts +1 -1
@@ -11034,6 +11034,61 @@
11034
11034
  }
11035
11035
  }
11036
11036
  },
11037
+ "ZcashSignPczt": {
11038
+ "fields": {
11039
+ "pczt_length": {
11040
+ "rule": "required",
11041
+ "type": "uint32",
11042
+ "id": 1
11043
+ },
11044
+ "pczt_initial_chunk": {
11045
+ "rule": "required",
11046
+ "type": "bytes",
11047
+ "id": 2
11048
+ }
11049
+ }
11050
+ },
11051
+ "ZcashPcztChunkRequest": {
11052
+ "fields": {
11053
+ "chunk_length": {
11054
+ "rule": "required",
11055
+ "type": "uint32",
11056
+ "id": 1
11057
+ }
11058
+ }
11059
+ },
11060
+ "ZcashPcztChunkAck": {
11061
+ "fields": {
11062
+ "data_chunk": {
11063
+ "rule": "required",
11064
+ "type": "bytes",
11065
+ "id": 1
11066
+ }
11067
+ }
11068
+ },
11069
+ "ZcashSignedPczt": {
11070
+ "fields": {
11071
+ "pczt_length": {
11072
+ "rule": "required",
11073
+ "type": "uint32",
11074
+ "id": 1
11075
+ },
11076
+ "pczt_initial_chunk": {
11077
+ "rule": "required",
11078
+ "type": "bytes",
11079
+ "id": 2
11080
+ }
11081
+ }
11082
+ },
11083
+ "ZcashSignedPcztChunkRequest": {
11084
+ "fields": {
11085
+ "chunk_length": {
11086
+ "rule": "required",
11087
+ "type": "uint32",
11088
+ "id": 1
11089
+ }
11090
+ }
11091
+ },
11037
11092
  "wire_in": {
11038
11093
  "type": "bool",
11039
11094
  "id": 50002,
@@ -11459,6 +11514,11 @@
11459
11514
  "MessageType_NeoAddress": 12302,
11460
11515
  "MessageType_NeoSignTx": 12303,
11461
11516
  "MessageType_NeoSignedTx": 12304,
11517
+ "MessageType_ZcashSignPczt": 12402,
11518
+ "MessageType_ZcashSignedPczt": 12403,
11519
+ "MessageType_ZcashPcztChunkRequest": 12404,
11520
+ "MessageType_ZcashPcztChunkAck": 12405,
11521
+ "MessageType_ZcashSignedPcztChunkRequest": 12406,
11462
11522
  "MessageType_DeviceFactoryInfoSet": 60000,
11463
11523
  "MessageType_DeviceFactoryInfoGet": 60001,
11464
11524
  "MessageType_DeviceFactoryInfo": 60002,
@@ -11511,7 +11571,9 @@
11511
11571
  "MessageType_PortfolioUpdate": 61400,
11512
11572
  "MessageType_NftUpdate": 61500,
11513
11573
  "MessageType_OnboardingStatusGet": 61600,
11514
- "MessageType_OnboardingStatus": 61601
11574
+ "MessageType_OnboardingStatus": 61601,
11575
+ "MessageType_ZcashGetAddress": 12400,
11576
+ "MessageType_ZcashAddress": 12401
11515
11577
  },
11516
11578
  "reserved": [
11517
11579
  [90, 92],
@@ -13730,6 +13792,81 @@
13730
13792
  }
13731
13793
  }
13732
13794
  }
13795
+ },
13796
+ "ZcashAddressType": {
13797
+ "values": {
13798
+ "UNIFIED_ORCHARD_P2PKH": 0,
13799
+ "TRANSPARENT_P2PKH": 1,
13800
+ "UNIFIED_ORCHARD": 2
13801
+ }
13802
+ },
13803
+ "ZcashAddressScope": {
13804
+ "values": {
13805
+ "EXTERNAL": 0,
13806
+ "INTERNAL": 1
13807
+ }
13808
+ },
13809
+ "ZcashGetAddress": {
13810
+ "fields": {
13811
+ "address_n": {
13812
+ "rule": "repeated",
13813
+ "type": "uint32",
13814
+ "id": 1,
13815
+ "options": {
13816
+ "packed": false
13817
+ }
13818
+ },
13819
+ "show_display": {
13820
+ "type": "bool",
13821
+ "id": 2
13822
+ },
13823
+ "include_seed_fingerprint": {
13824
+ "type": "bool",
13825
+ "id": 3
13826
+ },
13827
+ "include_ufvk": {
13828
+ "type": "bool",
13829
+ "id": 4
13830
+ },
13831
+ "diversifier_index": {
13832
+ "type": "uint32",
13833
+ "id": 5,
13834
+ "options": {
13835
+ "default": 0
13836
+ }
13837
+ },
13838
+ "address_type": {
13839
+ "type": "ZcashAddressType",
13840
+ "id": 6,
13841
+ "options": {
13842
+ "default": "UNIFIED_ORCHARD_P2PKH"
13843
+ }
13844
+ },
13845
+ "scope": {
13846
+ "type": "ZcashAddressScope",
13847
+ "id": 7,
13848
+ "options": {
13849
+ "default": "EXTERNAL"
13850
+ }
13851
+ }
13852
+ }
13853
+ },
13854
+ "ZcashAddress": {
13855
+ "fields": {
13856
+ "address": {
13857
+ "rule": "required",
13858
+ "type": "string",
13859
+ "id": 1
13860
+ },
13861
+ "ufvk": {
13862
+ "type": "string",
13863
+ "id": 2
13864
+ },
13865
+ "seed_fingerprint": {
13866
+ "type": "bytes",
13867
+ "id": 3
13868
+ }
13869
+ }
13733
13870
  }
13734
13871
  }
13735
13872
  }
@@ -1811,7 +1811,7 @@ export class Device extends EventEmitter {
1811
1811
  // both allow and require cases might generate single unexpected mode
1812
1812
  if (!this.isUnacquired()) {
1813
1813
  // allow cases
1814
- if (this.isBootloader() && !this.isProtocolV2() && !allow.includes(UI_REQUEST.BOOTLOADER)) {
1814
+ if ((this.isBootloader() || this.isRomloader()) && !allow.includes(UI_REQUEST.BOOTLOADER)) {
1815
1815
  return UI_REQUEST.BOOTLOADER;
1816
1816
  }
1817
1817
  if (!this.isInitialized() && !allow.includes(UI_REQUEST.NOT_INITIALIZE)) {
@@ -549,6 +549,16 @@ export class DeviceCommands {
549
549
  this.device.isProtocolV2() &&
550
550
  DEVICE_CONTROL_CALLS.has(callType) &&
551
551
  subcode === DeviceErrorCode.DeviceError_Busy;
552
+ const isProtocolV2PinCancelledBusyFailure =
553
+ this.device.isProtocolV2() &&
554
+ !DEVICE_SESSION_CALLS.has(callType) &&
555
+ subcode === DeviceSessionErrorCode.DeviceSessionError_UserCancelled &&
556
+ /^pin cancelled$/i.test(normalizedMessage);
557
+ const isProtocolV2FirmwareUpdateBusyFailure =
558
+ this.device.isProtocolV2() &&
559
+ /^requested command not allowed while a firmware update is in progress$/i.test(
560
+ normalizedMessage
561
+ );
552
562
  const isLegacyProtocolV2LockedFailure =
553
563
  this.device.isProtocolV2() && /^device (?:is )?locked$/i.test(normalizedMessage);
554
564
  if (
@@ -606,7 +616,11 @@ export class DeviceCommands {
606
616
  subcode,
607
617
  firmwareMessage: message,
608
618
  });
609
- } else if (isProtocolV2DeviceBusyFailure) {
619
+ } else if (
620
+ isProtocolV2DeviceBusyFailure ||
621
+ isProtocolV2PinCancelledBusyFailure ||
622
+ isProtocolV2FirmwareUpdateBusyFailure
623
+ ) {
610
624
  error = ERRORS.TypedError(HardwareErrorCode.DeviceBusy, message, {
611
625
  failureCode: code,
612
626
  subcode,
@@ -133,10 +133,10 @@ export default class DeviceConnector {
133
133
  : undefined;
134
134
  const detectedProtocol = acquiredProtocol ?? transport.getProtocolType(path);
135
135
  if (detectedProtocol !== expectedProtocol) {
136
- throw ERRORS.TypedError(
137
- HardwareErrorCode.RuntimeError,
138
- `Device protocol mismatch: expected ${expectedProtocol}, detected ${detectedProtocol}`
139
- );
136
+ throw ERRORS.TypedError(HardwareErrorCode.TransportProtocolMismatch, undefined, {
137
+ expectedProtocol,
138
+ detectedProtocol,
139
+ });
140
140
  }
141
141
  }
142
142
  return res;
@@ -54,9 +54,9 @@ export const parseMessage = (messageData: any): CoreMessage => {
54
54
  };
55
55
 
56
56
  export const createErrorMessage = (error: Error & { code?: string | number }): Unsuccessful => {
57
- let payload = { error: error.message, code: error.code };
57
+ let payload: Unsuccessful['payload'] = { error: error.message, code: error.code };
58
58
  if (error instanceof HardwareError) {
59
- payload = { error: error.message, code: error.errorCode };
59
+ payload = { error: error.message, code: error.errorCode, params: error.params };
60
60
  }
61
61
  return {
62
62
  success: false,
@@ -8,8 +8,8 @@ export const LogBlockEvent: Set<string> = new Set([
8
8
  UI_RESPONSE.RECEIVE_PASSPHRASE,
9
9
  ]);
10
10
 
11
- // These resource/file APIs did not exist in 1.1.32. Skip the payload so
12
- // the log layer does not copy huge Base64 or binary data.
11
+ // Drop sensitive wallet payloads and large resource data before logger caches
12
+ // or log events can retain them, regardless of whether debug output is enabled.
13
13
  const LogPayloadBlockMethod: Set<string> = new Set([
14
14
  'btcDeriveContextHash',
15
15
  'deviceUploadNft',
@@ -17,6 +17,8 @@ const LogPayloadBlockMethod: Set<string> = new Set([
17
17
  'uploadPortfolio',
18
18
  'fileWrite',
19
19
  'fileRead',
20
+ 'zcashGetAddress',
21
+ 'zcashSignPczt',
20
22
  ]);
21
23
 
22
24
  export function getLogBlockLabel(message: unknown): string | undefined {
package/src/index.ts CHANGED
@@ -21,6 +21,7 @@ export { executeCallback, cleanupCallback };
21
21
  export { preloadSessionCache } from './device/Device';
22
22
  export { projectFeatures as projectDeviceStateFeatures } from './device/DeviceStateProjector';
23
23
  export { getMethodSupportedProtocols } from './api/utils';
24
+ export { probeUsbDeviceIdentitiesWithTransport } from './api/SearchDevices';
24
25
  export {
25
26
  getFirmwareUpdateHostBindingGeneration,
26
27
  registerFirmwareUpdateHostBinding,
package/src/inject.ts CHANGED
@@ -504,4 +504,8 @@ export const createCoreApi = (
504
504
  call({ ...params, connectId, deviceId, method: 'neoGetAddress' }),
505
505
  neoSignTransaction: (connectId, deviceId, params) =>
506
506
  call({ ...params, connectId, deviceId, method: 'neoSignTransaction' }),
507
+ zcashGetAddress: (connectId, deviceId, params) =>
508
+ call({ ...params, connectId, deviceId, method: 'zcashGetAddress' }),
509
+ zcashSignPczt: (connectId, deviceId, params) =>
510
+ call({ ...params, connectId, deviceId, method: 'zcashSignPczt' }),
507
511
  });
@@ -227,3 +227,5 @@ export type { BenfenAddress, BenfenGetAddressParams } from './benfenGetAddress';
227
227
  export type { BenfenPublicKey, BenfenGetPublicKeyParams } from './benfenGetPublicKey';
228
228
  export type { BenfenSignMessageParams } from './benfenSignMessage';
229
229
  export type { BenfenSignedTx, BenfenSignTransactionParams } from './benfenSignTransaction';
230
+ export type { ZcashAddress, ZcashGetAddressParams } from './zcashGetAddress';
231
+ export type { ZcashSignedPczt, ZcashSignPcztParams } from './zcashSignPczt';
@@ -154,6 +154,8 @@ import type { benfenSignTransaction } from './benfenSignTransaction';
154
154
  import type { benfenSignMessage } from './benfenSignMessage';
155
155
  import type { neoGetAddress } from './neoGetAddress';
156
156
  import type { neoSignTransaction } from './neoSignTransaction';
157
+ import type { zcashGetAddress } from './zcashGetAddress';
158
+ import type { zcashSignPczt } from './zcashSignPczt';
157
159
  import type { ConnectSettings } from '../settings';
158
160
  import type { HardwareConnectProtocol } from '@onekeyfe/hd-shared';
159
161
 
@@ -472,4 +474,10 @@ export type CoreApi = {
472
474
  */
473
475
  neoGetAddress: typeof neoGetAddress;
474
476
  neoSignTransaction: typeof neoSignTransaction;
477
+
478
+ /**
479
+ * Zcash
480
+ */
481
+ zcashGetAddress: typeof zcashGetAddress;
482
+ zcashSignPczt: typeof zcashSignPczt;
475
483
  };
@@ -0,0 +1,36 @@
1
+ import type { ZcashAddressScope, ZcashAddressType } from '@onekeyfe/hd-transport';
2
+
3
+ import type { CommonParams, Response } from '../params';
4
+
5
+ export type ZcashAddress = {
6
+ path: string;
7
+ // ZIP-316 unified address or transparent P2PKH address
8
+ address: string;
9
+ // ZIP-316 unified full viewing key, present when includeUfvk was requested
10
+ ufvk?: string;
11
+ // ZIP-32 seed fingerprint (hex), present when includeSeedFingerprint was requested
12
+ seedFingerprint?: string;
13
+ };
14
+
15
+ export type ZcashGetAddressParams = {
16
+ // ZIP-32 account path, m/32'/133'/account'
17
+ path: string | number[];
18
+ showOnOneKey?: boolean;
19
+ diversifierIndex?: number;
20
+ addressType?: ZcashAddressType;
21
+ scope?: ZcashAddressScope;
22
+ includeUfvk?: boolean;
23
+ includeSeedFingerprint?: boolean;
24
+ };
25
+
26
+ export declare function zcashGetAddress(
27
+ connectId: string,
28
+ deviceId: string,
29
+ params: CommonParams & ZcashGetAddressParams
30
+ ): Response<ZcashAddress>;
31
+
32
+ export declare function zcashGetAddress(
33
+ connectId: string,
34
+ deviceId: string,
35
+ params: CommonParams & { bundle?: ZcashGetAddressParams[] }
36
+ ): Response<Array<ZcashAddress>>;
@@ -0,0 +1,18 @@
1
+ import type { CommonParams, Response } from '../params';
2
+
3
+ export type ZcashSignPcztParams = {
4
+ // Unproved PCZT (v2, tx v6) as hex; the device signs it and returns a
5
+ // redacted copy with signatures filled in.
6
+ pczt: string;
7
+ };
8
+
9
+ export type ZcashSignedPczt = {
10
+ // Signed, redacted PCZT as hex
11
+ pczt: string;
12
+ };
13
+
14
+ export declare function zcashSignPczt(
15
+ connectId: string,
16
+ deviceId: string,
17
+ params: CommonParams & ZcashSignPcztParams
18
+ ): Response<ZcashSignedPczt>;
@@ -85,6 +85,18 @@ export type SearchDevice = {
85
85
  commType: OneKeyDeviceCommType;
86
86
  };
87
87
 
88
+ /** Identity confirmed over USB. The descriptor path is only a transport address. */
89
+ export type UsbDeviceIdentity = {
90
+ path: string;
91
+ serialNo: string | null;
92
+ deviceId: string | null;
93
+ deviceType: IDeviceType;
94
+ connectProtocol: HardwareConnectProtocol;
95
+ commType: 'webusb' | 'bridge';
96
+ /** Mode confirmed by the device response; absent when discovery cannot establish it. */
97
+ mode?: DeviceStateMode;
98
+ };
99
+
88
100
  // export type UnknownDevice = {
89
101
  // type: 'unacquired';
90
102
  // id?: null;
@@ -83,7 +83,7 @@ export type Params<T> = CommonParams & T & { bundle?: undefined };
83
83
 
84
84
  export interface Unsuccessful {
85
85
  success: false;
86
- payload: { error: string; code?: string | number };
86
+ payload: { error: string; code?: string | number; params?: Record<string, unknown> };
87
87
  }
88
88
 
89
89
  export interface Success<T> {