@onekeyfe/hd-core 1.2.0-alpha.41 → 1.2.0-alpha.43

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 (202) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +78 -0
  2. package/__tests__/DeviceEventRegistration.test.ts +6 -0
  3. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +14 -1
  4. package/__tests__/connectSettings.test.ts +5 -47
  5. package/__tests__/deviceUploadNft.test.ts +272 -0
  6. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +31 -59
  7. package/__tests__/get-device-state.test.ts +132 -12
  8. package/__tests__/homescreen.test.ts +41 -1
  9. package/__tests__/logBlockEvent.test.ts +1 -1
  10. package/__tests__/open-wallet-session.test.ts +366 -31
  11. package/__tests__/pro2Nft.test.ts +108 -0
  12. package/__tests__/protocol-v2-resources.test.ts +204 -0
  13. package/__tests__/protocol-v2-ui-lifecycle.test.ts +91 -0
  14. package/__tests__/protocol-v2-unlock-policy.test.ts +196 -35
  15. package/__tests__/protocol-v2.test.ts +568 -957
  16. package/__tests__/protocolV2UiInteraction.test.ts +63 -0
  17. package/__tests__/public-pro2-api-boundary.test.ts +1 -0
  18. package/__tests__/uiProgressThrottle.test.ts +74 -0
  19. package/dist/api/BaseMethod.d.ts +3 -1
  20. package/dist/api/BaseMethod.d.ts.map +1 -1
  21. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  22. package/dist/api/FirmwareUpdateV2.d.ts +0 -11
  23. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  24. package/dist/api/FirmwareUpdateV3.d.ts +3 -7
  25. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  26. package/dist/api/FirmwareUpdateV4.d.ts +6 -25
  27. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  28. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  29. package/dist/api/OpenWalletSession.d.ts.map +1 -1
  30. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  31. package/dist/api/device/DeviceUpdateBootloader.d.ts +1 -5
  32. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  33. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +0 -8
  34. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  35. package/dist/api/firmware/getBinary.d.ts +0 -7
  36. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  37. package/dist/api/firmware/updateBootloader.d.ts +0 -2
  38. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  39. package/dist/api/firmware/uploadFirmware.d.ts +1 -9
  40. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  41. package/dist/api/helpers/protocolV2FileWrite.d.ts +2 -0
  42. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -1
  43. package/dist/api/index.d.ts +1 -0
  44. package/dist/api/index.d.ts.map +1 -1
  45. package/dist/api/protocol-v2/DeviceUploadNft.d.ts +31 -0
  46. package/dist/api/protocol-v2/DeviceUploadNft.d.ts.map +1 -0
  47. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -1
  48. package/dist/api/stellar/StellarSignTransaction.d.ts +1 -1
  49. package/dist/core/deviceEventRegistration.d.ts +2 -0
  50. package/dist/core/deviceEventRegistration.d.ts.map +1 -1
  51. package/dist/core/index.d.ts.map +1 -1
  52. package/dist/data-manager/DataManager.d.ts +3 -2
  53. package/dist/data-manager/DataManager.d.ts.map +1 -1
  54. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  55. package/dist/device/Device.d.ts +24 -4
  56. package/dist/device/Device.d.ts.map +1 -1
  57. package/dist/device/DeviceCommands.d.ts +4 -4
  58. package/dist/events/device.d.ts +4 -0
  59. package/dist/events/device.d.ts.map +1 -1
  60. package/dist/events/logBlockEvent.d.ts.map +1 -1
  61. package/dist/events/ui-request.d.ts +28 -2
  62. package/dist/events/ui-request.d.ts.map +1 -1
  63. package/dist/index.d.ts +115 -184
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +2051 -3349
  66. package/dist/inject.d.ts.map +1 -1
  67. package/dist/lowLevelInject.d.ts.map +1 -1
  68. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  69. package/dist/protocols/protocol-v2/resources.d.ts +30 -0
  70. package/dist/protocols/protocol-v2/resources.d.ts.map +1 -0
  71. package/dist/protocols/protocol-v2/uiInteraction.d.ts +7 -4
  72. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -1
  73. package/dist/protocols/protocol-v2/unlockPolicy.d.ts +1 -3
  74. package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -1
  75. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts +22 -0
  76. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts.map +1 -0
  77. package/dist/protocols/protocol-v2/walletSession.d.ts +4 -1
  78. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -1
  79. package/dist/topLevelInject.d.ts.map +1 -1
  80. package/dist/types/api/checkAllFirmwareRelease.d.ts +1 -4
  81. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  82. package/dist/types/api/deviceUpdateBootloader.d.ts +0 -6
  83. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  84. package/dist/types/api/export.d.ts +1 -4
  85. package/dist/types/api/export.d.ts.map +1 -1
  86. package/dist/types/api/firmwareUpdate.d.ts +0 -69
  87. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  88. package/dist/types/api/index.d.ts +3 -10
  89. package/dist/types/api/index.d.ts.map +1 -1
  90. package/dist/types/api/protocolV2.d.ts +3 -0
  91. package/dist/types/api/protocolV2.d.ts.map +1 -1
  92. package/dist/types/settings.d.ts +12 -13
  93. package/dist/types/settings.d.ts.map +1 -1
  94. package/dist/utils/deviceFeaturesUtils.d.ts +2 -0
  95. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  96. package/dist/utils/homescreen.d.ts +4 -0
  97. package/dist/utils/homescreen.d.ts.map +1 -1
  98. package/dist/utils/index.d.ts +1 -1
  99. package/dist/utils/index.d.ts.map +1 -1
  100. package/dist/utils/patch.d.ts +1 -1
  101. package/dist/utils/patch.d.ts.map +1 -1
  102. package/dist/utils/pro2Nft.d.ts +31 -0
  103. package/dist/utils/pro2Nft.d.ts.map +1 -0
  104. package/dist/utils/pro2Wallpaper.d.ts +10 -0
  105. package/dist/utils/pro2Wallpaper.d.ts.map +1 -1
  106. package/dist/utils/uiProgressThrottle.d.ts +3 -0
  107. package/dist/utils/uiProgressThrottle.d.ts.map +1 -0
  108. package/package.json +4 -4
  109. package/src/api/BaseMethod.ts +8 -10
  110. package/src/api/CheckAllFirmwareRelease.ts +40 -53
  111. package/src/api/FirmwareUpdateV2.ts +120 -298
  112. package/src/api/FirmwareUpdateV3.ts +57 -263
  113. package/src/api/FirmwareUpdateV4.ts +307 -912
  114. package/src/api/GetPassphraseState.ts +7 -1
  115. package/src/api/OpenWalletSession.ts +54 -17
  116. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +32 -11
  117. package/src/api/device/DeviceUnlock.ts +1 -1
  118. package/src/api/device/DeviceUpdateBootloader.ts +6 -122
  119. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +0 -57
  120. package/src/api/firmware/updateBootloader.ts +4 -19
  121. package/src/api/firmware/uploadFirmware.ts +22 -140
  122. package/src/api/helpers/protocolV2FileWrite.ts +11 -4
  123. package/src/api/index.ts +1 -0
  124. package/src/api/protocol-v2/DeviceUploadNft.ts +189 -0
  125. package/src/api/protocol-v2/ProtocolInfoRequest.ts +3 -1
  126. package/src/core/deviceEventRegistration.ts +4 -0
  127. package/src/core/index.ts +136 -77
  128. package/src/data/messages/messages-protocol-v2.json +68 -0
  129. package/src/data-manager/DataManager.ts +63 -38
  130. package/src/data-manager/connectSettings.ts +0 -11
  131. package/src/device/Device.ts +203 -21
  132. package/src/events/device.ts +4 -0
  133. package/src/events/logBlockEvent.ts +1 -0
  134. package/src/events/ui-request.ts +33 -2
  135. package/src/index.ts +0 -5
  136. package/src/inject.ts +3 -22
  137. package/src/lowLevelInject.ts +1 -5
  138. package/src/protocols/protocol-v2/features.ts +9 -2
  139. package/src/protocols/protocol-v2/resources.ts +233 -0
  140. package/src/protocols/protocol-v2/uiInteraction.ts +46 -6
  141. package/src/protocols/protocol-v2/unlockPolicy.ts +1 -105
  142. package/src/protocols/protocol-v2/unlockPolicyRunner.ts +124 -0
  143. package/src/protocols/protocol-v2/walletSession.ts +154 -30
  144. package/src/topLevelInject.ts +1 -5
  145. package/src/types/api/checkAllFirmwareRelease.ts +1 -4
  146. package/src/types/api/deviceUpdateBootloader.ts +0 -6
  147. package/src/types/api/export.ts +0 -18
  148. package/src/types/api/firmwareUpdate.ts +0 -76
  149. package/src/types/api/index.ts +2 -14
  150. package/src/types/api/protocolV2.ts +13 -0
  151. package/src/types/settings.ts +26 -13
  152. package/src/utils/deviceFeaturesUtils.ts +4 -0
  153. package/src/utils/homescreen.ts +32 -6
  154. package/src/utils/index.ts +6 -1
  155. package/src/utils/pro2Nft.ts +142 -0
  156. package/src/utils/pro2Wallpaper.ts +35 -8
  157. package/src/utils/uiProgressThrottle.ts +63 -0
  158. package/__tests__/firmware-update/check-all-firmware-release.test.ts +0 -175
  159. package/__tests__/firmware-update/firmware-artifact-source.test.ts +0 -119
  160. package/__tests__/firmware-update/firmware-host-binding.test.ts +0 -70
  161. package/__tests__/firmware-update/firmware-preparation-error.test.ts +0 -27
  162. package/__tests__/firmware-update/firmware-update-capabilities.test.ts +0 -13
  163. package/__tests__/firmware-update/firmware-update-plan.test.ts +0 -593
  164. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +0 -213
  165. package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +0 -58
  166. package/__tests__/firmware-update/firmware-upload-source.test.ts +0 -70
  167. package/dist/api/firmware/FirmwareArtifactSource.d.ts +0 -25
  168. package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +0 -1
  169. package/dist/api/firmware/FirmwareHostBinding.d.ts +0 -6
  170. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +0 -1
  171. package/dist/api/firmware/FirmwarePreparationError.d.ts +0 -3
  172. package/dist/api/firmware/FirmwarePreparationError.d.ts.map +0 -1
  173. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +0 -3
  174. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +0 -1
  175. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +0 -25
  176. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +0 -1
  177. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +0 -30
  178. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +0 -1
  179. package/dist/api/firmware/progressThrottle.d.ts +0 -3
  180. package/dist/api/firmware/progressThrottle.d.ts.map +0 -1
  181. package/dist/protocols/protocol-v2/lockedError.d.ts +0 -2
  182. package/dist/protocols/protocol-v2/lockedError.d.ts.map +0 -1
  183. package/dist/protocols/protocol-v2/unlockRetry.d.ts +0 -10
  184. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +0 -1
  185. package/dist/types/api/firmwareUpdateCapabilities.d.ts +0 -9
  186. package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +0 -1
  187. package/dist/types/api/firmwareUpdatePlan.d.ts +0 -28
  188. package/dist/types/api/firmwareUpdatePlan.d.ts.map +0 -1
  189. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +0 -42
  190. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +0 -1
  191. package/src/api/firmware/FirmwareArtifactSource.ts +0 -278
  192. package/src/api/firmware/FirmwareHostBinding.ts +0 -100
  193. package/src/api/firmware/FirmwarePreparationError.ts +0 -12
  194. package/src/api/firmware/FirmwareUpdateCapabilities.ts +0 -9
  195. package/src/api/firmware/FirmwareUpdatePlan.ts +0 -745
  196. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +0 -392
  197. package/src/api/firmware/progressThrottle.ts +0 -44
  198. package/src/protocols/protocol-v2/lockedError.ts +0 -10
  199. package/src/protocols/protocol-v2/unlockRetry.ts +0 -109
  200. package/src/types/api/firmwareUpdateCapabilities.ts +0 -9
  201. package/src/types/api/firmwareUpdatePlan.ts +0 -38
  202. package/src/types/api/firmwareUpdatePreparedPlan.ts +0 -53
@@ -1,5 +1,5 @@
1
1
  import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
2
- import { DeviceSessionPinType } from '@onekeyfe/hd-transport';
2
+ import { DeviceSessionPinType, DeviceSessionSeedDomain } from '@onekeyfe/hd-transport';
3
3
 
4
4
  import { DEVICE } from '../../events';
5
5
  import { assertCompleteDeviceSession } from './deviceSession';
@@ -38,32 +38,74 @@ export async function refreshProtocolV2DeviceStatus(device: Device) {
38
38
  return device.updateProtocolV2Status(status);
39
39
  }
40
40
 
41
- const negotiateEventlessWalletSession = async (device: Device) => {
42
- await device.commands.typedCall('ProtocolInfoRequest', 'ProtocolInfo', {
43
- eventless_wallet_session: true,
41
+ export async function ensureProtocolV2WalletSessionUnlocked(device: Device) {
42
+ if (!device.isProtocolV2() || device.isBootloader?.() || device.isRomloader?.()) {
43
+ return false;
44
+ }
45
+
46
+ await refreshProtocolV2DeviceStatus(device);
47
+ if (device.state?.status.unlocked !== false) {
48
+ return false;
49
+ }
50
+
51
+ await device.unlockDevice(DeviceSessionPinType.Main, {
52
+ source: 'unlock-coordinator',
53
+ reason: 'device-locked',
54
+ deviceOnly: true,
44
55
  });
56
+ return true;
57
+ }
58
+
59
+ const negotiateEventlessWalletSession = async (device: Device) => {
60
+ await device.ensureProtocolV2RuntimeContext();
45
61
  };
46
62
 
47
63
  const getDeviceSession = async (device: Device, request: DeviceSessionGet) =>
48
64
  device.commands.typedCall('DeviceSessionGet', 'DeviceSession', request);
49
65
 
66
+ const buildDeviceSessionGetRequest = ({
67
+ sessionId,
68
+ expectedPassphraseState,
69
+ deriveCardano,
70
+ }: {
71
+ sessionId?: string;
72
+ expectedPassphraseState?: string;
73
+ deriveCardano?: boolean;
74
+ } = {}): DeviceSessionGet => ({
75
+ ...(sessionId ? { session_id: sessionId } : {}),
76
+ ...(expectedPassphraseState ? { btc_test_address: expectedPassphraseState } : {}),
77
+ seed_domains:
78
+ deriveCardano === undefined
79
+ ? []
80
+ : [
81
+ DeviceSessionSeedDomain.SeedDomain_Standard,
82
+ ...(deriveCardano ? [DeviceSessionSeedDomain.SeedDomain_Cardano] : []),
83
+ ],
84
+ });
85
+
50
86
  const askDevicePassphrase = async (device: Device, requestPayload: DeviceSessionAskPassphrase) => {
51
87
  await device.commands.typedCall('DeviceSessionAskPassphrase', 'Success', requestPayload);
52
88
  await refreshProtocolV2DeviceStatus(device);
53
89
  };
54
90
 
55
- const selectDeviceSession = async (device: Device, expectedPassphraseState?: string) => {
91
+ const selectDeviceSession = async (
92
+ device: Device,
93
+ expectedPassphraseState?: string,
94
+ deriveCardano?: boolean
95
+ ) => {
56
96
  const existsAttachPinUser = device.features?.attachToPinEnabled === true;
57
97
  const metadata = {
58
98
  source: 'wallet-session-coordinator' as const,
59
99
  reason: expectedPassphraseState ? ('session-recovery' as const) : ('open-wallet' as const),
60
100
  ...(expectedPassphraseState ? { expectedPassphraseState } : {}),
61
101
  };
102
+ const passphraseInteraction = device.createProtocolV2UiPhaseMetadata?.('passphrase', 'start');
62
103
  const response = await device.commands.promptPassphrase(
63
104
  {
64
105
  existsAttachPinUser,
65
106
  deviceOnly: false,
66
107
  ...metadata,
108
+ ...(passphraseInteraction ? { interaction: passphraseInteraction } : {}),
67
109
  },
68
110
  { cancelDeviceOnReject: false }
69
111
  );
@@ -102,9 +144,16 @@ const selectDeviceSession = async (device: Device, expectedPassphraseState?: str
102
144
  'Attach PIN wallet selection is unavailable on this device.'
103
145
  );
104
146
  }
105
- device.emit(DEVICE.ATTACH_PIN_ON_DEVICE, device, metadata);
106
- await device.unlockDevice(DeviceSessionPinType.AttachToPin);
107
- return getDeviceSession(device, {});
147
+ const attachPinInteraction = device.createProtocolV2UiPhaseMetadata?.('pin', 'start');
148
+ device.emit(DEVICE.ATTACH_PIN_ON_DEVICE, device, {
149
+ ...metadata,
150
+ ...(attachPinInteraction ? { interaction: attachPinInteraction } : {}),
151
+ });
152
+ await device.unlockDevice(DeviceSessionPinType.AttachToPin, {
153
+ emitUiEvent: false,
154
+ interaction: attachPinInteraction,
155
+ });
156
+ return getDeviceSession(device, buildDeviceSessionGetRequest({ deriveCardano }));
108
157
  }
109
158
 
110
159
  if (hasHostPassphrase) {
@@ -112,12 +161,15 @@ const selectDeviceSession = async (device: Device, expectedPassphraseState?: str
112
161
  passphrase: hostPassphrase,
113
162
  on_device: false,
114
163
  });
115
- return getDeviceSession(device, {});
164
+ return getDeviceSession(device, buildDeviceSessionGetRequest({ deriveCardano }));
116
165
  }
117
166
 
118
- device.emit(DEVICE.PASSPHRASE_ON_DEVICE, device, metadata);
167
+ device.emit(DEVICE.PASSPHRASE_ON_DEVICE, device, {
168
+ ...metadata,
169
+ ...(passphraseInteraction ? { interaction: passphraseInteraction } : {}),
170
+ });
119
171
  await askDevicePassphrase(device, { on_device: true });
120
- return getDeviceSession(device, {});
172
+ return getDeviceSession(device, buildDeviceSessionGetRequest({ deriveCardano }));
121
173
  };
122
174
 
123
175
  export async function getProtocolV2WalletSession(
@@ -128,7 +180,9 @@ export async function getProtocolV2WalletSession(
128
180
  initSession?: boolean;
129
181
  expectedPassphraseState?: string;
130
182
  onlyMainPin?: boolean;
183
+ selectMainWalletBeforeRestore?: boolean;
131
184
  resumeOnly?: boolean;
185
+ deriveCardano?: boolean;
132
186
  }
133
187
  ) {
134
188
  const forceWalletSelection =
@@ -161,17 +215,60 @@ export async function getProtocolV2WalletSession(
161
215
  : undefined;
162
216
  let response;
163
217
  let resumed = false;
218
+ let mainWalletSelected =
219
+ options?.onlyMainPin === true &&
220
+ device.features?.unlocked === true &&
221
+ device.features?.unlockedAttachPin === false;
222
+
223
+ const clearCurrentWalletSession = () => {
224
+ if (options?.onlyMainPin) {
225
+ device.clearStandardInternalState?.();
226
+ } else {
227
+ device.clearInternalState();
228
+ }
229
+ };
230
+
231
+ const rejectMismatchedAttachPinWallet = async () => {
232
+ const features = await refreshProtocolV2DeviceStatus(device);
233
+ if (features.unlockedAttachPin !== true) {
234
+ return;
235
+ }
236
+
237
+ try {
238
+ await device.lockDevice();
239
+ } catch {
240
+ // Reject the mismatched Attach PIN wallet even when older firmware cannot lock.
241
+ }
242
+ clearCurrentWalletSession();
243
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckUnlockTypeError);
244
+ };
245
+
246
+ const selectMainWallet = async (force = false) => {
247
+ if (force || !mainWalletSelected) {
248
+ await device.unlockDevice(DeviceSessionPinType.Main, {
249
+ source: 'wallet-session-coordinator',
250
+ reason: expectedPassphraseState ? 'session-recovery' : 'open-wallet',
251
+ deviceOnly: true,
252
+ });
253
+ mainWalletSelected = true;
254
+ }
255
+ };
164
256
 
165
257
  if (options?.onlyMainPin) {
166
258
  expectedPassphraseState = cachedStandardSession?.passphraseState;
167
259
  if (cachedStandardSession) {
168
260
  try {
169
- if (device.features?.unlockedAttachPin === true) {
170
- await device.unlockDevice(DeviceSessionPinType.Main);
261
+ if (options?.selectMainWalletBeforeRestore) {
262
+ await selectMainWallet();
171
263
  }
172
- response = await getDeviceSession(device, {
173
- session_id: cachedStandardSession.sessionId,
174
- });
264
+ response = await getDeviceSession(
265
+ device,
266
+ buildDeviceSessionGetRequest({
267
+ sessionId: cachedStandardSession.sessionId,
268
+ expectedPassphraseState,
269
+ deriveCardano: options?.deriveCardano,
270
+ })
271
+ );
175
272
  resumed = true;
176
273
  } catch (error) {
177
274
  device.clearStandardInternalState?.();
@@ -183,12 +280,22 @@ export async function getProtocolV2WalletSession(
183
280
  }
184
281
 
185
282
  if (!response) {
186
- await device.unlockDevice(DeviceSessionPinType.Main);
187
- response = await getDeviceSession(device, {});
283
+ await selectMainWallet();
284
+ response = await getDeviceSession(
285
+ device,
286
+ buildDeviceSessionGetRequest({ deriveCardano: options?.deriveCardano })
287
+ );
188
288
  }
189
289
  } else if (cachedSessionId && expectedPassphraseState) {
190
290
  try {
191
- response = await getDeviceSession(device, { session_id: cachedSessionId });
291
+ response = await getDeviceSession(
292
+ device,
293
+ buildDeviceSessionGetRequest({
294
+ sessionId: cachedSessionId,
295
+ expectedPassphraseState,
296
+ deriveCardano: options?.deriveCardano,
297
+ })
298
+ );
192
299
  resumed = true;
193
300
  } catch (error) {
194
301
  device.clearInternalState();
@@ -197,6 +304,20 @@ export async function getProtocolV2WalletSession(
197
304
  }
198
305
  resumed = false;
199
306
  }
307
+ } else if (expectedPassphraseState) {
308
+ try {
309
+ response = await getDeviceSession(
310
+ device,
311
+ buildDeviceSessionGetRequest({
312
+ expectedPassphraseState,
313
+ deriveCardano: options?.deriveCardano,
314
+ })
315
+ );
316
+ } catch (error) {
317
+ if (options?.resumeOnly || !isWalletSessionInvalidError(error)) {
318
+ throw error;
319
+ }
320
+ }
200
321
  }
201
322
 
202
323
  if (!response) {
@@ -204,7 +325,7 @@ export async function getProtocolV2WalletSession(
204
325
  device.clearInternalState();
205
326
  throw ERRORS.TypedError(HardwareErrorCode.WalletSessionInvalid);
206
327
  }
207
- response = await selectDeviceSession(device, expectedPassphraseState);
328
+ response = await selectDeviceSession(device, expectedPassphraseState, options?.deriveCardano);
208
329
  }
209
330
 
210
331
  let { message } = response;
@@ -220,17 +341,21 @@ export async function getProtocolV2WalletSession(
220
341
  }
221
342
  if (expectedPassphraseState && expectedPassphraseState !== message.btc_test_address) {
222
343
  resumed = false;
344
+ await rejectMismatchedAttachPinWallet();
223
345
  if (options?.resumeOnly) {
224
346
  device.clearInternalState();
225
347
  throw ERRORS.TypedError(HardwareErrorCode.WalletSessionInvalid);
226
348
  }
227
349
  if (options?.onlyMainPin) {
228
350
  device.clearStandardInternalState?.();
229
- await device.unlockDevice(DeviceSessionPinType.Main);
230
- response = await getDeviceSession(device, {});
351
+ await selectMainWallet(true);
352
+ response = await getDeviceSession(
353
+ device,
354
+ buildDeviceSessionGetRequest({ deriveCardano: options?.deriveCardano })
355
+ );
231
356
  } else {
232
357
  device.clearInternalState();
233
- response = await selectDeviceSession(device, expectedPassphraseState);
358
+ response = await selectDeviceSession(device, expectedPassphraseState, options?.deriveCardano);
234
359
  }
235
360
  message = response.message;
236
361
  try {
@@ -244,11 +369,8 @@ export async function getProtocolV2WalletSession(
244
369
  throw error;
245
370
  }
246
371
  if (expectedPassphraseState !== message.btc_test_address) {
247
- if (options?.onlyMainPin) {
248
- device.clearStandardInternalState?.();
249
- } else {
250
- device.clearInternalState();
251
- }
372
+ await rejectMismatchedAttachPinWallet();
373
+ clearCurrentWalletSession();
252
374
  throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckPassphraseStateError);
253
375
  }
254
376
  }
@@ -269,17 +391,19 @@ export async function getProtocolV2WalletSession(
269
391
  return {
270
392
  passphraseState: message.btc_test_address,
271
393
  newSession: message.session_id,
272
- unlockedAttachPin: device.features?.unlockedAttachPin ?? undefined,
394
+ unlockedAttachPin: mainWalletSelected ? false : undefined,
273
395
  resumed,
274
396
  };
275
397
  }
276
398
 
277
399
  export async function restoreProtocolV2WalletSession(
278
400
  device: Device,
279
- expectedPassphraseState: string
401
+ expectedPassphraseState: string,
402
+ deriveCardano?: boolean
280
403
  ) {
281
404
  return getProtocolV2WalletSession(device, {
282
405
  expectedPassphraseState,
283
406
  resumeOnly: true,
407
+ deriveCardano,
284
408
  });
285
409
  }
@@ -1,7 +1,6 @@
1
1
  import EventEmitter from 'events';
2
2
 
3
3
  import { createCoreApi } from './inject';
4
- import { unregisterFirmwareUpdateHostBinding } from './api/firmware/FirmwareHostBinding';
5
4
 
6
5
  import type { ConnectSettings } from './types/settings';
7
6
  import type { CoreApi } from './types/api';
@@ -47,10 +46,7 @@ export const topLevelInject = () => {
47
46
  lowLevelApi?.removeAllListeners(type);
48
47
  },
49
48
 
50
- dispose: async () => {
51
- unregisterFirmwareUpdateHostBinding();
52
- await lowLevelApi?.dispose();
53
- },
49
+ dispose: () => lowLevelApi?.dispose(),
54
50
 
55
51
  uiResponse: response => lowLevelApi?.uiResponse(response),
56
52
 
@@ -12,7 +12,6 @@ import type {
12
12
  IProtocolV2FirmwareComponentTarget,
13
13
  } from '../settings';
14
14
  import type { FirmwareUpdateV4Target } from './firmwareUpdate';
15
- import type { FirmwareUpdatePlan, FirmwareUpdatePlanForceTarget } from './firmwareUpdatePlan';
16
15
 
17
16
  export type FirmwareRelease = {
18
17
  shouldUpdate?: boolean;
@@ -60,18 +59,16 @@ export type AllFirmwareRelease = {
60
59
  status?: ProtocolV2FirmwareReleaseStatus;
61
60
  hasUpgrade?: boolean;
62
61
  required?: boolean;
62
+ resourceStatus?: 'valid' | 'outdated' | 'unknown';
63
63
  currentVersions?: DeviceStateVersions;
64
64
  components?: ProtocolV2FirmwareComponentRelease[];
65
65
  targetsToUpdate?: FirmwareUpdateV4Target[];
66
66
  release?: IFirmwareReleaseInfo;
67
- firmwareUpdatePlan?: FirmwareUpdatePlan;
68
67
  };
69
68
 
70
69
  export type CheckAllFirmwareReleaseParams = {
71
70
  checkBridgeRelease?: boolean;
72
71
  firmwareType?: EFirmwareType;
73
- platform?: 'native' | 'desktop' | 'ext' | 'web' | 'web-embed';
74
- forceUpdateTargets?: FirmwareUpdatePlanForceTarget[];
75
72
  };
76
73
 
77
74
  export declare function checkAllFirmwareRelease(
@@ -1,15 +1,9 @@
1
1
  import type { Success } from '@onekeyfe/hd-transport';
2
2
  import type { EFirmwareType } from '@onekeyfe/hd-shared';
3
- import type { FirmwareArtifactReader, FirmwareArtifactReference } from './firmwareUpdate';
4
- import type { FirmwareUpdatePreparedPlan } from './firmwareUpdatePreparedPlan';
5
3
  import type { Response } from '../params';
6
4
 
7
5
  export type DeviceUpdateBootloaderParams = {
8
- preparedPlan?: FirmwareUpdatePreparedPlan;
9
- hostBindingGeneration?: number;
10
6
  binary?: ArrayBuffer;
11
- artifact?: FirmwareArtifactReference;
12
- artifactReader?: FirmwareArtifactReader;
13
7
  firmwareType?: EFirmwareType;
14
8
  };
15
9
 
@@ -25,30 +25,12 @@ export type {
25
25
  DeviceUploadResourceResponse,
26
26
  } from './deviceUploadResource';
27
27
  export type {
28
- FirmwareArtifactReader,
29
- FirmwareArtifactReference,
30
- FirmwareUpdateHostBinding,
31
- FirmwareUpdateArtifactParams,
32
28
  FirmwareUpdateParams,
33
29
  FirmwareUpdateBinaryParams,
34
30
  FirmwareUpdateV3Params,
35
31
  FirmwareUpdateV4Params,
36
32
  FirmwareUpdateV4Target,
37
33
  } from './firmwareUpdate';
38
- export type {
39
- FirmwareUpdatePlan,
40
- FirmwareUpdatePlanArtifact,
41
- FirmwareUpdatePlanArtifactRole,
42
- FirmwareUpdatePlanForceTarget,
43
- FirmwareUpdatePlanTarget,
44
- } from './firmwareUpdatePlan';
45
- export type {
46
- FirmwareUpdatePreparedArtifact,
47
- FirmwareUpdatePreparedArtifactInput,
48
- FirmwareUpdatePreparedEntry,
49
- FirmwareUpdatePreparedPlan,
50
- } from './firmwareUpdatePreparedPlan';
51
- export type { FirmwareUpdateCapabilities } from './firmwareUpdateCapabilities';
52
34
  export type { AllFirmwareRelease } from './checkAllFirmwareRelease';
53
35
  export type {
54
36
  ProtocolV2FirmwareComponentRelease,
@@ -1,53 +1,14 @@
1
1
  import type { EFirmwareType } from '@onekeyfe/hd-shared';
2
2
  import type { PROTO } from '../../constants';
3
3
  import type { Params, Response } from '../params';
4
- import type { FirmwareUpdatePreparedPlan } from './firmwareUpdatePreparedPlan';
5
4
 
6
5
  type IUpdateType = 'firmware' | 'ble';
7
6
 
8
- export interface FirmwareArtifactReference {
9
- artifactRef: string;
10
- size: number;
11
- sha256: string;
12
- }
13
-
14
- export interface FirmwareArtifactReader {
15
- open(input: { artifactRef: string }): Promise<{
16
- readerId: string;
17
- size: number;
18
- }>;
19
- read(input: { readerId: string; offset: number; length: number }): Promise<{
20
- data: ArrayBuffer;
21
- bytesRead: number;
22
- eof: boolean;
23
- }>;
24
- close(input: { readerId: string }): Promise<void>;
25
- }
26
-
27
- export interface FirmwareUpdateHostBinding {
28
- artifactReader: FirmwareArtifactReader;
29
- }
30
-
31
7
  export interface FirmwareUpdateBinaryParams {
32
8
  binary: ArrayBuffer;
33
9
  updateType: IUpdateType;
34
10
  }
35
11
 
36
- export interface FirmwareUpdateArtifactParams {
37
- preparedPlan: FirmwareUpdatePreparedPlan;
38
- hostBindingGeneration: number;
39
- artifact: FirmwareArtifactReference;
40
- resourceArtifact?: FirmwareArtifactReference;
41
- resourceEntries?: Array<{
42
- entryName: string;
43
- artifact: FirmwareArtifactReference;
44
- }>;
45
- updateType: IUpdateType;
46
- forcedUpdateRes?: boolean;
47
- isUpdateBootloader?: boolean;
48
- firmwareType?: EFirmwareType;
49
- }
50
-
51
12
  export interface FirmwareUpdateParams {
52
13
  version?: number[];
53
14
  updateType: IUpdateType;
@@ -76,14 +37,8 @@ export declare function firmwareUpdateV2(
76
37
  connectId: string | undefined,
77
38
  params: Params<FirmwareUpdateBinaryParams & Platform>
78
39
  ): Response<PROTO.Success>;
79
- export declare function firmwareUpdateV2(
80
- connectId: string | undefined,
81
- params: Params<FirmwareUpdateArtifactParams & Platform>
82
- ): Response<PROTO.Success>;
83
40
 
84
41
  export interface FirmwareUpdateV3Params {
85
- preparedPlan?: FirmwareUpdatePreparedPlan;
86
- hostBindingGeneration?: number;
87
42
  bleVersion?: number[];
88
43
  bleBinary?: ArrayBuffer;
89
44
  chunkSize?: number;
@@ -100,17 +55,6 @@ export interface FirmwareUpdateV3Params {
100
55
  firmwareType?: EFirmwareType;
101
56
 
102
57
  platform: IPlatform;
103
-
104
- artifactReader?: FirmwareArtifactReader;
105
- artifacts?: {
106
- ble?: FirmwareArtifactReference;
107
- firmware?: FirmwareArtifactReference;
108
- bootloader?: FirmwareArtifactReference;
109
- resourceEntries?: Array<{
110
- entryName: string;
111
- artifact: FirmwareArtifactReference;
112
- }>;
113
- };
114
58
  }
115
59
 
116
60
  /**
@@ -129,14 +73,10 @@ export type FirmwareUpdateV4Target =
129
73
  | 'se04';
130
74
 
131
75
  export interface FirmwareUpdateV4Params {
132
- preparedPlan?: FirmwareUpdatePreparedPlan;
133
- hostBindingGeneration?: number;
134
76
  platform: IPlatform;
135
- expectedDeviceId?: string;
136
77
  chunkSize?: number;
137
78
  firmwareType?: EFirmwareType;
138
79
  targetsToUpdate?: FirmwareUpdateV4Target[];
139
- expectedTargetVersions?: Partial<Record<FirmwareUpdateV4Target, string>>;
140
80
 
141
81
  /** FW_MGMT_TARGET_ROMLOADER = 2; Pro2 cannot install it through firmwareUpdateV4. */
142
82
  romloaderBinary?: ArrayBuffer;
@@ -162,24 +102,8 @@ export interface FirmwareUpdateV4Params {
162
102
  binary: ArrayBuffer;
163
103
  devicePath: string;
164
104
  }>;
165
- artifactReader?: FirmwareArtifactReader;
166
- componentArtifacts?: Partial<
167
- Record<Exclude<FirmwareUpdateV4Target, 'resource'>, FirmwareArtifactReference>
168
- >;
169
- resourceBundleArtifacts?: Array<{
170
- name: string;
171
- artifact: FirmwareArtifactReference;
172
- }>;
173
105
  }
174
106
 
175
- export declare function registerFirmwareUpdateHostBinding(
176
- binding: FirmwareUpdateHostBinding
177
- ): number;
178
-
179
- export declare function unregisterFirmwareUpdateHostBinding(generation?: number): boolean;
180
-
181
- export declare function getFirmwareUpdateHostBindingGeneration(): number;
182
-
183
107
  export declare function firmwareUpdateV3(
184
108
  connectId: string | undefined,
185
109
  params: Params<FirmwareUpdateV3Params>
@@ -1,6 +1,7 @@
1
1
  import type {
2
2
  deviceGetOnboardingStatus,
3
3
  deviceReboot,
4
+ deviceUploadNft,
4
5
  deviceUploadWallpaper,
5
6
  testProtocolV2Ping,
6
7
  uploadPortfolio,
@@ -30,15 +31,7 @@ import type {
30
31
  firmwareUpdateV2,
31
32
  firmwareUpdateV3,
32
33
  firmwareUpdateV4,
33
- getFirmwareUpdateHostBindingGeneration,
34
- registerFirmwareUpdateHostBinding,
35
- unregisterFirmwareUpdateHostBinding,
36
34
  } from './firmwareUpdate';
37
- import type { getFirmwareUpdateCapabilities } from './firmwareUpdateCapabilities';
38
- import type {
39
- prepareFirmwareUpdatePlan,
40
- validateFirmwareUpdatePreparedPlan,
41
- } from './firmwareUpdatePreparedPlan';
42
35
  import type { promptWebDeviceAccess } from './promptWebDeviceAccess';
43
36
  import type { deviceReset } from './deviceReset';
44
37
  import type { deviceRecovery } from './deviceRecovery';
@@ -235,12 +228,6 @@ export type CoreApi = {
235
228
  firmwareUpdateV2: typeof firmwareUpdateV2;
236
229
  firmwareUpdateV3: typeof firmwareUpdateV3;
237
230
  firmwareUpdateV4: typeof firmwareUpdateV4;
238
- registerFirmwareUpdateHostBinding: typeof registerFirmwareUpdateHostBinding;
239
- unregisterFirmwareUpdateHostBinding: typeof unregisterFirmwareUpdateHostBinding;
240
- getFirmwareUpdateHostBindingGeneration: typeof getFirmwareUpdateHostBindingGeneration;
241
- getFirmwareUpdateCapabilities: typeof getFirmwareUpdateCapabilities;
242
- prepareFirmwareUpdatePlan: typeof prepareFirmwareUpdatePlan;
243
- validateFirmwareUpdatePreparedPlan: typeof validateFirmwareUpdatePreparedPlan;
244
231
  cipherKeyValue: typeof cipherKeyValue;
245
232
 
246
233
  /**
@@ -248,6 +235,7 @@ export type CoreApi = {
248
235
  */
249
236
  deviceReboot: typeof deviceReboot;
250
237
  deviceGetOnboardingStatus: typeof deviceGetOnboardingStatus;
238
+ deviceUploadNft: typeof deviceUploadNft;
251
239
  deviceUploadWallpaper: typeof deviceUploadWallpaper;
252
240
  uploadPortfolio: typeof uploadPortfolio;
253
241
 
@@ -5,6 +5,10 @@ import type {
5
5
  DeviceUploadWallpaperParams,
6
6
  DeviceUploadWallpaperResponse,
7
7
  } from '../../api/protocol-v2/DeviceUploadWallpaper';
8
+ import type {
9
+ DeviceUploadNftParams,
10
+ DeviceUploadNftResponse,
11
+ } from '../../api/protocol-v2/DeviceUploadNft';
8
12
 
9
13
  // Re-export implementation parameter types as the single source of truth.
10
14
  export type { DeviceRebootParams, RebootTypeInput } from '../../api/protocol-v2/helpers';
@@ -12,6 +16,10 @@ export type {
12
16
  DeviceUploadWallpaperParams,
13
17
  DeviceUploadWallpaperResponse,
14
18
  } from '../../api/protocol-v2/DeviceUploadWallpaper';
19
+ export type {
20
+ DeviceUploadNftParams,
21
+ DeviceUploadNftResponse,
22
+ } from '../../api/protocol-v2/DeviceUploadNft';
15
23
 
16
24
  // ── Shared response shapes (Protocol V2 file system) ────────────────────
17
25
 
@@ -52,6 +60,11 @@ export declare function deviceUploadWallpaper(
52
60
  params: CommonParams & DeviceUploadWallpaperParams
53
61
  ): Response<DeviceUploadWallpaperResponse>;
54
62
 
63
+ export declare function deviceUploadNft(
64
+ connectId: string,
65
+ params: CommonParams & DeviceUploadNftParams
66
+ ): Response<DeviceUploadNftResponse>;
67
+
55
68
  export declare function uploadPortfolio(
56
69
  connectId: string,
57
70
  params: {