@onekeyfe/hd-core 1.1.27 → 1.2.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/__tests__/evmLedgerLegacySafety.test.ts +15 -4
  2. package/__tests__/evmSignTransaction.test.ts +1 -1
  3. package/__tests__/evmSignTypedData.test.ts +1 -1
  4. package/__tests__/logBlockEvent.test.ts +37 -0
  5. package/__tests__/protocol-v2.test.ts +3025 -0
  6. package/dist/api/BaseMethod.d.ts +1 -0
  7. package/dist/api/BaseMethod.d.ts.map +1 -1
  8. package/dist/api/DirList.d.ts +10 -0
  9. package/dist/api/DirList.d.ts.map +1 -0
  10. package/dist/api/DirMake.d.ts +9 -0
  11. package/dist/api/DirMake.d.ts.map +1 -0
  12. package/dist/api/DirRemove.d.ts +9 -0
  13. package/dist/api/DirRemove.d.ts.map +1 -0
  14. package/dist/api/FileDelete.d.ts +9 -0
  15. package/dist/api/FileDelete.d.ts.map +1 -0
  16. package/dist/api/FileRead.d.ts +19 -0
  17. package/dist/api/FileRead.d.ts.map +1 -0
  18. package/dist/api/FileWrite.d.ts +24 -0
  19. package/dist/api/FileWrite.d.ts.map +1 -0
  20. package/dist/api/FirmwareUpdate.d.ts.map +1 -1
  21. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  22. package/dist/api/FirmwareUpdateV3.d.ts +1 -0
  23. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  24. package/dist/api/FirmwareUpdateV4.d.ts +35 -0
  25. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -0
  26. package/dist/api/GetDeviceInfo.d.ts +9 -0
  27. package/dist/api/GetDeviceInfo.d.ts.map +1 -0
  28. package/dist/api/GetFeatures.d.ts.map +1 -1
  29. package/dist/api/GetOnekeyFeatures.d.ts.map +1 -1
  30. package/dist/api/GetPassphraseState.d.ts +6 -1
  31. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  32. package/dist/api/PathInfo.d.ts +10 -0
  33. package/dist/api/PathInfo.d.ts.map +1 -0
  34. package/dist/api/PromptWebDeviceAccess.d.ts.map +1 -1
  35. package/dist/api/SearchDevices.d.ts +2 -1
  36. package/dist/api/SearchDevices.d.ts.map +1 -1
  37. package/dist/api/alephium/AlephiumGetAddress.d.ts +2 -6
  38. package/dist/api/alephium/AlephiumGetAddress.d.ts.map +1 -1
  39. package/dist/api/alephium/AlephiumSignMessage.d.ts +2 -5
  40. package/dist/api/alephium/AlephiumSignMessage.d.ts.map +1 -1
  41. package/dist/api/alephium/AlephiumSignTransaction.d.ts +5 -8
  42. package/dist/api/alephium/AlephiumSignTransaction.d.ts.map +1 -1
  43. package/dist/api/aptos/AptosGetAddress.d.ts.map +1 -1
  44. package/dist/api/benfen/BenfenGetAddress.d.ts +2 -9
  45. package/dist/api/benfen/BenfenGetAddress.d.ts.map +1 -1
  46. package/dist/api/benfen/BenfenGetPublicKey.d.ts +2 -9
  47. package/dist/api/benfen/BenfenGetPublicKey.d.ts.map +1 -1
  48. package/dist/api/benfen/BenfenSignMessage.d.ts +2 -8
  49. package/dist/api/benfen/BenfenSignMessage.d.ts.map +1 -1
  50. package/dist/api/benfen/BenfenSignTransaction.d.ts +2 -8
  51. package/dist/api/benfen/BenfenSignTransaction.d.ts.map +1 -1
  52. package/dist/api/btc/BTCGetAddress.d.ts +1 -11
  53. package/dist/api/btc/BTCGetAddress.d.ts.map +1 -1
  54. package/dist/api/btc/BTCGetPublicKey.d.ts +1 -11
  55. package/dist/api/btc/BTCGetPublicKey.d.ts.map +1 -1
  56. package/dist/api/btc/BTCSignMessage.d.ts +1 -15
  57. package/dist/api/btc/BTCSignMessage.d.ts.map +1 -1
  58. package/dist/api/btc/BTCSignPsbt.d.ts.map +1 -1
  59. package/dist/api/btc/BTCSignTransaction.d.ts +1 -11
  60. package/dist/api/btc/BTCSignTransaction.d.ts.map +1 -1
  61. package/dist/api/btc/BTCVerifyMessage.d.ts +1 -11
  62. package/dist/api/btc/BTCVerifyMessage.d.ts.map +1 -1
  63. package/dist/api/btc/helpers/versionLimit.d.ts +2 -11
  64. package/dist/api/btc/helpers/versionLimit.d.ts.map +1 -1
  65. package/dist/api/cardano/CardanoSignTransaction.d.ts.map +1 -1
  66. package/dist/api/conflux/ConfluxSignTransaction.d.ts.map +1 -1
  67. package/dist/api/device/DeviceLock.d.ts.map +1 -1
  68. package/dist/api/device/DeviceRebootToBoardloader.d.ts +1 -1
  69. package/dist/api/device/DeviceRebootToBoardloader.d.ts.map +1 -1
  70. package/dist/api/device/DeviceRebootToBootloader.d.ts.map +1 -1
  71. package/dist/api/device/DeviceSupportFeatures.d.ts.map +1 -1
  72. package/dist/api/device/DeviceUploadResource.d.ts.map +1 -1
  73. package/dist/api/device/DeviceVerify.d.ts.map +1 -1
  74. package/dist/api/dynex/DnxGetAddress.d.ts.map +1 -1
  75. package/dist/api/dynex/DnxSignTransaction.d.ts.map +1 -1
  76. package/dist/api/evm/EVMGetPublicKey.d.ts.map +1 -1
  77. package/dist/api/evm/EVMSignMessageEIP712.d.ts +2 -8
  78. package/dist/api/evm/EVMSignMessageEIP712.d.ts.map +1 -1
  79. package/dist/api/evm/EVMSignTypedData.d.ts.map +1 -1
  80. package/dist/api/evm/latest/signTypedData.d.ts +1 -1
  81. package/dist/api/evm/latest/signTypedData.d.ts.map +1 -1
  82. package/dist/api/evm/latest/signTypedHash.d.ts.map +1 -1
  83. package/dist/api/evm/legacyV1/getAddress.d.ts.map +1 -1
  84. package/dist/api/evm/legacyV1/getPublicKey.d.ts.map +1 -1
  85. package/dist/api/evm/legacyV1/signMessage.d.ts.map +1 -1
  86. package/dist/api/evm/legacyV1/signTypedData.d.ts +1 -1
  87. package/dist/api/evm/legacyV1/signTypedData.d.ts.map +1 -1
  88. package/dist/api/evm/legacyV1/signTypedHash.d.ts.map +1 -1
  89. package/dist/api/evm/legacyV1/verifyMessage.d.ts.map +1 -1
  90. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  91. package/dist/api/helpers/batchGetPublickeys.d.ts +3 -0
  92. package/dist/api/helpers/batchGetPublickeys.d.ts.map +1 -1
  93. package/dist/api/helpers/filesystemValidation.d.ts +7 -0
  94. package/dist/api/helpers/filesystemValidation.d.ts.map +1 -0
  95. package/dist/api/index.d.ts +32 -0
  96. package/dist/api/index.d.ts.map +1 -1
  97. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  98. package/dist/api/lightning/LnurlAuth.d.ts +4 -0
  99. package/dist/api/lightning/LnurlAuth.d.ts.map +1 -1
  100. package/dist/api/neo/NeoGetAddress.d.ts +2 -8
  101. package/dist/api/neo/NeoGetAddress.d.ts.map +1 -1
  102. package/dist/api/neo/NeoSignTransaction.d.ts +2 -8
  103. package/dist/api/neo/NeoSignTransaction.d.ts.map +1 -1
  104. package/dist/api/nervos/NervosGetAddress.d.ts +2 -9
  105. package/dist/api/nervos/NervosGetAddress.d.ts.map +1 -1
  106. package/dist/api/nervos/NervosSignTransaction.d.ts +9 -12
  107. package/dist/api/nervos/NervosSignTransaction.d.ts.map +1 -1
  108. package/dist/api/nexa/NexaGetAddress.d.ts +2 -8
  109. package/dist/api/nexa/NexaGetAddress.d.ts.map +1 -1
  110. package/dist/api/nexa/NexaSignTransaction.d.ts +2 -9
  111. package/dist/api/nexa/NexaSignTransaction.d.ts.map +1 -1
  112. package/dist/api/polkadot/PolkadotGetAddress.d.ts +3 -0
  113. package/dist/api/polkadot/PolkadotGetAddress.d.ts.map +1 -1
  114. package/dist/api/polkadot/networks.d.ts +3 -0
  115. package/dist/api/polkadot/networks.d.ts.map +1 -1
  116. package/dist/api/protocol-v2/DevReboot.d.ts +7 -0
  117. package/dist/api/protocol-v2/DevReboot.d.ts.map +1 -0
  118. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts +7 -0
  119. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts.map +1 -0
  120. package/dist/api/protocol-v2/DeviceGetDeviceInfo.d.ts +29 -0
  121. package/dist/api/protocol-v2/DeviceGetDeviceInfo.d.ts.map +1 -0
  122. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts +6 -0
  123. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts.map +1 -0
  124. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts +6 -0
  125. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts.map +1 -0
  126. package/dist/api/protocol-v2/DeviceReboot.d.ts +7 -0
  127. package/dist/api/protocol-v2/DeviceReboot.d.ts.map +1 -0
  128. package/dist/api/protocol-v2/FactoryDeviceInfoSettings.d.ts +7 -0
  129. package/dist/api/protocol-v2/FactoryDeviceInfoSettings.d.ts.map +1 -0
  130. package/dist/api/protocol-v2/FactoryGetDeviceInfo.d.ts +6 -0
  131. package/dist/api/protocol-v2/FactoryGetDeviceInfo.d.ts.map +1 -0
  132. package/dist/api/protocol-v2/FilesystemDiskControl.d.ts +13 -0
  133. package/dist/api/protocol-v2/FilesystemDiskControl.d.ts.map +1 -0
  134. package/dist/api/protocol-v2/FilesystemFixPermission.d.ts +6 -0
  135. package/dist/api/protocol-v2/FilesystemFixPermission.d.ts.map +1 -0
  136. package/dist/api/protocol-v2/FilesystemFormat.d.ts +6 -0
  137. package/dist/api/protocol-v2/FilesystemFormat.d.ts.map +1 -0
  138. package/dist/api/protocol-v2/GetProtoVersion.d.ts +6 -0
  139. package/dist/api/protocol-v2/GetProtoVersion.d.ts.map +1 -0
  140. package/dist/api/protocol-v2/Ping.d.ts +8 -0
  141. package/dist/api/protocol-v2/Ping.d.ts.map +1 -0
  142. package/dist/api/protocol-v2/helpers.d.ts +34 -0
  143. package/dist/api/protocol-v2/helpers.d.ts.map +1 -0
  144. package/dist/api/scdo/ScdoGetAddress.d.ts +2 -6
  145. package/dist/api/scdo/ScdoGetAddress.d.ts.map +1 -1
  146. package/dist/api/scdo/ScdoSignMessage.d.ts +2 -5
  147. package/dist/api/scdo/ScdoSignMessage.d.ts.map +1 -1
  148. package/dist/api/scdo/ScdoSignTransaction.d.ts +2 -5
  149. package/dist/api/scdo/ScdoSignTransaction.d.ts.map +1 -1
  150. package/dist/api/solana/SolGetAddress.d.ts +1 -0
  151. package/dist/api/solana/SolGetAddress.d.ts.map +1 -1
  152. package/dist/api/solana/SolSignMessage.d.ts +3 -0
  153. package/dist/api/solana/SolSignMessage.d.ts.map +1 -1
  154. package/dist/api/solana/SolSignOffchainMessage.d.ts +3 -0
  155. package/dist/api/solana/SolSignOffchainMessage.d.ts.map +1 -1
  156. package/dist/api/solana/SolSignTransaction.d.ts +6 -0
  157. package/dist/api/solana/SolSignTransaction.d.ts.map +1 -1
  158. package/dist/api/stellar/StellarGetAddress.d.ts +2 -1
  159. package/dist/api/stellar/StellarGetAddress.d.ts.map +1 -1
  160. package/dist/api/stellar/StellarSignTransaction.d.ts +3 -2
  161. package/dist/api/stellar/StellarSignTransaction.d.ts.map +1 -1
  162. package/dist/api/sui/SuiGetAddress.d.ts +3 -0
  163. package/dist/api/sui/SuiGetAddress.d.ts.map +1 -1
  164. package/dist/api/sui/SuiGetPublicKey.d.ts +3 -0
  165. package/dist/api/sui/SuiGetPublicKey.d.ts.map +1 -1
  166. package/dist/api/sui/SuiSignMessage.d.ts +3 -0
  167. package/dist/api/sui/SuiSignMessage.d.ts.map +1 -1
  168. package/dist/api/sui/SuiSignTransaction.d.ts +5 -2
  169. package/dist/api/sui/SuiSignTransaction.d.ts.map +1 -1
  170. package/dist/api/ton/TonGetAddress.d.ts +3 -0
  171. package/dist/api/ton/TonGetAddress.d.ts.map +1 -1
  172. package/dist/api/ton/TonSignData.d.ts +5 -0
  173. package/dist/api/ton/TonSignData.d.ts.map +1 -1
  174. package/dist/api/ton/TonSignMessage.d.ts +3 -0
  175. package/dist/api/ton/TonSignMessage.d.ts.map +1 -1
  176. package/dist/api/ton/TonSignProof.d.ts +3 -0
  177. package/dist/api/ton/TonSignProof.d.ts.map +1 -1
  178. package/dist/api/tron/TronSignMessage.d.ts +4 -0
  179. package/dist/api/tron/TronSignMessage.d.ts.map +1 -1
  180. package/dist/api/tron/TronSignTransaction.d.ts +4 -0
  181. package/dist/api/tron/TronSignTransaction.d.ts.map +1 -1
  182. package/dist/core/index.d.ts.map +1 -1
  183. package/dist/data-manager/DataManager.d.ts +7 -4
  184. package/dist/data-manager/DataManager.d.ts.map +1 -1
  185. package/dist/data-manager/MessagesConfig.d.ts +2 -2
  186. package/dist/data-manager/MessagesConfig.d.ts.map +1 -1
  187. package/dist/data-manager/TransportManager.d.ts +5 -4
  188. package/dist/data-manager/TransportManager.d.ts.map +1 -1
  189. package/dist/device/Device.d.ts +36 -10
  190. package/dist/device/Device.d.ts.map +1 -1
  191. package/dist/device/DeviceCommands.d.ts +9 -9
  192. package/dist/device/DeviceCommands.d.ts.map +1 -1
  193. package/dist/device/DeviceConnector.d.ts +2 -1
  194. package/dist/device/DeviceConnector.d.ts.map +1 -1
  195. package/dist/deviceProfile/buildDeviceProfile.d.ts +22 -0
  196. package/dist/deviceProfile/buildDeviceProfile.d.ts.map +1 -0
  197. package/dist/deviceProfile/index.d.ts +3 -0
  198. package/dist/deviceProfile/index.d.ts.map +1 -0
  199. package/dist/deviceProfile/legacyFeaturesView.d.ts +5 -0
  200. package/dist/deviceProfile/legacyFeaturesView.d.ts.map +1 -0
  201. package/dist/events/logBlockEvent.d.ts +1 -0
  202. package/dist/events/logBlockEvent.d.ts.map +1 -1
  203. package/dist/events/ui-request.d.ts +8 -0
  204. package/dist/events/ui-request.d.ts.map +1 -1
  205. package/dist/index.d.ts +720 -382
  206. package/dist/index.js +17634 -1201
  207. package/dist/inject.d.ts.map +1 -1
  208. package/dist/protocols/protocol-v2/features.d.ts +93 -0
  209. package/dist/protocols/protocol-v2/features.d.ts.map +1 -0
  210. package/dist/protocols/protocol-v2/firmware.d.ts +13 -0
  211. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -0
  212. package/dist/protocols/protocol-v2/index.d.ts +4 -0
  213. package/dist/protocols/protocol-v2/index.d.ts.map +1 -0
  214. package/dist/types/api/export.d.ts +1 -1
  215. package/dist/types/api/export.d.ts.map +1 -1
  216. package/dist/types/api/firmwareUpdate.d.ts +27 -0
  217. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  218. package/dist/types/api/getDeviceInfo.d.ts +85 -0
  219. package/dist/types/api/getDeviceInfo.d.ts.map +1 -0
  220. package/dist/types/api/getPassphraseState.d.ts +10 -1
  221. package/dist/types/api/getPassphraseState.d.ts.map +1 -1
  222. package/dist/types/api/index.d.ts +37 -1
  223. package/dist/types/api/index.d.ts.map +1 -1
  224. package/dist/types/api/protocolV2.d.ts +103 -0
  225. package/dist/types/api/protocolV2.d.ts.map +1 -0
  226. package/dist/types/api/searchDevices.d.ts +2 -2
  227. package/dist/types/api/searchDevices.d.ts.map +1 -1
  228. package/dist/types/device.d.ts +10 -3
  229. package/dist/types/device.d.ts.map +1 -1
  230. package/dist/types/params.d.ts +2 -0
  231. package/dist/types/params.d.ts.map +1 -1
  232. package/dist/types/settings.d.ts +1 -1
  233. package/dist/types/settings.d.ts.map +1 -1
  234. package/dist/utils/deviceFeaturesUtils.d.ts +6 -8
  235. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  236. package/dist/utils/deviceInfoUtils.d.ts +1 -0
  237. package/dist/utils/deviceInfoUtils.d.ts.map +1 -1
  238. package/dist/utils/index.d.ts +1 -1
  239. package/dist/utils/index.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/package.json +4 -4
  243. package/src/api/BaseMethod.ts +26 -22
  244. package/src/api/DirList.ts +31 -0
  245. package/src/api/DirMake.ts +23 -0
  246. package/src/api/DirRemove.ts +23 -0
  247. package/src/api/FileDelete.ts +23 -0
  248. package/src/api/FileRead.ts +167 -0
  249. package/src/api/FileWrite.ts +216 -0
  250. package/src/api/FirmwareUpdate.ts +13 -5
  251. package/src/api/FirmwareUpdateV2.ts +21 -25
  252. package/src/api/FirmwareUpdateV3.ts +17 -4
  253. package/src/api/FirmwareUpdateV4.ts +827 -0
  254. package/src/api/GetDeviceInfo.ts +152 -0
  255. package/src/api/GetFeatures.ts +5 -2
  256. package/src/api/GetOnekeyFeatures.ts +95 -3
  257. package/src/api/GetPassphraseState.ts +16 -10
  258. package/src/api/PathInfo.ts +39 -0
  259. package/src/api/PromptWebDeviceAccess.ts +11 -1
  260. package/src/api/SearchDevices.ts +7 -2
  261. package/src/api/alephium/AlephiumGetAddress.ts +6 -2
  262. package/src/api/alephium/AlephiumSignMessage.ts +6 -1
  263. package/src/api/alephium/AlephiumSignTransaction.ts +15 -4
  264. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +21 -13
  265. package/src/api/aptos/AptosGetAddress.ts +2 -3
  266. package/src/api/benfen/BenfenGetAddress.ts +11 -7
  267. package/src/api/benfen/BenfenGetPublicKey.ts +6 -2
  268. package/src/api/benfen/BenfenSignMessage.ts +6 -1
  269. package/src/api/benfen/BenfenSignTransaction.ts +6 -1
  270. package/src/api/btc/BTCGetPublicKey.ts +3 -2
  271. package/src/api/btc/BTCSignPsbt.ts +1 -2
  272. package/src/api/btc/helpers/versionLimit.ts +7 -1
  273. package/src/api/cardano/CardanoSignTransaction.ts +2 -4
  274. package/src/api/conflux/ConfluxSignTransaction.ts +5 -2
  275. package/src/api/device/DeviceFullyUploadResource.ts +3 -3
  276. package/src/api/device/DeviceLock.ts +1 -3
  277. package/src/api/device/DeviceRebootToBoardloader.ts +10 -1
  278. package/src/api/device/DeviceRebootToBootloader.ts +10 -1
  279. package/src/api/device/DeviceSupportFeatures.ts +2 -13
  280. package/src/api/device/DeviceUpdateBootloader.ts +4 -4
  281. package/src/api/device/DeviceUploadResource.ts +4 -5
  282. package/src/api/device/DeviceVerify.ts +1 -2
  283. package/src/api/dynex/DnxGetAddress.ts +6 -0
  284. package/src/api/dynex/DnxSignTransaction.ts +6 -0
  285. package/src/api/evm/EVMGetAddress.ts +1 -1
  286. package/src/api/evm/EVMGetPublicKey.ts +3 -4
  287. package/src/api/evm/EVMSignMessage.ts +1 -1
  288. package/src/api/evm/EVMSignMessageEIP712.ts +14 -1
  289. package/src/api/evm/EVMSignTransaction.ts +1 -1
  290. package/src/api/evm/EVMSignTypedData.ts +32 -18
  291. package/src/api/evm/EVMVerifyMessage.ts +1 -1
  292. package/src/api/evm/latest/signTypedHash.ts +2 -4
  293. package/src/api/evm/legacyV1/getAddress.ts +5 -3
  294. package/src/api/evm/legacyV1/getPublicKey.ts +5 -3
  295. package/src/api/evm/legacyV1/signMessage.ts +5 -3
  296. package/src/api/evm/legacyV1/signTypedData.ts +9 -8
  297. package/src/api/evm/legacyV1/signTypedHash.ts +7 -7
  298. package/src/api/evm/legacyV1/verifyMessage.ts +5 -3
  299. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +8 -8
  300. package/src/api/firmware/uploadFirmware.ts +3 -10
  301. package/src/api/helpers/batchGetPublickeys.ts +51 -6
  302. package/src/api/helpers/filesystemValidation.ts +51 -0
  303. package/src/api/index.ts +34 -0
  304. package/src/api/kaspa/KaspaSignTransaction.ts +4 -5
  305. package/src/api/lightning/LnurlAuth.ts +4 -0
  306. package/src/api/neo/NeoGetAddress.ts +6 -1
  307. package/src/api/neo/NeoSignTransaction.ts +6 -1
  308. package/src/api/nervos/NervosGetAddress.ts +6 -2
  309. package/src/api/nervos/NervosSignTransaction.ts +14 -4
  310. package/src/api/nexa/NexaGetAddress.ts +6 -2
  311. package/src/api/nexa/NexaSignTransaction.ts +11 -12
  312. package/src/api/polkadot/networks.ts +9 -0
  313. package/src/api/protocol-v2/DevReboot.ts +24 -0
  314. package/src/api/protocol-v2/DeviceFirmwareUpdate.ts +63 -0
  315. package/src/api/protocol-v2/DeviceGetDeviceInfo.ts +118 -0
  316. package/src/api/protocol-v2/DeviceGetFirmwareUpdateStatus.ts +20 -0
  317. package/src/api/protocol-v2/DeviceGetOnboardingStatus.ts +16 -0
  318. package/src/api/protocol-v2/DeviceReboot.ts +24 -0
  319. package/src/api/protocol-v2/FactoryDeviceInfoSettings.ts +29 -0
  320. package/src/api/protocol-v2/FactoryGetDeviceInfo.ts +20 -0
  321. package/src/api/protocol-v2/FilesystemDiskControl.ts +50 -0
  322. package/src/api/protocol-v2/FilesystemFixPermission.ts +16 -0
  323. package/src/api/protocol-v2/FilesystemFormat.ts +16 -0
  324. package/src/api/protocol-v2/GetProtoVersion.ts +16 -0
  325. package/src/api/protocol-v2/Ping.ts +18 -0
  326. package/src/api/protocol-v2/helpers.ts +207 -0
  327. package/src/api/scdo/ScdoGetAddress.ts +6 -2
  328. package/src/api/scdo/ScdoSignMessage.ts +6 -1
  329. package/src/api/scdo/ScdoSignTransaction.ts +6 -2
  330. package/src/api/solana/SolGetAddress.ts +4 -0
  331. package/src/api/solana/SolSignMessage.ts +3 -0
  332. package/src/api/solana/SolSignOffchainMessage.ts +3 -0
  333. package/src/api/solana/SolSignTransaction.ts +6 -0
  334. package/src/api/stellar/StellarGetAddress.ts +10 -1
  335. package/src/api/stellar/StellarSignTransaction.ts +14 -1
  336. package/src/api/sui/SuiGetAddress.ts +5 -3
  337. package/src/api/sui/SuiGetPublicKey.ts +3 -0
  338. package/src/api/sui/SuiSignMessage.ts +3 -0
  339. package/src/api/sui/SuiSignTransaction.ts +14 -12
  340. package/src/api/ton/TonGetAddress.ts +3 -0
  341. package/src/api/ton/TonSignData.ts +10 -3
  342. package/src/api/ton/TonSignMessage.ts +6 -5
  343. package/src/api/ton/TonSignProof.ts +3 -0
  344. package/src/api/tron/TronSignMessage.ts +5 -1
  345. package/src/api/tron/TronSignTransaction.ts +4 -0
  346. package/src/api/xrp/XrpSignTransaction.ts +1 -1
  347. package/src/core/index.ts +87 -55
  348. package/src/data/messages/messages-protocol-v2.json +13369 -0
  349. package/src/data-manager/DataManager.ts +12 -7
  350. package/src/data-manager/MessagesConfig.ts +14 -14
  351. package/src/data-manager/TransportManager.ts +38 -12
  352. package/src/device/Device.ts +538 -61
  353. package/src/device/DeviceCommands.ts +195 -29
  354. package/src/device/DeviceConnector.ts +29 -4
  355. package/src/device/DevicePool.ts +7 -7
  356. package/src/deviceProfile/buildDeviceProfile.ts +387 -0
  357. package/src/deviceProfile/index.ts +2 -0
  358. package/src/deviceProfile/legacyFeaturesView.ts +123 -0
  359. package/src/events/logBlockEvent.ts +23 -0
  360. package/src/events/ui-request.ts +8 -0
  361. package/src/inject.ts +52 -1
  362. package/src/protocols/protocol-v2/features.ts +180 -0
  363. package/src/protocols/protocol-v2/firmware.ts +43 -0
  364. package/src/protocols/protocol-v2/index.ts +16 -0
  365. package/src/types/api/export.ts +1 -0
  366. package/src/types/api/firmwareUpdate.ts +49 -0
  367. package/src/types/api/getDeviceInfo.ts +99 -0
  368. package/src/types/api/getPassphraseState.ts +13 -2
  369. package/src/types/api/index.ts +88 -1
  370. package/src/types/api/protocolV2.ts +201 -0
  371. package/src/types/api/searchDevices.ts +2 -2
  372. package/src/types/device.ts +37 -3
  373. package/src/types/params.ts +7 -0
  374. package/src/types/settings.ts +1 -1
  375. package/src/utils/deviceFeaturesUtils.ts +70 -70
  376. package/src/utils/deviceInfoUtils.ts +15 -8
  377. package/src/utils/index.ts +1 -0
@@ -0,0 +1,827 @@
1
+ import { ERRORS, HardwareError, HardwareErrorCode, wait } from '@onekeyfe/hd-shared';
2
+ import {
3
+ DevRebootType,
4
+ PROTOCOL_V2_BLE_FILE_CHUNK_SIZE,
5
+ PROTOCOL_V2_WEBUSB_FILE_CHUNK_SIZE,
6
+ } from '@onekeyfe/hd-transport';
7
+
8
+ import { FirmwareUpdateTipMessage, UI_REQUEST } from '../events/ui-request';
9
+ import { validateParams } from './helpers/paramsValidator';
10
+ import { LoggerNames, getFirmwareType, getLogger } from '../utils';
11
+ import { getBinary, getSysResourceBinary } from './firmware/getBinary';
12
+ import { DataManager } from '../data-manager';
13
+ import { FirmwareUpdateBaseMethod } from './firmware/FirmwareUpdateBaseMethod';
14
+ import { DevicePool } from '../device/DevicePool';
15
+ import {
16
+ PROTOCOL_V2_VERSIONS_DEVICE_INFO_REQUEST,
17
+ ProtocolV2FirmwareTargetType,
18
+ protocolV2FileNameToTargetId,
19
+ } from '../protocols/protocol-v2';
20
+ import { requestProtocolV2DeviceInfo } from '../protocols/protocol-v2/features';
21
+ import { buildProfileFromProtocolV2 } from '../deviceProfile';
22
+ import {
23
+ PROTOCOL_V2_FIRMWARE_UPDATE_RESPONSE_TYPES,
24
+ getProtocolV2UnknownErrorText,
25
+ isProtocolV2DeviceDisconnectedError,
26
+ } from './protocol-v2/helpers';
27
+
28
+ import type { FirmwareUpdateV4Params } from '../types/api/firmwareUpdate';
29
+ import type { EFirmwareType } from '@onekeyfe/hd-shared';
30
+ import type { PROTO } from '../constants';
31
+ import type { TypedResponseMessage } from '../device/DeviceCommands';
32
+ import type { Features } from '../types';
33
+
34
+ const Log = getLogger(LoggerNames.Method);
35
+
36
+ const SESSION_ERROR = 'session not found';
37
+ const PROTOCOL_V2_BOOTLOADER_RECONNECT_TIMEOUT = 60 * 1000;
38
+ const PROTOCOL_V2_SHORT_RESPONSE_TIMEOUT = 5 * 1000;
39
+ const PROTOCOL_V2_INSTALL_TIMEOUT = 5 * 60 * 1000;
40
+ const PROTOCOL_V2_TARGET_STATUS_FINISHED = 0;
41
+ const PROTOCOL_V2_TARGET_STATUS_IN_PROGRESS = 1;
42
+ const PROTOCOL_V2_TARGET_STATUS_FAILED = 2;
43
+ const PROTOCOL_V2_CONNECT_PROTOCOL = 'V2';
44
+ const PROTOCOL_V2_FIRMWARE_STAGING_VOLUME = 'vol1:';
45
+ const PROTOCOL_V2_MIN_FILE_CHUNK_SIZE = 64;
46
+
47
+ type ProtocolV2FirmwareUpdateStatusTarget = {
48
+ target_id: number;
49
+ status: number;
50
+ };
51
+
52
+ type ProtocolV2FirmwareUpdateStartResponse =
53
+ | TypedResponseMessage<'Success'>
54
+ | TypedResponseMessage<'DevFirmwareUpdateStatus'>
55
+ | undefined;
56
+
57
+ const isProtocolV2ReconnectProbeError = (error: unknown) => {
58
+ const message = getProtocolV2UnknownErrorText(error).toLowerCase();
59
+ return (
60
+ (message.includes('device protocol mismatch') && message.includes('expected v2')) ||
61
+ message.includes('did not respond to expected protocol')
62
+ );
63
+ };
64
+
65
+ const isProtocolV2PollingTransientError = (error: unknown) => {
66
+ const message = getProtocolV2UnknownErrorText(error).toLowerCase();
67
+ return (
68
+ isProtocolV2DeviceDisconnectedError(error) ||
69
+ isProtocolV2ReconnectProbeError(error) ||
70
+ (message.includes('response timeout') && message.includes('devicegetfirmwareupdatestatus')) ||
71
+ message.includes('device not found') ||
72
+ message.includes('transportnotfound')
73
+ );
74
+ };
75
+
76
+ /**
77
+ * FirmwareUpdateV4 is the complete Protocol V2 firmware update flow.
78
+ *
79
+ * It intentionally does not fall back to FirmwareUpdateV3/V1 behavior:
80
+ * - upload uses FilesystemFileWrite
81
+ * - install uses DevFirmwareUpdate
82
+ * - completion reboots to normal, then polls Ping
83
+ */
84
+ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareUpdateV4Params> {
85
+ init() {
86
+ this.allowDeviceMode = [UI_REQUEST.BOOTLOADER, UI_REQUEST.NOT_INITIALIZE];
87
+ this.requireDeviceMode = [];
88
+ this.useDevicePassphraseState = false;
89
+ this.skipForceUpdateCheck = true;
90
+
91
+ const { payload } = this;
92
+
93
+ validateParams(payload, [
94
+ { name: 'bleVersion', type: 'array' },
95
+ { name: 'bleBinary', type: 'buffer' },
96
+ { name: 'chunkSize', type: 'number' },
97
+ { name: 'firmwareVersion', type: 'array' },
98
+ { name: 'firmwareBinary', type: 'buffer' },
99
+ { name: 'resourceBinary', type: 'buffer' },
100
+ { name: 'forcedUpdateRes', type: 'boolean' },
101
+ { name: 'bootloaderVersion', type: 'array' },
102
+ { name: 'bootloaderBinary', type: 'buffer' },
103
+ { name: 'romloaderBinary', type: 'buffer' },
104
+ { name: 'applicationP1Binary', type: 'buffer' },
105
+ { name: 'applicationP2Binary', type: 'buffer' },
106
+ { name: 'coprocessorBinary', type: 'buffer' },
107
+ { name: 'se01Binary', type: 'buffer' },
108
+ { name: 'se02Binary', type: 'buffer' },
109
+ { name: 'se03Binary', type: 'buffer' },
110
+ { name: 'se04Binary', type: 'buffer' },
111
+ { name: 'firmwareType', type: 'string' },
112
+ { name: 'platform', type: 'string' },
113
+ ]);
114
+
115
+ this.params = {
116
+ bleBinary: payload.bleBinary,
117
+ chunkSize: payload.chunkSize,
118
+ firmwareBinary: payload.firmwareBinary,
119
+ forcedUpdateRes: payload.forcedUpdateRes,
120
+ bleVersion: payload.bleVersion,
121
+ bootloaderVersion: payload.bootloaderVersion,
122
+ bootloaderBinary: payload.bootloaderBinary,
123
+ romloaderBinary: payload.romloaderBinary,
124
+ applicationP1Binary: payload.applicationP1Binary,
125
+ applicationP2Binary: payload.applicationP2Binary,
126
+ coprocessorBinary: payload.coprocessorBinary,
127
+ se01Binary: payload.se01Binary,
128
+ se02Binary: payload.se02Binary,
129
+ se03Binary: payload.se03Binary,
130
+ se04Binary: payload.se04Binary,
131
+ firmwareVersion: payload.firmwareVersion,
132
+ resourceBinary: payload.resourceBinary,
133
+ firmwareType: payload.firmwareType,
134
+ platform: payload.platform,
135
+ };
136
+ }
137
+
138
+ private getProtocolV2FirmwareChunkSize() {
139
+ const payloadChunkSize = Number(this.params?.chunkSize);
140
+ const env = DataManager.getSettings('env');
141
+ const maxChunkSize =
142
+ this.params?.platform === 'native' || (env && DataManager.isBleConnect(env))
143
+ ? PROTOCOL_V2_BLE_FILE_CHUNK_SIZE
144
+ : PROTOCOL_V2_WEBUSB_FILE_CHUNK_SIZE;
145
+ if (!Number.isFinite(payloadChunkSize) || payloadChunkSize <= 0) {
146
+ return maxChunkSize;
147
+ }
148
+ return Math.min(
149
+ Math.max(Math.floor(payloadChunkSize), PROTOCOL_V2_MIN_FILE_CHUNK_SIZE),
150
+ maxChunkSize
151
+ );
152
+ }
153
+
154
+ async run() {
155
+ if (!this.device.isProtocolV2()) {
156
+ throw ERRORS.TypedError(
157
+ HardwareErrorCode.RuntimeError,
158
+ 'firmwareUpdateV4 requires a Protocol V2 device'
159
+ );
160
+ }
161
+
162
+ Log.debug('FirmwareUpdateV4 strategy: Protocol V2');
163
+ return this.runProtocolV2();
164
+ }
165
+
166
+ private async runProtocolV2() {
167
+ const legacyFeatures = await this.getProtocolV2LegacyFeatures();
168
+ const deviceFirmwareType = getFirmwareType(legacyFeatures);
169
+ const firmwareType = this.params.firmwareType ?? deviceFirmwareType;
170
+
171
+ let resourceBinary: ArrayBuffer | null = null;
172
+ let fwBinaryMap: { fileName: string; binary: ArrayBuffer; targetId?: number }[] = [];
173
+ let bootloaderBinary: ArrayBuffer | null = null;
174
+ try {
175
+ this.postTipMessage(FirmwareUpdateTipMessage.StartDownloadFirmware);
176
+ resourceBinary = await this.prepareResourceBinary(firmwareType, legacyFeatures);
177
+ fwBinaryMap = await this.prepareFirmwareAndBleBinary(firmwareType, legacyFeatures);
178
+ bootloaderBinary = await this.prepareBootloaderBinary(firmwareType, legacyFeatures);
179
+ // 按 DevFirmwareTargetType 拆分的目标二进制(显式 target_id,不走文件名推断)
180
+ fwBinaryMap.push(...this.collectExplicitTargetBinaries());
181
+ this.postTipMessage(FirmwareUpdateTipMessage.FinishDownloadFirmware);
182
+ } catch (err) {
183
+ throw ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateDownloadFailed, err.message ?? err);
184
+ }
185
+
186
+ if (!resourceBinary && !bootloaderBinary && fwBinaryMap.length === 0) {
187
+ throw ERRORS.TypedError(
188
+ HardwareErrorCode.FirmwareUpdateDownloadFailed,
189
+ 'No firmware to update'
190
+ );
191
+ }
192
+
193
+ // TODO: 当前 firmware-pro2 子模块的 reboot/bootloader 流程还未稳定,先暂停自动进 bootloader。
194
+ // await this.enterProtocolV2BootloaderMode();
195
+
196
+ await this.executeProtocolV2Update({
197
+ resourceBinary,
198
+ fwBinaryMap,
199
+ bootloaderBinary,
200
+ });
201
+
202
+ await this.exitProtocolV2BootloaderToNormal();
203
+
204
+ const versions = await this.waitForProtocolV2FinalFeatures();
205
+ this.postTipMessage(FirmwareUpdateTipMessage.FirmwareUpdateCompleted);
206
+ DevicePool.resetState();
207
+
208
+ return versions;
209
+ }
210
+
211
+ private async getProtocolV2LegacyFeatures() {
212
+ if (typeof this.device.getFeatures === 'function') {
213
+ return this.device.getFeatures();
214
+ }
215
+ if (this.device.features) {
216
+ return this.device.features;
217
+ }
218
+ throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'Device features not available');
219
+ }
220
+
221
+ private async prepareResourceBinary(firmwareType: EFirmwareType, features: Features) {
222
+ if (this.params.resourceBinary) {
223
+ return this.params.resourceBinary;
224
+ }
225
+ const resourceUrl = DataManager.getSysResourcesLatestRelease({
226
+ features,
227
+ forcedUpdateRes: this.params.forcedUpdateRes,
228
+ firmwareType,
229
+ });
230
+
231
+ if (resourceUrl) {
232
+ const resource = (await getSysResourceBinary(resourceUrl)).binary;
233
+ return resource;
234
+ }
235
+ Log.warn('No resource url found');
236
+ return null;
237
+ }
238
+
239
+ private async prepareBootloaderBinary(
240
+ firmwareType: EFirmwareType,
241
+ features: Features
242
+ ): Promise<ArrayBuffer | null> {
243
+ if (this.params.bootloaderBinary) {
244
+ return this.params.bootloaderBinary;
245
+ }
246
+
247
+ if (this.params.bootloaderVersion) {
248
+ const bootResourceUrl = DataManager.getBootloaderResource(features, firmwareType);
249
+ if (bootResourceUrl) {
250
+ const bootBinary = (await getSysResourceBinary(bootResourceUrl)).binary;
251
+ return bootBinary;
252
+ }
253
+ }
254
+ return null;
255
+ }
256
+
257
+ private isProtocolV2BootloaderMode() {
258
+ if (typeof this.device.isBootloader === 'function') {
259
+ return this.device.isBootloader();
260
+ }
261
+ const profile = this.device.profile;
262
+ if (profile?.status?.mode === 'bootloader' || profile?.status?.bootloaderMode === true) {
263
+ return true;
264
+ }
265
+ return !!this.device.features?.bootloader_mode;
266
+ }
267
+
268
+ async enterProtocolV2BootloaderMode() {
269
+ if (this.isProtocolV2BootloaderMode()) {
270
+ return false;
271
+ }
272
+
273
+ try {
274
+ this.postTipMessage(FirmwareUpdateTipMessage.AutoRebootToBootloader);
275
+ await this.protocolV2Reboot(DevRebootType.Bootloader);
276
+ this.postTipMessage(FirmwareUpdateTipMessage.GoToBootloaderSuccess);
277
+ this.checkDeviceToBootloader(this.payload.connectId);
278
+ await this.checkPromise?.promise;
279
+ this.checkPromise = null;
280
+ await wait(1500);
281
+ await this.device.acquire?.();
282
+ return true;
283
+ } catch (error) {
284
+ if (error instanceof HardwareError) {
285
+ throw error;
286
+ }
287
+ Log.log('Protocol V2 auto go to bootloader mode failed: ', error);
288
+ throw ERRORS.TypedError(HardwareErrorCode.FirmwareUpdateAutoEnterBootFailure);
289
+ }
290
+ }
291
+
292
+ /**
293
+ * 收集按 DevFirmwareTargetType 拆分的显式目标二进制。
294
+ * 文件名仅用于 staging 路径展示,target_id 已显式给定。
295
+ */
296
+ private collectExplicitTargetBinaries() {
297
+ const entries: { fileName: string; binary: ArrayBuffer; targetId: number }[] = [];
298
+ const push = (binary: ArrayBuffer | undefined, fileName: string, targetId: number) => {
299
+ if (binary) entries.push({ fileName, binary, targetId });
300
+ };
301
+
302
+ push(
303
+ this.params.romloaderBinary,
304
+ 'romloader.bin',
305
+ ProtocolV2FirmwareTargetType.TARGET_MAIN_BOOT
306
+ );
307
+ push(
308
+ this.params.applicationP1Binary,
309
+ 'application_p1.bin',
310
+ ProtocolV2FirmwareTargetType.TARGET_MAIN_APP
311
+ );
312
+ push(
313
+ this.params.applicationP2Binary,
314
+ 'application_p2.bin',
315
+ ProtocolV2FirmwareTargetType.TARGET_MAIN_APP
316
+ );
317
+ push(
318
+ this.params.coprocessorBinary,
319
+ 'coprocessor.bin',
320
+ ProtocolV2FirmwareTargetType.TARGET_BT
321
+ );
322
+ push(this.params.se01Binary, 'se01.bin', ProtocolV2FirmwareTargetType.TARGET_SE1);
323
+ push(this.params.se02Binary, 'se02.bin', ProtocolV2FirmwareTargetType.TARGET_SE2);
324
+ push(this.params.se03Binary, 'se03.bin', ProtocolV2FirmwareTargetType.TARGET_SE3);
325
+ push(this.params.se04Binary, 'se04.bin', ProtocolV2FirmwareTargetType.TARGET_SE4);
326
+ return entries;
327
+ }
328
+
329
+ private async prepareFirmwareAndBleBinary(firmwareType: EFirmwareType, features: Features) {
330
+ const fwBinaryMap: { fileName: string; binary: ArrayBuffer; targetId?: number }[] = [];
331
+ if (this.params.firmwareBinary) {
332
+ fwBinaryMap.push({
333
+ fileName: 'firmware.bin',
334
+ binary: this.params.firmwareBinary,
335
+ });
336
+ } else if (this.params.firmwareVersion) {
337
+ const firmwareBinary = (
338
+ await getBinary({
339
+ features,
340
+ version: this.params.firmwareVersion,
341
+ updateType: 'firmware',
342
+ isUpdateBootloader: false,
343
+ firmwareType,
344
+ })
345
+ ).binary;
346
+ fwBinaryMap.push({
347
+ fileName: 'firmware.bin',
348
+ binary: firmwareBinary,
349
+ });
350
+ }
351
+
352
+ if (this.params.bleBinary) {
353
+ fwBinaryMap.push({
354
+ fileName: 'ble-firmware.bin',
355
+ binary: this.params.bleBinary,
356
+ });
357
+ } else if (this.params.bleVersion) {
358
+ const bleBinary = await getBinary({
359
+ features,
360
+ version: this.params.bleVersion,
361
+ updateType: 'ble',
362
+ firmwareType,
363
+ });
364
+ fwBinaryMap.push({
365
+ fileName: 'ble-firmware.bin',
366
+ binary: bleBinary.binary,
367
+ });
368
+ }
369
+
370
+ return fwBinaryMap;
371
+ }
372
+
373
+ private async executeProtocolV2Update({
374
+ resourceBinary,
375
+ fwBinaryMap,
376
+ bootloaderBinary,
377
+ }: {
378
+ resourceBinary: ArrayBuffer | null;
379
+ fwBinaryMap: { fileName: string; binary: ArrayBuffer; targetId?: number }[];
380
+ bootloaderBinary: ArrayBuffer | null;
381
+ }) {
382
+ let totalSize = 0;
383
+ let processedSize = 0;
384
+
385
+ if (resourceBinary) totalSize += resourceBinary.byteLength;
386
+ for (const fwbinary of fwBinaryMap) totalSize += fwbinary.binary.byteLength;
387
+ if (bootloaderBinary) totalSize += bootloaderBinary.byteLength;
388
+
389
+ this.postTipMessage(FirmwareUpdateTipMessage.StartTransferData);
390
+
391
+ const targets: Array<{ target_id: number; path: string }> = [];
392
+
393
+ if (resourceBinary) {
394
+ // resource 仅支持单文件 .bin:整文件一次上传,target path 指向该文件
395
+ const resourceFilePath = `${PROTOCOL_V2_FIRMWARE_STAGING_VOLUME}resource.bin`;
396
+ processedSize = await this.protocolV2CommonUpdateProcess({
397
+ payload: resourceBinary,
398
+ filePath: resourceFilePath,
399
+ processedSize,
400
+ totalSize,
401
+ });
402
+ targets.push({
403
+ target_id: ProtocolV2FirmwareTargetType.TARGET_RESOURCE,
404
+ path: resourceFilePath,
405
+ });
406
+ }
407
+
408
+ if (bootloaderBinary) {
409
+ const bootloaderPath = `${PROTOCOL_V2_FIRMWARE_STAGING_VOLUME}bootloader.bin`;
410
+ processedSize = await this.protocolV2CommonUpdateProcess({
411
+ payload: bootloaderBinary,
412
+ filePath: bootloaderPath,
413
+ processedSize,
414
+ totalSize,
415
+ });
416
+ targets.push({
417
+ target_id: ProtocolV2FirmwareTargetType.TARGET_MAIN_BOOT,
418
+ path: bootloaderPath,
419
+ });
420
+ }
421
+
422
+ for (const fwbinary of fwBinaryMap) {
423
+ const firmwarePath = `${PROTOCOL_V2_FIRMWARE_STAGING_VOLUME}${fwbinary.fileName}`;
424
+ processedSize = await this.protocolV2CommonUpdateProcess({
425
+ payload: fwbinary.binary,
426
+ filePath: firmwarePath,
427
+ processedSize,
428
+ totalSize,
429
+ });
430
+ targets.push({
431
+ target_id: fwbinary.targetId ?? protocolV2FileNameToTargetId(fwbinary.fileName),
432
+ path: firmwarePath,
433
+ });
434
+ }
435
+
436
+ if (totalSize > 0) {
437
+ this.postProgressMessage(100, 'transferData');
438
+ }
439
+
440
+ this.postTipMessage(FirmwareUpdateTipMessage.ConfirmOnDevice);
441
+ const startResponse = await this.protocolV2StartFirmwareUpdate({ targets });
442
+ await this.waitForProtocolV2FirmwareUpdateComplete(targets, startResponse);
443
+ }
444
+
445
+ private async queryProtocolV2FirmwareUpdateStatus() {
446
+ const typedCall = this.device.getCommands().typedCall.bind(this.device.getCommands());
447
+ return typedCall(
448
+ 'DevGetFirmwareUpdateStatus',
449
+ 'DevFirmwareUpdateStatus',
450
+ {},
451
+ {
452
+ timeoutMs: PROTOCOL_V2_SHORT_RESPONSE_TIMEOUT,
453
+ }
454
+ );
455
+ }
456
+
457
+ private async pingProtocolV2Device() {
458
+ const typedCall = this.device.getCommands().typedCall.bind(this.device.getCommands());
459
+ await typedCall(
460
+ 'Ping',
461
+ 'Success',
462
+ { message: 'firmware-update' },
463
+ {
464
+ timeoutMs: PROTOCOL_V2_SHORT_RESPONSE_TIMEOUT,
465
+ }
466
+ );
467
+ }
468
+
469
+ private assertProtocolV2TargetStatus(
470
+ statusTargets: ProtocolV2FirmwareUpdateStatusTarget[],
471
+ expectedTargetIds: Set<number>
472
+ ) {
473
+ const failedTarget = statusTargets.find(
474
+ target =>
475
+ expectedTargetIds.has(target.target_id) &&
476
+ target.status === PROTOCOL_V2_TARGET_STATUS_FAILED
477
+ );
478
+ if (failedTarget) {
479
+ throw ERRORS.TypedError(
480
+ HardwareErrorCode.FirmwareError,
481
+ `Protocol V2 firmware target ${failedTarget.target_id} failed`
482
+ );
483
+ }
484
+
485
+ const completedTargets = statusTargets.filter(
486
+ target =>
487
+ expectedTargetIds.has(target.target_id) &&
488
+ target.status === PROTOCOL_V2_TARGET_STATUS_FINISHED
489
+ );
490
+ if (completedTargets.length === expectedTargetIds.size && expectedTargetIds.size > 0) {
491
+ return true;
492
+ }
493
+
494
+ const inProgressTarget = statusTargets.find(
495
+ target =>
496
+ expectedTargetIds.has(target.target_id) &&
497
+ target.status === PROTOCOL_V2_TARGET_STATUS_IN_PROGRESS
498
+ );
499
+ if (inProgressTarget) {
500
+ this.postProgressMessage(99, 'installingFirmware');
501
+ }
502
+
503
+ return false;
504
+ }
505
+
506
+ private async waitForProtocolV2FirmwareUpdateComplete(
507
+ targets: Array<{ target_id: number; path: string }>,
508
+ startResponse?: ProtocolV2FirmwareUpdateStartResponse
509
+ ) {
510
+ const expectedTargetIds = new Set(targets.map(target => target.target_id));
511
+ if (startResponse?.type === 'Success') {
512
+ return;
513
+ }
514
+ if (startResponse?.type === 'DevFirmwareUpdateStatus') {
515
+ const statusTargets = (startResponse.message.targets ??
516
+ []) as ProtocolV2FirmwareUpdateStatusTarget[];
517
+ if (this.assertProtocolV2TargetStatus(statusTargets, expectedTargetIds)) {
518
+ return;
519
+ }
520
+ }
521
+
522
+ const startTime = Date.now();
523
+ let lastError: unknown;
524
+
525
+ while (Date.now() - startTime < PROTOCOL_V2_INSTALL_TIMEOUT) {
526
+ try {
527
+ const statusRes = await this.queryProtocolV2FirmwareUpdateStatus();
528
+ const statusTargets = (statusRes.message.targets ??
529
+ []) as ProtocolV2FirmwareUpdateStatusTarget[];
530
+ if (this.assertProtocolV2TargetStatus(statusTargets, expectedTargetIds)) {
531
+ return;
532
+ }
533
+ } catch (error) {
534
+ lastError = error;
535
+ if (error instanceof HardwareError && error.errorCode === HardwareErrorCode.FirmwareError) {
536
+ throw error;
537
+ }
538
+ Log.log('Protocol V2 firmware install status polling failed: ', error);
539
+ if (isProtocolV2PollingTransientError(error)) {
540
+ try {
541
+ await this.reconnectProtocolV2Device();
542
+ } catch (reconnectError) {
543
+ lastError = reconnectError;
544
+ Log.log(
545
+ 'Protocol V2 firmware install reconnect/status polling failed: ',
546
+ reconnectError
547
+ );
548
+ }
549
+ try {
550
+ await this.pingProtocolV2Device();
551
+ Log.log('Protocol V2 firmware status unavailable, Ping is ready');
552
+ return;
553
+ } catch (pingError) {
554
+ lastError = pingError;
555
+ Log.log('Protocol V2 firmware install Ping polling failed: ', pingError);
556
+ }
557
+ }
558
+ }
559
+ await wait(1000);
560
+ }
561
+
562
+ throw ERRORS.TypedError(
563
+ HardwareErrorCode.RuntimeError,
564
+ `Protocol V2 firmware update status timeout: ${this.normalizeErrorMessage(lastError)}`
565
+ );
566
+ }
567
+
568
+ private async exitProtocolV2BootloaderToNormal() {
569
+ this.postTipMessage(FirmwareUpdateTipMessage.SwitchFirmwareReconnectDevice);
570
+ await this.protocolV2Reboot(DevRebootType.Normal);
571
+ }
572
+
573
+ private async waitForProtocolV2FinalFeatures() {
574
+ const profile = await this.waitForProtocolV2ReconnectAndProfile(
575
+ PROTOCOL_V2_BOOTLOADER_RECONNECT_TIMEOUT
576
+ );
577
+ this.device.updateProfile?.(profile);
578
+
579
+ const bootloaderVersion = profile.versions.bootloader ?? '0.0.0';
580
+ const bleVersion = profile.versions.ble ?? '0.0.0';
581
+ const firmwareVersion = profile.versions.firmware ?? '0.0.0';
582
+ if (firmwareVersion === '0.0.0') {
583
+ Log.warn(
584
+ 'Protocol V2 firmware update finished but app firmware version is still 0.0.0. This is allowed for Pro2 debug BLE-only update flows.'
585
+ );
586
+ }
587
+
588
+ return {
589
+ bootloaderVersion,
590
+ bleVersion,
591
+ firmwareVersion,
592
+ };
593
+ }
594
+
595
+ private async waitForProtocolV2ReconnectAndProfile(timeout: number) {
596
+ const startTime = Date.now();
597
+ let lastError: unknown;
598
+
599
+ while (Date.now() - startTime < timeout) {
600
+ try {
601
+ await this.reconnectProtocolV2Device();
602
+ const deviceInfo = await requestProtocolV2DeviceInfo({
603
+ commands: this.device.getCommands(),
604
+ timeoutMs: PROTOCOL_V2_SHORT_RESPONSE_TIMEOUT,
605
+ // 更新完成判定只需要各 target 版本号;scope 与请求内容保持一致
606
+ request: PROTOCOL_V2_VERSIONS_DEVICE_INFO_REQUEST,
607
+ });
608
+ return buildProfileFromProtocolV2({
609
+ deviceInfo,
610
+ sources: ['deviceInfo'],
611
+ scope: 'versions',
612
+ fallbackSerialNo: this.device.originalDescriptor?.path,
613
+ });
614
+ } catch (error) {
615
+ lastError = error;
616
+ Log.log('Protocol V2 normal mode not ready, polling Ping: ', error);
617
+ await wait(1000);
618
+ }
619
+ }
620
+
621
+ throw ERRORS.TypedError(
622
+ HardwareErrorCode.DeviceNotFound,
623
+ `Protocol V2 final features not ready within ${timeout / 1000}s: ${this.normalizeErrorMessage(
624
+ lastError
625
+ )}`
626
+ );
627
+ }
628
+
629
+ private async reconnectProtocolV2Device() {
630
+ if (this.isBleReconnect()) {
631
+ await this.acquireProtocolV2BleDevice();
632
+ return;
633
+ }
634
+
635
+ const deviceDiff = await this.device.deviceConnector?.enumerate();
636
+ const devicesDescriptor = deviceDiff?.descriptors ?? [];
637
+
638
+ const { deviceList } = await DevicePool.getDevices(devicesDescriptor, this.connectId);
639
+ if (deviceList.length !== 1) {
640
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceNotFound);
641
+ }
642
+
643
+ this.device.updateFromCache(deviceList[0]);
644
+ await this.device.acquire();
645
+ this.device.commands.disposed = false;
646
+ this.device.getCommands().mainId = this.device.mainId ?? '';
647
+ }
648
+
649
+ private async protocolV2CommonUpdateProcess({
650
+ payload,
651
+ filePath,
652
+ processedSize,
653
+ totalSize,
654
+ }: PROTO.FirmwareUpload & {
655
+ filePath: string;
656
+ processedSize?: number;
657
+ totalSize?: number;
658
+ }) {
659
+ const chunkSize = this.getProtocolV2FirmwareChunkSize();
660
+ let offset = 0;
661
+ const getUploadProgress = (fileOffset: number) => {
662
+ if (totalSize !== undefined && processedSize !== undefined) {
663
+ return Math.min(Math.ceil(((processedSize + fileOffset) / totalSize) * 100), 99);
664
+ }
665
+ return Math.min(Math.ceil((fileOffset / payload.byteLength) * 100), 99);
666
+ };
667
+
668
+ while (offset < payload.byteLength) {
669
+ const chunkEnd = Math.min(offset + chunkSize, payload.byteLength);
670
+ const chunkLength = chunkEnd - offset;
671
+ const chunk = payload.slice(offset, chunkEnd);
672
+ const overwrite = offset === 0;
673
+ const progress = getUploadProgress(chunkEnd);
674
+
675
+ const writeRes = await this.fileWriteWithRetry(
676
+ filePath,
677
+ payload.byteLength,
678
+ offset,
679
+ chunk,
680
+ overwrite,
681
+ progress
682
+ );
683
+ const processedByte = Number(writeRes.message.processed_byte);
684
+ const nextOffset =
685
+ Number.isFinite(processedByte) && processedByte > offset
686
+ ? processedByte
687
+ : offset + chunkLength;
688
+ if (nextOffset <= offset || nextOffset > payload.byteLength) {
689
+ throw ERRORS.TypedError(
690
+ HardwareErrorCode.EmmcFileWriteFirmwareError,
691
+ `invalid processed_byte ${writeRes.message.processed_byte} for offset ${offset}`
692
+ );
693
+ }
694
+ offset = nextOffset;
695
+ this.postProgressMessage(getUploadProgress(offset), 'transferData');
696
+ }
697
+
698
+ return totalSize !== undefined ? (processedSize ?? 0) + payload.byteLength : 0;
699
+ }
700
+
701
+ private async fileWriteWithRetry(
702
+ filePath: string,
703
+ totalFileSize: number,
704
+ offset: number,
705
+ chunk: ArrayBuffer | Buffer,
706
+ overwrite: boolean,
707
+ progress: number | null
708
+ ): Promise<TypedResponseMessage<'FilesystemFile'>> {
709
+ const writeFunc = async () => {
710
+ const typedCall = this.device.getCommands().typedCall.bind(this.device.getCommands());
711
+ const writeRes = await typedCall('FilesystemFileWrite', 'FilesystemFile', {
712
+ file: {
713
+ path: filePath,
714
+ offset,
715
+ total_size: totalFileSize,
716
+ data: chunk,
717
+ },
718
+ overwrite,
719
+ append: false,
720
+ ui_percentage: progress ?? undefined,
721
+ });
722
+ if (writeRes.type !== 'FilesystemFile') {
723
+ if ((writeRes as any).type === 'CallMethodError') {
724
+ if (((writeRes as any).message.error ?? '').indexOf(SESSION_ERROR) > -1) {
725
+ throw ERRORS.TypedError(HardwareErrorCode.RuntimeError, SESSION_ERROR);
726
+ }
727
+ }
728
+ throw ERRORS.TypedError(
729
+ HardwareErrorCode.EmmcFileWriteFirmwareError,
730
+ 'transfer data error'
731
+ );
732
+ }
733
+ return writeRes;
734
+ };
735
+
736
+ let retryCount = 10;
737
+ while (retryCount > 0) {
738
+ try {
739
+ const result = await writeFunc();
740
+ return result;
741
+ } catch (error) {
742
+ Log.error(`fileWrite error: `, error);
743
+ retryCount--;
744
+ if (retryCount === 0) {
745
+ throw ERRORS.TypedError(
746
+ HardwareErrorCode.EmmcFileWriteFirmwareError,
747
+ 'transfer data error'
748
+ );
749
+ }
750
+ const env = DataManager.getSettings('env');
751
+ if (DataManager.isBleConnect(env)) {
752
+ await wait(3000);
753
+ await this.acquireProtocolV2BleDevice();
754
+ await this.device.initialize();
755
+ }
756
+ await wait(2000);
757
+ }
758
+ }
759
+ throw ERRORS.TypedError(HardwareErrorCode.EmmcFileWriteFirmwareError, 'transfer data error');
760
+ }
761
+
762
+ private async acquireProtocolV2BleDevice() {
763
+ await this.device.deviceConnector?.acquire(
764
+ this.device.originalDescriptor.id,
765
+ null,
766
+ true,
767
+ PROTOCOL_V2_CONNECT_PROTOCOL
768
+ );
769
+ }
770
+
771
+ private async protocolV2StartFirmwareUpdate({
772
+ targets,
773
+ }: {
774
+ targets: Array<{ target_id: number; path: string }>;
775
+ }) {
776
+ const commands = this.device.getCommands();
777
+ let response: ProtocolV2FirmwareUpdateStartResponse;
778
+ try {
779
+ response = await commands.typedCall(
780
+ 'DevFirmwareUpdate',
781
+ PROTOCOL_V2_FIRMWARE_UPDATE_RESPONSE_TYPES,
782
+ {
783
+ targets,
784
+ },
785
+ {
786
+ intermediateTypes: ['DevFirmwareInstallProgress'],
787
+ onIntermediateResponse: (response: { message?: { progress?: number } }) => {
788
+ const progress = Number(response.message?.progress);
789
+ if (Number.isFinite(progress)) {
790
+ this.postProgressMessage(Math.min(progress, 99), 'installingFirmware');
791
+ }
792
+ },
793
+ }
794
+ );
795
+ } catch (error) {
796
+ if (isProtocolV2DeviceDisconnectedError(error)) {
797
+ Log.log('Rebooting device');
798
+ } else {
799
+ throw error;
800
+ }
801
+ }
802
+ this.postTipMessage(FirmwareUpdateTipMessage.FirmwareUpdating);
803
+ return response;
804
+ }
805
+
806
+ private async protocolV2Reboot(rebootType: DevRebootType) {
807
+ const typedCall = this.device.getCommands().typedCall.bind(this.device.getCommands());
808
+ try {
809
+ const res = await typedCall('DevReboot', 'Success', {
810
+ reboot_type: rebootType,
811
+ });
812
+ return res.message;
813
+ } catch (error) {
814
+ if (isProtocolV2DeviceDisconnectedError(error) || isProtocolV2ReconnectProbeError(error)) {
815
+ return { message: 'Device rebooted successfully' };
816
+ }
817
+ throw error;
818
+ }
819
+ }
820
+
821
+ private normalizeErrorMessage(error: unknown): string {
822
+ if (!error) {
823
+ return '';
824
+ }
825
+ return getProtocolV2UnknownErrorText(error);
826
+ }
827
+ }