@onekeyfe/hd-core 1.2.0-alpha.17 → 1.2.0-alpha.170

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 (847) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +390 -0
  2. package/__tests__/DeviceCommands.test.ts +586 -9
  3. package/__tests__/DeviceEventRegistration.test.ts +9 -0
  4. package/__tests__/base64Data.test.ts +69 -0
  5. package/__tests__/chain-params-onekey-compatibility.test.ts +229 -0
  6. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +878 -0
  7. package/__tests__/check-firmware-release-protocol-v2.test.ts +270 -0
  8. package/__tests__/connectSettings.test.ts +45 -5
  9. package/__tests__/core-dispose.test.ts +34 -0
  10. package/__tests__/core-error-output.test.ts +39 -0
  11. package/__tests__/core-initialization.test.ts +23 -0
  12. package/__tests__/device-connector-protocol.test.ts +102 -0
  13. package/__tests__/device-features-state.test.ts +78 -0
  14. package/__tests__/device-identity.test.ts +52 -0
  15. package/__tests__/device-initialize-timeout.test.ts +56 -0
  16. package/__tests__/device-lifecycle-events.test.ts +752 -0
  17. package/__tests__/device-pool-state.test.ts +191 -0
  18. package/__tests__/device-settings.test.ts +665 -0
  19. package/__tests__/device-state-contract.test.ts +28 -0
  20. package/__tests__/device-state-events.test.ts +286 -0
  21. package/__tests__/device-state-mapper.test.ts +344 -0
  22. package/__tests__/device-state-projector.test.ts +114 -0
  23. package/__tests__/device-state-store.test.ts +109 -0
  24. package/__tests__/device-utils.test.ts +168 -0
  25. package/__tests__/device-wallet-session-store.test.ts +474 -1
  26. package/__tests__/deviceFeaturesUtils.test.ts +13 -1
  27. package/__tests__/devicePoolBootloaderPath.test.ts +64 -0
  28. package/__tests__/deviceSettings.test.ts +117 -0
  29. package/__tests__/deviceUploadNft.test.ts +348 -0
  30. package/__tests__/evmLedgerLegacySafety.test.ts +10 -7
  31. package/__tests__/evmSignTransaction.test.ts +69 -0
  32. package/__tests__/evmSignTypedData.test.ts +80 -0
  33. package/__tests__/filesystemValidation.test.ts +53 -0
  34. package/__tests__/firmware-update/check-all-firmware-release.test.ts +175 -0
  35. package/__tests__/firmware-update/device-update-bootloader.test.ts +109 -0
  36. package/__tests__/firmware-update/firmware-artifact-source.test.ts +171 -0
  37. package/__tests__/firmware-update/firmware-host-binding.test.ts +79 -0
  38. package/__tests__/firmware-update/firmware-preparation-error.test.ts +27 -0
  39. package/__tests__/firmware-update/firmware-prepared-host-digest.test.ts +583 -0
  40. package/__tests__/firmware-update/firmware-prepared-resource-archive.test.ts +171 -0
  41. package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +438 -0
  42. package/__tests__/firmware-update/firmware-update-capabilities.test.ts +13 -0
  43. package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +474 -0
  44. package/__tests__/firmware-update/firmware-update-plan.test.ts +819 -0
  45. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +297 -0
  46. package/__tests__/firmware-update/firmware-update-prepared-resource-executors.test.ts +326 -0
  47. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +457 -0
  48. package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +237 -0
  49. package/__tests__/firmware-update/firmware-update-v4-install-poll.test.ts +212 -0
  50. package/__tests__/firmware-update/firmware-update-v4-parameters.test.ts +85 -0
  51. package/__tests__/firmware-update/firmware-upload-source.test.ts +70 -0
  52. package/__tests__/get-device-state.test.ts +617 -0
  53. package/__tests__/homescreen.test.ts +58 -1
  54. package/__tests__/kaspa-public-types.type-test.ts +16 -0
  55. package/__tests__/kaspa-use-tweak-pro2.test.ts +20 -0
  56. package/__tests__/kaspaSignTransaction.test.ts +578 -0
  57. package/__tests__/known-device-public-types.type-test.ts +3 -0
  58. package/__tests__/logBlockEvent.test.ts +140 -1
  59. package/__tests__/method-protocol-support.test.ts +144 -0
  60. package/__tests__/networkUtils.test.ts +406 -0
  61. package/__tests__/open-wallet-session-error-response.test.ts +43 -0
  62. package/__tests__/open-wallet-session.test.ts +1899 -0
  63. package/__tests__/pro2Nft.test.ts +108 -0
  64. package/__tests__/pro2Wallpaper.test.ts +74 -19
  65. package/__tests__/protocol-binding.test.ts +89 -0
  66. package/__tests__/protocol-v2-firmware-targets.test.ts +105 -0
  67. package/__tests__/protocol-v2-ping.test.ts +28 -0
  68. package/__tests__/protocol-v2-resources.test.ts +371 -0
  69. package/__tests__/protocol-v2-ui-lifecycle.test.ts +91 -0
  70. package/__tests__/protocol-v2-unlock-policy.test.ts +507 -0
  71. package/__tests__/protocol-v2.test.ts +7558 -2213
  72. package/__tests__/protocolV2FileWrite.test.ts +193 -0
  73. package/__tests__/protocolV2UiInteraction.test.ts +63 -0
  74. package/__tests__/public-device-state-api.test.ts +275 -0
  75. package/__tests__/public-pro2-api-boundary.test.ts +107 -0
  76. package/__tests__/refresh-device-state.test.ts +103 -0
  77. package/__tests__/request-context-logging.test.ts +16 -0
  78. package/__tests__/resourceBase64Boundary.test.ts +48 -0
  79. package/__tests__/search-devices.test.ts +192 -0
  80. package/__tests__/ton-sign-message.test.ts +84 -0
  81. package/__tests__/tron-sign-message-init.test.ts +74 -0
  82. package/__tests__/uiProgressThrottle.test.ts +74 -0
  83. package/__tests__/uiPromiseRegistry.test.ts +115 -0
  84. package/dist/api/BaseMethod.d.ts +10 -2
  85. package/dist/api/BaseMethod.d.ts.map +1 -1
  86. package/dist/api/CheckAllFirmwareRelease.d.ts +25 -1
  87. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  88. package/dist/api/CheckBLEFirmwareRelease.d.ts +3 -2
  89. package/dist/api/CheckBLEFirmwareRelease.d.ts.map +1 -1
  90. package/dist/api/CheckBootloaderRelease.d.ts +2 -1
  91. package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
  92. package/dist/api/CheckFirmwareRelease.d.ts +3 -2
  93. package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
  94. package/dist/api/CipherKeyValue.d.ts +1 -0
  95. package/dist/api/CipherKeyValue.d.ts.map +1 -1
  96. package/dist/api/ClearSessionCache.d.ts.map +1 -1
  97. package/dist/api/DetectDeviceConnectProtocol.d.ts +7 -0
  98. package/dist/api/DetectDeviceConnectProtocol.d.ts.map +1 -0
  99. package/dist/api/DirList.d.ts +1 -0
  100. package/dist/api/DirList.d.ts.map +1 -1
  101. package/dist/api/DirMake.d.ts +1 -0
  102. package/dist/api/DirMake.d.ts.map +1 -1
  103. package/dist/api/DirRemove.d.ts +1 -0
  104. package/dist/api/DirRemove.d.ts.map +1 -1
  105. package/dist/api/FileDelete.d.ts +1 -0
  106. package/dist/api/FileDelete.d.ts.map +1 -1
  107. package/dist/api/FileRead.d.ts +1 -0
  108. package/dist/api/FileRead.d.ts.map +1 -1
  109. package/dist/api/FileWrite.d.ts +1 -0
  110. package/dist/api/FileWrite.d.ts.map +1 -1
  111. package/dist/api/FirmwareUpdate.d.ts.map +1 -1
  112. package/dist/api/FirmwareUpdateV2.d.ts +13 -2
  113. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  114. package/dist/api/FirmwareUpdateV3.d.ts +7 -3
  115. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  116. package/dist/api/FirmwareUpdateV4.d.ts +65 -14
  117. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  118. package/dist/api/GetDeviceState.d.ts +8 -0
  119. package/dist/api/GetDeviceState.d.ts.map +1 -0
  120. package/dist/api/GetFeatures.d.ts +1 -1
  121. package/dist/api/GetFeatures.d.ts.map +1 -1
  122. package/dist/api/GetOnekeyFeatures.d.ts.map +1 -1
  123. package/dist/api/GetPassphraseState.d.ts +1 -0
  124. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  125. package/dist/api/OpenWalletSession.d.ts +8 -0
  126. package/dist/api/OpenWalletSession.d.ts.map +1 -0
  127. package/dist/api/PathInfo.d.ts +1 -0
  128. package/dist/api/PathInfo.d.ts.map +1 -1
  129. package/dist/api/PromptWebDeviceAccess.d.ts.map +1 -1
  130. package/dist/api/SearchDevices.d.ts +3 -0
  131. package/dist/api/SearchDevices.d.ts.map +1 -1
  132. package/dist/api/UploadPortfolio.d.ts +1 -2
  133. package/dist/api/UploadPortfolio.d.ts.map +1 -1
  134. package/dist/api/alephium/AlephiumGetAddress.d.ts.map +1 -1
  135. package/dist/api/alephium/AlephiumSignMessage.d.ts.map +1 -1
  136. package/dist/api/alephium/AlephiumSignTransaction.d.ts.map +1 -1
  137. package/dist/api/algo/AlgoGetAddress.d.ts +1 -0
  138. package/dist/api/algo/AlgoGetAddress.d.ts.map +1 -1
  139. package/dist/api/algo/AlgoSignTransaction.d.ts +1 -0
  140. package/dist/api/algo/AlgoSignTransaction.d.ts.map +1 -1
  141. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts +1 -0
  142. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  143. package/dist/api/aptos/AptosGetAddress.d.ts +1 -0
  144. package/dist/api/aptos/AptosGetAddress.d.ts.map +1 -1
  145. package/dist/api/aptos/AptosGetPublicKey.d.ts +1 -0
  146. package/dist/api/aptos/AptosGetPublicKey.d.ts.map +1 -1
  147. package/dist/api/aptos/AptosSignInMessage.d.ts +1 -0
  148. package/dist/api/aptos/AptosSignInMessage.d.ts.map +1 -1
  149. package/dist/api/aptos/AptosSignMessage.d.ts +1 -0
  150. package/dist/api/aptos/AptosSignMessage.d.ts.map +1 -1
  151. package/dist/api/aptos/AptosSignTransaction.d.ts +1 -0
  152. package/dist/api/aptos/AptosSignTransaction.d.ts.map +1 -1
  153. package/dist/api/benfen/BenfenGetAddress.d.ts.map +1 -1
  154. package/dist/api/benfen/BenfenGetPublicKey.d.ts.map +1 -1
  155. package/dist/api/benfen/BenfenSignMessage.d.ts.map +1 -1
  156. package/dist/api/benfen/BenfenSignTransaction.d.ts.map +1 -1
  157. package/dist/api/btc/BTCGetAddress.d.ts +1 -0
  158. package/dist/api/btc/BTCGetAddress.d.ts.map +1 -1
  159. package/dist/api/btc/BTCGetPublicKey.d.ts +1 -0
  160. package/dist/api/btc/BTCGetPublicKey.d.ts.map +1 -1
  161. package/dist/api/btc/BTCSignMessage.d.ts +1 -0
  162. package/dist/api/btc/BTCSignMessage.d.ts.map +1 -1
  163. package/dist/api/btc/BTCSignPsbt.d.ts +1 -0
  164. package/dist/api/btc/BTCSignPsbt.d.ts.map +1 -1
  165. package/dist/api/btc/BTCSignTransaction.d.ts +1 -0
  166. package/dist/api/btc/BTCSignTransaction.d.ts.map +1 -1
  167. package/dist/api/btc/BTCVerifyMessage.d.ts +1 -0
  168. package/dist/api/btc/BTCVerifyMessage.d.ts.map +1 -1
  169. package/dist/api/btc/helpers/versionLimit.d.ts +2 -0
  170. package/dist/api/btc/helpers/versionLimit.d.ts.map +1 -1
  171. package/dist/api/cardano/CardanoGetAddress.d.ts +1 -0
  172. package/dist/api/cardano/CardanoGetAddress.d.ts.map +1 -1
  173. package/dist/api/cardano/CardanoGetPublicKey.d.ts +1 -0
  174. package/dist/api/cardano/CardanoGetPublicKey.d.ts.map +1 -1
  175. package/dist/api/cardano/CardanoSignMessage.d.ts +1 -0
  176. package/dist/api/cardano/CardanoSignMessage.d.ts.map +1 -1
  177. package/dist/api/cardano/CardanoSignTransaction.d.ts +1 -0
  178. package/dist/api/cardano/CardanoSignTransaction.d.ts.map +1 -1
  179. package/dist/api/conflux/ConfluxGetAddress.d.ts +2 -0
  180. package/dist/api/conflux/ConfluxGetAddress.d.ts.map +1 -1
  181. package/dist/api/conflux/ConfluxSignMessage.d.ts +2 -0
  182. package/dist/api/conflux/ConfluxSignMessage.d.ts.map +1 -1
  183. package/dist/api/conflux/ConfluxSignMessageCIP23.d.ts +2 -0
  184. package/dist/api/conflux/ConfluxSignMessageCIP23.d.ts.map +1 -1
  185. package/dist/api/conflux/ConfluxSignTransaction.d.ts +2 -0
  186. package/dist/api/conflux/ConfluxSignTransaction.d.ts.map +1 -1
  187. package/dist/api/cosmos/CosmosGetAddress.d.ts +1 -0
  188. package/dist/api/cosmos/CosmosGetAddress.d.ts.map +1 -1
  189. package/dist/api/cosmos/CosmosGetPublicKey.d.ts +1 -0
  190. package/dist/api/cosmos/CosmosGetPublicKey.d.ts.map +1 -1
  191. package/dist/api/cosmos/CosmosSignTransaction.d.ts +1 -0
  192. package/dist/api/cosmos/CosmosSignTransaction.d.ts.map +1 -1
  193. package/dist/api/device/DeviceCancel.d.ts +1 -0
  194. package/dist/api/device/DeviceCancel.d.ts.map +1 -1
  195. package/dist/api/device/DeviceChangePin.d.ts +1 -0
  196. package/dist/api/device/DeviceChangePin.d.ts.map +1 -1
  197. package/dist/api/device/DeviceFullyUploadResource.d.ts +1 -2
  198. package/dist/api/device/DeviceFullyUploadResource.d.ts.map +1 -1
  199. package/dist/api/device/DeviceLock.d.ts +1 -0
  200. package/dist/api/device/DeviceLock.d.ts.map +1 -1
  201. package/dist/api/device/DeviceRebootToBoardloader.d.ts +1 -0
  202. package/dist/api/device/DeviceRebootToBoardloader.d.ts.map +1 -1
  203. package/dist/api/device/DeviceRebootToBootloader.d.ts +1 -0
  204. package/dist/api/device/DeviceRebootToBootloader.d.ts.map +1 -1
  205. package/dist/api/device/DeviceSettings.d.ts +1 -0
  206. package/dist/api/device/DeviceSettings.d.ts.map +1 -1
  207. package/dist/api/device/DeviceSupportFeatures.d.ts +1 -0
  208. package/dist/api/device/DeviceSupportFeatures.d.ts.map +1 -1
  209. package/dist/api/device/DeviceUnlock.d.ts +3 -2
  210. package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
  211. package/dist/api/device/DeviceUpdateBootloader.d.ts +5 -1
  212. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  213. package/dist/api/device/DeviceVerify.d.ts +1 -0
  214. package/dist/api/device/DeviceVerify.d.ts.map +1 -1
  215. package/dist/api/device/DeviceWipe.d.ts +1 -0
  216. package/dist/api/device/DeviceWipe.d.ts.map +1 -1
  217. package/dist/api/device/PreInitialize.d.ts +1 -0
  218. package/dist/api/device/PreInitialize.d.ts.map +1 -1
  219. package/dist/api/dynex/DnxGetAddress.d.ts.map +1 -1
  220. package/dist/api/dynex/DnxSignTransaction.d.ts.map +1 -1
  221. package/dist/api/evm/EVMGetAddress.d.ts +1 -0
  222. package/dist/api/evm/EVMGetAddress.d.ts.map +1 -1
  223. package/dist/api/evm/EVMGetPublicKey.d.ts +1 -0
  224. package/dist/api/evm/EVMGetPublicKey.d.ts.map +1 -1
  225. package/dist/api/evm/EVMSignMessage.d.ts +1 -0
  226. package/dist/api/evm/EVMSignMessage.d.ts.map +1 -1
  227. package/dist/api/evm/EVMSignMessageEIP712.d.ts.map +1 -1
  228. package/dist/api/evm/EVMSignTransaction.d.ts +1 -0
  229. package/dist/api/evm/EVMSignTransaction.d.ts.map +1 -1
  230. package/dist/api/evm/EVMSignTypedData.d.ts +1 -0
  231. package/dist/api/evm/EVMSignTypedData.d.ts.map +1 -1
  232. package/dist/api/evm/EVMVerifyMessage.d.ts +1 -0
  233. package/dist/api/evm/EVMVerifyMessage.d.ts.map +1 -1
  234. package/dist/api/evm/protocol.d.ts +3 -0
  235. package/dist/api/evm/protocol.d.ts.map +1 -0
  236. package/dist/api/filecoin/FilecoinGetAddress.d.ts +1 -0
  237. package/dist/api/filecoin/FilecoinGetAddress.d.ts.map +1 -1
  238. package/dist/api/filecoin/FilecoinSignTransaction.d.ts +1 -0
  239. package/dist/api/filecoin/FilecoinSignTransaction.d.ts.map +1 -1
  240. package/dist/api/firmware/FirmwareArtifactSource.d.ts +29 -0
  241. package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +1 -0
  242. package/dist/api/firmware/FirmwareHostBinding.d.ts +6 -0
  243. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -0
  244. package/dist/api/firmware/FirmwarePreparationError.d.ts +3 -0
  245. package/dist/api/firmware/FirmwarePreparationError.d.ts.map +1 -0
  246. package/dist/api/firmware/FirmwarePreparedResourceArchive.d.ts +11 -0
  247. package/dist/api/firmware/FirmwarePreparedResourceArchive.d.ts.map +1 -0
  248. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +12 -3
  249. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  250. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +3 -0
  251. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +1 -0
  252. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +57 -0
  253. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -0
  254. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +38 -0
  255. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -0
  256. package/dist/api/firmware/getBinary.d.ts +15 -4
  257. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  258. package/dist/api/firmware/protocolV2Release.d.ts +33 -0
  259. package/dist/api/firmware/protocolV2Release.d.ts.map +1 -0
  260. package/dist/api/firmware/updateBootloader.d.ts +2 -0
  261. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  262. package/dist/api/firmware/uploadFirmware.d.ts +9 -1
  263. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  264. package/dist/api/helpers/base64Data.d.ts +16 -0
  265. package/dist/api/helpers/base64Data.d.ts.map +1 -0
  266. package/dist/api/helpers/filesystemValidation.d.ts +3 -0
  267. package/dist/api/helpers/filesystemValidation.d.ts.map +1 -1
  268. package/dist/api/helpers/paramsValidator.d.ts +1 -0
  269. package/dist/api/helpers/paramsValidator.d.ts.map +1 -1
  270. package/dist/api/helpers/protocolV2FileWrite.d.ts +10 -0
  271. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -1
  272. package/dist/api/index.d.ts +5 -29
  273. package/dist/api/index.d.ts.map +1 -1
  274. package/dist/api/kaspa/KaspaGetAddress.d.ts +4 -0
  275. package/dist/api/kaspa/KaspaGetAddress.d.ts.map +1 -1
  276. package/dist/api/kaspa/KaspaSignTransaction.d.ts +9 -1
  277. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  278. package/dist/api/kaspa/helpers/TransferSerialize.d.ts.map +1 -1
  279. package/dist/api/lightning/LnurlAuth.d.ts +0 -4
  280. package/dist/api/lightning/LnurlAuth.d.ts.map +1 -1
  281. package/dist/api/near/NearGetAddress.d.ts +1 -0
  282. package/dist/api/near/NearGetAddress.d.ts.map +1 -1
  283. package/dist/api/near/NearSignTransaction.d.ts +1 -0
  284. package/dist/api/near/NearSignTransaction.d.ts.map +1 -1
  285. package/dist/api/nem/NEMGetAddress.d.ts +1 -0
  286. package/dist/api/nem/NEMGetAddress.d.ts.map +1 -1
  287. package/dist/api/nem/NEMSignTransaction.d.ts +1 -0
  288. package/dist/api/nem/NEMSignTransaction.d.ts.map +1 -1
  289. package/dist/api/neo/NeoGetAddress.d.ts.map +1 -1
  290. package/dist/api/neo/NeoSignTransaction.d.ts.map +1 -1
  291. package/dist/api/nervos/NervosGetAddress.d.ts.map +1 -1
  292. package/dist/api/nervos/NervosSignTransaction.d.ts.map +1 -1
  293. package/dist/api/nexa/NexaGetAddress.d.ts.map +1 -1
  294. package/dist/api/nexa/NexaSignTransaction.d.ts +1 -0
  295. package/dist/api/nexa/NexaSignTransaction.d.ts.map +1 -1
  296. package/dist/api/nostr/NostrDecryptMessage.d.ts +1 -0
  297. package/dist/api/nostr/NostrDecryptMessage.d.ts.map +1 -1
  298. package/dist/api/nostr/NostrEncryptMessage.d.ts +1 -0
  299. package/dist/api/nostr/NostrEncryptMessage.d.ts.map +1 -1
  300. package/dist/api/nostr/NostrGetPublicKey.d.ts +1 -0
  301. package/dist/api/nostr/NostrGetPublicKey.d.ts.map +1 -1
  302. package/dist/api/nostr/NostrSignEvent.d.ts +1 -0
  303. package/dist/api/nostr/NostrSignEvent.d.ts.map +1 -1
  304. package/dist/api/nostr/NostrSignSchnorr.d.ts +1 -0
  305. package/dist/api/nostr/NostrSignSchnorr.d.ts.map +1 -1
  306. package/dist/api/polkadot/PolkadotGetAddress.d.ts +2 -1
  307. package/dist/api/polkadot/PolkadotGetAddress.d.ts.map +1 -1
  308. package/dist/api/polkadot/PolkadotSignTransaction.d.ts +1 -0
  309. package/dist/api/polkadot/PolkadotSignTransaction.d.ts.map +1 -1
  310. package/dist/api/polkadot/networks.d.ts +1 -1
  311. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts +1 -0
  312. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts.map +1 -1
  313. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts +1 -0
  314. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts.map +1 -1
  315. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts +4 -1
  316. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts.map +1 -1
  317. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts +1 -0
  318. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts.map +1 -1
  319. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts +2 -1
  320. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts.map +1 -1
  321. package/dist/api/protocol-v2/DeviceInfoGet.d.ts +2 -2
  322. package/dist/api/protocol-v2/DeviceInfoGet.d.ts.map +1 -1
  323. package/dist/api/protocol-v2/DeviceReboot.d.ts +2 -1
  324. package/dist/api/protocol-v2/DeviceReboot.d.ts.map +1 -1
  325. package/dist/api/protocol-v2/DeviceStatusGet.d.ts +1 -0
  326. package/dist/api/protocol-v2/DeviceStatusGet.d.ts.map +1 -1
  327. package/dist/api/protocol-v2/DeviceUploadNft.d.ts +30 -0
  328. package/dist/api/protocol-v2/DeviceUploadNft.d.ts.map +1 -0
  329. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts +5 -4
  330. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts.map +1 -1
  331. package/dist/api/protocol-v2/FilesystemFormat.d.ts +1 -0
  332. package/dist/api/protocol-v2/FilesystemFormat.d.ts.map +1 -1
  333. package/dist/api/protocol-v2/FilesystemPermissionFix.d.ts +1 -0
  334. package/dist/api/protocol-v2/FilesystemPermissionFix.d.ts.map +1 -1
  335. package/dist/api/protocol-v2/Ping.d.ts +3 -0
  336. package/dist/api/protocol-v2/Ping.d.ts.map +1 -1
  337. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts +1 -0
  338. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -1
  339. package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
  340. package/dist/api/scdo/ScdoGetAddress.d.ts.map +1 -1
  341. package/dist/api/scdo/ScdoSignMessage.d.ts.map +1 -1
  342. package/dist/api/scdo/ScdoSignTransaction.d.ts.map +1 -1
  343. package/dist/api/solana/SolGetAddress.d.ts +1 -0
  344. package/dist/api/solana/SolGetAddress.d.ts.map +1 -1
  345. package/dist/api/solana/SolSignMessage.d.ts +2 -1
  346. package/dist/api/solana/SolSignMessage.d.ts.map +1 -1
  347. package/dist/api/solana/SolSignOffchainMessage.d.ts +2 -1
  348. package/dist/api/solana/SolSignOffchainMessage.d.ts.map +1 -1
  349. package/dist/api/solana/SolSignTransaction.d.ts +3 -2
  350. package/dist/api/solana/SolSignTransaction.d.ts.map +1 -1
  351. package/dist/api/starcoin/StarcoinGetAddress.d.ts +1 -0
  352. package/dist/api/starcoin/StarcoinGetAddress.d.ts.map +1 -1
  353. package/dist/api/starcoin/StarcoinGetPublicKey.d.ts +1 -0
  354. package/dist/api/starcoin/StarcoinGetPublicKey.d.ts.map +1 -1
  355. package/dist/api/starcoin/StarcoinSignMessage.d.ts +1 -0
  356. package/dist/api/starcoin/StarcoinSignMessage.d.ts.map +1 -1
  357. package/dist/api/starcoin/StarcoinSignTransaction.d.ts +1 -0
  358. package/dist/api/starcoin/StarcoinSignTransaction.d.ts.map +1 -1
  359. package/dist/api/starcoin/StarcoinVerifyMessage.d.ts +1 -0
  360. package/dist/api/starcoin/StarcoinVerifyMessage.d.ts.map +1 -1
  361. package/dist/api/stellar/StellarGetAddress.d.ts +1 -2
  362. package/dist/api/stellar/StellarGetAddress.d.ts.map +1 -1
  363. package/dist/api/stellar/StellarSignTransaction.d.ts +2 -3
  364. package/dist/api/stellar/StellarSignTransaction.d.ts.map +1 -1
  365. package/dist/api/sui/SuiGetAddress.d.ts +2 -1
  366. package/dist/api/sui/SuiGetAddress.d.ts.map +1 -1
  367. package/dist/api/sui/SuiGetPublicKey.d.ts +2 -1
  368. package/dist/api/sui/SuiGetPublicKey.d.ts.map +1 -1
  369. package/dist/api/sui/SuiSignMessage.d.ts +2 -1
  370. package/dist/api/sui/SuiSignMessage.d.ts.map +1 -1
  371. package/dist/api/sui/SuiSignTransaction.d.ts +2 -1
  372. package/dist/api/sui/SuiSignTransaction.d.ts.map +1 -1
  373. package/dist/api/ton/TonGetAddress.d.ts +2 -1
  374. package/dist/api/ton/TonGetAddress.d.ts.map +1 -1
  375. package/dist/api/ton/TonSignData.d.ts +1 -0
  376. package/dist/api/ton/TonSignData.d.ts.map +1 -1
  377. package/dist/api/ton/TonSignMessage.d.ts +2 -1
  378. package/dist/api/ton/TonSignMessage.d.ts.map +1 -1
  379. package/dist/api/ton/TonSignProof.d.ts +2 -1
  380. package/dist/api/ton/TonSignProof.d.ts.map +1 -1
  381. package/dist/api/tron/TronGetAddress.d.ts +1 -0
  382. package/dist/api/tron/TronGetAddress.d.ts.map +1 -1
  383. package/dist/api/tron/TronSignMessage.d.ts +6 -1
  384. package/dist/api/tron/TronSignMessage.d.ts.map +1 -1
  385. package/dist/api/tron/TronSignTransaction.d.ts +2 -1
  386. package/dist/api/tron/TronSignTransaction.d.ts.map +1 -1
  387. package/dist/api/utils.d.ts +4 -1
  388. package/dist/api/utils.d.ts.map +1 -1
  389. package/dist/api/xrp/XrpGetAddress.d.ts +1 -0
  390. package/dist/api/xrp/XrpGetAddress.d.ts.map +1 -1
  391. package/dist/api/xrp/XrpSignTransaction.d.ts +1 -0
  392. package/dist/api/xrp/XrpSignTransaction.d.ts.map +1 -1
  393. package/dist/constants/index.d.ts +1 -1
  394. package/dist/constants/index.d.ts.map +1 -1
  395. package/dist/core/RequestQueue.d.ts +0 -2
  396. package/dist/core/RequestQueue.d.ts.map +1 -1
  397. package/dist/core/deviceEventRegistration.d.ts +2 -0
  398. package/dist/core/deviceEventRegistration.d.ts.map +1 -1
  399. package/dist/core/index.d.ts +8 -3
  400. package/dist/core/index.d.ts.map +1 -1
  401. package/dist/core/uiPromiseRegistry.d.ts +6 -0
  402. package/dist/core/uiPromiseRegistry.d.ts.map +1 -0
  403. package/dist/data-manager/DataManager.d.ts +14 -5
  404. package/dist/data-manager/DataManager.d.ts.map +1 -1
  405. package/dist/data-manager/TransportManager.d.ts.map +1 -1
  406. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  407. package/dist/device/Device.d.ts +82 -14
  408. package/dist/device/Device.d.ts.map +1 -1
  409. package/dist/device/DeviceCommands.d.ts +5 -5
  410. package/dist/device/DeviceCommands.d.ts.map +1 -1
  411. package/dist/device/DeviceConnector.d.ts +4 -3
  412. package/dist/device/DeviceConnector.d.ts.map +1 -1
  413. package/dist/device/DeviceFeaturesState.d.ts +3 -0
  414. package/dist/device/DeviceFeaturesState.d.ts.map +1 -0
  415. package/dist/device/DevicePool.d.ts +4 -0
  416. package/dist/device/DevicePool.d.ts.map +1 -1
  417. package/dist/device/DeviceStateMapper.d.ts +13 -0
  418. package/dist/device/DeviceStateMapper.d.ts.map +1 -0
  419. package/dist/device/DeviceStateProjector.d.ts +7 -0
  420. package/dist/device/DeviceStateProjector.d.ts.map +1 -0
  421. package/dist/device/DeviceStateStore.d.ts +21 -0
  422. package/dist/device/DeviceStateStore.d.ts.map +1 -0
  423. package/dist/device/DeviceWalletSessionStore.d.ts +13 -1
  424. package/dist/device/DeviceWalletSessionStore.d.ts.map +1 -1
  425. package/dist/device/cloneDeviceState.d.ts +2 -0
  426. package/dist/device/cloneDeviceState.d.ts.map +1 -0
  427. package/dist/device/deviceIdentity.d.ts +5 -0
  428. package/dist/device/deviceIdentity.d.ts.map +1 -0
  429. package/dist/deviceProfile/buildDeviceFeatures.d.ts +3 -1
  430. package/dist/deviceProfile/buildDeviceFeatures.d.ts.map +1 -1
  431. package/dist/deviceProfile/index.d.ts +0 -1
  432. package/dist/deviceProfile/index.d.ts.map +1 -1
  433. package/dist/deviceProfile/protocolV2DeviceIdentity.d.ts +7 -0
  434. package/dist/deviceProfile/protocolV2DeviceIdentity.d.ts.map +1 -0
  435. package/dist/events/call.d.ts +0 -7
  436. package/dist/events/call.d.ts.map +1 -1
  437. package/dist/events/core.d.ts +2 -2
  438. package/dist/events/core.d.ts.map +1 -1
  439. package/dist/events/device.d.ts +12 -2
  440. package/dist/events/device.d.ts.map +1 -1
  441. package/dist/events/iframe.d.ts +0 -1
  442. package/dist/events/iframe.d.ts.map +1 -1
  443. package/dist/events/logBlockEvent.d.ts +2 -0
  444. package/dist/events/logBlockEvent.d.ts.map +1 -1
  445. package/dist/events/ui-promise.d.ts +4 -2
  446. package/dist/events/ui-promise.d.ts.map +1 -1
  447. package/dist/events/ui-request.d.ts +32 -2
  448. package/dist/events/ui-request.d.ts.map +1 -1
  449. package/dist/events/ui-response.d.ts +10 -2
  450. package/dist/events/ui-response.d.ts.map +1 -1
  451. package/dist/index.d.ts +1720 -849
  452. package/dist/index.d.ts.map +1 -1
  453. package/dist/index.js +11395 -4762
  454. package/dist/inject.d.ts +7 -3
  455. package/dist/inject.d.ts.map +1 -1
  456. package/dist/lowLevelInject.d.ts +1 -2
  457. package/dist/lowLevelInject.d.ts.map +1 -1
  458. package/dist/protocols/protocol-v2/deviceSession.d.ts +7 -0
  459. package/dist/protocols/protocol-v2/deviceSession.d.ts.map +1 -0
  460. package/dist/protocols/protocol-v2/features.d.ts +31 -8
  461. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  462. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
  463. package/dist/protocols/protocol-v2/index.d.ts +2 -2
  464. package/dist/protocols/protocol-v2/index.d.ts.map +1 -1
  465. package/dist/protocols/protocol-v2/resources.d.ts +17 -0
  466. package/dist/protocols/protocol-v2/resources.d.ts.map +1 -0
  467. package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts +17 -0
  468. package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts.map +1 -0
  469. package/dist/protocols/protocol-v2/uiInteraction.d.ts +7 -4
  470. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -1
  471. package/dist/protocols/protocol-v2/unlockPolicy.d.ts +2 -0
  472. package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -0
  473. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts +22 -0
  474. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts.map +1 -0
  475. package/dist/protocols/protocol-v2/walletSession.d.ts +16 -3
  476. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -1
  477. package/dist/topLevelInject.d.ts.map +1 -1
  478. package/dist/types/api/checkAllFirmwareRelease.d.ts +48 -9
  479. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  480. package/dist/types/api/checkBLEFirmwareRelease.d.ts +2 -13
  481. package/dist/types/api/checkBLEFirmwareRelease.d.ts.map +1 -1
  482. package/dist/types/api/checkBootloaderRelease.d.ts +2 -6
  483. package/dist/types/api/checkBootloaderRelease.d.ts.map +1 -1
  484. package/dist/types/api/checkFirmwareRelease.d.ts +2 -13
  485. package/dist/types/api/checkFirmwareRelease.d.ts.map +1 -1
  486. package/dist/types/api/checkFirmwareTypeAvailable.d.ts +2 -2
  487. package/dist/types/api/checkFirmwareTypeAvailable.d.ts.map +1 -1
  488. package/dist/types/api/detectDeviceConnectProtocol.d.ts +4 -0
  489. package/dist/types/api/detectDeviceConnectProtocol.d.ts.map +1 -0
  490. package/dist/types/api/deviceSettings.d.ts +11 -2
  491. package/dist/types/api/deviceSettings.d.ts.map +1 -1
  492. package/dist/types/api/deviceUnlock.d.ts +6 -2
  493. package/dist/types/api/deviceUnlock.d.ts.map +1 -1
  494. package/dist/types/api/deviceUpdateBootloader.d.ts +6 -0
  495. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  496. package/dist/types/api/export.d.ts +8 -3
  497. package/dist/types/api/export.d.ts.map +1 -1
  498. package/dist/types/api/firmwareUpdate.d.ts +67 -5
  499. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  500. package/dist/types/api/firmwareUpdateCapabilities.d.ts +9 -0
  501. package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +1 -0
  502. package/dist/types/api/firmwareUpdatePlan.d.ts +28 -0
  503. package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -0
  504. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +42 -0
  505. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +1 -0
  506. package/dist/types/api/getDeviceState.d.ts +12 -0
  507. package/dist/types/api/getDeviceState.d.ts.map +1 -0
  508. package/dist/types/api/getFeatures.d.ts.map +1 -1
  509. package/dist/types/api/getOnekeyFeatures.d.ts.map +1 -1
  510. package/dist/types/api/getPassphraseState.d.ts.map +1 -1
  511. package/dist/types/api/index.d.ts +25 -35
  512. package/dist/types/api/index.d.ts.map +1 -1
  513. package/dist/types/api/kaspaSignTransaction.d.ts +42 -4
  514. package/dist/types/api/kaspaSignTransaction.d.ts.map +1 -1
  515. package/dist/types/api/openWalletSession.d.ts +35 -0
  516. package/dist/types/api/openWalletSession.d.ts.map +1 -0
  517. package/dist/types/api/protocolV2.d.ts +11 -95
  518. package/dist/types/api/protocolV2.d.ts.map +1 -1
  519. package/dist/types/api/sessionCache.d.ts +4 -1
  520. package/dist/types/api/sessionCache.d.ts.map +1 -1
  521. package/dist/types/device.d.ts +138 -8
  522. package/dist/types/device.d.ts.map +1 -1
  523. package/dist/types/params.d.ts +1 -0
  524. package/dist/types/params.d.ts.map +1 -1
  525. package/dist/types/settings.d.ts +31 -16
  526. package/dist/types/settings.d.ts.map +1 -1
  527. package/dist/utils/assets.d.ts +2 -1
  528. package/dist/utils/assets.d.ts.map +1 -1
  529. package/dist/utils/deviceFeaturesCompat.d.ts +14 -0
  530. package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -0
  531. package/dist/utils/deviceFeaturesUtils.d.ts +10 -1
  532. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  533. package/dist/utils/deviceInfoUtils.d.ts +9 -9
  534. package/dist/utils/deviceInfoUtils.d.ts.map +1 -1
  535. package/dist/utils/deviceSettings.d.ts +39 -7
  536. package/dist/utils/deviceSettings.d.ts.map +1 -1
  537. package/dist/utils/deviceVersionUtils.d.ts +7 -5
  538. package/dist/utils/deviceVersionUtils.d.ts.map +1 -1
  539. package/dist/utils/homescreen.d.ts +4 -0
  540. package/dist/utils/homescreen.d.ts.map +1 -1
  541. package/dist/utils/index.d.ts +5 -4
  542. package/dist/utils/index.d.ts.map +1 -1
  543. package/dist/utils/networkUtils.d.ts +10 -1
  544. package/dist/utils/networkUtils.d.ts.map +1 -1
  545. package/dist/utils/patch.d.ts +1 -1
  546. package/dist/utils/patch.d.ts.map +1 -1
  547. package/dist/utils/pro2Nft.d.ts +38 -0
  548. package/dist/utils/pro2Nft.d.ts.map +1 -0
  549. package/dist/utils/pro2Wallpaper.d.ts +13 -1
  550. package/dist/utils/pro2Wallpaper.d.ts.map +1 -1
  551. package/dist/utils/tracing.d.ts.map +1 -1
  552. package/dist/utils/uiProgressThrottle.d.ts +3 -0
  553. package/dist/utils/uiProgressThrottle.d.ts.map +1 -0
  554. package/package.json +6 -4
  555. package/src/api/BaseMethod.ts +39 -25
  556. package/src/api/CheckAllFirmwareRelease.ts +440 -4
  557. package/src/api/CheckBLEFirmwareRelease.ts +37 -5
  558. package/src/api/CheckBootloaderRelease.ts +37 -5
  559. package/src/api/CheckFirmwareRelease.ts +36 -9
  560. package/src/api/CipherKeyValue.ts +4 -0
  561. package/src/api/ClearSessionCache.ts +4 -0
  562. package/src/api/DetectDeviceConnectProtocol.ts +18 -0
  563. package/src/api/DirList.ts +9 -4
  564. package/src/api/DirMake.ts +7 -4
  565. package/src/api/DirRemove.ts +7 -4
  566. package/src/api/FileDelete.ts +7 -4
  567. package/src/api/FileRead.ts +13 -7
  568. package/src/api/FileWrite.ts +7 -4
  569. package/src/api/FirmwareUpdate.ts +30 -15
  570. package/src/api/FirmwareUpdateV2.ts +535 -169
  571. package/src/api/FirmwareUpdateV3.ts +349 -91
  572. package/src/api/FirmwareUpdateV4.ts +2176 -699
  573. package/src/api/GetDeviceState.ts +59 -0
  574. package/src/api/GetFeatures.ts +6 -4
  575. package/src/api/GetOnekeyFeatures.ts +1 -75
  576. package/src/api/GetPassphraseState.ts +34 -13
  577. package/src/api/OpenWalletSession.ts +268 -0
  578. package/src/api/PathInfo.ts +9 -4
  579. package/src/api/PromptWebDeviceAccess.ts +3 -8
  580. package/src/api/SearchDevices.ts +35 -5
  581. package/src/api/UploadPortfolio.ts +29 -5
  582. package/src/api/alephium/AlephiumGetAddress.ts +0 -4
  583. package/src/api/alephium/AlephiumSignMessage.ts +0 -4
  584. package/src/api/alephium/AlephiumSignTransaction.ts +2 -6
  585. package/src/api/algo/AlgoGetAddress.ts +4 -0
  586. package/src/api/algo/AlgoSignTransaction.ts +4 -0
  587. package/src/api/allnetwork/AllNetworkGetAddress.ts +21 -21
  588. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +45 -32
  589. package/src/api/aptos/AptosGetAddress.ts +4 -0
  590. package/src/api/aptos/AptosGetPublicKey.ts +4 -0
  591. package/src/api/aptos/AptosSignInMessage.ts +4 -0
  592. package/src/api/aptos/AptosSignMessage.ts +4 -0
  593. package/src/api/aptos/AptosSignTransaction.ts +4 -0
  594. package/src/api/benfen/BenfenGetAddress.ts +11 -7
  595. package/src/api/benfen/BenfenGetPublicKey.ts +0 -4
  596. package/src/api/benfen/BenfenSignMessage.ts +0 -4
  597. package/src/api/benfen/BenfenSignTransaction.ts +0 -4
  598. package/src/api/btc/BTCGetAddress.ts +8 -1
  599. package/src/api/btc/BTCGetPublicKey.ts +9 -2
  600. package/src/api/btc/BTCSignMessage.ts +8 -1
  601. package/src/api/btc/BTCSignPsbt.ts +4 -0
  602. package/src/api/btc/BTCSignTransaction.ts +8 -1
  603. package/src/api/btc/BTCVerifyMessage.ts +8 -1
  604. package/src/api/btc/helpers/versionLimit.ts +7 -4
  605. package/src/api/cardano/CardanoGetAddress.ts +4 -0
  606. package/src/api/cardano/CardanoGetPublicKey.ts +4 -0
  607. package/src/api/cardano/CardanoSignMessage.ts +4 -0
  608. package/src/api/cardano/CardanoSignTransaction.ts +4 -0
  609. package/src/api/conflux/ConfluxGetAddress.ts +6 -0
  610. package/src/api/conflux/ConfluxSignMessage.ts +6 -0
  611. package/src/api/conflux/ConfluxSignMessageCIP23.ts +6 -0
  612. package/src/api/conflux/ConfluxSignTransaction.ts +8 -5
  613. package/src/api/cosmos/CosmosGetAddress.ts +4 -0
  614. package/src/api/cosmos/CosmosGetPublicKey.ts +4 -0
  615. package/src/api/cosmos/CosmosSignTransaction.ts +4 -0
  616. package/src/api/device/DeviceCancel.ts +4 -0
  617. package/src/api/device/DeviceChangePin.ts +9 -1
  618. package/src/api/device/DeviceFullyUploadResource.ts +4 -5
  619. package/src/api/device/DeviceLock.ts +4 -0
  620. package/src/api/device/DeviceRebootToBoardloader.ts +8 -1
  621. package/src/api/device/DeviceRebootToBootloader.ts +8 -1
  622. package/src/api/device/DeviceSettings.ts +211 -3
  623. package/src/api/device/DeviceSupportFeatures.ts +4 -0
  624. package/src/api/device/DeviceUnlock.ts +12 -3
  625. package/src/api/device/DeviceUpdateBootloader.ts +152 -8
  626. package/src/api/device/DeviceVerify.ts +25 -0
  627. package/src/api/device/DeviceWipe.ts +11 -1
  628. package/src/api/device/PreInitialize.ts +4 -0
  629. package/src/api/dynex/DnxGetAddress.ts +0 -6
  630. package/src/api/dynex/DnxSignTransaction.ts +0 -6
  631. package/src/api/evm/EVMGetAddress.ts +6 -2
  632. package/src/api/evm/EVMGetPublicKey.ts +6 -2
  633. package/src/api/evm/EVMSignMessage.ts +6 -2
  634. package/src/api/evm/EVMSignMessageEIP712.ts +1 -11
  635. package/src/api/evm/EVMSignTransaction.ts +6 -2
  636. package/src/api/evm/EVMSignTypedData.ts +42 -50
  637. package/src/api/evm/EVMVerifyMessage.ts +6 -2
  638. package/src/api/evm/legacyV1/getAddress.ts +2 -2
  639. package/src/api/evm/legacyV1/getPublicKey.ts +2 -2
  640. package/src/api/evm/legacyV1/signMessage.ts +2 -2
  641. package/src/api/evm/legacyV1/signTypedData.ts +2 -2
  642. package/src/api/evm/legacyV1/signTypedHash.ts +2 -2
  643. package/src/api/evm/legacyV1/verifyMessage.ts +2 -2
  644. package/src/api/evm/protocol.ts +6 -0
  645. package/src/api/filecoin/FilecoinGetAddress.ts +4 -0
  646. package/src/api/filecoin/FilecoinSignTransaction.ts +4 -0
  647. package/src/api/firmware/FirmwareArtifactSource.ts +305 -0
  648. package/src/api/firmware/FirmwareHostBinding.ts +123 -0
  649. package/src/api/firmware/FirmwarePreparationError.ts +12 -0
  650. package/src/api/firmware/FirmwarePreparedResourceArchive.ts +196 -0
  651. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +214 -77
  652. package/src/api/firmware/FirmwareUpdateCapabilities.ts +9 -0
  653. package/src/api/firmware/FirmwareUpdatePlan.ts +905 -0
  654. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +490 -0
  655. package/src/api/firmware/getBinary.ts +8 -3
  656. package/src/api/firmware/protocolV2Release.ts +173 -0
  657. package/src/api/firmware/updateBootloader.ts +19 -4
  658. package/src/api/firmware/uploadFirmware.ts +157 -26
  659. package/src/api/helpers/base64Data.ts +85 -0
  660. package/src/api/helpers/batchGetPublickeys.ts +2 -2
  661. package/src/api/helpers/filesystemValidation.ts +61 -0
  662. package/src/api/helpers/paramsValidator.ts +1 -1
  663. package/src/api/helpers/protocolV2FileWrite.ts +260 -60
  664. package/src/api/index.ts +6 -30
  665. package/src/api/kaspa/KaspaGetAddress.ts +7 -0
  666. package/src/api/kaspa/KaspaSignTransaction.ts +369 -29
  667. package/src/api/kaspa/helpers/TransferSerialize.ts +17 -7
  668. package/src/api/lightning/LnurlAuth.ts +0 -4
  669. package/src/api/near/NearGetAddress.ts +4 -0
  670. package/src/api/near/NearSignTransaction.ts +4 -0
  671. package/src/api/nem/NEMGetAddress.ts +4 -0
  672. package/src/api/nem/NEMSignTransaction.ts +4 -0
  673. package/src/api/neo/NeoGetAddress.ts +0 -4
  674. package/src/api/neo/NeoSignTransaction.ts +0 -4
  675. package/src/api/nervos/NervosGetAddress.ts +0 -4
  676. package/src/api/nervos/NervosSignTransaction.ts +2 -6
  677. package/src/api/nexa/NexaGetAddress.ts +0 -4
  678. package/src/api/nexa/NexaSignTransaction.ts +3 -5
  679. package/src/api/nostr/NostrDecryptMessage.ts +4 -0
  680. package/src/api/nostr/NostrEncryptMessage.ts +4 -0
  681. package/src/api/nostr/NostrGetPublicKey.ts +4 -0
  682. package/src/api/nostr/NostrSignEvent.ts +4 -0
  683. package/src/api/nostr/NostrSignSchnorr.ts +4 -0
  684. package/src/api/polkadot/PolkadotGetAddress.ts +4 -0
  685. package/src/api/polkadot/PolkadotSignTransaction.ts +4 -0
  686. package/src/api/polkadot/networks.ts +3 -3
  687. package/src/api/protocol-v2/DeviceFactoryInfoGet.ts +5 -2
  688. package/src/api/protocol-v2/DeviceFactoryInfoSet.ts +6 -3
  689. package/src/api/protocol-v2/DeviceFirmwareUpdate.ts +13 -32
  690. package/src/api/protocol-v2/DeviceGetFirmwareUpdateStatus.ts +10 -6
  691. package/src/api/protocol-v2/DeviceGetOnboardingStatus.ts +6 -3
  692. package/src/api/protocol-v2/DeviceInfoGet.ts +11 -17
  693. package/src/api/protocol-v2/DeviceReboot.ts +12 -3
  694. package/src/api/protocol-v2/DeviceStatusGet.ts +5 -1
  695. package/src/api/protocol-v2/DeviceUploadNft.ts +249 -0
  696. package/src/api/protocol-v2/DeviceUploadWallpaper.ts +67 -20
  697. package/src/api/protocol-v2/FilesystemFormat.ts +5 -2
  698. package/src/api/protocol-v2/FilesystemPermissionFix.ts +5 -2
  699. package/src/api/protocol-v2/Ping.ts +37 -3
  700. package/src/api/protocol-v2/ProtocolInfoRequest.ts +8 -3
  701. package/src/api/protocol-v2/helpers.ts +1 -1
  702. package/src/api/scdo/ScdoGetAddress.ts +0 -4
  703. package/src/api/scdo/ScdoSignMessage.ts +0 -4
  704. package/src/api/scdo/ScdoSignTransaction.ts +0 -4
  705. package/src/api/solana/SolGetAddress.ts +4 -0
  706. package/src/api/solana/SolSignMessage.ts +5 -1
  707. package/src/api/solana/SolSignOffchainMessage.ts +5 -1
  708. package/src/api/solana/SolSignTransaction.ts +6 -2
  709. package/src/api/starcoin/StarcoinGetAddress.ts +4 -0
  710. package/src/api/starcoin/StarcoinGetPublicKey.ts +4 -0
  711. package/src/api/starcoin/StarcoinSignMessage.ts +4 -0
  712. package/src/api/starcoin/StarcoinSignTransaction.ts +4 -0
  713. package/src/api/starcoin/StarcoinVerifyMessage.ts +4 -0
  714. package/src/api/stellar/StellarGetAddress.ts +1 -10
  715. package/src/api/stellar/StellarSignTransaction.ts +1 -14
  716. package/src/api/sui/SuiGetAddress.ts +5 -1
  717. package/src/api/sui/SuiGetPublicKey.ts +5 -1
  718. package/src/api/sui/SuiSignMessage.ts +5 -1
  719. package/src/api/sui/SuiSignTransaction.ts +5 -1
  720. package/src/api/ton/TonGetAddress.ts +5 -1
  721. package/src/api/ton/TonSignData.ts +5 -1
  722. package/src/api/ton/TonSignMessage.ts +10 -4
  723. package/src/api/ton/TonSignProof.ts +5 -1
  724. package/src/api/tron/TronGetAddress.ts +4 -0
  725. package/src/api/tron/TronSignMessage.ts +19 -8
  726. package/src/api/tron/TronSignTransaction.ts +5 -1
  727. package/src/api/utils.ts +32 -3
  728. package/src/api/xrp/XrpGetAddress.ts +4 -0
  729. package/src/api/xrp/XrpSignTransaction.ts +5 -1
  730. package/src/constants/index.ts +1 -4
  731. package/src/core/RequestQueue.ts +0 -18
  732. package/src/core/deviceEventRegistration.ts +4 -0
  733. package/src/core/index.ts +486 -200
  734. package/src/core/uiPromiseRegistry.ts +63 -0
  735. package/src/data/messages/messages-protocol-v2.json +515 -540
  736. package/src/data/messages/messages.json +286 -1
  737. package/src/data-manager/DataManager.ts +162 -44
  738. package/src/data-manager/TransportManager.ts +10 -2
  739. package/src/data-manager/connectSettings.ts +11 -0
  740. package/src/device/Device.ts +1016 -254
  741. package/src/device/DeviceCommands.ts +175 -157
  742. package/src/device/DeviceConnector.ts +59 -22
  743. package/src/device/DeviceFeaturesState.ts +25 -0
  744. package/src/device/DevicePool.ts +96 -19
  745. package/src/device/DeviceStateMapper.ts +422 -0
  746. package/src/device/DeviceStateProjector.ts +152 -0
  747. package/src/device/DeviceStateStore.ts +232 -0
  748. package/src/device/DeviceWalletSessionStore.ts +72 -6
  749. package/src/device/cloneDeviceState.ts +39 -0
  750. package/src/device/deviceIdentity.ts +18 -0
  751. package/src/deviceProfile/buildDeviceFeatures.ts +199 -188
  752. package/src/deviceProfile/index.ts +0 -1
  753. package/src/deviceProfile/protocolV2DeviceIdentity.ts +35 -0
  754. package/src/events/call.ts +0 -6
  755. package/src/events/core.ts +0 -2
  756. package/src/events/device.ts +18 -1
  757. package/src/events/iframe.ts +0 -1
  758. package/src/events/logBlockEvent.ts +93 -2
  759. package/src/events/ui-promise.ts +4 -2
  760. package/src/events/ui-request.ts +37 -2
  761. package/src/events/ui-response.ts +12 -2
  762. package/src/index.ts +7 -4
  763. package/src/inject.ts +89 -55
  764. package/src/lowLevelInject.ts +11 -7
  765. package/src/protocols/protocol-v2/deviceSession.ts +24 -0
  766. package/src/protocols/protocol-v2/features.ts +104 -45
  767. package/src/protocols/protocol-v2/firmware.ts +3 -1
  768. package/src/protocols/protocol-v2/index.ts +9 -2
  769. package/src/protocols/protocol-v2/resources.ts +173 -0
  770. package/src/protocols/protocol-v2/settingsUnlockPolicy.ts +65 -0
  771. package/src/protocols/protocol-v2/uiInteraction.ts +50 -9
  772. package/src/protocols/protocol-v2/unlockPolicy.ts +1 -0
  773. package/src/protocols/protocol-v2/unlockPolicyRunner.ts +136 -0
  774. package/src/protocols/protocol-v2/walletSession.ts +395 -130
  775. package/src/topLevelInject.ts +11 -6
  776. package/src/types/api/checkAllFirmwareRelease.ts +72 -9
  777. package/src/types/api/checkBLEFirmwareRelease.ts +4 -13
  778. package/src/types/api/checkBootloaderRelease.ts +2 -6
  779. package/src/types/api/checkFirmwareRelease.ts +2 -13
  780. package/src/types/api/checkFirmwareTypeAvailable.ts +2 -2
  781. package/src/types/api/detectDeviceConnectProtocol.ts +6 -0
  782. package/src/types/api/deviceSettings.ts +26 -2
  783. package/src/types/api/deviceUnlock.ts +13 -2
  784. package/src/types/api/deviceUpdateBootloader.ts +7 -0
  785. package/src/types/api/export.ts +33 -1
  786. package/src/types/api/firmwareUpdate.ts +85 -11
  787. package/src/types/api/firmwareUpdateCapabilities.ts +9 -0
  788. package/src/types/api/firmwareUpdatePlan.ts +38 -0
  789. package/src/types/api/firmwareUpdatePreparedPlan.ts +53 -0
  790. package/src/types/api/getDeviceState.ts +19 -0
  791. package/src/types/api/getFeatures.ts +3 -0
  792. package/src/types/api/getOnekeyFeatures.ts +3 -0
  793. package/src/types/api/getPassphraseState.ts +7 -0
  794. package/src/types/api/index.ts +43 -73
  795. package/src/types/api/kaspaSignTransaction.ts +60 -4
  796. package/src/types/api/openWalletSession.ts +54 -0
  797. package/src/types/api/protocolV2.ts +23 -190
  798. package/src/types/api/sessionCache.ts +9 -4
  799. package/src/types/device.ts +206 -9
  800. package/src/types/params.ts +9 -2
  801. package/src/types/settings.ts +37 -25
  802. package/src/utils/assets.ts +4 -1
  803. package/src/utils/deviceFeaturesCompat.ts +196 -0
  804. package/src/utils/deviceFeaturesUtils.ts +34 -14
  805. package/src/utils/deviceInfoUtils.ts +37 -70
  806. package/src/utils/deviceSettings.ts +181 -39
  807. package/src/utils/deviceVersionUtils.ts +25 -44
  808. package/src/utils/findDefectiveBatchDevice.ts +3 -3
  809. package/src/utils/homescreen.ts +37 -7
  810. package/src/utils/index.ts +26 -7
  811. package/src/utils/networkUtils.ts +274 -16
  812. package/src/utils/pro2Nft.ts +165 -0
  813. package/src/utils/pro2Wallpaper.ts +241 -26
  814. package/src/utils/tracing.ts +3 -1
  815. package/src/utils/uiProgressThrottle.ts +63 -0
  816. package/tsconfig.type-tests.json +12 -0
  817. package/__tests__/RequestQueue.test.ts +0 -34
  818. package/dist/api/GetDeviceInfo.d.ts +0 -9
  819. package/dist/api/GetDeviceInfo.d.ts.map +0 -1
  820. package/dist/api/firmware/progressThrottle.d.ts +0 -3
  821. package/dist/api/firmware/progressThrottle.d.ts.map +0 -1
  822. package/dist/api/protocol-v2/DeviceSessionOpen.d.ts +0 -28
  823. package/dist/api/protocol-v2/DeviceSessionOpen.d.ts.map +0 -1
  824. package/dist/api/protocol-v2/DeviceSettingsGet.d.ts +0 -6
  825. package/dist/api/protocol-v2/DeviceSettingsGet.d.ts.map +0 -1
  826. package/dist/api/protocol-v2/DeviceSettingsPageShow.d.ts +0 -16
  827. package/dist/api/protocol-v2/DeviceSettingsPageShow.d.ts.map +0 -1
  828. package/dist/api/protocol-v2/DeviceSettingsSet.d.ts +0 -12
  829. package/dist/api/protocol-v2/DeviceSettingsSet.d.ts.map +0 -1
  830. package/dist/deviceProfile/buildDeviceProfile.d.ts +0 -22
  831. package/dist/deviceProfile/buildDeviceProfile.d.ts.map +0 -1
  832. package/dist/protocols/protocol-v2/lockedError.d.ts +0 -2
  833. package/dist/protocols/protocol-v2/lockedError.d.ts.map +0 -1
  834. package/dist/protocols/protocol-v2/unlockRetry.d.ts +0 -11
  835. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +0 -1
  836. package/dist/types/api/getDeviceInfo.d.ts +0 -88
  837. package/dist/types/api/getDeviceInfo.d.ts.map +0 -1
  838. package/src/api/GetDeviceInfo.ts +0 -152
  839. package/src/api/firmware/progressThrottle.ts +0 -44
  840. package/src/api/protocol-v2/DeviceSessionOpen.ts +0 -100
  841. package/src/api/protocol-v2/DeviceSettingsGet.ts +0 -16
  842. package/src/api/protocol-v2/DeviceSettingsPageShow.ts +0 -67
  843. package/src/api/protocol-v2/DeviceSettingsSet.ts +0 -49
  844. package/src/deviceProfile/buildDeviceProfile.ts +0 -370
  845. package/src/protocols/protocol-v2/lockedError.ts +0 -10
  846. package/src/protocols/protocol-v2/unlockRetry.ts +0 -76
  847. package/src/types/api/getDeviceInfo.ts +0 -106
package/src/core/index.ts CHANGED
@@ -1,7 +1,13 @@
1
1
  import semver from 'semver';
2
2
  import EventEmitter from 'events';
3
+ import {
4
+ DeviceSessionPinType,
5
+ TRANSPORT_EVENT,
6
+ isProtocolV2LinkDisabledError,
7
+ } from '@onekeyfe/hd-transport';
3
8
  import {
4
9
  ERRORS,
10
+ ERROR_CODES_REQUIRE_DISCONNECT,
5
11
  ERROR_CODES_REQUIRE_RELEASE,
6
12
  HardwareError,
7
13
  HardwareErrorCode,
@@ -14,14 +20,7 @@ import {
14
20
  createNewFirmwareUnReleaseHardwareError,
15
21
  } from '@onekeyfe/hd-shared';
16
22
 
17
- import {
18
- LoggerNames,
19
- enableLog,
20
- getLogger,
21
- isMethodVersionRangeUnsupported,
22
- setLoggerPostMessage,
23
- wait,
24
- } from '../utils';
23
+ import { LoggerNames, enableLog, getLogger, setLoggerPostMessage, wait } from '../utils';
25
24
  import {
26
25
  findDefectiveBatchDevice,
27
26
  getDefectiveDeviceInfo,
@@ -32,10 +31,12 @@ import {
32
31
  createRequestContext,
33
32
  createSdkTracingContext,
34
33
  formatRequestContext,
34
+ generateInstanceId,
35
35
  getActiveRequestsByDeviceInstance,
36
36
  updateRequestContext,
37
37
  } from '../utils/tracing';
38
38
  import { Device } from '../device/Device';
39
+ import { checkLiveDeviceId } from '../device/deviceIdentity';
39
40
  import { DeviceList } from '../device/DeviceList';
40
41
  import { DevicePool } from '../device/DevicePool';
41
42
  import { PollingStateManager } from './PollingStateManager';
@@ -51,28 +52,38 @@ import {
51
52
  createDeviceMessage,
52
53
  createResponseMessage,
53
54
  createUiMessage,
55
+ formatLogMethodLabel,
56
+ getLogBlockLabel,
57
+ getSafeLogPayload,
54
58
  } from '../events';
55
59
  import TransportManager from '../data-manager/TransportManager';
56
60
  import DeviceConnector from '../device/DeviceConnector';
57
61
  import RequestQueue from './RequestQueue';
62
+ import { consumeUiPromise, findUiPromiseForResponse, rejectUiPromises } from './uiPromiseRegistry';
58
63
  import { registerHardwareUiEventListeners } from './deviceEventRegistration';
59
64
  import { getSynchronize } from '../utils/getSynchronize';
60
- import { runMethodWithUnlockRetry } from '../protocols/protocol-v2/unlockRetry';
65
+ import { runMethodWithUnlockPolicy } from '../protocols/protocol-v2/unlockPolicyRunner';
61
66
  import {
62
67
  ProtocolV2UiInteractionCoordinator,
63
68
  isProtocolV2UiEnabled,
64
69
  } from '../protocols/protocol-v2/uiInteraction';
70
+ import { createUiProgressMessageFilter } from '../utils/uiProgressThrottle';
65
71
 
66
72
  import type { ConnectSettings, Features, KnownDevice } from '../types';
67
73
  import type { CoreMessage, IFrameCallMessage, UiPromise, UiPromiseResponse } from '../events';
68
74
  import type { DeviceEvents, InitOptions, RunOptions } from '../device/Device';
69
75
  import type { SdkTracingContext } from '../utils/tracing';
70
76
  import type { Deferred } from '@onekeyfe/hd-shared';
71
- import type { LowlevelTransportSharedPlugin, OneKeyDeviceInfo } from '@onekeyfe/hd-transport';
77
+ import type {
78
+ LowlevelTransportSharedPlugin,
79
+ OneKeyDeviceInfo,
80
+ TransportDeviceDisconnectEvent,
81
+ } from '@onekeyfe/hd-transport';
72
82
  import type { BaseMethod } from '../api/BaseMethod';
73
83
 
74
84
  const Log = getLogger(LoggerNames.Core);
75
85
  const PRE_INITIALIZE_TTL_MS = 60 * 1000;
86
+ const PRE_PENDING_CALL_TIMEOUT_MS = 15 * 1000;
76
87
 
77
88
  // Dedup/coalesce state for "pre-warm signal" methods (isPreWarmSignal),
78
89
  // keyed by getPreWarmKey(): coalesce in-flight, skip if warmed within TTL.
@@ -97,14 +108,15 @@ function hasDeriveCardano(method: BaseMethod): boolean {
97
108
 
98
109
  const parseInitOptions = (method?: BaseMethod): InitOptions => ({
99
110
  initSession: method?.payload.initSession,
100
- passphraseState: method?.payload.passphraseState,
111
+ passphraseState: method?.payload.useEmptyPassphrase ? undefined : method?.payload.passphraseState,
101
112
  deviceId: method?.payload.deviceId,
102
113
  deriveCardano: method && hasDeriveCardano(method),
103
114
  connectProtocol: method?.payload.connectProtocol,
115
+ forceProtocolDetection: method?.payload.forceProtocolDetection,
104
116
  protocolV2DeviceInfoTimeoutMs: method?.payload.protocolV2DeviceInfoTimeoutMs,
105
117
  });
106
118
 
107
- let _core: Core;
119
+ let _core: Core | undefined;
108
120
  let _deviceList: DeviceList | undefined;
109
121
  let _connector: DeviceConnector | undefined;
110
122
  let _uiPromises: UiPromise<UiPromiseResponse['type']>[] = []; // Waiting for ui response
@@ -129,6 +141,9 @@ const toError = (error: unknown): Error | undefined => {
129
141
  }
130
142
  };
131
143
 
144
+ const isExpectedCompatibilityError = (error: unknown) =>
145
+ error instanceof HardwareError && error.errorCode === HardwareErrorCode.DeviceNotSupportMethod;
146
+
132
147
  const updateMethodRequestContext = (method: BaseMethod, updates: any) => {
133
148
  if (method.requestContext) {
134
149
  updateRequestContext(method.requestContext.responseID, updates);
@@ -148,11 +163,16 @@ export const callAPI = async (context: CoreContext, message: CoreMessage) => {
148
163
  }
149
164
 
150
165
  // find api method
151
- let method: BaseMethod;
166
+ let method!: BaseMethod;
152
167
  try {
153
168
  method = findMethod(message as IFrameCallMessage);
154
169
  method.connector = _connector;
155
- method.postMessage = postMessage;
170
+ const shouldPostMessage = createUiProgressMessageFilter();
171
+ method.postMessage = event => {
172
+ if (shouldPostMessage(event)) {
173
+ postMessage(event);
174
+ }
175
+ };
156
176
  method.setContext?.(context);
157
177
 
158
178
  method.requestContext = createRequestContext(method.responseID, method.name, {
@@ -164,11 +184,13 @@ export const callAPI = async (context: CoreContext, message: CoreMessage) => {
164
184
 
165
185
  method.init();
166
186
  } catch (error) {
167
- return Promise.reject(error);
187
+ if (method) {
188
+ completeMethodRequestContext(method, error);
189
+ method.dispose();
190
+ }
191
+ return createResponseMessage(method?.responseID ?? message.id, false, { error });
168
192
  }
169
193
 
170
- DevicePool.emitter.on(DEVICE.CONNECT, onDeviceConnectHandler);
171
-
172
194
  if (!method.useDevice) {
173
195
  updateMethodRequestContext(method, { status: 'running' });
174
196
  try {
@@ -275,26 +297,35 @@ const handlePreWarmSignal = async (
275
297
  }
276
298
  };
277
299
 
278
- const waitWithTimeout = async (promise: Promise<any>, timeout: number) => {
279
- const timeoutPromise = new Promise((_, reject) => {
280
- setTimeout(() => reject(new Error('Request timeout')), timeout);
281
- });
282
- return Promise.race([promise, timeoutPromise]);
283
- };
284
-
285
300
  const waitForPendingPromise = async (
286
- getPrePendingCallPromise: () => Promise<void> | undefined,
287
- removePrePendingCallPromise?: (promise: Promise<void> | undefined) => void
301
+ connectId: string,
302
+ getPrePendingCallPromise: (connectId: string) => Promise<void> | undefined,
303
+ removePrePendingCallPromise?: (connectId: string, promise: Promise<void>) => void
288
304
  ) => {
289
- const pendingPromise = getPrePendingCallPromise();
305
+ const pendingPromise = getPrePendingCallPromise(connectId);
290
306
  if (pendingPromise) {
291
307
  Log.debug('pre pending call promise before call method, wait for it');
308
+ let timer: ReturnType<typeof setTimeout> | undefined;
309
+ let timedOut = false;
292
310
  try {
293
- await waitWithTimeout(pendingPromise, 5 * 1000);
311
+ await Promise.race([
312
+ pendingPromise,
313
+ new Promise<void>(resolve => {
314
+ timer = setTimeout(() => {
315
+ timedOut = true;
316
+ resolve();
317
+ }, PRE_PENDING_CALL_TIMEOUT_MS);
318
+ }),
319
+ ]);
294
320
  } catch (error) {
295
- // ignore timeout error
321
+ // Cancellation is best-effort; the transport teardown owns recovery.
322
+ } finally {
323
+ if (timer) clearTimeout(timer);
324
+ removePrePendingCallPromise?.(connectId, pendingPromise);
325
+ }
326
+ if (timedOut) {
327
+ Log.warn('pre pending call promise timed out before call method', { connectId });
296
328
  }
297
- removePrePendingCallPromise?.(pendingPromise);
298
329
  Log.debug('pre pending call promise before call method done');
299
330
  }
300
331
  };
@@ -306,7 +337,7 @@ const onCallDevice = async (
306
337
  ): Promise<any> => {
307
338
  let messageResponse: any;
308
339
 
309
- const { requestQueue, getPrePendingCallPromise, setPrePendingCallPromise } = context;
340
+ const { requestQueue, getPrePendingCallPromise, removePrePendingCallPromise } = context;
310
341
 
311
342
  updateMethodRequestContext(method, { status: 'running' });
312
343
 
@@ -334,7 +365,11 @@ const onCallDevice = async (
334
365
  await context.waitForCallbackTasks(method.connectId);
335
366
  }
336
367
 
337
- await waitForPendingPromise(getPrePendingCallPromise, setPrePendingCallPromise);
368
+ await waitForPendingPromise(
369
+ method.connectId ?? '',
370
+ getPrePendingCallPromise,
371
+ removePrePendingCallPromise
372
+ );
338
373
 
339
374
  const task = requestQueue.createTask(method);
340
375
 
@@ -363,7 +398,7 @@ const onCallDevice = async (
363
398
  );
364
399
  } catch (e) {
365
400
  preWarmCallbackTask?.resolve();
366
- console.log('ensureConnected error: ', e);
401
+ Log.debug('ensureConnected error: ', e);
367
402
 
368
403
  completeMethodRequestContext(method, e);
369
404
 
@@ -402,6 +437,8 @@ const onCallDevice = async (
402
437
 
403
438
  registerHardwareUiEventListeners(device, {
404
439
  pin: onDevicePinHandler,
440
+ pinOnDevice: onEnterPinOnDeviceHandler,
441
+ pinOnDeviceComplete: onPinOnDeviceCompleteHandler,
405
442
  button: onDeviceButtonHandler,
406
443
  passphrase: message.payload.useEmptyPassphrase
407
444
  ? onEmptyPassphraseHandler
@@ -410,12 +447,16 @@ const onCallDevice = async (
410
447
  attachPinOnDevice: onEnterAttachPinOnDeviceHandler,
411
448
  });
412
449
  device.on(DEVICE.FEATURES, onDeviceFeaturesHandler);
450
+ device.on(DEVICE.STATE, onDeviceStateHandler);
413
451
  device.on(
414
452
  DEVICE.SELECT_DEVICE_IN_BOOTLOADER_FOR_WEB_DEVICE,
415
453
  onSelectDeviceInBootloaderForWebDeviceHandler
416
454
  );
417
455
 
418
456
  const protocolV2UiCoordinator = new ProtocolV2UiInteractionCoordinator(device, postMessage);
457
+ let protocolV2Operation = false;
458
+ let protocolV2CloseEmitted = false;
459
+ device.beginProtocolV2UiInteraction();
419
460
  device.on(
420
461
  DEVICE.SELECT_DEVICE_FOR_SWITCH_FIRMWARE_WEB_DEVICE,
421
462
  onSelectDeviceForSwitchFirmwareWebDeviceHandler
@@ -427,14 +468,17 @@ const onCallDevice = async (
427
468
  await context.waitForCallbackTasks(method.connectId, preWarmCallbackTask);
428
469
  }
429
470
 
430
- await waitForPendingPromise(getPrePendingCallPromise, setPrePendingCallPromise);
471
+ await waitForPendingPromise(
472
+ method.connectId ?? '',
473
+ getPrePendingCallPromise,
474
+ removePrePendingCallPromise
475
+ );
431
476
 
432
477
  const inner = async (): Promise<void> => {
433
- // Protocol V2 专属方法统一守卫:协议在 acquire/initialize 后已确定,
434
- // V2 设备直接抛出明确的 NotSupport 错误(见 BaseMethod.requireProtocolV2)。
435
- if (method.requireProtocolV2 && !device.isProtocolV2()) {
436
- throw createDeviceNotSupportMethodError(method.name, device.getCurrentFirmwareType());
437
- }
478
+ // Protocol is established from an active device response during acquire/initialize.
479
+ // Reject unsupported methods before any method-specific device command is sent.
480
+ method.assertProtocolSupported(device.getProtocol(), device.getCurrentFirmwareType());
481
+ protocolV2Operation = device.isProtocolV2();
438
482
 
439
483
  // check firmware version
440
484
  const versionRange = device.getCurrentMethodVersionRange(
@@ -445,8 +489,8 @@ const onCallDevice = async (
445
489
  const deviceFirmwareType = device.getCurrentFirmwareType();
446
490
  let newVersionStatus: ReturnType<typeof DataManager.getFirmwareStatus> | undefined;
447
491
 
448
- // 故障批次检测与远端强制升级门禁基于 V1 features/remote config
449
- // Pro2(V2) 暂不参与:profile 版的 firmwareStatus 需要 DataManager 支持后再接入。
492
+ // Defective-batch and forced-update gates depend on V1 features/remote config.
493
+ // Pro2 joins after DataManager supports its profile firmwareStatus.
450
494
  if (device.features && !device.isProtocolV2()) {
451
495
  await DataManager.checkAndReloadData();
452
496
 
@@ -494,10 +538,6 @@ const onCallDevice = async (
494
538
  }
495
539
  }
496
540
 
497
- if (isMethodVersionRangeUnsupported(versionRange)) {
498
- throw createDeviceNotSupportMethodError(method.name, deviceFirmwareType);
499
- }
500
-
501
541
  if (versionRange) {
502
542
  if (semver.valid(versionRange.min) && semver.lt(currentFirmwareVersion, versionRange.min)) {
503
543
  if (newVersionStatus === 'none' || newVersionStatus === 'valid') {
@@ -548,93 +588,102 @@ const onCallDevice = async (
548
588
  );
549
589
  }
550
590
 
551
- if (method.deviceId && method.checkDeviceId) {
552
- const isSameDeviceID = device.checkDeviceId(method.deviceId);
553
- if (!isSameDeviceID) {
554
- return Promise.reject(ERRORS.TypedError(HardwareErrorCode.DeviceCheckDeviceIdError));
555
- }
556
- }
557
-
558
- /**
559
- * check firmware release info
560
- */
561
- method.checkFirmwareRelease();
591
+ try {
592
+ let deviceIdCheckedDuringUnlockPreflight = false;
593
+ const response = await runMethodWithUnlockPolicy<object>(method, device, {
594
+ uiCoordinator: protocolV2UiCoordinator,
595
+ afterStatusBeforeUnlock: () => {
596
+ if (method.deviceId && method.checkDeviceId) {
597
+ if (!device.checkDeviceId(method.deviceId)) {
598
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckDeviceIdError);
599
+ }
600
+ deviceIdCheckedDuringUnlockPreflight = true;
601
+ }
602
+ },
603
+ prepare: async () => {
604
+ if (method.deviceId && method.checkDeviceId && !deviceIdCheckedDuringUnlockPreflight) {
605
+ const isSameDeviceID = await checkLiveDeviceId(device, method.deviceId);
606
+ if (!isSameDeviceID) {
607
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckDeviceIdError);
608
+ }
609
+ }
562
610
 
563
- /**
564
- * check additional supported feature
565
- */
566
- method.checkDeviceSupportFeature();
611
+ /**
612
+ * check firmware release info
613
+ */
614
+ method.checkFirmwareRelease();
567
615
 
568
- // reconfigure messages
569
- if (_deviceList && device.features && !device.isProtocolV2()) {
570
- await TransportManager.reconfigure(device.features);
571
- }
616
+ /**
617
+ * check additional supported feature
618
+ */
619
+ method.checkDeviceSupportFeature();
572
620
 
573
- // Check to see if it is safe to use Passphrase
574
- checkPassphraseEnableState(method, device.features);
621
+ // reconfigure messages
622
+ if (_deviceList && device.features && !device.isProtocolV2()) {
623
+ await TransportManager.reconfigure(device.features);
624
+ }
575
625
 
576
- if (shouldCheckPassphraseState(method, device)) {
577
- // check version
578
- const support = device.supportNewPassphrase();
579
- if (!support.support) {
580
- return Promise.reject(
581
- ERRORS.TypedError(
582
- HardwareErrorCode.DeviceNotSupportPassphrase,
583
- `Device not support passphrase, please update to ${support.require}`,
584
- {
585
- require: support.require,
626
+ // Check to see if it is safe to use Passphrase
627
+ checkPassphraseEnableState(method, device.features);
628
+
629
+ if (shouldCheckPassphraseState(method, device)) {
630
+ // check version
631
+ const support = device.supportNewPassphrase();
632
+ if (!support.support) {
633
+ throw ERRORS.TypedError(
634
+ HardwareErrorCode.DeviceNotSupportPassphrase,
635
+ `Device not support passphrase, please update to ${support.require}`,
636
+ {
637
+ require: support.require,
638
+ }
639
+ );
586
640
  }
587
- )
588
- );
589
- }
590
641
 
591
- // Check Device passphrase State
592
- const passphraseStateSafety = await device.checkPassphraseStateSafety(
593
- method.payload?.passphraseState,
594
- method.payload?.useEmptyPassphrase,
595
- method.payload?.skipPassphraseCheck
596
- );
642
+ // Check Device passphrase State after the Protocol V2 pre-unlock gate.
643
+ const passphraseStateSafety = await device.checkPassphraseStateSafety(
644
+ method.payload?.passphraseState,
645
+ method.payload?.useEmptyPassphrase,
646
+ method.payload?.skipPassphraseCheck,
647
+ hasDeriveCardano(method)
648
+ );
597
649
 
598
- // Double check, handles the special case of Touch/Pro
599
- checkPassphraseEnableState(method, device.features);
600
-
601
- if (!passphraseStateSafety) {
602
- DevicePool.clearDeviceCache(method.payload.connectId);
603
- return Promise.reject(
604
- ERRORS.TypedError(HardwareErrorCode.DeviceCheckPassphraseStateError)
605
- );
606
- }
650
+ // Double check, handles the special case of Touch/Pro
651
+ checkPassphraseEnableState(method, device.features);
607
652
 
608
- // close pin popup window
609
- postMessage(createUiMessage(UI_REQUEST.CLOSE_UI_PIN_WINDOW));
610
- }
653
+ if (!passphraseStateSafety) {
654
+ DevicePool.clearDeviceCache(method.payload.connectId);
655
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckPassphraseStateError);
656
+ }
611
657
 
612
- // Automatic check safety_check level for Kovan, Ropsten, Rinkeby, Goerli test networks.
613
- try {
614
- await method.checkSafetyLevelOnTestNet();
615
- } catch (e) {
616
- const error =
617
- e instanceof HardwareError
618
- ? e
619
- : ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'open safety check failed.');
620
- // messageResponse = createResponseMessage(method.responseID, false, { error });
621
- // requestQueue.resolveRequest(method.responseID, messageResponse);
622
- // return;
623
- throw error;
624
- }
658
+ // Protocol V2 emits the PIN phase completion from DeviceSessionAskPin.
659
+ // Keep the legacy compatibility close for Protocol V1 only.
660
+ if (!device.isProtocolV2()) {
661
+ postMessage(createUiMessage(UI_REQUEST.CLOSE_UI_PIN_WINDOW));
662
+ }
663
+ }
625
664
 
626
- method.device?.commands?.checkDisposed();
665
+ // Automatic check safety_check level for Kovan, Ropsten, Rinkeby, Goerli test networks.
666
+ try {
667
+ await method.checkSafetyLevelOnTestNet();
668
+ } catch (e) {
669
+ throw e instanceof HardwareError
670
+ ? e
671
+ : ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'open safety check failed.');
672
+ }
627
673
 
628
- try {
629
- const response: object = await runMethodWithUnlockRetry(
630
- method,
631
- device,
632
- protocolV2UiCoordinator
633
- );
674
+ method.device?.commands?.checkDisposed();
675
+ },
676
+ });
634
677
  messageResponse = createResponseMessage(method.responseID, true, response);
635
678
  requestQueue.resolveRequest(method.responseID, messageResponse);
636
679
  completeMethodRequestContext(method);
637
680
  } catch (error) {
681
+ // Device.run may release the request before transport callbacks finish after a timeout.
682
+ // Ignore the stale callback because the caller already received the connection error.
683
+ if (!requestQueue.getTask(method.responseID)) {
684
+ Log.debug(`Call API - Ignore late inner method result`, error);
685
+ return;
686
+ }
638
687
  Log.debug(`Call API - Inner Method Run Error`, error);
639
688
  messageResponse = createResponseMessage(method.responseID, false, { error });
640
689
  requestQueue.resolveRequest(method.responseID, messageResponse);
@@ -648,7 +697,12 @@ const onCallDevice = async (
648
697
  throw error;
649
698
  }
650
699
  } finally {
651
- protocolV2UiCoordinator.close();
700
+ if (isProtocolV2UiEnabled(method)) {
701
+ protocolV2CloseEmitted = protocolV2UiCoordinator.close({
702
+ ensureOperationClose: protocolV2Operation,
703
+ protocolV2Operation,
704
+ });
705
+ }
652
706
  }
653
707
  };
654
708
  Log.debug('Call API - Device Run: ', device.mainId);
@@ -664,7 +718,9 @@ const onCallDevice = async (
664
718
  try {
665
719
  return await task.callPromise.promise;
666
720
  } catch (e) {
667
- Log.debug('Device Run Error: ', e);
721
+ if (!isExpectedCompatibilityError(e)) {
722
+ Log.debug('Device Run Error: ', e);
723
+ }
668
724
  completeMethodRequestContext(method, e);
669
725
  return createResponseMessage(method.responseID, false, { error: e });
670
726
  }
@@ -703,7 +759,15 @@ const onCallDevice = async (
703
759
  requestQueue.releaseTask(method.responseID);
704
760
 
705
761
  if (isProtocolV2UiEnabled(method)) {
706
- closePopup();
762
+ if (!protocolV2CloseEmitted && protocolV2Operation) {
763
+ protocolV2CloseEmitted = protocolV2UiCoordinator.close({
764
+ ensureOperationClose: true,
765
+ protocolV2Operation: true,
766
+ });
767
+ }
768
+ if (!protocolV2CloseEmitted) {
769
+ closePopup();
770
+ }
707
771
  }
708
772
 
709
773
  cleanup();
@@ -850,24 +914,68 @@ function canSkipInitialize(method: BaseMethod, device: Device): boolean {
850
914
  return true;
851
915
  }
852
916
 
853
- function isRetryableBleProtocolV2ProbeError(method: BaseMethod, error: unknown) {
854
- const message = error instanceof Error ? error.message : String(error ?? '');
917
+ export function isRetryableBleProtocolV2ProbeError(method: BaseMethod, error: unknown) {
918
+ const typedError = error as { errorCode?: unknown; message?: unknown };
919
+ const message =
920
+ typeof typedError?.message === 'string' ? typedError.message : String(error ?? '');
855
921
  return (
856
922
  method.payload.connectProtocol === 'V2' &&
923
+ typedError?.errorCode === HardwareErrorCode.RuntimeError &&
857
924
  message.includes('Device protocol mismatch') &&
858
925
  message.includes('expected V2') &&
859
926
  message.includes('did not respond to expected protocol')
860
927
  );
861
928
  }
862
929
 
930
+ export function isRetryableBleConnectionError(method: BaseMethod, error: unknown) {
931
+ if (method.device?.wasInterruptedByUser()) {
932
+ return false;
933
+ }
934
+ const typedError = error as { errorCode?: unknown };
935
+ return (
936
+ typedError?.errorCode === HardwareErrorCode.BleTimeoutError ||
937
+ typedError?.errorCode === HardwareErrorCode.BleConnectedError ||
938
+ isRetryableBleProtocolV2ProbeError(method, error) ||
939
+ isMissingDetectedProtocolV2Error(method, error)
940
+ );
941
+ }
942
+
943
+ export function isMissingDetectedProtocolV2Error(method: BaseMethod, error: unknown) {
944
+ const typedError = error as { errorCode?: unknown; message?: unknown };
945
+ return (
946
+ method.payload.connectProtocol === 'V2' &&
947
+ typedError?.errorCode === HardwareErrorCode.RuntimeError &&
948
+ typeof typedError.message === 'string' &&
949
+ typedError.message.includes('Device protocol has not been detected')
950
+ );
951
+ }
952
+
863
953
  /**
864
954
  * If the Bluetooth connection times out, retry up to 6 times
865
955
  * @param retryCount - Current retry count (default 0)
866
956
  */
867
957
  async function connectDeviceForBle(method: BaseMethod, device: Device, retryCount = 0) {
868
958
  try {
869
- await device.acquire(method.payload.connectProtocol);
959
+ if (device.wasInterruptedByUser()) {
960
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceInterruptedFromUser);
961
+ }
962
+ if (method.payload.forceProtocolDetection && device.hasDeviceAcquire()) {
963
+ await device.release();
964
+ }
965
+ const shouldAcquire =
966
+ method.payload.forceProtocolDetection ||
967
+ !device.hasDeviceAcquire() ||
968
+ !device.commands ||
969
+ device.commands.disposed;
970
+ if (shouldAcquire) {
971
+ await device.acquire(method.payload.connectProtocol, {
972
+ forceProtocolDetection: method.payload.forceProtocolDetection,
973
+ });
974
+ }
870
975
  if (method.payload?.onlyConnectBleDevice) {
976
+ if (shouldAcquire) {
977
+ DevicePool.emitter.emit(DEVICE.CONNECT, device);
978
+ }
871
979
  return;
872
980
  }
873
981
  // Skip initialize if conditions are met
@@ -878,15 +986,29 @@ async function connectDeviceForBle(method: BaseMethod, device: Device, retryCoun
878
986
  passphraseState: initOptions.passphraseState,
879
987
  });
880
988
  }
989
+ if (shouldAcquire) {
990
+ DevicePool.emitter.emit(DEVICE.CONNECT, device);
991
+ }
881
992
  } catch (err) {
993
+ const requiresColdReconnect = isMissingDetectedProtocolV2Error(method, err);
994
+ // Device.run()'s REQUIRE_DISCONNECT handling never sees acquire/initialize
995
+ // failures, so with keep-alive a wedged link would be reused by every retry
996
+ // (field case: Initialize timing out at 25s per attempt, forever). Drop it
997
+ // here so the next retry cold-connects.
882
998
  if (
883
- (err.errorCode === HardwareErrorCode.BleTimeoutError ||
884
- err.errorCode === HardwareErrorCode.BleConnectedError ||
885
- isRetryableBleProtocolV2ProbeError(method, err)) &&
886
- retryCount < 6
999
+ (ERROR_CODES_REQUIRE_DISCONNECT.includes(err.errorCode) || requiresColdReconnect) &&
1000
+ device.mainId &&
1001
+ device.deviceConnector
887
1002
  ) {
1003
+ await device.deviceConnector.disconnect(device.mainId).catch(() => undefined);
1004
+ // The connector only drops the link; `deviceAcquired` is reset by
1005
+ // release()/markTransportDisconnected() alone. Leaving it set makes the
1006
+ // next attempt skip acquire and initialize onto the link we just cut.
1007
+ device.markTransportDisconnected();
1008
+ }
1009
+ if (isRetryableBleConnectionError(method, err) && retryCount < 6) {
888
1010
  const nextRetry = retryCount + 1;
889
- Log.debug(`Bluetooth connect timeout and will retry, retry count: ${nextRetry}`);
1011
+ Log.debug(`Bluetooth connection will retry, retry count: ${nextRetry}`);
890
1012
  await wait(3000);
891
1013
  await connectDeviceForBle(method, device, nextRetry);
892
1014
  } else {
@@ -993,6 +1115,11 @@ const ensureConnected = async (
993
1115
  if (abort()) {
994
1116
  return;
995
1117
  }
1118
+ // One generation per public ensureConnected() call, not per poll
1119
+ // iteration. A later poll must not clear a user cancel.
1120
+ if (tryCount === 1) {
1121
+ device.beginConnectionAttempt();
1122
+ }
996
1123
  await connectDeviceForBle(method, device);
997
1124
  }
998
1125
  resolve(device);
@@ -1000,6 +1127,19 @@ const ensureConnected = async (
1000
1127
  }
1001
1128
  } catch (error) {
1002
1129
  Log.debug('device error: ', error);
1130
+ if (error.errorCode === HardwareErrorCode.BleUnavailableWhileUsbConnected) {
1131
+ reject(error);
1132
+ return;
1133
+ }
1134
+ if (isProtocolV2LinkDisabledError(error)) {
1135
+ reject(
1136
+ ERRORS.TypedError(HardwareErrorCode.BleUnavailableWhileUsbConnected, undefined, {
1137
+ failureCode: error.failureCode,
1138
+ firmwareMessage: error.firmwareMessage,
1139
+ })
1140
+ );
1141
+ return;
1142
+ }
1003
1143
  if ([HardwareErrorCode.BleCharacteristicNotifyChangeFailure].includes(error.errorCode)) {
1004
1144
  postMessage(createUiMessage(UI_REQUEST.BLUETOOTH_CHARACTERISTIC_NOTIFY_CHANGE_FAILURE));
1005
1145
  }
@@ -1022,6 +1162,8 @@ const ensureConnected = async (
1022
1162
  HardwareErrorCode.DeviceDetectInBootloaderMode,
1023
1163
  HardwareErrorCode.BleCharacteristicNotifyChangeFailure,
1024
1164
  HardwareErrorCode.BridgeNeedsPermission,
1165
+ HardwareErrorCode.DeviceInterruptedFromUser,
1166
+ HardwareErrorCode.CallQueueActionCancelled,
1025
1167
  ].includes(error.errorCode)
1026
1168
  ) {
1027
1169
  reject(error);
@@ -1078,23 +1220,34 @@ export const cancel = (context: CoreContext, connectId?: string) => {
1078
1220
  ','
1079
1221
  )}`
1080
1222
  );
1223
+ // Abort before rejecting: rejectRequest releases the task and would make
1224
+ // its AbortController unreachable to an in-flight method loop.
1225
+ requestQueue.abortRequestsByConnectId(connectId);
1081
1226
  const canceledDevices: Device[] = [];
1227
+ const interruptDevice = (device: Device | undefined, deviceConnectId: string) => {
1228
+ if (!device || canceledDevices.includes(device)) {
1229
+ return;
1230
+ }
1231
+ setPrePendingCallPromise(deviceConnectId, device.interruptionFromUser());
1232
+ canceledDevices.push(device);
1233
+ };
1082
1234
  for (const requestId of requestIds) {
1083
1235
  const task = requestQueue.getTask(requestId);
1084
1236
  Log.debug('Cancel Api connect task: ', task);
1085
- if (task && task.method?.device) {
1086
- if (!canceledDevices.includes(task.method.device)) {
1087
- const { device } = task.method;
1088
- setPrePendingCallPromise(device?.interruptionFromUser());
1089
- canceledDevices.push(device);
1090
- }
1237
+ if (task) {
1238
+ // During ensureConnected the method has a connectId but device is
1239
+ // assigned only after the poll succeeds. Interrupt the cached BLE
1240
+ // Device so an in-flight acquire/initialize cannot finish.
1241
+ interruptDevice(task.method?.device, task.method.connectId ?? connectId);
1242
+ interruptDevice(deviceCacheMap.get(connectId), connectId);
1091
1243
  requestQueue.rejectRequest(
1092
1244
  requestId,
1093
1245
  ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled)
1094
1246
  );
1095
1247
  }
1096
1248
  }
1097
- requestQueue.abortRequestsByConnectId(connectId);
1249
+ interruptDevice(deviceCacheMap.get(connectId), connectId);
1250
+ pollingManager.stop(connectId);
1098
1251
  } catch (e) {
1099
1252
  Log.error('Cancel API Error: ', e);
1100
1253
  }
@@ -1102,23 +1255,33 @@ export const cancel = (context: CoreContext, connectId?: string) => {
1102
1255
  const env = DataManager.getSettings('env');
1103
1256
  if (DataManager.isBleConnect(env)) {
1104
1257
  Log.debug('Cancel Api all _deviceList: ');
1258
+ // Keep method abort signals observable until every active task is rejected.
1259
+ requestQueue.abortAllRequests();
1105
1260
  const canceledDevices: Device[] = [];
1261
+ const interruptDevice = (device?: Device) => {
1262
+ if (!device || canceledDevices.includes(device)) {
1263
+ return;
1264
+ }
1265
+ device.interruptionFromUser().catch(() => undefined);
1266
+ canceledDevices.push(device);
1267
+ };
1106
1268
  for (const requestId of requestQueue.getRequestTasksId()) {
1107
1269
  const task = requestQueue.getTask(requestId);
1108
1270
  Log.debug('Cancel Api connect task: ', task);
1109
- if (task && task.method?.device) {
1110
- if (!canceledDevices.includes(task.method.device)) {
1111
- const { device } = task.method;
1112
- device?.interruptionFromUser();
1113
- canceledDevices.push(device);
1271
+ if (task) {
1272
+ interruptDevice(task.method?.device);
1273
+ if (task.method.connectId) {
1274
+ interruptDevice(deviceCacheMap.get(task.method.connectId));
1275
+ pollingManager.stop(task.method.connectId);
1114
1276
  }
1115
-
1116
1277
  requestQueue.rejectRequest(
1117
1278
  requestId,
1118
1279
  ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled)
1119
1280
  );
1120
1281
  }
1121
1282
  }
1283
+ deviceCacheMap.forEach(interruptDevice);
1284
+ pollingManager.stopAll();
1122
1285
  } else {
1123
1286
  _deviceList?.allDevices().forEach(device => {
1124
1287
  Log.debug('device: ', device, ' device.hasDeviceAcquire: ', device.hasDeviceAcquire());
@@ -1172,14 +1335,16 @@ const shouldCheckPassphraseState = (method: BaseMethod, device: Device) => {
1172
1335
  };
1173
1336
 
1174
1337
  const cleanup = () => {
1338
+ const pendingUiPromises = _uiPromises;
1175
1339
  _uiPromises = [];
1176
- Log.debug('Cleanup...');
1340
+ rejectUiPromises(
1341
+ pendingUiPromises,
1342
+ ERRORS.TypedError(HardwareErrorCode.ActionCancelled, 'UI request was cancelled')
1343
+ );
1177
1344
  };
1178
1345
 
1179
1346
  const removeDeviceListener = (device: Device) => {
1180
1347
  device.removeAllListeners();
1181
- DevicePool.emitter.removeAllListeners(DEVICE.CONNECT);
1182
- // DevicePool.emitter.removeListener(DEVICE.DISCONNECT, onDeviceDisconnectHandler);
1183
1348
  };
1184
1349
 
1185
1350
  /**
@@ -1190,19 +1355,33 @@ const closePopup = () => {
1190
1355
  };
1191
1356
 
1192
1357
  const onDeviceConnectHandler = (device: Device) => {
1193
- const env = DataManager.getSettings('env');
1194
- const deviceObject = DataManager.isBleConnect(env) ? device : device.toMessageObject();
1195
- postMessage(createDeviceMessage(DEVICE.CONNECT, { device: deviceObject as KnownDevice }));
1358
+ const deviceObject = device.toMessageObject();
1359
+ if (!deviceObject) return;
1360
+ postMessage(createDeviceMessage(DEVICE.CONNECT, { device: deviceObject }));
1196
1361
  };
1197
1362
 
1198
1363
  const onDeviceDisconnectHandler = (device: Device) => {
1199
1364
  device.clearPreInitialized();
1200
- const env = DataManager.getSettings('env');
1201
- const deviceObject = DataManager.isBleConnect(env) ? device : device.toMessageObject();
1202
- postMessage(createDeviceMessage(DEVICE.DISCONNECT, { device: deviceObject as KnownDevice }));
1365
+ const deviceObject = device.toMessageObject();
1366
+ if (!deviceObject) return;
1367
+ postMessage(createDeviceMessage(DEVICE.DISCONNECT, { device: deviceObject }));
1203
1368
  };
1204
1369
 
1205
- const onDevicePinHandler = async (...[device, type, callback]: DeviceEvents['pin']) => {
1370
+ const onTransportDeviceDisconnectHandler = (event: TransportDeviceDisconnectEvent) => {
1371
+ const device =
1372
+ deviceCacheMap.get(event.connectId) ??
1373
+ DevicePool.devicesCache[event.connectId] ??
1374
+ DevicePool.getDeviceByPath(event.connectId);
1375
+ if (!device) {
1376
+ Log.debug('Ignoring transport disconnect for an unknown device:', event.connectId);
1377
+ return;
1378
+ }
1379
+
1380
+ device.markTransportDisconnected();
1381
+ DevicePool.emitter.emit(DEVICE.DISCONNECT, device);
1382
+ };
1383
+
1384
+ const onDevicePinHandler = (...[device, type, callback]: DeviceEvents['pin']) => {
1206
1385
  Log.log('request Input PIN');
1207
1386
  // create ui promise
1208
1387
  const uiPromise = createUiPromise(UI_RESPONSE.RECEIVE_PIN, device);
@@ -1211,12 +1390,14 @@ const onDevicePinHandler = async (...[device, type, callback]: DeviceEvents['pin
1211
1390
  createUiMessage(UI_REQUEST.REQUEST_PIN, {
1212
1391
  device: device.toMessageObject() as unknown as KnownDevice,
1213
1392
  type,
1393
+ responseCorrelation: uiPromise.responseCorrelation,
1214
1394
  })
1215
1395
  );
1216
- // wait for pin
1217
- const uiResp = await uiPromise.promise;
1218
- // callback.apply(null, [null, pin]);
1219
- callback(null, uiResp.payload);
1396
+ consumeUiPromise(
1397
+ uiPromise.promise,
1398
+ uiResp => callback(null, uiResp.payload),
1399
+ error => callback(error, '')
1400
+ );
1220
1401
  };
1221
1402
 
1222
1403
  export const onDeviceButtonHandler = (...[device, request]: [...DeviceEvents['button']]) => {
@@ -1240,7 +1421,11 @@ const onDeviceFeaturesHandler = (...[_, features]: [...DeviceEvents['features']]
1240
1421
  postMessage(createDeviceMessage(DEVICE.FEATURES, { ...features }));
1241
1422
  };
1242
1423
 
1243
- const onDevicePassphraseHandler = async (
1424
+ const onDeviceStateHandler = (...[_, stateEvent]: [...DeviceEvents['state']]) => {
1425
+ postMessage(createDeviceMessage(DEVICE.STATE, stateEvent));
1426
+ };
1427
+
1428
+ const onDevicePassphraseHandler = (
1244
1429
  ...[device, requestPayload, callback]: DeviceEvents['passphrase']
1245
1430
  ) => {
1246
1431
  Log.debug('onDevicePassphraseHandler');
@@ -1250,21 +1435,27 @@ const onDevicePassphraseHandler = async (
1250
1435
  device: device.toMessageObject() as KnownDevice,
1251
1436
  passphraseState: device.passphraseState,
1252
1437
  existsAttachPinUser: requestPayload.existsAttachPinUser,
1438
+ deviceOnly: requestPayload.deviceOnly,
1253
1439
  source: requestPayload.source,
1254
1440
  reason: requestPayload.reason,
1255
1441
  expectedPassphraseState: requestPayload.expectedPassphraseState,
1442
+ ...(requestPayload.interaction ? { interaction: requestPayload.interaction } : {}),
1443
+ responseCorrelation: uiPromise.responseCorrelation,
1256
1444
  })
1257
1445
  );
1258
- // wait for passphrase
1259
- const uiResp = await uiPromise.promise;
1260
- const { value, passphraseOnDevice, save, attachPinOnDevice } = uiResp.payload;
1261
- // send as PassphrasePromptResponse
1262
- callback({
1263
- passphrase: value.normalize('NFKD'),
1264
- passphraseOnDevice,
1265
- attachPinOnDevice,
1266
- cache: save,
1267
- });
1446
+ consumeUiPromise(
1447
+ uiPromise.promise,
1448
+ uiResp => {
1449
+ const { value, passphraseOnDevice, save, attachPinOnDevice } = uiResp.payload;
1450
+ callback({
1451
+ passphrase: value.normalize('NFKD'),
1452
+ passphraseOnDevice,
1453
+ attachPinOnDevice,
1454
+ cache: save,
1455
+ });
1456
+ },
1457
+ error => callback({}, error)
1458
+ );
1268
1459
  };
1269
1460
 
1270
1461
  const onEmptyPassphraseHandler = (...[_, , callback]: DeviceEvents['passphrase']) => {
@@ -1282,6 +1473,7 @@ const onEnterPassphraseOnDeviceHandler = (
1282
1473
  passphraseState: device.passphraseState,
1283
1474
  source: requestPayload?.source,
1284
1475
  reason: requestPayload?.reason,
1476
+ ...(requestPayload?.interaction ? { interaction: requestPayload.interaction } : {}),
1285
1477
  })
1286
1478
  );
1287
1479
  };
@@ -1295,11 +1487,40 @@ const onEnterAttachPinOnDeviceHandler = (
1295
1487
  type: 'ButtonRequest_AttachPin',
1296
1488
  source: requestPayload?.source,
1297
1489
  reason: requestPayload?.reason,
1490
+ ...(requestPayload?.interaction ? { interaction: requestPayload.interaction } : {}),
1298
1491
  })
1299
1492
  );
1300
1493
  };
1301
1494
 
1302
- const onSelectDeviceInBootloaderForWebDeviceHandler = async (
1495
+ const onEnterPinOnDeviceHandler = (
1496
+ ...[device, pinType, metadata]: [...DeviceEvents['pin_on_device']]
1497
+ ) => {
1498
+ postMessage(
1499
+ createUiMessage(UI_REQUEST.REQUEST_PIN, {
1500
+ device: device.toMessageObject() as KnownDevice,
1501
+ type:
1502
+ pinType === DeviceSessionPinType.AttachToPin
1503
+ ? 'ButtonRequest_AttachPin'
1504
+ : 'ButtonRequest_PinEntry',
1505
+ source: metadata?.source,
1506
+ reason: metadata?.reason,
1507
+ deviceOnly: metadata?.deviceOnly ?? true,
1508
+ completion: metadata?.completion,
1509
+ method: metadata?.method,
1510
+ page: metadata?.page,
1511
+ operation: metadata?.operation,
1512
+ ...(metadata?.interaction ? { interaction: metadata.interaction } : {}),
1513
+ })
1514
+ );
1515
+ };
1516
+
1517
+ const onPinOnDeviceCompleteHandler = (
1518
+ ...[_, metadata]: [...DeviceEvents['pin_on_device_complete']]
1519
+ ) => {
1520
+ postMessage(createUiMessage(UI_REQUEST.CLOSE_UI_PIN_WINDOW, metadata));
1521
+ };
1522
+
1523
+ const onSelectDeviceInBootloaderForWebDeviceHandler = (
1303
1524
  ...[device, callback]: [...DeviceEvents['select_device_in_bootloader_for_web_device']]
1304
1525
  ) => {
1305
1526
  Log.debug('onSelectDeviceInBootloaderForWebDeviceHandler');
@@ -1309,11 +1530,14 @@ const onSelectDeviceInBootloaderForWebDeviceHandler = async (
1309
1530
  device: device.toMessageObject() as KnownDevice,
1310
1531
  })
1311
1532
  );
1312
- const uiResp = await uiPromise.promise;
1313
- callback(null, uiResp.payload.deviceId);
1533
+ consumeUiPromise(
1534
+ uiPromise.promise,
1535
+ uiResp => callback(null, uiResp.payload.deviceId),
1536
+ error => callback(error, '')
1537
+ );
1314
1538
  };
1315
1539
 
1316
- const onSelectDeviceForSwitchFirmwareWebDeviceHandler = async (
1540
+ const onSelectDeviceForSwitchFirmwareWebDeviceHandler = (
1317
1541
  ...[device, callback]: [...DeviceEvents['select_device_for_switch_firmware_web_device']]
1318
1542
  ) => {
1319
1543
  Log.debug('onSelectDeviceForSwitchFirmwareWebDeviceHandler');
@@ -1326,8 +1550,11 @@ const onSelectDeviceForSwitchFirmwareWebDeviceHandler = async (
1326
1550
  device: device.toMessageObject() as KnownDevice,
1327
1551
  })
1328
1552
  );
1329
- const uiResp = await uiPromise.promise;
1330
- callback(null, uiResp.payload.deviceId);
1553
+ consumeUiPromise(
1554
+ uiPromise.promise,
1555
+ uiResp => callback(null, uiResp.payload.deviceId),
1556
+ error => callback(error, '')
1557
+ );
1331
1558
  };
1332
1559
 
1333
1560
  /**
@@ -1346,14 +1573,21 @@ const postMessage = (message: CoreMessage) => {
1346
1573
 
1347
1574
  const createUiPromise = <T extends UiPromiseResponse['type']>(promiseEvent: T, device?: Device) => {
1348
1575
  const uiPromise: UiPromise<T> = createDeferred(promiseEvent, device);
1576
+ if (
1577
+ device &&
1578
+ (promiseEvent === UI_RESPONSE.RECEIVE_PIN || promiseEvent === UI_RESPONSE.RECEIVE_PASSPHRASE)
1579
+ ) {
1580
+ const publicDeviceId = device.toMessageObject()?.deviceId;
1581
+ uiPromise.responseCorrelation = {
1582
+ interactionId: generateInstanceId('UiResponse', device.sdkInstanceId),
1583
+ deviceId: publicDeviceId || device.instanceId,
1584
+ };
1585
+ }
1349
1586
  _uiPromises.push(uiPromise as any);
1350
1587
 
1351
1588
  return uiPromise;
1352
1589
  };
1353
1590
 
1354
- const findUiPromise = <T extends UiPromiseResponse['type']>(promiseEvent: T) =>
1355
- _uiPromises.find(p => p.id === promiseEvent);
1356
-
1357
1591
  const removeUiPromise = (promise: Deferred<any>) => {
1358
1592
  _uiPromises = _uiPromises.filter(p => p !== promise);
1359
1593
  };
@@ -1365,8 +1599,10 @@ export default class Core extends EventEmitter {
1365
1599
 
1366
1600
  private requestQueue = new RequestQueue();
1367
1601
 
1602
+ private disposePromise?: Promise<void>;
1603
+
1368
1604
  // background task
1369
- private prePendingCallPromise: Promise<void> | undefined;
1605
+ private prePendingCallPromises = new Map<string, Promise<void>>();
1370
1606
 
1371
1607
  private methodSynchronize = getSynchronize();
1372
1608
 
@@ -1377,19 +1613,24 @@ export default class Core extends EventEmitter {
1377
1613
  Log.debug(`[Core] Created SDK instance: ${this.sdkInstanceId}`);
1378
1614
  }
1379
1615
 
1380
- cancelOperation(operationId: string) {
1381
- this.requestQueue.abortOperation(operationId);
1382
- }
1383
-
1384
1616
  private getCoreContext() {
1385
1617
  return {
1386
1618
  sdkInstanceId: this.sdkInstanceId,
1387
1619
  tracingContext: this.tracingContext,
1388
1620
  requestQueue: this.requestQueue,
1389
1621
  methodSynchronize: this.methodSynchronize,
1390
- getPrePendingCallPromise: () => this.prePendingCallPromise,
1391
- setPrePendingCallPromise: (promise: Promise<void> | undefined) => {
1392
- this.prePendingCallPromise = promise;
1622
+ getPrePendingCallPromise: (connectId: string) => this.prePendingCallPromises.get(connectId),
1623
+ setPrePendingCallPromise: (connectId: string, promise?: Promise<void>) => {
1624
+ if (!promise) {
1625
+ this.prePendingCallPromises.delete(connectId);
1626
+ return;
1627
+ }
1628
+ this.prePendingCallPromises.set(connectId, promise);
1629
+ },
1630
+ removePrePendingCallPromise: (connectId: string, promise: Promise<void>) => {
1631
+ if (this.prePendingCallPromises.get(connectId) === promise) {
1632
+ this.prePendingCallPromises.delete(connectId);
1633
+ }
1393
1634
  },
1394
1635
  // callback 任务管理
1395
1636
  registerCallbackTask: (connectId: string, callbackPromise: Deferred<any>) => {
@@ -1407,11 +1648,16 @@ export default class Core extends EventEmitter {
1407
1648
  case UI_RESPONSE.RECEIVE_PASSPHRASE:
1408
1649
  case UI_RESPONSE.SELECT_DEVICE_IN_BOOTLOADER_FOR_WEB_DEVICE:
1409
1650
  case UI_RESPONSE.SELECT_DEVICE_FOR_SWITCH_FIRMWARE_WEB_DEVICE: {
1410
- const uiPromise = findUiPromise(message.type);
1651
+ const uiPromise = findUiPromiseForResponse(_uiPromises, message);
1411
1652
  if (uiPromise) {
1412
1653
  Log.log('receive UI Response: ', message.type);
1413
1654
  uiPromise.resolve(message);
1414
1655
  removeUiPromise(uiPromise);
1656
+ } else if (
1657
+ message.type === UI_RESPONSE.RECEIVE_PIN ||
1658
+ message.type === UI_RESPONSE.RECEIVE_PASSPHRASE
1659
+ ) {
1660
+ Log.warn('Ignored unmatched or ambiguous sensitive UI response:', message.type);
1415
1661
  }
1416
1662
  break;
1417
1663
  }
@@ -1427,10 +1673,17 @@ export default class Core extends EventEmitter {
1427
1673
  }
1428
1674
 
1429
1675
  case IFRAME.CALL: {
1430
- Log.log(`[${Date.now()}][CALL_API]`, message);
1676
+ const logBlockLabel = getLogBlockLabel(message);
1677
+ Log.log(
1678
+ formatLogMethodLabel(`[${Date.now()}][CALL_API]`, logBlockLabel),
1679
+ getSafeLogPayload(message, logBlockLabel)
1680
+ );
1431
1681
  const response = await callAPI(this.getCoreContext(), message);
1432
1682
  const { success, payload } = response;
1433
- Log.log(`[${Date.now()}][CALL_API_RESPONSE]`, response);
1683
+ Log.log(
1684
+ formatLogMethodLabel(`[${Date.now()}][CALL_API_RESPONSE]`, logBlockLabel),
1685
+ getSafeLogPayload(response, logBlockLabel)
1686
+ );
1434
1687
  if (success) {
1435
1688
  return response;
1436
1689
  }
@@ -1449,10 +1702,6 @@ export default class Core extends EventEmitter {
1449
1702
  cancel(this.getCoreContext(), message.payload.connectId);
1450
1703
  break;
1451
1704
  }
1452
- case IFRAME.CANCEL_OPERATION: {
1453
- this.cancelOperation(message.payload.operationId);
1454
- break;
1455
- }
1456
1705
  case IFRAME.CALLBACK: {
1457
1706
  Log.log('callback message: ', message);
1458
1707
  postMessage(message);
@@ -1464,25 +1713,65 @@ export default class Core extends EventEmitter {
1464
1713
  return Promise.resolve(message);
1465
1714
  }
1466
1715
 
1467
- dispose() {
1716
+ dispose(): Promise<void> {
1717
+ if (!this.disposePromise) {
1718
+ this.disposePromise = this.disposeResources();
1719
+ }
1720
+ return this.disposePromise;
1721
+ }
1722
+
1723
+ private async disposeResources(): Promise<void> {
1724
+ Log.debug(`[Core] Disposing SDK instance: ${this.sdkInstanceId}`);
1725
+ pollingManager.stopAll();
1726
+ this.requestQueue.abortAllRequests();
1727
+ cleanup();
1728
+
1729
+ _connector?.stop();
1730
+ let transportCleanup: Promise<void>;
1731
+ try {
1732
+ transportCleanup = Promise.resolve(TransportManager.getTransport()?.stop?.()).catch(error => {
1733
+ Log.warn('[Core] Transport cleanup failed:', error);
1734
+ });
1735
+ } catch (error) {
1736
+ Log.warn('[Core] Transport cleanup failed:', error);
1737
+ transportCleanup = Promise.resolve();
1738
+ }
1739
+
1740
+ // Preserve synchronous dispose semantics for in-memory state and listeners.
1468
1741
  _deviceList = undefined;
1469
1742
  _connector = undefined;
1743
+ DevicePool.dispose();
1470
1744
  deviceCacheMap.clear();
1471
1745
  preWarmInflight.clear();
1472
1746
  preWarmDoneAt.clear();
1473
- Log.debug(`[Core] Disposing SDK instance: ${this.sdkInstanceId}`);
1747
+ preConnectCache = { passphraseState: undefined };
1748
+ this.prePendingCallPromises.clear();
1749
+ this.removeAllListeners();
1474
1750
  cleanupSdkInstance(this.sdkInstanceId);
1751
+ if (_core === this) _core = undefined;
1752
+
1753
+ // Transports, especially Node USB, may release native handles asynchronously.
1754
+ await transportCleanup;
1475
1755
  }
1476
1756
  }
1477
1757
 
1478
1758
  export const initCore = () => {
1479
- _core = new Core();
1480
- return _core;
1759
+ const core = new Core();
1760
+ _core = core;
1761
+ return core;
1481
1762
  };
1482
1763
 
1483
1764
  export const initConnector = () => {
1484
1765
  _connector = new DeviceConnector();
1766
+ DevicePool.emitter.removeListener(DEVICE.CONNECT, onDeviceConnectHandler);
1767
+ DevicePool.emitter.removeListener(DEVICE.DISCONNECT, onDeviceDisconnectHandler);
1768
+ DevicePool.emitter.removeListener(
1769
+ TRANSPORT_EVENT.DEVICE_DISCONNECT,
1770
+ onTransportDeviceDisconnectHandler
1771
+ );
1772
+ DevicePool.emitter.on(DEVICE.CONNECT, onDeviceConnectHandler);
1485
1773
  DevicePool.emitter.on(DEVICE.DISCONNECT, onDeviceDisconnectHandler);
1774
+ DevicePool.emitter.on(TRANSPORT_EVENT.DEVICE_DISCONNECT, onTransportDeviceDisconnectHandler);
1486
1775
  return _connector;
1487
1776
  };
1488
1777
 
@@ -1496,12 +1785,8 @@ export const init = async (
1496
1785
  plugin?: LowlevelTransportSharedPlugin
1497
1786
  ) => {
1498
1787
  try {
1499
- try {
1500
- await DataManager.load(settings);
1501
- initTransport(Transport, plugin);
1502
- } catch {
1503
- Log.error('DataManager.load error');
1504
- }
1788
+ await DataManager.load(settings);
1789
+ initTransport(Transport, plugin);
1505
1790
  enableLog(DataManager.getSettings('debug'));
1506
1791
  if (DataManager.getSettings('env') !== 'react-native') {
1507
1792
  setLoggerPostMessage(postMessage);
@@ -1512,6 +1797,7 @@ export const init = async (
1512
1797
  return _core;
1513
1798
  } catch (error) {
1514
1799
  Log.error('core init', error);
1800
+ throw error;
1515
1801
  }
1516
1802
  };
1517
1803