@onekeyfe/hd-core 1.2.0-alpha.13 → 1.2.0-alpha.131

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