@onekeyfe/hd-core 1.2.0-alpha.15 → 1.2.0-alpha.150

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 (851) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +390 -0
  2. package/__tests__/DeviceCommands.test.ts +654 -0
  3. package/__tests__/DeviceEventRegistration.test.ts +17 -3
  4. package/__tests__/base64Data.test.ts +69 -0
  5. package/__tests__/chain-params-onekey-compatibility.test.ts +229 -0
  6. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +878 -0
  7. package/__tests__/check-firmware-release-protocol-v2.test.ts +270 -0
  8. package/__tests__/connectSettings.test.ts +45 -5
  9. package/__tests__/core-dispose.test.ts +34 -0
  10. package/__tests__/core-error-output.test.ts +39 -0
  11. package/__tests__/core-initialization.test.ts +23 -0
  12. package/__tests__/device-connector-protocol.test.ts +102 -0
  13. package/__tests__/device-features-state.test.ts +78 -0
  14. package/__tests__/device-identity.test.ts +52 -0
  15. package/__tests__/device-initialize-timeout.test.ts +56 -0
  16. package/__tests__/device-lifecycle-events.test.ts +752 -0
  17. package/__tests__/device-pool-state.test.ts +191 -0
  18. package/__tests__/device-settings.test.ts +665 -0
  19. package/__tests__/device-state-contract.test.ts +28 -0
  20. package/__tests__/device-state-events.test.ts +286 -0
  21. package/__tests__/device-state-mapper.test.ts +335 -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 +162 -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-memory-host.test.ts +126 -0
  35. package/__tests__/firmware-update/check-all-firmware-release.test.ts +175 -0
  36. package/__tests__/firmware-update/device-update-bootloader.test.ts +109 -0
  37. package/__tests__/firmware-update/firmware-artifact-source.test.ts +171 -0
  38. package/__tests__/firmware-update/firmware-host-binding.test.ts +79 -0
  39. package/__tests__/firmware-update/firmware-preparation-error.test.ts +27 -0
  40. package/__tests__/firmware-update/firmware-prepared-host-digest.test.ts +583 -0
  41. package/__tests__/firmware-update/firmware-prepared-resource-archive.test.ts +171 -0
  42. package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +438 -0
  43. package/__tests__/firmware-update/firmware-update-capabilities.test.ts +13 -0
  44. package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +474 -0
  45. package/__tests__/firmware-update/firmware-update-plan.test.ts +819 -0
  46. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +287 -0
  47. package/__tests__/firmware-update/firmware-update-prepared-resource-executors.test.ts +326 -0
  48. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +457 -0
  49. package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +237 -0
  50. package/__tests__/firmware-update/firmware-update-v4-install-poll.test.ts +166 -0
  51. package/__tests__/firmware-update/firmware-update-v4-parameters.test.ts +85 -0
  52. package/__tests__/firmware-update/firmware-upload-source.test.ts +70 -0
  53. package/__tests__/get-device-state.test.ts +617 -0
  54. package/__tests__/homescreen.test.ts +81 -0
  55. package/__tests__/kaspa-public-types.type-test.ts +16 -0
  56. package/__tests__/kaspa-use-tweak-pro2.test.ts +20 -0
  57. package/__tests__/kaspaSignTransaction.test.ts +578 -0
  58. package/__tests__/known-device-public-types.type-test.ts +3 -0
  59. package/__tests__/logBlockEvent.test.ts +140 -1
  60. package/__tests__/method-protocol-support.test.ts +144 -0
  61. package/__tests__/networkUtils.test.ts +406 -0
  62. package/__tests__/open-wallet-session-error-response.test.ts +43 -0
  63. package/__tests__/open-wallet-session.test.ts +1899 -0
  64. package/__tests__/pro2Nft.test.ts +108 -0
  65. package/__tests__/pro2Wallpaper.test.ts +8 -19
  66. package/__tests__/protocol-binding.test.ts +89 -0
  67. package/__tests__/protocol-v2-firmware-targets.test.ts +105 -0
  68. package/__tests__/protocol-v2-ping.test.ts +28 -0
  69. package/__tests__/protocol-v2-resources.test.ts +331 -0
  70. package/__tests__/protocol-v2-ui-lifecycle.test.ts +91 -0
  71. package/__tests__/protocol-v2-unlock-policy.test.ts +507 -0
  72. package/__tests__/protocol-v2.test.ts +7405 -1680
  73. package/__tests__/protocolV2FileWrite.test.ts +221 -3
  74. package/__tests__/protocolV2UiInteraction.test.ts +329 -0
  75. package/__tests__/public-device-state-api.test.ts +275 -0
  76. package/__tests__/public-pro2-api-boundary.test.ts +107 -0
  77. package/__tests__/refresh-device-state.test.ts +103 -0
  78. package/__tests__/request-context-logging.test.ts +16 -0
  79. package/__tests__/resourceBase64Boundary.test.ts +48 -0
  80. package/__tests__/search-devices.test.ts +191 -0
  81. package/__tests__/ton-sign-message.test.ts +84 -0
  82. package/__tests__/tron-sign-message-init.test.ts +74 -0
  83. package/__tests__/uiProgressThrottle.test.ts +74 -0
  84. package/__tests__/uiPromiseRegistry.test.ts +115 -0
  85. package/dist/api/BaseMethod.d.ts +14 -2
  86. package/dist/api/BaseMethod.d.ts.map +1 -1
  87. package/dist/api/CheckAllFirmwareRelease.d.ts +25 -1
  88. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  89. package/dist/api/CheckBLEFirmwareRelease.d.ts +3 -2
  90. package/dist/api/CheckBLEFirmwareRelease.d.ts.map +1 -1
  91. package/dist/api/CheckBootloaderRelease.d.ts +2 -1
  92. package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
  93. package/dist/api/CheckFirmwareRelease.d.ts +3 -2
  94. package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
  95. package/dist/api/CipherKeyValue.d.ts +1 -0
  96. package/dist/api/CipherKeyValue.d.ts.map +1 -1
  97. package/dist/api/ClearSessionCache.d.ts.map +1 -1
  98. package/dist/api/DetectDeviceConnectProtocol.d.ts +7 -0
  99. package/dist/api/DetectDeviceConnectProtocol.d.ts.map +1 -0
  100. package/dist/api/DirList.d.ts +1 -0
  101. package/dist/api/DirList.d.ts.map +1 -1
  102. package/dist/api/DirMake.d.ts +1 -0
  103. package/dist/api/DirMake.d.ts.map +1 -1
  104. package/dist/api/DirRemove.d.ts +1 -0
  105. package/dist/api/DirRemove.d.ts.map +1 -1
  106. package/dist/api/FileDelete.d.ts +1 -0
  107. package/dist/api/FileDelete.d.ts.map +1 -1
  108. package/dist/api/FileRead.d.ts +1 -0
  109. package/dist/api/FileRead.d.ts.map +1 -1
  110. package/dist/api/FileWrite.d.ts +1 -0
  111. package/dist/api/FileWrite.d.ts.map +1 -1
  112. package/dist/api/FirmwareUpdate.d.ts.map +1 -1
  113. package/dist/api/FirmwareUpdateV2.d.ts +13 -2
  114. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  115. package/dist/api/FirmwareUpdateV3.d.ts +7 -3
  116. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  117. package/dist/api/FirmwareUpdateV4.d.ts +60 -14
  118. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  119. package/dist/api/GetDeviceState.d.ts +8 -0
  120. package/dist/api/GetDeviceState.d.ts.map +1 -0
  121. package/dist/api/GetFeatures.d.ts +1 -1
  122. package/dist/api/GetFeatures.d.ts.map +1 -1
  123. package/dist/api/GetOnekeyFeatures.d.ts.map +1 -1
  124. package/dist/api/GetPassphraseState.d.ts +1 -0
  125. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  126. package/dist/api/OpenWalletSession.d.ts +8 -0
  127. package/dist/api/OpenWalletSession.d.ts.map +1 -0
  128. package/dist/api/PathInfo.d.ts +1 -0
  129. package/dist/api/PathInfo.d.ts.map +1 -1
  130. package/dist/api/PromptWebDeviceAccess.d.ts.map +1 -1
  131. package/dist/api/SearchDevices.d.ts +3 -0
  132. package/dist/api/SearchDevices.d.ts.map +1 -1
  133. package/dist/api/UploadPortfolio.d.ts +1 -2
  134. package/dist/api/UploadPortfolio.d.ts.map +1 -1
  135. package/dist/api/alephium/AlephiumGetAddress.d.ts.map +1 -1
  136. package/dist/api/alephium/AlephiumSignMessage.d.ts.map +1 -1
  137. package/dist/api/alephium/AlephiumSignTransaction.d.ts.map +1 -1
  138. package/dist/api/algo/AlgoGetAddress.d.ts +1 -0
  139. package/dist/api/algo/AlgoGetAddress.d.ts.map +1 -1
  140. package/dist/api/algo/AlgoSignTransaction.d.ts +1 -0
  141. package/dist/api/algo/AlgoSignTransaction.d.ts.map +1 -1
  142. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts +1 -0
  143. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  144. package/dist/api/aptos/AptosGetAddress.d.ts +1 -0
  145. package/dist/api/aptos/AptosGetAddress.d.ts.map +1 -1
  146. package/dist/api/aptos/AptosGetPublicKey.d.ts +1 -0
  147. package/dist/api/aptos/AptosGetPublicKey.d.ts.map +1 -1
  148. package/dist/api/aptos/AptosSignInMessage.d.ts +1 -0
  149. package/dist/api/aptos/AptosSignInMessage.d.ts.map +1 -1
  150. package/dist/api/aptos/AptosSignMessage.d.ts +1 -0
  151. package/dist/api/aptos/AptosSignMessage.d.ts.map +1 -1
  152. package/dist/api/aptos/AptosSignTransaction.d.ts +1 -0
  153. package/dist/api/aptos/AptosSignTransaction.d.ts.map +1 -1
  154. package/dist/api/benfen/BenfenGetAddress.d.ts.map +1 -1
  155. package/dist/api/benfen/BenfenGetPublicKey.d.ts.map +1 -1
  156. package/dist/api/benfen/BenfenSignMessage.d.ts.map +1 -1
  157. package/dist/api/benfen/BenfenSignTransaction.d.ts.map +1 -1
  158. package/dist/api/btc/BTCGetAddress.d.ts +1 -0
  159. package/dist/api/btc/BTCGetAddress.d.ts.map +1 -1
  160. package/dist/api/btc/BTCGetPublicKey.d.ts +1 -0
  161. package/dist/api/btc/BTCGetPublicKey.d.ts.map +1 -1
  162. package/dist/api/btc/BTCSignMessage.d.ts +1 -0
  163. package/dist/api/btc/BTCSignMessage.d.ts.map +1 -1
  164. package/dist/api/btc/BTCSignPsbt.d.ts +1 -0
  165. package/dist/api/btc/BTCSignPsbt.d.ts.map +1 -1
  166. package/dist/api/btc/BTCSignTransaction.d.ts +1 -0
  167. package/dist/api/btc/BTCSignTransaction.d.ts.map +1 -1
  168. package/dist/api/btc/BTCVerifyMessage.d.ts +1 -0
  169. package/dist/api/btc/BTCVerifyMessage.d.ts.map +1 -1
  170. package/dist/api/btc/helpers/versionLimit.d.ts +2 -0
  171. package/dist/api/btc/helpers/versionLimit.d.ts.map +1 -1
  172. package/dist/api/cardano/CardanoGetAddress.d.ts +1 -0
  173. package/dist/api/cardano/CardanoGetAddress.d.ts.map +1 -1
  174. package/dist/api/cardano/CardanoGetPublicKey.d.ts +1 -0
  175. package/dist/api/cardano/CardanoGetPublicKey.d.ts.map +1 -1
  176. package/dist/api/cardano/CardanoSignMessage.d.ts +1 -0
  177. package/dist/api/cardano/CardanoSignMessage.d.ts.map +1 -1
  178. package/dist/api/cardano/CardanoSignTransaction.d.ts +1 -0
  179. package/dist/api/cardano/CardanoSignTransaction.d.ts.map +1 -1
  180. package/dist/api/conflux/ConfluxGetAddress.d.ts +2 -0
  181. package/dist/api/conflux/ConfluxGetAddress.d.ts.map +1 -1
  182. package/dist/api/conflux/ConfluxSignMessage.d.ts +2 -0
  183. package/dist/api/conflux/ConfluxSignMessage.d.ts.map +1 -1
  184. package/dist/api/conflux/ConfluxSignMessageCIP23.d.ts +2 -0
  185. package/dist/api/conflux/ConfluxSignMessageCIP23.d.ts.map +1 -1
  186. package/dist/api/conflux/ConfluxSignTransaction.d.ts +2 -0
  187. package/dist/api/conflux/ConfluxSignTransaction.d.ts.map +1 -1
  188. package/dist/api/cosmos/CosmosGetAddress.d.ts +1 -0
  189. package/dist/api/cosmos/CosmosGetAddress.d.ts.map +1 -1
  190. package/dist/api/cosmos/CosmosGetPublicKey.d.ts +1 -0
  191. package/dist/api/cosmos/CosmosGetPublicKey.d.ts.map +1 -1
  192. package/dist/api/cosmos/CosmosSignTransaction.d.ts +1 -0
  193. package/dist/api/cosmos/CosmosSignTransaction.d.ts.map +1 -1
  194. package/dist/api/device/DeviceCancel.d.ts +1 -0
  195. package/dist/api/device/DeviceCancel.d.ts.map +1 -1
  196. package/dist/api/device/DeviceChangePin.d.ts +1 -0
  197. package/dist/api/device/DeviceChangePin.d.ts.map +1 -1
  198. package/dist/api/device/DeviceFullyUploadResource.d.ts +1 -2
  199. package/dist/api/device/DeviceFullyUploadResource.d.ts.map +1 -1
  200. package/dist/api/device/DeviceLock.d.ts +1 -0
  201. package/dist/api/device/DeviceLock.d.ts.map +1 -1
  202. package/dist/api/device/DeviceRebootToBoardloader.d.ts +1 -0
  203. package/dist/api/device/DeviceRebootToBoardloader.d.ts.map +1 -1
  204. package/dist/api/device/DeviceRebootToBootloader.d.ts +1 -0
  205. package/dist/api/device/DeviceRebootToBootloader.d.ts.map +1 -1
  206. package/dist/api/device/DeviceSettings.d.ts +1 -0
  207. package/dist/api/device/DeviceSettings.d.ts.map +1 -1
  208. package/dist/api/device/DeviceSupportFeatures.d.ts +1 -0
  209. package/dist/api/device/DeviceSupportFeatures.d.ts.map +1 -1
  210. package/dist/api/device/DeviceUnlock.d.ts +3 -2
  211. package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
  212. package/dist/api/device/DeviceUpdateBootloader.d.ts +5 -1
  213. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  214. package/dist/api/device/DeviceVerify.d.ts +1 -0
  215. package/dist/api/device/DeviceVerify.d.ts.map +1 -1
  216. package/dist/api/device/DeviceWipe.d.ts +1 -0
  217. package/dist/api/device/DeviceWipe.d.ts.map +1 -1
  218. package/dist/api/device/PreInitialize.d.ts +1 -0
  219. package/dist/api/device/PreInitialize.d.ts.map +1 -1
  220. package/dist/api/dynex/DnxGetAddress.d.ts.map +1 -1
  221. package/dist/api/dynex/DnxSignTransaction.d.ts.map +1 -1
  222. package/dist/api/evm/EVMGetAddress.d.ts +1 -0
  223. package/dist/api/evm/EVMGetAddress.d.ts.map +1 -1
  224. package/dist/api/evm/EVMGetPublicKey.d.ts +1 -0
  225. package/dist/api/evm/EVMGetPublicKey.d.ts.map +1 -1
  226. package/dist/api/evm/EVMSignMessage.d.ts +1 -0
  227. package/dist/api/evm/EVMSignMessage.d.ts.map +1 -1
  228. package/dist/api/evm/EVMSignMessageEIP712.d.ts.map +1 -1
  229. package/dist/api/evm/EVMSignTransaction.d.ts +1 -0
  230. package/dist/api/evm/EVMSignTransaction.d.ts.map +1 -1
  231. package/dist/api/evm/EVMSignTypedData.d.ts +1 -0
  232. package/dist/api/evm/EVMSignTypedData.d.ts.map +1 -1
  233. package/dist/api/evm/EVMVerifyMessage.d.ts +1 -0
  234. package/dist/api/evm/EVMVerifyMessage.d.ts.map +1 -1
  235. package/dist/api/evm/protocol.d.ts +3 -0
  236. package/dist/api/evm/protocol.d.ts.map +1 -0
  237. package/dist/api/filecoin/FilecoinGetAddress.d.ts +1 -0
  238. package/dist/api/filecoin/FilecoinGetAddress.d.ts.map +1 -1
  239. package/dist/api/filecoin/FilecoinSignTransaction.d.ts +1 -0
  240. package/dist/api/filecoin/FilecoinSignTransaction.d.ts.map +1 -1
  241. package/dist/api/firmware/FirmwareArtifactSource.d.ts +29 -0
  242. package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +1 -0
  243. package/dist/api/firmware/FirmwareHostBinding.d.ts +6 -0
  244. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -0
  245. package/dist/api/firmware/FirmwareMemoryHost.d.ts +22 -0
  246. package/dist/api/firmware/FirmwareMemoryHost.d.ts.map +1 -0
  247. package/dist/api/firmware/FirmwarePreparationError.d.ts +3 -0
  248. package/dist/api/firmware/FirmwarePreparationError.d.ts.map +1 -0
  249. package/dist/api/firmware/FirmwarePreparedResourceArchive.d.ts +11 -0
  250. package/dist/api/firmware/FirmwarePreparedResourceArchive.d.ts.map +1 -0
  251. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +12 -3
  252. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  253. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +3 -0
  254. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +1 -0
  255. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +72 -0
  256. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -0
  257. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +38 -0
  258. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -0
  259. package/dist/api/firmware/getBinary.d.ts +15 -4
  260. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  261. package/dist/api/firmware/protocolV2Release.d.ts +33 -0
  262. package/dist/api/firmware/protocolV2Release.d.ts.map +1 -0
  263. package/dist/api/firmware/updateBootloader.d.ts +2 -0
  264. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  265. package/dist/api/firmware/uploadFirmware.d.ts +9 -1
  266. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  267. package/dist/api/helpers/base64Data.d.ts +16 -0
  268. package/dist/api/helpers/base64Data.d.ts.map +1 -0
  269. package/dist/api/helpers/filesystemValidation.d.ts +3 -0
  270. package/dist/api/helpers/filesystemValidation.d.ts.map +1 -1
  271. package/dist/api/helpers/paramsValidator.d.ts +1 -0
  272. package/dist/api/helpers/paramsValidator.d.ts.map +1 -1
  273. package/dist/api/helpers/protocolV2FileWrite.d.ts +11 -0
  274. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -1
  275. package/dist/api/index.d.ts +5 -29
  276. package/dist/api/index.d.ts.map +1 -1
  277. package/dist/api/kaspa/KaspaGetAddress.d.ts +4 -0
  278. package/dist/api/kaspa/KaspaGetAddress.d.ts.map +1 -1
  279. package/dist/api/kaspa/KaspaSignTransaction.d.ts +9 -1
  280. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  281. package/dist/api/kaspa/helpers/TransferSerialize.d.ts.map +1 -1
  282. package/dist/api/lightning/LnurlAuth.d.ts +0 -4
  283. package/dist/api/lightning/LnurlAuth.d.ts.map +1 -1
  284. package/dist/api/near/NearGetAddress.d.ts +1 -0
  285. package/dist/api/near/NearGetAddress.d.ts.map +1 -1
  286. package/dist/api/near/NearSignTransaction.d.ts +1 -0
  287. package/dist/api/near/NearSignTransaction.d.ts.map +1 -1
  288. package/dist/api/nem/NEMGetAddress.d.ts +1 -0
  289. package/dist/api/nem/NEMGetAddress.d.ts.map +1 -1
  290. package/dist/api/nem/NEMSignTransaction.d.ts +1 -0
  291. package/dist/api/nem/NEMSignTransaction.d.ts.map +1 -1
  292. package/dist/api/neo/NeoGetAddress.d.ts.map +1 -1
  293. package/dist/api/neo/NeoSignTransaction.d.ts.map +1 -1
  294. package/dist/api/nervos/NervosGetAddress.d.ts.map +1 -1
  295. package/dist/api/nervos/NervosSignTransaction.d.ts.map +1 -1
  296. package/dist/api/nexa/NexaGetAddress.d.ts.map +1 -1
  297. package/dist/api/nexa/NexaSignTransaction.d.ts +1 -0
  298. package/dist/api/nexa/NexaSignTransaction.d.ts.map +1 -1
  299. package/dist/api/nostr/NostrDecryptMessage.d.ts +1 -0
  300. package/dist/api/nostr/NostrDecryptMessage.d.ts.map +1 -1
  301. package/dist/api/nostr/NostrEncryptMessage.d.ts +1 -0
  302. package/dist/api/nostr/NostrEncryptMessage.d.ts.map +1 -1
  303. package/dist/api/nostr/NostrGetPublicKey.d.ts +1 -0
  304. package/dist/api/nostr/NostrGetPublicKey.d.ts.map +1 -1
  305. package/dist/api/nostr/NostrSignEvent.d.ts +1 -0
  306. package/dist/api/nostr/NostrSignEvent.d.ts.map +1 -1
  307. package/dist/api/nostr/NostrSignSchnorr.d.ts +1 -0
  308. package/dist/api/nostr/NostrSignSchnorr.d.ts.map +1 -1
  309. package/dist/api/polkadot/PolkadotGetAddress.d.ts +2 -1
  310. package/dist/api/polkadot/PolkadotGetAddress.d.ts.map +1 -1
  311. package/dist/api/polkadot/PolkadotSignTransaction.d.ts +1 -0
  312. package/dist/api/polkadot/PolkadotSignTransaction.d.ts.map +1 -1
  313. package/dist/api/polkadot/networks.d.ts +1 -1
  314. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts +1 -0
  315. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts.map +1 -1
  316. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts +1 -0
  317. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts.map +1 -1
  318. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts +4 -1
  319. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts.map +1 -1
  320. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts +1 -0
  321. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts.map +1 -1
  322. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts +2 -1
  323. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts.map +1 -1
  324. package/dist/api/protocol-v2/DeviceInfoGet.d.ts +2 -2
  325. package/dist/api/protocol-v2/DeviceInfoGet.d.ts.map +1 -1
  326. package/dist/api/protocol-v2/DeviceReboot.d.ts +2 -1
  327. package/dist/api/protocol-v2/DeviceReboot.d.ts.map +1 -1
  328. package/dist/api/protocol-v2/DeviceStatusGet.d.ts +1 -0
  329. package/dist/api/protocol-v2/DeviceStatusGet.d.ts.map +1 -1
  330. package/dist/api/protocol-v2/DeviceUploadNft.d.ts +30 -0
  331. package/dist/api/protocol-v2/DeviceUploadNft.d.ts.map +1 -0
  332. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts +3 -3
  333. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts.map +1 -1
  334. package/dist/api/protocol-v2/FilesystemFormat.d.ts +1 -0
  335. package/dist/api/protocol-v2/FilesystemFormat.d.ts.map +1 -1
  336. package/dist/api/protocol-v2/FilesystemPermissionFix.d.ts +1 -0
  337. package/dist/api/protocol-v2/FilesystemPermissionFix.d.ts.map +1 -1
  338. package/dist/api/protocol-v2/Ping.d.ts +3 -0
  339. package/dist/api/protocol-v2/Ping.d.ts.map +1 -1
  340. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts +1 -0
  341. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -1
  342. package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
  343. package/dist/api/scdo/ScdoGetAddress.d.ts.map +1 -1
  344. package/dist/api/scdo/ScdoSignMessage.d.ts.map +1 -1
  345. package/dist/api/scdo/ScdoSignTransaction.d.ts.map +1 -1
  346. package/dist/api/solana/SolGetAddress.d.ts +1 -0
  347. package/dist/api/solana/SolGetAddress.d.ts.map +1 -1
  348. package/dist/api/solana/SolSignMessage.d.ts +2 -1
  349. package/dist/api/solana/SolSignMessage.d.ts.map +1 -1
  350. package/dist/api/solana/SolSignOffchainMessage.d.ts +2 -1
  351. package/dist/api/solana/SolSignOffchainMessage.d.ts.map +1 -1
  352. package/dist/api/solana/SolSignTransaction.d.ts +3 -2
  353. package/dist/api/solana/SolSignTransaction.d.ts.map +1 -1
  354. package/dist/api/starcoin/StarcoinGetAddress.d.ts +1 -0
  355. package/dist/api/starcoin/StarcoinGetAddress.d.ts.map +1 -1
  356. package/dist/api/starcoin/StarcoinGetPublicKey.d.ts +1 -0
  357. package/dist/api/starcoin/StarcoinGetPublicKey.d.ts.map +1 -1
  358. package/dist/api/starcoin/StarcoinSignMessage.d.ts +1 -0
  359. package/dist/api/starcoin/StarcoinSignMessage.d.ts.map +1 -1
  360. package/dist/api/starcoin/StarcoinSignTransaction.d.ts +1 -0
  361. package/dist/api/starcoin/StarcoinSignTransaction.d.ts.map +1 -1
  362. package/dist/api/starcoin/StarcoinVerifyMessage.d.ts +1 -0
  363. package/dist/api/starcoin/StarcoinVerifyMessage.d.ts.map +1 -1
  364. package/dist/api/stellar/StellarGetAddress.d.ts +1 -2
  365. package/dist/api/stellar/StellarGetAddress.d.ts.map +1 -1
  366. package/dist/api/stellar/StellarSignTransaction.d.ts +2 -3
  367. package/dist/api/stellar/StellarSignTransaction.d.ts.map +1 -1
  368. package/dist/api/sui/SuiGetAddress.d.ts +2 -1
  369. package/dist/api/sui/SuiGetAddress.d.ts.map +1 -1
  370. package/dist/api/sui/SuiGetPublicKey.d.ts +2 -1
  371. package/dist/api/sui/SuiGetPublicKey.d.ts.map +1 -1
  372. package/dist/api/sui/SuiSignMessage.d.ts +2 -1
  373. package/dist/api/sui/SuiSignMessage.d.ts.map +1 -1
  374. package/dist/api/sui/SuiSignTransaction.d.ts +2 -1
  375. package/dist/api/sui/SuiSignTransaction.d.ts.map +1 -1
  376. package/dist/api/ton/TonGetAddress.d.ts +2 -1
  377. package/dist/api/ton/TonGetAddress.d.ts.map +1 -1
  378. package/dist/api/ton/TonSignData.d.ts +1 -0
  379. package/dist/api/ton/TonSignData.d.ts.map +1 -1
  380. package/dist/api/ton/TonSignMessage.d.ts +2 -1
  381. package/dist/api/ton/TonSignMessage.d.ts.map +1 -1
  382. package/dist/api/ton/TonSignProof.d.ts +2 -1
  383. package/dist/api/ton/TonSignProof.d.ts.map +1 -1
  384. package/dist/api/tron/TronGetAddress.d.ts +1 -0
  385. package/dist/api/tron/TronGetAddress.d.ts.map +1 -1
  386. package/dist/api/tron/TronSignMessage.d.ts +6 -1
  387. package/dist/api/tron/TronSignMessage.d.ts.map +1 -1
  388. package/dist/api/tron/TronSignTransaction.d.ts +2 -1
  389. package/dist/api/tron/TronSignTransaction.d.ts.map +1 -1
  390. package/dist/api/utils.d.ts +4 -1
  391. package/dist/api/utils.d.ts.map +1 -1
  392. package/dist/api/xrp/XrpGetAddress.d.ts +1 -0
  393. package/dist/api/xrp/XrpGetAddress.d.ts.map +1 -1
  394. package/dist/api/xrp/XrpSignTransaction.d.ts +1 -0
  395. package/dist/api/xrp/XrpSignTransaction.d.ts.map +1 -1
  396. package/dist/constants/index.d.ts +1 -1
  397. package/dist/constants/index.d.ts.map +1 -1
  398. package/dist/core/RequestQueue.d.ts +0 -2
  399. package/dist/core/RequestQueue.d.ts.map +1 -1
  400. package/dist/core/deviceEventRegistration.d.ts +4 -2
  401. package/dist/core/deviceEventRegistration.d.ts.map +1 -1
  402. package/dist/core/index.d.ts +8 -3
  403. package/dist/core/index.d.ts.map +1 -1
  404. package/dist/core/uiPromiseRegistry.d.ts +6 -0
  405. package/dist/core/uiPromiseRegistry.d.ts.map +1 -0
  406. package/dist/data-manager/DataManager.d.ts +14 -5
  407. package/dist/data-manager/DataManager.d.ts.map +1 -1
  408. package/dist/data-manager/TransportManager.d.ts.map +1 -1
  409. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  410. package/dist/device/Device.d.ts +84 -16
  411. package/dist/device/Device.d.ts.map +1 -1
  412. package/dist/device/DeviceCommands.d.ts +8 -6
  413. package/dist/device/DeviceCommands.d.ts.map +1 -1
  414. package/dist/device/DeviceConnector.d.ts +4 -3
  415. package/dist/device/DeviceConnector.d.ts.map +1 -1
  416. package/dist/device/DeviceFeaturesState.d.ts +3 -0
  417. package/dist/device/DeviceFeaturesState.d.ts.map +1 -0
  418. package/dist/device/DevicePool.d.ts +6 -2
  419. package/dist/device/DevicePool.d.ts.map +1 -1
  420. package/dist/device/DeviceStateMapper.d.ts +13 -0
  421. package/dist/device/DeviceStateMapper.d.ts.map +1 -0
  422. package/dist/device/DeviceStateProjector.d.ts +7 -0
  423. package/dist/device/DeviceStateProjector.d.ts.map +1 -0
  424. package/dist/device/DeviceStateStore.d.ts +21 -0
  425. package/dist/device/DeviceStateStore.d.ts.map +1 -0
  426. package/dist/device/DeviceWalletSessionStore.d.ts +13 -1
  427. package/dist/device/DeviceWalletSessionStore.d.ts.map +1 -1
  428. package/dist/device/cloneDeviceState.d.ts +2 -0
  429. package/dist/device/cloneDeviceState.d.ts.map +1 -0
  430. package/dist/device/deviceIdentity.d.ts +5 -0
  431. package/dist/device/deviceIdentity.d.ts.map +1 -0
  432. package/dist/deviceProfile/buildDeviceFeatures.d.ts +8 -2
  433. package/dist/deviceProfile/buildDeviceFeatures.d.ts.map +1 -1
  434. package/dist/deviceProfile/index.d.ts +0 -1
  435. package/dist/deviceProfile/index.d.ts.map +1 -1
  436. package/dist/deviceProfile/protocolV2DeviceIdentity.d.ts +7 -0
  437. package/dist/deviceProfile/protocolV2DeviceIdentity.d.ts.map +1 -0
  438. package/dist/events/call.d.ts +0 -7
  439. package/dist/events/call.d.ts.map +1 -1
  440. package/dist/events/core.d.ts +2 -2
  441. package/dist/events/core.d.ts.map +1 -1
  442. package/dist/events/device.d.ts +16 -2
  443. package/dist/events/device.d.ts.map +1 -1
  444. package/dist/events/iframe.d.ts +0 -1
  445. package/dist/events/iframe.d.ts.map +1 -1
  446. package/dist/events/logBlockEvent.d.ts +2 -0
  447. package/dist/events/logBlockEvent.d.ts.map +1 -1
  448. package/dist/events/ui-promise.d.ts +4 -2
  449. package/dist/events/ui-promise.d.ts.map +1 -1
  450. package/dist/events/ui-request.d.ts +50 -4
  451. package/dist/events/ui-request.d.ts.map +1 -1
  452. package/dist/events/ui-response.d.ts +10 -2
  453. package/dist/events/ui-response.d.ts.map +1 -1
  454. package/dist/index.d.ts +1763 -830
  455. package/dist/index.d.ts.map +1 -1
  456. package/dist/index.js +11626 -4657
  457. package/dist/inject.d.ts +7 -3
  458. package/dist/inject.d.ts.map +1 -1
  459. package/dist/lowLevelInject.d.ts +1 -2
  460. package/dist/lowLevelInject.d.ts.map +1 -1
  461. package/dist/protocols/protocol-v2/deviceSession.d.ts +7 -0
  462. package/dist/protocols/protocol-v2/deviceSession.d.ts.map +1 -0
  463. package/dist/protocols/protocol-v2/features.d.ts +33 -22
  464. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  465. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
  466. package/dist/protocols/protocol-v2/index.d.ts +2 -2
  467. package/dist/protocols/protocol-v2/index.d.ts.map +1 -1
  468. package/dist/protocols/protocol-v2/resources.d.ts +16 -0
  469. package/dist/protocols/protocol-v2/resources.d.ts.map +1 -0
  470. package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts +17 -0
  471. package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts.map +1 -0
  472. package/dist/protocols/protocol-v2/uiInteraction.d.ts +42 -0
  473. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -0
  474. package/dist/protocols/protocol-v2/unlockPolicy.d.ts +2 -0
  475. package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -0
  476. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts +22 -0
  477. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts.map +1 -0
  478. package/dist/protocols/protocol-v2/walletSession.d.ts +18 -4
  479. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -1
  480. package/dist/topLevelInject.d.ts.map +1 -1
  481. package/dist/types/api/checkAllFirmwareRelease.d.ts +48 -9
  482. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  483. package/dist/types/api/checkBLEFirmwareRelease.d.ts +2 -13
  484. package/dist/types/api/checkBLEFirmwareRelease.d.ts.map +1 -1
  485. package/dist/types/api/checkBootloaderRelease.d.ts +2 -6
  486. package/dist/types/api/checkBootloaderRelease.d.ts.map +1 -1
  487. package/dist/types/api/checkFirmwareRelease.d.ts +2 -13
  488. package/dist/types/api/checkFirmwareRelease.d.ts.map +1 -1
  489. package/dist/types/api/checkFirmwareTypeAvailable.d.ts +2 -2
  490. package/dist/types/api/checkFirmwareTypeAvailable.d.ts.map +1 -1
  491. package/dist/types/api/detectDeviceConnectProtocol.d.ts +4 -0
  492. package/dist/types/api/detectDeviceConnectProtocol.d.ts.map +1 -0
  493. package/dist/types/api/deviceSettings.d.ts +11 -2
  494. package/dist/types/api/deviceSettings.d.ts.map +1 -1
  495. package/dist/types/api/deviceUnlock.d.ts +6 -2
  496. package/dist/types/api/deviceUnlock.d.ts.map +1 -1
  497. package/dist/types/api/deviceUpdateBootloader.d.ts +6 -0
  498. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  499. package/dist/types/api/export.d.ts +8 -3
  500. package/dist/types/api/export.d.ts.map +1 -1
  501. package/dist/types/api/firmwareUpdate.d.ts +67 -5
  502. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  503. package/dist/types/api/firmwareUpdateCapabilities.d.ts +9 -0
  504. package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +1 -0
  505. package/dist/types/api/firmwareUpdatePlan.d.ts +28 -0
  506. package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -0
  507. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +42 -0
  508. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +1 -0
  509. package/dist/types/api/getDeviceState.d.ts +12 -0
  510. package/dist/types/api/getDeviceState.d.ts.map +1 -0
  511. package/dist/types/api/getFeatures.d.ts.map +1 -1
  512. package/dist/types/api/getOnekeyFeatures.d.ts.map +1 -1
  513. package/dist/types/api/getPassphraseState.d.ts.map +1 -1
  514. package/dist/types/api/index.d.ts +25 -35
  515. package/dist/types/api/index.d.ts.map +1 -1
  516. package/dist/types/api/kaspaSignTransaction.d.ts +42 -4
  517. package/dist/types/api/kaspaSignTransaction.d.ts.map +1 -1
  518. package/dist/types/api/openWalletSession.d.ts +35 -0
  519. package/dist/types/api/openWalletSession.d.ts.map +1 -0
  520. package/dist/types/api/protocolV2.d.ts +11 -93
  521. package/dist/types/api/protocolV2.d.ts.map +1 -1
  522. package/dist/types/api/sessionCache.d.ts +4 -1
  523. package/dist/types/api/sessionCache.d.ts.map +1 -1
  524. package/dist/types/device.d.ts +139 -8
  525. package/dist/types/device.d.ts.map +1 -1
  526. package/dist/types/params.d.ts +1 -0
  527. package/dist/types/params.d.ts.map +1 -1
  528. package/dist/types/settings.d.ts +31 -16
  529. package/dist/types/settings.d.ts.map +1 -1
  530. package/dist/utils/assets.d.ts +2 -1
  531. package/dist/utils/assets.d.ts.map +1 -1
  532. package/dist/utils/deviceFeaturesCompat.d.ts +14 -0
  533. package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -0
  534. package/dist/utils/deviceFeaturesUtils.d.ts +10 -1
  535. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  536. package/dist/utils/deviceInfoUtils.d.ts +9 -9
  537. package/dist/utils/deviceInfoUtils.d.ts.map +1 -1
  538. package/dist/utils/deviceSettings.d.ts +39 -7
  539. package/dist/utils/deviceSettings.d.ts.map +1 -1
  540. package/dist/utils/deviceVersionUtils.d.ts +7 -5
  541. package/dist/utils/deviceVersionUtils.d.ts.map +1 -1
  542. package/dist/utils/homescreen.d.ts +4 -0
  543. package/dist/utils/homescreen.d.ts.map +1 -1
  544. package/dist/utils/index.d.ts +5 -4
  545. package/dist/utils/index.d.ts.map +1 -1
  546. package/dist/utils/networkUtils.d.ts +10 -1
  547. package/dist/utils/networkUtils.d.ts.map +1 -1
  548. package/dist/utils/patch.d.ts +1 -1
  549. package/dist/utils/patch.d.ts.map +1 -1
  550. package/dist/utils/pro2Nft.d.ts +38 -0
  551. package/dist/utils/pro2Nft.d.ts.map +1 -0
  552. package/dist/utils/pro2Wallpaper.d.ts +10 -0
  553. package/dist/utils/pro2Wallpaper.d.ts.map +1 -1
  554. package/dist/utils/tracing.d.ts.map +1 -1
  555. package/dist/utils/uiProgressThrottle.d.ts +3 -0
  556. package/dist/utils/uiProgressThrottle.d.ts.map +1 -0
  557. package/package.json +6 -4
  558. package/src/api/BaseMethod.ts +45 -23
  559. package/src/api/CheckAllFirmwareRelease.ts +440 -4
  560. package/src/api/CheckBLEFirmwareRelease.ts +37 -5
  561. package/src/api/CheckBootloaderRelease.ts +37 -5
  562. package/src/api/CheckFirmwareRelease.ts +36 -9
  563. package/src/api/CipherKeyValue.ts +4 -0
  564. package/src/api/ClearSessionCache.ts +4 -0
  565. package/src/api/DetectDeviceConnectProtocol.ts +18 -0
  566. package/src/api/DirList.ts +9 -4
  567. package/src/api/DirMake.ts +7 -4
  568. package/src/api/DirRemove.ts +7 -4
  569. package/src/api/FileDelete.ts +7 -4
  570. package/src/api/FileRead.ts +13 -7
  571. package/src/api/FileWrite.ts +7 -4
  572. package/src/api/FirmwareUpdate.ts +30 -15
  573. package/src/api/FirmwareUpdateV2.ts +535 -169
  574. package/src/api/FirmwareUpdateV3.ts +349 -91
  575. package/src/api/FirmwareUpdateV4.ts +2145 -749
  576. package/src/api/GetDeviceState.ts +59 -0
  577. package/src/api/GetFeatures.ts +6 -4
  578. package/src/api/GetOnekeyFeatures.ts +1 -75
  579. package/src/api/GetPassphraseState.ts +36 -12
  580. package/src/api/OpenWalletSession.ts +268 -0
  581. package/src/api/PathInfo.ts +9 -4
  582. package/src/api/PromptWebDeviceAccess.ts +3 -8
  583. package/src/api/SearchDevices.ts +35 -5
  584. package/src/api/UploadPortfolio.ts +30 -4
  585. package/src/api/alephium/AlephiumGetAddress.ts +0 -4
  586. package/src/api/alephium/AlephiumSignMessage.ts +0 -4
  587. package/src/api/alephium/AlephiumSignTransaction.ts +2 -6
  588. package/src/api/algo/AlgoGetAddress.ts +4 -0
  589. package/src/api/algo/AlgoSignTransaction.ts +4 -0
  590. package/src/api/allnetwork/AllNetworkGetAddress.ts +21 -21
  591. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +53 -45
  592. package/src/api/aptos/AptosGetAddress.ts +4 -0
  593. package/src/api/aptos/AptosGetPublicKey.ts +4 -0
  594. package/src/api/aptos/AptosSignInMessage.ts +4 -0
  595. package/src/api/aptos/AptosSignMessage.ts +4 -0
  596. package/src/api/aptos/AptosSignTransaction.ts +4 -0
  597. package/src/api/benfen/BenfenGetAddress.ts +11 -7
  598. package/src/api/benfen/BenfenGetPublicKey.ts +0 -4
  599. package/src/api/benfen/BenfenSignMessage.ts +0 -4
  600. package/src/api/benfen/BenfenSignTransaction.ts +0 -4
  601. package/src/api/btc/BTCGetAddress.ts +8 -1
  602. package/src/api/btc/BTCGetPublicKey.ts +9 -2
  603. package/src/api/btc/BTCSignMessage.ts +8 -1
  604. package/src/api/btc/BTCSignPsbt.ts +4 -0
  605. package/src/api/btc/BTCSignTransaction.ts +8 -1
  606. package/src/api/btc/BTCVerifyMessage.ts +8 -1
  607. package/src/api/btc/helpers/versionLimit.ts +7 -4
  608. package/src/api/cardano/CardanoGetAddress.ts +4 -0
  609. package/src/api/cardano/CardanoGetPublicKey.ts +4 -0
  610. package/src/api/cardano/CardanoSignMessage.ts +4 -0
  611. package/src/api/cardano/CardanoSignTransaction.ts +4 -0
  612. package/src/api/conflux/ConfluxGetAddress.ts +6 -0
  613. package/src/api/conflux/ConfluxSignMessage.ts +6 -0
  614. package/src/api/conflux/ConfluxSignMessageCIP23.ts +6 -0
  615. package/src/api/conflux/ConfluxSignTransaction.ts +8 -5
  616. package/src/api/cosmos/CosmosGetAddress.ts +4 -0
  617. package/src/api/cosmos/CosmosGetPublicKey.ts +4 -0
  618. package/src/api/cosmos/CosmosSignTransaction.ts +4 -0
  619. package/src/api/device/DeviceCancel.ts +5 -0
  620. package/src/api/device/DeviceChangePin.ts +31 -0
  621. package/src/api/device/DeviceFullyUploadResource.ts +4 -5
  622. package/src/api/device/DeviceLock.ts +5 -0
  623. package/src/api/device/DeviceRebootToBoardloader.ts +8 -1
  624. package/src/api/device/DeviceRebootToBootloader.ts +8 -1
  625. package/src/api/device/DeviceSettings.ts +211 -3
  626. package/src/api/device/DeviceSupportFeatures.ts +4 -0
  627. package/src/api/device/DeviceUnlock.ts +21 -3
  628. package/src/api/device/DeviceUpdateBootloader.ts +152 -8
  629. package/src/api/device/DeviceVerify.ts +25 -0
  630. package/src/api/device/DeviceWipe.ts +28 -0
  631. package/src/api/device/PreInitialize.ts +4 -0
  632. package/src/api/dynex/DnxGetAddress.ts +0 -6
  633. package/src/api/dynex/DnxSignTransaction.ts +0 -6
  634. package/src/api/evm/EVMGetAddress.ts +6 -2
  635. package/src/api/evm/EVMGetPublicKey.ts +6 -2
  636. package/src/api/evm/EVMSignMessage.ts +6 -2
  637. package/src/api/evm/EVMSignMessageEIP712.ts +1 -11
  638. package/src/api/evm/EVMSignTransaction.ts +6 -2
  639. package/src/api/evm/EVMSignTypedData.ts +42 -50
  640. package/src/api/evm/EVMVerifyMessage.ts +6 -2
  641. package/src/api/evm/legacyV1/getAddress.ts +2 -2
  642. package/src/api/evm/legacyV1/getPublicKey.ts +2 -2
  643. package/src/api/evm/legacyV1/signMessage.ts +2 -2
  644. package/src/api/evm/legacyV1/signTypedData.ts +2 -2
  645. package/src/api/evm/legacyV1/signTypedHash.ts +2 -2
  646. package/src/api/evm/legacyV1/verifyMessage.ts +2 -2
  647. package/src/api/evm/protocol.ts +6 -0
  648. package/src/api/filecoin/FilecoinGetAddress.ts +4 -0
  649. package/src/api/filecoin/FilecoinSignTransaction.ts +4 -0
  650. package/src/api/firmware/FirmwareArtifactSource.ts +305 -0
  651. package/src/api/firmware/FirmwareHostBinding.ts +123 -0
  652. package/src/api/firmware/FirmwareMemoryHost.ts +143 -0
  653. package/src/api/firmware/FirmwarePreparationError.ts +12 -0
  654. package/src/api/firmware/FirmwarePreparedResourceArchive.ts +196 -0
  655. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +214 -77
  656. package/src/api/firmware/FirmwareUpdateCapabilities.ts +9 -0
  657. package/src/api/firmware/FirmwareUpdatePlan.ts +946 -0
  658. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +486 -0
  659. package/src/api/firmware/getBinary.ts +8 -3
  660. package/src/api/firmware/protocolV2Release.ts +173 -0
  661. package/src/api/firmware/updateBootloader.ts +19 -4
  662. package/src/api/firmware/uploadFirmware.ts +157 -26
  663. package/src/api/helpers/base64Data.ts +85 -0
  664. package/src/api/helpers/batchGetPublickeys.ts +2 -2
  665. package/src/api/helpers/filesystemValidation.ts +61 -0
  666. package/src/api/helpers/paramsValidator.ts +1 -1
  667. package/src/api/helpers/protocolV2FileWrite.ts +266 -42
  668. package/src/api/index.ts +6 -30
  669. package/src/api/kaspa/KaspaGetAddress.ts +7 -0
  670. package/src/api/kaspa/KaspaSignTransaction.ts +369 -29
  671. package/src/api/kaspa/helpers/TransferSerialize.ts +17 -7
  672. package/src/api/lightning/LnurlAuth.ts +0 -4
  673. package/src/api/near/NearGetAddress.ts +4 -0
  674. package/src/api/near/NearSignTransaction.ts +4 -0
  675. package/src/api/nem/NEMGetAddress.ts +4 -0
  676. package/src/api/nem/NEMSignTransaction.ts +4 -0
  677. package/src/api/neo/NeoGetAddress.ts +0 -4
  678. package/src/api/neo/NeoSignTransaction.ts +0 -4
  679. package/src/api/nervos/NervosGetAddress.ts +0 -4
  680. package/src/api/nervos/NervosSignTransaction.ts +2 -6
  681. package/src/api/nexa/NexaGetAddress.ts +0 -4
  682. package/src/api/nexa/NexaSignTransaction.ts +3 -5
  683. package/src/api/nostr/NostrDecryptMessage.ts +4 -0
  684. package/src/api/nostr/NostrEncryptMessage.ts +4 -0
  685. package/src/api/nostr/NostrGetPublicKey.ts +4 -0
  686. package/src/api/nostr/NostrSignEvent.ts +4 -0
  687. package/src/api/nostr/NostrSignSchnorr.ts +4 -0
  688. package/src/api/polkadot/PolkadotGetAddress.ts +4 -0
  689. package/src/api/polkadot/PolkadotSignTransaction.ts +4 -0
  690. package/src/api/polkadot/networks.ts +3 -3
  691. package/src/api/protocol-v2/DeviceFactoryInfoGet.ts +5 -2
  692. package/src/api/protocol-v2/DeviceFactoryInfoSet.ts +6 -3
  693. package/src/api/protocol-v2/DeviceFirmwareUpdate.ts +13 -32
  694. package/src/api/protocol-v2/DeviceGetFirmwareUpdateStatus.ts +10 -6
  695. package/src/api/protocol-v2/DeviceGetOnboardingStatus.ts +6 -3
  696. package/src/api/protocol-v2/DeviceInfoGet.ts +11 -18
  697. package/src/api/protocol-v2/DeviceReboot.ts +12 -3
  698. package/src/api/protocol-v2/DeviceStatusGet.ts +6 -1
  699. package/src/api/protocol-v2/DeviceUploadNft.ts +249 -0
  700. package/src/api/protocol-v2/DeviceUploadWallpaper.ts +59 -21
  701. package/src/api/protocol-v2/FilesystemFormat.ts +5 -2
  702. package/src/api/protocol-v2/FilesystemPermissionFix.ts +5 -2
  703. package/src/api/protocol-v2/Ping.ts +37 -3
  704. package/src/api/protocol-v2/ProtocolInfoRequest.ts +8 -3
  705. package/src/api/protocol-v2/helpers.ts +1 -1
  706. package/src/api/scdo/ScdoGetAddress.ts +0 -4
  707. package/src/api/scdo/ScdoSignMessage.ts +0 -4
  708. package/src/api/scdo/ScdoSignTransaction.ts +0 -4
  709. package/src/api/solana/SolGetAddress.ts +4 -0
  710. package/src/api/solana/SolSignMessage.ts +5 -1
  711. package/src/api/solana/SolSignOffchainMessage.ts +5 -1
  712. package/src/api/solana/SolSignTransaction.ts +6 -2
  713. package/src/api/starcoin/StarcoinGetAddress.ts +4 -0
  714. package/src/api/starcoin/StarcoinGetPublicKey.ts +4 -0
  715. package/src/api/starcoin/StarcoinSignMessage.ts +4 -0
  716. package/src/api/starcoin/StarcoinSignTransaction.ts +4 -0
  717. package/src/api/starcoin/StarcoinVerifyMessage.ts +4 -0
  718. package/src/api/stellar/StellarGetAddress.ts +1 -10
  719. package/src/api/stellar/StellarSignTransaction.ts +1 -14
  720. package/src/api/sui/SuiGetAddress.ts +5 -1
  721. package/src/api/sui/SuiGetPublicKey.ts +5 -1
  722. package/src/api/sui/SuiSignMessage.ts +5 -1
  723. package/src/api/sui/SuiSignTransaction.ts +5 -1
  724. package/src/api/ton/TonGetAddress.ts +5 -1
  725. package/src/api/ton/TonSignData.ts +5 -1
  726. package/src/api/ton/TonSignMessage.ts +10 -4
  727. package/src/api/ton/TonSignProof.ts +5 -1
  728. package/src/api/tron/TronGetAddress.ts +4 -0
  729. package/src/api/tron/TronSignMessage.ts +19 -8
  730. package/src/api/tron/TronSignTransaction.ts +5 -1
  731. package/src/api/utils.ts +32 -3
  732. package/src/api/xrp/XrpGetAddress.ts +4 -0
  733. package/src/api/xrp/XrpSignTransaction.ts +5 -1
  734. package/src/constants/index.ts +1 -4
  735. package/src/core/RequestQueue.ts +0 -18
  736. package/src/core/deviceEventRegistration.ts +7 -8
  737. package/src/core/index.ts +511 -195
  738. package/src/core/uiPromiseRegistry.ts +63 -0
  739. package/src/data/messages/messages-protocol-v2.json +523 -449
  740. package/src/data/messages/messages.json +286 -1
  741. package/src/data-manager/DataManager.ts +162 -44
  742. package/src/data-manager/TransportManager.ts +7 -1
  743. package/src/data-manager/connectSettings.ts +11 -0
  744. package/src/device/Device.ts +1019 -267
  745. package/src/device/DeviceCommands.ts +197 -161
  746. package/src/device/DeviceConnector.ts +54 -21
  747. package/src/device/DeviceFeaturesState.ts +25 -0
  748. package/src/device/DevicePool.ts +108 -23
  749. package/src/device/DeviceStateMapper.ts +422 -0
  750. package/src/device/DeviceStateProjector.ts +152 -0
  751. package/src/device/DeviceStateStore.ts +232 -0
  752. package/src/device/DeviceWalletSessionStore.ts +72 -6
  753. package/src/device/cloneDeviceState.ts +39 -0
  754. package/src/device/deviceIdentity.ts +18 -0
  755. package/src/deviceProfile/buildDeviceFeatures.ts +209 -191
  756. package/src/deviceProfile/index.ts +0 -1
  757. package/src/deviceProfile/protocolV2DeviceIdentity.ts +35 -0
  758. package/src/events/call.ts +0 -6
  759. package/src/events/core.ts +0 -2
  760. package/src/events/device.ts +22 -1
  761. package/src/events/iframe.ts +0 -1
  762. package/src/events/logBlockEvent.ts +93 -2
  763. package/src/events/ui-promise.ts +4 -2
  764. package/src/events/ui-request.ts +61 -4
  765. package/src/events/ui-response.ts +12 -2
  766. package/src/index.ts +13 -4
  767. package/src/inject.ts +89 -55
  768. package/src/lowLevelInject.ts +11 -7
  769. package/src/protocols/protocol-v2/deviceSession.ts +24 -0
  770. package/src/protocols/protocol-v2/features.ts +118 -52
  771. package/src/protocols/protocol-v2/firmware.ts +3 -1
  772. package/src/protocols/protocol-v2/index.ts +9 -3
  773. package/src/protocols/protocol-v2/resources.ts +161 -0
  774. package/src/protocols/protocol-v2/settingsUnlockPolicy.ts +65 -0
  775. package/src/protocols/protocol-v2/uiInteraction.ts +250 -0
  776. package/src/protocols/protocol-v2/unlockPolicy.ts +1 -0
  777. package/src/protocols/protocol-v2/unlockPolicyRunner.ts +136 -0
  778. package/src/protocols/protocol-v2/walletSession.ts +417 -61
  779. package/src/topLevelInject.ts +11 -6
  780. package/src/types/api/checkAllFirmwareRelease.ts +72 -9
  781. package/src/types/api/checkBLEFirmwareRelease.ts +4 -13
  782. package/src/types/api/checkBootloaderRelease.ts +2 -6
  783. package/src/types/api/checkFirmwareRelease.ts +2 -13
  784. package/src/types/api/checkFirmwareTypeAvailable.ts +2 -2
  785. package/src/types/api/detectDeviceConnectProtocol.ts +6 -0
  786. package/src/types/api/deviceSettings.ts +26 -2
  787. package/src/types/api/deviceUnlock.ts +13 -2
  788. package/src/types/api/deviceUpdateBootloader.ts +7 -0
  789. package/src/types/api/export.ts +33 -1
  790. package/src/types/api/firmwareUpdate.ts +85 -11
  791. package/src/types/api/firmwareUpdateCapabilities.ts +9 -0
  792. package/src/types/api/firmwareUpdatePlan.ts +38 -0
  793. package/src/types/api/firmwareUpdatePreparedPlan.ts +53 -0
  794. package/src/types/api/getDeviceState.ts +19 -0
  795. package/src/types/api/getFeatures.ts +3 -0
  796. package/src/types/api/getOnekeyFeatures.ts +3 -0
  797. package/src/types/api/getPassphraseState.ts +7 -0
  798. package/src/types/api/index.ts +43 -73
  799. package/src/types/api/kaspaSignTransaction.ts +60 -4
  800. package/src/types/api/openWalletSession.ts +54 -0
  801. package/src/types/api/protocolV2.ts +23 -188
  802. package/src/types/api/sessionCache.ts +9 -4
  803. package/src/types/device.ts +211 -9
  804. package/src/types/params.ts +9 -2
  805. package/src/types/settings.ts +37 -25
  806. package/src/utils/assets.ts +4 -1
  807. package/src/utils/deviceFeaturesCompat.ts +191 -0
  808. package/src/utils/deviceFeaturesUtils.ts +42 -9
  809. package/src/utils/deviceInfoUtils.ts +35 -70
  810. package/src/utils/deviceSettings.ts +181 -39
  811. package/src/utils/deviceVersionUtils.ts +25 -44
  812. package/src/utils/findDefectiveBatchDevice.ts +3 -3
  813. package/src/utils/homescreen.ts +40 -0
  814. package/src/utils/index.ts +26 -7
  815. package/src/utils/networkUtils.ts +274 -16
  816. package/src/utils/pro2Nft.ts +165 -0
  817. package/src/utils/pro2Wallpaper.ts +44 -25
  818. package/src/utils/tracing.ts +3 -1
  819. package/src/utils/uiProgressThrottle.ts +63 -0
  820. package/tsconfig.type-tests.json +12 -0
  821. package/__tests__/RequestQueue.test.ts +0 -34
  822. package/dist/api/GetDeviceInfo.d.ts +0 -9
  823. package/dist/api/GetDeviceInfo.d.ts.map +0 -1
  824. package/dist/api/firmware/progressThrottle.d.ts +0 -3
  825. package/dist/api/firmware/progressThrottle.d.ts.map +0 -1
  826. package/dist/api/protocol-v2/DeviceSessionGet.d.ts +0 -6
  827. package/dist/api/protocol-v2/DeviceSessionGet.d.ts.map +0 -1
  828. package/dist/api/protocol-v2/DeviceSettingsGet.d.ts +0 -6
  829. package/dist/api/protocol-v2/DeviceSettingsGet.d.ts.map +0 -1
  830. package/dist/api/protocol-v2/DeviceSettingsPageShow.d.ts +0 -16
  831. package/dist/api/protocol-v2/DeviceSettingsPageShow.d.ts.map +0 -1
  832. package/dist/api/protocol-v2/DeviceSettingsSet.d.ts +0 -12
  833. package/dist/api/protocol-v2/DeviceSettingsSet.d.ts.map +0 -1
  834. package/dist/deviceProfile/buildDeviceProfile.d.ts +0 -21
  835. package/dist/deviceProfile/buildDeviceProfile.d.ts.map +0 -1
  836. package/dist/protocols/protocol-v2/lockedError.d.ts +0 -2
  837. package/dist/protocols/protocol-v2/lockedError.d.ts.map +0 -1
  838. package/dist/protocols/protocol-v2/unlockRetry.d.ts +0 -9
  839. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +0 -1
  840. package/dist/types/api/getDeviceInfo.d.ts +0 -87
  841. package/dist/types/api/getDeviceInfo.d.ts.map +0 -1
  842. package/src/api/GetDeviceInfo.ts +0 -145
  843. package/src/api/firmware/progressThrottle.ts +0 -44
  844. package/src/api/protocol-v2/DeviceSessionGet.ts +0 -15
  845. package/src/api/protocol-v2/DeviceSettingsGet.ts +0 -16
  846. package/src/api/protocol-v2/DeviceSettingsPageShow.ts +0 -59
  847. package/src/api/protocol-v2/DeviceSettingsSet.ts +0 -39
  848. package/src/deviceProfile/buildDeviceProfile.ts +0 -354
  849. package/src/protocols/protocol-v2/lockedError.ts +0 -10
  850. package/src/protocols/protocol-v2/unlockRetry.ts +0 -36
  851. 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
  }
@@ -1007,6 +1162,8 @@ const ensureConnected = async (
1007
1162
  HardwareErrorCode.DeviceDetectInBootloaderMode,
1008
1163
  HardwareErrorCode.BleCharacteristicNotifyChangeFailure,
1009
1164
  HardwareErrorCode.BridgeNeedsPermission,
1165
+ HardwareErrorCode.DeviceInterruptedFromUser,
1166
+ HardwareErrorCode.CallQueueActionCancelled,
1010
1167
  ].includes(error.errorCode)
1011
1168
  ) {
1012
1169
  reject(error);
@@ -1064,22 +1221,31 @@ export const cancel = (context: CoreContext, connectId?: string) => {
1064
1221
  )}`
1065
1222
  );
1066
1223
  const canceledDevices: Device[] = [];
1224
+ const interruptDevice = (device: Device | undefined, deviceConnectId: string) => {
1225
+ if (!device || canceledDevices.includes(device)) {
1226
+ return;
1227
+ }
1228
+ setPrePendingCallPromise(deviceConnectId, device.interruptionFromUser());
1229
+ canceledDevices.push(device);
1230
+ };
1067
1231
  for (const requestId of requestIds) {
1068
1232
  const task = requestQueue.getTask(requestId);
1069
1233
  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
- }
1234
+ if (task) {
1235
+ // During ensureConnected the method has a connectId but device is
1236
+ // assigned only after the poll succeeds. Interrupt the cached BLE
1237
+ // Device so an in-flight acquire/initialize cannot finish.
1238
+ interruptDevice(task.method?.device, task.method.connectId ?? connectId);
1239
+ interruptDevice(deviceCacheMap.get(connectId), connectId);
1076
1240
  requestQueue.rejectRequest(
1077
1241
  requestId,
1078
1242
  ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled)
1079
1243
  );
1080
1244
  }
1081
1245
  }
1246
+ interruptDevice(deviceCacheMap.get(connectId), connectId);
1082
1247
  requestQueue.abortRequestsByConnectId(connectId);
1248
+ pollingManager.stop(connectId);
1083
1249
  } catch (e) {
1084
1250
  Log.error('Cancel API Error: ', e);
1085
1251
  }
@@ -1088,22 +1254,31 @@ export const cancel = (context: CoreContext, connectId?: string) => {
1088
1254
  if (DataManager.isBleConnect(env)) {
1089
1255
  Log.debug('Cancel Api all _deviceList: ');
1090
1256
  const canceledDevices: Device[] = [];
1257
+ const interruptDevice = (device?: Device) => {
1258
+ if (!device || canceledDevices.includes(device)) {
1259
+ return;
1260
+ }
1261
+ device.interruptionFromUser().catch(() => undefined);
1262
+ canceledDevices.push(device);
1263
+ };
1091
1264
  for (const requestId of requestQueue.getRequestTasksId()) {
1092
1265
  const task = requestQueue.getTask(requestId);
1093
1266
  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);
1267
+ if (task) {
1268
+ interruptDevice(task.method?.device);
1269
+ if (task.method.connectId) {
1270
+ interruptDevice(deviceCacheMap.get(task.method.connectId));
1271
+ pollingManager.stop(task.method.connectId);
1099
1272
  }
1100
-
1101
1273
  requestQueue.rejectRequest(
1102
1274
  requestId,
1103
1275
  ERRORS.TypedError(HardwareErrorCode.CallQueueActionCancelled)
1104
1276
  );
1105
1277
  }
1106
1278
  }
1279
+ deviceCacheMap.forEach(interruptDevice);
1280
+ requestQueue.abortAllRequests();
1281
+ pollingManager.stopAll();
1107
1282
  } else {
1108
1283
  _deviceList?.allDevices().forEach(device => {
1109
1284
  Log.debug('device: ', device, ' device.hasDeviceAcquire: ', device.hasDeviceAcquire());
@@ -1157,14 +1332,16 @@ const shouldCheckPassphraseState = (method: BaseMethod, device: Device) => {
1157
1332
  };
1158
1333
 
1159
1334
  const cleanup = () => {
1335
+ const pendingUiPromises = _uiPromises;
1160
1336
  _uiPromises = [];
1161
- Log.debug('Cleanup...');
1337
+ rejectUiPromises(
1338
+ pendingUiPromises,
1339
+ ERRORS.TypedError(HardwareErrorCode.ActionCancelled, 'UI request was cancelled')
1340
+ );
1162
1341
  };
1163
1342
 
1164
1343
  const removeDeviceListener = (device: Device) => {
1165
1344
  device.removeAllListeners();
1166
- DevicePool.emitter.removeAllListeners(DEVICE.CONNECT);
1167
- // DevicePool.emitter.removeListener(DEVICE.DISCONNECT, onDeviceDisconnectHandler);
1168
1345
  };
1169
1346
 
1170
1347
  /**
@@ -1175,19 +1352,33 @@ const closePopup = () => {
1175
1352
  };
1176
1353
 
1177
1354
  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 }));
1355
+ const deviceObject = device.toMessageObject();
1356
+ if (!deviceObject) return;
1357
+ postMessage(createDeviceMessage(DEVICE.CONNECT, { device: deviceObject }));
1181
1358
  };
1182
1359
 
1183
1360
  const onDeviceDisconnectHandler = (device: Device) => {
1184
1361
  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 }));
1362
+ const deviceObject = device.toMessageObject();
1363
+ if (!deviceObject) return;
1364
+ postMessage(createDeviceMessage(DEVICE.DISCONNECT, { device: deviceObject }));
1365
+ };
1366
+
1367
+ const onTransportDeviceDisconnectHandler = (event: TransportDeviceDisconnectEvent) => {
1368
+ const device =
1369
+ deviceCacheMap.get(event.connectId) ??
1370
+ DevicePool.devicesCache[event.connectId] ??
1371
+ DevicePool.getDeviceByPath(event.connectId);
1372
+ if (!device) {
1373
+ Log.debug('Ignoring transport disconnect for an unknown device:', event.connectId);
1374
+ return;
1375
+ }
1376
+
1377
+ device.markTransportDisconnected();
1378
+ DevicePool.emitter.emit(DEVICE.DISCONNECT, device);
1188
1379
  };
1189
1380
 
1190
- const onDevicePinHandler = async (...[device, type, callback]: DeviceEvents['pin']) => {
1381
+ const onDevicePinHandler = (...[device, type, callback]: DeviceEvents['pin']) => {
1191
1382
  Log.log('request Input PIN');
1192
1383
  // create ui promise
1193
1384
  const uiPromise = createUiPromise(UI_RESPONSE.RECEIVE_PIN, device);
@@ -1196,12 +1387,14 @@ const onDevicePinHandler = async (...[device, type, callback]: DeviceEvents['pin
1196
1387
  createUiMessage(UI_REQUEST.REQUEST_PIN, {
1197
1388
  device: device.toMessageObject() as unknown as KnownDevice,
1198
1389
  type,
1390
+ responseCorrelation: uiPromise.responseCorrelation,
1199
1391
  })
1200
1392
  );
1201
- // wait for pin
1202
- const uiResp = await uiPromise.promise;
1203
- // callback.apply(null, [null, pin]);
1204
- callback(null, uiResp.payload);
1393
+ consumeUiPromise(
1394
+ uiPromise.promise,
1395
+ uiResp => callback(null, uiResp.payload),
1396
+ error => callback(error, '')
1397
+ );
1205
1398
  };
1206
1399
 
1207
1400
  export const onDeviceButtonHandler = (...[device, request]: [...DeviceEvents['button']]) => {
@@ -1225,7 +1418,11 @@ const onDeviceFeaturesHandler = (...[_, features]: [...DeviceEvents['features']]
1225
1418
  postMessage(createDeviceMessage(DEVICE.FEATURES, { ...features }));
1226
1419
  };
1227
1420
 
1228
- const onDevicePassphraseHandler = async (
1421
+ const onDeviceStateHandler = (...[_, stateEvent]: [...DeviceEvents['state']]) => {
1422
+ postMessage(createDeviceMessage(DEVICE.STATE, stateEvent));
1423
+ };
1424
+
1425
+ const onDevicePassphraseHandler = (
1229
1426
  ...[device, requestPayload, callback]: DeviceEvents['passphrase']
1230
1427
  ) => {
1231
1428
  Log.debug('onDevicePassphraseHandler');
@@ -1235,18 +1432,27 @@ const onDevicePassphraseHandler = async (
1235
1432
  device: device.toMessageObject() as KnownDevice,
1236
1433
  passphraseState: device.passphraseState,
1237
1434
  existsAttachPinUser: requestPayload.existsAttachPinUser,
1435
+ deviceOnly: requestPayload.deviceOnly,
1436
+ source: requestPayload.source,
1437
+ reason: requestPayload.reason,
1438
+ expectedPassphraseState: requestPayload.expectedPassphraseState,
1439
+ ...(requestPayload.interaction ? { interaction: requestPayload.interaction } : {}),
1440
+ responseCorrelation: uiPromise.responseCorrelation,
1238
1441
  })
1239
1442
  );
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
- });
1443
+ consumeUiPromise(
1444
+ uiPromise.promise,
1445
+ uiResp => {
1446
+ const { value, passphraseOnDevice, save, attachPinOnDevice } = uiResp.payload;
1447
+ callback({
1448
+ passphrase: value.normalize('NFKD'),
1449
+ passphraseOnDevice,
1450
+ attachPinOnDevice,
1451
+ cache: save,
1452
+ });
1453
+ },
1454
+ error => callback({}, error)
1455
+ );
1250
1456
  };
1251
1457
 
1252
1458
  const onEmptyPassphraseHandler = (...[_, , callback]: DeviceEvents['passphrase']) => {
@@ -1256,17 +1462,62 @@ const onEmptyPassphraseHandler = (...[_, , callback]: DeviceEvents['passphrase']
1256
1462
  };
1257
1463
 
1258
1464
  const onEnterPassphraseOnDeviceHandler = (
1259
- ...[device]: [...DeviceEvents['passphrase_on_device']]
1465
+ ...[device, requestPayload]: [...DeviceEvents['passphrase_on_device']]
1260
1466
  ) => {
1261
1467
  postMessage(
1262
1468
  createUiMessage(UI_REQUEST.REQUEST_PASSPHRASE_ON_DEVICE, {
1263
1469
  device: device.toMessageObject() as KnownDevice,
1264
1470
  passphraseState: device.passphraseState,
1471
+ source: requestPayload?.source,
1472
+ reason: requestPayload?.reason,
1473
+ ...(requestPayload?.interaction ? { interaction: requestPayload.interaction } : {}),
1474
+ })
1475
+ );
1476
+ };
1477
+
1478
+ const onEnterAttachPinOnDeviceHandler = (
1479
+ ...[device, requestPayload]: [...DeviceEvents['attach_pin_on_device']]
1480
+ ) => {
1481
+ postMessage(
1482
+ createUiMessage(UI_REQUEST.REQUEST_PIN, {
1483
+ device: device.toMessageObject() as KnownDevice,
1484
+ type: 'ButtonRequest_AttachPin',
1485
+ source: requestPayload?.source,
1486
+ reason: requestPayload?.reason,
1487
+ ...(requestPayload?.interaction ? { interaction: requestPayload.interaction } : {}),
1488
+ })
1489
+ );
1490
+ };
1491
+
1492
+ const onEnterPinOnDeviceHandler = (
1493
+ ...[device, pinType, metadata]: [...DeviceEvents['pin_on_device']]
1494
+ ) => {
1495
+ postMessage(
1496
+ createUiMessage(UI_REQUEST.REQUEST_PIN, {
1497
+ device: device.toMessageObject() as KnownDevice,
1498
+ type:
1499
+ pinType === DeviceSessionPinType.AttachToPin
1500
+ ? 'ButtonRequest_AttachPin'
1501
+ : 'ButtonRequest_PinEntry',
1502
+ source: metadata?.source,
1503
+ reason: metadata?.reason,
1504
+ deviceOnly: metadata?.deviceOnly ?? true,
1505
+ completion: metadata?.completion,
1506
+ method: metadata?.method,
1507
+ page: metadata?.page,
1508
+ operation: metadata?.operation,
1509
+ ...(metadata?.interaction ? { interaction: metadata.interaction } : {}),
1265
1510
  })
1266
1511
  );
1267
1512
  };
1268
1513
 
1269
- const onSelectDeviceInBootloaderForWebDeviceHandler = async (
1514
+ const onPinOnDeviceCompleteHandler = (
1515
+ ...[_, metadata]: [...DeviceEvents['pin_on_device_complete']]
1516
+ ) => {
1517
+ postMessage(createUiMessage(UI_REQUEST.CLOSE_UI_PIN_WINDOW, metadata));
1518
+ };
1519
+
1520
+ const onSelectDeviceInBootloaderForWebDeviceHandler = (
1270
1521
  ...[device, callback]: [...DeviceEvents['select_device_in_bootloader_for_web_device']]
1271
1522
  ) => {
1272
1523
  Log.debug('onSelectDeviceInBootloaderForWebDeviceHandler');
@@ -1276,11 +1527,14 @@ const onSelectDeviceInBootloaderForWebDeviceHandler = async (
1276
1527
  device: device.toMessageObject() as KnownDevice,
1277
1528
  })
1278
1529
  );
1279
- const uiResp = await uiPromise.promise;
1280
- callback(null, uiResp.payload.deviceId);
1530
+ consumeUiPromise(
1531
+ uiPromise.promise,
1532
+ uiResp => callback(null, uiResp.payload.deviceId),
1533
+ error => callback(error, '')
1534
+ );
1281
1535
  };
1282
1536
 
1283
- const onSelectDeviceForSwitchFirmwareWebDeviceHandler = async (
1537
+ const onSelectDeviceForSwitchFirmwareWebDeviceHandler = (
1284
1538
  ...[device, callback]: [...DeviceEvents['select_device_for_switch_firmware_web_device']]
1285
1539
  ) => {
1286
1540
  Log.debug('onSelectDeviceForSwitchFirmwareWebDeviceHandler');
@@ -1293,8 +1547,11 @@ const onSelectDeviceForSwitchFirmwareWebDeviceHandler = async (
1293
1547
  device: device.toMessageObject() as KnownDevice,
1294
1548
  })
1295
1549
  );
1296
- const uiResp = await uiPromise.promise;
1297
- callback(null, uiResp.payload.deviceId);
1550
+ consumeUiPromise(
1551
+ uiPromise.promise,
1552
+ uiResp => callback(null, uiResp.payload.deviceId),
1553
+ error => callback(error, '')
1554
+ );
1298
1555
  };
1299
1556
 
1300
1557
  /**
@@ -1313,14 +1570,21 @@ const postMessage = (message: CoreMessage) => {
1313
1570
 
1314
1571
  const createUiPromise = <T extends UiPromiseResponse['type']>(promiseEvent: T, device?: Device) => {
1315
1572
  const uiPromise: UiPromise<T> = createDeferred(promiseEvent, device);
1573
+ if (
1574
+ device &&
1575
+ (promiseEvent === UI_RESPONSE.RECEIVE_PIN || promiseEvent === UI_RESPONSE.RECEIVE_PASSPHRASE)
1576
+ ) {
1577
+ const publicDeviceId = device.toMessageObject()?.deviceId;
1578
+ uiPromise.responseCorrelation = {
1579
+ interactionId: generateInstanceId('UiResponse', device.sdkInstanceId),
1580
+ deviceId: publicDeviceId || device.instanceId,
1581
+ };
1582
+ }
1316
1583
  _uiPromises.push(uiPromise as any);
1317
1584
 
1318
1585
  return uiPromise;
1319
1586
  };
1320
1587
 
1321
- const findUiPromise = <T extends UiPromiseResponse['type']>(promiseEvent: T) =>
1322
- _uiPromises.find(p => p.id === promiseEvent);
1323
-
1324
1588
  const removeUiPromise = (promise: Deferred<any>) => {
1325
1589
  _uiPromises = _uiPromises.filter(p => p !== promise);
1326
1590
  };
@@ -1332,8 +1596,10 @@ export default class Core extends EventEmitter {
1332
1596
 
1333
1597
  private requestQueue = new RequestQueue();
1334
1598
 
1599
+ private disposePromise?: Promise<void>;
1600
+
1335
1601
  // background task
1336
- private prePendingCallPromise: Promise<void> | undefined;
1602
+ private prePendingCallPromises = new Map<string, Promise<void>>();
1337
1603
 
1338
1604
  private methodSynchronize = getSynchronize();
1339
1605
 
@@ -1344,19 +1610,24 @@ export default class Core extends EventEmitter {
1344
1610
  Log.debug(`[Core] Created SDK instance: ${this.sdkInstanceId}`);
1345
1611
  }
1346
1612
 
1347
- cancelOperation(operationId: string) {
1348
- this.requestQueue.abortOperation(operationId);
1349
- }
1350
-
1351
1613
  private getCoreContext() {
1352
1614
  return {
1353
1615
  sdkInstanceId: this.sdkInstanceId,
1354
1616
  tracingContext: this.tracingContext,
1355
1617
  requestQueue: this.requestQueue,
1356
1618
  methodSynchronize: this.methodSynchronize,
1357
- getPrePendingCallPromise: () => this.prePendingCallPromise,
1358
- setPrePendingCallPromise: (promise: Promise<void> | undefined) => {
1359
- this.prePendingCallPromise = promise;
1619
+ getPrePendingCallPromise: (connectId: string) => this.prePendingCallPromises.get(connectId),
1620
+ setPrePendingCallPromise: (connectId: string, promise?: Promise<void>) => {
1621
+ if (!promise) {
1622
+ this.prePendingCallPromises.delete(connectId);
1623
+ return;
1624
+ }
1625
+ this.prePendingCallPromises.set(connectId, promise);
1626
+ },
1627
+ removePrePendingCallPromise: (connectId: string, promise: Promise<void>) => {
1628
+ if (this.prePendingCallPromises.get(connectId) === promise) {
1629
+ this.prePendingCallPromises.delete(connectId);
1630
+ }
1360
1631
  },
1361
1632
  // callback 任务管理
1362
1633
  registerCallbackTask: (connectId: string, callbackPromise: Deferred<any>) => {
@@ -1374,11 +1645,16 @@ export default class Core extends EventEmitter {
1374
1645
  case UI_RESPONSE.RECEIVE_PASSPHRASE:
1375
1646
  case UI_RESPONSE.SELECT_DEVICE_IN_BOOTLOADER_FOR_WEB_DEVICE:
1376
1647
  case UI_RESPONSE.SELECT_DEVICE_FOR_SWITCH_FIRMWARE_WEB_DEVICE: {
1377
- const uiPromise = findUiPromise(message.type);
1648
+ const uiPromise = findUiPromiseForResponse(_uiPromises, message);
1378
1649
  if (uiPromise) {
1379
1650
  Log.log('receive UI Response: ', message.type);
1380
1651
  uiPromise.resolve(message);
1381
1652
  removeUiPromise(uiPromise);
1653
+ } else if (
1654
+ message.type === UI_RESPONSE.RECEIVE_PIN ||
1655
+ message.type === UI_RESPONSE.RECEIVE_PASSPHRASE
1656
+ ) {
1657
+ Log.warn('Ignored unmatched or ambiguous sensitive UI response:', message.type);
1382
1658
  }
1383
1659
  break;
1384
1660
  }
@@ -1394,10 +1670,17 @@ export default class Core extends EventEmitter {
1394
1670
  }
1395
1671
 
1396
1672
  case IFRAME.CALL: {
1397
- Log.log(`[${Date.now()}][CALL_API]`, message);
1673
+ const logBlockLabel = getLogBlockLabel(message);
1674
+ Log.log(
1675
+ formatLogMethodLabel(`[${Date.now()}][CALL_API]`, logBlockLabel),
1676
+ getSafeLogPayload(message, logBlockLabel)
1677
+ );
1398
1678
  const response = await callAPI(this.getCoreContext(), message);
1399
1679
  const { success, payload } = response;
1400
- Log.log(`[${Date.now()}][CALL_API_RESPONSE]`, response);
1680
+ Log.log(
1681
+ formatLogMethodLabel(`[${Date.now()}][CALL_API_RESPONSE]`, logBlockLabel),
1682
+ getSafeLogPayload(response, logBlockLabel)
1683
+ );
1401
1684
  if (success) {
1402
1685
  return response;
1403
1686
  }
@@ -1416,10 +1699,6 @@ export default class Core extends EventEmitter {
1416
1699
  cancel(this.getCoreContext(), message.payload.connectId);
1417
1700
  break;
1418
1701
  }
1419
- case IFRAME.CANCEL_OPERATION: {
1420
- this.cancelOperation(message.payload.operationId);
1421
- break;
1422
- }
1423
1702
  case IFRAME.CALLBACK: {
1424
1703
  Log.log('callback message: ', message);
1425
1704
  postMessage(message);
@@ -1431,25 +1710,65 @@ export default class Core extends EventEmitter {
1431
1710
  return Promise.resolve(message);
1432
1711
  }
1433
1712
 
1434
- dispose() {
1713
+ dispose(): Promise<void> {
1714
+ if (!this.disposePromise) {
1715
+ this.disposePromise = this.disposeResources();
1716
+ }
1717
+ return this.disposePromise;
1718
+ }
1719
+
1720
+ private async disposeResources(): Promise<void> {
1721
+ Log.debug(`[Core] Disposing SDK instance: ${this.sdkInstanceId}`);
1722
+ pollingManager.stopAll();
1723
+ this.requestQueue.abortAllRequests();
1724
+ cleanup();
1725
+
1726
+ _connector?.stop();
1727
+ let transportCleanup: Promise<void>;
1728
+ try {
1729
+ transportCleanup = Promise.resolve(TransportManager.getTransport()?.stop?.()).catch(error => {
1730
+ Log.warn('[Core] Transport cleanup failed:', error);
1731
+ });
1732
+ } catch (error) {
1733
+ Log.warn('[Core] Transport cleanup failed:', error);
1734
+ transportCleanup = Promise.resolve();
1735
+ }
1736
+
1737
+ // Preserve synchronous dispose semantics for in-memory state and listeners.
1435
1738
  _deviceList = undefined;
1436
1739
  _connector = undefined;
1740
+ DevicePool.dispose();
1437
1741
  deviceCacheMap.clear();
1438
1742
  preWarmInflight.clear();
1439
1743
  preWarmDoneAt.clear();
1440
- Log.debug(`[Core] Disposing SDK instance: ${this.sdkInstanceId}`);
1744
+ preConnectCache = { passphraseState: undefined };
1745
+ this.prePendingCallPromises.clear();
1746
+ this.removeAllListeners();
1441
1747
  cleanupSdkInstance(this.sdkInstanceId);
1748
+ if (_core === this) _core = undefined;
1749
+
1750
+ // Transports, especially Node USB, may release native handles asynchronously.
1751
+ await transportCleanup;
1442
1752
  }
1443
1753
  }
1444
1754
 
1445
1755
  export const initCore = () => {
1446
- _core = new Core();
1447
- return _core;
1756
+ const core = new Core();
1757
+ _core = core;
1758
+ return core;
1448
1759
  };
1449
1760
 
1450
1761
  export const initConnector = () => {
1451
1762
  _connector = new DeviceConnector();
1763
+ DevicePool.emitter.removeListener(DEVICE.CONNECT, onDeviceConnectHandler);
1764
+ DevicePool.emitter.removeListener(DEVICE.DISCONNECT, onDeviceDisconnectHandler);
1765
+ DevicePool.emitter.removeListener(
1766
+ TRANSPORT_EVENT.DEVICE_DISCONNECT,
1767
+ onTransportDeviceDisconnectHandler
1768
+ );
1769
+ DevicePool.emitter.on(DEVICE.CONNECT, onDeviceConnectHandler);
1452
1770
  DevicePool.emitter.on(DEVICE.DISCONNECT, onDeviceDisconnectHandler);
1771
+ DevicePool.emitter.on(TRANSPORT_EVENT.DEVICE_DISCONNECT, onTransportDeviceDisconnectHandler);
1453
1772
  return _connector;
1454
1773
  };
1455
1774
 
@@ -1463,12 +1782,8 @@ export const init = async (
1463
1782
  plugin?: LowlevelTransportSharedPlugin
1464
1783
  ) => {
1465
1784
  try {
1466
- try {
1467
- await DataManager.load(settings);
1468
- initTransport(Transport, plugin);
1469
- } catch {
1470
- Log.error('DataManager.load error');
1471
- }
1785
+ await DataManager.load(settings);
1786
+ initTransport(Transport, plugin);
1472
1787
  enableLog(DataManager.getSettings('debug'));
1473
1788
  if (DataManager.getSettings('env') !== 'react-native') {
1474
1789
  setLoggerPostMessage(postMessage);
@@ -1479,6 +1794,7 @@ export const init = async (
1479
1794
  return _core;
1480
1795
  } catch (error) {
1481
1796
  Log.error('core init', error);
1797
+ throw error;
1482
1798
  }
1483
1799
  };
1484
1800