@onekeyfe/hd-core 1.2.0-alpha.6 → 1.2.0-alpha.63

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