@onekeyfe/hd-core 1.2.0-alpha.4 → 1.2.0-alpha.41

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 (742) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +77 -0
  2. package/__tests__/DeviceCommands.test.ts +517 -0
  3. package/__tests__/DeviceEventRegistration.test.ts +43 -0
  4. package/__tests__/chain-params-onekey-compatibility.test.ts +229 -0
  5. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +282 -0
  6. package/__tests__/connectSettings.test.ts +61 -0
  7. package/__tests__/core-dispose.test.ts +34 -0
  8. package/__tests__/core-error-output.test.ts +39 -0
  9. package/__tests__/device-features-state.test.ts +78 -0
  10. package/__tests__/device-identity.test.ts +52 -0
  11. package/__tests__/device-lifecycle-events.test.ts +249 -0
  12. package/__tests__/device-pool-state.test.ts +144 -0
  13. package/__tests__/device-settings.test.ts +416 -0
  14. package/__tests__/device-state-contract.test.ts +27 -0
  15. package/__tests__/device-state-events.test.ts +286 -0
  16. package/__tests__/device-state-mapper.test.ts +261 -0
  17. package/__tests__/device-state-projector.test.ts +94 -0
  18. package/__tests__/device-state-store.test.ts +82 -0
  19. package/__tests__/device-utils.test.ts +107 -0
  20. package/__tests__/device-wallet-session-store.test.ts +478 -0
  21. package/__tests__/deviceFeaturesUtils.test.ts +39 -0
  22. package/__tests__/deviceSettings.test.ts +103 -0
  23. package/__tests__/evmLedgerLegacySafety.test.ts +12 -6
  24. package/__tests__/evmSignTransaction.test.ts +69 -0
  25. package/__tests__/evmSignTypedData.test.ts +80 -0
  26. package/__tests__/filesystemValidation.test.ts +53 -0
  27. package/__tests__/firmware-update/check-all-firmware-release.test.ts +175 -0
  28. package/__tests__/firmware-update/firmware-artifact-source.test.ts +119 -0
  29. package/__tests__/firmware-update/firmware-host-binding.test.ts +70 -0
  30. package/__tests__/firmware-update/firmware-preparation-error.test.ts +27 -0
  31. package/__tests__/firmware-update/firmware-update-capabilities.test.ts +13 -0
  32. package/__tests__/firmware-update/firmware-update-plan.test.ts +593 -0
  33. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +213 -0
  34. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +430 -0
  35. package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +58 -0
  36. package/__tests__/firmware-update/firmware-upload-source.test.ts +70 -0
  37. package/__tests__/get-device-state.test.ts +458 -0
  38. package/__tests__/homescreen.test.ts +24 -0
  39. package/__tests__/kaspa-public-types.type-test.ts +16 -0
  40. package/__tests__/kaspa-use-tweak-pro2.test.ts +20 -0
  41. package/__tests__/kaspaSignTransaction.test.ts +601 -0
  42. package/__tests__/known-device-public-types.type-test.ts +3 -0
  43. package/__tests__/logBlockEvent.test.ts +128 -1
  44. package/__tests__/method-protocol-support.test.ts +113 -0
  45. package/__tests__/networkUtils.test.ts +406 -0
  46. package/__tests__/open-wallet-session-error-response.test.ts +43 -0
  47. package/__tests__/open-wallet-session.test.ts +1368 -0
  48. package/__tests__/pro2Wallpaper.test.ts +39 -0
  49. package/__tests__/protocol-v2-bootloader-mode.test.ts +37 -0
  50. package/__tests__/protocol-v2-firmware-targets.test.ts +37 -0
  51. package/__tests__/protocol-v2-ping.test.ts +28 -0
  52. package/__tests__/protocol-v2-unlock-policy.test.ts +45 -0
  53. package/__tests__/protocol-v2.test.ts +6082 -2422
  54. package/__tests__/protocolV2FileWrite.test.ts +92 -0
  55. package/__tests__/protocolV2UiInteraction.test.ts +266 -0
  56. package/__tests__/public-device-state-api.test.ts +275 -0
  57. package/__tests__/public-pro2-api-boundary.test.ts +106 -0
  58. package/__tests__/refresh-device-state.test.ts +101 -0
  59. package/__tests__/request-context-logging.test.ts +16 -0
  60. package/__tests__/search-devices.test.ts +136 -0
  61. package/__tests__/tron-sign-message-init.test.ts +74 -0
  62. package/dist/api/BaseMethod.d.ts +14 -1
  63. package/dist/api/BaseMethod.d.ts.map +1 -1
  64. package/dist/api/CheckAllFirmwareRelease.d.ts +24 -1
  65. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  66. package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
  67. package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
  68. package/dist/api/CipherKeyValue.d.ts +1 -0
  69. package/dist/api/CipherKeyValue.d.ts.map +1 -1
  70. package/dist/api/ClearSessionCache.d.ts +9 -0
  71. package/dist/api/ClearSessionCache.d.ts.map +1 -0
  72. package/dist/api/DirList.d.ts +1 -0
  73. package/dist/api/DirList.d.ts.map +1 -1
  74. package/dist/api/DirMake.d.ts +1 -0
  75. package/dist/api/DirMake.d.ts.map +1 -1
  76. package/dist/api/DirRemove.d.ts +1 -0
  77. package/dist/api/DirRemove.d.ts.map +1 -1
  78. package/dist/api/FileDelete.d.ts +1 -0
  79. package/dist/api/FileDelete.d.ts.map +1 -1
  80. package/dist/api/FileRead.d.ts +1 -0
  81. package/dist/api/FileRead.d.ts.map +1 -1
  82. package/dist/api/FileWrite.d.ts +2 -0
  83. package/dist/api/FileWrite.d.ts.map +1 -1
  84. package/dist/api/FirmwareUpdate.d.ts.map +1 -1
  85. package/dist/api/FirmwareUpdateV2.d.ts +13 -2
  86. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  87. package/dist/api/FirmwareUpdateV3.d.ts +7 -3
  88. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  89. package/dist/api/FirmwareUpdateV4.d.ts +42 -16
  90. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  91. package/dist/api/GetDeviceState.d.ts +8 -0
  92. package/dist/api/GetDeviceState.d.ts.map +1 -0
  93. package/dist/api/GetFeatures.d.ts +1 -1
  94. package/dist/api/GetFeatures.d.ts.map +1 -1
  95. package/dist/api/GetOnekeyFeatures.d.ts.map +1 -1
  96. package/dist/api/GetPassphraseState.d.ts +2 -6
  97. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  98. package/dist/api/OpenWalletSession.d.ts +8 -0
  99. package/dist/api/OpenWalletSession.d.ts.map +1 -0
  100. package/dist/api/PathInfo.d.ts +1 -0
  101. package/dist/api/PathInfo.d.ts.map +1 -1
  102. package/dist/api/PromptWebDeviceAccess.d.ts.map +1 -1
  103. package/dist/api/SearchDevices.d.ts +3 -0
  104. package/dist/api/SearchDevices.d.ts.map +1 -1
  105. package/dist/api/UploadPortfolio.d.ts +17 -0
  106. package/dist/api/UploadPortfolio.d.ts.map +1 -0
  107. package/dist/api/alephium/AlephiumGetAddress.d.ts.map +1 -1
  108. package/dist/api/alephium/AlephiumSignMessage.d.ts.map +1 -1
  109. package/dist/api/alephium/AlephiumSignTransaction.d.ts.map +1 -1
  110. package/dist/api/algo/AlgoGetAddress.d.ts +1 -0
  111. package/dist/api/algo/AlgoGetAddress.d.ts.map +1 -1
  112. package/dist/api/algo/AlgoSignTransaction.d.ts +1 -0
  113. package/dist/api/algo/AlgoSignTransaction.d.ts.map +1 -1
  114. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts +1 -0
  115. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  116. package/dist/api/aptos/AptosGetAddress.d.ts +1 -0
  117. package/dist/api/aptos/AptosGetAddress.d.ts.map +1 -1
  118. package/dist/api/aptos/AptosGetPublicKey.d.ts +1 -0
  119. package/dist/api/aptos/AptosGetPublicKey.d.ts.map +1 -1
  120. package/dist/api/aptos/AptosSignInMessage.d.ts +1 -0
  121. package/dist/api/aptos/AptosSignInMessage.d.ts.map +1 -1
  122. package/dist/api/aptos/AptosSignMessage.d.ts +1 -0
  123. package/dist/api/aptos/AptosSignMessage.d.ts.map +1 -1
  124. package/dist/api/aptos/AptosSignTransaction.d.ts +1 -0
  125. package/dist/api/aptos/AptosSignTransaction.d.ts.map +1 -1
  126. package/dist/api/benfen/BenfenGetAddress.d.ts.map +1 -1
  127. package/dist/api/benfen/BenfenGetPublicKey.d.ts.map +1 -1
  128. package/dist/api/benfen/BenfenSignMessage.d.ts.map +1 -1
  129. package/dist/api/benfen/BenfenSignTransaction.d.ts.map +1 -1
  130. package/dist/api/btc/BTCGetAddress.d.ts +1 -0
  131. package/dist/api/btc/BTCGetAddress.d.ts.map +1 -1
  132. package/dist/api/btc/BTCGetPublicKey.d.ts +1 -0
  133. package/dist/api/btc/BTCGetPublicKey.d.ts.map +1 -1
  134. package/dist/api/btc/BTCSignMessage.d.ts +1 -0
  135. package/dist/api/btc/BTCSignMessage.d.ts.map +1 -1
  136. package/dist/api/btc/BTCSignPsbt.d.ts +1 -0
  137. package/dist/api/btc/BTCSignPsbt.d.ts.map +1 -1
  138. package/dist/api/btc/BTCSignTransaction.d.ts +1 -0
  139. package/dist/api/btc/BTCSignTransaction.d.ts.map +1 -1
  140. package/dist/api/btc/BTCVerifyMessage.d.ts +1 -0
  141. package/dist/api/btc/BTCVerifyMessage.d.ts.map +1 -1
  142. package/dist/api/btc/helpers/versionLimit.d.ts +2 -0
  143. package/dist/api/btc/helpers/versionLimit.d.ts.map +1 -1
  144. package/dist/api/cardano/CardanoGetAddress.d.ts +1 -0
  145. package/dist/api/cardano/CardanoGetAddress.d.ts.map +1 -1
  146. package/dist/api/cardano/CardanoGetPublicKey.d.ts +1 -0
  147. package/dist/api/cardano/CardanoGetPublicKey.d.ts.map +1 -1
  148. package/dist/api/cardano/CardanoSignMessage.d.ts +1 -0
  149. package/dist/api/cardano/CardanoSignMessage.d.ts.map +1 -1
  150. package/dist/api/cardano/CardanoSignTransaction.d.ts +1 -0
  151. package/dist/api/cardano/CardanoSignTransaction.d.ts.map +1 -1
  152. package/dist/api/conflux/ConfluxGetAddress.d.ts +2 -0
  153. package/dist/api/conflux/ConfluxGetAddress.d.ts.map +1 -1
  154. package/dist/api/conflux/ConfluxSignMessage.d.ts +2 -0
  155. package/dist/api/conflux/ConfluxSignMessage.d.ts.map +1 -1
  156. package/dist/api/conflux/ConfluxSignMessageCIP23.d.ts +2 -0
  157. package/dist/api/conflux/ConfluxSignMessageCIP23.d.ts.map +1 -1
  158. package/dist/api/conflux/ConfluxSignTransaction.d.ts +2 -0
  159. package/dist/api/conflux/ConfluxSignTransaction.d.ts.map +1 -1
  160. package/dist/api/cosmos/CosmosGetAddress.d.ts +1 -0
  161. package/dist/api/cosmos/CosmosGetAddress.d.ts.map +1 -1
  162. package/dist/api/cosmos/CosmosGetPublicKey.d.ts +1 -0
  163. package/dist/api/cosmos/CosmosGetPublicKey.d.ts.map +1 -1
  164. package/dist/api/cosmos/CosmosSignTransaction.d.ts +1 -0
  165. package/dist/api/cosmos/CosmosSignTransaction.d.ts.map +1 -1
  166. package/dist/api/device/DeviceCancel.d.ts +1 -0
  167. package/dist/api/device/DeviceCancel.d.ts.map +1 -1
  168. package/dist/api/device/DeviceChangePin.d.ts +1 -0
  169. package/dist/api/device/DeviceChangePin.d.ts.map +1 -1
  170. package/dist/api/device/DeviceFullyUploadResource.d.ts +1 -2
  171. package/dist/api/device/DeviceFullyUploadResource.d.ts.map +1 -1
  172. package/dist/api/device/DeviceLock.d.ts +1 -0
  173. package/dist/api/device/DeviceLock.d.ts.map +1 -1
  174. package/dist/api/device/DeviceRebootToBoardloader.d.ts +1 -0
  175. package/dist/api/device/DeviceRebootToBoardloader.d.ts.map +1 -1
  176. package/dist/api/device/DeviceRebootToBootloader.d.ts +1 -0
  177. package/dist/api/device/DeviceRebootToBootloader.d.ts.map +1 -1
  178. package/dist/api/device/DeviceSettings.d.ts +1 -0
  179. package/dist/api/device/DeviceSettings.d.ts.map +1 -1
  180. package/dist/api/device/DeviceSupportFeatures.d.ts +1 -0
  181. package/dist/api/device/DeviceSupportFeatures.d.ts.map +1 -1
  182. package/dist/api/device/DeviceUnlock.d.ts +1 -0
  183. package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
  184. package/dist/api/device/DeviceUpdateBootloader.d.ts +5 -1
  185. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  186. package/dist/api/device/DeviceWipe.d.ts +1 -0
  187. package/dist/api/device/DeviceWipe.d.ts.map +1 -1
  188. package/dist/api/device/PreInitialize.d.ts +1 -0
  189. package/dist/api/device/PreInitialize.d.ts.map +1 -1
  190. package/dist/api/dynex/DnxGetAddress.d.ts.map +1 -1
  191. package/dist/api/dynex/DnxSignTransaction.d.ts.map +1 -1
  192. package/dist/api/evm/EVMGetAddress.d.ts +1 -0
  193. package/dist/api/evm/EVMGetAddress.d.ts.map +1 -1
  194. package/dist/api/evm/EVMGetPublicKey.d.ts +1 -0
  195. package/dist/api/evm/EVMGetPublicKey.d.ts.map +1 -1
  196. package/dist/api/evm/EVMSignMessage.d.ts +1 -0
  197. package/dist/api/evm/EVMSignMessage.d.ts.map +1 -1
  198. package/dist/api/evm/EVMSignMessageEIP712.d.ts.map +1 -1
  199. package/dist/api/evm/EVMSignTransaction.d.ts +1 -0
  200. package/dist/api/evm/EVMSignTransaction.d.ts.map +1 -1
  201. package/dist/api/evm/EVMSignTypedData.d.ts +1 -0
  202. package/dist/api/evm/EVMSignTypedData.d.ts.map +1 -1
  203. package/dist/api/evm/EVMVerifyMessage.d.ts +1 -0
  204. package/dist/api/evm/EVMVerifyMessage.d.ts.map +1 -1
  205. package/dist/api/evm/protocol.d.ts +3 -0
  206. package/dist/api/evm/protocol.d.ts.map +1 -0
  207. package/dist/api/filecoin/FilecoinGetAddress.d.ts +1 -0
  208. package/dist/api/filecoin/FilecoinGetAddress.d.ts.map +1 -1
  209. package/dist/api/filecoin/FilecoinSignTransaction.d.ts +1 -0
  210. package/dist/api/filecoin/FilecoinSignTransaction.d.ts.map +1 -1
  211. package/dist/api/firmware/FirmwareArtifactSource.d.ts +25 -0
  212. package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +1 -0
  213. package/dist/api/firmware/FirmwareHostBinding.d.ts +6 -0
  214. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -0
  215. package/dist/api/firmware/FirmwarePreparationError.d.ts +3 -0
  216. package/dist/api/firmware/FirmwarePreparationError.d.ts.map +1 -0
  217. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +8 -0
  218. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  219. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +3 -0
  220. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +1 -0
  221. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +25 -0
  222. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -0
  223. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +30 -0
  224. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -0
  225. package/dist/api/firmware/getBinary.d.ts +15 -4
  226. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  227. package/dist/api/firmware/progressThrottle.d.ts +3 -0
  228. package/dist/api/firmware/progressThrottle.d.ts.map +1 -0
  229. package/dist/api/firmware/updateBootloader.d.ts +2 -0
  230. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  231. package/dist/api/firmware/uploadFirmware.d.ts +9 -1
  232. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  233. package/dist/api/helpers/filesystemValidation.d.ts +3 -0
  234. package/dist/api/helpers/filesystemValidation.d.ts.map +1 -1
  235. package/dist/api/helpers/paramsValidator.d.ts +1 -0
  236. package/dist/api/helpers/paramsValidator.d.ts.map +1 -1
  237. package/dist/api/helpers/protocolV2FileWrite.d.ts +33 -0
  238. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -0
  239. package/dist/api/index.d.ts +7 -25
  240. package/dist/api/index.d.ts.map +1 -1
  241. package/dist/api/kaspa/KaspaGetAddress.d.ts +4 -0
  242. package/dist/api/kaspa/KaspaGetAddress.d.ts.map +1 -1
  243. package/dist/api/kaspa/KaspaSignTransaction.d.ts +9 -1
  244. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  245. package/dist/api/kaspa/helpers/TransferSerialize.d.ts.map +1 -1
  246. package/dist/api/lightning/LnurlAuth.d.ts +0 -4
  247. package/dist/api/lightning/LnurlAuth.d.ts.map +1 -1
  248. package/dist/api/near/NearGetAddress.d.ts +1 -0
  249. package/dist/api/near/NearGetAddress.d.ts.map +1 -1
  250. package/dist/api/near/NearSignTransaction.d.ts +1 -0
  251. package/dist/api/near/NearSignTransaction.d.ts.map +1 -1
  252. package/dist/api/nem/NEMGetAddress.d.ts +1 -0
  253. package/dist/api/nem/NEMGetAddress.d.ts.map +1 -1
  254. package/dist/api/nem/NEMSignTransaction.d.ts +1 -0
  255. package/dist/api/nem/NEMSignTransaction.d.ts.map +1 -1
  256. package/dist/api/neo/NeoGetAddress.d.ts.map +1 -1
  257. package/dist/api/neo/NeoSignTransaction.d.ts.map +1 -1
  258. package/dist/api/nervos/NervosGetAddress.d.ts.map +1 -1
  259. package/dist/api/nervos/NervosSignTransaction.d.ts.map +1 -1
  260. package/dist/api/nexa/NexaGetAddress.d.ts.map +1 -1
  261. package/dist/api/nexa/NexaSignTransaction.d.ts +1 -0
  262. package/dist/api/nexa/NexaSignTransaction.d.ts.map +1 -1
  263. package/dist/api/nostr/NostrDecryptMessage.d.ts +1 -0
  264. package/dist/api/nostr/NostrDecryptMessage.d.ts.map +1 -1
  265. package/dist/api/nostr/NostrEncryptMessage.d.ts +1 -0
  266. package/dist/api/nostr/NostrEncryptMessage.d.ts.map +1 -1
  267. package/dist/api/nostr/NostrGetPublicKey.d.ts +1 -0
  268. package/dist/api/nostr/NostrGetPublicKey.d.ts.map +1 -1
  269. package/dist/api/nostr/NostrSignEvent.d.ts +1 -0
  270. package/dist/api/nostr/NostrSignEvent.d.ts.map +1 -1
  271. package/dist/api/nostr/NostrSignSchnorr.d.ts +1 -0
  272. package/dist/api/nostr/NostrSignSchnorr.d.ts.map +1 -1
  273. package/dist/api/polkadot/PolkadotGetAddress.d.ts +1 -0
  274. package/dist/api/polkadot/PolkadotGetAddress.d.ts.map +1 -1
  275. package/dist/api/polkadot/PolkadotSignTransaction.d.ts +1 -0
  276. package/dist/api/polkadot/PolkadotSignTransaction.d.ts.map +1 -1
  277. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts +1 -0
  278. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts.map +1 -1
  279. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts +1 -0
  280. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts.map +1 -1
  281. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts +1 -0
  282. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts.map +1 -1
  283. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts +4 -2
  284. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts.map +1 -1
  285. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts +7 -0
  286. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts.map +1 -0
  287. package/dist/api/protocol-v2/DeviceInfoGet.d.ts +1 -1
  288. package/dist/api/protocol-v2/DeviceInfoGet.d.ts.map +1 -1
  289. package/dist/api/protocol-v2/DeviceReboot.d.ts +1 -0
  290. package/dist/api/protocol-v2/DeviceReboot.d.ts.map +1 -1
  291. package/dist/api/protocol-v2/DeviceStatusGet.d.ts +7 -0
  292. package/dist/api/protocol-v2/DeviceStatusGet.d.ts.map +1 -0
  293. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts +27 -0
  294. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts.map +1 -0
  295. package/dist/api/protocol-v2/FilesystemFormat.d.ts +1 -0
  296. package/dist/api/protocol-v2/FilesystemFormat.d.ts.map +1 -1
  297. package/dist/api/protocol-v2/FilesystemPermissionFix.d.ts +1 -0
  298. package/dist/api/protocol-v2/FilesystemPermissionFix.d.ts.map +1 -1
  299. package/dist/api/protocol-v2/Ping.d.ts +3 -0
  300. package/dist/api/protocol-v2/Ping.d.ts.map +1 -1
  301. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts +1 -0
  302. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -1
  303. package/dist/api/protocol-v2/helpers.d.ts +4 -1
  304. package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
  305. package/dist/api/scdo/ScdoGetAddress.d.ts.map +1 -1
  306. package/dist/api/scdo/ScdoSignMessage.d.ts.map +1 -1
  307. package/dist/api/scdo/ScdoSignTransaction.d.ts.map +1 -1
  308. package/dist/api/solana/SolGetAddress.d.ts +1 -0
  309. package/dist/api/solana/SolGetAddress.d.ts.map +1 -1
  310. package/dist/api/solana/SolSignMessage.d.ts +1 -0
  311. package/dist/api/solana/SolSignMessage.d.ts.map +1 -1
  312. package/dist/api/solana/SolSignOffchainMessage.d.ts +1 -0
  313. package/dist/api/solana/SolSignOffchainMessage.d.ts.map +1 -1
  314. package/dist/api/solana/SolSignTransaction.d.ts +1 -0
  315. package/dist/api/solana/SolSignTransaction.d.ts.map +1 -1
  316. package/dist/api/starcoin/StarcoinGetAddress.d.ts +1 -0
  317. package/dist/api/starcoin/StarcoinGetAddress.d.ts.map +1 -1
  318. package/dist/api/starcoin/StarcoinGetPublicKey.d.ts +1 -0
  319. package/dist/api/starcoin/StarcoinGetPublicKey.d.ts.map +1 -1
  320. package/dist/api/starcoin/StarcoinSignMessage.d.ts +1 -0
  321. package/dist/api/starcoin/StarcoinSignMessage.d.ts.map +1 -1
  322. package/dist/api/starcoin/StarcoinSignTransaction.d.ts +1 -0
  323. package/dist/api/starcoin/StarcoinSignTransaction.d.ts.map +1 -1
  324. package/dist/api/starcoin/StarcoinVerifyMessage.d.ts +1 -0
  325. package/dist/api/starcoin/StarcoinVerifyMessage.d.ts.map +1 -1
  326. package/dist/api/stellar/StellarGetAddress.d.ts +1 -2
  327. package/dist/api/stellar/StellarGetAddress.d.ts.map +1 -1
  328. package/dist/api/stellar/StellarSignTransaction.d.ts +2 -3
  329. package/dist/api/stellar/StellarSignTransaction.d.ts.map +1 -1
  330. package/dist/api/sui/SuiGetAddress.d.ts +1 -0
  331. package/dist/api/sui/SuiGetAddress.d.ts.map +1 -1
  332. package/dist/api/sui/SuiGetPublicKey.d.ts +1 -0
  333. package/dist/api/sui/SuiGetPublicKey.d.ts.map +1 -1
  334. package/dist/api/sui/SuiSignMessage.d.ts +1 -0
  335. package/dist/api/sui/SuiSignMessage.d.ts.map +1 -1
  336. package/dist/api/sui/SuiSignTransaction.d.ts +1 -0
  337. package/dist/api/sui/SuiSignTransaction.d.ts.map +1 -1
  338. package/dist/api/ton/TonGetAddress.d.ts +1 -0
  339. package/dist/api/ton/TonGetAddress.d.ts.map +1 -1
  340. package/dist/api/ton/TonSignData.d.ts +1 -0
  341. package/dist/api/ton/TonSignData.d.ts.map +1 -1
  342. package/dist/api/ton/TonSignMessage.d.ts +1 -0
  343. package/dist/api/ton/TonSignMessage.d.ts.map +1 -1
  344. package/dist/api/ton/TonSignProof.d.ts +1 -0
  345. package/dist/api/ton/TonSignProof.d.ts.map +1 -1
  346. package/dist/api/tron/TronGetAddress.d.ts +1 -0
  347. package/dist/api/tron/TronGetAddress.d.ts.map +1 -1
  348. package/dist/api/tron/TronSignMessage.d.ts +5 -0
  349. package/dist/api/tron/TronSignMessage.d.ts.map +1 -1
  350. package/dist/api/tron/TronSignTransaction.d.ts +1 -0
  351. package/dist/api/tron/TronSignTransaction.d.ts.map +1 -1
  352. package/dist/api/utils.d.ts +2 -1
  353. package/dist/api/utils.d.ts.map +1 -1
  354. package/dist/api/xrp/XrpGetAddress.d.ts +1 -0
  355. package/dist/api/xrp/XrpGetAddress.d.ts.map +1 -1
  356. package/dist/api/xrp/XrpSignTransaction.d.ts +1 -0
  357. package/dist/api/xrp/XrpSignTransaction.d.ts.map +1 -1
  358. package/dist/constants/index.d.ts +1 -1
  359. package/dist/constants/index.d.ts.map +1 -1
  360. package/dist/core/RequestQueue.d.ts.map +1 -1
  361. package/dist/core/deviceEventRegistration.d.ts +11 -0
  362. package/dist/core/deviceEventRegistration.d.ts.map +1 -0
  363. package/dist/core/index.d.ts +3 -1
  364. package/dist/core/index.d.ts.map +1 -1
  365. package/dist/data-manager/DataManager.d.ts +1 -0
  366. package/dist/data-manager/DataManager.d.ts.map +1 -1
  367. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  368. package/dist/device/Device.d.ts +44 -14
  369. package/dist/device/Device.d.ts.map +1 -1
  370. package/dist/device/DeviceCommands.d.ts +8 -6
  371. package/dist/device/DeviceCommands.d.ts.map +1 -1
  372. package/dist/device/DeviceConnector.d.ts +1 -1
  373. package/dist/device/DeviceConnector.d.ts.map +1 -1
  374. package/dist/device/DeviceFeaturesState.d.ts +3 -0
  375. package/dist/device/DeviceFeaturesState.d.ts.map +1 -0
  376. package/dist/device/DevicePool.d.ts +5 -2
  377. package/dist/device/DevicePool.d.ts.map +1 -1
  378. package/dist/device/DeviceStateMapper.d.ts +13 -0
  379. package/dist/device/DeviceStateMapper.d.ts.map +1 -0
  380. package/dist/device/DeviceStateProjector.d.ts +7 -0
  381. package/dist/device/DeviceStateProjector.d.ts.map +1 -0
  382. package/dist/device/DeviceStateStore.d.ts +21 -0
  383. package/dist/device/DeviceStateStore.d.ts.map +1 -0
  384. package/dist/device/DeviceWalletSessionStore.d.ts +27 -0
  385. package/dist/device/DeviceWalletSessionStore.d.ts.map +1 -0
  386. package/dist/device/cloneDeviceState.d.ts +2 -0
  387. package/dist/device/cloneDeviceState.d.ts.map +1 -0
  388. package/dist/device/deviceIdentity.d.ts +5 -0
  389. package/dist/device/deviceIdentity.d.ts.map +1 -0
  390. package/dist/deviceProfile/buildDeviceFeatures.d.ts +9 -3
  391. package/dist/deviceProfile/buildDeviceFeatures.d.ts.map +1 -1
  392. package/dist/deviceProfile/index.d.ts +0 -1
  393. package/dist/deviceProfile/index.d.ts.map +1 -1
  394. package/dist/deviceProfile/protocolV2DeviceIdentity.d.ts +7 -0
  395. package/dist/deviceProfile/protocolV2DeviceIdentity.d.ts.map +1 -0
  396. package/dist/events/device.d.ts +12 -2
  397. package/dist/events/device.d.ts.map +1 -1
  398. package/dist/events/logBlockEvent.d.ts +2 -0
  399. package/dist/events/logBlockEvent.d.ts.map +1 -1
  400. package/dist/events/ui-request.d.ts +19 -2
  401. package/dist/events/ui-request.d.ts.map +1 -1
  402. package/dist/index.d.ts +1559 -736
  403. package/dist/index.d.ts.map +1 -1
  404. package/dist/index.js +9238 -3898
  405. package/dist/inject.d.ts.map +1 -1
  406. package/dist/lowLevelInject.d.ts.map +1 -1
  407. package/dist/protocols/protocol-v2/deviceSession.d.ts +7 -0
  408. package/dist/protocols/protocol-v2/deviceSession.d.ts.map +1 -0
  409. package/dist/protocols/protocol-v2/features.d.ts +25 -17
  410. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  411. package/dist/protocols/protocol-v2/firmware.d.ts +1 -0
  412. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
  413. package/dist/protocols/protocol-v2/index.d.ts +3 -2
  414. package/dist/protocols/protocol-v2/index.d.ts.map +1 -1
  415. package/dist/protocols/protocol-v2/lockedError.d.ts +2 -0
  416. package/dist/protocols/protocol-v2/lockedError.d.ts.map +1 -0
  417. package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts +17 -0
  418. package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts.map +1 -0
  419. package/dist/protocols/protocol-v2/uiInteraction.d.ts +39 -0
  420. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -0
  421. package/dist/protocols/protocol-v2/unlockPolicy.d.ts +4 -0
  422. package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -0
  423. package/dist/protocols/protocol-v2/unlockRetry.d.ts +10 -0
  424. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +1 -0
  425. package/dist/protocols/protocol-v2/walletSession.d.ts +22 -0
  426. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -0
  427. package/dist/topLevelInject.d.ts.map +1 -1
  428. package/dist/types/api/checkAllFirmwareRelease.d.ts +29 -4
  429. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  430. package/dist/types/api/deviceSettings.d.ts +11 -2
  431. package/dist/types/api/deviceSettings.d.ts.map +1 -1
  432. package/dist/types/api/deviceUnlock.d.ts +1 -1
  433. package/dist/types/api/deviceUnlock.d.ts.map +1 -1
  434. package/dist/types/api/deviceUpdateBootloader.d.ts +6 -0
  435. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  436. package/dist/types/api/export.d.ts +6 -2
  437. package/dist/types/api/export.d.ts.map +1 -1
  438. package/dist/types/api/firmwareUpdate.d.ts +75 -1
  439. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  440. package/dist/types/api/firmwareUpdateCapabilities.d.ts +9 -0
  441. package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +1 -0
  442. package/dist/types/api/firmwareUpdatePlan.d.ts +28 -0
  443. package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -0
  444. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +42 -0
  445. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +1 -0
  446. package/dist/types/api/getDeviceState.d.ts +12 -0
  447. package/dist/types/api/getDeviceState.d.ts.map +1 -0
  448. package/dist/types/api/getFeatures.d.ts.map +1 -1
  449. package/dist/types/api/getOnekeyFeatures.d.ts.map +1 -1
  450. package/dist/types/api/getPassphraseState.d.ts +2 -10
  451. package/dist/types/api/getPassphraseState.d.ts.map +1 -1
  452. package/dist/types/api/index.d.ts +27 -31
  453. package/dist/types/api/index.d.ts.map +1 -1
  454. package/dist/types/api/kaspaSignTransaction.d.ts +42 -4
  455. package/dist/types/api/kaspaSignTransaction.d.ts.map +1 -1
  456. package/dist/types/api/openWalletSession.d.ts +35 -0
  457. package/dist/types/api/openWalletSession.d.ts.map +1 -0
  458. package/dist/types/api/protocolV2.d.ts +15 -84
  459. package/dist/types/api/protocolV2.d.ts.map +1 -1
  460. package/dist/types/api/sessionCache.d.ts +13 -0
  461. package/dist/types/api/sessionCache.d.ts.map +1 -0
  462. package/dist/types/device.d.ts +132 -8
  463. package/dist/types/device.d.ts.map +1 -1
  464. package/dist/types/params.d.ts.map +1 -1
  465. package/dist/types/settings.d.ts +20 -14
  466. package/dist/types/settings.d.ts.map +1 -1
  467. package/dist/utils/assets.d.ts +2 -1
  468. package/dist/utils/assets.d.ts.map +1 -1
  469. package/dist/utils/deviceFeaturesCompat.d.ts +13 -0
  470. package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -0
  471. package/dist/utils/deviceFeaturesUtils.d.ts +6 -3
  472. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  473. package/dist/utils/deviceInfoUtils.d.ts +9 -9
  474. package/dist/utils/deviceInfoUtils.d.ts.map +1 -1
  475. package/dist/utils/deviceSettings.d.ts +38 -7
  476. package/dist/utils/deviceSettings.d.ts.map +1 -1
  477. package/dist/utils/deviceVersionUtils.d.ts +7 -5
  478. package/dist/utils/deviceVersionUtils.d.ts.map +1 -1
  479. package/dist/utils/homescreen.d.ts.map +1 -1
  480. package/dist/utils/index.d.ts +5 -2
  481. package/dist/utils/index.d.ts.map +1 -1
  482. package/dist/utils/networkUtils.d.ts +10 -1
  483. package/dist/utils/networkUtils.d.ts.map +1 -1
  484. package/dist/utils/patch.d.ts +1 -1
  485. package/dist/utils/patch.d.ts.map +1 -1
  486. package/dist/utils/pro2Wallpaper.d.ts +12 -0
  487. package/dist/utils/pro2Wallpaper.d.ts.map +1 -0
  488. package/dist/utils/tracing.d.ts.map +1 -1
  489. package/package.json +4 -4
  490. package/src/api/BaseMethod.ts +52 -17
  491. package/src/api/CheckAllFirmwareRelease.ts +344 -4
  492. package/src/api/CheckBootloaderRelease.ts +1 -2
  493. package/src/api/CheckFirmwareRelease.ts +1 -2
  494. package/src/api/CipherKeyValue.ts +4 -0
  495. package/src/api/ClearSessionCache.ts +32 -0
  496. package/src/api/DirList.ts +9 -4
  497. package/src/api/DirMake.ts +7 -4
  498. package/src/api/DirRemove.ts +7 -4
  499. package/src/api/FileDelete.ts +7 -4
  500. package/src/api/FileRead.ts +15 -9
  501. package/src/api/FileWrite.ts +26 -181
  502. package/src/api/FirmwareUpdate.ts +11 -12
  503. package/src/api/FirmwareUpdateV2.ts +370 -112
  504. package/src/api/FirmwareUpdateV3.ts +266 -68
  505. package/src/api/FirmwareUpdateV4.ts +1276 -651
  506. package/src/api/GetDeviceState.ts +59 -0
  507. package/src/api/GetFeatures.ts +6 -4
  508. package/src/api/GetOnekeyFeatures.ts +1 -75
  509. package/src/api/GetPassphraseState.ts +30 -21
  510. package/src/api/OpenWalletSession.ts +214 -0
  511. package/src/api/PathInfo.ts +9 -4
  512. package/src/api/PromptWebDeviceAccess.ts +2 -7
  513. package/src/api/SearchDevices.ts +29 -4
  514. package/src/api/UploadPortfolio.ts +40 -0
  515. package/src/api/alephium/AlephiumGetAddress.ts +0 -4
  516. package/src/api/alephium/AlephiumSignMessage.ts +0 -4
  517. package/src/api/alephium/AlephiumSignTransaction.ts +2 -6
  518. package/src/api/algo/AlgoGetAddress.ts +4 -0
  519. package/src/api/algo/AlgoSignTransaction.ts +4 -0
  520. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +9 -21
  521. package/src/api/aptos/AptosGetAddress.ts +4 -0
  522. package/src/api/aptos/AptosGetPublicKey.ts +4 -0
  523. package/src/api/aptos/AptosSignInMessage.ts +4 -0
  524. package/src/api/aptos/AptosSignMessage.ts +4 -0
  525. package/src/api/aptos/AptosSignTransaction.ts +4 -0
  526. package/src/api/benfen/BenfenGetAddress.ts +11 -7
  527. package/src/api/benfen/BenfenGetPublicKey.ts +0 -4
  528. package/src/api/benfen/BenfenSignMessage.ts +0 -4
  529. package/src/api/benfen/BenfenSignTransaction.ts +0 -4
  530. package/src/api/btc/BTCGetAddress.ts +8 -1
  531. package/src/api/btc/BTCGetPublicKey.ts +9 -2
  532. package/src/api/btc/BTCSignMessage.ts +8 -1
  533. package/src/api/btc/BTCSignPsbt.ts +4 -0
  534. package/src/api/btc/BTCSignTransaction.ts +8 -1
  535. package/src/api/btc/BTCVerifyMessage.ts +8 -1
  536. package/src/api/btc/helpers/versionLimit.ts +7 -4
  537. package/src/api/cardano/CardanoGetAddress.ts +4 -0
  538. package/src/api/cardano/CardanoGetPublicKey.ts +4 -0
  539. package/src/api/cardano/CardanoSignMessage.ts +5 -1
  540. package/src/api/cardano/CardanoSignTransaction.ts +5 -1
  541. package/src/api/conflux/ConfluxGetAddress.ts +6 -0
  542. package/src/api/conflux/ConfluxSignMessage.ts +6 -0
  543. package/src/api/conflux/ConfluxSignMessageCIP23.ts +6 -0
  544. package/src/api/conflux/ConfluxSignTransaction.ts +8 -5
  545. package/src/api/cosmos/CosmosGetAddress.ts +4 -0
  546. package/src/api/cosmos/CosmosGetPublicKey.ts +4 -0
  547. package/src/api/cosmos/CosmosSignTransaction.ts +4 -0
  548. package/src/api/device/DeviceCancel.ts +5 -0
  549. package/src/api/device/DeviceChangePin.ts +28 -0
  550. package/src/api/device/DeviceFullyUploadResource.ts +4 -5
  551. package/src/api/device/DeviceLock.ts +5 -0
  552. package/src/api/device/DeviceRebootToBoardloader.ts +5 -0
  553. package/src/api/device/DeviceRebootToBootloader.ts +5 -0
  554. package/src/api/device/DeviceSettings.ts +194 -1
  555. package/src/api/device/DeviceSupportFeatures.ts +4 -0
  556. package/src/api/device/DeviceUnlock.ts +13 -0
  557. package/src/api/device/DeviceUpdateBootloader.ts +123 -8
  558. package/src/api/device/DeviceWipe.ts +25 -0
  559. package/src/api/device/PreInitialize.ts +4 -0
  560. package/src/api/dynex/DnxGetAddress.ts +0 -6
  561. package/src/api/dynex/DnxSignTransaction.ts +0 -6
  562. package/src/api/evm/EVMGetAddress.ts +6 -2
  563. package/src/api/evm/EVMGetPublicKey.ts +6 -2
  564. package/src/api/evm/EVMSignMessage.ts +6 -2
  565. package/src/api/evm/EVMSignMessageEIP712.ts +1 -11
  566. package/src/api/evm/EVMSignTransaction.ts +6 -2
  567. package/src/api/evm/EVMSignTypedData.ts +42 -50
  568. package/src/api/evm/EVMVerifyMessage.ts +6 -2
  569. package/src/api/evm/legacyV1/getAddress.ts +2 -2
  570. package/src/api/evm/legacyV1/getPublicKey.ts +2 -2
  571. package/src/api/evm/legacyV1/signMessage.ts +2 -2
  572. package/src/api/evm/legacyV1/signTypedData.ts +2 -2
  573. package/src/api/evm/legacyV1/signTypedHash.ts +2 -2
  574. package/src/api/evm/legacyV1/verifyMessage.ts +2 -2
  575. package/src/api/evm/protocol.ts +6 -0
  576. package/src/api/filecoin/FilecoinGetAddress.ts +4 -0
  577. package/src/api/filecoin/FilecoinSignTransaction.ts +4 -0
  578. package/src/api/firmware/FirmwareArtifactSource.ts +278 -0
  579. package/src/api/firmware/FirmwareHostBinding.ts +100 -0
  580. package/src/api/firmware/FirmwarePreparationError.ts +12 -0
  581. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +60 -3
  582. package/src/api/firmware/FirmwareUpdateCapabilities.ts +9 -0
  583. package/src/api/firmware/FirmwareUpdatePlan.ts +745 -0
  584. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +392 -0
  585. package/src/api/firmware/getBinary.ts +8 -3
  586. package/src/api/firmware/progressThrottle.ts +44 -0
  587. package/src/api/firmware/updateBootloader.ts +19 -4
  588. package/src/api/firmware/uploadFirmware.ts +140 -22
  589. package/src/api/helpers/batchGetPublickeys.ts +2 -2
  590. package/src/api/helpers/filesystemValidation.ts +61 -0
  591. package/src/api/helpers/paramsValidator.ts +1 -1
  592. package/src/api/helpers/protocolV2FileWrite.ts +199 -0
  593. package/src/api/index.ts +8 -26
  594. package/src/api/kaspa/KaspaGetAddress.ts +7 -0
  595. package/src/api/kaspa/KaspaSignTransaction.ts +380 -29
  596. package/src/api/kaspa/helpers/TransferSerialize.ts +17 -7
  597. package/src/api/lightning/LnurlAuth.ts +0 -4
  598. package/src/api/near/NearGetAddress.ts +4 -0
  599. package/src/api/near/NearSignTransaction.ts +4 -0
  600. package/src/api/nem/NEMGetAddress.ts +4 -0
  601. package/src/api/nem/NEMSignTransaction.ts +4 -0
  602. package/src/api/neo/NeoGetAddress.ts +0 -4
  603. package/src/api/neo/NeoSignTransaction.ts +0 -4
  604. package/src/api/nervos/NervosGetAddress.ts +0 -4
  605. package/src/api/nervos/NervosSignTransaction.ts +2 -6
  606. package/src/api/nexa/NexaGetAddress.ts +0 -4
  607. package/src/api/nexa/NexaSignTransaction.ts +3 -5
  608. package/src/api/nostr/NostrDecryptMessage.ts +4 -0
  609. package/src/api/nostr/NostrEncryptMessage.ts +4 -0
  610. package/src/api/nostr/NostrGetPublicKey.ts +4 -0
  611. package/src/api/nostr/NostrSignEvent.ts +4 -0
  612. package/src/api/nostr/NostrSignSchnorr.ts +4 -0
  613. package/src/api/polkadot/PolkadotGetAddress.ts +4 -0
  614. package/src/api/polkadot/PolkadotSignTransaction.ts +4 -0
  615. package/src/api/protocol-v2/DeviceFactoryInfoGet.ts +5 -2
  616. package/src/api/protocol-v2/DeviceFactoryInfoSet.ts +5 -2
  617. package/src/api/protocol-v2/DeviceFirmwareUpdate.ts +8 -5
  618. package/src/api/protocol-v2/DeviceGetFirmwareUpdateStatus.ts +43 -5
  619. package/src/api/protocol-v2/DeviceGetOnboardingStatus.ts +21 -0
  620. package/src/api/protocol-v2/DeviceInfoGet.ts +8 -15
  621. package/src/api/protocol-v2/DeviceReboot.ts +7 -3
  622. package/src/api/protocol-v2/DeviceStatusGet.ts +19 -0
  623. package/src/api/protocol-v2/DeviceUploadWallpaper.ts +134 -0
  624. package/src/api/protocol-v2/FilesystemFormat.ts +9 -3
  625. package/src/api/protocol-v2/FilesystemPermissionFix.ts +5 -2
  626. package/src/api/protocol-v2/Ping.ts +37 -3
  627. package/src/api/protocol-v2/ProtocolInfoRequest.ts +5 -2
  628. package/src/api/protocol-v2/helpers.ts +21 -16
  629. package/src/api/scdo/ScdoGetAddress.ts +0 -4
  630. package/src/api/scdo/ScdoSignMessage.ts +0 -4
  631. package/src/api/scdo/ScdoSignTransaction.ts +0 -4
  632. package/src/api/solana/SolGetAddress.ts +4 -0
  633. package/src/api/solana/SolSignMessage.ts +4 -0
  634. package/src/api/solana/SolSignOffchainMessage.ts +4 -0
  635. package/src/api/solana/SolSignTransaction.ts +4 -0
  636. package/src/api/starcoin/StarcoinGetAddress.ts +4 -0
  637. package/src/api/starcoin/StarcoinGetPublicKey.ts +4 -0
  638. package/src/api/starcoin/StarcoinSignMessage.ts +4 -0
  639. package/src/api/starcoin/StarcoinSignTransaction.ts +4 -0
  640. package/src/api/starcoin/StarcoinVerifyMessage.ts +4 -0
  641. package/src/api/stellar/StellarGetAddress.ts +1 -10
  642. package/src/api/stellar/StellarSignTransaction.ts +1 -14
  643. package/src/api/sui/SuiGetAddress.ts +4 -0
  644. package/src/api/sui/SuiGetPublicKey.ts +4 -0
  645. package/src/api/sui/SuiSignMessage.ts +4 -0
  646. package/src/api/sui/SuiSignTransaction.ts +4 -0
  647. package/src/api/ton/TonGetAddress.ts +4 -0
  648. package/src/api/ton/TonSignData.ts +5 -1
  649. package/src/api/ton/TonSignMessage.ts +4 -0
  650. package/src/api/ton/TonSignProof.ts +4 -0
  651. package/src/api/tron/TronGetAddress.ts +4 -0
  652. package/src/api/tron/TronSignMessage.ts +18 -7
  653. package/src/api/tron/TronSignTransaction.ts +4 -0
  654. package/src/api/utils.ts +7 -3
  655. package/src/api/xrp/XrpGetAddress.ts +4 -0
  656. package/src/api/xrp/XrpSignTransaction.ts +5 -1
  657. package/src/constants/index.ts +1 -4
  658. package/src/core/RequestQueue.ts +1 -0
  659. package/src/core/deviceEventRegistration.ts +23 -0
  660. package/src/core/index.ts +164 -53
  661. package/src/data/messages/messages-protocol-v2.json +1155 -481
  662. package/src/data/messages/messages.json +286 -1
  663. package/src/data-manager/DataManager.ts +39 -39
  664. package/src/data-manager/TransportManager.ts +1 -1
  665. package/src/data-manager/connectSettings.ts +15 -0
  666. package/src/device/Device.ts +647 -281
  667. package/src/device/DeviceCommands.ts +166 -158
  668. package/src/device/DeviceConnector.ts +10 -7
  669. package/src/device/DeviceFeaturesState.ts +25 -0
  670. package/src/device/DevicePool.ts +66 -16
  671. package/src/device/DeviceStateMapper.ts +374 -0
  672. package/src/device/DeviceStateProjector.ts +94 -0
  673. package/src/device/DeviceStateStore.ts +201 -0
  674. package/src/device/DeviceWalletSessionStore.ts +144 -0
  675. package/src/device/cloneDeviceState.ts +39 -0
  676. package/src/device/deviceIdentity.ts +18 -0
  677. package/src/deviceProfile/buildDeviceFeatures.ts +224 -190
  678. package/src/deviceProfile/index.ts +0 -1
  679. package/src/deviceProfile/protocolV2DeviceIdentity.ts +32 -0
  680. package/src/events/device.ts +18 -1
  681. package/src/events/logBlockEvent.ts +79 -2
  682. package/src/events/ui-request.ts +25 -2
  683. package/src/index.ts +5 -0
  684. package/src/inject.ts +37 -43
  685. package/src/lowLevelInject.ts +5 -1
  686. package/src/protocols/protocol-v2/deviceSession.ts +24 -0
  687. package/src/protocols/protocol-v2/features.ts +96 -32
  688. package/src/protocols/protocol-v2/firmware.ts +2 -1
  689. package/src/protocols/protocol-v2/index.ts +8 -1
  690. package/src/protocols/protocol-v2/lockedError.ts +10 -0
  691. package/src/protocols/protocol-v2/settingsUnlockPolicy.ts +65 -0
  692. package/src/protocols/protocol-v2/uiInteraction.ts +210 -0
  693. package/src/protocols/protocol-v2/unlockPolicy.ts +105 -0
  694. package/src/protocols/protocol-v2/unlockRetry.ts +109 -0
  695. package/src/protocols/protocol-v2/walletSession.ts +285 -0
  696. package/src/topLevelInject.ts +5 -1
  697. package/src/types/api/checkAllFirmwareRelease.ts +50 -4
  698. package/src/types/api/deviceSettings.ts +26 -2
  699. package/src/types/api/deviceUnlock.ts +1 -1
  700. package/src/types/api/deviceUpdateBootloader.ts +6 -0
  701. package/src/types/api/export.ts +26 -0
  702. package/src/types/api/firmwareUpdate.ts +99 -5
  703. package/src/types/api/firmwareUpdateCapabilities.ts +9 -0
  704. package/src/types/api/firmwareUpdatePlan.ts +38 -0
  705. package/src/types/api/firmwareUpdatePreparedPlan.ts +53 -0
  706. package/src/types/api/getDeviceState.ts +19 -0
  707. package/src/types/api/getFeatures.ts +3 -0
  708. package/src/types/api/getOnekeyFeatures.ts +3 -0
  709. package/src/types/api/getPassphraseState.ts +9 -11
  710. package/src/types/api/index.ts +39 -64
  711. package/src/types/api/kaspaSignTransaction.ts +60 -4
  712. package/src/types/api/openWalletSession.ts +54 -0
  713. package/src/types/api/protocolV2.ts +24 -143
  714. package/src/types/api/sessionCache.ts +19 -0
  715. package/src/types/device.ts +185 -7
  716. package/src/types/params.ts +3 -2
  717. package/src/types/settings.ts +30 -16
  718. package/src/utils/assets.ts +4 -1
  719. package/src/utils/deviceFeaturesCompat.ts +180 -0
  720. package/src/utils/deviceFeaturesUtils.ts +52 -45
  721. package/src/utils/deviceInfoUtils.ts +27 -69
  722. package/src/utils/deviceSettings.ts +171 -39
  723. package/src/utils/deviceVersionUtils.ts +25 -44
  724. package/src/utils/findDefectiveBatchDevice.ts +3 -3
  725. package/src/utils/homescreen.ts +10 -0
  726. package/src/utils/index.ts +21 -2
  727. package/src/utils/networkUtils.ts +274 -16
  728. package/src/utils/pro2Wallpaper.ts +103 -0
  729. package/src/utils/tracing.ts +3 -1
  730. package/tsconfig.type-tests.json +12 -0
  731. package/dist/api/GetDeviceInfo.d.ts +0 -9
  732. package/dist/api/GetDeviceInfo.d.ts.map +0 -1
  733. package/dist/api/protocol-v2/FilesystemDiskControl.d.ts +0 -13
  734. package/dist/api/protocol-v2/FilesystemDiskControl.d.ts.map +0 -1
  735. package/dist/deviceProfile/buildDeviceProfile.d.ts +0 -21
  736. package/dist/deviceProfile/buildDeviceProfile.d.ts.map +0 -1
  737. package/dist/types/api/getDeviceInfo.d.ts +0 -87
  738. package/dist/types/api/getDeviceInfo.d.ts.map +0 -1
  739. package/src/api/GetDeviceInfo.ts +0 -145
  740. package/src/api/protocol-v2/FilesystemDiskControl.ts +0 -50
  741. package/src/deviceProfile/buildDeviceProfile.ts +0 -352
  742. package/src/types/api/getDeviceInfo.ts +0 -101
@@ -1,39 +1,45 @@
1
1
  import EventEmitter from 'events';
2
2
  import semver from 'semver';
3
- import { Enum_Capability } from '@onekeyfe/hd-transport';
3
+ import { DeviceRebootType, DeviceSessionPinType, Enum_Capability } from '@onekeyfe/hd-transport';
4
4
  import {
5
5
  EDeviceType,
6
+ EFirmwareType,
6
7
  ERRORS,
7
8
  ERROR_CODES_REQUIRE_DISCONNECT,
8
9
  ERROR_CODES_REQUIRE_RELEASE,
9
10
  HardwareError,
10
11
  HardwareErrorCode,
11
12
  createDeferred,
13
+ createDeviceNotSupportMethodError,
12
14
  } from '@onekeyfe/hd-shared';
13
15
 
14
- import {
15
- LoggerNames,
16
- getDeviceBLEFirmwareVersion,
17
- getDeviceBleName,
18
- getDeviceFirmwareVersion,
19
- getDeviceLabel,
20
- getDeviceType,
21
- getDeviceUUID,
22
- getFirmwareType,
23
- getLogger,
24
- } from '../utils';
16
+ import { LoggerNames, getLogger } from '../utils';
25
17
  import {
26
18
  fixFeaturesFirmwareVersion,
27
19
  getPassphraseStateWithRefreshDeviceInfo,
28
- supportInputPinOnSoftware,
29
- supportModifyHomescreen,
30
20
  } from '../utils/deviceFeaturesUtils';
21
+ import { parseDeviceVersion } from '../utils/deviceVersionUtils';
31
22
  import { generateInstanceId } from '../utils/tracing';
32
23
  // eslint-disable-next-line import/no-cycle
33
24
  import { DeviceCommands } from './DeviceCommands';
25
+ import { mergeDeviceFeaturesPatch } from './DeviceFeaturesState';
26
+ import {
27
+ mapDeviceSettingsToState,
28
+ mapFeaturesToState,
29
+ mapProtocolV1OnekeyFeaturesToState,
30
+ mapProtocolV2DeviceInfoToState,
31
+ mapProtocolV2DeviceStatusToState,
32
+ } from './DeviceStateMapper';
33
+ import { projectFeatures } from './DeviceStateProjector';
34
+ import { DeviceStateStore, createPublicDeviceState } from './DeviceStateStore';
35
+ import { cloneDeviceState } from './cloneDeviceState';
36
+ import { deviceWalletSessionStore } from './DeviceWalletSessionStore';
34
37
  import {
35
38
  type DeviceFirmwareRange,
36
39
  DeviceModelToTypes,
40
+ type DeviceStateEvent,
41
+ type DeviceStatePatch,
42
+ type DeviceStateUpdateSource,
37
43
  DeviceTypeToModels,
38
44
  type Device as DeviceTyped,
39
45
  EOneKeyDeviceMode,
@@ -48,14 +54,23 @@ import { DEVICE, UI_REQUEST } from '../events';
48
54
  import { DataManager } from '../data-manager';
49
55
  import TransportManager from '../data-manager/TransportManager';
50
56
  import { toHardened } from '../api/helpers/pathUtils';
51
- import { existCapability } from '../utils/capabilitieUtils';
52
57
  import {
53
- PROTOCOL_V2_STATUS_DEVICE_INFO_REQUEST,
58
+ PROTOCOL_V2_DEVICE_STATUS_GET_MESSAGE_TYPE,
59
+ PROTOCOL_V2_FEATURES_DEVICE_INFO_REQUEST,
60
+ PROTOCOL_V2_FULL_DEVICE_INFO_REQUEST,
61
+ PROTOCOL_V2_VERSIONS_DEVICE_INFO_REQUEST,
62
+ type ProtocolV2RuntimeMode,
63
+ getProtocolV2RuntimeMode,
54
64
  requestProtocolV2DeviceInfo,
65
+ requestProtocolV2DeviceStatus,
66
+ requestProtocolV2ProtocolInfo,
67
+ supportsProtocolV2Message,
55
68
  } from '../protocols/protocol-v2/features';
56
- import { buildProtocolV1FeaturesPayload, buildProtocolV2FeaturesPayload } from '../deviceProfile';
69
+ import { buildProtocolV1FeaturesPayload } from '../deviceProfile';
70
+ import { resolveProtocolV2DeviceIdentity } from '../deviceProfile/protocolV2DeviceIdentity';
57
71
 
58
72
  import type { PROTO } from '../constants';
73
+ import type { DeviceStateReadOptions } from '../types/api/getDeviceState';
59
74
  import type {
60
75
  DeviceButtonRequestPayload,
61
76
  DeviceFeaturesPayload,
@@ -65,6 +80,8 @@ import type { PassphrasePromptResponse } from './DeviceCommands';
65
80
  import type { Deferred, HardwareConnectProtocol } from '@onekeyfe/hd-shared';
66
81
  import type {
67
82
  OneKeyDeviceInfo as DeviceDescriptor,
83
+ DeviceStatus,
84
+ ProtocolInfo,
68
85
  ProtocolV2DeviceInfo,
69
86
  Success,
70
87
  } from '@onekeyfe/hd-transport';
@@ -77,6 +94,8 @@ export type InitOptions = {
77
94
  deriveCardano?: boolean;
78
95
  connectProtocol?: HardwareConnectProtocol;
79
96
  protocolV2DeviceInfoTimeoutMs?: number;
97
+ /** Refresh Protocol V2 runtime state before returning discovery results. */
98
+ refreshRuntimeState?: boolean;
80
99
  };
81
100
 
82
101
  export type RunOptions = {
@@ -91,11 +110,33 @@ const parseRunOptions = (options?: RunOptions): RunOptions => {
91
110
 
92
111
  const Log = getLogger(LoggerNames.Device);
93
112
 
113
+ const isProtocolV2DeviceStatusUnsupportedError = (error: unknown) => {
114
+ if (error instanceof HardwareError) {
115
+ if (error.errorCode === HardwareErrorCode.DeviceNotSupportMethod) {
116
+ return true;
117
+ }
118
+ if (error.params?.failureCode === 'Failure_UnexpectedMessage') {
119
+ return true;
120
+ }
121
+ }
122
+
123
+ const message =
124
+ error instanceof Error
125
+ ? error.message
126
+ : String((error as { message?: unknown } | null)?.message ?? error ?? '');
127
+ return (
128
+ /^Failure_UnexpectedMessage(?:,|\b)/i.test(message) ||
129
+ /\b(?:unsupported message|handler not registered|message handler not found)\b/i.test(message)
130
+ );
131
+ };
132
+
94
133
  export interface DeviceEvents {
95
134
  [DEVICE.PIN]: [Device, PROTO.PinMatrixRequestType | undefined, (err: any, pin: string) => void];
96
- [DEVICE.PASSPHRASE_ON_DEVICE]: [Device, ((response: any) => void)?];
135
+ [DEVICE.PASSPHRASE_ON_DEVICE]: [Device, PassphraseRequestPayload?];
136
+ [DEVICE.ATTACH_PIN_ON_DEVICE]: [Device, PassphraseRequestPayload?];
97
137
  [DEVICE.BUTTON]: [Device, DeviceButtonRequestPayload];
98
138
  [DEVICE.FEATURES]: [Device, DeviceFeaturesPayload];
139
+ [DEVICE.STATE]: [Device, DeviceStateEvent];
99
140
  [DEVICE.PASSPHRASE]: [
100
141
  Device,
101
142
  PassphraseRequestPayload,
@@ -119,15 +160,14 @@ export interface Device {
119
160
  emit<K extends keyof DeviceEvents>(type: K, ...args: DeviceEvents[K]): boolean;
120
161
  }
121
162
 
122
- const deviceSessionCache: Record<string, string> = {};
123
-
124
163
  /**
125
164
  * Pre-populate the device session cache with a known session ID.
126
165
  *
127
166
  * This allows short-lived processes (e.g. CLI) to restore a previously
128
167
  * obtained session, avoiding the need to re-enter passphrase on every
129
168
  * invocation. The session must have been obtained from a prior
130
- * getPassphraseState() call on the same device.
169
+ * wallet-session call on the same device. This compatibility hook is intended
170
+ * for a trusted CLI process restoring its own OS-keychain entry.
131
171
  *
132
172
  * @param deviceId - The device's device_id (from features)
133
173
  * @param passphraseState - The passphrase state token
@@ -138,8 +178,7 @@ export function preloadSessionCache(
138
178
  passphraseState: string,
139
179
  sessionId: string
140
180
  ): void {
141
- const key = `${deviceId}@${passphraseState}`;
142
- deviceSessionCache[key] = sessionId;
181
+ deviceWalletSessionStore.set(deviceId, passphraseState, sessionId);
143
182
  }
144
183
 
145
184
  export class Device extends EventEmitter {
@@ -185,22 +224,34 @@ export class Device extends EventEmitter {
185
224
  */
186
225
  private deviceAcquired = false;
187
226
 
188
- /**
189
- * 唯一设备状态缓存。
190
- *
191
- * V1 直接保存原生 Features;V2 保存由 DeviceInfoGet 映射出的
192
- * Features 视图。Device 不再保存 profile,结构化 DeviceProfile 只作为
193
- * getDeviceInfo() 的 API 返回值存在。
194
- */
195
- features: Features | undefined = undefined;
227
+ /** Canonical device-state cache; legacy Features is a compatibility projection. */
228
+ private stateStore = new DeviceStateStore();
196
229
 
197
- /**
198
- * 是否需要更新设备信息。
199
- *
200
- * 历史名称保留用于兼容现有调用语义;对 V2 表示 features 需要由
201
- * DeviceInfoGet 刷新。
202
- */
203
- featuresNeedsReload = false;
230
+ /** Force the next initialization to reload DeviceInfo after reconnect or reboot. */
231
+ private protocolV2StateNeedsReload = false;
232
+
233
+ get state() {
234
+ return this.stateStore.getState();
235
+ }
236
+
237
+ get features(): Features | undefined {
238
+ if (!this.state) return undefined;
239
+ return projectFeatures(this.state);
240
+ }
241
+
242
+ set features(features: Features | undefined) {
243
+ this.stateStore = new DeviceStateStore();
244
+ if (features) {
245
+ this.stateStore.update(mapFeaturesToState(features), 'compatibility');
246
+ const { passphraseState } = features;
247
+ const sessionId = features.sessionId ?? features.session_id;
248
+ const deviceKey = this.getSessionCacheDeviceKey(features.deviceId ?? undefined);
249
+ if (passphraseState && sessionId && deviceKey) {
250
+ this.passphraseState = passphraseState;
251
+ deviceWalletSessionStore.set(deviceKey, passphraseState, sessionId);
252
+ }
253
+ }
254
+ }
204
255
 
205
256
  runPromise?: Deferred<void> | null;
206
257
 
@@ -254,38 +305,46 @@ export class Device extends EventEmitter {
254
305
 
255
306
  // simplified object to pass via postMessage
256
307
  toMessageObject(): DeviceTyped | null {
257
- if (this.isUnacquired()) return null;
308
+ if (this.isUnacquired() || !this.features) return null;
258
309
 
259
310
  const env = DataManager.getSettings('env');
260
311
  const deviceType = this.getCurrentDeviceType();
261
312
 
262
313
  const bleName = this.getCurrentBleName();
263
- const label = this.getCurrentLabel();
314
+ const displayName = this.getCurrentDisplayName();
264
315
  const serialNo = this.getCurrentSerialNo();
265
316
  const connectId = this.getConnectId();
266
317
  const deviceId = this.getCurrentDeviceId() || null;
267
318
 
268
- const features = this.features;
319
+ const { features } = this;
320
+ const state = this.state ? createPublicDeviceState(this.state) : undefined;
269
321
 
270
322
  return {
271
- /** Android uses Mac address, iOS uses uuid, USB uses uuid */
323
+ /** Android uses a MAC address, while iOS and USB use transport-specific identifiers. */
272
324
  connectId: DataManager.isBleConnect(env) ? this.mainId || null : connectId,
273
- /** Hardware ID, will not change at any time */
325
+ /** Persist this after the first active probe so later calls do not need to guess. */
326
+ connectProtocol: this.originalDescriptor.protocolType,
327
+ /** Stable physical-device identity. */
328
+ serialNo,
329
+ /** @deprecated Use serialNo instead. */
274
330
  uuid: serialNo,
275
331
  commType: this.originalDescriptor.commType,
276
332
  sdkInstanceId: this.sdkInstanceId,
277
333
  instanceId: this.instanceId,
278
334
  createdAt: this.createdAt,
279
335
  deviceType,
280
- /** ID for current seeds, will clear after replace a new seed at device */
336
+ /** Wallet-lifecycle ID; changes after the device is wiped or reinitialized. */
281
337
  deviceId,
282
338
  path: this.originalDescriptor?.path,
283
339
  bleName,
284
- name: bleName || label || `OneKey ${deviceType?.toUpperCase()}`,
285
- label: label || 'OneKey',
340
+ name: displayName || bleName || `OneKey ${deviceType?.toUpperCase()}`,
341
+ // Keep the legacy top-level field string-compatible while preserving
342
+ // the canonical nullable value at state.identity.label.
343
+ label: displayName ?? '',
344
+ status: this.getStatus(),
286
345
  mode: this.getMode(),
287
346
  features,
288
- sessionId: this.features?.sessionId ?? null,
347
+ state,
289
348
  firmwareVersion: this.getFirmwareVersion(),
290
349
  bleFirmwareVersion: this.getBLEFirmwareVersion(),
291
350
  unavailableCapabilities: this.unavailableCapabilities,
@@ -301,6 +360,10 @@ export class Device extends EventEmitter {
301
360
  // eslint-disable-next-line no-async-promise-executor
302
361
  return new Promise<boolean>(async (resolve, reject) => {
303
362
  if (DataManager.isBleConnect(env)) {
363
+ if (this.hasDeviceAcquire() && this.commands && !this.commands.disposed) {
364
+ resolve(true);
365
+ return;
366
+ }
304
367
  try {
305
368
  await this.acquire(connectProtocol);
306
369
  resolve(true);
@@ -328,25 +391,25 @@ export class Device extends EventEmitter {
328
391
  }
329
392
 
330
393
  async acquire(
331
- connectProtocol?: HardwareConnectProtocol,
394
+ expectedProtocol?: HardwareConnectProtocol,
332
395
  options?: { throwOnRunPromiseError?: boolean }
333
396
  ) {
334
397
  const env = DataManager.getSettings('env');
335
398
  const mainIdKey = DataManager.isBleConnect(env) ? 'id' : 'session';
336
- const expectedProtocol = connectProtocol ?? this.originalDescriptor.protocolType;
399
+ const protocolHint = expectedProtocol ? undefined : this.originalDescriptor.protocolType;
337
400
  try {
338
401
  let acquireResult: unknown;
339
402
  if (DataManager.isBleConnect(env)) {
340
- // forceCleanRunPromise=true(自 e21b83c6 引入,修复 Pro2 BLE 重连):
341
- // acquire 意味着开启一个全新会话,transport 里残留的上一次 runPromise
342
- // 必然属于已死亡的会话(如固件升级重启、探测中断),不清理会让新会话的
343
- // 调用被旧 promise 卡死。无法在 Device 层面区分“重连恢复”与普通 acquire,
344
- // 因此对 BLE acquire 恒清理是有意为之。
403
+ // acquire starts a new BLE session. Any previous runPromise belongs to a dead
404
+ // session, such as an interrupted probe or firmware-update reboot, and would
405
+ // otherwise block the new session. Device cannot distinguish recovery from a
406
+ // regular acquire, so BLE always clears it intentionally.
345
407
  acquireResult = await this.deviceConnector?.acquire(
346
408
  this.originalDescriptor.id,
347
409
  undefined,
348
410
  true,
349
- expectedProtocol
411
+ expectedProtocol,
412
+ protocolHint
350
413
  );
351
414
  this.mainId = (acquireResult as any)?.uuid ?? '';
352
415
  Log.debug('Expected uuid:', this.mainId);
@@ -355,7 +418,8 @@ export class Device extends EventEmitter {
355
418
  this.originalDescriptor.path,
356
419
  this.originalDescriptor.session,
357
420
  undefined,
358
- expectedProtocol
421
+ expectedProtocol,
422
+ protocolHint
359
423
  );
360
424
  this.mainId = acquireResult as string | undefined;
361
425
  Log.debug('Expected session id:', this.mainId);
@@ -482,12 +546,11 @@ export class Device extends EventEmitter {
482
546
  }
483
547
 
484
548
  /**
485
- * 唯一协议判别器。
549
+ * Canonical protocol discriminator.
486
550
  *
487
- * descriptor.protocolType 是协议探测后的结果;V2 features DeviceInfoGet
488
- * 映射产生。
489
- * SDK 的协议分支都必须走这里,不要直接读 originalDescriptor.protocolType
490
- * 或从 features 反推。
551
+ * descriptor.protocolType is established by active probing; V2 features are mapped
552
+ * from DeviceInfoGet. All protocol branches must use this method instead of reading
553
+ * originalDescriptor.protocolType directly or inferring a protocol from features.
491
554
  */
492
555
  getProtocol(): 'V1' | 'V2' {
493
556
  return this.originalDescriptor.protocolType === 'V2' ? 'V2' : 'V1';
@@ -498,53 +561,75 @@ export class Device extends EventEmitter {
498
561
  }
499
562
 
500
563
  getCurrentDeviceType() {
501
- return getDeviceType(this.features);
564
+ return this.state?.identity.deviceType ?? EDeviceType.Unknown;
502
565
  }
503
566
 
504
567
  getCurrentDeviceId() {
505
- return this.features?.deviceId || undefined;
568
+ return this.state?.identity.deviceId || undefined;
506
569
  }
507
570
 
508
571
  getCurrentSerialNo() {
509
- return this.features ? getDeviceUUID(this.features) : '';
572
+ return this.state?.identity.serialNo ?? '';
510
573
  }
511
574
 
512
575
  getConnectId() {
513
576
  const serialNo = this.getCurrentSerialNo();
514
577
  if (serialNo) return serialNo;
515
578
 
516
- // connectId SDK 内部连接路由 key。这里兜底到 transport descriptor
517
- // 不改变 features.serialNo / deviceId 的业务语义。
579
+ // connectId is an internal routing key. Falling back to the transport descriptor
580
+ // does not change the business meaning of features.serialNo or deviceId.
518
581
  return this.originalDescriptor.path || this.originalDescriptor.id || '';
519
582
  }
520
583
 
521
584
  getCurrentBleName() {
522
- return getDeviceBleName(this.features);
585
+ return this.state?.identity.bleName ?? null;
523
586
  }
524
587
 
525
588
  getCurrentLabel() {
526
- return getDeviceLabel(this.features);
589
+ return this.state?.identity.label ?? null;
590
+ }
591
+
592
+ getCurrentDisplayName() {
593
+ if (!this.state) return null;
594
+
595
+ const label = this.getCurrentLabel();
596
+ if (label) return label;
597
+
598
+ const bleName = this.getCurrentBleName();
599
+ if (bleName) return bleName;
600
+
601
+ const deviceType = this.getCurrentDeviceType();
602
+ if (deviceType === EDeviceType.ClassicPure) {
603
+ return 'OneKey Classic 1S';
604
+ }
605
+
606
+ return `OneKey ${deviceType.charAt(0).toUpperCase() + deviceType.slice(1)}`;
527
607
  }
528
608
 
529
609
  getCurrentPassphraseProtection() {
530
- return this.features?.passphraseProtection;
610
+ return this.state?.status.passphraseProtection;
531
611
  }
532
612
 
533
613
  getCurrentFirmwareType() {
534
- return getFirmwareType(this.features);
614
+ return this.state?.identity.firmwareType ?? EFirmwareType.Universal;
535
615
  }
536
616
 
537
617
  getCurrentFirmwareVersionString() {
538
- return getDeviceFirmwareVersion(this.features)?.join('.');
618
+ return parseDeviceVersion(this.state?.versions.firmware).join('.');
539
619
  }
540
620
 
541
621
  getCurrentBLEFirmwareVersionString() {
542
- if (!this.features) return undefined;
543
- return getDeviceBLEFirmwareVersion(this.features).join('.');
622
+ if (!this.state) return undefined;
623
+ return parseDeviceVersion(this.state.versions.ble).join('.');
624
+ }
625
+
626
+ getCurrentBootloaderVersionString() {
627
+ if (!this.state) return undefined;
628
+ return parseDeviceVersion(this.state.versions.bootloader).join('.');
544
629
  }
545
630
 
546
631
  getCurrentSafetyChecks() {
547
- return this.features?.safetyChecks;
632
+ return this.state?.settings.safetyChecks;
548
633
  }
549
634
 
550
635
  getCurrentMethodVersionRange(
@@ -589,8 +674,6 @@ export class Device extends EventEmitter {
589
674
  }
590
675
 
591
676
  supportInputPinOnSoftware(): SupportFeatureType {
592
- if (this.features) return supportInputPinOnSoftware(this.features);
593
-
594
677
  const deviceType = this.getCurrentDeviceType();
595
678
  if (
596
679
  deviceType === EDeviceType.Touch ||
@@ -608,15 +691,12 @@ export class Device extends EventEmitter {
608
691
  }
609
692
 
610
693
  supportModifyHomescreen(): SupportFeatureType {
611
- // Pro2 走独立 1.x 版本线,不能套用 Touch/Pro 3.4.0 门槛(恒 false 且未来会误判)。
612
- // 依据:firmware-pro2 协议 schema(messages-protocol-v2.json)的 ApplySettings
613
- // 包含 homescreen 字段,V2 固件从首个版本即支持修改主屏。
694
+ // Pro2 has an independent 1.x version line and must not use the Touch/Pro 3.4.0
695
+ // threshold. ApplySettings includes homescreen from the first V2 firmware version.
614
696
  if (this.isProtocolV2()) {
615
697
  return { support: true };
616
698
  }
617
699
 
618
- if (this.features) return supportModifyHomescreen(this.features);
619
-
620
700
  const deviceType = this.getCurrentDeviceType();
621
701
  if (DeviceModelToTypes.model_mini.includes(deviceType)) {
622
702
  return { support: true };
@@ -628,29 +708,29 @@ export class Device extends EventEmitter {
628
708
  };
629
709
  }
630
710
 
631
- private generateStateKey(deviceId: string, passphraseState?: string) {
632
- if (passphraseState) {
633
- return `${deviceId}@${passphraseState}`;
634
- }
635
- return deviceId;
636
- }
637
-
638
711
  private getSessionCacheDeviceKey(_deviceId?: string) {
639
712
  const deviceId = _deviceId || this.getCurrentDeviceId();
640
713
  if (deviceId) return deviceId;
641
714
  if (this.isProtocolV2()) {
642
- return this.originalDescriptor.path || this.originalDescriptor.id;
715
+ return this.originalDescriptor.path;
643
716
  }
644
717
  return undefined;
645
718
  }
646
719
 
720
+ private reconcileSessionCacheDeviceIdentity(previousDeviceId?: string) {
721
+ deviceWalletSessionStore.reconcileDeviceIdentity({
722
+ temporaryKey: this.isProtocolV2() ? this.originalDescriptor.path : undefined,
723
+ previousDeviceId,
724
+ nextDeviceId: this.getCurrentDeviceId(),
725
+ });
726
+ }
727
+
647
728
  getInternalState(_deviceId?: string) {
648
- Log.debug('getInternalState session cache: ', deviceSessionCache);
649
729
  Log.debug(
650
730
  'getInternalState session param: ',
651
731
  `device_id: ${_deviceId}`,
652
- `features.deviceId: ${this.features?.deviceId}`,
653
- `passphraseState: ${this.passphraseState}`
732
+ `currentDeviceId: ${this.getCurrentDeviceId()}`,
733
+ `hasPassphraseState: ${Boolean(this.passphraseState)}`
654
734
  );
655
735
 
656
736
  const deviceId = this.getSessionCacheDeviceKey(_deviceId);
@@ -663,8 +743,13 @@ export class Device extends EventEmitter {
663
743
  // downstream call carries it and hits the primary lookup below.
664
744
  if (!this.passphraseState) return undefined;
665
745
 
666
- const usePassKey = this.generateStateKey(deviceId, this.passphraseState);
667
- return deviceSessionCache[usePassKey];
746
+ return deviceWalletSessionStore.get(deviceId, this.passphraseState);
747
+ }
748
+
749
+ getStandardInternalState(_deviceId?: string) {
750
+ const deviceId = this.getSessionCacheDeviceKey(_deviceId);
751
+ if (!deviceId) return undefined;
752
+ return deviceWalletSessionStore.getStandard(deviceId);
668
753
  }
669
754
 
670
755
  // attach to pin to fix internal state
@@ -673,46 +758,45 @@ export class Device extends EventEmitter {
673
758
  passphraseState: string | undefined,
674
759
  deviceId: string | undefined,
675
760
  sessionId: string | null = null,
676
- featuresSessionId: string | null = null
761
+ featuresSessionId: string | null = null,
762
+ walletType: 'standard' | 'hidden' = 'hidden'
677
763
  ) {
678
764
  Log.debug(
679
765
  'updateInternalState session param: ',
680
766
  `device_id: ${deviceId}`,
681
767
  `enablePassphrase: ${enablePassphrase}`,
682
- `passphraseState: ${passphraseState}`,
683
- `sessionId: ${sessionId}`,
684
- `featuresSessionId: ${featuresSessionId}`
768
+ `hasPassphraseState: ${Boolean(passphraseState)}`,
769
+ `hasSessionId: ${Boolean(sessionId)}`,
770
+ `hasFeaturesSessionId: ${Boolean(featuresSessionId)}`
685
771
  );
686
772
 
687
773
  const cacheDeviceKey = this.getSessionCacheDeviceKey(deviceId);
688
774
  if (!cacheDeviceKey) return;
689
775
 
690
776
  if (enablePassphrase) {
691
- // update the sessionId
692
- if (sessionId) {
693
- deviceSessionCache[this.generateStateKey(cacheDeviceKey, passphraseState)] = sessionId;
694
- } else if (featuresSessionId) {
695
- deviceSessionCache[this.generateStateKey(cacheDeviceKey, passphraseState)] =
696
- featuresSessionId;
777
+ const walletSessionId =
778
+ sessionId || featuresSessionId || deviceWalletSessionStore.getPending(cacheDeviceKey);
779
+ if (walletType === 'standard') {
780
+ deviceWalletSessionStore.setStandard(
781
+ cacheDeviceKey,
782
+ passphraseState,
783
+ walletSessionId ?? undefined
784
+ );
785
+ } else {
786
+ deviceWalletSessionStore.set(cacheDeviceKey, passphraseState, walletSessionId ?? undefined);
697
787
  }
698
788
  }
699
789
 
700
- // delete the old sessionId
701
- const oldKey = `${cacheDeviceKey}`;
702
- if (deviceSessionCache[oldKey]) {
703
- delete deviceSessionCache[oldKey];
704
- }
705
-
706
- Log.debug('updateInternalState session cache: ', deviceSessionCache);
790
+ deviceWalletSessionStore.deletePending(cacheDeviceKey);
707
791
  }
708
792
 
709
793
  private setInternalState(state: string, initSession?: boolean) {
710
794
  Log.debug(
711
795
  'setInternalState session param: ',
712
- `state: ${state}`,
796
+ `hasState: ${Boolean(state)}`,
713
797
  `initSession: ${initSession}`,
714
- `deviceId: ${this.features?.deviceId}`,
715
- `passphraseState: ${this.passphraseState}`
798
+ `deviceId: ${this.getCurrentDeviceId()}`,
799
+ `hasPassphraseState: ${Boolean(this.passphraseState)}`
716
800
  );
717
801
 
718
802
  if (!this.passphraseState && !initSession) return;
@@ -720,12 +804,11 @@ export class Device extends EventEmitter {
720
804
  const deviceId = this.getSessionCacheDeviceKey();
721
805
  if (!deviceId) return;
722
806
 
723
- const key = this.generateStateKey(deviceId, this.passphraseState);
724
-
725
- if (state) {
726
- deviceSessionCache[key] = state;
807
+ if (this.passphraseState) {
808
+ deviceWalletSessionStore.set(deviceId, this.passphraseState, state);
809
+ } else if (initSession) {
810
+ deviceWalletSessionStore.setPending(deviceId, state);
727
811
  }
728
- Log.debug('setInternalState done session cache: ', deviceSessionCache);
729
812
  }
730
813
 
731
814
  clearInternalState(_deviceId?: string) {
@@ -733,70 +816,80 @@ export class Device extends EventEmitter {
733
816
 
734
817
  const deviceId = this.getSessionCacheDeviceKey(_deviceId);
735
818
  if (!deviceId) return;
736
- const key = `${deviceId}`;
737
- delete deviceSessionCache[key];
819
+ deviceWalletSessionStore.deletePending(deviceId);
738
820
 
739
821
  if (this.passphraseState) {
740
- const usePassKey = this.generateStateKey(deviceId, this.passphraseState);
741
- delete deviceSessionCache[usePassKey];
822
+ deviceWalletSessionStore.delete(deviceId, this.passphraseState);
742
823
  }
743
824
  }
744
825
 
826
+ clearStandardInternalState(_deviceId?: string) {
827
+ const deviceId = this.getSessionCacheDeviceKey(_deviceId);
828
+ if (!deviceId) return;
829
+ deviceWalletSessionStore.deleteStandard(deviceId);
830
+ }
831
+
745
832
  async initialize(options?: InitOptions) {
746
- // Protocol V2 不支持传统 Initialize,直接使用协议专用初始化流程。
833
+ // Protocol V2 does not support legacy Initialize; use its dedicated flow.
747
834
  if (this.isProtocolV2()) {
748
835
  this.passphraseState = options?.passphraseState;
749
- if (this.features && !this.featuresNeedsReload && !options?.initSession) {
750
- if (this.features.bootloaderMode) {
836
+ if (this.state && !options?.initSession && !this.protocolV2StateNeedsReload) {
837
+ if (this.state.status.mode === 'bootloader' || this.state.status.mode === 'romloader') {
751
838
  return;
752
839
  }
753
- // 不能直接信任缓存 features:设备端 wipe / 完成初始化 / label
754
- // features 会永久陈旧。每次 run 做一次轻量 status 刷新(不含 fw/SE),
755
- // 用字段级合并保留已有版本和 SE 信息。
756
- await this._refreshProtocolV2Status(options);
840
+ // Normal calls reuse the cache. Explicit getDeviceState refreshes, unlock flow,
841
+ // and device events update dynamic state without polling on every SDK call.
757
842
  return;
758
843
  }
759
844
  await this._initializeProtocolV2(options);
845
+ this.protocolV2StateNeedsReload = false;
760
846
  return;
761
847
  }
762
848
 
763
- // Log.debug('initialize param:', options);
849
+ try {
850
+ const callInitialize = async (payload: Record<string, unknown>, initSession?: boolean) => {
851
+ const initStartAt = Date.now();
852
+ const { message } = await this.commands.typedCall('Initialize', 'Features', payload, {
853
+ // iOS BLE bound devices can need close to 20 seconds.
854
+ timeoutMs: 25 * 1000,
855
+ });
856
+ this.setLastInitializeDuration(Date.now() - initStartAt);
857
+ this._updateFeatures(message, initSession);
858
+ await TransportManager.reconfigure(this.features);
859
+ };
764
860
 
765
- this.passphraseState = options?.passphraseState;
861
+ const expectedDeviceId = options?.deviceId;
862
+ if (expectedDeviceId) {
863
+ // 先只读校验物理设备身份;钱包上下文仍由下方携带完整参数的
864
+ // Initialize 选择,避免标准钱包请求复用此前的隐藏钱包上下文。
865
+ this.passphraseState = undefined;
866
+ const { message } = await this.commands.typedCall('GetFeatures', 'Features', {});
867
+ this._updateFeatures(message);
868
+ await TransportManager.reconfigure(this.features);
869
+ if (!this.checkDeviceId(expectedDeviceId)) {
870
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckDeviceIdError);
871
+ }
872
+ }
766
873
 
767
- if (options?.initSession) {
768
- this.clearInternalState(options?.deviceId);
769
- }
874
+ this.passphraseState = options?.passphraseState;
770
875
 
771
- const internalState = this.getInternalState(options?.deviceId);
772
- const payload: any = {};
773
- if (internalState) {
774
- payload.session_id = internalState;
775
- }
876
+ if (options?.initSession) {
877
+ this.clearInternalState(options?.deviceId);
878
+ }
776
879
 
777
- if (options?.deriveCardano) {
778
- payload.derive_cardano = true;
779
- }
780
- payload.passphrase_state = options?.passphraseState;
781
- payload.is_contains_attach = true;
880
+ const internalState = this.getInternalState(options?.deviceId);
881
+ const payload: Record<string, unknown> = {
882
+ passphrase_state: options?.passphraseState,
883
+ is_contains_attach: true,
884
+ };
885
+ if (internalState) {
886
+ payload.session_id = internalState;
887
+ }
888
+ if (options?.deriveCardano) {
889
+ payload.derive_cardano = true;
890
+ }
782
891
 
783
- const initStartAt = Date.now();
784
- try {
785
- // @ts-expect-error
786
- const { message } = await Promise.race([
787
- this.commands.typedCall('Initialize', 'Features', payload),
788
- new Promise((_, reject) => {
789
- setTimeout(() => {
790
- reject(ERRORS.TypedError(HardwareErrorCode.DeviceInitializeFailed));
791
- // iOS ble bound device timeout 20s
792
- }, 25 * 1000);
793
- }),
794
- ]);
795
-
796
- const initCostMs = Date.now() - initStartAt;
797
- this.setLastInitializeDuration(initCostMs);
798
- this._updateFeatures(message, options?.initSession);
799
- await TransportManager.reconfigure(this.features);
892
+ await callInitialize(payload, options?.initSession);
800
893
  } catch (error) {
801
894
  Log.error('Initialization failed:', error);
802
895
  throw error;
@@ -806,59 +899,38 @@ export class Device extends EventEmitter {
806
899
  /**
807
900
  * Device initialization over Protocol V2.
808
901
  *
809
- * Protocol V2 不走传统 Initialize/GetFeatures;直接用 DeviceInfoGet
810
- * 生成唯一的 features 状态。
902
+ * Protocol V2 bypasses legacy Initialize/GetFeatures and builds its canonical
903
+ * features state directly from DeviceInfoGet.
811
904
  */
812
905
  private async _initializeProtocolV2(options?: InitOptions) {
813
906
  Log.debug('Initialize device via Protocol V2 features adapter');
814
907
 
815
908
  try {
816
- // 超时由 requestProtocolV2DeviceInfo 内部的 typedCall timeoutMs(默认 10s)负责,
817
- // 不再额外包一层 Promise.race:外层 race timer 不会清理,
818
- // 且 reject 后底层调用仍会残留。
909
+ // typedCall applies the request timeout. An outer Promise.race would leak its
910
+ // timer and leave the underlying call active after rejection.
819
911
  const deviceInfo = await requestProtocolV2DeviceInfo({
820
912
  commands: this.commands,
821
913
  timeoutMs: options?.protocolV2DeviceInfoTimeoutMs,
822
914
  });
823
- // 默认请求不含 SE/hash 数据,scope 如实标注为 basic
824
- // 完整数据由 getDeviceInfo(scope:'verify'|'full') 获取。
825
- const features = this.updateProtocolV2Features(deviceInfo);
915
+ // The default request excludes SE/hash data and therefore uses basic scope.
916
+ // Full version and verification data require getDeviceState({ scope: 'firmware' }).
917
+ const features = await this.probeProtocolV2RuntimeState(
918
+ deviceInfo,
919
+ options?.protocolV2DeviceInfoTimeoutMs
920
+ );
826
921
  Log.debug('Protocol V2 features:', features);
827
- this.featuresNeedsReload = false;
828
922
  } catch (error) {
829
923
  Log.error('Protocol V2 initialization failed:', error);
830
924
  throw error;
831
925
  }
832
926
  }
833
927
 
834
- /**
835
- * Protocol V2 的轻量状态刷新(每次 run 前调用)。
836
- *
837
- * 请求 hw + coprocessor + status(不含 fw/SE target):status 提供 init_states / label /
838
- * passphrase_enabled 等会在设备端变化的字段;hw/coprocessor 提供 serialNo / bleName。
839
- * versions 为空时按字段级合并保留旧值,verify 数据不会被降级。
840
- */
841
- private async _refreshProtocolV2Status(options?: InitOptions) {
842
- try {
843
- const deviceInfo = await requestProtocolV2DeviceInfo({
844
- commands: this.commands,
845
- request: PROTOCOL_V2_STATUS_DEVICE_INFO_REQUEST,
846
- timeoutMs: options?.protocolV2DeviceInfoTimeoutMs,
847
- });
848
- const features = this.updateProtocolV2Features(deviceInfo);
849
- Log.debug('Protocol V2 features (status refresh):', features);
850
- } catch (error) {
851
- Log.error('Protocol V2 status refresh failed:', error);
852
- throw error;
853
- }
854
- }
855
-
856
928
  async getFeatures() {
857
929
  if (this.isProtocolV2()) {
858
930
  const deviceInfo = await requestProtocolV2DeviceInfo({
859
931
  commands: this.commands,
860
932
  });
861
- return this.updateProtocolV2Features(deviceInfo);
933
+ return this.probeProtocolV2RuntimeState(deviceInfo);
862
934
  }
863
935
 
864
936
  const { message } = await this.commands.typedCall('GetFeatures', 'Features', {});
@@ -866,36 +938,277 @@ export class Device extends EventEmitter {
866
938
  return this.features;
867
939
  }
868
940
 
941
+ async getDeviceState(params: DeviceStateReadOptions = {}) {
942
+ const refresh = new Set(params.refreshSections ?? []);
943
+ const getProtocolV2DeviceInfoRequest = () => {
944
+ if (refresh.has('verification')) return PROTOCOL_V2_FULL_DEVICE_INFO_REQUEST;
945
+ if (refresh.has('versions')) return PROTOCOL_V2_VERSIONS_DEVICE_INFO_REQUEST;
946
+ return PROTOCOL_V2_FEATURES_DEVICE_INFO_REQUEST;
947
+ };
948
+ let initializedWithDeviceInfo = false;
949
+ let refreshedDeviceInfo: ProtocolV2DeviceInfo | undefined;
950
+
951
+ if (!this.state) {
952
+ if (this.isProtocolV2()) {
953
+ const deviceInfo = await requestProtocolV2DeviceInfo({
954
+ commands: this.commands,
955
+ request: getProtocolV2DeviceInfoRequest(),
956
+ });
957
+ await this.probeProtocolV2RuntimeState(deviceInfo);
958
+ refreshedDeviceInfo = deviceInfo;
959
+ initializedWithDeviceInfo = true;
960
+ } else {
961
+ await this.getFeatures();
962
+ }
963
+ } else if (!this.isProtocolV2() && refresh.size > 0) {
964
+ await this.getFeatures();
965
+ }
966
+
967
+ if (!this.isProtocolV2() && refresh.has('verification')) {
968
+ const { message } = await this.commands.typedCall('OnekeyGetFeatures', 'OnekeyFeatures');
969
+ this.updateState(mapProtocolV1OnekeyFeaturesToState(message), 'device-info');
970
+ }
971
+
972
+ if (this.isProtocolV2()) {
973
+ const refreshDeviceInfo =
974
+ refresh.has('identity') || refresh.has('versions') || refresh.has('verification');
975
+ if (refreshDeviceInfo && !initializedWithDeviceInfo) {
976
+ const deviceInfo = await requestProtocolV2DeviceInfo({
977
+ commands: this.commands,
978
+ request: getProtocolV2DeviceInfoRequest(),
979
+ });
980
+ refreshedDeviceInfo = deviceInfo;
981
+ if (!refresh.has('status')) {
982
+ this.updateState(
983
+ mapProtocolV2DeviceInfoToState(deviceInfo, this.state?.status.mode),
984
+ 'device-info'
985
+ );
986
+ }
987
+ }
988
+
989
+ if (refresh.has('status') && !initializedWithDeviceInfo) {
990
+ const deviceInfo =
991
+ refreshedDeviceInfo ??
992
+ (await requestProtocolV2DeviceInfo({
993
+ commands: this.commands,
994
+ request: getProtocolV2DeviceInfoRequest(),
995
+ }));
996
+ await this.probeProtocolV2RuntimeState(deviceInfo);
997
+ }
998
+
999
+ if (refresh.has('settings') && this.state?.status.mode === 'normal') {
1000
+ const { message } = await this.commands.typedCall(
1001
+ 'DeviceSettingsGet',
1002
+ 'DeviceSettings',
1003
+ {}
1004
+ );
1005
+ this.updateState(mapDeviceSettingsToState(message), 'settings-read');
1006
+ }
1007
+ }
1008
+
1009
+ if (!this.state) {
1010
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceInitializeFailed);
1011
+ }
1012
+ return params.includeRaw ? cloneDeviceState(this.state) : createPublicDeviceState(this.state);
1013
+ }
1014
+
869
1015
  _updateFeatures(protoFeatures: PROTO.Features | Features, initSession?: boolean) {
1016
+ const previousDeviceId = this.getCurrentDeviceId();
870
1017
  let feat =
871
1018
  'protocol' in protoFeatures
872
1019
  ? protoFeatures
873
1020
  : buildProtocolV1FeaturesPayload(protoFeatures, this.features);
874
1021
 
875
- // GetFeatures doesn't return 'session_id'
876
- if (this.features?.sessionId && !feat.sessionId) {
877
- feat.sessionId = this.features.sessionId;
878
- }
879
- if (this.getCurrentDeviceId() && feat.sessionId) {
880
- this.setInternalState(feat.sessionId, initSession);
881
- }
882
1022
  feat.unlocked = feat.unlocked ?? true;
883
1023
 
884
1024
  feat = fixFeaturesFirmwareVersion(feat);
885
1025
 
886
- this.features = feat;
887
- this.featuresNeedsReload = false;
888
- this.emit(DEVICE.FEATURES, this, feat);
1026
+ this.updateState(mapFeaturesToState(feat), 'initialize');
1027
+ this.reconcileSessionCacheDeviceIdentity(previousDeviceId);
1028
+ if (feat.deviceId && feat.sessionId) {
1029
+ this.setInternalState(feat.sessionId, initSession);
1030
+ }
1031
+ }
1032
+
1033
+ updateState(patch: DeviceStatePatch, source: DeviceStateUpdateSource) {
1034
+ const result = this.stateStore.update(patch, source);
1035
+ if (result.changedKeys.length === 0) return result.state;
1036
+
1037
+ const event: DeviceStateEvent = {
1038
+ connectId: this.getConnectId() ?? null,
1039
+ state: createPublicDeviceState(result.state),
1040
+ revision: result.revision,
1041
+ source,
1042
+ changedKeys: result.changedKeys,
1043
+ };
1044
+ Log.debug('Device state patch committed', {
1045
+ source,
1046
+ keys: result.changedKeys,
1047
+ });
1048
+ this.emit(DEVICE.STATE, this, event);
1049
+ if (result.state.protocol === 'V1') {
1050
+ this.emit(DEVICE.FEATURES, this, projectFeatures(result.state));
1051
+ }
1052
+ return result.state;
1053
+ }
1054
+
1055
+ updateFeaturesPatch(patch: Partial<Features>, source: DeviceStateUpdateSource) {
1056
+ const currentFeatures = this.features;
1057
+ if (!currentFeatures) return undefined;
1058
+
1059
+ const features = mergeDeviceFeaturesPatch(currentFeatures, patch);
1060
+ if (features === currentFeatures) return currentFeatures;
1061
+
1062
+ const normalized = fixFeaturesFirmwareVersion(features);
1063
+ this.updateState(mapFeaturesToState(normalized), source);
1064
+ return this.features;
889
1065
  }
890
1066
 
891
- updateProtocolV2Features(deviceInfo?: ProtocolV2DeviceInfo) {
892
- const features = fixFeaturesFirmwareVersion(
893
- buildProtocolV2FeaturesPayload(deviceInfo, this.features)
1067
+ async probeProtocolV2RuntimeState(deviceInfo: ProtocolV2DeviceInfo, timeoutMs?: number) {
1068
+ const protocolInfo = await requestProtocolV2ProtocolInfo({
1069
+ commands: this.commands,
1070
+ timeoutMs,
1071
+ });
1072
+ const runtimeMode = getProtocolV2RuntimeMode(protocolInfo);
1073
+ const protocolV2DeviceType = resolveProtocolV2DeviceIdentity(
1074
+ deviceInfo.hw?.Device_type
1075
+ ).deviceType;
1076
+ if (runtimeMode === 'romloader' && protocolV2DeviceType !== EDeviceType.Pro2) {
1077
+ throw ERRORS.TypedError(
1078
+ HardwareErrorCode.DeviceInitializeFailed,
1079
+ 'Protocol V2 romloader mode is only supported for Pro2.'
1080
+ );
1081
+ }
1082
+ const deviceStatusSupported = supportsProtocolV2Message(
1083
+ protocolInfo,
1084
+ PROTOCOL_V2_DEVICE_STATUS_GET_MESSAGE_TYPE
1085
+ );
1086
+
1087
+ if (runtimeMode === 'bootloader' || runtimeMode === 'romloader') {
1088
+ return this.updateProtocolV2Features(deviceInfo, null, runtimeMode, protocolInfo);
1089
+ }
1090
+
1091
+ if (!deviceStatusSupported) {
1092
+ if (runtimeMode === 'normal') {
1093
+ return this.updateProtocolV2Features(deviceInfo, null, runtimeMode, protocolInfo);
1094
+ }
1095
+ throw ERRORS.TypedError(
1096
+ HardwareErrorCode.DeviceInitializeFailed,
1097
+ `Unknown Protocol V2 build fingerprint without DeviceStatusGet capability: ${protocolInfo.build_fingerprint}`
1098
+ );
1099
+ }
1100
+
1101
+ let deviceStatus: DeviceStatus;
1102
+ try {
1103
+ deviceStatus = await requestProtocolV2DeviceStatus({
1104
+ commands: this.commands,
1105
+ timeoutMs,
1106
+ });
1107
+ } catch (error) {
1108
+ if (runtimeMode === undefined && isProtocolV2DeviceStatusUnsupportedError(error)) {
1109
+ return this.updateProtocolV2Features(deviceInfo, null, 'bootloader', protocolInfo);
1110
+ }
1111
+ throw error;
1112
+ }
1113
+ return this.updateProtocolV2Features(deviceInfo, deviceStatus, 'normal', protocolInfo);
1114
+ }
1115
+
1116
+ updateProtocolV2Features(
1117
+ deviceInfo?: ProtocolV2DeviceInfo,
1118
+ deviceStatus?: DeviceStatus | null,
1119
+ runtimeMode?: ProtocolV2RuntimeMode,
1120
+ protocolInfo?: ProtocolInfo
1121
+ ) {
1122
+ const previousDeviceId = this.getCurrentDeviceId();
1123
+ const resolvedMode = runtimeMode ?? (deviceStatus ? 'normal' : this.state?.status.mode);
1124
+ if (deviceInfo) {
1125
+ this.updateState(mapProtocolV2DeviceInfoToState(deviceInfo, resolvedMode), 'device-info');
1126
+ }
1127
+ if (protocolInfo) {
1128
+ this.updateState({ raw: { protocolV2ProtocolInfo: protocolInfo } }, 'device-info');
1129
+ }
1130
+ if (deviceStatus) {
1131
+ this.updateState(mapProtocolV2DeviceStatusToState(deviceStatus), 'device-status');
1132
+ }
1133
+ this.reconcileSessionCacheDeviceIdentity(previousDeviceId);
1134
+ return this.features as Features;
1135
+ }
1136
+
1137
+ updateProtocolV2Status(status: DeviceStatus) {
1138
+ const previousDeviceInfo = this.state?.raw?.protocolV2DeviceInfo;
1139
+ const previousStatus = this.state?.raw?.protocolV2DeviceStatus;
1140
+ return this.updateProtocolV2Features(previousDeviceInfo, {
1141
+ ...previousStatus,
1142
+ ...status,
1143
+ });
1144
+ }
1145
+
1146
+ markTransportDisconnected() {
1147
+ this.deviceAcquired = false;
1148
+ if (!this.isProtocolV2()) return;
1149
+ this.protocolV2StateNeedsReload = true;
1150
+ this.clearPreInitialized();
1151
+ }
1152
+
1153
+ invalidateAfterWipe() {
1154
+ const deviceId = this.getCurrentDeviceId();
1155
+ if (deviceId) {
1156
+ deviceWalletSessionStore.deleteDevice(deviceId);
1157
+ }
1158
+ if (this.isProtocolV2() && this.originalDescriptor.path !== deviceId) {
1159
+ deviceWalletSessionStore.deleteDevice(this.originalDescriptor.path);
1160
+ this.protocolV2StateNeedsReload = true;
1161
+ }
1162
+
1163
+ this.passphraseState = undefined;
1164
+ this.stateStore = new DeviceStateStore();
1165
+ this.clearPreInitialized();
1166
+ this.needReloadDevice = true;
1167
+ }
1168
+
1169
+ markProtocolV2Reboot(rebootType: DeviceRebootType) {
1170
+ if (!this.isProtocolV2()) return;
1171
+
1172
+ this.protocolV2StateNeedsReload = true;
1173
+ this.clearPreInitialized();
1174
+ let loaderMode: 'bootloader' | 'romloader' | undefined;
1175
+ if (rebootType === DeviceRebootType.Bootloader) {
1176
+ loaderMode = 'bootloader';
1177
+ } else if (rebootType === DeviceRebootType.Romloader) {
1178
+ loaderMode = 'romloader';
1179
+ }
1180
+ if (loaderMode) {
1181
+ this.updateState(
1182
+ {
1183
+ identity: { deviceId: null },
1184
+ status: {
1185
+ mode: loaderMode,
1186
+ initialized: null,
1187
+ unlocked: null,
1188
+ firmwarePresent: null,
1189
+ backupRequired: null,
1190
+ noBackup: null,
1191
+ unfinishedBackup: null,
1192
+ recoveryMode: null,
1193
+ passphraseProtection: null,
1194
+ pinProtection: null,
1195
+ attachToPinEnabled: null,
1196
+ unlockedAttachPin: null,
1197
+ },
1198
+ raw: { protocolV2ProtocolInfo: null, protocolV2DeviceStatus: null },
1199
+ },
1200
+ 'transport-reconnect'
1201
+ );
1202
+ return;
1203
+ }
1204
+
1205
+ this.updateState(
1206
+ {
1207
+ status: { mode: 'normal', unlocked: null },
1208
+ raw: { protocolV2ProtocolInfo: null, protocolV2DeviceStatus: null },
1209
+ },
1210
+ 'transport-reconnect'
894
1211
  );
895
- this.features = features;
896
- this.featuresNeedsReload = false;
897
- this.emit(DEVICE.FEATURES, this, features);
898
- return features;
899
1212
  }
900
1213
 
901
1214
  /**
@@ -916,8 +1229,7 @@ export class Device extends EventEmitter {
916
1229
  }
917
1230
 
918
1231
  if (forceUpdate) {
919
- // 枚举得到的 descriptor 可能不带 protocolType(如 WebUSB enumerate),
920
- // 不能让覆盖丢掉已探测的协议结果。
1232
+ // Enumerated descriptors may omit protocolType, so preserve an actively probed value.
921
1233
  this.originalDescriptor = {
922
1234
  ...descriptor,
923
1235
  protocolType: descriptor.protocolType ?? this.originalDescriptor.protocolType,
@@ -942,19 +1254,37 @@ export class Device extends EventEmitter {
942
1254
 
943
1255
  options = parseRunOptions(options);
944
1256
 
945
- this.runPromise = createDeferred(this._runInner.bind(this, fn, options));
946
- return this.runPromise.promise;
1257
+ const runPromise = createDeferred<void>();
1258
+ this.runPromise = runPromise;
1259
+ this._runInner(fn, options, runPromise).catch(error => {
1260
+ if (this.runPromise === runPromise) {
1261
+ this.runPromise = null;
1262
+ }
1263
+ runPromise.reject(error);
1264
+ });
1265
+ return runPromise.promise;
947
1266
  }
948
1267
 
949
- async _runInner<T>(fn: (() => Promise<T>) | undefined, options: RunOptions) {
1268
+ async _runInner<T>(
1269
+ fn: (() => Promise<T>) | undefined,
1270
+ options: RunOptions,
1271
+ runPromise: Deferred<void>
1272
+ ) {
1273
+ const clearRunPromise = () => {
1274
+ if (this.runPromise === runPromise) {
1275
+ this.runPromise = null;
1276
+ }
1277
+ };
1278
+
950
1279
  if (!this.isUsedHere() || this.commands.disposed) {
951
1280
  const env = DataManager.getSettings('env');
952
1281
  if (env !== 'react-native') {
953
1282
  try {
954
1283
  await this.acquire(options.connectProtocol);
955
1284
  } catch (error) {
956
- this.runPromise = null;
957
- return Promise.reject(error);
1285
+ clearRunPromise();
1286
+ runPromise.reject(error);
1287
+ return;
958
1288
  }
959
1289
 
960
1290
  try {
@@ -964,16 +1294,19 @@ export class Device extends EventEmitter {
964
1294
  }
965
1295
  }
966
1296
  } catch (error) {
967
- this.runPromise = null;
1297
+ await this.release();
1298
+ clearRunPromise();
968
1299
  if (error instanceof HardwareError) {
969
- return Promise.reject(error);
1300
+ runPromise.reject(error);
1301
+ return;
970
1302
  }
971
- return Promise.reject(
1303
+ runPromise.reject(
972
1304
  ERRORS.TypedError(
973
1305
  HardwareErrorCode.DeviceInitializeFailed,
974
1306
  `Initialize failed: ${error.message as string}, code: ${error.code as string}`
975
1307
  )
976
1308
  );
1309
+ return;
977
1310
  }
978
1311
  } else if (env === 'react-native') {
979
1312
  // TODO: implement react-native acquire
@@ -992,9 +1325,7 @@ export class Device extends EventEmitter {
992
1325
  try {
993
1326
  await fn();
994
1327
  } catch (e) {
995
- if (this.runPromise) {
996
- this.runPromise.reject(e);
997
- }
1328
+ runPromise.reject(e);
998
1329
 
999
1330
  if (
1000
1331
  e instanceof HardwareError &&
@@ -1007,7 +1338,7 @@ export class Device extends EventEmitter {
1007
1338
  Log.debug(`error code ${e.errorCode} release device, mainId: ${this.mainId}`);
1008
1339
  }
1009
1340
 
1010
- this.runPromise = null;
1341
+ clearRunPromise();
1011
1342
  return;
1012
1343
  }
1013
1344
  }
@@ -1021,11 +1352,8 @@ export class Device extends EventEmitter {
1021
1352
  Log.debug('release device, mainId: ', this.mainId);
1022
1353
  }
1023
1354
 
1024
- if (this.runPromise) {
1025
- this.runPromise.resolve();
1026
- }
1027
-
1028
- this.runPromise = null;
1355
+ runPromise.resolve();
1356
+ clearRunPromise();
1029
1357
  }
1030
1358
 
1031
1359
  async interruptionFromOutside() {
@@ -1064,33 +1392,37 @@ export class Device extends EventEmitter {
1064
1392
  }
1065
1393
 
1066
1394
  getMode() {
1067
- if (this.features?.bootloaderMode) {
1068
- // bootloader mode
1069
- return EOneKeyDeviceMode.bootloader;
1070
- }
1071
-
1072
- if (!this.features?.initialized) {
1073
- // not initialized
1074
- return EOneKeyDeviceMode.notInitialized;
1395
+ switch (this.state?.status.mode) {
1396
+ case 'bootloader':
1397
+ case 'romloader':
1398
+ return EOneKeyDeviceMode.bootloader;
1399
+ case 'notInitialized':
1400
+ return EOneKeyDeviceMode.notInitialized;
1401
+ case 'backupMode':
1402
+ return EOneKeyDeviceMode.backupMode;
1403
+ case 'normal':
1404
+ return EOneKeyDeviceMode.normal;
1405
+ default:
1406
+ break;
1075
1407
  }
1076
1408
 
1077
- if (this.features?.noBackup) {
1078
- // backup mode
1079
- return EOneKeyDeviceMode.backupMode;
1080
- }
1081
-
1082
- // normal mode
1083
1409
  return EOneKeyDeviceMode.normal;
1084
1410
  }
1085
1411
 
1412
+ getStatus() {
1413
+ if (this.isUsedElsewhere()) return 'occupied' as const;
1414
+ if (this.isUsedHere()) return 'used' as const;
1415
+ return 'available' as const;
1416
+ }
1417
+
1086
1418
  getFirmwareVersion() {
1087
- if (!this.features) return null;
1088
- return getDeviceFirmwareVersion(this.features);
1419
+ if (!this.state) return null;
1420
+ return parseDeviceVersion(this.state.versions.firmware);
1089
1421
  }
1090
1422
 
1091
1423
  getBLEFirmwareVersion() {
1092
- if (!this.features) return null;
1093
- return getDeviceBLEFirmwareVersion(this.features);
1424
+ if (!this.state) return null;
1425
+ return parseDeviceVersion(this.state.versions.ble);
1094
1426
  }
1095
1427
 
1096
1428
  isUsed() {
@@ -1108,7 +1440,7 @@ export class Device extends EventEmitter {
1108
1440
  isUsedHere() {
1109
1441
  const env = DataManager.getSettings('env');
1110
1442
  if (DataManager.isBleConnect(env)) {
1111
- return false;
1443
+ return this.deviceAcquired;
1112
1444
  }
1113
1445
  return this.isUsed() && this.originalDescriptor.session === this.mainId;
1114
1446
  }
@@ -1118,26 +1450,38 @@ export class Device extends EventEmitter {
1118
1450
  }
1119
1451
 
1120
1452
  isBootloader() {
1121
- return this.features && !!this.features.bootloaderMode;
1453
+ if (!this.state) return undefined;
1454
+ return this.state.status.mode === 'bootloader';
1455
+ }
1456
+
1457
+ isRomloader() {
1458
+ if (!this.state) return undefined;
1459
+ return (
1460
+ this.isProtocolV2() &&
1461
+ this.getCurrentDeviceType() === EDeviceType.Pro2 &&
1462
+ this.state.status.mode === 'romloader'
1463
+ );
1122
1464
  }
1123
1465
 
1124
1466
  isInitialized() {
1125
- return this.features && !!this.features.initialized;
1467
+ if (!this.state) return undefined;
1468
+ return this.state.status.initialized === true;
1126
1469
  }
1127
1470
 
1128
1471
  isSeedless() {
1129
- return this.features && !!this.features.noBackup;
1472
+ if (!this.state) return undefined;
1473
+ return this.state.status.noBackup === true;
1130
1474
  }
1131
1475
 
1132
1476
  isUnacquired(): boolean {
1133
- return this.features === undefined;
1477
+ return this.state === undefined;
1134
1478
  }
1135
1479
 
1136
1480
  hasUnexpectedMode(allow: string[], require: string[]) {
1137
1481
  // both allow and require cases might generate single unexpected mode
1138
1482
  if (!this.isUnacquired()) {
1139
1483
  // allow cases
1140
- if (this.isBootloader() && !allow.includes(UI_REQUEST.BOOTLOADER)) {
1484
+ if (this.isBootloader() && !this.isProtocolV2() && !allow.includes(UI_REQUEST.BOOTLOADER)) {
1141
1485
  return UI_REQUEST.BOOTLOADER;
1142
1486
  }
1143
1487
  if (!this.isInitialized() && !allow.includes(UI_REQUEST.NOT_INITIALIZE)) {
@@ -1161,7 +1505,7 @@ export class Device extends EventEmitter {
1161
1505
  deviceType === EDeviceType.Touch ||
1162
1506
  deviceType === EDeviceType.Pro ||
1163
1507
  deviceType === EDeviceType.Pro2;
1164
- const unlocked = this.features?.unlocked;
1508
+ const unlocked = this.state?.status.unlocked;
1165
1509
  const preCheckTouch = isModeT && unlocked === false;
1166
1510
  const passphraseProtection = this.getCurrentPassphraseProtection();
1167
1511
 
@@ -1174,12 +1518,12 @@ export class Device extends EventEmitter {
1174
1518
 
1175
1519
  async lockDevice(): Promise<Success> {
1176
1520
  const res = await this.commands.typedCall('LockDevice', 'Success', {});
1521
+ this.updateState({ status: { unlocked: false } }, 'lock');
1177
1522
  return res.message;
1178
1523
  }
1179
1524
 
1180
1525
  supportUnlockVersionRange(): DeviceFirmwareRange {
1181
- // 仅适用于 Protocol V1 Pro 系列;Pro2 走独立版本线,
1182
- // 且 Protocol V2 固件从首个版本即支持 UnLockDevice(见 unlockDevice 的 isProtocolV2 短路)。
1526
+ // This range applies to Protocol V1 Pro devices; Pro2 has a dedicated unlock flow.
1183
1527
  return {
1184
1528
  pro: {
1185
1529
  min: '4.15.0',
@@ -1187,19 +1531,34 @@ export class Device extends EventEmitter {
1187
1531
  };
1188
1532
  }
1189
1533
 
1190
- async unlockDevice() {
1534
+ async unlockDevice(pinType: DeviceSessionPinType = DeviceSessionPinType.Main) {
1535
+ if (this.isProtocolV2()) {
1536
+ try {
1537
+ await this.commands.typedCall('DeviceSessionAskPin', 'Success', { type: pinType });
1538
+ } catch (error) {
1539
+ const errorText =
1540
+ error instanceof Error
1541
+ ? `${error.name} ${error.message}`
1542
+ : String((error as { message?: unknown } | null)?.message ?? error ?? '');
1543
+ if (errorText.includes('Failure_UnexpectedMessage')) {
1544
+ throw createDeviceNotSupportMethodError('deviceUnlock', this.getCurrentFirmwareType());
1545
+ }
1546
+ throw error;
1547
+ }
1548
+
1549
+ const status = await requestProtocolV2DeviceStatus({ commands: this.commands });
1550
+ return this.updateProtocolV2Status(status);
1551
+ }
1552
+
1191
1553
  const firmwareVersion = this.getCurrentFirmwareVersionString() ?? '0.0.0';
1192
1554
  const versionRange = this.getCurrentMethodVersionRange(
1193
1555
  type => this.supportUnlockVersionRange()[type]
1194
1556
  );
1195
1557
 
1196
- const supportAttachPinCapability = existCapability(
1197
- this.features,
1558
+ const supportAttachPinCapability = this.state?.capabilities.includes(
1198
1559
  Enum_Capability.Capability_AttachToPin
1199
1560
  );
1200
- // Pro2 (Protocol V2) 版本线独立于 Pro 系列,固件从首个版本即支持 UnLockDevice
1201
1561
  const supportUnlock =
1202
- this.isProtocolV2() ||
1203
1562
  supportAttachPinCapability ||
1204
1563
  (versionRange &&
1205
1564
  semver.valid(firmwareVersion) &&
@@ -1207,12 +1566,21 @@ export class Device extends EventEmitter {
1207
1566
 
1208
1567
  if (supportUnlock) {
1209
1568
  const res = await this.commands.typedCall('UnLockDevice', 'UnLockDeviceResponse');
1210
- if (this.features) {
1211
- this.features.unlocked = res.message.unlocked == null ? null : res.message.unlocked;
1212
- this.features.unlockedAttachPin =
1213
- res.message.unlocked_attach_pin == null ? undefined : res.message.unlocked_attach_pin;
1214
- this.features.passphraseProtection =
1215
- res.message.passphrase_protection == null ? null : res.message.passphrase_protection;
1569
+ if (this.state) {
1570
+ this.updateState(
1571
+ {
1572
+ status: {
1573
+ unlocked: res.message.unlocked == null ? null : res.message.unlocked,
1574
+ unlockedAttachPin:
1575
+ res.message.unlocked_attach_pin == null ? null : res.message.unlocked_attach_pin,
1576
+ passphraseProtection:
1577
+ res.message.passphrase_protection == null
1578
+ ? null
1579
+ : res.message.passphrase_protection,
1580
+ },
1581
+ },
1582
+ 'unlock'
1583
+ );
1216
1584
 
1217
1585
  return Promise.resolve(this.features);
1218
1586
  }
@@ -1221,14 +1589,6 @@ export class Device extends EventEmitter {
1221
1589
  return Promise.resolve(features);
1222
1590
  }
1223
1591
 
1224
- // legacy 解锁探测仅适用于 Protocol V1 老固件;V2 固件必然支持 UnLockDevice
1225
- if (this.isProtocolV2()) {
1226
- throw ERRORS.TypedError(
1227
- HardwareErrorCode.RuntimeError,
1228
- 'unlock device error: device firmware does not support UnLockDevice'
1229
- );
1230
- }
1231
-
1232
1592
  const { type } = await this.commands.typedCall('GetAddress', 'Address', {
1233
1593
  address_n: [toHardened(44), toHardened(1), toHardened(0), 0, 0],
1234
1594
  coin_name: 'Testnet',
@@ -1251,21 +1611,27 @@ export class Device extends EventEmitter {
1251
1611
  ) {
1252
1612
  if (this.isUnacquired()) return false;
1253
1613
 
1614
+ const expectedPassphraseState = useEmptyPassphrase ? undefined : passphraseState;
1254
1615
  const { passphraseState: newPassphraseState, unlockedAttachPin } =
1255
1616
  await getPassphraseStateWithRefreshDeviceInfo(this, {
1256
- expectPassphraseState: passphraseState,
1617
+ expectPassphraseState: expectedPassphraseState,
1257
1618
  onlyMainPin: useEmptyPassphrase,
1258
1619
  });
1259
1620
 
1260
1621
  // Main wallet and unlock Attach Pin, throw safe error
1261
1622
  const mainWalletUseAttachPin = unlockedAttachPin && useEmptyPassphrase;
1262
1623
  const useErrorAttachPin =
1263
- unlockedAttachPin && passphraseState && passphraseState !== newPassphraseState;
1264
- const passphraseStateMismatch = !!passphraseState && passphraseState !== newPassphraseState;
1624
+ unlockedAttachPin &&
1625
+ expectedPassphraseState &&
1626
+ expectedPassphraseState !== newPassphraseState;
1627
+ const passphraseStateMismatch =
1628
+ !!expectedPassphraseState && expectedPassphraseState !== newPassphraseState;
1265
1629
 
1266
1630
  Log.debug('Check passphrase state safety: ', {
1267
- passphraseState,
1268
- newPassphraseState,
1631
+ hasExpectedPassphraseState: Boolean(expectedPassphraseState),
1632
+ hasNewPassphraseState: Boolean(newPassphraseState),
1633
+ passphraseStateMatches:
1634
+ Boolean(expectedPassphraseState) && expectedPassphraseState === newPassphraseState,
1269
1635
  unlockedAttachPin,
1270
1636
  useEmptyPassphrase,
1271
1637
  });