@onekeyfe/hd-core 1.2.0-alpha.16 → 1.2.0-alpha.160

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 +754 -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 +39 -0
  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 +12 -6
  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 +166 -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 +81 -0
  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 +8 -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 +364 -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 +7901 -2129
  72. package/__tests__/protocolV2FileWrite.test.ts +221 -3
  73. package/__tests__/protocolV2UiInteraction.test.ts +329 -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 +14 -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 +62 -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 +11 -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 +3 -3
  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 +3 -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 +84 -16
  408. package/dist/device/Device.d.ts.map +1 -1
  409. package/dist/device/DeviceCommands.d.ts +8 -6
  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 +6 -2
  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 +8 -2
  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 +16 -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 +50 -4
  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 +1743 -830
  452. package/dist/index.d.ts.map +1 -1
  453. package/dist/index.js +11463 -4629
  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 +33 -22
  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 +42 -0
  470. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -0
  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 +18 -4
  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 -93
  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 +139 -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 +10 -0
  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 +45 -23
  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 +350 -91
  572. package/src/api/FirmwareUpdateV4.ts +2036 -744
  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 +36 -12
  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 +30 -4
  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 +5 -0
  617. package/src/api/device/DeviceChangePin.ts +31 -0
  618. package/src/api/device/DeviceFullyUploadResource.ts +4 -5
  619. package/src/api/device/DeviceLock.ts +5 -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 +21 -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 +28 -0
  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 +266 -42
  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 -18
  693. package/src/api/protocol-v2/DeviceReboot.ts +12 -3
  694. package/src/api/protocol-v2/DeviceStatusGet.ts +6 -1
  695. package/src/api/protocol-v2/DeviceUploadNft.ts +249 -0
  696. package/src/api/protocol-v2/DeviceUploadWallpaper.ts +59 -21
  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 +6 -0
  733. package/src/core/index.ts +512 -195
  734. package/src/core/uiPromiseRegistry.ts +63 -0
  735. package/src/data/messages/messages-protocol-v2.json +523 -449
  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 +1021 -267
  741. package/src/device/DeviceCommands.ts +204 -162
  742. package/src/device/DeviceConnector.ts +54 -21
  743. package/src/device/DeviceFeaturesState.ts +25 -0
  744. package/src/device/DevicePool.ts +108 -23
  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 +215 -192
  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 +22 -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 +61 -4
  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 +118 -52
  767. package/src/protocols/protocol-v2/firmware.ts +3 -1
  768. package/src/protocols/protocol-v2/index.ts +9 -3
  769. package/src/protocols/protocol-v2/resources.ts +165 -0
  770. package/src/protocols/protocol-v2/settingsUnlockPolicy.ts +65 -0
  771. package/src/protocols/protocol-v2/uiInteraction.ts +250 -0
  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 +417 -61
  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 -188
  798. package/src/types/api/sessionCache.ts +9 -4
  799. package/src/types/device.ts +211 -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 +42 -9
  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 +40 -0
  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 +44 -25
  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/DeviceSessionGet.d.ts +0 -6
  823. package/dist/api/protocol-v2/DeviceSessionGet.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 -21
  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 -9
  835. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +0 -1
  836. package/dist/types/api/getDeviceInfo.d.ts +0 -87
  837. package/dist/types/api/getDeviceInfo.d.ts.map +0 -1
  838. package/src/api/GetDeviceInfo.ts +0 -145
  839. package/src/api/firmware/progressThrottle.ts +0 -44
  840. package/src/api/protocol-v2/DeviceSessionGet.ts +0 -15
  841. package/src/api/protocol-v2/DeviceSettingsGet.ts +0 -16
  842. package/src/api/protocol-v2/DeviceSettingsPageShow.ts +0 -59
  843. package/src/api/protocol-v2/DeviceSettingsSet.ts +0 -39
  844. package/src/deviceProfile/buildDeviceProfile.ts +0 -354
  845. package/src/protocols/protocol-v2/lockedError.ts +0 -10
  846. package/src/protocols/protocol-v2/unlockRetry.ts +0 -36
  847. package/src/types/api/getDeviceInfo.ts +0 -101
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,24 +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';
66
+ import {
67
+ ProtocolV2UiInteractionCoordinator,
68
+ isProtocolV2UiEnabled,
69
+ } from '../protocols/protocol-v2/uiInteraction';
70
+ import { createUiProgressMessageFilter } from '../utils/uiProgressThrottle';
61
71
 
62
72
  import type { ConnectSettings, Features, KnownDevice } from '../types';
63
73
  import type { CoreMessage, IFrameCallMessage, UiPromise, UiPromiseResponse } from '../events';
64
74
  import type { DeviceEvents, InitOptions, RunOptions } from '../device/Device';
65
75
  import type { SdkTracingContext } from '../utils/tracing';
66
76
  import type { Deferred } from '@onekeyfe/hd-shared';
67
- import type { LowlevelTransportSharedPlugin, OneKeyDeviceInfo } from '@onekeyfe/hd-transport';
77
+ import type {
78
+ LowlevelTransportSharedPlugin,
79
+ OneKeyDeviceInfo,
80
+ TransportDeviceDisconnectEvent,
81
+ } from '@onekeyfe/hd-transport';
68
82
  import type { BaseMethod } from '../api/BaseMethod';
69
83
 
70
84
  const Log = getLogger(LoggerNames.Core);
71
85
  const PRE_INITIALIZE_TTL_MS = 60 * 1000;
86
+ const PRE_PENDING_CALL_TIMEOUT_MS = 15 * 1000;
72
87
 
73
88
  // Dedup/coalesce state for "pre-warm signal" methods (isPreWarmSignal),
74
89
  // keyed by getPreWarmKey(): coalesce in-flight, skip if warmed within TTL.
@@ -93,14 +108,15 @@ function hasDeriveCardano(method: BaseMethod): boolean {
93
108
 
94
109
  const parseInitOptions = (method?: BaseMethod): InitOptions => ({
95
110
  initSession: method?.payload.initSession,
96
- passphraseState: method?.payload.passphraseState,
111
+ passphraseState: method?.payload.useEmptyPassphrase ? undefined : method?.payload.passphraseState,
97
112
  deviceId: method?.payload.deviceId,
98
113
  deriveCardano: method && hasDeriveCardano(method),
99
114
  connectProtocol: method?.payload.connectProtocol,
115
+ forceProtocolDetection: method?.payload.forceProtocolDetection,
100
116
  protocolV2DeviceInfoTimeoutMs: method?.payload.protocolV2DeviceInfoTimeoutMs,
101
117
  });
102
118
 
103
- let _core: Core;
119
+ let _core: Core | undefined;
104
120
  let _deviceList: DeviceList | undefined;
105
121
  let _connector: DeviceConnector | undefined;
106
122
  let _uiPromises: UiPromise<UiPromiseResponse['type']>[] = []; // Waiting for ui response
@@ -125,6 +141,9 @@ const toError = (error: unknown): Error | undefined => {
125
141
  }
126
142
  };
127
143
 
144
+ const isExpectedCompatibilityError = (error: unknown) =>
145
+ error instanceof HardwareError && error.errorCode === HardwareErrorCode.DeviceNotSupportMethod;
146
+
128
147
  const updateMethodRequestContext = (method: BaseMethod, updates: any) => {
129
148
  if (method.requestContext) {
130
149
  updateRequestContext(method.requestContext.responseID, updates);
@@ -144,11 +163,16 @@ export const callAPI = async (context: CoreContext, message: CoreMessage) => {
144
163
  }
145
164
 
146
165
  // find api method
147
- let method: BaseMethod;
166
+ let method!: BaseMethod;
148
167
  try {
149
168
  method = findMethod(message as IFrameCallMessage);
150
169
  method.connector = _connector;
151
- method.postMessage = postMessage;
170
+ const shouldPostMessage = createUiProgressMessageFilter();
171
+ method.postMessage = event => {
172
+ if (shouldPostMessage(event)) {
173
+ postMessage(event);
174
+ }
175
+ };
152
176
  method.setContext?.(context);
153
177
 
154
178
  method.requestContext = createRequestContext(method.responseID, method.name, {
@@ -160,11 +184,13 @@ export const callAPI = async (context: CoreContext, message: CoreMessage) => {
160
184
 
161
185
  method.init();
162
186
  } catch (error) {
163
- return Promise.reject(error);
187
+ if (method) {
188
+ completeMethodRequestContext(method, error);
189
+ method.dispose();
190
+ }
191
+ return createResponseMessage(method?.responseID ?? message.id, false, { error });
164
192
  }
165
193
 
166
- DevicePool.emitter.on(DEVICE.CONNECT, onDeviceConnectHandler);
167
-
168
194
  if (!method.useDevice) {
169
195
  updateMethodRequestContext(method, { status: 'running' });
170
196
  try {
@@ -271,26 +297,35 @@ const handlePreWarmSignal = async (
271
297
  }
272
298
  };
273
299
 
274
- const waitWithTimeout = async (promise: Promise<any>, timeout: number) => {
275
- const timeoutPromise = new Promise((_, reject) => {
276
- setTimeout(() => reject(new Error('Request timeout')), timeout);
277
- });
278
- return Promise.race([promise, timeoutPromise]);
279
- };
280
-
281
300
  const waitForPendingPromise = async (
282
- getPrePendingCallPromise: () => Promise<void> | undefined,
283
- removePrePendingCallPromise?: (promise: Promise<void> | undefined) => void
301
+ connectId: string,
302
+ getPrePendingCallPromise: (connectId: string) => Promise<void> | undefined,
303
+ removePrePendingCallPromise?: (connectId: string, promise: Promise<void>) => void
284
304
  ) => {
285
- const pendingPromise = getPrePendingCallPromise();
305
+ const pendingPromise = getPrePendingCallPromise(connectId);
286
306
  if (pendingPromise) {
287
307
  Log.debug('pre pending call promise before call method, wait for it');
308
+ let timer: ReturnType<typeof setTimeout> | undefined;
309
+ let timedOut = false;
288
310
  try {
289
- 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
+ ]);
290
320
  } catch (error) {
291
- // 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 });
292
328
  }
293
- removePrePendingCallPromise?.(pendingPromise);
294
329
  Log.debug('pre pending call promise before call method done');
295
330
  }
296
331
  };
@@ -302,7 +337,7 @@ const onCallDevice = async (
302
337
  ): Promise<any> => {
303
338
  let messageResponse: any;
304
339
 
305
- const { requestQueue, getPrePendingCallPromise, setPrePendingCallPromise } = context;
340
+ const { requestQueue, getPrePendingCallPromise, removePrePendingCallPromise } = context;
306
341
 
307
342
  updateMethodRequestContext(method, { status: 'running' });
308
343
 
@@ -330,7 +365,11 @@ const onCallDevice = async (
330
365
  await context.waitForCallbackTasks(method.connectId);
331
366
  }
332
367
 
333
- await waitForPendingPromise(getPrePendingCallPromise, setPrePendingCallPromise);
368
+ await waitForPendingPromise(
369
+ method.connectId ?? '',
370
+ getPrePendingCallPromise,
371
+ removePrePendingCallPromise
372
+ );
334
373
 
335
374
  const task = requestQueue.createTask(method);
336
375
 
@@ -359,7 +398,7 @@ const onCallDevice = async (
359
398
  );
360
399
  } catch (e) {
361
400
  preWarmCallbackTask?.resolve();
362
- console.log('ensureConnected error: ', e);
401
+ Log.debug('ensureConnected error: ', e);
363
402
 
364
403
  completeMethodRequestContext(method, e);
365
404
 
@@ -398,17 +437,26 @@ const onCallDevice = async (
398
437
 
399
438
  registerHardwareUiEventListeners(device, {
400
439
  pin: onDevicePinHandler,
440
+ pinOnDevice: onEnterPinOnDeviceHandler,
441
+ pinOnDeviceComplete: onPinOnDeviceCompleteHandler,
401
442
  button: onDeviceButtonHandler,
402
443
  passphrase: message.payload.useEmptyPassphrase
403
444
  ? onEmptyPassphraseHandler
404
445
  : onDevicePassphraseHandler,
405
446
  passphraseOnDevice: onEnterPassphraseOnDeviceHandler,
447
+ attachPinOnDevice: onEnterAttachPinOnDeviceHandler,
406
448
  });
407
449
  device.on(DEVICE.FEATURES, onDeviceFeaturesHandler);
450
+ device.on(DEVICE.STATE, onDeviceStateHandler);
408
451
  device.on(
409
452
  DEVICE.SELECT_DEVICE_IN_BOOTLOADER_FOR_WEB_DEVICE,
410
453
  onSelectDeviceInBootloaderForWebDeviceHandler
411
454
  );
455
+
456
+ const protocolV2UiCoordinator = new ProtocolV2UiInteractionCoordinator(device, postMessage);
457
+ let protocolV2Operation = false;
458
+ let protocolV2CloseEmitted = false;
459
+ device.beginProtocolV2UiInteraction();
412
460
  device.on(
413
461
  DEVICE.SELECT_DEVICE_FOR_SWITCH_FIRMWARE_WEB_DEVICE,
414
462
  onSelectDeviceForSwitchFirmwareWebDeviceHandler
@@ -420,14 +468,17 @@ const onCallDevice = async (
420
468
  await context.waitForCallbackTasks(method.connectId, preWarmCallbackTask);
421
469
  }
422
470
 
423
- await waitForPendingPromise(getPrePendingCallPromise, setPrePendingCallPromise);
471
+ await waitForPendingPromise(
472
+ method.connectId ?? '',
473
+ getPrePendingCallPromise,
474
+ removePrePendingCallPromise
475
+ );
424
476
 
425
477
  const inner = async (): Promise<void> => {
426
- // Protocol V2 专属方法统一守卫:协议在 acquire/initialize 后已确定,
427
- // V2 设备直接抛出明确的 NotSupport 错误(见 BaseMethod.requireProtocolV2)。
428
- if (method.requireProtocolV2 && !device.isProtocolV2()) {
429
- throw createDeviceNotSupportMethodError(method.name, device.getCurrentFirmwareType());
430
- }
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();
431
482
 
432
483
  // check firmware version
433
484
  const versionRange = device.getCurrentMethodVersionRange(
@@ -438,8 +489,8 @@ const onCallDevice = async (
438
489
  const deviceFirmwareType = device.getCurrentFirmwareType();
439
490
  let newVersionStatus: ReturnType<typeof DataManager.getFirmwareStatus> | undefined;
440
491
 
441
- // 故障批次检测与远端强制升级门禁基于 V1 features/remote config
442
- // 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.
443
494
  if (device.features && !device.isProtocolV2()) {
444
495
  await DataManager.checkAndReloadData();
445
496
 
@@ -487,10 +538,6 @@ const onCallDevice = async (
487
538
  }
488
539
  }
489
540
 
490
- if (isMethodVersionRangeUnsupported(versionRange)) {
491
- throw createDeviceNotSupportMethodError(method.name, deviceFirmwareType);
492
- }
493
-
494
541
  if (versionRange) {
495
542
  if (semver.valid(versionRange.min) && semver.lt(currentFirmwareVersion, versionRange.min)) {
496
543
  if (newVersionStatus === 'none' || newVersionStatus === 'valid') {
@@ -541,89 +588,102 @@ const onCallDevice = async (
541
588
  );
542
589
  }
543
590
 
544
- if (method.deviceId && method.checkDeviceId) {
545
- const isSameDeviceID = device.checkDeviceId(method.deviceId);
546
- if (!isSameDeviceID) {
547
- return Promise.reject(ERRORS.TypedError(HardwareErrorCode.DeviceCheckDeviceIdError));
548
- }
549
- }
550
-
551
- /**
552
- * check firmware release info
553
- */
554
- 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
+ }
555
610
 
556
- /**
557
- * check additional supported feature
558
- */
559
- method.checkDeviceSupportFeature();
611
+ /**
612
+ * check firmware release info
613
+ */
614
+ method.checkFirmwareRelease();
560
615
 
561
- // reconfigure messages
562
- if (_deviceList && device.features && !device.isProtocolV2()) {
563
- await TransportManager.reconfigure(device.features);
564
- }
616
+ /**
617
+ * check additional supported feature
618
+ */
619
+ method.checkDeviceSupportFeature();
565
620
 
566
- // Check to see if it is safe to use Passphrase
567
- checkPassphraseEnableState(method, device.features);
621
+ // reconfigure messages
622
+ if (_deviceList && device.features && !device.isProtocolV2()) {
623
+ await TransportManager.reconfigure(device.features);
624
+ }
568
625
 
569
- if (shouldCheckPassphraseState(method, device)) {
570
- // check version
571
- const support = device.supportNewPassphrase();
572
- if (!support.support) {
573
- return Promise.reject(
574
- ERRORS.TypedError(
575
- HardwareErrorCode.DeviceNotSupportPassphrase,
576
- `Device not support passphrase, please update to ${support.require}`,
577
- {
578
- 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
+ );
579
640
  }
580
- )
581
- );
582
- }
583
641
 
584
- // Check Device passphrase State
585
- const passphraseStateSafety = await device.checkPassphraseStateSafety(
586
- method.payload?.passphraseState,
587
- method.payload?.useEmptyPassphrase,
588
- method.payload?.skipPassphraseCheck
589
- );
590
-
591
- // Double check, handles the special case of Touch/Pro
592
- checkPassphraseEnableState(method, device.features);
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
+ );
593
649
 
594
- if (!passphraseStateSafety) {
595
- DevicePool.clearDeviceCache(method.payload.connectId);
596
- return Promise.reject(
597
- ERRORS.TypedError(HardwareErrorCode.DeviceCheckPassphraseStateError)
598
- );
599
- }
650
+ // Double check, handles the special case of Touch/Pro
651
+ checkPassphraseEnableState(method, device.features);
600
652
 
601
- // close pin popup window
602
- postMessage(createUiMessage(UI_REQUEST.CLOSE_UI_PIN_WINDOW));
603
- }
653
+ if (!passphraseStateSafety) {
654
+ DevicePool.clearDeviceCache(method.payload.connectId);
655
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckPassphraseStateError);
656
+ }
604
657
 
605
- // Automatic check safety_check level for Kovan, Ropsten, Rinkeby, Goerli test networks.
606
- try {
607
- await method.checkSafetyLevelOnTestNet();
608
- } catch (e) {
609
- const error =
610
- e instanceof HardwareError
611
- ? e
612
- : ERRORS.TypedError(HardwareErrorCode.RuntimeError, 'open safety check failed.');
613
- // messageResponse = createResponseMessage(method.responseID, false, { error });
614
- // requestQueue.resolveRequest(method.responseID, messageResponse);
615
- // return;
616
- throw error;
617
- }
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
+ }
618
664
 
619
- 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
+ }
620
673
 
621
- try {
622
- const response: object = await runMethodWithUnlockRetry(method, device);
674
+ method.device?.commands?.checkDisposed();
675
+ },
676
+ });
623
677
  messageResponse = createResponseMessage(method.responseID, true, response);
624
678
  requestQueue.resolveRequest(method.responseID, messageResponse);
625
679
  completeMethodRequestContext(method);
626
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
+ }
627
687
  Log.debug(`Call API - Inner Method Run Error`, error);
628
688
  messageResponse = createResponseMessage(method.responseID, false, { error });
629
689
  requestQueue.resolveRequest(method.responseID, messageResponse);
@@ -636,6 +696,13 @@ const onCallDevice = async (
636
696
  ) {
637
697
  throw error;
638
698
  }
699
+ } finally {
700
+ if (isProtocolV2UiEnabled(method)) {
701
+ protocolV2CloseEmitted = protocolV2UiCoordinator.close({
702
+ ensureOperationClose: protocolV2Operation,
703
+ protocolV2Operation,
704
+ });
705
+ }
639
706
  }
640
707
  };
641
708
  Log.debug('Call API - Device Run: ', device.mainId);
@@ -651,7 +718,9 @@ const onCallDevice = async (
651
718
  try {
652
719
  return await task.callPromise.promise;
653
720
  } catch (e) {
654
- Log.debug('Device Run Error: ', e);
721
+ if (!isExpectedCompatibilityError(e)) {
722
+ Log.debug('Device Run Error: ', e);
723
+ }
655
724
  completeMethodRequestContext(method, e);
656
725
  return createResponseMessage(method.responseID, false, { error: e });
657
726
  }
@@ -689,7 +758,17 @@ const onCallDevice = async (
689
758
 
690
759
  requestQueue.releaseTask(method.responseID);
691
760
 
692
- closePopup();
761
+ if (isProtocolV2UiEnabled(method)) {
762
+ if (!protocolV2CloseEmitted && protocolV2Operation) {
763
+ protocolV2CloseEmitted = protocolV2UiCoordinator.close({
764
+ ensureOperationClose: true,
765
+ protocolV2Operation: true,
766
+ });
767
+ }
768
+ if (!protocolV2CloseEmitted) {
769
+ closePopup();
770
+ }
771
+ }
693
772
 
694
773
  cleanup();
695
774
 
@@ -835,24 +914,68 @@ function canSkipInitialize(method: BaseMethod, device: Device): boolean {
835
914
  return true;
836
915
  }
837
916
 
838
- function isRetryableBleProtocolV2ProbeError(method: BaseMethod, error: unknown) {
839
- 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 ?? '');
840
921
  return (
841
922
  method.payload.connectProtocol === 'V2' &&
923
+ typedError?.errorCode === HardwareErrorCode.RuntimeError &&
842
924
  message.includes('Device protocol mismatch') &&
843
925
  message.includes('expected V2') &&
844
926
  message.includes('did not respond to expected protocol')
845
927
  );
846
928
  }
847
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
+
848
953
  /**
849
954
  * If the Bluetooth connection times out, retry up to 6 times
850
955
  * @param retryCount - Current retry count (default 0)
851
956
  */
852
957
  async function connectDeviceForBle(method: BaseMethod, device: Device, retryCount = 0) {
853
958
  try {
854
- 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
+ }
855
975
  if (method.payload?.onlyConnectBleDevice) {
976
+ if (shouldAcquire) {
977
+ DevicePool.emitter.emit(DEVICE.CONNECT, device);
978
+ }
856
979
  return;
857
980
  }
858
981
  // Skip initialize if conditions are met
@@ -863,15 +986,29 @@ async function connectDeviceForBle(method: BaseMethod, device: Device, retryCoun
863
986
  passphraseState: initOptions.passphraseState,
864
987
  });
865
988
  }
989
+ if (shouldAcquire) {
990
+ DevicePool.emitter.emit(DEVICE.CONNECT, device);
991
+ }
866
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.
867
998
  if (
868
- (err.errorCode === HardwareErrorCode.BleTimeoutError ||
869
- err.errorCode === HardwareErrorCode.BleConnectedError ||
870
- isRetryableBleProtocolV2ProbeError(method, err)) &&
871
- retryCount < 6
999
+ (ERROR_CODES_REQUIRE_DISCONNECT.includes(err.errorCode) || requiresColdReconnect) &&
1000
+ device.mainId &&
1001
+ device.deviceConnector
872
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) {
873
1010
  const nextRetry = retryCount + 1;
874
- Log.debug(`Bluetooth connect timeout and will retry, retry count: ${nextRetry}`);
1011
+ Log.debug(`Bluetooth connection will retry, retry count: ${nextRetry}`);
875
1012
  await wait(3000);
876
1013
  await connectDeviceForBle(method, device, nextRetry);
877
1014
  } else {
@@ -978,6 +1115,11 @@ const ensureConnected = async (
978
1115
  if (abort()) {
979
1116
  return;
980
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
+ }
981
1123
  await connectDeviceForBle(method, device);
982
1124
  }
983
1125
  resolve(device);
@@ -985,6 +1127,19 @@ const ensureConnected = async (
985
1127
  }
986
1128
  } catch (error) {
987
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
+ }
988
1143
  if ([HardwareErrorCode.BleCharacteristicNotifyChangeFailure].includes(error.errorCode)) {
989
1144
  postMessage(createUiMessage(UI_REQUEST.BLUETOOTH_CHARACTERISTIC_NOTIFY_CHANGE_FAILURE));
990
1145
  }
@@ -997,6 +1152,7 @@ const ensureConnected = async (
997
1152
  HardwareErrorCode.BleLocationServicesDisabled,
998
1153
  HardwareErrorCode.BleDeviceNotBonded,
999
1154
  HardwareErrorCode.BleDeviceBondError,
1155
+ HardwareErrorCode.BlePeerRemovedPairingInformation,
1000
1156
  HardwareErrorCode.BleDeviceBondedCanceled,
1001
1157
  HardwareErrorCode.BleCharacteristicNotifyError,
1002
1158
  HardwareErrorCode.BleTimeoutError,
@@ -1007,6 +1163,8 @@ const ensureConnected = async (
1007
1163
  HardwareErrorCode.DeviceDetectInBootloaderMode,
1008
1164
  HardwareErrorCode.BleCharacteristicNotifyChangeFailure,
1009
1165
  HardwareErrorCode.BridgeNeedsPermission,
1166
+ HardwareErrorCode.DeviceInterruptedFromUser,
1167
+ HardwareErrorCode.CallQueueActionCancelled,
1010
1168
  ].includes(error.errorCode)
1011
1169
  ) {
1012
1170
  reject(error);
@@ -1064,22 +1222,31 @@ export const cancel = (context: CoreContext, connectId?: string) => {
1064
1222
  )}`
1065
1223
  );
1066
1224
  const canceledDevices: Device[] = [];
1225
+ const interruptDevice = (device: Device | undefined, deviceConnectId: string) => {
1226
+ if (!device || canceledDevices.includes(device)) {
1227
+ return;
1228
+ }
1229
+ setPrePendingCallPromise(deviceConnectId, device.interruptionFromUser());
1230
+ canceledDevices.push(device);
1231
+ };
1067
1232
  for (const requestId of requestIds) {
1068
1233
  const task = requestQueue.getTask(requestId);
1069
1234
  Log.debug('Cancel Api connect task: ', task);
1070
- if (task && task.method?.device) {
1071
- if (!canceledDevices.includes(task.method.device)) {
1072
- const { device } = task.method;
1073
- setPrePendingCallPromise(device?.interruptionFromUser());
1074
- canceledDevices.push(device);
1075
- }
1235
+ if (task) {
1236
+ // During ensureConnected the method has a connectId but device is
1237
+ // assigned only after the poll succeeds. Interrupt the cached BLE
1238
+ // Device so an in-flight acquire/initialize cannot finish.
1239
+ interruptDevice(task.method?.device, task.method.connectId ?? connectId);
1240
+ interruptDevice(deviceCacheMap.get(connectId), connectId);
1076
1241
  requestQueue.rejectRequest(
1077
1242
  requestId,
1078
1243
  ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled)
1079
1244
  );
1080
1245
  }
1081
1246
  }
1247
+ interruptDevice(deviceCacheMap.get(connectId), connectId);
1082
1248
  requestQueue.abortRequestsByConnectId(connectId);
1249
+ pollingManager.stop(connectId);
1083
1250
  } catch (e) {
1084
1251
  Log.error('Cancel API Error: ', e);
1085
1252
  }
@@ -1088,22 +1255,31 @@ export const cancel = (context: CoreContext, connectId?: string) => {
1088
1255
  if (DataManager.isBleConnect(env)) {
1089
1256
  Log.debug('Cancel Api all _deviceList: ');
1090
1257
  const canceledDevices: Device[] = [];
1258
+ const interruptDevice = (device?: Device) => {
1259
+ if (!device || canceledDevices.includes(device)) {
1260
+ return;
1261
+ }
1262
+ device.interruptionFromUser().catch(() => undefined);
1263
+ canceledDevices.push(device);
1264
+ };
1091
1265
  for (const requestId of requestQueue.getRequestTasksId()) {
1092
1266
  const task = requestQueue.getTask(requestId);
1093
1267
  Log.debug('Cancel Api connect task: ', task);
1094
- if (task && task.method?.device) {
1095
- if (!canceledDevices.includes(task.method.device)) {
1096
- const { device } = task.method;
1097
- device?.interruptionFromUser();
1098
- canceledDevices.push(device);
1268
+ if (task) {
1269
+ interruptDevice(task.method?.device);
1270
+ if (task.method.connectId) {
1271
+ interruptDevice(deviceCacheMap.get(task.method.connectId));
1272
+ pollingManager.stop(task.method.connectId);
1099
1273
  }
1100
-
1101
1274
  requestQueue.rejectRequest(
1102
1275
  requestId,
1103
1276
  ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled)
1104
1277
  );
1105
1278
  }
1106
1279
  }
1280
+ deviceCacheMap.forEach(interruptDevice);
1281
+ requestQueue.abortAllRequests();
1282
+ pollingManager.stopAll();
1107
1283
  } else {
1108
1284
  _deviceList?.allDevices().forEach(device => {
1109
1285
  Log.debug('device: ', device, ' device.hasDeviceAcquire: ', device.hasDeviceAcquire());
@@ -1157,14 +1333,16 @@ const shouldCheckPassphraseState = (method: BaseMethod, device: Device) => {
1157
1333
  };
1158
1334
 
1159
1335
  const cleanup = () => {
1336
+ const pendingUiPromises = _uiPromises;
1160
1337
  _uiPromises = [];
1161
- Log.debug('Cleanup...');
1338
+ rejectUiPromises(
1339
+ pendingUiPromises,
1340
+ ERRORS.TypedError(HardwareErrorCode.ActionCancelled, 'UI request was cancelled')
1341
+ );
1162
1342
  };
1163
1343
 
1164
1344
  const removeDeviceListener = (device: Device) => {
1165
1345
  device.removeAllListeners();
1166
- DevicePool.emitter.removeAllListeners(DEVICE.CONNECT);
1167
- // DevicePool.emitter.removeListener(DEVICE.DISCONNECT, onDeviceDisconnectHandler);
1168
1346
  };
1169
1347
 
1170
1348
  /**
@@ -1175,19 +1353,33 @@ const closePopup = () => {
1175
1353
  };
1176
1354
 
1177
1355
  const onDeviceConnectHandler = (device: Device) => {
1178
- const env = DataManager.getSettings('env');
1179
- const deviceObject = DataManager.isBleConnect(env) ? device : device.toMessageObject();
1180
- postMessage(createDeviceMessage(DEVICE.CONNECT, { device: deviceObject as KnownDevice }));
1356
+ const deviceObject = device.toMessageObject();
1357
+ if (!deviceObject) return;
1358
+ postMessage(createDeviceMessage(DEVICE.CONNECT, { device: deviceObject }));
1181
1359
  };
1182
1360
 
1183
1361
  const onDeviceDisconnectHandler = (device: Device) => {
1184
1362
  device.clearPreInitialized();
1185
- const env = DataManager.getSettings('env');
1186
- const deviceObject = DataManager.isBleConnect(env) ? device : device.toMessageObject();
1187
- postMessage(createDeviceMessage(DEVICE.DISCONNECT, { device: deviceObject as KnownDevice }));
1363
+ const deviceObject = device.toMessageObject();
1364
+ if (!deviceObject) return;
1365
+ postMessage(createDeviceMessage(DEVICE.DISCONNECT, { device: deviceObject }));
1366
+ };
1367
+
1368
+ const onTransportDeviceDisconnectHandler = (event: TransportDeviceDisconnectEvent) => {
1369
+ const device =
1370
+ deviceCacheMap.get(event.connectId) ??
1371
+ DevicePool.devicesCache[event.connectId] ??
1372
+ DevicePool.getDeviceByPath(event.connectId);
1373
+ if (!device) {
1374
+ Log.debug('Ignoring transport disconnect for an unknown device:', event.connectId);
1375
+ return;
1376
+ }
1377
+
1378
+ device.markTransportDisconnected();
1379
+ DevicePool.emitter.emit(DEVICE.DISCONNECT, device);
1188
1380
  };
1189
1381
 
1190
- const onDevicePinHandler = async (...[device, type, callback]: DeviceEvents['pin']) => {
1382
+ const onDevicePinHandler = (...[device, type, callback]: DeviceEvents['pin']) => {
1191
1383
  Log.log('request Input PIN');
1192
1384
  // create ui promise
1193
1385
  const uiPromise = createUiPromise(UI_RESPONSE.RECEIVE_PIN, device);
@@ -1196,12 +1388,14 @@ const onDevicePinHandler = async (...[device, type, callback]: DeviceEvents['pin
1196
1388
  createUiMessage(UI_REQUEST.REQUEST_PIN, {
1197
1389
  device: device.toMessageObject() as unknown as KnownDevice,
1198
1390
  type,
1391
+ responseCorrelation: uiPromise.responseCorrelation,
1199
1392
  })
1200
1393
  );
1201
- // wait for pin
1202
- const uiResp = await uiPromise.promise;
1203
- // callback.apply(null, [null, pin]);
1204
- callback(null, uiResp.payload);
1394
+ consumeUiPromise(
1395
+ uiPromise.promise,
1396
+ uiResp => callback(null, uiResp.payload),
1397
+ error => callback(error, '')
1398
+ );
1205
1399
  };
1206
1400
 
1207
1401
  export const onDeviceButtonHandler = (...[device, request]: [...DeviceEvents['button']]) => {
@@ -1225,7 +1419,11 @@ const onDeviceFeaturesHandler = (...[_, features]: [...DeviceEvents['features']]
1225
1419
  postMessage(createDeviceMessage(DEVICE.FEATURES, { ...features }));
1226
1420
  };
1227
1421
 
1228
- const onDevicePassphraseHandler = async (
1422
+ const onDeviceStateHandler = (...[_, stateEvent]: [...DeviceEvents['state']]) => {
1423
+ postMessage(createDeviceMessage(DEVICE.STATE, stateEvent));
1424
+ };
1425
+
1426
+ const onDevicePassphraseHandler = (
1229
1427
  ...[device, requestPayload, callback]: DeviceEvents['passphrase']
1230
1428
  ) => {
1231
1429
  Log.debug('onDevicePassphraseHandler');
@@ -1235,18 +1433,27 @@ const onDevicePassphraseHandler = async (
1235
1433
  device: device.toMessageObject() as KnownDevice,
1236
1434
  passphraseState: device.passphraseState,
1237
1435
  existsAttachPinUser: requestPayload.existsAttachPinUser,
1436
+ deviceOnly: requestPayload.deviceOnly,
1437
+ source: requestPayload.source,
1438
+ reason: requestPayload.reason,
1439
+ expectedPassphraseState: requestPayload.expectedPassphraseState,
1440
+ ...(requestPayload.interaction ? { interaction: requestPayload.interaction } : {}),
1441
+ responseCorrelation: uiPromise.responseCorrelation,
1238
1442
  })
1239
1443
  );
1240
- // wait for passphrase
1241
- const uiResp = await uiPromise.promise;
1242
- const { value, passphraseOnDevice, save, attachPinOnDevice } = uiResp.payload;
1243
- // send as PassphrasePromptResponse
1244
- callback({
1245
- passphrase: value.normalize('NFKD'),
1246
- passphraseOnDevice,
1247
- attachPinOnDevice,
1248
- cache: save,
1249
- });
1444
+ consumeUiPromise(
1445
+ uiPromise.promise,
1446
+ uiResp => {
1447
+ const { value, passphraseOnDevice, save, attachPinOnDevice } = uiResp.payload;
1448
+ callback({
1449
+ passphrase: value.normalize('NFKD'),
1450
+ passphraseOnDevice,
1451
+ attachPinOnDevice,
1452
+ cache: save,
1453
+ });
1454
+ },
1455
+ error => callback({}, error)
1456
+ );
1250
1457
  };
1251
1458
 
1252
1459
  const onEmptyPassphraseHandler = (...[_, , callback]: DeviceEvents['passphrase']) => {
@@ -1256,17 +1463,62 @@ const onEmptyPassphraseHandler = (...[_, , callback]: DeviceEvents['passphrase']
1256
1463
  };
1257
1464
 
1258
1465
  const onEnterPassphraseOnDeviceHandler = (
1259
- ...[device]: [...DeviceEvents['passphrase_on_device']]
1466
+ ...[device, requestPayload]: [...DeviceEvents['passphrase_on_device']]
1260
1467
  ) => {
1261
1468
  postMessage(
1262
1469
  createUiMessage(UI_REQUEST.REQUEST_PASSPHRASE_ON_DEVICE, {
1263
1470
  device: device.toMessageObject() as KnownDevice,
1264
1471
  passphraseState: device.passphraseState,
1472
+ source: requestPayload?.source,
1473
+ reason: requestPayload?.reason,
1474
+ ...(requestPayload?.interaction ? { interaction: requestPayload.interaction } : {}),
1475
+ })
1476
+ );
1477
+ };
1478
+
1479
+ const onEnterAttachPinOnDeviceHandler = (
1480
+ ...[device, requestPayload]: [...DeviceEvents['attach_pin_on_device']]
1481
+ ) => {
1482
+ postMessage(
1483
+ createUiMessage(UI_REQUEST.REQUEST_PIN, {
1484
+ device: device.toMessageObject() as KnownDevice,
1485
+ type: 'ButtonRequest_AttachPin',
1486
+ source: requestPayload?.source,
1487
+ reason: requestPayload?.reason,
1488
+ ...(requestPayload?.interaction ? { interaction: requestPayload.interaction } : {}),
1489
+ })
1490
+ );
1491
+ };
1492
+
1493
+ const onEnterPinOnDeviceHandler = (
1494
+ ...[device, pinType, metadata]: [...DeviceEvents['pin_on_device']]
1495
+ ) => {
1496
+ postMessage(
1497
+ createUiMessage(UI_REQUEST.REQUEST_PIN, {
1498
+ device: device.toMessageObject() as KnownDevice,
1499
+ type:
1500
+ pinType === DeviceSessionPinType.AttachToPin
1501
+ ? 'ButtonRequest_AttachPin'
1502
+ : 'ButtonRequest_PinEntry',
1503
+ source: metadata?.source,
1504
+ reason: metadata?.reason,
1505
+ deviceOnly: metadata?.deviceOnly ?? true,
1506
+ completion: metadata?.completion,
1507
+ method: metadata?.method,
1508
+ page: metadata?.page,
1509
+ operation: metadata?.operation,
1510
+ ...(metadata?.interaction ? { interaction: metadata.interaction } : {}),
1265
1511
  })
1266
1512
  );
1267
1513
  };
1268
1514
 
1269
- const onSelectDeviceInBootloaderForWebDeviceHandler = async (
1515
+ const onPinOnDeviceCompleteHandler = (
1516
+ ...[_, metadata]: [...DeviceEvents['pin_on_device_complete']]
1517
+ ) => {
1518
+ postMessage(createUiMessage(UI_REQUEST.CLOSE_UI_PIN_WINDOW, metadata));
1519
+ };
1520
+
1521
+ const onSelectDeviceInBootloaderForWebDeviceHandler = (
1270
1522
  ...[device, callback]: [...DeviceEvents['select_device_in_bootloader_for_web_device']]
1271
1523
  ) => {
1272
1524
  Log.debug('onSelectDeviceInBootloaderForWebDeviceHandler');
@@ -1276,11 +1528,14 @@ const onSelectDeviceInBootloaderForWebDeviceHandler = async (
1276
1528
  device: device.toMessageObject() as KnownDevice,
1277
1529
  })
1278
1530
  );
1279
- const uiResp = await uiPromise.promise;
1280
- callback(null, uiResp.payload.deviceId);
1531
+ consumeUiPromise(
1532
+ uiPromise.promise,
1533
+ uiResp => callback(null, uiResp.payload.deviceId),
1534
+ error => callback(error, '')
1535
+ );
1281
1536
  };
1282
1537
 
1283
- const onSelectDeviceForSwitchFirmwareWebDeviceHandler = async (
1538
+ const onSelectDeviceForSwitchFirmwareWebDeviceHandler = (
1284
1539
  ...[device, callback]: [...DeviceEvents['select_device_for_switch_firmware_web_device']]
1285
1540
  ) => {
1286
1541
  Log.debug('onSelectDeviceForSwitchFirmwareWebDeviceHandler');
@@ -1293,8 +1548,11 @@ const onSelectDeviceForSwitchFirmwareWebDeviceHandler = async (
1293
1548
  device: device.toMessageObject() as KnownDevice,
1294
1549
  })
1295
1550
  );
1296
- const uiResp = await uiPromise.promise;
1297
- callback(null, uiResp.payload.deviceId);
1551
+ consumeUiPromise(
1552
+ uiPromise.promise,
1553
+ uiResp => callback(null, uiResp.payload.deviceId),
1554
+ error => callback(error, '')
1555
+ );
1298
1556
  };
1299
1557
 
1300
1558
  /**
@@ -1313,14 +1571,21 @@ const postMessage = (message: CoreMessage) => {
1313
1571
 
1314
1572
  const createUiPromise = <T extends UiPromiseResponse['type']>(promiseEvent: T, device?: Device) => {
1315
1573
  const uiPromise: UiPromise<T> = createDeferred(promiseEvent, device);
1574
+ if (
1575
+ device &&
1576
+ (promiseEvent === UI_RESPONSE.RECEIVE_PIN || promiseEvent === UI_RESPONSE.RECEIVE_PASSPHRASE)
1577
+ ) {
1578
+ const publicDeviceId = device.toMessageObject()?.deviceId;
1579
+ uiPromise.responseCorrelation = {
1580
+ interactionId: generateInstanceId('UiResponse', device.sdkInstanceId),
1581
+ deviceId: publicDeviceId || device.instanceId,
1582
+ };
1583
+ }
1316
1584
  _uiPromises.push(uiPromise as any);
1317
1585
 
1318
1586
  return uiPromise;
1319
1587
  };
1320
1588
 
1321
- const findUiPromise = <T extends UiPromiseResponse['type']>(promiseEvent: T) =>
1322
- _uiPromises.find(p => p.id === promiseEvent);
1323
-
1324
1589
  const removeUiPromise = (promise: Deferred<any>) => {
1325
1590
  _uiPromises = _uiPromises.filter(p => p !== promise);
1326
1591
  };
@@ -1332,8 +1597,10 @@ export default class Core extends EventEmitter {
1332
1597
 
1333
1598
  private requestQueue = new RequestQueue();
1334
1599
 
1600
+ private disposePromise?: Promise<void>;
1601
+
1335
1602
  // background task
1336
- private prePendingCallPromise: Promise<void> | undefined;
1603
+ private prePendingCallPromises = new Map<string, Promise<void>>();
1337
1604
 
1338
1605
  private methodSynchronize = getSynchronize();
1339
1606
 
@@ -1344,19 +1611,24 @@ export default class Core extends EventEmitter {
1344
1611
  Log.debug(`[Core] Created SDK instance: ${this.sdkInstanceId}`);
1345
1612
  }
1346
1613
 
1347
- cancelOperation(operationId: string) {
1348
- this.requestQueue.abortOperation(operationId);
1349
- }
1350
-
1351
1614
  private getCoreContext() {
1352
1615
  return {
1353
1616
  sdkInstanceId: this.sdkInstanceId,
1354
1617
  tracingContext: this.tracingContext,
1355
1618
  requestQueue: this.requestQueue,
1356
1619
  methodSynchronize: this.methodSynchronize,
1357
- getPrePendingCallPromise: () => this.prePendingCallPromise,
1358
- setPrePendingCallPromise: (promise: Promise<void> | undefined) => {
1359
- this.prePendingCallPromise = promise;
1620
+ getPrePendingCallPromise: (connectId: string) => this.prePendingCallPromises.get(connectId),
1621
+ setPrePendingCallPromise: (connectId: string, promise?: Promise<void>) => {
1622
+ if (!promise) {
1623
+ this.prePendingCallPromises.delete(connectId);
1624
+ return;
1625
+ }
1626
+ this.prePendingCallPromises.set(connectId, promise);
1627
+ },
1628
+ removePrePendingCallPromise: (connectId: string, promise: Promise<void>) => {
1629
+ if (this.prePendingCallPromises.get(connectId) === promise) {
1630
+ this.prePendingCallPromises.delete(connectId);
1631
+ }
1360
1632
  },
1361
1633
  // callback 任务管理
1362
1634
  registerCallbackTask: (connectId: string, callbackPromise: Deferred<any>) => {
@@ -1374,11 +1646,16 @@ export default class Core extends EventEmitter {
1374
1646
  case UI_RESPONSE.RECEIVE_PASSPHRASE:
1375
1647
  case UI_RESPONSE.SELECT_DEVICE_IN_BOOTLOADER_FOR_WEB_DEVICE:
1376
1648
  case UI_RESPONSE.SELECT_DEVICE_FOR_SWITCH_FIRMWARE_WEB_DEVICE: {
1377
- const uiPromise = findUiPromise(message.type);
1649
+ const uiPromise = findUiPromiseForResponse(_uiPromises, message);
1378
1650
  if (uiPromise) {
1379
1651
  Log.log('receive UI Response: ', message.type);
1380
1652
  uiPromise.resolve(message);
1381
1653
  removeUiPromise(uiPromise);
1654
+ } else if (
1655
+ message.type === UI_RESPONSE.RECEIVE_PIN ||
1656
+ message.type === UI_RESPONSE.RECEIVE_PASSPHRASE
1657
+ ) {
1658
+ Log.warn('Ignored unmatched or ambiguous sensitive UI response:', message.type);
1382
1659
  }
1383
1660
  break;
1384
1661
  }
@@ -1394,10 +1671,17 @@ export default class Core extends EventEmitter {
1394
1671
  }
1395
1672
 
1396
1673
  case IFRAME.CALL: {
1397
- Log.log(`[${Date.now()}][CALL_API]`, message);
1674
+ const logBlockLabel = getLogBlockLabel(message);
1675
+ Log.log(
1676
+ formatLogMethodLabel(`[${Date.now()}][CALL_API]`, logBlockLabel),
1677
+ getSafeLogPayload(message, logBlockLabel)
1678
+ );
1398
1679
  const response = await callAPI(this.getCoreContext(), message);
1399
1680
  const { success, payload } = response;
1400
- Log.log(`[${Date.now()}][CALL_API_RESPONSE]`, response);
1681
+ Log.log(
1682
+ formatLogMethodLabel(`[${Date.now()}][CALL_API_RESPONSE]`, logBlockLabel),
1683
+ getSafeLogPayload(response, logBlockLabel)
1684
+ );
1401
1685
  if (success) {
1402
1686
  return response;
1403
1687
  }
@@ -1416,10 +1700,6 @@ export default class Core extends EventEmitter {
1416
1700
  cancel(this.getCoreContext(), message.payload.connectId);
1417
1701
  break;
1418
1702
  }
1419
- case IFRAME.CANCEL_OPERATION: {
1420
- this.cancelOperation(message.payload.operationId);
1421
- break;
1422
- }
1423
1703
  case IFRAME.CALLBACK: {
1424
1704
  Log.log('callback message: ', message);
1425
1705
  postMessage(message);
@@ -1431,25 +1711,65 @@ export default class Core extends EventEmitter {
1431
1711
  return Promise.resolve(message);
1432
1712
  }
1433
1713
 
1434
- dispose() {
1714
+ dispose(): Promise<void> {
1715
+ if (!this.disposePromise) {
1716
+ this.disposePromise = this.disposeResources();
1717
+ }
1718
+ return this.disposePromise;
1719
+ }
1720
+
1721
+ private async disposeResources(): Promise<void> {
1722
+ Log.debug(`[Core] Disposing SDK instance: ${this.sdkInstanceId}`);
1723
+ pollingManager.stopAll();
1724
+ this.requestQueue.abortAllRequests();
1725
+ cleanup();
1726
+
1727
+ _connector?.stop();
1728
+ let transportCleanup: Promise<void>;
1729
+ try {
1730
+ transportCleanup = Promise.resolve(TransportManager.getTransport()?.stop?.()).catch(error => {
1731
+ Log.warn('[Core] Transport cleanup failed:', error);
1732
+ });
1733
+ } catch (error) {
1734
+ Log.warn('[Core] Transport cleanup failed:', error);
1735
+ transportCleanup = Promise.resolve();
1736
+ }
1737
+
1738
+ // Preserve synchronous dispose semantics for in-memory state and listeners.
1435
1739
  _deviceList = undefined;
1436
1740
  _connector = undefined;
1741
+ DevicePool.dispose();
1437
1742
  deviceCacheMap.clear();
1438
1743
  preWarmInflight.clear();
1439
1744
  preWarmDoneAt.clear();
1440
- Log.debug(`[Core] Disposing SDK instance: ${this.sdkInstanceId}`);
1745
+ preConnectCache = { passphraseState: undefined };
1746
+ this.prePendingCallPromises.clear();
1747
+ this.removeAllListeners();
1441
1748
  cleanupSdkInstance(this.sdkInstanceId);
1749
+ if (_core === this) _core = undefined;
1750
+
1751
+ // Transports, especially Node USB, may release native handles asynchronously.
1752
+ await transportCleanup;
1442
1753
  }
1443
1754
  }
1444
1755
 
1445
1756
  export const initCore = () => {
1446
- _core = new Core();
1447
- return _core;
1757
+ const core = new Core();
1758
+ _core = core;
1759
+ return core;
1448
1760
  };
1449
1761
 
1450
1762
  export const initConnector = () => {
1451
1763
  _connector = new DeviceConnector();
1764
+ DevicePool.emitter.removeListener(DEVICE.CONNECT, onDeviceConnectHandler);
1765
+ DevicePool.emitter.removeListener(DEVICE.DISCONNECT, onDeviceDisconnectHandler);
1766
+ DevicePool.emitter.removeListener(
1767
+ TRANSPORT_EVENT.DEVICE_DISCONNECT,
1768
+ onTransportDeviceDisconnectHandler
1769
+ );
1770
+ DevicePool.emitter.on(DEVICE.CONNECT, onDeviceConnectHandler);
1452
1771
  DevicePool.emitter.on(DEVICE.DISCONNECT, onDeviceDisconnectHandler);
1772
+ DevicePool.emitter.on(TRANSPORT_EVENT.DEVICE_DISCONNECT, onTransportDeviceDisconnectHandler);
1453
1773
  return _connector;
1454
1774
  };
1455
1775
 
@@ -1463,12 +1783,8 @@ export const init = async (
1463
1783
  plugin?: LowlevelTransportSharedPlugin
1464
1784
  ) => {
1465
1785
  try {
1466
- try {
1467
- await DataManager.load(settings);
1468
- initTransport(Transport, plugin);
1469
- } catch {
1470
- Log.error('DataManager.load error');
1471
- }
1786
+ await DataManager.load(settings);
1787
+ initTransport(Transport, plugin);
1472
1788
  enableLog(DataManager.getSettings('debug'));
1473
1789
  if (DataManager.getSettings('env') !== 'react-native') {
1474
1790
  setLoggerPostMessage(postMessage);
@@ -1479,6 +1795,7 @@ export const init = async (
1479
1795
  return _core;
1480
1796
  } catch (error) {
1481
1797
  Log.error('core init', error);
1798
+ throw error;
1482
1799
  }
1483
1800
  };
1484
1801