@onekeyfe/hd-core 1.2.0-alpha.2 → 1.2.0-alpha.21

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 (406) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +75 -0
  2. package/__tests__/DeviceCommands.test.ts +285 -0
  3. package/__tests__/DeviceEventRegistration.test.ts +43 -0
  4. package/__tests__/connectSettings.test.ts +19 -0
  5. package/__tests__/core-dispose.test.ts +34 -0
  6. package/__tests__/core-error-output.test.ts +39 -0
  7. package/__tests__/device-features-state.test.ts +78 -0
  8. package/__tests__/device-identity.test.ts +30 -0
  9. package/__tests__/device-lifecycle-events.test.ts +117 -0
  10. package/__tests__/device-pool-state.test.ts +132 -0
  11. package/__tests__/device-settings.test.ts +391 -0
  12. package/__tests__/device-state-contract.test.ts +27 -0
  13. package/__tests__/device-state-events.test.ts +162 -0
  14. package/__tests__/device-state-mapper.test.ts +241 -0
  15. package/__tests__/device-state-projector.test.ts +94 -0
  16. package/__tests__/device-state-store.test.ts +82 -0
  17. package/__tests__/device-utils.test.ts +106 -0
  18. package/__tests__/device-wallet-session-store.test.ts +213 -0
  19. package/__tests__/deviceFeaturesUtils.test.ts +39 -0
  20. package/__tests__/deviceSettings.test.ts +103 -0
  21. package/__tests__/evmLedgerLegacySafety.test.ts +10 -6
  22. package/__tests__/evmSignTypedData.test.ts +80 -0
  23. package/__tests__/filesystemValidation.test.ts +53 -0
  24. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +402 -0
  25. package/__tests__/get-device-state.test.ts +410 -0
  26. package/__tests__/homescreen.test.ts +24 -0
  27. package/__tests__/kaspaSignTransaction.test.ts +591 -0
  28. package/__tests__/logBlockEvent.test.ts +26 -0
  29. package/__tests__/networkUtils.test.ts +386 -0
  30. package/__tests__/open-wallet-session-error-response.test.ts +43 -0
  31. package/__tests__/open-wallet-session.test.ts +559 -0
  32. package/__tests__/preInitialize.test.ts +33 -0
  33. package/__tests__/pro2Wallpaper.test.ts +50 -0
  34. package/__tests__/protocol-v2-bootloader-mode.test.ts +37 -0
  35. package/__tests__/protocol-v2-firmware-targets.test.ts +19 -0
  36. package/__tests__/protocol-v2.test.ts +3954 -1191
  37. package/__tests__/protocolV2FileWrite.test.ts +92 -0
  38. package/__tests__/protocolV2UiInteraction.test.ts +266 -0
  39. package/__tests__/public-device-state-api.test.ts +257 -0
  40. package/__tests__/public-pro2-api-boundary.test.ts +110 -0
  41. package/__tests__/refresh-device-state.test.ts +101 -0
  42. package/__tests__/request-context-logging.test.ts +16 -0
  43. package/__tests__/search-devices.test.ts +136 -0
  44. package/dist/api/BaseMethod.d.ts +8 -0
  45. package/dist/api/BaseMethod.d.ts.map +1 -1
  46. package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
  47. package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
  48. package/dist/api/ClearSessionCache.d.ts +9 -0
  49. package/dist/api/ClearSessionCache.d.ts.map +1 -0
  50. package/dist/api/DirList.d.ts.map +1 -1
  51. package/dist/api/FileRead.d.ts.map +1 -1
  52. package/dist/api/FileWrite.d.ts +1 -0
  53. package/dist/api/FileWrite.d.ts.map +1 -1
  54. package/dist/api/FirmwareUpdateV2.d.ts +2 -2
  55. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  56. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  57. package/dist/api/FirmwareUpdateV4.d.ts +25 -5
  58. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  59. package/dist/api/GetDeviceState.d.ts +7 -0
  60. package/dist/api/GetDeviceState.d.ts.map +1 -0
  61. package/dist/api/GetFeatures.d.ts +1 -1
  62. package/dist/api/GetFeatures.d.ts.map +1 -1
  63. package/dist/api/GetOnekeyFeatures.d.ts.map +1 -1
  64. package/dist/api/GetPassphraseState.d.ts +1 -6
  65. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  66. package/dist/api/OpenWalletSession.d.ts +14 -0
  67. package/dist/api/OpenWalletSession.d.ts.map +1 -0
  68. package/dist/api/PathInfo.d.ts.map +1 -1
  69. package/dist/api/PromptWebDeviceAccess.d.ts.map +1 -1
  70. package/dist/api/SearchDevices.d.ts +3 -0
  71. package/dist/api/SearchDevices.d.ts.map +1 -1
  72. package/dist/api/UploadPortfolio.d.ts +17 -0
  73. package/dist/api/UploadPortfolio.d.ts.map +1 -0
  74. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  75. package/dist/api/device/DeviceCancel.d.ts.map +1 -1
  76. package/dist/api/device/DeviceChangePin.d.ts.map +1 -1
  77. package/dist/api/device/DeviceFullyUploadResource.d.ts +1 -2
  78. package/dist/api/device/DeviceFullyUploadResource.d.ts.map +1 -1
  79. package/dist/api/device/DeviceLock.d.ts.map +1 -1
  80. package/dist/api/device/DeviceRebootToBoardloader.d.ts.map +1 -1
  81. package/dist/api/device/DeviceRebootToBootloader.d.ts.map +1 -1
  82. package/dist/api/device/DeviceSettings.d.ts.map +1 -1
  83. package/dist/api/device/DeviceUnlock.d.ts +1 -1
  84. package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
  85. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  86. package/dist/api/device/DeviceWipe.d.ts.map +1 -1
  87. package/dist/api/evm/EVMSignTypedData.d.ts.map +1 -1
  88. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +1 -0
  89. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  90. package/dist/api/firmware/getBinary.d.ts +11 -3
  91. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  92. package/dist/api/firmware/progressThrottle.d.ts +3 -0
  93. package/dist/api/firmware/progressThrottle.d.ts.map +1 -0
  94. package/dist/api/helpers/filesystemValidation.d.ts +3 -0
  95. package/dist/api/helpers/filesystemValidation.d.ts.map +1 -1
  96. package/dist/api/helpers/paramsValidator.d.ts +1 -0
  97. package/dist/api/helpers/paramsValidator.d.ts.map +1 -1
  98. package/dist/api/helpers/protocolV2FileWrite.d.ts +33 -0
  99. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -0
  100. package/dist/api/index.d.ts +12 -19
  101. package/dist/api/index.d.ts.map +1 -1
  102. package/dist/api/kaspa/KaspaSignTransaction.d.ts +5 -1
  103. package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
  104. package/dist/api/kaspa/helpers/TransferSerialize.d.ts.map +1 -1
  105. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts +6 -0
  106. package/dist/api/protocol-v2/DeviceFactoryInfoGet.d.ts.map +1 -0
  107. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts +7 -0
  108. package/dist/api/protocol-v2/DeviceFactoryInfoSet.d.ts.map +1 -0
  109. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts +1 -1
  110. package/dist/api/protocol-v2/DeviceFirmwareUpdate.d.ts.map +1 -1
  111. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts +3 -2
  112. package/dist/api/protocol-v2/DeviceGetFirmwareUpdateStatus.d.ts.map +1 -1
  113. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts +1 -1
  114. package/dist/api/protocol-v2/DeviceGetOnboardingStatus.d.ts.map +1 -1
  115. package/dist/api/protocol-v2/DeviceInfoGet.d.ts +28 -0
  116. package/dist/api/protocol-v2/DeviceInfoGet.d.ts.map +1 -0
  117. package/dist/api/protocol-v2/DeviceReboot.d.ts.map +1 -1
  118. package/dist/api/protocol-v2/DeviceStatusGet.d.ts +6 -0
  119. package/dist/api/protocol-v2/DeviceStatusGet.d.ts.map +1 -0
  120. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts +26 -0
  121. package/dist/api/protocol-v2/DeviceUploadWallpaper.d.ts.map +1 -0
  122. package/dist/api/protocol-v2/FilesystemFormat.d.ts.map +1 -1
  123. package/dist/api/protocol-v2/{FilesystemFixPermission.d.ts → FilesystemPermissionFix.d.ts} +2 -2
  124. package/dist/api/protocol-v2/FilesystemPermissionFix.d.ts.map +1 -0
  125. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts +6 -0
  126. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -0
  127. package/dist/api/protocol-v2/helpers.d.ts +27 -19
  128. package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
  129. package/dist/api/ton/TonSignData.d.ts +1 -5
  130. package/dist/api/ton/TonSignData.d.ts.map +1 -1
  131. package/dist/api/utils.d.ts +2 -1
  132. package/dist/api/utils.d.ts.map +1 -1
  133. package/dist/constants/index.d.ts +2 -1
  134. package/dist/constants/index.d.ts.map +1 -1
  135. package/dist/core/RequestQueue.d.ts.map +1 -1
  136. package/dist/core/deviceEventRegistration.d.ts +11 -0
  137. package/dist/core/deviceEventRegistration.d.ts.map +1 -0
  138. package/dist/core/index.d.ts +3 -1
  139. package/dist/core/index.d.ts.map +1 -1
  140. package/dist/data-manager/DataManager.d.ts +1 -1
  141. package/dist/data-manager/DataManager.d.ts.map +1 -1
  142. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  143. package/dist/device/Device.d.ts +35 -11
  144. package/dist/device/Device.d.ts.map +1 -1
  145. package/dist/device/DeviceCommands.d.ts +8 -6
  146. package/dist/device/DeviceCommands.d.ts.map +1 -1
  147. package/dist/device/DeviceFeaturesState.d.ts +3 -0
  148. package/dist/device/DeviceFeaturesState.d.ts.map +1 -0
  149. package/dist/device/DevicePool.d.ts +4 -2
  150. package/dist/device/DevicePool.d.ts.map +1 -1
  151. package/dist/device/DeviceStateMapper.d.ts +13 -0
  152. package/dist/device/DeviceStateMapper.d.ts.map +1 -0
  153. package/dist/device/DeviceStateProjector.d.ts +7 -0
  154. package/dist/device/DeviceStateProjector.d.ts.map +1 -0
  155. package/dist/device/DeviceStateStore.d.ts +21 -0
  156. package/dist/device/DeviceStateStore.d.ts.map +1 -0
  157. package/dist/device/DeviceWalletSessionStore.d.ts +20 -0
  158. package/dist/device/DeviceWalletSessionStore.d.ts.map +1 -0
  159. package/dist/device/cloneDeviceState.d.ts +2 -0
  160. package/dist/device/cloneDeviceState.d.ts.map +1 -0
  161. package/dist/device/deviceIdentity.d.ts +5 -0
  162. package/dist/device/deviceIdentity.d.ts.map +1 -0
  163. package/dist/deviceProfile/buildDeviceFeatures.d.ts +9 -3
  164. package/dist/deviceProfile/buildDeviceFeatures.d.ts.map +1 -1
  165. package/dist/deviceProfile/index.d.ts +0 -1
  166. package/dist/deviceProfile/index.d.ts.map +1 -1
  167. package/dist/events/device.d.ts +11 -2
  168. package/dist/events/device.d.ts.map +1 -1
  169. package/dist/events/logBlockEvent.d.ts.map +1 -1
  170. package/dist/events/ui-request.d.ts +18 -2
  171. package/dist/events/ui-request.d.ts.map +1 -1
  172. package/dist/index.d.ts +1361 -609
  173. package/dist/index.js +5898 -2860
  174. package/dist/inject.d.ts.map +1 -1
  175. package/dist/protocols/protocol-v2/deviceSession.d.ts +7 -0
  176. package/dist/protocols/protocol-v2/deviceSession.d.ts.map +1 -0
  177. package/dist/protocols/protocol-v2/features.d.ts +23 -28
  178. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  179. package/dist/protocols/protocol-v2/firmware.d.ts +11 -9
  180. package/dist/protocols/protocol-v2/firmware.d.ts.map +1 -1
  181. package/dist/protocols/protocol-v2/index.d.ts +3 -2
  182. package/dist/protocols/protocol-v2/index.d.ts.map +1 -1
  183. package/dist/protocols/protocol-v2/lockedError.d.ts +2 -0
  184. package/dist/protocols/protocol-v2/lockedError.d.ts.map +1 -0
  185. package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts +16 -0
  186. package/dist/protocols/protocol-v2/settingsUnlockPolicy.d.ts.map +1 -0
  187. package/dist/protocols/protocol-v2/uiInteraction.d.ts +39 -0
  188. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -0
  189. package/dist/protocols/protocol-v2/unlockRetry.d.ts +11 -0
  190. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +1 -0
  191. package/dist/protocols/protocol-v2/walletSession.d.ts +19 -0
  192. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -0
  193. package/dist/types/api/checkAllFirmwareRelease.d.ts +1 -2
  194. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  195. package/dist/types/api/deviceSettings.d.ts +11 -2
  196. package/dist/types/api/deviceSettings.d.ts.map +1 -1
  197. package/dist/types/api/deviceUnlock.d.ts +2 -2
  198. package/dist/types/api/deviceUnlock.d.ts.map +1 -1
  199. package/dist/types/api/firmwareUpdate.d.ts +6 -6
  200. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  201. package/dist/types/api/getDeviceState.d.ts +12 -0
  202. package/dist/types/api/getDeviceState.d.ts.map +1 -0
  203. package/dist/types/api/getFeatures.d.ts.map +1 -1
  204. package/dist/types/api/getOnekeyFeatures.d.ts.map +1 -1
  205. package/dist/types/api/getPassphraseState.d.ts +2 -10
  206. package/dist/types/api/getPassphraseState.d.ts.map +1 -1
  207. package/dist/types/api/index.d.ts +22 -25
  208. package/dist/types/api/index.d.ts.map +1 -1
  209. package/dist/types/api/kaspaSignTransaction.d.ts +27 -2
  210. package/dist/types/api/kaspaSignTransaction.d.ts.map +1 -1
  211. package/dist/types/api/openWalletSession.d.ts +41 -0
  212. package/dist/types/api/openWalletSession.d.ts.map +1 -0
  213. package/dist/types/api/protocolV2.d.ts +23 -28
  214. package/dist/types/api/protocolV2.d.ts.map +1 -1
  215. package/dist/types/api/sessionCache.d.ts +10 -0
  216. package/dist/types/api/sessionCache.d.ts.map +1 -0
  217. package/dist/types/device.d.ts +121 -5
  218. package/dist/types/device.d.ts.map +1 -1
  219. package/dist/types/params.d.ts +1 -0
  220. package/dist/types/params.d.ts.map +1 -1
  221. package/dist/types/settings.d.ts +21 -1
  222. package/dist/types/settings.d.ts.map +1 -1
  223. package/dist/utils/assets.d.ts +2 -1
  224. package/dist/utils/assets.d.ts.map +1 -1
  225. package/dist/utils/deviceFeaturesCompat.d.ts +13 -0
  226. package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -0
  227. package/dist/utils/deviceFeaturesUtils.d.ts +13 -3
  228. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  229. package/dist/utils/deviceInfoUtils.d.ts +9 -8
  230. package/dist/utils/deviceInfoUtils.d.ts.map +1 -1
  231. package/dist/utils/deviceSettings.d.ts +38 -7
  232. package/dist/utils/deviceSettings.d.ts.map +1 -1
  233. package/dist/utils/deviceVersionUtils.d.ts +6 -5
  234. package/dist/utils/deviceVersionUtils.d.ts.map +1 -1
  235. package/dist/utils/homescreen.d.ts.map +1 -1
  236. package/dist/utils/index.d.ts +5 -2
  237. package/dist/utils/index.d.ts.map +1 -1
  238. package/dist/utils/networkUtils.d.ts +9 -1
  239. package/dist/utils/networkUtils.d.ts.map +1 -1
  240. package/dist/utils/patch.d.ts +1 -1
  241. package/dist/utils/patch.d.ts.map +1 -1
  242. package/dist/utils/pro2Wallpaper.d.ts +12 -0
  243. package/dist/utils/pro2Wallpaper.d.ts.map +1 -0
  244. package/dist/utils/tracing.d.ts.map +1 -1
  245. package/package.json +4 -4
  246. package/src/api/BaseMethod.ts +36 -9
  247. package/src/api/CheckBootloaderRelease.ts +1 -2
  248. package/src/api/CheckFirmwareRelease.ts +1 -2
  249. package/src/api/ClearSessionCache.ts +28 -0
  250. package/src/api/DirList.ts +5 -3
  251. package/src/api/DirMake.ts +3 -3
  252. package/src/api/DirRemove.ts +3 -3
  253. package/src/api/FileDelete.ts +3 -3
  254. package/src/api/FileRead.ts +23 -7
  255. package/src/api/FileWrite.ts +23 -168
  256. package/src/api/FirmwareUpdate.ts +4 -4
  257. package/src/api/FirmwareUpdateV2.ts +133 -45
  258. package/src/api/FirmwareUpdateV3.ts +3 -5
  259. package/src/api/FirmwareUpdateV4.ts +1138 -357
  260. package/src/api/GetDeviceState.ts +55 -0
  261. package/src/api/GetFeatures.ts +8 -3
  262. package/src/api/GetOnekeyFeatures.ts +3 -72
  263. package/src/api/GetPassphraseState.ts +11 -18
  264. package/src/api/OpenWalletSession.ts +221 -0
  265. package/src/api/PathInfo.ts +5 -3
  266. package/src/api/PromptWebDeviceAccess.ts +2 -3
  267. package/src/api/SearchDevices.ts +29 -4
  268. package/src/api/UploadPortfolio.ts +40 -0
  269. package/src/api/alephium/AlephiumSignTransaction.ts +2 -2
  270. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +4 -8
  271. package/src/api/benfen/BenfenGetAddress.ts +1 -1
  272. package/src/api/btc/BTCGetPublicKey.ts +1 -1
  273. package/src/api/cardano/CardanoSignMessage.ts +1 -1
  274. package/src/api/cardano/CardanoSignTransaction.ts +1 -1
  275. package/src/api/device/DeviceCancel.ts +1 -0
  276. package/src/api/device/DeviceChangePin.ts +24 -0
  277. package/src/api/device/DeviceFullyUploadResource.ts +4 -5
  278. package/src/api/device/DeviceLock.ts +1 -0
  279. package/src/api/device/DeviceRebootToBoardloader.ts +5 -4
  280. package/src/api/device/DeviceRebootToBootloader.ts +5 -4
  281. package/src/api/device/DeviceSettings.ts +183 -1
  282. package/src/api/device/DeviceUnlock.ts +11 -1
  283. package/src/api/device/DeviceUpdateBootloader.ts +1 -2
  284. package/src/api/device/DeviceWipe.ts +19 -0
  285. package/src/api/evm/EVMSignTypedData.ts +3 -5
  286. package/src/api/evm/legacyV1/getAddress.ts +2 -2
  287. package/src/api/evm/legacyV1/getPublicKey.ts +2 -2
  288. package/src/api/evm/legacyV1/signMessage.ts +2 -2
  289. package/src/api/evm/legacyV1/signTypedData.ts +2 -2
  290. package/src/api/evm/legacyV1/signTypedHash.ts +2 -2
  291. package/src/api/evm/legacyV1/verifyMessage.ts +2 -2
  292. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +21 -7
  293. package/src/api/firmware/getBinary.ts +8 -3
  294. package/src/api/firmware/progressThrottle.ts +44 -0
  295. package/src/api/helpers/batchGetPublickeys.ts +2 -2
  296. package/src/api/helpers/filesystemValidation.ts +61 -0
  297. package/src/api/helpers/paramsValidator.ts +1 -1
  298. package/src/api/helpers/protocolV2FileWrite.ts +193 -0
  299. package/src/api/index.ts +14 -20
  300. package/src/api/kaspa/KaspaSignTransaction.ts +341 -22
  301. package/src/api/kaspa/helpers/TransferSerialize.ts +14 -0
  302. package/src/api/nervos/NervosSignTransaction.ts +2 -2
  303. package/src/api/nexa/NexaSignTransaction.ts +1 -1
  304. package/src/api/protocol-v2/{FactoryGetDeviceInfo.ts → DeviceFactoryInfoGet.ts} +4 -4
  305. package/src/api/protocol-v2/DeviceFactoryInfoSet.ts +32 -0
  306. package/src/api/protocol-v2/DeviceFirmwareUpdate.ts +7 -9
  307. package/src/api/protocol-v2/DeviceGetFirmwareUpdateStatus.ts +41 -6
  308. package/src/api/protocol-v2/DeviceGetOnboardingStatus.ts +6 -4
  309. package/src/api/protocol-v2/DeviceInfoGet.ts +145 -0
  310. package/src/api/protocol-v2/DeviceReboot.ts +5 -3
  311. package/src/api/protocol-v2/DeviceStatusGet.ts +16 -0
  312. package/src/api/protocol-v2/DeviceUploadWallpaper.ts +131 -0
  313. package/src/api/protocol-v2/FilesystemFormat.ts +5 -2
  314. package/src/api/protocol-v2/{FilesystemFixPermission.ts → FilesystemPermissionFix.ts} +3 -3
  315. package/src/api/protocol-v2/Ping.ts +1 -1
  316. package/src/api/protocol-v2/{GetProtoVersion.ts → ProtocolInfoRequest.ts} +3 -3
  317. package/src/api/protocol-v2/helpers.ts +58 -62
  318. package/src/api/ton/TonSignData.ts +1 -5
  319. package/src/api/utils.ts +7 -3
  320. package/src/constants/index.ts +7 -1
  321. package/src/core/RequestQueue.ts +1 -0
  322. package/src/core/deviceEventRegistration.ts +23 -0
  323. package/src/core/index.ts +140 -35
  324. package/src/data/messages/messages-protocol-v2.json +825 -709
  325. package/src/data/messages/messages.json +286 -1
  326. package/src/data-manager/DataManager.ts +13 -6
  327. package/src/data-manager/connectSettings.ts +4 -0
  328. package/src/device/Device.ts +480 -192
  329. package/src/device/DeviceCommands.ts +81 -25
  330. package/src/device/DeviceFeaturesState.ts +25 -0
  331. package/src/device/DevicePool.ts +67 -19
  332. package/src/device/DeviceStateMapper.ts +349 -0
  333. package/src/device/DeviceStateProjector.ts +95 -0
  334. package/src/device/DeviceStateStore.ts +201 -0
  335. package/src/device/DeviceWalletSessionStore.ts +105 -0
  336. package/src/device/cloneDeviceState.ts +39 -0
  337. package/src/device/deviceIdentity.ts +18 -0
  338. package/src/deviceProfile/buildDeviceFeatures.ts +235 -210
  339. package/src/deviceProfile/index.ts +0 -1
  340. package/src/events/device.ts +17 -1
  341. package/src/events/logBlockEvent.ts +8 -1
  342. package/src/events/ui-request.ts +24 -2
  343. package/src/inject.ts +23 -34
  344. package/src/protocols/protocol-v2/deviceSession.ts +24 -0
  345. package/src/protocols/protocol-v2/features.ts +68 -82
  346. package/src/protocols/protocol-v2/firmware.ts +12 -36
  347. package/src/protocols/protocol-v2/index.ts +3 -1
  348. package/src/protocols/protocol-v2/lockedError.ts +10 -0
  349. package/src/protocols/protocol-v2/settingsUnlockPolicy.ts +61 -0
  350. package/src/protocols/protocol-v2/uiInteraction.ts +210 -0
  351. package/src/protocols/protocol-v2/unlockRetry.ts +76 -0
  352. package/src/protocols/protocol-v2/walletSession.ts +107 -0
  353. package/src/types/api/checkAllFirmwareRelease.ts +1 -2
  354. package/src/types/api/deviceSettings.ts +26 -2
  355. package/src/types/api/deviceUnlock.ts +5 -2
  356. package/src/types/api/firmwareUpdate.ts +28 -20
  357. package/src/types/api/getDeviceState.ts +19 -0
  358. package/src/types/api/getFeatures.ts +3 -0
  359. package/src/types/api/getOnekeyFeatures.ts +3 -0
  360. package/src/types/api/getPassphraseState.ts +8 -11
  361. package/src/types/api/index.ts +30 -53
  362. package/src/types/api/kaspaSignTransaction.ts +40 -2
  363. package/src/types/api/openWalletSession.ts +64 -0
  364. package/src/types/api/protocolV2.ts +58 -55
  365. package/src/types/api/sessionCache.ts +14 -0
  366. package/src/types/device.ts +170 -4
  367. package/src/types/params.ts +4 -0
  368. package/src/types/settings.ts +42 -30
  369. package/src/utils/assets.ts +4 -1
  370. package/src/utils/deviceFeaturesCompat.ts +173 -0
  371. package/src/utils/deviceFeaturesUtils.ts +68 -24
  372. package/src/utils/deviceInfoUtils.ts +26 -64
  373. package/src/utils/deviceSettings.ts +161 -39
  374. package/src/utils/deviceVersionUtils.ts +25 -44
  375. package/src/utils/findDefectiveBatchDevice.ts +3 -3
  376. package/src/utils/homescreen.ts +10 -0
  377. package/src/utils/index.ts +21 -1
  378. package/src/utils/networkUtils.ts +270 -14
  379. package/src/utils/pro2Wallpaper.ts +109 -0
  380. package/src/utils/tracing.ts +3 -1
  381. package/dist/api/GetDeviceInfo.d.ts +0 -9
  382. package/dist/api/GetDeviceInfo.d.ts.map +0 -1
  383. package/dist/api/protocol-v2/DevReboot.d.ts +0 -7
  384. package/dist/api/protocol-v2/DevReboot.d.ts.map +0 -1
  385. package/dist/api/protocol-v2/DeviceGetDeviceInfo.d.ts +0 -29
  386. package/dist/api/protocol-v2/DeviceGetDeviceInfo.d.ts.map +0 -1
  387. package/dist/api/protocol-v2/FactoryDeviceInfoSettings.d.ts +0 -7
  388. package/dist/api/protocol-v2/FactoryDeviceInfoSettings.d.ts.map +0 -1
  389. package/dist/api/protocol-v2/FactoryGetDeviceInfo.d.ts +0 -6
  390. package/dist/api/protocol-v2/FactoryGetDeviceInfo.d.ts.map +0 -1
  391. package/dist/api/protocol-v2/FilesystemDiskControl.d.ts +0 -13
  392. package/dist/api/protocol-v2/FilesystemDiskControl.d.ts.map +0 -1
  393. package/dist/api/protocol-v2/FilesystemFixPermission.d.ts.map +0 -1
  394. package/dist/api/protocol-v2/GetProtoVersion.d.ts +0 -6
  395. package/dist/api/protocol-v2/GetProtoVersion.d.ts.map +0 -1
  396. package/dist/deviceProfile/buildDeviceProfile.d.ts +0 -21
  397. package/dist/deviceProfile/buildDeviceProfile.d.ts.map +0 -1
  398. package/dist/types/api/getDeviceInfo.d.ts +0 -85
  399. package/dist/types/api/getDeviceInfo.d.ts.map +0 -1
  400. package/src/api/GetDeviceInfo.ts +0 -145
  401. package/src/api/protocol-v2/DevReboot.ts +0 -24
  402. package/src/api/protocol-v2/DeviceGetDeviceInfo.ts +0 -118
  403. package/src/api/protocol-v2/FactoryDeviceInfoSettings.ts +0 -29
  404. package/src/api/protocol-v2/FilesystemDiskControl.ts +0 -50
  405. package/src/deviceProfile/buildDeviceProfile.ts +0 -334
  406. package/src/types/api/getDeviceInfo.ts +0 -99
@@ -0,0 +1,55 @@
1
+ import { ERRORS, HardwareErrorCode, createDeviceNotSupportMethodError } from '@onekeyfe/hd-shared';
2
+
3
+ import { UI_REQUEST } from '../constants/ui-request';
4
+ import { BaseMethod } from './BaseMethod';
5
+
6
+ import type { DeviceStateSection } from '../types';
7
+ import type { DeviceStateScope, GetDeviceStateParams } from '../types/api/getDeviceState';
8
+
9
+ const SCOPE_SECTIONS: Record<DeviceStateScope, DeviceStateSection[]> = {
10
+ runtime: ['status'],
11
+ settings: ['status', 'settings'],
12
+ firmware: ['status', 'identity', 'versions', 'verification'],
13
+ };
14
+
15
+ const isLoaderMode = (mode: string) => mode === 'bootloader' || mode === 'romloader';
16
+
17
+ export default class GetDeviceState extends BaseMethod<
18
+ Required<Pick<GetDeviceStateParams, 'scope'>>
19
+ > {
20
+ init() {
21
+ const scope = (this.payload.scope ?? 'runtime') as DeviceStateScope;
22
+ if (!Object.prototype.hasOwnProperty.call(SCOPE_SECTIONS, scope)) {
23
+ throw ERRORS.TypedError(
24
+ HardwareErrorCode.CallMethodInvalidParameter,
25
+ `Unsupported device state scope: ${String(scope)}`
26
+ );
27
+ }
28
+ this.allowDeviceMode = [
29
+ ...this.allowDeviceMode,
30
+ UI_REQUEST.NOT_INITIALIZE,
31
+ UI_REQUEST.BOOTLOADER,
32
+ ];
33
+ this.unlockPolicy = 'none';
34
+ this.useDevicePassphraseState = false;
35
+ this.skipForceUpdateCheck = true;
36
+ this.params = { scope };
37
+ }
38
+
39
+ async run() {
40
+ const state = await this.device.getDeviceState({
41
+ refreshSections: SCOPE_SECTIONS[this.params.scope],
42
+ });
43
+ if (
44
+ this.params.scope === 'settings' &&
45
+ this.device.isProtocolV2() &&
46
+ isLoaderMode(state.status.mode)
47
+ ) {
48
+ throw createDeviceNotSupportMethodError(
49
+ `${this.name}:${this.params.scope}`,
50
+ this.device.getCurrentFirmwareType()
51
+ );
52
+ }
53
+ return state;
54
+ }
55
+ }
@@ -1,10 +1,12 @@
1
- import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
1
+ import { ERRORS, HardwareErrorCode, createDeviceNotSupportMethodError } from '@onekeyfe/hd-shared';
2
2
 
3
3
  import { UI_REQUEST } from '../constants/ui-request';
4
+ import { projectFeatures } from '../device/DeviceStateProjector';
4
5
  import { BaseMethod } from './BaseMethod';
5
6
 
6
7
  export default class GetFeatures extends BaseMethod {
7
8
  init() {
9
+ this.unlockPolicy = 'none';
8
10
  this.allowDeviceMode = [
9
11
  ...this.allowDeviceMode,
10
12
  UI_REQUEST.NOT_INITIALIZE,
@@ -19,8 +21,11 @@ export default class GetFeatures extends BaseMethod {
19
21
  return Promise.reject(ERRORS.TypedError(HardwareErrorCode.DeviceDetectInBootloaderMode));
20
22
  }
21
23
  if (this.device.isProtocolV2()) {
22
- return this.device.getFeatures();
24
+ throw createDeviceNotSupportMethodError(this.name, this.device.getCurrentFirmwareType());
23
25
  }
24
- return Promise.resolve(this.device.features);
26
+ const state = await this.device.getDeviceState({
27
+ includeRaw: true,
28
+ });
29
+ return projectFeatures(state);
25
30
  }
26
31
  }
@@ -1,83 +1,21 @@
1
1
  import semver from 'semver';
2
+ import { createDeviceNotSupportMethodError } from '@onekeyfe/hd-shared';
2
3
 
3
4
  import { UI_REQUEST } from '../constants/ui-request';
4
5
  import { fixVersion } from '../utils/deviceFeaturesUtils';
5
- import { PROTOCOL_V2_DEVICE_INFO_REQUEST } from '../protocols/protocol-v2';
6
- import { requestProtocolV2DeviceInfo } from '../protocols/protocol-v2/features';
7
6
  import { BaseMethod } from './BaseMethod';
8
7
 
9
8
  import type { OnekeyFeatures } from '../types';
10
9
 
11
- const ONEKEY_FEATURE_KEYS: Array<keyof OnekeyFeatures> = [
12
- 'onekey_device_type',
13
- 'onekey_board_version',
14
- 'onekey_boot_version',
15
- 'onekey_firmware_version',
16
- 'onekey_board_hash',
17
- 'onekey_boot_hash',
18
- 'onekey_firmware_hash',
19
- 'onekey_board_build_id',
20
- 'onekey_boot_build_id',
21
- 'onekey_firmware_build_id',
22
- 'onekey_serial_no',
23
- 'onekey_ble_name',
24
- 'onekey_ble_version',
25
- 'onekey_ble_build_id',
26
- 'onekey_ble_hash',
27
- 'onekey_se_type',
28
- 'onekey_se01_state',
29
- 'onekey_se02_state',
30
- 'onekey_se03_state',
31
- 'onekey_se04_state',
32
- 'onekey_se01_version',
33
- 'onekey_se02_version',
34
- 'onekey_se03_version',
35
- 'onekey_se04_version',
36
- 'onekey_se01_hash',
37
- 'onekey_se02_hash',
38
- 'onekey_se03_hash',
39
- 'onekey_se04_hash',
40
- 'onekey_se01_build_id',
41
- 'onekey_se02_build_id',
42
- 'onekey_se03_build_id',
43
- 'onekey_se04_build_id',
44
- 'onekey_se01_boot_version',
45
- 'onekey_se02_boot_version',
46
- 'onekey_se03_boot_version',
47
- 'onekey_se04_boot_version',
48
- 'onekey_se01_boot_hash',
49
- 'onekey_se02_boot_hash',
50
- 'onekey_se03_boot_hash',
51
- 'onekey_se04_boot_hash',
52
- 'onekey_se01_boot_build_id',
53
- 'onekey_se02_boot_build_id',
54
- 'onekey_se03_boot_build_id',
55
- 'onekey_se04_boot_build_id',
56
- ];
57
-
58
10
  function normalizeOnekeyFirmwareVersion(message: OnekeyFeatures) {
59
11
  if (message.onekey_firmware_version && !semver.valid(message.onekey_firmware_version)) {
60
12
  message.onekey_firmware_version = fixVersion(message.onekey_firmware_version);
61
13
  }
62
14
  }
63
15
 
64
- function pickOnekeyFeatures(features?: OnekeyFeatures | null): OnekeyFeatures {
65
- const message: OnekeyFeatures = {};
66
- if (!features) return message;
67
-
68
- for (const key of ONEKEY_FEATURE_KEYS) {
69
- const value = features[key];
70
- if (value !== undefined && value !== null) {
71
- (message as Record<string, unknown>)[key] = value;
72
- }
73
- }
74
-
75
- normalizeOnekeyFirmwareVersion(message);
76
- return message;
77
- }
78
-
79
16
  export default class GetOnekeyFeatures extends BaseMethod {
80
17
  init() {
18
+ this.unlockPolicy = 'none';
81
19
  this.allowDeviceMode = [
82
20
  ...this.allowDeviceMode,
83
21
  UI_REQUEST.NOT_INITIALIZE,
@@ -89,14 +27,7 @@ export default class GetOnekeyFeatures extends BaseMethod {
89
27
 
90
28
  async run() {
91
29
  if (this.device.isProtocolV2()) {
92
- // V2 没有 OnekeyGetFeatures 消息:
93
- // 取完整 DevGetDeviceInfo(含 SE/hash/build_id)后刷新结构化 features 缓存。
94
- const deviceInfo = await requestProtocolV2DeviceInfo({
95
- commands: this.device.commands,
96
- request: PROTOCOL_V2_DEVICE_INFO_REQUEST,
97
- });
98
- const features = this.device.updateProtocolV2Features(deviceInfo);
99
- return pickOnekeyFeatures(features as OnekeyFeatures);
30
+ throw createDeviceNotSupportMethodError(this.name, this.device.getCurrentFirmwareType());
100
31
  }
101
32
 
102
33
  const { message } = await this.device.commands.typedCall('OnekeyGetFeatures', 'OnekeyFeatures');
@@ -1,4 +1,4 @@
1
- import { EDeviceType } from '@onekeyfe/hd-shared';
1
+ import { ERRORS, HardwareErrorCode, createDeviceNotSupportMethodError } from '@onekeyfe/hd-shared';
2
2
 
3
3
  import { UI_REQUEST } from '../constants/ui-request';
4
4
  import { getPassphraseStateWithRefreshDeviceInfo } from '../utils/deviceFeaturesUtils';
@@ -11,24 +11,17 @@ export default class GetPassphraseState extends BaseMethod {
11
11
  }
12
12
 
13
13
  async run() {
14
- const { passphraseState, newSession, unlockedAttachPin } =
15
- await getPassphraseStateWithRefreshDeviceInfo(this.device, {
16
- expectPassphraseState: this.payload.passphraseState,
17
- onlyMainPin: this.payload.useEmptyPassphrase,
18
- allowCreateAttachPin: this.payload.allowCreateAttachPin,
19
- });
14
+ if (this.device.isProtocolV2()) {
15
+ throw createDeviceNotSupportMethodError(this.name, this.device.getCurrentFirmwareType());
16
+ }
17
+ if (!this.device.features) {
18
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceInitializeFailed);
19
+ }
20
20
 
21
- const { features } = this.device;
22
- const passphraseProtection = this.device.getCurrentPassphraseProtection() ?? null;
23
- const deviceType = this.device.getCurrentDeviceType();
24
- const isProSeries = deviceType === EDeviceType.Pro || deviceType === EDeviceType.Pro2;
21
+ const { passphraseState } = await getPassphraseStateWithRefreshDeviceInfo(this.device);
25
22
 
26
- // refresh device info
27
- return Promise.resolve({
28
- passphrase_state: isProSeries || passphraseProtection === true ? passphraseState : undefined,
29
- session_id: newSession ?? features?.sessionId ?? undefined,
30
- unlocked_attach_pin: unlockedAttachPin ?? features?.unlockedAttachPin,
31
- passphrase_protection: passphraseProtection,
32
- });
23
+ const passphraseProtection = this.device.getCurrentPassphraseProtection();
24
+
25
+ return Promise.resolve(passphraseProtection === true ? passphraseState : undefined);
33
26
  }
34
27
  }
@@ -0,0 +1,221 @@
1
+ import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
2
+
3
+ import { deviceWalletSessionStore } from '../device/DeviceWalletSessionStore';
4
+ import { getProtocolV2WalletSession } from '../protocols/protocol-v2/walletSession';
5
+ import { getPassphraseStateWithRefreshDeviceInfo } from '../utils/deviceFeaturesUtils';
6
+ import { BaseMethod } from './BaseMethod';
7
+ import { invalidParameter } from './helpers/paramsValidator';
8
+
9
+ import type {
10
+ OpenWalletSessionParams,
11
+ OpenWalletSessionPayload,
12
+ } from '../types/api/openWalletSession';
13
+
14
+ const requiredString = (value: unknown, name: string) => {
15
+ if (value === undefined || value === null) {
16
+ throw invalidParameter(`Missing required parameter: ${name}`);
17
+ }
18
+ if (typeof value !== 'string' || !value.trim()) {
19
+ throw invalidParameter(`Parameter [${name}] must be a non-empty string.`);
20
+ }
21
+ return value.trim();
22
+ };
23
+
24
+ const optionalBoolean = (value: unknown, name: string) => {
25
+ if (value !== undefined && typeof value !== 'boolean') {
26
+ throw invalidParameter(`Parameter [${name}] must be a boolean.`);
27
+ }
28
+ return value;
29
+ };
30
+
31
+ const wasResumed = (session: unknown) =>
32
+ !!session &&
33
+ typeof session === 'object' &&
34
+ 'resumed' in session &&
35
+ (session as { resumed?: unknown }).resumed === true;
36
+
37
+ type NormalizedOpenWalletSessionParams = OpenWalletSessionParams & {
38
+ legacySessionToClear?: {
39
+ deviceId?: string;
40
+ passphraseState: string;
41
+ };
42
+ };
43
+
44
+ const normalizeParams = (payload: Record<string, unknown>): NormalizedOpenWalletSessionParams => {
45
+ if (payload.mode !== undefined) {
46
+ if (
47
+ payload.mode !== 'standard' &&
48
+ payload.mode !== 'select-hidden' &&
49
+ payload.mode !== 'resume-hidden'
50
+ ) {
51
+ throw invalidParameter(
52
+ 'Parameter [mode] must be one of standard, select-hidden, or resume-hidden.'
53
+ );
54
+ }
55
+ if (payload.useEmptyPassphrase !== undefined || payload.initSession !== undefined) {
56
+ throw invalidParameter(
57
+ 'Parameters [useEmptyPassphrase] and [initSession] cannot be used with [mode].'
58
+ );
59
+ }
60
+ if (payload.mode === 'standard' || payload.mode === 'select-hidden') {
61
+ if (payload.deviceId !== undefined || payload.passphraseState !== undefined) {
62
+ throw invalidParameter(
63
+ 'Parameters [deviceId] and [passphraseState] are only allowed with mode [resume-hidden].'
64
+ );
65
+ }
66
+ return { mode: payload.mode };
67
+ }
68
+ return {
69
+ mode: 'resume-hidden',
70
+ deviceId: requiredString(payload.deviceId, 'deviceId'),
71
+ passphraseState: requiredString(payload.passphraseState, 'passphraseState'),
72
+ };
73
+ }
74
+
75
+ const useEmptyPassphrase = optionalBoolean(payload.useEmptyPassphrase, 'useEmptyPassphrase');
76
+ const initSession = optionalBoolean(payload.initSession, 'initSession');
77
+ if (useEmptyPassphrase === true) {
78
+ return { mode: 'standard' };
79
+ }
80
+ if (initSession === true) {
81
+ const deviceId =
82
+ payload.deviceId === undefined ? undefined : requiredString(payload.deviceId, 'deviceId');
83
+ const passphraseState =
84
+ payload.passphraseState === undefined
85
+ ? undefined
86
+ : requiredString(payload.passphraseState, 'passphraseState');
87
+ return {
88
+ mode: 'select-hidden',
89
+ ...(passphraseState
90
+ ? {
91
+ legacySessionToClear: {
92
+ deviceId,
93
+ passphraseState,
94
+ },
95
+ }
96
+ : {}),
97
+ };
98
+ }
99
+
100
+ const hasWalletBinding = payload.deviceId !== undefined || payload.passphraseState !== undefined;
101
+ if (!hasWalletBinding) {
102
+ return { mode: 'select-hidden' };
103
+ }
104
+ return {
105
+ mode: 'resume-hidden',
106
+ deviceId: requiredString(payload.deviceId, 'deviceId'),
107
+ passphraseState: requiredString(payload.passphraseState, 'passphraseState'),
108
+ };
109
+ };
110
+
111
+ export default class OpenWalletSession extends BaseMethod<NormalizedOpenWalletSessionParams> {
112
+ init() {
113
+ this.useDevicePassphraseState = false;
114
+ this.skipForceUpdateCheck = true;
115
+ this.params = normalizeParams(this.payload as unknown as Record<string, unknown>);
116
+ this.payload.useEmptyPassphrase = this.params.mode === 'standard';
117
+ }
118
+
119
+ async run(): Promise<OpenWalletSessionPayload> {
120
+ const state = await this.device.getDeviceState({ refreshSections: ['status'] });
121
+ const currentDeviceId = state.identity.deviceId;
122
+ if (!currentDeviceId) {
123
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceInitializeFailed);
124
+ }
125
+
126
+ const { legacySessionToClear } = this.params;
127
+ if (
128
+ legacySessionToClear &&
129
+ (!legacySessionToClear.deviceId || legacySessionToClear.deviceId === currentDeviceId)
130
+ ) {
131
+ deviceWalletSessionStore.delete(currentDeviceId, legacySessionToClear.passphraseState);
132
+ }
133
+
134
+ const protocol = this.device.isProtocolV2() ? 'V2' : 'V1';
135
+
136
+ if (this.params.mode === 'standard') {
137
+ this.device.passphraseState = undefined;
138
+ const session = this.device.isProtocolV2()
139
+ ? await getProtocolV2WalletSession(this.device, { onlyMainPin: true })
140
+ : await getPassphraseStateWithRefreshDeviceInfo(this.device, {
141
+ onlyMainPin: true,
142
+ initSession: this.payload.initSession,
143
+ });
144
+ if (session.unlockedAttachPin) {
145
+ try {
146
+ await this.device.lockDevice();
147
+ } catch {
148
+ // The wallet context is rejected even when an older device cannot be locked.
149
+ }
150
+ this.device.clearInternalState();
151
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckUnlockTypeError);
152
+ }
153
+ return {
154
+ protocol,
155
+ walletType: 'standard',
156
+ deviceId: currentDeviceId,
157
+ passphraseState: null,
158
+ resumed: wasResumed(session),
159
+ };
160
+ }
161
+
162
+ if (this.params.mode === 'resume-hidden') {
163
+ if (currentDeviceId !== this.params.deviceId) {
164
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckDeviceIdError);
165
+ }
166
+ this.device.passphraseState = this.params.passphraseState;
167
+ const cachedSessionId = deviceWalletSessionStore.get(
168
+ this.params.deviceId,
169
+ this.params.passphraseState
170
+ );
171
+ if (!cachedSessionId) {
172
+ throw ERRORS.TypedError(HardwareErrorCode.WalletSessionInvalid);
173
+ }
174
+ if (!this.device.isProtocolV2()) {
175
+ await this.device.initialize({
176
+ deviceId: this.params.deviceId,
177
+ passphraseState: this.params.passphraseState,
178
+ });
179
+ }
180
+ const session = this.device.isProtocolV2()
181
+ ? await getProtocolV2WalletSession(this.device, {
182
+ expectedPassphraseState: this.params.passphraseState,
183
+ })
184
+ : await getPassphraseStateWithRefreshDeviceInfo(this.device, {
185
+ expectPassphraseState: this.params.passphraseState,
186
+ });
187
+ if (!session.passphraseState) {
188
+ this.device.clearInternalState();
189
+ throw ERRORS.TypedError(HardwareErrorCode.DeviceCheckPassphraseStateError);
190
+ }
191
+ return {
192
+ protocol,
193
+ walletType: 'hidden',
194
+ deviceId: currentDeviceId,
195
+ passphraseState: session.passphraseState ?? null,
196
+ resumed: wasResumed(session) || session.newSession === cachedSessionId,
197
+ };
198
+ }
199
+
200
+ this.device.passphraseState = undefined;
201
+ const session = this.device.isProtocolV2()
202
+ ? await getProtocolV2WalletSession(this.device, { initSession: true })
203
+ : await getPassphraseStateWithRefreshDeviceInfo(this.device, { initSession: true });
204
+ const responseBase = {
205
+ protocol,
206
+ deviceId: currentDeviceId,
207
+ resumed: wasResumed(session),
208
+ } as const;
209
+ return session.passphraseState
210
+ ? {
211
+ ...responseBase,
212
+ walletType: 'hidden',
213
+ passphraseState: session.passphraseState,
214
+ }
215
+ : {
216
+ ...responseBase,
217
+ walletType: 'standard',
218
+ passphraseState: null,
219
+ };
220
+ }
221
+ }
@@ -1,7 +1,7 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
2
  import {
3
- validateNonEmptyString,
4
3
  validateOptionalNonNegativeInteger,
4
+ validateProtocolV2FilesystemPath,
5
5
  } from './helpers/filesystemValidation';
6
6
 
7
7
  export type PathInfoParams = {
@@ -11,12 +11,14 @@ export type PathInfoParams = {
11
11
 
12
12
  export default class PathInfo extends BaseMethod<PathInfoParams> {
13
13
  init() {
14
- // Protocol V2 (Pro2) 专属方法,core 调度层统一做非 V2 设备守卫
14
+ // Protocol V2 (Pro2) only; Core rejects non-V2 devices.
15
15
  this.requireProtocolV2 = true;
16
16
  this.skipForceUpdateCheck = true;
17
17
  this.useDevicePassphraseState = false;
18
18
  this.params = {
19
- path: validateNonEmptyString(this.payload.path, 'path'),
19
+ path: validateProtocolV2FilesystemPath(this.payload.path, 'path', {
20
+ allowVolumeRoot: true,
21
+ }),
20
22
  timeoutMs: validateOptionalNonNegativeInteger(this.payload.timeoutMs, 'timeoutMs'),
21
23
  };
22
24
  }
@@ -54,9 +54,8 @@ export default class PromptWebDeviceAccess extends BaseMethod {
54
54
  const usbDevice = device as USBDevice;
55
55
  let path = usbDevice.serialNumber ?? '';
56
56
  if (!path) {
57
- // 早期 Pro2 工程板 USB descriptor 没有 serial number
58
- // 授权后重新枚举,transport 会为空 serial 设备生成会话内稳定的 mock path,
59
- // 这里按 USBDevice 对象身份找回该 path,保证后续 acquire 能匹配。
57
+ // Early Pro2 boards have no USB serial number. Re-enumeration assigns a
58
+ // session-stable mock path, which is recovered by USBDevice identity here.
60
59
  const diff = await this.connector?.enumerate();
61
60
  const matched = diff?.descriptors?.find(d => (d as any).device === usbDevice);
62
61
  path = matched?.path ?? '';
@@ -1,11 +1,13 @@
1
1
  import { BaseMethod } from './BaseMethod';
2
2
  import TransportManager from '../data-manager/TransportManager';
3
3
  import { DataManager } from '../data-manager';
4
- import { getDeviceTypeByBleName } from '../utils';
4
+ import { LoggerNames, getDeviceTypeByBleName, getLogger } from '../utils';
5
5
  import { DevicePool } from '../device/DevicePool';
6
6
 
7
7
  import type DeviceConnector from '../device/DeviceConnector';
8
8
 
9
+ const Log = getLogger(LoggerNames.DevicePool);
10
+
9
11
  export default class SearchDevices extends BaseMethod {
10
12
  connector?: DeviceConnector;
11
13
 
@@ -39,6 +41,10 @@ export default class SearchDevices extends BaseMethod {
39
41
  devices.push({
40
42
  ...device,
41
43
  connectId: device.id,
44
+ serialNo: null,
45
+ // Legacy BLE discovery identifier. The physical serial number is unavailable here.
46
+ uuid: device.id,
47
+ deviceId: null,
42
48
  name: bleName || device.name,
43
49
  deviceType: getDeviceTypeByBleName(bleName),
44
50
  });
@@ -47,9 +53,28 @@ export default class SearchDevices extends BaseMethod {
47
53
  return devices;
48
54
  }
49
55
 
50
- const { deviceList } = await DevicePool.getDevices(devicesDescriptor, undefined, {
51
- connectProtocol: this.payload.connectProtocol,
52
- });
56
+ const deviceList = [];
57
+ for (const descriptor of devicesDescriptor) {
58
+ try {
59
+ // Discovery is best effort. Browsers may retain WebUSB grants for devices that
60
+ // are offline, busy, or not ready, so one descriptor must not abort the scan.
61
+ const result = await DevicePool.getDevices([descriptor], descriptor.path, {
62
+ connectProtocol: this.payload.connectProtocol,
63
+ refreshRuntimeState: true,
64
+ });
65
+ deviceList.push(...result.deviceList);
66
+ } catch (error) {
67
+ const errorCode =
68
+ error && typeof error === 'object' && 'errorCode' in error
69
+ ? (error as { errorCode?: unknown }).errorCode
70
+ : undefined;
71
+ Log.debug('Skip unavailable device during search', {
72
+ path: descriptor.path,
73
+ ...(errorCode !== undefined ? { errorCode } : {}),
74
+ });
75
+ }
76
+ }
77
+
53
78
  return deviceList.map(device => device.toMessageObject());
54
79
  }
55
80
  }
@@ -0,0 +1,40 @@
1
+ import FileWrite from './FileWrite';
2
+
3
+ export type UploadPortfolioParams = {
4
+ packageBytes: ArrayBuffer | Uint8Array | Blob;
5
+ timeoutMs?: number | string;
6
+ };
7
+
8
+ const PORTFOLIO_PENDING_PATH = 'vol1:/portfolio/portfolio.okpkg.pending';
9
+ const PORTFOLIO_CHUNK_SIZE = 2048;
10
+
11
+ export default class UploadPortfolio extends FileWrite {
12
+ init() {
13
+ const { packageBytes, timeoutMs } = this.payload as UploadPortfolioParams;
14
+ this.payload = {
15
+ ...this.payload,
16
+ path: PORTFOLIO_PENDING_PATH,
17
+ offset: 0,
18
+ data: packageBytes,
19
+ chunkSize: PORTFOLIO_CHUNK_SIZE,
20
+ overwrite: true,
21
+ append: false,
22
+ emitProgress: false,
23
+ timeoutMs,
24
+ };
25
+ super.init();
26
+ this.unlockPolicy = 'retry-on-locked';
27
+ // Portfolio is a background write/apply flow and never synthesizes UI events.
28
+ this.protocolV2UiMode = 'none';
29
+ }
30
+
31
+ async run() {
32
+ const stagedFile = await super.run();
33
+ this.throwIfAborted();
34
+ await this.device.commands.typedCall('PortfolioUpdate', 'Success', {});
35
+ return {
36
+ ...stagedFile,
37
+ portfolioUpdated: true,
38
+ };
39
+ }
40
+ }
@@ -63,8 +63,8 @@ export default class AlephiumSignTransaction extends BaseMethod<HardwareAlephium
63
63
  data: Buffer,
64
64
  scriptOpt?: Buffer,
65
65
  dataOffset = 0
66
- // 设备可能在最后一个 AlephiumTxRequest(无 data_length)里返回签名,
67
- // 该消息没有 address 字段,返回类型如实声明为联合类型
66
+ // The final AlephiumTxRequest may return a signature without data_length or address,
67
+ // so the result accurately uses a union type.
68
68
  ): Promise<AlephiumSignedTx | AlephiumTxRequest> => {
69
69
  const responseType = res.type;
70
70
  if (res.type === 'AlephiumSignedTx') {
@@ -352,6 +352,7 @@ export default abstract class AllNetworkGetAddressBase extends BaseMethod<
352
352
  };
353
353
 
354
354
  let result: AllNetworkAddress[];
355
+ let requestError: Error | undefined;
355
356
  try {
356
357
  method.init();
357
358
  method.setDevice?.(this.device);
@@ -394,10 +395,8 @@ export default abstract class AllNetworkGetAddressBase extends BaseMethod<
394
395
  rootFingerprint,
395
396
  },
396
397
  }));
397
- if (method.requestContext) {
398
- completeRequestContext(method.requestContext.responseID);
399
- }
400
398
  } catch (e: any) {
399
+ requestError = e instanceof Error ? e : new Error(String(e));
401
400
  const error = handleSkippableHardwareError(e, this.device, method);
402
401
 
403
402
  if (error) {
@@ -415,13 +414,10 @@ export default abstract class AllNetworkGetAddressBase extends BaseMethod<
415
414
  } else {
416
415
  throw e;
417
416
  }
417
+ } finally {
418
418
  if (method.requestContext) {
419
- completeRequestContext(
420
- method.requestContext.responseID,
421
- e instanceof Error ? e : new Error(String(e))
422
- );
419
+ completeRequestContext(method.requestContext.responseID, requestError);
423
420
  }
424
- } finally {
425
421
  this.device.off(DEVICE.BUTTON, buttonListener);
426
422
  this.device.off(DEVICE.PIN, onSignalAbort);
427
423
  this.device.off(DEVICE.PASSPHRASE, onSignalAbort);
@@ -78,7 +78,7 @@ export default class BenfenGetAddress extends BaseMethod<HardwareBenfenGetAddres
78
78
  'BenfenAddress',
79
79
  param
80
80
  );
81
- // proto 里 BenfenAddress.address optional;正常响应必然携带
81
+ // BenfenAddress.address is optional in proto but always present on success.
82
82
  address = addressRes.message.address ?? '';
83
83
  } else {
84
84
  address = publicKeyToAddress(publicKey);
@@ -78,7 +78,7 @@ export default class BTCGetPublicKey extends BaseMethod<GetPublicKey[]> {
78
78
  }
79
79
 
80
80
  for (const param of this.params) {
81
- // init() 必然设置 coin_name;生成类型里该字段为 optional,这里兜底空串
81
+ // init() sets coin_name; keep an empty fallback for the generated optional type.
82
82
  const versionBytes = getVersionBytes(param.coin_name ?? '', param.script_type);
83
83
  if (!versionBytes) {
84
84
  throw new Error(
@@ -14,7 +14,7 @@ export default class CardanoSignMessage extends BaseMethod<CardanoSignMessagePar
14
14
  init() {
15
15
  this.checkDeviceId = true;
16
16
  this.allowDeviceMode = [...this.allowDeviceMode, UI_REQUEST.NOT_INITIALIZE];
17
- this.allowUsePreInitialize = true;
17
+ this.allowUsePreInitialize = false;
18
18
 
19
19
  const { payload } = this;
20
20
  validateParams(payload, [
@@ -48,7 +48,7 @@ export default class CardanoSignTransaction extends BaseMethod<any> {
48
48
  init() {
49
49
  this.checkDeviceId = true;
50
50
  this.allowDeviceMode = [...this.allowDeviceMode, UI_REQUEST.NOT_INITIALIZE];
51
- this.allowUsePreInitialize = true;
51
+ this.allowUsePreInitialize = false;
52
52
 
53
53
  this.hasBundle = !!this.payload?.bundle;
54
54