@onekeyfe/hd-core 1.2.0-alpha.67 → 1.2.0-alpha.69

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 (316) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +313 -0
  2. package/__tests__/DeviceCommands.test.ts +59 -13
  3. package/__tests__/DeviceEventRegistration.test.ts +6 -0
  4. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +226 -3
  5. package/__tests__/connectSettings.test.ts +5 -47
  6. package/__tests__/core-initialization.test.ts +23 -0
  7. package/__tests__/device-connector-protocol.test.ts +81 -0
  8. package/__tests__/device-lifecycle-events.test.ts +105 -3
  9. package/__tests__/device-pool-state.test.ts +22 -0
  10. package/__tests__/device-settings.test.ts +39 -18
  11. package/__tests__/device-state-contract.test.ts +1 -0
  12. package/__tests__/device-state-mapper.test.ts +13 -1
  13. package/__tests__/device-utils.test.ts +48 -1
  14. package/__tests__/deviceSettings.test.ts +11 -1
  15. package/__tests__/deviceUploadNft.test.ts +316 -0
  16. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +31 -59
  17. package/__tests__/get-device-state.test.ts +132 -12
  18. package/__tests__/homescreen.test.ts +41 -1
  19. package/__tests__/kaspa-use-tweak-pro2.test.ts +2 -2
  20. package/__tests__/kaspaSignTransaction.test.ts +3 -26
  21. package/__tests__/logBlockEvent.test.ts +1 -1
  22. package/__tests__/method-protocol-support.test.ts +19 -0
  23. package/__tests__/open-wallet-session.test.ts +568 -37
  24. package/__tests__/pro2Nft.test.ts +108 -0
  25. package/__tests__/protocol-binding.test.ts +89 -0
  26. package/__tests__/protocol-v2-firmware-targets.test.ts +33 -1
  27. package/__tests__/protocol-v2-resources.test.ts +343 -0
  28. package/__tests__/protocol-v2-ui-lifecycle.test.ts +91 -0
  29. package/__tests__/protocol-v2-unlock-policy.test.ts +300 -37
  30. package/__tests__/protocol-v2.test.ts +1586 -1213
  31. package/__tests__/protocolV2FileWrite.test.ts +193 -0
  32. package/__tests__/protocolV2UiInteraction.test.ts +63 -0
  33. package/__tests__/public-pro2-api-boundary.test.ts +1 -0
  34. package/__tests__/search-devices.test.ts +12 -3
  35. package/__tests__/tron-sign-message-init.test.ts +2 -2
  36. package/__tests__/uiProgressThrottle.test.ts +74 -0
  37. package/__tests__/uiPromiseRegistry.test.ts +115 -0
  38. package/dist/api/BaseMethod.d.ts +3 -1
  39. package/dist/api/BaseMethod.d.ts.map +1 -1
  40. package/dist/api/CheckAllFirmwareRelease.d.ts +3 -1
  41. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  42. package/dist/api/DetectDeviceConnectProtocol.d.ts +7 -0
  43. package/dist/api/DetectDeviceConnectProtocol.d.ts.map +1 -0
  44. package/dist/api/FirmwareUpdate.d.ts.map +1 -1
  45. package/dist/api/FirmwareUpdateV2.d.ts +0 -10
  46. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  47. package/dist/api/FirmwareUpdateV3.d.ts +3 -7
  48. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  49. package/dist/api/FirmwareUpdateV4.d.ts +15 -27
  50. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  51. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  52. package/dist/api/OpenWalletSession.d.ts.map +1 -1
  53. package/dist/api/SearchDevices.d.ts.map +1 -1
  54. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  55. package/dist/api/device/DeviceSettings.d.ts.map +1 -1
  56. package/dist/api/device/DeviceUnlock.d.ts +2 -2
  57. package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
  58. package/dist/api/device/DeviceUpdateBootloader.d.ts +1 -5
  59. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  60. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +4 -11
  61. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  62. package/dist/api/firmware/getBinary.d.ts +0 -7
  63. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  64. package/dist/api/firmware/updateBootloader.d.ts +0 -2
  65. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  66. package/dist/api/firmware/uploadFirmware.d.ts +1 -9
  67. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  68. package/dist/api/helpers/protocolV2FileWrite.d.ts +9 -0
  69. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -1
  70. package/dist/api/index.d.ts +2 -0
  71. package/dist/api/index.d.ts.map +1 -1
  72. package/dist/api/kaspa/KaspaGetAddress.d.ts +1 -1
  73. package/dist/api/kaspa/KaspaSignTransaction.d.ts +1 -1
  74. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  75. package/dist/api/polkadot/PolkadotGetAddress.d.ts +1 -1
  76. package/dist/api/polkadot/networks.d.ts +1 -1
  77. package/dist/api/protocol-v2/DeviceUploadNft.d.ts +31 -0
  78. package/dist/api/protocol-v2/DeviceUploadNft.d.ts.map +1 -0
  79. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -1
  80. package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
  81. package/dist/api/solana/SolSignMessage.d.ts +1 -1
  82. package/dist/api/solana/SolSignOffchainMessage.d.ts +1 -1
  83. package/dist/api/solana/SolSignTransaction.d.ts +2 -2
  84. package/dist/api/stellar/StellarSignTransaction.d.ts +1 -1
  85. package/dist/api/sui/SuiGetAddress.d.ts +1 -1
  86. package/dist/api/sui/SuiGetPublicKey.d.ts +1 -1
  87. package/dist/api/sui/SuiSignMessage.d.ts +1 -1
  88. package/dist/api/sui/SuiSignTransaction.d.ts +1 -1
  89. package/dist/api/ton/TonGetAddress.d.ts +1 -1
  90. package/dist/api/ton/TonSignMessage.d.ts +1 -1
  91. package/dist/api/ton/TonSignProof.d.ts +1 -1
  92. package/dist/api/tron/TronSignMessage.d.ts +2 -2
  93. package/dist/api/tron/TronSignTransaction.d.ts +1 -1
  94. package/dist/core/deviceEventRegistration.d.ts +2 -0
  95. package/dist/core/deviceEventRegistration.d.ts.map +1 -1
  96. package/dist/core/index.d.ts.map +1 -1
  97. package/dist/core/uiPromiseRegistry.d.ts +6 -0
  98. package/dist/core/uiPromiseRegistry.d.ts.map +1 -0
  99. package/dist/data-manager/DataManager.d.ts +9 -4
  100. package/dist/data-manager/DataManager.d.ts.map +1 -1
  101. package/dist/data-manager/TransportManager.d.ts.map +1 -1
  102. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  103. package/dist/device/Device.d.ts +29 -6
  104. package/dist/device/Device.d.ts.map +1 -1
  105. package/dist/device/DeviceCommands.d.ts +4 -4
  106. package/dist/device/DeviceCommands.d.ts.map +1 -1
  107. package/dist/device/DeviceConnector.d.ts +2 -1
  108. package/dist/device/DeviceConnector.d.ts.map +1 -1
  109. package/dist/device/DevicePool.d.ts.map +1 -1
  110. package/dist/deviceProfile/protocolV2DeviceIdentity.d.ts.map +1 -1
  111. package/dist/events/device.d.ts +4 -0
  112. package/dist/events/device.d.ts.map +1 -1
  113. package/dist/events/logBlockEvent.d.ts.map +1 -1
  114. package/dist/events/ui-promise.d.ts +4 -2
  115. package/dist/events/ui-promise.d.ts.map +1 -1
  116. package/dist/events/ui-request.d.ts +31 -2
  117. package/dist/events/ui-request.d.ts.map +1 -1
  118. package/dist/events/ui-response.d.ts +10 -2
  119. package/dist/events/ui-response.d.ts.map +1 -1
  120. package/dist/index.d.ts +243 -247
  121. package/dist/index.d.ts.map +1 -1
  122. package/dist/index.js +3135 -3785
  123. package/dist/inject.d.ts +6 -1
  124. package/dist/inject.d.ts.map +1 -1
  125. package/dist/lowLevelInject.d.ts.map +1 -1
  126. package/dist/protocols/protocol-v2/features.d.ts +0 -4
  127. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  128. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
  129. package/dist/protocols/protocol-v2/resources.d.ts +30 -0
  130. package/dist/protocols/protocol-v2/resources.d.ts.map +1 -0
  131. package/dist/protocols/protocol-v2/uiInteraction.d.ts +7 -4
  132. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -1
  133. package/dist/protocols/protocol-v2/unlockPolicy.d.ts +1 -3
  134. package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -1
  135. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts +22 -0
  136. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts.map +1 -0
  137. package/dist/protocols/protocol-v2/walletSession.d.ts +6 -1
  138. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -1
  139. package/dist/topLevelInject.d.ts.map +1 -1
  140. package/dist/types/api/checkAllFirmwareRelease.d.ts +3 -5
  141. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  142. package/dist/types/api/detectDeviceConnectProtocol.d.ts +4 -0
  143. package/dist/types/api/detectDeviceConnectProtocol.d.ts.map +1 -0
  144. package/dist/types/api/deviceUnlock.d.ts +5 -1
  145. package/dist/types/api/deviceUnlock.d.ts.map +1 -1
  146. package/dist/types/api/deviceUpdateBootloader.d.ts +0 -6
  147. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  148. package/dist/types/api/export.d.ts +2 -4
  149. package/dist/types/api/export.d.ts.map +1 -1
  150. package/dist/types/api/firmwareUpdate.d.ts +4 -70
  151. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  152. package/dist/types/api/index.d.ts +7 -10
  153. package/dist/types/api/index.d.ts.map +1 -1
  154. package/dist/types/api/protocolV2.d.ts +3 -0
  155. package/dist/types/api/protocolV2.d.ts.map +1 -1
  156. package/dist/types/device.d.ts +2 -2
  157. package/dist/types/device.d.ts.map +1 -1
  158. package/dist/types/params.d.ts +1 -0
  159. package/dist/types/params.d.ts.map +1 -1
  160. package/dist/types/settings.d.ts +38 -21
  161. package/dist/types/settings.d.ts.map +1 -1
  162. package/dist/utils/deviceFeaturesCompat.d.ts +0 -1
  163. package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -1
  164. package/dist/utils/deviceFeaturesUtils.d.ts +4 -0
  165. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  166. package/dist/utils/deviceInfoUtils.d.ts.map +1 -1
  167. package/dist/utils/deviceSettings.d.ts.map +1 -1
  168. package/dist/utils/homescreen.d.ts +4 -0
  169. package/dist/utils/homescreen.d.ts.map +1 -1
  170. package/dist/utils/index.d.ts +1 -1
  171. package/dist/utils/index.d.ts.map +1 -1
  172. package/dist/utils/patch.d.ts +1 -1
  173. package/dist/utils/patch.d.ts.map +1 -1
  174. package/dist/utils/pro2Nft.d.ts +31 -0
  175. package/dist/utils/pro2Nft.d.ts.map +1 -0
  176. package/dist/utils/pro2Wallpaper.d.ts +10 -0
  177. package/dist/utils/pro2Wallpaper.d.ts.map +1 -1
  178. package/dist/utils/uiProgressThrottle.d.ts +3 -0
  179. package/dist/utils/uiProgressThrottle.d.ts.map +1 -0
  180. package/package.json +4 -4
  181. package/src/api/BaseMethod.ts +8 -10
  182. package/src/api/CheckAllFirmwareRelease.ts +78 -64
  183. package/src/api/DetectDeviceConnectProtocol.ts +18 -0
  184. package/src/api/FirmwareUpdate.ts +7 -15
  185. package/src/api/FirmwareUpdateV2.ts +126 -298
  186. package/src/api/FirmwareUpdateV3.ts +63 -265
  187. package/src/api/FirmwareUpdateV4.ts +645 -1018
  188. package/src/api/GetPassphraseState.ts +7 -1
  189. package/src/api/OpenWalletSession.ts +71 -17
  190. package/src/api/SearchDevices.ts +3 -1
  191. package/src/api/allnetwork/AllNetworkGetAddress.ts +21 -21
  192. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +36 -11
  193. package/src/api/device/DeviceSettings.ts +5 -4
  194. package/src/api/device/DeviceUnlock.ts +8 -3
  195. package/src/api/device/DeviceUpdateBootloader.ts +6 -125
  196. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +27 -83
  197. package/src/api/firmware/updateBootloader.ts +4 -19
  198. package/src/api/firmware/uploadFirmware.ts +39 -144
  199. package/src/api/helpers/protocolV2FileWrite.ts +252 -63
  200. package/src/api/index.ts +2 -0
  201. package/src/api/kaspa/KaspaGetAddress.ts +1 -1
  202. package/src/api/kaspa/KaspaSignTransaction.ts +2 -13
  203. package/src/api/polkadot/networks.ts +3 -3
  204. package/src/api/protocol-v2/DeviceUploadNft.ts +197 -0
  205. package/src/api/protocol-v2/ProtocolInfoRequest.ts +3 -1
  206. package/src/api/protocol-v2/helpers.ts +1 -1
  207. package/src/api/solana/SolSignMessage.ts +1 -1
  208. package/src/api/solana/SolSignOffchainMessage.ts +1 -1
  209. package/src/api/solana/SolSignTransaction.ts +2 -2
  210. package/src/api/sui/SuiGetAddress.ts +1 -1
  211. package/src/api/sui/SuiGetPublicKey.ts +1 -1
  212. package/src/api/sui/SuiSignMessage.ts +1 -1
  213. package/src/api/sui/SuiSignTransaction.ts +1 -1
  214. package/src/api/ton/TonGetAddress.ts +1 -1
  215. package/src/api/ton/TonSignMessage.ts +1 -1
  216. package/src/api/ton/TonSignProof.ts +1 -1
  217. package/src/api/tron/TronSignMessage.ts +2 -2
  218. package/src/api/tron/TronSignTransaction.ts +1 -1
  219. package/src/core/deviceEventRegistration.ts +4 -0
  220. package/src/core/index.ts +213 -111
  221. package/src/core/uiPromiseRegistry.ts +63 -0
  222. package/src/data/messages/messages-protocol-v2.json +25 -0
  223. package/src/data-manager/DataManager.ts +113 -41
  224. package/src/data-manager/TransportManager.ts +6 -0
  225. package/src/data-manager/connectSettings.ts +0 -11
  226. package/src/device/Device.ts +274 -49
  227. package/src/device/DeviceCommands.ts +31 -4
  228. package/src/device/DeviceConnector.ts +33 -13
  229. package/src/device/DevicePool.ts +21 -7
  230. package/src/deviceProfile/buildDeviceFeatures.ts +2 -2
  231. package/src/deviceProfile/protocolV2DeviceIdentity.ts +3 -0
  232. package/src/events/device.ts +4 -0
  233. package/src/events/logBlockEvent.ts +1 -0
  234. package/src/events/ui-promise.ts +4 -2
  235. package/src/events/ui-request.ts +36 -2
  236. package/src/events/ui-response.ts +12 -2
  237. package/src/index.ts +0 -5
  238. package/src/inject.ts +60 -24
  239. package/src/lowLevelInject.ts +7 -8
  240. package/src/protocols/protocol-v2/features.ts +10 -7
  241. package/src/protocols/protocol-v2/firmware.ts +2 -0
  242. package/src/protocols/protocol-v2/resources.ts +394 -0
  243. package/src/protocols/protocol-v2/uiInteraction.ts +46 -6
  244. package/src/protocols/protocol-v2/unlockPolicy.ts +1 -105
  245. package/src/protocols/protocol-v2/unlockPolicyRunner.ts +131 -0
  246. package/src/protocols/protocol-v2/walletSession.ts +214 -36
  247. package/src/topLevelInject.ts +7 -8
  248. package/src/types/api/checkAllFirmwareRelease.ts +3 -5
  249. package/src/types/api/detectDeviceConnectProtocol.ts +6 -0
  250. package/src/types/api/deviceUnlock.ts +12 -1
  251. package/src/types/api/deviceUpdateBootloader.ts +0 -6
  252. package/src/types/api/export.ts +1 -18
  253. package/src/types/api/firmwareUpdate.ts +6 -78
  254. package/src/types/api/index.ts +13 -14
  255. package/src/types/api/protocolV2.ts +13 -0
  256. package/src/types/device.ts +15 -3
  257. package/src/types/params.ts +7 -1
  258. package/src/types/settings.ts +61 -22
  259. package/src/utils/deviceFeaturesCompat.ts +5 -6
  260. package/src/utils/deviceFeaturesUtils.ts +14 -3
  261. package/src/utils/deviceInfoUtils.ts +2 -0
  262. package/src/utils/deviceSettings.ts +3 -0
  263. package/src/utils/homescreen.ts +32 -6
  264. package/src/utils/index.ts +6 -1
  265. package/src/utils/pro2Nft.ts +142 -0
  266. package/src/utils/pro2Wallpaper.ts +35 -8
  267. package/src/utils/uiProgressThrottle.ts +63 -0
  268. package/__tests__/device-initialize-timeout.test.ts +0 -56
  269. package/__tests__/firmware-update/check-all-firmware-release.test.ts +0 -175
  270. package/__tests__/firmware-update/device-update-bootloader.test.ts +0 -87
  271. package/__tests__/firmware-update/firmware-artifact-source.test.ts +0 -119
  272. package/__tests__/firmware-update/firmware-host-binding.test.ts +0 -70
  273. package/__tests__/firmware-update/firmware-preparation-error.test.ts +0 -27
  274. package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +0 -200
  275. package/__tests__/firmware-update/firmware-update-capabilities.test.ts +0 -13
  276. package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +0 -394
  277. package/__tests__/firmware-update/firmware-update-plan.test.ts +0 -593
  278. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +0 -231
  279. package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +0 -58
  280. package/__tests__/firmware-update/firmware-upload-source.test.ts +0 -70
  281. package/dist/api/firmware/FirmwareArtifactSource.d.ts +0 -25
  282. package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +0 -1
  283. package/dist/api/firmware/FirmwareHostBinding.d.ts +0 -6
  284. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +0 -1
  285. package/dist/api/firmware/FirmwarePreparationError.d.ts +0 -3
  286. package/dist/api/firmware/FirmwarePreparationError.d.ts.map +0 -1
  287. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +0 -3
  288. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +0 -1
  289. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +0 -25
  290. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +0 -1
  291. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +0 -32
  292. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +0 -1
  293. package/dist/api/firmware/progressThrottle.d.ts +0 -3
  294. package/dist/api/firmware/progressThrottle.d.ts.map +0 -1
  295. package/dist/protocols/protocol-v2/lockedError.d.ts +0 -2
  296. package/dist/protocols/protocol-v2/lockedError.d.ts.map +0 -1
  297. package/dist/protocols/protocol-v2/unlockRetry.d.ts +0 -10
  298. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +0 -1
  299. package/dist/types/api/firmwareUpdateCapabilities.d.ts +0 -9
  300. package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +0 -1
  301. package/dist/types/api/firmwareUpdatePlan.d.ts +0 -28
  302. package/dist/types/api/firmwareUpdatePlan.d.ts.map +0 -1
  303. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +0 -42
  304. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +0 -1
  305. package/src/api/firmware/FirmwareArtifactSource.ts +0 -278
  306. package/src/api/firmware/FirmwareHostBinding.ts +0 -100
  307. package/src/api/firmware/FirmwarePreparationError.ts +0 -12
  308. package/src/api/firmware/FirmwareUpdateCapabilities.ts +0 -9
  309. package/src/api/firmware/FirmwareUpdatePlan.ts +0 -772
  310. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +0 -449
  311. package/src/api/firmware/progressThrottle.ts +0 -44
  312. package/src/protocols/protocol-v2/lockedError.ts +0 -10
  313. package/src/protocols/protocol-v2/unlockRetry.ts +0 -109
  314. package/src/types/api/firmwareUpdateCapabilities.ts +0 -9
  315. package/src/types/api/firmwareUpdatePlan.ts +0 -38
  316. package/src/types/api/firmwareUpdatePreparedPlan.ts +0 -53
@@ -1,394 +0,0 @@
1
- import { EDeviceType, EFirmwareType } from '@onekeyfe/hd-shared';
2
-
3
- import { buildFirmwareUpdatePlan } from '../../src/api/firmware/FirmwareUpdatePlan';
4
- import {
5
- assertFirmwareUpdatePreparedPlanDeviceIdentity,
6
- prepareFirmwareUpdatePlan,
7
- } from '../../src/api/firmware/FirmwareUpdatePreparedPlan';
8
-
9
- import type { Features } from '../../src/types';
10
-
11
- const FIRMWARE_SHA256 = 'a'.repeat(64);
12
-
13
- const BLE_SHA256 = 'b'.repeat(64);
14
-
15
- const buildDesktopPlan = (
16
- features: Partial<Features>,
17
- options?: {
18
- ble?: { status: string; release?: Record<string, unknown> };
19
- firmwareStatus?: string;
20
- }
21
- ) =>
22
- buildFirmwareUpdatePlan({
23
- features: features as Features,
24
- firmwareType: EFirmwareType.Universal,
25
- platform: 'desktop',
26
- firmware: {
27
- status: options?.firmwareStatus ?? 'none',
28
- release: {
29
- url: 'https://firmware.onekey.so/classic/firmware.bin',
30
- expectedSize: 4,
31
- fingerprint: FIRMWARE_SHA256,
32
- version: [3, 20, 0],
33
- },
34
- },
35
- ble: options?.ble ?? {
36
- status: 'valid',
37
- release: undefined,
38
- },
39
- bootloader: {
40
- status: 'valid',
41
- release: undefined,
42
- },
43
- });
44
-
45
- const bleNoneWithRelease = {
46
- status: 'none',
47
- release: {
48
- url: 'https://firmware.onekey.so/classic/ble.bin',
49
- webUpdate: 'https://firmware.onekey.so/classic/ble.bin',
50
- expectedSize: 8,
51
- fingerprint: BLE_SHA256,
52
- version: [1, 5, 6],
53
- },
54
- };
55
-
56
- // A classic1s that lost its firmware reports no serial in bootloader mode; the
57
- // recovery flow must still be able to build (and later execute) a prepared plan.
58
- const bootloaderClassic1sFeatures: Partial<Features> = {
59
- deviceType: EDeviceType.Classic1s,
60
- bootloaderMode: true,
61
- firmwareVersion: '0.0.0',
62
- bootloaderVersion: '2.1.2',
63
- };
64
-
65
- describe('firmware update plan identity in bootloader mode', () => {
66
- test('builds a degraded-identity plan for a serial-less bootloader classic1s on desktop', () => {
67
- const plan = buildDesktopPlan(bootloaderClassic1sFeatures);
68
- expect(plan.deviceIdentity).toBe('unavailable');
69
- expect(plan.executor).not.toBe('v4');
70
- expect(plan.targetsToUpdate).toContain('firmware');
71
- });
72
-
73
- test('bootloader mode with intact firmware (status unknown) still gets the firmware artifact', () => {
74
- const plan = buildDesktopPlan(
75
- {
76
- deviceType: EDeviceType.Classic1s,
77
- bootloaderMode: true,
78
- firmwareVersion: '2.1.2',
79
- bootloaderVersion: '2.1.2',
80
- },
81
- { firmwareStatus: 'unknown' }
82
- );
83
- expect(plan.targetsToUpdate).toContain('firmware');
84
- expect(plan.deviceIdentity).toBe('unavailable');
85
- });
86
-
87
- test('normal-mode status none with a release available still adds no artifacts', () => {
88
- const plan = buildDesktopPlan({
89
- deviceType: EDeviceType.Classic1s,
90
- serialNo: 'CLA45F0023',
91
- firmwareVersion: '3.19.0',
92
- bootloaderVersion: '2.1.2',
93
- });
94
- expect(plan.targetsToUpdate).toEqual([]);
95
- });
96
-
97
- test('recovery plan carries the BLE artifact when the BLE version is unreadable in bootloader', () => {
98
- const plan = buildDesktopPlan(bootloaderClassic1sFeatures, { ble: bleNoneWithRelease });
99
- expect(plan.targetsToUpdate).toEqual(expect.arrayContaining(['firmware', 'ble']));
100
- });
101
-
102
- test('a normal-mode device without BLE hardware (status none) gets no BLE artifact', () => {
103
- const plan = buildFirmwareUpdatePlan({
104
- features: {
105
- deviceType: EDeviceType.Mini,
106
- serialNo: 'mini-device-id',
107
- firmwareVersion: '3.9.0',
108
- bootloaderVersion: '2.0.0',
109
- } as Features,
110
- firmwareType: EFirmwareType.Universal,
111
- platform: 'desktop',
112
- firmware: {
113
- status: 'outdated',
114
- release: {
115
- url: 'https://firmware.onekey.so/mini/firmware.bin',
116
- expectedSize: 4,
117
- fingerprint: FIRMWARE_SHA256,
118
- version: [3, 10, 0],
119
- },
120
- },
121
- ble: { status: 'none', release: undefined },
122
- bootloader: { status: 'valid', release: undefined },
123
- });
124
- expect(plan.targetsToUpdate).toEqual(['firmware']);
125
- });
126
-
127
- test('still rejects a serial-less normal-mode device on desktop', () => {
128
- expect(() =>
129
- buildDesktopPlan(
130
- {
131
- deviceType: EDeviceType.Classic1s,
132
- firmwareVersion: '3.19.0',
133
- bootloaderVersion: '2.1.2',
134
- },
135
- { firmwareStatus: 'outdated' }
136
- )
137
- ).toThrow(/stable device identity/);
138
- });
139
-
140
- test('keeps rejecting degraded identity for serial-less Pro (v3) in bootloader', () => {
141
- expect(() =>
142
- buildDesktopPlan(
143
- {
144
- deviceType: EDeviceType.Pro,
145
- bootloaderMode: true,
146
- firmwareVersion: '0.0.0',
147
- bootloaderVersion: '2.8.0',
148
- },
149
- { firmwareStatus: 'none' }
150
- )
151
- ).toThrow(/stable device identity/);
152
- });
153
-
154
- test('degraded plans are v2-only', () => {
155
- const plan = buildDesktopPlan(bootloaderClassic1sFeatures);
156
- expect(plan.executor).toBe('v2');
157
- });
158
-
159
- describe('degraded plan identity transition within one recovery workflow', () => {
160
- // Bootloader recovery installs the main firmware while the device has no serial;
161
- // it then reboots into normal mode and reports one, and the remaining phases of
162
- // the SAME workflow reuse the same prepared plan.
163
- let lease = 0;
164
- const prepareRecoveryPlan = () => {
165
- lease += 1;
166
- const plan = buildDesktopPlan(bootloaderClassic1sFeatures);
167
- return prepareFirmwareUpdatePlan({
168
- plan,
169
- leaseRef: `fwlease:00000000-0000-4000-8000-00000000000${lease}`,
170
- artifacts: [
171
- {
172
- artifactId: 'firmware',
173
- artifact: {
174
- artifactRef: `fw:${FIRMWARE_SHA256}`,
175
- size: 4,
176
- sha256: FIRMWARE_SHA256,
177
- },
178
- },
179
- ],
180
- });
181
- };
182
-
183
- test('accepts the phase that runs after the device reboots and reports a serial', () => {
184
- const preparedPlan = prepareRecoveryPlan();
185
- // Phase 1: still in bootloader, no serial.
186
- expect(() =>
187
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
188
- preparedPlan,
189
- deviceIdentity: undefined,
190
- bootloaderMode: true,
191
- deviceModel: String(EDeviceType.Classic1s),
192
- })
193
- ).not.toThrow();
194
- // Phase 2: firmware installed, device rebooted and now has an identity.
195
- expect(() =>
196
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
197
- preparedPlan,
198
- deviceIdentity: 'CLA45F0023',
199
- bootloaderMode: false,
200
- deviceModel: String(EDeviceType.Classic1s),
201
- })
202
- ).not.toThrow();
203
- });
204
-
205
- test('pins the first identity it sees, so a different device cannot take over', () => {
206
- const preparedPlan = prepareRecoveryPlan();
207
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
208
- preparedPlan,
209
- deviceIdentity: 'CLA45F0023',
210
- bootloaderMode: false,
211
- deviceModel: String(EDeviceType.Classic1s),
212
- });
213
- expect(() =>
214
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
215
- preparedPlan,
216
- deviceIdentity: 'CLA99Z9999',
217
- bootloaderMode: false,
218
- deviceModel: String(EDeviceType.Classic1s),
219
- })
220
- ).toThrow();
221
- });
222
-
223
- test('still refuses a different device model after the identity appears', () => {
224
- const preparedPlan = prepareRecoveryPlan();
225
- expect(() =>
226
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
227
- preparedPlan,
228
- deviceIdentity: 'MINI0000001',
229
- bootloaderMode: false,
230
- deviceModel: String(EDeviceType.Mini),
231
- })
232
- ).toThrow();
233
- });
234
-
235
- test('a fresh workflow does not inherit the previous workflow identity pin', () => {
236
- const first = prepareRecoveryPlan();
237
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
238
- preparedPlan: first,
239
- deviceIdentity: 'CLA45F0023',
240
- bootloaderMode: false,
241
- deviceModel: String(EDeviceType.Classic1s),
242
- });
243
- const second = prepareRecoveryPlan();
244
- expect(() =>
245
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
246
- preparedPlan: second,
247
- deviceIdentity: 'CLA99Z9999',
248
- bootloaderMode: false,
249
- deviceModel: String(EDeviceType.Classic1s),
250
- })
251
- ).not.toThrow();
252
- });
253
- });
254
-
255
- describe('prepared plan device identity assertion', () => {
256
- const prepareDegradedPlan = () => {
257
- const plan = buildDesktopPlan(bootloaderClassic1sFeatures);
258
- return prepareFirmwareUpdatePlan({
259
- plan,
260
- leaseRef: 'fwlease:00000000-0000-4000-8000-000000000001',
261
- artifacts: [
262
- {
263
- artifactId: 'firmware',
264
- artifact: {
265
- artifactRef: `fw:${FIRMWARE_SHA256}`,
266
- size: 4,
267
- sha256: FIRMWARE_SHA256,
268
- },
269
- },
270
- ],
271
- });
272
- };
273
-
274
- test('accepts a degraded plan when the live device is also identity-less in bootloader mode', () => {
275
- const preparedPlan = prepareDegradedPlan();
276
- expect(() =>
277
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
278
- preparedPlan,
279
- deviceIdentity: undefined,
280
- bootloaderMode: true,
281
- deviceModel: String(EDeviceType.Classic1s),
282
- })
283
- ).not.toThrow();
284
- });
285
-
286
- test('rejects a degraded plan outside bootloader mode', () => {
287
- const preparedPlan = prepareDegradedPlan();
288
- expect(() =>
289
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
290
- preparedPlan,
291
- deviceIdentity: undefined,
292
- bootloaderMode: false,
293
- deviceModel: String(EDeviceType.Classic1s),
294
- })
295
- ).toThrow();
296
- });
297
-
298
- test('rejects a degraded plan when bootloader mode is not stated', () => {
299
- const preparedPlan = prepareDegradedPlan();
300
- expect(() =>
301
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
302
- preparedPlan,
303
- deviceIdentity: undefined,
304
- deviceModel: String(EDeviceType.Classic1s),
305
- })
306
- ).toThrow();
307
- });
308
-
309
- // Superseded: a degraded plan MUST accept the first real identity, because that is
310
- // the recovering device reporting its serial after the firmware phase rebooted it.
311
- // The boundary that remains — a SECOND, different identity — is covered by
312
- // 'pins the first identity it sees, so a different device cannot take over'.
313
- test('binds to the identity the recovered device reports', () => {
314
- const preparedPlan = prepareDegradedPlan();
315
- expect(() =>
316
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
317
- preparedPlan,
318
- deviceIdentity: 'CLA45F0023',
319
- bootloaderMode: true,
320
- deviceModel: String(EDeviceType.Classic1s),
321
- })
322
- ).not.toThrow();
323
- });
324
-
325
- test('rejects a degraded plan on a different device model', () => {
326
- const preparedPlan = prepareDegradedPlan();
327
- expect(() =>
328
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
329
- preparedPlan,
330
- deviceIdentity: undefined,
331
- bootloaderMode: true,
332
- deviceModel: String(EDeviceType.Mini),
333
- })
334
- ).toThrow();
335
- });
336
-
337
- test('rejects a degraded plan when the live model is unstated', () => {
338
- const preparedPlan = prepareDegradedPlan();
339
- expect(() =>
340
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
341
- preparedPlan,
342
- deviceIdentity: undefined,
343
- bootloaderMode: true,
344
- })
345
- ).toThrow();
346
- });
347
-
348
- test('a live serial equal to the reserved sentinel never matches a degraded plan', () => {
349
- const preparedPlan = prepareDegradedPlan();
350
- expect(() =>
351
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
352
- preparedPlan,
353
- deviceIdentity: 'unavailable',
354
- bootloaderMode: false,
355
- deviceModel: String(EDeviceType.Classic1s),
356
- })
357
- ).toThrow();
358
- });
359
-
360
- test('rejects a real-identity plan when the live device is identity-less in bootloader mode', () => {
361
- const plan = buildDesktopPlan(
362
- {
363
- deviceType: EDeviceType.Classic1s,
364
- serialNo: 'CLA45F0023',
365
- firmwareVersion: '3.19.0',
366
- bootloaderVersion: '2.1.2',
367
- },
368
- { firmwareStatus: 'outdated' }
369
- );
370
- const preparedPlan = prepareFirmwareUpdatePlan({
371
- plan,
372
- leaseRef: 'fwlease:00000000-0000-4000-8000-000000000002',
373
- artifacts: [
374
- {
375
- artifactId: 'firmware',
376
- artifact: {
377
- artifactRef: `fw:${FIRMWARE_SHA256}`,
378
- size: 4,
379
- sha256: FIRMWARE_SHA256,
380
- },
381
- },
382
- ],
383
- });
384
- expect(() =>
385
- assertFirmwareUpdatePreparedPlanDeviceIdentity({
386
- preparedPlan,
387
- deviceIdentity: undefined,
388
- bootloaderMode: true,
389
- deviceModel: String(EDeviceType.Classic1s),
390
- })
391
- ).toThrow();
392
- });
393
- });
394
- });