@onekeyfe/hd-core 1.2.0-alpha.2 → 1.2.0-alpha.21

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 (406) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +75 -0
  2. package/__tests__/DeviceCommands.test.ts +285 -0
  3. package/__tests__/DeviceEventRegistration.test.ts +43 -0
  4. package/__tests__/connectSettings.test.ts +19 -0
  5. package/__tests__/core-dispose.test.ts +34 -0
  6. package/__tests__/core-error-output.test.ts +39 -0
  7. package/__tests__/device-features-state.test.ts +78 -0
  8. package/__tests__/device-identity.test.ts +30 -0
  9. package/__tests__/device-lifecycle-events.test.ts +117 -0
  10. package/__tests__/device-pool-state.test.ts +132 -0
  11. package/__tests__/device-settings.test.ts +391 -0
  12. package/__tests__/device-state-contract.test.ts +27 -0
  13. package/__tests__/device-state-events.test.ts +162 -0
  14. package/__tests__/device-state-mapper.test.ts +241 -0
  15. package/__tests__/device-state-projector.test.ts +94 -0
  16. package/__tests__/device-state-store.test.ts +82 -0
  17. package/__tests__/device-utils.test.ts +106 -0
  18. package/__tests__/device-wallet-session-store.test.ts +213 -0
  19. package/__tests__/deviceFeaturesUtils.test.ts +39 -0
  20. package/__tests__/deviceSettings.test.ts +103 -0
  21. package/__tests__/evmLedgerLegacySafety.test.ts +10 -6
  22. package/__tests__/evmSignTypedData.test.ts +80 -0
  23. package/__tests__/filesystemValidation.test.ts +53 -0
  24. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +402 -0
  25. package/__tests__/get-device-state.test.ts +410 -0
  26. package/__tests__/homescreen.test.ts +24 -0
  27. package/__tests__/kaspaSignTransaction.test.ts +591 -0
  28. package/__tests__/logBlockEvent.test.ts +26 -0
  29. package/__tests__/networkUtils.test.ts +386 -0
  30. package/__tests__/open-wallet-session-error-response.test.ts +43 -0
  31. package/__tests__/open-wallet-session.test.ts +559 -0
  32. package/__tests__/preInitialize.test.ts +33 -0
  33. package/__tests__/pro2Wallpaper.test.ts +50 -0
  34. package/__tests__/protocol-v2-bootloader-mode.test.ts +37 -0
  35. package/__tests__/protocol-v2-firmware-targets.test.ts +19 -0
  36. package/__tests__/protocol-v2.test.ts +3954 -1191
  37. package/__tests__/protocolV2FileWrite.test.ts +92 -0
  38. package/__tests__/protocolV2UiInteraction.test.ts +266 -0
  39. package/__tests__/public-device-state-api.test.ts +257 -0
  40. package/__tests__/public-pro2-api-boundary.test.ts +110 -0
  41. package/__tests__/refresh-device-state.test.ts +101 -0
  42. package/__tests__/request-context-logging.test.ts +16 -0
  43. package/__tests__/search-devices.test.ts +136 -0
  44. package/dist/api/BaseMethod.d.ts +8 -0
  45. package/dist/api/BaseMethod.d.ts.map +1 -1
  46. package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
  47. package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
  48. package/dist/api/ClearSessionCache.d.ts +9 -0
  49. package/dist/api/ClearSessionCache.d.ts.map +1 -0
  50. package/dist/api/DirList.d.ts.map +1 -1
  51. package/dist/api/FileRead.d.ts.map +1 -1
  52. package/dist/api/FileWrite.d.ts +1 -0
  53. package/dist/api/FileWrite.d.ts.map +1 -1
  54. package/dist/api/FirmwareUpdateV2.d.ts +2 -2
  55. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  56. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  57. package/dist/api/FirmwareUpdateV4.d.ts +25 -5
  58. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  59. package/dist/api/GetDeviceState.d.ts +7 -0
  60. package/dist/api/GetDeviceState.d.ts.map +1 -0
  61. package/dist/api/GetFeatures.d.ts +1 -1
  62. package/dist/api/GetFeatures.d.ts.map +1 -1
  63. package/dist/api/GetOnekeyFeatures.d.ts.map +1 -1
  64. package/dist/api/GetPassphraseState.d.ts +1 -6
  65. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  66. package/dist/api/OpenWalletSession.d.ts +14 -0
  67. package/dist/api/OpenWalletSession.d.ts.map +1 -0
  68. package/dist/api/PathInfo.d.ts.map +1 -1
  69. package/dist/api/PromptWebDeviceAccess.d.ts.map +1 -1
  70. package/dist/api/SearchDevices.d.ts +3 -0
  71. package/dist/api/SearchDevices.d.ts.map +1 -1
  72. package/dist/api/UploadPortfolio.d.ts +17 -0
  73. package/dist/api/UploadPortfolio.d.ts.map +1 -0
  74. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  75. package/dist/api/device/DeviceCancel.d.ts.map +1 -1
  76. package/dist/api/device/DeviceChangePin.d.ts.map +1 -1
  77. package/dist/api/device/DeviceFullyUploadResource.d.ts +1 -2
  78. package/dist/api/device/DeviceFullyUploadResource.d.ts.map +1 -1
  79. package/dist/api/device/DeviceLock.d.ts.map +1 -1
  80. package/dist/api/device/DeviceRebootToBoardloader.d.ts.map +1 -1
  81. package/dist/api/device/DeviceRebootToBootloader.d.ts.map +1 -1
  82. package/dist/api/device/DeviceSettings.d.ts.map +1 -1
  83. package/dist/api/device/DeviceUnlock.d.ts +1 -1
  84. package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
  85. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  86. package/dist/api/device/DeviceWipe.d.ts.map +1 -1
  87. package/dist/api/evm/EVMSignTypedData.d.ts.map +1 -1
  88. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +1 -0
  89. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  90. package/dist/api/firmware/getBinary.d.ts +11 -3
  91. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  92. package/dist/api/firmware/progressThrottle.d.ts +3 -0
  93. package/dist/api/firmware/progressThrottle.d.ts.map +1 -0
  94. package/dist/api/helpers/filesystemValidation.d.ts +3 -0
  95. package/dist/api/helpers/filesystemValidation.d.ts.map +1 -1
  96. package/dist/api/helpers/paramsValidator.d.ts +1 -0
  97. package/dist/api/helpers/paramsValidator.d.ts.map +1 -1
  98. package/dist/api/helpers/protocolV2FileWrite.d.ts +33 -0
  99. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -0
  100. package/dist/api/index.d.ts +12 -19
  101. package/dist/api/index.d.ts.map +1 -1
  102. package/dist/api/kaspa/KaspaSignTransaction.d.ts +5 -1
  103. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  104. package/dist/api/kaspa/helpers/TransferSerialize.d.ts.map +1 -1
  105. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts +6 -0
  106. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts.map +1 -0
  107. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts +7 -0
  108. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts.map +1 -0
  109. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts +1 -1
  110. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts.map +1 -1
  111. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts +3 -2
  112. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts.map +1 -1
  113. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts +1 -1
  114. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts.map +1 -1
  115. package/dist/api/protocol-v2/DeviceInfoGet.d.ts +28 -0
  116. package/dist/api/protocol-v2/DeviceInfoGet.d.ts.map +1 -0
  117. package/dist/api/protocol-v2/DeviceReboot.d.ts.map +1 -1
  118. package/dist/api/protocol-v2/DeviceStatusGet.d.ts +6 -0
  119. package/dist/api/protocol-v2/DeviceStatusGet.d.ts.map +1 -0
  120. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts +26 -0
  121. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts.map +1 -0
  122. package/dist/api/protocol-v2/FilesystemFormat.d.ts.map +1 -1
  123. package/dist/api/protocol-v2/{FilesystemFixPermission.d.ts → FilesystemPermissionFix.d.ts} +2 -2
  124. package/dist/api/protocol-v2/FilesystemPermissionFix.d.ts.map +1 -0
  125. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts +6 -0
  126. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -0
  127. package/dist/api/protocol-v2/helpers.d.ts +27 -19
  128. package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
  129. package/dist/api/ton/TonSignData.d.ts +1 -5
  130. package/dist/api/ton/TonSignData.d.ts.map +1 -1
  131. package/dist/api/utils.d.ts +2 -1
  132. package/dist/api/utils.d.ts.map +1 -1
  133. package/dist/constants/index.d.ts +2 -1
  134. package/dist/constants/index.d.ts.map +1 -1
  135. package/dist/core/RequestQueue.d.ts.map +1 -1
  136. package/dist/core/deviceEventRegistration.d.ts +11 -0
  137. package/dist/core/deviceEventRegistration.d.ts.map +1 -0
  138. package/dist/core/index.d.ts +3 -1
  139. package/dist/core/index.d.ts.map +1 -1
  140. package/dist/data-manager/DataManager.d.ts +1 -1
  141. package/dist/data-manager/DataManager.d.ts.map +1 -1
  142. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  143. package/dist/device/Device.d.ts +35 -11
  144. package/dist/device/Device.d.ts.map +1 -1
  145. package/dist/device/DeviceCommands.d.ts +8 -6
  146. package/dist/device/DeviceCommands.d.ts.map +1 -1
  147. package/dist/device/DeviceFeaturesState.d.ts +3 -0
  148. package/dist/device/DeviceFeaturesState.d.ts.map +1 -0
  149. package/dist/device/DevicePool.d.ts +4 -2
  150. package/dist/device/DevicePool.d.ts.map +1 -1
  151. package/dist/device/DeviceStateMapper.d.ts +13 -0
  152. package/dist/device/DeviceStateMapper.d.ts.map +1 -0
  153. package/dist/device/DeviceStateProjector.d.ts +7 -0
  154. package/dist/device/DeviceStateProjector.d.ts.map +1 -0
  155. package/dist/device/DeviceStateStore.d.ts +21 -0
  156. package/dist/device/DeviceStateStore.d.ts.map +1 -0
  157. package/dist/device/DeviceWalletSessionStore.d.ts +20 -0
  158. package/dist/device/DeviceWalletSessionStore.d.ts.map +1 -0
  159. package/dist/device/cloneDeviceState.d.ts +2 -0
  160. package/dist/device/cloneDeviceState.d.ts.map +1 -0
  161. package/dist/device/deviceIdentity.d.ts +5 -0
  162. package/dist/device/deviceIdentity.d.ts.map +1 -0
  163. package/dist/deviceProfile/buildDeviceFeatures.d.ts +9 -3
  164. package/dist/deviceProfile/buildDeviceFeatures.d.ts.map +1 -1
  165. package/dist/deviceProfile/index.d.ts +0 -1
  166. package/dist/deviceProfile/index.d.ts.map +1 -1
  167. package/dist/events/device.d.ts +11 -2
  168. package/dist/events/device.d.ts.map +1 -1
  169. package/dist/events/logBlockEvent.d.ts.map +1 -1
  170. package/dist/events/ui-request.d.ts +18 -2
  171. package/dist/events/ui-request.d.ts.map +1 -1
  172. package/dist/index.d.ts +1361 -609
  173. package/dist/index.js +5898 -2860
  174. package/dist/inject.d.ts.map +1 -1
  175. package/dist/protocols/protocol-v2/deviceSession.d.ts +7 -0
  176. package/dist/protocols/protocol-v2/deviceSession.d.ts.map +1 -0
  177. package/dist/protocols/protocol-v2/features.d.ts +23 -28
  178. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  179. package/dist/protocols/protocol-v2/firmware.d.ts +11 -9
  180. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
  181. package/dist/protocols/protocol-v2/index.d.ts +3 -2
  182. package/dist/protocols/protocol-v2/index.d.ts.map +1 -1
  183. package/dist/protocols/protocol-v2/lockedError.d.ts +2 -0
  184. package/dist/protocols/protocol-v2/lockedError.d.ts.map +1 -0
  185. package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts +16 -0
  186. package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts.map +1 -0
  187. package/dist/protocols/protocol-v2/uiInteraction.d.ts +39 -0
  188. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -0
  189. package/dist/protocols/protocol-v2/unlockRetry.d.ts +11 -0
  190. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +1 -0
  191. package/dist/protocols/protocol-v2/walletSession.d.ts +19 -0
  192. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -0
  193. package/dist/types/api/checkAllFirmwareRelease.d.ts +1 -2
  194. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  195. package/dist/types/api/deviceSettings.d.ts +11 -2
  196. package/dist/types/api/deviceSettings.d.ts.map +1 -1
  197. package/dist/types/api/deviceUnlock.d.ts +2 -2
  198. package/dist/types/api/deviceUnlock.d.ts.map +1 -1
  199. package/dist/types/api/firmwareUpdate.d.ts +6 -6
  200. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  201. package/dist/types/api/getDeviceState.d.ts +12 -0
  202. package/dist/types/api/getDeviceState.d.ts.map +1 -0
  203. package/dist/types/api/getFeatures.d.ts.map +1 -1
  204. package/dist/types/api/getOnekeyFeatures.d.ts.map +1 -1
  205. package/dist/types/api/getPassphraseState.d.ts +2 -10
  206. package/dist/types/api/getPassphraseState.d.ts.map +1 -1
  207. package/dist/types/api/index.d.ts +22 -25
  208. package/dist/types/api/index.d.ts.map +1 -1
  209. package/dist/types/api/kaspaSignTransaction.d.ts +27 -2
  210. package/dist/types/api/kaspaSignTransaction.d.ts.map +1 -1
  211. package/dist/types/api/openWalletSession.d.ts +41 -0
  212. package/dist/types/api/openWalletSession.d.ts.map +1 -0
  213. package/dist/types/api/protocolV2.d.ts +23 -28
  214. package/dist/types/api/protocolV2.d.ts.map +1 -1
  215. package/dist/types/api/sessionCache.d.ts +10 -0
  216. package/dist/types/api/sessionCache.d.ts.map +1 -0
  217. package/dist/types/device.d.ts +121 -5
  218. package/dist/types/device.d.ts.map +1 -1
  219. package/dist/types/params.d.ts +1 -0
  220. package/dist/types/params.d.ts.map +1 -1
  221. package/dist/types/settings.d.ts +21 -1
  222. package/dist/types/settings.d.ts.map +1 -1
  223. package/dist/utils/assets.d.ts +2 -1
  224. package/dist/utils/assets.d.ts.map +1 -1
  225. package/dist/utils/deviceFeaturesCompat.d.ts +13 -0
  226. package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -0
  227. package/dist/utils/deviceFeaturesUtils.d.ts +13 -3
  228. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  229. package/dist/utils/deviceInfoUtils.d.ts +9 -8
  230. package/dist/utils/deviceInfoUtils.d.ts.map +1 -1
  231. package/dist/utils/deviceSettings.d.ts +38 -7
  232. package/dist/utils/deviceSettings.d.ts.map +1 -1
  233. package/dist/utils/deviceVersionUtils.d.ts +6 -5
  234. package/dist/utils/deviceVersionUtils.d.ts.map +1 -1
  235. package/dist/utils/homescreen.d.ts.map +1 -1
  236. package/dist/utils/index.d.ts +5 -2
  237. package/dist/utils/index.d.ts.map +1 -1
  238. package/dist/utils/networkUtils.d.ts +9 -1
  239. package/dist/utils/networkUtils.d.ts.map +1 -1
  240. package/dist/utils/patch.d.ts +1 -1
  241. package/dist/utils/patch.d.ts.map +1 -1
  242. package/dist/utils/pro2Wallpaper.d.ts +12 -0
  243. package/dist/utils/pro2Wallpaper.d.ts.map +1 -0
  244. package/dist/utils/tracing.d.ts.map +1 -1
  245. package/package.json +4 -4
  246. package/src/api/BaseMethod.ts +36 -9
  247. package/src/api/CheckBootloaderRelease.ts +1 -2
  248. package/src/api/CheckFirmwareRelease.ts +1 -2
  249. package/src/api/ClearSessionCache.ts +28 -0
  250. package/src/api/DirList.ts +5 -3
  251. package/src/api/DirMake.ts +3 -3
  252. package/src/api/DirRemove.ts +3 -3
  253. package/src/api/FileDelete.ts +3 -3
  254. package/src/api/FileRead.ts +23 -7
  255. package/src/api/FileWrite.ts +23 -168
  256. package/src/api/FirmwareUpdate.ts +4 -4
  257. package/src/api/FirmwareUpdateV2.ts +133 -45
  258. package/src/api/FirmwareUpdateV3.ts +3 -5
  259. package/src/api/FirmwareUpdateV4.ts +1138 -357
  260. package/src/api/GetDeviceState.ts +55 -0
  261. package/src/api/GetFeatures.ts +8 -3
  262. package/src/api/GetOnekeyFeatures.ts +3 -72
  263. package/src/api/GetPassphraseState.ts +11 -18
  264. package/src/api/OpenWalletSession.ts +221 -0
  265. package/src/api/PathInfo.ts +5 -3
  266. package/src/api/PromptWebDeviceAccess.ts +2 -3
  267. package/src/api/SearchDevices.ts +29 -4
  268. package/src/api/UploadPortfolio.ts +40 -0
  269. package/src/api/alephium/AlephiumSignTransaction.ts +2 -2
  270. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +4 -8
  271. package/src/api/benfen/BenfenGetAddress.ts +1 -1
  272. package/src/api/btc/BTCGetPublicKey.ts +1 -1
  273. package/src/api/cardano/CardanoSignMessage.ts +1 -1
  274. package/src/api/cardano/CardanoSignTransaction.ts +1 -1
  275. package/src/api/device/DeviceCancel.ts +1 -0
  276. package/src/api/device/DeviceChangePin.ts +24 -0
  277. package/src/api/device/DeviceFullyUploadResource.ts +4 -5
  278. package/src/api/device/DeviceLock.ts +1 -0
  279. package/src/api/device/DeviceRebootToBoardloader.ts +5 -4
  280. package/src/api/device/DeviceRebootToBootloader.ts +5 -4
  281. package/src/api/device/DeviceSettings.ts +183 -1
  282. package/src/api/device/DeviceUnlock.ts +11 -1
  283. package/src/api/device/DeviceUpdateBootloader.ts +1 -2
  284. package/src/api/device/DeviceWipe.ts +19 -0
  285. package/src/api/evm/EVMSignTypedData.ts +3 -5
  286. package/src/api/evm/legacyV1/getAddress.ts +2 -2
  287. package/src/api/evm/legacyV1/getPublicKey.ts +2 -2
  288. package/src/api/evm/legacyV1/signMessage.ts +2 -2
  289. package/src/api/evm/legacyV1/signTypedData.ts +2 -2
  290. package/src/api/evm/legacyV1/signTypedHash.ts +2 -2
  291. package/src/api/evm/legacyV1/verifyMessage.ts +2 -2
  292. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +21 -7
  293. package/src/api/firmware/getBinary.ts +8 -3
  294. package/src/api/firmware/progressThrottle.ts +44 -0
  295. package/src/api/helpers/batchGetPublickeys.ts +2 -2
  296. package/src/api/helpers/filesystemValidation.ts +61 -0
  297. package/src/api/helpers/paramsValidator.ts +1 -1
  298. package/src/api/helpers/protocolV2FileWrite.ts +193 -0
  299. package/src/api/index.ts +14 -20
  300. package/src/api/kaspa/KaspaSignTransaction.ts +341 -22
  301. package/src/api/kaspa/helpers/TransferSerialize.ts +14 -0
  302. package/src/api/nervos/NervosSignTransaction.ts +2 -2
  303. package/src/api/nexa/NexaSignTransaction.ts +1 -1
  304. package/src/api/protocol-v2/{FactoryGetDeviceInfo.ts → DeviceFactoryInfoGet.ts} +4 -4
  305. package/src/api/protocol-v2/DeviceFactoryInfoSet.ts +32 -0
  306. package/src/api/protocol-v2/DeviceFirmwareUpdate.ts +7 -9
  307. package/src/api/protocol-v2/DeviceGetFirmwareUpdateStatus.ts +41 -6
  308. package/src/api/protocol-v2/DeviceGetOnboardingStatus.ts +6 -4
  309. package/src/api/protocol-v2/DeviceInfoGet.ts +145 -0
  310. package/src/api/protocol-v2/DeviceReboot.ts +5 -3
  311. package/src/api/protocol-v2/DeviceStatusGet.ts +16 -0
  312. package/src/api/protocol-v2/DeviceUploadWallpaper.ts +131 -0
  313. package/src/api/protocol-v2/FilesystemFormat.ts +5 -2
  314. package/src/api/protocol-v2/{FilesystemFixPermission.ts → FilesystemPermissionFix.ts} +3 -3
  315. package/src/api/protocol-v2/Ping.ts +1 -1
  316. package/src/api/protocol-v2/{GetProtoVersion.ts → ProtocolInfoRequest.ts} +3 -3
  317. package/src/api/protocol-v2/helpers.ts +58 -62
  318. package/src/api/ton/TonSignData.ts +1 -5
  319. package/src/api/utils.ts +7 -3
  320. package/src/constants/index.ts +7 -1
  321. package/src/core/RequestQueue.ts +1 -0
  322. package/src/core/deviceEventRegistration.ts +23 -0
  323. package/src/core/index.ts +140 -35
  324. package/src/data/messages/messages-protocol-v2.json +825 -709
  325. package/src/data/messages/messages.json +286 -1
  326. package/src/data-manager/DataManager.ts +13 -6
  327. package/src/data-manager/connectSettings.ts +4 -0
  328. package/src/device/Device.ts +480 -192
  329. package/src/device/DeviceCommands.ts +81 -25
  330. package/src/device/DeviceFeaturesState.ts +25 -0
  331. package/src/device/DevicePool.ts +67 -19
  332. package/src/device/DeviceStateMapper.ts +349 -0
  333. package/src/device/DeviceStateProjector.ts +95 -0
  334. package/src/device/DeviceStateStore.ts +201 -0
  335. package/src/device/DeviceWalletSessionStore.ts +105 -0
  336. package/src/device/cloneDeviceState.ts +39 -0
  337. package/src/device/deviceIdentity.ts +18 -0
  338. package/src/deviceProfile/buildDeviceFeatures.ts +235 -210
  339. package/src/deviceProfile/index.ts +0 -1
  340. package/src/events/device.ts +17 -1
  341. package/src/events/logBlockEvent.ts +8 -1
  342. package/src/events/ui-request.ts +24 -2
  343. package/src/inject.ts +23 -34
  344. package/src/protocols/protocol-v2/deviceSession.ts +24 -0
  345. package/src/protocols/protocol-v2/features.ts +68 -82
  346. package/src/protocols/protocol-v2/firmware.ts +12 -36
  347. package/src/protocols/protocol-v2/index.ts +3 -1
  348. package/src/protocols/protocol-v2/lockedError.ts +10 -0
  349. package/src/protocols/protocol-v2/settingsUnlockPolicy.ts +61 -0
  350. package/src/protocols/protocol-v2/uiInteraction.ts +210 -0
  351. package/src/protocols/protocol-v2/unlockRetry.ts +76 -0
  352. package/src/protocols/protocol-v2/walletSession.ts +107 -0
  353. package/src/types/api/checkAllFirmwareRelease.ts +1 -2
  354. package/src/types/api/deviceSettings.ts +26 -2
  355. package/src/types/api/deviceUnlock.ts +5 -2
  356. package/src/types/api/firmwareUpdate.ts +28 -20
  357. package/src/types/api/getDeviceState.ts +19 -0
  358. package/src/types/api/getFeatures.ts +3 -0
  359. package/src/types/api/getOnekeyFeatures.ts +3 -0
  360. package/src/types/api/getPassphraseState.ts +8 -11
  361. package/src/types/api/index.ts +30 -53
  362. package/src/types/api/kaspaSignTransaction.ts +40 -2
  363. package/src/types/api/openWalletSession.ts +64 -0
  364. package/src/types/api/protocolV2.ts +58 -55
  365. package/src/types/api/sessionCache.ts +14 -0
  366. package/src/types/device.ts +170 -4
  367. package/src/types/params.ts +4 -0
  368. package/src/types/settings.ts +42 -30
  369. package/src/utils/assets.ts +4 -1
  370. package/src/utils/deviceFeaturesCompat.ts +173 -0
  371. package/src/utils/deviceFeaturesUtils.ts +68 -24
  372. package/src/utils/deviceInfoUtils.ts +26 -64
  373. package/src/utils/deviceSettings.ts +161 -39
  374. package/src/utils/deviceVersionUtils.ts +25 -44
  375. package/src/utils/findDefectiveBatchDevice.ts +3 -3
  376. package/src/utils/homescreen.ts +10 -0
  377. package/src/utils/index.ts +21 -1
  378. package/src/utils/networkUtils.ts +270 -14
  379. package/src/utils/pro2Wallpaper.ts +109 -0
  380. package/src/utils/tracing.ts +3 -1
  381. package/dist/api/GetDeviceInfo.d.ts +0 -9
  382. package/dist/api/GetDeviceInfo.d.ts.map +0 -1
  383. package/dist/api/protocol-v2/DevReboot.d.ts +0 -7
  384. package/dist/api/protocol-v2/DevReboot.d.ts.map +0 -1
  385. package/dist/api/protocol-v2/DeviceGetDeviceInfo.d.ts +0 -29
  386. package/dist/api/protocol-v2/DeviceGetDeviceInfo.d.ts.map +0 -1
  387. package/dist/api/protocol-v2/FactoryDeviceInfoSettings.d.ts +0 -7
  388. package/dist/api/protocol-v2/FactoryDeviceInfoSettings.d.ts.map +0 -1
  389. package/dist/api/protocol-v2/FactoryGetDeviceInfo.d.ts +0 -6
  390. package/dist/api/protocol-v2/FactoryGetDeviceInfo.d.ts.map +0 -1
  391. package/dist/api/protocol-v2/FilesystemDiskControl.d.ts +0 -13
  392. package/dist/api/protocol-v2/FilesystemDiskControl.d.ts.map +0 -1
  393. package/dist/api/protocol-v2/FilesystemFixPermission.d.ts.map +0 -1
  394. package/dist/api/protocol-v2/GetProtoVersion.d.ts +0 -6
  395. package/dist/api/protocol-v2/GetProtoVersion.d.ts.map +0 -1
  396. package/dist/deviceProfile/buildDeviceProfile.d.ts +0 -21
  397. package/dist/deviceProfile/buildDeviceProfile.d.ts.map +0 -1
  398. package/dist/types/api/getDeviceInfo.d.ts +0 -85
  399. package/dist/types/api/getDeviceInfo.d.ts.map +0 -1
  400. package/src/api/GetDeviceInfo.ts +0 -145
  401. package/src/api/protocol-v2/DevReboot.ts +0 -24
  402. package/src/api/protocol-v2/DeviceGetDeviceInfo.ts +0 -118
  403. package/src/api/protocol-v2/FactoryDeviceInfoSettings.ts +0 -29
  404. package/src/api/protocol-v2/FilesystemDiskControl.ts +0 -50
  405. package/src/deviceProfile/buildDeviceProfile.ts +0 -334
  406. package/src/types/api/getDeviceInfo.ts +0 -99
@@ -5,6 +5,7 @@ import type { Cancel } from '@onekeyfe/hd-transport';
5
5
  export default class DeviceCancel extends BaseMethod<Cancel> {
6
6
  init() {
7
7
  this.useDevicePassphraseState = false;
8
+ this.unlockPolicy = 'none';
8
9
  }
9
10
 
10
11
  async run() {
@@ -1,10 +1,14 @@
1
+ import { DeviceSettingsPage } from '@onekeyfe/hd-transport';
2
+
1
3
  import { BaseMethod } from '../BaseMethod';
2
4
  import { validateParams } from '../helpers/paramsValidator';
5
+ import { invalidParameter } from '../helpers/filesystemValidation';
3
6
 
4
7
  import type { ChangePin } from '@onekeyfe/hd-transport';
5
8
 
6
9
  export default class DeviceChangePin extends BaseMethod<ChangePin> {
7
10
  init() {
11
+ this.unlockPolicy = 'retry-on-locked';
8
12
  this.useDevicePassphraseState = false;
9
13
 
10
14
  // check payload
@@ -13,9 +17,29 @@ export default class DeviceChangePin extends BaseMethod<ChangePin> {
13
17
  this.params = {
14
18
  remove: this.payload.remove,
15
19
  };
20
+ this.protocolV2UiInteraction = {
21
+ request: 'button',
22
+ source: 'method-lifecycle',
23
+ reason: 'change-pin',
24
+ completion: 'operation-completed',
25
+ deviceOnly: true,
26
+ page: DeviceSettingsPage.DevicePinChange,
27
+ };
16
28
  }
17
29
 
18
30
  async run() {
31
+ if (this.device.isProtocolV2()) {
32
+ if (this.params.remove) {
33
+ throw invalidParameter(
34
+ 'Parameter [remove=true] is not supported by the Pro2 device PIN page.'
35
+ );
36
+ }
37
+ const res = await this.device.commands.typedCall('DeviceSettingsPageShow', 'Success', {
38
+ page: DeviceSettingsPage.DevicePinChange,
39
+ });
40
+ return Promise.resolve(res.message);
41
+ }
42
+
19
43
  const res = await this.device.commands.typedCall('ChangePin', 'Success', {
20
44
  ...this.params,
21
45
  });
@@ -5,12 +5,11 @@ import { UI_REQUEST } from '../../constants/ui-request';
5
5
  import { BaseMethod } from '../BaseMethod';
6
6
  import { getSysResourceBinary } from '../firmware/getBinary';
7
7
  import { updateResources } from '../firmware/uploadFirmware';
8
- import { getDeviceFirmwareVersion, getFirmwareType } from '../../utils';
9
8
  import { createUiMessage } from '../../events/ui-request';
10
9
  import { DataManager } from '../../data-manager';
11
10
 
12
11
  import type { Deferred } from '@onekeyfe/hd-shared';
13
- import type { Features, KnownDevice } from '../../types';
12
+ import type { KnownDevice } from '../../types';
14
13
  import type { DeviceFullyUploadResourceParams } from '../../types/api/deviceFullyUploadResource';
15
14
 
16
15
  export default class DeviceFullyUploadResource extends BaseMethod {
@@ -33,12 +32,12 @@ export default class DeviceFullyUploadResource extends BaseMethod {
33
32
  );
34
33
  };
35
34
 
36
- isSupportResourceUpdate(features: Features, updateType: string) {
35
+ isSupportResourceUpdate(updateType: string) {
37
36
  if (updateType !== 'firmware') return false;
38
37
 
39
38
  const deviceType = this.device.getCurrentDeviceType();
40
39
  const isTouchMode = deviceType === EDeviceType.Touch || deviceType === EDeviceType.Pro;
41
- const currentVersion = getDeviceFirmwareVersion(features).join('.');
40
+ const currentVersion = this.device.getCurrentFirmwareVersionString() ?? '0.0.0';
42
41
 
43
42
  return isTouchMode && semver.gte(currentVersion, '3.4.0');
44
43
  }
@@ -49,7 +48,7 @@ export default class DeviceFullyUploadResource extends BaseMethod {
49
48
 
50
49
  const payload = this.payload as DeviceFullyUploadResourceParams;
51
50
 
52
- const deviceFirmwareType = getFirmwareType(features);
51
+ const deviceFirmwareType = device.getCurrentFirmwareType();
53
52
  const firmwareType = payload.firmwareType ?? deviceFirmwareType;
54
53
 
55
54
  if (!device.isBootloader() && features) {
@@ -5,6 +5,7 @@ import type { LockDevice } from '@onekeyfe/hd-transport';
5
5
  export default class DeviceLock extends BaseMethod<LockDevice> {
6
6
  init() {
7
7
  this.useDevicePassphraseState = false;
8
+ this.unlockPolicy = 'none';
8
9
  }
9
10
 
10
11
  async run() {
@@ -1,4 +1,4 @@
1
- import { DevRebootType } from '@onekeyfe/hd-transport';
1
+ import { DeviceRebootType } from '@onekeyfe/hd-transport';
2
2
 
3
3
  import { BaseMethod } from '../BaseMethod';
4
4
 
@@ -23,11 +23,12 @@ export default class DeviceRebootToBoardloader extends BaseMethod<RebootToBoardl
23
23
  }
24
24
 
25
25
  async run() {
26
- // Protocol V2 submodule firmware uses DevReboot with reboot_type enum.
26
+ // Protocol V2 submodule firmware uses DeviceReboot with reboot_type enum.
27
27
  if (this.device.isProtocolV2()) {
28
- const res = await this.device.commands.typedCall('DevReboot', 'Success', {
29
- reboot_type: DevRebootType.Boardloader,
28
+ const res = await this.device.commands.typedCall('DeviceReboot', 'Success', {
29
+ reboot_type: DeviceRebootType.Romloader,
30
30
  });
31
+ this.device.markProtocolV2Reboot(DeviceRebootType.Romloader);
31
32
  return Promise.resolve(res.message);
32
33
  }
33
34
 
@@ -1,4 +1,4 @@
1
- import { DevRebootType } from '@onekeyfe/hd-transport';
1
+ import { DeviceRebootType } from '@onekeyfe/hd-transport';
2
2
 
3
3
  import { BaseMethod } from '../BaseMethod';
4
4
 
@@ -23,11 +23,12 @@ export default class DeviceRebootToBootloader extends BaseMethod<RebootToBootloa
23
23
  }
24
24
 
25
25
  async run() {
26
- // Protocol V2 submodule firmware uses DevReboot with reboot_type enum.
26
+ // Protocol V2 submodule firmware uses DeviceReboot with reboot_type enum.
27
27
  if (this.device.isProtocolV2()) {
28
- const res = await this.device.commands.typedCall('DevReboot', 'Success', {
29
- reboot_type: DevRebootType.Bootloader,
28
+ const res = await this.device.commands.typedCall('DeviceReboot', 'Success', {
29
+ reboot_type: DeviceRebootType.Bootloader,
30
30
  });
31
+ this.device.markProtocolV2Reboot(DeviceRebootType.Bootloader);
31
32
  return Promise.resolve(res.message);
32
33
  }
33
34
 
@@ -1,10 +1,76 @@
1
1
  import { HardwareErrorCode, TypedError } from '@onekeyfe/hd-shared';
2
+ import { DeviceSettingsPage } from '@onekeyfe/hd-transport';
2
3
 
3
4
  import { BaseMethod } from '../BaseMethod';
5
+ import { invalidParameter } from '../helpers/filesystemValidation';
4
6
  import { validateParams } from '../helpers/paramsValidator';
5
- import { LANGUAGE_LABELS } from '../../utils/deviceSettings';
7
+ import {
8
+ mapApplySettingsToState,
9
+ mapCommonSettingsToProtocolV2,
10
+ mapDeviceSettingsToState,
11
+ } from '../../device/DeviceStateMapper';
12
+ import { getProtocolV2SettingsBehavior } from '../../protocols/protocol-v2/settingsUnlockPolicy';
13
+ import {
14
+ DEVICE_SETTINGS_V1_ONLY_FIELDS,
15
+ DEVICE_SETTINGS_V2_ONLY_FIELDS,
16
+ LANGUAGE_LABELS,
17
+ getDeviceSettingsCapabilities,
18
+ } from '../../utils/deviceSettings';
6
19
 
7
20
  import type { ApplySettings } from '@onekeyfe/hd-transport';
21
+ import type { DeviceSettingsParams } from '../../types/api/deviceSettings';
22
+
23
+ const assertSettingsSupported = (
24
+ payload: DeviceSettingsParams,
25
+ unsupported: readonly (keyof DeviceSettingsParams)[],
26
+ protocol: 'Protocol V1' | 'Protocol V2'
27
+ ) => {
28
+ const provided = unsupported.filter(key => payload[key] !== undefined);
29
+ if (provided.length > 0) {
30
+ throw invalidParameter(`${protocol} does not support settings: ${provided.join(', ')}.`);
31
+ }
32
+ };
33
+
34
+ const assertProtocolV2SettingValues = (
35
+ payload: DeviceSettingsParams,
36
+ capabilities: ReturnType<typeof getDeviceSettingsCapabilities>
37
+ ) => {
38
+ const brightnessRange = capabilities.ranges.brightness;
39
+ if (
40
+ payload.brightness !== undefined &&
41
+ brightnessRange &&
42
+ (payload.brightness < brightnessRange.min || payload.brightness > brightnessRange.max)
43
+ ) {
44
+ throw invalidParameter(
45
+ `Protocol V2 brightness must be between ${brightnessRange.min} and ${brightnessRange.max}.`
46
+ );
47
+ }
48
+
49
+ const delayFields = [
50
+ ['autoLockDelayMs', capabilities.autoLockDelayOptions],
51
+ ['autoShutdownDelayMs', capabilities.autoShutdownDelayOptions],
52
+ ] as const;
53
+ delayFields.forEach(([field, options]) => {
54
+ const value = payload[field];
55
+ if (value !== undefined && !options.some(option => option.valueMs === value)) {
56
+ throw invalidParameter(
57
+ `Protocol V2 ${field} must be one of: ${options.map(option => option.valueMs).join(', ')}.`
58
+ );
59
+ }
60
+ });
61
+ };
62
+
63
+ const settingsPageForPayload = (
64
+ payload: DeviceSettingsParams
65
+ ): DeviceSettingsPage.DevicePassphrase | DeviceSettingsPage.DeviceAirgap | undefined => {
66
+ if (payload.usePassphrase !== undefined) {
67
+ return DeviceSettingsPage.DevicePassphrase;
68
+ }
69
+ if (payload.airgapMode !== undefined) {
70
+ return DeviceSettingsPage.DeviceAirgap;
71
+ }
72
+ return undefined;
73
+ };
8
74
 
9
75
  export default class DeviceSettings extends BaseMethod<ApplySettings> {
10
76
  init() {
@@ -24,7 +90,16 @@ export default class DeviceSettings extends BaseMethod<ApplySettings> {
24
90
  { name: 'experimentalFeatures', type: 'boolean' },
25
91
  { name: 'autoShutdownDelayMs', type: 'number' },
26
92
  { name: 'changeBrightness', type: 'boolean' },
93
+ { name: 'brightness', type: 'number' },
27
94
  { name: 'hapticFeedback', type: 'boolean' },
95
+ { name: 'bluetoothEnabled', type: 'boolean' },
96
+ { name: 'airgapMode', type: 'boolean' },
97
+ { name: 'animationEnabled', type: 'boolean' },
98
+ { name: 'tapToWake', type: 'boolean' },
99
+ { name: 'deviceNameDisplayEnabled', type: 'boolean' },
100
+ { name: 'fidoEnabled', type: 'boolean' },
101
+ { name: 'usbLockEnabled', type: 'boolean' },
102
+ { name: 'randomKeypad', type: 'boolean' },
28
103
  ]);
29
104
 
30
105
  // init params
@@ -40,11 +115,34 @@ export default class DeviceSettings extends BaseMethod<ApplySettings> {
40
115
  safety_checks: this.payload.safetyChecks,
41
116
  experimental_features: this.payload.experimentalFeatures,
42
117
  auto_shutdown_delay_ms: this.payload.autoShutdownDelayMs,
118
+ use_ble: this.payload.bluetoothEnabled,
43
119
  ...(this.payload.changeBrightness
44
120
  ? { change_brightness: this.payload.changeBrightness }
45
121
  : undefined),
46
122
  haptic_feedback: this.payload.hapticFeedback,
47
123
  };
124
+ const page = settingsPageForPayload(this.payload);
125
+ const directSettings = mapCommonSettingsToProtocolV2(this.payload);
126
+ const hasConflictingPages =
127
+ this.payload.usePassphrase !== undefined && this.payload.airgapMode !== undefined;
128
+ const combinesPageWithDirectSettings =
129
+ page !== undefined && Object.keys(directSettings).length > 0;
130
+ if (hasConflictingPages || combinesPageWithDirectSettings) {
131
+ // V1 may still accept passphrase plus direct settings. Suppress only the
132
+ // Protocol V2 pre-run interaction; run() returns the protocol-specific error.
133
+ this.unlockPolicy = 'none';
134
+ this.protocolV2UiInteraction = undefined;
135
+ return;
136
+ }
137
+ const behavior =
138
+ page === undefined
139
+ ? getProtocolV2SettingsBehavior({
140
+ kind: 'direct',
141
+ settings: directSettings,
142
+ })
143
+ : getProtocolV2SettingsBehavior({ kind: 'page', page });
144
+ this.unlockPolicy = behavior.unlockPolicy;
145
+ this.protocolV2UiInteraction = behavior.uiInteraction;
48
146
  }
49
147
 
50
148
  getVersionRange() {
@@ -60,9 +158,93 @@ export default class DeviceSettings extends BaseMethod<ApplySettings> {
60
158
 
61
159
  async run() {
62
160
  try {
161
+ if (this.device.isProtocolV2()) {
162
+ assertSettingsSupported(this.payload, DEVICE_SETTINGS_V1_ONLY_FIELDS, 'Protocol V2');
163
+ const capabilities = getDeviceSettingsCapabilities(
164
+ this.device.getCurrentDeviceType(),
165
+ 'V2'
166
+ );
167
+ assertProtocolV2SettingValues(this.payload, capabilities);
168
+ const settings = mapCommonSettingsToProtocolV2(this.payload);
169
+ const requestedPassphrase = this.payload.usePassphrase;
170
+ const requestedAirgap = this.payload.airgapMode;
171
+ const hasPassphrasePage = requestedPassphrase !== undefined;
172
+ const hasAirgapPage = requestedAirgap !== undefined;
173
+
174
+ if (hasPassphrasePage && hasAirgapPage) {
175
+ throw invalidParameter(
176
+ 'Protocol V2 passphrase and air-gap settings must be changed in separate calls.'
177
+ );
178
+ }
179
+ if ((hasPassphrasePage || hasAirgapPage) && Object.keys(settings).length > 0) {
180
+ throw invalidParameter(
181
+ 'Protocol V2 on-device settings must not be combined with direct settings.'
182
+ );
183
+ }
184
+ if (requestedPassphrase !== undefined) {
185
+ const current = await this.device.getDeviceState({ refreshSections: ['status'] });
186
+ if (current.status.passphraseProtection === requestedPassphrase) {
187
+ return { message: 'Settings already match requested value.' };
188
+ }
189
+
190
+ const res = await this.device.commands.typedCall('DeviceSettingsPageShow', 'Success', {
191
+ page: DeviceSettingsPage.DevicePassphrase,
192
+ });
193
+ const updated = await this.device.getDeviceState({ refreshSections: ['status'] });
194
+ if (updated.status.passphraseProtection !== requestedPassphrase) {
195
+ throw TypedError(
196
+ HardwareErrorCode.RuntimeError,
197
+ 'Protocol V2 passphrase setting did not reach the requested value.'
198
+ );
199
+ }
200
+ return res.message;
201
+ }
202
+ if (requestedAirgap !== undefined) {
203
+ const current = await this.device.getDeviceState({ refreshSections: ['settings'] });
204
+ if (current.settings.airgapMode === requestedAirgap) {
205
+ return { message: 'Settings already match requested value.' };
206
+ }
207
+
208
+ const res = await this.device.commands.typedCall('DeviceSettingsPageShow', 'Success', {
209
+ page: DeviceSettingsPage.DeviceAirgap,
210
+ });
211
+ const updated = await this.device.getDeviceState({ refreshSections: ['settings'] });
212
+ if (updated.settings.airgapMode !== requestedAirgap) {
213
+ throw TypedError(
214
+ HardwareErrorCode.RuntimeError,
215
+ 'Protocol V2 air-gap setting did not reach the requested value.'
216
+ );
217
+ }
218
+ return res.message;
219
+ }
220
+ if (Object.keys(settings).length === 0) {
221
+ throw invalidParameter('No Protocol V2 compatible setting provided.');
222
+ }
223
+
224
+ const res = await this.device.commands.typedCall('DeviceSettingsSet', 'Success', {
225
+ settings,
226
+ });
227
+ this.device.updateState(mapDeviceSettingsToState(settings), 'settings-write');
228
+ return res.message;
229
+ }
230
+
231
+ assertSettingsSupported(this.payload, DEVICE_SETTINGS_V2_ONLY_FIELDS, 'Protocol V1');
232
+ const capabilities = getDeviceSettingsCapabilities(this.device.getCurrentDeviceType(), 'V1');
233
+ if (
234
+ this.payload.safetyChecks !== undefined &&
235
+ !capabilities.safetyCheckOptions.some(option => option.value === this.payload.safetyChecks)
236
+ ) {
237
+ throw invalidParameter(
238
+ `Protocol V1 safetyChecks must be one of: ${capabilities.safetyCheckOptions
239
+ .map(option => option.value)
240
+ .join(', ')}.`
241
+ );
242
+ }
243
+
63
244
  const res = await this.device.commands.typedCall('ApplySettings', 'Success', {
64
245
  ...this.params,
65
246
  });
247
+ this.device.updateState(mapApplySettingsToState(this.params), 'settings-write');
66
248
  return res.message;
67
249
  } catch (error) {
68
250
  if (error.message?.toLowerCase().includes('no setting provided')) {
@@ -5,9 +5,19 @@ import type { LockDevice } from '@onekeyfe/hd-transport';
5
5
  export default class DeviceUnlock extends BaseMethod<LockDevice> {
6
6
  init() {
7
7
  this.useDevicePassphraseState = false;
8
+ this.unlockPolicy = 'none';
9
+ this.protocolV2UiInteraction = {
10
+ request: 'pin',
11
+ source: 'method-lifecycle',
12
+ reason: 'device-unlock',
13
+ completion: 'operation-completed',
14
+ deviceOnly: true,
15
+ operation: 'unlock-device',
16
+ };
8
17
  }
9
18
 
10
19
  async run() {
11
- return this.device.unlockDevice();
20
+ await this.device.unlockDevice();
21
+ return this.device.getDeviceState();
12
22
  }
13
23
  }
@@ -9,7 +9,6 @@ import { updateBootloader } from '../firmware/uploadFirmware';
9
9
  import { DeviceModelToTypes } from '../../types';
10
10
  import { DataManager } from '../../data-manager';
11
11
  import { checkBootloaderLength } from '../firmware/updateBootloader';
12
- import { getFirmwareType } from '../../utils';
13
12
 
14
13
  import type { DeviceUpdateBootloaderParams } from '../../types/api/deviceUpdateBootloader';
15
14
  import type { EFirmwareType } from '@onekeyfe/hd-shared';
@@ -99,7 +98,7 @@ export default class DeviceUpdateBootloader extends FirmwareUpdateBaseMethod<any
99
98
  const payload = this.payload as DeviceUpdateBootloaderParams;
100
99
 
101
100
  const deviceType = device.getCurrentDeviceType();
102
- const deviceFirmwareType = getFirmwareType(features);
101
+ const deviceFirmwareType = device.getCurrentFirmwareType();
103
102
  const firmwareType = payload.firmwareType ?? deviceFirmwareType;
104
103
 
105
104
  if (DeviceModelToTypes.model_touch.includes(deviceType)) {
@@ -1,13 +1,32 @@
1
+ import { DeviceSettingsPage } from '@onekeyfe/hd-transport';
2
+
1
3
  import { BaseMethod } from '../BaseMethod';
2
4
 
3
5
  import type { WipeDevice } from '@onekeyfe/hd-transport';
4
6
 
5
7
  export default class DeviceWipe extends BaseMethod<WipeDevice> {
6
8
  init() {
9
+ this.unlockPolicy = 'retry-on-locked';
7
10
  this.useDevicePassphraseState = false;
11
+ this.protocolV2UiInteraction = {
12
+ request: 'button',
13
+ source: 'method-lifecycle',
14
+ reason: 'device-management',
15
+ completion: 'operation-completed',
16
+ deviceOnly: true,
17
+ page: DeviceSettingsPage.DeviceReset,
18
+ operation: 'wipe-device',
19
+ };
8
20
  }
9
21
 
10
22
  async run() {
23
+ if (this.device.isProtocolV2()) {
24
+ const res = await this.device.commands.typedCall('DeviceSettingsPageShow', 'Success', {
25
+ page: DeviceSettingsPage.DeviceReset,
26
+ });
27
+ return Promise.resolve(res.message);
28
+ }
29
+
11
30
  const res = await this.device.commands.typedCall('WipeDevice', 'Success');
12
31
 
13
32
  return Promise.resolve(res.message);
@@ -32,9 +32,8 @@ import type {
32
32
  } from '@onekeyfe/hd-transport';
33
33
 
34
34
  /**
35
- * EthereumTypedDataStructAckOneKey EthereumTypedDataStructAck 的字段结构与
36
- * 枚举数值完全一致(生成产物的 OneKey/Trezor 双份消息),仅枚举名义类型不同;
37
- * 这里做无运行时成本的名义转换,避免在调用点散落 any。
35
+ * EthereumTypedDataStructAckOneKey and EthereumTypedDataStructAck have identical
36
+ * fields and enum values. This zero-cost nominal conversion avoids scattered `any`.
38
37
  */
39
38
  const toOneKeyStructAck = (ack: EthereumTypedDataStructAck): EthereumTypedDataStructAckOneKey =>
40
39
  ack as unknown as EthereumTypedDataStructAckOneKey;
@@ -227,8 +226,7 @@ export default class EVMSignTypedData extends BaseMethod<EVMSignTypedDataParams>
227
226
  if (response.type === 'EthereumGnosisSafeTxRequest') {
228
227
  const { data } = this.params;
229
228
  const verifyingContract = data.domain?.verifyingContract;
230
- // EthereumGnosisSafeTxAck.verifyingContract proto 中是 required 字段,
231
- // Gnosis Safe 签名缺少 verifyingContract 没有意义,这里给出明确的参数错误。
229
+ // verifyingContract is required by proto and essential to a Gnosis Safe signature.
232
230
  if (!verifyingContract) {
233
231
  throw ERRORS.TypedError(
234
232
  HardwareErrorCode.CallMethodInvalidParameter,
@@ -7,8 +7,8 @@ export default async function ({
7
7
  typedCall: TypedCall;
8
8
  param: EthereumGetAddressOneKey;
9
9
  }): Promise<MessageResponse<'EthereumAddress'>> {
10
- // legacy EthereumGetAddress 的生成类型没有 chain_id 字段,但旧固件按 OneKey 扩展
11
- // 接受该字段;通过预先声明的对象(非 fresh literal)携带额外字段,保持原有运行时行为。
10
+ // The generated legacy type omits chain_id, but old firmware accepts the OneKey
11
+ // extension. A non-fresh object preserves that runtime field without a type cast.
12
12
  const message = {
13
13
  address_n: param.address_n,
14
14
  show_display: param.show_display,
@@ -11,8 +11,8 @@ export default async function ({
11
11
  typedCall: TypedCall;
12
12
  param: EthereumGetPublicKeyOneKey;
13
13
  }): Promise<MessageResponse<'EthereumPublicKey'>> {
14
- // legacy EthereumGetPublicKey 的生成类型没有 chain_id 字段,但旧固件按 OneKey 扩展
15
- // 接受该字段;通过预先声明的对象(非 fresh literal)携带额外字段,保持原有运行时行为。
14
+ // The generated legacy type omits chain_id, but old firmware accepts the OneKey
15
+ // extension. A non-fresh object preserves that runtime field without a type cast.
16
16
  const message = {
17
17
  address_n: param.address_n,
18
18
  show_display: param.show_display,
@@ -11,8 +11,8 @@ export default async function ({
11
11
  typedCall: TypedCall;
12
12
  params: EthereumSignMessageOneKey;
13
13
  }): Promise<EthereumMessageSignature> {
14
- // legacy EthereumSignMessage 的生成类型没有 chain_id 字段,但旧固件按 OneKey 扩展
15
- // 接受该字段;通过预先声明的对象(非 fresh literal)携带额外字段,保持原有运行时行为。
14
+ // The generated legacy type omits chain_id, but old firmware accepts the OneKey
15
+ // extension. A non-fresh object preserves that runtime field without a type cast.
16
16
  const message = {
17
17
  address_n: params.address_n,
18
18
  message: params.message,
@@ -16,8 +16,8 @@ export const signTypedData = async ({
16
16
  }) => {
17
17
  const { primaryType }: EthereumSignTypedDataMessage<EthereumSignTypedDataTypes> = data;
18
18
 
19
- // legacy EthereumSignTypedData 的生成类型没有 chain_id 字段,但旧固件按 OneKey 扩展
20
- // 接受该字段;通过预先声明的对象(非 fresh literal)携带额外字段,保持原有运行时行为。
19
+ // The generated legacy type omits chain_id, but old firmware accepts the OneKey
20
+ // extension. A non-fresh object preserves that runtime field without a type cast.
21
21
  const message = {
22
22
  address_n: addressN,
23
23
  primary_type: primaryType as string,
@@ -38,8 +38,8 @@ export const signTypedHash = async ({
38
38
  }
39
39
  }
40
40
 
41
- // legacy EthereumSignTypedHash 的生成类型没有 chain_id 字段,但旧固件按 OneKey 扩展
42
- // 接受该字段;通过预先声明的对象(非 fresh literal)携带额外字段,保持原有运行时行为。
41
+ // The generated legacy type omits chain_id, but old firmware accepts the OneKey
42
+ // extension. A non-fresh object preserves that runtime field without a type cast.
43
43
  const message = {
44
44
  address_n: addressN,
45
45
  domain_separator_hash: domainHash ?? '',
@@ -7,8 +7,8 @@ export default async function ({
7
7
  typedCall: TypedCall;
8
8
  params: EthereumVerifyMessageOneKey;
9
9
  }): Promise<Success> {
10
- // legacy EthereumVerifyMessage 的生成类型没有 chain_id 字段,但旧固件按 OneKey 扩展
11
- // 接受该字段;通过预先声明的对象(非 fresh literal)携带额外字段,保持原有运行时行为。
10
+ // The generated legacy type omits chain_id, but old firmware accepts the OneKey
11
+ // extension. A non-fresh object preserves that runtime field without a type cast.
12
12
  const message = {
13
13
  signature: params.signature,
14
14
  message: params.message,
@@ -8,11 +8,12 @@ import {
8
8
 
9
9
  import { FirmwareUpdateTipMessage, UI_REQUEST, createUiMessage } from '../../events/ui-request';
10
10
  import { DevicePool } from '../../device/DevicePool';
11
- import { LoggerNames, getDeviceUUID, getLogger, wait } from '../../utils';
11
+ import { LoggerNames, getLogger, wait } from '../../utils';
12
12
  import { DeviceModelToTypes } from '../../types';
13
13
  import { DataManager } from '../../data-manager';
14
14
  import { BaseMethod } from '../BaseMethod';
15
15
  import { DEVICE } from '../../events';
16
+ import { createFirmwareProgressThrottle } from './progressThrottle';
16
17
 
17
18
  import type {
18
19
  IFirmwareUpdateProgressType,
@@ -40,6 +41,8 @@ const isDeviceDisconnectedError = (error: unknown) => {
40
41
  export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
41
42
  checkPromise: Deferred<any> | null = null;
42
43
 
44
+ private shouldPostFirmwareProgress = createFirmwareProgressThrottle();
45
+
43
46
  init(): void {}
44
47
 
45
48
  run(): Promise<any> {
@@ -83,6 +86,10 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
83
86
  * @param progress Post the percentage of the progress
84
87
  */
85
88
  postProgressMessage = (progress: number, progressType: IFirmwareUpdateProgressType) => {
89
+ if (!this.shouldPostFirmwareProgress(progress, progressType)) {
90
+ return;
91
+ }
92
+
86
93
  this.postMessage(
87
94
  createUiMessage(UI_REQUEST.FIRMWARE_PROGRESS, {
88
95
  device: this.device.toMessageObject() as KnownDevice,
@@ -138,6 +145,8 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
138
145
  // check device goto bootloader mode
139
146
  let isFirstCheck = true;
140
147
  let checkCount = 0;
148
+ let hasPromptedWebDevice = false;
149
+ let isPromptingWebDevice = false;
141
150
  // eslint-disable-next-line prefer-const
142
151
  let timeoutTimer: ReturnType<typeof setTimeout> | undefined;
143
152
 
@@ -158,23 +167,28 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
158
167
  if (
159
168
  checkCount > 4 &&
160
169
  DataManager.isBrowserWebUsb(DataManager.getSettings('env')) &&
161
- !this.payload.skipWebDevicePrompt
170
+ !this.payload.skipWebDevicePrompt &&
171
+ !hasPromptedWebDevice &&
172
+ !isPromptingWebDevice
162
173
  ) {
163
- clearInterval(intervalTimer);
164
- clearTimeout(timeoutTimer);
165
-
174
+ isPromptingWebDevice = true;
166
175
  try {
167
176
  this.postTipMessage(FirmwareUpdateTipMessage.SelectDeviceInBootloaderForWebDevice);
168
177
  const confirmed = await this._promptDeviceInBootloaderForWebDevice();
178
+ hasPromptedWebDevice = true;
169
179
  if (confirmed) {
170
180
  await this._checkDeviceInBootloaderMode(connectId, intervalTimer, timeoutTimer);
171
181
  }
172
182
  } catch (e) {
183
+ clearInterval(intervalTimer);
184
+ clearTimeout(timeoutTimer);
173
185
  Log.log(
174
186
  'FirmwareUpdateBaseMethod [checkDeviceToBootloader] _promptDeviceInBootloaderForWebDevice failed: ',
175
187
  e
176
188
  );
177
189
  this.checkPromise?.reject(e);
190
+ } finally {
191
+ isPromptingWebDevice = false;
178
192
  }
179
193
  return;
180
194
  }
@@ -237,7 +251,7 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
237
251
  async enterBootloaderMode() {
238
252
  const typedCall = this.device.getCommands().typedCall.bind(this.device.getCommands());
239
253
  if (this.device.features && !this.device.isBootloader()) {
240
- const uuid = getDeviceUUID(this.device.features);
254
+ const serialNo = this.device.getCurrentSerialNo();
241
255
  const deviceType = this.device.getCurrentDeviceType();
242
256
  // auto go to bootloader mode
243
257
  try {
@@ -252,7 +266,7 @@ export class FirmwareUpdateBaseMethod<Params> extends BaseMethod<Params> {
252
266
 
253
267
  // force clean classic device cache so that the device can initialize again
254
268
  if (DeviceModelToTypes.model_classic.includes(deviceType)) {
255
- DevicePool.clearDeviceCache(uuid);
269
+ DevicePool.clearDeviceCache(serialNo);
256
270
  }
257
271
  delete DevicePool.devicesCache[''];
258
272
  await this.checkPromise?.promise;